'BR-D5-38-2003_D2005-12-10'.
Sprout from BR-D5-38-2003 2005-10-12 11:17:21 UTC apo <apo@opencascade.com> 'Adjust to CVS HEAD modifications'
Delete:
ChangeLog
LICENCE
adm_local/unix/config_files/check_Geom.m4
adm_local/unix/config_files/check_Med.m4
adm_local/unix/make_conclude.in
adm_local/unix/make_omniorb.in
cvs-tags
doc/Makefile.in
doc/salome/AddNetgenInSalome2.pdf
doc/salome/AddNetgenInSalome2.ps
doc/salome/AddNetgenInSalome2.sxw
doc/salome/PluginMeshers.txt
doc/salome/gui/Makefile.in
doc/salome/gui/SMESH/i_blue.jpg
doc/salome/gui/SMESH/image22.gif
doc/salome/gui/SMESH/image22.jpg
doc/salome/gui/SMESH/image23.jpg
doc/salome/gui/SMESH/image24.gif
doc/salome/gui/SMESH/image25.gif
doc/salome/gui/SMESH/image25.jpg
doc/salome/gui/SMESH/image26.jpg
doc/salome/gui/SMESH/image27.jpg
doc/salome/gui/SMESH/image28.gif
doc/salome/gui/SMESH/image30.jpg
doc/salome/gui/SMESH/image31.jpg
doc/salome/gui/SMESH/image32.gif
doc/salome/gui/SMESH/image32.jpg
doc/salome/gui/SMESH/image33.gif
doc/salome/gui/SMESH/image34.gif
doc/salome/gui/SMESH/image35.gif
doc/salome/gui/SMESH/image36.gif
doc/salome/gui/SMESH/image36.jpg
doc/salome/gui/SMESH/image37.gif
doc/salome/gui/SMESH/image38.gif
doc/salome/gui/SMESH/image38.jpg
doc/salome/gui/SMESH/image39.gif
doc/salome/gui/SMESH/image40.gif
doc/salome/gui/SMESH/image41.gif
doc/salome/gui/SMESH/image46.gif
doc/salome/gui/SMESH/image51.jpg
doc/salome/gui/SMESH/image52.jpg
doc/salome/gui/SMESH/image63.gif
doc/salome/gui/SMESH/image64.gif
doc/salome/gui/SMESH/image67.gif
doc/salome/gui/SMESH/image70.gif
doc/salome/gui/SMESH/image70.jpg
doc/salome/gui/SMESH/image71.gif
doc/salome/gui/SMESH/image71.jpg
doc/salome/gui/SMESH/image73.gif
doc/salome/gui/SMESH/image74.gif
doc/salome/gui/SMESH/image76.jpg
doc/salome/gui/SMESH/image77.jpg
doc/salome/gui/SMESH/image78.jpg
doc/salome/gui/SMESH/image79.gif
doc/salome/gui/SMESH/image80.gif
doc/salome/gui/SMESH/image82.gif
doc/salome/gui/SMESH/image83.gif
doc/salome/gui/SMESH/image84.gif
doc/salome/gui/SMESH/image88.gif
doc/salome/gui/SMESH/image91.gif
doc/salome/gui/SMESH/image92.gif
doc/salome/gui/SMESH/image94.gif
doc/salome/gui/SMESH/image95.gif
doc/salome/gui/SMESH/image96.gif
doc/salome/gui/SMESH/image97.gif
doc/salome/gui/SMESH/image98.gif
doc/salome/gui/SMESH/note1.gif
doc/salome/gui/SMESH/pics/exemple.gif
doc/salome/gui/SMESH/texture_horiz_ltbluebubbles.jpg
doc/salome/gui/SMESH/whestart.ico
doc/salome/gui/SMESH/whgdata/whexpbar.gif
doc/salome/gui/SMESH/whrstart.ico
doc/salome/gui/SMESH/whstart.ico
doc/salome/gui/SMESH/wht_fts_h.gif
doc/salome/gui/SMESH/wht_fts_n.gif
doc/salome/gui/SMESH/wht_glo_h.gif
doc/salome/gui/SMESH/wht_glo_n.gif
doc/salome/gui/SMESH/wht_go.gif
doc/salome/gui/SMESH/wht_hide.gif
doc/salome/gui/SMESH/wht_idx_h.gif
doc/salome/gui/SMESH/wht_idx_n.gif
doc/salome/gui/SMESH/wht_logo1.gif
doc/salome/gui/SMESH/wht_logo2.gif
doc/salome/gui/SMESH/wht_next.gif
doc/salome/gui/SMESH/wht_next_g.gif
doc/salome/gui/SMESH/wht_prev.gif
doc/salome/gui/SMESH/wht_prev_g.gif
doc/salome/gui/SMESH/wht_spac.gif
doc/salome/gui/SMESH/wht_sync.gif
doc/salome/gui/SMESH/wht_tab0.gif
doc/salome/gui/SMESH/wht_tab1.gif
doc/salome/gui/SMESH/wht_tab2.gif
doc/salome/gui/SMESH/wht_tab3.gif
doc/salome/gui/SMESH/wht_tab4.gif
doc/salome/gui/SMESH/wht_tab5.gif
doc/salome/gui/SMESH/wht_tab6.gif
doc/salome/gui/SMESH/wht_tab7.gif
doc/salome/gui/SMESH/wht_tab8.gif
doc/salome/gui/SMESH/wht_toc1.gif
doc/salome/gui/SMESH/wht_toc2.gif
doc/salome/gui/SMESH/wht_toc3.gif
doc/salome/gui/SMESH/wht_toc4.gif
doc/salome/gui/SMESH/wht_toc_h.gif
doc/salome/gui/SMESH/wht_toc_n.gif
doc/salome/gui/SMESH/wht_ws.gif
doc/salome/gui/SMESH/wht_ws_g.gif
doc/salome/tui/Makefile.in
doc/salome/tui/SMESH/HTML/SMESH_BasicHypothesis.html
doc/salome/tui/SMESH/HTML/SMESH_Gen.html
doc/salome/tui/SMESH/HTML/SMESH_Hypothesis.html
doc/salome/tui/SMESH/HTML/SMESH_Mesh.html
doc/salome/tui/SMESH/sources/Application-About.png
doc/salome/tui/SMESH/sources/Application-About1.jpg
doc/salome/tui/SMESH/sources/application.gif
doc/salome/tui/SMESH/sources/application.jpg
doc/salome/tui/SMESH/sources/bg_salome.gif
doc/salome/tui/SMESH/sources/logocorp.gif
doc/salome/tui/SMESH/sources/myheader.html
doc/salome/tui/SMESH/sources/myheader_py2.html
doc/salome/tui/SMESH/sources/occ.gif
doc/salome/tui/SMESH/sources/static/PluginMeshers.html
doc/salome/tui/SMESH/sources/static/doxygen.css
doc/salome/tui/SMESH/sources/static/page2.html
doc/salome/tui/SMESH/sources/static/treeview.js
idl/Makefile.in
idl/SMESH_Group.idl
idl/SMESH_Hypothesis.idl
idl/SMESH_Pattern.idl
resources/ModuleMesh.png
resources/SMESH.config
resources/SMESH_en.xml
resources/SMESH_fr.xml
resources/advanced_mesh_info.png
resources/delete.png
resources/mesh.png
resources/mesh_add.png
resources/mesh_add_sub.png
resources/mesh_algo_hexa.png
resources/mesh_algo_mefisto.png
resources/mesh_algo_netgen.png
resources/mesh_algo_quad.png
resources/mesh_algo_regular.png
resources/mesh_algo_tetra.png
resources/mesh_angle.png
resources/mesh_area.png
resources/mesh_aspect.png
resources/mesh_aspect_3d.png
resources/mesh_compute.png
resources/mesh_connectivity.png
resources/mesh_cutGroups.png
resources/mesh_cutquad.png
resources/mesh_deleteGroups.png
resources/mesh_diagonal.png
resources/mesh_edit.png
resources/mesh_edit_group.png
resources/mesh_extrusion.png
resources/mesh_extrusionpath.png
resources/mesh_free_edges.png
resources/mesh_free_edges_2d.png
resources/mesh_hexa.png
resources/mesh_hexa_n.png
resources/mesh_hypo_area.png
resources/mesh_hypo_edit.png
resources/mesh_hypo_length.png
resources/mesh_hypo_segment.png
resources/mesh_hypo_volume.png
resources/mesh_info.png
resources/mesh_init.png
resources/mesh_intersectGroups.png
resources/mesh_length.png
resources/mesh_length_2d.png
resources/mesh_line.png
resources/mesh_line_n.png
resources/mesh_make_group.png
resources/mesh_merge_elements.png
resources/mesh_merge_nodes.png
resources/mesh_move_node.png
resources/mesh_multi_edges.png
resources/mesh_multi_edges_2d.png
resources/mesh_orientation.png
resources/mesh_pattern.png
resources/mesh_points.png
resources/mesh_polygon.png
resources/mesh_polyhedron.png
resources/mesh_pyramid.png
resources/mesh_pyramid_n.png
resources/mesh_quad.png
resources/mesh_quad_n.png
resources/mesh_rem_element.png
resources/mesh_rem_node.png
resources/mesh_remove.png
resources/mesh_renumbering_elements.png
resources/mesh_renumbering_nodes.png
resources/mesh_revolution.png
resources/mesh_rotation.png
resources/mesh_set_algo.png
resources/mesh_set_hypo.png
resources/mesh_sew_bordertoside.png
resources/mesh_sew_conform_freeborders.png
resources/mesh_sew_freeborders.png
resources/mesh_sew_sideelements.png
resources/mesh_shading.png
resources/mesh_shrink.png
resources/mesh_skew.png
resources/mesh_smoothing.png
resources/mesh_symmetry_axis.png
resources/mesh_symmetry_plane.png
resources/mesh_symmetry_point.png
resources/mesh_taper.png
resources/mesh_tetra.png
resources/mesh_tetra_n.png
resources/mesh_translation_points.png
resources/mesh_translation_vector.png
resources/mesh_tree_algo.png
resources/mesh_tree_algo_hexa.png
resources/mesh_tree_algo_mefisto.png
resources/mesh_tree_algo_netgen.png
resources/mesh_tree_algo_quad.png
resources/mesh_tree_algo_regular.png
resources/mesh_tree_algo_tetra.png
resources/mesh_tree_group.png
resources/mesh_tree_hypo.png
resources/mesh_tree_hypo_area.png
resources/mesh_tree_hypo_length.png
resources/mesh_tree_hypo_segment.png
resources/mesh_tree_hypo_volume.png
resources/mesh_tree_importedmesh.png
resources/mesh_tree_mesh.png
resources/mesh_tree_mesh_warn.png
resources/mesh_triangle.png
resources/mesh_triangle_n.png
resources/mesh_union2tri.png
resources/mesh_unionGroups.png
resources/mesh_uniontri.png
resources/mesh_update.png
resources/mesh_vertex.png
resources/mesh_vertex_n.png
resources/mesh_wireframe.png
resources/mesh_wrap.png
resources/pattern_sample_2d.png
resources/pattern_sample_3D.png
resources/select1.png
resources/standard_mesh_info.png
src/Controls/SMESHControls.cxx
src/Controls/SMESH_Controls.hxx
src/Controls/SMESH_ControlsDef.hxx
src/Driver/Driver_Document.cxx
src/Driver/Driver_Document.h
src/Driver/Driver_Mesh.cxx
src/Driver/Driver_Mesh.h
src/Driver/Driver_SMDS_Mesh.cxx
src/Driver/Driver_SMDS_Mesh.h
src/Driver/Driver_SMESHDS_Mesh.cxx
src/Driver/Driver_SMESHDS_Mesh.h
src/Driver/Makefile.in
src/DriverDAT/DAT_Test.cxx
src/DriverDAT/DriverDAT_R_SMDS_Mesh.cxx
src/DriverDAT/DriverDAT_R_SMDS_Mesh.h
src/DriverDAT/DriverDAT_R_SMESHDS_Document.cxx
src/DriverDAT/DriverDAT_R_SMESHDS_Document.h
src/DriverDAT/DriverDAT_R_SMESHDS_Mesh.cxx
src/DriverDAT/DriverDAT_R_SMESHDS_Mesh.h
src/DriverDAT/DriverDAT_W_SMDS_Mesh.cxx
src/DriverDAT/DriverDAT_W_SMDS_Mesh.h
src/DriverDAT/DriverDAT_W_SMESHDS_Document.cxx
src/DriverDAT/DriverDAT_W_SMESHDS_Document.h
src/DriverDAT/DriverDAT_W_SMESHDS_Mesh.cxx
src/DriverDAT/DriverDAT_W_SMESHDS_Mesh.h
src/DriverMED/DriverMED_Family.cxx
src/DriverMED/DriverMED_Family.h
src/DriverMED/DriverMED_R_SMDS_Mesh.cxx
src/DriverMED/DriverMED_R_SMDS_Mesh.h
src/DriverMED/DriverMED_R_SMESHDS_Document.cxx
src/DriverMED/DriverMED_R_SMESHDS_Document.h
src/DriverMED/DriverMED_R_SMESHDS_Mesh.h
src/DriverMED/DriverMED_W_SMDS_Mesh.cxx
src/DriverMED/DriverMED_W_SMDS_Mesh.h
src/DriverMED/DriverMED_W_SMESHDS_Document.cxx
src/DriverMED/DriverMED_W_SMESHDS_Document.h
src/DriverMED/DriverMED_W_SMESHDS_Mesh.h
src/DriverMED/MED_Test.cxx
src/DriverSTL/DriverSTL_R_SMDS_Mesh.cxx
src/DriverSTL/DriverSTL_R_SMDS_Mesh.h
src/DriverSTL/DriverSTL_W_SMDS_Mesh.cxx
src/DriverSTL/DriverSTL_W_SMDS_Mesh.h
src/DriverSTL/STL_Test.cxx
src/DriverUNV/DriverUNV_R_SMDS_Mesh.h
src/DriverUNV/DriverUNV_R_SMESHDS_Document.cxx
src/DriverUNV/DriverUNV_R_SMESHDS_Document.h
src/DriverUNV/DriverUNV_R_SMESHDS_Mesh.cxx
src/DriverUNV/DriverUNV_R_SMESHDS_Mesh.h
src/DriverUNV/DriverUNV_W_SMDS_Mesh.cxx
src/DriverUNV/DriverUNV_W_SMDS_Mesh.h
src/DriverUNV/DriverUNV_W_SMESHDS_Document.cxx
src/DriverUNV/DriverUNV_W_SMESHDS_Document.h
src/DriverUNV/DriverUNV_W_SMESHDS_Mesh.cxx
src/DriverUNV/DriverUNV_W_SMESHDS_Mesh.h
src/DriverUNV/UNV2411_Structure.cxx
src/DriverUNV/UNV2411_Structure.hxx
src/DriverUNV/UNV2412_Structure.cxx
src/DriverUNV/UNV2412_Structure.hxx
src/DriverUNV/UNV_Test.cxx
src/DriverUNV/UNV_Utilities.cxx
src/DriverUNV/UNV_Utilities.hxx
src/MEFISTO2/Rn.h
src/MEFISTO2/aptrte.cxx
src/MEFISTO2/aptrte.h
src/MEFISTO2/areteideale.f
src/MEFISTO2/trte.f
src/Makefile.in
src/NETGEN/Makefile.in
src/NETGEN/ReadMeForNgUsers
src/NETGEN/netgen43ForSalome.patch
src/NETGENPlugin/Makefile.in
src/NETGENPlugin/NETGENPlugin_NETGEN_3D_i.cxx
src/NETGENPlugin/NETGENPlugin_NETGEN_3D_i.hxx
src/NETGENPlugin/NETGENPlugin_i.cxx
src/NETGENPlugin/NETGENPlugin_icons.po
src/OBJECT/Makefile.in
src/OBJECT/SMESH_Actor.cxx
src/OBJECT/SMESH_Actor.h
src/OBJECT/SMESH_ActorDef.h
src/OBJECT/SMESH_ActorUtils.cxx
src/OBJECT/SMESH_ActorUtils.h
src/OBJECT/SMESH_DeviceActor.cxx
src/OBJECT/SMESH_DeviceActor.h
src/OBJECT/SMESH_ExtractGeometry.cxx
src/OBJECT/SMESH_ExtractGeometry.h
src/OBJECT/SMESH_Object.cxx
src/OBJECT/SMESH_Object.h
src/OBJECT/SMESH_ObjectDef.h
src/SMDS/Makefile.in
src/SMDS/SMDSAbs_ElementType.hxx
src/SMDS/SMDS_EdgePosition.cxx
src/SMDS/SMDS_EdgePosition.hxx
src/SMDS/SMDS_ElemIterator.hxx
src/SMDS/SMDS_FaceOfEdges.cxx
src/SMDS/SMDS_FaceOfEdges.hxx
src/SMDS/SMDS_FaceOfNodes.cxx
src/SMDS/SMDS_FaceOfNodes.hxx
src/SMDS/SMDS_FacePosition.cxx
src/SMDS/SMDS_FacePosition.hxx
src/SMDS/SMDS_Iterator.hxx
src/SMDS/SMDS_IteratorOfElements.cxx
src/SMDS/SMDS_IteratorOfElements.hxx
src/SMDS/SMDS_Mesh.cxx
src/SMDS/SMDS_Mesh.hxx
src/SMDS/SMDS_MeshEdge.cxx
src/SMDS/SMDS_MeshEdge.hxx
src/SMDS/SMDS_MeshElement.cxx
src/SMDS/SMDS_MeshElement.hxx
src/SMDS/SMDS_MeshElementIDFactory.cxx
src/SMDS/SMDS_MeshElementIDFactory.hxx
src/SMDS/SMDS_MeshFace.cxx
src/SMDS/SMDS_MeshFace.hxx
src/SMDS/SMDS_MeshGroup.cxx
src/SMDS/SMDS_MeshGroup.hxx
src/SMDS/SMDS_MeshIDFactory.cxx
src/SMDS/SMDS_MeshIDFactory.hxx
src/SMDS/SMDS_MeshNode.cxx
src/SMDS/SMDS_MeshNode.hxx
src/SMDS/SMDS_MeshObject.cxx
src/SMDS/SMDS_MeshObject.hxx
src/SMDS/SMDS_MeshVolume.cxx
src/SMDS/SMDS_MeshVolume.hxx
src/SMDS/SMDS_PolygonalFaceOfNodes.cxx
src/SMDS/SMDS_PolygonalFaceOfNodes.hxx
src/SMDS/SMDS_PolyhedralVolumeOfNodes.cxx
src/SMDS/SMDS_PolyhedralVolumeOfNodes.hxx
src/SMDS/SMDS_Position.cxx
src/SMDS/SMDS_Position.hxx
src/SMDS/SMDS_SpacePosition.cxx
src/SMDS/SMDS_SpacePosition.hxx
src/SMDS/SMDS_TypeOfPosition.hxx
src/SMDS/SMDS_VertexPosition.cxx
src/SMDS/SMDS_VertexPosition.hxx
src/SMDS/SMDS_VolumeOfFaces.cxx
src/SMDS/SMDS_VolumeOfFaces.hxx
src/SMDS/SMDS_VolumeOfNodes.cxx
src/SMDS/SMDS_VolumeOfNodes.hxx
src/SMDS/SMDS_VolumeTool.hxx
src/SMESH/SMESH_1D_Algo.cxx
src/SMESH/SMESH_1D_Algo.hxx
src/SMESH/SMESH_2D_Algo.cxx
src/SMESH/SMESH_2D_Algo.hxx
src/SMESH/SMESH_3D_Algo.cxx
src/SMESH/SMESH_3D_Algo.hxx
src/SMESH/SMESH_Block.cxx
src/SMESH/SMESH_Block.hxx
src/SMESH/SMESH_Group.cxx
src/SMESH/SMESH_Group.hxx
src/SMESH/SMESH_HypoFilter.cxx
src/SMESH/SMESH_HypoFilter.hxx
src/SMESH/SMESH_Hypothesis.cxx
src/SMESH/SMESH_Hypothesis.hxx
src/SMESH/SMESH_Mesh.cxx
src/SMESH/SMESH_Mesh.hxx
src/SMESH/SMESH_subMesh.hxx
src/SMESHDS/Makefile.in
src/SMESHDS/SMESHDS_Command.cxx
src/SMESHDS/SMESHDS_Command.hxx
src/SMESHDS/SMESHDS_CommandType.hxx
src/SMESHDS/SMESHDS_Document.cxx
src/SMESHDS/SMESHDS_Document.hxx
src/SMESHDS/SMESHDS_Group.cxx
src/SMESHDS/SMESHDS_Group.hxx
src/SMESHDS/SMESHDS_GroupBase.cxx
src/SMESHDS/SMESHDS_GroupBase.hxx
src/SMESHDS/SMESHDS_GroupOnGeom.cxx
src/SMESHDS/SMESHDS_GroupOnGeom.hxx
src/SMESHDS/SMESHDS_Hypothesis.cxx
src/SMESHDS/SMESHDS_Hypothesis.hxx
src/SMESHDS/SMESHDS_Mesh.cxx
src/SMESHDS/SMESHDS_Script.cxx
src/SMESHDS/SMESHDS_Script.hxx
src/SMESHDS/SMESHDS_SubMesh.cxx
src/SMESHDS/SMESHDS_SubMesh.hxx
src/SMESHFiltersSelection/Handle_SMESH_TypeFilter.hxx
src/SMESHFiltersSelection/SMESH_TypeFilter.ixx
src/SMESHGUI/SMESHGUI_CreateHypothesesDlg.h
src/SMESHGUI/SMESHGUI_EditHypothesesDlg.cxx
src/SMESHGUI/SMESHGUI_Filter.cxx
src/SMESHGUI/SMESHGUI_Filter.h
src/SMESHGUI/SMESHGUI_FilterLibraryDlg.cxx
src/SMESHGUI/SMESHGUI_FilterLibraryDlg.h
src/SMESHGUI/SMESHGUI_FilterUtils.cxx
src/SMESHGUI/SMESHGUI_FilterUtils.h
src/SMESHGUI/SMESHGUI_GEOMGenUtils.cxx
src/SMESHGUI/SMESHGUI_GEOMGenUtils.h
src/SMESHGUI/SMESHGUI_GroupDlg.cxx
src/SMESHGUI/SMESHGUI_GroupUtils.cxx
src/SMESHGUI/SMESHGUI_GroupUtils.h
src/SMESHGUI/SMESHGUI_IdValidator.h
src/SMESHGUI/SMESHGUI_MeshUtils.cxx
src/SMESHGUI/SMESHGUI_MeshUtils.h
src/SMESHGUI/SMESHGUI_PatternUtils.cxx
src/SMESHGUI/SMESHGUI_PatternUtils.h
src/SMESHGUI/SMESHGUI_PatternWidget.cxx
src/SMESHGUI/SMESHGUI_PatternWidget.h
src/SMESHGUI/SMESHGUI_PrecisionDlg.cxx
src/SMESHGUI/SMESHGUI_PrecisionDlg.h
src/SMESHGUI/SMESHGUI_Preferences_ColorDlg.cxx
src/SMESHGUI/SMESHGUI_Preferences_ColorDlg.h
src/SMESHGUI/SMESHGUI_Preferences_SelectionDlg.cxx
src/SMESHGUI/SMESHGUI_Preferences_SelectionDlg.h
src/SMESHGUI/SMESHGUI_RemoveElementsDlg.cxx
src/SMESHGUI/SMESHGUI_RemoveNodesDlg.cxx
src/SMESHGUI/SMESHGUI_SMESHGenUtils.cxx
src/SMESHGUI/SMESHGUI_SMESHGenUtils.h
src/SMESHGUI/SMESHGUI_SpinBox.cxx
src/SMESHGUI/SMESHGUI_SpinBox.h
src/SMESHGUI/SMESHGUI_Swig.cxx
src/SMESHGUI/SMESHGUI_Swig.hxx
src/SMESHGUI/SMESHGUI_Swig.i
src/SMESHGUI/SMESH_icons.po
src/SMESH_I/SMESH.hxx
src/SMESH_I/SMESHEngine.cxx
src/SMESH_I/SMESH_1D_Algo_i.cxx
src/SMESH_I/SMESH_1D_Algo_i.hxx
src/SMESH_I/SMESH_2D_Algo_i.cxx
src/SMESH_I/SMESH_2D_Algo_i.hxx
src/SMESH_I/SMESH_3D_Algo_i.cxx
src/SMESH_I/SMESH_3D_Algo_i.hxx
src/SMESH_I/SMESH_Algo_i.cxx
src/SMESH_I/SMESH_Algo_i.hxx
src/SMESH_I/SMESH_Gen_i_1.cxx
src/SMESH_I/SMESH_Group_i.hxx
src/SMESH_I/SMESH_Hypothesis_i.cxx
src/SMESH_I/SMESH_Hypothesis_i.hxx
src/SMESH_I/SMESH_MEDFamily_i.cxx
src/SMESH_I/SMESH_MEDFamily_i.hxx
src/SMESH_I/SMESH_MEDMesh_i.cxx
src/SMESH_I/SMESH_MEDSupport_i.cxx
src/SMESH_I/SMESH_MEDSupport_i.hxx
src/SMESH_I/SMESH_Mesh_i.hxx
src/SMESH_I/SMESH_Pattern_i.hxx
src/SMESH_I/SMESH_subMesh_i.cxx
src/SMESH_I/SMESH_subMesh_i.hxx
src/SMESH_I/smeshpy.py
src/SMESH_SWIG/Makefile.in
src/SMESH_SWIG/PAL_MESH_041_mesh.py
src/SMESH_SWIG/PAL_MESH_043_2D.py
src/SMESH_SWIG/PAL_MESH_043_3D.py
src/SMESH_SWIG/SMESH_BelongToGeom.py
src/SMESH_SWIG/SMESH_GroupFromGeom.py
src/SMESH_SWIG/SMESH_GroupFromGeom2.py
src/SMESH_SWIG/SMESH_GroupLyingOnGeom.py
src/SMESH_SWIG/SMESH_Partition1_tetra.py
src/SMESH_SWIG/SMESH_Sphere.py
src/SMESH_SWIG/SMESH_blocks.py
src/SMESH_SWIG/SMESH_box.py
src/SMESH_SWIG/SMESH_box2_tetra.py
src/SMESH_SWIG/SMESH_box3_tetra.py
src/SMESH_SWIG/SMESH_box_tetra.py
src/SMESH_SWIG/SMESH_controls.py
src/SMESH_SWIG/SMESH_demo_hexa2_upd.py
src/SMESH_SWIG/SMESH_fixation.py
src/SMESH_SWIG/SMESH_fixation_hexa.py
src/SMESH_SWIG/SMESH_fixation_tetra.py
src/SMESH_SWIG/SMESH_freebord.py
src/SMESH_SWIG/SMESH_hexaedre.py
src/SMESH_SWIG/SMESH_mechanic.py
src/SMESH_SWIG/SMESH_mechanic_editor.py
src/SMESH_SWIG/SMESH_mechanic_tetra.py
src/SMESH_SWIG/SMESH_shared_modules.py
src/SMESH_SWIG/SMESH_test.py
src/SMESH_SWIG/SMESH_test0.py
src/SMESH_SWIG/SMESH_test1.py
src/SMESH_SWIG/SMESH_test2.py
src/SMESH_SWIG/SMESH_test3.py
src/SMESH_SWIG/SMESH_test4.py
src/SMESH_SWIG/batchmode_mefisto.py
src/SMESH_SWIG/batchmode_smesh.py
src/SMESH_SWIG/ex00_all.py
src/SMESH_SWIG/ex01_cube2build.py
src/SMESH_SWIG/ex02_cube2primitive.py
src/SMESH_SWIG/ex03_cube2partition.py
src/SMESH_SWIG/ex04_cube5tetraHexa.py
src/SMESH_SWIG/ex05_hole1build.py
src/SMESH_SWIG/ex06_hole1boolean.py
src/SMESH_SWIG/ex07_hole1partition.py
src/SMESH_SWIG/ex08_hole2build.py
src/SMESH_SWIG/ex09_grid4build.py
src/SMESH_SWIG/ex10_grid4geometry.py
src/SMESH_SWIG/ex11_grid3partition.py
src/SMESH_SWIG/ex12_grid17partition.py
src/SMESH_SWIG/ex13_hole1partial.py
src/SMESH_SWIG/ex14_cyl1holed.py
src/SMESH_SWIG/ex15_cyl2geometry.py
src/SMESH_SWIG/ex16_cyl2complementary.py
src/SMESH_SWIG/ex17_dome1.py
src/SMESH_SWIG/ex18_dome2.py
src/SMESH_SWIG/ex19_sphereINcube.py
src/SMESH_SWIG/libSMESH_Swig.i
src/StdMeshers/StdMeshers_Arithmetic1D.cxx
src/StdMeshers/StdMeshers_Arithmetic1D.hxx
src/StdMeshers/StdMeshers_Deflection1D.cxx
src/StdMeshers/StdMeshers_Deflection1D.hxx
src/StdMeshers/StdMeshers_Hexa_3D.cxx
src/StdMeshers/StdMeshers_Hexa_3D.hxx
src/StdMeshers/StdMeshers_LengthFromEdges.cxx
src/StdMeshers/StdMeshers_LengthFromEdges.hxx
src/StdMeshers/StdMeshers_LocalLength.cxx
src/StdMeshers/StdMeshers_LocalLength.hxx
src/StdMeshers/StdMeshers_MEFISTO_2D.cxx
src/StdMeshers/StdMeshers_MEFISTO_2D.hxx
src/StdMeshers/StdMeshers_MaxElementArea.cxx
src/StdMeshers/StdMeshers_MaxElementArea.hxx
src/StdMeshers/StdMeshers_MaxElementVolume.cxx
src/StdMeshers/StdMeshers_MaxElementVolume.hxx
src/StdMeshers/StdMeshers_NotConformAllowed.cxx
src/StdMeshers/StdMeshers_NotConformAllowed.hxx
src/StdMeshers/StdMeshers_Penta_3D.cxx
src/StdMeshers/StdMeshers_Penta_3D.hxx
src/StdMeshers/StdMeshers_Propagation.cxx
src/StdMeshers/StdMeshers_Propagation.hxx
src/StdMeshers/StdMeshers_StartEndLength.cxx
src/StdMeshers/StdMeshers_StartEndLength.hxx
src/StdMeshers_I/StdMeshers_Arithmetic1D_i.hxx
src/StdMeshers_I/StdMeshers_Deflection1D_i.hxx
src/StdMeshers_I/StdMeshers_Hexa_3D_i.cxx
src/StdMeshers_I/StdMeshers_Hexa_3D_i.hxx
src/StdMeshers_I/StdMeshers_LengthFromEdges_i.cxx
src/StdMeshers_I/StdMeshers_LengthFromEdges_i.hxx
src/StdMeshers_I/StdMeshers_LocalLength_i.hxx
src/StdMeshers_I/StdMeshers_MEFISTO_2D_i.cxx
src/StdMeshers_I/StdMeshers_MEFISTO_2D_i.hxx
src/StdMeshers_I/StdMeshers_MaxElementArea_i.hxx
src/StdMeshers_I/StdMeshers_MaxElementVolume_i.hxx
src/StdMeshers_I/StdMeshers_NotConformAllowed_i.cxx
src/StdMeshers_I/StdMeshers_NotConformAllowed_i.hxx
src/StdMeshers_I/StdMeshers_Propagation_i.cxx
src/StdMeshers_I/StdMeshers_Propagation_i.hxx
src/StdMeshers_I/StdMeshers_Quadrangle_2D_i.cxx
src/StdMeshers_I/StdMeshers_Quadrangle_2D_i.hxx
src/StdMeshers_I/StdMeshers_Regular_1D_i.cxx
src/StdMeshers_I/StdMeshers_Regular_1D_i.hxx
src/StdMeshers_I/StdMeshers_StartEndLength_i.hxx
+++ /dev/null
-###############################################################################
-#This is the SMESH change log. Do not modify because it is automatically
-#created with :
-#cvs2cl.pl -l "-b" -U users.cvs2cl --header header.cvs2cl -T -b --utc
-###############################################################################
-
-2004-01-30 13:18 Nicolas Rejneri <nicolas.rejneri@opencascade.com>
-
- * doc/html/INPUT/: doxyfile, sources/static/tree.js: NRI : 1.4.0
- version
-
-2004-01-29 17:52 Jerome Robert <jerome.robert@eads.net>
-
- * INSTALL, bin/VERSION: Upgrade to version 1.4.0.
-
-2004-01-29 17:33 Jerome Robert <jerome.robert@eads.net>
-
- * src/: SMESHGUI/SMESHGUI_StudyAPI.cxx, SMESHGUI/SMESHGUI_Swig.cxx,
- SMESH_I/SMESH_Gen_i.cxx: Merge branch merge_1_2_d
-
-2004-01-14 09:24 Nicolas Rejneri <nicolas.rejneri@opencascade.com>
-
- * doc/html/Makefile.in: NRI : bug KERNEL5014 fixed.
-
-2004-01-06 15:19 Nadir Bouhamou <nadir.bouhamou@cea.fr>
-
- * src/SMESH_SWIG/SMESH_flight_skin.py: removing the call to the
- tetrahedron generator NETGEN, because I did not yet manage to
- make NETGEN running on the flight geometry.
-
-2004-01-06 15:16 Nadir Bouhamou <nadir.bouhamou@cea.fr>
-
- * resources/SMESH_en.xml, resources/SMESH_fr.xml,
- src/SMESHGUI/SMESHGUI.cxx: Mounting the hypothesis
- LengthFromEdges in th GUI of SMESH. This functionality was only
- in the C++ API, and in the CORBA API.
-
-2004-01-05 16:14 Jerome Robert <jerome.robert@eads.net>
-
- * adm_local/unix/config_files/check_Netgen.m4: Fix a mispelled
- environment variable for idl python
-
-2004-01-05 14:28 tag V1_3_1
-
-2004-01-05 13:53 Jerome Robert <jerome.robert@eads.net>
-
- * src/NETGEN/: ReadMeForNgUsers, netgen43ForSalome.patch: Add a
- patch to make the build of netgen more user-friendly
-
-2004-01-05 13:52 Jerome Robert <jerome.robert@eads.net>
-
- * src/NETGEN/Makefile.in: We do not need OCAF in Netgen
-
-2004-01-05 13:38 Jerome Robert <jerome.robert@eads.net>
-
- * adm_local/unix/config_files/check_Netgen.m4: Fix some quotes
- problems.
-
-2004-01-05 09:05 Jerome Robert <jerome.robert@eads.net>
-
- * src/: SMDS/SMDS_Mesh.cxx, SMESHDS/SMESHDS_Document.cxx: [Bug
- SMESH4830] bug in instal with gcc 2.95. Bug fixed. Note: SGI say
- that <algorithm> is requiered to use set_intersection (see
- http://www.sgi.com/tech/stl/set_intersection.html).
-
-2003-12-16 15:27 Nadir Bouhamou <nadir.bouhamou@cea.fr>
-
- * adm_local/unix/config_files/check_Netgen.m4: Since there is an
- idl precompilation directive in SMESH_BasicHypothesis.idl file, a
- -DHAVE_NETGEN idl has to be added when compiling SMESH with
- netgen to the idl c++ flags as well as to the idl python flags.
-
-2003-12-15 13:15 Nadir Bouhamou <nadir.bouhamou@cea.fr>
-
- * src/SMESHDS/SMESHDS_Script.cxx: correct a small bug found by the
- EDF developpement team (PN and AT) : AddVolume in the case of a
- Tetrahedron.
-
-2003-12-11 09:51 Jerome Robert <jerome.robert@eads.net>
-
- * src/SMESHGUI/SMESHGUI.cxx: [Bug SMESH4598] Crash of the session
- when compute and update are not done in the same view. Bug fixed.
-
-2003-12-11 09:49 Jerome Robert <jerome.robert@eads.net>
-
- * src/SMESH/SMESH_HypothesisFactory.cxx: HAVE_NETGEN (#define) to
- remove an unresolved symbol when building without netgen
-
-2003-12-10 17:23 Jerome Robert <jerome.robert@eads.net>
-
- * adm_local/unix/config_files/check_Netgen.m4,
- idl/SMESH_BasicHypothesis.idl,
- src/SMESH_I/SMESH_HypothesisFactory_i.cxx: Create and use
- HAVE_NETGEN (#define) to avoid unresolved symbols in libraries.
-
-2003-12-10 16:05 Jerome Robert <jerome.robert@eads.net>
-
- * src/SMESHGUI/SMESHGUI.cxx: Cosmetics
-
-2003-12-09 14:13 Nadir Bouhamou <nadir.bouhamou@cea.fr>
-
- * src/SMESH/Makefile.in: Correcting a problem araising when
- building the SMESH module whithout Netgen.
-
-2003-12-09 10:00 Nadir Bouhamou <nadir.bouhamou@cea.fr>
-
- * doc/: AddNetgenInSalome2.pdf, AddNetgenInSalome2.ps,
- AddNetgenInSalome2.sxw: updating or adding when merging in the
- main trunk with the version in the branch nadir_1_2_2 !! Here a
- document related to the integration of NETGEN in the SMESH module
- has been added for future work in the integration of other
- mesher.
-
-2003-12-08 15:30 Nadir Bouhamou <nadir.bouhamou@cea.fr>
-
- * INSTALL, Makefile.in, configure.in.base,
- adm_local/unix/make_commence.in,
- adm_local/unix/config_files/check_Netgen.m4, bin/VERSION,
- idl/SMESH_BasicHypothesis.idl, resources/SMESH_en.xml,
- resources/SMESH_fr.xml, resources/flight_solid.brep,
- resources/mesh_algo_netgen.png, resources/mesh_algo_tetra.png,
- resources/mesh_tree_algo_netgen.png,
- resources/mesh_tree_algo_tetra.png, src/Makefile.in,
- src/DriverMED/DriverMED_R_SMDS_Mesh.cxx,
- src/DriverMED/DriverMED_R_SMESHDS_Mesh.cxx,
- src/DriverMED/DriverMED_W_SMDS_Mesh.cxx,
- src/DriverMED/DriverMED_W_SMESHDS_Mesh.cxx,
- src/NETGEN/Makefile.in, src/NETGEN/ReadMeForNgUsers,
- src/SMESH/Makefile.in, src/SMESH/SMESH_HypothesisFactory.cxx,
- src/SMESH/SMESH_MEFISTO_2D.cxx,
- src/SMESH/SMESH_MaxElementVolume.cxx,
- src/SMESH/SMESH_MaxElementVolume.hxx,
- src/SMESH/SMESH_NETGEN_3D.cxx, src/SMESH/SMESH_NETGEN_3D.hxx,
- src/SMESH/SMESH_subMesh.cxx, src/SMESHGUI/SMESHGUI.cxx,
- src/SMESHGUI/SMESHGUI.h, src/SMESHGUI/SMESHGUI_NbSegmentsDlg.cxx,
- src/SMESHGUI/SMESHGUI_icons.po, src/SMESH_I/Makefile.in,
- src/SMESH_I/SMESH_Gen_i.cxx,
- src/SMESH_I/SMESH_HypothesisFactory_i.cxx,
- src/SMESH_I/SMESH_LengthFromEdges_i.cxx,
- src/SMESH_I/SMESH_LengthFromEdges_i.hxx,
- src/SMESH_I/SMESH_MEDMesh_i.cxx,
- src/SMESH_I/SMESH_MEDSupport_i.cxx,
- src/SMESH_I/SMESH_MaxElementVolume_i.cxx,
- src/SMESH_I/SMESH_MaxElementVolume_i.hxx,
- src/SMESH_I/SMESH_NETGEN_3D_i.cxx,
- src/SMESH_I/SMESH_NETGEN_3D_i.hxx, src/SMESH_SWIG/Makefile.in,
- src/SMESH_SWIG/SMESH_Partition1_tetra.py,
- src/SMESH_SWIG/SMESH_box2_tetra.py,
- src/SMESH_SWIG/SMESH_box3_tetra.py,
- src/SMESH_SWIG/SMESH_box_tetra.py,
- src/SMESH_SWIG/SMESH_fixation_hexa.py,
- src/SMESH_SWIG/SMESH_fixation_tetra.py,
- src/SMESH_SWIG/SMESH_flight_skin.py,
- src/SMESH_SWIG/SMESH_mechanic_tetra.py: updating or adding when
- merging in the main trunk with the version in the branch
- nadir_1_2_2 !!
-
-2003-12-05 14:49 Jerome Robert <jerome.robert@eads.net>
-
- * src/MEFISTO2/trte.f: Remove "pause" primitive call.
-
-2003-11-27 11:45 Jerome Robert <jerome.robert@eads.net>
-
- * resources/SMESH_en.xml, resources/SMESH_fr.xml,
- src/SMESHGUI/SMESHGUI.cxx: [Bug SMESH839] Spelling: Hypotheses -
- Hexa?edron (i,j,k). Bug Fixed.
-
-2003-11-25 08:52 tag V1_3_0
-
-2003-11-25 08:52 Nicolas Rejneri <nicolas.rejneri@opencascade.com>
-
- * bin/VERSION, INSTALL: NRI: 1.3.0 version.
-
-2003-11-20 12:45 tag V1_3_0_b3
-
-2003-11-20 12:45 Nicolas Rejneri <nicolas.rejneri@opencascade.com>
-
- * doc/html/INPUT/sources/static/: doxygen.css, page2.html, tree.js,
- treeview.js: NRI : Add static documentation.
-
-2003-11-20 12:45 Nicolas Rejneri <nicolas.rejneri@opencascade.com>
-
- * doc/html/INPUT/sources/: Application-About.png,
- Application-About1.jpg, application.gif, application.jpg,
- bg_salome.gif, bg_salomepro.gif, doxygen.css: NRI : Update
- images.
-
-2003-11-20 12:44 Nicolas Rejneri <nicolas.rejneri@opencascade.com>
-
- * doc/html/INPUT/doxyfile: NRI : Generate TreeView.
-
-2003-11-20 12:43 Nicolas Rejneri <nicolas.rejneri@opencascade.com>
-
- * doc/html/Makefile.in: NRI : Add static directory.
-
-2003-11-18 15:01 tag V1_3_0b2
-
-2003-11-18 15:01 Jerome Robert <jerome.robert@eads.net>
-
- * ChangeLog, INSTALL, cvs-tags: update for V1_3_0_b2
-
-2003-11-18 09:19 Nadir Bouhamou <nadir.bouhamou@cea.fr>
-
- * src/SMESH_I/: SMESH_MEDFamily_i.cxx, SMESH_MEDFamily_i.hxx,
- SMESH_MEDMesh_i.cxx, SMESH_MEDMesh_i.hxx, SMESH_MEDSupport_i.cxx,
- SMESH_MEDSupport_i.hxx: merge with the branch
- nadir_update_MED_v1_3_0 (branch to build the V1_3_0 version of
- the module.
-
-2003-11-12 13:20 tag V1_3_0_b1
-
-2003-11-12 13:20 Jerome Robert <jerome.robert@eads.net>
-
- * ChangeLog, INSTALL, cvs-tags, bin/VERSION: Update for V1.3.0b1
-
-2003-11-12 11:40 Jerome Robert <jerome.robert@eads.net>
-
- * src/OBJECT/SMESH_Actor.cxx: MergeV1_2c-1
-
-2003-11-06 14:43 Nicolas Rejneri <nicolas.rejneri@opencascade.com>
-
- * src/SMESHGUI/SMESHGUI.cxx: NRI : MergeV1_2c-1.
-
-2003-11-06 14:34 Nicolas Rejneri <nicolas.rejneri@opencascade.com>
-
- * src/MEFISTO2/: areteideale.f, trte.f: NRI : Add licence header.
-
-2003-11-06 11:34 Nicolas Rejneri <nicolas.rejneri@opencascade.com>
-
- * LICENCE: NRI : add LICENCE file
-
-2003-11-03 15:50 Nicolas Rejneri <nicolas.rejneri@opencascade.com>
-
- * doc/html/Makefile.in: NRI : Relative path !!!!
-
-2003-10-22 15:28 Jerome Robert <jerome.robert@eads.net>
-
- * src/SMDS/: SMDS_Mesh.cxx, SMDS_Mesh.hxx: Fix/implement
- removeNode, removeEdge, removeFace, removeVolume and
- removeElement
-
-2003-10-20 16:26 Jerome Robert <jerome.robert@eads.net>
-
- * src/SMESHGUI/SMESHGUI.cxx: When the main window was maximized
- some dialogs were cropped at the bottom of the screen. It's now
- fixed.
-
-2003-10-17 16:31 Jerome Robert <jerome.robert@eads.net>
-
- * src/SMDS/SMDS_Mesh.cxx: Fix a bug. Quadrangles were added as
- triangles.
-
-2003-10-06 10:50 tag MergeV1_2c-1
-
-2003-10-06 10:50 Jerome Robert <jerome.robert@eads.net>
-
- * cvs-tags: Update. Created a new branch for user nadir.
-
-2003-10-02 16:16 Nicolas Rejneri <nicolas.rejneri@opencascade.com>
-
- * build_configure: NRI : RedHat 9 compatibility (M. Tajchman).
-
-2003-09-26 15:14 tag V1_2_2
-
-2003-09-26 15:14 Jerome Robert <jerome.robert@eads.net>
-
- * INSTALL, cvs-tags: Add a tag file to track branch and tag. Update
- INSTALL to prepare V1_2_2 tag.
-
-2003-09-26 14:21 tag V1_2_1
-
-2003-09-26 14:21 Nicolas Rejneri <nicolas.rejneri@opencascade.com>
-
- * INSTALL: NRI : INSTALL file defined into SALOME2_PRODUCTION_CYCLE
- document.
-
-2003-09-23 14:33 Jerome Robert <jerome.robert@eads.net>
-
- * src/: SMDS/SMDS_FaceOfEdges.hxx, SMESHDS/SMESHDS_Mesh.hxx,
- SMDS/SMDS_FaceOfNodes.hxx, SMDS/SMDS_MeshEdge.hxx,
- SMDS/SMDS_MeshElement.hxx, SMDS/SMDS_Tria3OfNodes.hxx,
- SMDS/SMDS_VolumeOfFaces.hxx: Keep compatible with gcc 2
-
-2003-09-23 11:52 Nicolas Rejneri <nicolas.rejneri@opencascade.com>
-
- * src/SMESHGUI/SMESHGUI_StudyAPI.cxx: NRI : Display Component
- UserName and Icon.
-
-2003-09-22 12:23 Jerome Robert <jerome.robert@eads.net>
-
- * src/SMDS/SMDS_IteratorOfArray.hxx: Freshly added file
-
-2003-09-12 15:12 Jerome Robert <jerome.robert@eads.net>
-
- * src/SMDS/: Makefile.in, SMDS_HexahedronOfNodes.cxx,
- SMDS_HexahedronOfNodes.hxx, SMDS_Mesh.cxx, SMDS_Tria3OfNodes.cxx,
- SMDS_Tria3OfNodes.hxx: Add HexahedronOfNodes and Tria3OfNodes to
- improve performance
-
-2003-09-12 15:11 Jerome Robert <jerome.robert@eads.net>
-
- * src/SMDS/SMDS_VolumeOfNodes.cxx: Fix bug. Was always printing 8
- nodes
-
-2003-09-08 15:04 Jerome Robert <jerome.robert@eads.net>
-
- * src/SMDS/: SMDS_Mesh.cxx, SMDS_VolumeOfNodes.cxx,
- SMDS_VolumeOfNodes.hxx: Add support for tetra, pyramid and prism
-
-2003-09-08 13:41 Jerome Robert <jerome.robert@eads.net>
-
- * src/SMDS/: SMDS_Mesh.cxx, SMDS_MeshElement.cxx: Add some comments
-
-2003-09-05 12:19 Jerome Robert <jerome.robert@eads.net>
-
- * src/SMDS/SMDS_MeshNode.cxx: Some forgotten return statments
-
-2003-09-05 11:45 Jerome Robert <jerome.robert@eads.net>
-
- * src/: DriverDAT/DriverDAT_W_SMESHDS_Mesh.cxx,
- DriverMED/DriverMED_W_SMESHDS_Mesh.cxx, SMESH/SMESH_Hexa_3D.cxx:
- Correct some memory leaks
-
-2003-09-05 10:31 Jerome Robert <jerome.robert@eads.net>
-
- * src/: DriverMED/DriverMED_W_SMESHDS_Mesh.cxx,
- SMESH/SMESH_Hexa_3D.cxx, SMESH/SMESH_Hexa_3D.hxx,
- SMESH/SMESH_MEFISTO_2D.cxx, SMESH/SMESH_MEFISTO_2D.hxx,
- SMESH/SMESH_Quadrangle_2D.cxx, SMESH/SMESH_Quadrangle_2D.hxx,
- SMESH/SMESH_Regular_1D.cxx, SMESH/SMESH_subMesh.cxx,
- SMESHDS/SMESHDS_Mesh.cxx, SMESHDS/SMESHDS_Mesh.hxx,
- SMESHDS/SMESHDS_SubMesh.cxx, SMESHDS/SMESHDS_SubMesh.hxx,
- SMESH_I/SMESH_MEDSupport_i.cxx, SMESH_I/SMESH_MeshEditor_i.cxx:
- Use nodes and elements pointer instead on IDs
-
-2003-09-05 10:20 Jerome Robert <jerome.robert@eads.net>
-
- * src/SMDS/: SMDS_Mesh.cxx, SMDS_Mesh.hxx: Change API to use
- pointer on elements and no longer ID of elements
-
-2003-09-04 15:04 Jerome Robert <jerome.robert@eads.net>
-
- * src/SMESHDS/: Handle_SMESHDS_Command.hxx,
- Handle_SMESHDS_DataMapNodeOfDataMapOfIntegerMesh.hxx,
- Handle_SMESHDS_DataMapNodeOfDataMapOfIntegerPtrHypothesis.hxx,
- Handle_SMESHDS_DataMapNodeOfDataMapOfIntegerSubMesh.hxx,
- Handle_SMESHDS_DataMapNodeOfDataMapOfShapeListOfPtrHypothesis.hxx,
- Handle_SMESHDS_DataMapNodeOfDataMapOfShapeSubMesh.hxx,
- Handle_SMESHDS_Document.hxx,
- Handle_SMESHDS_ListNodeOfListOfAsciiString.hxx,
- Handle_SMESHDS_ListNodeOfListOfCommand.hxx,
- Handle_SMESHDS_ListNodeOfListOfPtrHypothesis.hxx,
- Handle_SMESHDS_Mesh.hxx, Handle_SMESHDS_Script.hxx,
- Handle_SMESHDS_SubMesh.hxx, SMESHDS.cdl, SMESHDS_Command.cdl,
- SMESHDS_Command.ixx, SMESHDS_Command.jxx,
- SMESHDS_DataMapIteratorOfDataMapOfIntegerMesh.hxx,
- SMESHDS_DataMapIteratorOfDataMapOfIntegerMesh_0.cxx,
- SMESHDS_DataMapIteratorOfDataMapOfIntegerPtrHypothesis.hxx,
- SMESHDS_DataMapIteratorOfDataMapOfIntegerPtrHypothesis_0.cxx,
- SMESHDS_DataMapIteratorOfDataMapOfIntegerSubMesh.hxx,
- SMESHDS_DataMapIteratorOfDataMapOfIntegerSubMesh_0.cxx,
- SMESHDS_DataMapIteratorOfDataMapOfShapeListOfPtrHypothesis.hxx,
- SMESHDS_DataMapIteratorOfDataMapOfShapeListOfPtrHypothesis_0.cxx,
- SMESHDS_DataMapIteratorOfDataMapOfShapeSubMesh.hxx,
- SMESHDS_DataMapIteratorOfDataMapOfShapeSubMesh_0.cxx,
- SMESHDS_DataMapNodeOfDataMapOfIntegerMesh.hxx,
- SMESHDS_DataMapNodeOfDataMapOfIntegerMesh_0.cxx,
- SMESHDS_DataMapNodeOfDataMapOfIntegerPtrHypothesis.hxx,
- SMESHDS_DataMapNodeOfDataMapOfIntegerPtrHypothesis_0.cxx,
- SMESHDS_DataMapNodeOfDataMapOfIntegerSubMesh.hxx,
- SMESHDS_DataMapNodeOfDataMapOfIntegerSubMesh_0.cxx,
- SMESHDS_DataMapNodeOfDataMapOfShapeListOfPtrHypothesis.hxx,
- SMESHDS_DataMapNodeOfDataMapOfShapeListOfPtrHypothesis_0.cxx,
- SMESHDS_DataMapNodeOfDataMapOfShapeSubMesh.hxx,
- SMESHDS_DataMapNodeOfDataMapOfShapeSubMesh_0.cxx,
- SMESHDS_DataMapOfIntegerMesh.hxx,
- SMESHDS_DataMapOfIntegerMesh_0.cxx,
- SMESHDS_DataMapOfIntegerPtrHypothesis.hxx,
- SMESHDS_DataMapOfIntegerPtrHypothesis_0.cxx,
- SMESHDS_DataMapOfIntegerSubMesh.hxx,
- SMESHDS_DataMapOfIntegerSubMesh_0.cxx,
- SMESHDS_DataMapOfShapeListOfPtrHypothesis.hxx,
- SMESHDS_DataMapOfShapeListOfPtrHypothesis_0.cxx,
- SMESHDS_DataMapOfShapeSubMesh.hxx,
- SMESHDS_DataMapOfShapeSubMesh_0.cxx, SMESHDS_Document.cdl,
- SMESHDS_Document.ixx, SMESHDS_Document.jxx,
- SMESHDS_ListIteratorOfListOfAsciiString.hxx,
- SMESHDS_ListIteratorOfListOfAsciiString_0.cxx,
- SMESHDS_ListIteratorOfListOfCommand.hxx,
- SMESHDS_ListIteratorOfListOfCommand_0.cxx,
- SMESHDS_ListIteratorOfListOfPtrHypothesis.hxx,
- SMESHDS_ListIteratorOfListOfPtrHypothesis_0.cxx,
- SMESHDS_ListNodeOfListOfAsciiString.hxx,
- SMESHDS_ListNodeOfListOfAsciiString_0.cxx,
- SMESHDS_ListNodeOfListOfCommand.hxx,
- SMESHDS_ListNodeOfListOfCommand_0.cxx,
- SMESHDS_ListNodeOfListOfPtrHypothesis.hxx,
- SMESHDS_ListNodeOfListOfPtrHypothesis_0.cxx,
- SMESHDS_ListOfAsciiString.hxx, SMESHDS_ListOfAsciiString_0.cxx,
- SMESHDS_ListOfCommand.hxx, SMESHDS_ListOfCommand_0.cxx,
- SMESHDS_ListOfPtrHypothesis.hxx,
- SMESHDS_ListOfPtrHypothesis_0.cxx, SMESHDS_Mesh.cdl,
- SMESHDS_Mesh.ixx, SMESHDS_Mesh.jxx, SMESHDS_PtrHypothesis.hxx,
- SMESHDS_Script.cdl, SMESHDS_Script.ixx, SMESHDS_Script.jxx,
- SMESHDS_SubMesh.cdl, SMESHDS_SubMesh.ixx, SMESHDS_SubMesh.jxx:
- Remove no longer needed files
-
-2003-09-04 14:50 Jerome Robert <jerome.robert@eads.net>
-
- * src/SMDS/: Handle_SMDSControl_BoundaryEdges.hxx,
- Handle_SMDSControl_BoundaryFaces.hxx,
- Handle_SMDSControl_MeshBoundary.hxx,
- Handle_SMDS_DataMapNodeOfDataMapOfIntegerMeshElement.hxx,
- Handle_SMDS_DataMapNodeOfDataMapOfPntInteger.hxx,
- Handle_SMDS_EdgePosition.hxx, Handle_SMDS_FacePosition.hxx,
- Handle_SMDS_HSequenceOfMesh.hxx,
- Handle_SMDS_ListNodeOfListOfMesh.hxx,
- Handle_SMDS_ListNodeOfListOfMeshElement.hxx,
- Handle_SMDS_ListNodeOfListOfMeshGroup.hxx, Handle_SMDS_Mesh.hxx,
- Handle_SMDS_MeshEdge.hxx, Handle_SMDS_MeshElement.hxx,
- Handle_SMDS_MeshElementIDFactory.hxx, Handle_SMDS_MeshFace.hxx,
- Handle_SMDS_MeshGroup.hxx, Handle_SMDS_MeshHexahedron.hxx,
- Handle_SMDS_MeshIDFactory.hxx, Handle_SMDS_MeshNode.hxx,
- Handle_SMDS_MeshNodeIDFactory.hxx, Handle_SMDS_MeshObject.hxx,
- Handle_SMDS_MeshPrism.hxx, Handle_SMDS_MeshPyramid.hxx,
- Handle_SMDS_MeshQuadrangle.hxx, Handle_SMDS_MeshTetrahedron.hxx,
- Handle_SMDS_MeshTriangle.hxx, Handle_SMDS_MeshVolume.hxx,
- Handle_SMDS_Position.hxx,
- Handle_SMDS_SequenceNodeOfSequenceOfMesh.hxx,
- Handle_SMDS_SpacePosition.hxx,
- Handle_SMDS_StdMapNodeOfExtendedMap.hxx,
- Handle_SMDS_StdMapNodeOfExtendedOrientedMap.hxx,
- Handle_SMDS_VertexPosition.hxx, SMDS.cdl, SMDSAbs.cdl,
- SMDSControl.cdl, SMDSControl.ixx, SMDSControl.jxx,
- SMDSControl_BoundaryEdges.cdl, SMDSControl_BoundaryEdges.ixx,
- SMDSControl_BoundaryEdges.jxx, SMDSControl_BoundaryFaces.cdl,
- SMDSControl_BoundaryFaces.ixx, SMDSControl_BoundaryFaces.jxx,
- SMDSControl_MeshBoundary.cdl, SMDSControl_MeshBoundary.ixx,
- SMDSControl_MeshBoundary.jxx, SMDSEdit.cdl,
- SMDSEdit_Transform.cdl, SMDSEdit_Transform.ixx,
- SMDSEdit_Transform.jxx, SMDS_BasicMap.lxx,
- SMDS_BasicMapIterator.lxx,
- SMDS_DataMapIteratorOfDataMapOfIntegerMeshElement.hxx,
- SMDS_DataMapIteratorOfDataMapOfIntegerMeshElement_0.cxx,
- SMDS_DataMapIteratorOfDataMapOfPntInteger.hxx,
- SMDS_DataMapIteratorOfDataMapOfPntInteger_0.cxx,
- SMDS_DataMapNodeOfDataMapOfIntegerMeshElement.hxx,
- SMDS_DataMapNodeOfDataMapOfIntegerMeshElement_0.cxx,
- SMDS_DataMapNodeOfDataMapOfPntInteger.hxx,
- SMDS_DataMapNodeOfDataMapOfPntInteger_0.cxx,
- SMDS_DataMapOfIntegerMeshElement.hxx,
- SMDS_DataMapOfIntegerMeshElement_0.cxx,
- SMDS_DataMapOfPntInteger.hxx, SMDS_DataMapOfPntInteger_0.cxx,
- SMDS_EdgePosition.cdl, SMDS_EdgePosition.ixx,
- SMDS_EdgePosition.jxx, SMDS_EdgePosition.lxx,
- SMDS_ExtendedMap.hxx, SMDS_ExtendedMap_0.cxx,
- SMDS_ExtendedOrientedMap.hxx, SMDS_ExtendedOrientedMap_0.cxx,
- SMDS_FacePosition.cdl, SMDS_FacePosition.ixx,
- SMDS_FacePosition.jxx, SMDS_FacePosition.lxx,
- SMDS_HSequenceOfMesh.hxx, SMDS_HSequenceOfMesh_0.cxx,
- SMDS_ListIteratorOfListOfMesh.hxx,
- SMDS_ListIteratorOfListOfMeshElement.hxx,
- SMDS_ListIteratorOfListOfMeshElement_0.cxx,
- SMDS_ListIteratorOfListOfMeshGroup.hxx,
- SMDS_ListIteratorOfListOfMeshGroup_0.cxx,
- SMDS_ListIteratorOfListOfMesh_0.cxx,
- SMDS_ListNodeOfListOfMesh.hxx,
- SMDS_ListNodeOfListOfMeshElement.hxx,
- SMDS_ListNodeOfListOfMeshElement_0.cxx,
- SMDS_ListNodeOfListOfMeshGroup.hxx,
- SMDS_ListNodeOfListOfMeshGroup_0.cxx,
- SMDS_ListNodeOfListOfMesh_0.cxx, SMDS_ListOfMesh.hxx,
- SMDS_ListOfMeshElement.hxx, SMDS_ListOfMeshElement_0.cxx,
- SMDS_ListOfMeshGroup.hxx, SMDS_ListOfMeshGroup_0.cxx,
- SMDS_ListOfMesh_0.cxx, SMDS_Map.gxx, SMDS_MapHasher.gxx,
- SMDS_MapIterator.gxx, SMDS_MapIteratorOfExtendedMap.hxx,
- SMDS_MapIteratorOfExtendedMap_0.cxx,
- SMDS_MapIteratorOfExtendedOrientedMap.hxx,
- SMDS_MapIteratorOfExtendedOrientedMap_0.cxx, SMDS_MapNode.lxx,
- SMDS_MapOfMeshElement.cdl, SMDS_MapOfMeshElement.cxx,
- SMDS_MapOfMeshElement.hxx, SMDS_MapOfMeshElement.ixx,
- SMDS_MapOfMeshElement.jxx, SMDS_MapOfMeshElement.lxx,
- SMDS_MapOfMeshOrientedElement.cdl,
- SMDS_MapOfMeshOrientedElement.cxx,
- SMDS_MapOfMeshOrientedElement.hxx,
- SMDS_MapOfMeshOrientedElement.ixx,
- SMDS_MapOfMeshOrientedElement.jxx,
- SMDS_MapOfMeshOrientedElement.lxx, SMDS_Mesh.cdl, SMDS_Mesh.ixx,
- SMDS_Mesh.jxx, SMDS_Mesh.lxx, SMDS_MeshEdge.cdl,
- SMDS_MeshEdge.ixx, SMDS_MeshEdge.jxx, SMDS_MeshEdge.lxx,
- SMDS_MeshEdgesIterator.cdl, SMDS_MeshEdgesIterator.cxx,
- SMDS_MeshEdgesIterator.hxx, SMDS_MeshEdgesIterator.ixx,
- SMDS_MeshEdgesIterator.jxx, SMDS_MeshElement.cdl,
- SMDS_MeshElement.ixx, SMDS_MeshElement.jxx, SMDS_MeshElement.lxx,
- SMDS_MeshElementIDFactory.cdl, SMDS_MeshElementIDFactory.ixx,
- SMDS_MeshElementIDFactory.jxx, SMDS_MeshElementIDFactory.lxx,
- SMDS_MeshElementMapHasher.cdl, SMDS_MeshElementMapHasher.cxx,
- SMDS_MeshElementMapHasher.hxx, SMDS_MeshElementMapHasher.ixx,
- SMDS_MeshElementMapHasher.jxx, SMDS_MeshElementMapHasher.lxx,
- SMDS_MeshElementsIterator.cdl, SMDS_MeshElementsIterator.cxx,
- SMDS_MeshElementsIterator.hxx, SMDS_MeshElementsIterator.ixx,
- SMDS_MeshElementsIterator.jxx, SMDS_MeshElementsIterator.lxx,
- SMDS_MeshFace.cdl, SMDS_MeshFace.ixx, SMDS_MeshFace.jxx,
- SMDS_MeshFace.lxx, SMDS_MeshFacesIterator.cdl,
- SMDS_MeshFacesIterator.cxx, SMDS_MeshFacesIterator.hxx,
- SMDS_MeshFacesIterator.ixx, SMDS_MeshFacesIterator.jxx,
- SMDS_MeshGroup.cdl, SMDS_MeshGroup.ixx, SMDS_MeshGroup.jxx,
- SMDS_MeshGroup.lxx, SMDS_MeshHexahedron.cdl,
- SMDS_MeshHexahedron.ixx, SMDS_MeshHexahedron.jxx,
- SMDS_MeshHexahedron.lxx, SMDS_MeshIDFactory.cdl,
- SMDS_MeshIDFactory.ixx, SMDS_MeshIDFactory.jxx,
- SMDS_MeshIDFactory.lxx, SMDS_MeshNode.cdl, SMDS_MeshNode.ixx,
- SMDS_MeshNode.jxx, SMDS_MeshNode.lxx, SMDS_MeshNodeIDFactory.cdl,
- SMDS_MeshNodeIDFactory.ixx, SMDS_MeshNodeIDFactory.jxx,
- SMDS_MeshNodeIDFactory.lxx, SMDS_MeshNodesIterator.cdl,
- SMDS_MeshNodesIterator.cxx, SMDS_MeshNodesIterator.hxx,
- SMDS_MeshNodesIterator.ixx, SMDS_MeshNodesIterator.jxx,
- SMDS_MeshObject.cdl, SMDS_MeshObject.ixx, SMDS_MeshObject.jxx,
- SMDS_MeshOrientedElementMapHasher.cdl,
- SMDS_MeshOrientedElementMapHasher.cxx,
- SMDS_MeshOrientedElementMapHasher.hxx,
- SMDS_MeshOrientedElementMapHasher.ixx,
- SMDS_MeshOrientedElementMapHasher.jxx,
- SMDS_MeshOrientedElementMapHasher.lxx, SMDS_MeshPrism.cdl,
- SMDS_MeshPrism.ixx, SMDS_MeshPrism.jxx, SMDS_MeshPrism.lxx,
- SMDS_MeshPyramid.cdl, SMDS_MeshPyramid.ixx, SMDS_MeshPyramid.jxx,
- SMDS_MeshPyramid.lxx, SMDS_MeshQuadrangle.cdl,
- SMDS_MeshQuadrangle.ixx, SMDS_MeshQuadrangle.jxx,
- SMDS_MeshQuadrangle.lxx, SMDS_MeshTetrahedron.cdl,
- SMDS_MeshTetrahedron.ixx, SMDS_MeshTetrahedron.jxx,
- SMDS_MeshTetrahedron.lxx, SMDS_MeshTriangle.cdl,
- SMDS_MeshTriangle.ixx, SMDS_MeshTriangle.jxx,
- SMDS_MeshTriangle.lxx, SMDS_MeshVolume.cdl, SMDS_MeshVolume.ixx,
- SMDS_MeshVolume.jxx, SMDS_MeshVolume.lxx,
- SMDS_MeshVolumesIterator.cdl, SMDS_MeshVolumesIterator.cxx,
- SMDS_MeshVolumesIterator.hxx, SMDS_MeshVolumesIterator.ixx,
- SMDS_MeshVolumesIterator.jxx, SMDS_PntHasher.cdl,
- SMDS_PntHasher.cxx, SMDS_PntHasher.hxx, SMDS_PntHasher.ixx,
- SMDS_PntHasher.jxx, SMDS_PntHasher.lxx, SMDS_Position.cdl,
- SMDS_Position.ixx, SMDS_Position.jxx, SMDS_Position.lxx,
- SMDS_SequenceNodeOfSequenceOfMesh.hxx,
- SMDS_SequenceNodeOfSequenceOfMesh_0.cxx, SMDS_SequenceOfMesh.hxx,
- SMDS_SequenceOfMesh_0.cxx, SMDS_SpacePosition.cdl,
- SMDS_SpacePosition.ixx, SMDS_SpacePosition.jxx,
- SMDS_SpacePosition.lxx, SMDS_StdMapNode.gxx, SMDS_StdMapNode.lxx,
- SMDS_StdMapNodeOfExtendedMap.hxx,
- SMDS_StdMapNodeOfExtendedMap_0.cxx,
- SMDS_StdMapNodeOfExtendedOrientedMap.hxx,
- SMDS_StdMapNodeOfExtendedOrientedMap_0.cxx,
- SMDS_VertexPosition.cdl, SMDS_VertexPosition.ixx,
- SMDS_VertexPosition.jxx: Remove no longer needed files
-
-2003-09-04 13:28 Jerome Robert <jerome.robert@eads.net>
-
- * build_configure: It seems "make_omniorb" and "make_commence" need
- to be before and after "envScript"
-
-2003-09-04 12:57 Jerome Robert <jerome.robert@eads.net>
-
- * build_configure: make_commence and make_omniorb were detected
- twice. Only one is requiered in AC_OUTPUT
-
-2003-09-04 12:03 Jerome Robert <jerome.robert@eads.net>
-
- * src/: DriverDAT/DriverDAT_R_SMDS_Mesh.cxx,
- DriverDAT/DriverDAT_R_SMDS_Mesh.h,
- DriverDAT/DriverDAT_R_SMESHDS_Document.cxx,
- DriverDAT/DriverDAT_R_SMESHDS_Mesh.cxx,
- DriverDAT/DriverDAT_R_SMESHDS_Mesh.h,
- DriverDAT/DriverDAT_W_SMDS_Mesh.cxx,
- DriverDAT/DriverDAT_W_SMDS_Mesh.h,
- DriverDAT/DriverDAT_W_SMESHDS_Document.cxx,
- DriverDAT/DriverDAT_W_SMESHDS_Mesh.cxx,
- DriverDAT/DriverDAT_W_SMESHDS_Mesh.h,
- DriverMED/DriverMED_R_SMDS_Mesh.cxx,
- DriverMED/DriverMED_R_SMDS_Mesh.h,
- DriverMED/DriverMED_R_SMESHDS_Document.cxx,
- DriverMED/DriverMED_R_SMESHDS_Mesh.cxx,
- DriverMED/DriverMED_R_SMESHDS_Mesh.h,
- DriverMED/DriverMED_W_SMDS_Mesh.cxx,
- DriverMED/DriverMED_W_SMDS_Mesh.h,
- DriverMED/DriverMED_W_SMESHDS_Document.cxx,
- DriverMED/DriverMED_W_SMESHDS_Mesh.cxx,
- DriverMED/DriverMED_W_SMESHDS_Mesh.h,
- DriverUNV/DriverUNV_R_SMDS_Mesh.cxx,
- DriverUNV/DriverUNV_R_SMDS_Mesh.h,
- DriverUNV/DriverUNV_R_SMESHDS_Document.cxx,
- DriverUNV/DriverUNV_R_SMESHDS_Mesh.cxx,
- DriverUNV/DriverUNV_R_SMESHDS_Mesh.h,
- DriverUNV/DriverUNV_W_SMDS_Mesh.cxx,
- DriverUNV/DriverUNV_W_SMDS_Mesh.h,
- DriverUNV/DriverUNV_W_SMESHDS_Document.cxx,
- DriverUNV/DriverUNV_W_SMESHDS_Mesh.cxx,
- DriverUNV/DriverUNV_W_SMESHDS_Mesh.h: Update to match the changes
- in SMDS
-
-2003-09-04 11:03 Jerome Robert <jerome.robert@eads.net>
-
- * src/: DriverDAT/Makefile.in, DriverMED/Makefile.in,
- DriverUNV/Makefile.in: Remove OCC_LIBS from LDFLAGS
-
-2003-09-04 10:56 Jerome Robert <jerome.robert@eads.net>
-
- * src/Driver/: Document_Reader.cxx, Document_Reader.h,
- Document_Writer.cxx, Document_Writer.h, Mesh_Reader.h,
- Mesh_Writer.h: Update to mach the changes in SMDS
-
-2003-09-04 10:44 Jerome Robert <jerome.robert@eads.net>
-
- * src/Driver/Makefile.in: Remove OCC_LIBS from LDFLAGS
-
-2003-09-04 10:41 Jerome Robert <jerome.robert@eads.net>
-
- * src/SMESH_I/: SMESH_Gen_i.cxx, SMESH_MEDMesh_i.cxx,
- SMESH_MEDMesh_i.hxx, SMESH_MEDSupport_i.cxx,
- SMESH_MEDSupport_i.hxx, SMESH_MeshEditor_i.cxx,
- SMESH_MeshEditor_i.hxx, SMESH_Mesh_i.cxx: Update to match the new
- implementation of SMDS
-
-2003-09-04 10:10 Jerome Robert <jerome.robert@eads.net>
-
- * src/SMESH/SMESH_MaxElementArea.cxx: make GetMaxArea const
-
-2003-09-04 10:10 Jerome Robert <jerome.robert@eads.net>
-
- * src/SMESH/: SMESH_MEFISTO_2D.hxx, SMESH_Regular_1D.hxx: make
- hypothesis const
-
-2003-09-04 09:55 Jerome Robert <jerome.robert@eads.net>
-
- * src/SMESH/SMESH_Hexa_3D.hxx: Update to match the change of SMDS
- (new DS).
-
-2003-09-04 09:51 Jerome Robert <jerome.robert@eads.net>
-
- * src/SMESH_I/sstream: Use the file include in gcc instead of this
- one
-
-2003-09-04 09:21 Jerome Robert <jerome.robert@eads.net>
-
- * src/SMESH/: SMESH_Algo.cxx, SMESH_Algo.hxx, SMESH_Gen.cxx,
- SMESH_Gen.hxx, SMESH_Hexa_3D.cxx, SMESH_MEFISTO_2D.cxx,
- SMESH_MaxElementArea.hxx, SMESH_Mesh.cxx, SMESH_Mesh.hxx,
- SMESH_Quadrangle_2D.cxx, SMESH_Regular_1D.cxx, SMESH_subMesh.cxx,
- SMESH_subMesh.hxx: Update to match the change of SMDS (new DS).
-
-2003-09-04 09:13 Jerome Robert <jerome.robert@eads.net>
-
- * src/SMESH/: SMESH_NumberOfSegments.cxx,
- SMESH_NumberOfSegments.hxx: make GetNumberOfSegments and
- GetScaleFactor const
-
-2003-09-04 09:10 Jerome Robert <jerome.robert@eads.net>
-
- * src/SMESH/: SMESH_LocalLength.cxx, SMESH_LocalLength.hxx: make
- GetLength const
-
-2003-09-04 08:09 Jerome Robert <jerome.robert@eads.net>
-
- * src/SMESHFiltersSelection/Makefile.in: Change OCC_LIBS to
- OCC_KERNEL_LIBS
-
-2003-09-04 07:55 Jerome Robert <jerome.robert@eads.net>
-
- * src/SMESHGUI/Makefile.in: Change OCC_LIBS to OCC_KERNEL_LIBS
-
-2003-09-04 07:39 Jerome Robert <jerome.robert@eads.net>
-
- * src/SMESHGUI/: SMESHGUI.cxx, SMESHGUI.h: Change
- Handle(SMESHDS_Document) to SMESHDS_Document*
-
-2003-09-04 07:21 Jerome Robert <jerome.robert@eads.net>
-
- * src/MEFISTO2/Makefile.in: Remove OCC_LIBS from LDFLAGS
-
-2003-09-04 07:14 Jerome Robert <jerome.robert@eads.net>
-
- * src/SMESHDS/: Makefile.in, SMESHDS_Command.cxx,
- SMESHDS_Command.hxx, SMESHDS_Document.cxx, SMESHDS_Document.hxx,
- SMESHDS_Hypothesis.cxx, SMESHDS_Hypothesis.hxx, SMESHDS_Mesh.cxx,
- SMESHDS_Mesh.hxx, SMESHDS_Script.cxx, SMESHDS_Script.hxx,
- SMESHDS_SubMesh.cxx, SMESHDS_SubMesh.hxx: Remove Opencascade
- dependencies. Change to STL.
-
-2003-09-03 17:31 Jerome Robert <jerome.robert@eads.net>
-
- * src/OBJECT/Makefile.in: Change OCC_LIBS to OCC_KERNEL_LIBS
-
-2003-09-03 17:30 Jerome Robert <jerome.robert@eads.net>
-
- * src/SMDS/: SMDS_Mesh.cxx, SMDS_Mesh.hxx, SMDS_MeshEdge.cxx,
- SMDS_MeshEdge.hxx, SMDS_MeshElement.cxx, SMDS_MeshElement.hxx,
- SMDS_MeshNode.cxx, SMDS_MeshNode.hxx, SMDS_MeshVolume.cxx,
- SMDS_MeshVolume.hxx, SMDS_MeshFace.cxx, SMDS_MeshFace.hxx: New DS
- implementation
-
-2003-09-03 17:29 Jerome Robert <jerome.robert@eads.net>
-
- * src/SMDS/: SMDS_EdgePosition.cxx, SMDS_EdgePosition.hxx,
- SMDS_FacePosition.cxx, SMDS_FacePosition.hxx,
- SMDS_MeshElementIDFactory.cxx, SMDS_MeshElementIDFactory.hxx,
- SMDS_MeshGroup.cxx, SMDS_MeshGroup.hxx, SMDS_MeshIDFactory.cxx,
- SMDS_MeshIDFactory.hxx, SMDS_MeshObject.cxx, SMDS_MeshObject.hxx,
- SMDS_Position.cxx, SMDS_Position.hxx, SMDS_SpacePosition.cxx,
- SMDS_SpacePosition.hxx, SMDS_TypeOfPosition.hxx,
- SMDS_VertexPosition.cxx, SMDS_VertexPosition.hxx: Remove
- Opencascade dependencies
-
-2003-09-03 17:21 Jerome Robert <jerome.robert@eads.net>
-
- * src/SMDS/SMDSAbs_ElementType.hxx: comments
-
-2003-09-03 17:21 Jerome Robert <jerome.robert@eads.net>
-
- * src/SMDS/: SMDS_Iterator.hxx, SMDS_IteratorOfElements.cxx,
- SMDS_IteratorOfElements.hxx: Add iterator classes
-
-2003-09-03 17:16 Jerome Robert <jerome.robert@eads.net>
-
- * src/SMDS/Makefile.in: Remove wok files. Comment no longer needed
- files
-
-2003-09-03 17:09 Jerome Robert <jerome.robert@eads.net>
-
- * src/SMDS/: SMDS_FaceOfEdges.cxx, SMDS_FaceOfEdges.hxx,
- SMDS_FaceOfNodes.cxx, SMDS_FaceOfNodes.hxx,
- SMDS_VolumeOfFaces.cxx, SMDS_VolumeOfFaces.hxx,
- SMDS_VolumeOfNodes.cxx, SMDS_VolumeOfNodes.hxx: Add needed class
- for the new DS
-
-2003-07-18 12:19 Nicolas Rejneri <nicolas.rejneri@opencascade.com>
-
- * src/SMESHGUI/SMESHGUI_StudyAPI.cxx: NRI : correction wrong merge.
-
-2003-07-11 07:32 Nicolas Rejneri <nicolas.rejneri@opencascade.com>
-
- * bin/VERSION, doc/html/Makefile.in, doc/html/INPUT/doxyfile: NRI :
- Merge from V1_2.
-
-2003-07-10 17:51 Nicolas Rejneri <nicolas.rejneri@opencascade.com>
-
- * configure.in.base: NRI : Merge from V1_2.
-
-2003-07-10 16:31 Nicolas Rejneri <nicolas.rejneri@opencascade.com>
-
- * src/SMESHGUI/: SMESHGUI_Swig.cxx, SMESHGUI_Swig.i: NRI : Merge
- from V1_2.
-
-2003-07-10 16:06 Nicolas Rejneri <nicolas.rejneri@opencascade.com>
-
- * src/SMESHGUI/SMESHGUI_Swig.cxx: NRI : Merge from V1_2.
-
-2003-07-10 15:36 Nicolas Rejneri <nicolas.rejneri@opencascade.com>
-
- * src/Driver/Makefile.in: NRI : Merge from V1_2.
-
-2003-07-10 15:03 Nicolas Rejneri <nicolas.rejneri@opencascade.com>
-
- * src/SMESH/Makefile.in, src/SMESH_I/Makefile.in,
- idl/SMESH_BasicHypothesis.idl, idl/SMESH_Gen.idl,
- idl/SMESH_Hypothesis.idl, idl/SMESH_Mesh.idl,
- adm_local/unix/make_commence.in: NRI : Merge from V1_2.
-
-2003-07-10 14:47 Nicolas Rejneri <nicolas.rejneri@opencascade.com>
-
- * configure.in.base: NRI : Merge from V1_2.
-
-2003-07-10 14:31 Nicolas Rejneri <nicolas.rejneri@opencascade.com>
-
- * src/Driver/Makefile.in: NRI : Merge from V1_2.
-
-2003-07-10 13:35 Yves Fricaud <yves.fricaud@opencascade.com>
-
- * src/: SMESH_I/Makefile.in, SMESH_I/SMESH_1D_Algo_i.cxx,
- SMESH_I/SMESH_1D_Algo_i.hxx, SMESH_I/SMESH_2D_Algo_i.cxx,
- SMESH_I/SMESH_2D_Algo_i.hxx, SMESH_I/SMESH_3D_Algo_i.cxx,
- SMESH_I/SMESH_3D_Algo_i.hxx, SMESH_I/SMESH_Algo_i.cxx,
- SMESH_I/SMESH_Algo_i.hxx, SMESH_I/SMESH_Gen_i.cxx,
- SMESH_I/SMESH_Gen_i.hxx, SMESH_I/SMESH_Hexa_3D_i.cxx,
- SMESH_I/SMESH_Hexa_3D_i.hxx,
- SMESH_I/SMESH_HypothesisFactory_i.cxx,
- SMESH_I/SMESH_HypothesisFactory_i.hxx,
- SMESH_I/SMESH_Hypothesis_i.cxx, SMESH_I/SMESH_Hypothesis_i.hxx,
- SMESH_I/SMESH_LocalLength_i.cxx, SMESH_I/SMESH_LocalLength_i.hxx,
- SMESH_I/SMESH_MEDFamily_i.cxx, SMESH_I/SMESH_MEDFamily_i.hxx,
- SMESH_I/SMESH_MEDMesh_i.cxx, SMESH_I/SMESH_MEDMesh_i.hxx,
- SMESH_I/SMESH_MEDSupport_i.cxx, SMESH_I/SMESH_MEDSupport_i.hxx,
- SMESH_I/SMESH_MEFISTO_2D_i.cxx, SMESH_I/SMESH_MEFISTO_2D_i.hxx,
- SMESH_I/SMESH_MaxElementArea_i.cxx,
- SMESH_I/SMESH_MaxElementArea_i.hxx,
- SMESH_I/SMESH_MaxElementVolume_i.cxx,
- SMESH_I/SMESH_MaxElementVolume_i.hxx,
- SMESH_I/SMESH_MeshEditor_i.cxx, SMESH_I/SMESH_MeshEditor_i.hxx,
- SMESH_I/SMESH_Mesh_i.cxx, SMESH_I/SMESH_Mesh_i.hxx,
- SMESH_I/SMESH_NumberOfSegments_i.cxx,
- SMESH_I/SMESH_NumberOfSegments_i.hxx,
- SMESH_I/SMESH_Quadrangle_2D_i.cxx,
- SMESH_I/SMESH_Quadrangle_2D_i.hxx,
- SMESH_I/SMESH_Regular_1D_i.cxx, SMESH_I/SMESH_Regular_1D_i.hxx,
- SMESH_I/SMESH_subMesh_i.cxx, SMESH_I/SMESH_subMesh_i.hxx,
- SMESH_I/SMESH_test.py, SMESH_I/SMESH_topo.cxx,
- SMESH_I/SMESH_topo.hxx, SMESH_I/smeshpy.py,
- SMESH_SWIG/Makefile.in, SMESH_SWIG/SMESH_fixation.py,
- SMESH_SWIG/SMESH_mechanic.py, SMESH_SWIG/SMESH_test0.py,
- SMESH_SWIG/SMESH_test1.py, SMESH_SWIG/SMESH_test2.py,
- SMESH_SWIG/SMESH_test3.py, SMESH_SWIG/batchmode_smesh.py,
- SMESH_SWIG/libSMESH_Swig.i: yfr : merge 1.2
-
-2003-07-10 13:18 Yves Fricaud <yves.fricaud@opencascade.com>
-
- * src/SMESHGUI/: SMESHGUI.h, SMESHGUI_AddAlgorithmDlg.cxx,
- SMESHGUI_AddAlgorithmDlg.h, SMESHGUI_AddEdgeDlg.cxx,
- SMESHGUI_AddEdgeDlg.h, SMESHGUI_AddFaceDlg.cxx,
- SMESHGUI_AddFaceDlg.h, SMESHGUI_AddHypothesisDlg.cxx,
- SMESHGUI_AddHypothesisDlg.h, SMESHGUI_AddSubMeshDlg.cxx,
- SMESHGUI_AddSubMeshDlg.h, SMESHGUI_AddVolumeDlg.cxx,
- SMESHGUI_AddVolumeDlg.h, SMESHGUI_ComputeScalarValue.cxx,
- SMESHGUI_ComputeScalarValue.h, SMESHGUI_DiagonalInversionDlg.cxx,
- SMESHGUI_DiagonalInversionDlg.h,
- SMESHGUI_EdgesConnectivityDlg.cxx,
- SMESHGUI_EdgesConnectivityDlg.h, SMESHGUI_EditHypothesesDlg.cxx,
- SMESHGUI_EditHypothesesDlg.h, SMESHGUI_EditScalarBarDlg.cxx,
- SMESHGUI_EditScalarBarDlg.h, SMESHGUI_InitMeshDlg.cxx,
- SMESHGUI_InitMeshDlg.h, SMESHGUI_LocalLengthDlg.cxx,
- SMESHGUI_LocalLengthDlg.h, SMESHGUI_MaxElementAreaDlg.cxx,
- SMESHGUI_MaxElementAreaDlg.h, SMESHGUI_MaxElementVolumeDlg.cxx,
- SMESHGUI_MaxElementVolumeDlg.h, SMESHGUI_MeshInfosDlg.cxx,
- SMESHGUI_MeshInfosDlg.h, SMESHGUI_MoveNodesDlg.cxx,
- SMESHGUI_MoveNodesDlg.h, SMESHGUI_NbSegmentsDlg.cxx,
- SMESHGUI_NbSegmentsDlg.h, SMESHGUI_NodesDlg.cxx,
- SMESHGUI_NodesDlg.h, SMESHGUI_OrientationElementsDlg.cxx,
- SMESHGUI_OrientationElementsDlg.h,
- SMESHGUI_Preferences_ColorDlg.cxx,
- SMESHGUI_Preferences_ColorDlg.h,
- SMESHGUI_Preferences_ScalarBarDlg.cxx,
- SMESHGUI_Preferences_ScalarBarDlg.h,
- SMESHGUI_RemoveElementsDlg.cxx, SMESHGUI_RemoveElementsDlg.h,
- SMESHGUI_RemoveNodesDlg.cxx, SMESHGUI_RemoveNodesDlg.h,
- SMESHGUI_SpinBox.cxx, SMESHGUI_SpinBox.h, SMESHGUI_StudyAPI.cxx,
- SMESHGUI_StudyAPI.h, SMESHGUI_Swig.cxx, SMESHGUI_Swig.hxx,
- SMESHGUI_Swig.i, SMESHGUI_TransparencyDlg.cxx,
- SMESHGUI_TransparencyDlg.h, SMESHGUI_aParameterDlg.cxx,
- SMESHGUI_aParameterDlg.h: yfr : merge 1.2
-
-2003-07-10 12:18 Yves Fricaud <yves.fricaud@opencascade.com>
-
- * src/SMESHGUI/: Makefile.in, SMESHGUI.cxx: yfr : Merge V1.2
-
-2003-07-10 11:35 Yves Fricaud <yves.fricaud@opencascade.com>
-
- * src/SMESHFiltersSelection/Makefile.in: yfr : Merge with v1.2
-
-2003-07-10 10:04 Yves Fricaud <yves.fricaud@opencascade.com>
-
- * src/: SMESHDS/Handle_SMESHDS_Command.hxx,
- SMESHDS/Handle_SMESHDS_DataMapNodeOfDataMapOfIntegerMesh.hxx,
- SMESHDS/Handle_SMESHDS_DataMapNodeOfDataMapOfIntegerPtrHypothesis.hxx,
- SMESHDS/Handle_SMESHDS_DataMapNodeOfDataMapOfIntegerSubMesh.hxx,
- SMESHDS/Handle_SMESHDS_DataMapNodeOfDataMapOfShapeListOfPtrHypothesis.hxx,
- SMESHDS/Handle_SMESHDS_DataMapNodeOfDataMapOfShapeSubMesh.hxx,
- SMESHDS/Handle_SMESHDS_Document.hxx,
- SMESHDS/Handle_SMESHDS_ListNodeOfListOfAsciiString.hxx,
- SMESHDS/Handle_SMESHDS_ListNodeOfListOfCommand.hxx,
- SMESHDS/Handle_SMESHDS_ListNodeOfListOfPtrHypothesis.hxx,
- SMESHDS/Handle_SMESHDS_Mesh.hxx,
- SMESHDS/Handle_SMESHDS_Script.hxx,
- SMESHDS/Handle_SMESHDS_SubMesh.hxx, SMESHDS/Makefile.in,
- SMESHDS/SMESHDS.cdl, SMESHDS/SMESHDS_Command.cdl,
- SMESHDS/SMESHDS_Command.cxx, SMESHDS/SMESHDS_Command.hxx,
- SMESHDS/SMESHDS_Command.ixx, SMESHDS/SMESHDS_Command.jxx,
- SMESHDS/SMESHDS_CommandType.hxx,
- SMESHDS/SMESHDS_DataMapIteratorOfDataMapOfIntegerMesh.hxx,
- SMESHDS/SMESHDS_DataMapIteratorOfDataMapOfIntegerMesh_0.cxx,
- SMESHDS/SMESHDS_DataMapIteratorOfDataMapOfIntegerPtrHypothesis.hxx,
- SMESHDS/SMESHDS_DataMapIteratorOfDataMapOfIntegerPtrHypothesis_0.cxx,
- SMESHDS/SMESHDS_DataMapIteratorOfDataMapOfIntegerSubMesh.hxx,
- SMESHDS/SMESHDS_DataMapIteratorOfDataMapOfIntegerSubMesh_0.cxx,
- SMESHDS/SMESHDS_DataMapIteratorOfDataMapOfShapeListOfPtrHypothesis.hxx,
- SMESHDS/SMESHDS_DataMapIteratorOfDataMapOfShapeListOfPtrHypothesis_0.cxx,
- SMESHDS/SMESHDS_DataMapIteratorOfDataMapOfShapeSubMesh.hxx,
- SMESHDS/SMESHDS_DataMapIteratorOfDataMapOfShapeSubMesh_0.cxx,
- SMESHDS/SMESHDS_DataMapNodeOfDataMapOfIntegerMesh.hxx,
- SMESHDS/SMESHDS_DataMapNodeOfDataMapOfIntegerMesh_0.cxx,
- SMESHDS/SMESHDS_DataMapNodeOfDataMapOfIntegerPtrHypothesis.hxx,
- SMESHDS/SMESHDS_DataMapNodeOfDataMapOfIntegerPtrHypothesis_0.cxx,
- SMESHDS/SMESHDS_DataMapNodeOfDataMapOfIntegerSubMesh.hxx,
- SMESHDS/SMESHDS_DataMapNodeOfDataMapOfIntegerSubMesh_0.cxx,
- SMESHDS/SMESHDS_DataMapNodeOfDataMapOfShapeListOfPtrHypothesis.hxx,
- SMESHDS/SMESHDS_DataMapNodeOfDataMapOfShapeListOfPtrHypothesis_0.cxx,
- SMESHDS/SMESHDS_DataMapNodeOfDataMapOfShapeSubMesh.hxx,
- SMESHDS/SMESHDS_DataMapNodeOfDataMapOfShapeSubMesh_0.cxx,
- SMESHDS/SMESHDS_DataMapOfIntegerMesh.hxx,
- SMESHDS/SMESHDS_DataMapOfIntegerMesh_0.cxx,
- SMESHDS/SMESHDS_DataMapOfIntegerPtrHypothesis.hxx,
- SMESHDS/SMESHDS_DataMapOfIntegerPtrHypothesis_0.cxx,
- SMESHDS/SMESHDS_DataMapOfIntegerSubMesh.hxx,
- SMESHDS/SMESHDS_DataMapOfIntegerSubMesh_0.cxx,
- SMESHDS/SMESHDS_DataMapOfShapeListOfPtrHypothesis.hxx,
- SMESHDS/SMESHDS_DataMapOfShapeListOfPtrHypothesis_0.cxx,
- SMESHDS/SMESHDS_DataMapOfShapeSubMesh.hxx,
- SMESHDS/SMESHDS_DataMapOfShapeSubMesh_0.cxx,
- SMESHDS/SMESHDS_Document.cdl, SMESHDS/SMESHDS_Document.cxx,
- SMESHDS/SMESHDS_Document.hxx, SMESHDS/SMESHDS_Document.ixx,
- SMESHDS/SMESHDS_Document.jxx, SMESHDS/SMESHDS_Hypothesis.cxx,
- SMESHDS/SMESHDS_Hypothesis.hxx,
- SMESHDS/SMESHDS_ListIteratorOfListOfAsciiString.hxx,
- SMESHDS/SMESHDS_ListIteratorOfListOfAsciiString_0.cxx,
- SMESHDS/SMESHDS_ListIteratorOfListOfCommand.hxx,
- SMESHDS/SMESHDS_ListIteratorOfListOfCommand_0.cxx,
- SMESHDS/SMESHDS_ListIteratorOfListOfPtrHypothesis.hxx,
- SMESHDS/SMESHDS_ListIteratorOfListOfPtrHypothesis_0.cxx,
- SMESHDS/SMESHDS_ListNodeOfListOfAsciiString.hxx,
- SMESHDS/SMESHDS_ListNodeOfListOfAsciiString_0.cxx,
- SMESHDS/SMESHDS_ListNodeOfListOfCommand.hxx,
- SMESHDS/SMESHDS_ListNodeOfListOfCommand_0.cxx,
- SMESHDS/SMESHDS_ListNodeOfListOfPtrHypothesis.hxx,
- SMESHDS/SMESHDS_ListNodeOfListOfPtrHypothesis_0.cxx,
- SMESHDS/SMESHDS_ListOfAsciiString.hxx,
- SMESHDS/SMESHDS_ListOfAsciiString_0.cxx,
- SMESHDS/SMESHDS_ListOfCommand.hxx,
- SMESHDS/SMESHDS_ListOfCommand_0.cxx,
- SMESHDS/SMESHDS_ListOfPtrHypothesis.hxx,
- SMESHDS/SMESHDS_ListOfPtrHypothesis_0.cxx,
- SMESHDS/SMESHDS_Mesh.cdl, SMESHDS/SMESHDS_Mesh.cxx,
- SMESHDS/SMESHDS_Mesh.hxx, SMESHDS/SMESHDS_Mesh.ixx,
- SMESHDS/SMESHDS_Mesh.jxx, SMESHDS/SMESHDS_PtrHypothesis.hxx,
- SMESHDS/SMESHDS_Script.cdl, SMESHDS/SMESHDS_Script.cxx,
- SMESHDS/SMESHDS_Script.hxx, SMESHDS/SMESHDS_Script.ixx,
- SMESHDS/SMESHDS_Script.jxx, SMESHDS/SMESHDS_SubMesh.cdl,
- SMESHDS/SMESHDS_SubMesh.cxx, SMESHDS/SMESHDS_SubMesh.hxx,
- SMESHDS/SMESHDS_SubMesh.ixx, SMESHDS/SMESHDS_SubMesh.jxx,
- SMESH/Makefile.in, SMESH/SMESH_1D_Algo.cxx,
- SMESH/SMESH_1D_Algo.hxx, SMESH/SMESH_2D_Algo.cxx,
- SMESH/SMESH_2D_Algo.hxx, SMESH/SMESH_3D_Algo.cxx,
- SMESH/SMESH_3D_Algo.hxx, SMESH/SMESH_Algo.cxx,
- SMESH/SMESH_Algo.hxx, SMESH/SMESH_Gen.cxx, SMESH/SMESH_Gen.hxx,
- SMESH/SMESH_Hexa_3D.cxx, SMESH/SMESH_Hexa_3D.hxx,
- SMESH/SMESH_Hypothesis.cxx, SMESH/SMESH_Hypothesis.hxx,
- SMESH/SMESH_HypothesisCreator.hxx,
- SMESH/SMESH_HypothesisFactory.cxx,
- SMESH/SMESH_HypothesisFactory.hxx,
- SMESH/SMESH_LengthFromEdges.cxx, SMESH/SMESH_LengthFromEdges.hxx,
- SMESH/SMESH_LocalLength.cxx, SMESH/SMESH_LocalLength.hxx,
- SMESH/SMESH_MEFISTO_2D.cxx, SMESH/SMESH_MEFISTO_2D.hxx,
- SMESH/SMESH_MaxElementArea.cxx, SMESH/SMESH_MaxElementArea.hxx,
- SMESH/SMESH_MaxElementVolume.cxx,
- SMESH/SMESH_MaxElementVolume.hxx, SMESH/SMESH_Mesh.cxx,
- SMESH/SMESH_Mesh.hxx, SMESH/SMESH_NumberOfSegments.cxx,
- SMESH/SMESH_NumberOfSegments.hxx, SMESH/SMESH_Quadrangle_2D.cxx,
- SMESH/SMESH_Quadrangle_2D.hxx, SMESH/SMESH_Regular_1D.cxx,
- SMESH/SMESH_Regular_1D.hxx, SMESH/SMESH_subMesh.cxx,
- SMESH/SMESH_subMesh.hxx: yfr : Merge with v1.2
-
-2003-07-10 09:49 Yves Fricaud <yves.fricaud@opencascade.com>
-
- * src/SMDS/: Handle_SMDSControl_BoundaryEdges.hxx,
- Handle_SMDSControl_BoundaryFaces.hxx,
- Handle_SMDSControl_MeshBoundary.hxx,
- Handle_SMDS_DataMapNodeOfDataMapOfIntegerMeshElement.hxx,
- Handle_SMDS_DataMapNodeOfDataMapOfPntInteger.hxx,
- Handle_SMDS_EdgePosition.hxx, Handle_SMDS_FacePosition.hxx,
- Handle_SMDS_HSequenceOfMesh.hxx,
- Handle_SMDS_ListNodeOfListOfMesh.hxx,
- Handle_SMDS_ListNodeOfListOfMeshElement.hxx,
- Handle_SMDS_ListNodeOfListOfMeshGroup.hxx, Handle_SMDS_Mesh.hxx,
- Handle_SMDS_MeshEdge.hxx, Handle_SMDS_MeshElement.hxx,
- Handle_SMDS_MeshElementIDFactory.hxx, Handle_SMDS_MeshFace.hxx,
- Handle_SMDS_MeshGroup.hxx, Handle_SMDS_MeshHexahedron.hxx,
- Handle_SMDS_MeshIDFactory.hxx, Handle_SMDS_MeshNode.hxx,
- Handle_SMDS_MeshNodeIDFactory.hxx, Handle_SMDS_MeshObject.hxx,
- Handle_SMDS_MeshPrism.hxx, Handle_SMDS_MeshPyramid.hxx,
- Handle_SMDS_MeshQuadrangle.hxx, Handle_SMDS_MeshTetrahedron.hxx,
- Handle_SMDS_MeshTriangle.hxx, Handle_SMDS_MeshVolume.hxx,
- Handle_SMDS_Position.hxx,
- Handle_SMDS_SequenceNodeOfSequenceOfMesh.hxx,
- Handle_SMDS_SpacePosition.hxx,
- Handle_SMDS_StdMapNodeOfExtendedMap.hxx,
- Handle_SMDS_StdMapNodeOfExtendedOrientedMap.hxx,
- Handle_SMDS_VertexPosition.hxx, Makefile.in, SMDS.cdl,
- SMDSAbs.cdl, SMDSAbs_ElementType.hxx, SMDSControl.cdl,
- SMDSControl.cxx, SMDSControl.hxx, SMDSControl.ixx,
- SMDSControl.jxx, SMDSControl_BoundaryEdges.cdl,
- SMDSControl_BoundaryEdges.cxx, SMDSControl_BoundaryEdges.hxx,
- SMDSControl_BoundaryEdges.ixx, SMDSControl_BoundaryEdges.jxx,
- SMDSControl_BoundaryFaces.cdl, SMDSControl_BoundaryFaces.cxx,
- SMDSControl_BoundaryFaces.hxx, SMDSControl_BoundaryFaces.ixx,
- SMDSControl_BoundaryFaces.jxx, SMDSControl_MeshBoundary.cdl,
- SMDSControl_MeshBoundary.cxx, SMDSControl_MeshBoundary.hxx,
- SMDSControl_MeshBoundary.ixx, SMDSControl_MeshBoundary.jxx,
- SMDSEdit.cdl, SMDSEdit_Transform.cdl, SMDSEdit_Transform.cxx,
- SMDSEdit_Transform.hxx, SMDSEdit_Transform.ixx,
- SMDSEdit_Transform.jxx, SMDS_BasicMap.lxx,
- SMDS_BasicMapIterator.lxx,
- SMDS_DataMapIteratorOfDataMapOfIntegerMeshElement.hxx,
- SMDS_DataMapIteratorOfDataMapOfIntegerMeshElement_0.cxx,
- SMDS_DataMapIteratorOfDataMapOfPntInteger.hxx,
- SMDS_DataMapIteratorOfDataMapOfPntInteger_0.cxx,
- SMDS_DataMapNodeOfDataMapOfIntegerMeshElement.hxx,
- SMDS_DataMapNodeOfDataMapOfIntegerMeshElement_0.cxx,
- SMDS_DataMapNodeOfDataMapOfPntInteger.hxx,
- SMDS_DataMapNodeOfDataMapOfPntInteger_0.cxx,
- SMDS_DataMapOfIntegerMeshElement.hxx,
- SMDS_DataMapOfIntegerMeshElement_0.cxx,
- SMDS_DataMapOfPntInteger.hxx, SMDS_DataMapOfPntInteger_0.cxx,
- SMDS_EdgePosition.cdl, SMDS_EdgePosition.cxx,
- SMDS_EdgePosition.hxx, SMDS_EdgePosition.ixx,
- SMDS_EdgePosition.jxx, SMDS_EdgePosition.lxx,
- SMDS_ExtendedMap.hxx, SMDS_ExtendedMap_0.cxx,
- SMDS_ExtendedOrientedMap.hxx, SMDS_ExtendedOrientedMap_0.cxx,
- SMDS_FacePosition.cdl, SMDS_FacePosition.cxx,
- SMDS_FacePosition.hxx, SMDS_FacePosition.ixx,
- SMDS_FacePosition.jxx, SMDS_FacePosition.lxx,
- SMDS_HSequenceOfMesh.hxx, SMDS_HSequenceOfMesh_0.cxx,
- SMDS_ListIteratorOfListOfMesh.hxx,
- SMDS_ListIteratorOfListOfMeshElement.hxx,
- SMDS_ListIteratorOfListOfMeshElement_0.cxx,
- SMDS_ListIteratorOfListOfMeshGroup.hxx,
- SMDS_ListIteratorOfListOfMeshGroup_0.cxx,
- SMDS_ListIteratorOfListOfMesh_0.cxx,
- SMDS_ListNodeOfListOfMesh.hxx,
- SMDS_ListNodeOfListOfMeshElement.hxx,
- SMDS_ListNodeOfListOfMeshElement_0.cxx,
- SMDS_ListNodeOfListOfMeshGroup.hxx,
- SMDS_ListNodeOfListOfMeshGroup_0.cxx,
- SMDS_ListNodeOfListOfMesh_0.cxx, SMDS_ListOfMesh.hxx,
- SMDS_ListOfMeshElement.hxx, SMDS_ListOfMeshElement_0.cxx,
- SMDS_ListOfMeshGroup.hxx, SMDS_ListOfMeshGroup_0.cxx,
- SMDS_ListOfMesh_0.cxx, SMDS_MapIteratorOfExtendedMap.hxx,
- SMDS_MapIteratorOfExtendedMap_0.cxx,
- SMDS_MapIteratorOfExtendedOrientedMap.hxx,
- SMDS_MapIteratorOfExtendedOrientedMap_0.cxx, SMDS_MapNode.lxx,
- SMDS_MapOfMeshElement.cdl, SMDS_MapOfMeshElement.cxx,
- SMDS_MapOfMeshElement.hxx, SMDS_MapOfMeshElement.ixx,
- SMDS_MapOfMeshElement.jxx, SMDS_MapOfMeshElement.lxx,
- SMDS_MapOfMeshOrientedElement.cdl,
- SMDS_MapOfMeshOrientedElement.cxx,
- SMDS_MapOfMeshOrientedElement.hxx,
- SMDS_MapOfMeshOrientedElement.ixx,
- SMDS_MapOfMeshOrientedElement.jxx,
- SMDS_MapOfMeshOrientedElement.lxx, SMDS_Mesh.cdl, SMDS_Mesh.cxx,
- SMDS_Mesh.hxx, SMDS_Mesh.ixx, SMDS_Mesh.jxx, SMDS_Mesh.lxx,
- SMDS_MeshEdge.cdl, SMDS_MeshEdge.cxx, SMDS_MeshEdge.hxx,
- SMDS_MeshEdge.ixx, SMDS_MeshEdge.jxx, SMDS_MeshEdge.lxx,
- SMDS_MeshEdgesIterator.cdl, SMDS_MeshEdgesIterator.cxx,
- SMDS_MeshEdgesIterator.hxx, SMDS_MeshEdgesIterator.ixx,
- SMDS_MeshEdgesIterator.jxx, SMDS_MeshElement.cdl,
- SMDS_MeshElement.cxx, SMDS_MeshElement.hxx, SMDS_MeshElement.ixx,
- SMDS_MeshElement.jxx, SMDS_MeshElement.lxx,
- SMDS_MeshElementIDFactory.cdl, SMDS_MeshElementIDFactory.cxx,
- SMDS_MeshElementIDFactory.hxx, SMDS_MeshElementIDFactory.ixx,
- SMDS_MeshElementIDFactory.jxx, SMDS_MeshElementIDFactory.lxx,
- SMDS_MeshElementMapHasher.cdl, SMDS_MeshElementMapHasher.cxx,
- SMDS_MeshElementMapHasher.hxx, SMDS_MeshElementMapHasher.ixx,
- SMDS_MeshElementMapHasher.jxx, SMDS_MeshElementMapHasher.lxx,
- SMDS_MeshElementsIterator.cdl, SMDS_MeshElementsIterator.cxx,
- SMDS_MeshElementsIterator.hxx, SMDS_MeshElementsIterator.ixx,
- SMDS_MeshElementsIterator.jxx, SMDS_MeshElementsIterator.lxx,
- SMDS_MeshFace.cdl, SMDS_MeshFace.cxx, SMDS_MeshFace.hxx,
- SMDS_MeshFace.ixx, SMDS_MeshFace.jxx, SMDS_MeshFace.lxx,
- SMDS_MeshFacesIterator.cdl, SMDS_MeshFacesIterator.cxx,
- SMDS_MeshFacesIterator.hxx, SMDS_MeshFacesIterator.ixx,
- SMDS_MeshFacesIterator.jxx, SMDS_MeshGroup.cdl,
- SMDS_MeshGroup.cxx, SMDS_MeshGroup.hxx, SMDS_MeshGroup.ixx,
- SMDS_MeshGroup.jxx, SMDS_MeshGroup.lxx, SMDS_MeshHexahedron.cdl,
- SMDS_MeshHexahedron.cxx, SMDS_MeshHexahedron.hxx,
- SMDS_MeshHexahedron.ixx, SMDS_MeshHexahedron.jxx,
- SMDS_MeshHexahedron.lxx, SMDS_MeshIDFactory.cdl,
- SMDS_MeshIDFactory.cxx, SMDS_MeshIDFactory.hxx,
- SMDS_MeshIDFactory.ixx, SMDS_MeshIDFactory.jxx,
- SMDS_MeshIDFactory.lxx, SMDS_MeshNode.cdl, SMDS_MeshNode.cxx,
- SMDS_MeshNode.hxx, SMDS_MeshNode.ixx, SMDS_MeshNode.jxx,
- SMDS_MeshNode.lxx, SMDS_MeshNodeIDFactory.cdl,
- SMDS_MeshNodeIDFactory.cxx, SMDS_MeshNodeIDFactory.hxx,
- SMDS_MeshNodeIDFactory.ixx, SMDS_MeshNodeIDFactory.jxx,
- SMDS_MeshNodeIDFactory.lxx, SMDS_MeshNodesIterator.cdl,
- SMDS_MeshNodesIterator.cxx, SMDS_MeshNodesIterator.hxx,
- SMDS_MeshNodesIterator.ixx, SMDS_MeshNodesIterator.jxx,
- SMDS_MeshObject.cdl, SMDS_MeshObject.cxx, SMDS_MeshObject.hxx,
- SMDS_MeshObject.ixx, SMDS_MeshObject.jxx,
- SMDS_MeshOrientedElementMapHasher.cdl,
- SMDS_MeshOrientedElementMapHasher.cxx,
- SMDS_MeshOrientedElementMapHasher.hxx,
- SMDS_MeshOrientedElementMapHasher.ixx,
- SMDS_MeshOrientedElementMapHasher.jxx,
- SMDS_MeshOrientedElementMapHasher.lxx, SMDS_MeshPrism.cdl,
- SMDS_MeshPrism.cxx, SMDS_MeshPrism.hxx, SMDS_MeshPrism.ixx,
- SMDS_MeshPrism.jxx, SMDS_MeshPrism.lxx, SMDS_MeshPyramid.cdl,
- SMDS_MeshPyramid.cxx, SMDS_MeshPyramid.hxx, SMDS_MeshPyramid.ixx,
- SMDS_MeshPyramid.jxx, SMDS_MeshPyramid.lxx,
- SMDS_MeshQuadrangle.cdl, SMDS_MeshQuadrangle.cxx,
- SMDS_MeshQuadrangle.hxx, SMDS_MeshQuadrangle.ixx,
- SMDS_MeshQuadrangle.jxx, SMDS_MeshQuadrangle.lxx,
- SMDS_MeshTetrahedron.cdl, SMDS_MeshTetrahedron.cxx,
- SMDS_MeshTetrahedron.hxx, SMDS_MeshTetrahedron.ixx,
- SMDS_MeshTetrahedron.jxx, SMDS_MeshTetrahedron.lxx,
- SMDS_MeshTriangle.cdl, SMDS_MeshTriangle.cxx,
- SMDS_MeshTriangle.hxx, SMDS_MeshTriangle.ixx,
- SMDS_MeshTriangle.jxx, SMDS_MeshTriangle.lxx,
- SMDS_MeshVolume.cdl, SMDS_MeshVolume.cxx, SMDS_MeshVolume.hxx,
- SMDS_MeshVolume.ixx, SMDS_MeshVolume.jxx, SMDS_MeshVolume.lxx,
- SMDS_MeshVolumesIterator.cdl, SMDS_MeshVolumesIterator.cxx,
- SMDS_MeshVolumesIterator.hxx, SMDS_MeshVolumesIterator.ixx,
- SMDS_MeshVolumesIterator.jxx, SMDS_PntHasher.cdl,
- SMDS_PntHasher.cxx, SMDS_PntHasher.hxx, SMDS_PntHasher.ixx,
- SMDS_PntHasher.jxx, SMDS_PntHasher.lxx, SMDS_Position.cdl,
- SMDS_Position.cxx, SMDS_Position.hxx, SMDS_Position.ixx,
- SMDS_Position.jxx, SMDS_Position.lxx,
- SMDS_SequenceNodeOfSequenceOfMesh.hxx,
- SMDS_SequenceNodeOfSequenceOfMesh_0.cxx, SMDS_SequenceOfMesh.hxx,
- SMDS_SequenceOfMesh_0.cxx, SMDS_SpacePosition.cdl,
- SMDS_SpacePosition.cxx, SMDS_SpacePosition.hxx,
- SMDS_SpacePosition.ixx, SMDS_SpacePosition.jxx,
- SMDS_SpacePosition.lxx, SMDS_StdMapNode.lxx,
- SMDS_StdMapNodeOfExtendedMap.hxx,
- SMDS_StdMapNodeOfExtendedMap_0.cxx,
- SMDS_StdMapNodeOfExtendedOrientedMap.hxx,
- SMDS_StdMapNodeOfExtendedOrientedMap_0.cxx,
- SMDS_TypeOfPosition.hxx, SMDS_VertexPosition.cdl,
- SMDS_VertexPosition.cxx, SMDS_VertexPosition.hxx,
- SMDS_VertexPosition.ixx, SMDS_VertexPosition.jxx: yfr : Merge
- with v1.2
-
-2003-07-10 09:32 Yves Fricaud <yves.fricaud@opencascade.com>
-
- * src/: DriverDAT/Makefile.in, DriverUNV/Makefile.in,
- MEFISTO2/Makefile.in, OBJECT/Makefile.in, OBJECT/SMESH_Actor.cxx,
- OBJECT/SMESH_Actor.h, OBJECT/SMESH_Grid.cxx, OBJECT/SMESH_Grid.h:
- yfr : Merge with v1.2
-
-2003-07-10 09:14 Yves Fricaud <yves.fricaud@opencascade.com>
-
- * src/Makefile.in: yfr : Merge with v1.2
-
-2003-07-10 09:00 Yves Fricaud <yves.fricaud@opencascade.com>
-
- * src/: Driver/Document_Reader.cxx, Driver/Document_Reader.h,
- Driver/Document_Writer.cxx, Driver/Document_Writer.h,
- Driver/Driver_dl.cxx, Driver/Makefile.in, Driver/Mesh_Reader.cxx,
- Driver/Mesh_Reader.h, Driver/Mesh_Writer.cxx,
- Driver/Mesh_Writer.h, Driver/SMESHDriver.cxx,
- Driver/SMESHDriver.h, DriverDAT/DriverDAT_R_SMDS_Mesh.cxx,
- DriverDAT/DriverDAT_R_SMDS_Mesh.h,
- DriverDAT/DriverDAT_R_SMESHDS_Document.cxx,
- DriverDAT/DriverDAT_R_SMESHDS_Document.h,
- DriverDAT/DriverDAT_R_SMESHDS_Mesh.cxx,
- DriverDAT/DriverDAT_R_SMESHDS_Mesh.h,
- DriverDAT/DriverDAT_W_SMDS_Mesh.cxx,
- DriverDAT/DriverDAT_W_SMDS_Mesh.h,
- DriverDAT/DriverDAT_W_SMESHDS_Document.cxx,
- DriverDAT/DriverDAT_W_SMESHDS_Document.h,
- DriverDAT/DriverDAT_W_SMESHDS_Mesh.cxx,
- DriverDAT/DriverDAT_W_SMESHDS_Mesh.h, DriverDAT/Makefile.in,
- DriverMED/DriverMED_R_SMDS_Mesh.cxx,
- DriverMED/DriverMED_R_SMESHDS_Document.cxx,
- DriverMED/DriverMED_R_SMESHDS_Mesh.cxx,
- DriverMED/DriverMED_W_SMDS_Mesh.cxx,
- DriverMED/DriverMED_W_SMESHDS_Document.cxx,
- DriverMED/DriverMED_W_SMESHDS_Mesh.cxx, DriverMED/Makefile.in,
- MEFISTO2/Makefile.in, MEFISTO2/Rn.h, MEFISTO2/aptrte.cxx,
- MEFISTO2/aptrte.h: yfr : Merge with v1.2
-
-2003-07-10 08:12 Yves Fricaud <yves.fricaud@opencascade.com>
-
- * src/SMESHGUI/SMESHGUI_icons.po: Initial revision
-
-2003-07-10 08:09 tag V1_2
-
-2003-07-10 08:09 Yves Fricaud <yves.fricaud@opencascade.com>
-
- * src/: DriverMED/DriverMED_R_SMESHDS_Document.h,
- DriverMED/DriverMED_W_SMESHDS_Document.h,
- SMESHGUI/SMESHGUI_msg_en.po: sources v1.2
-
-2003-06-29 13:17 Paul Rascle <paul.rascle@edf.fr>
-
- * src/SMESH_SWIG/: Makefile.in, SMESH_shared_modules.py: PR: needed
- by merge C. CAREMOLI branch CCAR_br1
-
-2003-06-12 10:37 Paul Rascle <paul.rascle@edf.fr>
-
- * Makefile.in: PR: avoids unnecessary compilation after
- regeneration of SALOMEconfig.h, with gcc3.2
-
-2003-06-12 10:34 Paul Rascle <paul.rascle@edf.fr>
-
- * src/SMESH_SWIG/SMESH_fixation.py: PR: bug on subshapes not sorted
-
-2003-05-28 16:42 Nicolas Rejneri <nicolas.rejneri@opencascade.com>
-
- * adm_local/unix/make_commence.in: NRI : Add path fro GEOM and MED
- idls.
-
-2003-05-28 16:26 Nicolas Rejneri <nicolas.rejneri@opencascade.com>
-
- * idl/Makefile.in, adm_local/unix/make_commence.in,
- adm_local/unix/make_omniorb.in, build_configure,
- configure.in.base: NRI : Update IDL Dependancies.
-
-2003-05-28 07:20 Nicolas Rejneri <nicolas.rejneri@opencascade.com>
-
- * bin/VERSION, Makefile.in: NRI : Add MODULE version info.
-
-2003-05-28 07:16 Nicolas Rejneri <nicolas.rejneri@opencascade.com>
-
- * configure.in.base, adm_local/unix/config_files/check_Med.m4: NRI
- : Add Check of MED.
-
-2003-05-26 14:21 Nicolas Rejneri <nicolas.rejneri@opencascade.com>
-
- * adm_local/unix/config_files/check_Geom.m4, configure.in.base: NRI
- : Add GEOM check local.
-
-2003-05-26 14:00 Nicolas Rejneri <nicolas.rejneri@opencascade.com>
-
- * build_configure: NRI : updated aclocal.
-
-2003-05-23 11:40 tag Start-v1_1a
-
-2003-05-23 11:40 Nicolas Rejneri <nicolas.rejneri@opencascade.com>
-
- * src/SMESHGUI/: SMESHGUI_AddAlgorithmDlg.cxx,
- SMESHGUI_AddEdgeDlg.cxx, SMESHGUI_AddFaceDlg.cxx,
- SMESHGUI_AddHypothesisDlg.cxx, SMESHGUI_AddSubMeshDlg.cxx,
- SMESHGUI_AddVolumeDlg.cxx, SMESHGUI_DiagonalInversionDlg.cxx,
- SMESHGUI_EdgesConnectivityDlg.cxx,
- SMESHGUI_EditHypothesesDlg.cxx, SMESHGUI_InitMeshDlg.cxx,
- SMESHGUI_LocalLengthDlg.cxx, SMESHGUI_MaxElementAreaDlg.cxx,
- SMESHGUI_MaxElementVolumeDlg.cxx, SMESHGUI_MoveNodesDlg.cxx,
- SMESHGUI_NbSegmentsDlg.cxx, SMESHGUI_NodesDlg.cxx,
- SMESHGUI_OrientationElementsDlg.cxx,
- SMESHGUI_RemoveElementsDlg.cxx, SMESHGUI_RemoveNodesDlg.cxx: NRI
- : loadPixmap( "SMESH", ...) instead of "SMESHGUI".
-
-2003-05-22 09:52 Nicolas Rejneri <nicolas.rejneri@opencascade.com>
-
- * doc/: Makefile.in, html/Makefile.in, html/INPUT/doxyfile,
- html/INPUT/sources/Application-About.png,
- html/INPUT/sources/Application-About1.jpg,
- html/INPUT/sources/application.gif,
- html/INPUT/sources/application.jpg,
- html/INPUT/sources/bg_salomepro.gif,
- html/INPUT/sources/doxygen.css, html/INPUT/sources/logocorp.gif,
- html/INPUT/sources/myheader.html, html/INPUT/sources/occ.gif,
- html/INPUT/HTML/SMESH_BasicHypothesis.html,
- html/INPUT/HTML/SMESH_Gen.html,
- html/INPUT/HTML/SMESH_Hypothesis.html,
- html/INPUT/HTML/SMESH_Mesh.html: NRI : Add documentation.
-
-2003-05-22 09:51 Nicolas Rejneri <nicolas.rejneri@opencascade.com>
-
- * configure.in.base: NRI : Add check HTML generators.
-
-2003-05-20 07:17 Nicolas Rejneri <nicolas.rejneri@opencascade.com>
-
- * src/: SMESH_I/SMESH_Gen_i.cxx, SMESH_I/SMESH_test.py,
- SMESH_I/smeshpy.py, SMESH_SWIG/SMESH_fixation.py,
- SMESH_SWIG/SMESH_mechanic.py, SMESH_SWIG/SMESH_test0.py,
- SMESH_SWIG/SMESH_test1.py, SMESH_SWIG/SMESH_test3.py,
- SMESHGUI/SMESHGUI.cxx: NRI : Use GEOM instead of Geometry.
-
-2003-05-20 07:16 Nicolas Rejneri <nicolas.rejneri@opencascade.com>
-
- * resources/SMESHCatalog.xml: NRI : Add component-username tag.
-
-2003-05-20 07:15 Nicolas Rejneri <nicolas.rejneri@opencascade.com>
-
- * Makefile.in: NRI : Add SMESHCatalog.xml
-
-2003-05-19 14:50 Nicolas Rejneri <nicolas.rejneri@opencascade.com>
-
- * src/SMESHGUI/SMESHGUI_StudyAPI.cxx: NRI : Add QAD_Desktop.h.
-
-2003-05-19 14:49 Nicolas Rejneri <nicolas.rejneri@opencascade.com>
-
- * src/SMESHGUI/Makefile.in: NRI : Add GEOM includes and libs.
-
-2003-05-19 14:38 Nicolas Rejneri <nicolas.rejneri@opencascade.com>
-
- * src/SMESHFiltersSelection/Makefile.in: NRI : Add KERNEL includes.
-
-2003-05-19 14:34 Nicolas Rejneri <nicolas.rejneri@opencascade.com>
-
- * src/SMESH_I/Makefile.in: NRI : Change lGeometryClient by
- lGEOMClient.
-
-2003-05-19 14:32 Nicolas Rejneri <nicolas.rejneri@opencascade.com>
-
- * src/SMESH_I/Makefile.in: NRI : Add GEOM includes and libs.
-
-2003-05-19 14:11 Nicolas Rejneri <nicolas.rejneri@opencascade.com>
-
- * src/: SMESH/Makefile.in, SMESHDS/Makefile.in: NRI : Add KERNEL
- includes and libs.
-
-2003-05-19 14:09 Nicolas Rejneri <nicolas.rejneri@opencascade.com>
-
- * src/: DriverDAT/Makefile.in, DriverMED/Makefile.in,
- DriverUNV/Makefile.in: NRI : Add KERNEL includes.
-
-2003-05-19 14:08 Nicolas Rejneri <nicolas.rejneri@opencascade.com>
-
- * idl/Makefile.in: NRI : Add MED.idl
-
-2003-05-19 14:01 Nicolas Rejneri <nicolas.rejneri@opencascade.com>
-
- * src/: SMESH_SWIG/Makefile.in, SMESH_SWIG/SMESH_fixation.py,
- SMESH_SWIG/SMESH_mechanic.py, SMESH_SWIG/SMESH_test0.py,
- SMESH_SWIG/SMESH_test1.py, SMESH_SWIG/SMESH_test2.py,
- SMESH_SWIG/SMESH_test3.py, SMESH_SWIG/batchmode_smesh.py,
- SMESH_SWIG/libSMESH_Swig.i, Makefile.in,
- SMESHFiltersSelection/Handle_SMESH_TypeFilter.hxx,
- SMESHFiltersSelection/Makefile.in,
- SMESHFiltersSelection/SMESH_Type.h,
- SMESHFiltersSelection/SMESH_TypeFilter.cxx,
- SMESHFiltersSelection/SMESH_TypeFilter.hxx,
- SMESHFiltersSelection/SMESH_TypeFilter.ixx,
- SMESHFiltersSelection/SMESH_TypeFilter.jxx, MEFISTO2/Makefile.in,
- MEFISTO2/Rn.h, MEFISTO2/aptrte.cxx, MEFISTO2/aptrte.h,
- MEFISTO2/areteideale.f, MEFISTO2/trte.f, OBJECT/Makefile.in,
- OBJECT/SMESH_Actor.cxx, OBJECT/SMESH_Actor.h,
- OBJECT/SMESH_Grid.cxx, OBJECT/SMESH_Grid.h,
- Driver/Document_Reader.cxx, Driver/Document_Reader.h,
- Driver/Document_Writer.cxx, Driver/Document_Writer.h,
- Driver/Driver_dl.cxx, Driver/Makefile.in, Driver/Mesh_Reader.cxx,
- Driver/Mesh_Reader.h, Driver/Mesh_Writer.cxx,
- Driver/Mesh_Writer.h, Driver/SMESHDriver.cxx,
- Driver/SMESHDriver.h: NRI : First integration.
-
-2003-05-19 13:48 Nicolas Rejneri <nicolas.rejneri@opencascade.com>
-
- * src/: SMDS/Handle_SMDSControl_BoundaryEdges.hxx,
- SMDS/Handle_SMDSControl_BoundaryFaces.hxx,
- SMDS/Handle_SMDSControl_MeshBoundary.hxx,
- SMDS/Handle_SMDS_DataMapNodeOfDataMapOfIntegerMeshElement.hxx,
- SMDS/Handle_SMDS_DataMapNodeOfDataMapOfPntInteger.hxx,
- SMDS/Handle_SMDS_EdgePosition.hxx,
- SMDS/Handle_SMDS_FacePosition.hxx,
- SMDS/Handle_SMDS_HSequenceOfMesh.hxx,
- SMDS/Handle_SMDS_ListNodeOfListOfMesh.hxx,
- SMDS/Handle_SMDS_ListNodeOfListOfMeshElement.hxx,
- SMDS/Handle_SMDS_ListNodeOfListOfMeshGroup.hxx,
- SMDS/Handle_SMDS_Mesh.hxx, SMDS/Handle_SMDS_MeshEdge.hxx,
- SMDS/Handle_SMDS_MeshElement.hxx,
- SMDS/Handle_SMDS_MeshElementIDFactory.hxx,
- SMDS/Handle_SMDS_MeshFace.hxx, SMDS/Handle_SMDS_MeshGroup.hxx,
- SMDS/Handle_SMDS_MeshHexahedron.hxx,
- SMDS/Handle_SMDS_MeshIDFactory.hxx,
- SMDS/Handle_SMDS_MeshNode.hxx,
- SMDS/Handle_SMDS_MeshNodeIDFactory.hxx,
- SMDS/Handle_SMDS_MeshObject.hxx, SMDS/Handle_SMDS_MeshPrism.hxx,
- SMDS/Handle_SMDS_MeshPyramid.hxx,
- SMDS/Handle_SMDS_MeshQuadrangle.hxx,
- SMDS/Handle_SMDS_MeshTetrahedron.hxx,
- SMDS/Handle_SMDS_MeshTriangle.hxx,
- SMDS/Handle_SMDS_MeshVolume.hxx, SMDS/Handle_SMDS_Position.hxx,
- SMDS/Handle_SMDS_SequenceNodeOfSequenceOfMesh.hxx,
- SMDS/Handle_SMDS_SpacePosition.hxx,
- SMDS/Handle_SMDS_StdMapNodeOfExtendedMap.hxx,
- SMDS/Handle_SMDS_StdMapNodeOfExtendedOrientedMap.hxx,
- SMDS/Handle_SMDS_VertexPosition.hxx, SMDS/Makefile.in,
- SMDS/SMDS.cdl, SMDS/SMDSAbs.cdl, SMDS/SMDSAbs_ElementType.hxx,
- SMDS/SMDSControl.cdl, SMDS/SMDSControl.cxx, SMDS/SMDSControl.hxx,
- SMDS/SMDSControl.ixx, SMDS/SMDSControl.jxx,
- SMDS/SMDSControl_BoundaryEdges.cdl,
- SMDS/SMDSControl_BoundaryEdges.cxx,
- SMDS/SMDSControl_BoundaryEdges.hxx,
- SMDS/SMDSControl_BoundaryEdges.ixx,
- SMDS/SMDSControl_BoundaryEdges.jxx,
- SMDS/SMDSControl_BoundaryFaces.cdl,
- SMDS/SMDSControl_BoundaryFaces.cxx,
- SMDS/SMDSControl_BoundaryFaces.hxx,
- SMDS/SMDSControl_BoundaryFaces.ixx,
- SMDS/SMDSControl_BoundaryFaces.jxx,
- SMDS/SMDSControl_MeshBoundary.cdl,
- SMDS/SMDSControl_MeshBoundary.cxx,
- SMDS/SMDSControl_MeshBoundary.hxx,
- SMDS/SMDSControl_MeshBoundary.ixx,
- SMDS/SMDSControl_MeshBoundary.jxx, SMDS/SMDSEdit.cdl,
- SMDS/SMDSEdit_Transform.cdl, SMDS/SMDSEdit_Transform.cxx,
- SMDS/SMDSEdit_Transform.hxx, SMDS/SMDSEdit_Transform.ixx,
- SMDS/SMDSEdit_Transform.jxx, SMDS/SMDS_BasicMap.lxx,
- SMDS/SMDS_BasicMapIterator.lxx,
- SMDS/SMDS_DataMapIteratorOfDataMapOfIntegerMeshElement.hxx,
- SMDS/SMDS_DataMapIteratorOfDataMapOfIntegerMeshElement_0.cxx,
- SMDS/SMDS_DataMapIteratorOfDataMapOfPntInteger.hxx,
- SMDS/SMDS_DataMapIteratorOfDataMapOfPntInteger_0.cxx,
- SMDS/SMDS_DataMapNodeOfDataMapOfIntegerMeshElement.hxx,
- SMDS/SMDS_DataMapNodeOfDataMapOfIntegerMeshElement_0.cxx,
- SMDS/SMDS_DataMapNodeOfDataMapOfPntInteger.hxx,
- SMDS/SMDS_DataMapNodeOfDataMapOfPntInteger_0.cxx,
- SMDS/SMDS_DataMapOfIntegerMeshElement.hxx,
- SMDS/SMDS_DataMapOfIntegerMeshElement_0.cxx,
- SMDS/SMDS_DataMapOfPntInteger.hxx,
- SMDS/SMDS_DataMapOfPntInteger_0.cxx, SMDS/SMDS_EdgePosition.cdl,
- SMDS/SMDS_EdgePosition.cxx, SMDS/SMDS_EdgePosition.hxx,
- SMDS/SMDS_EdgePosition.ixx, SMDS/SMDS_EdgePosition.jxx,
- SMDS/SMDS_EdgePosition.lxx, SMDS/SMDS_ExtendedMap.hxx,
- SMDS/SMDS_ExtendedMap_0.cxx, SMDS/SMDS_ExtendedOrientedMap.hxx,
- SMDS/SMDS_ExtendedOrientedMap_0.cxx, SMDS/SMDS_FacePosition.cdl,
- SMDS/SMDS_FacePosition.cxx, SMDS/SMDS_FacePosition.hxx,
- SMDS/SMDS_FacePosition.ixx, SMDS/SMDS_FacePosition.jxx,
- SMDS/SMDS_FacePosition.lxx, SMDS/SMDS_HSequenceOfMesh.hxx,
- SMDS/SMDS_HSequenceOfMesh_0.cxx,
- SMDS/SMDS_ListIteratorOfListOfMesh.hxx,
- SMDS/SMDS_ListIteratorOfListOfMeshElement.hxx,
- SMDS/SMDS_ListIteratorOfListOfMeshElement_0.cxx,
- SMDS/SMDS_ListIteratorOfListOfMeshGroup.hxx,
- SMDS/SMDS_ListIteratorOfListOfMeshGroup_0.cxx,
- SMDS/SMDS_ListIteratorOfListOfMesh_0.cxx,
- SMDS/SMDS_ListNodeOfListOfMesh.hxx,
- SMDS/SMDS_ListNodeOfListOfMeshElement.hxx,
- SMDS/SMDS_ListNodeOfListOfMeshElement_0.cxx,
- SMDS/SMDS_ListNodeOfListOfMeshGroup.hxx,
- SMDS/SMDS_ListNodeOfListOfMeshGroup_0.cxx,
- SMDS/SMDS_ListNodeOfListOfMesh_0.cxx, SMDS/SMDS_ListOfMesh.hxx,
- SMDS/SMDS_ListOfMeshElement.hxx,
- SMDS/SMDS_ListOfMeshElement_0.cxx, SMDS/SMDS_ListOfMeshGroup.hxx,
- SMDS/SMDS_ListOfMeshGroup_0.cxx, SMDS/SMDS_ListOfMesh_0.cxx,
- SMDS/SMDS_Map.gxx, SMDS/SMDS_MapHasher.gxx,
- SMDS/SMDS_MapIterator.gxx,
- SMDS/SMDS_MapIteratorOfExtendedMap.hxx,
- SMDS/SMDS_MapIteratorOfExtendedMap_0.cxx,
- SMDS/SMDS_MapIteratorOfExtendedOrientedMap.hxx,
- SMDS/SMDS_MapIteratorOfExtendedOrientedMap_0.cxx,
- SMDS/SMDS_MapNode.lxx, SMDS/SMDS_MapOfMeshElement.cdl,
- SMDS/SMDS_MapOfMeshElement.cxx, SMDS/SMDS_MapOfMeshElement.hxx,
- SMDS/SMDS_MapOfMeshElement.ixx, SMDS/SMDS_MapOfMeshElement.jxx,
- SMDS/SMDS_MapOfMeshElement.lxx,
- SMDS/SMDS_MapOfMeshOrientedElement.cdl,
- SMDS/SMDS_MapOfMeshOrientedElement.cxx,
- SMDS/SMDS_MapOfMeshOrientedElement.hxx,
- SMDS/SMDS_MapOfMeshOrientedElement.ixx,
- SMDS/SMDS_MapOfMeshOrientedElement.jxx,
- SMDS/SMDS_MapOfMeshOrientedElement.lxx, SMDS/SMDS_Mesh.cdl,
- SMDS/SMDS_Mesh.cxx, SMDS/SMDS_Mesh.hxx, SMDS/SMDS_Mesh.ixx,
- SMDS/SMDS_Mesh.jxx, SMDS/SMDS_Mesh.lxx, SMDS/SMDS_MeshEdge.cdl,
- SMDS/SMDS_MeshEdge.cxx, SMDS/SMDS_MeshEdge.hxx,
- SMDS/SMDS_MeshEdge.ixx, SMDS/SMDS_MeshEdge.jxx,
- SMDS/SMDS_MeshEdge.lxx, SMDS/SMDS_MeshEdgesIterator.cdl,
- SMDS/SMDS_MeshEdgesIterator.cxx, SMDS/SMDS_MeshEdgesIterator.hxx,
- SMDS/SMDS_MeshEdgesIterator.ixx, SMDS/SMDS_MeshEdgesIterator.jxx,
- SMDS/SMDS_MeshElement.cdl, SMDS/SMDS_MeshElement.cxx,
- SMDS/SMDS_MeshElement.hxx, SMDS/SMDS_MeshElement.ixx,
- SMDS/SMDS_MeshElement.jxx, SMDS/SMDS_MeshElement.lxx,
- SMDS/SMDS_MeshElementIDFactory.cdl,
- SMDS/SMDS_MeshElementIDFactory.cxx,
- SMDS/SMDS_MeshElementIDFactory.hxx,
- SMDS/SMDS_MeshElementIDFactory.ixx,
- SMDS/SMDS_MeshElementIDFactory.jxx,
- SMDS/SMDS_MeshElementIDFactory.lxx,
- SMDS/SMDS_MeshElementMapHasher.cdl,
- SMDS/SMDS_MeshElementMapHasher.cxx,
- SMDS/SMDS_MeshElementMapHasher.hxx,
- SMDS/SMDS_MeshElementMapHasher.ixx,
- SMDS/SMDS_MeshElementMapHasher.jxx,
- SMDS/SMDS_MeshElementMapHasher.lxx,
- SMDS/SMDS_MeshElementsIterator.cdl,
- SMDS/SMDS_MeshElementsIterator.cxx,
- SMDS/SMDS_MeshElementsIterator.hxx,
- SMDS/SMDS_MeshElementsIterator.ixx,
- SMDS/SMDS_MeshElementsIterator.jxx,
- SMDS/SMDS_MeshElementsIterator.lxx, SMDS/SMDS_MeshFace.cdl,
- SMDS/SMDS_MeshFace.cxx, SMDS/SMDS_MeshFace.hxx,
- SMDS/SMDS_MeshFace.ixx, SMDS/SMDS_MeshFace.jxx,
- SMDS/SMDS_MeshFace.lxx, SMDS/SMDS_MeshFacesIterator.cdl,
- SMDS/SMDS_MeshFacesIterator.cxx, SMDS/SMDS_MeshFacesIterator.hxx,
- SMDS/SMDS_MeshFacesIterator.ixx, SMDS/SMDS_MeshFacesIterator.jxx,
- SMDS/SMDS_MeshGroup.cdl, SMDS/SMDS_MeshGroup.cxx,
- SMDS/SMDS_MeshGroup.hxx, SMDS/SMDS_MeshGroup.ixx,
- SMDS/SMDS_MeshGroup.jxx, SMDS/SMDS_MeshGroup.lxx,
- SMDS/SMDS_MeshHexahedron.cdl, SMDS/SMDS_MeshHexahedron.cxx,
- SMDS/SMDS_MeshHexahedron.hxx, SMDS/SMDS_MeshHexahedron.ixx,
- SMDS/SMDS_MeshHexahedron.jxx, SMDS/SMDS_MeshHexahedron.lxx,
- SMDS/SMDS_MeshIDFactory.cdl, SMDS/SMDS_MeshIDFactory.cxx,
- SMDS/SMDS_MeshIDFactory.ixx, SMDS/SMDS_MeshIDFactory.jxx,
- SMDS/SMDS_MeshIDFactory.lxx, SMDS/SMDS_MeshNode.cdl,
- SMDS/SMDS_MeshNode.cxx, SMDS/SMDS_MeshNode.hxx,
- SMDS/SMDS_MeshNode.ixx, SMDS/SMDS_MeshNode.jxx,
- SMDS/SMDS_MeshNode.lxx, SMDS/SMDS_MeshNodeIDFactory.cdl,
- SMDS/SMDS_MeshNodeIDFactory.cxx, SMDS/SMDS_MeshNodeIDFactory.hxx,
- SMDS/SMDS_MeshNodeIDFactory.ixx, SMDS/SMDS_MeshNodeIDFactory.jxx,
- SMDS/SMDS_MeshNodeIDFactory.lxx, SMDS/SMDS_MeshNodesIterator.cdl,
- SMDS/SMDS_MeshNodesIterator.cxx, SMDS/SMDS_MeshNodesIterator.hxx,
- SMDS/SMDS_MeshNodesIterator.ixx, SMDS/SMDS_MeshNodesIterator.jxx,
- SMDS/SMDS_MeshObject.cdl, SMDS/SMDS_MeshObject.cxx,
- SMDS/SMDS_MeshObject.hxx, SMDS/SMDS_MeshObject.ixx,
- SMDS/SMDS_MeshObject.jxx,
- SMDS/SMDS_MeshOrientedElementMapHasher.cdl,
- SMDS/SMDS_MeshOrientedElementMapHasher.cxx,
- SMDS/SMDS_MeshOrientedElementMapHasher.hxx,
- SMDS/SMDS_MeshOrientedElementMapHasher.ixx,
- SMDS/SMDS_MeshOrientedElementMapHasher.jxx,
- SMDS/SMDS_MeshOrientedElementMapHasher.lxx,
- SMDS/SMDS_MeshPrism.cdl, SMDS/SMDS_MeshPrism.cxx,
- SMDS/SMDS_MeshPrism.hxx, SMDS/SMDS_MeshPrism.ixx,
- SMDS/SMDS_MeshPrism.jxx, SMDS/SMDS_MeshPrism.lxx,
- SMDS/SMDS_MeshPyramid.cdl, SMDS/SMDS_MeshPyramid.cxx,
- SMDS/SMDS_MeshPyramid.hxx, SMDS/SMDS_MeshPyramid.ixx,
- SMDS/SMDS_MeshPyramid.jxx, SMDS/SMDS_MeshPyramid.lxx,
- SMDS/SMDS_MeshQuadrangle.cdl, SMDS/SMDS_MeshQuadrangle.cxx,
- SMDS/SMDS_MeshQuadrangle.hxx, SMDS/SMDS_MeshQuadrangle.ixx,
- SMDS/SMDS_MeshQuadrangle.jxx, SMDS/SMDS_MeshQuadrangle.lxx,
- SMDS/SMDS_MeshTetrahedron.cdl, SMDS/SMDS_MeshTetrahedron.cxx,
- SMDS/SMDS_MeshTetrahedron.hxx, SMDS/SMDS_MeshTetrahedron.ixx,
- SMDS/SMDS_MeshTetrahedron.jxx, SMDS/SMDS_MeshTetrahedron.lxx,
- SMDS/SMDS_MeshTriangle.cdl, SMDS/SMDS_MeshTriangle.cxx,
- SMDS/SMDS_MeshTriangle.hxx, SMDS/SMDS_MeshTriangle.ixx,
- SMDS/SMDS_MeshTriangle.jxx, SMDS/SMDS_MeshTriangle.lxx,
- SMDS/SMDS_MeshVolume.cdl, SMDS/SMDS_MeshVolume.cxx,
- SMDS/SMDS_MeshVolume.hxx, SMDS/SMDS_MeshVolume.ixx,
- SMDS/SMDS_MeshVolume.jxx, SMDS/SMDS_MeshVolume.lxx,
- SMDS/SMDS_MeshVolumesIterator.cdl,
- SMDS/SMDS_MeshVolumesIterator.cxx,
- SMDS/SMDS_MeshVolumesIterator.hxx,
- SMDS/SMDS_MeshVolumesIterator.ixx,
- SMDS/SMDS_MeshVolumesIterator.jxx, SMDS/SMDS_PntHasher.cdl,
- SMDS/SMDS_PntHasher.cxx, SMDS/SMDS_PntHasher.hxx,
- SMDS/SMDS_PntHasher.ixx, SMDS/SMDS_PntHasher.jxx,
- SMDS/SMDS_PntHasher.lxx, SMDS/SMDS_Position.cdl,
- SMDS/SMDS_Position.cxx, SMDS/SMDS_Position.hxx,
- SMDS/SMDS_Position.ixx, SMDS/SMDS_Position.jxx,
- SMDS/SMDS_Position.lxx,
- SMDS/SMDS_SequenceNodeOfSequenceOfMesh.hxx,
- SMDS/SMDS_SequenceNodeOfSequenceOfMesh_0.cxx,
- SMDS/SMDS_SequenceOfMesh.hxx, SMDS/SMDS_SequenceOfMesh_0.cxx,
- SMDS/SMDS_SpacePosition.cdl, SMDS/SMDS_SpacePosition.cxx,
- SMDS/SMDS_SpacePosition.hxx, SMDS/SMDS_SpacePosition.ixx,
- SMDS/SMDS_SpacePosition.jxx, SMDS/SMDS_SpacePosition.lxx,
- SMDS/SMDS_StdMapNode.gxx, SMDS/SMDS_StdMapNode.lxx,
- SMDS/SMDS_StdMapNodeOfExtendedMap.hxx,
- SMDS/SMDS_StdMapNodeOfExtendedMap_0.cxx,
- SMDS/SMDS_StdMapNodeOfExtendedOrientedMap.hxx,
- SMDS/SMDS_StdMapNodeOfExtendedOrientedMap_0.cxx,
- SMDS/SMDS_TypeOfPosition.hxx, SMDS/SMDS_VertexPosition.cdl,
- SMDS/SMDS_VertexPosition.cxx, SMDS/SMDS_VertexPosition.hxx,
- SMDS/SMDS_VertexPosition.ixx, SMDS/SMDS_VertexPosition.jxx,
- SMDS/SMDS_MeshIDFactory.hxx, SMESH_I/Makefile.in,
- SMESH_I/SMESH_1D_Algo_i.cxx, SMESH_I/SMESH_1D_Algo_i.hxx,
- SMESH_I/SMESH_2D_Algo_i.cxx, SMESH_I/SMESH_2D_Algo_i.hxx,
- SMESH_I/SMESH_3D_Algo_i.cxx, SMESH_I/SMESH_3D_Algo_i.hxx,
- SMESH_I/SMESH_Algo_i.cxx, SMESH_I/SMESH_Algo_i.hxx,
- SMESH_I/SMESH_Gen_i.cxx, SMESH_I/SMESH_Gen_i.hxx,
- SMESH_I/SMESH_Hexa_3D_i.cxx, SMESH_I/SMESH_Hexa_3D_i.hxx,
- SMESH_I/SMESH_HypothesisFactory_i.cxx,
- SMESH_I/SMESH_HypothesisFactory_i.hxx,
- SMESH_I/SMESH_Hypothesis_i.cxx, SMESH_I/SMESH_Hypothesis_i.hxx,
- SMESH_I/SMESH_LocalLength_i.cxx, SMESH_I/SMESH_LocalLength_i.hxx,
- SMESH_I/SMESH_MEDFamily_i.cxx, SMESH_I/SMESH_MEDFamily_i.hxx,
- SMESH_I/SMESH_MEDMesh_i.cxx, SMESH_I/SMESH_MEDMesh_i.hxx,
- SMESH_I/SMESH_MEDSupport_i.cxx, SMESH_I/SMESH_MEDSupport_i.hxx,
- SMESH_I/SMESH_MEFISTO_2D_i.cxx, SMESH_I/SMESH_MEFISTO_2D_i.hxx,
- SMESH_I/SMESH_MaxElementArea_i.cxx,
- SMESH_I/SMESH_MaxElementArea_i.hxx,
- SMESH_I/SMESH_MaxElementVolume_i.cxx,
- SMESH_I/SMESH_MaxElementVolume_i.hxx,
- SMESH_I/SMESH_MeshEditor_i.cxx, SMESH_I/SMESH_MeshEditor_i.hxx,
- SMESH_I/SMESH_Mesh_i.cxx, SMESH_I/SMESH_Mesh_i.hxx,
- SMESH_I/SMESH_NumberOfSegments_i.cxx,
- SMESH_I/SMESH_NumberOfSegments_i.hxx,
- SMESH_I/SMESH_Quadrangle_2D_i.cxx,
- SMESH_I/SMESH_Quadrangle_2D_i.hxx,
- SMESH_I/SMESH_Regular_1D_i.cxx, SMESH_I/SMESH_Regular_1D_i.hxx,
- SMESH_I/SMESH_subMesh_i.cxx, SMESH_I/SMESH_subMesh_i.hxx,
- SMESH_I/SMESH_test.py, SMESH_I/SMESH_topo.cxx,
- SMESH_I/SMESH_topo.hxx, SMESH_I/smeshpy.py, SMESH_I/sstream,
- SMESHGUI/Makefile.in, SMESHGUI/SMESHGUI.cxx, SMESHGUI/SMESHGUI.h,
- SMESHGUI/SMESHGUI_AddAlgorithmDlg.cxx,
- SMESHGUI/SMESHGUI_AddAlgorithmDlg.h,
- SMESHGUI/SMESHGUI_AddEdgeDlg.cxx, SMESHGUI/SMESHGUI_AddEdgeDlg.h,
- SMESHGUI/SMESHGUI_AddFaceDlg.cxx, SMESHGUI/SMESHGUI_AddFaceDlg.h,
- SMESHGUI/SMESHGUI_AddHypothesisDlg.cxx,
- SMESHGUI/SMESHGUI_AddHypothesisDlg.h,
- SMESHGUI/SMESHGUI_AddSubMeshDlg.cxx,
- SMESHGUI/SMESHGUI_AddSubMeshDlg.h,
- SMESHGUI/SMESHGUI_AddVolumeDlg.cxx,
- SMESHGUI/SMESHGUI_AddVolumeDlg.h,
- SMESHGUI/SMESHGUI_ComputeScalarValue.cxx,
- SMESHGUI/SMESHGUI_ComputeScalarValue.h,
- SMESHGUI/SMESHGUI_DiagonalInversionDlg.cxx,
- SMESHGUI/SMESHGUI_DiagonalInversionDlg.h,
- SMESHGUI/SMESHGUI_EdgesConnectivityDlg.cxx,
- SMESHGUI/SMESHGUI_EdgesConnectivityDlg.h,
- SMESHGUI/SMESHGUI_EditHypothesesDlg.cxx,
- SMESHGUI/SMESHGUI_EditHypothesesDlg.h,
- SMESHGUI/SMESHGUI_EditScalarBarDlg.cxx,
- SMESHGUI/SMESHGUI_EditScalarBarDlg.h,
- SMESHGUI/SMESHGUI_InitMeshDlg.cxx,
- SMESHGUI/SMESHGUI_InitMeshDlg.h,
- SMESHGUI/SMESHGUI_LocalLengthDlg.cxx,
- SMESHGUI/SMESHGUI_LocalLengthDlg.h,
- SMESHGUI/SMESHGUI_MaxElementAreaDlg.cxx,
- SMESHGUI/SMESHGUI_MaxElementAreaDlg.h,
- SMESHGUI/SMESHGUI_MaxElementVolumeDlg.cxx,
- SMESHGUI/SMESHGUI_MaxElementVolumeDlg.h,
- SMESHGUI/SMESHGUI_MeshInfosDlg.cxx,
- SMESHGUI/SMESHGUI_MeshInfosDlg.h,
- SMESHGUI/SMESHGUI_MoveNodesDlg.cxx,
- SMESHGUI/SMESHGUI_MoveNodesDlg.h,
- SMESHGUI/SMESHGUI_NbSegmentsDlg.cxx,
- SMESHGUI/SMESHGUI_NbSegmentsDlg.h,
- SMESHGUI/SMESHGUI_NodesDlg.cxx, SMESHGUI/SMESHGUI_NodesDlg.h,
- SMESHGUI/SMESHGUI_OrientationElementsDlg.cxx,
- SMESHGUI/SMESHGUI_OrientationElementsDlg.h,
- SMESHGUI/SMESHGUI_Preferences_ColorDlg.cxx,
- SMESHGUI/SMESHGUI_Preferences_ColorDlg.h,
- SMESHGUI/SMESHGUI_Preferences_ScalarBarDlg.cxx,
- SMESHGUI/SMESHGUI_Preferences_ScalarBarDlg.h,
- SMESHGUI/SMESHGUI_RemoveElementsDlg.cxx,
- SMESHGUI/SMESHGUI_RemoveElementsDlg.h,
- SMESHGUI/SMESHGUI_RemoveNodesDlg.cxx,
- SMESHGUI/SMESHGUI_RemoveNodesDlg.h,
- SMESHGUI/SMESHGUI_SpinBox.cxx, SMESHGUI/SMESHGUI_SpinBox.h,
- SMESHGUI/SMESHGUI_StudyAPI.cxx, SMESHGUI/SMESHGUI_StudyAPI.h,
- SMESHGUI/SMESHGUI_Swig.cxx, SMESHGUI/SMESHGUI_Swig.hxx,
- SMESHGUI/SMESHGUI_Swig.i, SMESHGUI/SMESHGUI_TransparencyDlg.cxx,
- SMESHGUI/SMESHGUI_TransparencyDlg.h,
- SMESHGUI/SMESHGUI_aParameterDlg.cxx,
- SMESHGUI/SMESHGUI_aParameterDlg.h, SMESHGUI/SMESH_icons.po,
- SMESHGUI/SMESH_msg_en.po: NRI : First integration.
-
-2003-05-19 13:18 Nicolas Rejneri <nicolas.rejneri@opencascade.com>
-
- * src/: SMESH/Makefile.in, SMESH/SMESH_1D_Algo.cxx,
- SMESH/SMESH_1D_Algo.hxx, SMESH/SMESH_2D_Algo.cxx,
- SMESH/SMESH_2D_Algo.hxx, SMESH/SMESH_3D_Algo.cxx,
- SMESH/SMESH_3D_Algo.hxx, SMESH/SMESH_Algo.cxx,
- SMESH/SMESH_Algo.hxx, SMESH/SMESH_Gen.cxx, SMESH/SMESH_Gen.hxx,
- SMESH/SMESH_Hexa_3D.cxx, SMESH/SMESH_Hexa_3D.hxx,
- SMESH/SMESH_Hypothesis.cxx, SMESH/SMESH_Hypothesis.hxx,
- SMESH/SMESH_HypothesisCreator.hxx,
- SMESH/SMESH_HypothesisFactory.cxx,
- SMESH/SMESH_HypothesisFactory.hxx,
- SMESH/SMESH_LengthFromEdges.cxx, SMESH/SMESH_LengthFromEdges.hxx,
- SMESH/SMESH_LocalLength.cxx, SMESH/SMESH_LocalLength.hxx,
- SMESH/SMESH_MEFISTO_2D.cxx, SMESH/SMESH_MEFISTO_2D.hxx,
- SMESH/SMESH_MaxElementArea.cxx, SMESH/SMESH_MaxElementArea.hxx,
- SMESH/SMESH_MaxElementVolume.cxx,
- SMESH/SMESH_MaxElementVolume.hxx, SMESH/SMESH_Mesh.cxx,
- SMESH/SMESH_Mesh.hxx, SMESH/SMESH_NumberOfSegments.cxx,
- SMESH/SMESH_NumberOfSegments.hxx, SMESH/SMESH_Quadrangle_2D.cxx,
- SMESH/SMESH_Quadrangle_2D.hxx, SMESH/SMESH_Regular_1D.cxx,
- SMESH/SMESH_Regular_1D.hxx, SMESH/SMESH_subMesh.cxx,
- SMESH/SMESH_subMesh.hxx, SMESHDS/Handle_SMESHDS_Command.hxx,
- SMESHDS/Handle_SMESHDS_DataMapNodeOfDataMapOfIntegerMesh.hxx,
- SMESHDS/Handle_SMESHDS_DataMapNodeOfDataMapOfIntegerPtrHypothesis.hxx,
- SMESHDS/Handle_SMESHDS_DataMapNodeOfDataMapOfIntegerSubMesh.hxx,
- SMESHDS/Handle_SMESHDS_ListNodeOfListOfCommand.hxx,
- SMESHDS/Handle_SMESHDS_Mesh.hxx,
- SMESHDS/Handle_SMESHDS_Script.hxx, SMESHDS/Makefile.in,
- SMESHDS/SMESHDS_Command.cdl, SMESHDS/SMESHDS_Command.cxx,
- SMESHDS/SMESHDS_Command.ixx, SMESHDS/SMESHDS_Command.jxx,
- SMESHDS/SMESHDS_DataMapIteratorOfDataMapOfIntegerMesh_0.cxx,
- SMESHDS/SMESHDS_DataMapIteratorOfDataMapOfIntegerPtrHypothesis_0.cxx,
- SMESHDS/SMESHDS_DataMapIteratorOfDataMapOfIntegerSubMesh.hxx,
- SMESHDS/SMESHDS_DataMapIteratorOfDataMapOfIntegerSubMesh_0.cxx,
- SMESHDS/SMESHDS_DataMapIteratorOfDataMapOfShapeListOfPtrHypothesis_0.cxx,
- SMESHDS/SMESHDS_DataMapIteratorOfDataMapOfShapeSubMesh.hxx,
- SMESHDS/SMESHDS_DataMapNodeOfDataMapOfIntegerMesh.hxx,
- SMESHDS/SMESHDS_DataMapNodeOfDataMapOfIntegerPtrHypothesis_0.cxx,
- SMESHDS/SMESHDS_DataMapNodeOfDataMapOfIntegerSubMesh.hxx,
- SMESHDS/SMESHDS_DataMapNodeOfDataMapOfIntegerSubMesh_0.cxx,
- SMESHDS/SMESHDS_DataMapNodeOfDataMapOfShapeListOfPtrHypothesis.hxx,
- SMESHDS/SMESHDS_DataMapNodeOfDataMapOfShapeListOfPtrHypothesis_0.cxx,
- SMESHDS/SMESHDS_DataMapNodeOfDataMapOfShapeSubMesh.hxx,
- SMESHDS/SMESHDS_DataMapNodeOfDataMapOfShapeSubMesh_0.cxx,
- SMESHDS/SMESHDS_DataMapOfIntegerMesh.hxx,
- SMESHDS/SMESHDS_DataMapOfIntegerMesh_0.cxx,
- SMESHDS/SMESHDS_DataMapOfIntegerPtrHypothesis.hxx,
- SMESHDS/SMESHDS_DataMapOfIntegerPtrHypothesis_0.cxx,
- SMESHDS/SMESHDS_DataMapOfIntegerSubMesh.hxx,
- SMESHDS/SMESHDS_DataMapOfIntegerSubMesh_0.cxx,
- SMESHDS/SMESHDS_DataMapOfShapeSubMesh.hxx,
- SMESHDS/SMESHDS_DataMapOfShapeSubMesh_0.cxx,
- SMESHDS/SMESHDS_Document.cdl, SMESHDS/SMESHDS_Document.hxx,
- SMESHDS/SMESHDS_Document.ixx, SMESHDS/SMESHDS_Hypothesis.hxx,
- SMESHDS/SMESHDS_ListIteratorOfListOfAsciiString_0.cxx,
- SMESHDS/SMESHDS_ListIteratorOfListOfCommand.hxx,
- SMESHDS/SMESHDS_ListIteratorOfListOfCommand_0.cxx,
- SMESHDS/SMESHDS_ListIteratorOfListOfPtrHypothesis_0.cxx,
- SMESHDS/SMESHDS_ListNodeOfListOfAsciiString.hxx,
- SMESHDS/SMESHDS_ListNodeOfListOfAsciiString_0.cxx,
- SMESHDS/SMESHDS_ListNodeOfListOfCommand.hxx,
- SMESHDS/SMESHDS_ListNodeOfListOfCommand_0.cxx,
- SMESHDS/SMESHDS_ListNodeOfListOfPtrHypothesis.hxx,
- SMESHDS/SMESHDS_ListOfCommand.hxx,
- SMESHDS/SMESHDS_ListOfPtrHypothesis.hxx,
- SMESHDS/SMESHDS_ListOfPtrHypothesis_0.cxx,
- SMESHDS/SMESHDS_Mesh.cdl, SMESHDS/SMESHDS_Mesh.hxx,
- SMESHDS/SMESHDS_Script.cdl, SMESHDS/SMESHDS_Script.cxx,
- SMESHDS/SMESHDS_Script.hxx, SMESHDS/SMESHDS_Script.ixx,
- SMESHDS/SMESHDS_Script.jxx, SMESHDS/SMESHDS_SubMesh.cdl,
- SMESHDS/SMESHDS_SubMesh.cxx, SMESHDS/SMESHDS_SubMesh.hxx,
- SMESHDS/SMESHDS_SubMesh.ixx, SMESHDS/SMESHDS_SubMesh.jxx,
- SMESHDS/Handle_SMESHDS_DataMapNodeOfDataMapOfShapeListOfPtrHypothesis.hxx,
- SMESHDS/Handle_SMESHDS_DataMapNodeOfDataMapOfShapeSubMesh.hxx,
- SMESHDS/Handle_SMESHDS_Document.hxx,
- SMESHDS/Handle_SMESHDS_ListNodeOfListOfAsciiString.hxx,
- SMESHDS/Handle_SMESHDS_ListNodeOfListOfPtrHypothesis.hxx,
- SMESHDS/Handle_SMESHDS_SubMesh.hxx, SMESHDS/SMESHDS.cdl,
- SMESHDS/SMESHDS_Command.hxx, SMESHDS/SMESHDS_CommandType.hxx,
- SMESHDS/SMESHDS_DataMapIteratorOfDataMapOfIntegerMesh.hxx,
- SMESHDS/SMESHDS_DataMapIteratorOfDataMapOfIntegerPtrHypothesis.hxx,
- SMESHDS/SMESHDS_DataMapIteratorOfDataMapOfShapeListOfPtrHypothesis.hxx,
- SMESHDS/SMESHDS_DataMapIteratorOfDataMapOfShapeSubMesh_0.cxx,
- SMESHDS/SMESHDS_DataMapNodeOfDataMapOfIntegerMesh_0.cxx,
- SMESHDS/SMESHDS_DataMapNodeOfDataMapOfIntegerPtrHypothesis.hxx,
- SMESHDS/SMESHDS_DataMapOfShapeListOfPtrHypothesis.hxx,
- SMESHDS/SMESHDS_DataMapOfShapeListOfPtrHypothesis_0.cxx,
- SMESHDS/SMESHDS_Document.cxx, SMESHDS/SMESHDS_Document.jxx,
- SMESHDS/SMESHDS_Hypothesis.cxx,
- SMESHDS/SMESHDS_ListIteratorOfListOfAsciiString.hxx,
- SMESHDS/SMESHDS_ListIteratorOfListOfPtrHypothesis.hxx,
- SMESHDS/SMESHDS_ListNodeOfListOfPtrHypothesis_0.cxx,
- SMESHDS/SMESHDS_ListOfAsciiString.hxx,
- SMESHDS/SMESHDS_ListOfAsciiString_0.cxx,
- SMESHDS/SMESHDS_ListOfCommand_0.cxx, SMESHDS/SMESHDS_Mesh.cxx,
- SMESHDS/SMESHDS_Mesh.ixx, SMESHDS/SMESHDS_Mesh.jxx,
- SMESHDS/SMESHDS_PtrHypothesis.hxx: NRI : First integration.
-
-2003-05-19 13:03 Nicolas Rejneri <nicolas.rejneri@opencascade.com>
-
- * Makefile.in, build_configure, configure.in.base,
- resources/ModuleMesh.png, resources/SMESHCatalog.xml,
- resources/SMESH_en.xml, resources/SMESH_fr.xml,
- resources/delete.png, resources/mesh.png,
- resources/mesh_add_sub.png, resources/mesh_algo_hexa.png,
- resources/mesh_algo_mefisto.png, resources/mesh_algo_quad.png,
- resources/mesh_algo_regular.png, resources/mesh_angle.png,
- resources/mesh_area.png, resources/mesh_aspect.png,
- resources/mesh_compute.png, resources/mesh_connectivity.png,
- resources/mesh_diagonal.png, resources/mesh_edit.png,
- resources/mesh_hexa.png, resources/mesh_hexa_n.png,
- resources/mesh_hypo_area.png, resources/mesh_hypo_length.png,
- resources/mesh_hypo_segment.png, resources/mesh_hypo_volume.png,
- resources/mesh_info.png, resources/mesh_init.png,
- resources/mesh_length.png, resources/mesh_line.png,
- resources/mesh_line_n.png, resources/mesh_move_node.png,
- resources/mesh_orientation.png, resources/mesh_pyramid.png,
- resources/mesh_pyramid_n.png, resources/mesh_quad.png,
- resources/mesh_quad_n.png, resources/mesh_rem_element.png,
- resources/mesh_rem_node.png, resources/mesh_set_algo.png,
- resources/mesh_set_hypo.png, resources/mesh_shading.png,
- resources/mesh_shrink.png, resources/mesh_skew.png,
- resources/mesh_taper.png, resources/mesh_tetra.png,
- resources/mesh_tetra_n.png, resources/mesh_tree_algo.png,
- resources/mesh_tree_algo_hexa.png,
- resources/mesh_tree_algo_mefisto.png,
- resources/mesh_tree_algo_quad.png,
- resources/mesh_tree_algo_regular.png,
- resources/mesh_tree_hypo.png, resources/mesh_tree_hypo_area.png,
- resources/mesh_tree_hypo_length.png,
- resources/mesh_tree_hypo_segment.png,
- resources/mesh_tree_hypo_volume.png,
- resources/mesh_tree_mesh.png, resources/mesh_tree_mesh_warn.png,
- resources/mesh_triangle.png, resources/mesh_triangle_n.png,
- resources/mesh_update.png, resources/mesh_vertex.png,
- resources/mesh_vertex_n.png, resources/mesh_wireframe.png,
- resources/mesh_wrap.png, resources/select1.png, idl/Makefile.in,
- idl/SMESH_BasicHypothesis.idl, idl/SMESH_Gen.idl,
- idl/SMESH_Hypothesis.idl, idl/SMESH_Mesh.idl,
- src/DriverDAT/DriverDAT_R_SMDS_Mesh.cxx,
- src/DriverDAT/DriverDAT_R_SMDS_Mesh.h,
- src/DriverDAT/DriverDAT_R_SMESHDS_Document.cxx,
- src/DriverDAT/DriverDAT_R_SMESHDS_Document.h,
- src/DriverDAT/DriverDAT_R_SMESHDS_Mesh.cxx,
- src/DriverDAT/DriverDAT_R_SMESHDS_Mesh.h,
- src/DriverDAT/DriverDAT_W_SMDS_Mesh.cxx,
- src/DriverDAT/DriverDAT_W_SMDS_Mesh.h,
- src/DriverDAT/DriverDAT_W_SMESHDS_Document.cxx,
- src/DriverDAT/DriverDAT_W_SMESHDS_Document.h,
- src/DriverDAT/DriverDAT_W_SMESHDS_Mesh.cxx,
- src/DriverDAT/DriverDAT_W_SMESHDS_Mesh.h,
- src/DriverDAT/Makefile.in,
- src/DriverMED/DriverMED_R_SMDS_Mesh.cxx,
- src/DriverMED/DriverMED_R_SMESHDS_Document.cxx,
- src/DriverMED/DriverMED_R_SMESHDS_Mesh.cxx,
- src/DriverMED/DriverMED_W_SMDS_Mesh.cxx,
- src/DriverMED/DriverMED_W_SMESHDS_Document.cxx,
- src/DriverMED/DriverMED_W_SMESHDS_Mesh.cxx,
- src/DriverMED/Makefile.in,
- src/DriverUNV/DriverUNV_R_SMDS_Mesh.cxx,
- src/DriverUNV/DriverUNV_R_SMDS_Mesh.h,
- src/DriverUNV/DriverUNV_R_SMESHDS_Document.cxx,
- src/DriverUNV/DriverUNV_R_SMESHDS_Document.h,
- src/DriverUNV/DriverUNV_R_SMESHDS_Mesh.cxx,
- src/DriverUNV/DriverUNV_R_SMESHDS_Mesh.h,
- src/DriverUNV/DriverUNV_W_SMDS_Mesh.cxx,
- src/DriverUNV/DriverUNV_W_SMDS_Mesh.h,
- src/DriverUNV/DriverUNV_W_SMESHDS_Document.cxx,
- src/DriverUNV/DriverUNV_W_SMESHDS_Document.h,
- src/DriverUNV/DriverUNV_W_SMESHDS_Mesh.cxx,
- src/DriverUNV/DriverUNV_W_SMESHDS_Mesh.h,
- src/DriverUNV/Makefile.in: NRI : First integration.
-
-2003-03-07 14:55 tag V1
-
-2003-03-07 14:55 cvsadmin
-
- * src/DriverMED/: DriverMED_R_SMESHDS_Document.h,
- DriverMED_W_SMESHDS_Document.h:
- Initialisation module SMESH_SRC de la base SMESH
-
-2003-03-07 14:55 cvsadmin
-
- * src/DriverMED/: DriverMED_R_SMDS_Mesh.cxx,
- DriverMED_R_SMDS_Mesh.h, DriverMED_R_SMESHDS_Document.cxx,
- DriverMED_R_SMESHDS_Mesh.cxx, DriverMED_R_SMESHDS_Mesh.h,
- DriverMED_W_SMDS_Mesh.cxx, DriverMED_W_SMDS_Mesh.h,
- DriverMED_W_SMESHDS_Document.cxx, DriverMED_W_SMESHDS_Mesh.cxx,
- DriverMED_W_SMESHDS_Mesh.h, Makefile.in: Initial revision
-
+++ /dev/null
- 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.
-\f
- 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.
-\f
- 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.
-\f
- 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.
-\f
- 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.
-\f
- 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.
-\f
- 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.
-\f
- 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.
-\f
- 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
-\f
- 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.
-
- <one line to give the library's name and a brief idea of what it does.>
- Copyright (C) <year> <name of author>
-
- 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.
-
- <signature of Ty Coon>, 1 April 1990
- Ty Coon, President of Vice
-
-That's all there is to it!
-
-
+++ /dev/null
-# Check availability of Geom binary distribution
-#
-# Author : Nicolas REJNERI (OPEN CASCADE, 2003)
-#
-
-AC_DEFUN([CHECK_GEOM],[
-
-AC_CHECKING(for Geom)
-
-Geom_ok=no
-
-AC_ARG_WITH(geom,
- [ --with-geom=DIR root directory path of GEOM installation ],
- GEOM_DIR="$withval",GEOM_DIR="")
-
-if test "x$GEOM_DIR" == "x" ; then
-
-# no --with-geom-dir option used
-
- if test "x$GEOM_ROOT_DIR" != "x" ; then
-
- # GEOM_ROOT_DIR environment variable defined
- GEOM_DIR=$GEOM_ROOT_DIR
-
- fi
-#
-fi
-
-if test -f ${GEOM_DIR}/lib/salome/libGEOMClient.so ; then
- Geom_ok=yes
- AC_MSG_RESULT(Using Geom module distribution in ${GEOM_DIR})
-
- if test "x$GEOM_ROOT_DIR" == "x" ; then
- GEOM_ROOT_DIR=${GEOM_DIR}
- fi
- AC_SUBST(GEOM_ROOT_DIR)
-
-else
- AC_MSG_WARN("Cannot find compiled Geom module distribution")
-fi
-
-AC_MSG_RESULT(for Geom: $Geom_ok)
-
-])dnl
-
+++ /dev/null
-# Check availability of Med binary distribution
-#
-# Author : Nicolas REJNERI (OPEN CASCADE, 2003)
-#
-
-AC_DEFUN([CHECK_MED],[
-
-AC_CHECKING(for Med)
-
-Med_ok=no
-
-AC_ARG_WITH(med,
- [ --with-med=DIR root directory path of MED installation ],
- MED_DIR="$withval",MED_DIR="")
-
-if test "x$MED_DIR" == "x" ; then
-
-# no --with-med-dir option used
-
- if test "x$MED_ROOT_DIR" != "x" ; then
-
- # MED_ROOT_DIR environment variable defined
- MED_DIR=$MED_ROOT_DIR
-
- fi
-#
-fi
-
-if test -f ${MED_DIR}/idl/salome/MED.idl ; then
- Med_ok=yes
- AC_MSG_RESULT(Using Med module distribution in ${MED_DIR})
-
- if test "x$MED_ROOT_DIR" == "x" ; then
- MED_ROOT_DIR=${MED_DIR}
- fi
- AC_SUBST(MED_ROOT_DIR)
-
-else
- AC_MSG_WARN("Cannot find Med module sources")
-fi
-
-AC_MSG_RESULT(for Med: $Med_ok)
-
-])dnl
-
+++ /dev/null
-#=======================================================================
-# This section of this makefile comes from the file
-# 'adm/unix/make_conclude' which was generated with config.status
-# from file adm/unix/make_conclude.in
-#=======================================================================
-# -* Makefile *-
-#
-# Authors : Patrick GOLDBRONN (CEA) - Marc Tajchman (CEA)
-# Date : 6/07/2001
-# $Header$
-#
-
-# ORB Specifics rules
-@CORBA@
-
-# transform idl reference in appropriate obj file
-LIB_CLIENT_SRC = $(LIB_CLIENT_IDL:%.idl=%$(IDL_CLN_CXX))
-LIB_SERVER_SRC = $(LIB_SERVER_IDL:%.idl=%$(IDL_SRV_CXX))
-LIB_MOC_SRC = $(LIB_MOC:%.h=%_moc.cxx)
-LIB_SRC+=$(LIB_MOC_SRC)
-LIB_SWIG_SRC = $(SWIG_DEF:%.i=%_wrap.cxx)
-LIB_DEP= $(LIB_SRC) $(LIB_CLIENT_SRC) $(LIB_SERVER_SRC) $(LIB_SWIG_SRC)
-
-LIB_CLIENT_OBJ = $(LIB_CLIENT_IDL:%.idl=%$(IDL_CLN_OBJ))
-LIB_SERVER_OBJ = $(LIB_SERVER_IDL:%.idl=%$(IDL_SRV_OBJ))
-
-
-# transform c file in appropriate libtool obj file (.c, .cc and .cxx)
-LIB_OBJ_C = $(patsubst %.c, %.lo, $(filter %.c, $(LIB_SRC)))
-LIB_OBJ_CC = $(patsubst %.cc, %.lo, $(filter %.cc, $(LIB_SRC)))
-LIB_OBJ_CXX = $(patsubst %.cxx, %.lo, $(filter %.cxx, $(LIB_SRC)))
-LIB_SWIG_OBJ = $(LIB_SWIG_SRC:%.cxx=%.lo)
-LIB_OBJ_F = $(patsubst %.f, %.lo, $(filter %.f, $(LIB_SRC)))
-
-# all libtool obj file in library
-LIB_OBJ = $(LIB_OBJ_CXX) $(LIB_OBJ_CC) $(LIB_OBJ_C) $(LIB_CLIENT_OBJ:%.o=%.lo) $(LIB_SERVER_OBJ:%.o=%.lo) $(LIB_SWIG_OBJ) $(LIB_OBJ_F)
-
-# LIB_BUILD = $(LIB:%.la=$(top_builddir)/lib/salome/%.la)
-LIB_BUILD = $(patsubst %.la, $(top_builddir)/lib/salome/%.la, $(filter %.la, $(LIB)))
-LIB_BUILD_A = $(patsubst %.a, $(top_builddir)/lib/salome/%.a, $(filter %.a, $(LIB)))
-
-ifneq ($(findstring cmodule.la,$(filter %.la, $(LIB))),)
-LIB_SWIG = $(patsubst %cmodule.la,%.so, $(filter %.la, $(LIB)))
-else
-LIB_SWIG =
-endif
-
-lib: $(LIB_BUILD) $(LIB_CLIENT_PY)
-# we don't build static library !
-
-$(LIB_BUILD): $(top_builddir)/lib/salome/%.la: %.la
- -$(RM) $@
- -$(RM) $(patsubst %.la, %.so, $@)
- -$(RM) $(patsubst %.la, %.a, $@)
- ln -sf $(CURDIR)/$< $@ || true
- ln -sf $(patsubst %.la, %.so, $(CURDIR)/.libs/$<) \
- $(patsubst %.la, %.so, $@) || true
- ln -sf $(patsubst %.la, %.so, $(CURDIR)/.libs/$<).0 \
- $(patsubst %.la, %.so, $@).0 || true
-
- if ! test -z $(LIB_SWIG) ; then \
- ln -sf $(patsubst %.la,%.so, $(CURDIR)/.libs/$<) $(top_builddir)/lib/salome/_$(LIB_SWIG) || true;\
- fi;
-
-$(LIB_BUILD_A): $(top_builddir)/lib/salome/%.a: %.a
- -$(RM) $@
- ln -sf $(CURDIR)/$< $@ || true
-
-$(LIB): $(LIB_OBJ)
- @$(LT) --mode=link $(CXX) -rpath $(libdir) -o $@ $(CXXFLAGS) $(LIB_OBJ) $(LDFLAGS) $(LIBS)
-
-# transform idl reference in appropriate obj file
-BIN_CLIENT_SRC = $(BIN_CLIENT_IDL:%.idl=%$(IDL_CLN_CXX))
-BIN_SERVER_SRC = $(BIN_SERVER_IDL:%.idl=%$(IDL_SRV_CXX))
-BIN_MOC_SRC = $(BIN_MOC:%.h=%_moc.cxx)
-BIN_SRC+=$(BIN_MOC_SRC)
-BIN_DEP=$(BIN:%=%.cxx) $(BIN_SRC) $(BIN_CLIENT_SRC) $(BIN_SERVER_SRC)
-
-BIN_CLIENT_OBJ = $(BIN_CLIENT_IDL:%.idl=%$(IDL_CLN_OBJ))
-BIN_SERVER_OBJ = $(BIN_SERVER_IDL:%.idl=%$(IDL_SRV_OBJ))
-# transform c file in appropriate libtool obj file (.c)
-BIN_OBJ_C = $(patsubst %.c, %.o, $(filter %.c, $(BIN_SRC)))
-# transform c++ file in appropriate libtool obj file (.cc and .cxx)
-BIN_OBJ_CC = $(patsubst %.cc, %.o, $(filter %.cc, $(BIN_SRC)))
-BIN_OBJ_CXX = $(patsubst %.cxx, %.o, $(filter %.cxx, $(BIN_SRC)))
-# all obj file in bin target
-BIN_OBJ = $(BIN_OBJ_CC) $(BIN_OBJ_CXX) $(BIN_OBJ_C) $(BIN_CLIENT_OBJ) $(BIN_SERVER_OBJ)
-
-bin: $(BIN:%=$(top_builddir)/bin/salome/%) $(BIN) $(LIB) pyscripts sharedpyscripts
-
-BIN_LIB=$(LIB:lib%.la=-l%)
-
-$(BIN:%=$(top_builddir)/bin/salome/%) $(TEST_PROGS:%=$(top_builddir)/bin/salome/%): $(top_builddir)/bin/salome/%: %
- -$(RM) $@
- ln -sf $(CURDIR)/$< $@
-
-$(BIN) $(TEST_PROGS): %: %.lo $(BIN_OBJ)
- $(CXX) $(CXXFLAGS) -o $@ $^ $(BIN_LIB) $(LDFLAGSFORBIN) $(LIBSFORBIN)
-
-# copy python scripts in $(top_builddir)/bin/salome
-#
-DEST_PYSCRIPTS = $(EXPORT_PYSCRIPTS:%=$(top_builddir)/bin/salome/%)
-pyscripts: $(DEST_PYSCRIPTS)
-$(DEST_PYSCRIPTS): $(top_builddir)/bin/salome/%: %
- cp -f $< $@
-
-# copy pyqt files in $(PYTHON_SHARED_SITE)
-#
-PYTHON_SHARED_SITE=$(top_builddir)/lib/python$(PYTHON_VERSION)/site-packages/salome/shared_modules
-
-$(PYTHON_SHARED_SITE):
- $(INSTALL) -d $@
-
-DEST_SHAREDPYSCRIPTS = $(EXPORT_SHAREDPYSCRIPTS:%=$(PYTHON_SHARED_SITE)/%)
-sharedpyscripts: $(PYTHON_SHARED_SITE) $(DEST_SHAREDPYSCRIPTS)
-$(DEST_SHAREDPYSCRIPTS): $(PYTHON_SHARED_SITE)/%: %
- cp -f $< $@
-
-check: test
-
-tests: test
-
-test: $(LIB) $(TEST_PROGS:%=$(top_builddir)/bin/salome/%)
-
-
-# copy header file in $(inc_builddir)
-#
-DEST_HEADERS = $(EXPORT_HEADERS:%=$(inc_builddir)/%)
-inc: $(DEST_HEADERS)
-$(DEST_HEADERS): $(inc_builddir)/%: %
- cp -f $< $@
-
-# build resources file (icons and messages) : .qm file from .po file
-resources: $(PO_FILES:%.po=$(top_builddir)/share/salome/resources/%.qm)
-
-# Make installation directories if they don't exist.
-$(libdir) $(includedir) $(bindir) $(datadir) $(idldir) $(sharedpydir):
- $(INSTALL) -d $@ && chmod 755 $@
-
-# Install the library, the public header files, and programs.
-install: $(LIB) $(BIN) $(TEST_PROGS) $(libdir) $(includedir) $(bindir) $(datadir) $(idldir) install-python install-sharedpyqt install-qm
- @for f in X $(LIB); do \
- if test $$f != X; then \
- ($(LT_INSTALL_LIB) $$f $(libdir)/. || exit 1); \
- fi; \
- done
- @if ! test -z $(LIB_SWIG) ; then \
- (cd $(libdir); ln -sf $(patsubst %.so, %cmodule.so, $(LIB_SWIG)) _$(LIB_SWIG) || true); \
- fi;
- @for f in X $(BIN); do \
- if test $$f != X; then \
- ($(LT_INSTALL_PROG) $$f $(bindir)/. || exit 1); \
- fi; \
- done
-# Install tests programmes in bindir
- @for f in X $(TEST_PROGS); do \
- if test $$f != X; then \
- ($(LT_INSTALL_PROG) $$f $(bindir)/. || exit 1); \
- fi; \
- done
-# Install exported includes in includedir
- @for f in X $(EXPORT_HEADERS:%=$(srcdir)/%); do \
- if test $$f != X; then \
- (cp -p -f $$f $(includedir) || exit 1); \
- fi; \
- done
-
-# Install python script in $(bindir)
-install-python: $(bindir) $(EXPORT_PYSCRIPTS:%=install-%)
-
-$(EXPORT_PYSCRIPTS:%=install-%): install-%: %
- $(INSTALL_PROGRAM) $< $(bindir)/.
-
-#install-python: $(bindir) $(EXPORT_PYSCRIPTS)
-# @for f in X $(EXPORT_PYSCRIPTS); do \
-# if test $$f != X; then \
-# ($(INSTALL_PROGRAM) $$f $(bindir)/. || exit 1); \
-# fi; \
-# done
-
-# Install pyqt script in $(install-sharedpyqt)
-install-sharedpyqt: $(sharedpydir) $(EXPORT_SHAREDPYSCRIPTS:%=install-%)
-
-$(EXPORT_SHAREDPYSCRIPTS:%=install-%): install-%: %
- $(INSTALL_PROGRAM) $< $(sharedpydir)/.
-
-
-# generic rule to install .qm files :
-install-qm: resources
- $(INSTALL) -d $(datadir)/resources
- @for f in X $(PO_FILES:%.po=$(top_builddir)/share/salome/resources/%.qm); do \
- if test $$f != X; then \
- ($(INSTALL_DATA) $$f $(datadir)/resources/. || exit 1); \
- fi; \
- done
-
-# Removes those things that `make install' (would have) installed.
-uninstall:
- @if test "X$(LIB)" != X; then \
- for f in $(LIB); do \
- $(LT_UNINSTALL) $(libdir)/$$f; \
- done; \
- fi
- @if test "X$(BIN)" != X; then \
- for f in $(BIN); do \
- $(LT_UNINSTALL) $(bindir)/$$f; \
- done; \
- fi
- @for f in X $(TEST_PROGS); do \
- if test $$f != X; then \
- $(LT_UNINSTALL) $(bindir)/$$f; \
- fi; \
- done
-# Uninstall exported includes in includedir
- @for f in X $(EXPORT_HEADERS); do \
- if test $$f != X; then \
- $(LT_UNINSTALL) $(includedir)/$$f; \
- fi; \
- done
-# Uninstall python script in $(bindir)
- @for f in X $(EXPORT_PYSCRIPTS); do \
- if test $$f != X; then \
- $(LT_UNINSTALL) $(bindir)/$$f ; \
- fi; \
- done
-
-# Uninstall pyqt script in $(sharedpydir)
- @for f in X $(EXPORT_SHAREDPYSCRIPTS); do \
- if test $$f != X; then \
- $(LT_UNINSTALL) $(sharedpydir)/$$f ; \
- fi; \
- done
-
-# Uninstall qm files
- @for f in X $(PO_FILES:%.po=%.qm); do \
- if test $$f != X; then \
- $(LT_UNINSTALL) $(datadir)/resources/$$f ; \
- fi; \
- done
-
-# remove all dependencies files
-#
-cleandep:
- -$(RM) .dep*
-
-# Removes temporary files without removing the final target files. That is,
-# remove things like object files but not libraries or executables.
-#
-mostlyclean: cleandep
- -$(RM) $(LIB_OBJ) $(LIB_OBJ:.lo=.o)
- -$(RM) $(BIN_OBJ) $(BIN:%=%.o)
- -$(RM) $(TEST_OBJ) $(TEST_OBJ:.lo=.o)
- -$(RM) $(PROG_OBJ) $(PROG_OBJ:.lo=.o) $(MOSTLYCLEAN)
-
-# Like `mostlyclean' except it also removes the final targets: things like
-# libraries and executables. This target doesn't remove any file that
-# is part of the SALOME distribution.
-#
-clean: mostlyclean
- -$(RM) $(LIB) $(TEST_PROGS) $(BIN) $(CLEAN)
- -$(RM) TAGS *~ *# core *.core
- -$(RM) -r .libs
- -$(RM) $(top_builddir)/lib/salome/$(LIB)
- -$(RM) $(patsubst %,$(top_builddir)/bin/salome/%, $(BIN))
- -$(RM) $(patsubst %.la, %.so, $(top_builddir)/lib/salome/$(LIB))
- -$(RM) $(patsubst %.la, %.a, $(top_builddir)/lib/salome/$(LIB))
-# remove idl generated files (sources)
- -$(RM) $(LIB_CLIENT_SRC) $(LIB_SERVER_SRC) $(BIN_CLIENT_SRC) $(BIN_SERVER_SRC)
-# remove idl generated files (headers)
- -$(RM) $(LIB_CLIENT_IDL:%.idl=%$(IDL_CLN_H)) $(LIB_SERVER_IDL:%.idl=%$(IDL_SRV_H))
- -$(RM) $(BIN_CLIENT_IDL:%.idl=%$(IDL_CLN_H)) $(BIN_SERVER_IDL:%.idl=%$(IDL_SRV_H))
- -$(RM) $(LIB_MOC_SRC) $(BIN_MOC_SRC)
- -$(RM) $(LIB_SWIG_SRC)
-
-# Like `clean' except it also removes files that were created by running
-# configure. If you've unpacked the source and built without creating
-# any other files, then `make distclean' will leave only the files that were
-# in the distribution.
-#
-distclean: clean
- #remove qm file !
- -$(RM) $(PO_FILES:%.po=%.qm) $(PO_FILES:%.po=$(top_builddir)/share/salome/resources/%.qm)
- #remove include files
- -$(RM) $(DEST_HEADERS)
- -$(RM) $(DISTCLEAN) *.bak *.old *.new .dep*
- @if test -f $(srcdir)/Makefile.in; then \
- (@SETX@; $(RM) Makefile); \
- fi
-
-
-#implicits rules
-.cc.o:
- $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $<
-
-.cc.lo:
- $(LT) --mode=compile $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $<
-
-.cxx.o:
- $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $<
-
-.cxx.lo:
- $(LT) --mode=compile $(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $<
-
-.c.o:
- $(CC) $(CFLAGS) $(CPPFLAGS) -c $<
-
-.c.lo:
- $(LT_COMPILE) $(CFLAGS) $(CPPFLAGS) -c $<
-
-.f.o:
- $(FC) $(FFLAGS) -c $< -o $@
-
-.f.lo:
- $(LT) --mode=compile $(FC) $(FFLAGS) -c $<
-
-.ui.h:
- $(UIC) -o $@ $<
-
-.ui.cxx:
- $(UIC) -o $@ -i $*.h $<
-
-#pattern rules
-%_moc.cxx : %.h
- $(MOC) $< -o $@
-
-%_wrap.cxx : %.i
- $(SWIG) $(SWIG_FLAGS) -o $@ $<
-
-$(top_builddir)/share/salome/resources/%.qm: %.po
- $(MSG2QM) $< $@ ; \
-
-#------------------------------------------------------------------------------
-# The following section of this makefile contains dependencies between the
-# source files and the header files. If GNU make and GCC are being used then
-# the dependencies are in the form of rules that cause the information to
-# be kept updated automatically. Otherwise the dependencies are listed
-# explicitly and come from the `.distdep' files in the various directories.
-# These files are part of the distribution and are generated automatically on
-# GNU/GCC systems.
-#------------------------------------------------------------------------------
-
-@DEPEND@
+++ /dev/null
-#=======================================================================
-# Begin specific part to omniorb
-# (include from file adm/unix/make_omniorb generated by
-# adm/unix/make_omniorb.in)
-#=======================================================================
-# -* Makefile *-
-#
-# Author : Patrick GOLDBRONN (CEA)
-# Date : 29/06/2001
-# $Header$
-#
-
-# Client and server object are the same with omniorb
-# There are one header file and one source file generate
-
-#IDLOBJ=$(IDLSRC:%.idl=%$(IDL_CLN_OBJ))
-
-# dependancies between idl and it's generated files
-%$(OMNIORB_IDL_CLN_CXX) %$(OMNIORB_IDL_CLN_H): ${KERNEL_ROOT_DIR}/idl/salome/%.idl
- $(OMNIORB_IDL) $(IDLCXXFLAGS) $(OMNIORB_IDLCXXFLAGS) $<
-
-%$(OMNIORB_IDL_CLN_CXX) %$(OMNIORB_IDL_CLN_H): ${GEOM_ROOT_DIR}/idl/salome/%.idl
- $(OMNIORB_IDL) $(IDLCXXFLAGS) $(OMNIORB_IDLCXXFLAGS) $<
-
-%$(OMNIORB_IDL_CLN_CXX) %$(OMNIORB_IDL_CLN_H): ${MED_ROOT_DIR}/idl/salome/%.idl
- $(OMNIORB_IDL) $(IDLCXXFLAGS) $(OMNIORB_IDLCXXFLAGS) $<
-
-%$(OMNIORB_IDL_CLN_CXX) %$(OMNIORB_IDL_CLN_H): ${top_srcdir}/idl/%.idl
- $(OMNIORB_IDL) $(IDLCXXFLAGS) $(OMNIORB_IDLCXXFLAGS) $<
-
-# dependncies between idl files
-depend_idl: .depidl
-
-# we use cpp to generate dependencies between idl files.
-# we change cpp output to keep only idl file and transform it to get a suitable rule
-.depidl: $(IDL_FILES)
- @touch $@
- @for dep in $? dummy; do \
- if [ $$dep != "dummy" ]; then \
- echo Building dependencies for $$dep; \
- basedep=`basename $$dep .idl`; \
- header="$$basedep"$(IDL_CLN_H); \
- sed '\%^'"$$header"':%,\%[^\\]$$%d' <$@ >$@- && mv $@- $@; \
- $(CPP) $(C_DEPEND_FLAG) -I$(srcdir) $$dep 2>/dev/null | \
- sed `echo "s%$$basedep\\.idl%$$header:%g"` | \
- sed 's% $(srcdir)/% %g' | \
- sed 's% $(top_srcdir)/% %g' | \
- sed 's% $(top_builddir)/% %g' | \
- sed 's%^.*:\.o: *%%' | sed 's%^ *\\ *%%'| sed 's%^ *\(.*\):%\1:%' | \
- sed 's/\.idl/$(IDL_CLN_H)/' >>$@; \
- echo '' >>$@; \
- fi; \
- done ;
-
--include .depidl
-
-#=======================================================================
-# End specific part to omniorb
-#=======================================================================
+++ /dev/null
-Start-v1_1a: ?
- ?
-
-V1_2_1: ?
- ?
-
-V1_2_2: 2003-09-26 17:00
- New data structure in SMDS.
-
-nadir_1_2_2: 2003-10-06 12:50
- Branch after V1_2_2. Developpement branch for user nadir
-
-merge_1_2_c__1_2_2: 2003-10-17 14:35
- Branch after V1_2_2. Branch to merge Salome 1.2c. Initiated by Paul Rascle.
-
-MergeV1_2c-1: 2003-10-19 13:49
- End of merge_1_2_c__1_2_2 branch. This branch is ready to be merge with the head.
-
-V1_3_0b1: 2003-11-12
- First pre-release of 1.3.0. Include the merge of 1.2c branch.
-
-nadir_update_MED_v1_3_0: 2003-11-17 10:22
- New branch for user nadir. Synchronization of API with MED 1.3.
-
-V1_3_0b2: 2003-11-18
- Second pre-release of 1.3.0. Synchronization of API with MED 1.3.
-
-V1_3_0: 2003-11-25 08:52
- Release 1.3.0.
-
-V1_3_1: 2004-01-05 14:28
- Release 1.3.1. Added Netgen.
-
-merge_1_2_d: 2003-01-20 11:25
- Branch to merge Release 1.2d of Salome Pro.
+++ /dev/null
-
-# -* Makefile *-
-#
-# Author : Patrick GOLDBRONN (CEA)
-# Date : 30/11/2001
-# $Header$
-#
-# source path
-top_srcdir=@top_srcdir@
-top_builddir=..
-srcdir=@srcdir@
-VPATH=.:@srcdir@
-
-SUBDIRS= salome
-
-@COMMENCE@
-
-docs:
- @@SETX@; for d in $(SUBDIRS); do \
- (cd $$d && $(MAKE) $@) || exit 1; \
- done
-clean:
- @@SETX@; for d in $(SUBDIRS); do \
- (cd $$d && $(MAKE) $@) || exit 1; \
- done
-
-distclean: clean
- @@SETX@; for d in $(SUBDIRS); do \
- (cd $$d && $(MAKE) $@) || exit 1; \
- done
-
-install:
- @@SETX@; for d in $(SUBDIRS); do \
- (cd $$d && $(MAKE) $@) || exit 1; \
- done
-
-uninstall:
- @@SETX@; for d in $(SUBDIRS); do \
- (cd $$d && $(MAKE) $@) || exit 1; \
- done
+++ /dev/null
-%!PS-Adobe-3.0
-%%BoundingBox: 0 0 595 842
-%%Creator: OpenOffice.org 1.0.2
-%%For: nadir
-%%CreationDate: Tue Dec 9 10:49:18 2003
-%%Title: Proc?dure de rajout de DATA dans le produit SalomePro
-%%LanguageLevel: 2
-%%DocumentData: Clean7Bit
-%%Pages: (atend)
-%%PageOrder: Ascend
-%%EndComments
-%%BeginProlog
-/ISO1252Encoding [
-/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
-/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
-/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
-/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef
-/space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quotesingle
-/parenleft /parenright /asterisk /plus /comma /hyphen /period /slash
-/zero /one /two /three /four /five /six /seven
-/eight /nine /colon /semicolon /less /equal /greater /question
-/at /A /B /C /D /E /F /G
-/H /I /J /K /L /M /N /O
-/P /Q /R /S /T /U /V /W
-/X /Y /Z /bracketleft /backslash /bracketright /asciicircum /underscore
-/grave /a /b /c /d /e /f /g
-/h /i /j /k /l /m /n /o
-/p /q /r /s /t /u /v /w
-/x /y /z /braceleft /bar /braceright /asciitilde /unused
-/Euro /unused /quotesinglbase /florin /quotedblbase /ellipsis /dagger /daggerdbl
-/circumflex /perthousand /Scaron /guilsinglleft /OE /unused /Zcaron /unused
-/unused /quoteleft /quoteright /quotedblleft /quotedblright /bullet /endash /emdash
-/tilde /trademark /scaron /guilsinglright /oe /unused /zcaron /Ydieresis
-/space /exclamdown /cent /sterling /currency /yen /brokenbar /section
-/dieresis /copyright /ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron
-/degree /plusminus /twosuperior /threesuperior /acute /mu /paragraph /periodcentered
-/cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf /threequarters /questiondown
-/Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla
-/Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis
-/Eth /Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply
-/Oslash /Ugrave /Uacute /Ucircumflex /Udieresis /Yacute /Thorn /germandbls
-/agrave /aacute /acircumflex /atilde /adieresis /aring /ae /ccedilla
-/egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis
-/eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide
-/oslash /ugrave /uacute /ucircumflex /udieresis /yacute /thorn /ydieresis] def
-
-/psp_definefont { exch dup findfont dup length dict begin { 1 index /FID ne
-{ def } { pop pop } ifelse } forall /Encoding 3 -1 roll def
-currentdict end exch pop definefont pop } def
-
-/pathdict dup 8 dict def load begin
-/rcmd { { currentfile 1 string readstring pop 0 get dup 32 gt { exit }
-{ pop } ifelse } loop dup 126 eq { pop exit } if 65 sub dup 16#3 and 1
-add exch dup 16#C and -2 bitshift 16#3 and 1 add exch 16#10 and 16#10
-eq 3 1 roll exch } def
-/rhex { dup 1 sub exch currentfile exch string readhexstring pop dup 0
-get dup 16#80 and 16#80 eq dup 3 1 roll { 16#7f and } if 2 index 0 3
--1 roll put 3 1 roll 0 0 1 5 -1 roll { 2 index exch get add 256 mul }
-for 256 div exch pop exch { neg } if } def
-/xcmd { rcmd exch rhex exch rhex exch 5 -1 roll add exch 4 -1 roll add
-1 index 1 index 5 -1 roll { moveto } { lineto } ifelse } def end
-/readpath { 0 0 pathdict begin { xcmd } loop end pop pop } def
-
-systemdict /languagelevel known not {
-/xshow { exch dup length 0 1 3 -1 roll 1 sub { dup 3 index exch get
-exch 2 index exch get 1 string dup 0 4 -1 roll put currentpoint 3 -1
-roll show moveto 0 rmoveto } for pop pop } def
-/rectangle { 4 -2 roll moveto 1 index 0 rlineto 0 exch rlineto neg 0
-rlineto closepath } def
-/rectfill { rectangle fill } def
-/rectstroke { rectangle stroke } def } if
-
-/psp_lzwfilter { currentfile /ASCII85Decode filter /LZWDecode filter } def
-/psp_ascii85filter { currentfile /ASCII85Decode filter } def
-/psp_lzwstring { psp_lzwfilter 1024 string readstring } def
-/psp_ascii85string { psp_ascii85filter 1024 string readstring } def
-/psp_imagedict {
-/psp_bitspercomponent { 3 eq { 1 }{ 8 } ifelse } def
-/psp_decodearray { [ [0 1 0 1 0 1] [0 255] [0 1] [0 255] ] exch get }
-def 7 dict dup
-/ImageType 1 put dup
-/Width 7 -1 roll put dup
-/Height 5 index put dup
-/BitsPerComponent 4 index psp_bitspercomponent put dup
-/Decode 5 -1 roll psp_decodearray put dup
-/ImageMatrix [1 0 0 1 0 0] dup 5 8 -1 roll put put dup
-/DataSource 4 -1 roll 1 eq { psp_lzwfilter } { psp_ascii85filter } ifelse put
-} def
-%%EndProlog
-%%Page: 0 0
-%%PageBoundingBox: 18 18 577 824
-%%BeginSetup
-%
-%%BeginFeature: *PageSize A4
-<</PageSize [595 842] /ImagingBBox null>> setpagedevice
-%%EndFeature
-%%EndSetup
-%%BeginPageSetup
-%
-gsave
-[0.24 0 0 -0.24 18 824] concat
-gsave
-%%EndPageSetup
-%%BeginResource: font NimbusMonL-Regu
-%!PS-AdobeFont-1.0: NimbusMonL-Regu 1.05
-%%CreationDate: Wed Dec 22 1999
-% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development
-% (URW)++,Copyright 1999 by (URW)++ Design & Development
-% See the file PUBLIC (Aladdin Free Public License) for license conditions.
-% As a special exception, permission is granted to include this font
-% program in a Postscript or PDF file that consists of a document that
-% contains text to be displayed or printed using this font, regardless
-% of the conditions or license applying to the document itself.
-12 dict begin
-/FontInfo 10 dict dup begin
-/version (1.05) readonly def
-/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the file PUBLIC (Aladdin Free Public License) for license conditions. As a special exception, permission is granted to include this font program in a Postscript or PDF file that consists of a document that contains text to be displayed or printed using this font, regardless of the conditions or license applying to the document itself.) readonly def
-/Copyright (Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development) readonly def
-/FullName (Nimbus Mono L Regular) readonly def
-/FamilyName (Nimbus Mono L) readonly def
-/Weight (Regular) readonly def
-/ItalicAngle 0.0 def
-/isFixedPitch false def
-/UnderlinePosition -100 def
-/UnderlineThickness 50 def
-end readonly def
-/FontName /NimbusMonL-Regu def
-/PaintType 0 def
-/WMode 0 def
-/FontBBox {-12 -237 650 811} readonly def
-/FontType 1 def
-/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def
-/Encoding StandardEncoding def
-/UniqueID 5020945 def
-currentdict end
-currentfile eexec
-E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942BF7D6DD84F1664B89
-699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED2AC419FF2B2BDE605B8EE3264EDD6641
-2D4F21C64AC522BDFC7C5502F9C3F3E5592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A2
-5032519D1868816E44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF
-9CDC7A1B1B598C69131DEE005B415805A16D8A123E6A2261C63C769D2F4B60FA2C438AD7D199D8E4
-5F7E7C9A605C8CA14E21FCD81C9A515FB8DB6F99604534D06EA9D87FE0FAA852899C9D0595C7A97E
-6C55F79FAC45CD38E87B10D210CE7501E88C8FCD3444354365FB893A12F596AE2C1E70D5819EE0D0
-87D10BF8DA96F3DABD5405D28C4228C6C31BA4052464859640933FEEFD8071C0C84CDD829A9B1D0B
-A01F25A4D50EE2EA2B45160CA6333B2D2800306ED2BEFDFE155E9D9F9342EB8D5B0ADBF2460CCC98
-643FB1287CCD28ABA7B5CAB92EC39EE2E918990372B16F8487EBA30EAE88708B6CF33B6C015D8096
-C7CFE2F139F52052E3925C0D50FD64CE68236D59CB83EF56BFC584150EC38065059F3308AD6F9A99
-F83EF4E6CB13855C8175E31417D190D036B387D3952344A950F4D8C7781B307A094DF1ECAEE4D2C2
-FD747BC6F7F9C6BD0E90C19294F96C8C5CFE88FB34C477574A1B1630B8CC591529E59B20794DA32E
-61DECDA8ABBD1AE956CF74012AA01D42EE01E861B0AA6897C864788AE59DEF43C493246FDB1ACA55
-4C12594BC7B33657A9ECC9E3D1472EF826073F632BE540C35FF6FB40566773F3BB2204D3A579A08C
-CBC844C14B18C350F003B9DA23A570C362D6003893CA32F86F59B829C78EE3188B6E3F7FA81D7F62
-2825C639638DFB78B7AF1F500F5B450FA54DBFA5CBA277C794ECE93275A3DE0B452FDC8DDC2993BA
-A42F28A636008CDCB03EBF71BDCAF35019778993443F88412AD2AD0D7155A3944606463266322DBC
-0244B07DA1E9C27A27B59664E8566D7A54CC03E995AAD008B0A17E2C3EF61F720CE7F7788599C4E4
-4C709CD5C31B11107F16AD70B17B9AFE2E8CD922A7428DAC171427FFAF51067307FAB0ADB530E701
-FD22DA22C4CD3064067BD4F6089C4B2C87937DD426E4E9D2F60E608288BAC9056554D04947E69200
-61E379CF5E81BFD32FD37EFAC1F61CEBEE551B0851516471A7472C60DF89DAA9EB1DC5A67E479745
-3E69B9E22BAF4E3CCA4192D603295B018C4AB69D18DE52DFDF15E96B557F290A4B8C5B1E7A6CACA8
-1F2351B97ADFC36995ABA43803A6E5AC04A3C93495F6D38106B8B144449C07D1358210F9176E1565
-72363CFBDE576BFDF99FA329DD1346E83F79E06CF68250CA57A68931BC7F342AD295D0CBA17AA95B
-B8EEB53EA6E8E660B814E9F857CECB14F44A43288B69A9E7908D55BF19E844359879D28CAEF1C38A
-36420185D20DFB32C2E002202800E8EF3D67C5D50E919657CA958B538D537D503444865331D79BFC
-40312068D72364503BD0CC84B5F30A74D8B5B6A26AF2DB764564FB65A6BA8F9051AE2B4EA458D46A
-4569F30C6E77DC097356770362E6CF3F1661074778EBB44FF7D1E3B64FF75E77E11FE525BB121C65
-46CFD13300CA1F02D571B82A5825E6226D14FDCF27F06D87452A8B6C5DCA658535CEE2A795E58137
-D48E566B69D53A0C3B766E84C51EAA221C46999CC8065ADB2F129D5B630FAB1814C0C33B5AEA0EFB
-B6E994D80941B53079AF96D90A0B924F9B0E319BED9836B8F9053F868363D3CA554CBB181863301F
-8CB940872ED5FA7BD18CE39218B5AD8AC57D0F752D941076B1C64D99BE0DB86D7A6D96510D772EB2
-4C587F11779BD21CFE5BDE1F29C1EF9022B2B8BCD7F91153C845906722477829C40111D810480F3C
-F62DE8DBA7FD86CD236E656618CAF6FC46827FBC4898EA7672F8C9971AFE43E0E01EC8B77D4AF48C
-BF1210E98C1DB15C16D149BFF58AB0270CF015B107A3A50F5DC8F37FFB92EEC8CB6778DDB7CE4AAB
-C464C4AFF654223006A550EB52485A23D2B4AA7198D3CD54418102F1E9A4FBDE37B841E56F5C2C53
-966DB9B66B000E4588282E3FB80C2C519339F0002D2F83C979EDC5827A3B3C8EF8810A0F9DACB6B9
-998E9AF6551F56313DC4011904CB979AA2D32B11A811BC248141E4B9734D9FB7982A5671002D8279
-CAB93ABE057474628DEFC95D43890DB1ED34CFA8A20BDC3D874E7679A396158E522ED0AB969A4E3E
-C7E4474E192590504D54DEB7B260B7935C4E56548A7D121AC1F741F8CDF259EA1B5813175A77A1D2
-D30BA26F65EB765A04C09ED51F69F41551ADF399E6AA2FC09788137BEA4913F17B8EB838C38FB272
-1FDCB55FD65697FF0B850E7D3D1CE266BF90F7EC06A9A0876BDFE767D3A918B092FC78C775F945CF
-1F96E859C03DBF630D9A940939654C3549D8F7921CB94EE23D5A0535DE9DF31EA0F937F860B4F220
-A99ADDFC343D7CF7BFA0B803C12C26403F0DCFFC8EA786D0D8A8D9C367419CA8AE41190CE93A8086
-583A1E6C9D70B612C84D87D2EEAA71EC2DC12F4CDE6A821303D5F6A9BBDB7EEDCD289E80FA3B75F4
-7F481B50719DCF4A142069393593B9AF9CCEEAEC56A35B8787193D7C88113E9E1E221D151E093B01
-9EF89F6118BEC4735103CC8003CC5AD1B6727B3226CD44C497DA7052DD681695DBEC3397F9598C91
-77701C73BF0594CE93F23D50EC5BEE2FB9DA1FC966DF148B27B28EE3C89526DD6625E2887F9FA076
-7C127C609EE315626BC14D274FBEA56528DC06A27B2D476D46E9E7916590B156A5DF04A6CB15E362
-45D77021767B6E5BDFCC679670263FD891446C3371B11BB6E1DF60F960AAB4149D7753E6A5C33810
-C42C8BFF4E935003388506F8278BD7CB672F132E065AE684DCA0B9064D01DD620E7FFDFE04F14277
-EFE8E60159BA0FCA3FE2F28B902D4AC275D19F0AC6971EBE827C4A232D87650D2688345BCA78F879
-077114F0463C5F058107B669566F8171E4E284D278405580F04BFFC9902784216E0C9A17AA9B2935
-E66E18A783F723BE044389B7E9D62AA36818FF2EA406C3C1A9D2F3436F3EE7DB8BE86AFA8DAA6A4B
-1B84611350D8D27605509612B515E16AA843164D5D0805E36A2B9EF74C5F6A0B9D59A04B55697123
-27F4B1B30E9587CD103337639967CBDC655AA46E80D2CFD24BEB50815B5338E522B3A7AFE8362AB4
-F05D8BC52BBA9C5089ADA8C89529B0275AF422EB540D31A938B8740860756325B966B36817115213
-FAAF92DE63F6BAE1E0064BFBC5588098B61EB83C71F1C2082436D37DAF1ACBE186FEDC4BE7C1233B
-6F18BEC5F99002D21CB7864E4811F7AB3C03003E1E4490AD1AC793BD28FCD5EF0E6CC30EF39A08C5
-2F71939B0CEF620DC69E31E39D6DB969049031B0C92EF2DB653D97F370141456A52985076B268652
-FA2648C792780BAD637C4D7581FB2D62011D57E293719487CF2D1F013CFAA532E1C2D39178D51272
-A6AF041440BCA174B5CC902BD7390C7D3695056CB4BD7791F9FB6D88E7A70DEF2C97869F5DBC5BD8
-23C517C7B7C39D624DF627DC9653EA5347BFDA80B723F05F6DBB4C9EA501D862ACE05B9DBDF21B70
-56FBCD8C6D4B85873DCEE6166C8B5ADC0316CA12D9639F361B15A42F00E1D62EDBCA1111972FA0F4
-5758BECB31DB38316F3CDFE1B41748C93ED58B67E9B57ABBED5924A6D53E99FBC9A994A6489A8BDF
-13EB685548B4DC6D62DA7426C22227D4D43B6FFC7B5EA91C896730253E8941AFEE588359C2BECF6F
-FC415B9EB6D31CCB0F6C7F85853E6449FA6D627A97A3CE8303F148393ADCCCDFA2FE085C6908BE5C
-3C05AF00A6F02840206C3253A559AC5C049BDDFD11AD9B118403B84DA10AE3C470CB9A9A2D1D7B73
-2F59F5FE146DEDA60AE750F551AAC934621B4470E1BC324C436303E25F81D0DC3188BE0D6FEC5414
-C20E4CB18952E12CB6423DF7124627ACDE145500D77A97A8BFD9CB50D1FAA008E2CE2B2505A4749F
-1EBBB092C347023714055A9B63353AF9E7FEE05BB54C9843698101F79888A91531773830C2C967B5
-88D3ACD2192883D5CE3962D51084FC653EAE2C5FB2DA41DACEFB5C76812D2EDB5B109677289CD199
-8D457FB1023A19AC67295BBC1A9A20A426B06A368DF3C5DD083CB1180D287F5500F2C635EDE157EE
-FCEEC5503447382D15C748C1E35F68753992E5C90F900DE54D18F8E1B355D1076ADFB1F3590135FA
-D1A36F028E44F48ABB149B80CA9A54614D467F8D71CB310BBC7AC7100261092DB8C5BFD39E0AC6BC
-2C9D6CBC3A8C05FF8A74CB21608EC4A4CFE4CBAA2D056DBA14206106044DECF59F957EF8A9CADE4C
-9B19D8D30DD4FDE6A9548E50DB51ACA73330142153FC36B69C1C8D5B26D0C689B7040E81AC2C864F
-D7C097C99BE5953843E172C97AB5684F35FB03A725A89DBF371F08DDF40A1531FC1B676DB0E1543A
-EC6E97D3D2E4AA3D5831D8B3C952ABBFA112352814FB6FAB61A0D680E6640F6AEC8426200CF61286
-F7422CB2F78C61EBAA36D47EC16D7FAF8B4AF31D090CDFA255D9D7C61D46CFB22A7D6E1758E71ED5
-67E00CBD8E8F468DDFB477F091A2F915627F22FF47B876544BC1F03B6BBB98385F009C20BB1AA2A7
-A78674692B8EAC2E3C8069B79E679338DA57F72976810F845BEB6B9ADD32B95D78E5E60F16DD1668
-9C05FD82D36A3115BE8ED494A74DD211D58A2CDF983FCB9CDC29BF7F0E29988FA23560EDF514BC1D
-183F3B2A22C09FB179B47E05ADEF48DF02F31C29875D1915037B19407764A4292FE44E741651A8E3
-BEB5F0D972B6327090F664417C84F84FFBF0AFFF8B1D85C822D90730AB4140C42A51AA8B1DBE4398
-4EA8566040EB8B341CCE23FD3F69DD235A080BA5C69AECB9BC732BC2D7D40617DDA6B79FB6EE40C3
-556C7DF9B23DAD89E94054B1345DB8402AE679FC4655A4A776C0150463F8DB2BFC0608EA1F124E22
-1DDAE6026B5E5D007A7E4A0D6B3B0CF3A2669E67C5E4F01551966A7BC48F2F4B6A87E740D8095E63
-F77C7A027F26B52F2299DE5B8A2F6209BCF3D31CB0235F998F781E5CC81E31DC424E008D46EC0920
-2951E5684804A0592EA47D6C788A20487BEA2EC8F2E6C1D7F378B62DB43CA43C4B366F8B4319631C
-FE9854F0E10321CFA3B01C873584863BBEFC23C72C05E695B56E8A52E89AA2DAB543834D34DCAC5F
-ED08DC51825C5257AE59850D101D84F4CAA1D29FC932F9E0EFFBF7A9A7F3685F61F0490CD3CC8988
-2DB52A757A6AF4C4E67B407BD2316B1C0FFE7DC54E43C87B874F57E4903334E2140B011484863CDC
-ACA331175F2CF3D72E0042855983AAF8853D3015E870FF0807014C31D55060DF3FE1FCE157324481
-2744AB51322444632F9AFDA6706E320FFE82B8CBE242A19DF00CE73EE48E25FF49D5871BD3E60652
-298FE3E8D400609E232E0DDC794C0579ACEF89E841B2EDCA50D51151F65E8C1CC3B01EF1870558F0
-BF5743718C3E068617E81BFE120C6CA16E0924BFC2541177D53671CAA3AB641C41557DCDAE1A3461
-47B5E999C4541B08B4AFCBC187AFD653D5B5F8386DF6AD8FE69E21BD0567DF494F736C6A184FA4DE
-48DC9F347787CA96E2E00A296C2DA05C2AD9BC423E9CA428D7F1FA12DC9353A302FB8C529AF8688C
-BB543B45B2717EBF8F6C497935F4F3BFFD285E0402AB7544B3CA4643AE5A8B5250ED987A95FC1F27
-5B9707ACD0641BD0EE2AE9758494F8D8A51DCE408A38AC20EAF0852D72D84D0C6BE973326793AEB9
-55EAC6FE0A2813A355DCD22F6F2CE56588D1C055CDDFA98878BCEB6A018DB22922D2B600A20F8184
-2E665DF41013CA0947C4237C2BD60A75E2FD1A3FB8C8FA19485730B87461AD466ACB02DF8CA24091
-4FB090B3D2B41EB6B8FF05E1A59D9FD668AF70BA5BB72778953BA55FC5F9F626043450E1D09BC83D
-8605098ABEF884639A37809A32565CBEFB3FF39EE53D6C18C58C272BB928E4410E361E59A50F242D
-69747A032617C52DEBBF62364AB5A96EFAF642D9D82BA679B1D70FAC10A4EB62FA5CFC308E86368A
-AAD7E75948F43598CD1C544A0D4091374D7E88D4522CBE902391641327E888E7748FA889DCE67ADE
-61699E7D77763681CAEE9B1CA8837B2F7EF9C18CBCC538C465C8E2DD34616953CCB6030A222C728B
-834911C1A179E2C770289407AB28B303E724D97F747D6134B425216A64C6E0B60F633E2B85300047
-E4C90339CE030A0FAE31E830C8ABA5AB3386A3B69267351A7BFDD66356AE5E57FB2994452993E90D
-E7C4E260ABAB93C37831856A650D56E44172FECA01D6C7C380F250B82473960D2A2A5FB6B4DA668F
-46E624ACF7FA0FD4490F485D640A3ADFC9F8652E7A38CE5799F770C3606DB4B8B947F93967F779E3
-A3C0572F13A5A187D31D7BD12A5C7BE23CB6ED6192086241B76C5BA6983DB9C93E4B208D707D3760
-F03CD6272EF3A4CE89B8E52E6AC5871A3D03EB975759AB4BE239E5EC7842CBB333E692CC607C722E
-185D3C39164DD320C6945629C70FF66A5237C0A9520A1FAD6EB9816069351AB0F135D90CC0982B14
-7D2294AE4A38A527EE40BE9CDE2512AAEBB590E134388BB171D0956A7C4566D65A9A041BE6C4F883
-6B3EC3D2ED1B48B566A783292B15B6127920D247D494F070BB20BEFF60640B11B276DDEEE49706E8
-B2B21BB40B7F00AAFC594C492C25DCA774E0B80D82E927448DE2E74A9D0DC7AC9260096EAF187B6C
-D6AEAA6D1DC4205B4411122751A5B22688404EA7C5861730371FFAC10F5AFD4727A0E402AB5EA757
-606B75EB86A05E8F774D6E430A1A3FE2A37EBB06700474239FB1CFA05EE44B91B82244C575B52E7F
-AF934B04EEB0D933FEB57EBE326D75821C8B23EAA85B583AED4320B7F04B9F2DC591091216FDE52E
-064BAAA9C2C9D9714B95A4558C21F3CEBE624B5403B31508F178581AF6863083ED762F1E2E34A45C
-FDD71660D626FF8648F5D6C5E580D4765A67FB6159EC8077A9F0A88038C8D3D7C77FF0926E2123BE
-874F7BCAF129D55A5B5960F824BD1728ABCFCC51D23936DE9A25C408D786E44C3A2BAFA4423177AD
-060D21D38E15E23EB6FFC0B4120E814695D423EEFC2744A1FC81B4DF89D76F0A6803D8B14E75538C
-AAD03A72517B86514F6952F6FD619D9E910D980F00964DB325318C045BDF79647F453D4A5CF4E61D
-D5359782827229310405FBCF6107C3AD9DDEF9A9A339D5D5A6EB2E7838A0A43221BD62CBDF732DB0
-A638A52016FB35BA7761AEC846A023D3BF2D1BB183543E81EB7CAC1E5970CDC6F068C5EA118C7AAE
-528D1396E6DC939112DA4460C890EAD5C01BDC438F5BB734218BA6270ADD0DC1778FD8AB16831D6A
-302B814A1A44B07EDC65956C9E6CF4875DF521F3CE5B422F71081B6D69BD270F739095C9E81C0377
-934A8BC6390C420C4E4CDD9CF7E32544C68D884E15ACA3BCC07FC8C132D8FB9D752C15D75C52C288
-57E2EA461A6FCAD90C56843513F74461F18D7164BC597A28AE4BA7C86EE1703535A9B9ED50122627
-71FC12F102E800E0E1AF7BB46681BD2B14B614CEA91B7B2AAA35235DE76C0E113C92688F8EC81277
-D58C3406778E1EC1CC15F1CD9A137C8FFDAAB99ACE3BFC782916F1A877170589A92DC921E6740A22
-B84DC6BACDABCC76E64C79E3A588D80F8F4D376E1B426F15751CF7391102102F0AFAFD8B22DFDEB5
-48AEB5F30B1673023D22054A13391A0EC08DE6E7B685A0D031AABF20B7C62187C0284892D5EAADF1
-21BA28263EB863D5E36EA9C06A77CCFC0E17F593961591F84D82AF823EFE41044C8D606FEF83CCC7
-B0E961E7994DF8A3CC36B209D953E250ADAB8D22D7F2B4E2C9CA39EFA2D93E56195C1560E30A5190
-CC5B17FAEFCF250DF79F6B624A4B917E11C332222FCCFEC4F6A47BD9E75DA9854FC3F7AE554E91ED
-DE144D7AEF38A0E3EDB5E5A5626374DB94F022C8CF549093041DE00D7269B7CE544E748439BA2870
-718C08E58FB4A77D93EBC04B7957D272AE1601D41BF85A2BADAA0DF73B0D3841D4839C85677FB2E1
-5F1D6CE592669FF4BBC9C69DBA334DC37706F2F6BE83D5863E8CD6A30C08640AAC4C233684E66B4F
-E6B62D4A8BE9D531E47BEF5640D9B5C27D990092BE1597F6995C8A77BE9C18AAE6C1CF130775DDAC
-41D34438FC7AD8E042CB56CBF2944932EBA7D053E9376FF398367450E35A1945FE23E05C921096A1
-5454721FFD0F429A3E06DC3ED36F1C170BE79C66996EF8337AFF85B90C5D3A4A94455AE9FA32E211
-7A63E59001F052D5F6223125BFAFA40901E98960ADF7BB886729DCA82FC3B8CC52B37FF2517299E1
-D769057F8154FB95582F02CB0BECC873A9C71796ADBD3E91324FAA94F2C41CF57C30B5897D031C02
-D256C909E080E70BFD1F32E69EF67031138C2DDCD1A8E4B65E485C23C3E450ABDD9815512D6F34A8
-4B9DB715DB2C7A93BFB424316E1AA44397749CB01088428F149A3B4324737ED9957FD388248462AC
-1B2610D72BF5C073ECA567E7385CC959E37CAC7E05470160FFA5A9F63B8E9B082937E911586EA165
-374938F492EDF28CE6020953A5B5CCEC7737F9D9CC8538C4339567AAED3794ABA3B9F4EAE65466E8
-E326F6C399B36355935FBDCB9972F10B13494DC25097FCEC5A6398F275C8C151558E74C5175F7BAF
-4155E36B733F75CF9D5C5979B0764F14D8306E06BA24BF791141E404C69F3F8FCCD91B9C58C2C671
-AAE7D4F9E5D6414E46ED633A5F78AA5BF04E652246A066EAD9E582B181CC196EA2D3CFAA383B5D0E
-4CAC9336E119C08CC6AC55CBFBAE147C623B400453BBF447E96DE036FC025624384359EED7C7D5F7
-858DC0521377CF647A157FC3F188DE5EEF094DBA125510FDE34C570D7BE76AB5DF0A28BF45DDAADB
-EA7EEEDB936332DFE93081E0AFD3FDD46BED08D6914B2EFCFDC41662A33B90B03D76D34F48D30FC6
-BBBB600E90E6AC7243FDF026762A44B4D6E4ECBEF48C9D7B696AF29EEE063E557D8FCF0F09E0136F
-45D17E608DA36E59F2AECF8493F8D62536119B5F7E1554DFE3F6E8D7C9A2C6F557D18B4AF92C9F6E
-050975C3B5C54F9B5F4E39D600B6FA2CD6DE203A174028CBB2A201AF126D1013C229BB82CFD013ED
-199D01E51EE2780FE896E01C63C655087A3E61A7F1029FA5E97EA1872F1B45F22282DDC317E17926
-7368CB52DA9444F6055A3C653659CAD2A1D8712BC2B1B32C1DC6906D957FB88524EE066156ED6BDE
-B8D832F9338F9912E29A250A8C4674E667C1C278B677AEC9972BE83CBA3FB779893FCB8F81A323AC
-91474BA2A2334A07BB5628E905C518E634F6761A3289056F83D5DD7B3890987EEE1C18FB2D379CC1
-905F1AEB3B3D2AD578F0D6C845D2D40C4BCEE3F71C90E68E5417BB8CDDD878D83BA80AD8485F4067
-E5C3CABF28AB56CBB219C0AAB8FFC6C7E192BEC8CBCA1459AE4450AFCC81B9548F40CE2622E5A7C2
-81F74DCC02DAD57EFD92D072318DDF05BF42F1EA8163071E23949B0179CF7DE64677CA99B23CB926
-B3E294194EC13397EA1DC9A5E1CDCD828156CD71F81B64167D4FB01E6002713BD8AC6F82B20CD369
-9C6CA4704DC5C65A2D66EB155B7AF1C9BB46469416FB49C1C7E17A30A5F045271D7DF3FFF2F42C6B
-470701C381E3456A500C6BB3D0E47B4D91C5F34B49BB6272F1F8698B307D89EDA3A1565DAD1C0864
-627560CF922DCF5B34C67860352390B282F95394AA2CDE0E97CE3ED39546A6AF1C52BFCF81A29BE8
-2C47C99E8050E4889E4575B75F39E662F2DB7420673797E2ED3D67CDA7AE2C15D0A0A794D57D168E
-BE13214E89E0209AB2C0EB7784E9491AEFA3C02D0DF3AE5365A0FC4AE023CAB528162C7A1B173664
-9DFADDACA8DA5FA18B7D6489E4229E9E24D38A620464A744A5C60F6F9D334B908706B738AED18669
-8A8B278341FA4D65A0A88680BA484694921512F7DE93337FC1C02BBE6E64AF2DAD07603279D87329
-1D1F4D39C1DD6D89C90F65240F4808F6F1115CA55B88E242565E59F3BBF1F10EC7B88872E9AE61D4
-4CAE185463EDFAF7DF63DE4D2207D307AFB61501892965170D2945846FCF5973A1D458607F50C15E
-06E5BEC715E0C156259AAA6C735593E5564F65F443B78CC7512EC35A56F126DF9D30974A40872E42
-65E1AE5FD483CFCBBBA26DEE426CDC4721F19C3FDA86ED7AD4FA1120F63669BEFE7002B128CEAFD8
-C63E8AC09943B6CBDFB3D2476A026C00A8FF81B1F651B97F310C82ABA5F388CC1DB5AFCFF5996D52
-52A6A42FA4D972E41EE56088F78CB966F9051171C472C774879AECFFF08BFD9CEA40D7C298922ACE
-64F28C14E0B81F4DCADE81D71DE3983D87D905192EF13CEE71B2D3FF1A88AEC671EC318917DF98A3
-C9054E372D22A3CEC82FCC217F47319A40900312F6E32B536B9E7A7FA0837EC65CCDB5FB0D414371
-17596CB39D9382262DE6E65379D3A9709B2CFBABF5FC5D5B352425F06F88CD31012A2A4147B112F0
-C1C0ACCC808CD625E0228EEF66661F70AF96D3DCFECD402700E4F6522AC9A856DA466D55C84F65BE
-2810A1565163872D62EB81333A698ED7B68352CACCA2D7AD38AB55C19E4F5582F75818302F5FDADF
-1DCED09D94872F2D48FB636C8E38C7563C72C771A08C6B1F041F3532BDB39006C89A33C09BE1E3E6
-03622D891F98010BF1DE5355F557A1E09448D486ADEF565705277B31B8BF2B86761E32631E3435B6
-88B79D566F1747BA456DDB43CD239FB47FF7B425EAA4C657C8EEC26EE01AED07CF916E77D53634C1
-37AEEA009C6B515B6342C54BE2C7B95955B1A9DA277A0ABCDA2346E88018C726F481F71D6011AA42
-F8852F2E5749518FE3B3AB668213FE1A05C10A1C53953D75312631D6BBBA01D418199DFEFF8CF548
-6109B099FE8E2F606165FE30F532C03567785D5362AA873C9D3EECEB20F1945D55F49B0CCAC84967
-59FCC7292E46938943C262D78F3212D3F9D0F7B103157F423D71B1ED54B2A603F4C269029918F238
-EC6828FFCEC66009DB9C9E59534EABB183F31D7AD4C57B1BDF0BD2CE5A421882BC10CC1BCE6A970E
-2B586BB221567CCA483989DD0B8DEC424C1D1FF042DCB7834423CF244EDA28D2D969B17440CAEAF0
-24A6119DB010CE366821AFA424D1B8299609C04148275AE6E5257A7ACB3C766C747CE99CBA2D703C
-F19B7CF301B634D8B613DDC4AFE4633A4D77BFF8E00CFB5E289EBBCAC90A24307E7941EC1685CBAE
-400CADD876FCEF7F6557EEE167D2035A05120293527700DC510B038A496BE1D5CBAEF24ED39F7421
-1A93AADF22214ED606A80582485AFE358E3A46D0671148998A3B3BE209467009B43400870359D418
-9A8CEB4D5866AB52D16D9CEB1EAB71C07E6CAA34B70E3096BF7604C22C40D5FBFEEA616DA3BABD59
-DCDB97D883FC8742B8267A16A99B7953225F7144568D566E64542C92E538AC140C851E5D295528EB
-7CBB49909B1CAF6409C9BCCEB325468FA0B5F7CB2987382616B477CCFE4F4AC79E4A6F7165363543
-F04DE5B6F6E1C2E910CDC3CDD6C4C92737198F892337DCB6647BD226C820AC99C65D8E7772BBB74F
-E65DCAA8A22C33BC168BF48E40A82700A3A7668C5A9A71E397ACDFEE7D556C5C19467B7AA69C260B
-727407AC837BDB7D67DEC055C1F45D8BAC61048C45BC9FB3CEFE7549EAA2992D2EDC126FF7A05EAE
-58613332A2BC1465B2BC0429162B907D65F793D236EDDD8D35405866D71B25F62DC4A7E06D4DEE82
-840ACCAABC0774F8A63E9C0F7FC980B3583E7A8B01C46590E3BC04EBA565C2EA94F057D964A78A90
-EA9F52ABFD70F84E44E434BD10A42E98C794065724341F907E35D3CB257161E01C7084E3A0166D15
-CED65DA7BA87DBB2EA33D39BD99AFB93D3548358D08330E807F8552CECF63C84F805205491BA3A1A
-622E70C232FADF3BF2DCFD6F0539158D3306506F150B0518371912A25EB96163D73E9EEED42EDC84
-D688BC7F7708D9DCA348FAB4DF62E5809BD094842D0A31DBB7C4B41F94D946810C5EC10B69AABC2C
-91A59500B2E5D37F4755DDFB7AE4ABF757F4C5BCF77C7F95E6A616646456FE8F18407080BCABBFA5
-7704287AD26222DF91AB2613951E2D679472F8ADF06EA2A20205EC19972299A78BAC52114334470C
-5F5890C2F846B4C6042D73945127F2E3910ECA1C4CD7A16EFE4B4BE38A15AAA710682C3836A8CA83
-FD384970139D8B46FB0AEBB002DD224199672FFA02250FBCFA4E649E335428FC71F50F45E498419E
-DB0E970F46894A48F65580881C9C4250FCEF65C9B28699408E18B26FE6DB7F1CBDB767564E73CB59
-54C6D639CE33220C894F36E70F71C9F9AA3FE2AE0AA0E3F2E304EC5ABC661675CDE2E70519E4220A
-E26FBACBD01D5169EB844750753E6CED53E3678FDCD08AB93E10067E9C64F38B40B76D99B6CD92BD
-F4155A1EA5CC824998B59AAD06E09E5F15EBB2288D66EA71B296616734FEF2796F07FF0D8B047074
-A1111D68B99C2B70FC56E74A51B062F4998ACC85B1943C9477E436E5CD7AB18DBC898D21BB93475A
-623BDDA71D7B895BA2D4C10F4B90BF335126F4FD57D73AFA50170F6B3C364922E551D40E35DA75FA
-891762FA23401D39260F2E92C7807C746F13BB35CEF9DBF2E76E66A72FEFF095DA482A4DE8A42091
-7065736CF4DE904FB52E649A32255E2030A7B31B686353492F31C064A3C4B0448C4BFD44B8E15384
-FD809B8761EE26A7DFA1758D57CE4F0BC376EB2B3833534B15A83436BA553955ACB5A7A66796AC5B
-92DB5388BC53EFA27508B08E82821E5CF669BCE52BB860780F749B4F38ACDF5FF12726BF3EC2743F
-01014CDE96FE6B4C40A034E9EAFCA2A35CCC776C2669E6AD138070A40F48ED79136D7FF57E993E09
-B81C543FBADD350FF5B5F7A46F060F88E30FE2D8233832D18B6C323EE017EBC1DF5C838321CDC8A8
-4CABCAB20B60A1A3AA028F36EA6E87C850AF8AF7CD50AA6359038BFA8818821D02CEE8F51DAB8C05
-F7AE9797814D97F3DB8CCDDE45B21DBB15CEE292FAA534A5F317B357F4091F3DA357325B8B9F5EDB
-45865415973C143E5E5BAA483FBF2D06CDD4246675EC58B84C6AE65CA743117FF00F229243772561
-31A7F2BA26A9115AFD96C18216CFDF41B7220ED0CB3FCC26C36380007B382A02AEAE428887DC8BE5
-FDD630AC57EE3DC156C7B8B29E687F24442E35CE10BA4087295A641F7139C831F7CCDA6CCEB5DAFE
-537CC1A97C5A337D3C48A6AE947F58A30DC08CC7B58DBBB4737AD52783C573FC1E9408F55495A80E
-7FDA61F0B9C4F090158F1A416249EBBA936C27BEFDEF19D1BFB839EB70576A010706D8B95657B218
-9C2AE04C11EF9E57FE09880273761FB4302C388BD608FA0C7F00F033C9C00F4E3D5CE2D903E0DA52
-E69C7745EE9FA75E2AD93DC6CB5CCFCD3782A699B807AFC36AD1F62B05856D5DFD6F88831B90EB3D
-CD523582A49732E3FD7253126D39E8AFB8458B5F7AD7F94A8DAC13365F433C857AF4A42C0A08C4DB
-9887C4957259ED22D13CFDF5995DA957EA5A0F620B0214FBFE08AB6D552DBF048D62CEF6EFF12F15
-3511ECA7833E0E3E95F85E6AC0F95438AC4C126E1F1ECF336ED31CCA7EB216D279877123FD9FCD8F
-B5E52B587CFFC4428456DDCA816819A8A4A211D8F1629E5D42BA4C5C356E580C8A22C61D987552FA
-A97893816DA73D423686E4EBD44375C257F031318865A20F22115E72BF1EB9F93AAA169C140A33A0
-6C35BD4526A38BE79CF40AD1EFA10411E8F3300A8A8B97AB140EE6734E1BEE6C8EE443D698D34159
-97649C6F10F20ACD80236422E215E146D744A262DA3FC88DC0D86FF66512F49D3F957D3C5CFFEB42
-4823509F33F155057A4C6F37B52F4667767BA94F6B8B62856B553F307E5D230C44CBFDC9A97A45B1
-39FFB2F2565EB0E22026972FAD0FB7B9576FB6F368B61979943A398773600E7EE1DFEFBF26D45D40
-BDA66EBB96A56EE9CAE0B2420C5DD83E24DBA9FF885BB844BF3D2BF93B07325DFF60C0CB5FDCCA0A
-C8FB5A2E119D5AF26E53AB8E3B428481C2871DDA26EF0B621CD8572B3C664BC7AAC01A1D05B98F79
-1A7080D294BE81099BDA7982432F3DFF4775C44D23F4F1B2E0162B61A8B2CB5EE8564BF98E2ED403
-2219085FE6194C19DAC98A421826CAED7F1AB1477AB327506010217283894235D7DBFC1153D5ECC4
-8AA7293F19592B4D7E95FE55151889BCD1D7FA7DC2370D2DFE11D7E4EA34B5C7A8E73BD3A348FD38
-9EF45B6167FB90BA44C23E912F9A4F2FC0427ED070592F7110183BFDB2C400393BA7569058227926
-351F07FED4F33633BA03A72AA2DC6B598E49B96021DD868DAD0F352E5722FB714F667C15C68D49C0
-3D822D82677EDFE86FE9668E537DA284068C9B0AED83074C92A5B939296D505B837E6A9DDAB1AEAB
-7455A08A114C2222B339284674B74BF4CA9EE0C020BF2A148B439C71C6BE51A94CB64FBE4A7EB295
-5A455047CF5CB348B062ED4F6471CBC3E9ADD9BE9B96879AC7BC71BCE02FD02F17C6063985A5E898
-3D205AA1489DA13C408990ABA1C54F2F501AA172F530480D789C848118C0A74EF98D5F607A067BAF
-F6030D887AC6A6497F9A0B38F9705F328AAD4BFBB634F739386177B07F22D5771282444E5EE17335
-B4D0EC86117C697E79A5F4F65FDC08E4904DAEDAB20067EAE2448FD4301849E456D085F392DD1316
-7ADF75CCFDB723E2904A9C0C976D6B84DDEF9D92B0E15FB246C3ECC2D0BF314CFB957757B3A3E8E5
-801F520644E4601D291DA0F7507C06F3B9BB36FC1C70EAA444E14E56C0CFF06C7F853DF36DA9D8B6
-AF2544B853DFFF535A7E5C6FC145250CDDA229956019659D0D253A19A7B51A4E538BDC01F74D7704
-9949C2C97C7EC6392C2E61CCC0992B66DAF1AB08551063E53180D2A67DE496716CCBAA45462D9F91
-B66A22545962DDAB120511FF08627131B95E5DEEB8B4DD9643E7B2AF65C0FDCE11F5F1E8DD468DA1
-8D41C8C4F00EA73836F4F70EC50FC3EC6D358C0658A4261C6D15A582A2C7C994E7882E661855B352
-014576858A265FFBC425160669CE159D07EDAC04D060B44E5800A7AAE8E339C29B929AA81D2F515C
-46229D2080D5917AB20AB6B34FDCA8E4AF64ED660A3173786FB1A1D005D575C2A5187D3F7CFDC94C
-CC44A38C5CD523E9DA726D8EFA6DA7B6131DFF3435FEE838B2C7D6B97934295F06202D307FF78D90
-6699CB9C5BBB10D1D4DEA5FDA5BFB094E704607083B646D37F5DA1FC7AD21B813F44D8C1AFEAB666
-55AAA19703BEA2E77DF3BF350E17C74B3447A452235919452B5175570A006C7680AC05E8950A62E1
-1D7E3ACA35A397D1E19630D094A86807593C97F4C484E4E06BCFF708B6DCA972E3A0009E1CAC0EA4
-141530F5C1B8AEF5E1B933F37FDDBC4BE22B74FE346D1A3F5FEC0818F8E61765568A2AC04713E828
-F98C449D9A1CCE52D10D61DD8BFD084C8D099A75D89DEA64D5A7CC68BD5B0593D97953DADA976383
-F5015915618AEC56D71D1DCD55B89736395C609B315A3F1E1255432FDBD37F38CC43C354FB4B7C44
-F1A7318B0B7E99C3C08C33B953727B6A6328051783A0A33E3CD9E498346A3CA6A77B517096EDD52A
-E443B87643A646C3A7BB97F742888D33F9B3127E61942F4103C1DBDCD8EAC8F9E259773066736CA6
-53CE57E8822651261D847C131321BB9D6626A1AC50D047C0BA47B411DF2A995545BD68EC0287CC9B
-31D5DDCA8755EBEB10ACCB3903AB0FD5788E984220443B8459E7C078DA4289F1350905881AD6DFDE
-C47302B0ACB0D4AF8CAED02B4B70DF3CF8FEC118F0FC2D3DDE3E494CD160E676E300BC464BD4400D
-B50EE43B314E0517037BF971ACD7CD327CB2134893B8A0410E68DDC518F5DEC966C7884CF5FDFE74
-723177F20DEDC039D879056CAAB4BF045062D3904F615C5CFE109AC7A35599C94024B41019B9AFD4
-04A80ACAA4837929F5C9317680A13D157A03B59A5588DF79D2E113F5F51021D6F6F90E8BBBA2C252
-FD10651BE80BAFD59C53A3367BA3C28DB6EB9DABF1EA99F47B503F627E15DCF3FD645FC52C5D5D0F
-2F07DB4C25C0D1E1C00146E1C4D973E613CCDBD3F9450CC0F5343D79F05E9492E86A1BB889ADF405
-03BD7F3E7543436859184A5B20BD8A172F350D846B7570803990ADAA48D4B9155A2B4C4BFBEF1E1A
-065C08E03928559735BDD442FF1E83E1FA20A5DA57D8BDB2FF5427C034CF0128AF111E6E73099E04
-6E0C240E80A73D7BE72B87834E45898D475521CA3306707631F5C6136199F354632D1A085F12A1C7
-C473868B62E534D15F5484323E63D0574196A19EF175214EB35A90873EFCFB92D6CF68761D45E37E
-AA61E1A1979A82009507CA193E44B36A806486665CEDBCF387053ACEAB979BD35D30978FC7659ABB
-E844F4ECAB3303318ECE80777A5FA5A9DD91B3D06804C4B4E9B4EFCF07EB89866D0DD8CA390CFD15
-98651417114D78776B1A1D36B4BA17746D6BE7FC123D473EF1EFED1C3BC1D555F914536869FD5B0C
-35F9C83F65B0E6BF7A627B9202D787D72C600DDB6BCCE613D88492E13CA0AAAB196E8A49928C62CE
-A4FFE2D0208EDA334ACF47F20BD793124D2C5546C03F4A364369A76A0425262F9D9118AF54E37D32
-E33AB25DD533A49DF5FBF1BAF4CEAC2D9D378CDCD13B00FDA432D9042F623DA41AFB80699B5538A2
-5403B0B3EABEC9E8EFCF42FEF3EA9F91766902CD206B0787C187D5370B60AD6DCD002DE2DE8DCDC0
-B4719A797C5E26BAA67665016DA0D967FA1346F9588AEDA174CA001B31213617FE19EA218EC23597
-79D979E2663166489C06993230B0D07973A117C4E3F4A4C93CF8428248DD5389414D679C69644142
-67C7FEA17E35B0CEE456667A9B1875C81B2302BDDEA2818D6019FC1622A82051F60584ABC904CD91
-8676305DC03FFBCC64FDDAC8D8AA9CE2EA00D6C97BC63C8A617DEDFC0E40775649438E9F61AFD179
-5E3B20560B01BE5E0983F136CF48AB206954E41DEE0D9DDD953DFD01CAEB569151D6BC0DFEF29D70
-FAE3E198E7EDD8922C0E0BCB8BCCF1C016142C1A8B337AFA7A05A9D7534B184BF3BF827F371E9BD1
-9A71244ECA1BA73D484CD2FAD54DB2F0EEFBD54B536EBCB5094E6BC2F5B2AAE41F05B4B311115876
-ED42C34F8E643B53372E3F6350DB8A38445822EA9A33E27FB0CC42CEDCD1FE2FDF723FC47C996EE3
-56C402112F24D0AF899B2D00BEA1CFD427998BD22B2A09046D6737814448ACFB10D387547D7009FB
-384AF0562C85694C071584236D0F1F3D3FCD0CFB38B77C81889061E668BA7AB37AA60F58A3967DE2
-6F939B79CBF10A9DCC42852561D8D6754F1B660D216AAB1E133FBAA321C56E2584BE5C9BAE20CCF0
-0E8DBE6D9C2FCEBEBAD945C3C04101D2387351F132628786F6D9D4CAB83419288D31F9BC600D9664
-12E6AA457CE6CAD26A4C0671097B98C2384C81DD8B9A3222D4F4BBDA7017895C3EDC26662779AEE7
-40D9D7E24185FB821970B0A3A94041A69E4805EC88EE1EE521981536F2844FB8F5EF645F67D42CE5
-148E2DDE43AD5AEF200EDB3A2C7866C98458A92666E5F9E070178BCC39F65A893102A10564AF4E8C
-AAA5075D2F8CD7FAB0401C03AF299EA3515CC93066744EB5AF7CF0ED06675BF049A6E3C211A89E16
-DE5BF0445A7CCA6EE8EB0347454950485D884606651E5887FE8B24323E2AA16DE22FC1FC8C4F06A8
-2A1FDE5758976024068197E1F4506E4D3D8A16D40461A4586338B374A592DC60334402F76388AD6A
-457DC3F54E6169CF7AE3959676E966A45609621055EC3AF80E182633300A4418E34A66DDFA6B569E
-5A13C9115B5FD3EC1CEBE50FBA247F60803AA83976F00117536342DC3D9890C49B2AC701D370E43A
-955118967827760F7091469C5406F08F18D7E3548148CF0E312B1DC71DF67A5E7A1656CF2F47F3AF
-F3DD50FFC2FCDAB7177285B29C17CA43019F62AC6FBA52D1493ED7C427526470ACC8389BAE827759
-4958908F517B2863B83292EB5AB3F57FFFB08393CA610FB1FE905D88A0A16AC395E2A2A6DD033D6A
-0D68992F830B2E1B95FE357BF672716E88FFB92FFC3D62945D1EAD22BC68C51EE0E10A43011DB94C
-44685A5C4576F6EF44CBFB45F2A4BF110A01657DB51FD499767E78058199B31DFD60813F1A344F86
-289F9378231D5B151C92385E3650B4FEB1DC91018EAB8474CBF69FDC1496A4D078D2C351C8196451
-247A9DCF8117E5B637371D8E22E248C64D999015C3FD2311E9950B8EE0922FBDD3D7BFF766BFE9E7
-CE0BE12F318FF2A7B5A9C6D00A54401609304ED2C55F5C1EAC3D4B38355BBD85D66D61636FA6E30C
-2E82829376BEC979A6FEEE040E452359768ECF90CC539A546F17AE906C76F14F86FF697797322B05
-1EB311A759FE260C1EEE5DACF383816AAF1294CFFA7BF87A4D9BC595EE8F2C2F86FEEE11AD959D86
-F22FDAF4CEC098942A57E57813A0FA99239E994FFF353C1E781D666B8928CFC648FCF0869FC68468
-BDBDA7D280DFAB8B0B3A4CA35B074B686DE8D372C61FB32305169A1A9912F6541DA16CD6316A6EA4
-51524757BE5CF6E820011BE3859FB8B8578C100FF029680E05F0E0BF11D33FE19460C85EA5E4C0EF
-28E29407C8AE6BE01CFA0D5022BF9FB01416FFF722A784DFC8FCE330EC95737A854471D334FDC58F
-AB42867A7B62836A8B56466E9A6C1247D46EBAFFB905CD4321970F59FB8D6FF65FDDD34BF913AD32
-2E68455C5FF2D23C1A5EAE687F259BC982B6A384D35440F7C693CF50B9ECAC0B5578CAEE87588B56
-2EB6B7F42034C9F2E545EC866316552354EB3728C7D26527ED75174EAF635E048B08DC5D23E88981
-070AD5641A652F2344956E9CF4C16E652A99F4A644D1787D6D36537489DA4D74E61B2FC4DFDF1D1D
-9D58F9C26C5EB63200526AFD168AC57D5611ADE4D4A382FC28BB60F9E7D626A6C67AFBCCD1183C5E
-3CF2EF210D0BF5CFA7BB10FA3887BDD4CD96EEEAA8F9219AA2F10ABC0A960C3B57C0EC0313AE10CC
-FF1F522124CFC8D2D49BFBB0C193EAFFC5B48FB3FF30B21CB76F0A4C0F1377C9223145BB0468A5D7
-1B9BC25873EA12E1C60334571C67385C00D0B570D3FFC6C7FF0DE62C183C76AEEB12DFFEE1459E0F
-C818C621B8D12FA1357E2B55D48935D70BF140B4CFFE8813DEFD479350B20DC2EB1D3CBB1A2D3DC6
-EE975D58C89D61FC50E6A0197DA9A586B72255023DE47DABEFB11E8AA02414C2FF6258A281219B9D
-DDFE41BA7D7977D0D6F18224FE22F7D4E9355FDB35BF7ED3418F4F68D093AC48F7D8FE4194FEB6C8
-0B9DC1F74E023C604DEA27089F98C3973FF9F4AD7BF7BAE601DB89B08D5D8139B95EDCF6C885FFA8
-B3E4B0477E7040225733826BACFD1EC4A0DD72DC41734856AB9FB700DF83CA2CE812913BD142D84C
-5C83C0B2583768198AF9E885F2BA74877A414233207234AA5F18840557CA11682AABDE8993533887
-7C6D404BDE4153C9827EB16D66C1D73A8143C8A2D3604FF72CE579FAA3C5224BAC48EA83BA848429
-9472007DE96466B5B29ACC7C03B05DCAA38A48BFF9F214DE43146AE4E04FA705421917F99BC54533
-F0EBC01849E396216B9F0794E6F6C6B61B52EF1B1950C0FB609895C3C55FF574163FC8B6B09E66AB
-AED1810E698FF37CC1F926B2CDA3B48C7D77790EBD2D514B6F385D397F713EC3AD3954EA9C846158
-6031D369E8B99E53408A79D64C34EB5A56DE8A67DE91837960E98A66FC04DFA0EBDE21DB003234BB
-78665B039D0A469A0221BD541AF7149A2A659C300132C14581EF766FFFBECBA8B58A5EB3F95446DE
-F49AF863A8113D17B2E7E6ECDEAFC3834D4DF900E3475596E86FBB4E2974C090DB4AD61A737D611D
-92B4535AC291C56AD8B1C031D2F9B505BB77517B737D70AB3723DB52AE2ACCD5DD2F617423ED3CC3
-9CA882EF41757BF7151806A9B8B0F312808863E3673FB54DE939B35CDECA7FBC4DC3BDF5A5F47D35
-E345916C39366C8B4F439CE1C6F1835C320BD1E67375B03B5DE18C93256F251761A4C8CEC01019C0
-68E34447BCC503B9571FE8000627A6B3DAD5854CBC0A2D69E5A8F46BC78F6A7B1422334EC7A98ABE
-FE9B83E01DCF3C6C9273B346F3240EA225AE4A4083CC7B0EA141A0773FDE940768358EB4B13D82AA
-304A1386D450C1C0C6A7D5A8FD2BD313F78F85248B5196241E31E5595F3BC01F37700A2DD3D4A0EE
-2DD01A36569CD507130E8F5B1E96CB560BB7DA15560CCADF3B2C9804A11D9E8055C9EC70E48C1D21
-3EB756A1376F2EDCB7189D78CD3D6CA5865537EEC31C17D801605EFD860B0B629472690588D02575
-02C6F7A75B9A1C1B397781329832CF3EC43C09F1559CD562C48FA9500295CD3B0A790DD3FCD4684A
-7C7AC49AC9BFFF36B39A9FB148BC28D37907433943CBBF0CBDAB46D3EA86DC8F81C859C52D15302B
-94A9B51C199B7104DEEC9D769C2634CECF8B700CE9C04152CC59C9326BDACBEC4312DEED92DD087A
-1C4840868D9F97CAC046581F762F75E8D24D6445370A3F1E0AE74A6478D9DAC37E7FA5BEBEC0A1E0
-81AF89C1BBF7F51E3E2E22C8C405E8671BA85F1BF0DF79A465DAC7EC07F731E00632E017D190A99D
-83E27E5C2E63D7DABBA23B2E88334C63721AC5A4CBC5D45F4C177259F34C2EADE01FA008AF65EBC6
-01D8DD16436D86AA94C99F3CC0A2F87134E73BF22F108B825A8963B49C6C685474AFE4A542C8641D
-C0375D7EFE9AC1168D9700459BE52D0DA399023E141969F25C0DAC4668534B6647EC85454BE945E8
-26B26DE6E3C4584B97A38E2B40A0D23481BCA78084FE80E00A71A790BF31DF468A435ECC88E60A57
-860BBCA3D65930186E9917CBD209C230E8F8255A7ABC7D3F043AE4D7AD63D9980BEDF062B7D5C298
-C40225B6D03F29A0339E0FCA02138E526F06B9EF47F5E7A8068A846CFDE2BFDEBD24F5A73A66C079
-18662AEC80B43246284FA4E2EE0D9AAB172B1E59A6CC46B801149D8C0DF6DEC9A55D8E1B0EFD9D30
-2FF618075944CCCB6831D336B11617107B0530D09885E5CA11A5F1FCC8D69D603DA16BEA51116D42
-CAB1AA1E4D7B9B4D79993F2BFE53EAC904FEB70B2D330A89780EAC10D12CC0C35B8399F218AC2976
-E57A26BAD20CE2FA2AE2363D3FD2A8A971747556F2959DA74A8963C20B504711AE1CB0D0C02457FF
-2E9BF696B159AF031DD5155F21C0F5549B0471A3C5DC8918B675CEBCB23E29322B959ABC05283A70
-2E878DE8EF25EA760F3C5C7B7B49D398283DE2ED837FD59F7C22D62C58FE4448B1049FDEBFC8787E
-67D7DAFE9774979BB3802254DA59BCC0219F98C219F84D995CA768B8B5D9D4A32525DFECE003675E
-E4BD5D8DFFC11025AF2B468F9207B5B2B42349B98232BAC0759758C1F4A283405815BD7145C93FA0
-8F3ED2826655053A3C2559073D8ACD199DEA2C5BA5F616A2E48548B4370EC73493BA07E197165DCA
-774438B0766867819C1154D1959FE6E01E6312E0AB91FC2E2BD240FC8652A2D456A1DE7F34EF372A
-53794D4C4E050BF3CA5B7BD2F1B8DE93B4C8002485CB219AD2D029739FD3C81CC6E78EDF38723576
-1A57143EEDE5CC887F282FECD261F6A25D0A7E154ECDF5DC38E426811BE86AAA458577E5E0C5F0F7
-5AAFA9C41E5D1DC9D91ECD79B514F8CDF7A5F1A189470D35FDF4F9B8788879CCBD91B427822ED658
-389E981E0EE5F7FB87692A3E3E931DF8A1D1573E3B0166204240B7080089A09EF7487C9AEE2D665F
-5A82F94C877FB5B0DC531CEBF1E71C6592CEA2401E4B5122E5091DF03D203DF979B9A6EFBA12E2F6
-B422FDF15D49AC0914D372D21E871DE65CBECD105FD4A3E4714B9CCA5C6803FA39DBB015EA8A88BE
-7913502E562E5B170B87BFC8572DC9DF49AD63694311EF1334444BDF0B4CA3245271C1F7A4D7FAF1
-703E3AA0E1EA8D5C6E821B28707EE0C9B4F22F23796FE87356C58AE2CADC191F4C58E1FB58DA03B4
-5A25AC95DBAE13A293474217BDB214742B9D9D6AF35F70FED2891942EACE3E625E55FFB820543FBB
-250A062D3D395BC0F219ECFE0D76686AC148BC41476A887BC494DDBD396BE200FD3E03CFA12EC9AF
-6B934A283C42AA05589AA6B4A8D16946BB51F50419CABECEAEC5AEF9085C9989289E9B46BAFB6FB2
-782D84DE2B068F91A9744AAB237CEB1BA513E57E4C307108E993C972A3E0A898D5A8D27833155031
-FDB98863C3BE7FEF3004CBAA5CB60A1F2E3EB4D7290FF5FAFA088B1CECCB6CF51A58DAAD998F0839
-6CDFD68F5ABC9C1CCB8F6514107773C69C26873E889D1F79D10E866910E4684186FCD71C965ADF62
-39BA3418B313A27AD632300969B6F284519366ED85E7CD968D64823F8C59B5911A72D0A20EB72B60
-3A61E36F52F256FFCDF706B4560B4DFA5D918FBC530D83A4B3C01BDD3CB4572E24242D141BF9E775
-36693A0407D002E09CDA5B195BF1CCF430AE9824C07928A050D0B460F2704BE8F9E647A4884C4567
-0A81EACF7CC038643EB0FF18A376FF6F32B6FE4F197273327FBBDEC6443A299CAD4B26F7778A99F6
-5A11BDE047153E764039EDB251936AA43DEE50DDFDF8856519056AAFC4C5AE6F2051AF0579A9ACD4
-1D00775D7DBE70022CC263DCA5E0A25B9C7C4F5C418587666B2FE24816B1E0EC92F9074F1403BB83
-AFC3F1D52CA79C387BDEF864366E34C90BE52F7AA09935373A07E4E026224E76F9EC3CB9E7EDE50D
-EFDA48248D61F3CEC880A3B8843306375D9711E58645F3625BDB8E87052DA67F9794EF4AF8DB0BCF
-E00677C3A26907DC651BC838C40EC39E2B5A5DC0DBD345944A6C32226089D63C52490FA10B215AE7
-03CFB663EB8A47793B84CE7364DA1C4E7FCE32DFEF09490121222774915BA59C78C2275F829D15CF
-4D8686B095C38C731B83D48738C25F40B8ADD487C350A2EBE846C3916AE384CB1050F9F5DFE09FCB
-D9129C6270FD86D55A459618FDFA4F907E6B4746196BB717865AB378414029017551161A52E9D24B
-E4F7EED553A927933D4ABC8F25DF607779A717909CB4D810DE8F5762581900E224E4B91598149BA4
-71CF8068ABE8744356B261600BFCC57FB8BE45036CF6571D9B2A95304933BD4F17215F8EF53F8E08
-1AF61FA7F9583C34EB5655CB0ECB82246959F09091F36989EBDD646BEDCA614B9A61AB7696B3FF18
-1058A150FA6EC1BE2EBC7F64357A3FF2A2B0491D2F4E0B970DE5B7788B467CA678039B5EF55C88A3
-84578D427FD2CB16C87B0BF0A3D37CE8ED43E0F049AF2436344D5F47C948C632C94A287509282561
-6C64C5D262FE5B24916FFEE982A69A6CCF888BD01D62EA591EEC51F4B7DDFAFFBEEA93FE08D736C2
-0129E345D06B10246A5F57151C198D407730713F32299638EFBDC01367E23EB59AAD42A83AB41B43
-2DB462652E29813740F4680A5D4BD47B18328FAE6BDF4200CFA4CE3773809B45E8887C9B2E423698
-9F6C48D64F5986F563D9A7538A8716082F81936AEBD0461E6F4BD470436D8B7656F0FDF89108E6DD
-02ABDEF907731D458D690BC608EA9CED09EB1E6E64C0790C7A2378201CE997FFE0317679EE1D4EE9
-F91157449323E53B4ADA8096CD628B5861BF794543A98F2FA2AB54FF0F25A13DAD43DAF9394329B9
-5AA53CA32749FECB0B2BC035DD1EBD53FF9FB5AD8BCE06CD89E5568091C1CC314CFB1D9821D7F9AC
-7C55F55E0A16E39A87D43148201B928F3C42B110FC056189DEF183745F3B637441DE8BD4C3C7EF12
-F4258E306B2877ADAEC63441010750DB4E6269A4C78A0AC01BB3603C386651FE814031CB5D8C1F14
-9EEAFF652A53E57BBD4C8C0CE36A84A319A53BC1E5FD3F1ED1EE72F4C1A9BF264B594062FCAFB22C
-C1FDE3F2E3D3C17DD3F7FE0E15EBD812D550227C06D01127385374A11438ABD50048E17255FCD2BB
-85122A6FB9B7DA9D5E9DE8A747FAE0DA45A1FCEFE92B9E70A5B2CAC668D4D07527A5C1403267D823
-048BE671F725CFC7474B44FC5AAA348420B2D7C23C6CA066666FD6F2208E329878D90CEF1C2E77ED
-22D3BEBB9D547810B189F08920A27E7107F208591A84D463CE2576C70C3DFE6643E4EA93F4E1DAEB
-41D46F0E2F56FC10C69AD5034FC9859D31CF27A3A1EE256C93111F81C11ACF1FC0CE20B90BAC9AA3
-27A5C85A7985B951519FD4B03C40BE637162AF41B2FDA68F0D1E9B7602FE2659D3D75955C579AC51
-DF6A552EB9581AC3F712F083F19B52A6C4F560F36C59CEEB0C996AAF1728A2AA45DCAD79BD7B23AB
-388D5B0B64A2B95154B6259B730B0F4A72C8C7F7CC93C7D64D9D8810D1F63FF8ABD4DB89824E2D26
-4FDEE916C41E299211DB1A53256E1DB5CDD04862F034D9404B73183A99D3D13D642A663F129B6D16
-7095BEB4EAEFD03DF2FF2F0B6B594C1EE90FDB203DA89FACEE23F1BA3901FECC75FE1811BD701259
-343011262B6A0A9707AAA6316BC3C17F787BB80AC8DA5AAC942D90F80C5A3BB59E47EC767244AA95
-C63E50BF809998957936D3BF6ABC24B0A397258F9EB4DC8F65692CB023D9091FB180C69498CD0C08
-BBEBADC84A7E0016E8F8BEA325D924EB0DF82E75D2CC2CCBF039B11934363D4332C5FBC5EC556BE8
-5EE4E707CC2753CCC43D2ED50558E51A104221C9323CDCB0199B7B83454DE3FDC810D0F362C0299F
-5DD981B31D8E3DDA284FEF9DC8F9C8DE138D3065437A7FE8C30572AD06D62E8527AD37AE39AAB0B2
-25F76A25F6C6505241ED73BA494CF923E919F688DDEBF193E188F8C4C154F21631080763B4D091E8
-AD1D2FD6649E0CD9360E8D1A67A5B5FAFC67547CA31C95A5EA8D4EB5D68B9F6D6532DB9B54584735
-9558542A2AE58C09F3BD2918EFBE1699E9C8F2C2A11EA4D224C726D2ACD4A8D8ABAEDC6588CF2AE5
-66528B94F55B823A2A1F7BE19000F3E7579D094E047075DF18C8C868760295533B26EB3ED90635B1
-29C17ACA679C3E88B06998CE5A7A2544B700229F5A6A504BD3E45B276471959C8A3F81917A534287
-39B5EF9E3D463B3BA7318448E2A3E79520D2D245A2A72F31FF7070B6E4624E3A5E216BD103640C8D
-F387E49D732529C611F8B971073F17EBD2F6EB18F9B74A67E1997926DF178D4C9EDED435B9682F1A
-279C81BB9F60DAFE125845A2FF3B02979E5481C78A45C479BEFB9FEF3CE2BA9BC46C77B50B03E48D
-A6D17B76F06F3AD118371ADC69E178C52B5FB4B261C9311874ED07DD6D5B3226A005FDD7A6D53848
-09E7063F036CDEA41619122635E835D2D74CBB6AA9B38CAA4D819C26E95115FE0DBAB4198FC5838F
-2C91B7A87B07D734C6D4F4F83444C1E90AA9BFC908A2BAC4B3DEF9157AFCA5248F2DA31CA87BD363
-AC25E9E77F741D4B2C6E02F04987A6F49D30E9038CEFC41BA172DD675AED8B392164411144E5B738
-F3210B0E66B17A13CB9631C33D44484E792A7C082DD0A5382F34C5637653261B1EB6D2035B08B4D9
-1FA9AB770CAF40A103629511F7B43F2743D7E583433DECFB19C21FD4FD0AFCC22A4119E77C87BFE6
-FE50068B22479015BE5A9F06BEAB4D37412E062A45E0CBCD7BB39FEE747E96306F79FC4F2E8942DF
-5D9DA0E55AACCDA547DA19D30B8404FA121298B44C9CCE198C708C69A8D6BF17591C5C50D3FC5BE6
-961F7ABA8F366DAE957A1C3730DA4A5B4F035A9274675EE3BBF0CA8CE9D8349F50CABB1C3EA4948A
-BE6F9F143592F1EA95404E6909A909168E3279A957AE1924245C356331A75E7008BEE92BEAA304BA
-40B7C3F48F74D9018B3247DF50EBD7CE541DA48ECCB1B0BE51A455C3C13C279D4D8676078C3EBE43
-08748D52C9B041D3E7244C745B1F2F742D010A9E60695F3EC4FDC1050AC082B905D6A57E8F407A3B
-472F731011A5798965B7B1A307E252FE02C8F79CEEDDEB6E165F1A94D7FFF18DDBDF79477F14E9E9
-3981ABD200FE7771B29D1D2D120EE79D28B9543818527039AC74085EAFF241B56D08220C958B5D9C
-87C0C04A14D52AFD475B542D391BC54FF33DEF8D9484AFF6873BEED32DDA4B371112B523B6CE22B4
-0D1B416B64C9370F1CDF2C548F4CCBE9E12E21C36CC3EA52DA232DCFB65F66B22B5E2EC04852510D
-5E264EE939BB67AEC4764B87062AEB7F680B40BCEE04AD45C7519EB3B6199C9E0E332661463647F2
-FB7EDF303EFEF84891CEBCF0FAC5F723A9D0476C3F8C092604C87FC69C7A90F4D64AE45A478EE8BA
-2DF50FB93F55A3546123F0B0E2C1C40C98EAAE9F0F26B8F80FFE6E6B94B7E27D2884D58B8A119662
-2DF6BE608C5569D7864BB756DF2EDD184B90812B44ED4A32D001C31383A40AEEE9743651F7950846
-15C48E402DBC01C818D477EAC0347795CB2792E9C11E8FD4A02E194EED1C919D4598FEC003B6D9A8
-A0BC7D456047A1C0579453FC1D7CB2D158D466939A23D7A7B8ABED7E2777EC7487973E73F2266D9C
-250CE30729E3C5223AD93B9AE8443B35711E446A3DC660123ED45CE1942A1A2AD0610467E081CE2C
-8B92A6C82F0B17B5D2429E99F1A6268072C6B5AAAA6EB6283A872C54D3694CD825EB2926E57DBBC7
-C1663075E687A144E4D61C225781D80FCAE1497B442342B4A3F1CD6BDB50E31791CC3928C30835FE
-F845B6BE5E2D7E3F2F5F085AA3FAEB45CAD0D76BCBB1ED859A9CEBB9F7457036F0BC3F195CB1A98C
-9C8648F6583CDBB23894BC719D68C2DBD8003B10D08C8CAA40BCE784D7BFB4EEC9EA5359AC056E57
-B8B0F2EBCB1F4CE40C87FC7861180133E0CB6CE2FC4FE690756D327A2B5AE063E3021C0C0BD420D0
-56F0B941E6B36088A55BA11D0C35FD0132D5F48E5D9673572347171B4328D4807B972831C0D74CFF
-A5638C145B89C989E6EC942148207D6DB82257585958034D9F9D4221C7C9F7013790DBD130F277E0
-BC88BB179DD09E27062379ED06F25EEA8B7FB33C35861A0034776E3813D2E9E5C10E227CC569AB36
-CB2D9DF2E7B7B44758F9DC4FFAD7A24AC7E9F47AA850C221048C3CB35A37CE8EA75632AE65FE3212
-175146FECD6334AE3D3C5F492F067F795E1E8FF386BA198CB74F0BB4DC0000DA383BC4CC3F070DE1
-7721431988D69C8B1A5AFDCCC83C22E16A87E01C6D3E79DC7AFA3DB0371B0866EFB8B6F88900472A
-FEF1C4A878243C52D4E02E82658979731C841C489A6B97E271C4C93800EC7D91F93EB9B9C659A554
-E1FCE42A5EC65AC39190EF4B66DEAF6FC0569A000A9E1495F42F706FBEA4D32EB7EF11A648910259
-6A65CF899C2F322F5679C6D123469192A9BF1A7F1F2C81C554ADB97BD19ADB746A4F81A4D5559E60
-AB94C483DBABF6CE2F28CDB412D50FF3FCFA3B3DAAACC6A83CFED910CCB3B8D2C19590AFF4D75303
-4A6CE7F4156896A13808E0DFEAC547E69D3C886691728E4A35ACD575B40D721E8FCC5385A2EB28D7
-08101DC50811529528F5CB0C009BA7E3C88468E37768FB0D83895AB54DB2DD5426562AF9D8AF304B
-F6EDA54E9C92643DF926F5C3578269750120302A37CB140A18BA56BA01108D4ACACE8FEAE640A6C6
-958EF156B588ADB0EA5F3B0F37BBA12B7BCB221C811415387B024B7076FA4403A3AD6EBB5D9C26EF
-EBDB7ADE7C60B444AB9F90EA493B658B7767AE2BE649BDBB3FE85F460F1ED137C61BD95F7CD3D8B0
-15CE45138538930AB62AA0E54B4CE1A5EC5FEC0A2B28B345B67089A4E4AE14D2E1F5A9C8848DA688
-CA298F93860649EC3AAFEF3E820D86988C8E3E5A4D4BB937791827994AA3E81D0BB3EE115EC36D5F
-B9A392D09E79AF514D11C7B3A03C9F9C13355CE79E119A19177FFDCA34704D38118A8976D1EE5AA0
-2D14FEB1414419F5E85244ADC5C0A765A522EEF36170064BB19FEE3B5F7B441E4DB967DAE0BAC2C4
-8FC6A836E0EF5A69F073BEE1699F55E9C757EBD6FD8B514E2B49D6333815B7DBD1E0694695FCA3D2
-1320A0C4B852D9706DADD8369A95FDD917328BE93DD33818954DBD2C212D2CA81560ED5BC284EB04
-7A5F389E24E43F4FA8C97FECF46589FA7341076555CF55B1C21B28E0C1CBB00AB8B6F67472F27BC0
-D11148F407824B0159B5188D4BB7386FBDBF1C0FAF34721B7BCB5C0FCB7C4010DCB6A1284E9D7883
-9E3C2111A05D29AB7997073B590A81C6168020F1D48951BC7D8476D5BA593F4F23CAC1F9BB0E091E
-84B4E99E5C584D1370DD12DEE8DF16AF8BC6B7B23E2FEABDB7F32779AF8E2B5094A6E9B7A7225F24
-C43A8E5D2B977E1E19E633C26771E23017ED233DBB02C64F8CF03992C6484528D0C8464B46F24F9E
-8380F385D5D01B8893C67FC103498983CF939432AA380CA576D09030CD52FD99BDC3BE16C7204CDC
-3365BF76294A83A1FC14A236F5FE5321904E779B13232A76F8FE521F425562678436359C2461BEA5
-AB27209541F557AE2AA60009C9CA0A9FC7898C14306CE35A50017BADEFDECBBF94EE2905220706DC
-806409EF87DB1D73EAB0698AD2DB72CDCDB293E7FB13C94D9FC87E74502E6927A212F0D7D2F2D194
-64F7A66AC07872E18CB1DDE8F11835DCBC5C4EF039333FFFC0FC1456DAADE7DAE3EC2EE0D3415B0C
-ABB69FC5006F4D14A4EE1A5CA99AD4D5E629C0DD1E0F097B5B93DE2DD001A8C418234C9C45E8C13D
-1AE04E9466DAB8CF1ECB88A4E059C111A6468D2DABB90DA79C7C79E94DB28F6968B1A632F8C57D9E
-565FF91C6916026FFAC0661856B9FB8DE9C81661816221B1FC159CFEF1751E7E403F5F2CE32529DD
-540792FC17A12A3DCD7C50D38EEAADBD10ADBF5D8A82442AA900CE6150EB7A4639DD9FB6E385B2FD
-093493DCCD9014B23EB172E21AA89643A6CAD1093343D85D81261972DE0ACB16A4C6B5F0BE4C978B
-FA12D3CAF0134F9EA49F6E9687C8F99A456745EA252F0BA9968C7F9586E3DD841AA92DC7705BDD68
-2DAE41518A09DF0E209F321D7FA3417202F4BA76A984DA3ADDBC58136885362F02F0A24EBC439B3D
-BBDACFFD8498EBD29F88F016B1FEABC10785438EAC860B554525F3266097A675299AA0967BD3B7A0
-EEEE3FC578D1BE99D3533BD91571AED904BFC9DA1A1451FDC5406E1CD614E0C7FBC733563CD6CE6C
-C31E9237CA153F1F0411114361D731636BCF98555ABF12848AD109371A42B63675A4130B81E97C2A
-2EE2BB5D8FAE2640156001AF0F55D9D5DF8FF23C8AEFE14F120000F14149A36E5C94CD9081DEC277
-C2C34870D05011F99D48B0875A5FF542F067F7E9880109F586BCF2B50522A1F23ECE44349E539E70
-F84E207DC9BEC7CDF856A046F1A03226AA41F541719AD1AF88FF211E57DD0C1275DD0B7B47440DA0
-89B98C6EE92A7D94700B83CEBE19EAEDD8A615F6587587BA8BBA3CE3AA5E8EAFB1FB0F486BE3609B
-169EFB178A4292F4C0378AFE5D24EED1CAAB514DDC66C696D8E37F294A6579131DDF5488E9436609
-ACD750C3DB0A940C84FE022B22ADC2676F62E91E8F891225F891FBA537679B24547BBBF35F04915D
-20B11739F620D18B5B216921D222F15044368569AA302980B9225BB839F494588481B94B0C724352
-B2DF600A22B062561D86CB8F81514FBDAA4F8A043A0265F992FAB71FC9124A45B8475E1EF3DF6B6D
-E35CF329777D45F08325E8505EC0D979F542807AE77E57E453525F23BC59A50740371EFA98678AEE
-6C425374AEB745B99DDB5D8D908FDB551FBC0DB15832107BBECC4E11A1A8DEC69358A574A2ED46CC
-31D564549EFF23102D92BFDCBB2BB985F78F36033E34F59C0EBAFA3BDD71338736464CEFDBA91398
-33995EDA4207BFD4A9867D32E867FBEB7DE60D132803EF9347CB17BD91315484EF6570892297DD8B
-7D966103339535E28A00CB1EECA4A9775F60A9F5FC9BD8B06D78FE8E6318C31DA2E847E3F9CA587C
-B01AE2BA0A2EBDE308314413F4F230A758184ED60D4F71F6CEC22A93A01B6C54E0449A3860FCA895
-4A347B7588329A80974ECBECDA1070FBC055666375229F13DD995E99265DF870BC8B8CC6347FADBC
-1A6AF64599271A475B9123493D46BEC41289BEEB67EB97A8DED7A9C9730D37C65164CFBDC22E5CA5
-89D2E7954C7136EF4E084C43A6C7F361A3E96989239BDDB9A593CC2A80BA16DE9EE90E95CD39393C
-212AB22EECB677FD36D34DEB46C4AD0D21BF7E6D7CBD0C8083842FCD87B18FEA7CECF939987E99BA
-34C214E44DD84C176C9CC5A4CEA76D380CB316BB4EF9DE73D73B4AFD4ADB54451591DEF86621D138
-D5A0A29441502BF6C2ADE671CEC3CB5CAB903A657EB2D70C943F976C110E46C5D9D29BC00A875F27
-38E5D22496A43E096E009C5D3CB724B4CABB32838DBE527F83B18CB457E57B092C302EE557FD4F00
-DB9C56E66C9FDF4EC9FFAAB85F60D02BA79694FABA476A199A0331C30A78A92E10417BA236E23364
-8174C826331DC1BAB87C5F95027846130C6A2B4027930EBF9A97BA1B039D386FC51C302648E25980
-212F6A582CDE2778C677A01FBFB3C5D1B8A374ADAF6ADBF7DC94075F25ED66D440B3922C5F255FB2
-3FD8F6E21EA65B1D93BB225684B50F11310E242B087575973345B229BA62C1E2C35BDAEC04D10148
-F5B2F3BCF7399BDFDF1F3F79119714AEA697245BC647316EA157484ECB951BE367234FD02E8B1F09
-1AAC3D29BF282DFF4011BC0CBA8E55234D943DB3017CC7A766720BBC29B2D097A956C0F1067177F0
-12D42ADCB473CDE8D1BA35B4030757FA1D8211989DF3BD22CE5D501C21EF8708FB3449DF47D88650
-9FF7B59B76C0DBAE443F336FEE2D615D7EED1C284F14335BC8A26BF4621E10DE9611FB2F1DBD52E4
-B7565D8C65B54EA36D508BCF0C578A49A2665227CDE1F9768EFE847F9D94F1BBB7DB83701C232198
-5C7283D47B2E40B27A268428AAEFE75F6B2F8764A8494E5827573758CB9CA46FA93208836BCCC8B5
-564A69F5AD882052AF1C1417C3FA7F580569528682C77080F3688B65E7FC24D2A3AEB61574B4A321
-5927281544DDD7A6EE0A3E9388F8F631CE7251724DF70726E5912DDCCC8C652DD6C9608F8462303D
-867F589DE0F2F71711B35142EE6EF93B64D6326C4DD7DC83278E057100EE772082E6BA368ED91A55
-53ECFE2293A481E42F83BC8F9148C70EACE91F7B7D9CB8A72415BDB3AF66F68EA733A17ABE9DB005
-3BF148629132969589F38D30EABFA96A01FAC72650B5A6FF3935670198A1EA33810A9B11E330EB8B
-451F24F93544263436F669AB5A90A53B16CCEEAC36B1445574EFA7E802DE73522BE725E68704822C
-B7D3912717333367895BBFBE06966A5CC653AAB5E9B3596702086BF0010085B900711932A95ACF15
-CA4DC45A754EA334E9EB84D6FC8E3FC4F897456BED64BB93B593549FF0D5352275D8E417172A6664
-C5E0ECED1019494A7ED49AB0B965BEC1A82E5873766BB38D7D856049CCE2FCA65AAF61E961B60634
-E2A69EF059754C9D8163D87F928C222772D070D83FEC6FA5AC734AF65E40BFDE521F7D9CB1650FDF
-64754BFF21EA3FF0AF7611A93D525EC9B28C51AFECB04E7FC8323DD6C9B0D8539A34FC3CD8CEB795
-8E8EBBFED4313C77ED469C199552A9FF70BA5423B03B6148D4EAAE17B71C5B39DC436AC53D6BA8A7
-AD81AA8B02335A8B2B11E9F4FA913159A725B8AB60F52F1A2EA50EAF4D56656E615BF382CC68A690
-BF83DFF24FE986570ADC0290ED1A37C1C2AD469CE789E0EA0BB5CE01020100E729721AF3B5BADD33
-A2DAA6C33EB8F9064F5292F715F820B4BBFDD56F76D42E7A1A068C1CBDCE4640082F6E7D582D1939
-990CE6EE8D270015A2C461798B37DCB5798EE9F7512168B76D26C28BE4A49A1BF96C89D235F21A1D
-B6A96E5DA474D0B19B808D13D7A11BF39EA8647499C410ED9894A1ADF33D41B6FC2E614D8087F4C8
-4E437B136F3CB32DB8393C49177A0675A0C9E7EECEF448A97AFDBE840FA01FC7E5F2E8FECEDC1884
-84C312E8635CD79195475DDBFDD4D38D5A0246DE2C7F21608F8D2C0DA1371D302E941572E5792A3C
-F4E51A33228B93A814D03FD4FC223C314CF3714BB3A34BD4F7ED6348577FEED9DEB082C4049E57B5
-D3CDB7F26629E9F3BA36893E09E3C7463D02A22D7056BE76B87763260E46E48BB832B7EE13F8DC05
-37EC8E81E9BDFEAD8C27EBDF1AD706933EFD11131E12814F236EBB01BE85B7F1B2D627413B324918
-D247604F56EC128909873FEC3857028BEF76A3494364C2A7002D104D486236C30B48E2B75D851C34
-EA50BA7FFEB4E19190898AE21768C157C0CAC628A2181A32796FBC1A7271D2473CD88E5395DDBDB1
-FC3AA8DF0F3D588637F19A8B833AFDEB5F655A8838EECD684E2315B72C75CEEFBCEF94344ACE8D6A
-DBE355008EC72FE7CEEAB01363A895F4E73F867639BE0A0BE67333848816B05B419221BE8F9066C3
-62C23FE85B7F392930BFE4C12B9526FF2FDEC38F23A159ED61A0718E7115C24597D849FA76369153
-54A40C965D4D72EC94DA61A03766AB39AAB684E134FD1407A5B1B19BFEBA52AA0DA5D99CBE5C82DB
-AA663711E6DEBA180E1D4A39C320516A4350D296BC19BF1BE054859A0889C7E9727A021F3176FE62
-0FB0C837E4141FECE531A950C03D319E3255703220B7185BD20FE5DBA673F8129AB211EFCF36EE39
-4C7E00EB0876624BC840FA86E58B2F584754CB6BFDFD76810E300741EBE4544E5AC17413ADEB21C6
-2F66CA4F075C32381796BA709782DE34A675B717A2C7F6D88104CB924FDE5DF775B4F0B68E0E2E5C
-2F788BBDEAF06D8E1FC2105CCBBD5827C0B03FD6CD64F0D073F3192D5F94839644E5EC6C5185BADC
-F04112A65F49A8C83174A9AE958E76A2F5AF469E8B76C833782C5FFB8BD7B1BBBB3EA0CB7C9786C3
-BE2ADE5E7AFA8C8F20892659A59BC421E28845A108E34EE17864042EF587A6D67DECDFB3F510EB40
-D2229585347A0035670FCC76C2837A4E4D68304FE113C539B35C1F0234B5079B8E32934546982978
-C5E4DF955A454EA263C3CA5D7101F31A318D82A3F9FCB5A8AFD7A65209663B0FC9DA400B26F285EF
-46D0E1EAF8ACB1F1CB805E3986D04BC585073FC64895E4DAE1CCB749BB439CB32EA91176D5C39C36
-50D10AFB9C9884D5FB90183424CEE67EF2175D01D2478D67511EC9F54F88763C152697B06D948BED
-49240096EEE3D06AB4575E8E8B2CB8263B5BCF4FA1608720F52B675309833071879DF52C3EC2871D
-20F398B5CAC8F8A4D41D0F1D47584DD90DCDAEA4A1CF160C4B3BF1AAB890B5CEB6CB3488672AA68F
-BD938281DBC1D8BCFE92FBF514DA5358443CB6E0147254E91B38CE6787B2BB0DEDD2D38F5938737A
-977B5EA42892520C58F8FBB53C994B57382379E9490F0D6970B980E1BDF8CF9F4C3C5E0A18F66E86
-EE93FFE7FE546DE50F41364BCB3721B637072571FA1779F1D672FAD260C16D7F13CBDF3E4376E7FF
-56D2A710AC5AC35FCBDBCE2C9C17E523BBE6218617B13C1FA6679B308979AE7C61DA6E68369324C6
-CBC7DDEC364E5A86707266C0B459EE7B2C03FE584E529BFFDCE98C90A2F3D9305AA74D3ED8430DBF
-3A49FE2ECFD9C4BC9FEFD22618FE9C8A973AD072AB6F713E4DF02DCDA7AC5359B2D652013E131B76
-B3ED6C75FD53BA58D862846264627F6B9E70D8800F6D9B32242B747A67BB2B45675840D34F852AA8
-062FA6B01E31ED24DAE02F6CF788A17F7B9368175195DB0072259CCE0FFB2C1035C1D26E1777CCA3
-D56A827C3242069E76D6DD69B653768614B9ACFF16567FEA61508D51454BC02F6C60F755AEF6AFAE
-3536BBFA1823F8E1A53C41124DE983E51CEC92AEF4F99785D554488A51C20885346D1F761DA79017
-940A0C557D93F1DB6B3D00FFD61D08E96FF3AFCE5FEDF545CC9F47A2B1BB26713431D6D1E47FD6BD
-6E3C668B0368241F0EBB5FA9C991DF79890E52E83A3675EE699B61BAF869DE91F67278F510061C6F
-E41DE2D883F48CD0E068E2A652B244128D82E5CD52F35F210DDAE3054691ED55A7D99088AAE8FB04
-F525C2084AC09F5EDF80A4EFAFE981F74C0DE9D194320709B3464F3FF2C0F6AAEA6D973D9C323F53
-DE3D741F698FBF01036716BBD62957CB32CD81D3A2674560FFBC5BDC5C6E4F547E589AD0B1CFE14F
-5E17FED1C4A8ABE4E67CCF8A49F32C4C6044F1431E1CC382E7758722A6D0DF9ED23E51F8AD14D11D
-7B6428E27443715EBA4E9C05D6F238378F9498AEF0E7EE4FE6856622CC8E6ED141EE5F109E343CB6
-695C4BE1E0F66601C27975983BF557C04ACFC19227A1AD7E6C44C00529FC7EDD7F886D24B7E029B9
-C395260088BBFB96972199A7B32796D27257DE83A7402291C14FECDF7998C5C96B1EDADE0280F856
-8A8F5007852EED303969180B3329917973C2D32C080C9765B6BAB0673BC7ECFDBBFBEA980C263843
-39B7F1052591D91667D4FEE413AFC23DE2D4B9DA742F4269C6C939F5FC32A38040730A018155AD73
-3F231E4D5B9D01C03A58EAE7B5F590CCFAF25EDC8552CFC8D95C60EBAE1837D7A97CA137E9D4A4BD
-2CD34AEFD68D64B3F4F62326AC429921D7FB3C235184FE0899690A0B775F1A566EC29D5830D32372
-6526F7E7F5AFDD71B77E07613DDC4FC63EDF49051AEB59E6337AC0A4B6DD872E776C9CD0CCB86130
-5322D816732124F5978A86C186BF0A0F88E733CE38E4D7C1BA5378C5629B1EFC97806059990ED42C
-5CD183BAD7E94070E4058569DA2E51831FFE0D080301AEAB4350BA290318AEC582C78D05DD92E5AF
-B4424EA808629BC972E68F4FF2489C245593F07555CA6A2B25964794CF31CBD3AE5C229AB9B8C298
-06C01D116EBD0FF0F159ED2D3D7DFC73EAB4910BFF5B0B0B587CD9EA6E6FC45D63C09766224D8346
-1F0588140B258B1729F70BAE7962189B1554483392988CF230AF4077193E53330519394DD99BA135
-6D4730AB221DC6A66019BFAE564893DDAD7B177DADD16ADD21D396CFA6C3DC818052E2F71149FD59
-4A16DE0C2FFDD366C99B486C55A6E991E4D22CCB15843F0C3363676AF2F5B2D1B7EF66CCF2F12DC5
-0D63776BFFB058D70A9C76DCE96C754872D72C82A0C33F90D49C935402CDD26B6D743B1F43BED5D8
-B539424849C1495DAE73044E885A7D0F307F1816DF6244A6F2D97BFD4E200E93F69B08AF39EA21E6
-E347A47CEEBF803F73B978ADBFCF056789BB8E6E2563DE87DD9A8C877157B934102DCEDAC54D487A
-1BB2694F0034093C48F10A17D32E2BDD0C723CAF59ADDD1BE373AF8C9BEB4415AA5AF36310C31F24
-354A53C0B962573148BEF91D994FE3F3D8450DD4D686725799F53C373A0A3E3C060C2E1A3E800504
-9F26D716E1F381B9F83125E4683264A07E2D8938F605978E2513DD2050B3D8A1012797CBA8961632
-BED260916338A812AE751C7B657E086A0C7DDCD3BFDDFF3E48B84751925736D1310C4910FC114387
-F3ED7FE163F91895EBF55FCB425CEF5729D99BD8F2C072E36C310523E75CD8E5DE49C031C4263410
-9D56E91A46C8C8E89FD92012A00C33D0DEC52597B5C6933291A7BDC5CEDA95DCDA5600F9AE1C8250
-54E7EE1067458CCB66610704C58E4A4FC0CB5FC933D0322A716B2CD430A3AD48DAB3D4CBE9D23F2D
-092368CFC4E1F5495C133A92942EC62118D45C17723646E69407B4A89DCDFD2AB3FFC099A21D9D29
-741D68270629AA3A414FE58658DC9170C247B6E23F35C4BC5FF83009F462F2EEF4DBAC5FD158A658
-57F9B6DC1F5192DFB169DCB65621CAB2F1B07BD22F4155A8E9E2B6388D430FDE5EC1C834D22EA035
-C52E1E34482EADC36B4CAE902AAE89A7284E62B3C84B608D6BD05F75BC31310B2DD3B2C08A00E073
-7F104F03A41989D5F6B9A2C38B22F1D1803EE5D7A4D8DE44E4ABD496A1DE0C0E12C4BC96D0122846
-3F0EA9CE9509FEE987139F3DD3F9D0DF4313F555BE85433718F6D05F197C41A9D9C7A8B0D2740196
-82D49F58DD5F66B12A6520D9F226D1DF1F1B65CDFA261F980CA25A92645B86B64606293F8BFDE364
-C47D2AF2C709BBE77A70A5712F2CC26F3D66F5BE2C307A48E6F887F681D30121E32BBD87271B5DC4
-615D28C309F15AD263FB37424E56DDA6E17B998B45BE6C7FC6C28E3394A8764C9EB2DF5C06626593
-B5C665D550D4600172791CD208AE9F37BC082B0B242B0A504B751B18F4D7495172B697EE217834A8
-A4FB7CC16D6F9E8BB400BE8AEB0850960283DCE725249FCC4DE97D9886745AB6066C3E2F64DD8AB7
-9AA11667F11188D7965DC11EB760B772E282DBF13249F31986AC6898FEBFE23E3E8B8D2C33E00EA6
-FC493850ECB2E6D831D1EFCA3C2EC8EE2E394599091ED58BEDE97D7A43B6F739EB0F845EAC1DF6B1
-EBFE876009CC5D804B15ED4B56761B3CE1AF59C07B49DC798A44532297AD73D5101ED47F36A3678F
-818297CC27F6AAA2AACCC9AA9B6F5459911D8C56CF499E390AE607F3790450B2B9C9BE0F006EDA0C
-715B5CA0481734CFB0597478E7602B0D2C1E4F78F03C68C17C70E4B42D7D2D3C95CF40F73488B371
-8E2CB05A549944D86944D78724E266C3319AF89AE430E777E95F0D792B1C654306E421F3D63A26B2
-1E74B6E8B21B2E2B9DC596D013CDA16D08E65E8F24A84B12B2BADC653E6E1110DE2E709C1C1BED13
-707B70A421B384F20CA7A9A9D20324DD383F28B2D3C7A9C53F5D4C6B7C378D26DF11CF55238BE1B2
-4FA70DCC178DAD3D35670FE4919085EB1CD905971D76A368FDFCF9D2F0A23739851A3A6D2E02D65D
-54DEE69ED5D81315D3EA5E356F94EF256DD267FD1E1A9EDC9CD63E743F299BCC4A4506233B8DD765
-2CA067F741603F93250C087D368F9E9CC4CC1A6DED567487C05BAA992B0056A77F630A72008E3946
-15A9DB24FE56A956650EC9DE90A6C2259189440247970541CA198748928215C0E132A81AA13208D8
-63C1FE817F70CA573B54577D10B73100AF8EA088208A44FB92ACA314AE5879706180788C17BB1D0B
-81B6B95A1C4E0F9EA66F9B39BFE12444A6446691A7BDB03E0F03D9F07A10A7598F2166F108529F34
-CD90E601FFED3479ABCFCBDE8F051C348E48C61D95B00C59EA1287423F05666C3D36288844067E83
-E14F6B5210842C742B89F13ACD126B9FC50ABE2CA7D7ED513D43B6AC7F41EEDA416BFFFCC5C844AB
-2D23D4DC09B2D510504CE98D02E72020D9E669DDAA344C63A1B75632F912A1C0DA3885DA4AF7E243
-E4A4C6493D6595BB6D56B0359106957259E59E336BAAF35BD1CEC5CDE735272EBCCAE8D4904AEBD2
-B32610C6FEA2B69941D6542ECB44D71092A3CF067708A3D087AE99FF29671AB7DD8758759B971A08
-AE1BAD78270D2FBEE37AA2DCB119D72F6C7B0C8509018A70D0B0BE2C6830EF8E0B24B1CE1141EF87
-3A4D7DCC501F808BFD94E4DC0F2915AA023076BCC8006490A43685EA25AAFC187302EBDE7FE1965A
-04A5A398985D29F08E085127B56B057334D88EB638A4DDE64AFD204974C3939536B1B66A54B4DB81
-151853915718F70813F096CC1B0EA25E363B49264C2AD17158A4489F91453FBEDBDE15D7B74D7F98
-E81DF23251785D58295BA297F295AA6248A912CDD4F1111E6B628EECBB5139709E76EA4AB743CEC8
-26621D08E6BC64691CC90B3C3C1778931A28D3D5B1E20E96C643316613FC487C9B604C43463FA453
-3BCA1236286E6F5A6EEB2F1D9C34BDDE4595495A365F88055D9268541CF1654ACF478D384A5496A8
-772EA1402751A093582A6625A0A44816B5FDBE166835D598644296249B92CC90AA3FD6445C9A19BF
-27F59CB0616C7306070F33C7DF4E1DE64AC8C5BB2FFAC1EF2B1B30E5A0275E6004CF64BBE2C6710E
-DCFC3AA4ADD60106334708862FFA6652825BC84842736E47AE6917180365C75B27505EED3C6108E9
-898A780E20C3F606A860229AC46D0471ACA0187D6D539A1B8820F620F72B41AD1D3BF3834BF48CA2
-AFEA8BF535AF74C4562DEADCB63D2F5C7585722B77C989342D190FF926C8A5263B4F25286F99CF6F
-C62EE6E2AD61C82B29D82468AC10FD27764278E5558CE8B41BA111CB2F040914451A480C93084237
-CAC8F66BB7C6689F340B8ABF0150E06D5B1177278A4C08742FE22F42C28680F190900344ADFA486D
-59718C25D37275BCE4DF981AAC35D2C7E85C72A0188B8953CFA516FD545AEE0BF4B8BA301CFDE214
-4241FBDF3D204E3D2823301572E23F204C97305A82401660E12926EE7BA6EA1A81FF5C007933AFC7
-3266FAC4C134ED818A48E7DA01C71A46335C845F9DA5E960B25339D551582B375814148D94CFB781
-FC56093827B78578A73D4FF67B6B87F40CFA5E3F4325D9108CDB64BD06427B88C84105187316FA29
-90B4E3E8EDB6C78ABF164F4A9717D523794B2FE772A04DABBE688CCA977090979B5F47CEB90A1DBC
-167D305EAB231C9F4260C4AD10889CB785169902FC0BED78DA15B8417453BB65856EA0BEA5245BA0
-573F623D215F6C0CF801851C305B355D26B52B0B343645FE25C78A3526841EDA480919A1BBE5F56F
-C10ABEAA3E1FCCA7C43EE560F067F1AA2AFD642F769D1ACE8E2AAAF38850F0D757CD808C921D716E
-96FBC07DA7860DFA70CEAE2888C0ED3CBF9586443532B68DAED9A926655C157A416C383A53D8F283
-2A4E67468112A09ADC837ED8EC95F70852921F50D4417239FC42EE3624CA97F682745CC5E76CC7C6
-7BD99F2180F8C0B7FB49539C8CC474C25C0DDE491671FF329E51BCFA779346D4686835A3AD6633FC
-B5E0F67E0CA9CED8F215BEF4D240453EB2EDD6ADB22278AA5B985FA140C9834D38753DF2014F8C0E
-E6DAD19E8FC54C03C1F6CB0F858986691D99592562CAD95FA0A5B2ABE4A8B54B457D42E8C33A2D19
-51C0419A72FB94FDA78ECD92BD2A1416459E9DECA9469F35E4C47DB531726DEE8F203D7042EDB32F
-025DF3D582547BB1D45F7A5B70D317DF4EBB16E36B0D798E0932FD2A85B04FD67143E4B287A50416
-2C1F5A037CCD780088C5476385AF8168E12D97D44B0630621759173C8F1E3006B5B1C6D7138B7EEF
-C3CC5F54E24B2C3CA7B41AACFD25E554880AAF406EA4C3C6E21D3B550B040FB1952598A7E8E6488F
-E38288B2AEB6C4718338598A2BFE4D2B9D14C65732DA304C16FF3E1F8F03046EF095B65FD609DA87
-EC24A69278BFE65C905CD0329F6A486B8525B7EEA4F7AE56C2633CD83543269E8ACD6D71F500D82F
-DFBDE7F7F7B1AEE67328549232E26CA55085B6E84D9E2E7F74068F93A90C4654F2F396E57C5F76F7
-E61CBBE523DBFBA6E76638BBA3064DA025A79E3A294FE7F1CC28A3B4C57DD6FDC48E541A85534B25
-E1BC11B4F78019457239EAEFD4BE9007D205F1D985F389DB22400B279C10948551A6B4A17FBDA0FF
-C9428B18B43DC76EFB15FC2182216F1B60B4E344A03AD6C00F141EF99F89F24C819C3E32877A927D
-84C2D006940F39CA8B71E5951673EA9BFD1749923219DE38929ECAA9CE43B06CFA7DA1BBEDFDA56C
-61FF6C24F40E59B13870D5FDEB82D981154FAE5D6D5152DE69339359461A41A9713B6BBE47E868C9
-33CD74C75DB71D13BAE4DEC85E02FAA14EAD6C0A253B16C79514657B15E68CCFF9EE6AA385CFF9E2
-C53D9AE40F85C793E4E8FF50B2B7420F4FE69807BC5F37C3E300E6B3C3549D1D3246A2E70F091054
-1135BDF805E0A698E236B6496702D061241687B7B8D1A0E517DF0476DA09D89667A7AB375FD2672D
-CBAB8124E511502DDBD08BA04D941DF1CEBDCCF7ED48405CBCC33774A68C5212FC6F132641FF413C
-984F8B43BDFD7B1A2A3435F15AF07EF4970D3E4A0BB947C181E9CA27CC14A35BD1BD096875B45873
-8CA244F88C28728B74E25CB8C4FC1095A56CA75E4569AD3082EF194ADD11350DB3B74B96761D4538
-596FF7243B1E1B724716A144106E080D42036444FD472998460CE9ABBD05B42AF9389AC452BDBBA3
-A13A96890025789F16B9D92251FD3B3BEB2C61EDDB370A20456E3BFE5F4039E2557C451C524F8087
-015BAF3FF05F51869FB97512968BDB2B49589C1C7AF1E085250A47657465F480B7023E24C76731AC
-0EAB6704123D77977D3A2C4C56B691346EBE589C619C04515D34F81FC6A17527D5D8319013C5D4FF
-27CC3925E24C99231AC7FB9EAF0BBA482D3B75807AC85D03CD09DE5D9AE0B07B7A813F0449786500
-0AE8A7E00080300F0AB8C399057EDDBA273DD2E1B2A0DCEFAD3B332E6D4AC1FFAD846167DFD70E03
-46DAF84AF292D4F424256ED5AC4E104F80697050D50844A708EAC9E7F7784FD01646F3BD0C595CA5
-1EE6BD607D254E78ADDC5E15C3B6AC4940EC865A5C23105B6BE09EA09F2C05D6D76960A843B81EE4
-33977FAAC3CBDA85CDD2F4DB7C28293A77825635992AF8F3B38B4480D9A139B1662345A8ABE1634A
-77496C3F57597D2985E9E54717AB2E99CA35789441BCDDEDE9A9E2106B401D9684ADBEFE40D607F0
-75C179E9CC03E59E65430DB70B441D43DF03F2AA6FF06F224B6E455B01C64FB89EEC9103E48453A9
-749B4D602808C7E408A8903091D85E06AAF635D0D529C3CDD1B8479AC0F4208C284BB678A547F2BD
-77BB17C86D4560434F7AD1937760A6AA55B614CFA9FF8C9C96561AE6C8F2121C4E20237428BC51DF
-2099B6C49E3EFA18E6D439E6E6981E746EBB1DC461259D8EA0F8099C47CCA27B2D982B72C9A07CF2
-1B3C05D6E26E6E286E348B8944078E24809F9C5F3D014B4CBA02533F5621BFBA1F0EDB776C634746
-703C9F73BA89B1960A496420C68F54E5B901A6D733D7ACC79F275FFFB253F389AA480084468BB34D
-A1E797E43B7F6E8CAF5E8C93069A3A2730E57EC39B677BB73E3F07C2055599F7062E53B37A5F0099
-907D2ED87FF7A82C95FBAEB888033BDFD67BA3A6031A4CDC56CB1E4CF5B06B46E16D988BECCEFACB
-9E1C037023D7BF5CCF5D65AA66A17AB361BE7981F132A578F3ABFB97960A6034F052D9D5AFDC0679
-782EC90F240F943A5F9A3D969ED7399254FF67D89DF668F7C56FCEA1FFDCF20481474AC8495D3AF4
-B6D7EE093E369C057F0B70858220693B398ACF8E8143558132E4391405E30A73937C53402E459F4A
-A3539CF7A99A3F51C0307D045DF8B77757E92EA2F51BF0BB4F77D3904DD355665870C2B59F1ED7F8
-4FC71FDD7F0B6C5D3182DB77827CA6A2060D2B8C83C4EA4A432EF43A4D0A952CC6CBBE52A9F0CD66
-1A538973DE41FFE9C5CF55F2506B9EFEE51FBAE5E63BDCF5528499A47C031163C88D3022606784DE
-2F46A9C9235AEE3D4F71D4959B0CFDC5B7E78C8C0A8F9DC99440C2263DBACB343C5C648577F5610B
-50EAB1CF7FD02419EF3941C7CA0B0E64EBAD4B2CB05A0793DBC38F1946D44767BD287F5E9779C611
-CA0DAAA1E7393DBE0683C8D3455CDFEBC0E64B54B737E298DDA605227C0C4BBA87AA3EC7FA6EBAEC
-39E6EF2537D5974391D31739D9FC42983D81AEE44711C823F35F8E2321AC74943871739D2DBE9748
-FE68592263E7713F27E0D49B9B5CB7A4E55DE54E6B800D15856450FFD3AE5F287B12AE4F438B20AE
-9E27E6CAA00F3EAEADBE08432684FDF9931E925544A680182602A3C1997DE5D0630BD5A010535E66
-E1C123013D23966B3545C7431C39B97295BFA4099D14461004C42C85095EEACB9B47C593BC6DB863
-533A8619BAE09095DE8ECA432D4DDD49AA600D277E75DC3F5C6631E2A05382CB007825FADB77438D
-CFA78E252D79B6A196D5164C2FEB85D75ECA25FF80B1D97FE10E87960CA0FC47C41D3A213BF141B4
-8BC3AAA93FA86245064668394665BFD52D12C3BE4CE39EFD8111754398A944C3FD1AFA98EC337BAA
-AF899D35E804CF416AD7FE45FFF13FC6354007501043F98FE8428DE8013901BA6A28711A2CA85A27
-0BB135B72F1D5026E8217581860729E94F2F1878A0E96C59E9F62714FB5F8F25003DFC7347E99007
-8A9A331CB3A6A535BC61866F02513DEB982C4A13ADBFBAC3FF70A7335F40D5489E48E5EDEDEF1619
-1973D932479C62183B0E25EE8C4F76D4F1AE45DAEA4A12AEDD9EF81D248E8D19F8C8A5BECDD1EA1E
-98783EB7A38149170851B1942C96C53DE06DEF80913BFC04E539EC67C110498D15B78268853E5C72
-F485F8A27B768569E54241F6115875E2973292CF48FF91D45EBED627AE9F0766D22201B20AFDD40E
-5B17CF337F2999E0BD15B86E46EB3C18FC12B7DCADCF9DD50C6C7E3F37E615A892DB3F57E250A072
-A49F7277DD6A2C8042698233D35A699B17ECA5DBDA6D250ED4A16FCC893BF0DC2E33FB1EBD7DEDEA
-3C1C39603C8B7E1A5A833A8FCDD5570BD088749BB232615366687962C7E56ED089CD7B092505CAFA
-5A80F503C4CF337F07ADF0D106937E25670839D491F7BFF7A523DB609D126328C16113ECBCBF9C40
-04904427A108618AE5D4ED809F8CCAF72251104C94EC5BEE21F91B179D31DBA79CEEE5EC7FF698EB
-84AB1D2D1A624F58B3622A78844CE51498B2CEF38EAFE259D22C7BA61104651A862008BC1DDDA58C
-C45F663EB26428DAA85E7785363A69D2790996EF5D9621D53042F42F794962FEA46E46F37B8AD1FB
-76FC8D5CF2146843F8CC625139C75FB42DDA71A752BAC48F294E4C0C8289FC46DA5EFD9C91BDA6D0
-27518B7E81E8B21F755A9615627D5812ACA674D1527A1185EED4E3C628196E7D0759B1CAE6B9B7E9
-01E9599A65230F1EE469CD33B9BD9C104C44E3C1AB966C9678BD0AD78111A4E0F2D07A01A038CEDE
-7036D0534D684A1562A17AD64A00F279200C0371B1CBA61747671D2A21D3F9646CA290F6B82418A9
-6FA177C6278277504B7FBA936325F5FA124AB018A15DC18D2C5E8F93CDEEA52BEEDB78A57828D81A
-3E6C38B9FAF3DC4EB7273ECE3EA4482A1C6242A335862C2C3717F9C9ED95F77B140C4E1569B2192F
-C7DCF702D0BC9A50428EC406F8BD0CAF886B4D979320D3E429816D88F7C7146D960AC12E70F2CB7A
-9F4E3E366665AB3F1B4B6440F55EEA26DC9EE0096BB7763731740A537766490C8C174723BF0EB40C
-53701AAD12B21D436ADCE22203C1053A9DC4E9F17AE617888C4B4E6F3A720E4E6366BA628221A387
-D8AB15E04AD69387C310D3528BD2FAA5B22BFF3FA494F5FBFAC4F771C9C7402B95580C5AC4BB3AF6
-92A70CB2C851FA5CF1173EEC3EC29B5A05A0B728BBBB51D3B7AD8B0AF17A1563E82FAFD93F8B7118
-1FB7AFE352874F4EC6D334AB6747519AB8E847B7BCED33EB5458A828E074E74BA621BDCD03FEA604
-7F7B6ABDA01FC7514BA1AFF0D4D0C0CB8F4E42D5A87E395D9ACDD02CCC220C157153422018725846
-009A3ACD8C8CDDB66BC6836B4026FD9F526AA275D06C813179E5924F26A25094E7BDA8BD26AFC4CE
-B41D8964D4FC4AF1DFB0595BC5D6714C32F15DC7194E9A3A73013C45D8FA55CC0550A12D9AAE8E9F
-F199FA28EFC2426D8D1DEFB93A65717AF3EA8E2D5B4AA8EF0EF38E9600F7D4E7D9F1D67A2E63ECE4
-789FA74B159BFE2F91C19B0378BA52E93DF12830D99553B6618645E26126842AB70262D96E35E5E7
-50ECA0CE3458B3E51BEE2F21191136DFDBCA39BDC07939E521E4F492F392DEBD029C1EA237BD89AF
-76BC89F618D530160AB16269FA6B693CF14BDC4EC7C630025703C5337F61458FA09104EB15C7CB20
-AA4C9BDB7CEF3A09F25BC7F3149951A7CD75372993B80CD2112F7674CEFD6AFA764AA3486730D2C1
-897A264D82A91709FEC4A21E30D812F558451804EE6F3DEE2C4C437846BCBDA07C5B6CBA1D94AF02
-9163B7383CAC6E088AB1DC14ED3743EE77E26EA7AD3119A76C0B5F925C4DE305CD7BB3A09A453947
-5B9BD79BE28FC462D8718CE05F9D94CAF3387BA55E6E447BF81A9EDDD3A34E17BE66BC52B0C0BB6F
-86F6F008829173816D205182ED2ECED319864A796AB65D4E3950288BADA94FA32B6F453AFDFC6C39
-A4FCFE60353A64627E2057D4B379D3240012B3BB0ED0C7876CB83C1BA5EFB6E2A03F340C2B576731
-F848F762A7E1CCAF267EE06D621BC33FC245D0E1547ADC12CC0EB58B26BABDB8EAE9CBFBAB93836F
-FF22BDA1831DD01B7346AD377AA298D84628BF1C07433284B0A90FC89F5AEB2651BA2CEA405D4F52
-DDC0E74B871D43F71EB4ACE0D2B401F9348EAC3A2EF0AD295036BF6CF6F870D58E00B619D50EA7DD
-77BC28DEF91D805CD527DCBCFDC16C042BF9B874E3B1567EBA4C1E70744B9E7E5BD1FDA6A5FF6E10
-1613FBE58DC46CFAC1A65ADAF65E49757E9304E2AC9A91E0588600C709A61D4231730073A36D473F
-518A145E141D0A5A494441B9EA99AC23F60F54F8127B477E1CE698BB4129B4B1DFEEDF10D9E665C2
-47A62F112F5CA30B0AE5DBF3E495FF06EB28EB438CE8AAAD84D5F50FB56A3AF002C23BCF66ABC270
-7AC233FC0F2723DB99D2CFE7D3B3667732A531F5DC315CE74EDB9050BF75D29E6430F57CB6778B2A
-CBD57DFCEF896E6766C8FC5C9F9FBD701CD62CACF33EE0FC95E78DADD205B5F42CC63024624BAA0A
-B4DD447832B4E1DBA77BDFADD223989F8E958C8D759AAA37930664C6EFEC708116248A2A7AF3D656
-DDEAFD009B7F5333854608E67E5E588A857167ADF9225CF6C641F5E19C3E08678A281199EDDAC831
-B57223B1BEEADFDCBC8F6F25D32FCA2336C808162E8F381656E847FB6CB13969572425AA05AC830C
-33DE6E030F86A3A85D2A66A77F103C7042C97205526DC882EA9A00EB8BD5519847EB424C15F808A9
-1652A6CC89B66A5731126DEBADE123C63D88A2E550FACDEB3886FF98646000C64B3A91078012CA30
-904B71737CEF6BECABD43DD702880538F5A70085E6CC6015D2163681067C3D513A8C66032C34A0FE
-17A58AD4BC97CA69BF41F11D5E910FDFE9729652D3EA21F8DD8CC19160A8FC77573B1E9CEF4E790A
-79D8AD6723B6804E9616466C935303E063DEE29CAA6C3BAEBF278B818C2EC2F13ED645AB452397BF
-00DB8B26E115026E256746CD0C78A959364FDE6DEDDCD0F441A61A1EBA32C7BC172BB09512148D1E
-BAC9E791B7D51B71CAD2DC9B83B2F99B3726607D9CBE58B499A13753CE87FCDCE21C0AD0528ED0EF
-B9B2C927F57C78C626248AA2B835A0791244C5896686A66173EC9F802C4C633A42B086334D2A4878
-0E53D00809247BE64E529F96AD2F8B3922A6097D414DDE1EC76F9552F9B8D58B8E34F359AD792B2B
-E50C26DB05035E7497162E7C49C38D3CD9B98D620AA67492BE5AFCA3A81A7080185C7F0B5105223F
-1FA77805502A2E8C5FEEA27699858D84A95842C5F2FB68686D59FE24091FCDDE139B6463BC6C7B1E
-0E90D20A83651AF00C85797BB9F53ECEC1675C7EE636D0D9E77DBD8F89670F855EE4D4800FF3F695
-0EFF09BBF8A0DAF6B8242840CFA5BA73BEB95115F4A78BCC02D85ECCE0C0F2EF6F328AD1DD6CC049
-5A3315B414A4D61DA50DA46D7ACCEFF6EE56451805D26B0359AF193531F95F6589CEAD6FA041AF15
-3067F88A0A2FECD135C56682DB2B45A71D1FA737C064EE9A4F404BB72A70B3AF0330359393247EC7
-81512482579865240A23CD8479F21C2C44A119EBC4E81B308DD8AA86E60C3DD8ADA50E0DFE8308EB
-1A7F201EDE8DCFDA405AEFB47E0E6CA7DDB376DCB21D37F7ACC4D3E9F26B03A8DE0E8940CA3A9E75
-963A389DF8038D2C486072F61C0CEAF500753C7A6352B1CD0338D9212B42A4D3DA23D5BDF44C27C9
-4B88A415A3242FFE2E1B332477A21D2B9CE075EE479C6E657A4D8874A8C53964229310E01ED4F3C6
-86FEF5258EDF3B464DD6FFD7F1CAF473BBE722D60FB14AB4918E93878A8AE4773930B8CEE110F476
-7F42A52D9304C55BE12846C911A10AB9B2E036BF9DFD597F5348D42233315FA80D0F563C388BC253
-2103F05E90DBF1923F229F980A2F4585C7A373511372D07DCBACA583099EA972C03E5AA67E663882
-6DB134564DB993CEEB6E7A6659C7C5C05C310267D5F8A24EEC2D5CC3E3F3C808E6D6068D1A57646B
-37FABD98ECB7BAF99E7D9AC4414A491A73CA34C52F394352F6B5A15F0FC4D88622DAC694699C2464
-84ADAC3B1D366AFEDE2A2CD2042C90516A666A19A91C80248B11224BEDDF1A320E230739E755D098
-B6A67315535F4C187CFA67ED817A035056353FC859BF286317996FFFB478A2248B908FF12ABDE705
-402224A3EE5F463DD3D243875C84E02DB968ECA1CC52C75171EA50D6A88CA91327A7AA5795019F36
-C0A19C093A1C9D3723C7568F9D41F2E4FFB712FD47F897703D7A620B586B81936C84AAED61D84332
-B3BEBC4F95B796B93EF7A1F565C494F8A65EDB21E2EE18DC025522EF8E599887CA2836069CDDD889
-88E5862977B7472584303198CCE97EF9F9E1446D1F1F5ED1CFC666A8A0C3A03E1792EFB60A9B4065
-49E0DEDF6ACCDBD98742568B4735A747D8E5DE21E630125AE0C691D054E42199C15B1F80CAFA6E7B
-B2005F374A9A5F9900ABB7409CCD50C3AFCCAB1214E6A856F7C7EBA89BC3291801E1343DA9DAD2C6
-ED075C8ECA1423B43E587AEC67E6145272814B3F191B3C285639F9E2D6E148A02DC2CBC0E054D629
-5CD05DBAC1950400A9189316F0265B86A732D302C5BEE8ED233768F237C62600CBAAFF3A110D5EFB
-6CC7CA3B92D965CA7C5E8D3E64ECF239FE2507FC797FDBE54C1112B28D4DA44C60AB09D994C5BA78
-D663A2591934CC052BC70CD1DCA3325C66C9CB982E2039F5DB70C848D3DCEF655B1C2CD0CEC8865F
-E8E1C0A267BE4F707ECE6F5A3DFCA3CC1EDF92C760439F51AA69A4C1801E96CA4D6EA4AD980258F3
-D15C893913ABCE09101984C61B91D603053E49A97CB82FBA707DAE8AF1D579FD69C8481CB7B712CB
-CDDB4D287BE995E32C02B399602A08B9DD849039B5673F1930BEC7BF366EB082D2CA5DB2385C8CC4
-5BE3FC0E31820191A814EBA7C4F23B1938E6C4D800732787CD2CB97F762DFC85D4B798809B5F2254
-D826CA42B32695428D120298B44CF38494E56240B75DF1E41E46E53C44DC505452256DFEC819408D
-605FF14D6C1F3F152F2FEA96EA0AB3B472D8704E06BE9F8C3E8395CAADD06D6DA033E81ADE5DC3B8
-3DAFF743C6E9E48716003D358DF63CD7FD3E2F727D1F2D0C29962F76D5C95ED44B6F08D052025A66
-5785F264A3D5F5593677B630E628B5EA81FB37CFFD7A30B7FAD226B6FDC82B0878AF4C0EC4F4243A
-807B9839EA62BCBDF7C2E9B30A623876E632E084EBF4A21EDA04FC88A1C07021D0C72EC3E969D449
-FEB08E5826EC20E55B21EA71EA59F6E3B0710B0DDAB3261B4A2029ECAB68C19ADD5174E55D5E984A
-4E5F38F592A302FEE6ECE732DDE841A28672C620CC5D687455A5C06FA9FE688394A04F96312ED025
-B7AA6FBCE2925F3AE559CC1886BEECDB70822E2E5CA3F732A87404B1536AAC469989E9610CFA440A
-CE43875A70CA51F36CB6F629D9424C1E35A88F92D5DA3CD8CBAE6E8425A36968E21F4F30349749E0
-205BFF8D552837D6FC39532525370BBAC833F75F1854C93FC533A4AA53ADF7008173A70D94A4EBF5
-38EA9E62BCDA7C20E0A073BEE2EFAC34D2EF1D03BABD5147659E50B557045B2EB89DB303749B04D3
-F54B43FED612FCC68206E001A7AFE90230D9C12F74A32C7EDB5D0241DC3A5D51481FD7C8FAE08FEE
-263FBCED7C7D911B3A303C835AF5FADFD218F61A9D6DE80485ABCA88200047B094441F7767B97A24
-E8C612590FA2407BAB1E8B56C71914EEF2355DD97CFAFCC192BC06FCE063D3D9D1A629AADC75E3BF
-207234C208E7E30663EDD691043065C9CBC473D97C6D4DD3DFF59D6A9ABCDD4412C3128F603160AA
-D8F81C6E7A4DCAF35F3A99B4EA10A34375B477C2BF846521A7EABD4D28078E9340452A198F3F5ACC
-3DB7E3908939FF6E3709C6A3FD9889439A4AE3E10B618CC92E14B68429A3AD2C80940A1079452EC2
-66F254657BE7D79A2A24084AF73F6DF71FBCD32BF6913A3FAB25F977787F7BB0C3A3E8BAB38D7A2D
-B0B4826950643DD1E03BD7DD1FB149A33862A89226B7CB454DAF613128C2075470E42E70A9444A8E
-6ECA526345AB48E6F5160BA23B5BDDFDA6049EC44ED1461C7E0DD514B16E2FB285F72039DE3C7982
-EFD40D7F6C8E8F4CF35AC71B467BFC578002E8D2239A2FD2C4BCCDD8AF3D7DB1F4AE7F2D2E0811DF
-9D0155BA6EDE50B5F052F14F6AB884FFF244D8806C07EBCB49ED22D85DF696995991A954AA97A1EC
-D86ACD76E061B7541E87997FEF0657A826BD88EF3A4A5920462C6595E7A156F453291CA044CED810
-860C3B0149BCE73BECA713040664AD0591304106129600AF71317B0D2907839CEAC99515D357E980
-B1937B6E1200AACADA205421001F1B2F91753E80D2263C56AA164A74701A8D5FD28E46480B0DD963
-A683A1F355D7FB4463C7347C94EA5E2CA40B60B56297CB22D972C5BB10E56715A955605256C1541D
-9F3BC5768A6F355CD3B863F0FA1A781EDB49368F51B29481CBB41D4AEB07AF9DBE8F52C5D0FF75F7
-FB6431D37D6AED84D78C778871CB0F715B4F07580F23B586C969C81B471FF6A6C7276F7E141E02A8
-584D4B9AB00E7BD643D2C3FAAA299B1F1E25048461952EA42D4882768A70DE46B213A287F8D31AC4
-6D5436F22A796C05D1FE50A9BC2A928066627A0D87DD57A3AD91DB446404B41557D1457873482005
-EA20916BBE46C613F456C849D46BA79D20627B446B2F49E3FA309AE14F8C420CFD94922CBC0FB9D3
-5A0F7DBEF577F1849A1A80E0011DA8AC082A8C6F61658E65AD177ABDF23EE17C8CF0D26B9FA3A6E9
-4837EB9E930336889767A8D7EA3CE980A8EA95528B004957BE6067CD9BD8E02A0F23CC1762CCA656
-D33412FF45E917FD4A03EB6E8C1F43FDB0A8965A33B4FD26BC24A20B304CA817E88495BA9B361A3E
-933717FFB0271F7F70C5D3CBA1E86D0F51BF3ABA194DAF32C35C796627D00C7B2271ACE2463E37E9
-7B3C826CF3DB60028F240F9452CBE08F7EBCC5FDB1BCBB3C327A9F450B9E5671916101D6E3E5E458
-CA31F04D12F592F83BADA2C3683D3886AA3B403963AB5DBE220FEC00037A745839F67A3635DFD3BF
-F08F367482962DED88ECF6322852D643A54D5D303EB04BFDDEE9BBA1EBCCBA7C653B3A613A8E719A
-DEBE3CE1BD7E754E5F4977E863E3C2D388A65227B451D4F3A4F94E06513CBA4AC1F2F511613FF035
-611684CCC461599000E546E4D972CA6960E095A526E4735A23421A4C9B597ECE08AFA2753592BD16
-DED93255A1E33DEECE3C5EB77B94670E8137F2A4A4B98AC193258E7DEA5DB8408A806188F2D1DDC4
-40CCF0E9A6E2F0C78FDBD7B68DD4939D2458C1965BF8BED4564B32462FFF3EC892C03B11D3EA813F
-AB4CFBE8D3016329C5B7E3DFED0F08284D44AA0B7A2F6BC96EA4503E8EF52A64C22BED6B452581AE
-8FF8917D53976471941A9116A2D878FB2541B561767ABD4E31CCD8A590CA03494C62AFFD64EA0A1B
-C779173DAD84999C7A8D844EB1259DE7BB5B25CD023537A474A524EBE4660B22568949E624D8FEA0
-AD37F4CE1EC75955EEFA49C6BF1803BE87E9C9865FF3F6B8525B8C15FE8835CA153D27E6C0FF0CA5
-1029A7A9185D25F0F14D86FC797DCC1F99EE97E2054B9C2A2E06FDBEB8DEF6CDD368BF23A858D9F8
-C1DEFDCEAF1B4A8DE5EAFC604CECCF0D285BE00AA912EAB66EFF4D37AD2EFE34853BBFD87CE09B18
-749B489943EECAE7887B006FB827D10191DAD18466CD1F86505879310A8B171F902EA0C26A388E13
-B53C700272CEE2BFB47ACB58247C13449C6BB9D01232C32517358F1A3DE064D43C18F8827D53789C
-CF3CE2EBE78949A6ABFA1A6B8414CE360A5E22AFB7D1DCE6F5A06182C3B984B4F9BB1A905A9D5A14
-83750A1DE0A857CD5C06945EB7D4A2A6BF1237F32A154FDC06D51A703D44FE052FD3C53E9E8F417B
-35D1C851F9203A8997521529F21AD8498F96930AA77EBAF82EE02A57BC77C792D9F220294B45F48E
-A8FD94E01CD25645D36D168923562F3FDC93CB79DD4760DA0C103C2675722D7A1B79FCB4245ED12F
-A0DB52492C9CCE58B333CFEE822812F7DCA68E802C451B5CFAEBAC608B950386B6C58239D1C62D62
-4DD5D15782FC552222CCA06DDF387B373E32C3C2864C63C768350C37283760F3515A5B0AFD66C48A
-B522EB3E808C061F5CD6BD96CD18C9839D30508E7D4EDB88E8F11E31E10919B16B7971F06D7877A0
-58D8A4944C84FC6CAEDF3341B48B6E0D3C7B85D710E0C35F5B5053CF4B4798B3778CC28B2DC7AE0D
-F3A49F9F3BCD8E95D746C35C3F47D68B8AA35D97AA08E711B5FBE70D1A623C82541EBDC51A827D0A
-69E6C049087AD26F256EB7577F58CCFFBCCBA5A95D093DC29464C9A38DE95BC6B1853963B2DEB0B5
-7AD1248D6F1625E115EEB9510B5772AAE4E3C866657DB0B3BF0E0AC345E116F8D4976B770876FFE3
-748C36165522991F46A36F193DD1A1C94713673C7E4C81582391B636C72DE94CE6254374F99B623E
-5686C13D8A8322E83E11BB0B0A896C6A8C2C4F756C5385CD7017F26D23F7C3EE97372C868C8C9155
-81723BB6B76B4C3CE8998E4FA6CA40B633DFDAA59BA902A4952DA90EC4FC3CF0F2676ACFA7F76F78
-236FA2DE10FD3545357215246BB7E527F277C28B353CC6D79DCEF21BCC8F77603CDD58A2CCDDBE3A
-9802F941CED8E035313875319548C41992A2BE939A17CC109426E33825AE59BCD17CB19F50D972FF
-CBE7D9B4B0BB095303D9DC9D406696C2508D6CE99E11CF00F6461147E97449ED5F486D480A86D3A7
-ACECB7E9A945984724EFC21C5079B1FD03ED803C2DEAFCE3327D2D7827715FD65D9506216C88B0FA
-26935E95C64114A51919D419038B1A7E9C1E829FBFB53275093752DF19891A97F3CBF7719C1FD6CB
-17019A6D2D25360ECA804C4B35172662CC4769D2B785C6C87E5A4ECCE31704E59F71263B7C3CAEC8
-ACB4C7426EC25F11A0042323EE6C3EEB04284DBAE2C770BC419DCE79BD4560AEA41571C3B595F525
-60191DC7A8FBF63D413A77A0905E517441B16C2B501EA2F9E99CC38D052679F288FDF1894542E3A6
-6989A0090185EB2E75134BFA3D9147C3DB8A621D9D35E37786853779E157B47F71626D6B3E633005
-9159C17596C1B87FE2B4FF47ED9D78FA4C2160077276C8B58CEF5DC030B4A5D83CF257096C047FE6
-4DE307C598B815058E72D5F57DF5C369E664E137DE29349E2F9DCD8C9F4EBA6E765B6327D7A20DFC
-B20711273FD8091CBA605C4C494248076F7E03DF65A6A50164980BBBB708741E5BF6056E6F996DC0
-7FFF408C5B8EAB8DCEC315E92873228C805D4440A6470E3EE3983758DD211C9CECDBFAA4C9300CBA
-00608A4B2404A3C7AF017A3B7E67F39F0B51ACF950D3E75CC7BC2B8D3480202FA958E8EE0B240501
-5232EE0D264C7CA02C18CA45CB3C2DE322D3EB7F00F9455DB6C5B1F4E59C3E95520EC36D7D903CBB
-625D70B54BF6F8255E412604BBB29FEE026CC660577F91DB1DB4A613EEEFB20CF7AE3CD89D565AC8
-38416B01B5DE4FFA5550D17FB51FBBEBE21CF1D56038863EE931B90DEC2E211ED42BA92EC244D4CE
-2C4EC5CA87A026992772DC2AF754FC982B94F36EA7B7BF75E0ECE90CBB2A6AA1A012E8898BD679C2
-3CB3827C35D5D02F0569C7AA82615D4AA67518ECF668D3B57D6EF1A8013424AC2268BA0D9A74D588
-79EDCF6382A89D397864940303EAEC45A38304BA8B1CB198967AE23EB81054BE74B16909A405E8A7
-799CEE3C270FE2A6DC50BD7370B6B2C8FDB9A87D88D5D40348D3984E39C693B6F4486D994778607A
-80A3122872DD65E40492107C71C3CF708A9717E9EEFAFBDDC239C53AA9645B711038E59C8B861B37
-411AB2039BEDF9CFD00F08D9C5D76154427FF5DD39878CECC5D7BFB3F1F035087185C0981F3C2139
-BE84872FFAD3408531C4EA9387B89F5E3EC779E8850D50992DFDCF9132BC551E985943B07618AC10
-D1150451F0844C0DC41D6E17EB508DC8689EC726400D5A7F6FEB3CC7BCE05F09228B7CB2C5393664
-D8DD9A4B96B1020EF25D70AA2D91CAE93AFB5F2BF0AA18CA5C599FA1A708EF35BF8F7FFEC9AFC1F2
-42870D028B2B1459063B493943EF1283829783E1010242E5CF4DA39D93D506F3892936E7D6CF1124
-70A521D397438733D053944CFF12D6FFAE8246F20618684F263715AA98E15D72A526383E05C23214
-B78338E5B476F0981D90056E6E5D0DB66B1DF2298E597B2ABE1D817E18BEB056E65EDB4234342D96
-00470B1420C9210419D834E431B82F58608C87AC361A02D0F1FE4B470A3D71E0D21BB87E1023D428
-E23D596CB9E1A2184403A16E36E644BCCF9BBDE27290485057E62827283E7380AF786BF395B3961B
-A5EA469C315763FA59E0F176EF81985F38B882DE56A74D128E256D1B89939728E55A92ABA21A6B78
-44FAC1BA7BBDD8B34A18194A2984B000380FE9F672E83EFDBF276FE797A325815B0F25CC95C97A9D
-ACF56D583486305D7C9E51A7E337D14E3B900333EB38FD93A99587DA2341B10C059C71CE080FE753
-3C0F059FA40E560AF9C4A41A4BE6FB45846FF8F78165E10B4AD40F264BCF5596A1E8EF8CB6EA4B1A
-3A5C69059AB1563843679ECB2511A90E8898F54295649CB73D277760D8D04ABACC7BCC6E777A0530
-E2067CCBC08673F9C8C178F9D672AC8A15E5367F0C5651B53E75E0CFA57C931746AE1A679C246D7C
-9417F1CD89DDDBD1173C2F880B7B3847CBCCEBF99F7122E832D7C9BAFE2B54CBAA1ED48158DE3F36
-238B76B0E67644A28AEA996DDC006F6AC0242E4B667639E7523CBC90A0561193C1AF34481C2EF402
-EE43A82E1EBF4E3D601BB36B2D95CD93550D61CEE7A94E72F6D30C32C8F91A61E964B1F66ACFC398
-7F95D4028F116E9A9A8474AA29C1C1A984BE0E393BDC41DCEF6A6F1018DB60D52024899D8EB5D55D
-324D73F39BFA47377B9E15B3B06A7585589FCF52A54684173E5183367E7B0952DC4BC2767C4C6247
-B1D6103E52BC7B7EA6298F454C5D97AC575F19C10ACDFF4E10C7D3755CFAB4200CAC545269FF1D8D
-B0D607C7AD47F40DDF257AB4E7D0750577003C13E4941960C3DD7B0774DDAC18E8ABAF8F53E03CBE
-F6D57B44F24CF821014C064278FD51B3427593D17694B4ABCE81F49CBB984C5878CDF0C38D1ED7FD
-99B0B9A3BD8D8FF6219588B3B8FA59D0CDD1D9B2F65122AB45E48F1757467B9204926140E3C350C5
-A927A2E700173053EC35D3F1DA2D7258714C97FAA857F0898917BD94625C6D1E2D77138EFCAAAF51
-7B17FE187A2212C24A881A2C6A647DEF6376ED80AE4175C5EE80921F001995B44E49F0D33DD9075A
-CF33BB03671C0BCC34AD5784AD1CDFED3A6D9BA103B3DDC1CC2DE74DBB576A0277715275218CD19C
-A8899209125266D8BF1286F881DCC2C383749D1E768D670F4099F7DE959EDFE852583183C9111601
-2881A56A24AAF020EA45CD5F39660DEBCE30AC1C7B8CFC60387B1B0C3E361BE612FDFA9F01B7E4B4
-A18839A2C7E0E393EBC5AD9A8A4EBC316A740C1C295D9EF5F4DFFA0667F9582C0BB837B142C4CFC6
-B1798E9476D0631111033B8BA75A10FDC800E2AB1E0E829632F869CFE4737BE9E2800759EE0831DC
-7D1195EAF80555771981DD6DC6606812D92CB8EF86447F5F6C6F626D0E265C67E52A6319189EE349
-D48E49DFE6A9E98F76C414A1E3217AE0A215A17E54AA498F4ECDC50242ACC7E2322F63BB2FF2189D
-057E7354E32A3ED1803116176B9B9D0129930F919E2FEC280B2C8924E49E7BB75768A2EE1DA8ADBE
-D4E3589906DF1B923AEF84C1BD327438B731012E69BB0D43A1842CB88BB54EA4516477F704CFEB28
-6E3EA483445AD4D74586FCF32E96D366901084365F693A53C5FB532FBFE7BC0CADC404C4985042D6
-8DBB90A6DCDA3531EE324D558A214F935CD9FCC9A0CEBE9B5FB0323F4B3820529599EF48EE068B5A
-CE85004FEA2984F0A86F5AC9D56163BBFE1142B774148F1EB0A4DC89C3349052533A7DE66729DB24
-41B82F8F7360111DACF69293C9B281A0534F3E9E9224A75C49A832F28B2E497262475507B6DDFA9F
-01CA0A6696E3F5AC7EA68595EBA0C2EB8A47813FF936D84AC1B23ECA7AA2862B793CCBB0DF9FDD49
-31BEF354CEC12FBF478559FEC29F81ADF4452E83963E56541D31F3691C93A50F0BBA5E9552C4F2A2
-3A6E53060729854A3DD71CC4308B91957DB19E66AAA18FA67055A950F1C2CFF78A03BC1A588CF624
-696068068719AFB1001C4581EE072113882D9052B21E355D401ED8CD24D067B99E616BDA5A0A5A93
-36FC499632B79FF2FD0DEFB096EF46B75E2D4E0F48DAEA239719FEC4D9A29818F5875FC5041A9EDB
-D26CAF0ACE14CC80BA49BBA59E918EB3D8F1E541AA16026585A2F72DF7D83541816DE46981FB3EFD
-0C30E458CFAD04C79421AB7C4925E23AEA07F9F018431C790002596D26BD9663B51B699DF53E4882
-CBC34EDE88EB55045B889B6062E35FD1E018BCE785157B85EC3B9CA6C85D4B16238275385B8285DB
-012D8FB7C9F5B946A41D7A0FB878FF72C39683144D8A007CFF631B43748F2D5FC690300F9BC0C837
-006B92ECEBE0605E8C3A4A400E18AE8997D1B45FEE10068E247C647CF82C6DFBE5E881D511FFA687
-B7AEB78546BFD07D5F7EC242DCEF4930D8AAAD8C6152B6642AAC325963FD147F236BB850A9966573
-9D06CDBD7CA79A527DCF461E33F22BC9C5DB00DA2BD3DDDD8C99D99793BC98282AA8872FF96C3942
-85D82D9419EB78B6AE37A5F519397700F75D624A09BD255B576E955A323E784E8FC31131F003B0E3
-024A4F58FEF2A6C043796201FC425482E1155E229D1B2D43EF7B0D22322B22EF5C9A1BE026A1C3D3
-75EDAFF99597E1E5477952A4E8D2ACF5D014BC00DC2A272FA62B6983E27D228881E2EF2B8B95A681
-CBE90C5FDE16331C85222FE2A16F0A3C3000A63E2E21666C0C119F8AF89A543D37977069A5ACF155
-6324F05204CE8CAD50FF4FB630D9CBBFC324DEDA584AA56A99D3A76FF55BDC2C2EA3A021361CCD4A
-83C7A5E2768D210FA6DE889FD48A39D679C94EC3C99A8D33FF11377DA7F6F1B71A2A05B302ECDE95
-4F26773F39AC881542F0D0969C3995C3519A8EF70B4220D86BF01BEECC6462855E7B686E1AFF1CA9
-1FB8FD8B4A69E10EE0C2AD94ADD44449506F9B6EF43641F2026EFF6E605C670560C2B74706FB949A
-A7E8CC6A2D0D6207E457E7FD87EC1B9092DC68B9143947CC8ED14AFDDCBF8FDDA228A76847F96802
-E561F67CEEFDE45AE587673983FC04C96744DBAA83F2DC838D633943C75DCB9E6410474EB27B348F
-26E505F0AB90878940E846C5E9F3C5FE8C3558C3236B1B88C405716949B8506841CABE1717474BB7
-C30DB91CDEE33B0F844811762FAEC535BDCF84C1C747CEF9B1FA61D2AFB5A81335BC42C06A94D7D5
-9B7EDE55BCF6F9867AEE107555CDD084B7684C2C87087475A39A9DA6347BE281CE5635A4D07865BA
-98CE26C1465B1AB0343F49FF37B4D0CA9F3BB693D78DC3B21925CB996A038DCC172527FE57C07460
-EF39C07D4396E7FA970D9F22ABD21A9C794B64AD96762C7428F59A8757C36D6C4FFB23216195A04C
-2A2C2E7B10EF7193931544D782FEE4B91E01119C5553BBC6252270A8D8C56DD62D448F5AD8DC69CC
-B45E1F17F0AA1E445129DD00F000005B23D38DE93A3BE55A4C041947F36B4E4536E307D0180553F9
-2E46B743881CB5D5386C48C7D5F84C2BCD06B9C501F78C7EE61FA23516791FCF4DB278AF688A2E60
-10A56692AD92008497487EDFE4BD5FA083FA544138B20D6940020887E35D46E093B71F7A04A67460
-DC8116B4D4839625D7CA6959D6831CD93F81AC4EA2709036DD738364FDE71113BF22EBF13DFE1642
-E564701E6F0FFE7511EDF03FE448C2B28C64FB7D54B94CA576E481FA56B2B18AF10C71F699B6BFD4
-7459CDE1869D0FD306BF489A6F42E5B2F05CCF55BB6B9526973D19CB134CA7F13F1DB3716F8CC217
-73A832568C16250B5CDB16DF24BF81D49F5B37018BD310262EA7078107868AB0216CEC83CEFCAB1E
-9F2C665A31585CA04DC01879CAA79AAA5AB201B516F7052B01B16BEE5606098393B0E5D9F9E5E3F4
-EB20F63C958E796DF41CF28839F5C62A0431648745D7837B519F3AA36BC6C08EF040CCF53D9B6D8C
-0C7D1A84D707EC57A3C6AC9A62AB37251A01A5ED40FDEC6F5BE6E34C6A91D058319439778A2EE5D0
-363E2E1F33463C33327D05FFC0CBF08D5BC457C7230448972FB9B4D0D782BA7DBF10D3FFEF8BF523
-6EC16D4DD6D0D870D9D5EB5C64C9A46A4F583D4F831FEE74B0E5B33A09ABFD4444929BD8F638CD72
-EAB99CF2E9551DF427683964A592E49D186F285258C5D5F62196A98532421D73E3495F82695FEEC6
-E1952C562D546B28618FFAEEBEFF03A57F4D855021F85B0C7BC37FCC6DA9AECA099B646B99D41896
-09D3FF2D56422F8C37E97640293EC7C90E3380887836F4938FBF495CAC14FBA5648D89282D8D49D9
-1AF73ED36581139D8BD42551E263E830EA3C6EB381D85C42D74C50DB0CCAEC03F535ADE92128A016
-0E811C34748309AF7604919B66CD43EB5CA975302DCB6076FEB6BDD6FF55976FE990FB0CE9ABB11B
-195403FB26E3D6C6A0DE1C5BE79E171A61E21F79EE8DBE7A832519813EF6B33EA098C2C32ADEA219
-AB2AAC8B093F40000995539D1276D5F2EF84CCD099B71FE4269BDBDB6A8D59C86F7D2E3FBCCF8773
-D0FAE97640BC1AD43CB4B992BFADFB09DBD0CAAEB8CD9DA264187C4F97300E9A6C9DEED5525479E6
-05C65AE336CBBDF4E5D7F79AD098F977285E065579B748FEAA97F2A753E1F962FCAB68D72BAA8EE4
-FF6691C23E31BC0F3E981A96FB440404856AE1AB32A7205B17D411D8F21C8C93B704D07EC594422A
-BC368CDA2B1610CE6A973F4474E12B78B532666797F5755D269772C9F5400B3BFC6C58395D38527E
-2CCCF29B56123F7DCEF3BDE5DC1DFC5B0293BB125085B1D2D929BC3EE84F4FAD571A4991C3DEE03F
-2DB3A3097E52B1A7D5C73CCB6148EAC62E8E36DE9A71C57638C6E4D5D9DED18174E8C390E50B4A5B
-913C074EEAEBE390B214B3A68F02862B9A296DB4B409769649E51D738CBBDFB7702E15C73C2AFC6B
-C37CE15171F4E822CF20EFE55D9F061AA43E648989628FF79E65932390CBB15D8E621333B18B11C3
-BDF96F841D7434E01AD501FEA964A75B248A35CD9DF9A37E48A1E5A09C624B93CE44F0042FA00D7F
-9EE89B9F7AB785E9C718CF6E7228F743271C2C9BBA17E5208B920E44E765D99D86650EB454B0FAAA
-112753AA1BD3A24239E9C5FC47EEB1547AC9D23731B8DC48B9707830DAEC60C8D3790BBA1120F776
-4EFAC542CFFBCD5C05F9510B27B2534B704ECD36C8B041FD49A96881302FFF5B0163A2DD09C751D6
-D6AFEA9170A4F4C4AB8D46E62F763FE1BDA51DD1CE4A27E772F3A2869155F762FF26B7AA6FCFA4F1
-292E56F03AAB6322BF867E7710C34D43B5D85B45AA68014AD7879EED051B1933E491496E3E26D9AA
-8B80A07BF2B94F1077E84A9726F08199887D66DE7A307BF33C30DD9CF3DA188088C03B2BAD09A217
-6B110DB2C868B53DA9A66C85737BA66C93C58A259860E294AD0191E3A72C73F40B0BD98699AA08DA
-F03587B78F391F3A4313C58D9F29B53C70785637BD0C58310109C54091AB0A34CBB0C478613A7AC0
-FB8F0A8B4645AC966395D8BA775262CD291136AFFDDF01C1D83DD4EB3B59CCAD18057FE7D92A8CD4
-A58F22508D9FD7CF356571F701BBB23E749BDDCBF8A317FDA0AEFD952BB18545610FFAD3AC143D35
-1B8DB3F66293375E0E50235F0D0466932181D377EDD32A5F0FFA4E22B5A0CB4F343D9A7E4A342E9D
-09DFF6C697630CD3971802C277A5590B8CA94BDE6B38446C794D072BBCCB724D5BC208EEF1B018D7
-39373BB910D668882CAA779C2D686081DE6A2606417B54D7C20E0E7F722648D893E4EDBAE8F00D6A
-6DA3712F91AE860C756D1127D133AB828E9D80023B50B162C5A1C5CDF70CCB3FDD7EA060ED20838B
-E1E50C4094C9E79E1A0187CDF780CAF45A725964F004253E034C5BE46BBF89D94631F1A33BAA35B8
-4FA2A9D08481C6674126CD96ED05DCE48BDA069D902D6836D5DFBA701DC0F98A863E64F0E312145D
-8DC0B77F25B43AEC729A1243B45B08CA228DD6101CAA2AC5ADCC8EFF84A4CA3F254176C2CC711EE6
-C273835D0FD3528ECA2A976B88E51FE347FDB60F32370B66D338931D6581630ED586F349C638960C
-31AE4204E89521A96E1219E696B913DEB2AAB7A3B022D06F34FDFCB810A04E60A4FEBE284C2F063E
-0AE9EDF87704921CCFA193BDC912B747E13570066223A49F1F6E2AF0D4D65DA04CA876FF7A462FFC
-9C0BA2CC545C3BD36DBE762F32B2D6BE5867C59F479195C92440DC165098B74EA5C3AD93CDF2D410
-B04C16BC7801E7956F4E5107450787AA592493171C3628E6B8F49D4F8429EB98DC52EF025F001387
-BC1A7093F7A99F10B5D2D7DD8BBB393BF6E56F08F4F7FA1A343F220D5A1EAE7168C74D41BE1DC1A8
-3BD65B72B982F4F7B34F24F97F9EC9A91011064031FACFF2A14921A32024385F4E061CD07D152E74
-1BF97156D951A342488FA7F5EF934CCAD13E2753A0AB7A1F565C2F7F6B349DF03BBC25BBD972A9AD
-F809BB5C5048A8CCEF9297B2ED3324D18867F293CC66E88B3A39D107B610DFE79A3B4E83A96D3D52
-A17FE8A62C9FDD271130148366942C9CE57558D023DA5F7501319EBFA33DE9E6D1E76D7C20DB8A09
-B657839DA99F3D8143F1EE6253A3295C9651FA4366547893C2DC7ABCBF4BB7609DE5D001E0A36D9F
-FBE01F7D0903B3208AE8547E2E5F14EC1AF4C2535CA8F4EA37E3F3CE172C7A1E8308995B1CC23E6E
-81190246BCAB6E755BF868D449BB02A2AA87C44C9CC0F571ADC72547CEECBE104BB274B8AC16DCB7
-5D5F458D356466B921ACDEEAE384E2EB1DF6EF393B41B9747F0A4FAEB4AF1928D9AD6FB7E06FDC62
-1E4C6FC98CFB43F88584BD55D9B97CC9549093EDE586912161931162B1B1D52D0443260DABA02AF2
-B4432100D5506546013DA703573FA8013685CC798CE501960093DED713FFCCF89CA2B9106390198C
-29A00864108CDCC1984A8BAB53919028C01B26ECC7925E38CBE6CCA8978EE21C2B06E7B3E48FBA97
-8E2A7D186E563C088F84AA23178B60E4729EE87D67B1091F3B6973676C1CBFE6530EB773C62E2C24
-97014AB0E8B71A1F4E86A378AA26591511BEE3CF3D64C94848582E1354E1605B6457823F2C5E640A
-D3802946BB2E7E8E594E8C04B430C2385DD40746CE8534F50842E74D7115F3DB0C72D1C9C607C657
-3B094AEB73B7A79876CFFC3E2F8C9FEAAA07D3BFCE05B61F7749A8793BE90CCCECA2D7077F25E899
-D3331FE161A7E86C842495D584C6E4A0880B2951D8A13B88C4672080A0B1BE36BF47C3ACE7288CFE
-41A8C1BAA6F0814A947FBD6B3AA72B6C73A8C578CA51CCC96F2352316C467BB960E981F2B6485BFB
-44B577E71EFDA16E7405954BC7C9F0759F5A9F1EBCD2FA9CC9648D5831A68887F41B15081A204C24
-B4B992A231DEF9E698D4C3A25B6F5474F5BE6A601F2D337A58A0D21FF37FD91EB86D1D738893A03A
-69F0CD743F611CDFFE69DB2C6ED0E4611D56F803BB0DC06E7FE85A303839612707647B1BE9FAF8D6
-84122CA9E5CB8BDE2936D3F4FF254D31529D7538BBD4D35539489F9E7316F24214B996BCDCF1818E
-749A71CF0E8845AA1E2A58AA62A48E02BA4564625D20AA220EE719608521D7D7A7FCA0BD8904A401
-9819D371F3F59D46C1354E5FC1A6E5F79B20CF4ACA2BF0F2DE73DA193A6F9ACBFE0B4731C4BCEBE6
-D96FE822965DE965232282A3A130361F188B3AABDA95A8A2790D9240BE008B6A6DE4BBFCADA05B67
-86B9BB8E0DFA0C30043A3B07ED46277E07B9808422C8ED16758B9C396F4EA929D769785B2C9568E5
-70A83B989B25CE200F1727D41E2B702E7F88F1784F4C83FA60A74EB26B2DA95126E508ED519A61CC
-151DB6804F61826C5F86D8FA89D06E526FED97A0DB88EDB432FF32C1ACC9B622EEDF601081AF7B96
-3C9CFC1D13E4A9C74FEA0A1C8E3D8653CD92A944D4CA6B0D306619AFD503506D77732D6514F604BE
-4610C2560931BDE0B40939BC1D126B0E97F72AE1B4A9252123B54F7A27E0CFA4425B4546526FD741
-CA77952B10D13E0AC2E32006A903808FF0CD013F936238C74CC75FD915244C56A8412F37F0134840
-347699508D6F3D7F3203A25B7C70100719582CD588590EE34B3AB13E255B613A6D00386A0104CC5E
-D2C646F09A88888D3751651D5646C5227A3C80E8DA1B0A331121DD2429F1F4775D30564DFF47D01B
-BE2C6C72CE4D1FD9A2077C04D2B0274B8916F6A9D1A4A6964A534F47CF241D5A8E34B23F85BE9ACF
-FC2FEA961F277539F215F8728D6788F67BEAF45502839BCF23D8763C3949352F00C579A9A4FC408E
-C625E310DAE61512DFE6844E82D36A2F81709E1F05B38AE9C222ED62C961EE63593CED7AAF73CE2E
-D3667740C77B309B93EEFE1B4BA65D48575A66BE86743DC9E5D3C2FF418D11F7F211B86E827EE1DF
-C3613E7498030F07050524536D1F8A94DDB6698BE7B963C55CB3F74B676CD815A7B3DF4B1A0EA2BE
-1B0B9A11FFBFD5B1FA49668AEE14629316AF436A0821C20BEEF7B3480847934A99F6D85B68F4DDF8
-859A754E009428AF89A90D1852C220A607FF0806E8080726EDC94D691D214B4521C147C4273AEBDD
-BB4A697EF16448CD9B2FC95293305858DECFD406B89B9F3FDAE2AC579E80CF321EBAE5701FB2F7CA
-D8ED04B4A63115886D45D6120F69AEF1A21D80AD3C2D35D2899F1902242B96CD349E0AAADA40F7A1
-1282B6B52BDD97708E58DC5E2D22D1153E5FA3F3B300BCDFAF98DEC2F4E3C82A1C85F985735F3987
-4F557579F422664E07CBE19DA680EFB0FC82C323EC5C4644C51709AC8D674608A8043C91E6C7988D
-430F10BA6CE1FC7FC0604FCD8F723895250AEC36CC35B3FA14FE2A0D24095DCC30B2093F2298F5F0
-A97676A0BE66C3DC9ADACFE2FC0F721A20E945AFC1096A619075D5E9A264C796EC6C90EF1AEEA8DC
-089B44FFC13D27CB2370070A52D4416C53F364393E46EDD7EDE00799960CE6E0D57E4909E88ADD64
-BDD2B0EBE2D73FA6ACF8B40280DAA0637E705C65AABD523B8815F22F23E9FF81E7829C7E4BC980C9
-143AEBE1A04DC0D253396BBB7268BD5AEEA356B610D5DCEE03135E00AE34388251F31714A1C40E18
-2652C48CDA2211A22CB6F02490E69A44CECB169754C53B16028D352E0119F5D5FAE0BD7EA1CDA647
-12A6147374B64244E21E9EC9F0D1381AD22D5B6212B26C3F9AA5F6045F25DD9F5EB4489EA39B1945
-331AC70510C5752557DE21D0A6CFC1EB10A98FA867B76DA6E4249469F591FD154D39E89364A43DB0
-07AA0D7A911CFAE6CE2B557997FBC44F55A27F622BD7B8B10EC9F5D10F2649A646FD964AE1B111B3
-5B46A252C4DEE44E7426EB5739F24E8A390694597DB3A1FE7800C97E59558322F0E49A0CCE2AD94B
-1E2D1026AFA771723E3F523916F55ED866C9FB4A2F759651C613A2CFF362028CDF9D38F05D4C7C60
-24C533E930B64B099FB1AF04B01F5FB9CA6867E6EFF55A772C5391831059987E10CBF987E3F378E0
-1329F73D54DC0484177D3C3C06F67397955FF1CA4EF8AD1606B70455255D631A7D6EB92BFDBA14A0
-FF28B2ACE7E81AD666EA9B3A0F5A6BA3B5DFE35044FA4B3D8ED956009C60E98CC132F2E84967F4A9
-8A67B336D5EE7CAF7DD1F74D1FA08619941361FA7312CF225D89CEF97E864C8369EAFAB94D97F056
-5505D825972B754F6729596EEA91210B75DD8F645382ACE36DE60819A02B3B48DD00F5485F9264F9
-FA926D732E2C267B0BE8CA98526F124F97EFDB86132C5EF16B103908172FC51F286FFE45FF253512
-E0033F037FF182BA536A9EB2DF2D1DB257D9C86C46E1B002FB32AC70CA9462E6EB48994752CEBCE3
-9F08ABD4F4B0889283E55500702185A841E328
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-cleartomark
-%%EndResource
-/Times-Bold-iso1252 /Times-Bold ISO1252Encoding psp_definefont
-/Times-Roman-iso1252 /Times-Roman ISO1252Encoding psp_definefont
-/NimbusMonL-Regu-iso1252 /NimbusMonL-Regu ISO1252Encoding psp_definefont
-253 283 moveto
-0 0 0 setrgbcolor
-/Times-Bold-iso1252 findfont 67 -67 matrix scale makefont setfont
-<50726F63E9647572652064652072616A6F75742065742064652074657374206475206D61696C6C
-6575722074E974726168E9647269717565204E657467656E>
-show
-403 361 moveto
-<64616E73206C65206D6F64756C6520534D455348206465206C27656E7669726F6E6E656D656E74
-2053616C6F6D652032>
-show
-220 439 moveto
-<202020202020>
-show
-220 508 moveto
-/Times-Bold-iso1252 findfont 58 -58 matrix scale makefont setfont
-<20202020205072E9616C61626C65733A>
-show
-295 566 moveto
-/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont
-<4F6E20737570706F736520717565204E657467656E206120E974E920696E7374616C6CE9206461
-6E73206C6120636F6E66696775726174696F6E2073756976616E7465>
-show
-1647 566 moveto
-<20>
-show
-1659 566 moveto
-<3A>
-show
-312 683 moveto
-<6C732020206E657467656E5F696E7374616C6C6174696F6E5F706174682F696E636C756465>
-show
-312 739 moveto
-<6E676C69622E68>
-show
-312 795 moveto
-<6C73206E657467656E5F696E7374616C6C6174696F6E5F706174682F6C69622F4C494E5558>
-show
-312 851 moveto
-<6C69626373672E61202020206C6962677072696D2E61202020206C69626D6573682E6120202020
-202020202020202020206C69626F7074692E61202020202020202020206C69627669732E61>
-show
-312 907 moveto
-<6C696267656E2E61202020206C69626C612E61202020202020202020206C69626E67696E746572
-666163652E61202020206C696273746C67656F6D2E61>
-show
-312 963 moveto
-<6C73206E657467656E5F696E7374616C6C6174696F6E5F706174682F62696E2F4C494E5558>
-show
-312 1019 moveto
-<6469616C6F672E74636C20202020202020206D656E75737461742E74636C202020206E6768656C
-702E74636C202020206E672E74636C2020202020202020202020202020706172616D65746572732E
-74636C202020207661726961626C65732E74636C>
-show
-312 1075 moveto
-<64726177696E672E74636C202020206E6720202020202020202020202020202020202020206E67
-69636F6E2E74636C202020206E6776697375616C2E74636C20202020737461727475702E74636C>
-show
-295 1191 moveto
-<6FF9206E657467656E5F696E7374616C6C6174696F6E5F7061746820657374206C612064697265
-63746F7279206427696E7374616C6C6174696F6E206465204E657467656E2E204C65732066696368
-69657273>
-show
-295 1247 moveto
-<6E657467656E5F696E7374616C6C6174696F6E5F706174682F62696E2F4C494E55582F2A2E7463
-6C20736F6E74206C657320666963686965727320646520636F6D6D616E642074636C20706F757220
-70696C6F746572206C65>
-show
-295 1303 moveto
-<6D61696C6C657572204E657467656E20E0207472617665727320736F6E2049484D2E206E657467
-656E5F696E7374616C6C6174696F6E5F706174682F62696E2F4C494E55582F6E6720657374>
-show
-295 1359 moveto
-<6C276578E963757461626C65206465204E657467656E206176656320736F6E2049484D20656D62
-61727175E9652E204C6573206C696272616972696573202A2E612064616E73>
-show
-295 1415 moveto
-<6E657467656E5F696E7374616C6C6174696F6E5F706174682F6C69622F4C494E55582F20646F69
-76656E7420EA74726520636F6D70696CE97320656E20656E6C6576616E74206C276F7074696F6E>
-show
-295 1471 moveto
-<2D444F50454E474C20717569206E27657374207574696C652071756520706F7572206C27484D20
-6465204E657467656E2E204C61206C6962726169726965206C69626E67696E746572666163652E61
-20646F6974>
-show
-295 1528 moveto
-<636F6E74656E6972206C276F626A6574206E676C69622E6F206574206E6520646F697420706173
-20636F6E74656E6972206E676E657764656C6574652E6F2E>
-show
-295 1640 moveto
-<4C612070726F63E96475726520E02061646F707465722065737420746F757420642761626F7264
-20646520636F6D70696C6572204E657467656E2028766F6972206C6520524541444D452E494E5354
-414C4C>
-show
-295 1696 moveto
-<76656E616E742061766563206C6120646973747269627574696F6E293B20636520717569207072
-6F6475697261206C276578E963757461626C65206E6720206C696E6BE92073746174697175656D65
-6E742061766563206C6573>
-show
-295 1752 moveto
-<6C696272616972696573202A2E612E205075697320617072E87320696C20666175647261697420
-6D6F646966696572206C657320646966666572656E7473204D616B6566696C6520706F757220656E
-6C65766572206C276F7074696F6E20>
-show
-295 1808 moveto
-<2D444F50454E474C2C202072616A6F75746572206C276F626A6574206E676C69622E6F2C206578
-636C757265206C276F626A657420206E676E657764656C6574652E6F20E0206C61206C6962726169
-726965>
-show
-295 1864 moveto
-<6C69626E67696E746572666163652E6120657420656E66696E207265636F6D70696C6572207365
-756C656D656E74206C6573206C6962726169726965732E>
-show
-343 1984 moveto
-/Symbol findfont 50 -50 matrix scale makefont setfont
-<B7>
-show
-418 1984 moveto
-/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont
-<4F6E206120E0206E6F74726520646973706F736974696F6E20286465206C612070617274206465
-204E616469722920756E652061726368697665204E657467656E2E74677A20636F6E74656E616E74
-206C6573>
-show
-295 2044 moveto
-<2020202020202020202020736F757263657320646520534D45534820717569207772617070656E
-74206C657320617070656C732061757820726F7574696E6573206465204E657467656E>
-show
-1779 2044 moveto
-<20>
-show
-1791 2044 moveto
-<706F7572206C65>
-show
-295 2100 moveto
-<20202020202020202020206D61696C6C6575722074E974726168E96472697175653A>
-show
-294 2201 moveto
-/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont
-<63642053414C4F4D45325F524F4F54>
-show
-294 2245 moveto
-<746172207A787666204E657467656E2E74677A>
-show
-294 2289 moveto
-<2E2F534D4553485F5352432F7372632F4E455447454E2F4D616B6566696C652E696E>
-show
-294 2333 moveto
-<2E2F534D4553485F5352432F7372632F534D4553482F534D4553485F4E455447454E5F33442E63
-7878>
-show
-294 2377 moveto
-<2E2F534D4553485F5352432F7372632F534D4553482F534D4553485F4E455447454E5F33442E68
-7878>
-show
-294 2421 moveto
-<2E2F534D4553485F5352432F7372632F534D4553482F534D4553485F4D6178456C656D656E7456
-6F6C756D652E637878>
-show
-294 2465 moveto
-<2E2F534D4553485F5352432F7372632F534D4553482F534D4553485F4D6178456C656D656E7456
-6F6C756D652E687878>
-show
-294 2509 moveto
-<2E2F534D4553485F5352432F7372632F534D4553485F492F534D4553485F4E455447454E5F3344
-5F692E637878>
-show
-294 2553 moveto
-<2E2F534D4553485F5352432F7372632F534D4553485F492F534D4553485F4E455447454E5F3344
-5F692E687878>
-show
-294 2597 moveto
-<2E2F534D4553485F5352432F7372632F534D4553485F492F534D4553485F4D6178456C656D656E
-74566F6C756D655F692E637878>
-show
-294 2641 moveto
-<2E2F534D4553485F5352432F7372632F534D4553485F492F534D4553485F4D6178456C656D656E
-74566F6C756D655F692E687878>
-show
-294 2685 moveto
-<2E2F534D4553485F5352432F7372632F534D4553485F492F534D4553485F4C656E67746846726F
-6D45646765735F692E637878>
-show
-294 2729 moveto
-<2E2F534D4553485F5352432F7372632F534D4553485F492F534D4553485F4C656E67746846726F
-6D45646765735F692E687878>
-show
-294 2773 moveto
-<2E2F534D4553485F5352432F7372632F534D4553485F535749472F534D4553485F626F785F7465
-7472612E7079>
-show
-294 2816 moveto
-<2E2F534D4553485F5352432F7372632F534D4553485F535749472F534D4553485F626F78325F74
-657472612E7079>
-show
-294 2860 moveto
-<2E2F534D4553485F5352432F7372632F534D4553485F535749472F534D4553485F626F78335F74
-657472612E7079>
-show
-294 2904 moveto
-<2E2F534D4553485F5352432F7372632F534D4553485F535749472F534D4553485F666978617469
-6F6E5F74657472612E7079>
-show
-294 2948 moveto
-<2E2F534D4553485F5352432F7372632F534D4553485F535749472F534D4553485F666978617469
-6F6E5F686578612E7079>
-show
-294 2992 moveto
-<2E2F534D4553485F5352432F7372632F534D4553485F535749472F534D4553485F506172746974
-696F6E315F74657472612E7079>
-show
-294 3036 moveto
-<2E2F534D4553485F5352432F7372632F534D4553485F535749472F534D4553485F666C69676874
-5F736B696E2E7079>
-show
-294 3080 moveto
-<2E2F>
-show
-344 3080 moveto
-<534D4553485F5352432F>
-show
-596 3080 moveto
-<61646D5F6C6F63616C2F756E69782F636F6E6669675F66696C65732F636865636B5F4E65746765
-6E2E6D34>
-show
-296 634 1 457 rectfill
-2109 634 1 457 rectfill
-296 634 1814 1 rectfill
-296 1090 1814 1 rectfill
-280 2167 1 924 rectfill
-2125 2167 1 924 rectfill
-280 2167 1846 1 rectfill
-280 3090 1846 1 rectfill
-showpage
-grestore grestore
-%%PageTrailer
-
-%%Page: 1 1
-%%PageBoundingBox: 18 18 577 824
-%%BeginSetup
-%
-%%EndSetup
-%%BeginPageSetup
-%
-gsave
-[0.24 0 0 -0.24 18 824] concat
-gsave
-%%EndPageSetup
-%%BeginResource: font NimbusMonL-ReguObli
-%!PS-AdobeFont-1.0: NimbusMonL-ReguObli 1.05
-%%CreationDate: Wed Dec 22 1999
-% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development
-% (URW)++,Copyright 1999 by (URW)++ Design & Development
-% See the file PUBLIC (Aladdin Free Public License) for license conditions.
-% As a special exception, permission is granted to include this font
-% program in a Postscript or PDF file that consists of a document that
-% contains text to be displayed or printed using this font, regardless
-% of the conditions or license applying to the document itself.
-12 dict begin
-/FontInfo 10 dict dup begin
-/version (1.05) readonly def
-/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the file PUBLIC (Aladdin Free Public License) for license conditions. As a special exception, permission is granted to include this font program in a Postscript or PDF file that consists of a document that contains text to be displayed or printed using this font, regardless of the conditions or license applying to the document itself.) readonly def
-/Copyright (Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development) readonly def
-/FullName (Nimbus Mono L Regular Oblique) readonly def
-/FamilyName (Nimbus Mono L) readonly def
-/Weight (Regular) readonly def
-/ItalicAngle -12.0 def
-/isFixedPitch false def
-/UnderlinePosition -100 def
-/UnderlineThickness 50 def
-end readonly def
-/FontName /NimbusMonL-ReguObli def
-/PaintType 0 def
-/WMode 0 def
-/FontBBox {-61 -237 774 811} readonly def
-/FontType 1 def
-/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def
-/Encoding StandardEncoding def
-/UniqueID 5020947 def
-currentdict end
-currentfile eexec
-E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942BF7D6DD84F1664B89
-699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED2AC419FF2B2BDE605B8EE3264EDD6641
-2D4F21C64AC522BDFC7C5502F9C3F3E5592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A2
-5032519D1868816E44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF
-9CDC7A1B1B598C69131DEE005B415805A16D8A123E6A208511C6D0C255B9A5BB2FDEDB4D399C6CF1
-94FFAC236883767C0F68F4EF84EE696B677DE704EC3B097384F2E673A1F51692B7B260693738C211
-9F7D90FFDB21EB715FD5B8134FC87DBA320EE54C2CEC6A4D6BB350555EAFF2EC4F84365CCC0802DB
-B3BD0E3F0D9F858647DD637725C2CAF9557FDF842A0DA6A0CA0F1B442EF8EE6CBF2B03858468A466
-AC5883CBBD3815B283343B39205803C02C917D06825C09E2BB14609FA32C28D720C0E14A4B12D4F1
-25FF6281FF324DA33A56FC49987AC7D3AA206540F8127273FFE9A3DACFFE2B1C269D3DB9A811578A
-C7D532C2EFC18376F473FBB2B32EF642B19CDEC1D6DE83643723E3C6DFC87F97A7007B6081894BBC
-45C955B7001EB36211B26AD7A3D07459CFB33F9C54A40A360CB802FD202C8E93D4DB888B325CE246
-D02D1220ABF55CE646DFB45F07CB848406E470362F80CE4C02D98DD845189877732744CC16C7F566
-9F77EF096EA55AFF98AA103EEAEFB971731EBF3782E6AB725D4E9E35B2968689E8007C038CF25B6A
-E69451A4731E79AC22BD268F56942A233E52D71873E83E00A1874E04D3B22E72FB2D0671AF81C698
-53C389B51F4A257373AEBF4DE2DA1E4DA5E2CA88941F81EAE0E32D982064C8AFDD7A9A600D56D736
-05B9463C6240606B3361BAF22AF74EF89AC804A5793BD512DA2D13F4BB1B73EFCA1E621ED2A65D66
-5AAD0AD228B3B7E3D90DBDB6061E172B686E92355A7C7459D83199040A368B5697DDC3B81DDAD341
-6FF4405E1096B1240EDC18A0E9985CA55A0D697972BB11E9F1BC30765D6775BB68C69704BE200EEF
-4E11B78ADDB6229D8FA49A6B1525ADADF17122C0FFF51A08AA7AED158724AC4352EBB91ED0C157E2
-4281BDC1FD610195F495E87062A8C38E0D046DA4067EE16E81BC5F87E583315B973184E474064482
-9B2A52E0D37E249BAB31988B906F891AC904D1BB8901F0673AECE60ACEDE97B8DB7935C6488ADE8D
-FD898027424AA85A11A3DA494498B084133B857017A6D507D70A3421235486EB3CF7613C59139FD4
-DCB92EADC60BB6225D9CD0599779217BDAF4813A453989B2E56903F4DBB83D83DF4837C86BB4C3D3
-CCF98F07A23EBBF7AB5687C3E1E6792E40F92A7A466DE352294064537505EEF3F9C308C9EB94506D
-B02CFAE289F10005A6E42D2DCE43731A7AE368564B2983038DAD6987F67062199018395BC0FCAF28
-7A2B040C71F7325FA1E9A9808979B2FEF19096B98B8A0A728EB98F2BA3D33B49E3C20BE992822C7A
-1BCCA5B4E4D1099D456D8D7D83C57ECBA0FF21428024F7572A1470317CB8CBC8679A974E13D88C68
-1338C68C9AC9557F97784F4E1C8C2E61F26023ACF46232CBBDF3C0BCC5583B935FE9FA09A562129A
-8927AE73988DB0F7E733C6561CA7C9716DCA9B88208A715166F2FAE6D5EFF289A9B2EDCE813403A4
-16F243F1B57EEDE7D81E10C2DA4065A3082BC92A38B2457368EEC9C3C17296CB09819E9E642D7365
-F9A6EF430FC7DD611EA5FDBDEDFA72634AB599EB666A5DC178B0A0BD1FAB042792115EF3B6222C12
-41DCE36CB38B738F68B1B3CB489FED9E53315553F3C5C3BBCE40451E47B7EA53FD3D3ABA6CE0AD22
-5DAEE734BDFA3BF1D81C1B42C6D856A05D0924E03F7627C5EB24D7FBEA3BD85716207F961B56803D
-BE046E81ED5FDC378F9CA52C14FD8544CA7C539201BEE06487EBDC30FF3B28E8264EC7FD5DA7E080
-65B0A9147344CE28DA5182335875E9F8B2347A44E33DFAA167232A5C3E69E8C5B58B7C7216537827
-C936F5741B87FC68753EB0D4A466961D0050DB59DF3195BD3379F5647F8CFED35DA952D7CF2DED45
-EB442DBFE992711D22EB228BDDF36B8D7DBA27062D60D2271EA8E8412F4290B58F5BE26FF06F0559
-872F9DE4DEAABA015EAB4904BA1F509F6D517C6E897312DDD571D769BC474FD378AF4360E8B1F103
-AA75F48721B9E0BA589319E15D74AC0B03D730C3EF708C7C504787483F134EA6297097B46D2680FF
-8AA50B7A255563C88D594B912F5574564A1371463674793E4834AF11D14C7991E7FDB3A6ABF8529E
-1A4F10CAE79C60D37429579093DBD041ECAF03824DF9C007E96F45595A524B27EF8774A83AEEBD3A
-7134AB4435C80944DEFF5C1CBA921B0A41B9651968581DA4834B3C0E6D4DE13C1E792FCEED26A72A
-DC4D9E3903661D8803DDB58EB2B929CE31FC9F50A694116B00AC9F3EEF53FFDB1ACA3394BF111610
-38F39917B022394C75A0D467D64B89A44E5505DED7D9C6B8BA6BA098F140C9C00E09200EB4828356
-A2D6BE9EC1D5524B09C06D9C6FCB5E2808050A339B5E5FD4DD6C2035A48FE9674520901EDCAD107F
-67AC8C8E508E6003011978D77ED225F361BC0F86A98B6120EEAFB73F7377DB1E7213E02D12C330F5
-492511B4DDE08558D75D5B8AA2D56A3111DCCD257EE96E3446EF1C76F000C8916C4CE261425ED9D1
-5B58CED128DAA6C1300466E7B152BCFB5E6FAAB2519B8A98F26B29F98133AF886A0AA7E586A090BD
-A1DC6120DBB5640885C609A8BDADEEFE5DE0DA5B75A8A29E92515E86E7E66BB29581E5AFF8CB6551
-D8D1103DF60D558E7987E6F56126A13DB2C9A04886C655064E68A0A20D1B7DE24DAD22BBFEE1B7C3
-C208D4FD6A58DE78D6A0A6126EFDEE3B1A9713DEE94069A9F0A2B392A2F391C4C75327803B53F252
-CC9EF0323F84929BA4716C50385681FF5B4ED54929821594F9026B7C1297941B178C3F8A704CE097
-60533DBC6CF4B18AFBCBAD039ECB2EBDC7838A9410E7B227924BED7123944675A5DBCA388B710F8A
-F6048B03DFB713F881EA0F3B191A5CD989EA150B979059C8AADE403855815D8F7980CE6288F47EAA
-37C1097D33F13776F08779063C5217D7408D9835AACBE5C071EA40C9AE6DF685F4A9827B828815D8
-F3A672E73A418E5CB15684EB6C6FE0998A386E124D76620446907F993BE16FE5AFCEC681F585601E
-18182EDCFD3024062A3082AF97E803C47D32229D0A24596CF7E03F18229FA631175699E2F0D60FC0
-9C4F1954C5D12D03BFB4395F0E5EB6C6877083807D91D93CA4177A6B5A8D2AA500131FCB670E7118
-73F8A3C77575EC93A3ACBA37EA117DB268CF10D04AD0F079484DB124F6DC14A50AD3B0294F7157D0
-837D8F9A6060FBCB385606066401708C041594E0396A0BE4B8B66FEA141CCE4BD29366A986ADB98D
-9A6935C49C57F8CD415E93FF8AE0DF75E463E02AAC68DF064C1B789B685F84E15E512404E065A39E
-9E8F5568A7D97671AE1602605FC7E4933975189837586FB1A55007FBB0E91382A629277C36A190BC
-85AF49EF3F0F38D4ADD2B5DEE09916B79690EC83473C63E92CF617617A66DF472A49641DA10654E3
-AD3880D060B02A4A6C75B51E4E9917A2B6D8EFDA12D59DE5A8E222DC7E82F02F23A9D3DBF637154F
-719B14114DBB102BE5EB76B441D7E9990EF6420C2E80942C8AED5A1D0B19BCE115B5929AB9E145F1
-496753DD6B1798324F5EC1D0C7F26FC3045D7BB46A14110C99BA07A45EC16002CB754C0BAE7A1A88
-EB387BB345FA70B0A38AB4D532C2DE49274D4F86F2582728A2CC54B4C09D26C0CDEB8FEE6A42885C
-6207D74953CFCC583ED82DD7C0F29D35BDAE5BB251B8A2D4B1DC97E2264DCE035E359DFBADDE84F7
-37EA6A59C23D1A64D963E635769233624F7682EA34636B595CCD064AAFF3887D916867475731BFCB
-F7F96D5E5E1FBE6AABF454C2F504EA4E8EB382911560195295C87793D5F7739AD7EC7176E126413C
-D4D1058EBD7D6EBEE14BB94A1ECF28B686411D91E07373E891F78C4C0A05D2E8D90A8AE2614F7FC2
-63A762D0F43485473A54C31726F8547701D4A38D20565ED1707847AED9C805780F062B847E668E15
-565CBA07A72B0BA99F03FB57D26FA26FF579C30EED0AAB6FEC1B5DBEA81AA88F16F0C9BE869505BE
-18C1CB79657D91D6706E2A3F0BE9920655B93EBBAE2B4D0B5DF6BE622C951F2CFA42AEDBF7AE649E
-2150FE87CDBF5C2685EF36051080BF39D864573A45AE2648AD97662B1F69787031B9BC43511FB841
-55ECDC3D91E2475D072BDE6A5207ACEA1E0D2ECB1DA8A1BC4BEEC335A5C7102963E84B97BE741C44
-58ACC3D72A7E53B1F08C955F33EDC3A0DC3E7308270C0F7FF814B111459985733C62E8863625A551
-837952F3CBF32ADCFD9F345E14B585B23ECC440775310654DAF7F41E56FF45F89701292019A94BF3
-0EB2D65E14B1A1D6BF89D4CC43187ADADF3F6E03A90ED01E5D876BD3AA56E5EE84DBAA4DAD9824DE
-9984BD45AF96FB8A56C010B3C3A3C6139D58E9D69D9109DB18561B55EAD6452497840B9AE90C749C
-155B6329716F0152A7AD52DBD0B8A25B9995E1416681F38FDBDFA443879B5C4C25AA29E0DCC07DE8
-BB161C36D76EF286EC88D57C74BF44DBCB4FEFF771D3BD82C8F4E233357C48E516EFE3DB9E60EF16
-8E2C45B54651DF9A5ACB5F1790F7929BCB16CE5E9F6A43919AD287DBC8E12D9F9E97E5DBAA592879
-1A5A02D39D259F3CE273A870906A643CC18D86E23F115D2A35DE6926053D8C84B940B362E7DB183C
-4905060316B269223DAD309EB5AC96DEBA757BEA45FA3100F77F4765334EDF3D659E09BD1A5552DA
-492BE9174DD406F8353A059ECFEE3709422940A8C369919EE1F22F7C02412C995FE93DC4559D32A3
-155DD22D3526D89B16D9ADDC30CB7ADA6E52D62C5F2DFD142D4D7B6E066671EBAD08F54917E31704
-1F410CFD8A3243F8B39459C418B7B7C6494551C6F6753A94072D09E0D812351D62916383C6E061F3
-5ED864923002007E626089772D269B298DCA2CC1F25D9BE43FD8AD62D554C16AFEB7EF6E5DDA66D0
-5A810F003CDDCFD2C02FFF02BB61344968091F67D3862C1499409ECCA137B9A2A9BE314995B818AC
-CDAE27ED4AD583BE29DDE4E8C2400C5F8152C85709AD2A4737BAC768FEB70CE81A92C9657DDDB2D0
-BCF9169D272A063C75C150ADDFCBC2F5F2503DE3D13231AA8CFB396DB38E80197A605F6BC20EFA1E
-DE40CF424CF221218D51BEACE64A3DC88377E4F3EFE43DB4F4FC0803BF61764104CFF0B618C90311
-98B094E20B0FACFB94240B438B67BA298E31D3F4E31FD190E48BFCE27B1BE29D36E765E7D295E96E
-DCE09094FAC43B87E294818FDE9363FC7DC5EA36A1497EE25762D02DFA00A9BE53F87ABE62E52ED6
-F59818FDFCA643042EC13D670DED1980413950EE43372D31AE2694B83DDA42E1FBB049F7E7B7E69C
-93FFA3195A2462423DD2C022E5141783FFA07E192AEBC5070F08B23AEC9142EED56DA74F93BDB504
-78DA55DDD0A9987FEA131E4CCA0EFC51064E4B37632728261369C3FEDACA100F1AA78FB718ECE7A9
-F56296C5FB43781E63F36B0E1D34BB748EFF35E1953941F94D1A9B0FA474FD68B47183F2AC53A63F
-9F1D30B9B89C5FE54C3765B43DB403D57994701C133E42B950D9BB1CA202F15B5E590EE75598FAE4
-3D5CF1546572770BBA9A6373F100CDC61DB4E5EBBE0A93E0E51C86005E333F69110B1C8E492F2BF2
-52CADD5B73E7D3EBB53E759353F1EF3C9B8B39C230D13AB7158A5D92EE4C452F81F6DFC18803280A
-A023832FD0DCB482CE5AF615C952BC3F7E58F6417D69775FC7C0D5B405AAC632857736ACF32B2EE0
-F2A2C0F3B3CAD483C614505BE94706322F2A2830FC5AB592907D0291ED1873377E7A6158140C2CDB
-1B0E27EEC9CA50176102200992308045CCB5A169B61EA0546778B8D280737319046716604945A21F
-2A1CB9E15E3A5DB31E0FB5A3B0AFDFDF6F3424B7536D473F9756CA3694DEE4301FB1AB1AE47128F8
-D2B461C051C1B999DBB010E78DD13AFCBBA6F7D5226D540527F17881A18F551B3EEF76A7E28B4FDD
-879381A2217EF2FF9F9982E9EA70AD2003B862D7C36D57C5FF9FBEAAB56040FEE973EFC3B34D8319
-1960010110BA10694C17B7635AE03CC1CD087C0B05522A7A791F0CA34022A3F5860B536D9551BDFD
-BF560A07F63AA4E687407E5E48584E689591F1B52671213E430A708C06A34D2E1D51CFA6B328A122
-007C81B5EB263B967746961BCFC8772F8502DD95898724ABF369B0877F3313A167F3F714023C229C
-5757D4D46FCD9B4AFECD093DCABE52B78132CE9AB6225C9A344C4BF8D96F2C50C4272CB9AA0D606F
-013B2642F8C880E08EA2822C8CF5097D2CDB64932FE195ABD5FDF36D3BE123AEDD8BA2F82A8A628D
-BE3ED6129DC0FDC4BE50D5574AE4FECC65062E70F4703BFECB35EADE196294FE173EA57938679DBA
-6D15448FF44C0D1A903B202439DA93C0B0E612110068F8079219AA89F435E44D0464F54833BEB338
-670BD820D941DF4B31F51B895BEDF833F9C43CB7616DB80F988CE72FD3C12C7D49F740CF85B4766C
-0ED398EB837695D102DEC16E24B7475A0F5DDE88FBF2D6B94F126417C811E8362B9CCC52D8891C13
-C10937AACC228D621D4712CB9DE0BAB60EDE2A97E9292BE04E42E6D3425594DF56931A61E1F96172
-6AF6E6891D63B240E6E79E5BF30C052091D681BA1102409874CFD8EDC3EE2BE331676E31AC00F807
-91D1019BB789CA4F5907F4823B002AF3581448C352BB67D80FDFFCD1C5BEEF60523330AA2C045600
-8F62DEB55E69AC2F86369FAB1ECC90D2487954E61117A90D9269A65DFBDF297EBD29C3DD1F62755F
-8F289C42A534F59650685F8576EA2FC5D26B99B8E3DCD3F1FEEC73131000F99AA9868EA9BAC0B56D
-AE2CF46DA6CC1D18C0AB8D77BECFF7B89992175CBA2E22779C13DB9DF53FF5B1C8FE95E164997D94
-202C37175E562C8622989B075CDCDE173452C064274354D5DB8F7D5A78D48AD4A103B9E47500D08E
-DC7C51C1F3CFA7F43C3686A3C24A7EB5018B0F419961564F87E212CE0A0741AC68D6822C7AB9FD68
-85F5D0B2AC249CB7F50E2353CC4B0A6A24562F564FBBC7090C3FDF1284AB0EC615E0B3FBE132F315
-70C8A65C814F93910AA4BB80D516CB70D2E1D11969238E6F022D628FA2F33A0A15C4EF0CE7F753DF
-80A8AD9494885A1B9ADAE6C38AC9DA6FB0A61696AD3A502630252AD7B574C841117D34BD20BD6581
-217D977B35F5D04E02B933E1E84F5C090F6615AF484D63265D28517BA74BEA8876FDA332A84AEA12
-E6CD82B94AE10A778CD3A216ABC08495EF319F06AD6FF8ADD237D911F846A514FDBFAA8A1EC8E0AA
-9F80F11F1CE615519A4B044F3D1CF1A17D7F3D2174222A5FFA8B39F20197FF6CAF250B6ADBDBF519
-1C525070C8D38220FB501C223F493D80F498621A02EBCCD6EFE914F16B2A435D60C0A1A453E288A5
-3D818FE1EDCA7D55A26A017F2EE47A816E90D6C3FCDF0035EEA307DFB06D2BCCE43458A67354A4ED
-B6E5C57233DE4FBE41ED07EE5EC77A5DFADC4032138DA9E1B74428CAD02A913E40152F8063A774D4
-FDD4070E4B8A6C089F199AF7C529C277E902195DB760D81EC655DFFD1BB283F3C5AA8BB58F2476BC
-797B2892E94414ABBE96D4DB93E280CF7DE23EB852E7CA954D6682A6F1A4BE0507884C2A05AC863D
-2BA73F3B54668397B6C54DC2F4183130AB414875F3C3D8792BF7E5FC4D228DF87748BF0B14178DB7
-E3FFB7891D700A1E9520D778B095DA80E4801F53442D5C073EDEB706A5DB8466FFE7E701ABA9C364
-A37169F585C883A83713A61C9C3BD9336A667EA4E3DB5F4DF6BC6A552BE8D3EF093639EC67E5FF71
-8959F9902477F5AA894ED2D1CD312ED82EE417D95C49C96671B23FB0E1738E892ADFFE62EC1C3D4C
-BEB6CD089C98DE8D247DF7ED17DFA2959D3662F105E8386D75AD308480536959F8E6CF8F2C6937B0
-9F2E8137C811327D6B165ABE46C51834A955FE8306D10033F8C2A34667F13A8BA831CCF52C7A21C1
-3DB92F3E77B55CE291F6190BB1D194A33FD73151C3F61ABD2D8A0C9BDE90E796BD996D2D0094DB2B
-E98657E751BDEEFE8A43EE4501B98F0CC6D80805189438872A60047A8CAA9039893530A3E5F6BD75
-BB466B25165737C939AFF3EA59BFF4A7DB09C2A5B36B8A1F0C6C5E5870C7C9412589877EF44F8428
-4B8A53B5B74315CE72D2EAFC631BC4CC2E5B71DC958B5A6350CB5F615C3A4502E973622E3E18193B
-69572DEF1D02303A375ED60ABA1BC8A179FAA0F221A49078FE15AE13383585FB45FF4D5F3BB3D0F6
-D8BF62E9BD6BAB3C9A7D38C8A5AB0BE57ACDADCBD02B1DC7952D73AEF702D406F62719922BEA96B8
-FDC9B879708E794891C7A0A42F2CCD6812C3F4DB030B5178E3A627C3E77621D312CE4EBE815CD387
-7208FAD92761A5396B67E835222609F823728B1C987857CFEAAE21F2AD5EA9D841212993508091A4
-A2C268BF1D8DA1C650F6AB93995E7C13A3F84DB55748C626FD09C0DA1E3325CCB0BF091E996245BF
-51EB486680162BAE63B6513C74CE83B92359938439921950D713C69324A87BCE67B45A030C9CF10A
-DFA0A82781D49FF224AC57A23C6CB321F95915C5E14E41FA852F66E1E2044A9E7B1DC3BE9E818515
-D28B2C4D2F2210098C39557067062BA4239F2AAE28816D999955910298A450741947A9A1AABCBD8A
-FF3530626089978C87DFC73618C044731B6DB8007739A9699ABC354A6F985E03C11D750B8B9E9AE0
-5436205FAAD1B895B159E2C90562B82A62EA1A7FFB501767DCE2B11C51D55A17529EF5ADF0A0EE9A
-96D0E7E89F68E50EED813836531B4B46E9071E84AA413F4135CC882CE832BF78ECFA7CAB0C9F64EB
-92C86DFCD1152BB7D4AB33831AA0C139B555967F6346068D5C3351A7A4368EEBD2933E6B9F789DAF
-37EF536FCF965C397AF1B7F98AF864B301F3F440B7ACF704B59540453678FD6C1504519481893812
-3E2F47B265EC4F5CF2172D394543D84CD4281165CBEB11349B315A85DEB2D1699507B0C8C110C726
-62EA2959C4962FF093AA5EE6F21F89B3CCB0149CEFEF1855B9A48D28BB363416C015A1F4EA1975C3
-D8807F616C5817C8162536176F464A198EBEE6C97029F15F414275A39B8219128B8C8542E9483550
-7FC2D3908BB0EC375771280B9EBE87E827811418EF93E52EF70546891BFC0FB34969FD7DEA4CE752
-4D9EEFF2B46BED908C0FB2E02EFC1D1624642EAEA1CAC1EB4841E020532E88E59AC890E6C3F44734
-B99722E9816402D1D0FDF8045C5481EC055100836EBFB48E9FBC392143032C909853C9BA38A19363
-141BED09DAF02FDF4E7CC9808321CD0708A1B45270BFFCC3A0D7C27F7E781713D5DECE82C72ED303
-86B02D14575A1A6447547ECC7FAAC1BDFF332C92984758E242256C054656CDD2C45D46E67AEC6F83
-9F95D74E222A6EAE12EFAAB723A7C816D4E42D4ED2725A794743F67597F3DB8CCDDE45BAABC25726
-B851E02E56341EBE69E4D91F2A233583EC816F18A1DECBDA4AB69320F55E730617360FCFB8AC2D2B
-737675B406297F7F8C4BC370CB084C22BFEC5FEF02E9AB290282F7B153F0A4B1AE569F1E52371A43
-46A748DDE09336CAD1F5337FC3D7CF0677091E59480AB15021E023E356B0E1BAC6C6471AD53625C7
-0206C338536F4D0D40733AB217E2297F86B593717C61458B6C93A16027CC886A8CFDC01EF19C34C9
-A608B95A84B6A2E31454BC03C10FA55CDCB7B1EB7DC16AC1E93981A46DECD7E7F00638DCAC568744
-69A2D9B45CBC81398727E4ED3DB5DB31965F358D8179CBF934EE2C4D652C9CC211807F070C80E3A8
-222B4C31FFEC8DFB9EE07A94C973462254BC1B1581903EE6F9AD91524A787129A63FCE048B45BBE6
-855826750C586B6B23B805FEC3E7AAAC079576949A06F422FC2C826BDB78AE96135E9E2C20C2B2EF
-F6171D610B2EB8635ACAB7C5C5ED9C9FFC26CD54D2FD4CB9E4294E178CECA1E16CC8E3FC06518BD1
-6F4D63AE2B435753538834CDD9D8AE7DE624006CE688938031336351A6578C304C2E5480A3FCB43A
-8BEE4953DABC30558B7790C6E7A6F0F9FFA557C50417407AC6A0DDA1E736F7070BC89455FC293453
-3DB004AA9070734C8C2608A07330E421A0220DAB99F8A77489132F6413ADB9EA637F3B75948050E6
-67276A55BEB09D4153DC126BBDBE0DB9298AC799A943D72AFB769BFA1488D311BEB86A907EC9385A
-AE4F77835DFFE4389E3D9ADED1B08BBC2B1ED6084B3D1074A326CCBF38E06BD026919107BD03BD9C
-30470DB779508DFE0DC82DFFD2DED749E872EB7EB9DDF509D5319865070DD76846C34E4E43691AF4
-29AA40DB4BF2CDD50B275589987D8081F7C5A0461AA5D1455A660178A94A0BA0DCB69C3CEBF5EE04
-26D6534F6F919D9795AD6A0E1A1F452AF3B4CB2EA54D6011FA809132421D111EFC51174E223AB6A1
-3596411A9723079231B050CEDAE7659CF168C39AEA9C6902C2CD37D25492CEE00096EDD63DC7643B
-667FDFDE5B595DC54F0A72C2650E1E46990584C78A5CEF9BFC3C5F88CFB0C49CD6CADD9DBA675177
-D601927D75C6902B55AAED0E9E3CB52A577C887D581B3CE6201A1C77C9546CEE5A13B92963337F17
-070E2BF9F5C5E86B84225863874618AA50F4DE855DE567BF2AB7163944ED43DBD7F4BBC0E1623180
-7C43DCB47B2EB694E6FEDCFBE26194D2D9943A1BFE32AA1E5305F5E341EA021F91532162978DD1B8
-C5295A5E7551E2DEE46DC2347C6B32197AF430AF3BB676A53BCA9BD1EA88678377DC0A9A86E2AB6D
-E29E3E261BFD5573C66FB5687BA9C0544D894A759866B066E1DB5C66E60AE071CC3A1C4AE40197CD
-E4EC723F7B80137619DEDC99AF57A5497D6E03C1C9E672E74F48F6C213A3CFACF2699CAE72345A51
-C71C1D69348DE5BC5F443EC0EADE1E76A8A33066922CF3869E3C1D26A3B34E540DC08EA4DA2DDE3E
-EB17C16790DA4EF1A3A76D71D34B788A87838BF2A5A3DB8176F9C097D2320050A79EA6C4A94926DA
-11ABCDCD26DBA09FD33F30AEED977E8B5AD928F3967F607628859429DCB4ECEC7DA3411BE35A0385
-1017B535985632639D378CDCD13B00FE537A49FD9EB6DF1E3AAF5C41EBE35721FA6833C2FE08AA3C
-FFC3477E7FCEBF9EF9F4DAE62FF78F319481C3F1E72999C8A493EC6EE295316B58A5CD62FFAB62C8
-96E521B678342F04BCE1613CF7F6778CBF5227BA20504500D743270771953ACBD5C6586432F3FA6C
-0987BAD33B88BC6C15D29C4B3CC54A9DD72A2357AA5BAEB2CB057CDCE72DC80CC98C62B16AC50B4C
-6A7641379B766CDDF990DBB2FC7F9CDBBA755B6E3DEA438FD6699C30A99A8B3178E6D613AA938120
-835E517431D28114BCA1AB745C11FE6E52ADB82B9D3D53A33BCC49740C93017D9531ECF43831359C
-5C93CB0E926DB440B139E3125CC2E069B1CF6D96EF68407F32DB517242C3AE0BC6723E560B0F45FC
-7F87A5E44E1751C8B7F9F669C24AD5CF16F84FB03BA121B86B0694234D8F2C9C947269AF96FCA08A
-78F736E4E04ACEA44C5BAAFDE360FCD8BA6A59724CA86160A5527FD564468123D302DB45173C1B21
-6B01DC5B6D3415B13FBDBBD3121A5493374B3357EFB131CABFE5087AA1D2C7472B0377066B3632C8
-2073C6A846285CC953A8F28E131CF587B35217EE498D9A1DB57B063CE068DAF55D8CC1771C0C3099
-9CA4FDC5D67BE4E7E69418F6334BC6149000821B89A7437CCDF9A6A0ED702D5968F1E04F7E4FE9FE
-C9D1E994885CB624035BBC5426CB8EDF0456828F8EEE75BE491B45FAC192A405EBA25CAA4F4C66C0
-DC234D7B417628DA5276C08260BE512B2432256C401A66E3B583E69D23E9FD278CD5F2178544D054
-16B9B4F61A88A4728AF2CEED07C08E207F31D644E8E3BA1E4E2F9D8E30936BCB9C6AEB54E37DB46B
-D64F2ECC1021336D0564DF0F18E5A6B6BA470233D8D41FDD9D1079706EA685B6D8A740570BFB78E3
-984BB155C3155C69BCCCB41CB51975EEA1C1B4294CB546CFB03DC31BF86EC3BCB1977E8F94A771CA
-B09DE12A82F1D6C791FA7800E5A21DF81C9C8FCDA78622ABE75B54AEEA747AA4F26D563200992E33
-7231A430137C720A17D44F3AD6CFFE63B2DE12D3184BD3E151F955786B8DDCCCB290C42718F3A219
-1759DF76371C2FC177544A6C425CAB14AAAB31628A9CF9D71B5257AFF0D59843989CF0D747375A26
-DC9ED29B66AC2147DA0168306C48C2484C70CA92F33C0C138F92F276F5EAF5EA3082A8A1CB12DB66
-1633C2F71E3B69918F509060AC949FCD52C36498A2ABB77D139DF1EB33E3B846A7C1BBDCEF5DEECA
-4EF0AD250CEA9C2751E13EF7681E8FAE0491CFA6C144DBAC1FC39D39E76EB12D3EE9CA159AA77D27
-94F0C433345B135BA632F544082BBDC9471E9FA3AED3A7D465AB7158E8AC97F68B1FBC8D368E2350
-45C18EFCCADEE98778D894D96301F903283C5AE355A863BB0DC5809158F7E108662D04A5C1234915
-E7BD5B4C30F9EFA55E702E54F87FCA06FB321507BC57A1E55CC117E21AA4E3A4DFB77C1A949EFE36
-6D93F2BD827EF8CC16D387CA82AC039F77FE995BE6D9AEFC87F8D809E90C1017803BCFA1C737DAD5
-F1A631EBE6894AD20C70791665E7BC71F21C2C3F4462F60FDE75C8A377CF49BE99314663C6ECB538
-B1BF021B2F2174D2B22CF6FAD115EB0ECE8A2E64097A5FB0A2AF666E1EE13276AEC59FD0C9D4BFF2
-3F71E835984E5EEEE36490C54E077AD7355DBC98BDD37DF29B3DDF8C55480B7349C4D17322418705
-796A8C521FFF920DD11773FC44FC631C7D6E9B420D7965D7F62EC7385F2BE30A51E2D796483134F8
-40AEC71FA19ED1272C27F98F2CDC9C7E54DAB585AC1703ED08F5F9E825564902EFD08EDF99DFD494
-44C21FA6BE16CB8A1B6D0C8A5ABF80A50BB8D055483176FD0AA07EBAEAD88FD694F96FEBD60751E5
-C4D8F9BC747D4F4030BCDF9B0370B7A5E0A6923FF60DEA16EF47F886F10CCEE6956ECF41A21F7C59
-6F3BC78299A9657266807E01762B2B2878E551914CA312C2A68D34CD91E4F5115EA1FBE801346E14
-AE529049089B6B0273E258785773A9CE8E4B6C4211CB7C2767319576758F811CBAF3A3FFB41B3130
-6C49F3798B698A47BFA2E3CA0251C4D90C0B02ACA28C611744526906791D9E157E54CE4E1BCF5B68
-6990BA8AB7897D624EF00EAB92CBAC255AE9177DA9F0D86447D35B452CD2F337147B5D3EBBF2B952
-35778A72914EB3707EA78294B3A3BC4ACB19FE87C72AA1D982E4B822F07B115CADF4D3E7EE3D1BA7
-08653BEC6F0A352A0C33252ED0630E7274961896D461EE8BF523D5911BAC1C8AC763E5FB11FDD217
-4E1F129675969C195476C7A5E18A81BF9A11ED9F2336D5301E3BD32174ED5C933E8C85D6272EA218
-52A6F7E2AAB174E0965F73E0EF89E906BAFB181DBCF8B1F5AA0C12D12C6272753C016AFEC2EC9F95
-41B8757874D6F2E061ABBE8B29281677246305B3C41E90418426C575BAA216CEE3C5EC29B2FDEE1C
-77C14FDF940792F48A56AE80AA33E370B037CB28A7373F882022AF378F26B6006A049FD3B35074A8
-65C97D153352ACC156992C00DE26AD21C982C71F0EDCFEB61593BB40FA5F2CEBF23C4FF34A4F4BDB
-73CA273C269242D1C6117262B7C47771F2619FE5710855134A80FA8F92BB2425CF88940CA3450F81
-234ABF2B11775929B12CFF86442B2AA0F4243D324A5983E5D1829775B3C7A111D5622D1C4E2B2A2F
-982FC8A95F789881416DCB34950A393F4F1720D2212F3D343A17683060182355DE9E4718506D76C9
-184F8DAC55788D7E603CFAF4907DDE965A49C323DFF425FE88C09AA4A4D16283F9B14AB9EF1BB885
-A954034710B4A9DA4C88A8A0932B18D139A687303EE562EC9F656F12F3E8F27DAA9C75DB0FA946FD
-0E1A982BB58E040BFC0A49A4AD8CD668493FCB573C849EC5474049A693CBEBD4D79AC7515047CC34
-7A9A7570C90861F3ECFB57B9F53AB9C0D6B05C8C570A8F3C04D58555A45524C98FF091B8F8A422F2
-E0E9E5A7B7FF69F1CEFC13E42F1CA276BCD584516D266BA6838D5E9CA9E9854F50C7D92CAED61AAC
-AF758A7C7BE59C3BAA82BF32B691ACA3E8EB171E08AD22C39FBE586A54E6E4DE2CD86B31138546BB
-8DA5834B2C6E4838547A1B67E651964E43988C8036931088904BBB589CA901E7EBBC094C0DA81E09
-1915D9E46828AD8596FD0FCA39FF12A6C27A359337F973809E81B2E9E3D43B3146F2516667E607FF
-EB9AC80FC95A7B7D4DED551FEE0F3561C70DB2D69ABA96673E39E3397F1C3F8FE5F48BAB8AD6E0ED
-8901F90F6CFF24E80CB5DCAC498506C4D01033E497C1241E413B022227A3264DA68BC3F91B35781F
-A2D018475C199F43CBA7D3A0D5697B45321BAD2C394B207136E1E16B41794975E8903EF2B2E1C33F
-87CF72C325C11EC0B92FD3890ACDF60B521DA32596763BDFCDCA837ADC6F26F129B23CA32F9CD39B
-33E64576970DF3C05B8DCA4BFE2F17E6C5678B84D69494F1DBA9FE0446AE6AFEAA1FF245C07916C7
-B7569E6267C42B459435A1D116CEC665B311E404171774C0ACC8DDE96B0D9167C8CC7D99C4240559
-2D745C4428755500EB4719340D2FC6BC215B67823F69FA949C08B5EC985D7AA87C9AC1F9BCC8994C
-6CBCE6027B7D1E0C22A83A5DE61DBA05D4AF6884C95F46BA7F253E0B2337E312916E163CAF9DB2EC
-56C5425990FE73EE53E42B3BCCA1CF642F02B0C5ABD529B568E9ADFF865B9DC190240AD78AD226ED
-884BED3C285B4CB0E3929E805C67F1318D186504D92085764B70DE6AB5AB6990F181BDA50FC31262
-348D980EC76608CF08176C2502E065AC2D8EA5CF9E2D44E2B70A7DDC7B922047C471DF8A0B2087D1
-106B5BD8A830EC0E53223CE3C96EF56E5541191167860EEA58D696EC357EC55799438C90156BBF2B
-13A0D5C9EE93227746654ED73EA5B9CAB61DAC5BC690F89C87FECAF9AD03BD39E438F43B81D39E07
-E0422F94E8B096AB38C88BC2E1A043811D8141C1A35DD3A6DBE41620E83C8ED3A379CD80D4F9BC30
-41BB44B933DACA7C5D4427AE94A176829F24B5968B713431CB8BD9F53080832C6B784CEA9B515687
-F121983EB9D9C9CE8BD4FA3BEC48AFE64E643B7BD86D8383D07521FE5D091392BE124CCC91113604
-3824B686988E7C83AEBF406D2DA88FD952D0FA9327F4AD04C55FEDBFBFA76ECAE8A176C516479AE1
-467125B7EB3C9E7C5B103BC0C470946346DF271F8EE19DF7E3FF7478C35EE059297F4BF21A5C7B95
-993BE6202E897776952A7ED0613A5CACAFA731FFC633CAB62963150E86EDAC796026CE02EB235B9F
-7A54E0B0C5281567138A612BAFE409A818C216DA8EAC5EDF9D1E3A1E3514AE50735A111B4D2AA083
-4EC6C11E290D58FF340F82F0E079F1C7B3566F2336EAA45BF72BCF88569988DB5F65D4C1E59B50F3
-41E45A899656A0B522847ED567B49CD5284FE50E5F8652CDAC1C076804F2B2185F6A51ED19DD4941
-2E65A0D2DBC844B75E2DF71B009776D9F97A4C6F786EFFEB87A307FB6B912BB659DC2BCC6D509A9F
-BDE87DE8D716040A8551B6CCFB7743978AD992D14D2B85CA052E87326138DB196C24593F8F7ECD6F
-486F85D1666B9DE2ACA6C7900044EE369D223524664A2790B773F9EA26E0A4CDFD709942A44298B8
-249506EB9B77BC887DC0EF947DDDC7CB3CFC6B48F060DBF032A11884E6C226D9D447A5A458CBA325
-D57E144C6DC295262763E7BB8FF6A0CA473EB7661C12E0E8E23EA37E8AB3387B9E54686F3E57765D
-4067E521BC1AFAE52394227793C737C19208803F2F2DA920B553E2AAF94EB992AB17E31B58C15CC4
-AA8A1B444DF5B3E7CD937CF03E1F7FAC63342731B4589F16939D16E8E497A74CDE5686F529E9495E
-1603D74875288CF53271DB9313A4511B104F80B179FCF213558970A002E945281BF3AE51E668DD6D
-13D9E85152747F562CA0B75DDEC8FE9FE31F8D05B0F59E802888A7A4F19B29954A31108D2F041367
-DEBD6AA1CAD856BDD1427E9EFE89956FE28D500CDC6A0CB80A76902A08D0BC6705583243F1DD8020
-749B257EDF4803BCAA653F7FD6D8B91690995BA5EA3EE92FCD367C11601C6B8ADCEDCE67B16C596C
-5D200693AC5FA15D4CC6CE9DF7A71C8A925E99F5085313D60FAD25C1BBAAD28D4AC2B69062D68F39
-0530A976319A3904CEE44DC9451E441AAB4780425440F8C499B81460B5D3E268974145117ED843B1
-71BB14AA84C3A084A7D8E07B9979260675D5CE6534DC176DDB60DDE90F6A3674F67462EF78195F8D
-FF74FB5882B079DEE31FE92816F16CE1A70D07752EA25FAF5000ADF79BBE7D17EB1BD2F9BF6CDBB6
-F078CAF97986442680A8FC4121866F9CE86C385DE34E30D8B9768A0136D9EEF79A4B38EE99CBB9A4
-D32316564C9D56996E2595753EA71BEF684834FD030D38BB100E2332B026B046316A53270A96DAB2
-182E994E91262FB03D1AFFBAD623F1689228409884F91DBA153030870A7BEB2C7EE2DEC51875B137
-33B7929041F8D23A94904BD54DD4BC9B432DD0C78DD81639F46D686FFAD39AAFBD1B6C1A37E248CE
-48F23E12464D5379B4AED0D50B5A41577E6ECB75270E9AD3EA7D0FC09DAB271FB18B51DCFC0069F1
-5D72546E6C51049F3425AD005F88FD7F02042DABE9F097F9D6A076B30D8CD777B1EC12BD163FDABA
-5972EAA61E3C87E9AC007A052B1A3FFE14D7D43C7A0ADC89B1DD4CB4F9C762A84A6C0701494B2D8C
-4E4E1A9245738BE4111805C2F153A20ED9FECF2DCF4C8F7C3BAF84D60454A7403D4F5F81C6404173
-A7BA81BB0CEAECFD493D877465DC5735D43E3102CEC57B8A589182FC65A4704661A9E351FCCBC731
-5A87E62F65D24EEB9CEE979C6E10DBCF5C162ADB926EC8CC9BFFE381F6B8A3AC0A19D1631BEA2938
-731AFC99E8EAA39BC75DDB3A39D01AD8F0BC1838F4D674B9BEE9F6F7BE4D9C8BD97E8D171EFF330C
-15B76614A1FFD25B3BE19E4A201BCC850F926ED51616318C965AD2F0E56F9433B1247C6D5B72EDF3
-D408A3E0674A509BF30BE813A5E669D72B978794683CA8B85E3469EACB167C30F7666DB5E081B81E
-E99ECFBC1704B9646B1A29E4A4CE5654CA8409ADD60145DFC54225BDB8485E39CC98CBC3F38FD0A7
-97E5DFC2099452A2418C6636BD2D5F6B24345ACFA65F4E7DBD2D0AA0C1776A4920B4466C509BB5BC
-7D6627946C4DCB38A27098B7B5BEEDC2B3BA18F927077F71E38644597719652037621BB350BB5369
-DCCC073954026E6438FD8393DDB3630C4473F06D9FB9E422E435566C396B12FDCD5605DFEA232171
-CD8EF298786806E9159B84599C26D4C7D8C3BB064665CDD072E2083190372AA808B2268B3FEC8878
-B6420CA829BCF995DC20E067EE6B8E44D2869D51BA3AEDD1763F7F8D2CFB8EC41E6E9E0129DE5343
-1457960CC51D546B10B8B6CE08A1C2B79FBA448DF9783D815608A16C55E589DCD8EF6B04C66232F4
-7A473973A35618000D79B8173258B7365C9691DDFE47B16EEB08B28F881828B946FB5D6FE10ECC6A
-FC4EA1F762E90B3320403382E42AF4885B183AA48DB5E4DFC9A54E0B4FFBF7C26EB17A4F13B4BB93
-12234434FFF05549E7587BA0373ACB3E31418BFAF400D8938FC6466B94273D1735306AB912AAB13E
-31DA3541C1733E2A7E4DA5B82767D37F3084AA7A7C488CDCA7ABEF77D19E42B4448ABBD346E9BC28
-8ABC4540C0A1CFD0BF46C5BC7454B25E27E9906A3E6CBF678BFECAD1B19B4E42398A210CD567EC35
-FB115D5C0DF0EEECE593982056B0E1D14C292F70B3E049984F8881C8B477956AD3140B4AA22256DA
-AC0D11C4126808B5B9F922BCC5F24A77FF352E2C621A3941AC07A20E550A69C49B1B87D116EE6F2F
-970918F0F1A501166AC4423FC212E4EC8039AC7F9C212D864F418CBB92948FBD588228108FAC1AD1
-837070512305C110F0FC3FAFE6E1529C2BD0DDE868A9EBE5137DFDFC5C12A3D08014BF0EE27B1080
-02AAD6B607F5C5C0F1B1EED3C552919C9A2E97204A8127F97B1066607ECFB47BA95EF2B51F007C29
-3B2F6A63041A9C1120D9CFCD5357222E5B02DFC73CF94CF9B5CB00EAF073E9BF253E30E09B50341E
-57BF245A746EA31BFFD0B00201C34CF0881BBD1006BC9BA7D420A48E53686B598BEDB3449924EBA5
-8D5DB1B1B01AE2BA281D5758C99EFE38ADCE18F7B182FBD0D0622A6EA497A4E7C00C7D17299A2765
-EFD8DE376C214D01A21819451FC04A0277EC84A151FF93903D61C78AB7886911E36E12526ED855AB
-43F6289C1890222602B8EFBF15782B374AC1E580B6E963403D6D15A051DB8558F2E61C0B9476C6DE
-5D4861585CF515CE951732F20D32969F39192FBF1690D242AC04D47E0C53D467D0FE4656B9526C0F
-7F852348B0437737CB0F29ECF9B54A5E17185236DD0C16349C3496F3ABA569EA20E343F6D771210C
-39DC932DC65ECEF94575C6E76902CDF6C8C8361F9C757A2577DA535187FD526699917CFE0AD438C2
-A758727B306BC7979547E68B94E87ED820614BDBC649D469EF6B4E4E3DD2EAEB5F80B22FE576CED2
-56495467C76A75F589460061E03F3A1B065121A5ABE3E2C51148B3DDC9F624C97889AAF7FB84B158
-C015EDA5670746C6359D27B0C2BD65144F2B88A64331816DA904572BE398E015A9924218B3EEF951
-23AABFC3AC8217B7B4F691219A1C9DD0A3EDD5C04E63ACBDE71B423522532561F4B71B7028415C34
-37E346BE728A415596AB749015C1D59BD8328E39A850CB98085B34B57FB52DD1D154F98FEC49B3AE
-BFCB1672762E4D2A1ECF02787F59DF1EBF2625C3631BED849B298C6D226BE4E6EA2AB66A287D2BA9
-2A6C9C612A5F849B3CB3C25F17164BE286F6E4F5E7E4C9EB17BC68AA5EF0190B64696A570442E1D9
-BDD1A30E7692524E30E4B4C3DF84481DCEC6E10E7308E65DE9D90099F3FABB3F4F766BB86CC98594
-6D2003E21287761A7386CD8461615B570BDA015F5EFA23D18E83C325EE444EC166A1A32D9818C2A6
-5A092D44156C06D3FD079B92450B8A491CBB3529DDAC7D95AFE8EAF33777FBB265FEB8A4B9AFF2CE
-CEFFF49AFBDCF6C4197497D3B448866D70EF28D8E4B17E7CE95F43F64BB48C4A73EB84B26650F62D
-3E5199D64DB0B5B87702650ED0B850FD5D16C848D096E4C7E61BC63B2A3ECFC099CD713E12C91A65
-77A88D6F55D348617C7A49890A86EA8FE2045704B5ED529DB128C9B19EE129E5FE6498CC97087F6B
-DE96007C9D01CE9CAF75646E5A5B32BFEAD9362A52223D746943A2D09C536CFAF78E601BC2D2F0B7
-63AD722E3A7AE7069D65F9F2BDED7278511D0120F5EA071D41A69F8C2A2D720D3B24B4BE61C83FFB
-EFFAE21B0560A6FD1A44E53E42E0D10E0E93F421A8A7E167BB65F0D7F1DDE2809FA3CDFD931CCC69
-B119C83238C1C00EC100D8E7AB1C7FB02EDE97073C8A5860371A8132BE391EB1C397B61F93876FEB
-438C288EF2E38DDCD182A5CFBBA994A94A1BF818312CD8234215FCCD7C240A15AC01A885E1179E5D
-7D6305DC2F534BAA141F25EA6A5F356486E5FA0AE3C6980A9F5E8E99E7AE5B95AC42977510970245
-4FC951E4319AE4B1DDC9B07D0998372C0A95ABA6985A4DBE6DC633154FAA30ACE689D36A7F17011B
-F29CEDC58A6692A8B3B0A5742E6CEC2F69B255BCEDA762DEE72F125EBA98891CFF4D88AAC14188A1
-8D81424979C9079E44890D94EE094D4CADDC1C7AC5F6791FAB8849CC0240A579ABD800EFE3AA4EE2
-F78119A3C2806C05C2B1F17940BE73984982D1C0065433A9BD658EA31AC819DA9A11B87475BB565C
-C294B6F302FE3F7752ED9B963C5279B5F1196762D0E12E6DA46FF9A0CADE3876D7DF695D8965CB4B
-47B351FA3F759811269376B2C3134403633FDE27C9B024F6BA81F3E1699CF64A426618428BA6C326
-6BF016C5DAA5FA4CC82FB6DC23FF2D742160518CD3A65ADB38E53F1067076CA1625466E0C64670A1
-564A54CE14DC5C57D24A12283FBCBFFD0FD594AC2A56EE58B552F7586825E4FB1EC23F8221711692
-C8C56F42272B87EBFF3865191F1C11943BB76D8C0CFC53ED452AE49404D2C8193ECC2A7BB8CFBF24
-870ABA38D2CCF7869E9363DC0AD94FACAED5922B324DC3B6FE83E7B34FE29ABC1EAD62B49FFBCB81
-1ADBB5148D5AC2743E3A058386036FADAB6FF071BC1C3B8023F908B6FF48DB0AB1C9C67487C35211
-D40995E1892C8B66AD6C9C6203F6F8B513B11117B10DA8725AB45B4437B5A88A96AF3178D856D601
-196E8162868A83DA64E408FDDEBD14D6591881EA652032CF2F88B3FD6C0479C8F89AC68D14D01AF0
-CEAFD95AD146E68FAE01A07F39E7A0C5E4FFA6D6A91D710827CA5ACFE7D1F946A8D7B67621D60F53
-41F32C12A6EFB03AE5AC5373A382C044A276F6B41C173D0AAAAE0C1DE4C3CC71EC2637225CCBFBD4
-5EAB92BF39357C57195B410F74283585B12B926438AC72AFADAAD2D0FA2CCA728C8E86BD3FE75D47
-B8BEB96AB13B5480F7A3D5741EB51E3E40C21FF2ED7D9221D9877C7D1A8CECF394E4023FCF8C4EFD
-B38B839499FF5CD96A46AB4FDB46F35D3B48B91757C0159328120E93CF1F2739E936E28908FB1947
-1D3AD7F6F1AD2BD1EC364986A411CC1B547D0CA104FBC10B1CA7B638A60E75485574034561DB345D
-DA68415146AAC632DFA34769B6ED7D7D4694E92CBFF4EFB16B55495908102E85E827FC623CF1BBE6
-A13CBF64E878E1A2A159948B5529B75E071744A5F0E50DF18C110B0AF117CE7F33F8C959D4C98CED
-5A9D492AE6F56DA57B0F17495DACB130660BCEFB064FD8309D965ABE8D2BE98F6898C1B7A39CBBE3
-E75DA0FFEF6CC3945CE76DA3BE915546FE8A5310130AE0ACAA9AB73C7E041C00533B4BC7724657AA
-649B9388B791AAC5EABFCDDDEA2CC67A0FD0AE9BE37DF9AD40636538EE55A83F60E9E026C64FBD8B
-220CEB46E67410144A520FCEACA252E8165448F84D8EA083C793AD09B90B3EE83B73FEFC3365C729
-E3C738894B8C01C2F8AEE0CC8B114E1175EFB44CC4C6CEF5C8754B1CC7CEC200AD8BF1189D741CB7
-5BCA4E88BE959E32216AD33F674F49AB20A354CF3969F1611A95D3934E148831AE7C81A7EBE3C524
-4F743E66A82E10D16CC09F8194EA7A596BC5981D833318AB4F7DBF2ABCE543E410B649D18D146F01
-486159683DF61A3F880F9B21EBFAB77E908C6CFC79F89BA5F51114F0BF7C3CCEC7BF0F3B057C3195
-CFBA6908E31E0DF10DF69163C9DA7BABC00E9A580FA7FAC202910615BD479BBF76FB8068630D1EC2
-1CD2926D351E869E16C2CF1E023CF04D4FC61607DAEFEEEDFF5593E6023492F00029E2AE4B4A2C14
-50954EFA2792F32B4934A768F892171245A1E2F034E2B9F39833F1B331A19A386BAACFEC8C929BA6
-B67CD8922BBC9DC005EC3976575D5B0508D0717C6BF11123EA36D8FD37FA77A6F1F5AA84D4AD8D25
-B2C11D1877A6E2F9B74F3B5829FAEFD4F7209CE9785AA6FDE68672554A6F29D8BF03FE108ED90A7F
-58690FAC399A8AD3A26899072B832874DDB629581A51B3325CD9EDFD49E890EA8959DB937DAB83C7
-77F2A426B967AF5888C33A3635B78D647AD6BA441E222C958EA58D61945F781D7EF409771B89B202
-42AD7D07C2EF592CBF413C5FC89EC30FC9EBEE4BC63709AE33B65EE3091CECBE610B847E12C556A2
-79C8B114C3E460822D3330ADFD72BD69F54C08A81848C2002A08326CF3B09B1305490D35AEE59179
-08E1604ECE75BBE811A715AE8AF7EA9C371B322D0428EDF4C893FDEA607E70E1B6F6614947326101
-EAEF18E29BE0557D2A92CF1FC1505E8B434BC368CE07CCAABC0774F8A63E1073FBBCEB3F4052462A
-A9008A1E53F188C9EAE339FABA74AFD6D60F47282CD9FF721F64BD51787F3C13B5A6C5A5F7861171
-0111F5E0471E206D72520F1DFA465F4A23C71DCF99A04CEEF11B0E3BDFC35B7461A60753D3AC26DC
-50A5956C9195A4F5226388E0953DDD03AF128A98F03BDFA0602CBBAA20AB9ECCDF7255962A332E16
-D4380762E498FDA4885C64FF5F9B480DA487C58E78943DF62616E6E2C69EEC8836DFCFA9EBF58938
-A878F3E792E8BD8C5D6DF557A5D82018DBAE1CA9C64BA5AF8E21BE1B6680FC5DB22422220B776E9B
-A0BF1ED2B7212F8BF111EC8C8C77B223C05EB5E5F1CFABD2D037F4BA0F9503E2CD83F4519D180476
-63F09E308883F5DA5228F83045FF41214D2273B2FE0A9017D5E0557BC2A198C35D1E7E81F7965444
-5760CBA1D3F05EA4B90658E53FDF0823BDB1501ED51DA75C47395073D8980D1E3504E3F67DB3259E
-4EE73A87CFD96F84E221796573958D364A51E635FC55478C9CBF9AEA16B7D8C25F2115CFE4B7F598
-54E24968833BA0D64D1D332A666DFA2A3FD71B05A26BAB7DA382907B13DE0B80871DF184D3622B62
-3D7E09BC32A4F6EA2E6DA450A906EAD36D53FDEC7F83E101FEF32F4FAEC581B000686D86A0D3861C
-1E67F18A4C4647F51F978484D9E3100B37BE9D20AE84C085461C1FBF929C669E936659050C2627AC
-1B019837BAA75757F5B0A82E8AE9CF2111931A38BFC94744E2FDE3F8710342AC615286E4ACE7F269
-743AA05463AF537D9416230ECCA859D8C99B7C6E70BE7FE11DB698589BE9E11900C8E9582A4EF5EA
-94B5F62820C90DBC022A620EC536E06CB8BE7526A789996D0E741AAD980880A33800A6FE92286CCD
-02C9CB407EB31FB95D9C9F4AFF38B37087AC582C1F7B64A7C3D2202BDD62E9AEB31BCA85C4CF323F
-03DA9D318B91F78FDC0D266630F7444ED068B55C05461C97552366A82C2E743CEC353D51028FDCF5
-403B3B74D379B82EB69C4380ED40239E15A86B2E5C860891E26781CC111FB5705E3B7C7AF1946006
-54B5FA1B5FC54FD0BA43666E7BABD2C91C859F393ED49F7123EDFB648A3D6152F2C17F7E438C0A63
-8968AC06B4FB3F77F64F358AE063820BD33F0213C85C40E4D97ED100EC2DA1C2E1EA258BF107AF67
-5A9D995F60BFA37222B9C2B325C0052BB8537D2B27DD43A129C7E8FF42757B3AC9B447703D382108
-DA520B8B3BB3E8C7295B776B44ED28F863B8E1F81B0BD1DAEE8A171525D09D2620C04DD3219D880C
-2ECC79282DD7B1772A9CBBCA706909AE8BC7798E6EC7375189B6CFCE8A875849176E5913B85A18FB
-197A33CA4B5B4058603CF1FA79A56856B43D538E9ECE117D99AFA73B57E307364F553644DE01EDB4
-6234EFAC13046B6E047ECC8F63942F20097AD7ACF0A45C0501A95263DE9439A880D6B5C5214D2918
-0A54D7FE9B2E627EF49E189B59FCC78745E878E45B46C0A648955D3EA8C935113D94F92EC963F66C
-F3CF3A526BA71CDF3CD4CA69EFAB08B7389E3390716892A4872BD29DC1E0889A42D7FFB4190E9A8D
-05D84EB9C5741BE6B02716BC75E0106F5F94BD3778BE985E03860D27E44088C3CB2A059DEBC420DC
-E3A8F4087A9548485E616C409AC400DD1C411CE4B6A229D091B253EB68F06E43511EC5AA6ECA4D6E
-4818D6AA2068DA1AEFCA377611BFA816B5215182432D5683294D67A7C1FD76C52233087CA44943EC
-7280005E93145F5E7AE50100C18364E1B36741E9647C4DC1F68A58EC44095920FDCF05532F603717
-80F78420077EF5C24D63E26040CDDFF8DFD65D871DB943F50CDE84900C1372EF33FD8AB9889C82F9
-4F61A0E6842219A0F39EC7B232CBF802C4A744F33159432E827006C7CA77E480A48A9B0E6A876158
-8A3102E3F98A77BBD62A3A23150FD140D3941773BF7CBBA2338FF37B9EB640558A2313E8824E8E62
-0331568A9B76F4897198A709F9313F4AC40827D8C3A71F2ABFF02BFD57D30D0B14012FB5C39B85AF
-540DDA0ADC27A85B31694E8D7B61F9D9B476571022D98F2D768246550A877293F3FF6ED918A498D6
-A600223E1A61890C49ACFB60265867CE9464F9C32C59E94F7641C3873FB4FA6EB237F8ED94579957
-270D6FD640BD9543E683F2372CCD7B60AAD269E03A72C5CDB732B128818D41A6DDD2BC139F7D3911
-F48E1B1D263DD4AE8E4CE1A686F3A00A2CBF48978631CD243566E22E68F8D7397134A3530EA3745E
-4F1EACB4D6A5FD84C3011094F37573F7F9902305020C53926716D4780C6B0A257BF711AD94C83F1D
-41A02C1C7DD203A3E6E4B14EDA2FDBB36B063A3E074495F626B0EEA146D22AC33457F44F41675967
-6D2A0566EC2B726D2F0540ABF225339F02F406D4E7A62E5233DDF20AE7C86CA0CDD561F33C422654
-BF2DC3685CA91BB9D4B09AC8B15A24A99FF56E2894F11F7BB4728FE8F0F5B799F74F475D2D01F61B
-7E9E0E541F7FEB8A557486D7DF2CE50927515D833BCAA1CD9BF7A650BEE9E003A5951C98ED147C4C
-52F64F692AB281984EE65A47E44A4A5FA93D6F18D276D3B01C5E5F6135AC6940524CD713DF4077FB
-4943E8AC927A68489EA52ACF7A854393CD027EB52EA2DC6234EF034F3DC742D6DB5A67FC21D22B97
-146B9C268BA97C30161CE01EDC69A6A1F05EFB0E06F22644E1A368F0E2C0C6C1C832878E0614B74B
-D645F5CB293CFDB7618B837FFF14A1210AA061C8C81867244305B80DAA73CB25A417228E9559E7BD
-52C119B0CCDB7C4DCE7E1B9F7E8EBBCB575E5BD213BDD6DB88769DACB05E5870232F0EF82F448559
-187423409EEF756BA6247493BE24CB1879B5DD822E03D0ADEA1EDBDD83D3FC46759C679B921F0616
-F27212903F728AB44C1784E8A7DCED0DF5625A7D3F48A20FCA34008184CECD145CCD98E31B79E174
-CF107E8F35C40C19D86B40BAEE6164353408801EDF75A619FFC5B6FAF3F3A95F64795CC40C1F8963
-4FD8C13852D265FBCEF834C800AB46E3E8167476B23CDD8AFF6E2F997C99A86A9CB30EF8C853154D
-0D89EEE9B9CDC1B4F27BDA32432A4173B55CA8D9FB50ACB2D886AD8E5862FFD5DFF224BA13C8B8A5
-4A7F1A9F987FBBDBC5A3C3D762A5BE309D5D926AE5093C40AA47B3B1BD828797CBB9BC9FEC9D19EE
-A73D2A39764816113A8EDC6CFA6E605AD578FC8E30ABD600658A49ABCD5AC54655D29C50FDB72070
-169D1B389F114B7C71EF95A80D82AB537AC8C165D47371FC142A51625029A990A577EB1618480D72
-6DA93C98E5C5F24F622A850CDD94BADAEA91D4BC32CD50CE69E9F00E77DEA8EC1D37916398FB7092
-402605359DF08AFE7B99C76C2A7C70383F28A7C000C696F45291BB8F074791798197CAFF1544C76C
-EEA8C9E6D76EDCBD92A86DF889481F3BBFF0865442264F0EA40D3CAA69AE467A08003F9C30FF7F2B
-77E767580575398462D5B1171DD441D8986F33BC7BDA17D413EBB6B7A32642E33F20B284BF3EDED0
-02352FC66C6F7741A542155F4A159CD778BE56B9492CD95115C1A06189A216CFD2E6725965A13DE9
-73765A05114D9A5A4BE0615AF8BF6A5EAFF84468B849954D15BEAE1CDD57C435788B331905C01421
-B50F20B184506A0BEF746330BC98E9C89AAA8F9D102F158043BEB6A682059A1C8B8CF67B2F3D7AF4
-D8BBE086254CDE53765E3226BA2F95AE8063649F9F94BD9519411DAF8A0287307335668190638806
-E29484A4FFBC1E46B1800E03B162C23B1DC0B4C0DD3C7ABED2F00762972EF06EEB9BCDC7B3F39C70
-BE32789D366F073AC3280C273DFF2979507671B3E1E7685A9A4F0FD3867F96DD675BF05F25ED986A
-79249B75F182FD73CDA2A6A66D693E4CC5AFE3402431B2C816DA1486C34BC9DCA4E2D51C868688A7
-787CD10ABB9ACA14B7181369DE89913CD8FAB58FC84519EA2AA14E54B7A8CE474F213E07CF2DE2E8
-88093DEEC937526816B71C96ED75FA9E2EDC0F9E6E84569C12BB8E39AAEDBF546630745553D6084F
-F9524FEC6A7264F88CEB7EC3358E923B392474E3A48865564431662988FEA768CE555AB0DA48BD52
-6A84B0CB17B4584066C1640C1023D91F7869EF0C4D701BE121A6E3C832010427490758AED7A2B30D
-6028F2215AA44E86D852FDC67DA5CCBA79EEA863BAC9EDC2535B66AB0E54EC4D4411390FDEB8D1FB
-C1743F15C3B68DC92A8659E7A892D5E53872EA51EE8CA7EF51103E87C29A2714E907C79DB9CF3744
-1785D2F73A1EE58550111A4D9BCCBEBF2E39CD3B93DCA300FAC3ED1ADD8215301E5766C30C8CF296
-75746C5A77BF1FE3CD75D25CF193DE8D9AF02AF8F7A6E8F84B548058CDD3C6998ED13463FADE7391
-26D83D3CE2C7201F955382832E32C10DCBCCA35835985B9A93F8E3B0208BE6E92428787C47D3808A
-0F77B8F1D76E6BF6A17FF81CDB065180E03809D03638307BD7BF5CEDBF64904E918FC805AC905379
-928B816480F6E3BDEE47042CBA98539DA0E113B1A5F23EAF1A3210BD18561985E6436EAB90395DA4
-77C7A6D7888D2377B3FC4169368357D880CE041E1F7C875E956600DB7D9B35D1EE66BE476E9DD806
-4CC02230276829C2C0A098F051502E828A0CC505AFD8C3DF293DA1508AC4D25866BEEE6BBD5A230E
-9C2DCDD4F06883936381F476DDCD86CCFE15C2CE3C3243E148CBE603B8513A7CE7A6910A66A90B70
-89E5CCD4368BEFFF2BCF8E918BFE0A1B069AB2A914CA7BB91A0AC3B3C0B060FA1A0316F6135E890E
-E549315897C8464496CC6DEA0F7E3AF43FFA4C3281156067582CA255B1D2E80F999A3AC0402BBD17
-01824C3BB524130F5B82A45275807BC2F3A0655EA208F968B297F98C369192C8ACA26BEBA7DC4506
-FBD1305E2EFA4DBE5375281A88EE2D6FC88FC0A755E72934B4B58F6DD3BDAF7171A4A3C776576735
-2492BFA9A7758504750AB7F38754683B70E9E293CB1CD7B23BA62BD7397ABB84D7EDB22EF6C3F58B
-3EEAF656E361747ED04020163253D1CF3F905B5E85F83FFF30AB2778CAE43781667C0F65C8FD404D
-6B9202A99EA76AF9AE1236631550B66B063847180B6DCA832EA8DC4A6EFDB674B5A26552A7C7D54C
-2799C7D4E03C24F661A91103086DE3A90A774A6988347656344CFBA06065AB22476BB09FB68F9928
-C0045F2764AF643CFEF0516D87FDE6DBF93BAE2829B176CB507BB99835E01BAD5E55C2F8798C93FA
-35EB3FEF02CFA31D3D21B030547F86D27B9448D68E2B155A65C742BD2999DAA0C3AED64447B9CC67
-F7AF33B63AFAF25F3CF7EF86657FE8F952288CA4B691D369E8F1935CDA44A180A6767560C2ED3F2F
-CC38B6BD7991D4170C7C566D690A8A25BE03212A80871108D18CCEFF246623E653107631F29227D6
-4754B2208D19F84E547799E691CA473780DDD56AE620CD953D5133D135E3D51F237078FEEBB73714
-54EE633CFE238AEA63F9999E32850E6C197687A0EC4E5908D2A18C5349627E336AB5E3185B218228
-603A4B1852069F5EE849D571B8387DCE1F8F8E9FE94FADEF128BA83BDD245F8C1C27C11F2ED1A8AB
-2D6D601726842CEE744EE7AAC6B6FA16CCAA39DBF5B3B1D47339F31DFA562671A9CF7DDE6915FEF9
-F19B3E068A464DD350A3AD146D1A241673B5112A4A8768F976723E6E184790C0604506C46591BEF2
-106C40789B733331A80740D59ABED39868F80BECC2AA21C400A0BD0CC326D186FFF9EB37680F1EDC
-32AC78F9059280D07B5FF2E354FED545129FA5FA8F3D4317FF21E027602FDB2522F049BB545FF4DA
-60248130F81F4E348373142F3148DED038AFBA818F26D5B49FC02DE9800D894E9239C88EE0EDE431
-F8083697CB0BE3B497473473E5714717C914A1A926730C249413FEA2615EF72BDB0906933387A892
-370F77EEBF62D26CD583EE643B02E323821379C0DC966407D36AE3CDF646B95DEDC7D7FD0F28E950
-78F12DFC0D6400B327B743C548A0A3517A175A7ED963ED756B1E107AE7087E2446BA702CD4E26E2D
-CDC1A8B697108B5B5E81E9F03105F220C72D4AEBC57665887C8C7964089FBE9424120EFDB14D76EE
-F8C6F7A30B13E1AE90CB9D93D2E14BDE47F4A1D05ED5B18D32AA39911B92D24C93976ACEB7EF597A
-75161923A73B2CC761785493D0EEDC08B5AFE95F3C006B41438A0785C962B070DE2BD096CB63B847
-C87539880AA3D3FC5C345E0992D7BE77C6CFF4948617FDDA784CC55652192B0ED775129C4EA4245A
-41BCF3875BE319DA0EE2DAFEFAE920CD2B6C6C2001762F88C0C5C05053025C0349DB17104360FCE1
-5D7F3A8E30ED13155A74FAF91DC77B8AABDD6FBD5A1EAF255DB209D7F2B90822296B5603FB5E2CC9
-5CBC5F7A6044058B8044ADCE73ACFD896177F1F70EAD2F6534DC3AD755AB2BA87126D63CA2E9C441
-DF0965BDDD6BE494E58D6B5057A561D1E31BD38E92CB73C1465AF6B9C001F7229059BCA4104847D1
-639E124E082F7364B56548BF8112D0EB461B316B2449049F6A476D36D6B7C0C1126C08F2E9A1246A
-3B5B21E7C8FAC6E23B82E33A7783E4F31F0240E96E69C9444E7D7A928636CFD086475DF1E0A28464
-81387BB2010655B9F81A0744121699B4905AAEDCC84BC5D5AB3674601DBBB651EDE7B5DF05C8A463
-DAB41F79706D285C4F9063997F7AC8CEF35CAD51FBE5F5BB1B3FA6DA2C3ABF2B3E925581349728D6
-DA0D59C1EF6444539742EE9A23A5727F20CF9377F4F84DEA420607015A30FB14632D084A2DD181BB
-02FC3A84FC499B318156B675B9CA3CCABD87FDB2497C6705FA70EBA43ADDB6CF961B30E8F6AB9F84
-E1DD8D6DB3314B34B7F7AA3BBE19D5BDC75ECADFD8EAE19E07B387A1FC586F0F30DB695926764B54
-0D89F1D854B0FF86528AD9523CAF56371E29498C11AFB2F4D5202670C834E930103F039D13348824
-16A49BF93B84FD3CF1209EEF7D4994C8302436C0794497461C11F5B8BA152BACBCC08AF8A15F4A4D
-F3EFFB7227CA97FC21D2D0356C93390C749CBE9750B821F1A7BCFAE2C8BC6D9A27F844D8AD088320
-79ABF0EAD8ECD4EA72846DFEED021857F33C1ACE4C07BEC90398B629814C498D33BEB375B9A53DA0
-F926FE6E89E70322C72CB2DDBFB16B13EF7A4F50DF783316584C6AC2BD7D9029124933133B2229BF
-74A228868AB30EA5C3E87C78C3F0962199480DBCADBEF53BDDE45849DA857A4FD85B96682F1EDEB8
-5384929DEE4AFAF84C51A09F5D572705673D885070303FDB47DC898F874E103A9E7C1E894115DFDD
-AD81549C7375D4AEDCCE2E52C13E5130B47F206F7C5AFAF1F9EE83DA8188D70B473269CA280A6A02
-DE85300B93D8A4F6B402FB5DF58F1327470CE11CC63ECEF2EFAA396A6680A6746A20382D9529B58E
-7CE684B39AC00F7086BCB47C2230DF0343BED9B9152A61C9826AEF9E00A1452D91305CF05490D4BC
-0BADC9C6FCBFA93FAD52C3A80705A1956890497557C0873EBDCF61CCDD2219354A4F5621AB33B119
-32065C1D990A9B68858331EE7875CAC855F98563B14EF9E1060BEA90F195AFFF94728AE935453438
-DAB35123D0E2699475884DDAFC7307A5CC06920F35341728D85965F5BA86F261CFFCB1E29B429F97
-6970D42D10E6AF6C4B792B4384122AEF2448E22A58D3AA007743C71324EA08D06819FED14AC1F22A
-4F0BE4787BC8738E1CEF240677571C65804ED3E748D72E89C94B6F310BE748FAEA31EE246859CAF7
-A1EA17CCB5B246C87EAB771E2AC5D378650191081514DDC2C66878E3766CB20DC49F630F2743A7FA
-ECBE9DBE9E815A3CB57DADF2BFF5EF2FCE23A56298A30A2E052FEAEFBD698101F9DB992613706693
-CB0EFAF6F60C8BB5E7D0A50B3392B9831EF3A304A846CD4AF431E9F018FCD3A5B16387552D55DAEA
-683D36257418AAA0E7BF8A03ED7BAB114D7C15119E6C71C1946BD7903C1C42E115E954619051B853
-BF05AE316E15E619A7DEE498F771E809D9435969C1056402725EF40C0200E083F3EC6E0EC27B8ED3
-8DFE32EA0E5E156AC36C4BB9AC5ED111A11678339703F1B9299345AEB1F251FCEFA11FB3101CC499
-907DC862B4463D5523B9B25C5B69F70AB6B29CFC1DF1ECAB8227EB3ED1F882E90B12080EE003714D
-403EC43B7B54491446B6A3DD6EB641EFBFEF060C45E873E7398025B1CB7065441F1753028F6F8C49
-A96801C0D598E098EADC96A21117F817B6FD6E6947642F93E22425A00E8F6B592AD50B317B69C0F9
-4047386A45E5EBC9504FE55451A01EB29DDF9A41D4BAD85FC84CE280971E834F06CEF49C8C20ED2C
-EAC889F158CB14A8C070900478804CFF1D1637CC880C81AA287D8382837FFA8F41FF3C9DF2F22CB2
-0044C171E4815D0D0F6C22D19A52114E780CECD71DAF63427782E85E463DCB333789F496340E8CFF
-885A9D9A4250118B439C71C6BE51A9338BE29251AA794EDC67DEEC6337FA63CA9B03C1C9F75E733A
-4A918646E7BC9792486CB5A4BCC5F84FBABDFE338C3792254A3EEA3D88903C2C47B91E076259DCCC
-8BD3DCA90ECCC832C09C45141C6242026BFE309029A562C3EE0FCCDCD40E5CF265ED9C3DE582884E
-0E14819DB98B3AF734B1B3276AC41D43384EBE73003D15CE39FFCC04109583390E470F431B4407F9
-8550E138F96C4564B494E5480F47C853BDD237E27301F55E42A3BED18FADA152572B7B465A581DBF
-E7DB2619365CF16D71BF8F091862B9FCF04BF8D0859A76F46E7B5712F2757EDCE332D3213B8A30AC
-2CE7D7797EEF6F30904906B0805DFA7CA36D32A20D989858497A66CE72491393DD79332003D55C09
-5A5AB5DF761C4BE5C041FA8407263D604E53091F7B6B15496245DBBEE96A63F10FC2978D99E65731
-28689366FE8B0BADA48B50185B861BAD03E3600F22BAD4274F2542B635F6C7944BEFC3BC741BDEF1
-1A8DD659038CB40FEF2E16AD1AE7EBEDB7D9BA15FDCF26355331505A386DD7399FB999535D6061EA
-BC61DD76EF3EB457446F29D0BB6EC2FC0AABAC20B27A3C123C27BC27A76336D0A0A6D456DA070367
-4D959A4AFE428E2206A511BFC80039ECD56E75F69786DA0A8084D81A66644DD98B6018681F1D70AD
-E09BD9BF3D16D68DD5D0A03AE26DCF1552549E459FE190B310A8776B2C8468C14CA8B1B9A7AF2956
-507A3B705AD75A17A0EEA7FE089273353CECD07BB8563465EC8DECA0EB42F43FE3664EB5F31E1D13
-24185539B28D508BCD065ED576D8814ED3FD637D576F027927162344AFB0255A91FFC616948E4E35
-8867E9FC76A9AFFACAEBFFE110808C1532A2BBB0DBEF3F010E45FFC73F228D28F12E98478B27397D
-8F456781ED9E19711DF2E9EECBC3FE61F7493FDF1A59124668A91BE51F122F93DCA4BBD22DEEA339
-E6EDA3D6EBEE03DF958113E1CA49C8398D2C59DA6764882EE3663F62A55AE50A7E91B4FEAD1B11FE
-0D50ACCC5D75F1A515F0C53616A500F1491381DFD0E2477E402AB0CF9F67D501A442629C8593ED5D
-25A72EDB9746B02F2B0F0759CC9CDCB4C9D8B4519C8C617E569B432F0CF6890372AA879CA7DE46E1
-10D95E230A4F0E52CF65811C54365DF4A3E40D819E2FD379B47DA3233D0DEF0EFBCE04AD8BAA3888
-4F6A69FE5C373E38AE0FD0241480F2BE7CCD18AF85916D2703A049779FE7398FC47D348454CF03F2
-2EB3FECC064606957898B5643464845445C25C0C7D685C8DB042AF5D5882174374ACE90081C68678
-9BCA96AC602EB41D317BD652293EE628951875641661EC86A2C40A42E8F0813A861D41A0F5178E55
-43651CA0E99150462DB5EE0010F00DE6D55B0D7FD7EC5BAEA24ED3E90A7D6A0589761922B91A6A91
-3A7FEDDD3B68254D89ECF767CE8E27F966426A8B4FB1B4085384FD09D63E288405B78A646F44C87E
-EE22C8596B13188085479F75F63D3D97A28F9C8306FD207DBFD38DEDF0FFEB7DD80B2A3292DFBF1E
-D605ADF1B33E85B010309E3EC058FCD922B1325FEE71EFF2DBBC2E68DB52D513E024C01D47CF657B
-B61C9734649A4AB63C0AF4720EC3EFCD82DD3CA6E80BB63BCF1B8DE810A0C6C517C63B76FE68C0B2
-86867BE102424FC31C4937048B6F323D039618586FC21731005D949E7D802A430DF8D2F0CE99F2A2
-376C2953EFC4184355E4D12F422C9E1E25C4DF38DEA334DBC89B540E14C61A7769D77115CE8968FB
-76B27D0863CEA2496783114C24D4CC816DA884D953DA3F9B9D3AF8938BC607BF26A071956CA07E6A
-5509EA2F5D80E5CBEB98041B197FAC760976EE75B470DC20AA023BA3F63C2876EB281FF5173BB490
-D6815604517AA1B1FA0631401B3C1A04CA103E2CA4ECCD83874D9CFC8ABC134CC0F9141D9AFA5684
-8BF222342016C556C14B3482482DCE5D0B6EF1AB522AA1812BDD8DD3397E05327EC12748FC480842
-9B97202E24E1DE0C7C0D272C046BA73B37D30930C5DE5A47D96955CB0F5DED8F3AD929A8B42D2839
-0458F5910A0F93610F79EDDB27078943DFE17C716D65F96589769349F3B66AB7B8C004CCC59EF688
-1F745EC7129865A76F9C2D029D4660CCFB4D5F9D412BA3372A27CB175E9D65F759575CF14A5899A8
-D31FF039AC02DBD8391C3397428AC0D5717C005200790785354813C8859BE90E0E17914F6CB9C674
-F1E9A9648657B54E5E1F52756C4F982DF74E73F6E4D40718C71D1D0E2420FB7462FEC9E457C0414A
-96E475C6BE2C10437096FCA0C942E995A9ADA789AB637B648781D32DFB68E62E91C2CE7E13680F8D
-31ECF8C824885FA7618981CD05FB335AA111B409C59EE337DF4E5F9DCC920A5FC0D620DC07F20DAD
-63F4FF5E0EE5A2F390AF1C32122BA7780F210229E5A5E3ED97BC1C3CDDDD456E739CA782EDBF4B81
-0552368E9C734B0C78B0B8E3F8B2DD782862B74318871BB1EF087828CC173D7B049811FCF598B8EF
-DE4D9BC5447F4848C98029C854F3AE461B9D46DDAD8CE67A521F3C811A81A396CB0F80F3C8D8EC88
-30532FB7F9624F7CAE0F8C6DF875073333DEB28AAA90AAF486AB8C932553CE697B885E71EC8E40C7
-835CD5D59A2C695DB9E51216FF9B77A15B0DA63717FF25B05B939E45CF7FBE490E51E9344213B32E
-115C2DE14D76DFD5845088DE645B0E75042A61D82FB1753C445AD0A956A1263E5A096B681D3BC51A
-9FF32EBAFFF7ECA8B59D40F0937EEFF38312AE57462C7BF3B1FE24D2BA8DFE84515270E09063CE3C
-80DF4935E409F62EB4F54AF16A186D4329972B9BDF15FB08461B688ED49928429226CAD9F67C9D63
-6D1375CBB7B08A5631956B7FE29CC9EFA8D75C9E4919C8C2C54F401D2E0D7BFBA40C50CAE214D210
-C6F3EA5802339F63FC4C1C1995787617F3EC2C806CE44CF8E29F76606CD5836F6E5A2E423CD791BE
-CD3F112F25657DFED9366FC4ADF90B685CCE4A5698E5FE16D7542B913FBC01B288DD13F43DB2B1ED
-8CCB80159DBDC90A8132125DF8DF547C4851CA609D1F6F4D647741260E845B457937787827A89E37
-CDA06BB191669AC84B8608EAE132D10177F3FC384980F3A6E439B048A38D0D6B9CEF09F3F2D732AA
-71BD058169D6D0F8C9D146D9DA046774027559A8B3843F6116B418427E78476AD8F0F81E8A6B1209
-8060FF7DD686503F972D6C42FD6CC29C083AC3D72E3751F21D2E44A572EEC80E81EE44C90FAA7AFA
-BCD3ECEB98FD4068F6C3A4DED0E6CEC523C9A0054D1FC2A8D61A4A26F9BC250B8F302416924AB22E
-722297888B85B9C12F8DFD2A744CBD143F9B2514C1CBE988D9CB4E77D90B2EFD5C2A528355A35F7C
-4AF039C7D1D756305967B847D4ACBB81263D4992C001E2A262B9FEE2D1F5022BE5B15E1D8F1D67BC
-52227344EE912C018CB73E5F47CED54FD202627777BB77AACF3EE6B22706FB2FA9062BEE87E22CD2
-802E7706322648DAA0C624EA885430175F746E1F536F9A8E1C610C4A761D07248426DB63C9319A88
-A3FA449C3FB8AC94C6003C745E6BAD717A3B2EA3862D1E08512A98E57772A62F85F1E2FFBA40E2EE
-43AEC11203DA9CE5AFBF673436F2DB6AF85BBE89D802F7A9E5FA25A408DB69E51F0577DD26F94CF2
-BA2FC53EDDD6FBEB534AF15F74F66EF8D14E7FF77D8A5D284C8202DD5A6053CEAA606BF925992382
-5EF4EFFAA8D878652A4CAF2EE43ED26BF3590402686C876F86C1AE95046E527617CDD3C429BD4CC3
-F9654D2C76DD4102471FF746FA9FA379B16DF96BFE3836D43FCC0B8E95120C27370049ACA4AC313E
-1D50D72D1814F2566B8B29FA9C9C20D0488743722A766436776783B939171FFFA00E04805A8B5821
-4D4F114F7B9C3C17CE7486AEA2BCC895ECDE809502BDE57981318A93F23016F056A421B733C4590E
-34AB08BB348DA4A48F19B6BEFAA1DDD2A49A6C440443028333CDD48C85CD698ADAF3FD8676739E44
-400A98B575BE02350576F96CFA54D4184BA47555B8D12374B86D038D085F7FA51FF4BE2FF5981408
-999B48B2FAF305212ED54B2E371F5A0074CF68D1B0E5CD279BBC8BBAEF694A89A6C43F518D01BB4E
-8402AADF34E96E9B3FCCAB4CBEA2741D3FD9ADF7AF32388F7771845AF99965A6078F4DA335EFA436
-BE36903E33A743C112C0267309F266DD44FA998C9A139704E400B89DAB952EECFE2AC09C82D9F497
-5371CCC27DA37890EC84123193314D8A7A707C217FFC951A547EE5B6D1B7C8ED85BEBD9D3F4B9B09
-6A78E5F7DF88C931E3F396973974454E59340CA51DBFEA1A00DE084B64630E26C6D6A3593B828814
-E27DB0186BF2A87EEF268AA1B135AC09B52CFE53051CBCC88CEC5657BD47F603C8E1A6249161684F
-D9084AC279F57A4F9BBD0A546A87E147B62AC860911969A29B8AA20E3AAAD0079D64E6BF1B0F2CE8
-F0C54C9019207E1B403358253C2FA93A662F63B9380B65C5173C198D86A3D0DC1800D1F5378DA39C
-E8523EB62C6AFAD8A0D7AD1629F2CECAD82B8FDE38975303768C7D3A08B91478EDB3C45A8C6B7725
-EA8596A8ED50B8355FB852FB8966479D12E1086223B1E6523A65FBA81DD106FE254F7309718768AB
-009FF7714A8C363B09DDA73CD3F81BF9C0CD3B0C806CF3B7BBFAB73E46FACAD2480EEBA97AE68EC9
-4D3D79AA01ECC22067858EFFA9D7B7F997ABD2CE5AAA8781E5499E8580C405681CC63EEA53BB47E5
-5ECC5BA2A7A3C5472DF034B022F455C60FFF971B01583A29E211A87F7163187B190B0C1083D696B5
-86E9438FD8BAA45101A5EDCD1BE5AB9A585511089DDAC8DF1B1FDBE582ABD945E67F99ADC4452988
-A9859E39C90EF794C5C4E62997085B7A16A0D90107D08610BA175AD66377345662DA7DA4D8FEF847
-EE5D57E3AC54B928A0957CC1C944E7FF14658FE4A641CD26C61105C0F136A75950764B69CA17509E
-3C19351D456B22C87C55E8DCC4ACD3E150D936333FF36499AD6B02B6403DE0F12901301ECB2EBA10
-324BA72B58206A13B8F37B0AEB12115D0C12879C8EA8A2EB70E85C95434564BA3DFF481C8972587E
-FF74EEBBBAB14FB32B8A84B8FC42EBECA65D25E8C32C19CA5962832BF45DFDA4E871508AEC318495
-0D6DBE89019CEA29E40484C36E33D76B756255531ADD1DB24C03B2A64A47BD8FBA3FDCB1F5B96F8E
-ECB60D5834AB001A70740498720AFB6EC03445CC35B51F7987109618C6C78CBE3041BEDC69B6FB12
-8142CEC5C8683B558AFE3024EFF7A12D04EF59A72E156DF11D33ABA08A8EEB16259DD9529CD003AD
-4EF4137B6FF1654236473DFB93F597331A5E26C7796F528F65C94FE07B3B4F4DD49034FA0CC189DF
-CDFF70C2F1C6D3DF30AE103E2AC5CFF20664AB934CE5C19693292071C93BD590383E0A1931E04D1D
-DD18071DAFB628F5D7472E457BF81D6064EDFA8DEBFF91701C5038CB30865D6122076A336732DBCD
-B0A625548773D0013648A76F07BBDC9C16284D158EC7A105AE37A62279419C3A2F360D0C7A74D6FD
-D0E36DCA2A8BD59945A4196598F690878F84C894852C1811AFEA4BE3B9F6A5219E6628C66669DBD8
-FA9A0CFC2DDE7716A356FC4FB271D8A2CDDC8D4684DE447355BC7A287DC56852A638C5777826EB6E
-B72FACCC86F80BEDDD0D649A883CFEEF4D74750172A90B5DD8252592FCFE19FFAAD868E99562DAEA
-E70514F5DE296EF7B57E6F193737ABB6AA317956584423817E11664A67389197AD9F8F771EA59551
-98C9EE40A0761639E638CE9D890DF468642670235F1373D3AC6B1F43B5777FC0A91A96E095E89BB9
-FD62614DE456CE7AFD6B855112367573FD9FCBBD4A4F9C676E672D62DDD34A9BFE8311B6175A003C
-D143C0DF15E4C0B48C735404086E48AEED6B6FA21FD9F40B84215DFF287F0677904E2DDFDA774A40
-19DF45CC877F553E95A1C65DF1D67BC0C60E0BBA4D205C0DA3DA80229FDD71859F65AD04506B308C
-2B783839F31CFE4425263224F08C5C7E98A2C9D3DC8EA5AC1920F4E395413262E0836BC019A092A0
-DECA104EB2DF6B63392AE8E2136379140DE5FC98B0B69860FE8E31DAB5C5DF7807D19BEA34AC14E0
-ABC6F6519C51247B104DE7D912C5BF6EF11B48FC6DF84512E9F5FEBB48F72FF1B722BDC3BB2E835B
-2E7CC6324BEE84893996B8DC2D4DC2793A4F69C18E63DAF04A7BB5C0A9076E2D5A343E134CC3C89C
-4712900656FFC202E1988526D80C7FD9281FE47FBA8AB5D025E63A84051F6B13167BEC15B346212C
-BD051AFE7A98BE3A2491F3C469718A58E783ED91F90E274FB4978F8719E92A99A1E8F142EA7E1F2C
-46AFF0A2FB50F4D105130CE8EA309B0E480DC8F80D506172B609EA4BB4E2BBAE98D8882814FB273E
-690DA990B60A9CDA20A2418246BD10AE67D846A0FA815AC25858145ADDA106A6778A11877FE59A2A
-BE300D7DB9BBAB31CB5B960B7E4EF91D4600886D8795DC361CBDDDDE05EBD54B1941F426F7FA8399
-270D2F54C998BE92D146227270A8E89AF90C48BAFC4ECCCA01E6322AFC165743475E752F39BDAEC4
-9297290510FFA264342A0AFE2985F85DEEC66C36EB4A1D46683EE7C591A89B81569A8566AFBCA268
-10DDB0970577A76EC8A066622606B08315DB0F2E6C671F3259C73637D773D1A180AAD66ADADA2A65
-95B5F481E5F59E51CBA876FA06D21E1D674CFAB46A02D267E20234324D0891E7847C13C69BFCEEA3
-AC55F2EAF753726BCEB0DE1EECF42ADA964BF9E475953302C2FCA804B70B779482DC9319B40381E0
-9C0096460AE113C19A2DC9157FA138CF0E7758F71008E71D0F7599744D647B09B16E3C795C56EE5B
-D14D8D63E7A512900D67487975EC9CEAEF69572FC3C2342AC5D365E8A4BCF462006B5268ECC15754
-94CAD9A9E7A9E8D9AFFE49AF647C017743EC7CFD5E66F4E4D845A6BBC836849274FBD270CBF263F1
-67DF7E26BA91F21C60F96257C07523AC37A2193010E976965CBD75751E312817C0564E1C5AE0CBA8
-BD12B01122D07020A0852120680985A8AC987BC33BE863EEC52AF13435B6E4048D951F5BCE36526E
-07A8661CF2538F69D1F223BC53BF5896437D1BD46F57D9698F642F0E99C7392D8EE47134E34DCE94
-D392949B418D9821E12CAFA8337323E8469DAC24DADC6AAD4A0DADD7FF65694BA3A27964D28D8EB4
-1179458F91CD3F83B8F119BF5E76184DD29CC4C0718CF7945DCECC993A7A78739363136CEC7F2FB4
-95EEA8CEDB3EBF14373A058758C442939D36774435554851E9519B6F09C31EF26B6CD997DAFA11DA
-91FA9759F17B7079164C5B47B99CCB7A876FBAB1D0D5D1E1A2683CD6914E6B3B755939CEF1C9168D
-30B2738C4349650CF86C90D2542FC9B90F36A494C035A1C86DD716014AA16E6B9EC7AA03B16554BE
-C436511DD3097FAB1FD0CD49EDAB96F74E8FD26400FC748CBD9EE1EEAEE24DA30DB6F8734B52818B
-3A5E510AA5C14E42060898033E7E36CBA9A64042CF94A74E4B52E37AC027C0DC69BAC4944CCE12E7
-AD81AEDCE642EC34CA23E3FF07B8CD35DFF19F33C8D4DBB56A52534F8A827BE47AD4AEDCAD83B273
-38409FD1101C4DFF3F12D3DF79AD1FCE65B2F419451DD059C88BF066413E23DE27D3621DAC2DCC8F
-9F3620DAD0F4B1A6E8C9E6E8ADB552E1EB2C4B2A3B73986AD53ED9ED8911F82F750DF05CD2EBA3E1
-B0DF208A87FB5ED44C3296B803881C1D9776D13350CD29C3F716F0B5A8B8557812024BA70069BE65
-89AA579EADB1F657712DF2570843D7C5FF7F4009D4D232D3547DC8B92ED5C4DB77B76255E661FF8B
-163C6F3856DE5651B597EC7C78B84F0C6C1D6EA3A82286F1D3BB45F708D564E139E81F473C705AB2
-56346328DAA64D1EA8645DC10FD449092E0634D9D7344B2AEC3C75F6B6CD8B3F3867FF3CBB0F556B
-186EE9A7C26BD2D17C8A773055D9D5013BD2F937D697A770C57BDB36D922CB911CD14E7FA14160BE
-19C1A052E297B1A2D682D4BBC9F1D2493BCD7CAD2FA75D904C5F5479179DAF7DC6A4E0D269BACA2C
-4F2430B4C8CF1572FBDC750A05DCD5B09FA3A9CD6F2F2A386E2B3D4D8E257BD43A783B38E63BCEE5
-03EA96FF2C373181744A607F0CB8D281D7DB1A6F4076AA3E2C61914BD796EF8A0873F79F964FDE28
-B792BA99A20C3F1F5ED1FD189FB1867C84DCD6AF43D49420C8B1F3DCE7DBAE71DEB17FE45644DB24
-4F44B1011C7C768EBB7254F4DACA64E9BA87AA7CD0F0C4B2228FFB9EBDCF3DDE4DCED39399FFEB34
-8811547D025320A88B480943A339E2CD2FA3605AAAE87939B1D7901465A1879BCB4C5BE1A179E7E3
-71F1BA2E0844F88AFBAE9B78DCCA47AE8AEDF5BD3D458C7D4A7A08ACCBF880D1F1DC69C636628DF1
-EBDC5C42FF88FF8B66351F3F72D703E52F3CE91E4E00759753A599FDD863788E99858498B66B93E5
-083BC3501C39A9BA928B0D763C28826FD237E949EF0BA85CCA9AA20C405DB6D5612DB718F7B4AD31
-D253AE306E4D7CB615C59AE668D347A4E60FFF7B103F8BD0E7CBDB142A763BE88AB40EEF6B8FC200
-458D728930AD0F94FE52ACBF0657C4907CC7942710AB1FD8BD149A9C9DEF6B8DCA7DB9062AA7B1B0
-11ABB5AAE8B77893A023F9EEEED4A20FBC30F922282A7AE2F1ACFF64151013D6B8AC2EAAE58171A1
-0F80BC18C3BBB5DE1E22EBE6033BF83040629023D74CCBAB3F1923CFA4A6735E1DFA8A1B261FBF1C
-397E26F3BA9C2629CFDA84DFA3D1087EBB19DDA7E2D76E30DC2E15B8821D5291DA1DFD73940E5560
-A8A6DC91BE0075E3ED8D9E8CAC85AC20768D868CD2DC45DEADCC8B59AABE6EE5B2F891E0D7CBAE82
-0F83479332BF9707486698FE196C72EF72B52F54314329FC498171782BF160E1110A19B8208FC591
-EF0F0DA71AF657B43A7CC649A8488B759F7B69134B4F9DCF79DAEBC1CE52CC8015F324C9D46320F4
-4E1551EDA6D86139DFD1DB814CF38A22A89FABB4F75FB896B00E769820F763486E86668253CC466C
-1529A5A924CC337C48448851A381DCEF63A0A302B65203D6571A1DD1FB9DC0C3BD6AEF4891497033
-109CEB5A481BFE442249940EC54096F1D0F2436D9E60495D0ACFF967A741B30467D24AC6B0032213
-18666B951EFD45324987B10BEF4AAA0FF1DF6887377A7F70F555DFB9FF1001C67438A167A00B05D2
-C37065655173A7ED9AE342DFA1497FB1F2FED6098901249A085D31B66DBB6AC25EF16C106B0A6FF3
-47CDF66434DC3F0012DAADE80B942D522CD59AF4C31C1C062157B3D000B9CB86E2AA7B4A5BF31605
-8A0D5A148EAA2C67977FAA0966E4C3454E08DF14C2498AD76E389AF65D2C139A6D8675298C46ACEB
-7DBE6904C373C06E5F71399B2EDA0B40AB96E8BE991DDC39F92F1D24797F9EC9F2FAE25669B43754
-E2498E8EA5C44B176C3FB3E8F7A7A1481275A461F2549AFC4CC73E28417BD8C5212C13105EAB967D
-AA679AE822B9B75B372A99C7E82D6BD83AA2BA00314DA4AC51B9CAA30D80507505BE24BAD0A87C5D
-5D7336EDF60CCA4CEC8201D243C3932F74D171E2409D789AAD0D04A7BB22FB6DC3AB92AE33FFEA89
-7C484D741039F38C317EA396A0FBB9F15A27D87FCBE007558799BAB73212B6E5FAF2080BA074724E
-AC87D88166DBC1464CF5D41B99428851FF1D99246944511CF42C3F9248513E9E51593F253D89C604
-388AD7132D6A169E9DD888E020AC1F8BA606F2E1EBB97977E505D8C40853653D8F398F71CC9F8F9C
-540C22A1E6195BA578AE7262FC845FCCF77B33F33EEF266489AF8B81A615D6A13464BCA58BEC16C2
-3F31D678F14A938BEC31272DAC3CCB1B2DAE577A26BED852FC59843176A5FCFCFA0AB7FB00D2309D
-E55C82CB9049F44FA61F1E313205A76317C4CF529A4456019D970624129681F46A9CD7950B8B5C40
-61853040113C8115319E68B37F88D864C6957DF813B305D09E6A1716B10F26F2EF5C727FC77AABBA
-73E12B5AE6416AB19F6563CE14046B715BD4CB2B1E4D315F42D10F74CDEDE82BCDD524A1A5460921
-9084CF1CDABFE72CC8375478B41614BC18A914903596D6FC2F361EE519F875385F4ECB50F7053127
-4EBDEB14A5DBD906A60817246042E3799BB3AC647CDA7244B7998AE4F3BFBE5C767FD2142E48518A
-4217599E0EC2CF5E86C8C270FF8B02F949EE001D6A439BCB4BC7D7F7C8167C3AE0A7E59687FB8BF6
-F37BEAA164541B8EAFD92E9D152E3FD0F413C99CCC34FCD8AA455A0B55DEC846A5874B94FC95CFF1
-BB386B2A1E22CD1C3914264B6D5BD1746972857C9235052D77A6C0DD3019F8A307FBEE63A3EF12B0
-39B224108276FFA84021F1AC5B745C54690B3FF587B4B1710AC3533A67BCEFC503ADF1F4B62B2910
-B31965E364EEC9CC437CC40181A7320CD52BE9C546B8F1DC824312216C2FD8232E2BB8D40EE2E314
-54C09772A387F9520E331456C269F51A078E6ABD9FB6A68BFD5F557215B0BBD2227B8959CBD1BD4A
-EEAB094DD18E891C61FB00933C0A0D76174D169C0B6445D34C00DC9E06D85EB086C18F3BE27DF734
-EBB9CF078AFF6514438549CBE92A0C0D25EFE4A527D86F158B4E9D8870C7AC5D6C059643A3298079
-CC20398324CA87273B86ED801057D797D91BC3CF2F96C650EE1566CD3CF8656CC577D38B830201BE
-718DC9A494268177A5019546EEEDBF101996BE593631654B638C75A6BAA648CD1E7AA9AC1EA60F4C
-D604071C89DCCFF8B3E430A57ED6DE11C5837E78956ED991058F3646219BEAE94E4D9381A33D48CA
-9B8FF12B54A73FF869D0EEED7E098D80152295E6016CDD809173C57D1F5FCE908A37010AD4C4471A
-53451DE9B4363B63437C374C598F548F145D3D288F42531FCF36A9CDF72521F1C0868FCEEEB1857E
-A983F6B75CE245D875BEAD1BCB8819E5464518E04717B78BD6E335F0AD77B832AF5682062A1E2AC7
-7CD5EDD5DC372EE456C96D38BF8BF348DAC2B4EBBB2440F2CE97B4B337F2E23247E3E8423BFA9237
-CA6CEB6FB93F960CAD894A96F0371168A33222052DE9B3BE04B022AB95C0C243486E35197721FC55
-311DC55F87BC72D09B6C940CA36E6640AEB66C394A5949A604E7F15DCE3A008BB41B0EEF2840A357
-F348443B4DCE064B4C15E5EC52E448C985FAA1C3D6526270B1CC691009959A7620C9A6202619A19B
-E410FF7BD535A8B2640AAA459DFDCB8F2BB35112626497E8A397D4F9E04788322A738DC8907CB643
-15CF63C95809E90D06EF02F72AB04AA61FE02ECCF7E9049FF9F3EF2258A75656178AAAC9F3C2A26C
-001341862D526CC14E92A81BD63502F959066E0BCD659CB9B5A45606153DD77039B8C5D5B13565F0
-0D95A41937CF97089F3938E39659A64DC3D6046D0E9EF66544CAF8A206635DF49926A3EEF3FDBC9D
-CCEA2886EC855F1821C4B9CE1D02A19A11BBBEF43A7D4D536715548A62802F64AF30BBCBEA8C7E55
-AD56C801D8A569C8183615A78CD393CA42C103F155941E845712C335F4ACFC7807202B92A983111A
-ED241BBB8501F15560E8F2157C29752BDCDB274008137277920053D6D7DCDC626A574A82A8A34F1E
-77B2FC8CF7C1A7322F22DFCB450259EB450C52B70DF3584A7C54C813DB41E3DD81253A03B02BC252
-346AF0160716355797B6F8210C453DD7E1E756FF08C7E6A5F4F87605E1DFF35A130D79148A57B7AD
-12D94A129FE3F055CF974EBA09A2B13DEECA2E02EA818A58B81E8743004646C7746110BC61B86ADF
-2D5D8C45A6A5461EB34497FCCD09E711F47BFA742C73F87B257B53F30CB68D151424DC3C210D3E8A
-C67C2495A8236EA2D7985A5E1DEAC699D7B700E6D38EEE2E93B191BAA5A8A2C916D206C63FE63427
-AAAFED2B5784276FC21EEFF2D70E47C8540DCCC3E00134642B703795CD3702631AE2A90E063A218B
-61E5B89BBCFFF84F567E37A31A9B349717A8CDB9C9377215BA838FF7469BC486B64EF2B6D92519C0
-BF0826E3652903F40E400689F5749DF86FE3DE178E21E20EDF9053081F6510D8F19ACD021CBA481C
-484D30EAD3B84ED0190087EE478A17154B243346C3938FDD5340CF6E47B185E64ABDF44F8CBCDB82
-94492B91929BFEB9DA2B033C3ACEE554F0F1A7F8A56DF7C06A3583C1E9C5CA458D40E550FDF3E2F2
-E7BE8312D5FEE98543388EDC8A04CA29F1B82B7AB4ADABBA3F2C331EFF3521B2B92F99C4377AB827
-A989B423750D36ADDD2E286E7F3B694E29B8BC403693C6F7CAB5FE34F1E48C8D41B47831E8C3F5BE
-5ED5142E3C44ACF5180CD41FDA149B1F4AED36812E42BC184227F5034220F74F67830255E1CAEC12
-66DEFA358A87D2E3B4B4E7EF30181570D0B2B43072EE0311C2C157D32EE2BEA8EA4251B59F6B61D2
-B4FDEB654DEB67AA3DFF4AD65B727F0D6B7D61523E4B44D99BA5CD33540F340A35DDD466ABEA4E72
-E504FC9BAAE51D231C33A8CE7DC2970DE4C1FB5B096A3D9C641EF77DC9039886831DDD01C4F21E6E
-168E38BBDDA5F4308C959C7BBF36A42D042DA6862937EB20D4FA2E5927741A58DA5CBFFD9553BEFF
-BD92E6D64871D8B25D9049F4E71970A8FF5557D1DE83DD24286D6C3E4770EE00F9A1A0B0063C9999
-4AEC75E84D6F9C488434D1F3DCFD0A8BEE9ED8257CA97E75E8B1285747184D6D2228EF95D4A0B8DA
-252318ABD35C8398FC6568B294D90AB308A7675F9F160140F0A08C88AD0CA1CA2CF85E4D031CFA3B
-87635F1398EB7DBC666A259F02DB6741D13E11B230025DD6DD64C438409AF109090058151E4DFB8C
-0E9CD65935C4CC063CC6100FDE70896E23E3661C7FC1B8228B26A55903E997F80207EDD8863FA074
-EE4FF23BE585BAF708040C9F8CFDEB42FB8EB71D4CB6D7757E973E4D8C9DDD082712C23F868E1135
-ECD91250BB4335958B07C12FDA75EEB56BE19D1644C1F76A8811C021122619F751CBBFEB1D3DC912
-999017FA163672A1EF754C5CB78962BAAB76EC48461B492FA88F9897170DE857CC8374C8BAE417D4
-C78A56047024731F4A45145F0393A27CAB614A7FF747BBC28E6880D4D01C0A6CF317A1DE5BB5ADFA
-4B5FBFE0C57598C79F25AE57BB797A489D51F85A9B9CF8BEA64293F8FCC43B0D5484DF99DBE19152
-692CE756F6FBE8CE5831CF4B8A5AF47524E272C45C62ACBFBDFE7E60B05BB1A1A6AF0E9210012014
-69B3DBB49EC7B23A363FA68417B7118DCEA71D4ACA2E36F88C6DDEFB70205DF3AB7C74CF65CFD01F
-F85FAF99F172689737331D4C6CFF7A29029772F487FBF625F17BDAD89B4AC076948277B4ED687840
-301016C2B7AD4C6D02F81E88C75B7A04D724E234E38A38269351582245E361A42C75B8256AFD5624
-B558ADA2190F960A896BBAE7A8C57E76DA10DC29E69BBF3AA86214C001A27B39C1D17C548DA5601E
-86A5CF53E7B1896BF003AAE9387ABA9B102EB1E9002DD3754A378F3E49F2C6EECF47EB1BAC2CFCE1
-1AC0C5CB063672D32733563F3E1E891B6073739BC53AAA0043FC45E90E413DFBD4548DD320B681ED
-70A7443A233D79E3F038D26975586E5CDD2115AA614727B1F6DD4024B85CCCFC79D10B7B6AFA789D
-B37BD0E8C423C1A4A8681B5FF3A9FA1F61A46E46C4B1836D1AA41A89264A7F4B1C259E4B10ECDF37
-5BD26A1F412FE01FBDC03368FCAF48AA0EC28B1BD603A6A0D0DADE66D14C9B7285569230FAB76803
-35BE104305E4B748FA99FA31F23991608DFDD2097DA292551136F255051C9F7EEF3FB7C7FDB4E651
-C3D03A4CA357B587245236F4FF3252563F6BE08EF8A3EC09BE2BF27B9120F7D37801F6999EFB1C8A
-D1A08698CC59CEAE2CFCDBF6BD8F94DEC94F7EBF33AF05F52C85760C63950B455510C6AB9398D09A
-C288EFA09E8F631A59B03FBBC75BBDAFD675FFACCCF8ADF71E815A4A49F14BF70E42DB0B7347B528
-4E234C24010E2177DBBD57648E398FA6B54571A37BA8C989503594D03C6E60871A7F964599022154
-02BA168B8D1D2685F5CF8645D5E11A1769473027F42564C2966C10C0DEE1EE1B6975852A4870D492
-83A470E623337544A7CDA5C16FE2855BA2A548511FB4D4FF2E3E78D108E4C734F64EE2F12CC9562C
-BDF363EFAF5201B673AD00583FF108AFF6B68055A5F299452D176EAAFB92C84F114C8C22A05EAD65
-64A3371420EA9E646308DE97D40705E1638DF08704FC90249CBC0D2D3E884A4562CC27370B1A9738
-9D8EFD237E644A7370B8B38ED1C377F522C75F981D878A5E87101E621DF9D85C7207BBE5A87CCB60
-7F93A2E52F660E05C83A7A6CE6D01AB4B62A1EF8DA47CF97D4BBA0FA8EFFA9C0F61A325A97ADA694
-45F23AB1FE27A66C271639F839203040D44B11ECC6E805FBE88843B34C4FD52D1D3C6C70FFED433F
-C04501FC20536ABDFFA429B8DC8192B2D45DD9D646049CBF40719C3D674773F9676F9FCF32817DCB
-55402A72C56D74AA4CE4035687C730B6B44A9CC614BCA5A3FD17C170ED949E588EE45E89E18B0766
-2A6327FB9E8475C43E5DA1B0AF07C23774B19C9EF59281F5D884990D6194170D8293A86DB52A0FE1
-7E88DA82209A00A16BD29B8B2F13FD60AA25FCFA9745F57C8216283C1D6EA1C119CB9B8D57C00419
-5210FFBD56395A3EC2D3098ED38F389EFC0324FD0E55EA339B3892568229D8D3E205A821E8219FCB
-1A7713FCF3450F8BEF976CA0BECA47376A8CA73DF85B340C67EFE4534D459617996526B5E5D3D19E
-17CC5449E5EF2B82B2C4C2131FF8A19FCFE6A186A9840D872D85C40665A7A04E67EE26B8BC9206C3
-5B44C8F8A1AFC3867D96DC6D48BD45063BE25B882E9BC0D0948C18DC870E6925818E1FE17D336217
-F174EB4481F5C0ED37A3BEAFAF4D46F857811B6728BEC461AE6468D87A736572F4FF95B58B04564A
-9D3C22754587DF15495A319D822B838461764B73483C1F7CB930EECC6F7424841EE10E4087E95120
-2FE88A391375C96BEC4480328A54740213F741105B12A39F19808F3823507B88115D468C61B212A8
-ABAE7480E39BA52390A1892C7EC50271156B4E8076FC3ADA222695DF372385DA7B117A29E04CD2B8
-0A320F186D61C963FBDAFE9224E537057C49E82E405196AAB621B5FE4011E1782A747EF935ED8BB1
-1BDA39A141CC0BA42D04AE123383BC95A1D03A85A9440010C3B9613064FFECA76197E10919BA5006
-F35837ED9BCD7DE5E6D968AACB6FC91178091FA467EF6FDEB728E17293DC89DDE5A5261FAA95A2B0
-000FC750E7073900D4D88247DA464613ADC2B3903A6132D96AC0E1C564385FFBF6249DEA76BEA2A9
-9160632DD2FC2B99133E9F2F470F72B45D6F18B45020F604B06CD9174BA3805DB60EB9C5E6A9C789
-ACE76AE9C79C1BD34434E95E501BC968633AF93FF4883C6A596776254C0C74993710327086B2886B
-02FD3E42A725A03459CB36EE34A094139AF5FCF487D3DFE63FAD20BF0DFB60DEEDA2ACCA3510E963
-189D1256EABD81253F7FF9D11263FDBC1DCFDA3D1EA2E52005CE3C605C993231258A717423F64BFE
-EBC34684EFA676358B9B543C2042BEF954829FE3246A879845B30EBACB43D8DD7A20FCFEDF763AD2
-C5D20A798B69E08722DCE6A5762E249ACE3055B650D9E110599EA30DE5C4FE7200D5A8DA9E1FE268
-6350D0DF334877D0B9F6524C552D0B6DFFAE125EC4C18F7547BD51C14288E4ABB7F8A1A00458596C
-390AEEE6FA308AC1F788FAE30D7F8928AFC91D4DE6352D20B19D8D8AB122B7378CB379C5BE7E3CE2
-922FE667EA057B5D7B3F0B51C7BF0C85F87AC2F360D82C38964F4DABCC9104B32F0FB8802235E8E8
-D9A5997D392259074C00AF2CE1D2BF7B8E90E2E2AC34185C68A03BAB8B267778292B227245D7FF86
-70786E3F746F86B9D4D17190DB859A0E144B2A61E6AC9254DE5DBAEF20E2E9DB0B2FF654B996E962
-F55E465DD238BD1643CE59DC2B5A58B1E6E4AE2DDC2D74D79AFF3C34E4E593E051FDA236B79CC0DB
-268D2A89B1878051223BB8F33FF99BA87A4811C0B3BCC01171D0A731EB732ECD8749D27952C27886
-B252F9C3D190419FD2900987A0A255B9753FB7AA70C37462134C467A2C4B7920BED9F9E86F8F98B9
-6D00AF8B05A4BD5F14C2A0D914A9A84160D554FD0718F50ECB5DF5E76623065852DAA74C9AD6DA07
-A119DF12C3577FE276AE551D48B1C5CD8A50E84DEC9CB0840520D78FA7F9A7C2071E28CD20EC7649
-B991F3818CDE295CDB6085F24FCF93147E9F4DD084FBD32525326D2EA147ECD5B6C9D9F4A7166663
-AD18BF234E9CB92FF72138A8A49E73E527E9A6488A4CA808AECABC94D693CD2C0C357D285F65006F
-A2F9197F61FBCA6EF07B013E2B558AB531D2FD270CEE7FA8E467FAB885E90C5884843AA08E2BBFEA
-0AA575643727BA18ACC499FF34E3438645BE2AA71EA491E54687CD305E12BBC94FAEC848311AE816
-495B013BC5075A2D2AE54A7AD7C9105B64356CB51F18C2C28E3A83B9D81A4554DBEC9BEA9A660CF7
-E1BA89E6D4DFB3EEC6A3DE3FCDED9B2D614156EDAE8CFDAD5FF0EFEE31DA3E6A54D94CE9453A1CAA
-D9756D91BE85315F6514BAFBC821EE810BB5D8E1B8F05F64F3F72C4B35D424F7E4DC3AB581B74ADE
-B6D6297CDE7AA8278909F269FED79B7DFD39B1C0338E01D556C4DB9CA3A8578ACE3EC3D743ED4B9C
-0145E4525E8C315F7A1B98584B975C70F0D415708C8CCC13F848B1D36AC8249B73638F95DE0CD27C
-7EFB52BED4339EBDA4812564D7A77416DDF4CC88CFB52D07A252D89353C6826CA1832A153242979B
-6CEE783ABDE65C8B40CF4EA7B42B8DBCC0E02423DD693108006F6A4AEBF053B666C3CB63D1861F86
-EAACD43BB9BB6F2C3A17293C189331D253B447757EE7CBF4518BABB73A1D44874D7F0625E6A013C6
-08E991B4AD17A9ADB36740D25E3E35B459B422F7370B134CDFFF3F3BCC4C32B4E9EBF6A2478013F6
-6933A1FA9403A2F1161EC632F1F04EDF95ED0F33DAD9665D54DD9DB2564E51DA7B65978CAB50D6DC
-1568976E83B056EB0E3A6758518B6E17E9EBFE49B72EB148B472BA144BDC2AC95744C9BF1258F0A2
-E47470AB0EFF90E190A41108914AB8C1ED6B11E0681778521870E80C16AF2AFC723CAD8719ADB62D
-3939D3BC8CC1D8A4E07E9D734F54ECA33D936D2C39D5C8055739C33E53359BD40E576C11E93B4B4C
-122BDBC9B1BBF44243AF4F0BCDBDFADE68C526B5CD74E29CE3F70D62BA83C489034111FE8E4DAEA2
-F01F9D938ABB532DEEAC0E329F42453FF5C15DEC2AEA8C198323C9E8FEA55B3F5DC4751D2E2E16B6
-154E7F2ADD46860E9CA71DC114C99D80E7EA1DAB51E925DE161CEDD678EE6282AFF38E3CD0E65954
-9C970613209955A3F581E1ABE485E56402A3DB0D1E9B8A9DFD05C4B0B7F97FC6D0EED0B69AD6F182
-B1D028ADD2F24463834B13F5C1307F91D363891824E81108E57CFD5211F86400D3E96B107F3B1FE8
-9C4908649D04A46DC3CEE0DE66AF03A7FF9F4DAFECDD6DF4D93784CC899B527784DBE0718050FCE1
-85BDE3F39DEBCDD660B2488D23AB1CFF87B0546D02B48E7B7724C9E87B71BF34B5D6640E0F6ECE47
-B182D41C89461F712849C6CFDB7E3F5EBC1ACDD12D65A422BA362A8FD6CAAC5104CCC5AB5FC04A46
-E4309ACAC83D659DDDA256CCDDD1BFF9AB3622450C4FBC89C82214F00C42FB0311BCB1B722A691ED
-839CAF9024FB1671F18E4639C96D84718C663A4341DEC037175C6BBD288BBF5A0478298CA726567A
-9B74C32A527339C666A294A17F6821CBF243D13EA4B1603C292953308B566653423E7301A032E5D5
-E2B93F1C1434893633DD19501AD12728B5A1D9D36635B589FA2E151140B543D7C5E469AFAE8E80C4
-FC1D9CB6C3823CC1BB7EE40AECB58CBC1465792226B19E0FE79235115F6A3AFE19F98C5DB63D372D
-D7C041CD940F4F79F2474D9CEEA0334FA04A97DC9773064895CF11CF73F11B4684F06E48F4469F6A
-1AEB2CBBC52994DFAB3319DCE3A0C8C2EFA9627496F8CC84D3DF3BDC4FFCB61672780F294F453278
-AEB9262E66486856D37B7647141A82E049364ED3D03F925284A3F1FA3DDF4C0B48B3FE22E7DF9ABA
-239D33CD300FFA8FD4B96192BD568FB18D325CAA8E1F1FD4B27527417B034841FD49E4A77F217062
-3CC8B22101166D80361EB15FA9020D24F61007B0A8274DF9DFCD8E97C85568E76D34AD5DB1779B02
-F034A69CCF9D4EBAA188EB3017EEF5B22A0A552696A574907F695098BD8A4849D5C8311F129447CD
-7A3CF88B8191AEC0AFF30A38A9AB8135608A7829207A7D242F6E1FA7DDA19F5E4C28560D42DB4405
-77CC0C5F5803EEE897103ECA0BD944E320AC26553BEE7852EAA733BD13DF760056B2F5BD1243BEDA
-BC3C1EA0531017D74B47E18F801A60074D6DF849FD0532234545E5B5E112D1E7385341D39A89551C
-80DC2DEAED5D5DA2A4BE5015D297324E92BE64C68428132E6EC654DD4BDCC6640C68835FF8A05E09
-9604B8CD43D3AF2B2FE10C8AFEDEC5A70AF8509D12F662338CBF166D9452CD36331758AC4F4CBD7E
-DD52139AD27DC52569877FE709F297444C4F31899D1945C81B14ABDECBF31DC463A4148F04EC4FB9
-703C158216C0FBE65CCD450043ABFD4E65BF8B28CC148252E9F3E797EA0B57B8721C94CBC2EA602D
-F2C57E87938C887A382D2659226463BC7D6A1DA87F4A341A59BEA458177D3F18D1213539DC0E301F
-6EFE0111FCF6921368BE17CCBB7428127E0C059C2C5ADB2A3F0197F0CEAB77FF7F3C027A8EC3EE76
-CF5C986EB47CB60561C773B3A2DA47B5A35394E29373DBD5C3FF4C9213A89AED77CC4F3FCFC49EF6
-EC7557C521979A546983C106B3627B5FD2D71CC5F08A32BF49332A89C5DA71AFBFB94C949A91220A
-B1F885C981423AF93F73BC1CA4D92D9DBAE3EFE6A76E2DE3D0F74FD3255820636E3F1A6B7C185306
-23C12AF90CDCD2C0A728521E9B639EB6345D1DE8FFFC3B19C72E7A93823DFE3115E9E7BBBEB28CB7
-3DB121AED8920D47D8CC08EA2E472E39A4CAD5881B5C4204F2B732AF9D5189D25ABF413CC78714CB
-01B1D8CA5565169A919DC481F6D2E67F1D490AEBC5CC62A8F62C1A323EBB55ED35AA5C8D6F8B970E
-93205C2701CF4817BDA994FC16197B469ECC5F5E9DDF0FA05640C2E571849571CBD26402B1EB1E80
-3FCF423345007B9B52B13E3B034E8CB3984B925EBFFE719ED4F39F3D0E3343316A6FDC26BDBEA88C
-4366D3B2F851D2B244CC4408251AE2C77348CCE9DD8BB9C89800B572D38C5D1CC34C740BEEBB5DDB
-0A8BB251655FB989840D23205D16311A9FCCF7C85F6DFFEA9704492A4E7A8F6C0BDC29745AAC2ABF
-AEBA02B0E7AEFEB92BA63AB0DF844EB09D505C3DFC1058CE42CDD8043B76398401E1DB862FF9F76C
-05E8BC6260A4443CF494BC1755913D51745BF45ADF2F8C7A9546D7EF4FB11E9D94E4539632C2A396
-06D04480EE459408D7A2A869807A4C01881C1BB21C296A402B5E6E07093D833C3DFF075F4DD426EB
-87B1B8DE16C146DE79F52F5943015331EEB852809CBB8E1D6460AC4D176FE96F8D19F6CCB22ABBBA
-A27C4497D91312C3CFB5BB913B314E43D2EC6AB6897BA7C34CF2CAA6DB4BD69EB5DFCEE0AA917D69
-50E36A68A4C22A60DCC69379D47544A58D640EB10DFE120FCA843B588CA8B94F7869F97609A6FE03
-AC86EC1F7CEAD2EC8E81977D1B946E459DFCFEFE65A7BFF67E66F5F78A45D8DF65AF0146DF74E024
-FC042328886CC1DD7779F49CDBB750345CF83CD678A6A8897577299DEB38AD665DC4F21CE1892A18
-C256F318107DD3E9245C1AD3BC93CEF7B7BF057E33EC9A3F953251261AA3D1A8347261E70A46F777
-3A84F3D4D1A0DF6DD22A96429349DE0D180310E17955B10FBF53220EF6483D03C650A8D5C16D63DA
-F65C21ADCD6C2D0B5D4ADEB2F5526AACF7CF42F9A8BF4832FB2D4F73F3D5FFD984B572232F87BD3E
-59133ED3D2FA19F7856AD812515C74F7D851574019C532C25F8E163E595FC9C83E3E820C3CBF690D
-A62578A980FC0803EB6DB9B1E90E3256BD4650816ABE5EA86CE65C2EB418D0ADDA5F3EA04E17AA8C
-4536CC471AC20236E66ECA3619F161DFEFA485386C30EBB86A7AD930FD0AADF2DA69DCAF26C0F677
-206E2030E3B15B3662C0AD03DBC1636EBFAD1F2F2C37F5FA9856B0198C5B1D80B69C5EFFD94CE071
-5135C649C26B9BA1266B0A5B270CD08A706166C0B320915C87B27DE21DEB5D7E4806F6E700B7A06A
-4E29B629CB40761983E9CA8E34E869ABD04DDA190BFE5A6EE8B22D7E511B84EA584A84211F27AF89
-18DC5AF8A1FF2D360B6BE3CA8E66BA4CD2CE6A25E7E89406684DA83FFBCCCCBFD0844FE3BECD7DE6
-7764C59C022DB1168D585FE25073FE00E30218D1DFE115CA1FC606AFCB04F2A082EF91788B6BD096
-84DEA31F20034A91AB9D971366F97B5009FEFBF1EF0AD941654081B1E8F0B2EA495069A1DDF11DC5
-6857D29533DC857958B49D1A0779732819FD22E437084BD9F3C4F2CDA4D12CA14431937AB63A03F9
-C040AF1D801F367ABDCA7302E18A9050D6026FBA5A5A7FAD44E31593173CDF277CD737D1CEF59FE9
-684252BC0DDD00A80E023B88222494C1C8C0884230AB11D1083225AFDCDBC1E24D4AD5FAB396D2E3
-70E44A7571B230660D510A5076D8E35F7DB72C0566DFC119EE1B8AC3C0406950A3C4A4DA36BDE297
-040A27F70753A87E6CD593DC6BE9962261A99AE5949340C5D45C94A9AA3DD636CE8B497BBB812345
-7C824F443A53B3EE595C38983FE3E07DBDC6ACD55CAE8BE1081AFD4857A5F52A3C925143507A3C37
-F1992CF72ED0D4C48D94AE6CADDC3BC87AC3A3EF035E02181F78449E4B063B0835E827644051551C
-1603E2EAB5875F28FC77BEBA6923428D5521C698C6B7F133B0F689F105FDBAC30A8ED2F29F0255DD
-F8A037B81F04EDF004CBE639C8DB0F94D0C5DB92D34D66C2FED66CF8B895AFC4E659D08388EA44EA
-E83CE459E5BE306750A682B627802990037157339BF142BCB9C08FAFDC3C3FB16DC3544F62C6C7E3
-3E20CC4FC7CA21E2C3F6C546CD78DEE348F1A4C8CB548EF20C049678916771D83ACC9B7B22784AD8
-580134471A3C79BC86B5D6D0D305C32E6204274351C94F9DF45D9B2AD5B5087A89F90D6AA033E4B1
-D1BED022F36147C7ABD2B73134DFFD50907258E610C3B20949E141172B1C6A76DB238C375021CBA6
-645CDC26B717428B5A9B4D3F32A4B1E22FEFF3BB93FD889E1DEF8087718D5E3E650FE4A3330DA9C3
-7E9EB499DF5A342D8BA4C0A033C3347CB25A31BE143ECBF91384F2381E323E7FD3A82A3197C18905
-3200AE2C86B9D01AB0B289841EA7E9E9A26966E0DEF54DE0B85D8DF084B8C590081E444BAF1E1F60
-670FA12AB97159318624F2AF1B5EC7DD83C1073A99398D2143A52D10A13C201FB356BC9E90C63BB0
-BC2D4C42AF4A8B9C8C4D58A1B32E0597C63B3F8B3E893BD3BE8C60231838F1BC78E73A6C8CDD5E7F
-2907F897FC8EE99BFFDA7338BCEFB5AEF950E5549ADFD207AEB15846B509FC57989883642498A381
-1B8E5CDE69C05924EFAEC232FA4CEF302EE3251366ECAEF57D25CFA3B4A9E6397D996F421C900BEB
-CF73B038FE7B16FD0A1172AC2F40D19CE0B02FCEB8BC47DA5344CB933C7FEC950184F78ACB32D3E5
-E290E84BE753B9E7A7BFC4416CCF29D023760C06CDDEF2505806A65E1508990529245059AFD301DB
-669D41BD72BF7A80A9DF66B876B3553FDF4DD38D15289AF7A1AFBC53FFFF135A6348DD784AB42A6C
-0D6AA330B069607E2DF3CBEFCE79D6F63E274C9E73A33EB85246D5EBB986BFA923DF68B2B8CF82AF
-6C33E785F35B25B1D1D614DE85A4F4510ADFE42D75B5FA5408A59ABE53859E28B3D000EB9C6A7D2F
-67C91DD14C895BA87B9CB57B851E5193FCC2A443AF85FE28DF6F39537F23A058BCF81DD8C04CB2C2
-5040300F4C55975E856DCB4E21E2B5481BDCC05601942FB25BB8A6B6F93E2C2A33CD478B44655657
-C557EBB080179EE5D98C5CEBE0B25BFDD952FFEB258014D7A5BC4BCA4F1A23BBA73C454B12960451
-CE1752401B0151CB2E01D5C72595095EAE91D8D3BD55A54A2AEA89239FA176FA7CD6F16BB0733EF6
-CE6E77763A23AAC77DA88C8EFA7BBB2991E472FF2075FB25A75ACFA70A04C28764F4AE4C12051B25
-B120CAD2E3044DA35C1F94135DBD69B10DE147321CBBDC814CE99982AC1D76CE3D3330E41AB31F3C
-76BF89B95EAB81AF3464C732D5B1411D97DB36C9063537F64756F205B16ED7058E2CB1D6946C00A1
-A0CDA9EBBE924BDA6C7D7B605C514A98133907B793C74CA858E82DA3519188CD974B34DAA74265DB
-5BC8550D5F0B1173ACEB87458BCE2AB1F96996C811699A0FE4A9B849D39023725E2B1EE7E426D30A
-6C5C75AE6BCEA6DB41E4EB2035F7F924E6B9F0DCD00EB2BB014222E55FE387FBF5B9B7C04F4688D5
-AE3529FDACB38B5EB0AF5C3A874C1AA6B17CDA8D1E22EEE05A3DA88449200D3D0D002DB86F6C51B3
-37C8E19F338E7BFA01E1202612D50E210140947D5F350E84F790286C3F679A5D7E43BCDC337265C2
-631527FD62D598B7CA1F5835C0441881B97F5197901ECDC4F195BC665A846823D2E41417373F8639
-567B228FE7B73D781F07A361AA49C3E9D80FE5B2A32C4C1E575D194E841967B08D10405FA44EEE28
-47DB9372C5CC931E50469532F1BAF577F680BAB4E30B7E1CFFA8574ABB679789F69A8A1BAC07B7C6
-4EF5CE5EB00E97B36FBEACA9BBA4A13B0293D34BDBC77AD1FF88E5744AF009823BC262511C4724DD
-585E7E17D90F230F7A5861B0DFC42F0B4E49A04EE0EE4DADB908479DEF8372F334C53D2BA5D855CB
-39DC7C9550F9D0F7F77E82D5A59FBBF34BFFE92DC9E6668B68FEEAA4F20053433D6749162BBAC5D0
-D428DCF2D58D49B127FA2E674EDC7D3613B1342F4D0ABD7F4C5B049FBF78E804D5F16505AE7EDCBF
-4D6FA08D72890F5D55199034572AB4B0C9A7E7F6F5A403198864ADF113CAFF5BF9D4AB5B16F81D0F
-C2188FC80875E10034D12E30C0364F8F72797F1AED525A2712A40D44210B813DF5A29C84E9F6D51B
-1D60A5F6F938FAABF878D29E6AB252D95D05FC1ADF5D4CE1C9E585219112112BC6CD5C766411FBD2
-2731794B5DE0A27AC57D3C57926807469C360372BE529098C350EFE2154B87F1205A57A0B04C5206
-CC4FA66B8793BBBE492CC3271FB4F90A28D0066E0D7F63B8DD01549A05AFA5482C29560ABD628568
-75CAC16100087540162473498C14087B29B86B7BFAD693E81765CEC781F3FC80E9C7B410E9B55B88
-114191A1703C638DFBB469ED1DD8254B1407003A319CE74AD419B077F17047A01F0BC0AC8507191B
-F72D77D9333C9DA8C9DA733EFB5305F49CB8C7BC451321ADD7D896395D269DCDFDD084EB3AA70338
-6C0697E962929651164135C094D9BB1C9B949D5EEBD3BB17F02C98C813CCBFB23C2C26218A2F4C63
-9A8B9DFF2C29406037F91938A5E1227310728428B56F48108CDEB33BD3191ECA89F947271983DB77
-6B2BC897A30EECF2601EE3B2A6F0E135397622AAC1F2DF523CE6E6BC720E13CB530CEF4AB9C8273B
-D3D81563AC8A8E6C44A195112DAF824BC7A72FCDC4E129A480717BEB01085DEE65EE4344D0B41EC0
-BCDF842566B1D9F5353B1F6A063FFA6CDB06EF634C8BD5A7A63F991D178F56EACA653DD67685CE49
-E98C7554745A4AC533217662D23E1D6937135D13BC2208EB8D50560A2BAAC319DFAE478B6BA4CA5E
-DA20222F0E9BDB0806320ED1665B54A347DE0C42E9F77842DE4D188E7E824EB2F0D7AD163F05480A
-7FA99C5A603BBC5DBC843774CA66E889B945054C0ED0B1A4BB14324EF901B023C208CB95DFCE9284
-89789690CC45BAB97BE449F8E2F5AA9276C0571303E9788C46E7F789555BFCDC3FA9ED8DA8AD9BA4
-8B3AE09404664391E63A989EF1E24BB464043AA099E4F2D796E352EB277106D8D81BAF2F8562EF46
-BCFD1E0047E8018CBD973021DC1C1D821AF03F083F0B088A62EBCF2BF6C5B0FCFA441AAD1625FDB8
-34F943DD47A5A42EB3E9A5B49641F797C288B799A64897F1346070461B6D535E0C4ED099199C387A
-3176AEDC7DA7E7D9E118E55565092A36F7C74ABF281720C0147F4E4F37D49436466C61FF12764E30
-43D8A6D027E70537164F0E7942F4ACA42BB2CB136177EF7197E76F49AB403F741C0EF902FEBC471A
-D6C627424320A8C3A1F04C310C511B3F91C3937D9ACF459999C18A33F2C852EC38CA806599C728C5
-43714018C65E2C5F430F6270AF52AD71ED38813B60440779455F9529A4A1623CB9F5422B9216F9CD
-BA913B9A1CD95DA225E254E8101216085020660509D03A034B5D7E32E3DB5E5962A9A27711D4C3E2
-9CD84057F7D0D7E8000947AFE896F8523253391D2E11FFFE523366B05C532D5629A90741EAB3D4A7
-31D3F6D4F03FF93233DDF88BB1913ABA22EB9AA6311E3144381DAE29BCC8639958EEE59ACCFA06F3
-5DCCC63E0609F542F3EE5DFB1CF718CA3F328455726F8F65E23ACD970E4049225998371B63E35AE9
-8DC54D8329B8DB0901FAA63129EDE21B158776981D4D094013C096E9CD020315D123C03DEBA21E97
-E4B584B4BC0AF25F5DCE53C2DC0F3E61F99BECAB40799478BE7F5AFD7F68E23EF50AD6645C967EE1
-1206B6E791769428ACDC370D64E4F2B3972E0E4F442297199350663D6E772FC6777A9B9DE215273D
-082CCE4E8678FE9948DC8D5B0E459CD02F1645AC5620F3571A40B4D5A17DF5CFF48B6C843DDEAB5E
-BF58FE13D7DA08E8AA7902119248B3B151DA583101CF80853B0150FE05BDEDBFB50A7FB0F65728C9
-3B9DF48CE8AF1DF1FAC25C1D58E1AD30274A00EB54CF2F16029E1AC0A0919C0655474B9A6936AEE0
-FB74BD185FE7D70BB84786997D34A40326A74356A4AFAEE67B6B26D1C1A7BCFF8697B55C816CCD77
-312C332A55315DC54F9BC0A0F12500E0A76B3936292A3DA2DDF5AA8CBB9B5DC32EDACC4827D684D2
-74E65B8B76FB2C2B19F7D5607523FA953E34BB39032C05B1C1244304606C55660D3CA8607E764EA5
-B03DB7FCAB5CF7788C6E60EC8C449BCAFD90BCABA4132B6CBCCFF16784FB59B36B77CF0A9EA572E4
-CA0A01C725A6CF2E4500CDDF5BACCB9094D48925434F044118CFDC2696AF5FC0CAB3884107ED17B9
-BDE0C0104B1292A1F8C99B06FC4A6360B24480BD59DF0488641899B0F42B1311B582717BA7ECFEE1
-4143654B5371C8B9B2D80685AD38D897AD1E64875C28C7020A84FBB3A3BBEE16617DCB9BC822B7C5
-9C5A18C0CF7E80163ADFB7AA03B7CDE8497C1697D90F2ED90F813095C5B91657FC294EF0E341DB33
-92ED860CB2E0AA09293D0F99AE9EB54C761CA2DB1E51E1CEAEAB276C7BD916C68510D72D9A67468B
-09B3C39A7815628FB126CDFD5EFF59CC8184C0D35A5B5960F824BD175495DD3EB12A4E96008CB13B
-8C5745303E66CF8608FF27C4709C1D854EB79608E52F068FEC0151A74C125EDEAEA555C198FC0802
-7BBBB802835E1D435077AE4B1CCDBF722354F6C572BEB1376D3E342195FA80AC9722EB2F46E44DE0
-5F5A227B731B8D4A4B6EDEF04AF2C5DEC2EEF8FF48C5B18710ADE3DBFA0C956505B6DA9CCB7CBB83
-4DB6CC754948855D833670FF0AC42A4773FEA8322BECEE04CA74AC2D66855132D11A51524488C547
-71B5B7A512796D7D7AE0F9C1FBC9CBDBA0831074F4D200349D0CA40537B92496692766F020AC43AC
-01DB8B2AA2EFA9D21732BE3A315F6CAA402BB2E61D40DDEBDE11276D90C2C601A935C168BE600464
-76ADED15087D54A14C68EECBBBB590927C1E10D291C9285334CB0C80EDBD392BDE4D535EB61F8E76
-41F58AC1DF5B1C5A5D91E3E27E05CAF7EC97ECF0C85B6425197AA856521ED701E5AEB82A7F52A8BD
-7DC97D5B3FB5C99A5DF84D1BAFF89072922509D76BC6EDB15CE5F9EB8F4154BEE1E82020240283BD
-C83A8E49AA9A2649B7955D5C058F2818A63BD0BFE7EACED4A49063C489A626277AE1246F721C9926
-E2A2B6C31045FBCD235F3CC58BC4DD6C57FE998EBD1E9FA5154652BE3A1685BCD2EFAA079A3293F7
-8142A6473822FAB627927EACCD61B3E99C3077103D2D19382BC7EE15BAD0FDE489602D055A01DBBC
-F91A566974559D1B477C209416887053169C3F8F59955BE4DE82B60558CC9AE15602A93F029F6B43
-29E0E62A03982DB32F5229714EFA1491A7B24AEFE18FEBC2C93DFE50B3F641B51BDD33DA38871BF5
-243C17502D00AEA2D9E9734E80A96788D4CF5BC12A42BC386162FC88A7435EE13200C1C2C6CCC5D2
-1A03941007B4C4291BDB711446CEAF27148104BB240357D5EDA0EA5A5CE27D4A83909D75BFC05D75
-F10AA74A6DE37D7DE15C1DDA3AC3045DA6CD48323D904E716B445E5E096FCB379353ED70CF4B6FAC
-102C762711079EFAF13FB74C9B47AF75F3F6BDA2A4647D2AB47ECAB64DA6CC01479F618E8D2D0A36
-45445E8744683CBBC560D47C98078B84206E90EB839B02D37C852B8E284463D4E4D890203C3D5B20
-352110034EAD6BD7F41456B807E1DB1631A9D499E52E9D9853D86728B1A2E511F40F8CA1E4724A0D
-17ECD640B52FF6C66E28693D89765FC391612E5889E77423EC85CBD0A038B6BA98B607701DC0C4B6
-6B3B28C7790A1F1EB8D051DC98276DD9CFEFAB3F65C1C928E48A060C992B392A43E56EAA6DED896D
-EBCE71F8245BE4687F2F1B8FC0F43ECE8DB0BD0AB0811C5CE73CBE336023A0D66168B34A95B4B0A7
-50B3BF1D197E3C042C7914FA731D7831AF798E9429571CBB977E6258244E84701E5FF91D608F98FC
-3D68A4EE5B81D5FF38B6C184F6118B875F022B4CE207DC7B37E1452DFDC591A3E506AE82C7E7BFF0
-011B0A3DBD616A993FBF878FB03B6C9F2055A2B095D29361F8253C2623653687FE0AB98078F6AEE5
-FC2C2BDE0405EABEDB3A33EB7F04CB6837176245F190C6BBBCD64522B12FE7F9CDCF201A1AA8A19A
-7BBC4AC064B4958F44AA0F8DDA23835AD28A1FD0EA105DE2F395385DCCFBE2261DC5A89A23AF606A
-3985E5038706B1FE0910400E16BF008F250F3BDE3AD806C735495D499F16F99275010478FD2127BF
-7CEDD6B5BD505FBE9BD0065B4A7090C9D27CD5B36C3AD33E1B31EB6D44E375003B51B909DA50BD18
-218418B3CD22B43278B144BE78406EAF16C7DF6B6C1C6238004AAB73736B38E168441DC16F9A5CF6
-0793A18633BC43D78674D12D38CC979F7CAADA6EFE807CEA499CB9FE616496682A66E04BBDACE1DC
-112B2156B9B0B20A58A8CB43FF0EEDB99805234B9A5789762AC7D65F5A319C33F4F7438CD15E06BB
-80A7A97E976E8CEC23F4C646A5821880A82B2F1DC27767F090997E91488BFA15064B702F864FCE65
-05D6CEF87D2A0A12B55BA189AF269811E3B8B850C8401F3906C080D32618D9698A766732A40A9FC5
-A94E5BDDA3D028D823D6B603B6D17DD046DE181FD989EA0F80B4CA62F7973E4DF5E032A31FE6BC8F
-5CDA678D4A72787EB8253EA5882C337CDF9AA3E1E7D9536DD09B047CD8962E773F72F6418A3AEF5A
-289B3406C152A50CE7BD4B493FFFC27F6AA52F79EA67E362FD92559AA4F94A2F787F6C735DFADCF2
-F08AAF98B80C53CA5607A94F25F04AA65A70A75937840E73055B3D65FB054C63E2E48E68488C9315
-A13EE949E03E46723C11CC759D222CBFAD2E1A87CAD779B23D38F7E2F660DE1388EAF1CF4D18994D
-75C6CC63F187FDB949940C18B537A0AFB12AC5F67B0283CA5EFE2E764C4369104B9D3B06490D1244
-C41D6085C85F1106082EC9DB84586230511C05C82412D2CDF3DAFBF4759A775628878F997415296B
-C416AC8352A6C6988691FCB831CF95C10BAE691ADB3BA2918B35924BD5C3ACAD8B137397B10AF82B
-479800FE16D472CD0CDBDAAB4F882A0649CF561004B8CB7CA32EC129D0A415BE6CB91DA2B65F44E8
-0D138808A127E851A7FCF927E99DAA0EA2D626B77A16C72E37F058A3B882FC4955DC8CB6312434BD
-3BCED75780B13590BF4FE8D64ACF0371F9FB1D361B05025852AAB9EDA1A0C997CFA58052C454FD45
-1E6C1F194F4D363114E312F6DC35BBAF357A32CD200A3DD9654155134259887D677ACC44F89AA401
-CA27282DF7DC3F2F04A108CBEF2558DCCE28BAC2D87B8D5B7181EA927F61977764F882626D4AB338
-D95C9477C54E9C36012A3CFFBE199EC8120A99D2D70A21F9D9A0354E4EAC7947990E8A6E0601796A
-AF6F14E758CABCABDFBD8204A8E748A3E5FEBA570D36E2BF474C0083229A63F96114182321B2EBE1
-BC76DD193724C4588C1D39D184C332FAEAF4C629F2B3B2F49996E46AA6C9F497428BEA52D58876B0
-DC07B460248BC85CC16773A5DAC36CDE8B152D96057F4EFAAF8B1DC10022038577368057699B3A37
-178A9F1F6C6CC60BAE820B7ADD0717911BD23A6DCDADAFA32473491AA80CFE90F2A77E24CE2826FF
-77B18B869C33FA292FE01D6477765044C7D14A548B28B1360125C6933F05C58B0889390537CDD16F
-8E967E0B38579449DFC1E07389B7069AA8594C5103465D5041CC929268DE863FADB6925B350AA94A
-27D421FB7FCC81C6B35F906F12246B7A5140511A97211BA9BD6831A508E963FE8BE961332F557808
-488F06EAD75E86D60DE3FA2425AE8439ECB9112BC3E4D73747C1C8E87A649919827049832DB0BF6D
-A8C85C9A2592AC002809070900ECAD52A56F1BFD456AFE066509694EAC075788456B0B0BDD7C192D
-321E9FB6AADCAEF00F570F22CD4A5322FBCE8FA98FAEB681940895426270BB4319C11DA67D88552A
-7373398AEC5DA7C9CAA9F3B34581C6E968DAAAB2751CC012199DD897B448986CFFBAE4D412BF9ECB
-F46742715A9569932516259D3B3A5431CD7028E42FC751C434E2B714C718202BF02CAF9B8A2075DE
-922322EA7CFA605C8376FA958B8FBE43031E1026FBE6126A3775F643EA67EBBD97F239FB3C435526
-75CD08B19CA5EBF53B40D728556B4481C7F73EC71CAB0F89E34D60C69B272FADC22E8E7BDC6210DB
-09FDD913E209F49FD28E8712B8508904620250746CA3B21B026EDAE60A2822F59E912E626B93E0D2
-BFB3230DFD0E54E91A1DBA25A609B64D41ABD897A5D21764C351E85F9E87BEAB9E645149AD32AEEB
-B3B1161032C701647115F98C1C2AAECE871862D91D321AB90F3E923B1FDEE00D927F897AA9812373
-6536E2E0700F10053D7E6C589BF66029D794883EAE4C8228941CE96565B50D48887B5314A2E55379
-59638222A6CA54C77CBABD460DAC11B063519AE4F50D93DE41763BA7CFBF4C7724360E750478EB62
-8921DAA065858341958E4F3EB5966C6DD77C05EEECDF4B5F6CF19AB507589B4219377959BD258EC9
-21C34FE1DB003F7D0FEA3E2FD6F5DDB0A2D62CA5A2CD3C7AB457DFF25094EFE04A9E1B9CE7AE3F30
-026B1CB039228D309A22899F6E9B9BFF922E117123347967D7C62C670E2C74579C35989925603022
-C17B1DCE378031ABC9B4B437C7B6E64620932E93189754C01D4B280B8B08699B2CA953AE4823BB9E
-E34133C5C95B3290E1BF010705AD852C72BE87291E1034B09F44A95B6A2F83FEE8841DCF661770AF
-44D0AC7F9CDB280939FC5D953D525E0B41B7BE188D5C794687330CD770D24D9CD53B895A253004E1
-8A31BE4E82B384
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-cleartomark
-%%EndResource
-%%BeginResource: font NimbusMonL-Regu
-%!PS-AdobeFont-1.0: NimbusMonL-Regu 1.05
-%%CreationDate: Wed Dec 22 1999
-% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development
-% (URW)++,Copyright 1999 by (URW)++ Design & Development
-% See the file PUBLIC (Aladdin Free Public License) for license conditions.
-% As a special exception, permission is granted to include this font
-% program in a Postscript or PDF file that consists of a document that
-% contains text to be displayed or printed using this font, regardless
-% of the conditions or license applying to the document itself.
-12 dict begin
-/FontInfo 10 dict dup begin
-/version (1.05) readonly def
-/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the file PUBLIC (Aladdin Free Public License) for license conditions. As a special exception, permission is granted to include this font program in a Postscript or PDF file that consists of a document that contains text to be displayed or printed using this font, regardless of the conditions or license applying to the document itself.) readonly def
-/Copyright (Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development) readonly def
-/FullName (Nimbus Mono L Regular) readonly def
-/FamilyName (Nimbus Mono L) readonly def
-/Weight (Regular) readonly def
-/ItalicAngle 0.0 def
-/isFixedPitch false def
-/UnderlinePosition -100 def
-/UnderlineThickness 50 def
-end readonly def
-/FontName /NimbusMonL-Regu def
-/PaintType 0 def
-/WMode 0 def
-/FontBBox {-12 -237 650 811} readonly def
-/FontType 1 def
-/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def
-/Encoding StandardEncoding def
-/UniqueID 5020945 def
-currentdict end
-currentfile eexec
-E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942BF7D6DD84F1664B89
-699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED2AC419FF2B2BDE605B8EE3264EDD6641
-2D4F21C64AC522BDFC7C5502F9C3F3E5592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A2
-5032519D1868816E44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF
-9CDC7A1B1B598C69131DEE005B415805A16D8A123E6A2261C63C769D2F4B60FA2C438AD7D199D8E4
-5F7E7C9A605C8CA14E21FCD81C9A515FB8DB6F99604534D06EA9D87FE0FAA852899C9D0595C7A97E
-6C55F79FAC45CD38E87B10D210CE7501E88C8FCD3444354365FB893A12F596AE2C1E70D5819EE0D0
-87D10BF8DA96F3DABD5405D28C4228C6C31BA4052464859640933FEEFD8071C0C84CDD829A9B1D0B
-A01F25A4D50EE2EA2B45160CA6333B2D2800306ED2BEFDFE155E9D9F9342EB8D5B0ADBF2460CCC98
-643FB1287CCD28ABA7B5CAB92EC39EE2E918990372B16F8487EBA30EAE88708B6CF33B6C015D8096
-C7CFE2F139F52052E3925C0D50FD64CE68236D59CB83EF56BFC584150EC38065059F3308AD6F9A99
-F83EF4E6CB13855C8175E31417D190D036B387D3952344A950F4D8C7781B307A094DF1ECAEE4D2C2
-FD747BC6F7F9C6BD0E90C19294F96C8C5CFE88FB34C477574A1B1630B8CC591529E59B20794DA32E
-61DECDA8ABBD1AE956CF74012AA01D42EE01E861B0AA6897C864788AE59DEF43C493246FDB1ACA55
-4C12594BC7B33657A9ECC9E3D1472EF826073F632BE540C35FF6FB40566773F3BB2204D3A579A08C
-CBC844C14B18C350F003B9DA23A570C362D6003893CA32F86F59B829C78EE3188B6E3F7FA81D7F62
-2825C639638DFB78B7AF1F500F5B450FA54DBFA5CBA277C794ECE93275A3DE0B452FDC8DDC2993BA
-A42F28A636008CDCB03EBF71BDCAF35019778993443F88412AD2AD0D7155A3944606463266322DBC
-0244B07DA1E9C27A27B59664E8566D7A54CC03E995AAD008B0A17E2C3EF61F720CE7F7788599C4E4
-4C709CD5C31B11107F16AD70B17B9AFE2E8CD922A7428DAC171427FFAF51067307FAB0ADB530E701
-FD22DA22C4CD3064067BD4F6089C4B2C87937DD426E4E9D2F60E608288BAC9056554D04947E69200
-61E379CF5E81BFD32FD37EFAC1F61CEBEE551B0851516471A7472C60DF89DAA9EB1DC5A67E479745
-3E69B9E22BAF4E3CCA4192D603295B018C4AB69D18DE52DFDF15E96B557F290A4B8C5B1E7A6CACA8
-1F2351B97ADFC36995ABA43803A6E5AC04A3C93495F6D38106B8B144449C07D1358210F9176E1565
-72363CFBDE576BFDF99FA329DD1346E83F79E06CF68250CA57A68931BC7F342AD295D0CBA17AA95B
-B8EEB53EA6E8E660B814E9F857CECB14F44A43288B69A9E7908D55BF19E844359879D28CAEF1C38A
-36420185D20DFB32C2E002202800E8EF3D67C5D50E919657CA958B538D537D503444865331D79BFC
-40312068D72364503BD0CC84B5F30A74D8B5B6A26AF2DB764564FB65A6BA8F9051AE2B4EA458D46A
-4569F30C6E77DC097356770362E6CF3F1661074778EBB44FF7D1E3B64FF75E77E11FE525BB121C65
-46CFD13300CA1F02D571B82A5825E6226D14FDCF27F06D87452A8B6C5DCA658535CEE2A795E58137
-D48E566B69D53A0C3B766E84C51EAA221C46999CC8065ADB2F129D5B630FAB1814C0C33B5AEA0EFB
-B6E994D80941B53079AF96D90A0B924F9B0E319BED9836B8F9053F868363D3CA554CBB181863301F
-8CB940872ED5FA7BD18CE39218B5AD8AC57D0F752D941076B1C64D99BE0DB86D7A6D96510D772EB2
-4C587F11779BD21CFE5BDE1F29C1EF9022B2B8BCD7F91153C845906722477829C40111D810480F3C
-F62DE8DBA7FD86CD236E656618CAF6FC46827FBC4898EA7672F8C9971AFE43E0E01EC8B77D4AF48C
-BF1210E98C1DB15C16D149BFF58AB0270CF015B107A3A50F5DC8F37FFB92EEC8CB6778DDB7CE4AAB
-C464C4AFF654223006A550EB52485A23D2B4AA7198D3CD54418102F1E9A4FBDE37B841E56F5C2C53
-966DB9B66B000E4588282E3FB80C2C519339F0002D2F83C979EDC5827A3B3C8EF8810A0F9DACB6B9
-998E9AF6551F56313DC4011904CB979AA2D32B11A811BC248141E4B9734D9FB7982A5671002D8279
-CAB93ABE057474628DEFC95D43890DB1ED34CFA8A20BDC3D874E7679A396158E522ED0AB969A4E3E
-C7E4474E192590504D54DEB7B260B7935C4E56548A7D121AC1F741F8CDF259EA1B5813175A77A1D2
-D30BA26F65EB765A04C09ED51F69F41551ADF399E6AA2FC09788137BEA4913F17B8EB838C38FB272
-1FDCB55FD65697FF0B850E7D3D1CE266BF90F7EC06A9A0876BDFE767D3A918B092FC78C775F945CF
-1F96E859C03DBF630D9A940939654C3549D8F7921CB94EE23D5A0535DE9DF31EA0F937F860B4F220
-A99ADDFC343D7CF7BFA0B803C12C26403F0DCFFC8EA786D0D8A8D9C367419CA8AE41190CE93A8086
-583A1E6C9D70B612C84D87D2EEAA71EC2DC12F4CDE6A821303D5F6A9BBDB7EEDCD289E80FA3B75F4
-7F481B50719DCF4A142069393593B9AF9CCEEAEC56A35B8787193D7C88113E9E1E221D151E093B01
-9EF89F6118BEC4735103CC8003CC5AD1B6727B3226CD44C497DA7052DD681695DBEC3397F9598C91
-77701C73BF0594CE93F23D50EC5BEE2FB9DA1FC966DF148B27B28EE3C89526DD6625E2887F9FA076
-7C127C609EE315626BC14D274FBEA56528DC06A27B2D476D46E9E7916590B156A5DF04A6CB15E362
-45D77021767B6E5BDFCC679670263FD891446C3371B11BB6E1DF60F960AAB4149D7753E6A5C33810
-C42C8BFF4E935003388506F8278BD7CB672F132E065AE684DCA0B9064D01DD620E7FFDFE04F14277
-EFE8E60159BA0FCA3FE2F28B902D4AC275D19F0AC6971EBE827C4A232D87650D2688345BCA78F879
-077114F0463C5F058107B669566F8171E4E284D278405580F04BFFC9902784216E0C9A17AA9B2935
-E66E18A783F723BE044389B7E9D62AA36818FF2EA406C3C1A9D2F3436F3EE7DB8BE86AFA8DAA6A4B
-1B84611350D8D27605509612B515E16AA843164D5D0805E36A2B9EF74C5F6A0B9D59A04B55697123
-27F4B1B30E9587CD103337639967CBDC655AA46E80D2CFD24BEB50815B5338E522B3A7AFE8362AB4
-F05D8BC52BBA9C5089ADA8C89529B0275AF422EB540D31A938B8740860756325B966B36817115213
-FAAF92DE63F6BAE1E0064BFBC5588098B61EB83C71F1C2082436D37DAF1ACBE186FEDC4BE7C1233B
-6F18BEC5F99002D21CB7864E4811F7AB3C03003E1E4490AD1AC793BD28FCD5EF0E6CC30EF39A08C5
-2F71939B0CEF620DC69E31E39D6DB969049031B0C92EF2DB653D97F370141456A52985076B268652
-FA2648C792780BAD637C4D7581FB2D62011D57E293719487CF2D1F013CFAA532E1C2D39178D51272
-A6AF041440BCA174B5CC902BD7390C7D3695056CB4BD7791F9FB6D88E7A70DEF2C97869F5DBC5BD8
-23C517C7B7C39D624DF627DC9653EA5347BFDA80B723F05F6DBB4C9EA501D862ACE05B9DBDF21B70
-56FBCD8C6D4B85873DCEE6166C8B5ADC0316CA12D9639F361B15A42F00E1D62EDBCA1111972FA0F4
-5758BECB31DB38316F3CDFE1B41748C93ED58B67E9B57ABBED5924A6D53E99FBC9A994A6489A8BDF
-13EB685548B4DC6D62DA7426C22227D4D43B6FFC7B5EA91C896730253E8941AFEE588359C2BECF6F
-FC415B9EB6D31CCB0F6C7F85853E6449FA6D627A97A3CE8303F148393ADCCCDFA2FE085C6908BE5C
-3C05AF00A6F02840206C3253A559AC5C049BDDFD11AD9B118403B84DA10AE3C470CB9A9A2D1D7B73
-2F59F5FE146DEDA60AE750F551AAC934621B4470E1BC324C436303E25F81D0DC3188BE0D6FEC5414
-C20E4CB18952E12CB6423DF7124627ACDE145500D77A97A8BFD9CB50D1FAA008E2CE2B2505A4749F
-1EBBB092C347023714055A9B63353AF9E7FEE05BB54C9843698101F79888A91531773830C2C967B5
-88D3ACD2192883D5CE3962D51084FC653EAE2C5FB2DA41DACEFB5C76812D2EDB5B109677289CD199
-8D457FB1023A19AC67295BBC1A9A20A426B06A368DF3C5DD083CB1180D287F5500F2C635EDE157EE
-FCEEC5503447382D15C748C1E35F68753992E5C90F900DE54D18F8E1B355D1076ADFB1F3590135FA
-D1A36F028E44F48ABB149B80CA9A54614D467F8D71CB310BBC7AC7100261092DB8C5BFD39E0AC6BC
-2C9D6CBC3A8C05FF8A74CB21608EC4A4CFE4CBAA2D056DBA14206106044DECF59F957EF8A9CADE4C
-9B19D8D30DD4FDE6A9548E50DB51ACA73330142153FC36B69C1C8D5B26D0C689B7040E81AC2C864F
-D7C097C99BE5953843E172C97AB5684F35FB03A725A89DBF371F08DDF40A1531FC1B676DB0E1543A
-EC6E97D3D2E4AA3D5831D8B3C952ABBFA112352814FB6FAB61A0D680E6640F6AEC8426200CF61286
-F7422CB2F78C61EBAA36D47EC16D7FAF8B4AF31D090CDFA255D9D7C61D46CFB22A7D6E1758E71ED5
-67E00CBD8E8F468DDFB477F091A2F915627F22FF47B876544BC1F03B6BBB98385F009C20BB1AA2A7
-A78674692B8EAC2E3C8069B79E679338DA57F72976810F845BEB6B9ADD32B95D78E5E60F16DD1668
-9C05FD82D36A3115BE8ED494A74DD211D58A2CDF983FCB9CDC29BF7F0E29988FA23560EDF514BC1D
-183F3B2A22C09FB179B47E05ADEF48DF02F31C29875D1915037B19407764A4292FE44E741651A8E3
-BEB5F0D972B6327090F664417C84F84FFBF0AFFF8B1D85C822D90730AB4140C42A51AA8B1DBE4398
-4EA8566040EB8B341CCE23FD3F69DD235A080BA5C69AECB9BC732BC2D7D40617DDA6B79FB6EE40C3
-556C7DF9B23DAD89E94054B1345DB8402AE679FC4655A4A776C0150463F8DB2BFC0608EA1F124E22
-1DDAE6026B5E5D007A7E4A0D6B3B0CF3A2669E67C5E4F01551966A7BC48F2F4B6A87E740D8095E63
-F77C7A027F26B52F2299DE5B8A2F6209BCF3D31CB0235F998F781E5CC81E31DC424E008D46EC0920
-2951E5684804A0592EA47D6C788A20487BEA2EC8F2E6C1D7F378B62DB43CA43C4B366F8B4319631C
-FE9854F0E10321CFA3B01C873584863BBEFC23C72C05E695B56E8A52E89AA2DAB543834D34DCAC5F
-ED08DC51825C5257AE59850D101D84F4CAA1D29FC932F9E0EFFBF7A9A7F3685F61F0490CD3CC8988
-2DB52A757A6AF4C4E67B407BD2316B1C0FFE7DC54E43C87B874F57E4903334E2140B011484863CDC
-ACA331175F2CF3D72E0042855983AAF8853D3015E870FF0807014C31D55060DF3FE1FCE157324481
-2744AB51322444632F9AFDA6706E320FFE82B8CBE242A19DF00CE73EE48E25FF49D5871BD3E60652
-298FE3E8D400609E232E0DDC794C0579ACEF89E841B2EDCA50D51151F65E8C1CC3B01EF1870558F0
-BF5743718C3E068617E81BFE120C6CA16E0924BFC2541177D53671CAA3AB641C41557DCDAE1A3461
-47B5E999C4541B08B4AFCBC187AFD653D5B5F8386DF6AD8FE69E21BD0567DF494F736C6A184FA4DE
-48DC9F347787CA96E2E00A296C2DA05C2AD9BC423E9CA428D7F1FA12DC9353A302FB8C529AF8688C
-BB543B45B2717EBF8F6C497935F4F3BFFD285E0402AB7544B3CA4643AE5A8B5250ED987A95FC1F27
-5B9707ACD0641BD0EE2AE9758494F8D8A51DCE408A38AC20EAF0852D72D84D0C6BE973326793AEB9
-55EAC6FE0A2813A355DCD22F6F2CE56588D1C055CDDFA98878BCEB6A018DB22922D2B600A20F8184
-2E665DF41013CA0947C4237C2BD60A75E2FD1A3FB8C8FA19485730B87461AD466ACB02DF8CA24091
-4FB090B3D2B41EB6B8FF05E1A59D9FD668AF70BA5BB72778953BA55FC5F9F626043450E1D09BC83D
-8605098ABEF884639A37809A32565CBEFB3FF39EE53D6C18C58C272BB928E4410E361E59A50F242D
-69747A032617C52DEBBF62364AB5A96EFAF642D9D82BA679B1D70FAC10A4EB62FA5CFC308E86368A
-AAD7E75948F43598CD1C544A0D4091374D7E88D4522CBE902391641327E888E7748FA889DCE67ADE
-61699E7D77763681CAEE9B1CA8837B2F7EF9C18CBCC538C465C8E2DD34616953CCB6030A222C728B
-834911C1A179E2C770289407AB28B303E724D97F747D6134B425216A64C6E0B60F633E2B85300047
-E4C90339CE030A0FAE31E830C8ABA5AB3386A3B69267351A7BFDD66356AE5E57FB2994452993E90D
-E7C4E260ABAB93C37831856A650D56E44172FECA01D6C7C380F250B82473960D2A2A5FB6B4DA668F
-46E624ACF7FA0FD4490F485D640A3ADFC9F8652E7A38CE5799F770C3606DB4B8B947F93967F779E3
-A3C0572F13A5A187D31D7BD12A5C7BE23CB6ED6192086241B76C5BA6983DB9C93E4B208D707D3760
-F03CD6272EF3A4CE89B8E52E6AC5871A3D03EB975759AB4BE239E5EC7842CBB333E692CC607C722E
-185D3C39164DD320C6945629C70FF66A5237C0A9520A1FAD6EB9816069351AB0F135D90CC0982B14
-7D2294AE4A38A527EE40BE9CDE2512AAEBB590E134388BB171D0956A7C4566D65A9A041BE6C4F883
-6B3EC3D2ED1B48B566A783292B15B6127920D247D494F070BB20BEFF60640B11B276DDEEE49706E8
-B2B21BB40B7F00AAFC594C492C25DCA774E0B80D82E927448DE2E74A9D0DC7AC9260096EAF187B6C
-D6AEAA6D1DC4205B4411122751A5B22688404EA7C5861730371FFAC10F5AFD4727A0E402AB5EA757
-606B75EB86A05E8F774D6E430A1A3FE2A37EBB06700474239FB1CFA05EE44B91B82244C575B52E7F
-AF934B04EEB0D933FEB57EBE326D75821C8B23EAA85B583AED4320B7F04B9F2DC591091216FDE52E
-064BAAA9C2C9D9714B95A4558C21F3CEBE624B5403B31508F178581AF6863083ED762F1E2E34A45C
-FDD71660D626FF8648F5D6C5E580D4765A67FB6159EC8077A9F0A88038C8D3D7C77FF0926E2123BE
-874F7BCAF129D55A5B5960F824BD1728ABCFCC51D23936DE9A25C408D786E44C3A2BAFA4423177AD
-060D21D38E15E23EB6FFC0B4120E814695D423EEFC2744A1FC81B4DF89D76F0A6803D8B14E75538C
-AAD03A72517B86514F6952F6FD619D9E910D980F00964DB325318C045BDF79647F453D4A5CF4E61D
-D5359782827229310405FBCF6107C3AD9DDEF9A9A339D5D5A6EB2E7838A0A43221BD62CBDF732DB0
-A638A52016FB35BA7761AEC846A023D3BF2D1BB183543E81EB7CAC1E5970CDC6F068C5EA118C7AAE
-528D1396E6DC939112DA4460C890EAD5C01BDC438F5BB734218BA6270ADD0DC1778FD8AB16831D6A
-302B814A1A44B07EDC65956C9E6CF4875DF521F3CE5B422F71081B6D69BD270F739095C9E81C0377
-934A8BC6390C420C4E4CDD9CF7E32544C68D884E15ACA3BCC07FC8C132D8FB9D752C15D75C52C288
-57E2EA461A6FCAD90C56843513F74461F18D7164BC597A28AE4BA7C86EE1703535A9B9ED50122627
-71FC12F102E800E0E1AF7BB46681BD2B14B614CEA91B7B2AAA35235DE76C0E113C92688F8EC81277
-D58C3406778E1EC1CC15F1CD9A137C8FFDAAB99ACE3BFC782916F1A877170589A92DC921E6740A22
-B84DC6BACDABCC76E64C79E3A588D80F8F4D376E1B426F15751CF7391102102F0AFAFD8B22DFDEB5
-48AEB5F30B1673023D22054A13391A0EC08DE6E7B685A0D031AABF20B7C62187C0284892D5EAADF1
-21BA28263EB863D5E36EA9C06A77CCFC0E17F593961591F84D82AF823EFE41044C8D606FEF83CCC7
-B0E961E7994DF8A3CC36B209D953E250ADAB8D22D7F2B4E2C9CA39EFA2D93E56195C1560E30A5190
-CC5B17FAEFCF250DF79F6B624A4B917E11C332222FCCFEC4F6A47BD9E75DA9854FC3F7AE554E91ED
-DE144D7AEF38A0E3EDB5E5A5626374DB94F022C8CF549093041DE00D7269B7CE544E748439BA2870
-718C08E58FB4A77D93EBC04B7957D272AE1601D41BF85A2BADAA0DF73B0D3841D4839C85677FB2E1
-5F1D6CE592669FF4BBC9C69DBA334DC37706F2F6BE83D5863E8CD6A30C08640AAC4C233684E66B4F
-E6B62D4A8BE9D531E47BEF5640D9B5C27D990092BE1597F6995C8A77BE9C18AAE6C1CF130775DDAC
-41D34438FC7AD8E042CB56CBF2944932EBA7D053E9376FF398367450E35A1945FE23E05C921096A1
-5454721FFD0F429A3E06DC3ED36F1C170BE79C66996EF8337AFF85B90C5D3A4A94455AE9FA32E211
-7A63E59001F052D5F6223125BFAFA40901E98960ADF7BB886729DCA82FC3B8CC52B37FF2517299E1
-D769057F8154FB95582F02CB0BECC873A9C71796ADBD3E91324FAA94F2C41CF57C30B5897D031C02
-D256C909E080E70BFD1F32E69EF67031138C2DDCD1A8E4B65E485C23C3E450ABDD9815512D6F34A8
-4B9DB715DB2C7A93BFB424316E1AA44397749CB01088428F149A3B4324737ED9957FD388248462AC
-1B2610D72BF5C073ECA567E7385CC959E37CAC7E05470160FFA5A9F63B8E9B082937E911586EA165
-374938F492EDF28CE6020953A5B5CCEC7737F9D9CC8538C4339567AAED3794ABA3B9F4EAE65466E8
-E326F6C399B36355935FBDCB9972F10B13494DC25097FCEC5A6398F275C8C151558E74C5175F7BAF
-4155E36B733F75CF9D5C5979B0764F14D8306E06BA24BF791141E404C69F3F8FCCD91B9C58C2C671
-AAE7D4F9E5D6414E46ED633A5F78AA5BF04E652246A066EAD9E582B181CC196EA2D3CFAA383B5D0E
-4CAC9336E119C08CC6AC55CBFBAE147C623B400453BBF447E96DE036FC025624384359EED7C7D5F7
-858DC0521377CF647A157FC3F188DE5EEF094DBA125510FDE34C570D7BE76AB5DF0A28BF45DDAADB
-EA7EEEDB936332DFE93081E0AFD3FDD46BED08D6914B2EFCFDC41662A33B90B03D76D34F48D30FC6
-BBBB600E90E6AC7243FDF026762A44B4D6E4ECBEF48C9D7B696AF29EEE063E557D8FCF0F09E0136F
-45D17E608DA36E59F2AECF8493F8D62536119B5F7E1554DFE3F6E8D7C9A2C6F557D18B4AF92C9F6E
-050975C3B5C54F9B5F4E39D600B6FA2CD6DE203A174028CBB2A201AF126D1013C229BB82CFD013ED
-199D01E51EE2780FE896E01C63C655087A3E61A7F1029FA5E97EA1872F1B45F22282DDC317E17926
-7368CB52DA9444F6055A3C653659CAD2A1D8712BC2B1B32C1DC6906D957FB88524EE066156ED6BDE
-B8D832F9338F9912E29A250A8C4674E667C1C278B677AEC9972BE83CBA3FB779893FCB8F81A323AC
-91474BA2A2334A07BB5628E905C518E634F6761A3289056F83D5DD7B3890987EEE1C18FB2D379CC1
-905F1AEB3B3D2AD578F0D6C845D2D40C4BCEE3F71C90E68E5417BB8CDDD878D83BA80AD8485F4067
-E5C3CABF28AB56CBB219C0AAB8FFC6C7E192BEC8CBCA1459AE4450AFCC81B9548F40CE2622E5A7C2
-81F74DCC02DAD57EFD92D072318DDF05BF42F1EA8163071E23949B0179CF7DE64677CA99B23CB926
-B3E294194EC13397EA1DC9A5E1CDCD828156CD71F81B64167D4FB01E6002713BD8AC6F82B20CD369
-9C6CA4704DC5C65A2D66EB155B7AF1C9BB46469416FB49C1C7E17A30A5F045271D7DF3FFF2F42C6B
-470701C381E3456A500C6BB3D0E47B4D91C5F34B49BB6272F1F8698B307D89EDA3A1565DAD1C0864
-627560CF922DCF5B34C67860352390B282F95394AA2CDE0E97CE3ED39546A6AF1C52BFCF81A29BE8
-2C47C99E8050E4889E4575B75F39E662F2DB7420673797E2ED3D67CDA7AE2C15D0A0A794D57D168E
-BE13214E89E0209AB2C0EB7784E9491AEFA3C02D0DF3AE5365A0FC4AE023CAB528162C7A1B173664
-9DFADDACA8DA5FA18B7D6489E4229E9E24D38A620464A744A5C60F6F9D334B908706B738AED18669
-8A8B278341FA4D65A0A88680BA484694921512F7DE93337FC1C02BBE6E64AF2DAD07603279D87329
-1D1F4D39C1DD6D89C90F65240F4808F6F1115CA55B88E242565E59F3BBF1F10EC7B88872E9AE61D4
-4CAE185463EDFAF7DF63DE4D2207D307AFB61501892965170D2945846FCF5973A1D458607F50C15E
-06E5BEC715E0C156259AAA6C735593E5564F65F443B78CC7512EC35A56F126DF9D30974A40872E42
-65E1AE5FD483CFCBBBA26DEE426CDC4721F19C3FDA86ED7AD4FA1120F63669BEFE7002B128CEAFD8
-C63E8AC09943B6CBDFB3D2476A026C00A8FF81B1F651B97F310C82ABA5F388CC1DB5AFCFF5996D52
-52A6A42FA4D972E41EE56088F78CB966F9051171C472C774879AECFFF08BFD9CEA40D7C298922ACE
-64F28C14E0B81F4DCADE81D71DE3983D87D905192EF13CEE71B2D3FF1A88AEC671EC318917DF98A3
-C9054E372D22A3CEC82FCC217F47319A40900312F6E32B536B9E7A7FA0837EC65CCDB5FB0D414371
-17596CB39D9382262DE6E65379D3A9709B2CFBABF5FC5D5B352425F06F88CD31012A2A4147B112F0
-C1C0ACCC808CD625E0228EEF66661F70AF96D3DCFECD402700E4F6522AC9A856DA466D55C84F65BE
-2810A1565163872D62EB81333A698ED7B68352CACCA2D7AD38AB55C19E4F5582F75818302F5FDADF
-1DCED09D94872F2D48FB636C8E38C7563C72C771A08C6B1F041F3532BDB39006C89A33C09BE1E3E6
-03622D891F98010BF1DE5355F557A1E09448D486ADEF565705277B31B8BF2B86761E32631E3435B6
-88B79D566F1747BA456DDB43CD239FB47FF7B425EAA4C657C8EEC26EE01AED07CF916E77D53634C1
-37AEEA009C6B515B6342C54BE2C7B95955B1A9DA277A0ABCDA2346E88018C726F481F71D6011AA42
-F8852F2E5749518FE3B3AB668213FE1A05C10A1C53953D75312631D6BBBA01D418199DFEFF8CF548
-6109B099FE8E2F606165FE30F532C03567785D5362AA873C9D3EECEB20F1945D55F49B0CCAC84967
-59FCC7292E46938943C262D78F3212D3F9D0F7B103157F423D71B1ED54B2A603F4C269029918F238
-EC6828FFCEC66009DB9C9E59534EABB183F31D7AD4C57B1BDF0BD2CE5A421882BC10CC1BCE6A970E
-2B586BB221567CCA483989DD0B8DEC424C1D1FF042DCB7834423CF244EDA28D2D969B17440CAEAF0
-24A6119DB010CE366821AFA424D1B8299609C04148275AE6E5257A7ACB3C766C747CE99CBA2D703C
-F19B7CF301B634D8B613DDC4AFE4633A4D77BFF8E00CFB5E289EBBCAC90A24307E7941EC1685CBAE
-400CADD876FCEF7F6557EEE167D2035A05120293527700DC510B038A496BE1D5CBAEF24ED39F7421
-1A93AADF22214ED606A80582485AFE358E3A46D0671148998A3B3BE209467009B43400870359D418
-9A8CEB4D5866AB52D16D9CEB1EAB71C07E6CAA34B70E3096BF7604C22C40D5FBFEEA616DA3BABD59
-DCDB97D883FC8742B8267A16A99B7953225F7144568D566E64542C92E538AC140C851E5D295528EB
-7CBB49909B1CAF6409C9BCCEB325468FA0B5F7CB2987382616B477CCFE4F4AC79E4A6F7165363543
-F04DE5B6F6E1C2E910CDC3CDD6C4C92737198F892337DCB6647BD226C820AC99C65D8E7772BBB74F
-E65DCAA8A22C33BC168BF48E40A82700A3A7668C5A9A71E397ACDFEE7D556C5C19467B7AA69C260B
-727407AC837BDB7D67DEC055C1F45D8BAC61048C45BC9FB3CEFE7549EAA2992D2EDC126FF7A05EAE
-58613332A2BC1465B2BC0429162B907D65F793D236EDDD8D35405866D71B25F62DC4A7E06D4DEE82
-840ACCAABC0774F8A63E9C0F7FC980B3583E7A8B01C46590E3BC04EBA565C2EA94F057D964A78A90
-EA9F52ABFD70F84E44E434BD10A42E98C794065724341F907E35D3CB257161E01C7084E3A0166D15
-CED65DA7BA87DBB2EA33D39BD99AFB93D3548358D08330E807F8552CECF63C84F805205491BA3A1A
-622E70C232FADF3BF2DCFD6F0539158D3306506F150B0518371912A25EB96163D73E9EEED42EDC84
-D688BC7F7708D9DCA348FAB4DF62E5809BD094842D0A31DBB7C4B41F94D946810C5EC10B69AABC2C
-91A59500B2E5D37F4755DDFB7AE4ABF757F4C5BCF77C7F95E6A616646456FE8F18407080BCABBFA5
-7704287AD26222DF91AB2613951E2D679472F8ADF06EA2A20205EC19972299A78BAC52114334470C
-5F5890C2F846B4C6042D73945127F2E3910ECA1C4CD7A16EFE4B4BE38A15AAA710682C3836A8CA83
-FD384970139D8B46FB0AEBB002DD224199672FFA02250FBCFA4E649E335428FC71F50F45E498419E
-DB0E970F46894A48F65580881C9C4250FCEF65C9B28699408E18B26FE6DB7F1CBDB767564E73CB59
-54C6D639CE33220C894F36E70F71C9F9AA3FE2AE0AA0E3F2E304EC5ABC661675CDE2E70519E4220A
-E26FBACBD01D5169EB844750753E6CED53E3678FDCD08AB93E10067E9C64F38B40B76D99B6CD92BD
-F4155A1EA5CC824998B59AAD06E09E5F15EBB2288D66EA71B296616734FEF2796F07FF0D8B047074
-A1111D68B99C2B70FC56E74A51B062F4998ACC85B1943C9477E436E5CD7AB18DBC898D21BB93475A
-623BDDA71D7B895BA2D4C10F4B90BF335126F4FD57D73AFA50170F6B3C364922E551D40E35DA75FA
-891762FA23401D39260F2E92C7807C746F13BB35CEF9DBF2E76E66A72FEFF095DA482A4DE8A42091
-7065736CF4DE904FB52E649A32255E2030A7B31B686353492F31C064A3C4B0448C4BFD44B8E15384
-FD809B8761EE26A7DFA1758D57CE4F0BC376EB2B3833534B15A83436BA553955ACB5A7A66796AC5B
-92DB5388BC53EFA27508B08E82821E5CF669BCE52BB860780F749B4F38ACDF5FF12726BF3EC2743F
-01014CDE96FE6B4C40A034E9EAFCA2A35CCC776C2669E6AD138070A40F48ED79136D7FF57E993E09
-B81C543FBADD350FF5B5F7A46F060F88E30FE2D8233832D18B6C323EE017EBC1DF5C838321CDC8A8
-4CABCAB20B60A1A3AA028F36EA6E87C850AF8AF7CD50AA6359038BFA8818821D02CEE8F51DAB8C05
-F7AE9797814D97F3DB8CCDDE45B21DBB15CEE292FAA534A5F317B357F4091F3DA357325B8B9F5EDB
-45865415973C143E5E5BAA483FBF2D06CDD4246675EC58B84C6AE65CA743117FF00F229243772561
-31A7F2BA26A9115AFD96C18216CFDF41B7220ED0CB3FCC26C36380007B382A02AEAE428887DC8BE5
-FDD630AC57EE3DC156C7B8B29E687F24442E35CE10BA4087295A641F7139C831F7CCDA6CCEB5DAFE
-537CC1A97C5A337D3C48A6AE947F58A30DC08CC7B58DBBB4737AD52783C573FC1E9408F55495A80E
-7FDA61F0B9C4F090158F1A416249EBBA936C27BEFDEF19D1BFB839EB70576A010706D8B95657B218
-9C2AE04C11EF9E57FE09880273761FB4302C388BD608FA0C7F00F033C9C00F4E3D5CE2D903E0DA52
-E69C7745EE9FA75E2AD93DC6CB5CCFCD3782A699B807AFC36AD1F62B05856D5DFD6F88831B90EB3D
-CD523582A49732E3FD7253126D39E8AFB8458B5F7AD7F94A8DAC13365F433C857AF4A42C0A08C4DB
-9887C4957259ED22D13CFDF5995DA957EA5A0F620B0214FBFE08AB6D552DBF048D62CEF6EFF12F15
-3511ECA7833E0E3E95F85E6AC0F95438AC4C126E1F1ECF336ED31CCA7EB216D279877123FD9FCD8F
-B5E52B587CFFC4428456DDCA816819A8A4A211D8F1629E5D42BA4C5C356E580C8A22C61D987552FA
-A97893816DA73D423686E4EBD44375C257F031318865A20F22115E72BF1EB9F93AAA169C140A33A0
-6C35BD4526A38BE79CF40AD1EFA10411E8F3300A8A8B97AB140EE6734E1BEE6C8EE443D698D34159
-97649C6F10F20ACD80236422E215E146D744A262DA3FC88DC0D86FF66512F49D3F957D3C5CFFEB42
-4823509F33F155057A4C6F37B52F4667767BA94F6B8B62856B553F307E5D230C44CBFDC9A97A45B1
-39FFB2F2565EB0E22026972FAD0FB7B9576FB6F368B61979943A398773600E7EE1DFEFBF26D45D40
-BDA66EBB96A56EE9CAE0B2420C5DD83E24DBA9FF885BB844BF3D2BF93B07325DFF60C0CB5FDCCA0A
-C8FB5A2E119D5AF26E53AB8E3B428481C2871DDA26EF0B621CD8572B3C664BC7AAC01A1D05B98F79
-1A7080D294BE81099BDA7982432F3DFF4775C44D23F4F1B2E0162B61A8B2CB5EE8564BF98E2ED403
-2219085FE6194C19DAC98A421826CAED7F1AB1477AB327506010217283894235D7DBFC1153D5ECC4
-8AA7293F19592B4D7E95FE55151889BCD1D7FA7DC2370D2DFE11D7E4EA34B5C7A8E73BD3A348FD38
-9EF45B6167FB90BA44C23E912F9A4F2FC0427ED070592F7110183BFDB2C400393BA7569058227926
-351F07FED4F33633BA03A72AA2DC6B598E49B96021DD868DAD0F352E5722FB714F667C15C68D49C0
-3D822D82677EDFE86FE9668E537DA284068C9B0AED83074C92A5B939296D505B837E6A9DDAB1AEAB
-7455A08A114C2222B339284674B74BF4CA9EE0C020BF2A148B439C71C6BE51A94CB64FBE4A7EB295
-5A455047CF5CB348B062ED4F6471CBC3E9ADD9BE9B96879AC7BC71BCE02FD02F17C6063985A5E898
-3D205AA1489DA13C408990ABA1C54F2F501AA172F530480D789C848118C0A74EF98D5F607A067BAF
-F6030D887AC6A6497F9A0B38F9705F328AAD4BFBB634F739386177B07F22D5771282444E5EE17335
-B4D0EC86117C697E79A5F4F65FDC08E4904DAEDAB20067EAE2448FD4301849E456D085F392DD1316
-7ADF75CCFDB723E2904A9C0C976D6B84DDEF9D92B0E15FB246C3ECC2D0BF314CFB957757B3A3E8E5
-801F520644E4601D291DA0F7507C06F3B9BB36FC1C70EAA444E14E56C0CFF06C7F853DF36DA9D8B6
-AF2544B853DFFF535A7E5C6FC145250CDDA229956019659D0D253A19A7B51A4E538BDC01F74D7704
-9949C2C97C7EC6392C2E61CCC0992B66DAF1AB08551063E53180D2A67DE496716CCBAA45462D9F91
-B66A22545962DDAB120511FF08627131B95E5DEEB8B4DD9643E7B2AF65C0FDCE11F5F1E8DD468DA1
-8D41C8C4F00EA73836F4F70EC50FC3EC6D358C0658A4261C6D15A582A2C7C994E7882E661855B352
-014576858A265FFBC425160669CE159D07EDAC04D060B44E5800A7AAE8E339C29B929AA81D2F515C
-46229D2080D5917AB20AB6B34FDCA8E4AF64ED660A3173786FB1A1D005D575C2A5187D3F7CFDC94C
-CC44A38C5CD523E9DA726D8EFA6DA7B6131DFF3435FEE838B2C7D6B97934295F06202D307FF78D90
-6699CB9C5BBB10D1D4DEA5FDA5BFB094E704607083B646D37F5DA1FC7AD21B813F44D8C1AFEAB666
-55AAA19703BEA2E77DF3BF350E17C74B3447A452235919452B5175570A006C7680AC05E8950A62E1
-1D7E3ACA35A397D1E19630D094A86807593C97F4C484E4E06BCFF708B6DCA972E3A0009E1CAC0EA4
-141530F5C1B8AEF5E1B933F37FDDBC4BE22B74FE346D1A3F5FEC0818F8E61765568A2AC04713E828
-F98C449D9A1CCE52D10D61DD8BFD084C8D099A75D89DEA64D5A7CC68BD5B0593D97953DADA976383
-F5015915618AEC56D71D1DCD55B89736395C609B315A3F1E1255432FDBD37F38CC43C354FB4B7C44
-F1A7318B0B7E99C3C08C33B953727B6A6328051783A0A33E3CD9E498346A3CA6A77B517096EDD52A
-E443B87643A646C3A7BB97F742888D33F9B3127E61942F4103C1DBDCD8EAC8F9E259773066736CA6
-53CE57E8822651261D847C131321BB9D6626A1AC50D047C0BA47B411DF2A995545BD68EC0287CC9B
-31D5DDCA8755EBEB10ACCB3903AB0FD5788E984220443B8459E7C078DA4289F1350905881AD6DFDE
-C47302B0ACB0D4AF8CAED02B4B70DF3CF8FEC118F0FC2D3DDE3E494CD160E676E300BC464BD4400D
-B50EE43B314E0517037BF971ACD7CD327CB2134893B8A0410E68DDC518F5DEC966C7884CF5FDFE74
-723177F20DEDC039D879056CAAB4BF045062D3904F615C5CFE109AC7A35599C94024B41019B9AFD4
-04A80ACAA4837929F5C9317680A13D157A03B59A5588DF79D2E113F5F51021D6F6F90E8BBBA2C252
-FD10651BE80BAFD59C53A3367BA3C28DB6EB9DABF1EA99F47B503F627E15DCF3FD645FC52C5D5D0F
-2F07DB4C25C0D1E1C00146E1C4D973E613CCDBD3F9450CC0F5343D79F05E9492E86A1BB889ADF405
-03BD7F3E7543436859184A5B20BD8A172F350D846B7570803990ADAA48D4B9155A2B4C4BFBEF1E1A
-065C08E03928559735BDD442FF1E83E1FA20A5DA57D8BDB2FF5427C034CF0128AF111E6E73099E04
-6E0C240E80A73D7BE72B87834E45898D475521CA3306707631F5C6136199F354632D1A085F12A1C7
-C473868B62E534D15F5484323E63D0574196A19EF175214EB35A90873EFCFB92D6CF68761D45E37E
-AA61E1A1979A82009507CA193E44B36A806486665CEDBCF387053ACEAB979BD35D30978FC7659ABB
-E844F4ECAB3303318ECE80777A5FA5A9DD91B3D06804C4B4E9B4EFCF07EB89866D0DD8CA390CFD15
-98651417114D78776B1A1D36B4BA17746D6BE7FC123D473EF1EFED1C3BC1D555F914536869FD5B0C
-35F9C83F65B0E6BF7A627B9202D787D72C600DDB6BCCE613D88492E13CA0AAAB196E8A49928C62CE
-A4FFE2D0208EDA334ACF47F20BD793124D2C5546C03F4A364369A76A0425262F9D9118AF54E37D32
-E33AB25DD533A49DF5FBF1BAF4CEAC2D9D378CDCD13B00FDA432D9042F623DA41AFB80699B5538A2
-5403B0B3EABEC9E8EFCF42FEF3EA9F91766902CD206B0787C187D5370B60AD6DCD002DE2DE8DCDC0
-B4719A797C5E26BAA67665016DA0D967FA1346F9588AEDA174CA001B31213617FE19EA218EC23597
-79D979E2663166489C06993230B0D07973A117C4E3F4A4C93CF8428248DD5389414D679C69644142
-67C7FEA17E35B0CEE456667A9B1875C81B2302BDDEA2818D6019FC1622A82051F60584ABC904CD91
-8676305DC03FFBCC64FDDAC8D8AA9CE2EA00D6C97BC63C8A617DEDFC0E40775649438E9F61AFD179
-5E3B20560B01BE5E0983F136CF48AB206954E41DEE0D9DDD953DFD01CAEB569151D6BC0DFEF29D70
-FAE3E198E7EDD8922C0E0BCB8BCCF1C016142C1A8B337AFA7A05A9D7534B184BF3BF827F371E9BD1
-9A71244ECA1BA73D484CD2FAD54DB2F0EEFBD54B536EBCB5094E6BC2F5B2AAE41F05B4B311115876
-ED42C34F8E643B53372E3F6350DB8A38445822EA9A33E27FB0CC42CEDCD1FE2FDF723FC47C996EE3
-56C402112F24D0AF899B2D00BEA1CFD427998BD22B2A09046D6737814448ACFB10D387547D7009FB
-384AF0562C85694C071584236D0F1F3D3FCD0CFB38B77C81889061E668BA7AB37AA60F58A3967DE2
-6F939B79CBF10A9DCC42852561D8D6754F1B660D216AAB1E133FBAA321C56E2584BE5C9BAE20CCF0
-0E8DBE6D9C2FCEBEBAD945C3C04101D2387351F132628786F6D9D4CAB83419288D31F9BC600D9664
-12E6AA457CE6CAD26A4C0671097B98C2384C81DD8B9A3222D4F4BBDA7017895C3EDC26662779AEE7
-40D9D7E24185FB821970B0A3A94041A69E4805EC88EE1EE521981536F2844FB8F5EF645F67D42CE5
-148E2DDE43AD5AEF200EDB3A2C7866C98458A92666E5F9E070178BCC39F65A893102A10564AF4E8C
-AAA5075D2F8CD7FAB0401C03AF299EA3515CC93066744EB5AF7CF0ED06675BF049A6E3C211A89E16
-DE5BF0445A7CCA6EE8EB0347454950485D884606651E5887FE8B24323E2AA16DE22FC1FC8C4F06A8
-2A1FDE5758976024068197E1F4506E4D3D8A16D40461A4586338B374A592DC60334402F76388AD6A
-457DC3F54E6169CF7AE3959676E966A45609621055EC3AF80E182633300A4418E34A66DDFA6B569E
-5A13C9115B5FD3EC1CEBE50FBA247F60803AA83976F00117536342DC3D9890C49B2AC701D370E43A
-955118967827760F7091469C5406F08F18D7E3548148CF0E312B1DC71DF67A5E7A1656CF2F47F3AF
-F3DD50FFC2FCDAB7177285B29C17CA43019F62AC6FBA52D1493ED7C427526470ACC8389BAE827759
-4958908F517B2863B83292EB5AB3F57FFFB08393CA610FB1FE905D88A0A16AC395E2A2A6DD033D6A
-0D68992F830B2E1B95FE357BF672716E88FFB92FFC3D62945D1EAD22BC68C51EE0E10A43011DB94C
-44685A5C4576F6EF44CBFB45F2A4BF110A01657DB51FD499767E78058199B31DFD60813F1A344F86
-289F9378231D5B151C92385E3650B4FEB1DC91018EAB8474CBF69FDC1496A4D078D2C351C8196451
-247A9DCF8117E5B637371D8E22E248C64D999015C3FD2311E9950B8EE0922FBDD3D7BFF766BFE9E7
-CE0BE12F318FF2A7B5A9C6D00A54401609304ED2C55F5C1EAC3D4B38355BBD85D66D61636FA6E30C
-2E82829376BEC979A6FEEE040E452359768ECF90CC539A546F17AE906C76F14F86FF697797322B05
-1EB311A759FE260C1EEE5DACF383816AAF1294CFFA7BF87A4D9BC595EE8F2C2F86FEEE11AD959D86
-F22FDAF4CEC098942A57E57813A0FA99239E994FFF353C1E781D666B8928CFC648FCF0869FC68468
-BDBDA7D280DFAB8B0B3A4CA35B074B686DE8D372C61FB32305169A1A9912F6541DA16CD6316A6EA4
-51524757BE5CF6E820011BE3859FB8B8578C100FF029680E05F0E0BF11D33FE19460C85EA5E4C0EF
-28E29407C8AE6BE01CFA0D5022BF9FB01416FFF722A784DFC8FCE330EC95737A854471D334FDC58F
-AB42867A7B62836A8B56466E9A6C1247D46EBAFFB905CD4321970F59FB8D6FF65FDDD34BF913AD32
-2E68455C5FF2D23C1A5EAE687F259BC982B6A384D35440F7C693CF50B9ECAC0B5578CAEE87588B56
-2EB6B7F42034C9F2E545EC866316552354EB3728C7D26527ED75174EAF635E048B08DC5D23E88981
-070AD5641A652F2344956E9CF4C16E652A99F4A644D1787D6D36537489DA4D74E61B2FC4DFDF1D1D
-9D58F9C26C5EB63200526AFD168AC57D5611ADE4D4A382FC28BB60F9E7D626A6C67AFBCCD1183C5E
-3CF2EF210D0BF5CFA7BB10FA3887BDD4CD96EEEAA8F9219AA2F10ABC0A960C3B57C0EC0313AE10CC
-FF1F522124CFC8D2D49BFBB0C193EAFFC5B48FB3FF30B21CB76F0A4C0F1377C9223145BB0468A5D7
-1B9BC25873EA12E1C60334571C67385C00D0B570D3FFC6C7FF0DE62C183C76AEEB12DFFEE1459E0F
-C818C621B8D12FA1357E2B55D48935D70BF140B4CFFE8813DEFD479350B20DC2EB1D3CBB1A2D3DC6
-EE975D58C89D61FC50E6A0197DA9A586B72255023DE47DABEFB11E8AA02414C2FF6258A281219B9D
-DDFE41BA7D7977D0D6F18224FE22F7D4E9355FDB35BF7ED3418F4F68D093AC48F7D8FE4194FEB6C8
-0B9DC1F74E023C604DEA27089F98C3973FF9F4AD7BF7BAE601DB89B08D5D8139B95EDCF6C885FFA8
-B3E4B0477E7040225733826BACFD1EC4A0DD72DC41734856AB9FB700DF83CA2CE812913BD142D84C
-5C83C0B2583768198AF9E885F2BA74877A414233207234AA5F18840557CA11682AABDE8993533887
-7C6D404BDE4153C9827EB16D66C1D73A8143C8A2D3604FF72CE579FAA3C5224BAC48EA83BA848429
-9472007DE96466B5B29ACC7C03B05DCAA38A48BFF9F214DE43146AE4E04FA705421917F99BC54533
-F0EBC01849E396216B9F0794E6F6C6B61B52EF1B1950C0FB609895C3C55FF574163FC8B6B09E66AB
-AED1810E698FF37CC1F926B2CDA3B48C7D77790EBD2D514B6F385D397F713EC3AD3954EA9C846158
-6031D369E8B99E53408A79D64C34EB5A56DE8A67DE91837960E98A66FC04DFA0EBDE21DB003234BB
-78665B039D0A469A0221BD541AF7149A2A659C300132C14581EF766FFFBECBA8B58A5EB3F95446DE
-F49AF863A8113D17B2E7E6ECDEAFC3834D4DF900E3475596E86FBB4E2974C090DB4AD61A737D611D
-92B4535AC291C56AD8B1C031D2F9B505BB77517B737D70AB3723DB52AE2ACCD5DD2F617423ED3CC3
-9CA882EF41757BF7151806A9B8B0F312808863E3673FB54DE939B35CDECA7FBC4DC3BDF5A5F47D35
-E345916C39366C8B4F439CE1C6F1835C320BD1E67375B03B5DE18C93256F251761A4C8CEC01019C0
-68E34447BCC503B9571FE8000627A6B3DAD5854CBC0A2D69E5A8F46BC78F6A7B1422334EC7A98ABE
-FE9B83E01DCF3C6C9273B346F3240EA225AE4A4083CC7B0EA141A0773FDE940768358EB4B13D82AA
-304A1386D450C1C0C6A7D5A8FD2BD313F78F85248B5196241E31E5595F3BC01F37700A2DD3D4A0EE
-2DD01A36569CD507130E8F5B1E96CB560BB7DA15560CCADF3B2C9804A11D9E8055C9EC70E48C1D21
-3EB756A1376F2EDCB7189D78CD3D6CA5865537EEC31C17D801605EFD860B0B629472690588D02575
-02C6F7A75B9A1C1B397781329832CF3EC43C09F1559CD562C48FA9500295CD3B0A790DD3FCD4684A
-7C7AC49AC9BFFF36B39A9FB148BC28D37907433943CBBF0CBDAB46D3EA86DC8F81C859C52D15302B
-94A9B51C199B7104DEEC9D769C2634CECF8B700CE9C04152CC59C9326BDACBEC4312DEED92DD087A
-1C4840868D9F97CAC046581F762F75E8D24D6445370A3F1E0AE74A6478D9DAC37E7FA5BEBEC0A1E0
-81AF89C1BBF7F51E3E2E22C8C405E8671BA85F1BF0DF79A465DAC7EC07F731E00632E017D190A99D
-83E27E5C2E63D7DABBA23B2E88334C63721AC5A4CBC5D45F4C177259F34C2EADE01FA008AF65EBC6
-01D8DD16436D86AA94C99F3CC0A2F87134E73BF22F108B825A8963B49C6C685474AFE4A542C8641D
-C0375D7EFE9AC1168D9700459BE52D0DA399023E141969F25C0DAC4668534B6647EC85454BE945E8
-26B26DE6E3C4584B97A38E2B40A0D23481BCA78084FE80E00A71A790BF31DF468A435ECC88E60A57
-860BBCA3D65930186E9917CBD209C230E8F8255A7ABC7D3F043AE4D7AD63D9980BEDF062B7D5C298
-C40225B6D03F29A0339E0FCA02138E526F06B9EF47F5E7A8068A846CFDE2BFDEBD24F5A73A66C079
-18662AEC80B43246284FA4E2EE0D9AAB172B1E59A6CC46B801149D8C0DF6DEC9A55D8E1B0EFD9D30
-2FF618075944CCCB6831D336B11617107B0530D09885E5CA11A5F1FCC8D69D603DA16BEA51116D42
-CAB1AA1E4D7B9B4D79993F2BFE53EAC904FEB70B2D330A89780EAC10D12CC0C35B8399F218AC2976
-E57A26BAD20CE2FA2AE2363D3FD2A8A971747556F2959DA74A8963C20B504711AE1CB0D0C02457FF
-2E9BF696B159AF031DD5155F21C0F5549B0471A3C5DC8918B675CEBCB23E29322B959ABC05283A70
-2E878DE8EF25EA760F3C5C7B7B49D398283DE2ED837FD59F7C22D62C58FE4448B1049FDEBFC8787E
-67D7DAFE9774979BB3802254DA59BCC0219F98C219F84D995CA768B8B5D9D4A32525DFECE003675E
-E4BD5D8DFFC11025AF2B468F9207B5B2B42349B98232BAC0759758C1F4A283405815BD7145C93FA0
-8F3ED2826655053A3C2559073D8ACD199DEA2C5BA5F616A2E48548B4370EC73493BA07E197165DCA
-774438B0766867819C1154D1959FE6E01E6312E0AB91FC2E2BD240FC8652A2D456A1DE7F34EF372A
-53794D4C4E050BF3CA5B7BD2F1B8DE93B4C8002485CB219AD2D029739FD3C81CC6E78EDF38723576
-1A57143EEDE5CC887F282FECD261F6A25D0A7E154ECDF5DC38E426811BE86AAA458577E5E0C5F0F7
-5AAFA9C41E5D1DC9D91ECD79B514F8CDF7A5F1A189470D35FDF4F9B8788879CCBD91B427822ED658
-389E981E0EE5F7FB87692A3E3E931DF8A1D1573E3B0166204240B7080089A09EF7487C9AEE2D665F
-5A82F94C877FB5B0DC531CEBF1E71C6592CEA2401E4B5122E5091DF03D203DF979B9A6EFBA12E2F6
-B422FDF15D49AC0914D372D21E871DE65CBECD105FD4A3E4714B9CCA5C6803FA39DBB015EA8A88BE
-7913502E562E5B170B87BFC8572DC9DF49AD63694311EF1334444BDF0B4CA3245271C1F7A4D7FAF1
-703E3AA0E1EA8D5C6E821B28707EE0C9B4F22F23796FE87356C58AE2CADC191F4C58E1FB58DA03B4
-5A25AC95DBAE13A293474217BDB214742B9D9D6AF35F70FED2891942EACE3E625E55FFB820543FBB
-250A062D3D395BC0F219ECFE0D76686AC148BC41476A887BC494DDBD396BE200FD3E03CFA12EC9AF
-6B934A283C42AA05589AA6B4A8D16946BB51F50419CABECEAEC5AEF9085C9989289E9B46BAFB6FB2
-782D84DE2B068F91A9744AAB237CEB1BA513E57E4C307108E993C972A3E0A898D5A8D27833155031
-FDB98863C3BE7FEF3004CBAA5CB60A1F2E3EB4D7290FF5FAFA088B1CECCB6CF51A58DAAD998F0839
-6CDFD68F5ABC9C1CCB8F6514107773C69C26873E889D1F79D10E866910E4684186FCD71C965ADF62
-39BA3418B313A27AD632300969B6F284519366ED85E7CD968D64823F8C59B5911A72D0A20EB72B60
-3A61E36F52F256FFCDF706B4560B4DFA5D918FBC530D83A4B3C01BDD3CB4572E24242D141BF9E775
-36693A0407D002E09CDA5B195BF1CCF430AE9824C07928A050D0B460F2704BE8F9E647A4884C4567
-0A81EACF7CC038643EB0FF18A376FF6F32B6FE4F197273327FBBDEC6443A299CAD4B26F7778A99F6
-5A11BDE047153E764039EDB251936AA43DEE50DDFDF8856519056AAFC4C5AE6F2051AF0579A9ACD4
-1D00775D7DBE70022CC263DCA5E0A25B9C7C4F5C418587666B2FE24816B1E0EC92F9074F1403BB83
-AFC3F1D52CA79C387BDEF864366E34C90BE52F7AA09935373A07E4E026224E76F9EC3CB9E7EDE50D
-EFDA48248D61F3CEC880A3B8843306375D9711E58645F3625BDB8E87052DA67F9794EF4AF8DB0BCF
-E00677C3A26907DC651BC838C40EC39E2B5A5DC0DBD345944A6C32226089D63C52490FA10B215AE7
-03CFB663EB8A47793B84CE7364DA1C4E7FCE32DFEF09490121222774915BA59C78C2275F829D15CF
-4D8686B095C38C731B83D48738C25F40B8ADD487C350A2EBE846C3916AE384CB1050F9F5DFE09FCB
-D9129C6270FD86D55A459618FDFA4F907E6B4746196BB717865AB378414029017551161A52E9D24B
-E4F7EED553A927933D4ABC8F25DF607779A717909CB4D810DE8F5762581900E224E4B91598149BA4
-71CF8068ABE8744356B261600BFCC57FB8BE45036CF6571D9B2A95304933BD4F17215F8EF53F8E08
-1AF61FA7F9583C34EB5655CB0ECB82246959F09091F36989EBDD646BEDCA614B9A61AB7696B3FF18
-1058A150FA6EC1BE2EBC7F64357A3FF2A2B0491D2F4E0B970DE5B7788B467CA678039B5EF55C88A3
-84578D427FD2CB16C87B0BF0A3D37CE8ED43E0F049AF2436344D5F47C948C632C94A287509282561
-6C64C5D262FE5B24916FFEE982A69A6CCF888BD01D62EA591EEC51F4B7DDFAFFBEEA93FE08D736C2
-0129E345D06B10246A5F57151C198D407730713F32299638EFBDC01367E23EB59AAD42A83AB41B43
-2DB462652E29813740F4680A5D4BD47B18328FAE6BDF4200CFA4CE3773809B45E8887C9B2E423698
-9F6C48D64F5986F563D9A7538A8716082F81936AEBD0461E6F4BD470436D8B7656F0FDF89108E6DD
-02ABDEF907731D458D690BC608EA9CED09EB1E6E64C0790C7A2378201CE997FFE0317679EE1D4EE9
-F91157449323E53B4ADA8096CD628B5861BF794543A98F2FA2AB54FF0F25A13DAD43DAF9394329B9
-5AA53CA32749FECB0B2BC035DD1EBD53FF9FB5AD8BCE06CD89E5568091C1CC314CFB1D9821D7F9AC
-7C55F55E0A16E39A87D43148201B928F3C42B110FC056189DEF183745F3B637441DE8BD4C3C7EF12
-F4258E306B2877ADAEC63441010750DB4E6269A4C78A0AC01BB3603C386651FE814031CB5D8C1F14
-9EEAFF652A53E57BBD4C8C0CE36A84A319A53BC1E5FD3F1ED1EE72F4C1A9BF264B594062FCAFB22C
-C1FDE3F2E3D3C17DD3F7FE0E15EBD812D550227C06D01127385374A11438ABD50048E17255FCD2BB
-85122A6FB9B7DA9D5E9DE8A747FAE0DA45A1FCEFE92B9E70A5B2CAC668D4D07527A5C1403267D823
-048BE671F725CFC7474B44FC5AAA348420B2D7C23C6CA066666FD6F2208E329878D90CEF1C2E77ED
-22D3BEBB9D547810B189F08920A27E7107F208591A84D463CE2576C70C3DFE6643E4EA93F4E1DAEB
-41D46F0E2F56FC10C69AD5034FC9859D31CF27A3A1EE256C93111F81C11ACF1FC0CE20B90BAC9AA3
-27A5C85A7985B951519FD4B03C40BE637162AF41B2FDA68F0D1E9B7602FE2659D3D75955C579AC51
-DF6A552EB9581AC3F712F083F19B52A6C4F560F36C59CEEB0C996AAF1728A2AA45DCAD79BD7B23AB
-388D5B0B64A2B95154B6259B730B0F4A72C8C7F7CC93C7D64D9D8810D1F63FF8ABD4DB89824E2D26
-4FDEE916C41E299211DB1A53256E1DB5CDD04862F034D9404B73183A99D3D13D642A663F129B6D16
-7095BEB4EAEFD03DF2FF2F0B6B594C1EE90FDB203DA89FACEE23F1BA3901FECC75FE1811BD701259
-343011262B6A0A9707AAA6316BC3C17F787BB80AC8DA5AAC942D90F80C5A3BB59E47EC767244AA95
-C63E50BF809998957936D3BF6ABC24B0A397258F9EB4DC8F65692CB023D9091FB180C69498CD0C08
-BBEBADC84A7E0016E8F8BEA325D924EB0DF82E75D2CC2CCBF039B11934363D4332C5FBC5EC556BE8
-5EE4E707CC2753CCC43D2ED50558E51A104221C9323CDCB0199B7B83454DE3FDC810D0F362C0299F
-5DD981B31D8E3DDA284FEF9DC8F9C8DE138D3065437A7FE8C30572AD06D62E8527AD37AE39AAB0B2
-25F76A25F6C6505241ED73BA494CF923E919F688DDEBF193E188F8C4C154F21631080763B4D091E8
-AD1D2FD6649E0CD9360E8D1A67A5B5FAFC67547CA31C95A5EA8D4EB5D68B9F6D6532DB9B54584735
-9558542A2AE58C09F3BD2918EFBE1699E9C8F2C2A11EA4D224C726D2ACD4A8D8ABAEDC6588CF2AE5
-66528B94F55B823A2A1F7BE19000F3E7579D094E047075DF18C8C868760295533B26EB3ED90635B1
-29C17ACA679C3E88B06998CE5A7A2544B700229F5A6A504BD3E45B276471959C8A3F81917A534287
-39B5EF9E3D463B3BA7318448E2A3E79520D2D245A2A72F31FF7070B6E4624E3A5E216BD103640C8D
-F387E49D732529C611F8B971073F17EBD2F6EB18F9B74A67E1997926DF178D4C9EDED435B9682F1A
-279C81BB9F60DAFE125845A2FF3B02979E5481C78A45C479BEFB9FEF3CE2BA9BC46C77B50B03E48D
-A6D17B76F06F3AD118371ADC69E178C52B5FB4B261C9311874ED07DD6D5B3226A005FDD7A6D53848
-09E7063F036CDEA41619122635E835D2D74CBB6AA9B38CAA4D819C26E95115FE0DBAB4198FC5838F
-2C91B7A87B07D734C6D4F4F83444C1E90AA9BFC908A2BAC4B3DEF9157AFCA5248F2DA31CA87BD363
-AC25E9E77F741D4B2C6E02F04987A6F49D30E9038CEFC41BA172DD675AED8B392164411144E5B738
-F3210B0E66B17A13CB9631C33D44484E792A7C082DD0A5382F34C5637653261B1EB6D2035B08B4D9
-1FA9AB770CAF40A103629511F7B43F2743D7E583433DECFB19C21FD4FD0AFCC22A4119E77C87BFE6
-FE50068B22479015BE5A9F06BEAB4D37412E062A45E0CBCD7BB39FEE747E96306F79FC4F2E8942DF
-5D9DA0E55AACCDA547DA19D30B8404FA121298B44C9CCE198C708C69A8D6BF17591C5C50D3FC5BE6
-961F7ABA8F366DAE957A1C3730DA4A5B4F035A9274675EE3BBF0CA8CE9D8349F50CABB1C3EA4948A
-BE6F9F143592F1EA95404E6909A909168E3279A957AE1924245C356331A75E7008BEE92BEAA304BA
-40B7C3F48F74D9018B3247DF50EBD7CE541DA48ECCB1B0BE51A455C3C13C279D4D8676078C3EBE43
-08748D52C9B041D3E7244C745B1F2F742D010A9E60695F3EC4FDC1050AC082B905D6A57E8F407A3B
-472F731011A5798965B7B1A307E252FE02C8F79CEEDDEB6E165F1A94D7FFF18DDBDF79477F14E9E9
-3981ABD200FE7771B29D1D2D120EE79D28B9543818527039AC74085EAFF241B56D08220C958B5D9C
-87C0C04A14D52AFD475B542D391BC54FF33DEF8D9484AFF6873BEED32DDA4B371112B523B6CE22B4
-0D1B416B64C9370F1CDF2C548F4CCBE9E12E21C36CC3EA52DA232DCFB65F66B22B5E2EC04852510D
-5E264EE939BB67AEC4764B87062AEB7F680B40BCEE04AD45C7519EB3B6199C9E0E332661463647F2
-FB7EDF303EFEF84891CEBCF0FAC5F723A9D0476C3F8C092604C87FC69C7A90F4D64AE45A478EE8BA
-2DF50FB93F55A3546123F0B0E2C1C40C98EAAE9F0F26B8F80FFE6E6B94B7E27D2884D58B8A119662
-2DF6BE608C5569D7864BB756DF2EDD184B90812B44ED4A32D001C31383A40AEEE9743651F7950846
-15C48E402DBC01C818D477EAC0347795CB2792E9C11E8FD4A02E194EED1C919D4598FEC003B6D9A8
-A0BC7D456047A1C0579453FC1D7CB2D158D466939A23D7A7B8ABED7E2777EC7487973E73F2266D9C
-250CE30729E3C5223AD93B9AE8443B35711E446A3DC660123ED45CE1942A1A2AD0610467E081CE2C
-8B92A6C82F0B17B5D2429E99F1A6268072C6B5AAAA6EB6283A872C54D3694CD825EB2926E57DBBC7
-C1663075E687A144E4D61C225781D80FCAE1497B442342B4A3F1CD6BDB50E31791CC3928C30835FE
-F845B6BE5E2D7E3F2F5F085AA3FAEB45CAD0D76BCBB1ED859A9CEBB9F7457036F0BC3F195CB1A98C
-9C8648F6583CDBB23894BC719D68C2DBD8003B10D08C8CAA40BCE784D7BFB4EEC9EA5359AC056E57
-B8B0F2EBCB1F4CE40C87FC7861180133E0CB6CE2FC4FE690756D327A2B5AE063E3021C0C0BD420D0
-56F0B941E6B36088A55BA11D0C35FD0132D5F48E5D9673572347171B4328D4807B972831C0D74CFF
-A5638C145B89C989E6EC942148207D6DB82257585958034D9F9D4221C7C9F7013790DBD130F277E0
-BC88BB179DD09E27062379ED06F25EEA8B7FB33C35861A0034776E3813D2E9E5C10E227CC569AB36
-CB2D9DF2E7B7B44758F9DC4FFAD7A24AC7E9F47AA850C221048C3CB35A37CE8EA75632AE65FE3212
-175146FECD6334AE3D3C5F492F067F795E1E8FF386BA198CB74F0BB4DC0000DA383BC4CC3F070DE1
-7721431988D69C8B1A5AFDCCC83C22E16A87E01C6D3E79DC7AFA3DB0371B0866EFB8B6F88900472A
-FEF1C4A878243C52D4E02E82658979731C841C489A6B97E271C4C93800EC7D91F93EB9B9C659A554
-E1FCE42A5EC65AC39190EF4B66DEAF6FC0569A000A9E1495F42F706FBEA4D32EB7EF11A648910259
-6A65CF899C2F322F5679C6D123469192A9BF1A7F1F2C81C554ADB97BD19ADB746A4F81A4D5559E60
-AB94C483DBABF6CE2F28CDB412D50FF3FCFA3B3DAAACC6A83CFED910CCB3B8D2C19590AFF4D75303
-4A6CE7F4156896A13808E0DFEAC547E69D3C886691728E4A35ACD575B40D721E8FCC5385A2EB28D7
-08101DC50811529528F5CB0C009BA7E3C88468E37768FB0D83895AB54DB2DD5426562AF9D8AF304B
-F6EDA54E9C92643DF926F5C3578269750120302A37CB140A18BA56BA01108D4ACACE8FEAE640A6C6
-958EF156B588ADB0EA5F3B0F37BBA12B7BCB221C811415387B024B7076FA4403A3AD6EBB5D9C26EF
-EBDB7ADE7C60B444AB9F90EA493B658B7767AE2BE649BDBB3FE85F460F1ED137C61BD95F7CD3D8B0
-15CE45138538930AB62AA0E54B4CE1A5EC5FEC0A2B28B345B67089A4E4AE14D2E1F5A9C8848DA688
-CA298F93860649EC3AAFEF3E820D86988C8E3E5A4D4BB937791827994AA3E81D0BB3EE115EC36D5F
-B9A392D09E79AF514D11C7B3A03C9F9C13355CE79E119A19177FFDCA34704D38118A8976D1EE5AA0
-2D14FEB1414419F5E85244ADC5C0A765A522EEF36170064BB19FEE3B5F7B441E4DB967DAE0BAC2C4
-8FC6A836E0EF5A69F073BEE1699F55E9C757EBD6FD8B514E2B49D6333815B7DBD1E0694695FCA3D2
-1320A0C4B852D9706DADD8369A95FDD917328BE93DD33818954DBD2C212D2CA81560ED5BC284EB04
-7A5F389E24E43F4FA8C97FECF46589FA7341076555CF55B1C21B28E0C1CBB00AB8B6F67472F27BC0
-D11148F407824B0159B5188D4BB7386FBDBF1C0FAF34721B7BCB5C0FCB7C4010DCB6A1284E9D7883
-9E3C2111A05D29AB7997073B590A81C6168020F1D48951BC7D8476D5BA593F4F23CAC1F9BB0E091E
-84B4E99E5C584D1370DD12DEE8DF16AF8BC6B7B23E2FEABDB7F32779AF8E2B5094A6E9B7A7225F24
-C43A8E5D2B977E1E19E633C26771E23017ED233DBB02C64F8CF03992C6484528D0C8464B46F24F9E
-8380F385D5D01B8893C67FC103498983CF939432AA380CA576D09030CD52FD99BDC3BE16C7204CDC
-3365BF76294A83A1FC14A236F5FE5321904E779B13232A76F8FE521F425562678436359C2461BEA5
-AB27209541F557AE2AA60009C9CA0A9FC7898C14306CE35A50017BADEFDECBBF94EE2905220706DC
-806409EF87DB1D73EAB0698AD2DB72CDCDB293E7FB13C94D9FC87E74502E6927A212F0D7D2F2D194
-64F7A66AC07872E18CB1DDE8F11835DCBC5C4EF039333FFFC0FC1456DAADE7DAE3EC2EE0D3415B0C
-ABB69FC5006F4D14A4EE1A5CA99AD4D5E629C0DD1E0F097B5B93DE2DD001A8C418234C9C45E8C13D
-1AE04E9466DAB8CF1ECB88A4E059C111A6468D2DABB90DA79C7C79E94DB28F6968B1A632F8C57D9E
-565FF91C6916026FFAC0661856B9FB8DE9C81661816221B1FC159CFEF1751E7E403F5F2CE32529DD
-540792FC17A12A3DCD7C50D38EEAADBD10ADBF5D8A82442AA900CE6150EB7A4639DD9FB6E385B2FD
-093493DCCD9014B23EB172E21AA89643A6CAD1093343D85D81261972DE0ACB16A4C6B5F0BE4C978B
-FA12D3CAF0134F9EA49F6E9687C8F99A456745EA252F0BA9968C7F9586E3DD841AA92DC7705BDD68
-2DAE41518A09DF0E209F321D7FA3417202F4BA76A984DA3ADDBC58136885362F02F0A24EBC439B3D
-BBDACFFD8498EBD29F88F016B1FEABC10785438EAC860B554525F3266097A675299AA0967BD3B7A0
-EEEE3FC578D1BE99D3533BD91571AED904BFC9DA1A1451FDC5406E1CD614E0C7FBC733563CD6CE6C
-C31E9237CA153F1F0411114361D731636BCF98555ABF12848AD109371A42B63675A4130B81E97C2A
-2EE2BB5D8FAE2640156001AF0F55D9D5DF8FF23C8AEFE14F120000F14149A36E5C94CD9081DEC277
-C2C34870D05011F99D48B0875A5FF542F067F7E9880109F586BCF2B50522A1F23ECE44349E539E70
-F84E207DC9BEC7CDF856A046F1A03226AA41F541719AD1AF88FF211E57DD0C1275DD0B7B47440DA0
-89B98C6EE92A7D94700B83CEBE19EAEDD8A615F6587587BA8BBA3CE3AA5E8EAFB1FB0F486BE3609B
-169EFB178A4292F4C0378AFE5D24EED1CAAB514DDC66C696D8E37F294A6579131DDF5488E9436609
-ACD750C3DB0A940C84FE022B22ADC2676F62E91E8F891225F891FBA537679B24547BBBF35F04915D
-20B11739F620D18B5B216921D222F15044368569AA302980B9225BB839F494588481B94B0C724352
-B2DF600A22B062561D86CB8F81514FBDAA4F8A043A0265F992FAB71FC9124A45B8475E1EF3DF6B6D
-E35CF329777D45F08325E8505EC0D979F542807AE77E57E453525F23BC59A50740371EFA98678AEE
-6C425374AEB745B99DDB5D8D908FDB551FBC0DB15832107BBECC4E11A1A8DEC69358A574A2ED46CC
-31D564549EFF23102D92BFDCBB2BB985F78F36033E34F59C0EBAFA3BDD71338736464CEFDBA91398
-33995EDA4207BFD4A9867D32E867FBEB7DE60D132803EF9347CB17BD91315484EF6570892297DD8B
-7D966103339535E28A00CB1EECA4A9775F60A9F5FC9BD8B06D78FE8E6318C31DA2E847E3F9CA587C
-B01AE2BA0A2EBDE308314413F4F230A758184ED60D4F71F6CEC22A93A01B6C54E0449A3860FCA895
-4A347B7588329A80974ECBECDA1070FBC055666375229F13DD995E99265DF870BC8B8CC6347FADBC
-1A6AF64599271A475B9123493D46BEC41289BEEB67EB97A8DED7A9C9730D37C65164CFBDC22E5CA5
-89D2E7954C7136EF4E084C43A6C7F361A3E96989239BDDB9A593CC2A80BA16DE9EE90E95CD39393C
-212AB22EECB677FD36D34DEB46C4AD0D21BF7E6D7CBD0C8083842FCD87B18FEA7CECF939987E99BA
-34C214E44DD84C176C9CC5A4CEA76D380CB316BB4EF9DE73D73B4AFD4ADB54451591DEF86621D138
-D5A0A29441502BF6C2ADE671CEC3CB5CAB903A657EB2D70C943F976C110E46C5D9D29BC00A875F27
-38E5D22496A43E096E009C5D3CB724B4CABB32838DBE527F83B18CB457E57B092C302EE557FD4F00
-DB9C56E66C9FDF4EC9FFAAB85F60D02BA79694FABA476A199A0331C30A78A92E10417BA236E23364
-8174C826331DC1BAB87C5F95027846130C6A2B4027930EBF9A97BA1B039D386FC51C302648E25980
-212F6A582CDE2778C677A01FBFB3C5D1B8A374ADAF6ADBF7DC94075F25ED66D440B3922C5F255FB2
-3FD8F6E21EA65B1D93BB225684B50F11310E242B087575973345B229BA62C1E2C35BDAEC04D10148
-F5B2F3BCF7399BDFDF1F3F79119714AEA697245BC647316EA157484ECB951BE367234FD02E8B1F09
-1AAC3D29BF282DFF4011BC0CBA8E55234D943DB3017CC7A766720BBC29B2D097A956C0F1067177F0
-12D42ADCB473CDE8D1BA35B4030757FA1D8211989DF3BD22CE5D501C21EF8708FB3449DF47D88650
-9FF7B59B76C0DBAE443F336FEE2D615D7EED1C284F14335BC8A26BF4621E10DE9611FB2F1DBD52E4
-B7565D8C65B54EA36D508BCF0C578A49A2665227CDE1F9768EFE847F9D94F1BBB7DB83701C232198
-5C7283D47B2E40B27A268428AAEFE75F6B2F8764A8494E5827573758CB9CA46FA93208836BCCC8B5
-564A69F5AD882052AF1C1417C3FA7F580569528682C77080F3688B65E7FC24D2A3AEB61574B4A321
-5927281544DDD7A6EE0A3E9388F8F631CE7251724DF70726E5912DDCCC8C652DD6C9608F8462303D
-867F589DE0F2F71711B35142EE6EF93B64D6326C4DD7DC83278E057100EE772082E6BA368ED91A55
-53ECFE2293A481E42F83BC8F9148C70EACE91F7B7D9CB8A72415BDB3AF66F68EA733A17ABE9DB005
-3BF148629132969589F38D30EABFA96A01FAC72650B5A6FF3935670198A1EA33810A9B11E330EB8B
-451F24F93544263436F669AB5A90A53B16CCEEAC36B1445574EFA7E802DE73522BE725E68704822C
-B7D3912717333367895BBFBE06966A5CC653AAB5E9B3596702086BF0010085B900711932A95ACF15
-CA4DC45A754EA334E9EB84D6FC8E3FC4F897456BED64BB93B593549FF0D5352275D8E417172A6664
-C5E0ECED1019494A7ED49AB0B965BEC1A82E5873766BB38D7D856049CCE2FCA65AAF61E961B60634
-E2A69EF059754C9D8163D87F928C222772D070D83FEC6FA5AC734AF65E40BFDE521F7D9CB1650FDF
-64754BFF21EA3FF0AF7611A93D525EC9B28C51AFECB04E7FC8323DD6C9B0D8539A34FC3CD8CEB795
-8E8EBBFED4313C77ED469C199552A9FF70BA5423B03B6148D4EAAE17B71C5B39DC436AC53D6BA8A7
-AD81AA8B02335A8B2B11E9F4FA913159A725B8AB60F52F1A2EA50EAF4D56656E615BF382CC68A690
-BF83DFF24FE986570ADC0290ED1A37C1C2AD469CE789E0EA0BB5CE01020100E729721AF3B5BADD33
-A2DAA6C33EB8F9064F5292F715F820B4BBFDD56F76D42E7A1A068C1CBDCE4640082F6E7D582D1939
-990CE6EE8D270015A2C461798B37DCB5798EE9F7512168B76D26C28BE4A49A1BF96C89D235F21A1D
-B6A96E5DA474D0B19B808D13D7A11BF39EA8647499C410ED9894A1ADF33D41B6FC2E614D8087F4C8
-4E437B136F3CB32DB8393C49177A0675A0C9E7EECEF448A97AFDBE840FA01FC7E5F2E8FECEDC1884
-84C312E8635CD79195475DDBFDD4D38D5A0246DE2C7F21608F8D2C0DA1371D302E941572E5792A3C
-F4E51A33228B93A814D03FD4FC223C314CF3714BB3A34BD4F7ED6348577FEED9DEB082C4049E57B5
-D3CDB7F26629E9F3BA36893E09E3C7463D02A22D7056BE76B87763260E46E48BB832B7EE13F8DC05
-37EC8E81E9BDFEAD8C27EBDF1AD706933EFD11131E12814F236EBB01BE85B7F1B2D627413B324918
-D247604F56EC128909873FEC3857028BEF76A3494364C2A7002D104D486236C30B48E2B75D851C34
-EA50BA7FFEB4E19190898AE21768C157C0CAC628A2181A32796FBC1A7271D2473CD88E5395DDBDB1
-FC3AA8DF0F3D588637F19A8B833AFDEB5F655A8838EECD684E2315B72C75CEEFBCEF94344ACE8D6A
-DBE355008EC72FE7CEEAB01363A895F4E73F867639BE0A0BE67333848816B05B419221BE8F9066C3
-62C23FE85B7F392930BFE4C12B9526FF2FDEC38F23A159ED61A0718E7115C24597D849FA76369153
-54A40C965D4D72EC94DA61A03766AB39AAB684E134FD1407A5B1B19BFEBA52AA0DA5D99CBE5C82DB
-AA663711E6DEBA180E1D4A39C320516A4350D296BC19BF1BE054859A0889C7E9727A021F3176FE62
-0FB0C837E4141FECE531A950C03D319E3255703220B7185BD20FE5DBA673F8129AB211EFCF36EE39
-4C7E00EB0876624BC840FA86E58B2F584754CB6BFDFD76810E300741EBE4544E5AC17413ADEB21C6
-2F66CA4F075C32381796BA709782DE34A675B717A2C7F6D88104CB924FDE5DF775B4F0B68E0E2E5C
-2F788BBDEAF06D8E1FC2105CCBBD5827C0B03FD6CD64F0D073F3192D5F94839644E5EC6C5185BADC
-F04112A65F49A8C83174A9AE958E76A2F5AF469E8B76C833782C5FFB8BD7B1BBBB3EA0CB7C9786C3
-BE2ADE5E7AFA8C8F20892659A59BC421E28845A108E34EE17864042EF587A6D67DECDFB3F510EB40
-D2229585347A0035670FCC76C2837A4E4D68304FE113C539B35C1F0234B5079B8E32934546982978
-C5E4DF955A454EA263C3CA5D7101F31A318D82A3F9FCB5A8AFD7A65209663B0FC9DA400B26F285EF
-46D0E1EAF8ACB1F1CB805E3986D04BC585073FC64895E4DAE1CCB749BB439CB32EA91176D5C39C36
-50D10AFB9C9884D5FB90183424CEE67EF2175D01D2478D67511EC9F54F88763C152697B06D948BED
-49240096EEE3D06AB4575E8E8B2CB8263B5BCF4FA1608720F52B675309833071879DF52C3EC2871D
-20F398B5CAC8F8A4D41D0F1D47584DD90DCDAEA4A1CF160C4B3BF1AAB890B5CEB6CB3488672AA68F
-BD938281DBC1D8BCFE92FBF514DA5358443CB6E0147254E91B38CE6787B2BB0DEDD2D38F5938737A
-977B5EA42892520C58F8FBB53C994B57382379E9490F0D6970B980E1BDF8CF9F4C3C5E0A18F66E86
-EE93FFE7FE546DE50F41364BCB3721B637072571FA1779F1D672FAD260C16D7F13CBDF3E4376E7FF
-56D2A710AC5AC35FCBDBCE2C9C17E523BBE6218617B13C1FA6679B308979AE7C61DA6E68369324C6
-CBC7DDEC364E5A86707266C0B459EE7B2C03FE584E529BFFDCE98C90A2F3D9305AA74D3ED8430DBF
-3A49FE2ECFD9C4BC9FEFD22618FE9C8A973AD072AB6F713E4DF02DCDA7AC5359B2D652013E131B76
-B3ED6C75FD53BA58D862846264627F6B9E70D8800F6D9B32242B747A67BB2B45675840D34F852AA8
-062FA6B01E31ED24DAE02F6CF788A17F7B9368175195DB0072259CCE0FFB2C1035C1D26E1777CCA3
-D56A827C3242069E76D6DD69B653768614B9ACFF16567FEA61508D51454BC02F6C60F755AEF6AFAE
-3536BBFA1823F8E1A53C41124DE983E51CEC92AEF4F99785D554488A51C20885346D1F761DA79017
-940A0C557D93F1DB6B3D00FFD61D08E96FF3AFCE5FEDF545CC9F47A2B1BB26713431D6D1E47FD6BD
-6E3C668B0368241F0EBB5FA9C991DF79890E52E83A3675EE699B61BAF869DE91F67278F510061C6F
-E41DE2D883F48CD0E068E2A652B244128D82E5CD52F35F210DDAE3054691ED55A7D99088AAE8FB04
-F525C2084AC09F5EDF80A4EFAFE981F74C0DE9D194320709B3464F3FF2C0F6AAEA6D973D9C323F53
-DE3D741F698FBF01036716BBD62957CB32CD81D3A2674560FFBC5BDC5C6E4F547E589AD0B1CFE14F
-5E17FED1C4A8ABE4E67CCF8A49F32C4C6044F1431E1CC382E7758722A6D0DF9ED23E51F8AD14D11D
-7B6428E27443715EBA4E9C05D6F238378F9498AEF0E7EE4FE6856622CC8E6ED141EE5F109E343CB6
-695C4BE1E0F66601C27975983BF557C04ACFC19227A1AD7E6C44C00529FC7EDD7F886D24B7E029B9
-C395260088BBFB96972199A7B32796D27257DE83A7402291C14FECDF7998C5C96B1EDADE0280F856
-8A8F5007852EED303969180B3329917973C2D32C080C9765B6BAB0673BC7ECFDBBFBEA980C263843
-39B7F1052591D91667D4FEE413AFC23DE2D4B9DA742F4269C6C939F5FC32A38040730A018155AD73
-3F231E4D5B9D01C03A58EAE7B5F590CCFAF25EDC8552CFC8D95C60EBAE1837D7A97CA137E9D4A4BD
-2CD34AEFD68D64B3F4F62326AC429921D7FB3C235184FE0899690A0B775F1A566EC29D5830D32372
-6526F7E7F5AFDD71B77E07613DDC4FC63EDF49051AEB59E6337AC0A4B6DD872E776C9CD0CCB86130
-5322D816732124F5978A86C186BF0A0F88E733CE38E4D7C1BA5378C5629B1EFC97806059990ED42C
-5CD183BAD7E94070E4058569DA2E51831FFE0D080301AEAB4350BA290318AEC582C78D05DD92E5AF
-B4424EA808629BC972E68F4FF2489C245593F07555CA6A2B25964794CF31CBD3AE5C229AB9B8C298
-06C01D116EBD0FF0F159ED2D3D7DFC73EAB4910BFF5B0B0B587CD9EA6E6FC45D63C09766224D8346
-1F0588140B258B1729F70BAE7962189B1554483392988CF230AF4077193E53330519394DD99BA135
-6D4730AB221DC6A66019BFAE564893DDAD7B177DADD16ADD21D396CFA6C3DC818052E2F71149FD59
-4A16DE0C2FFDD366C99B486C55A6E991E4D22CCB15843F0C3363676AF2F5B2D1B7EF66CCF2F12DC5
-0D63776BFFB058D70A9C76DCE96C754872D72C82A0C33F90D49C935402CDD26B6D743B1F43BED5D8
-B539424849C1495DAE73044E885A7D0F307F1816DF6244A6F2D97BFD4E200E93F69B08AF39EA21E6
-E347A47CEEBF803F73B978ADBFCF056789BB8E6E2563DE87DD9A8C877157B934102DCEDAC54D487A
-1BB2694F0034093C48F10A17D32E2BDD0C723CAF59ADDD1BE373AF8C9BEB4415AA5AF36310C31F24
-354A53C0B962573148BEF91D994FE3F3D8450DD4D686725799F53C373A0A3E3C060C2E1A3E800504
-9F26D716E1F381B9F83125E4683264A07E2D8938F605978E2513DD2050B3D8A1012797CBA8961632
-BED260916338A812AE751C7B657E086A0C7DDCD3BFDDFF3E48B84751925736D1310C4910FC114387
-F3ED7FE163F91895EBF55FCB425CEF5729D99BD8F2C072E36C310523E75CD8E5DE49C031C4263410
-9D56E91A46C8C8E89FD92012A00C33D0DEC52597B5C6933291A7BDC5CEDA95DCDA5600F9AE1C8250
-54E7EE1067458CCB66610704C58E4A4FC0CB5FC933D0322A716B2CD430A3AD48DAB3D4CBE9D23F2D
-092368CFC4E1F5495C133A92942EC62118D45C17723646E69407B4A89DCDFD2AB3FFC099A21D9D29
-741D68270629AA3A414FE58658DC9170C247B6E23F35C4BC5FF83009F462F2EEF4DBAC5FD158A658
-57F9B6DC1F5192DFB169DCB65621CAB2F1B07BD22F4155A8E9E2B6388D430FDE5EC1C834D22EA035
-C52E1E34482EADC36B4CAE902AAE89A7284E62B3C84B608D6BD05F75BC31310B2DD3B2C08A00E073
-7F104F03A41989D5F6B9A2C38B22F1D1803EE5D7A4D8DE44E4ABD496A1DE0C0E12C4BC96D0122846
-3F0EA9CE9509FEE987139F3DD3F9D0DF4313F555BE85433718F6D05F197C41A9D9C7A8B0D2740196
-82D49F58DD5F66B12A6520D9F226D1DF1F1B65CDFA261F980CA25A92645B86B64606293F8BFDE364
-C47D2AF2C709BBE77A70A5712F2CC26F3D66F5BE2C307A48E6F887F681D30121E32BBD87271B5DC4
-615D28C309F15AD263FB37424E56DDA6E17B998B45BE6C7FC6C28E3394A8764C9EB2DF5C06626593
-B5C665D550D4600172791CD208AE9F37BC082B0B242B0A504B751B18F4D7495172B697EE217834A8
-A4FB7CC16D6F9E8BB400BE8AEB0850960283DCE725249FCC4DE97D9886745AB6066C3E2F64DD8AB7
-9AA11667F11188D7965DC11EB760B772E282DBF13249F31986AC6898FEBFE23E3E8B8D2C33E00EA6
-FC493850ECB2E6D831D1EFCA3C2EC8EE2E394599091ED58BEDE97D7A43B6F739EB0F845EAC1DF6B1
-EBFE876009CC5D804B15ED4B56761B3CE1AF59C07B49DC798A44532297AD73D5101ED47F36A3678F
-818297CC27F6AAA2AACCC9AA9B6F5459911D8C56CF499E390AE607F3790450B2B9C9BE0F006EDA0C
-715B5CA0481734CFB0597478E7602B0D2C1E4F78F03C68C17C70E4B42D7D2D3C95CF40F73488B371
-8E2CB05A549944D86944D78724E266C3319AF89AE430E777E95F0D792B1C654306E421F3D63A26B2
-1E74B6E8B21B2E2B9DC596D013CDA16D08E65E8F24A84B12B2BADC653E6E1110DE2E709C1C1BED13
-707B70A421B384F20CA7A9A9D20324DD383F28B2D3C7A9C53F5D4C6B7C378D26DF11CF55238BE1B2
-4FA70DCC178DAD3D35670FE4919085EB1CD905971D76A368FDFCF9D2F0A23739851A3A6D2E02D65D
-54DEE69ED5D81315D3EA5E356F94EF256DD267FD1E1A9EDC9CD63E743F299BCC4A4506233B8DD765
-2CA067F741603F93250C087D368F9E9CC4CC1A6DED567487C05BAA992B0056A77F630A72008E3946
-15A9DB24FE56A956650EC9DE90A6C2259189440247970541CA198748928215C0E132A81AA13208D8
-63C1FE817F70CA573B54577D10B73100AF8EA088208A44FB92ACA314AE5879706180788C17BB1D0B
-81B6B95A1C4E0F9EA66F9B39BFE12444A6446691A7BDB03E0F03D9F07A10A7598F2166F108529F34
-CD90E601FFED3479ABCFCBDE8F051C348E48C61D95B00C59EA1287423F05666C3D36288844067E83
-E14F6B5210842C742B89F13ACD126B9FC50ABE2CA7D7ED513D43B6AC7F41EEDA416BFFFCC5C844AB
-2D23D4DC09B2D510504CE98D02E72020D9E669DDAA344C63A1B75632F912A1C0DA3885DA4AF7E243
-E4A4C6493D6595BB6D56B0359106957259E59E336BAAF35BD1CEC5CDE735272EBCCAE8D4904AEBD2
-B32610C6FEA2B69941D6542ECB44D71092A3CF067708A3D087AE99FF29671AB7DD8758759B971A08
-AE1BAD78270D2FBEE37AA2DCB119D72F6C7B0C8509018A70D0B0BE2C6830EF8E0B24B1CE1141EF87
-3A4D7DCC501F808BFD94E4DC0F2915AA023076BCC8006490A43685EA25AAFC187302EBDE7FE1965A
-04A5A398985D29F08E085127B56B057334D88EB638A4DDE64AFD204974C3939536B1B66A54B4DB81
-151853915718F70813F096CC1B0EA25E363B49264C2AD17158A4489F91453FBEDBDE15D7B74D7F98
-E81DF23251785D58295BA297F295AA6248A912CDD4F1111E6B628EECBB5139709E76EA4AB743CEC8
-26621D08E6BC64691CC90B3C3C1778931A28D3D5B1E20E96C643316613FC487C9B604C43463FA453
-3BCA1236286E6F5A6EEB2F1D9C34BDDE4595495A365F88055D9268541CF1654ACF478D384A5496A8
-772EA1402751A093582A6625A0A44816B5FDBE166835D598644296249B92CC90AA3FD6445C9A19BF
-27F59CB0616C7306070F33C7DF4E1DE64AC8C5BB2FFAC1EF2B1B30E5A0275E6004CF64BBE2C6710E
-DCFC3AA4ADD60106334708862FFA6652825BC84842736E47AE6917180365C75B27505EED3C6108E9
-898A780E20C3F606A860229AC46D0471ACA0187D6D539A1B8820F620F72B41AD1D3BF3834BF48CA2
-AFEA8BF535AF74C4562DEADCB63D2F5C7585722B77C989342D190FF926C8A5263B4F25286F99CF6F
-C62EE6E2AD61C82B29D82468AC10FD27764278E5558CE8B41BA111CB2F040914451A480C93084237
-CAC8F66BB7C6689F340B8ABF0150E06D5B1177278A4C08742FE22F42C28680F190900344ADFA486D
-59718C25D37275BCE4DF981AAC35D2C7E85C72A0188B8953CFA516FD545AEE0BF4B8BA301CFDE214
-4241FBDF3D204E3D2823301572E23F204C97305A82401660E12926EE7BA6EA1A81FF5C007933AFC7
-3266FAC4C134ED818A48E7DA01C71A46335C845F9DA5E960B25339D551582B375814148D94CFB781
-FC56093827B78578A73D4FF67B6B87F40CFA5E3F4325D9108CDB64BD06427B88C84105187316FA29
-90B4E3E8EDB6C78ABF164F4A9717D523794B2FE772A04DABBE688CCA977090979B5F47CEB90A1DBC
-167D305EAB231C9F4260C4AD10889CB785169902FC0BED78DA15B8417453BB65856EA0BEA5245BA0
-573F623D215F6C0CF801851C305B355D26B52B0B343645FE25C78A3526841EDA480919A1BBE5F56F
-C10ABEAA3E1FCCA7C43EE560F067F1AA2AFD642F769D1ACE8E2AAAF38850F0D757CD808C921D716E
-96FBC07DA7860DFA70CEAE2888C0ED3CBF9586443532B68DAED9A926655C157A416C383A53D8F283
-2A4E67468112A09ADC837ED8EC95F70852921F50D4417239FC42EE3624CA97F682745CC5E76CC7C6
-7BD99F2180F8C0B7FB49539C8CC474C25C0DDE491671FF329E51BCFA779346D4686835A3AD6633FC
-B5E0F67E0CA9CED8F215BEF4D240453EB2EDD6ADB22278AA5B985FA140C9834D38753DF2014F8C0E
-E6DAD19E8FC54C03C1F6CB0F858986691D99592562CAD95FA0A5B2ABE4A8B54B457D42E8C33A2D19
-51C0419A72FB94FDA78ECD92BD2A1416459E9DECA9469F35E4C47DB531726DEE8F203D7042EDB32F
-025DF3D582547BB1D45F7A5B70D317DF4EBB16E36B0D798E0932FD2A85B04FD67143E4B287A50416
-2C1F5A037CCD780088C5476385AF8168E12D97D44B0630621759173C8F1E3006B5B1C6D7138B7EEF
-C3CC5F54E24B2C3CA7B41AACFD25E554880AAF406EA4C3C6E21D3B550B040FB1952598A7E8E6488F
-E38288B2AEB6C4718338598A2BFE4D2B9D14C65732DA304C16FF3E1F8F03046EF095B65FD609DA87
-EC24A69278BFE65C905CD0329F6A486B8525B7EEA4F7AE56C2633CD83543269E8ACD6D71F500D82F
-DFBDE7F7F7B1AEE67328549232E26CA55085B6E84D9E2E7F74068F93A90C4654F2F396E57C5F76F7
-E61CBBE523DBFBA6E76638BBA3064DA025A79E3A294FE7F1CC28A3B4C57DD6FDC48E541A85534B25
-E1BC11B4F78019457239EAEFD4BE9007D205F1D985F389DB22400B279C10948551A6B4A17FBDA0FF
-C9428B18B43DC76EFB15FC2182216F1B60B4E344A03AD6C00F141EF99F89F24C819C3E32877A927D
-84C2D006940F39CA8B71E5951673EA9BFD1749923219DE38929ECAA9CE43B06CFA7DA1BBEDFDA56C
-61FF6C24F40E59B13870D5FDEB82D981154FAE5D6D5152DE69339359461A41A9713B6BBE47E868C9
-33CD74C75DB71D13BAE4DEC85E02FAA14EAD6C0A253B16C79514657B15E68CCFF9EE6AA385CFF9E2
-C53D9AE40F85C793E4E8FF50B2B7420F4FE69807BC5F37C3E300E6B3C3549D1D3246A2E70F091054
-1135BDF805E0A698E236B6496702D061241687B7B8D1A0E517DF0476DA09D89667A7AB375FD2672D
-CBAB8124E511502DDBD08BA04D941DF1CEBDCCF7ED48405CBCC33774A68C5212FC6F132641FF413C
-984F8B43BDFD7B1A2A3435F15AF07EF4970D3E4A0BB947C181E9CA27CC14A35BD1BD096875B45873
-8CA244F88C28728B74E25CB8C4FC1095A56CA75E4569AD3082EF194ADD11350DB3B74B96761D4538
-596FF7243B1E1B724716A144106E080D42036444FD472998460CE9ABBD05B42AF9389AC452BDBBA3
-A13A96890025789F16B9D92251FD3B3BEB2C61EDDB370A20456E3BFE5F4039E2557C451C524F8087
-015BAF3FF05F51869FB97512968BDB2B49589C1C7AF1E085250A47657465F480B7023E24C76731AC
-0EAB6704123D77977D3A2C4C56B691346EBE589C619C04515D34F81FC6A17527D5D8319013C5D4FF
-27CC3925E24C99231AC7FB9EAF0BBA482D3B75807AC85D03CD09DE5D9AE0B07B7A813F0449786500
-0AE8A7E00080300F0AB8C399057EDDBA273DD2E1B2A0DCEFAD3B332E6D4AC1FFAD846167DFD70E03
-46DAF84AF292D4F424256ED5AC4E104F80697050D50844A708EAC9E7F7784FD01646F3BD0C595CA5
-1EE6BD607D254E78ADDC5E15C3B6AC4940EC865A5C23105B6BE09EA09F2C05D6D76960A843B81EE4
-33977FAAC3CBDA85CDD2F4DB7C28293A77825635992AF8F3B38B4480D9A139B1662345A8ABE1634A
-77496C3F57597D2985E9E54717AB2E99CA35789441BCDDEDE9A9E2106B401D9684ADBEFE40D607F0
-75C179E9CC03E59E65430DB70B441D43DF03F2AA6FF06F224B6E455B01C64FB89EEC9103E48453A9
-749B4D602808C7E408A8903091D85E06AAF635D0D529C3CDD1B8479AC0F4208C284BB678A547F2BD
-77BB17C86D4560434F7AD1937760A6AA55B614CFA9FF8C9C96561AE6C8F2121C4E20237428BC51DF
-2099B6C49E3EFA18E6D439E6E6981E746EBB1DC461259D8EA0F8099C47CCA27B2D982B72C9A07CF2
-1B3C05D6E26E6E286E348B8944078E24809F9C5F3D014B4CBA02533F5621BFBA1F0EDB776C634746
-703C9F73BA89B1960A496420C68F54E5B901A6D733D7ACC79F275FFFB253F389AA480084468BB34D
-A1E797E43B7F6E8CAF5E8C93069A3A2730E57EC39B677BB73E3F07C2055599F7062E53B37A5F0099
-907D2ED87FF7A82C95FBAEB888033BDFD67BA3A6031A4CDC56CB1E4CF5B06B46E16D988BECCEFACB
-9E1C037023D7BF5CCF5D65AA66A17AB361BE7981F132A578F3ABFB97960A6034F052D9D5AFDC0679
-782EC90F240F943A5F9A3D969ED7399254FF67D89DF668F7C56FCEA1FFDCF20481474AC8495D3AF4
-B6D7EE093E369C057F0B70858220693B398ACF8E8143558132E4391405E30A73937C53402E459F4A
-A3539CF7A99A3F51C0307D045DF8B77757E92EA2F51BF0BB4F77D3904DD355665870C2B59F1ED7F8
-4FC71FDD7F0B6C5D3182DB77827CA6A2060D2B8C83C4EA4A432EF43A4D0A952CC6CBBE52A9F0CD66
-1A538973DE41FFE9C5CF55F2506B9EFEE51FBAE5E63BDCF5528499A47C031163C88D3022606784DE
-2F46A9C9235AEE3D4F71D4959B0CFDC5B7E78C8C0A8F9DC99440C2263DBACB343C5C648577F5610B
-50EAB1CF7FD02419EF3941C7CA0B0E64EBAD4B2CB05A0793DBC38F1946D44767BD287F5E9779C611
-CA0DAAA1E7393DBE0683C8D3455CDFEBC0E64B54B737E298DDA605227C0C4BBA87AA3EC7FA6EBAEC
-39E6EF2537D5974391D31739D9FC42983D81AEE44711C823F35F8E2321AC74943871739D2DBE9748
-FE68592263E7713F27E0D49B9B5CB7A4E55DE54E6B800D15856450FFD3AE5F287B12AE4F438B20AE
-9E27E6CAA00F3EAEADBE08432684FDF9931E925544A680182602A3C1997DE5D0630BD5A010535E66
-E1C123013D23966B3545C7431C39B97295BFA4099D14461004C42C85095EEACB9B47C593BC6DB863
-533A8619BAE09095DE8ECA432D4DDD49AA600D277E75DC3F5C6631E2A05382CB007825FADB77438D
-CFA78E252D79B6A196D5164C2FEB85D75ECA25FF80B1D97FE10E87960CA0FC47C41D3A213BF141B4
-8BC3AAA93FA86245064668394665BFD52D12C3BE4CE39EFD8111754398A944C3FD1AFA98EC337BAA
-AF899D35E804CF416AD7FE45FFF13FC6354007501043F98FE8428DE8013901BA6A28711A2CA85A27
-0BB135B72F1D5026E8217581860729E94F2F1878A0E96C59E9F62714FB5F8F25003DFC7347E99007
-8A9A331CB3A6A535BC61866F02513DEB982C4A13ADBFBAC3FF70A7335F40D5489E48E5EDEDEF1619
-1973D932479C62183B0E25EE8C4F76D4F1AE45DAEA4A12AEDD9EF81D248E8D19F8C8A5BECDD1EA1E
-98783EB7A38149170851B1942C96C53DE06DEF80913BFC04E539EC67C110498D15B78268853E5C72
-F485F8A27B768569E54241F6115875E2973292CF48FF91D45EBED627AE9F0766D22201B20AFDD40E
-5B17CF337F2999E0BD15B86E46EB3C18FC12B7DCADCF9DD50C6C7E3F37E615A892DB3F57E250A072
-A49F7277DD6A2C8042698233D35A699B17ECA5DBDA6D250ED4A16FCC893BF0DC2E33FB1EBD7DEDEA
-3C1C39603C8B7E1A5A833A8FCDD5570BD088749BB232615366687962C7E56ED089CD7B092505CAFA
-5A80F503C4CF337F07ADF0D106937E25670839D491F7BFF7A523DB609D126328C16113ECBCBF9C40
-04904427A108618AE5D4ED809F8CCAF72251104C94EC5BEE21F91B179D31DBA79CEEE5EC7FF698EB
-84AB1D2D1A624F58B3622A78844CE51498B2CEF38EAFE259D22C7BA61104651A862008BC1DDDA58C
-C45F663EB26428DAA85E7785363A69D2790996EF5D9621D53042F42F794962FEA46E46F37B8AD1FB
-76FC8D5CF2146843F8CC625139C75FB42DDA71A752BAC48F294E4C0C8289FC46DA5EFD9C91BDA6D0
-27518B7E81E8B21F755A9615627D5812ACA674D1527A1185EED4E3C628196E7D0759B1CAE6B9B7E9
-01E9599A65230F1EE469CD33B9BD9C104C44E3C1AB966C9678BD0AD78111A4E0F2D07A01A038CEDE
-7036D0534D684A1562A17AD64A00F279200C0371B1CBA61747671D2A21D3F9646CA290F6B82418A9
-6FA177C6278277504B7FBA936325F5FA124AB018A15DC18D2C5E8F93CDEEA52BEEDB78A57828D81A
-3E6C38B9FAF3DC4EB7273ECE3EA4482A1C6242A335862C2C3717F9C9ED95F77B140C4E1569B2192F
-C7DCF702D0BC9A50428EC406F8BD0CAF886B4D979320D3E429816D88F7C7146D960AC12E70F2CB7A
-9F4E3E366665AB3F1B4B6440F55EEA26DC9EE0096BB7763731740A537766490C8C174723BF0EB40C
-53701AAD12B21D436ADCE22203C1053A9DC4E9F17AE617888C4B4E6F3A720E4E6366BA628221A387
-D8AB15E04AD69387C310D3528BD2FAA5B22BFF3FA494F5FBFAC4F771C9C7402B95580C5AC4BB3AF6
-92A70CB2C851FA5CF1173EEC3EC29B5A05A0B728BBBB51D3B7AD8B0AF17A1563E82FAFD93F8B7118
-1FB7AFE352874F4EC6D334AB6747519AB8E847B7BCED33EB5458A828E074E74BA621BDCD03FEA604
-7F7B6ABDA01FC7514BA1AFF0D4D0C0CB8F4E42D5A87E395D9ACDD02CCC220C157153422018725846
-009A3ACD8C8CDDB66BC6836B4026FD9F526AA275D06C813179E5924F26A25094E7BDA8BD26AFC4CE
-B41D8964D4FC4AF1DFB0595BC5D6714C32F15DC7194E9A3A73013C45D8FA55CC0550A12D9AAE8E9F
-F199FA28EFC2426D8D1DEFB93A65717AF3EA8E2D5B4AA8EF0EF38E9600F7D4E7D9F1D67A2E63ECE4
-789FA74B159BFE2F91C19B0378BA52E93DF12830D99553B6618645E26126842AB70262D96E35E5E7
-50ECA0CE3458B3E51BEE2F21191136DFDBCA39BDC07939E521E4F492F392DEBD029C1EA237BD89AF
-76BC89F618D530160AB16269FA6B693CF14BDC4EC7C630025703C5337F61458FA09104EB15C7CB20
-AA4C9BDB7CEF3A09F25BC7F3149951A7CD75372993B80CD2112F7674CEFD6AFA764AA3486730D2C1
-897A264D82A91709FEC4A21E30D812F558451804EE6F3DEE2C4C437846BCBDA07C5B6CBA1D94AF02
-9163B7383CAC6E088AB1DC14ED3743EE77E26EA7AD3119A76C0B5F925C4DE305CD7BB3A09A453947
-5B9BD79BE28FC462D8718CE05F9D94CAF3387BA55E6E447BF81A9EDDD3A34E17BE66BC52B0C0BB6F
-86F6F008829173816D205182ED2ECED319864A796AB65D4E3950288BADA94FA32B6F453AFDFC6C39
-A4FCFE60353A64627E2057D4B379D3240012B3BB0ED0C7876CB83C1BA5EFB6E2A03F340C2B576731
-F848F762A7E1CCAF267EE06D621BC33FC245D0E1547ADC12CC0EB58B26BABDB8EAE9CBFBAB93836F
-FF22BDA1831DD01B7346AD377AA298D84628BF1C07433284B0A90FC89F5AEB2651BA2CEA405D4F52
-DDC0E74B871D43F71EB4ACE0D2B401F9348EAC3A2EF0AD295036BF6CF6F870D58E00B619D50EA7DD
-77BC28DEF91D805CD527DCBCFDC16C042BF9B874E3B1567EBA4C1E70744B9E7E5BD1FDA6A5FF6E10
-1613FBE58DC46CFAC1A65ADAF65E49757E9304E2AC9A91E0588600C709A61D4231730073A36D473F
-518A145E141D0A5A494441B9EA99AC23F60F54F8127B477E1CE698BB4129B4B1DFEEDF10D9E665C2
-47A62F112F5CA30B0AE5DBF3E495FF06EB28EB438CE8AAAD84D5F50FB56A3AF002C23BCF66ABC270
-7AC233FC0F2723DB99D2CFE7D3B3667732A531F5DC315CE74EDB9050BF75D29E6430F57CB6778B2A
-CBD57DFCEF896E6766C8FC5C9F9FBD701CD62CACF33EE0FC95E78DADD205B5F42CC63024624BAA0A
-B4DD447832B4E1DBA77BDFADD223989F8E958C8D759AAA37930664C6EFEC708116248A2A7AF3D656
-DDEAFD009B7F5333854608E67E5E588A857167ADF9225CF6C641F5E19C3E08678A281199EDDAC831
-B57223B1BEEADFDCBC8F6F25D32FCA2336C808162E8F381656E847FB6CB13969572425AA05AC830C
-33DE6E030F86A3A85D2A66A77F103C7042C97205526DC882EA9A00EB8BD5519847EB424C15F808A9
-1652A6CC89B66A5731126DEBADE123C63D88A2E550FACDEB3886FF98646000C64B3A91078012CA30
-904B71737CEF6BECABD43DD702880538F5A70085E6CC6015D2163681067C3D513A8C66032C34A0FE
-17A58AD4BC97CA69BF41F11D5E910FDFE9729652D3EA21F8DD8CC19160A8FC77573B1E9CEF4E790A
-79D8AD6723B6804E9616466C935303E063DEE29CAA6C3BAEBF278B818C2EC2F13ED645AB452397BF
-00DB8B26E115026E256746CD0C78A959364FDE6DEDDCD0F441A61A1EBA32C7BC172BB09512148D1E
-BAC9E791B7D51B71CAD2DC9B83B2F99B3726607D9CBE58B499A13753CE87FCDCE21C0AD0528ED0EF
-B9B2C927F57C78C626248AA2B835A0791244C5896686A66173EC9F802C4C633A42B086334D2A4878
-0E53D00809247BE64E529F96AD2F8B3922A6097D414DDE1EC76F9552F9B8D58B8E34F359AD792B2B
-E50C26DB05035E7497162E7C49C38D3CD9B98D620AA67492BE5AFCA3A81A7080185C7F0B5105223F
-1FA77805502A2E8C5FEEA27699858D84A95842C5F2FB68686D59FE24091FCDDE139B6463BC6C7B1E
-0E90D20A83651AF00C85797BB9F53ECEC1675C7EE636D0D9E77DBD8F89670F855EE4D4800FF3F695
-0EFF09BBF8A0DAF6B8242840CFA5BA73BEB95115F4A78BCC02D85ECCE0C0F2EF6F328AD1DD6CC049
-5A3315B414A4D61DA50DA46D7ACCEFF6EE56451805D26B0359AF193531F95F6589CEAD6FA041AF15
-3067F88A0A2FECD135C56682DB2B45A71D1FA737C064EE9A4F404BB72A70B3AF0330359393247EC7
-81512482579865240A23CD8479F21C2C44A119EBC4E81B308DD8AA86E60C3DD8ADA50E0DFE8308EB
-1A7F201EDE8DCFDA405AEFB47E0E6CA7DDB376DCB21D37F7ACC4D3E9F26B03A8DE0E8940CA3A9E75
-963A389DF8038D2C486072F61C0CEAF500753C7A6352B1CD0338D9212B42A4D3DA23D5BDF44C27C9
-4B88A415A3242FFE2E1B332477A21D2B9CE075EE479C6E657A4D8874A8C53964229310E01ED4F3C6
-86FEF5258EDF3B464DD6FFD7F1CAF473BBE722D60FB14AB4918E93878A8AE4773930B8CEE110F476
-7F42A52D9304C55BE12846C911A10AB9B2E036BF9DFD597F5348D42233315FA80D0F563C388BC253
-2103F05E90DBF1923F229F980A2F4585C7A373511372D07DCBACA583099EA972C03E5AA67E663882
-6DB134564DB993CEEB6E7A6659C7C5C05C310267D5F8A24EEC2D5CC3E3F3C808E6D6068D1A57646B
-37FABD98ECB7BAF99E7D9AC4414A491A73CA34C52F394352F6B5A15F0FC4D88622DAC694699C2464
-84ADAC3B1D366AFEDE2A2CD2042C90516A666A19A91C80248B11224BEDDF1A320E230739E755D098
-B6A67315535F4C187CFA67ED817A035056353FC859BF286317996FFFB478A2248B908FF12ABDE705
-402224A3EE5F463DD3D243875C84E02DB968ECA1CC52C75171EA50D6A88CA91327A7AA5795019F36
-C0A19C093A1C9D3723C7568F9D41F2E4FFB712FD47F897703D7A620B586B81936C84AAED61D84332
-B3BEBC4F95B796B93EF7A1F565C494F8A65EDB21E2EE18DC025522EF8E599887CA2836069CDDD889
-88E5862977B7472584303198CCE97EF9F9E1446D1F1F5ED1CFC666A8A0C3A03E1792EFB60A9B4065
-49E0DEDF6ACCDBD98742568B4735A747D8E5DE21E630125AE0C691D054E42199C15B1F80CAFA6E7B
-B2005F374A9A5F9900ABB7409CCD50C3AFCCAB1214E6A856F7C7EBA89BC3291801E1343DA9DAD2C6
-ED075C8ECA1423B43E587AEC67E6145272814B3F191B3C285639F9E2D6E148A02DC2CBC0E054D629
-5CD05DBAC1950400A9189316F0265B86A732D302C5BEE8ED233768F237C62600CBAAFF3A110D5EFB
-6CC7CA3B92D965CA7C5E8D3E64ECF239FE2507FC797FDBE54C1112B28D4DA44C60AB09D994C5BA78
-D663A2591934CC052BC70CD1DCA3325C66C9CB982E2039F5DB70C848D3DCEF655B1C2CD0CEC8865F
-E8E1C0A267BE4F707ECE6F5A3DFCA3CC1EDF92C760439F51AA69A4C1801E96CA4D6EA4AD980258F3
-D15C893913ABCE09101984C61B91D603053E49A97CB82FBA707DAE8AF1D579FD69C8481CB7B712CB
-CDDB4D287BE995E32C02B399602A08B9DD849039B5673F1930BEC7BF366EB082D2CA5DB2385C8CC4
-5BE3FC0E31820191A814EBA7C4F23B1938E6C4D800732787CD2CB97F762DFC85D4B798809B5F2254
-D826CA42B32695428D120298B44CF38494E56240B75DF1E41E46E53C44DC505452256DFEC819408D
-605FF14D6C1F3F152F2FEA96EA0AB3B472D8704E06BE9F8C3E8395CAADD06D6DA033E81ADE5DC3B8
-3DAFF743C6E9E48716003D358DF63CD7FD3E2F727D1F2D0C29962F76D5C95ED44B6F08D052025A66
-5785F264A3D5F5593677B630E628B5EA81FB37CFFD7A30B7FAD226B6FDC82B0878AF4C0EC4F4243A
-807B9839EA62BCBDF7C2E9B30A623876E632E084EBF4A21EDA04FC88A1C07021D0C72EC3E969D449
-FEB08E5826EC20E55B21EA71EA59F6E3B0710B0DDAB3261B4A2029ECAB68C19ADD5174E55D5E984A
-4E5F38F592A302FEE6ECE732DDE841A28672C620CC5D687455A5C06FA9FE688394A04F96312ED025
-B7AA6FBCE2925F3AE559CC1886BEECDB70822E2E5CA3F732A87404B1536AAC469989E9610CFA440A
-CE43875A70CA51F36CB6F629D9424C1E35A88F92D5DA3CD8CBAE6E8425A36968E21F4F30349749E0
-205BFF8D552837D6FC39532525370BBAC833F75F1854C93FC533A4AA53ADF7008173A70D94A4EBF5
-38EA9E62BCDA7C20E0A073BEE2EFAC34D2EF1D03BABD5147659E50B557045B2EB89DB303749B04D3
-F54B43FED612FCC68206E001A7AFE90230D9C12F74A32C7EDB5D0241DC3A5D51481FD7C8FAE08FEE
-263FBCED7C7D911B3A303C835AF5FADFD218F61A9D6DE80485ABCA88200047B094441F7767B97A24
-E8C612590FA2407BAB1E8B56C71914EEF2355DD97CFAFCC192BC06FCE063D3D9D1A629AADC75E3BF
-207234C208E7E30663EDD691043065C9CBC473D97C6D4DD3DFF59D6A9ABCDD4412C3128F603160AA
-D8F81C6E7A4DCAF35F3A99B4EA10A34375B477C2BF846521A7EABD4D28078E9340452A198F3F5ACC
-3DB7E3908939FF6E3709C6A3FD9889439A4AE3E10B618CC92E14B68429A3AD2C80940A1079452EC2
-66F254657BE7D79A2A24084AF73F6DF71FBCD32BF6913A3FAB25F977787F7BB0C3A3E8BAB38D7A2D
-B0B4826950643DD1E03BD7DD1FB149A33862A89226B7CB454DAF613128C2075470E42E70A9444A8E
-6ECA526345AB48E6F5160BA23B5BDDFDA6049EC44ED1461C7E0DD514B16E2FB285F72039DE3C7982
-EFD40D7F6C8E8F4CF35AC71B467BFC578002E8D2239A2FD2C4BCCDD8AF3D7DB1F4AE7F2D2E0811DF
-9D0155BA6EDE50B5F052F14F6AB884FFF244D8806C07EBCB49ED22D85DF696995991A954AA97A1EC
-D86ACD76E061B7541E87997FEF0657A826BD88EF3A4A5920462C6595E7A156F453291CA044CED810
-860C3B0149BCE73BECA713040664AD0591304106129600AF71317B0D2907839CEAC99515D357E980
-B1937B6E1200AACADA205421001F1B2F91753E80D2263C56AA164A74701A8D5FD28E46480B0DD963
-A683A1F355D7FB4463C7347C94EA5E2CA40B60B56297CB22D972C5BB10E56715A955605256C1541D
-9F3BC5768A6F355CD3B863F0FA1A781EDB49368F51B29481CBB41D4AEB07AF9DBE8F52C5D0FF75F7
-FB6431D37D6AED84D78C778871CB0F715B4F07580F23B586C969C81B471FF6A6C7276F7E141E02A8
-584D4B9AB00E7BD643D2C3FAAA299B1F1E25048461952EA42D4882768A70DE46B213A287F8D31AC4
-6D5436F22A796C05D1FE50A9BC2A928066627A0D87DD57A3AD91DB446404B41557D1457873482005
-EA20916BBE46C613F456C849D46BA79D20627B446B2F49E3FA309AE14F8C420CFD94922CBC0FB9D3
-5A0F7DBEF577F1849A1A80E0011DA8AC082A8C6F61658E65AD177ABDF23EE17C8CF0D26B9FA3A6E9
-4837EB9E930336889767A8D7EA3CE980A8EA95528B004957BE6067CD9BD8E02A0F23CC1762CCA656
-D33412FF45E917FD4A03EB6E8C1F43FDB0A8965A33B4FD26BC24A20B304CA817E88495BA9B361A3E
-933717FFB0271F7F70C5D3CBA1E86D0F51BF3ABA194DAF32C35C796627D00C7B2271ACE2463E37E9
-7B3C826CF3DB60028F240F9452CBE08F7EBCC5FDB1BCBB3C327A9F450B9E5671916101D6E3E5E458
-CA31F04D12F592F83BADA2C3683D3886AA3B403963AB5DBE220FEC00037A745839F67A3635DFD3BF
-F08F367482962DED88ECF6322852D643A54D5D303EB04BFDDEE9BBA1EBCCBA7C653B3A613A8E719A
-DEBE3CE1BD7E754E5F4977E863E3C2D388A65227B451D4F3A4F94E06513CBA4AC1F2F511613FF035
-611684CCC461599000E546E4D972CA6960E095A526E4735A23421A4C9B597ECE08AFA2753592BD16
-DED93255A1E33DEECE3C5EB77B94670E8137F2A4A4B98AC193258E7DEA5DB8408A806188F2D1DDC4
-40CCF0E9A6E2F0C78FDBD7B68DD4939D2458C1965BF8BED4564B32462FFF3EC892C03B11D3EA813F
-AB4CFBE8D3016329C5B7E3DFED0F08284D44AA0B7A2F6BC96EA4503E8EF52A64C22BED6B452581AE
-8FF8917D53976471941A9116A2D878FB2541B561767ABD4E31CCD8A590CA03494C62AFFD64EA0A1B
-C779173DAD84999C7A8D844EB1259DE7BB5B25CD023537A474A524EBE4660B22568949E624D8FEA0
-AD37F4CE1EC75955EEFA49C6BF1803BE87E9C9865FF3F6B8525B8C15FE8835CA153D27E6C0FF0CA5
-1029A7A9185D25F0F14D86FC797DCC1F99EE97E2054B9C2A2E06FDBEB8DEF6CDD368BF23A858D9F8
-C1DEFDCEAF1B4A8DE5EAFC604CECCF0D285BE00AA912EAB66EFF4D37AD2EFE34853BBFD87CE09B18
-749B489943EECAE7887B006FB827D10191DAD18466CD1F86505879310A8B171F902EA0C26A388E13
-B53C700272CEE2BFB47ACB58247C13449C6BB9D01232C32517358F1A3DE064D43C18F8827D53789C
-CF3CE2EBE78949A6ABFA1A6B8414CE360A5E22AFB7D1DCE6F5A06182C3B984B4F9BB1A905A9D5A14
-83750A1DE0A857CD5C06945EB7D4A2A6BF1237F32A154FDC06D51A703D44FE052FD3C53E9E8F417B
-35D1C851F9203A8997521529F21AD8498F96930AA77EBAF82EE02A57BC77C792D9F220294B45F48E
-A8FD94E01CD25645D36D168923562F3FDC93CB79DD4760DA0C103C2675722D7A1B79FCB4245ED12F
-A0DB52492C9CCE58B333CFEE822812F7DCA68E802C451B5CFAEBAC608B950386B6C58239D1C62D62
-4DD5D15782FC552222CCA06DDF387B373E32C3C2864C63C768350C37283760F3515A5B0AFD66C48A
-B522EB3E808C061F5CD6BD96CD18C9839D30508E7D4EDB88E8F11E31E10919B16B7971F06D7877A0
-58D8A4944C84FC6CAEDF3341B48B6E0D3C7B85D710E0C35F5B5053CF4B4798B3778CC28B2DC7AE0D
-F3A49F9F3BCD8E95D746C35C3F47D68B8AA35D97AA08E711B5FBE70D1A623C82541EBDC51A827D0A
-69E6C049087AD26F256EB7577F58CCFFBCCBA5A95D093DC29464C9A38DE95BC6B1853963B2DEB0B5
-7AD1248D6F1625E115EEB9510B5772AAE4E3C866657DB0B3BF0E0AC345E116F8D4976B770876FFE3
-748C36165522991F46A36F193DD1A1C94713673C7E4C81582391B636C72DE94CE6254374F99B623E
-5686C13D8A8322E83E11BB0B0A896C6A8C2C4F756C5385CD7017F26D23F7C3EE97372C868C8C9155
-81723BB6B76B4C3CE8998E4FA6CA40B633DFDAA59BA902A4952DA90EC4FC3CF0F2676ACFA7F76F78
-236FA2DE10FD3545357215246BB7E527F277C28B353CC6D79DCEF21BCC8F77603CDD58A2CCDDBE3A
-9802F941CED8E035313875319548C41992A2BE939A17CC109426E33825AE59BCD17CB19F50D972FF
-CBE7D9B4B0BB095303D9DC9D406696C2508D6CE99E11CF00F6461147E97449ED5F486D480A86D3A7
-ACECB7E9A945984724EFC21C5079B1FD03ED803C2DEAFCE3327D2D7827715FD65D9506216C88B0FA
-26935E95C64114A51919D419038B1A7E9C1E829FBFB53275093752DF19891A97F3CBF7719C1FD6CB
-17019A6D2D25360ECA804C4B35172662CC4769D2B785C6C87E5A4ECCE31704E59F71263B7C3CAEC8
-ACB4C7426EC25F11A0042323EE6C3EEB04284DBAE2C770BC419DCE79BD4560AEA41571C3B595F525
-60191DC7A8FBF63D413A77A0905E517441B16C2B501EA2F9E99CC38D052679F288FDF1894542E3A6
-6989A0090185EB2E75134BFA3D9147C3DB8A621D9D35E37786853779E157B47F71626D6B3E633005
-9159C17596C1B87FE2B4FF47ED9D78FA4C2160077276C8B58CEF5DC030B4A5D83CF257096C047FE6
-4DE307C598B815058E72D5F57DF5C369E664E137DE29349E2F9DCD8C9F4EBA6E765B6327D7A20DFC
-B20711273FD8091CBA605C4C494248076F7E03DF65A6A50164980BBBB708741E5BF6056E6F996DC0
-7FFF408C5B8EAB8DCEC315E92873228C805D4440A6470E3EE3983758DD211C9CECDBFAA4C9300CBA
-00608A4B2404A3C7AF017A3B7E67F39F0B51ACF950D3E75CC7BC2B8D3480202FA958E8EE0B240501
-5232EE0D264C7CA02C18CA45CB3C2DE322D3EB7F00F9455DB6C5B1F4E59C3E95520EC36D7D903CBB
-625D70B54BF6F8255E412604BBB29FEE026CC660577F91DB1DB4A613EEEFB20CF7AE3CD89D565AC8
-38416B01B5DE4FFA5550D17FB51FBBEBE21CF1D56038863EE931B90DEC2E211ED42BA92EC244D4CE
-2C4EC5CA87A026992772DC2AF754FC982B94F36EA7B7BF75E0ECE90CBB2A6AA1A012E8898BD679C2
-3CB3827C35D5D02F0569C7AA82615D4AA67518ECF668D3B57D6EF1A8013424AC2268BA0D9A74D588
-79EDCF6382A89D397864940303EAEC45A38304BA8B1CB198967AE23EB81054BE74B16909A405E8A7
-799CEE3C270FE2A6DC50BD7370B6B2C8FDB9A87D88D5D40348D3984E39C693B6F4486D994778607A
-80A3122872DD65E40492107C71C3CF708A9717E9EEFAFBDDC239C53AA9645B711038E59C8B861B37
-411AB2039BEDF9CFD00F08D9C5D76154427FF5DD39878CECC5D7BFB3F1F035087185C0981F3C2139
-BE84872FFAD3408531C4EA9387B89F5E3EC779E8850D50992DFDCF9132BC551E985943B07618AC10
-D1150451F0844C0DC41D6E17EB508DC8689EC726400D5A7F6FEB3CC7BCE05F09228B7CB2C5393664
-D8DD9A4B96B1020EF25D70AA2D91CAE93AFB5F2BF0AA18CA5C599FA1A708EF35BF8F7FFEC9AFC1F2
-42870D028B2B1459063B493943EF1283829783E1010242E5CF4DA39D93D506F3892936E7D6CF1124
-70A521D397438733D053944CFF12D6FFAE8246F20618684F263715AA98E15D72A526383E05C23214
-B78338E5B476F0981D90056E6E5D0DB66B1DF2298E597B2ABE1D817E18BEB056E65EDB4234342D96
-00470B1420C9210419D834E431B82F58608C87AC361A02D0F1FE4B470A3D71E0D21BB87E1023D428
-E23D596CB9E1A2184403A16E36E644BCCF9BBDE27290485057E62827283E7380AF786BF395B3961B
-A5EA469C315763FA59E0F176EF81985F38B882DE56A74D128E256D1B89939728E55A92ABA21A6B78
-44FAC1BA7BBDD8B34A18194A2984B000380FE9F672E83EFDBF276FE797A325815B0F25CC95C97A9D
-ACF56D583486305D7C9E51A7E337D14E3B900333EB38FD93A99587DA2341B10C059C71CE080FE753
-3C0F059FA40E560AF9C4A41A4BE6FB45846FF8F78165E10B4AD40F264BCF5596A1E8EF8CB6EA4B1A
-3A5C69059AB1563843679ECB2511A90E8898F54295649CB73D277760D8D04ABACC7BCC6E777A0530
-E2067CCBC08673F9C8C178F9D672AC8A15E5367F0C5651B53E75E0CFA57C931746AE1A679C246D7C
-9417F1CD89DDDBD1173C2F880B7B3847CBCCEBF99F7122E832D7C9BAFE2B54CBAA1ED48158DE3F36
-238B76B0E67644A28AEA996DDC006F6AC0242E4B667639E7523CBC90A0561193C1AF34481C2EF402
-EE43A82E1EBF4E3D601BB36B2D95CD93550D61CEE7A94E72F6D30C32C8F91A61E964B1F66ACFC398
-7F95D4028F116E9A9A8474AA29C1C1A984BE0E393BDC41DCEF6A6F1018DB60D52024899D8EB5D55D
-324D73F39BFA47377B9E15B3B06A7585589FCF52A54684173E5183367E7B0952DC4BC2767C4C6247
-B1D6103E52BC7B7EA6298F454C5D97AC575F19C10ACDFF4E10C7D3755CFAB4200CAC545269FF1D8D
-B0D607C7AD47F40DDF257AB4E7D0750577003C13E4941960C3DD7B0774DDAC18E8ABAF8F53E03CBE
-F6D57B44F24CF821014C064278FD51B3427593D17694B4ABCE81F49CBB984C5878CDF0C38D1ED7FD
-99B0B9A3BD8D8FF6219588B3B8FA59D0CDD1D9B2F65122AB45E48F1757467B9204926140E3C350C5
-A927A2E700173053EC35D3F1DA2D7258714C97FAA857F0898917BD94625C6D1E2D77138EFCAAAF51
-7B17FE187A2212C24A881A2C6A647DEF6376ED80AE4175C5EE80921F001995B44E49F0D33DD9075A
-CF33BB03671C0BCC34AD5784AD1CDFED3A6D9BA103B3DDC1CC2DE74DBB576A0277715275218CD19C
-A8899209125266D8BF1286F881DCC2C383749D1E768D670F4099F7DE959EDFE852583183C9111601
-2881A56A24AAF020EA45CD5F39660DEBCE30AC1C7B8CFC60387B1B0C3E361BE612FDFA9F01B7E4B4
-A18839A2C7E0E393EBC5AD9A8A4EBC316A740C1C295D9EF5F4DFFA0667F9582C0BB837B142C4CFC6
-B1798E9476D0631111033B8BA75A10FDC800E2AB1E0E829632F869CFE4737BE9E2800759EE0831DC
-7D1195EAF80555771981DD6DC6606812D92CB8EF86447F5F6C6F626D0E265C67E52A6319189EE349
-D48E49DFE6A9E98F76C414A1E3217AE0A215A17E54AA498F4ECDC50242ACC7E2322F63BB2FF2189D
-057E7354E32A3ED1803116176B9B9D0129930F919E2FEC280B2C8924E49E7BB75768A2EE1DA8ADBE
-D4E3589906DF1B923AEF84C1BD327438B731012E69BB0D43A1842CB88BB54EA4516477F704CFEB28
-6E3EA483445AD4D74586FCF32E96D366901084365F693A53C5FB532FBFE7BC0CADC404C4985042D6
-8DBB90A6DCDA3531EE324D558A214F935CD9FCC9A0CEBE9B5FB0323F4B3820529599EF48EE068B5A
-CE85004FEA2984F0A86F5AC9D56163BBFE1142B774148F1EB0A4DC89C3349052533A7DE66729DB24
-41B82F8F7360111DACF69293C9B281A0534F3E9E9224A75C49A832F28B2E497262475507B6DDFA9F
-01CA0A6696E3F5AC7EA68595EBA0C2EB8A47813FF936D84AC1B23ECA7AA2862B793CCBB0DF9FDD49
-31BEF354CEC12FBF478559FEC29F81ADF4452E83963E56541D31F3691C93A50F0BBA5E9552C4F2A2
-3A6E53060729854A3DD71CC4308B91957DB19E66AAA18FA67055A950F1C2CFF78A03BC1A588CF624
-696068068719AFB1001C4581EE072113882D9052B21E355D401ED8CD24D067B99E616BDA5A0A5A93
-36FC499632B79FF2FD0DEFB096EF46B75E2D4E0F48DAEA239719FEC4D9A29818F5875FC5041A9EDB
-D26CAF0ACE14CC80BA49BBA59E918EB3D8F1E541AA16026585A2F72DF7D83541816DE46981FB3EFD
-0C30E458CFAD04C79421AB7C4925E23AEA07F9F018431C790002596D26BD9663B51B699DF53E4882
-CBC34EDE88EB55045B889B6062E35FD1E018BCE785157B85EC3B9CA6C85D4B16238275385B8285DB
-012D8FB7C9F5B946A41D7A0FB878FF72C39683144D8A007CFF631B43748F2D5FC690300F9BC0C837
-006B92ECEBE0605E8C3A4A400E18AE8997D1B45FEE10068E247C647CF82C6DFBE5E881D511FFA687
-B7AEB78546BFD07D5F7EC242DCEF4930D8AAAD8C6152B6642AAC325963FD147F236BB850A9966573
-9D06CDBD7CA79A527DCF461E33F22BC9C5DB00DA2BD3DDDD8C99D99793BC98282AA8872FF96C3942
-85D82D9419EB78B6AE37A5F519397700F75D624A09BD255B576E955A323E784E8FC31131F003B0E3
-024A4F58FEF2A6C043796201FC425482E1155E229D1B2D43EF7B0D22322B22EF5C9A1BE026A1C3D3
-75EDAFF99597E1E5477952A4E8D2ACF5D014BC00DC2A272FA62B6983E27D228881E2EF2B8B95A681
-CBE90C5FDE16331C85222FE2A16F0A3C3000A63E2E21666C0C119F8AF89A543D37977069A5ACF155
-6324F05204CE8CAD50FF4FB630D9CBBFC324DEDA584AA56A99D3A76FF55BDC2C2EA3A021361CCD4A
-83C7A5E2768D210FA6DE889FD48A39D679C94EC3C99A8D33FF11377DA7F6F1B71A2A05B302ECDE95
-4F26773F39AC881542F0D0969C3995C3519A8EF70B4220D86BF01BEECC6462855E7B686E1AFF1CA9
-1FB8FD8B4A69E10EE0C2AD94ADD44449506F9B6EF43641F2026EFF6E605C670560C2B74706FB949A
-A7E8CC6A2D0D6207E457E7FD87EC1B9092DC68B9143947CC8ED14AFDDCBF8FDDA228A76847F96802
-E561F67CEEFDE45AE587673983FC04C96744DBAA83F2DC838D633943C75DCB9E6410474EB27B348F
-26E505F0AB90878940E846C5E9F3C5FE8C3558C3236B1B88C405716949B8506841CABE1717474BB7
-C30DB91CDEE33B0F844811762FAEC535BDCF84C1C747CEF9B1FA61D2AFB5A81335BC42C06A94D7D5
-9B7EDE55BCF6F9867AEE107555CDD084B7684C2C87087475A39A9DA6347BE281CE5635A4D07865BA
-98CE26C1465B1AB0343F49FF37B4D0CA9F3BB693D78DC3B21925CB996A038DCC172527FE57C07460
-EF39C07D4396E7FA970D9F22ABD21A9C794B64AD96762C7428F59A8757C36D6C4FFB23216195A04C
-2A2C2E7B10EF7193931544D782FEE4B91E01119C5553BBC6252270A8D8C56DD62D448F5AD8DC69CC
-B45E1F17F0AA1E445129DD00F000005B23D38DE93A3BE55A4C041947F36B4E4536E307D0180553F9
-2E46B743881CB5D5386C48C7D5F84C2BCD06B9C501F78C7EE61FA23516791FCF4DB278AF688A2E60
-10A56692AD92008497487EDFE4BD5FA083FA544138B20D6940020887E35D46E093B71F7A04A67460
-DC8116B4D4839625D7CA6959D6831CD93F81AC4EA2709036DD738364FDE71113BF22EBF13DFE1642
-E564701E6F0FFE7511EDF03FE448C2B28C64FB7D54B94CA576E481FA56B2B18AF10C71F699B6BFD4
-7459CDE1869D0FD306BF489A6F42E5B2F05CCF55BB6B9526973D19CB134CA7F13F1DB3716F8CC217
-73A832568C16250B5CDB16DF24BF81D49F5B37018BD310262EA7078107868AB0216CEC83CEFCAB1E
-9F2C665A31585CA04DC01879CAA79AAA5AB201B516F7052B01B16BEE5606098393B0E5D9F9E5E3F4
-EB20F63C958E796DF41CF28839F5C62A0431648745D7837B519F3AA36BC6C08EF040CCF53D9B6D8C
-0C7D1A84D707EC57A3C6AC9A62AB37251A01A5ED40FDEC6F5BE6E34C6A91D058319439778A2EE5D0
-363E2E1F33463C33327D05FFC0CBF08D5BC457C7230448972FB9B4D0D782BA7DBF10D3FFEF8BF523
-6EC16D4DD6D0D870D9D5EB5C64C9A46A4F583D4F831FEE74B0E5B33A09ABFD4444929BD8F638CD72
-EAB99CF2E9551DF427683964A592E49D186F285258C5D5F62196A98532421D73E3495F82695FEEC6
-E1952C562D546B28618FFAEEBEFF03A57F4D855021F85B0C7BC37FCC6DA9AECA099B646B99D41896
-09D3FF2D56422F8C37E97640293EC7C90E3380887836F4938FBF495CAC14FBA5648D89282D8D49D9
-1AF73ED36581139D8BD42551E263E830EA3C6EB381D85C42D74C50DB0CCAEC03F535ADE92128A016
-0E811C34748309AF7604919B66CD43EB5CA975302DCB6076FEB6BDD6FF55976FE990FB0CE9ABB11B
-195403FB26E3D6C6A0DE1C5BE79E171A61E21F79EE8DBE7A832519813EF6B33EA098C2C32ADEA219
-AB2AAC8B093F40000995539D1276D5F2EF84CCD099B71FE4269BDBDB6A8D59C86F7D2E3FBCCF8773
-D0FAE97640BC1AD43CB4B992BFADFB09DBD0CAAEB8CD9DA264187C4F97300E9A6C9DEED5525479E6
-05C65AE336CBBDF4E5D7F79AD098F977285E065579B748FEAA97F2A753E1F962FCAB68D72BAA8EE4
-FF6691C23E31BC0F3E981A96FB440404856AE1AB32A7205B17D411D8F21C8C93B704D07EC594422A
-BC368CDA2B1610CE6A973F4474E12B78B532666797F5755D269772C9F5400B3BFC6C58395D38527E
-2CCCF29B56123F7DCEF3BDE5DC1DFC5B0293BB125085B1D2D929BC3EE84F4FAD571A4991C3DEE03F
-2DB3A3097E52B1A7D5C73CCB6148EAC62E8E36DE9A71C57638C6E4D5D9DED18174E8C390E50B4A5B
-913C074EEAEBE390B214B3A68F02862B9A296DB4B409769649E51D738CBBDFB7702E15C73C2AFC6B
-C37CE15171F4E822CF20EFE55D9F061AA43E648989628FF79E65932390CBB15D8E621333B18B11C3
-BDF96F841D7434E01AD501FEA964A75B248A35CD9DF9A37E48A1E5A09C624B93CE44F0042FA00D7F
-9EE89B9F7AB785E9C718CF6E7228F743271C2C9BBA17E5208B920E44E765D99D86650EB454B0FAAA
-112753AA1BD3A24239E9C5FC47EEB1547AC9D23731B8DC48B9707830DAEC60C8D3790BBA1120F776
-4EFAC542CFFBCD5C05F9510B27B2534B704ECD36C8B041FD49A96881302FFF5B0163A2DD09C751D6
-D6AFEA9170A4F4C4AB8D46E62F763FE1BDA51DD1CE4A27E772F3A2869155F762FF26B7AA6FCFA4F1
-292E56F03AAB6322BF867E7710C34D43B5D85B45AA68014AD7879EED051B1933E491496E3E26D9AA
-8B80A07BF2B94F1077E84A9726F08199887D66DE7A307BF33C30DD9CF3DA188088C03B2BAD09A217
-6B110DB2C868B53DA9A66C85737BA66C93C58A259860E294AD0191E3A72C73F40B0BD98699AA08DA
-F03587B78F391F3A4313C58D9F29B53C70785637BD0C58310109C54091AB0A34CBB0C478613A7AC0
-FB8F0A8B4645AC966395D8BA775262CD291136AFFDDF01C1D83DD4EB3B59CCAD18057FE7D92A8CD4
-A58F22508D9FD7CF356571F701BBB23E749BDDCBF8A317FDA0AEFD952BB18545610FFAD3AC143D35
-1B8DB3F66293375E0E50235F0D0466932181D377EDD32A5F0FFA4E22B5A0CB4F343D9A7E4A342E9D
-09DFF6C697630CD3971802C277A5590B8CA94BDE6B38446C794D072BBCCB724D5BC208EEF1B018D7
-39373BB910D668882CAA779C2D686081DE6A2606417B54D7C20E0E7F722648D893E4EDBAE8F00D6A
-6DA3712F91AE860C756D1127D133AB828E9D80023B50B162C5A1C5CDF70CCB3FDD7EA060ED20838B
-E1E50C4094C9E79E1A0187CDF780CAF45A725964F004253E034C5BE46BBF89D94631F1A33BAA35B8
-4FA2A9D08481C6674126CD96ED05DCE48BDA069D902D6836D5DFBA701DC0F98A863E64F0E312145D
-8DC0B77F25B43AEC729A1243B45B08CA228DD6101CAA2AC5ADCC8EFF84A4CA3F254176C2CC711EE6
-C273835D0FD3528ECA2A976B88E51FE347FDB60F32370B66D338931D6581630ED586F349C638960C
-31AE4204E89521A96E1219E696B913DEB2AAB7A3B022D06F34FDFCB810A04E60A4FEBE284C2F063E
-0AE9EDF87704921CCFA193BDC912B747E13570066223A49F1F6E2AF0D4D65DA04CA876FF7A462FFC
-9C0BA2CC545C3BD36DBE762F32B2D6BE5867C59F479195C92440DC165098B74EA5C3AD93CDF2D410
-B04C16BC7801E7956F4E5107450787AA592493171C3628E6B8F49D4F8429EB98DC52EF025F001387
-BC1A7093F7A99F10B5D2D7DD8BBB393BF6E56F08F4F7FA1A343F220D5A1EAE7168C74D41BE1DC1A8
-3BD65B72B982F4F7B34F24F97F9EC9A91011064031FACFF2A14921A32024385F4E061CD07D152E74
-1BF97156D951A342488FA7F5EF934CCAD13E2753A0AB7A1F565C2F7F6B349DF03BBC25BBD972A9AD
-F809BB5C5048A8CCEF9297B2ED3324D18867F293CC66E88B3A39D107B610DFE79A3B4E83A96D3D52
-A17FE8A62C9FDD271130148366942C9CE57558D023DA5F7501319EBFA33DE9E6D1E76D7C20DB8A09
-B657839DA99F3D8143F1EE6253A3295C9651FA4366547893C2DC7ABCBF4BB7609DE5D001E0A36D9F
-FBE01F7D0903B3208AE8547E2E5F14EC1AF4C2535CA8F4EA37E3F3CE172C7A1E8308995B1CC23E6E
-81190246BCAB6E755BF868D449BB02A2AA87C44C9CC0F571ADC72547CEECBE104BB274B8AC16DCB7
-5D5F458D356466B921ACDEEAE384E2EB1DF6EF393B41B9747F0A4FAEB4AF1928D9AD6FB7E06FDC62
-1E4C6FC98CFB43F88584BD55D9B97CC9549093EDE586912161931162B1B1D52D0443260DABA02AF2
-B4432100D5506546013DA703573FA8013685CC798CE501960093DED713FFCCF89CA2B9106390198C
-29A00864108CDCC1984A8BAB53919028C01B26ECC7925E38CBE6CCA8978EE21C2B06E7B3E48FBA97
-8E2A7D186E563C088F84AA23178B60E4729EE87D67B1091F3B6973676C1CBFE6530EB773C62E2C24
-97014AB0E8B71A1F4E86A378AA26591511BEE3CF3D64C94848582E1354E1605B6457823F2C5E640A
-D3802946BB2E7E8E594E8C04B430C2385DD40746CE8534F50842E74D7115F3DB0C72D1C9C607C657
-3B094AEB73B7A79876CFFC3E2F8C9FEAAA07D3BFCE05B61F7749A8793BE90CCCECA2D7077F25E899
-D3331FE161A7E86C842495D584C6E4A0880B2951D8A13B88C4672080A0B1BE36BF47C3ACE7288CFE
-41A8C1BAA6F0814A947FBD6B3AA72B6C73A8C578CA51CCC96F2352316C467BB960E981F2B6485BFB
-44B577E71EFDA16E7405954BC7C9F0759F5A9F1EBCD2FA9CC9648D5831A68887F41B15081A204C24
-B4B992A231DEF9E698D4C3A25B6F5474F5BE6A601F2D337A58A0D21FF37FD91EB86D1D738893A03A
-69F0CD743F611CDFFE69DB2C6ED0E4611D56F803BB0DC06E7FE85A303839612707647B1BE9FAF8D6
-84122CA9E5CB8BDE2936D3F4FF254D31529D7538BBD4D35539489F9E7316F24214B996BCDCF1818E
-749A71CF0E8845AA1E2A58AA62A48E02BA4564625D20AA220EE719608521D7D7A7FCA0BD8904A401
-9819D371F3F59D46C1354E5FC1A6E5F79B20CF4ACA2BF0F2DE73DA193A6F9ACBFE0B4731C4BCEBE6
-D96FE822965DE965232282A3A130361F188B3AABDA95A8A2790D9240BE008B6A6DE4BBFCADA05B67
-86B9BB8E0DFA0C30043A3B07ED46277E07B9808422C8ED16758B9C396F4EA929D769785B2C9568E5
-70A83B989B25CE200F1727D41E2B702E7F88F1784F4C83FA60A74EB26B2DA95126E508ED519A61CC
-151DB6804F61826C5F86D8FA89D06E526FED97A0DB88EDB432FF32C1ACC9B622EEDF601081AF7B96
-3C9CFC1D13E4A9C74FEA0A1C8E3D8653CD92A944D4CA6B0D306619AFD503506D77732D6514F604BE
-4610C2560931BDE0B40939BC1D126B0E97F72AE1B4A9252123B54F7A27E0CFA4425B4546526FD741
-CA77952B10D13E0AC2E32006A903808FF0CD013F936238C74CC75FD915244C56A8412F37F0134840
-347699508D6F3D7F3203A25B7C70100719582CD588590EE34B3AB13E255B613A6D00386A0104CC5E
-D2C646F09A88888D3751651D5646C5227A3C80E8DA1B0A331121DD2429F1F4775D30564DFF47D01B
-BE2C6C72CE4D1FD9A2077C04D2B0274B8916F6A9D1A4A6964A534F47CF241D5A8E34B23F85BE9ACF
-FC2FEA961F277539F215F8728D6788F67BEAF45502839BCF23D8763C3949352F00C579A9A4FC408E
-C625E310DAE61512DFE6844E82D36A2F81709E1F05B38AE9C222ED62C961EE63593CED7AAF73CE2E
-D3667740C77B309B93EEFE1B4BA65D48575A66BE86743DC9E5D3C2FF418D11F7F211B86E827EE1DF
-C3613E7498030F07050524536D1F8A94DDB6698BE7B963C55CB3F74B676CD815A7B3DF4B1A0EA2BE
-1B0B9A11FFBFD5B1FA49668AEE14629316AF436A0821C20BEEF7B3480847934A99F6D85B68F4DDF8
-859A754E009428AF89A90D1852C220A607FF0806E8080726EDC94D691D214B4521C147C4273AEBDD
-BB4A697EF16448CD9B2FC95293305858DECFD406B89B9F3FDAE2AC579E80CF321EBAE5701FB2F7CA
-D8ED04B4A63115886D45D6120F69AEF1A21D80AD3C2D35D2899F1902242B96CD349E0AAADA40F7A1
-1282B6B52BDD97708E58DC5E2D22D1153E5FA3F3B300BCDFAF98DEC2F4E3C82A1C85F985735F3987
-4F557579F422664E07CBE19DA680EFB0FC82C323EC5C4644C51709AC8D674608A8043C91E6C7988D
-430F10BA6CE1FC7FC0604FCD8F723895250AEC36CC35B3FA14FE2A0D24095DCC30B2093F2298F5F0
-A97676A0BE66C3DC9ADACFE2FC0F721A20E945AFC1096A619075D5E9A264C796EC6C90EF1AEEA8DC
-089B44FFC13D27CB2370070A52D4416C53F364393E46EDD7EDE00799960CE6E0D57E4909E88ADD64
-BDD2B0EBE2D73FA6ACF8B40280DAA0637E705C65AABD523B8815F22F23E9FF81E7829C7E4BC980C9
-143AEBE1A04DC0D253396BBB7268BD5AEEA356B610D5DCEE03135E00AE34388251F31714A1C40E18
-2652C48CDA2211A22CB6F02490E69A44CECB169754C53B16028D352E0119F5D5FAE0BD7EA1CDA647
-12A6147374B64244E21E9EC9F0D1381AD22D5B6212B26C3F9AA5F6045F25DD9F5EB4489EA39B1945
-331AC70510C5752557DE21D0A6CFC1EB10A98FA867B76DA6E4249469F591FD154D39E89364A43DB0
-07AA0D7A911CFAE6CE2B557997FBC44F55A27F622BD7B8B10EC9F5D10F2649A646FD964AE1B111B3
-5B46A252C4DEE44E7426EB5739F24E8A390694597DB3A1FE7800C97E59558322F0E49A0CCE2AD94B
-1E2D1026AFA771723E3F523916F55ED866C9FB4A2F759651C613A2CFF362028CDF9D38F05D4C7C60
-24C533E930B64B099FB1AF04B01F5FB9CA6867E6EFF55A772C5391831059987E10CBF987E3F378E0
-1329F73D54DC0484177D3C3C06F67397955FF1CA4EF8AD1606B70455255D631A7D6EB92BFDBA14A0
-FF28B2ACE7E81AD666EA9B3A0F5A6BA3B5DFE35044FA4B3D8ED956009C60E98CC132F2E84967F4A9
-8A67B336D5EE7CAF7DD1F74D1FA08619941361FA7312CF225D89CEF97E864C8369EAFAB94D97F056
-5505D825972B754F6729596EEA91210B75DD8F645382ACE36DE60819A02B3B48DD00F5485F9264F9
-FA926D732E2C267B0BE8CA98526F124F97EFDB86132C5EF16B103908172FC51F286FFE45FF253512
-E0033F037FF182BA536A9EB2DF2D1DB257D9C86C46E1B002FB32AC70CA9462E6EB48994752CEBCE3
-9F08ABD4F4B0889283E55500702185A841E328
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-cleartomark
-%%EndResource
-/Times-Roman-iso1252 /Times-Roman ISO1252Encoding psp_definefont
-/NimbusMonL-ReguObli-iso1252 /NimbusMonL-ReguObli ISO1252Encoding psp_definefont
-/NimbusMonL-Regu-iso1252 /NimbusMonL-Regu ISO1252Encoding psp_definefont
-/Times-Italic-iso1252 /Times-Italic ISO1252Encoding psp_definefont
-295 321 moveto
-0 0 0 setrgbcolor
-/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont
-<4C61>
-show
-362 321 moveto
-<6469726563746F7279>
-show
-556 321 moveto
-<53414C4F4D45325F524F4F54>
-show
-962 321 moveto
-<657374>
-show
-1032 321 moveto
-<737570706F73E965>
-show
-1230 321 moveto
-<EA747265>
-show
-1318 321 moveto
-<6C61>
-show
-1369 321 moveto
-<6469726563746F7279>
-show
-1564 321 moveto
-<636F6E74656E616E74>
-show
-1772 321 moveto
-<746F7573>
-show
-1870 321 moveto
-<6C6573>
-show
-1940 321 moveto
-<6D6F64756C6573>
-show
-295 377 moveto
-<6465>
-show
-358 377 moveto
-<6C61>
-show
-411 377 moveto
-<706C617465666F726D65>
-show
-644 377 moveto
-<53414C4F4D45>
-show
-866 377 moveto
-<322E>
-show
-920 377 moveto
-<4C6573>
-show
-1009 377 moveto
-<6669636869657273>
-show
-1175 377 moveto
-<2A4D6178456C656D656E74566F6C756D652A>
-show
-1661 377 moveto
-<736F6E74>
-show
-1761 377 moveto
-<64E96AE0>
-show
-1861 377 moveto
-<64616E73>
-show
-1969 377 moveto
-<6C61>
-show
-2021 377 moveto
-<62617365>
-show
-295 433 moveto
-<6D616973206E6520636F6E7469656E6E656E74207269656E206465207369676E696669616E742E>
-show
-295 551 moveto
-/Symbol findfont 50 -50 matrix scale makefont setfont
-<B7>
-show
-370 551 moveto
-/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont
-<4D6F64696669636174696F6E>
-show
-659 551 moveto
-<6475>
-show
-738 551 moveto
-<66696368696572>
-show
-896 551 moveto
-1 0 0 setrgbcolor
-/NimbusMonL-ReguObli-iso1252 findfont 50 -50 matrix scale makefont setfont
-<636F6E6669677572652E696E2E62617365>
-show
-1434 551 moveto
-0 0 0 setrgbcolor
-/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont
-<706F7572>
-show
-1553 551 moveto
-<72616A6F75746572>
-show
-1737 551 moveto
-<6C61>
-show
-1801 551 moveto
-<76E972696669636174696F6E>
-show
-2060 551 moveto
-<6475>
-show
-370 611 moveto
-<66696368696572>
-show
-535 611 moveto
-<696E636C756465>
-show
-716 611 moveto
-<6E676C69622E68>
-show
-891 611 moveto
-<6574>
-show
-962 611 moveto
-<646573>
-show
-1063 611 moveto
-<64696666E972656E746573>
-show
-1310 611 moveto
-<6C696272616972696573>
-show
-1522 611 moveto
-<4E657467656E2C>
-show
-1714 611 moveto
-<766961>
-show
-1809 611 moveto
-<6C65>
-show
-1880 611 moveto
-<66696368696572>
-show
-2045 611 moveto
-<6D34>
-show
-370 668 moveto
-<636865636B5F4E657467656E2E6D342E>
-show
-309 769 moveto
-/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont
-<6563686F2074657374696E67206E657467656E>
-show
-309 813 moveto
-<6563686F202D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D
-2D2D2D2D2D2D2D2D2D>
-show
-309 857 moveto
-<6563686F>
-show
-309 901 moveto
-<434845434B5F4E455447454E>
-show
-309 945 moveto
-<6563686F>
-show
-309 989 moveto
-<6563686F202D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D2D
-2D2D2D2D2D2D2D2D2D>
-show
-295 1106 moveto
-/Symbol findfont 50 -50 matrix scale makefont setfont
-<B7>
-show
-370 1106 moveto
-/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont
-<4D6F64696669636174696F6E206475206669636869657220>
-show
-849 1106 moveto
-1 0 0 setrgbcolor
-/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont
-<4D616B6566696C652E696E20>
-show
-1087 1106 moveto
-/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont
-<20>
-show
-1099 1106 moveto
-0 0 0 setrgbcolor
-<706F757220706F75766F6972207574696C69736572206C652064657373696E>
-show
-370 1166 moveto
-<6D6573685F747265655F616C676F5F74657472612E706E672064616E73206C2749484D20646520
-534D4553482028766F6972206C61206D6F64696620E020666169726520737572>
-show
-370 1222 moveto
-<20534D45534847554929206574206C61204272657020666C696768745F736F6C69642E62726570
-206461616E73206C65207465737420534D4553485F666C696768745F736B696E2E70792E>
-show
-294 1323 moveto
-/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont
-<5245534F55524345535F46494C4553203D205C>
-show
-294 1367 moveto
-<20202020202E>
-show
-294 1411 moveto
-<20202020202E>
-show
-294 1455 moveto
-<20202020202E>
-show
-294 1499 moveto
-<6D6573685F747265655F616C676F5F74657472612E706E67205C>
-show
-294 1543 moveto
-<666C696768745F736F6C69642E62726570>
-show
-295 1660 moveto
-/Symbol findfont 50 -50 matrix scale makefont setfont
-<B7>
-show
-370 1660 moveto
-/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont
-<4C65206669636869657220>
-show
-578 1660 moveto
-1 0 0 setrgbcolor
-/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont
-<61646D>
-show
-664 1660 moveto
-/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont
-<2F>
-show
-677 1660 moveto
-/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont
-<756E69782F6D616B655F636F6D6D656E63652E696E202020>
-show
-1207 1660 moveto
-0 0 0 setrgbcolor
-/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont
-<646F697420617573736920EA747265206D6F64696669E920E02063657474652066696E>
-show
-1862 1660 moveto
-<20>
-show
-1874 1660 moveto
-<3A>
-show
-309 1765 moveto
-/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont
-<69666571202840574954484E455447454E402C79657329>
-show
-309 1809 moveto
-<202041434C4F43414C5F535243202B3D20636865636B5F6E657467656E2E6D34>
-show
-309 1853 moveto
-<656E646966>
-show
-295 1971 moveto
-/Symbol findfont 50 -50 matrix scale makefont setfont
-<B7>
-show
-370 1971 moveto
-/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont
-<4D6F64696669636174696F6E>
-show
-662 1971 moveto
-<6475>
-show
-744 1971 moveto
-<66696368696572>
-show
-905 1971 moveto
-1 0 0 setrgbcolor
-/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont
-<534D4553485F535243>
-show
-1178 1971 moveto
-/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont
-<2F>
-show
-1190 1971 moveto
-/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont
-<737263>
-show
-1251 1971 moveto
-/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont
-<2F>
-show
-1264 1971 moveto
-/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont
-<4D616B6566696C652E696E>
-show
-1552 1971 moveto
-0 0 0 setrgbcolor
-/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont
-<706F7572>
-show
-1675 1971 moveto
-<72616A6F75746572>
-show
-1861 1971 moveto
-<6C61>
-show
-1928 1971 moveto
-<6469726563746F7279>
-show
-370 2031 moveto
-<4E455447454E>
-show
-592 2031 moveto
-<6FF9>
-show
-664 2031 moveto
-<6C61>
-show
-723 2031 moveto
-<6C6962726169726965>
-show
-904 2031 moveto
-<64796E616D69717565>
-show
-1149 2031 moveto
-<6C69624E455447454E2E736F>
-show
-1481 2031 moveto
-<7661>
-show
-1550 2031 moveto
-<EA747265>
-show
-1648 2031 moveto
-<636F6E73747275697465>
-show
-1868 2031 moveto
-<E0>
-show
-1912 2031 moveto
-<706172746972>
-show
-2043 2031 moveto
-<646573>
-show
-370 2087 moveto
-<6C69627261697269657320737461746963206465204E657467656E2E>
-show
-294 2188 moveto
-/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont
-<69666571202840574954484E455447454E402C79657329>
-show
-294 2232 moveto
-<2020534244495253203D204F424A45435420534D445320534D4553484453204472697665722044
-72697665724D45442044726976657244415420447269766572554E56205C>
-show
-294 2276 moveto
-<20202020202020202020204D45464953544F204E455447454E20534D45534820534D4553485F49
-20534D45534846696C7465727353656C656374696F6E20534D455348475549205C>
-show
-294 2320 moveto
-<2020202020202020202020534D4553485F53574947>
-show
-294 2364 moveto
-<656E646966>
-show
-295 2481 moveto
-/Symbol findfont 50 -50 matrix scale makefont setfont
-<B7>
-show
-370 2481 moveto
-/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont
-<4D6F64696669636174696F6E>
-show
-665 2481 moveto
-<6475>
-show
-750 2481 moveto
-<66696368696572>
-show
-915 2481 moveto
-1 0 0 setrgbcolor
-/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont
-<534D4553485F535243>
-show
-1187 2481 moveto
-/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont
-<2F>
-show
-1200 2481 moveto
-/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont
-<737263>
-show
-1261 2481 moveto
-/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont
-<2F>
-show
-1274 2481 moveto
-/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont
-<534D455348>
-show
-1432 2481 moveto
-/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont
-<2F>
-show
-1445 2481 moveto
-/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont
-<4D616B6566696C652E696E>
-show
-1738 2481 moveto
-0 0 0 setrgbcolor
-/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont
-<706F7572>
-show
-1864 2481 moveto
-<72616A6F75746572>
-show
-2054 2481 moveto
-<6C6573>
-show
-370 2541 moveto
-<6669636869657273>
-show
-541 2541 moveto
-<717569>
-show
-626 2541 moveto
-<7772617070656E74>
-show
-834 2541 moveto
-<6C6573>
-show
-910 2541 moveto
-<617070656C73>
-show
-1059 2541 moveto
-<6175>
-show
-1128 2541 moveto
-<6D61696C6C657572>
-show
-1315 2541 moveto
-<74E974726168E9647269717565>
-show
-1600 2541 moveto
-<6465>
-show
-1669 2541 moveto
-<4E657467656E>
-show
-1835 2541 moveto
-<6574>
-show
-1893 2541 moveto
-<6C6573>
-show
-1969 2541 moveto
-<626F6E6E6573>
-show
-370 2597 moveto
-<6F7074696F6E7320646520636F6D70696C6174696F6E2F6C696E6B6167652E>
-show
-294 2698 moveto
-/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont
-<69666571202840574954484E455447454E402C79657329>
-show
-294 2742 moveto
-<20204558504F52545F48454144455253202B3D20534D4553485F4E455447454E5F33442E687878>
-show
-294 2786 moveto
-<20204C49425F535243202B3D20534D4553485F4E455447454E5F33442E637878>
-show
-294 2830 moveto
-<20204E455447454E5F494E434C554445533D404E455447454E5F494E434C5544455340>
-show
-294 2874 moveto
-<2020435050464C414753202B3D2024284E455447454E5F494E434C5544455329>
-show
-294 2918 moveto
-<2020435858464C414753202B3D2024284E455447454E5F494E434C5544455329>
-show
-294 2962 moveto
-<20204C44464C414753202B3D202D6C4E455447454E>
-show
-294 3006 moveto
-<656E646966>
-show
-295 735 1 264 rectfill
-2125 735 1 264 rectfill
-295 735 1831 1 rectfill
-295 998 1831 1 rectfill
-280 1289 1 265 rectfill
-2125 1289 1 265 rectfill
-280 1289 1846 1 rectfill
-280 1553 1846 1 rectfill
-295 1732 1 132 rectfill
-2125 1732 1 132 rectfill
-295 1732 1831 1 rectfill
-295 1863 1831 1 rectfill
-280 2154 1 220 rectfill
-2125 2154 1 220 rectfill
-280 2154 1846 1 rectfill
-280 2373 1846 1 rectfill
-280 2665 1 352 rectfill
-2125 2665 1 352 rectfill
-280 2665 1846 1 rectfill
-280 3016 1846 1 rectfill
-showpage
-grestore grestore
-%%PageTrailer
-
-%%Page: 2 2
-%%PageBoundingBox: 18 18 577 824
-%%BeginSetup
-%
-%%EndSetup
-%%BeginPageSetup
-%
-gsave
-[0.24 0 0 -0.24 18 824] concat
-gsave
-%%EndPageSetup
-%%BeginResource: font NimbusMonL-Regu
-%!PS-AdobeFont-1.0: NimbusMonL-Regu 1.05
-%%CreationDate: Wed Dec 22 1999
-% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development
-% (URW)++,Copyright 1999 by (URW)++ Design & Development
-% See the file PUBLIC (Aladdin Free Public License) for license conditions.
-% As a special exception, permission is granted to include this font
-% program in a Postscript or PDF file that consists of a document that
-% contains text to be displayed or printed using this font, regardless
-% of the conditions or license applying to the document itself.
-12 dict begin
-/FontInfo 10 dict dup begin
-/version (1.05) readonly def
-/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the file PUBLIC (Aladdin Free Public License) for license conditions. As a special exception, permission is granted to include this font program in a Postscript or PDF file that consists of a document that contains text to be displayed or printed using this font, regardless of the conditions or license applying to the document itself.) readonly def
-/Copyright (Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development) readonly def
-/FullName (Nimbus Mono L Regular) readonly def
-/FamilyName (Nimbus Mono L) readonly def
-/Weight (Regular) readonly def
-/ItalicAngle 0.0 def
-/isFixedPitch false def
-/UnderlinePosition -100 def
-/UnderlineThickness 50 def
-end readonly def
-/FontName /NimbusMonL-Regu def
-/PaintType 0 def
-/WMode 0 def
-/FontBBox {-12 -237 650 811} readonly def
-/FontType 1 def
-/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def
-/Encoding StandardEncoding def
-/UniqueID 5020945 def
-currentdict end
-currentfile eexec
-E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942BF7D6DD84F1664B89
-699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED2AC419FF2B2BDE605B8EE3264EDD6641
-2D4F21C64AC522BDFC7C5502F9C3F3E5592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A2
-5032519D1868816E44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF
-9CDC7A1B1B598C69131DEE005B415805A16D8A123E6A2261C63C769D2F4B60FA2C438AD7D199D8E4
-5F7E7C9A605C8CA14E21FCD81C9A515FB8DB6F99604534D06EA9D87FE0FAA852899C9D0595C7A97E
-6C55F79FAC45CD38E87B10D210CE7501E88C8FCD3444354365FB893A12F596AE2C1E70D5819EE0D0
-87D10BF8DA96F3DABD5405D28C4228C6C31BA4052464859640933FEEFD8071C0C84CDD829A9B1D0B
-A01F25A4D50EE2EA2B45160CA6333B2D2800306ED2BEFDFE155E9D9F9342EB8D5B0ADBF2460CCC98
-643FB1287CCD28ABA7B5CAB92EC39EE2E918990372B16F8487EBA30EAE88708B6CF33B6C015D8096
-C7CFE2F139F52052E3925C0D50FD64CE68236D59CB83EF56BFC584150EC38065059F3308AD6F9A99
-F83EF4E6CB13855C8175E31417D190D036B387D3952344A950F4D8C7781B307A094DF1ECAEE4D2C2
-FD747BC6F7F9C6BD0E90C19294F96C8C5CFE88FB34C477574A1B1630B8CC591529E59B20794DA32E
-61DECDA8ABBD1AE956CF74012AA01D42EE01E861B0AA6897C864788AE59DEF43C493246FDB1ACA55
-4C12594BC7B33657A9ECC9E3D1472EF826073F632BE540C35FF6FB40566773F3BB2204D3A579A08C
-CBC844C14B18C350F003B9DA23A570C362D6003893CA32F86F59B829C78EE3188B6E3F7FA81D7F62
-2825C639638DFB78B7AF1F500F5B450FA54DBFA5CBA277C794ECE93275A3DE0B452FDC8DDC2993BA
-A42F28A636008CDCB03EBF71BDCAF35019778993443F88412AD2AD0D7155A3944606463266322DBC
-0244B07DA1E9C27A27B59664E8566D7A54CC03E995AAD008B0A17E2C3EF61F720CE7F7788599C4E4
-4C709CD5C31B11107F16AD70B17B9AFE2E8CD922A7428DAC171427FFAF51067307FAB0ADB530E701
-FD22DA22C4CD3064067BD4F6089C4B2C87937DD426E4E9D2F60E608288BAC9056554D04947E69200
-61E379CF5E81BFD32FD37EFAC1F61CEBEE551B0851516471A7472C60DF89DAA9EB1DC5A67E479745
-3E69B9E22BAF4E3CCA4192D603295B018C4AB69D18DE52DFDF15E96B557F290A4B8C5B1E7A6CACA8
-1F2351B97ADFC36995ABA43803A6E5AC04A3C93495F6D38106B8B144449C07D1358210F9176E1565
-72363CFBDE576BFDF99FA329DD1346E83F79E06CF68250CA57A68931BC7F342AD295D0CBA17AA95B
-B8EEB53EA6E8E660B814E9F857CECB14F44A43288B69A9E7908D55BF19E844359879D28CAEF1C38A
-36420185D20DFB32C2E002202800E8EF3D67C5D50E919657CA958B538D537D503444865331D79BFC
-40312068D72364503BD0CC84B5F30A74D8B5B6A26AF2DB764564FB65A6BA8F9051AE2B4EA458D46A
-4569F30C6E77DC097356770362E6CF3F1661074778EBB44FF7D1E3B64FF75E77E11FE525BB121C65
-46CFD13300CA1F02D571B82A5825E6226D14FDCF27F06D87452A8B6C5DCA658535CEE2A795E58137
-D48E566B69D53A0C3B766E84C51EAA221C46999CC8065ADB2F129D5B630FAB1814C0C33B5AEA0EFB
-B6E994D80941B53079AF96D90A0B924F9B0E319BED9836B8F9053F868363D3CA554CBB181863301F
-8CB940872ED5FA7BD18CE39218B5AD8AC57D0F752D941076B1C64D99BE0DB86D7A6D96510D772EB2
-4C587F11779BD21CFE5BDE1F29C1EF9022B2B8BCD7F91153C845906722477829C40111D810480F3C
-F62DE8DBA7FD86CD236E656618CAF6FC46827FBC4898EA7672F8C9971AFE43E0E01EC8B77D4AF48C
-BF1210E98C1DB15C16D149BFF58AB0270CF015B107A3A50F5DC8F37FFB92EEC8CB6778DDB7CE4AAB
-C464C4AFF654223006A550EB52485A23D2B4AA7198D3CD54418102F1E9A4FBDE37B841E56F5C2C53
-966DB9B66B000E4588282E3FB80C2C519339F0002D2F83C979EDC5827A3B3C8EF8810A0F9DACB6B9
-998E9AF6551F56313DC4011904CB979AA2D32B11A811BC248141E4B9734D9FB7982A5671002D8279
-CAB93ABE057474628DEFC95D43890DB1ED34CFA8A20BDC3D874E7679A396158E522ED0AB969A4E3E
-C7E4474E192590504D54DEB7B260B7935C4E56548A7D121AC1F741F8CDF259EA1B5813175A77A1D2
-D30BA26F65EB765A04C09ED51F69F41551ADF399E6AA2FC09788137BEA4913F17B8EB838C38FB272
-1FDCB55FD65697FF0B850E7D3D1CE266BF90F7EC06A9A0876BDFE767D3A918B092FC78C775F945CF
-1F96E859C03DBF630D9A940939654C3549D8F7921CB94EE23D5A0535DE9DF31EA0F937F860B4F220
-A99ADDFC343D7CF7BFA0B803C12C26403F0DCFFC8EA786D0D8A8D9C367419CA8AE41190CE93A8086
-583A1E6C9D70B612C84D87D2EEAA71EC2DC12F4CDE6A821303D5F6A9BBDB7EEDCD289E80FA3B75F4
-7F481B50719DCF4A142069393593B9AF9CCEEAEC56A35B8787193D7C88113E9E1E221D151E093B01
-9EF89F6118BEC4735103CC8003CC5AD1B6727B3226CD44C497DA7052DD681695DBEC3397F9598C91
-77701C73BF0594CE93F23D50EC5BEE2FB9DA1FC966DF148B27B28EE3C89526DD6625E2887F9FA076
-7C127C609EE315626BC14D274FBEA56528DC06A27B2D476D46E9E7916590B156A5DF04A6CB15E362
-45D77021767B6E5BDFCC679670263FD891446C3371B11BB6E1DF60F960AAB4149D7753E6A5C33810
-C42C8BFF4E935003388506F8278BD7CB672F132E065AE684DCA0B9064D01DD620E7FFDFE04F14277
-EFE8E60159BA0FCA3FE2F28B902D4AC275D19F0AC6971EBE827C4A232D87650D2688345BCA78F879
-077114F0463C5F058107B669566F8171E4E284D278405580F04BFFC9902784216E0C9A17AA9B2935
-E66E18A783F723BE044389B7E9D62AA36818FF2EA406C3C1A9D2F3436F3EE7DB8BE86AFA8DAA6A4B
-1B84611350D8D27605509612B515E16AA843164D5D0805E36A2B9EF74C5F6A0B9D59A04B55697123
-27F4B1B30E9587CD103337639967CBDC655AA46E80D2CFD24BEB50815B5338E522B3A7AFE8362AB4
-F05D8BC52BBA9C5089ADA8C89529B0275AF422EB540D31A938B8740860756325B966B36817115213
-FAAF92DE63F6BAE1E0064BFBC5588098B61EB83C71F1C2082436D37DAF1ACBE186FEDC4BE7C1233B
-6F18BEC5F99002D21CB7864E4811F7AB3C03003E1E4490AD1AC793BD28FCD5EF0E6CC30EF39A08C5
-2F71939B0CEF620DC69E31E39D6DB969049031B0C92EF2DB653D97F370141456A52985076B268652
-FA2648C792780BAD637C4D7581FB2D62011D57E293719487CF2D1F013CFAA532E1C2D39178D51272
-A6AF041440BCA174B5CC902BD7390C7D3695056CB4BD7791F9FB6D88E7A70DEF2C97869F5DBC5BD8
-23C517C7B7C39D624DF627DC9653EA5347BFDA80B723F05F6DBB4C9EA501D862ACE05B9DBDF21B70
-56FBCD8C6D4B85873DCEE6166C8B5ADC0316CA12D9639F361B15A42F00E1D62EDBCA1111972FA0F4
-5758BECB31DB38316F3CDFE1B41748C93ED58B67E9B57ABBED5924A6D53E99FBC9A994A6489A8BDF
-13EB685548B4DC6D62DA7426C22227D4D43B6FFC7B5EA91C896730253E8941AFEE588359C2BECF6F
-FC415B9EB6D31CCB0F6C7F85853E6449FA6D627A97A3CE8303F148393ADCCCDFA2FE085C6908BE5C
-3C05AF00A6F02840206C3253A559AC5C049BDDFD11AD9B118403B84DA10AE3C470CB9A9A2D1D7B73
-2F59F5FE146DEDA60AE750F551AAC934621B4470E1BC324C436303E25F81D0DC3188BE0D6FEC5414
-C20E4CB18952E12CB6423DF7124627ACDE145500D77A97A8BFD9CB50D1FAA008E2CE2B2505A4749F
-1EBBB092C347023714055A9B63353AF9E7FEE05BB54C9843698101F79888A91531773830C2C967B5
-88D3ACD2192883D5CE3962D51084FC653EAE2C5FB2DA41DACEFB5C76812D2EDB5B109677289CD199
-8D457FB1023A19AC67295BBC1A9A20A426B06A368DF3C5DD083CB1180D287F5500F2C635EDE157EE
-FCEEC5503447382D15C748C1E35F68753992E5C90F900DE54D18F8E1B355D1076ADFB1F3590135FA
-D1A36F028E44F48ABB149B80CA9A54614D467F8D71CB310BBC7AC7100261092DB8C5BFD39E0AC6BC
-2C9D6CBC3A8C05FF8A74CB21608EC4A4CFE4CBAA2D056DBA14206106044DECF59F957EF8A9CADE4C
-9B19D8D30DD4FDE6A9548E50DB51ACA73330142153FC36B69C1C8D5B26D0C689B7040E81AC2C864F
-D7C097C99BE5953843E172C97AB5684F35FB03A725A89DBF371F08DDF40A1531FC1B676DB0E1543A
-EC6E97D3D2E4AA3D5831D8B3C952ABBFA112352814FB6FAB61A0D680E6640F6AEC8426200CF61286
-F7422CB2F78C61EBAA36D47EC16D7FAF8B4AF31D090CDFA255D9D7C61D46CFB22A7D6E1758E71ED5
-67E00CBD8E8F468DDFB477F091A2F915627F22FF47B876544BC1F03B6BBB98385F009C20BB1AA2A7
-A78674692B8EAC2E3C8069B79E679338DA57F72976810F845BEB6B9ADD32B95D78E5E60F16DD1668
-9C05FD82D36A3115BE8ED494A74DD211D58A2CDF983FCB9CDC29BF7F0E29988FA23560EDF514BC1D
-183F3B2A22C09FB179B47E05ADEF48DF02F31C29875D1915037B19407764A4292FE44E741651A8E3
-BEB5F0D972B6327090F664417C84F84FFBF0AFFF8B1D85C822D90730AB4140C42A51AA8B1DBE4398
-4EA8566040EB8B341CCE23FD3F69DD235A080BA5C69AECB9BC732BC2D7D40617DDA6B79FB6EE40C3
-556C7DF9B23DAD89E94054B1345DB8402AE679FC4655A4A776C0150463F8DB2BFC0608EA1F124E22
-1DDAE6026B5E5D007A7E4A0D6B3B0CF3A2669E67C5E4F01551966A7BC48F2F4B6A87E740D8095E63
-F77C7A027F26B52F2299DE5B8A2F6209BCF3D31CB0235F998F781E5CC81E31DC424E008D46EC0920
-2951E5684804A0592EA47D6C788A20487BEA2EC8F2E6C1D7F378B62DB43CA43C4B366F8B4319631C
-FE9854F0E10321CFA3B01C873584863BBEFC23C72C05E695B56E8A52E89AA2DAB543834D34DCAC5F
-ED08DC51825C5257AE59850D101D84F4CAA1D29FC932F9E0EFFBF7A9A7F3685F61F0490CD3CC8988
-2DB52A757A6AF4C4E67B407BD2316B1C0FFE7DC54E43C87B874F57E4903334E2140B011484863CDC
-ACA331175F2CF3D72E0042855983AAF8853D3015E870FF0807014C31D55060DF3FE1FCE157324481
-2744AB51322444632F9AFDA6706E320FFE82B8CBE242A19DF00CE73EE48E25FF49D5871BD3E60652
-298FE3E8D400609E232E0DDC794C0579ACEF89E841B2EDCA50D51151F65E8C1CC3B01EF1870558F0
-BF5743718C3E068617E81BFE120C6CA16E0924BFC2541177D53671CAA3AB641C41557DCDAE1A3461
-47B5E999C4541B08B4AFCBC187AFD653D5B5F8386DF6AD8FE69E21BD0567DF494F736C6A184FA4DE
-48DC9F347787CA96E2E00A296C2DA05C2AD9BC423E9CA428D7F1FA12DC9353A302FB8C529AF8688C
-BB543B45B2717EBF8F6C497935F4F3BFFD285E0402AB7544B3CA4643AE5A8B5250ED987A95FC1F27
-5B9707ACD0641BD0EE2AE9758494F8D8A51DCE408A38AC20EAF0852D72D84D0C6BE973326793AEB9
-55EAC6FE0A2813A355DCD22F6F2CE56588D1C055CDDFA98878BCEB6A018DB22922D2B600A20F8184
-2E665DF41013CA0947C4237C2BD60A75E2FD1A3FB8C8FA19485730B87461AD466ACB02DF8CA24091
-4FB090B3D2B41EB6B8FF05E1A59D9FD668AF70BA5BB72778953BA55FC5F9F626043450E1D09BC83D
-8605098ABEF884639A37809A32565CBEFB3FF39EE53D6C18C58C272BB928E4410E361E59A50F242D
-69747A032617C52DEBBF62364AB5A96EFAF642D9D82BA679B1D70FAC10A4EB62FA5CFC308E86368A
-AAD7E75948F43598CD1C544A0D4091374D7E88D4522CBE902391641327E888E7748FA889DCE67ADE
-61699E7D77763681CAEE9B1CA8837B2F7EF9C18CBCC538C465C8E2DD34616953CCB6030A222C728B
-834911C1A179E2C770289407AB28B303E724D97F747D6134B425216A64C6E0B60F633E2B85300047
-E4C90339CE030A0FAE31E830C8ABA5AB3386A3B69267351A7BFDD66356AE5E57FB2994452993E90D
-E7C4E260ABAB93C37831856A650D56E44172FECA01D6C7C380F250B82473960D2A2A5FB6B4DA668F
-46E624ACF7FA0FD4490F485D640A3ADFC9F8652E7A38CE5799F770C3606DB4B8B947F93967F779E3
-A3C0572F13A5A187D31D7BD12A5C7BE23CB6ED6192086241B76C5BA6983DB9C93E4B208D707D3760
-F03CD6272EF3A4CE89B8E52E6AC5871A3D03EB975759AB4BE239E5EC7842CBB333E692CC607C722E
-185D3C39164DD320C6945629C70FF66A5237C0A9520A1FAD6EB9816069351AB0F135D90CC0982B14
-7D2294AE4A38A527EE40BE9CDE2512AAEBB590E134388BB171D0956A7C4566D65A9A041BE6C4F883
-6B3EC3D2ED1B48B566A783292B15B6127920D247D494F070BB20BEFF60640B11B276DDEEE49706E8
-B2B21BB40B7F00AAFC594C492C25DCA774E0B80D82E927448DE2E74A9D0DC7AC9260096EAF187B6C
-D6AEAA6D1DC4205B4411122751A5B22688404EA7C5861730371FFAC10F5AFD4727A0E402AB5EA757
-606B75EB86A05E8F774D6E430A1A3FE2A37EBB06700474239FB1CFA05EE44B91B82244C575B52E7F
-AF934B04EEB0D933FEB57EBE326D75821C8B23EAA85B583AED4320B7F04B9F2DC591091216FDE52E
-064BAAA9C2C9D9714B95A4558C21F3CEBE624B5403B31508F178581AF6863083ED762F1E2E34A45C
-FDD71660D626FF8648F5D6C5E580D4765A67FB6159EC8077A9F0A88038C8D3D7C77FF0926E2123BE
-874F7BCAF129D55A5B5960F824BD1728ABCFCC51D23936DE9A25C408D786E44C3A2BAFA4423177AD
-060D21D38E15E23EB6FFC0B4120E814695D423EEFC2744A1FC81B4DF89D76F0A6803D8B14E75538C
-AAD03A72517B86514F6952F6FD619D9E910D980F00964DB325318C045BDF79647F453D4A5CF4E61D
-D5359782827229310405FBCF6107C3AD9DDEF9A9A339D5D5A6EB2E7838A0A43221BD62CBDF732DB0
-A638A52016FB35BA7761AEC846A023D3BF2D1BB183543E81EB7CAC1E5970CDC6F068C5EA118C7AAE
-528D1396E6DC939112DA4460C890EAD5C01BDC438F5BB734218BA6270ADD0DC1778FD8AB16831D6A
-302B814A1A44B07EDC65956C9E6CF4875DF521F3CE5B422F71081B6D69BD270F739095C9E81C0377
-934A8BC6390C420C4E4CDD9CF7E32544C68D884E15ACA3BCC07FC8C132D8FB9D752C15D75C52C288
-57E2EA461A6FCAD90C56843513F74461F18D7164BC597A28AE4BA7C86EE1703535A9B9ED50122627
-71FC12F102E800E0E1AF7BB46681BD2B14B614CEA91B7B2AAA35235DE76C0E113C92688F8EC81277
-D58C3406778E1EC1CC15F1CD9A137C8FFDAAB99ACE3BFC782916F1A877170589A92DC921E6740A22
-B84DC6BACDABCC76E64C79E3A588D80F8F4D376E1B426F15751CF7391102102F0AFAFD8B22DFDEB5
-48AEB5F30B1673023D22054A13391A0EC08DE6E7B685A0D031AABF20B7C62187C0284892D5EAADF1
-21BA28263EB863D5E36EA9C06A77CCFC0E17F593961591F84D82AF823EFE41044C8D606FEF83CCC7
-B0E961E7994DF8A3CC36B209D953E250ADAB8D22D7F2B4E2C9CA39EFA2D93E56195C1560E30A5190
-CC5B17FAEFCF250DF79F6B624A4B917E11C332222FCCFEC4F6A47BD9E75DA9854FC3F7AE554E91ED
-DE144D7AEF38A0E3EDB5E5A5626374DB94F022C8CF549093041DE00D7269B7CE544E748439BA2870
-718C08E58FB4A77D93EBC04B7957D272AE1601D41BF85A2BADAA0DF73B0D3841D4839C85677FB2E1
-5F1D6CE592669FF4BBC9C69DBA334DC37706F2F6BE83D5863E8CD6A30C08640AAC4C233684E66B4F
-E6B62D4A8BE9D531E47BEF5640D9B5C27D990092BE1597F6995C8A77BE9C18AAE6C1CF130775DDAC
-41D34438FC7AD8E042CB56CBF2944932EBA7D053E9376FF398367450E35A1945FE23E05C921096A1
-5454721FFD0F429A3E06DC3ED36F1C170BE79C66996EF8337AFF85B90C5D3A4A94455AE9FA32E211
-7A63E59001F052D5F6223125BFAFA40901E98960ADF7BB886729DCA82FC3B8CC52B37FF2517299E1
-D769057F8154FB95582F02CB0BECC873A9C71796ADBD3E91324FAA94F2C41CF57C30B5897D031C02
-D256C909E080E70BFD1F32E69EF67031138C2DDCD1A8E4B65E485C23C3E450ABDD9815512D6F34A8
-4B9DB715DB2C7A93BFB424316E1AA44397749CB01088428F149A3B4324737ED9957FD388248462AC
-1B2610D72BF5C073ECA567E7385CC959E37CAC7E05470160FFA5A9F63B8E9B082937E911586EA165
-374938F492EDF28CE6020953A5B5CCEC7737F9D9CC8538C4339567AAED3794ABA3B9F4EAE65466E8
-E326F6C399B36355935FBDCB9972F10B13494DC25097FCEC5A6398F275C8C151558E74C5175F7BAF
-4155E36B733F75CF9D5C5979B0764F14D8306E06BA24BF791141E404C69F3F8FCCD91B9C58C2C671
-AAE7D4F9E5D6414E46ED633A5F78AA5BF04E652246A066EAD9E582B181CC196EA2D3CFAA383B5D0E
-4CAC9336E119C08CC6AC55CBFBAE147C623B400453BBF447E96DE036FC025624384359EED7C7D5F7
-858DC0521377CF647A157FC3F188DE5EEF094DBA125510FDE34C570D7BE76AB5DF0A28BF45DDAADB
-EA7EEEDB936332DFE93081E0AFD3FDD46BED08D6914B2EFCFDC41662A33B90B03D76D34F48D30FC6
-BBBB600E90E6AC7243FDF026762A44B4D6E4ECBEF48C9D7B696AF29EEE063E557D8FCF0F09E0136F
-45D17E608DA36E59F2AECF8493F8D62536119B5F7E1554DFE3F6E8D7C9A2C6F557D18B4AF92C9F6E
-050975C3B5C54F9B5F4E39D600B6FA2CD6DE203A174028CBB2A201AF126D1013C229BB82CFD013ED
-199D01E51EE2780FE896E01C63C655087A3E61A7F1029FA5E97EA1872F1B45F22282DDC317E17926
-7368CB52DA9444F6055A3C653659CAD2A1D8712BC2B1B32C1DC6906D957FB88524EE066156ED6BDE
-B8D832F9338F9912E29A250A8C4674E667C1C278B677AEC9972BE83CBA3FB779893FCB8F81A323AC
-91474BA2A2334A07BB5628E905C518E634F6761A3289056F83D5DD7B3890987EEE1C18FB2D379CC1
-905F1AEB3B3D2AD578F0D6C845D2D40C4BCEE3F71C90E68E5417BB8CDDD878D83BA80AD8485F4067
-E5C3CABF28AB56CBB219C0AAB8FFC6C7E192BEC8CBCA1459AE4450AFCC81B9548F40CE2622E5A7C2
-81F74DCC02DAD57EFD92D072318DDF05BF42F1EA8163071E23949B0179CF7DE64677CA99B23CB926
-B3E294194EC13397EA1DC9A5E1CDCD828156CD71F81B64167D4FB01E6002713BD8AC6F82B20CD369
-9C6CA4704DC5C65A2D66EB155B7AF1C9BB46469416FB49C1C7E17A30A5F045271D7DF3FFF2F42C6B
-470701C381E3456A500C6BB3D0E47B4D91C5F34B49BB6272F1F8698B307D89EDA3A1565DAD1C0864
-627560CF922DCF5B34C67860352390B282F95394AA2CDE0E97CE3ED39546A6AF1C52BFCF81A29BE8
-2C47C99E8050E4889E4575B75F39E662F2DB7420673797E2ED3D67CDA7AE2C15D0A0A794D57D168E
-BE13214E89E0209AB2C0EB7784E9491AEFA3C02D0DF3AE5365A0FC4AE023CAB528162C7A1B173664
-9DFADDACA8DA5FA18B7D6489E4229E9E24D38A620464A744A5C60F6F9D334B908706B738AED18669
-8A8B278341FA4D65A0A88680BA484694921512F7DE93337FC1C02BBE6E64AF2DAD07603279D87329
-1D1F4D39C1DD6D89C90F65240F4808F6F1115CA55B88E242565E59F3BBF1F10EC7B88872E9AE61D4
-4CAE185463EDFAF7DF63DE4D2207D307AFB61501892965170D2945846FCF5973A1D458607F50C15E
-06E5BEC715E0C156259AAA6C735593E5564F65F443B78CC7512EC35A56F126DF9D30974A40872E42
-65E1AE5FD483CFCBBBA26DEE426CDC4721F19C3FDA86ED7AD4FA1120F63669BEFE7002B128CEAFD8
-C63E8AC09943B6CBDFB3D2476A026C00A8FF81B1F651B97F310C82ABA5F388CC1DB5AFCFF5996D52
-52A6A42FA4D972E41EE56088F78CB966F9051171C472C774879AECFFF08BFD9CEA40D7C298922ACE
-64F28C14E0B81F4DCADE81D71DE3983D87D905192EF13CEE71B2D3FF1A88AEC671EC318917DF98A3
-C9054E372D22A3CEC82FCC217F47319A40900312F6E32B536B9E7A7FA0837EC65CCDB5FB0D414371
-17596CB39D9382262DE6E65379D3A9709B2CFBABF5FC5D5B352425F06F88CD31012A2A4147B112F0
-C1C0ACCC808CD625E0228EEF66661F70AF96D3DCFECD402700E4F6522AC9A856DA466D55C84F65BE
-2810A1565163872D62EB81333A698ED7B68352CACCA2D7AD38AB55C19E4F5582F75818302F5FDADF
-1DCED09D94872F2D48FB636C8E38C7563C72C771A08C6B1F041F3532BDB39006C89A33C09BE1E3E6
-03622D891F98010BF1DE5355F557A1E09448D486ADEF565705277B31B8BF2B86761E32631E3435B6
-88B79D566F1747BA456DDB43CD239FB47FF7B425EAA4C657C8EEC26EE01AED07CF916E77D53634C1
-37AEEA009C6B515B6342C54BE2C7B95955B1A9DA277A0ABCDA2346E88018C726F481F71D6011AA42
-F8852F2E5749518FE3B3AB668213FE1A05C10A1C53953D75312631D6BBBA01D418199DFEFF8CF548
-6109B099FE8E2F606165FE30F532C03567785D5362AA873C9D3EECEB20F1945D55F49B0CCAC84967
-59FCC7292E46938943C262D78F3212D3F9D0F7B103157F423D71B1ED54B2A603F4C269029918F238
-EC6828FFCEC66009DB9C9E59534EABB183F31D7AD4C57B1BDF0BD2CE5A421882BC10CC1BCE6A970E
-2B586BB221567CCA483989DD0B8DEC424C1D1FF042DCB7834423CF244EDA28D2D969B17440CAEAF0
-24A6119DB010CE366821AFA424D1B8299609C04148275AE6E5257A7ACB3C766C747CE99CBA2D703C
-F19B7CF301B634D8B613DDC4AFE4633A4D77BFF8E00CFB5E289EBBCAC90A24307E7941EC1685CBAE
-400CADD876FCEF7F6557EEE167D2035A05120293527700DC510B038A496BE1D5CBAEF24ED39F7421
-1A93AADF22214ED606A80582485AFE358E3A46D0671148998A3B3BE209467009B43400870359D418
-9A8CEB4D5866AB52D16D9CEB1EAB71C07E6CAA34B70E3096BF7604C22C40D5FBFEEA616DA3BABD59
-DCDB97D883FC8742B8267A16A99B7953225F7144568D566E64542C92E538AC140C851E5D295528EB
-7CBB49909B1CAF6409C9BCCEB325468FA0B5F7CB2987382616B477CCFE4F4AC79E4A6F7165363543
-F04DE5B6F6E1C2E910CDC3CDD6C4C92737198F892337DCB6647BD226C820AC99C65D8E7772BBB74F
-E65DCAA8A22C33BC168BF48E40A82700A3A7668C5A9A71E397ACDFEE7D556C5C19467B7AA69C260B
-727407AC837BDB7D67DEC055C1F45D8BAC61048C45BC9FB3CEFE7549EAA2992D2EDC126FF7A05EAE
-58613332A2BC1465B2BC0429162B907D65F793D236EDDD8D35405866D71B25F62DC4A7E06D4DEE82
-840ACCAABC0774F8A63E9C0F7FC980B3583E7A8B01C46590E3BC04EBA565C2EA94F057D964A78A90
-EA9F52ABFD70F84E44E434BD10A42E98C794065724341F907E35D3CB257161E01C7084E3A0166D15
-CED65DA7BA87DBB2EA33D39BD99AFB93D3548358D08330E807F8552CECF63C84F805205491BA3A1A
-622E70C232FADF3BF2DCFD6F0539158D3306506F150B0518371912A25EB96163D73E9EEED42EDC84
-D688BC7F7708D9DCA348FAB4DF62E5809BD094842D0A31DBB7C4B41F94D946810C5EC10B69AABC2C
-91A59500B2E5D37F4755DDFB7AE4ABF757F4C5BCF77C7F95E6A616646456FE8F18407080BCABBFA5
-7704287AD26222DF91AB2613951E2D679472F8ADF06EA2A20205EC19972299A78BAC52114334470C
-5F5890C2F846B4C6042D73945127F2E3910ECA1C4CD7A16EFE4B4BE38A15AAA710682C3836A8CA83
-FD384970139D8B46FB0AEBB002DD224199672FFA02250FBCFA4E649E335428FC71F50F45E498419E
-DB0E970F46894A48F65580881C9C4250FCEF65C9B28699408E18B26FE6DB7F1CBDB767564E73CB59
-54C6D639CE33220C894F36E70F71C9F9AA3FE2AE0AA0E3F2E304EC5ABC661675CDE2E70519E4220A
-E26FBACBD01D5169EB844750753E6CED53E3678FDCD08AB93E10067E9C64F38B40B76D99B6CD92BD
-F4155A1EA5CC824998B59AAD06E09E5F15EBB2288D66EA71B296616734FEF2796F07FF0D8B047074
-A1111D68B99C2B70FC56E74A51B062F4998ACC85B1943C9477E436E5CD7AB18DBC898D21BB93475A
-623BDDA71D7B895BA2D4C10F4B90BF335126F4FD57D73AFA50170F6B3C364922E551D40E35DA75FA
-891762FA23401D39260F2E92C7807C746F13BB35CEF9DBF2E76E66A72FEFF095DA482A4DE8A42091
-7065736CF4DE904FB52E649A32255E2030A7B31B686353492F31C064A3C4B0448C4BFD44B8E15384
-FD809B8761EE26A7DFA1758D57CE4F0BC376EB2B3833534B15A83436BA553955ACB5A7A66796AC5B
-92DB5388BC53EFA27508B08E82821E5CF669BCE52BB860780F749B4F38ACDF5FF12726BF3EC2743F
-01014CDE96FE6B4C40A034E9EAFCA2A35CCC776C2669E6AD138070A40F48ED79136D7FF57E993E09
-B81C543FBADD350FF5B5F7A46F060F88E30FE2D8233832D18B6C323EE017EBC1DF5C838321CDC8A8
-4CABCAB20B60A1A3AA028F36EA6E87C850AF8AF7CD50AA6359038BFA8818821D02CEE8F51DAB8C05
-F7AE9797814D97F3DB8CCDDE45B21DBB15CEE292FAA534A5F317B357F4091F3DA357325B8B9F5EDB
-45865415973C143E5E5BAA483FBF2D06CDD4246675EC58B84C6AE65CA743117FF00F229243772561
-31A7F2BA26A9115AFD96C18216CFDF41B7220ED0CB3FCC26C36380007B382A02AEAE428887DC8BE5
-FDD630AC57EE3DC156C7B8B29E687F24442E35CE10BA4087295A641F7139C831F7CCDA6CCEB5DAFE
-537CC1A97C5A337D3C48A6AE947F58A30DC08CC7B58DBBB4737AD52783C573FC1E9408F55495A80E
-7FDA61F0B9C4F090158F1A416249EBBA936C27BEFDEF19D1BFB839EB70576A010706D8B95657B218
-9C2AE04C11EF9E57FE09880273761FB4302C388BD608FA0C7F00F033C9C00F4E3D5CE2D903E0DA52
-E69C7745EE9FA75E2AD93DC6CB5CCFCD3782A699B807AFC36AD1F62B05856D5DFD6F88831B90EB3D
-CD523582A49732E3FD7253126D39E8AFB8458B5F7AD7F94A8DAC13365F433C857AF4A42C0A08C4DB
-9887C4957259ED22D13CFDF5995DA957EA5A0F620B0214FBFE08AB6D552DBF048D62CEF6EFF12F15
-3511ECA7833E0E3E95F85E6AC0F95438AC4C126E1F1ECF336ED31CCA7EB216D279877123FD9FCD8F
-B5E52B587CFFC4428456DDCA816819A8A4A211D8F1629E5D42BA4C5C356E580C8A22C61D987552FA
-A97893816DA73D423686E4EBD44375C257F031318865A20F22115E72BF1EB9F93AAA169C140A33A0
-6C35BD4526A38BE79CF40AD1EFA10411E8F3300A8A8B97AB140EE6734E1BEE6C8EE443D698D34159
-97649C6F10F20ACD80236422E215E146D744A262DA3FC88DC0D86FF66512F49D3F957D3C5CFFEB42
-4823509F33F155057A4C6F37B52F4667767BA94F6B8B62856B553F307E5D230C44CBFDC9A97A45B1
-39FFB2F2565EB0E22026972FAD0FB7B9576FB6F368B61979943A398773600E7EE1DFEFBF26D45D40
-BDA66EBB96A56EE9CAE0B2420C5DD83E24DBA9FF885BB844BF3D2BF93B07325DFF60C0CB5FDCCA0A
-C8FB5A2E119D5AF26E53AB8E3B428481C2871DDA26EF0B621CD8572B3C664BC7AAC01A1D05B98F79
-1A7080D294BE81099BDA7982432F3DFF4775C44D23F4F1B2E0162B61A8B2CB5EE8564BF98E2ED403
-2219085FE6194C19DAC98A421826CAED7F1AB1477AB327506010217283894235D7DBFC1153D5ECC4
-8AA7293F19592B4D7E95FE55151889BCD1D7FA7DC2370D2DFE11D7E4EA34B5C7A8E73BD3A348FD38
-9EF45B6167FB90BA44C23E912F9A4F2FC0427ED070592F7110183BFDB2C400393BA7569058227926
-351F07FED4F33633BA03A72AA2DC6B598E49B96021DD868DAD0F352E5722FB714F667C15C68D49C0
-3D822D82677EDFE86FE9668E537DA284068C9B0AED83074C92A5B939296D505B837E6A9DDAB1AEAB
-7455A08A114C2222B339284674B74BF4CA9EE0C020BF2A148B439C71C6BE51A94CB64FBE4A7EB295
-5A455047CF5CB348B062ED4F6471CBC3E9ADD9BE9B96879AC7BC71BCE02FD02F17C6063985A5E898
-3D205AA1489DA13C408990ABA1C54F2F501AA172F530480D789C848118C0A74EF98D5F607A067BAF
-F6030D887AC6A6497F9A0B38F9705F328AAD4BFBB634F739386177B07F22D5771282444E5EE17335
-B4D0EC86117C697E79A5F4F65FDC08E4904DAEDAB20067EAE2448FD4301849E456D085F392DD1316
-7ADF75CCFDB723E2904A9C0C976D6B84DDEF9D92B0E15FB246C3ECC2D0BF314CFB957757B3A3E8E5
-801F520644E4601D291DA0F7507C06F3B9BB36FC1C70EAA444E14E56C0CFF06C7F853DF36DA9D8B6
-AF2544B853DFFF535A7E5C6FC145250CDDA229956019659D0D253A19A7B51A4E538BDC01F74D7704
-9949C2C97C7EC6392C2E61CCC0992B66DAF1AB08551063E53180D2A67DE496716CCBAA45462D9F91
-B66A22545962DDAB120511FF08627131B95E5DEEB8B4DD9643E7B2AF65C0FDCE11F5F1E8DD468DA1
-8D41C8C4F00EA73836F4F70EC50FC3EC6D358C0658A4261C6D15A582A2C7C994E7882E661855B352
-014576858A265FFBC425160669CE159D07EDAC04D060B44E5800A7AAE8E339C29B929AA81D2F515C
-46229D2080D5917AB20AB6B34FDCA8E4AF64ED660A3173786FB1A1D005D575C2A5187D3F7CFDC94C
-CC44A38C5CD523E9DA726D8EFA6DA7B6131DFF3435FEE838B2C7D6B97934295F06202D307FF78D90
-6699CB9C5BBB10D1D4DEA5FDA5BFB094E704607083B646D37F5DA1FC7AD21B813F44D8C1AFEAB666
-55AAA19703BEA2E77DF3BF350E17C74B3447A452235919452B5175570A006C7680AC05E8950A62E1
-1D7E3ACA35A397D1E19630D094A86807593C97F4C484E4E06BCFF708B6DCA972E3A0009E1CAC0EA4
-141530F5C1B8AEF5E1B933F37FDDBC4BE22B74FE346D1A3F5FEC0818F8E61765568A2AC04713E828
-F98C449D9A1CCE52D10D61DD8BFD084C8D099A75D89DEA64D5A7CC68BD5B0593D97953DADA976383
-F5015915618AEC56D71D1DCD55B89736395C609B315A3F1E1255432FDBD37F38CC43C354FB4B7C44
-F1A7318B0B7E99C3C08C33B953727B6A6328051783A0A33E3CD9E498346A3CA6A77B517096EDD52A
-E443B87643A646C3A7BB97F742888D33F9B3127E61942F4103C1DBDCD8EAC8F9E259773066736CA6
-53CE57E8822651261D847C131321BB9D6626A1AC50D047C0BA47B411DF2A995545BD68EC0287CC9B
-31D5DDCA8755EBEB10ACCB3903AB0FD5788E984220443B8459E7C078DA4289F1350905881AD6DFDE
-C47302B0ACB0D4AF8CAED02B4B70DF3CF8FEC118F0FC2D3DDE3E494CD160E676E300BC464BD4400D
-B50EE43B314E0517037BF971ACD7CD327CB2134893B8A0410E68DDC518F5DEC966C7884CF5FDFE74
-723177F20DEDC039D879056CAAB4BF045062D3904F615C5CFE109AC7A35599C94024B41019B9AFD4
-04A80ACAA4837929F5C9317680A13D157A03B59A5588DF79D2E113F5F51021D6F6F90E8BBBA2C252
-FD10651BE80BAFD59C53A3367BA3C28DB6EB9DABF1EA99F47B503F627E15DCF3FD645FC52C5D5D0F
-2F07DB4C25C0D1E1C00146E1C4D973E613CCDBD3F9450CC0F5343D79F05E9492E86A1BB889ADF405
-03BD7F3E7543436859184A5B20BD8A172F350D846B7570803990ADAA48D4B9155A2B4C4BFBEF1E1A
-065C08E03928559735BDD442FF1E83E1FA20A5DA57D8BDB2FF5427C034CF0128AF111E6E73099E04
-6E0C240E80A73D7BE72B87834E45898D475521CA3306707631F5C6136199F354632D1A085F12A1C7
-C473868B62E534D15F5484323E63D0574196A19EF175214EB35A90873EFCFB92D6CF68761D45E37E
-AA61E1A1979A82009507CA193E44B36A806486665CEDBCF387053ACEAB979BD35D30978FC7659ABB
-E844F4ECAB3303318ECE80777A5FA5A9DD91B3D06804C4B4E9B4EFCF07EB89866D0DD8CA390CFD15
-98651417114D78776B1A1D36B4BA17746D6BE7FC123D473EF1EFED1C3BC1D555F914536869FD5B0C
-35F9C83F65B0E6BF7A627B9202D787D72C600DDB6BCCE613D88492E13CA0AAAB196E8A49928C62CE
-A4FFE2D0208EDA334ACF47F20BD793124D2C5546C03F4A364369A76A0425262F9D9118AF54E37D32
-E33AB25DD533A49DF5FBF1BAF4CEAC2D9D378CDCD13B00FDA432D9042F623DA41AFB80699B5538A2
-5403B0B3EABEC9E8EFCF42FEF3EA9F91766902CD206B0787C187D5370B60AD6DCD002DE2DE8DCDC0
-B4719A797C5E26BAA67665016DA0D967FA1346F9588AEDA174CA001B31213617FE19EA218EC23597
-79D979E2663166489C06993230B0D07973A117C4E3F4A4C93CF8428248DD5389414D679C69644142
-67C7FEA17E35B0CEE456667A9B1875C81B2302BDDEA2818D6019FC1622A82051F60584ABC904CD91
-8676305DC03FFBCC64FDDAC8D8AA9CE2EA00D6C97BC63C8A617DEDFC0E40775649438E9F61AFD179
-5E3B20560B01BE5E0983F136CF48AB206954E41DEE0D9DDD953DFD01CAEB569151D6BC0DFEF29D70
-FAE3E198E7EDD8922C0E0BCB8BCCF1C016142C1A8B337AFA7A05A9D7534B184BF3BF827F371E9BD1
-9A71244ECA1BA73D484CD2FAD54DB2F0EEFBD54B536EBCB5094E6BC2F5B2AAE41F05B4B311115876
-ED42C34F8E643B53372E3F6350DB8A38445822EA9A33E27FB0CC42CEDCD1FE2FDF723FC47C996EE3
-56C402112F24D0AF899B2D00BEA1CFD427998BD22B2A09046D6737814448ACFB10D387547D7009FB
-384AF0562C85694C071584236D0F1F3D3FCD0CFB38B77C81889061E668BA7AB37AA60F58A3967DE2
-6F939B79CBF10A9DCC42852561D8D6754F1B660D216AAB1E133FBAA321C56E2584BE5C9BAE20CCF0
-0E8DBE6D9C2FCEBEBAD945C3C04101D2387351F132628786F6D9D4CAB83419288D31F9BC600D9664
-12E6AA457CE6CAD26A4C0671097B98C2384C81DD8B9A3222D4F4BBDA7017895C3EDC26662779AEE7
-40D9D7E24185FB821970B0A3A94041A69E4805EC88EE1EE521981536F2844FB8F5EF645F67D42CE5
-148E2DDE43AD5AEF200EDB3A2C7866C98458A92666E5F9E070178BCC39F65A893102A10564AF4E8C
-AAA5075D2F8CD7FAB0401C03AF299EA3515CC93066744EB5AF7CF0ED06675BF049A6E3C211A89E16
-DE5BF0445A7CCA6EE8EB0347454950485D884606651E5887FE8B24323E2AA16DE22FC1FC8C4F06A8
-2A1FDE5758976024068197E1F4506E4D3D8A16D40461A4586338B374A592DC60334402F76388AD6A
-457DC3F54E6169CF7AE3959676E966A45609621055EC3AF80E182633300A4418E34A66DDFA6B569E
-5A13C9115B5FD3EC1CEBE50FBA247F60803AA83976F00117536342DC3D9890C49B2AC701D370E43A
-955118967827760F7091469C5406F08F18D7E3548148CF0E312B1DC71DF67A5E7A1656CF2F47F3AF
-F3DD50FFC2FCDAB7177285B29C17CA43019F62AC6FBA52D1493ED7C427526470ACC8389BAE827759
-4958908F517B2863B83292EB5AB3F57FFFB08393CA610FB1FE905D88A0A16AC395E2A2A6DD033D6A
-0D68992F830B2E1B95FE357BF672716E88FFB92FFC3D62945D1EAD22BC68C51EE0E10A43011DB94C
-44685A5C4576F6EF44CBFB45F2A4BF110A01657DB51FD499767E78058199B31DFD60813F1A344F86
-289F9378231D5B151C92385E3650B4FEB1DC91018EAB8474CBF69FDC1496A4D078D2C351C8196451
-247A9DCF8117E5B637371D8E22E248C64D999015C3FD2311E9950B8EE0922FBDD3D7BFF766BFE9E7
-CE0BE12F318FF2A7B5A9C6D00A54401609304ED2C55F5C1EAC3D4B38355BBD85D66D61636FA6E30C
-2E82829376BEC979A6FEEE040E452359768ECF90CC539A546F17AE906C76F14F86FF697797322B05
-1EB311A759FE260C1EEE5DACF383816AAF1294CFFA7BF87A4D9BC595EE8F2C2F86FEEE11AD959D86
-F22FDAF4CEC098942A57E57813A0FA99239E994FFF353C1E781D666B8928CFC648FCF0869FC68468
-BDBDA7D280DFAB8B0B3A4CA35B074B686DE8D372C61FB32305169A1A9912F6541DA16CD6316A6EA4
-51524757BE5CF6E820011BE3859FB8B8578C100FF029680E05F0E0BF11D33FE19460C85EA5E4C0EF
-28E29407C8AE6BE01CFA0D5022BF9FB01416FFF722A784DFC8FCE330EC95737A854471D334FDC58F
-AB42867A7B62836A8B56466E9A6C1247D46EBAFFB905CD4321970F59FB8D6FF65FDDD34BF913AD32
-2E68455C5FF2D23C1A5EAE687F259BC982B6A384D35440F7C693CF50B9ECAC0B5578CAEE87588B56
-2EB6B7F42034C9F2E545EC866316552354EB3728C7D26527ED75174EAF635E048B08DC5D23E88981
-070AD5641A652F2344956E9CF4C16E652A99F4A644D1787D6D36537489DA4D74E61B2FC4DFDF1D1D
-9D58F9C26C5EB63200526AFD168AC57D5611ADE4D4A382FC28BB60F9E7D626A6C67AFBCCD1183C5E
-3CF2EF210D0BF5CFA7BB10FA3887BDD4CD96EEEAA8F9219AA2F10ABC0A960C3B57C0EC0313AE10CC
-FF1F522124CFC8D2D49BFBB0C193EAFFC5B48FB3FF30B21CB76F0A4C0F1377C9223145BB0468A5D7
-1B9BC25873EA12E1C60334571C67385C00D0B570D3FFC6C7FF0DE62C183C76AEEB12DFFEE1459E0F
-C818C621B8D12FA1357E2B55D48935D70BF140B4CFFE8813DEFD479350B20DC2EB1D3CBB1A2D3DC6
-EE975D58C89D61FC50E6A0197DA9A586B72255023DE47DABEFB11E8AA02414C2FF6258A281219B9D
-DDFE41BA7D7977D0D6F18224FE22F7D4E9355FDB35BF7ED3418F4F68D093AC48F7D8FE4194FEB6C8
-0B9DC1F74E023C604DEA27089F98C3973FF9F4AD7BF7BAE601DB89B08D5D8139B95EDCF6C885FFA8
-B3E4B0477E7040225733826BACFD1EC4A0DD72DC41734856AB9FB700DF83CA2CE812913BD142D84C
-5C83C0B2583768198AF9E885F2BA74877A414233207234AA5F18840557CA11682AABDE8993533887
-7C6D404BDE4153C9827EB16D66C1D73A8143C8A2D3604FF72CE579FAA3C5224BAC48EA83BA848429
-9472007DE96466B5B29ACC7C03B05DCAA38A48BFF9F214DE43146AE4E04FA705421917F99BC54533
-F0EBC01849E396216B9F0794E6F6C6B61B52EF1B1950C0FB609895C3C55FF574163FC8B6B09E66AB
-AED1810E698FF37CC1F926B2CDA3B48C7D77790EBD2D514B6F385D397F713EC3AD3954EA9C846158
-6031D369E8B99E53408A79D64C34EB5A56DE8A67DE91837960E98A66FC04DFA0EBDE21DB003234BB
-78665B039D0A469A0221BD541AF7149A2A659C300132C14581EF766FFFBECBA8B58A5EB3F95446DE
-F49AF863A8113D17B2E7E6ECDEAFC3834D4DF900E3475596E86FBB4E2974C090DB4AD61A737D611D
-92B4535AC291C56AD8B1C031D2F9B505BB77517B737D70AB3723DB52AE2ACCD5DD2F617423ED3CC3
-9CA882EF41757BF7151806A9B8B0F312808863E3673FB54DE939B35CDECA7FBC4DC3BDF5A5F47D35
-E345916C39366C8B4F439CE1C6F1835C320BD1E67375B03B5DE18C93256F251761A4C8CEC01019C0
-68E34447BCC503B9571FE8000627A6B3DAD5854CBC0A2D69E5A8F46BC78F6A7B1422334EC7A98ABE
-FE9B83E01DCF3C6C9273B346F3240EA225AE4A4083CC7B0EA141A0773FDE940768358EB4B13D82AA
-304A1386D450C1C0C6A7D5A8FD2BD313F78F85248B5196241E31E5595F3BC01F37700A2DD3D4A0EE
-2DD01A36569CD507130E8F5B1E96CB560BB7DA15560CCADF3B2C9804A11D9E8055C9EC70E48C1D21
-3EB756A1376F2EDCB7189D78CD3D6CA5865537EEC31C17D801605EFD860B0B629472690588D02575
-02C6F7A75B9A1C1B397781329832CF3EC43C09F1559CD562C48FA9500295CD3B0A790DD3FCD4684A
-7C7AC49AC9BFFF36B39A9FB148BC28D37907433943CBBF0CBDAB46D3EA86DC8F81C859C52D15302B
-94A9B51C199B7104DEEC9D769C2634CECF8B700CE9C04152CC59C9326BDACBEC4312DEED92DD087A
-1C4840868D9F97CAC046581F762F75E8D24D6445370A3F1E0AE74A6478D9DAC37E7FA5BEBEC0A1E0
-81AF89C1BBF7F51E3E2E22C8C405E8671BA85F1BF0DF79A465DAC7EC07F731E00632E017D190A99D
-83E27E5C2E63D7DABBA23B2E88334C63721AC5A4CBC5D45F4C177259F34C2EADE01FA008AF65EBC6
-01D8DD16436D86AA94C99F3CC0A2F87134E73BF22F108B825A8963B49C6C685474AFE4A542C8641D
-C0375D7EFE9AC1168D9700459BE52D0DA399023E141969F25C0DAC4668534B6647EC85454BE945E8
-26B26DE6E3C4584B97A38E2B40A0D23481BCA78084FE80E00A71A790BF31DF468A435ECC88E60A57
-860BBCA3D65930186E9917CBD209C230E8F8255A7ABC7D3F043AE4D7AD63D9980BEDF062B7D5C298
-C40225B6D03F29A0339E0FCA02138E526F06B9EF47F5E7A8068A846CFDE2BFDEBD24F5A73A66C079
-18662AEC80B43246284FA4E2EE0D9AAB172B1E59A6CC46B801149D8C0DF6DEC9A55D8E1B0EFD9D30
-2FF618075944CCCB6831D336B11617107B0530D09885E5CA11A5F1FCC8D69D603DA16BEA51116D42
-CAB1AA1E4D7B9B4D79993F2BFE53EAC904FEB70B2D330A89780EAC10D12CC0C35B8399F218AC2976
-E57A26BAD20CE2FA2AE2363D3FD2A8A971747556F2959DA74A8963C20B504711AE1CB0D0C02457FF
-2E9BF696B159AF031DD5155F21C0F5549B0471A3C5DC8918B675CEBCB23E29322B959ABC05283A70
-2E878DE8EF25EA760F3C5C7B7B49D398283DE2ED837FD59F7C22D62C58FE4448B1049FDEBFC8787E
-67D7DAFE9774979BB3802254DA59BCC0219F98C219F84D995CA768B8B5D9D4A32525DFECE003675E
-E4BD5D8DFFC11025AF2B468F9207B5B2B42349B98232BAC0759758C1F4A283405815BD7145C93FA0
-8F3ED2826655053A3C2559073D8ACD199DEA2C5BA5F616A2E48548B4370EC73493BA07E197165DCA
-774438B0766867819C1154D1959FE6E01E6312E0AB91FC2E2BD240FC8652A2D456A1DE7F34EF372A
-53794D4C4E050BF3CA5B7BD2F1B8DE93B4C8002485CB219AD2D029739FD3C81CC6E78EDF38723576
-1A57143EEDE5CC887F282FECD261F6A25D0A7E154ECDF5DC38E426811BE86AAA458577E5E0C5F0F7
-5AAFA9C41E5D1DC9D91ECD79B514F8CDF7A5F1A189470D35FDF4F9B8788879CCBD91B427822ED658
-389E981E0EE5F7FB87692A3E3E931DF8A1D1573E3B0166204240B7080089A09EF7487C9AEE2D665F
-5A82F94C877FB5B0DC531CEBF1E71C6592CEA2401E4B5122E5091DF03D203DF979B9A6EFBA12E2F6
-B422FDF15D49AC0914D372D21E871DE65CBECD105FD4A3E4714B9CCA5C6803FA39DBB015EA8A88BE
-7913502E562E5B170B87BFC8572DC9DF49AD63694311EF1334444BDF0B4CA3245271C1F7A4D7FAF1
-703E3AA0E1EA8D5C6E821B28707EE0C9B4F22F23796FE87356C58AE2CADC191F4C58E1FB58DA03B4
-5A25AC95DBAE13A293474217BDB214742B9D9D6AF35F70FED2891942EACE3E625E55FFB820543FBB
-250A062D3D395BC0F219ECFE0D76686AC148BC41476A887BC494DDBD396BE200FD3E03CFA12EC9AF
-6B934A283C42AA05589AA6B4A8D16946BB51F50419CABECEAEC5AEF9085C9989289E9B46BAFB6FB2
-782D84DE2B068F91A9744AAB237CEB1BA513E57E4C307108E993C972A3E0A898D5A8D27833155031
-FDB98863C3BE7FEF3004CBAA5CB60A1F2E3EB4D7290FF5FAFA088B1CECCB6CF51A58DAAD998F0839
-6CDFD68F5ABC9C1CCB8F6514107773C69C26873E889D1F79D10E866910E4684186FCD71C965ADF62
-39BA3418B313A27AD632300969B6F284519366ED85E7CD968D64823F8C59B5911A72D0A20EB72B60
-3A61E36F52F256FFCDF706B4560B4DFA5D918FBC530D83A4B3C01BDD3CB4572E24242D141BF9E775
-36693A0407D002E09CDA5B195BF1CCF430AE9824C07928A050D0B460F2704BE8F9E647A4884C4567
-0A81EACF7CC038643EB0FF18A376FF6F32B6FE4F197273327FBBDEC6443A299CAD4B26F7778A99F6
-5A11BDE047153E764039EDB251936AA43DEE50DDFDF8856519056AAFC4C5AE6F2051AF0579A9ACD4
-1D00775D7DBE70022CC263DCA5E0A25B9C7C4F5C418587666B2FE24816B1E0EC92F9074F1403BB83
-AFC3F1D52CA79C387BDEF864366E34C90BE52F7AA09935373A07E4E026224E76F9EC3CB9E7EDE50D
-EFDA48248D61F3CEC880A3B8843306375D9711E58645F3625BDB8E87052DA67F9794EF4AF8DB0BCF
-E00677C3A26907DC651BC838C40EC39E2B5A5DC0DBD345944A6C32226089D63C52490FA10B215AE7
-03CFB663EB8A47793B84CE7364DA1C4E7FCE32DFEF09490121222774915BA59C78C2275F829D15CF
-4D8686B095C38C731B83D48738C25F40B8ADD487C350A2EBE846C3916AE384CB1050F9F5DFE09FCB
-D9129C6270FD86D55A459618FDFA4F907E6B4746196BB717865AB378414029017551161A52E9D24B
-E4F7EED553A927933D4ABC8F25DF607779A717909CB4D810DE8F5762581900E224E4B91598149BA4
-71CF8068ABE8744356B261600BFCC57FB8BE45036CF6571D9B2A95304933BD4F17215F8EF53F8E08
-1AF61FA7F9583C34EB5655CB0ECB82246959F09091F36989EBDD646BEDCA614B9A61AB7696B3FF18
-1058A150FA6EC1BE2EBC7F64357A3FF2A2B0491D2F4E0B970DE5B7788B467CA678039B5EF55C88A3
-84578D427FD2CB16C87B0BF0A3D37CE8ED43E0F049AF2436344D5F47C948C632C94A287509282561
-6C64C5D262FE5B24916FFEE982A69A6CCF888BD01D62EA591EEC51F4B7DDFAFFBEEA93FE08D736C2
-0129E345D06B10246A5F57151C198D407730713F32299638EFBDC01367E23EB59AAD42A83AB41B43
-2DB462652E29813740F4680A5D4BD47B18328FAE6BDF4200CFA4CE3773809B45E8887C9B2E423698
-9F6C48D64F5986F563D9A7538A8716082F81936AEBD0461E6F4BD470436D8B7656F0FDF89108E6DD
-02ABDEF907731D458D690BC608EA9CED09EB1E6E64C0790C7A2378201CE997FFE0317679EE1D4EE9
-F91157449323E53B4ADA8096CD628B5861BF794543A98F2FA2AB54FF0F25A13DAD43DAF9394329B9
-5AA53CA32749FECB0B2BC035DD1EBD53FF9FB5AD8BCE06CD89E5568091C1CC314CFB1D9821D7F9AC
-7C55F55E0A16E39A87D43148201B928F3C42B110FC056189DEF183745F3B637441DE8BD4C3C7EF12
-F4258E306B2877ADAEC63441010750DB4E6269A4C78A0AC01BB3603C386651FE814031CB5D8C1F14
-9EEAFF652A53E57BBD4C8C0CE36A84A319A53BC1E5FD3F1ED1EE72F4C1A9BF264B594062FCAFB22C
-C1FDE3F2E3D3C17DD3F7FE0E15EBD812D550227C06D01127385374A11438ABD50048E17255FCD2BB
-85122A6FB9B7DA9D5E9DE8A747FAE0DA45A1FCEFE92B9E70A5B2CAC668D4D07527A5C1403267D823
-048BE671F725CFC7474B44FC5AAA348420B2D7C23C6CA066666FD6F2208E329878D90CEF1C2E77ED
-22D3BEBB9D547810B189F08920A27E7107F208591A84D463CE2576C70C3DFE6643E4EA93F4E1DAEB
-41D46F0E2F56FC10C69AD5034FC9859D31CF27A3A1EE256C93111F81C11ACF1FC0CE20B90BAC9AA3
-27A5C85A7985B951519FD4B03C40BE637162AF41B2FDA68F0D1E9B7602FE2659D3D75955C579AC51
-DF6A552EB9581AC3F712F083F19B52A6C4F560F36C59CEEB0C996AAF1728A2AA45DCAD79BD7B23AB
-388D5B0B64A2B95154B6259B730B0F4A72C8C7F7CC93C7D64D9D8810D1F63FF8ABD4DB89824E2D26
-4FDEE916C41E299211DB1A53256E1DB5CDD04862F034D9404B73183A99D3D13D642A663F129B6D16
-7095BEB4EAEFD03DF2FF2F0B6B594C1EE90FDB203DA89FACEE23F1BA3901FECC75FE1811BD701259
-343011262B6A0A9707AAA6316BC3C17F787BB80AC8DA5AAC942D90F80C5A3BB59E47EC767244AA95
-C63E50BF809998957936D3BF6ABC24B0A397258F9EB4DC8F65692CB023D9091FB180C69498CD0C08
-BBEBADC84A7E0016E8F8BEA325D924EB0DF82E75D2CC2CCBF039B11934363D4332C5FBC5EC556BE8
-5EE4E707CC2753CCC43D2ED50558E51A104221C9323CDCB0199B7B83454DE3FDC810D0F362C0299F
-5DD981B31D8E3DDA284FEF9DC8F9C8DE138D3065437A7FE8C30572AD06D62E8527AD37AE39AAB0B2
-25F76A25F6C6505241ED73BA494CF923E919F688DDEBF193E188F8C4C154F21631080763B4D091E8
-AD1D2FD6649E0CD9360E8D1A67A5B5FAFC67547CA31C95A5EA8D4EB5D68B9F6D6532DB9B54584735
-9558542A2AE58C09F3BD2918EFBE1699E9C8F2C2A11EA4D224C726D2ACD4A8D8ABAEDC6588CF2AE5
-66528B94F55B823A2A1F7BE19000F3E7579D094E047075DF18C8C868760295533B26EB3ED90635B1
-29C17ACA679C3E88B06998CE5A7A2544B700229F5A6A504BD3E45B276471959C8A3F81917A534287
-39B5EF9E3D463B3BA7318448E2A3E79520D2D245A2A72F31FF7070B6E4624E3A5E216BD103640C8D
-F387E49D732529C611F8B971073F17EBD2F6EB18F9B74A67E1997926DF178D4C9EDED435B9682F1A
-279C81BB9F60DAFE125845A2FF3B02979E5481C78A45C479BEFB9FEF3CE2BA9BC46C77B50B03E48D
-A6D17B76F06F3AD118371ADC69E178C52B5FB4B261C9311874ED07DD6D5B3226A005FDD7A6D53848
-09E7063F036CDEA41619122635E835D2D74CBB6AA9B38CAA4D819C26E95115FE0DBAB4198FC5838F
-2C91B7A87B07D734C6D4F4F83444C1E90AA9BFC908A2BAC4B3DEF9157AFCA5248F2DA31CA87BD363
-AC25E9E77F741D4B2C6E02F04987A6F49D30E9038CEFC41BA172DD675AED8B392164411144E5B738
-F3210B0E66B17A13CB9631C33D44484E792A7C082DD0A5382F34C5637653261B1EB6D2035B08B4D9
-1FA9AB770CAF40A103629511F7B43F2743D7E583433DECFB19C21FD4FD0AFCC22A4119E77C87BFE6
-FE50068B22479015BE5A9F06BEAB4D37412E062A45E0CBCD7BB39FEE747E96306F79FC4F2E8942DF
-5D9DA0E55AACCDA547DA19D30B8404FA121298B44C9CCE198C708C69A8D6BF17591C5C50D3FC5BE6
-961F7ABA8F366DAE957A1C3730DA4A5B4F035A9274675EE3BBF0CA8CE9D8349F50CABB1C3EA4948A
-BE6F9F143592F1EA95404E6909A909168E3279A957AE1924245C356331A75E7008BEE92BEAA304BA
-40B7C3F48F74D9018B3247DF50EBD7CE541DA48ECCB1B0BE51A455C3C13C279D4D8676078C3EBE43
-08748D52C9B041D3E7244C745B1F2F742D010A9E60695F3EC4FDC1050AC082B905D6A57E8F407A3B
-472F731011A5798965B7B1A307E252FE02C8F79CEEDDEB6E165F1A94D7FFF18DDBDF79477F14E9E9
-3981ABD200FE7771B29D1D2D120EE79D28B9543818527039AC74085EAFF241B56D08220C958B5D9C
-87C0C04A14D52AFD475B542D391BC54FF33DEF8D9484AFF6873BEED32DDA4B371112B523B6CE22B4
-0D1B416B64C9370F1CDF2C548F4CCBE9E12E21C36CC3EA52DA232DCFB65F66B22B5E2EC04852510D
-5E264EE939BB67AEC4764B87062AEB7F680B40BCEE04AD45C7519EB3B6199C9E0E332661463647F2
-FB7EDF303EFEF84891CEBCF0FAC5F723A9D0476C3F8C092604C87FC69C7A90F4D64AE45A478EE8BA
-2DF50FB93F55A3546123F0B0E2C1C40C98EAAE9F0F26B8F80FFE6E6B94B7E27D2884D58B8A119662
-2DF6BE608C5569D7864BB756DF2EDD184B90812B44ED4A32D001C31383A40AEEE9743651F7950846
-15C48E402DBC01C818D477EAC0347795CB2792E9C11E8FD4A02E194EED1C919D4598FEC003B6D9A8
-A0BC7D456047A1C0579453FC1D7CB2D158D466939A23D7A7B8ABED7E2777EC7487973E73F2266D9C
-250CE30729E3C5223AD93B9AE8443B35711E446A3DC660123ED45CE1942A1A2AD0610467E081CE2C
-8B92A6C82F0B17B5D2429E99F1A6268072C6B5AAAA6EB6283A872C54D3694CD825EB2926E57DBBC7
-C1663075E687A144E4D61C225781D80FCAE1497B442342B4A3F1CD6BDB50E31791CC3928C30835FE
-F845B6BE5E2D7E3F2F5F085AA3FAEB45CAD0D76BCBB1ED859A9CEBB9F7457036F0BC3F195CB1A98C
-9C8648F6583CDBB23894BC719D68C2DBD8003B10D08C8CAA40BCE784D7BFB4EEC9EA5359AC056E57
-B8B0F2EBCB1F4CE40C87FC7861180133E0CB6CE2FC4FE690756D327A2B5AE063E3021C0C0BD420D0
-56F0B941E6B36088A55BA11D0C35FD0132D5F48E5D9673572347171B4328D4807B972831C0D74CFF
-A5638C145B89C989E6EC942148207D6DB82257585958034D9F9D4221C7C9F7013790DBD130F277E0
-BC88BB179DD09E27062379ED06F25EEA8B7FB33C35861A0034776E3813D2E9E5C10E227CC569AB36
-CB2D9DF2E7B7B44758F9DC4FFAD7A24AC7E9F47AA850C221048C3CB35A37CE8EA75632AE65FE3212
-175146FECD6334AE3D3C5F492F067F795E1E8FF386BA198CB74F0BB4DC0000DA383BC4CC3F070DE1
-7721431988D69C8B1A5AFDCCC83C22E16A87E01C6D3E79DC7AFA3DB0371B0866EFB8B6F88900472A
-FEF1C4A878243C52D4E02E82658979731C841C489A6B97E271C4C93800EC7D91F93EB9B9C659A554
-E1FCE42A5EC65AC39190EF4B66DEAF6FC0569A000A9E1495F42F706FBEA4D32EB7EF11A648910259
-6A65CF899C2F322F5679C6D123469192A9BF1A7F1F2C81C554ADB97BD19ADB746A4F81A4D5559E60
-AB94C483DBABF6CE2F28CDB412D50FF3FCFA3B3DAAACC6A83CFED910CCB3B8D2C19590AFF4D75303
-4A6CE7F4156896A13808E0DFEAC547E69D3C886691728E4A35ACD575B40D721E8FCC5385A2EB28D7
-08101DC50811529528F5CB0C009BA7E3C88468E37768FB0D83895AB54DB2DD5426562AF9D8AF304B
-F6EDA54E9C92643DF926F5C3578269750120302A37CB140A18BA56BA01108D4ACACE8FEAE640A6C6
-958EF156B588ADB0EA5F3B0F37BBA12B7BCB221C811415387B024B7076FA4403A3AD6EBB5D9C26EF
-EBDB7ADE7C60B444AB9F90EA493B658B7767AE2BE649BDBB3FE85F460F1ED137C61BD95F7CD3D8B0
-15CE45138538930AB62AA0E54B4CE1A5EC5FEC0A2B28B345B67089A4E4AE14D2E1F5A9C8848DA688
-CA298F93860649EC3AAFEF3E820D86988C8E3E5A4D4BB937791827994AA3E81D0BB3EE115EC36D5F
-B9A392D09E79AF514D11C7B3A03C9F9C13355CE79E119A19177FFDCA34704D38118A8976D1EE5AA0
-2D14FEB1414419F5E85244ADC5C0A765A522EEF36170064BB19FEE3B5F7B441E4DB967DAE0BAC2C4
-8FC6A836E0EF5A69F073BEE1699F55E9C757EBD6FD8B514E2B49D6333815B7DBD1E0694695FCA3D2
-1320A0C4B852D9706DADD8369A95FDD917328BE93DD33818954DBD2C212D2CA81560ED5BC284EB04
-7A5F389E24E43F4FA8C97FECF46589FA7341076555CF55B1C21B28E0C1CBB00AB8B6F67472F27BC0
-D11148F407824B0159B5188D4BB7386FBDBF1C0FAF34721B7BCB5C0FCB7C4010DCB6A1284E9D7883
-9E3C2111A05D29AB7997073B590A81C6168020F1D48951BC7D8476D5BA593F4F23CAC1F9BB0E091E
-84B4E99E5C584D1370DD12DEE8DF16AF8BC6B7B23E2FEABDB7F32779AF8E2B5094A6E9B7A7225F24
-C43A8E5D2B977E1E19E633C26771E23017ED233DBB02C64F8CF03992C6484528D0C8464B46F24F9E
-8380F385D5D01B8893C67FC103498983CF939432AA380CA576D09030CD52FD99BDC3BE16C7204CDC
-3365BF76294A83A1FC14A236F5FE5321904E779B13232A76F8FE521F425562678436359C2461BEA5
-AB27209541F557AE2AA60009C9CA0A9FC7898C14306CE35A50017BADEFDECBBF94EE2905220706DC
-806409EF87DB1D73EAB0698AD2DB72CDCDB293E7FB13C94D9FC87E74502E6927A212F0D7D2F2D194
-64F7A66AC07872E18CB1DDE8F11835DCBC5C4EF039333FFFC0FC1456DAADE7DAE3EC2EE0D3415B0C
-ABB69FC5006F4D14A4EE1A5CA99AD4D5E629C0DD1E0F097B5B93DE2DD001A8C418234C9C45E8C13D
-1AE04E9466DAB8CF1ECB88A4E059C111A6468D2DABB90DA79C7C79E94DB28F6968B1A632F8C57D9E
-565FF91C6916026FFAC0661856B9FB8DE9C81661816221B1FC159CFEF1751E7E403F5F2CE32529DD
-540792FC17A12A3DCD7C50D38EEAADBD10ADBF5D8A82442AA900CE6150EB7A4639DD9FB6E385B2FD
-093493DCCD9014B23EB172E21AA89643A6CAD1093343D85D81261972DE0ACB16A4C6B5F0BE4C978B
-FA12D3CAF0134F9EA49F6E9687C8F99A456745EA252F0BA9968C7F9586E3DD841AA92DC7705BDD68
-2DAE41518A09DF0E209F321D7FA3417202F4BA76A984DA3ADDBC58136885362F02F0A24EBC439B3D
-BBDACFFD8498EBD29F88F016B1FEABC10785438EAC860B554525F3266097A675299AA0967BD3B7A0
-EEEE3FC578D1BE99D3533BD91571AED904BFC9DA1A1451FDC5406E1CD614E0C7FBC733563CD6CE6C
-C31E9237CA153F1F0411114361D731636BCF98555ABF12848AD109371A42B63675A4130B81E97C2A
-2EE2BB5D8FAE2640156001AF0F55D9D5DF8FF23C8AEFE14F120000F14149A36E5C94CD9081DEC277
-C2C34870D05011F99D48B0875A5FF542F067F7E9880109F586BCF2B50522A1F23ECE44349E539E70
-F84E207DC9BEC7CDF856A046F1A03226AA41F541719AD1AF88FF211E57DD0C1275DD0B7B47440DA0
-89B98C6EE92A7D94700B83CEBE19EAEDD8A615F6587587BA8BBA3CE3AA5E8EAFB1FB0F486BE3609B
-169EFB178A4292F4C0378AFE5D24EED1CAAB514DDC66C696D8E37F294A6579131DDF5488E9436609
-ACD750C3DB0A940C84FE022B22ADC2676F62E91E8F891225F891FBA537679B24547BBBF35F04915D
-20B11739F620D18B5B216921D222F15044368569AA302980B9225BB839F494588481B94B0C724352
-B2DF600A22B062561D86CB8F81514FBDAA4F8A043A0265F992FAB71FC9124A45B8475E1EF3DF6B6D
-E35CF329777D45F08325E8505EC0D979F542807AE77E57E453525F23BC59A50740371EFA98678AEE
-6C425374AEB745B99DDB5D8D908FDB551FBC0DB15832107BBECC4E11A1A8DEC69358A574A2ED46CC
-31D564549EFF23102D92BFDCBB2BB985F78F36033E34F59C0EBAFA3BDD71338736464CEFDBA91398
-33995EDA4207BFD4A9867D32E867FBEB7DE60D132803EF9347CB17BD91315484EF6570892297DD8B
-7D966103339535E28A00CB1EECA4A9775F60A9F5FC9BD8B06D78FE8E6318C31DA2E847E3F9CA587C
-B01AE2BA0A2EBDE308314413F4F230A758184ED60D4F71F6CEC22A93A01B6C54E0449A3860FCA895
-4A347B7588329A80974ECBECDA1070FBC055666375229F13DD995E99265DF870BC8B8CC6347FADBC
-1A6AF64599271A475B9123493D46BEC41289BEEB67EB97A8DED7A9C9730D37C65164CFBDC22E5CA5
-89D2E7954C7136EF4E084C43A6C7F361A3E96989239BDDB9A593CC2A80BA16DE9EE90E95CD39393C
-212AB22EECB677FD36D34DEB46C4AD0D21BF7E6D7CBD0C8083842FCD87B18FEA7CECF939987E99BA
-34C214E44DD84C176C9CC5A4CEA76D380CB316BB4EF9DE73D73B4AFD4ADB54451591DEF86621D138
-D5A0A29441502BF6C2ADE671CEC3CB5CAB903A657EB2D70C943F976C110E46C5D9D29BC00A875F27
-38E5D22496A43E096E009C5D3CB724B4CABB32838DBE527F83B18CB457E57B092C302EE557FD4F00
-DB9C56E66C9FDF4EC9FFAAB85F60D02BA79694FABA476A199A0331C30A78A92E10417BA236E23364
-8174C826331DC1BAB87C5F95027846130C6A2B4027930EBF9A97BA1B039D386FC51C302648E25980
-212F6A582CDE2778C677A01FBFB3C5D1B8A374ADAF6ADBF7DC94075F25ED66D440B3922C5F255FB2
-3FD8F6E21EA65B1D93BB225684B50F11310E242B087575973345B229BA62C1E2C35BDAEC04D10148
-F5B2F3BCF7399BDFDF1F3F79119714AEA697245BC647316EA157484ECB951BE367234FD02E8B1F09
-1AAC3D29BF282DFF4011BC0CBA8E55234D943DB3017CC7A766720BBC29B2D097A956C0F1067177F0
-12D42ADCB473CDE8D1BA35B4030757FA1D8211989DF3BD22CE5D501C21EF8708FB3449DF47D88650
-9FF7B59B76C0DBAE443F336FEE2D615D7EED1C284F14335BC8A26BF4621E10DE9611FB2F1DBD52E4
-B7565D8C65B54EA36D508BCF0C578A49A2665227CDE1F9768EFE847F9D94F1BBB7DB83701C232198
-5C7283D47B2E40B27A268428AAEFE75F6B2F8764A8494E5827573758CB9CA46FA93208836BCCC8B5
-564A69F5AD882052AF1C1417C3FA7F580569528682C77080F3688B65E7FC24D2A3AEB61574B4A321
-5927281544DDD7A6EE0A3E9388F8F631CE7251724DF70726E5912DDCCC8C652DD6C9608F8462303D
-867F589DE0F2F71711B35142EE6EF93B64D6326C4DD7DC83278E057100EE772082E6BA368ED91A55
-53ECFE2293A481E42F83BC8F9148C70EACE91F7B7D9CB8A72415BDB3AF66F68EA733A17ABE9DB005
-3BF148629132969589F38D30EABFA96A01FAC72650B5A6FF3935670198A1EA33810A9B11E330EB8B
-451F24F93544263436F669AB5A90A53B16CCEEAC36B1445574EFA7E802DE73522BE725E68704822C
-B7D3912717333367895BBFBE06966A5CC653AAB5E9B3596702086BF0010085B900711932A95ACF15
-CA4DC45A754EA334E9EB84D6FC8E3FC4F897456BED64BB93B593549FF0D5352275D8E417172A6664
-C5E0ECED1019494A7ED49AB0B965BEC1A82E5873766BB38D7D856049CCE2FCA65AAF61E961B60634
-E2A69EF059754C9D8163D87F928C222772D070D83FEC6FA5AC734AF65E40BFDE521F7D9CB1650FDF
-64754BFF21EA3FF0AF7611A93D525EC9B28C51AFECB04E7FC8323DD6C9B0D8539A34FC3CD8CEB795
-8E8EBBFED4313C77ED469C199552A9FF70BA5423B03B6148D4EAAE17B71C5B39DC436AC53D6BA8A7
-AD81AA8B02335A8B2B11E9F4FA913159A725B8AB60F52F1A2EA50EAF4D56656E615BF382CC68A690
-BF83DFF24FE986570ADC0290ED1A37C1C2AD469CE789E0EA0BB5CE01020100E729721AF3B5BADD33
-A2DAA6C33EB8F9064F5292F715F820B4BBFDD56F76D42E7A1A068C1CBDCE4640082F6E7D582D1939
-990CE6EE8D270015A2C461798B37DCB5798EE9F7512168B76D26C28BE4A49A1BF96C89D235F21A1D
-B6A96E5DA474D0B19B808D13D7A11BF39EA8647499C410ED9894A1ADF33D41B6FC2E614D8087F4C8
-4E437B136F3CB32DB8393C49177A0675A0C9E7EECEF448A97AFDBE840FA01FC7E5F2E8FECEDC1884
-84C312E8635CD79195475DDBFDD4D38D5A0246DE2C7F21608F8D2C0DA1371D302E941572E5792A3C
-F4E51A33228B93A814D03FD4FC223C314CF3714BB3A34BD4F7ED6348577FEED9DEB082C4049E57B5
-D3CDB7F26629E9F3BA36893E09E3C7463D02A22D7056BE76B87763260E46E48BB832B7EE13F8DC05
-37EC8E81E9BDFEAD8C27EBDF1AD706933EFD11131E12814F236EBB01BE85B7F1B2D627413B324918
-D247604F56EC128909873FEC3857028BEF76A3494364C2A7002D104D486236C30B48E2B75D851C34
-EA50BA7FFEB4E19190898AE21768C157C0CAC628A2181A32796FBC1A7271D2473CD88E5395DDBDB1
-FC3AA8DF0F3D588637F19A8B833AFDEB5F655A8838EECD684E2315B72C75CEEFBCEF94344ACE8D6A
-DBE355008EC72FE7CEEAB01363A895F4E73F867639BE0A0BE67333848816B05B419221BE8F9066C3
-62C23FE85B7F392930BFE4C12B9526FF2FDEC38F23A159ED61A0718E7115C24597D849FA76369153
-54A40C965D4D72EC94DA61A03766AB39AAB684E134FD1407A5B1B19BFEBA52AA0DA5D99CBE5C82DB
-AA663711E6DEBA180E1D4A39C320516A4350D296BC19BF1BE054859A0889C7E9727A021F3176FE62
-0FB0C837E4141FECE531A950C03D319E3255703220B7185BD20FE5DBA673F8129AB211EFCF36EE39
-4C7E00EB0876624BC840FA86E58B2F584754CB6BFDFD76810E300741EBE4544E5AC17413ADEB21C6
-2F66CA4F075C32381796BA709782DE34A675B717A2C7F6D88104CB924FDE5DF775B4F0B68E0E2E5C
-2F788BBDEAF06D8E1FC2105CCBBD5827C0B03FD6CD64F0D073F3192D5F94839644E5EC6C5185BADC
-F04112A65F49A8C83174A9AE958E76A2F5AF469E8B76C833782C5FFB8BD7B1BBBB3EA0CB7C9786C3
-BE2ADE5E7AFA8C8F20892659A59BC421E28845A108E34EE17864042EF587A6D67DECDFB3F510EB40
-D2229585347A0035670FCC76C2837A4E4D68304FE113C539B35C1F0234B5079B8E32934546982978
-C5E4DF955A454EA263C3CA5D7101F31A318D82A3F9FCB5A8AFD7A65209663B0FC9DA400B26F285EF
-46D0E1EAF8ACB1F1CB805E3986D04BC585073FC64895E4DAE1CCB749BB439CB32EA91176D5C39C36
-50D10AFB9C9884D5FB90183424CEE67EF2175D01D2478D67511EC9F54F88763C152697B06D948BED
-49240096EEE3D06AB4575E8E8B2CB8263B5BCF4FA1608720F52B675309833071879DF52C3EC2871D
-20F398B5CAC8F8A4D41D0F1D47584DD90DCDAEA4A1CF160C4B3BF1AAB890B5CEB6CB3488672AA68F
-BD938281DBC1D8BCFE92FBF514DA5358443CB6E0147254E91B38CE6787B2BB0DEDD2D38F5938737A
-977B5EA42892520C58F8FBB53C994B57382379E9490F0D6970B980E1BDF8CF9F4C3C5E0A18F66E86
-EE93FFE7FE546DE50F41364BCB3721B637072571FA1779F1D672FAD260C16D7F13CBDF3E4376E7FF
-56D2A710AC5AC35FCBDBCE2C9C17E523BBE6218617B13C1FA6679B308979AE7C61DA6E68369324C6
-CBC7DDEC364E5A86707266C0B459EE7B2C03FE584E529BFFDCE98C90A2F3D9305AA74D3ED8430DBF
-3A49FE2ECFD9C4BC9FEFD22618FE9C8A973AD072AB6F713E4DF02DCDA7AC5359B2D652013E131B76
-B3ED6C75FD53BA58D862846264627F6B9E70D8800F6D9B32242B747A67BB2B45675840D34F852AA8
-062FA6B01E31ED24DAE02F6CF788A17F7B9368175195DB0072259CCE0FFB2C1035C1D26E1777CCA3
-D56A827C3242069E76D6DD69B653768614B9ACFF16567FEA61508D51454BC02F6C60F755AEF6AFAE
-3536BBFA1823F8E1A53C41124DE983E51CEC92AEF4F99785D554488A51C20885346D1F761DA79017
-940A0C557D93F1DB6B3D00FFD61D08E96FF3AFCE5FEDF545CC9F47A2B1BB26713431D6D1E47FD6BD
-6E3C668B0368241F0EBB5FA9C991DF79890E52E83A3675EE699B61BAF869DE91F67278F510061C6F
-E41DE2D883F48CD0E068E2A652B244128D82E5CD52F35F210DDAE3054691ED55A7D99088AAE8FB04
-F525C2084AC09F5EDF80A4EFAFE981F74C0DE9D194320709B3464F3FF2C0F6AAEA6D973D9C323F53
-DE3D741F698FBF01036716BBD62957CB32CD81D3A2674560FFBC5BDC5C6E4F547E589AD0B1CFE14F
-5E17FED1C4A8ABE4E67CCF8A49F32C4C6044F1431E1CC382E7758722A6D0DF9ED23E51F8AD14D11D
-7B6428E27443715EBA4E9C05D6F238378F9498AEF0E7EE4FE6856622CC8E6ED141EE5F109E343CB6
-695C4BE1E0F66601C27975983BF557C04ACFC19227A1AD7E6C44C00529FC7EDD7F886D24B7E029B9
-C395260088BBFB96972199A7B32796D27257DE83A7402291C14FECDF7998C5C96B1EDADE0280F856
-8A8F5007852EED303969180B3329917973C2D32C080C9765B6BAB0673BC7ECFDBBFBEA980C263843
-39B7F1052591D91667D4FEE413AFC23DE2D4B9DA742F4269C6C939F5FC32A38040730A018155AD73
-3F231E4D5B9D01C03A58EAE7B5F590CCFAF25EDC8552CFC8D95C60EBAE1837D7A97CA137E9D4A4BD
-2CD34AEFD68D64B3F4F62326AC429921D7FB3C235184FE0899690A0B775F1A566EC29D5830D32372
-6526F7E7F5AFDD71B77E07613DDC4FC63EDF49051AEB59E6337AC0A4B6DD872E776C9CD0CCB86130
-5322D816732124F5978A86C186BF0A0F88E733CE38E4D7C1BA5378C5629B1EFC97806059990ED42C
-5CD183BAD7E94070E4058569DA2E51831FFE0D080301AEAB4350BA290318AEC582C78D05DD92E5AF
-B4424EA808629BC972E68F4FF2489C245593F07555CA6A2B25964794CF31CBD3AE5C229AB9B8C298
-06C01D116EBD0FF0F159ED2D3D7DFC73EAB4910BFF5B0B0B587CD9EA6E6FC45D63C09766224D8346
-1F0588140B258B1729F70BAE7962189B1554483392988CF230AF4077193E53330519394DD99BA135
-6D4730AB221DC6A66019BFAE564893DDAD7B177DADD16ADD21D396CFA6C3DC818052E2F71149FD59
-4A16DE0C2FFDD366C99B486C55A6E991E4D22CCB15843F0C3363676AF2F5B2D1B7EF66CCF2F12DC5
-0D63776BFFB058D70A9C76DCE96C754872D72C82A0C33F90D49C935402CDD26B6D743B1F43BED5D8
-B539424849C1495DAE73044E885A7D0F307F1816DF6244A6F2D97BFD4E200E93F69B08AF39EA21E6
-E347A47CEEBF803F73B978ADBFCF056789BB8E6E2563DE87DD9A8C877157B934102DCEDAC54D487A
-1BB2694F0034093C48F10A17D32E2BDD0C723CAF59ADDD1BE373AF8C9BEB4415AA5AF36310C31F24
-354A53C0B962573148BEF91D994FE3F3D8450DD4D686725799F53C373A0A3E3C060C2E1A3E800504
-9F26D716E1F381B9F83125E4683264A07E2D8938F605978E2513DD2050B3D8A1012797CBA8961632
-BED260916338A812AE751C7B657E086A0C7DDCD3BFDDFF3E48B84751925736D1310C4910FC114387
-F3ED7FE163F91895EBF55FCB425CEF5729D99BD8F2C072E36C310523E75CD8E5DE49C031C4263410
-9D56E91A46C8C8E89FD92012A00C33D0DEC52597B5C6933291A7BDC5CEDA95DCDA5600F9AE1C8250
-54E7EE1067458CCB66610704C58E4A4FC0CB5FC933D0322A716B2CD430A3AD48DAB3D4CBE9D23F2D
-092368CFC4E1F5495C133A92942EC62118D45C17723646E69407B4A89DCDFD2AB3FFC099A21D9D29
-741D68270629AA3A414FE58658DC9170C247B6E23F35C4BC5FF83009F462F2EEF4DBAC5FD158A658
-57F9B6DC1F5192DFB169DCB65621CAB2F1B07BD22F4155A8E9E2B6388D430FDE5EC1C834D22EA035
-C52E1E34482EADC36B4CAE902AAE89A7284E62B3C84B608D6BD05F75BC31310B2DD3B2C08A00E073
-7F104F03A41989D5F6B9A2C38B22F1D1803EE5D7A4D8DE44E4ABD496A1DE0C0E12C4BC96D0122846
-3F0EA9CE9509FEE987139F3DD3F9D0DF4313F555BE85433718F6D05F197C41A9D9C7A8B0D2740196
-82D49F58DD5F66B12A6520D9F226D1DF1F1B65CDFA261F980CA25A92645B86B64606293F8BFDE364
-C47D2AF2C709BBE77A70A5712F2CC26F3D66F5BE2C307A48E6F887F681D30121E32BBD87271B5DC4
-615D28C309F15AD263FB37424E56DDA6E17B998B45BE6C7FC6C28E3394A8764C9EB2DF5C06626593
-B5C665D550D4600172791CD208AE9F37BC082B0B242B0A504B751B18F4D7495172B697EE217834A8
-A4FB7CC16D6F9E8BB400BE8AEB0850960283DCE725249FCC4DE97D9886745AB6066C3E2F64DD8AB7
-9AA11667F11188D7965DC11EB760B772E282DBF13249F31986AC6898FEBFE23E3E8B8D2C33E00EA6
-FC493850ECB2E6D831D1EFCA3C2EC8EE2E394599091ED58BEDE97D7A43B6F739EB0F845EAC1DF6B1
-EBFE876009CC5D804B15ED4B56761B3CE1AF59C07B49DC798A44532297AD73D5101ED47F36A3678F
-818297CC27F6AAA2AACCC9AA9B6F5459911D8C56CF499E390AE607F3790450B2B9C9BE0F006EDA0C
-715B5CA0481734CFB0597478E7602B0D2C1E4F78F03C68C17C70E4B42D7D2D3C95CF40F73488B371
-8E2CB05A549944D86944D78724E266C3319AF89AE430E777E95F0D792B1C654306E421F3D63A26B2
-1E74B6E8B21B2E2B9DC596D013CDA16D08E65E8F24A84B12B2BADC653E6E1110DE2E709C1C1BED13
-707B70A421B384F20CA7A9A9D20324DD383F28B2D3C7A9C53F5D4C6B7C378D26DF11CF55238BE1B2
-4FA70DCC178DAD3D35670FE4919085EB1CD905971D76A368FDFCF9D2F0A23739851A3A6D2E02D65D
-54DEE69ED5D81315D3EA5E356F94EF256DD267FD1E1A9EDC9CD63E743F299BCC4A4506233B8DD765
-2CA067F741603F93250C087D368F9E9CC4CC1A6DED567487C05BAA992B0056A77F630A72008E3946
-15A9DB24FE56A956650EC9DE90A6C2259189440247970541CA198748928215C0E132A81AA13208D8
-63C1FE817F70CA573B54577D10B73100AF8EA088208A44FB92ACA314AE5879706180788C17BB1D0B
-81B6B95A1C4E0F9EA66F9B39BFE12444A6446691A7BDB03E0F03D9F07A10A7598F2166F108529F34
-CD90E601FFED3479ABCFCBDE8F051C348E48C61D95B00C59EA1287423F05666C3D36288844067E83
-E14F6B5210842C742B89F13ACD126B9FC50ABE2CA7D7ED513D43B6AC7F41EEDA416BFFFCC5C844AB
-2D23D4DC09B2D510504CE98D02E72020D9E669DDAA344C63A1B75632F912A1C0DA3885DA4AF7E243
-E4A4C6493D6595BB6D56B0359106957259E59E336BAAF35BD1CEC5CDE735272EBCCAE8D4904AEBD2
-B32610C6FEA2B69941D6542ECB44D71092A3CF067708A3D087AE99FF29671AB7DD8758759B971A08
-AE1BAD78270D2FBEE37AA2DCB119D72F6C7B0C8509018A70D0B0BE2C6830EF8E0B24B1CE1141EF87
-3A4D7DCC501F808BFD94E4DC0F2915AA023076BCC8006490A43685EA25AAFC187302EBDE7FE1965A
-04A5A398985D29F08E085127B56B057334D88EB638A4DDE64AFD204974C3939536B1B66A54B4DB81
-151853915718F70813F096CC1B0EA25E363B49264C2AD17158A4489F91453FBEDBDE15D7B74D7F98
-E81DF23251785D58295BA297F295AA6248A912CDD4F1111E6B628EECBB5139709E76EA4AB743CEC8
-26621D08E6BC64691CC90B3C3C1778931A28D3D5B1E20E96C643316613FC487C9B604C43463FA453
-3BCA1236286E6F5A6EEB2F1D9C34BDDE4595495A365F88055D9268541CF1654ACF478D384A5496A8
-772EA1402751A093582A6625A0A44816B5FDBE166835D598644296249B92CC90AA3FD6445C9A19BF
-27F59CB0616C7306070F33C7DF4E1DE64AC8C5BB2FFAC1EF2B1B30E5A0275E6004CF64BBE2C6710E
-DCFC3AA4ADD60106334708862FFA6652825BC84842736E47AE6917180365C75B27505EED3C6108E9
-898A780E20C3F606A860229AC46D0471ACA0187D6D539A1B8820F620F72B41AD1D3BF3834BF48CA2
-AFEA8BF535AF74C4562DEADCB63D2F5C7585722B77C989342D190FF926C8A5263B4F25286F99CF6F
-C62EE6E2AD61C82B29D82468AC10FD27764278E5558CE8B41BA111CB2F040914451A480C93084237
-CAC8F66BB7C6689F340B8ABF0150E06D5B1177278A4C08742FE22F42C28680F190900344ADFA486D
-59718C25D37275BCE4DF981AAC35D2C7E85C72A0188B8953CFA516FD545AEE0BF4B8BA301CFDE214
-4241FBDF3D204E3D2823301572E23F204C97305A82401660E12926EE7BA6EA1A81FF5C007933AFC7
-3266FAC4C134ED818A48E7DA01C71A46335C845F9DA5E960B25339D551582B375814148D94CFB781
-FC56093827B78578A73D4FF67B6B87F40CFA5E3F4325D9108CDB64BD06427B88C84105187316FA29
-90B4E3E8EDB6C78ABF164F4A9717D523794B2FE772A04DABBE688CCA977090979B5F47CEB90A1DBC
-167D305EAB231C9F4260C4AD10889CB785169902FC0BED78DA15B8417453BB65856EA0BEA5245BA0
-573F623D215F6C0CF801851C305B355D26B52B0B343645FE25C78A3526841EDA480919A1BBE5F56F
-C10ABEAA3E1FCCA7C43EE560F067F1AA2AFD642F769D1ACE8E2AAAF38850F0D757CD808C921D716E
-96FBC07DA7860DFA70CEAE2888C0ED3CBF9586443532B68DAED9A926655C157A416C383A53D8F283
-2A4E67468112A09ADC837ED8EC95F70852921F50D4417239FC42EE3624CA97F682745CC5E76CC7C6
-7BD99F2180F8C0B7FB49539C8CC474C25C0DDE491671FF329E51BCFA779346D4686835A3AD6633FC
-B5E0F67E0CA9CED8F215BEF4D240453EB2EDD6ADB22278AA5B985FA140C9834D38753DF2014F8C0E
-E6DAD19E8FC54C03C1F6CB0F858986691D99592562CAD95FA0A5B2ABE4A8B54B457D42E8C33A2D19
-51C0419A72FB94FDA78ECD92BD2A1416459E9DECA9469F35E4C47DB531726DEE8F203D7042EDB32F
-025DF3D582547BB1D45F7A5B70D317DF4EBB16E36B0D798E0932FD2A85B04FD67143E4B287A50416
-2C1F5A037CCD780088C5476385AF8168E12D97D44B0630621759173C8F1E3006B5B1C6D7138B7EEF
-C3CC5F54E24B2C3CA7B41AACFD25E554880AAF406EA4C3C6E21D3B550B040FB1952598A7E8E6488F
-E38288B2AEB6C4718338598A2BFE4D2B9D14C65732DA304C16FF3E1F8F03046EF095B65FD609DA87
-EC24A69278BFE65C905CD0329F6A486B8525B7EEA4F7AE56C2633CD83543269E8ACD6D71F500D82F
-DFBDE7F7F7B1AEE67328549232E26CA55085B6E84D9E2E7F74068F93A90C4654F2F396E57C5F76F7
-E61CBBE523DBFBA6E76638BBA3064DA025A79E3A294FE7F1CC28A3B4C57DD6FDC48E541A85534B25
-E1BC11B4F78019457239EAEFD4BE9007D205F1D985F389DB22400B279C10948551A6B4A17FBDA0FF
-C9428B18B43DC76EFB15FC2182216F1B60B4E344A03AD6C00F141EF99F89F24C819C3E32877A927D
-84C2D006940F39CA8B71E5951673EA9BFD1749923219DE38929ECAA9CE43B06CFA7DA1BBEDFDA56C
-61FF6C24F40E59B13870D5FDEB82D981154FAE5D6D5152DE69339359461A41A9713B6BBE47E868C9
-33CD74C75DB71D13BAE4DEC85E02FAA14EAD6C0A253B16C79514657B15E68CCFF9EE6AA385CFF9E2
-C53D9AE40F85C793E4E8FF50B2B7420F4FE69807BC5F37C3E300E6B3C3549D1D3246A2E70F091054
-1135BDF805E0A698E236B6496702D061241687B7B8D1A0E517DF0476DA09D89667A7AB375FD2672D
-CBAB8124E511502DDBD08BA04D941DF1CEBDCCF7ED48405CBCC33774A68C5212FC6F132641FF413C
-984F8B43BDFD7B1A2A3435F15AF07EF4970D3E4A0BB947C181E9CA27CC14A35BD1BD096875B45873
-8CA244F88C28728B74E25CB8C4FC1095A56CA75E4569AD3082EF194ADD11350DB3B74B96761D4538
-596FF7243B1E1B724716A144106E080D42036444FD472998460CE9ABBD05B42AF9389AC452BDBBA3
-A13A96890025789F16B9D92251FD3B3BEB2C61EDDB370A20456E3BFE5F4039E2557C451C524F8087
-015BAF3FF05F51869FB97512968BDB2B49589C1C7AF1E085250A47657465F480B7023E24C76731AC
-0EAB6704123D77977D3A2C4C56B691346EBE589C619C04515D34F81FC6A17527D5D8319013C5D4FF
-27CC3925E24C99231AC7FB9EAF0BBA482D3B75807AC85D03CD09DE5D9AE0B07B7A813F0449786500
-0AE8A7E00080300F0AB8C399057EDDBA273DD2E1B2A0DCEFAD3B332E6D4AC1FFAD846167DFD70E03
-46DAF84AF292D4F424256ED5AC4E104F80697050D50844A708EAC9E7F7784FD01646F3BD0C595CA5
-1EE6BD607D254E78ADDC5E15C3B6AC4940EC865A5C23105B6BE09EA09F2C05D6D76960A843B81EE4
-33977FAAC3CBDA85CDD2F4DB7C28293A77825635992AF8F3B38B4480D9A139B1662345A8ABE1634A
-77496C3F57597D2985E9E54717AB2E99CA35789441BCDDEDE9A9E2106B401D9684ADBEFE40D607F0
-75C179E9CC03E59E65430DB70B441D43DF03F2AA6FF06F224B6E455B01C64FB89EEC9103E48453A9
-749B4D602808C7E408A8903091D85E06AAF635D0D529C3CDD1B8479AC0F4208C284BB678A547F2BD
-77BB17C86D4560434F7AD1937760A6AA55B614CFA9FF8C9C96561AE6C8F2121C4E20237428BC51DF
-2099B6C49E3EFA18E6D439E6E6981E746EBB1DC461259D8EA0F8099C47CCA27B2D982B72C9A07CF2
-1B3C05D6E26E6E286E348B8944078E24809F9C5F3D014B4CBA02533F5621BFBA1F0EDB776C634746
-703C9F73BA89B1960A496420C68F54E5B901A6D733D7ACC79F275FFFB253F389AA480084468BB34D
-A1E797E43B7F6E8CAF5E8C93069A3A2730E57EC39B677BB73E3F07C2055599F7062E53B37A5F0099
-907D2ED87FF7A82C95FBAEB888033BDFD67BA3A6031A4CDC56CB1E4CF5B06B46E16D988BECCEFACB
-9E1C037023D7BF5CCF5D65AA66A17AB361BE7981F132A578F3ABFB97960A6034F052D9D5AFDC0679
-782EC90F240F943A5F9A3D969ED7399254FF67D89DF668F7C56FCEA1FFDCF20481474AC8495D3AF4
-B6D7EE093E369C057F0B70858220693B398ACF8E8143558132E4391405E30A73937C53402E459F4A
-A3539CF7A99A3F51C0307D045DF8B77757E92EA2F51BF0BB4F77D3904DD355665870C2B59F1ED7F8
-4FC71FDD7F0B6C5D3182DB77827CA6A2060D2B8C83C4EA4A432EF43A4D0A952CC6CBBE52A9F0CD66
-1A538973DE41FFE9C5CF55F2506B9EFEE51FBAE5E63BDCF5528499A47C031163C88D3022606784DE
-2F46A9C9235AEE3D4F71D4959B0CFDC5B7E78C8C0A8F9DC99440C2263DBACB343C5C648577F5610B
-50EAB1CF7FD02419EF3941C7CA0B0E64EBAD4B2CB05A0793DBC38F1946D44767BD287F5E9779C611
-CA0DAAA1E7393DBE0683C8D3455CDFEBC0E64B54B737E298DDA605227C0C4BBA87AA3EC7FA6EBAEC
-39E6EF2537D5974391D31739D9FC42983D81AEE44711C823F35F8E2321AC74943871739D2DBE9748
-FE68592263E7713F27E0D49B9B5CB7A4E55DE54E6B800D15856450FFD3AE5F287B12AE4F438B20AE
-9E27E6CAA00F3EAEADBE08432684FDF9931E925544A680182602A3C1997DE5D0630BD5A010535E66
-E1C123013D23966B3545C7431C39B97295BFA4099D14461004C42C85095EEACB9B47C593BC6DB863
-533A8619BAE09095DE8ECA432D4DDD49AA600D277E75DC3F5C6631E2A05382CB007825FADB77438D
-CFA78E252D79B6A196D5164C2FEB85D75ECA25FF80B1D97FE10E87960CA0FC47C41D3A213BF141B4
-8BC3AAA93FA86245064668394665BFD52D12C3BE4CE39EFD8111754398A944C3FD1AFA98EC337BAA
-AF899D35E804CF416AD7FE45FFF13FC6354007501043F98FE8428DE8013901BA6A28711A2CA85A27
-0BB135B72F1D5026E8217581860729E94F2F1878A0E96C59E9F62714FB5F8F25003DFC7347E99007
-8A9A331CB3A6A535BC61866F02513DEB982C4A13ADBFBAC3FF70A7335F40D5489E48E5EDEDEF1619
-1973D932479C62183B0E25EE8C4F76D4F1AE45DAEA4A12AEDD9EF81D248E8D19F8C8A5BECDD1EA1E
-98783EB7A38149170851B1942C96C53DE06DEF80913BFC04E539EC67C110498D15B78268853E5C72
-F485F8A27B768569E54241F6115875E2973292CF48FF91D45EBED627AE9F0766D22201B20AFDD40E
-5B17CF337F2999E0BD15B86E46EB3C18FC12B7DCADCF9DD50C6C7E3F37E615A892DB3F57E250A072
-A49F7277DD6A2C8042698233D35A699B17ECA5DBDA6D250ED4A16FCC893BF0DC2E33FB1EBD7DEDEA
-3C1C39603C8B7E1A5A833A8FCDD5570BD088749BB232615366687962C7E56ED089CD7B092505CAFA
-5A80F503C4CF337F07ADF0D106937E25670839D491F7BFF7A523DB609D126328C16113ECBCBF9C40
-04904427A108618AE5D4ED809F8CCAF72251104C94EC5BEE21F91B179D31DBA79CEEE5EC7FF698EB
-84AB1D2D1A624F58B3622A78844CE51498B2CEF38EAFE259D22C7BA61104651A862008BC1DDDA58C
-C45F663EB26428DAA85E7785363A69D2790996EF5D9621D53042F42F794962FEA46E46F37B8AD1FB
-76FC8D5CF2146843F8CC625139C75FB42DDA71A752BAC48F294E4C0C8289FC46DA5EFD9C91BDA6D0
-27518B7E81E8B21F755A9615627D5812ACA674D1527A1185EED4E3C628196E7D0759B1CAE6B9B7E9
-01E9599A65230F1EE469CD33B9BD9C104C44E3C1AB966C9678BD0AD78111A4E0F2D07A01A038CEDE
-7036D0534D684A1562A17AD64A00F279200C0371B1CBA61747671D2A21D3F9646CA290F6B82418A9
-6FA177C6278277504B7FBA936325F5FA124AB018A15DC18D2C5E8F93CDEEA52BEEDB78A57828D81A
-3E6C38B9FAF3DC4EB7273ECE3EA4482A1C6242A335862C2C3717F9C9ED95F77B140C4E1569B2192F
-C7DCF702D0BC9A50428EC406F8BD0CAF886B4D979320D3E429816D88F7C7146D960AC12E70F2CB7A
-9F4E3E366665AB3F1B4B6440F55EEA26DC9EE0096BB7763731740A537766490C8C174723BF0EB40C
-53701AAD12B21D436ADCE22203C1053A9DC4E9F17AE617888C4B4E6F3A720E4E6366BA628221A387
-D8AB15E04AD69387C310D3528BD2FAA5B22BFF3FA494F5FBFAC4F771C9C7402B95580C5AC4BB3AF6
-92A70CB2C851FA5CF1173EEC3EC29B5A05A0B728BBBB51D3B7AD8B0AF17A1563E82FAFD93F8B7118
-1FB7AFE352874F4EC6D334AB6747519AB8E847B7BCED33EB5458A828E074E74BA621BDCD03FEA604
-7F7B6ABDA01FC7514BA1AFF0D4D0C0CB8F4E42D5A87E395D9ACDD02CCC220C157153422018725846
-009A3ACD8C8CDDB66BC6836B4026FD9F526AA275D06C813179E5924F26A25094E7BDA8BD26AFC4CE
-B41D8964D4FC4AF1DFB0595BC5D6714C32F15DC7194E9A3A73013C45D8FA55CC0550A12D9AAE8E9F
-F199FA28EFC2426D8D1DEFB93A65717AF3EA8E2D5B4AA8EF0EF38E9600F7D4E7D9F1D67A2E63ECE4
-789FA74B159BFE2F91C19B0378BA52E93DF12830D99553B6618645E26126842AB70262D96E35E5E7
-50ECA0CE3458B3E51BEE2F21191136DFDBCA39BDC07939E521E4F492F392DEBD029C1EA237BD89AF
-76BC89F618D530160AB16269FA6B693CF14BDC4EC7C630025703C5337F61458FA09104EB15C7CB20
-AA4C9BDB7CEF3A09F25BC7F3149951A7CD75372993B80CD2112F7674CEFD6AFA764AA3486730D2C1
-897A264D82A91709FEC4A21E30D812F558451804EE6F3DEE2C4C437846BCBDA07C5B6CBA1D94AF02
-9163B7383CAC6E088AB1DC14ED3743EE77E26EA7AD3119A76C0B5F925C4DE305CD7BB3A09A453947
-5B9BD79BE28FC462D8718CE05F9D94CAF3387BA55E6E447BF81A9EDDD3A34E17BE66BC52B0C0BB6F
-86F6F008829173816D205182ED2ECED319864A796AB65D4E3950288BADA94FA32B6F453AFDFC6C39
-A4FCFE60353A64627E2057D4B379D3240012B3BB0ED0C7876CB83C1BA5EFB6E2A03F340C2B576731
-F848F762A7E1CCAF267EE06D621BC33FC245D0E1547ADC12CC0EB58B26BABDB8EAE9CBFBAB93836F
-FF22BDA1831DD01B7346AD377AA298D84628BF1C07433284B0A90FC89F5AEB2651BA2CEA405D4F52
-DDC0E74B871D43F71EB4ACE0D2B401F9348EAC3A2EF0AD295036BF6CF6F870D58E00B619D50EA7DD
-77BC28DEF91D805CD527DCBCFDC16C042BF9B874E3B1567EBA4C1E70744B9E7E5BD1FDA6A5FF6E10
-1613FBE58DC46CFAC1A65ADAF65E49757E9304E2AC9A91E0588600C709A61D4231730073A36D473F
-518A145E141D0A5A494441B9EA99AC23F60F54F8127B477E1CE698BB4129B4B1DFEEDF10D9E665C2
-47A62F112F5CA30B0AE5DBF3E495FF06EB28EB438CE8AAAD84D5F50FB56A3AF002C23BCF66ABC270
-7AC233FC0F2723DB99D2CFE7D3B3667732A531F5DC315CE74EDB9050BF75D29E6430F57CB6778B2A
-CBD57DFCEF896E6766C8FC5C9F9FBD701CD62CACF33EE0FC95E78DADD205B5F42CC63024624BAA0A
-B4DD447832B4E1DBA77BDFADD223989F8E958C8D759AAA37930664C6EFEC708116248A2A7AF3D656
-DDEAFD009B7F5333854608E67E5E588A857167ADF9225CF6C641F5E19C3E08678A281199EDDAC831
-B57223B1BEEADFDCBC8F6F25D32FCA2336C808162E8F381656E847FB6CB13969572425AA05AC830C
-33DE6E030F86A3A85D2A66A77F103C7042C97205526DC882EA9A00EB8BD5519847EB424C15F808A9
-1652A6CC89B66A5731126DEBADE123C63D88A2E550FACDEB3886FF98646000C64B3A91078012CA30
-904B71737CEF6BECABD43DD702880538F5A70085E6CC6015D2163681067C3D513A8C66032C34A0FE
-17A58AD4BC97CA69BF41F11D5E910FDFE9729652D3EA21F8DD8CC19160A8FC77573B1E9CEF4E790A
-79D8AD6723B6804E9616466C935303E063DEE29CAA6C3BAEBF278B818C2EC2F13ED645AB452397BF
-00DB8B26E115026E256746CD0C78A959364FDE6DEDDCD0F441A61A1EBA32C7BC172BB09512148D1E
-BAC9E791B7D51B71CAD2DC9B83B2F99B3726607D9CBE58B499A13753CE87FCDCE21C0AD0528ED0EF
-B9B2C927F57C78C626248AA2B835A0791244C5896686A66173EC9F802C4C633A42B086334D2A4878
-0E53D00809247BE64E529F96AD2F8B3922A6097D414DDE1EC76F9552F9B8D58B8E34F359AD792B2B
-E50C26DB05035E7497162E7C49C38D3CD9B98D620AA67492BE5AFCA3A81A7080185C7F0B5105223F
-1FA77805502A2E8C5FEEA27699858D84A95842C5F2FB68686D59FE24091FCDDE139B6463BC6C7B1E
-0E90D20A83651AF00C85797BB9F53ECEC1675C7EE636D0D9E77DBD8F89670F855EE4D4800FF3F695
-0EFF09BBF8A0DAF6B8242840CFA5BA73BEB95115F4A78BCC02D85ECCE0C0F2EF6F328AD1DD6CC049
-5A3315B414A4D61DA50DA46D7ACCEFF6EE56451805D26B0359AF193531F95F6589CEAD6FA041AF15
-3067F88A0A2FECD135C56682DB2B45A71D1FA737C064EE9A4F404BB72A70B3AF0330359393247EC7
-81512482579865240A23CD8479F21C2C44A119EBC4E81B308DD8AA86E60C3DD8ADA50E0DFE8308EB
-1A7F201EDE8DCFDA405AEFB47E0E6CA7DDB376DCB21D37F7ACC4D3E9F26B03A8DE0E8940CA3A9E75
-963A389DF8038D2C486072F61C0CEAF500753C7A6352B1CD0338D9212B42A4D3DA23D5BDF44C27C9
-4B88A415A3242FFE2E1B332477A21D2B9CE075EE479C6E657A4D8874A8C53964229310E01ED4F3C6
-86FEF5258EDF3B464DD6FFD7F1CAF473BBE722D60FB14AB4918E93878A8AE4773930B8CEE110F476
-7F42A52D9304C55BE12846C911A10AB9B2E036BF9DFD597F5348D42233315FA80D0F563C388BC253
-2103F05E90DBF1923F229F980A2F4585C7A373511372D07DCBACA583099EA972C03E5AA67E663882
-6DB134564DB993CEEB6E7A6659C7C5C05C310267D5F8A24EEC2D5CC3E3F3C808E6D6068D1A57646B
-37FABD98ECB7BAF99E7D9AC4414A491A73CA34C52F394352F6B5A15F0FC4D88622DAC694699C2464
-84ADAC3B1D366AFEDE2A2CD2042C90516A666A19A91C80248B11224BEDDF1A320E230739E755D098
-B6A67315535F4C187CFA67ED817A035056353FC859BF286317996FFFB478A2248B908FF12ABDE705
-402224A3EE5F463DD3D243875C84E02DB968ECA1CC52C75171EA50D6A88CA91327A7AA5795019F36
-C0A19C093A1C9D3723C7568F9D41F2E4FFB712FD47F897703D7A620B586B81936C84AAED61D84332
-B3BEBC4F95B796B93EF7A1F565C494F8A65EDB21E2EE18DC025522EF8E599887CA2836069CDDD889
-88E5862977B7472584303198CCE97EF9F9E1446D1F1F5ED1CFC666A8A0C3A03E1792EFB60A9B4065
-49E0DEDF6ACCDBD98742568B4735A747D8E5DE21E630125AE0C691D054E42199C15B1F80CAFA6E7B
-B2005F374A9A5F9900ABB7409CCD50C3AFCCAB1214E6A856F7C7EBA89BC3291801E1343DA9DAD2C6
-ED075C8ECA1423B43E587AEC67E6145272814B3F191B3C285639F9E2D6E148A02DC2CBC0E054D629
-5CD05DBAC1950400A9189316F0265B86A732D302C5BEE8ED233768F237C62600CBAAFF3A110D5EFB
-6CC7CA3B92D965CA7C5E8D3E64ECF239FE2507FC797FDBE54C1112B28D4DA44C60AB09D994C5BA78
-D663A2591934CC052BC70CD1DCA3325C66C9CB982E2039F5DB70C848D3DCEF655B1C2CD0CEC8865F
-E8E1C0A267BE4F707ECE6F5A3DFCA3CC1EDF92C760439F51AA69A4C1801E96CA4D6EA4AD980258F3
-D15C893913ABCE09101984C61B91D603053E49A97CB82FBA707DAE8AF1D579FD69C8481CB7B712CB
-CDDB4D287BE995E32C02B399602A08B9DD849039B5673F1930BEC7BF366EB082D2CA5DB2385C8CC4
-5BE3FC0E31820191A814EBA7C4F23B1938E6C4D800732787CD2CB97F762DFC85D4B798809B5F2254
-D826CA42B32695428D120298B44CF38494E56240B75DF1E41E46E53C44DC505452256DFEC819408D
-605FF14D6C1F3F152F2FEA96EA0AB3B472D8704E06BE9F8C3E8395CAADD06D6DA033E81ADE5DC3B8
-3DAFF743C6E9E48716003D358DF63CD7FD3E2F727D1F2D0C29962F76D5C95ED44B6F08D052025A66
-5785F264A3D5F5593677B630E628B5EA81FB37CFFD7A30B7FAD226B6FDC82B0878AF4C0EC4F4243A
-807B9839EA62BCBDF7C2E9B30A623876E632E084EBF4A21EDA04FC88A1C07021D0C72EC3E969D449
-FEB08E5826EC20E55B21EA71EA59F6E3B0710B0DDAB3261B4A2029ECAB68C19ADD5174E55D5E984A
-4E5F38F592A302FEE6ECE732DDE841A28672C620CC5D687455A5C06FA9FE688394A04F96312ED025
-B7AA6FBCE2925F3AE559CC1886BEECDB70822E2E5CA3F732A87404B1536AAC469989E9610CFA440A
-CE43875A70CA51F36CB6F629D9424C1E35A88F92D5DA3CD8CBAE6E8425A36968E21F4F30349749E0
-205BFF8D552837D6FC39532525370BBAC833F75F1854C93FC533A4AA53ADF7008173A70D94A4EBF5
-38EA9E62BCDA7C20E0A073BEE2EFAC34D2EF1D03BABD5147659E50B557045B2EB89DB303749B04D3
-F54B43FED612FCC68206E001A7AFE90230D9C12F74A32C7EDB5D0241DC3A5D51481FD7C8FAE08FEE
-263FBCED7C7D911B3A303C835AF5FADFD218F61A9D6DE80485ABCA88200047B094441F7767B97A24
-E8C612590FA2407BAB1E8B56C71914EEF2355DD97CFAFCC192BC06FCE063D3D9D1A629AADC75E3BF
-207234C208E7E30663EDD691043065C9CBC473D97C6D4DD3DFF59D6A9ABCDD4412C3128F603160AA
-D8F81C6E7A4DCAF35F3A99B4EA10A34375B477C2BF846521A7EABD4D28078E9340452A198F3F5ACC
-3DB7E3908939FF6E3709C6A3FD9889439A4AE3E10B618CC92E14B68429A3AD2C80940A1079452EC2
-66F254657BE7D79A2A24084AF73F6DF71FBCD32BF6913A3FAB25F977787F7BB0C3A3E8BAB38D7A2D
-B0B4826950643DD1E03BD7DD1FB149A33862A89226B7CB454DAF613128C2075470E42E70A9444A8E
-6ECA526345AB48E6F5160BA23B5BDDFDA6049EC44ED1461C7E0DD514B16E2FB285F72039DE3C7982
-EFD40D7F6C8E8F4CF35AC71B467BFC578002E8D2239A2FD2C4BCCDD8AF3D7DB1F4AE7F2D2E0811DF
-9D0155BA6EDE50B5F052F14F6AB884FFF244D8806C07EBCB49ED22D85DF696995991A954AA97A1EC
-D86ACD76E061B7541E87997FEF0657A826BD88EF3A4A5920462C6595E7A156F453291CA044CED810
-860C3B0149BCE73BECA713040664AD0591304106129600AF71317B0D2907839CEAC99515D357E980
-B1937B6E1200AACADA205421001F1B2F91753E80D2263C56AA164A74701A8D5FD28E46480B0DD963
-A683A1F355D7FB4463C7347C94EA5E2CA40B60B56297CB22D972C5BB10E56715A955605256C1541D
-9F3BC5768A6F355CD3B863F0FA1A781EDB49368F51B29481CBB41D4AEB07AF9DBE8F52C5D0FF75F7
-FB6431D37D6AED84D78C778871CB0F715B4F07580F23B586C969C81B471FF6A6C7276F7E141E02A8
-584D4B9AB00E7BD643D2C3FAAA299B1F1E25048461952EA42D4882768A70DE46B213A287F8D31AC4
-6D5436F22A796C05D1FE50A9BC2A928066627A0D87DD57A3AD91DB446404B41557D1457873482005
-EA20916BBE46C613F456C849D46BA79D20627B446B2F49E3FA309AE14F8C420CFD94922CBC0FB9D3
-5A0F7DBEF577F1849A1A80E0011DA8AC082A8C6F61658E65AD177ABDF23EE17C8CF0D26B9FA3A6E9
-4837EB9E930336889767A8D7EA3CE980A8EA95528B004957BE6067CD9BD8E02A0F23CC1762CCA656
-D33412FF45E917FD4A03EB6E8C1F43FDB0A8965A33B4FD26BC24A20B304CA817E88495BA9B361A3E
-933717FFB0271F7F70C5D3CBA1E86D0F51BF3ABA194DAF32C35C796627D00C7B2271ACE2463E37E9
-7B3C826CF3DB60028F240F9452CBE08F7EBCC5FDB1BCBB3C327A9F450B9E5671916101D6E3E5E458
-CA31F04D12F592F83BADA2C3683D3886AA3B403963AB5DBE220FEC00037A745839F67A3635DFD3BF
-F08F367482962DED88ECF6322852D643A54D5D303EB04BFDDEE9BBA1EBCCBA7C653B3A613A8E719A
-DEBE3CE1BD7E754E5F4977E863E3C2D388A65227B451D4F3A4F94E06513CBA4AC1F2F511613FF035
-611684CCC461599000E546E4D972CA6960E095A526E4735A23421A4C9B597ECE08AFA2753592BD16
-DED93255A1E33DEECE3C5EB77B94670E8137F2A4A4B98AC193258E7DEA5DB8408A806188F2D1DDC4
-40CCF0E9A6E2F0C78FDBD7B68DD4939D2458C1965BF8BED4564B32462FFF3EC892C03B11D3EA813F
-AB4CFBE8D3016329C5B7E3DFED0F08284D44AA0B7A2F6BC96EA4503E8EF52A64C22BED6B452581AE
-8FF8917D53976471941A9116A2D878FB2541B561767ABD4E31CCD8A590CA03494C62AFFD64EA0A1B
-C779173DAD84999C7A8D844EB1259DE7BB5B25CD023537A474A524EBE4660B22568949E624D8FEA0
-AD37F4CE1EC75955EEFA49C6BF1803BE87E9C9865FF3F6B8525B8C15FE8835CA153D27E6C0FF0CA5
-1029A7A9185D25F0F14D86FC797DCC1F99EE97E2054B9C2A2E06FDBEB8DEF6CDD368BF23A858D9F8
-C1DEFDCEAF1B4A8DE5EAFC604CECCF0D285BE00AA912EAB66EFF4D37AD2EFE34853BBFD87CE09B18
-749B489943EECAE7887B006FB827D10191DAD18466CD1F86505879310A8B171F902EA0C26A388E13
-B53C700272CEE2BFB47ACB58247C13449C6BB9D01232C32517358F1A3DE064D43C18F8827D53789C
-CF3CE2EBE78949A6ABFA1A6B8414CE360A5E22AFB7D1DCE6F5A06182C3B984B4F9BB1A905A9D5A14
-83750A1DE0A857CD5C06945EB7D4A2A6BF1237F32A154FDC06D51A703D44FE052FD3C53E9E8F417B
-35D1C851F9203A8997521529F21AD8498F96930AA77EBAF82EE02A57BC77C792D9F220294B45F48E
-A8FD94E01CD25645D36D168923562F3FDC93CB79DD4760DA0C103C2675722D7A1B79FCB4245ED12F
-A0DB52492C9CCE58B333CFEE822812F7DCA68E802C451B5CFAEBAC608B950386B6C58239D1C62D62
-4DD5D15782FC552222CCA06DDF387B373E32C3C2864C63C768350C37283760F3515A5B0AFD66C48A
-B522EB3E808C061F5CD6BD96CD18C9839D30508E7D4EDB88E8F11E31E10919B16B7971F06D7877A0
-58D8A4944C84FC6CAEDF3341B48B6E0D3C7B85D710E0C35F5B5053CF4B4798B3778CC28B2DC7AE0D
-F3A49F9F3BCD8E95D746C35C3F47D68B8AA35D97AA08E711B5FBE70D1A623C82541EBDC51A827D0A
-69E6C049087AD26F256EB7577F58CCFFBCCBA5A95D093DC29464C9A38DE95BC6B1853963B2DEB0B5
-7AD1248D6F1625E115EEB9510B5772AAE4E3C866657DB0B3BF0E0AC345E116F8D4976B770876FFE3
-748C36165522991F46A36F193DD1A1C94713673C7E4C81582391B636C72DE94CE6254374F99B623E
-5686C13D8A8322E83E11BB0B0A896C6A8C2C4F756C5385CD7017F26D23F7C3EE97372C868C8C9155
-81723BB6B76B4C3CE8998E4FA6CA40B633DFDAA59BA902A4952DA90EC4FC3CF0F2676ACFA7F76F78
-236FA2DE10FD3545357215246BB7E527F277C28B353CC6D79DCEF21BCC8F77603CDD58A2CCDDBE3A
-9802F941CED8E035313875319548C41992A2BE939A17CC109426E33825AE59BCD17CB19F50D972FF
-CBE7D9B4B0BB095303D9DC9D406696C2508D6CE99E11CF00F6461147E97449ED5F486D480A86D3A7
-ACECB7E9A945984724EFC21C5079B1FD03ED803C2DEAFCE3327D2D7827715FD65D9506216C88B0FA
-26935E95C64114A51919D419038B1A7E9C1E829FBFB53275093752DF19891A97F3CBF7719C1FD6CB
-17019A6D2D25360ECA804C4B35172662CC4769D2B785C6C87E5A4ECCE31704E59F71263B7C3CAEC8
-ACB4C7426EC25F11A0042323EE6C3EEB04284DBAE2C770BC419DCE79BD4560AEA41571C3B595F525
-60191DC7A8FBF63D413A77A0905E517441B16C2B501EA2F9E99CC38D052679F288FDF1894542E3A6
-6989A0090185EB2E75134BFA3D9147C3DB8A621D9D35E37786853779E157B47F71626D6B3E633005
-9159C17596C1B87FE2B4FF47ED9D78FA4C2160077276C8B58CEF5DC030B4A5D83CF257096C047FE6
-4DE307C598B815058E72D5F57DF5C369E664E137DE29349E2F9DCD8C9F4EBA6E765B6327D7A20DFC
-B20711273FD8091CBA605C4C494248076F7E03DF65A6A50164980BBBB708741E5BF6056E6F996DC0
-7FFF408C5B8EAB8DCEC315E92873228C805D4440A6470E3EE3983758DD211C9CECDBFAA4C9300CBA
-00608A4B2404A3C7AF017A3B7E67F39F0B51ACF950D3E75CC7BC2B8D3480202FA958E8EE0B240501
-5232EE0D264C7CA02C18CA45CB3C2DE322D3EB7F00F9455DB6C5B1F4E59C3E95520EC36D7D903CBB
-625D70B54BF6F8255E412604BBB29FEE026CC660577F91DB1DB4A613EEEFB20CF7AE3CD89D565AC8
-38416B01B5DE4FFA5550D17FB51FBBEBE21CF1D56038863EE931B90DEC2E211ED42BA92EC244D4CE
-2C4EC5CA87A026992772DC2AF754FC982B94F36EA7B7BF75E0ECE90CBB2A6AA1A012E8898BD679C2
-3CB3827C35D5D02F0569C7AA82615D4AA67518ECF668D3B57D6EF1A8013424AC2268BA0D9A74D588
-79EDCF6382A89D397864940303EAEC45A38304BA8B1CB198967AE23EB81054BE74B16909A405E8A7
-799CEE3C270FE2A6DC50BD7370B6B2C8FDB9A87D88D5D40348D3984E39C693B6F4486D994778607A
-80A3122872DD65E40492107C71C3CF708A9717E9EEFAFBDDC239C53AA9645B711038E59C8B861B37
-411AB2039BEDF9CFD00F08D9C5D76154427FF5DD39878CECC5D7BFB3F1F035087185C0981F3C2139
-BE84872FFAD3408531C4EA9387B89F5E3EC779E8850D50992DFDCF9132BC551E985943B07618AC10
-D1150451F0844C0DC41D6E17EB508DC8689EC726400D5A7F6FEB3CC7BCE05F09228B7CB2C5393664
-D8DD9A4B96B1020EF25D70AA2D91CAE93AFB5F2BF0AA18CA5C599FA1A708EF35BF8F7FFEC9AFC1F2
-42870D028B2B1459063B493943EF1283829783E1010242E5CF4DA39D93D506F3892936E7D6CF1124
-70A521D397438733D053944CFF12D6FFAE8246F20618684F263715AA98E15D72A526383E05C23214
-B78338E5B476F0981D90056E6E5D0DB66B1DF2298E597B2ABE1D817E18BEB056E65EDB4234342D96
-00470B1420C9210419D834E431B82F58608C87AC361A02D0F1FE4B470A3D71E0D21BB87E1023D428
-E23D596CB9E1A2184403A16E36E644BCCF9BBDE27290485057E62827283E7380AF786BF395B3961B
-A5EA469C315763FA59E0F176EF81985F38B882DE56A74D128E256D1B89939728E55A92ABA21A6B78
-44FAC1BA7BBDD8B34A18194A2984B000380FE9F672E83EFDBF276FE797A325815B0F25CC95C97A9D
-ACF56D583486305D7C9E51A7E337D14E3B900333EB38FD93A99587DA2341B10C059C71CE080FE753
-3C0F059FA40E560AF9C4A41A4BE6FB45846FF8F78165E10B4AD40F264BCF5596A1E8EF8CB6EA4B1A
-3A5C69059AB1563843679ECB2511A90E8898F54295649CB73D277760D8D04ABACC7BCC6E777A0530
-E2067CCBC08673F9C8C178F9D672AC8A15E5367F0C5651B53E75E0CFA57C931746AE1A679C246D7C
-9417F1CD89DDDBD1173C2F880B7B3847CBCCEBF99F7122E832D7C9BAFE2B54CBAA1ED48158DE3F36
-238B76B0E67644A28AEA996DDC006F6AC0242E4B667639E7523CBC90A0561193C1AF34481C2EF402
-EE43A82E1EBF4E3D601BB36B2D95CD93550D61CEE7A94E72F6D30C32C8F91A61E964B1F66ACFC398
-7F95D4028F116E9A9A8474AA29C1C1A984BE0E393BDC41DCEF6A6F1018DB60D52024899D8EB5D55D
-324D73F39BFA47377B9E15B3B06A7585589FCF52A54684173E5183367E7B0952DC4BC2767C4C6247
-B1D6103E52BC7B7EA6298F454C5D97AC575F19C10ACDFF4E10C7D3755CFAB4200CAC545269FF1D8D
-B0D607C7AD47F40DDF257AB4E7D0750577003C13E4941960C3DD7B0774DDAC18E8ABAF8F53E03CBE
-F6D57B44F24CF821014C064278FD51B3427593D17694B4ABCE81F49CBB984C5878CDF0C38D1ED7FD
-99B0B9A3BD8D8FF6219588B3B8FA59D0CDD1D9B2F65122AB45E48F1757467B9204926140E3C350C5
-A927A2E700173053EC35D3F1DA2D7258714C97FAA857F0898917BD94625C6D1E2D77138EFCAAAF51
-7B17FE187A2212C24A881A2C6A647DEF6376ED80AE4175C5EE80921F001995B44E49F0D33DD9075A
-CF33BB03671C0BCC34AD5784AD1CDFED3A6D9BA103B3DDC1CC2DE74DBB576A0277715275218CD19C
-A8899209125266D8BF1286F881DCC2C383749D1E768D670F4099F7DE959EDFE852583183C9111601
-2881A56A24AAF020EA45CD5F39660DEBCE30AC1C7B8CFC60387B1B0C3E361BE612FDFA9F01B7E4B4
-A18839A2C7E0E393EBC5AD9A8A4EBC316A740C1C295D9EF5F4DFFA0667F9582C0BB837B142C4CFC6
-B1798E9476D0631111033B8BA75A10FDC800E2AB1E0E829632F869CFE4737BE9E2800759EE0831DC
-7D1195EAF80555771981DD6DC6606812D92CB8EF86447F5F6C6F626D0E265C67E52A6319189EE349
-D48E49DFE6A9E98F76C414A1E3217AE0A215A17E54AA498F4ECDC50242ACC7E2322F63BB2FF2189D
-057E7354E32A3ED1803116176B9B9D0129930F919E2FEC280B2C8924E49E7BB75768A2EE1DA8ADBE
-D4E3589906DF1B923AEF84C1BD327438B731012E69BB0D43A1842CB88BB54EA4516477F704CFEB28
-6E3EA483445AD4D74586FCF32E96D366901084365F693A53C5FB532FBFE7BC0CADC404C4985042D6
-8DBB90A6DCDA3531EE324D558A214F935CD9FCC9A0CEBE9B5FB0323F4B3820529599EF48EE068B5A
-CE85004FEA2984F0A86F5AC9D56163BBFE1142B774148F1EB0A4DC89C3349052533A7DE66729DB24
-41B82F8F7360111DACF69293C9B281A0534F3E9E9224A75C49A832F28B2E497262475507B6DDFA9F
-01CA0A6696E3F5AC7EA68595EBA0C2EB8A47813FF936D84AC1B23ECA7AA2862B793CCBB0DF9FDD49
-31BEF354CEC12FBF478559FEC29F81ADF4452E83963E56541D31F3691C93A50F0BBA5E9552C4F2A2
-3A6E53060729854A3DD71CC4308B91957DB19E66AAA18FA67055A950F1C2CFF78A03BC1A588CF624
-696068068719AFB1001C4581EE072113882D9052B21E355D401ED8CD24D067B99E616BDA5A0A5A93
-36FC499632B79FF2FD0DEFB096EF46B75E2D4E0F48DAEA239719FEC4D9A29818F5875FC5041A9EDB
-D26CAF0ACE14CC80BA49BBA59E918EB3D8F1E541AA16026585A2F72DF7D83541816DE46981FB3EFD
-0C30E458CFAD04C79421AB7C4925E23AEA07F9F018431C790002596D26BD9663B51B699DF53E4882
-CBC34EDE88EB55045B889B6062E35FD1E018BCE785157B85EC3B9CA6C85D4B16238275385B8285DB
-012D8FB7C9F5B946A41D7A0FB878FF72C39683144D8A007CFF631B43748F2D5FC690300F9BC0C837
-006B92ECEBE0605E8C3A4A400E18AE8997D1B45FEE10068E247C647CF82C6DFBE5E881D511FFA687
-B7AEB78546BFD07D5F7EC242DCEF4930D8AAAD8C6152B6642AAC325963FD147F236BB850A9966573
-9D06CDBD7CA79A527DCF461E33F22BC9C5DB00DA2BD3DDDD8C99D99793BC98282AA8872FF96C3942
-85D82D9419EB78B6AE37A5F519397700F75D624A09BD255B576E955A323E784E8FC31131F003B0E3
-024A4F58FEF2A6C043796201FC425482E1155E229D1B2D43EF7B0D22322B22EF5C9A1BE026A1C3D3
-75EDAFF99597E1E5477952A4E8D2ACF5D014BC00DC2A272FA62B6983E27D228881E2EF2B8B95A681
-CBE90C5FDE16331C85222FE2A16F0A3C3000A63E2E21666C0C119F8AF89A543D37977069A5ACF155
-6324F05204CE8CAD50FF4FB630D9CBBFC324DEDA584AA56A99D3A76FF55BDC2C2EA3A021361CCD4A
-83C7A5E2768D210FA6DE889FD48A39D679C94EC3C99A8D33FF11377DA7F6F1B71A2A05B302ECDE95
-4F26773F39AC881542F0D0969C3995C3519A8EF70B4220D86BF01BEECC6462855E7B686E1AFF1CA9
-1FB8FD8B4A69E10EE0C2AD94ADD44449506F9B6EF43641F2026EFF6E605C670560C2B74706FB949A
-A7E8CC6A2D0D6207E457E7FD87EC1B9092DC68B9143947CC8ED14AFDDCBF8FDDA228A76847F96802
-E561F67CEEFDE45AE587673983FC04C96744DBAA83F2DC838D633943C75DCB9E6410474EB27B348F
-26E505F0AB90878940E846C5E9F3C5FE8C3558C3236B1B88C405716949B8506841CABE1717474BB7
-C30DB91CDEE33B0F844811762FAEC535BDCF84C1C747CEF9B1FA61D2AFB5A81335BC42C06A94D7D5
-9B7EDE55BCF6F9867AEE107555CDD084B7684C2C87087475A39A9DA6347BE281CE5635A4D07865BA
-98CE26C1465B1AB0343F49FF37B4D0CA9F3BB693D78DC3B21925CB996A038DCC172527FE57C07460
-EF39C07D4396E7FA970D9F22ABD21A9C794B64AD96762C7428F59A8757C36D6C4FFB23216195A04C
-2A2C2E7B10EF7193931544D782FEE4B91E01119C5553BBC6252270A8D8C56DD62D448F5AD8DC69CC
-B45E1F17F0AA1E445129DD00F000005B23D38DE93A3BE55A4C041947F36B4E4536E307D0180553F9
-2E46B743881CB5D5386C48C7D5F84C2BCD06B9C501F78C7EE61FA23516791FCF4DB278AF688A2E60
-10A56692AD92008497487EDFE4BD5FA083FA544138B20D6940020887E35D46E093B71F7A04A67460
-DC8116B4D4839625D7CA6959D6831CD93F81AC4EA2709036DD738364FDE71113BF22EBF13DFE1642
-E564701E6F0FFE7511EDF03FE448C2B28C64FB7D54B94CA576E481FA56B2B18AF10C71F699B6BFD4
-7459CDE1869D0FD306BF489A6F42E5B2F05CCF55BB6B9526973D19CB134CA7F13F1DB3716F8CC217
-73A832568C16250B5CDB16DF24BF81D49F5B37018BD310262EA7078107868AB0216CEC83CEFCAB1E
-9F2C665A31585CA04DC01879CAA79AAA5AB201B516F7052B01B16BEE5606098393B0E5D9F9E5E3F4
-EB20F63C958E796DF41CF28839F5C62A0431648745D7837B519F3AA36BC6C08EF040CCF53D9B6D8C
-0C7D1A84D707EC57A3C6AC9A62AB37251A01A5ED40FDEC6F5BE6E34C6A91D058319439778A2EE5D0
-363E2E1F33463C33327D05FFC0CBF08D5BC457C7230448972FB9B4D0D782BA7DBF10D3FFEF8BF523
-6EC16D4DD6D0D870D9D5EB5C64C9A46A4F583D4F831FEE74B0E5B33A09ABFD4444929BD8F638CD72
-EAB99CF2E9551DF427683964A592E49D186F285258C5D5F62196A98532421D73E3495F82695FEEC6
-E1952C562D546B28618FFAEEBEFF03A57F4D855021F85B0C7BC37FCC6DA9AECA099B646B99D41896
-09D3FF2D56422F8C37E97640293EC7C90E3380887836F4938FBF495CAC14FBA5648D89282D8D49D9
-1AF73ED36581139D8BD42551E263E830EA3C6EB381D85C42D74C50DB0CCAEC03F535ADE92128A016
-0E811C34748309AF7604919B66CD43EB5CA975302DCB6076FEB6BDD6FF55976FE990FB0CE9ABB11B
-195403FB26E3D6C6A0DE1C5BE79E171A61E21F79EE8DBE7A832519813EF6B33EA098C2C32ADEA219
-AB2AAC8B093F40000995539D1276D5F2EF84CCD099B71FE4269BDBDB6A8D59C86F7D2E3FBCCF8773
-D0FAE97640BC1AD43CB4B992BFADFB09DBD0CAAEB8CD9DA264187C4F97300E9A6C9DEED5525479E6
-05C65AE336CBBDF4E5D7F79AD098F977285E065579B748FEAA97F2A753E1F962FCAB68D72BAA8EE4
-FF6691C23E31BC0F3E981A96FB440404856AE1AB32A7205B17D411D8F21C8C93B704D07EC594422A
-BC368CDA2B1610CE6A973F4474E12B78B532666797F5755D269772C9F5400B3BFC6C58395D38527E
-2CCCF29B56123F7DCEF3BDE5DC1DFC5B0293BB125085B1D2D929BC3EE84F4FAD571A4991C3DEE03F
-2DB3A3097E52B1A7D5C73CCB6148EAC62E8E36DE9A71C57638C6E4D5D9DED18174E8C390E50B4A5B
-913C074EEAEBE390B214B3A68F02862B9A296DB4B409769649E51D738CBBDFB7702E15C73C2AFC6B
-C37CE15171F4E822CF20EFE55D9F061AA43E648989628FF79E65932390CBB15D8E621333B18B11C3
-BDF96F841D7434E01AD501FEA964A75B248A35CD9DF9A37E48A1E5A09C624B93CE44F0042FA00D7F
-9EE89B9F7AB785E9C718CF6E7228F743271C2C9BBA17E5208B920E44E765D99D86650EB454B0FAAA
-112753AA1BD3A24239E9C5FC47EEB1547AC9D23731B8DC48B9707830DAEC60C8D3790BBA1120F776
-4EFAC542CFFBCD5C05F9510B27B2534B704ECD36C8B041FD49A96881302FFF5B0163A2DD09C751D6
-D6AFEA9170A4F4C4AB8D46E62F763FE1BDA51DD1CE4A27E772F3A2869155F762FF26B7AA6FCFA4F1
-292E56F03AAB6322BF867E7710C34D43B5D85B45AA68014AD7879EED051B1933E491496E3E26D9AA
-8B80A07BF2B94F1077E84A9726F08199887D66DE7A307BF33C30DD9CF3DA188088C03B2BAD09A217
-6B110DB2C868B53DA9A66C85737BA66C93C58A259860E294AD0191E3A72C73F40B0BD98699AA08DA
-F03587B78F391F3A4313C58D9F29B53C70785637BD0C58310109C54091AB0A34CBB0C478613A7AC0
-FB8F0A8B4645AC966395D8BA775262CD291136AFFDDF01C1D83DD4EB3B59CCAD18057FE7D92A8CD4
-A58F22508D9FD7CF356571F701BBB23E749BDDCBF8A317FDA0AEFD952BB18545610FFAD3AC143D35
-1B8DB3F66293375E0E50235F0D0466932181D377EDD32A5F0FFA4E22B5A0CB4F343D9A7E4A342E9D
-09DFF6C697630CD3971802C277A5590B8CA94BDE6B38446C794D072BBCCB724D5BC208EEF1B018D7
-39373BB910D668882CAA779C2D686081DE6A2606417B54D7C20E0E7F722648D893E4EDBAE8F00D6A
-6DA3712F91AE860C756D1127D133AB828E9D80023B50B162C5A1C5CDF70CCB3FDD7EA060ED20838B
-E1E50C4094C9E79E1A0187CDF780CAF45A725964F004253E034C5BE46BBF89D94631F1A33BAA35B8
-4FA2A9D08481C6674126CD96ED05DCE48BDA069D902D6836D5DFBA701DC0F98A863E64F0E312145D
-8DC0B77F25B43AEC729A1243B45B08CA228DD6101CAA2AC5ADCC8EFF84A4CA3F254176C2CC711EE6
-C273835D0FD3528ECA2A976B88E51FE347FDB60F32370B66D338931D6581630ED586F349C638960C
-31AE4204E89521A96E1219E696B913DEB2AAB7A3B022D06F34FDFCB810A04E60A4FEBE284C2F063E
-0AE9EDF87704921CCFA193BDC912B747E13570066223A49F1F6E2AF0D4D65DA04CA876FF7A462FFC
-9C0BA2CC545C3BD36DBE762F32B2D6BE5867C59F479195C92440DC165098B74EA5C3AD93CDF2D410
-B04C16BC7801E7956F4E5107450787AA592493171C3628E6B8F49D4F8429EB98DC52EF025F001387
-BC1A7093F7A99F10B5D2D7DD8BBB393BF6E56F08F4F7FA1A343F220D5A1EAE7168C74D41BE1DC1A8
-3BD65B72B982F4F7B34F24F97F9EC9A91011064031FACFF2A14921A32024385F4E061CD07D152E74
-1BF97156D951A342488FA7F5EF934CCAD13E2753A0AB7A1F565C2F7F6B349DF03BBC25BBD972A9AD
-F809BB5C5048A8CCEF9297B2ED3324D18867F293CC66E88B3A39D107B610DFE79A3B4E83A96D3D52
-A17FE8A62C9FDD271130148366942C9CE57558D023DA5F7501319EBFA33DE9E6D1E76D7C20DB8A09
-B657839DA99F3D8143F1EE6253A3295C9651FA4366547893C2DC7ABCBF4BB7609DE5D001E0A36D9F
-FBE01F7D0903B3208AE8547E2E5F14EC1AF4C2535CA8F4EA37E3F3CE172C7A1E8308995B1CC23E6E
-81190246BCAB6E755BF868D449BB02A2AA87C44C9CC0F571ADC72547CEECBE104BB274B8AC16DCB7
-5D5F458D356466B921ACDEEAE384E2EB1DF6EF393B41B9747F0A4FAEB4AF1928D9AD6FB7E06FDC62
-1E4C6FC98CFB43F88584BD55D9B97CC9549093EDE586912161931162B1B1D52D0443260DABA02AF2
-B4432100D5506546013DA703573FA8013685CC798CE501960093DED713FFCCF89CA2B9106390198C
-29A00864108CDCC1984A8BAB53919028C01B26ECC7925E38CBE6CCA8978EE21C2B06E7B3E48FBA97
-8E2A7D186E563C088F84AA23178B60E4729EE87D67B1091F3B6973676C1CBFE6530EB773C62E2C24
-97014AB0E8B71A1F4E86A378AA26591511BEE3CF3D64C94848582E1354E1605B6457823F2C5E640A
-D3802946BB2E7E8E594E8C04B430C2385DD40746CE8534F50842E74D7115F3DB0C72D1C9C607C657
-3B094AEB73B7A79876CFFC3E2F8C9FEAAA07D3BFCE05B61F7749A8793BE90CCCECA2D7077F25E899
-D3331FE161A7E86C842495D584C6E4A0880B2951D8A13B88C4672080A0B1BE36BF47C3ACE7288CFE
-41A8C1BAA6F0814A947FBD6B3AA72B6C73A8C578CA51CCC96F2352316C467BB960E981F2B6485BFB
-44B577E71EFDA16E7405954BC7C9F0759F5A9F1EBCD2FA9CC9648D5831A68887F41B15081A204C24
-B4B992A231DEF9E698D4C3A25B6F5474F5BE6A601F2D337A58A0D21FF37FD91EB86D1D738893A03A
-69F0CD743F611CDFFE69DB2C6ED0E4611D56F803BB0DC06E7FE85A303839612707647B1BE9FAF8D6
-84122CA9E5CB8BDE2936D3F4FF254D31529D7538BBD4D35539489F9E7316F24214B996BCDCF1818E
-749A71CF0E8845AA1E2A58AA62A48E02BA4564625D20AA220EE719608521D7D7A7FCA0BD8904A401
-9819D371F3F59D46C1354E5FC1A6E5F79B20CF4ACA2BF0F2DE73DA193A6F9ACBFE0B4731C4BCEBE6
-D96FE822965DE965232282A3A130361F188B3AABDA95A8A2790D9240BE008B6A6DE4BBFCADA05B67
-86B9BB8E0DFA0C30043A3B07ED46277E07B9808422C8ED16758B9C396F4EA929D769785B2C9568E5
-70A83B989B25CE200F1727D41E2B702E7F88F1784F4C83FA60A74EB26B2DA95126E508ED519A61CC
-151DB6804F61826C5F86D8FA89D06E526FED97A0DB88EDB432FF32C1ACC9B622EEDF601081AF7B96
-3C9CFC1D13E4A9C74FEA0A1C8E3D8653CD92A944D4CA6B0D306619AFD503506D77732D6514F604BE
-4610C2560931BDE0B40939BC1D126B0E97F72AE1B4A9252123B54F7A27E0CFA4425B4546526FD741
-CA77952B10D13E0AC2E32006A903808FF0CD013F936238C74CC75FD915244C56A8412F37F0134840
-347699508D6F3D7F3203A25B7C70100719582CD588590EE34B3AB13E255B613A6D00386A0104CC5E
-D2C646F09A88888D3751651D5646C5227A3C80E8DA1B0A331121DD2429F1F4775D30564DFF47D01B
-BE2C6C72CE4D1FD9A2077C04D2B0274B8916F6A9D1A4A6964A534F47CF241D5A8E34B23F85BE9ACF
-FC2FEA961F277539F215F8728D6788F67BEAF45502839BCF23D8763C3949352F00C579A9A4FC408E
-C625E310DAE61512DFE6844E82D36A2F81709E1F05B38AE9C222ED62C961EE63593CED7AAF73CE2E
-D3667740C77B309B93EEFE1B4BA65D48575A66BE86743DC9E5D3C2FF418D11F7F211B86E827EE1DF
-C3613E7498030F07050524536D1F8A94DDB6698BE7B963C55CB3F74B676CD815A7B3DF4B1A0EA2BE
-1B0B9A11FFBFD5B1FA49668AEE14629316AF436A0821C20BEEF7B3480847934A99F6D85B68F4DDF8
-859A754E009428AF89A90D1852C220A607FF0806E8080726EDC94D691D214B4521C147C4273AEBDD
-BB4A697EF16448CD9B2FC95293305858DECFD406B89B9F3FDAE2AC579E80CF321EBAE5701FB2F7CA
-D8ED04B4A63115886D45D6120F69AEF1A21D80AD3C2D35D2899F1902242B96CD349E0AAADA40F7A1
-1282B6B52BDD97708E58DC5E2D22D1153E5FA3F3B300BCDFAF98DEC2F4E3C82A1C85F985735F3987
-4F557579F422664E07CBE19DA680EFB0FC82C323EC5C4644C51709AC8D674608A8043C91E6C7988D
-430F10BA6CE1FC7FC0604FCD8F723895250AEC36CC35B3FA14FE2A0D24095DCC30B2093F2298F5F0
-A97676A0BE66C3DC9ADACFE2FC0F721A20E945AFC1096A619075D5E9A264C796EC6C90EF1AEEA8DC
-089B44FFC13D27CB2370070A52D4416C53F364393E46EDD7EDE00799960CE6E0D57E4909E88ADD64
-BDD2B0EBE2D73FA6ACF8B40280DAA0637E705C65AABD523B8815F22F23E9FF81E7829C7E4BC980C9
-143AEBE1A04DC0D253396BBB7268BD5AEEA356B610D5DCEE03135E00AE34388251F31714A1C40E18
-2652C48CDA2211A22CB6F02490E69A44CECB169754C53B16028D352E0119F5D5FAE0BD7EA1CDA647
-12A6147374B64244E21E9EC9F0D1381AD22D5B6212B26C3F9AA5F6045F25DD9F5EB4489EA39B1945
-331AC70510C5752557DE21D0A6CFC1EB10A98FA867B76DA6E4249469F591FD154D39E89364A43DB0
-07AA0D7A911CFAE6CE2B557997FBC44F55A27F622BD7B8B10EC9F5D10F2649A646FD964AE1B111B3
-5B46A252C4DEE44E7426EB5739F24E8A390694597DB3A1FE7800C97E59558322F0E49A0CCE2AD94B
-1E2D1026AFA771723E3F523916F55ED866C9FB4A2F759651C613A2CFF362028CDF9D38F05D4C7C60
-24C533E930B64B099FB1AF04B01F5FB9CA6867E6EFF55A772C5391831059987E10CBF987E3F378E0
-1329F73D54DC0484177D3C3C06F67397955FF1CA4EF8AD1606B70455255D631A7D6EB92BFDBA14A0
-FF28B2ACE7E81AD666EA9B3A0F5A6BA3B5DFE35044FA4B3D8ED956009C60E98CC132F2E84967F4A9
-8A67B336D5EE7CAF7DD1F74D1FA08619941361FA7312CF225D89CEF97E864C8369EAFAB94D97F056
-5505D825972B754F6729596EEA91210B75DD8F645382ACE36DE60819A02B3B48DD00F5485F9264F9
-FA926D732E2C267B0BE8CA98526F124F97EFDB86132C5EF16B103908172FC51F286FFE45FF253512
-E0033F037FF182BA536A9EB2DF2D1DB257D9C86C46E1B002FB32AC70CA9462E6EB48994752CEBCE3
-9F08ABD4F4B0889283E55500702185A841E328
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-cleartomark
-%%EndResource
-/Times-Roman-iso1252 /Times-Roman ISO1252Encoding psp_definefont
-/Times-Italic-iso1252 /Times-Italic ISO1252Encoding psp_definefont
-/NimbusMonL-Regu-iso1252 /NimbusMonL-Regu ISO1252Encoding psp_definefont
-295 271 moveto
-0 0 0 setrgbcolor
-/Symbol findfont 50 -50 matrix scale makefont setfont
-<B7>
-show
-370 271 moveto
-/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont
-<4D6F64696669636174696F6E>
-show
-653 271 moveto
-<6475>
-show
-725 271 moveto
-<66696368696572>
-show
-877 271 moveto
-1 0 0 setrgbcolor
-/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont
-<534D4553485F535243>
-show
-1149 271 moveto
-/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont
-<2F>
-show
-1162 271 moveto
-/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont
-<737263>
-show
-1223 271 moveto
-/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont
-<2F>
-show
-1236 271 moveto
-/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont
-<534D4553485F49>
-show
-1435 271 moveto
-/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont
-<2F>
-show
-1448 271 moveto
-/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont
-<4D616B6566696C652E696E2C>
-show
-1708 271 moveto
-0 0 0 setrgbcolor
-/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont
-<E971756976616C656E74>
-show
-1938 271 moveto
-<434F524241>
-show
-370 331 moveto
-<6465206C61207072E963E964656E7465206D6F64696669636174696F6E2E>
-show
-294 433 moveto
-/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont
-<69666571202840574954484E455447454E402C79657329>
-show
-294 476 moveto
-<20204C49425F535243202B3D20534D4553485F4E455447454E5F33445F692E637878>
-show
-294 520 moveto
-<2020>
-show
-344 520 moveto
-<4C44464C414753202B3D202D6C4E455447454E>
-show
-294 564 moveto
-<656E646966>
-show
-295 682 moveto
-/Symbol findfont 50 -50 matrix scale makefont setfont
-<B7>
-show
-370 682 moveto
-/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont
-<4D6F64696669636174696F6E>
-show
-657 682 moveto
-<6475>
-show
-733 682 moveto
-<66696368696572>
-show
-890 682 moveto
-1 0 0 setrgbcolor
-/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont
-<69646C2F534D4553485F42617369634879706F7468657369732E69646C>
-show
-1563 682 moveto
-0 0 0 setrgbcolor
-/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont
-<706F7572>
-show
-1681 682 moveto
-<72616A6F75746572>
-show
-1863 682 moveto
-<6C92616C676F726974686D65>
-show
-370 742 moveto
-<4E455447454E5F33442071756920636F72726573706F6E64206175206D61696C6C6575722074E9
-74726168E9647269717565206465204E657467656E2E>
-show
-294 887 moveto
-/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont
-<2020>
-show
-344 887 moveto
-<696E7465726661636520534D4553485F4E455447454E5F3344>
-show
-974 887 moveto
-<20>
-show
-999 887 moveto
-<3A20534D4553485F33445F416C676F>
-show
-294 931 moveto
-<20207B>
-show
-294 975 moveto
-<20207D3B>
-show
-295 1092 moveto
-/Symbol findfont 50 -50 matrix scale makefont setfont
-<B7>
-show
-370 1092 moveto
-/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont
-<4D6F64696669636174696F6E>
-show
-667 1092 moveto
-<6475>
-show
-754 1092 moveto
-<66696368696572>
-show
-921 1092 moveto
-1 0 0 setrgbcolor
-/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont
-<534D4553485F5352432F7372632F534D4553484755492F534D4553484755495F69636F6E732E70
-6F>
-show
-2019 1092 moveto
-0 0 0 setrgbcolor
-/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont
-<706F7572>
-show
-370 1152 moveto
-<72616A6F75746572>
-show
-556 1152 moveto
-<6C92616C676F726974686D65>
-show
-832 1152 moveto
-<4E455447454E5F3344>
-show
-1149 1152 moveto
-<717569>
-show
-1242 1152 moveto
-<636F72726573706F6E64>
-show
-1495 1152 moveto
-<6175>
-show
-1572 1152 moveto
-<6D61696C6C657572>
-show
-1769 1152 moveto
-<74E974726168E9647269717565>
-show
-2062 1152 moveto
-<6465>
-show
-370 1208 moveto
-<4E657467656E2064616E73206C612047554920646520534D4553482028626F75746F6E20646520
-73E96C656374696F6E292E>
-show
-294 1309 moveto
-/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont
-<236D6573685F747265655F616C676F5F7465747261>
-show
-294 1353 moveto
-<6D736769642049434F4E5F534D4553485F545245455F414C474F5F54657472615F3344>
-show
-294 1397 moveto
-<6D7367737472206D6573685F747265655F616C676F5F74657472612E706E67>
-show
-295 1515 moveto
-/Symbol findfont 50 -50 matrix scale makefont setfont
-<B7>
-show
-370 1515 moveto
-/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont
-<4D6F64696669636174696F6E>
-show
-651 1515 moveto
-<646573>
-show
-739 1515 moveto
-<6669636869657273>
-show
-910 1515 moveto
-1 0 0 setrgbcolor
-/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont
-<534D4553485F5352432F726573736F75726365732F534D4553485F5B656E2C66725D2E786D6C>
-show
-1843 1515 moveto
-0 0 0 setrgbcolor
-/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont
-<706F7572>
-show
-1955 1515 moveto
-<72616A6F75746572>
-show
-370 1575 moveto
-<6C6573>
-show
-445 1575 moveto
-<636F6D6D656E746169726573>
-show
-744 1575 moveto
-<737572>
-show
-824 1575 moveto
-<6C6573>
-show
-898 1575 moveto
-<626F75746F6E73>
-show
-1075 1575 moveto
-<6465>
-show
-1142 1575 moveto
-<6C61>
-show
-1196 1575 moveto
-<475549>
-show
-1305 1575 moveto
-<6465>
-show
-1370 1575 moveto
-<534D4553482E>
-show
-1569 1575 moveto
-<436573>
-show
-1663 1575 moveto
-<626F75746F6E73>
-show
-1840 1575 moveto
-<7065726D657474656E74>
-show
-2073 1575 moveto
-<6C65>
-show
-370 1631 moveto
-<63686F6978206475206D61696C6C6575722074E974726168E9647269717565206465204E657467
-656E206574206465206C61207461696C6C652064657320E96CE96D656E747320766F6C756D697175
-65732E>
-show
-294 1732 moveto
-/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont
-<20202020>
-show
-394 1732 moveto
-<3C>
-show
-419 1732 moveto
-<706F7075702D6974656D206974656D2D69643D93353033339420706F732D69643D9494206C6162
-656C2D69643D944D61782E2048657861686564726F6E206F72>
-show
-294 1776 moveto
-<5465747261686564726F6E20566F6C756D65942069636F6E2D69643D946D6573685F6879706F5F
-766F6C756D652E706E679420746F6F6C7469702D69643D949420616363656C2D>
-show
-294 1820 moveto
-<69643D949420746F67676C652D69643D949420657865637574652D616374696F6E3D9494202F>
-show
-1251 1820 moveto
-<3E>
-show
-294 1864 moveto
-<20202020202020202020202020202020202E202020202020202020202020202020202020202020
-20202020202020202020202020202E>
-show
-294 1908 moveto
-<20202020202020202020202020202020202E202020202020202020202020202020202020202020
-20202020202020202020202020202E>
-show
-294 1952 moveto
-<20202020202020202020202020202020202E202020202020202020202020202020202020202020
-20202020202020202020202020202E>
-show
-294 1996 moveto
-<202020203C>
-show
-420 1996 moveto
-<706F7075702D6974656D206974656D2D69643D93353032309420706F732D69643D9494206C6162
-656C2D69643D9448657861686564726F6E2028692C6A2C6B2994>
-show
-294 2040 moveto
-<69636F6E2D69643D946D6573685F616C676F5F686578612E706E679420746F6F6C7469702D6964
-3D949420616363656C2D69643D949420746F67676C652D69643D9494>
-show
-294 2084 moveto
-<657865637574652D616374696F6E3D9494202F>
-show
-772 2084 moveto
-<3E>
-show
-294 2128 moveto
-<202020203C>
-show
-420 2128 moveto
-<706F7075702D6974656D206974656D2D69643D93353032319420706F732D69643D9494206C6162
-656C2D69643D945465747261686564726F6E20284E657467656E2994>
-show
-294 2171 moveto
-<69636F6E2D69643D946D6573685F616C676F5F686578612E706E679420746F6F6C7469702D6964
-3D949420616363656C2D69643D949420746F67676C652D69643D9494>
-show
-294 2215 moveto
-<657865637574652D616374696F6E3D9494202F>
-show
-772 2215 moveto
-<3E>
-show
-294 2259 moveto
-<20202020202020202020202020202020202E202020202020202020202020202020202020202020
-20202020202020202020202020202E>
-show
-294 2303 moveto
-<20202020202020202020202020202020202E202020202020202020202020202020202020202020
-20202020202020202020202020202E>
-show
-294 2347 moveto
-<20202020202020202020202020202020202E202020202020202020202020202020202020202020
-20202020202020202020202020202E>
-show
-294 2391 moveto
-<202020203C746F6F6C627574746F6E>
-show
-672 2391 moveto
-<2D6974656D206974656D2D69643D933530333394206C6162656C2D69643D944D61782E20486578
-61686564726F6E206F72>
-show
-294 2435 moveto
-<5465747261686564726F6E20566F6C756D65942069636F6E2D69643D946D6573685F6879706F5F
-766F6C756D652E706E679420746F6F6C7469702D69643D94204D61782E>
-show
-294 2479 moveto
-<48657861686564726F6E206F72205465747261686564726F6E20566F6C756D65204879706F7468
-657369739420616363656C2D69643D949420746F67676C652D69643D9494>
-show
-294 2523 moveto
-<657865637574652D616374696F6E3D9494202F>
-show
-772 2523 moveto
-<3E>
-show
-294 2567 moveto
-<20202020202020202020202020202020202E202020202020202020202020202020202020202020
-20202020202020202020202020202E>
-show
-294 2611 moveto
-<20202020202020202020202020202020202E202020202020202020202020202020202020202020
-20202020202020202020202020202E>
-show
-294 2655 moveto
-<20202020202020202020202020202020202E202020202020202020202020202020202020202020
-20202020202020202020202020202E>
-show
-294 2699 moveto
-<202020203C>
-show
-420 2699 moveto
-<746F6F6C627574746F6E2D6974656D206974656D2D69643D93353032309420706F732D69643D94
-94206C6162656C2D69643D9448657861686564726F6E>
-show
-294 2743 moveto
-<28692C6A2C6B29942069636F6E2D69643D946D6573685F616C676F5F686578612E706E67942074
-6F6F6C7469702D69643D942048657861686564726F6E2028692C6A2C6B29>
-show
-294 2787 moveto
-<416C676F726974686D9420616363656C2D69643D949420746F67676C652D69643D949420657865
-637574652D616374696F6E3D9494202F>
-show
-1680 2787 moveto
-<3E>
-show
-294 2831 moveto
-<202020203C746F6F6C627574746F6E>
-show
-672 2831 moveto
-<2D6974656D206974656D2D69643D93353032319420706F732D69643D9494206C6162656C2D6964
-3D945465747261686564726F6E>
-show
-294 2875 moveto
-<284E657467656E29942069636F6E2D69643D946D6573685F616C676F5F686578612E706E679420
-746F6F6C7469702D69643D94205465747261686564726F6E20284E657467656E29>
-show
-294 2919 moveto
-<416C676F726974686D9420616363656C2D69643D949420746F67676C652D69643D949420657865
-637574652D616374696F6E3D9494202F>
-show
-1680 2919 moveto
-<3E>
-show
-220 3030 moveto
-/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont
-<417474656E74696F6E>
-show
-220 3035 188 3 rectfill
-408 3030 moveto
-<3A20756E2066696368696572202E706E6720206D6573685F616C676F5F74657472612E706E6720
-646F697420EA7472652070726F6475697420706F75722064697374696E67756572206C276963F46E
-65206475>
-show
-220 3086 moveto
-<6D61696C6C657572206865786168E96472697175652064652063656C7569206475206D61696C6C
-6575722074E974726168E9647269717565202861637475656C6C656D656E7420632765737420756E
-652073696D706C65>
-show
-280 399 1 176 rectfill
-2125 399 1 176 rectfill
-280 399 1846 1 rectfill
-280 574 1846 1 rectfill
-280 809 1 176 rectfill
-2125 809 1 176 rectfill
-280 809 1846 1 rectfill
-280 984 1846 1 rectfill
-280 1276 1 132 rectfill
-2125 1276 1 132 rectfill
-280 1276 1846 1 rectfill
-280 1407 1846 1 rectfill
-280 1698 1 1231 rectfill
-2125 1698 1 1231 rectfill
-280 1698 1846 1 rectfill
-280 2928 1846 1 rectfill
-showpage
-grestore grestore
-%%PageTrailer
-
-%%Page: 3 3
-%%PageBoundingBox: 18 18 577 824
-%%BeginSetup
-%
-%%EndSetup
-%%BeginPageSetup
-%
-gsave
-[0.24 0 0 -0.24 18 824] concat
-gsave
-%%EndPageSetup
-%%BeginResource: font NimbusMonL-Regu
-%!PS-AdobeFont-1.0: NimbusMonL-Regu 1.05
-%%CreationDate: Wed Dec 22 1999
-% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development
-% (URW)++,Copyright 1999 by (URW)++ Design & Development
-% See the file PUBLIC (Aladdin Free Public License) for license conditions.
-% As a special exception, permission is granted to include this font
-% program in a Postscript or PDF file that consists of a document that
-% contains text to be displayed or printed using this font, regardless
-% of the conditions or license applying to the document itself.
-12 dict begin
-/FontInfo 10 dict dup begin
-/version (1.05) readonly def
-/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the file PUBLIC (Aladdin Free Public License) for license conditions. As a special exception, permission is granted to include this font program in a Postscript or PDF file that consists of a document that contains text to be displayed or printed using this font, regardless of the conditions or license applying to the document itself.) readonly def
-/Copyright (Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development) readonly def
-/FullName (Nimbus Mono L Regular) readonly def
-/FamilyName (Nimbus Mono L) readonly def
-/Weight (Regular) readonly def
-/ItalicAngle 0.0 def
-/isFixedPitch false def
-/UnderlinePosition -100 def
-/UnderlineThickness 50 def
-end readonly def
-/FontName /NimbusMonL-Regu def
-/PaintType 0 def
-/WMode 0 def
-/FontBBox {-12 -237 650 811} readonly def
-/FontType 1 def
-/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def
-/Encoding StandardEncoding def
-/UniqueID 5020945 def
-currentdict end
-currentfile eexec
-E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942BF7D6DD84F1664B89
-699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED2AC419FF2B2BDE605B8EE3264EDD6641
-2D4F21C64AC522BDFC7C5502F9C3F3E5592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A2
-5032519D1868816E44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF
-9CDC7A1B1B598C69131DEE005B415805A16D8A123E6A2261C63C769D2F4B60FA2C438AD7D199D8E4
-5F7E7C9A605C8CA14E21FCD81C9A515FB8DB6F99604534D06EA9D87FE0FAA852899C9D0595C7A97E
-6C55F79FAC45CD38E87B10D210CE7501E88C8FCD3444354365FB893A12F596AE2C1E70D5819EE0D0
-87D10BF8DA96F3DABD5405D28C4228C6C31BA4052464859640933FEEFD8071C0C84CDD829A9B1D0B
-A01F25A4D50EE2EA2B45160CA6333B2D2800306ED2BEFDFE155E9D9F9342EB8D5B0ADBF2460CCC98
-643FB1287CCD28ABA7B5CAB92EC39EE2E918990372B16F8487EBA30EAE88708B6CF33B6C015D8096
-C7CFE2F139F52052E3925C0D50FD64CE68236D59CB83EF56BFC584150EC38065059F3308AD6F9A99
-F83EF4E6CB13855C8175E31417D190D036B387D3952344A950F4D8C7781B307A094DF1ECAEE4D2C2
-FD747BC6F7F9C6BD0E90C19294F96C8C5CFE88FB34C477574A1B1630B8CC591529E59B20794DA32E
-61DECDA8ABBD1AE956CF74012AA01D42EE01E861B0AA6897C864788AE59DEF43C493246FDB1ACA55
-4C12594BC7B33657A9ECC9E3D1472EF826073F632BE540C35FF6FB40566773F3BB2204D3A579A08C
-CBC844C14B18C350F003B9DA23A570C362D6003893CA32F86F59B829C78EE3188B6E3F7FA81D7F62
-2825C639638DFB78B7AF1F500F5B450FA54DBFA5CBA277C794ECE93275A3DE0B452FDC8DDC2993BA
-A42F28A636008CDCB03EBF71BDCAF35019778993443F88412AD2AD0D7155A3944606463266322DBC
-0244B07DA1E9C27A27B59664E8566D7A54CC03E995AAD008B0A17E2C3EF61F720CE7F7788599C4E4
-4C709CD5C31B11107F16AD70B17B9AFE2E8CD922A7428DAC171427FFAF51067307FAB0ADB530E701
-FD22DA22C4CD3064067BD4F6089C4B2C87937DD426E4E9D2F60E608288BAC9056554D04947E69200
-61E379CF5E81BFD32FD37EFAC1F61CEBEE551B0851516471A7472C60DF89DAA9EB1DC5A67E479745
-3E69B9E22BAF4E3CCA4192D603295B018C4AB69D18DE52DFDF15E96B557F290A4B8C5B1E7A6CACA8
-1F2351B97ADFC36995ABA43803A6E5AC04A3C93495F6D38106B8B144449C07D1358210F9176E1565
-72363CFBDE576BFDF99FA329DD1346E83F79E06CF68250CA57A68931BC7F342AD295D0CBA17AA95B
-B8EEB53EA6E8E660B814E9F857CECB14F44A43288B69A9E7908D55BF19E844359879D28CAEF1C38A
-36420185D20DFB32C2E002202800E8EF3D67C5D50E919657CA958B538D537D503444865331D79BFC
-40312068D72364503BD0CC84B5F30A74D8B5B6A26AF2DB764564FB65A6BA8F9051AE2B4EA458D46A
-4569F30C6E77DC097356770362E6CF3F1661074778EBB44FF7D1E3B64FF75E77E11FE525BB121C65
-46CFD13300CA1F02D571B82A5825E6226D14FDCF27F06D87452A8B6C5DCA658535CEE2A795E58137
-D48E566B69D53A0C3B766E84C51EAA221C46999CC8065ADB2F129D5B630FAB1814C0C33B5AEA0EFB
-B6E994D80941B53079AF96D90A0B924F9B0E319BED9836B8F9053F868363D3CA554CBB181863301F
-8CB940872ED5FA7BD18CE39218B5AD8AC57D0F752D941076B1C64D99BE0DB86D7A6D96510D772EB2
-4C587F11779BD21CFE5BDE1F29C1EF9022B2B8BCD7F91153C845906722477829C40111D810480F3C
-F62DE8DBA7FD86CD236E656618CAF6FC46827FBC4898EA7672F8C9971AFE43E0E01EC8B77D4AF48C
-BF1210E98C1DB15C16D149BFF58AB0270CF015B107A3A50F5DC8F37FFB92EEC8CB6778DDB7CE4AAB
-C464C4AFF654223006A550EB52485A23D2B4AA7198D3CD54418102F1E9A4FBDE37B841E56F5C2C53
-966DB9B66B000E4588282E3FB80C2C519339F0002D2F83C979EDC5827A3B3C8EF8810A0F9DACB6B9
-998E9AF6551F56313DC4011904CB979AA2D32B11A811BC248141E4B9734D9FB7982A5671002D8279
-CAB93ABE057474628DEFC95D43890DB1ED34CFA8A20BDC3D874E7679A396158E522ED0AB969A4E3E
-C7E4474E192590504D54DEB7B260B7935C4E56548A7D121AC1F741F8CDF259EA1B5813175A77A1D2
-D30BA26F65EB765A04C09ED51F69F41551ADF399E6AA2FC09788137BEA4913F17B8EB838C38FB272
-1FDCB55FD65697FF0B850E7D3D1CE266BF90F7EC06A9A0876BDFE767D3A918B092FC78C775F945CF
-1F96E859C03DBF630D9A940939654C3549D8F7921CB94EE23D5A0535DE9DF31EA0F937F860B4F220
-A99ADDFC343D7CF7BFA0B803C12C26403F0DCFFC8EA786D0D8A8D9C367419CA8AE41190CE93A8086
-583A1E6C9D70B612C84D87D2EEAA71EC2DC12F4CDE6A821303D5F6A9BBDB7EEDCD289E80FA3B75F4
-7F481B50719DCF4A142069393593B9AF9CCEEAEC56A35B8787193D7C88113E9E1E221D151E093B01
-9EF89F6118BEC4735103CC8003CC5AD1B6727B3226CD44C497DA7052DD681695DBEC3397F9598C91
-77701C73BF0594CE93F23D50EC5BEE2FB9DA1FC966DF148B27B28EE3C89526DD6625E2887F9FA076
-7C127C609EE315626BC14D274FBEA56528DC06A27B2D476D46E9E7916590B156A5DF04A6CB15E362
-45D77021767B6E5BDFCC679670263FD891446C3371B11BB6E1DF60F960AAB4149D7753E6A5C33810
-C42C8BFF4E935003388506F8278BD7CB672F132E065AE684DCA0B9064D01DD620E7FFDFE04F14277
-EFE8E60159BA0FCA3FE2F28B902D4AC275D19F0AC6971EBE827C4A232D87650D2688345BCA78F879
-077114F0463C5F058107B669566F8171E4E284D278405580F04BFFC9902784216E0C9A17AA9B2935
-E66E18A783F723BE044389B7E9D62AA36818FF2EA406C3C1A9D2F3436F3EE7DB8BE86AFA8DAA6A4B
-1B84611350D8D27605509612B515E16AA843164D5D0805E36A2B9EF74C5F6A0B9D59A04B55697123
-27F4B1B30E9587CD103337639967CBDC655AA46E80D2CFD24BEB50815B5338E522B3A7AFE8362AB4
-F05D8BC52BBA9C5089ADA8C89529B0275AF422EB540D31A938B8740860756325B966B36817115213
-FAAF92DE63F6BAE1E0064BFBC5588098B61EB83C71F1C2082436D37DAF1ACBE186FEDC4BE7C1233B
-6F18BEC5F99002D21CB7864E4811F7AB3C03003E1E4490AD1AC793BD28FCD5EF0E6CC30EF39A08C5
-2F71939B0CEF620DC69E31E39D6DB969049031B0C92EF2DB653D97F370141456A52985076B268652
-FA2648C792780BAD637C4D7581FB2D62011D57E293719487CF2D1F013CFAA532E1C2D39178D51272
-A6AF041440BCA174B5CC902BD7390C7D3695056CB4BD7791F9FB6D88E7A70DEF2C97869F5DBC5BD8
-23C517C7B7C39D624DF627DC9653EA5347BFDA80B723F05F6DBB4C9EA501D862ACE05B9DBDF21B70
-56FBCD8C6D4B85873DCEE6166C8B5ADC0316CA12D9639F361B15A42F00E1D62EDBCA1111972FA0F4
-5758BECB31DB38316F3CDFE1B41748C93ED58B67E9B57ABBED5924A6D53E99FBC9A994A6489A8BDF
-13EB685548B4DC6D62DA7426C22227D4D43B6FFC7B5EA91C896730253E8941AFEE588359C2BECF6F
-FC415B9EB6D31CCB0F6C7F85853E6449FA6D627A97A3CE8303F148393ADCCCDFA2FE085C6908BE5C
-3C05AF00A6F02840206C3253A559AC5C049BDDFD11AD9B118403B84DA10AE3C470CB9A9A2D1D7B73
-2F59F5FE146DEDA60AE750F551AAC934621B4470E1BC324C436303E25F81D0DC3188BE0D6FEC5414
-C20E4CB18952E12CB6423DF7124627ACDE145500D77A97A8BFD9CB50D1FAA008E2CE2B2505A4749F
-1EBBB092C347023714055A9B63353AF9E7FEE05BB54C9843698101F79888A91531773830C2C967B5
-88D3ACD2192883D5CE3962D51084FC653EAE2C5FB2DA41DACEFB5C76812D2EDB5B109677289CD199
-8D457FB1023A19AC67295BBC1A9A20A426B06A368DF3C5DD083CB1180D287F5500F2C635EDE157EE
-FCEEC5503447382D15C748C1E35F68753992E5C90F900DE54D18F8E1B355D1076ADFB1F3590135FA
-D1A36F028E44F48ABB149B80CA9A54614D467F8D71CB310BBC7AC7100261092DB8C5BFD39E0AC6BC
-2C9D6CBC3A8C05FF8A74CB21608EC4A4CFE4CBAA2D056DBA14206106044DECF59F957EF8A9CADE4C
-9B19D8D30DD4FDE6A9548E50DB51ACA73330142153FC36B69C1C8D5B26D0C689B7040E81AC2C864F
-D7C097C99BE5953843E172C97AB5684F35FB03A725A89DBF371F08DDF40A1531FC1B676DB0E1543A
-EC6E97D3D2E4AA3D5831D8B3C952ABBFA112352814FB6FAB61A0D680E6640F6AEC8426200CF61286
-F7422CB2F78C61EBAA36D47EC16D7FAF8B4AF31D090CDFA255D9D7C61D46CFB22A7D6E1758E71ED5
-67E00CBD8E8F468DDFB477F091A2F915627F22FF47B876544BC1F03B6BBB98385F009C20BB1AA2A7
-A78674692B8EAC2E3C8069B79E679338DA57F72976810F845BEB6B9ADD32B95D78E5E60F16DD1668
-9C05FD82D36A3115BE8ED494A74DD211D58A2CDF983FCB9CDC29BF7F0E29988FA23560EDF514BC1D
-183F3B2A22C09FB179B47E05ADEF48DF02F31C29875D1915037B19407764A4292FE44E741651A8E3
-BEB5F0D972B6327090F664417C84F84FFBF0AFFF8B1D85C822D90730AB4140C42A51AA8B1DBE4398
-4EA8566040EB8B341CCE23FD3F69DD235A080BA5C69AECB9BC732BC2D7D40617DDA6B79FB6EE40C3
-556C7DF9B23DAD89E94054B1345DB8402AE679FC4655A4A776C0150463F8DB2BFC0608EA1F124E22
-1DDAE6026B5E5D007A7E4A0D6B3B0CF3A2669E67C5E4F01551966A7BC48F2F4B6A87E740D8095E63
-F77C7A027F26B52F2299DE5B8A2F6209BCF3D31CB0235F998F781E5CC81E31DC424E008D46EC0920
-2951E5684804A0592EA47D6C788A20487BEA2EC8F2E6C1D7F378B62DB43CA43C4B366F8B4319631C
-FE9854F0E10321CFA3B01C873584863BBEFC23C72C05E695B56E8A52E89AA2DAB543834D34DCAC5F
-ED08DC51825C5257AE59850D101D84F4CAA1D29FC932F9E0EFFBF7A9A7F3685F61F0490CD3CC8988
-2DB52A757A6AF4C4E67B407BD2316B1C0FFE7DC54E43C87B874F57E4903334E2140B011484863CDC
-ACA331175F2CF3D72E0042855983AAF8853D3015E870FF0807014C31D55060DF3FE1FCE157324481
-2744AB51322444632F9AFDA6706E320FFE82B8CBE242A19DF00CE73EE48E25FF49D5871BD3E60652
-298FE3E8D400609E232E0DDC794C0579ACEF89E841B2EDCA50D51151F65E8C1CC3B01EF1870558F0
-BF5743718C3E068617E81BFE120C6CA16E0924BFC2541177D53671CAA3AB641C41557DCDAE1A3461
-47B5E999C4541B08B4AFCBC187AFD653D5B5F8386DF6AD8FE69E21BD0567DF494F736C6A184FA4DE
-48DC9F347787CA96E2E00A296C2DA05C2AD9BC423E9CA428D7F1FA12DC9353A302FB8C529AF8688C
-BB543B45B2717EBF8F6C497935F4F3BFFD285E0402AB7544B3CA4643AE5A8B5250ED987A95FC1F27
-5B9707ACD0641BD0EE2AE9758494F8D8A51DCE408A38AC20EAF0852D72D84D0C6BE973326793AEB9
-55EAC6FE0A2813A355DCD22F6F2CE56588D1C055CDDFA98878BCEB6A018DB22922D2B600A20F8184
-2E665DF41013CA0947C4237C2BD60A75E2FD1A3FB8C8FA19485730B87461AD466ACB02DF8CA24091
-4FB090B3D2B41EB6B8FF05E1A59D9FD668AF70BA5BB72778953BA55FC5F9F626043450E1D09BC83D
-8605098ABEF884639A37809A32565CBEFB3FF39EE53D6C18C58C272BB928E4410E361E59A50F242D
-69747A032617C52DEBBF62364AB5A96EFAF642D9D82BA679B1D70FAC10A4EB62FA5CFC308E86368A
-AAD7E75948F43598CD1C544A0D4091374D7E88D4522CBE902391641327E888E7748FA889DCE67ADE
-61699E7D77763681CAEE9B1CA8837B2F7EF9C18CBCC538C465C8E2DD34616953CCB6030A222C728B
-834911C1A179E2C770289407AB28B303E724D97F747D6134B425216A64C6E0B60F633E2B85300047
-E4C90339CE030A0FAE31E830C8ABA5AB3386A3B69267351A7BFDD66356AE5E57FB2994452993E90D
-E7C4E260ABAB93C37831856A650D56E44172FECA01D6C7C380F250B82473960D2A2A5FB6B4DA668F
-46E624ACF7FA0FD4490F485D640A3ADFC9F8652E7A38CE5799F770C3606DB4B8B947F93967F779E3
-A3C0572F13A5A187D31D7BD12A5C7BE23CB6ED6192086241B76C5BA6983DB9C93E4B208D707D3760
-F03CD6272EF3A4CE89B8E52E6AC5871A3D03EB975759AB4BE239E5EC7842CBB333E692CC607C722E
-185D3C39164DD320C6945629C70FF66A5237C0A9520A1FAD6EB9816069351AB0F135D90CC0982B14
-7D2294AE4A38A527EE40BE9CDE2512AAEBB590E134388BB171D0956A7C4566D65A9A041BE6C4F883
-6B3EC3D2ED1B48B566A783292B15B6127920D247D494F070BB20BEFF60640B11B276DDEEE49706E8
-B2B21BB40B7F00AAFC594C492C25DCA774E0B80D82E927448DE2E74A9D0DC7AC9260096EAF187B6C
-D6AEAA6D1DC4205B4411122751A5B22688404EA7C5861730371FFAC10F5AFD4727A0E402AB5EA757
-606B75EB86A05E8F774D6E430A1A3FE2A37EBB06700474239FB1CFA05EE44B91B82244C575B52E7F
-AF934B04EEB0D933FEB57EBE326D75821C8B23EAA85B583AED4320B7F04B9F2DC591091216FDE52E
-064BAAA9C2C9D9714B95A4558C21F3CEBE624B5403B31508F178581AF6863083ED762F1E2E34A45C
-FDD71660D626FF8648F5D6C5E580D4765A67FB6159EC8077A9F0A88038C8D3D7C77FF0926E2123BE
-874F7BCAF129D55A5B5960F824BD1728ABCFCC51D23936DE9A25C408D786E44C3A2BAFA4423177AD
-060D21D38E15E23EB6FFC0B4120E814695D423EEFC2744A1FC81B4DF89D76F0A6803D8B14E75538C
-AAD03A72517B86514F6952F6FD619D9E910D980F00964DB325318C045BDF79647F453D4A5CF4E61D
-D5359782827229310405FBCF6107C3AD9DDEF9A9A339D5D5A6EB2E7838A0A43221BD62CBDF732DB0
-A638A52016FB35BA7761AEC846A023D3BF2D1BB183543E81EB7CAC1E5970CDC6F068C5EA118C7AAE
-528D1396E6DC939112DA4460C890EAD5C01BDC438F5BB734218BA6270ADD0DC1778FD8AB16831D6A
-302B814A1A44B07EDC65956C9E6CF4875DF521F3CE5B422F71081B6D69BD270F739095C9E81C0377
-934A8BC6390C420C4E4CDD9CF7E32544C68D884E15ACA3BCC07FC8C132D8FB9D752C15D75C52C288
-57E2EA461A6FCAD90C56843513F74461F18D7164BC597A28AE4BA7C86EE1703535A9B9ED50122627
-71FC12F102E800E0E1AF7BB46681BD2B14B614CEA91B7B2AAA35235DE76C0E113C92688F8EC81277
-D58C3406778E1EC1CC15F1CD9A137C8FFDAAB99ACE3BFC782916F1A877170589A92DC921E6740A22
-B84DC6BACDABCC76E64C79E3A588D80F8F4D376E1B426F15751CF7391102102F0AFAFD8B22DFDEB5
-48AEB5F30B1673023D22054A13391A0EC08DE6E7B685A0D031AABF20B7C62187C0284892D5EAADF1
-21BA28263EB863D5E36EA9C06A77CCFC0E17F593961591F84D82AF823EFE41044C8D606FEF83CCC7
-B0E961E7994DF8A3CC36B209D953E250ADAB8D22D7F2B4E2C9CA39EFA2D93E56195C1560E30A5190
-CC5B17FAEFCF250DF79F6B624A4B917E11C332222FCCFEC4F6A47BD9E75DA9854FC3F7AE554E91ED
-DE144D7AEF38A0E3EDB5E5A5626374DB94F022C8CF549093041DE00D7269B7CE544E748439BA2870
-718C08E58FB4A77D93EBC04B7957D272AE1601D41BF85A2BADAA0DF73B0D3841D4839C85677FB2E1
-5F1D6CE592669FF4BBC9C69DBA334DC37706F2F6BE83D5863E8CD6A30C08640AAC4C233684E66B4F
-E6B62D4A8BE9D531E47BEF5640D9B5C27D990092BE1597F6995C8A77BE9C18AAE6C1CF130775DDAC
-41D34438FC7AD8E042CB56CBF2944932EBA7D053E9376FF398367450E35A1945FE23E05C921096A1
-5454721FFD0F429A3E06DC3ED36F1C170BE79C66996EF8337AFF85B90C5D3A4A94455AE9FA32E211
-7A63E59001F052D5F6223125BFAFA40901E98960ADF7BB886729DCA82FC3B8CC52B37FF2517299E1
-D769057F8154FB95582F02CB0BECC873A9C71796ADBD3E91324FAA94F2C41CF57C30B5897D031C02
-D256C909E080E70BFD1F32E69EF67031138C2DDCD1A8E4B65E485C23C3E450ABDD9815512D6F34A8
-4B9DB715DB2C7A93BFB424316E1AA44397749CB01088428F149A3B4324737ED9957FD388248462AC
-1B2610D72BF5C073ECA567E7385CC959E37CAC7E05470160FFA5A9F63B8E9B082937E911586EA165
-374938F492EDF28CE6020953A5B5CCEC7737F9D9CC8538C4339567AAED3794ABA3B9F4EAE65466E8
-E326F6C399B36355935FBDCB9972F10B13494DC25097FCEC5A6398F275C8C151558E74C5175F7BAF
-4155E36B733F75CF9D5C5979B0764F14D8306E06BA24BF791141E404C69F3F8FCCD91B9C58C2C671
-AAE7D4F9E5D6414E46ED633A5F78AA5BF04E652246A066EAD9E582B181CC196EA2D3CFAA383B5D0E
-4CAC9336E119C08CC6AC55CBFBAE147C623B400453BBF447E96DE036FC025624384359EED7C7D5F7
-858DC0521377CF647A157FC3F188DE5EEF094DBA125510FDE34C570D7BE76AB5DF0A28BF45DDAADB
-EA7EEEDB936332DFE93081E0AFD3FDD46BED08D6914B2EFCFDC41662A33B90B03D76D34F48D30FC6
-BBBB600E90E6AC7243FDF026762A44B4D6E4ECBEF48C9D7B696AF29EEE063E557D8FCF0F09E0136F
-45D17E608DA36E59F2AECF8493F8D62536119B5F7E1554DFE3F6E8D7C9A2C6F557D18B4AF92C9F6E
-050975C3B5C54F9B5F4E39D600B6FA2CD6DE203A174028CBB2A201AF126D1013C229BB82CFD013ED
-199D01E51EE2780FE896E01C63C655087A3E61A7F1029FA5E97EA1872F1B45F22282DDC317E17926
-7368CB52DA9444F6055A3C653659CAD2A1D8712BC2B1B32C1DC6906D957FB88524EE066156ED6BDE
-B8D832F9338F9912E29A250A8C4674E667C1C278B677AEC9972BE83CBA3FB779893FCB8F81A323AC
-91474BA2A2334A07BB5628E905C518E634F6761A3289056F83D5DD7B3890987EEE1C18FB2D379CC1
-905F1AEB3B3D2AD578F0D6C845D2D40C4BCEE3F71C90E68E5417BB8CDDD878D83BA80AD8485F4067
-E5C3CABF28AB56CBB219C0AAB8FFC6C7E192BEC8CBCA1459AE4450AFCC81B9548F40CE2622E5A7C2
-81F74DCC02DAD57EFD92D072318DDF05BF42F1EA8163071E23949B0179CF7DE64677CA99B23CB926
-B3E294194EC13397EA1DC9A5E1CDCD828156CD71F81B64167D4FB01E6002713BD8AC6F82B20CD369
-9C6CA4704DC5C65A2D66EB155B7AF1C9BB46469416FB49C1C7E17A30A5F045271D7DF3FFF2F42C6B
-470701C381E3456A500C6BB3D0E47B4D91C5F34B49BB6272F1F8698B307D89EDA3A1565DAD1C0864
-627560CF922DCF5B34C67860352390B282F95394AA2CDE0E97CE3ED39546A6AF1C52BFCF81A29BE8
-2C47C99E8050E4889E4575B75F39E662F2DB7420673797E2ED3D67CDA7AE2C15D0A0A794D57D168E
-BE13214E89E0209AB2C0EB7784E9491AEFA3C02D0DF3AE5365A0FC4AE023CAB528162C7A1B173664
-9DFADDACA8DA5FA18B7D6489E4229E9E24D38A620464A744A5C60F6F9D334B908706B738AED18669
-8A8B278341FA4D65A0A88680BA484694921512F7DE93337FC1C02BBE6E64AF2DAD07603279D87329
-1D1F4D39C1DD6D89C90F65240F4808F6F1115CA55B88E242565E59F3BBF1F10EC7B88872E9AE61D4
-4CAE185463EDFAF7DF63DE4D2207D307AFB61501892965170D2945846FCF5973A1D458607F50C15E
-06E5BEC715E0C156259AAA6C735593E5564F65F443B78CC7512EC35A56F126DF9D30974A40872E42
-65E1AE5FD483CFCBBBA26DEE426CDC4721F19C3FDA86ED7AD4FA1120F63669BEFE7002B128CEAFD8
-C63E8AC09943B6CBDFB3D2476A026C00A8FF81B1F651B97F310C82ABA5F388CC1DB5AFCFF5996D52
-52A6A42FA4D972E41EE56088F78CB966F9051171C472C774879AECFFF08BFD9CEA40D7C298922ACE
-64F28C14E0B81F4DCADE81D71DE3983D87D905192EF13CEE71B2D3FF1A88AEC671EC318917DF98A3
-C9054E372D22A3CEC82FCC217F47319A40900312F6E32B536B9E7A7FA0837EC65CCDB5FB0D414371
-17596CB39D9382262DE6E65379D3A9709B2CFBABF5FC5D5B352425F06F88CD31012A2A4147B112F0
-C1C0ACCC808CD625E0228EEF66661F70AF96D3DCFECD402700E4F6522AC9A856DA466D55C84F65BE
-2810A1565163872D62EB81333A698ED7B68352CACCA2D7AD38AB55C19E4F5582F75818302F5FDADF
-1DCED09D94872F2D48FB636C8E38C7563C72C771A08C6B1F041F3532BDB39006C89A33C09BE1E3E6
-03622D891F98010BF1DE5355F557A1E09448D486ADEF565705277B31B8BF2B86761E32631E3435B6
-88B79D566F1747BA456DDB43CD239FB47FF7B425EAA4C657C8EEC26EE01AED07CF916E77D53634C1
-37AEEA009C6B515B6342C54BE2C7B95955B1A9DA277A0ABCDA2346E88018C726F481F71D6011AA42
-F8852F2E5749518FE3B3AB668213FE1A05C10A1C53953D75312631D6BBBA01D418199DFEFF8CF548
-6109B099FE8E2F606165FE30F532C03567785D5362AA873C9D3EECEB20F1945D55F49B0CCAC84967
-59FCC7292E46938943C262D78F3212D3F9D0F7B103157F423D71B1ED54B2A603F4C269029918F238
-EC6828FFCEC66009DB9C9E59534EABB183F31D7AD4C57B1BDF0BD2CE5A421882BC10CC1BCE6A970E
-2B586BB221567CCA483989DD0B8DEC424C1D1FF042DCB7834423CF244EDA28D2D969B17440CAEAF0
-24A6119DB010CE366821AFA424D1B8299609C04148275AE6E5257A7ACB3C766C747CE99CBA2D703C
-F19B7CF301B634D8B613DDC4AFE4633A4D77BFF8E00CFB5E289EBBCAC90A24307E7941EC1685CBAE
-400CADD876FCEF7F6557EEE167D2035A05120293527700DC510B038A496BE1D5CBAEF24ED39F7421
-1A93AADF22214ED606A80582485AFE358E3A46D0671148998A3B3BE209467009B43400870359D418
-9A8CEB4D5866AB52D16D9CEB1EAB71C07E6CAA34B70E3096BF7604C22C40D5FBFEEA616DA3BABD59
-DCDB97D883FC8742B8267A16A99B7953225F7144568D566E64542C92E538AC140C851E5D295528EB
-7CBB49909B1CAF6409C9BCCEB325468FA0B5F7CB2987382616B477CCFE4F4AC79E4A6F7165363543
-F04DE5B6F6E1C2E910CDC3CDD6C4C92737198F892337DCB6647BD226C820AC99C65D8E7772BBB74F
-E65DCAA8A22C33BC168BF48E40A82700A3A7668C5A9A71E397ACDFEE7D556C5C19467B7AA69C260B
-727407AC837BDB7D67DEC055C1F45D8BAC61048C45BC9FB3CEFE7549EAA2992D2EDC126FF7A05EAE
-58613332A2BC1465B2BC0429162B907D65F793D236EDDD8D35405866D71B25F62DC4A7E06D4DEE82
-840ACCAABC0774F8A63E9C0F7FC980B3583E7A8B01C46590E3BC04EBA565C2EA94F057D964A78A90
-EA9F52ABFD70F84E44E434BD10A42E98C794065724341F907E35D3CB257161E01C7084E3A0166D15
-CED65DA7BA87DBB2EA33D39BD99AFB93D3548358D08330E807F8552CECF63C84F805205491BA3A1A
-622E70C232FADF3BF2DCFD6F0539158D3306506F150B0518371912A25EB96163D73E9EEED42EDC84
-D688BC7F7708D9DCA348FAB4DF62E5809BD094842D0A31DBB7C4B41F94D946810C5EC10B69AABC2C
-91A59500B2E5D37F4755DDFB7AE4ABF757F4C5BCF77C7F95E6A616646456FE8F18407080BCABBFA5
-7704287AD26222DF91AB2613951E2D679472F8ADF06EA2A20205EC19972299A78BAC52114334470C
-5F5890C2F846B4C6042D73945127F2E3910ECA1C4CD7A16EFE4B4BE38A15AAA710682C3836A8CA83
-FD384970139D8B46FB0AEBB002DD224199672FFA02250FBCFA4E649E335428FC71F50F45E498419E
-DB0E970F46894A48F65580881C9C4250FCEF65C9B28699408E18B26FE6DB7F1CBDB767564E73CB59
-54C6D639CE33220C894F36E70F71C9F9AA3FE2AE0AA0E3F2E304EC5ABC661675CDE2E70519E4220A
-E26FBACBD01D5169EB844750753E6CED53E3678FDCD08AB93E10067E9C64F38B40B76D99B6CD92BD
-F4155A1EA5CC824998B59AAD06E09E5F15EBB2288D66EA71B296616734FEF2796F07FF0D8B047074
-A1111D68B99C2B70FC56E74A51B062F4998ACC85B1943C9477E436E5CD7AB18DBC898D21BB93475A
-623BDDA71D7B895BA2D4C10F4B90BF335126F4FD57D73AFA50170F6B3C364922E551D40E35DA75FA
-891762FA23401D39260F2E92C7807C746F13BB35CEF9DBF2E76E66A72FEFF095DA482A4DE8A42091
-7065736CF4DE904FB52E649A32255E2030A7B31B686353492F31C064A3C4B0448C4BFD44B8E15384
-FD809B8761EE26A7DFA1758D57CE4F0BC376EB2B3833534B15A83436BA553955ACB5A7A66796AC5B
-92DB5388BC53EFA27508B08E82821E5CF669BCE52BB860780F749B4F38ACDF5FF12726BF3EC2743F
-01014CDE96FE6B4C40A034E9EAFCA2A35CCC776C2669E6AD138070A40F48ED79136D7FF57E993E09
-B81C543FBADD350FF5B5F7A46F060F88E30FE2D8233832D18B6C323EE017EBC1DF5C838321CDC8A8
-4CABCAB20B60A1A3AA028F36EA6E87C850AF8AF7CD50AA6359038BFA8818821D02CEE8F51DAB8C05
-F7AE9797814D97F3DB8CCDDE45B21DBB15CEE292FAA534A5F317B357F4091F3DA357325B8B9F5EDB
-45865415973C143E5E5BAA483FBF2D06CDD4246675EC58B84C6AE65CA743117FF00F229243772561
-31A7F2BA26A9115AFD96C18216CFDF41B7220ED0CB3FCC26C36380007B382A02AEAE428887DC8BE5
-FDD630AC57EE3DC156C7B8B29E687F24442E35CE10BA4087295A641F7139C831F7CCDA6CCEB5DAFE
-537CC1A97C5A337D3C48A6AE947F58A30DC08CC7B58DBBB4737AD52783C573FC1E9408F55495A80E
-7FDA61F0B9C4F090158F1A416249EBBA936C27BEFDEF19D1BFB839EB70576A010706D8B95657B218
-9C2AE04C11EF9E57FE09880273761FB4302C388BD608FA0C7F00F033C9C00F4E3D5CE2D903E0DA52
-E69C7745EE9FA75E2AD93DC6CB5CCFCD3782A699B807AFC36AD1F62B05856D5DFD6F88831B90EB3D
-CD523582A49732E3FD7253126D39E8AFB8458B5F7AD7F94A8DAC13365F433C857AF4A42C0A08C4DB
-9887C4957259ED22D13CFDF5995DA957EA5A0F620B0214FBFE08AB6D552DBF048D62CEF6EFF12F15
-3511ECA7833E0E3E95F85E6AC0F95438AC4C126E1F1ECF336ED31CCA7EB216D279877123FD9FCD8F
-B5E52B587CFFC4428456DDCA816819A8A4A211D8F1629E5D42BA4C5C356E580C8A22C61D987552FA
-A97893816DA73D423686E4EBD44375C257F031318865A20F22115E72BF1EB9F93AAA169C140A33A0
-6C35BD4526A38BE79CF40AD1EFA10411E8F3300A8A8B97AB140EE6734E1BEE6C8EE443D698D34159
-97649C6F10F20ACD80236422E215E146D744A262DA3FC88DC0D86FF66512F49D3F957D3C5CFFEB42
-4823509F33F155057A4C6F37B52F4667767BA94F6B8B62856B553F307E5D230C44CBFDC9A97A45B1
-39FFB2F2565EB0E22026972FAD0FB7B9576FB6F368B61979943A398773600E7EE1DFEFBF26D45D40
-BDA66EBB96A56EE9CAE0B2420C5DD83E24DBA9FF885BB844BF3D2BF93B07325DFF60C0CB5FDCCA0A
-C8FB5A2E119D5AF26E53AB8E3B428481C2871DDA26EF0B621CD8572B3C664BC7AAC01A1D05B98F79
-1A7080D294BE81099BDA7982432F3DFF4775C44D23F4F1B2E0162B61A8B2CB5EE8564BF98E2ED403
-2219085FE6194C19DAC98A421826CAED7F1AB1477AB327506010217283894235D7DBFC1153D5ECC4
-8AA7293F19592B4D7E95FE55151889BCD1D7FA7DC2370D2DFE11D7E4EA34B5C7A8E73BD3A348FD38
-9EF45B6167FB90BA44C23E912F9A4F2FC0427ED070592F7110183BFDB2C400393BA7569058227926
-351F07FED4F33633BA03A72AA2DC6B598E49B96021DD868DAD0F352E5722FB714F667C15C68D49C0
-3D822D82677EDFE86FE9668E537DA284068C9B0AED83074C92A5B939296D505B837E6A9DDAB1AEAB
-7455A08A114C2222B339284674B74BF4CA9EE0C020BF2A148B439C71C6BE51A94CB64FBE4A7EB295
-5A455047CF5CB348B062ED4F6471CBC3E9ADD9BE9B96879AC7BC71BCE02FD02F17C6063985A5E898
-3D205AA1489DA13C408990ABA1C54F2F501AA172F530480D789C848118C0A74EF98D5F607A067BAF
-F6030D887AC6A6497F9A0B38F9705F328AAD4BFBB634F739386177B07F22D5771282444E5EE17335
-B4D0EC86117C697E79A5F4F65FDC08E4904DAEDAB20067EAE2448FD4301849E456D085F392DD1316
-7ADF75CCFDB723E2904A9C0C976D6B84DDEF9D92B0E15FB246C3ECC2D0BF314CFB957757B3A3E8E5
-801F520644E4601D291DA0F7507C06F3B9BB36FC1C70EAA444E14E56C0CFF06C7F853DF36DA9D8B6
-AF2544B853DFFF535A7E5C6FC145250CDDA229956019659D0D253A19A7B51A4E538BDC01F74D7704
-9949C2C97C7EC6392C2E61CCC0992B66DAF1AB08551063E53180D2A67DE496716CCBAA45462D9F91
-B66A22545962DDAB120511FF08627131B95E5DEEB8B4DD9643E7B2AF65C0FDCE11F5F1E8DD468DA1
-8D41C8C4F00EA73836F4F70EC50FC3EC6D358C0658A4261C6D15A582A2C7C994E7882E661855B352
-014576858A265FFBC425160669CE159D07EDAC04D060B44E5800A7AAE8E339C29B929AA81D2F515C
-46229D2080D5917AB20AB6B34FDCA8E4AF64ED660A3173786FB1A1D005D575C2A5187D3F7CFDC94C
-CC44A38C5CD523E9DA726D8EFA6DA7B6131DFF3435FEE838B2C7D6B97934295F06202D307FF78D90
-6699CB9C5BBB10D1D4DEA5FDA5BFB094E704607083B646D37F5DA1FC7AD21B813F44D8C1AFEAB666
-55AAA19703BEA2E77DF3BF350E17C74B3447A452235919452B5175570A006C7680AC05E8950A62E1
-1D7E3ACA35A397D1E19630D094A86807593C97F4C484E4E06BCFF708B6DCA972E3A0009E1CAC0EA4
-141530F5C1B8AEF5E1B933F37FDDBC4BE22B74FE346D1A3F5FEC0818F8E61765568A2AC04713E828
-F98C449D9A1CCE52D10D61DD8BFD084C8D099A75D89DEA64D5A7CC68BD5B0593D97953DADA976383
-F5015915618AEC56D71D1DCD55B89736395C609B315A3F1E1255432FDBD37F38CC43C354FB4B7C44
-F1A7318B0B7E99C3C08C33B953727B6A6328051783A0A33E3CD9E498346A3CA6A77B517096EDD52A
-E443B87643A646C3A7BB97F742888D33F9B3127E61942F4103C1DBDCD8EAC8F9E259773066736CA6
-53CE57E8822651261D847C131321BB9D6626A1AC50D047C0BA47B411DF2A995545BD68EC0287CC9B
-31D5DDCA8755EBEB10ACCB3903AB0FD5788E984220443B8459E7C078DA4289F1350905881AD6DFDE
-C47302B0ACB0D4AF8CAED02B4B70DF3CF8FEC118F0FC2D3DDE3E494CD160E676E300BC464BD4400D
-B50EE43B314E0517037BF971ACD7CD327CB2134893B8A0410E68DDC518F5DEC966C7884CF5FDFE74
-723177F20DEDC039D879056CAAB4BF045062D3904F615C5CFE109AC7A35599C94024B41019B9AFD4
-04A80ACAA4837929F5C9317680A13D157A03B59A5588DF79D2E113F5F51021D6F6F90E8BBBA2C252
-FD10651BE80BAFD59C53A3367BA3C28DB6EB9DABF1EA99F47B503F627E15DCF3FD645FC52C5D5D0F
-2F07DB4C25C0D1E1C00146E1C4D973E613CCDBD3F9450CC0F5343D79F05E9492E86A1BB889ADF405
-03BD7F3E7543436859184A5B20BD8A172F350D846B7570803990ADAA48D4B9155A2B4C4BFBEF1E1A
-065C08E03928559735BDD442FF1E83E1FA20A5DA57D8BDB2FF5427C034CF0128AF111E6E73099E04
-6E0C240E80A73D7BE72B87834E45898D475521CA3306707631F5C6136199F354632D1A085F12A1C7
-C473868B62E534D15F5484323E63D0574196A19EF175214EB35A90873EFCFB92D6CF68761D45E37E
-AA61E1A1979A82009507CA193E44B36A806486665CEDBCF387053ACEAB979BD35D30978FC7659ABB
-E844F4ECAB3303318ECE80777A5FA5A9DD91B3D06804C4B4E9B4EFCF07EB89866D0DD8CA390CFD15
-98651417114D78776B1A1D36B4BA17746D6BE7FC123D473EF1EFED1C3BC1D555F914536869FD5B0C
-35F9C83F65B0E6BF7A627B9202D787D72C600DDB6BCCE613D88492E13CA0AAAB196E8A49928C62CE
-A4FFE2D0208EDA334ACF47F20BD793124D2C5546C03F4A364369A76A0425262F9D9118AF54E37D32
-E33AB25DD533A49DF5FBF1BAF4CEAC2D9D378CDCD13B00FDA432D9042F623DA41AFB80699B5538A2
-5403B0B3EABEC9E8EFCF42FEF3EA9F91766902CD206B0787C187D5370B60AD6DCD002DE2DE8DCDC0
-B4719A797C5E26BAA67665016DA0D967FA1346F9588AEDA174CA001B31213617FE19EA218EC23597
-79D979E2663166489C06993230B0D07973A117C4E3F4A4C93CF8428248DD5389414D679C69644142
-67C7FEA17E35B0CEE456667A9B1875C81B2302BDDEA2818D6019FC1622A82051F60584ABC904CD91
-8676305DC03FFBCC64FDDAC8D8AA9CE2EA00D6C97BC63C8A617DEDFC0E40775649438E9F61AFD179
-5E3B20560B01BE5E0983F136CF48AB206954E41DEE0D9DDD953DFD01CAEB569151D6BC0DFEF29D70
-FAE3E198E7EDD8922C0E0BCB8BCCF1C016142C1A8B337AFA7A05A9D7534B184BF3BF827F371E9BD1
-9A71244ECA1BA73D484CD2FAD54DB2F0EEFBD54B536EBCB5094E6BC2F5B2AAE41F05B4B311115876
-ED42C34F8E643B53372E3F6350DB8A38445822EA9A33E27FB0CC42CEDCD1FE2FDF723FC47C996EE3
-56C402112F24D0AF899B2D00BEA1CFD427998BD22B2A09046D6737814448ACFB10D387547D7009FB
-384AF0562C85694C071584236D0F1F3D3FCD0CFB38B77C81889061E668BA7AB37AA60F58A3967DE2
-6F939B79CBF10A9DCC42852561D8D6754F1B660D216AAB1E133FBAA321C56E2584BE5C9BAE20CCF0
-0E8DBE6D9C2FCEBEBAD945C3C04101D2387351F132628786F6D9D4CAB83419288D31F9BC600D9664
-12E6AA457CE6CAD26A4C0671097B98C2384C81DD8B9A3222D4F4BBDA7017895C3EDC26662779AEE7
-40D9D7E24185FB821970B0A3A94041A69E4805EC88EE1EE521981536F2844FB8F5EF645F67D42CE5
-148E2DDE43AD5AEF200EDB3A2C7866C98458A92666E5F9E070178BCC39F65A893102A10564AF4E8C
-AAA5075D2F8CD7FAB0401C03AF299EA3515CC93066744EB5AF7CF0ED06675BF049A6E3C211A89E16
-DE5BF0445A7CCA6EE8EB0347454950485D884606651E5887FE8B24323E2AA16DE22FC1FC8C4F06A8
-2A1FDE5758976024068197E1F4506E4D3D8A16D40461A4586338B374A592DC60334402F76388AD6A
-457DC3F54E6169CF7AE3959676E966A45609621055EC3AF80E182633300A4418E34A66DDFA6B569E
-5A13C9115B5FD3EC1CEBE50FBA247F60803AA83976F00117536342DC3D9890C49B2AC701D370E43A
-955118967827760F7091469C5406F08F18D7E3548148CF0E312B1DC71DF67A5E7A1656CF2F47F3AF
-F3DD50FFC2FCDAB7177285B29C17CA43019F62AC6FBA52D1493ED7C427526470ACC8389BAE827759
-4958908F517B2863B83292EB5AB3F57FFFB08393CA610FB1FE905D88A0A16AC395E2A2A6DD033D6A
-0D68992F830B2E1B95FE357BF672716E88FFB92FFC3D62945D1EAD22BC68C51EE0E10A43011DB94C
-44685A5C4576F6EF44CBFB45F2A4BF110A01657DB51FD499767E78058199B31DFD60813F1A344F86
-289F9378231D5B151C92385E3650B4FEB1DC91018EAB8474CBF69FDC1496A4D078D2C351C8196451
-247A9DCF8117E5B637371D8E22E248C64D999015C3FD2311E9950B8EE0922FBDD3D7BFF766BFE9E7
-CE0BE12F318FF2A7B5A9C6D00A54401609304ED2C55F5C1EAC3D4B38355BBD85D66D61636FA6E30C
-2E82829376BEC979A6FEEE040E452359768ECF90CC539A546F17AE906C76F14F86FF697797322B05
-1EB311A759FE260C1EEE5DACF383816AAF1294CFFA7BF87A4D9BC595EE8F2C2F86FEEE11AD959D86
-F22FDAF4CEC098942A57E57813A0FA99239E994FFF353C1E781D666B8928CFC648FCF0869FC68468
-BDBDA7D280DFAB8B0B3A4CA35B074B686DE8D372C61FB32305169A1A9912F6541DA16CD6316A6EA4
-51524757BE5CF6E820011BE3859FB8B8578C100FF029680E05F0E0BF11D33FE19460C85EA5E4C0EF
-28E29407C8AE6BE01CFA0D5022BF9FB01416FFF722A784DFC8FCE330EC95737A854471D334FDC58F
-AB42867A7B62836A8B56466E9A6C1247D46EBAFFB905CD4321970F59FB8D6FF65FDDD34BF913AD32
-2E68455C5FF2D23C1A5EAE687F259BC982B6A384D35440F7C693CF50B9ECAC0B5578CAEE87588B56
-2EB6B7F42034C9F2E545EC866316552354EB3728C7D26527ED75174EAF635E048B08DC5D23E88981
-070AD5641A652F2344956E9CF4C16E652A99F4A644D1787D6D36537489DA4D74E61B2FC4DFDF1D1D
-9D58F9C26C5EB63200526AFD168AC57D5611ADE4D4A382FC28BB60F9E7D626A6C67AFBCCD1183C5E
-3CF2EF210D0BF5CFA7BB10FA3887BDD4CD96EEEAA8F9219AA2F10ABC0A960C3B57C0EC0313AE10CC
-FF1F522124CFC8D2D49BFBB0C193EAFFC5B48FB3FF30B21CB76F0A4C0F1377C9223145BB0468A5D7
-1B9BC25873EA12E1C60334571C67385C00D0B570D3FFC6C7FF0DE62C183C76AEEB12DFFEE1459E0F
-C818C621B8D12FA1357E2B55D48935D70BF140B4CFFE8813DEFD479350B20DC2EB1D3CBB1A2D3DC6
-EE975D58C89D61FC50E6A0197DA9A586B72255023DE47DABEFB11E8AA02414C2FF6258A281219B9D
-DDFE41BA7D7977D0D6F18224FE22F7D4E9355FDB35BF7ED3418F4F68D093AC48F7D8FE4194FEB6C8
-0B9DC1F74E023C604DEA27089F98C3973FF9F4AD7BF7BAE601DB89B08D5D8139B95EDCF6C885FFA8
-B3E4B0477E7040225733826BACFD1EC4A0DD72DC41734856AB9FB700DF83CA2CE812913BD142D84C
-5C83C0B2583768198AF9E885F2BA74877A414233207234AA5F18840557CA11682AABDE8993533887
-7C6D404BDE4153C9827EB16D66C1D73A8143C8A2D3604FF72CE579FAA3C5224BAC48EA83BA848429
-9472007DE96466B5B29ACC7C03B05DCAA38A48BFF9F214DE43146AE4E04FA705421917F99BC54533
-F0EBC01849E396216B9F0794E6F6C6B61B52EF1B1950C0FB609895C3C55FF574163FC8B6B09E66AB
-AED1810E698FF37CC1F926B2CDA3B48C7D77790EBD2D514B6F385D397F713EC3AD3954EA9C846158
-6031D369E8B99E53408A79D64C34EB5A56DE8A67DE91837960E98A66FC04DFA0EBDE21DB003234BB
-78665B039D0A469A0221BD541AF7149A2A659C300132C14581EF766FFFBECBA8B58A5EB3F95446DE
-F49AF863A8113D17B2E7E6ECDEAFC3834D4DF900E3475596E86FBB4E2974C090DB4AD61A737D611D
-92B4535AC291C56AD8B1C031D2F9B505BB77517B737D70AB3723DB52AE2ACCD5DD2F617423ED3CC3
-9CA882EF41757BF7151806A9B8B0F312808863E3673FB54DE939B35CDECA7FBC4DC3BDF5A5F47D35
-E345916C39366C8B4F439CE1C6F1835C320BD1E67375B03B5DE18C93256F251761A4C8CEC01019C0
-68E34447BCC503B9571FE8000627A6B3DAD5854CBC0A2D69E5A8F46BC78F6A7B1422334EC7A98ABE
-FE9B83E01DCF3C6C9273B346F3240EA225AE4A4083CC7B0EA141A0773FDE940768358EB4B13D82AA
-304A1386D450C1C0C6A7D5A8FD2BD313F78F85248B5196241E31E5595F3BC01F37700A2DD3D4A0EE
-2DD01A36569CD507130E8F5B1E96CB560BB7DA15560CCADF3B2C9804A11D9E8055C9EC70E48C1D21
-3EB756A1376F2EDCB7189D78CD3D6CA5865537EEC31C17D801605EFD860B0B629472690588D02575
-02C6F7A75B9A1C1B397781329832CF3EC43C09F1559CD562C48FA9500295CD3B0A790DD3FCD4684A
-7C7AC49AC9BFFF36B39A9FB148BC28D37907433943CBBF0CBDAB46D3EA86DC8F81C859C52D15302B
-94A9B51C199B7104DEEC9D769C2634CECF8B700CE9C04152CC59C9326BDACBEC4312DEED92DD087A
-1C4840868D9F97CAC046581F762F75E8D24D6445370A3F1E0AE74A6478D9DAC37E7FA5BEBEC0A1E0
-81AF89C1BBF7F51E3E2E22C8C405E8671BA85F1BF0DF79A465DAC7EC07F731E00632E017D190A99D
-83E27E5C2E63D7DABBA23B2E88334C63721AC5A4CBC5D45F4C177259F34C2EADE01FA008AF65EBC6
-01D8DD16436D86AA94C99F3CC0A2F87134E73BF22F108B825A8963B49C6C685474AFE4A542C8641D
-C0375D7EFE9AC1168D9700459BE52D0DA399023E141969F25C0DAC4668534B6647EC85454BE945E8
-26B26DE6E3C4584B97A38E2B40A0D23481BCA78084FE80E00A71A790BF31DF468A435ECC88E60A57
-860BBCA3D65930186E9917CBD209C230E8F8255A7ABC7D3F043AE4D7AD63D9980BEDF062B7D5C298
-C40225B6D03F29A0339E0FCA02138E526F06B9EF47F5E7A8068A846CFDE2BFDEBD24F5A73A66C079
-18662AEC80B43246284FA4E2EE0D9AAB172B1E59A6CC46B801149D8C0DF6DEC9A55D8E1B0EFD9D30
-2FF618075944CCCB6831D336B11617107B0530D09885E5CA11A5F1FCC8D69D603DA16BEA51116D42
-CAB1AA1E4D7B9B4D79993F2BFE53EAC904FEB70B2D330A89780EAC10D12CC0C35B8399F218AC2976
-E57A26BAD20CE2FA2AE2363D3FD2A8A971747556F2959DA74A8963C20B504711AE1CB0D0C02457FF
-2E9BF696B159AF031DD5155F21C0F5549B0471A3C5DC8918B675CEBCB23E29322B959ABC05283A70
-2E878DE8EF25EA760F3C5C7B7B49D398283DE2ED837FD59F7C22D62C58FE4448B1049FDEBFC8787E
-67D7DAFE9774979BB3802254DA59BCC0219F98C219F84D995CA768B8B5D9D4A32525DFECE003675E
-E4BD5D8DFFC11025AF2B468F9207B5B2B42349B98232BAC0759758C1F4A283405815BD7145C93FA0
-8F3ED2826655053A3C2559073D8ACD199DEA2C5BA5F616A2E48548B4370EC73493BA07E197165DCA
-774438B0766867819C1154D1959FE6E01E6312E0AB91FC2E2BD240FC8652A2D456A1DE7F34EF372A
-53794D4C4E050BF3CA5B7BD2F1B8DE93B4C8002485CB219AD2D029739FD3C81CC6E78EDF38723576
-1A57143EEDE5CC887F282FECD261F6A25D0A7E154ECDF5DC38E426811BE86AAA458577E5E0C5F0F7
-5AAFA9C41E5D1DC9D91ECD79B514F8CDF7A5F1A189470D35FDF4F9B8788879CCBD91B427822ED658
-389E981E0EE5F7FB87692A3E3E931DF8A1D1573E3B0166204240B7080089A09EF7487C9AEE2D665F
-5A82F94C877FB5B0DC531CEBF1E71C6592CEA2401E4B5122E5091DF03D203DF979B9A6EFBA12E2F6
-B422FDF15D49AC0914D372D21E871DE65CBECD105FD4A3E4714B9CCA5C6803FA39DBB015EA8A88BE
-7913502E562E5B170B87BFC8572DC9DF49AD63694311EF1334444BDF0B4CA3245271C1F7A4D7FAF1
-703E3AA0E1EA8D5C6E821B28707EE0C9B4F22F23796FE87356C58AE2CADC191F4C58E1FB58DA03B4
-5A25AC95DBAE13A293474217BDB214742B9D9D6AF35F70FED2891942EACE3E625E55FFB820543FBB
-250A062D3D395BC0F219ECFE0D76686AC148BC41476A887BC494DDBD396BE200FD3E03CFA12EC9AF
-6B934A283C42AA05589AA6B4A8D16946BB51F50419CABECEAEC5AEF9085C9989289E9B46BAFB6FB2
-782D84DE2B068F91A9744AAB237CEB1BA513E57E4C307108E993C972A3E0A898D5A8D27833155031
-FDB98863C3BE7FEF3004CBAA5CB60A1F2E3EB4D7290FF5FAFA088B1CECCB6CF51A58DAAD998F0839
-6CDFD68F5ABC9C1CCB8F6514107773C69C26873E889D1F79D10E866910E4684186FCD71C965ADF62
-39BA3418B313A27AD632300969B6F284519366ED85E7CD968D64823F8C59B5911A72D0A20EB72B60
-3A61E36F52F256FFCDF706B4560B4DFA5D918FBC530D83A4B3C01BDD3CB4572E24242D141BF9E775
-36693A0407D002E09CDA5B195BF1CCF430AE9824C07928A050D0B460F2704BE8F9E647A4884C4567
-0A81EACF7CC038643EB0FF18A376FF6F32B6FE4F197273327FBBDEC6443A299CAD4B26F7778A99F6
-5A11BDE047153E764039EDB251936AA43DEE50DDFDF8856519056AAFC4C5AE6F2051AF0579A9ACD4
-1D00775D7DBE70022CC263DCA5E0A25B9C7C4F5C418587666B2FE24816B1E0EC92F9074F1403BB83
-AFC3F1D52CA79C387BDEF864366E34C90BE52F7AA09935373A07E4E026224E76F9EC3CB9E7EDE50D
-EFDA48248D61F3CEC880A3B8843306375D9711E58645F3625BDB8E87052DA67F9794EF4AF8DB0BCF
-E00677C3A26907DC651BC838C40EC39E2B5A5DC0DBD345944A6C32226089D63C52490FA10B215AE7
-03CFB663EB8A47793B84CE7364DA1C4E7FCE32DFEF09490121222774915BA59C78C2275F829D15CF
-4D8686B095C38C731B83D48738C25F40B8ADD487C350A2EBE846C3916AE384CB1050F9F5DFE09FCB
-D9129C6270FD86D55A459618FDFA4F907E6B4746196BB717865AB378414029017551161A52E9D24B
-E4F7EED553A927933D4ABC8F25DF607779A717909CB4D810DE8F5762581900E224E4B91598149BA4
-71CF8068ABE8744356B261600BFCC57FB8BE45036CF6571D9B2A95304933BD4F17215F8EF53F8E08
-1AF61FA7F9583C34EB5655CB0ECB82246959F09091F36989EBDD646BEDCA614B9A61AB7696B3FF18
-1058A150FA6EC1BE2EBC7F64357A3FF2A2B0491D2F4E0B970DE5B7788B467CA678039B5EF55C88A3
-84578D427FD2CB16C87B0BF0A3D37CE8ED43E0F049AF2436344D5F47C948C632C94A287509282561
-6C64C5D262FE5B24916FFEE982A69A6CCF888BD01D62EA591EEC51F4B7DDFAFFBEEA93FE08D736C2
-0129E345D06B10246A5F57151C198D407730713F32299638EFBDC01367E23EB59AAD42A83AB41B43
-2DB462652E29813740F4680A5D4BD47B18328FAE6BDF4200CFA4CE3773809B45E8887C9B2E423698
-9F6C48D64F5986F563D9A7538A8716082F81936AEBD0461E6F4BD470436D8B7656F0FDF89108E6DD
-02ABDEF907731D458D690BC608EA9CED09EB1E6E64C0790C7A2378201CE997FFE0317679EE1D4EE9
-F91157449323E53B4ADA8096CD628B5861BF794543A98F2FA2AB54FF0F25A13DAD43DAF9394329B9
-5AA53CA32749FECB0B2BC035DD1EBD53FF9FB5AD8BCE06CD89E5568091C1CC314CFB1D9821D7F9AC
-7C55F55E0A16E39A87D43148201B928F3C42B110FC056189DEF183745F3B637441DE8BD4C3C7EF12
-F4258E306B2877ADAEC63441010750DB4E6269A4C78A0AC01BB3603C386651FE814031CB5D8C1F14
-9EEAFF652A53E57BBD4C8C0CE36A84A319A53BC1E5FD3F1ED1EE72F4C1A9BF264B594062FCAFB22C
-C1FDE3F2E3D3C17DD3F7FE0E15EBD812D550227C06D01127385374A11438ABD50048E17255FCD2BB
-85122A6FB9B7DA9D5E9DE8A747FAE0DA45A1FCEFE92B9E70A5B2CAC668D4D07527A5C1403267D823
-048BE671F725CFC7474B44FC5AAA348420B2D7C23C6CA066666FD6F2208E329878D90CEF1C2E77ED
-22D3BEBB9D547810B189F08920A27E7107F208591A84D463CE2576C70C3DFE6643E4EA93F4E1DAEB
-41D46F0E2F56FC10C69AD5034FC9859D31CF27A3A1EE256C93111F81C11ACF1FC0CE20B90BAC9AA3
-27A5C85A7985B951519FD4B03C40BE637162AF41B2FDA68F0D1E9B7602FE2659D3D75955C579AC51
-DF6A552EB9581AC3F712F083F19B52A6C4F560F36C59CEEB0C996AAF1728A2AA45DCAD79BD7B23AB
-388D5B0B64A2B95154B6259B730B0F4A72C8C7F7CC93C7D64D9D8810D1F63FF8ABD4DB89824E2D26
-4FDEE916C41E299211DB1A53256E1DB5CDD04862F034D9404B73183A99D3D13D642A663F129B6D16
-7095BEB4EAEFD03DF2FF2F0B6B594C1EE90FDB203DA89FACEE23F1BA3901FECC75FE1811BD701259
-343011262B6A0A9707AAA6316BC3C17F787BB80AC8DA5AAC942D90F80C5A3BB59E47EC767244AA95
-C63E50BF809998957936D3BF6ABC24B0A397258F9EB4DC8F65692CB023D9091FB180C69498CD0C08
-BBEBADC84A7E0016E8F8BEA325D924EB0DF82E75D2CC2CCBF039B11934363D4332C5FBC5EC556BE8
-5EE4E707CC2753CCC43D2ED50558E51A104221C9323CDCB0199B7B83454DE3FDC810D0F362C0299F
-5DD981B31D8E3DDA284FEF9DC8F9C8DE138D3065437A7FE8C30572AD06D62E8527AD37AE39AAB0B2
-25F76A25F6C6505241ED73BA494CF923E919F688DDEBF193E188F8C4C154F21631080763B4D091E8
-AD1D2FD6649E0CD9360E8D1A67A5B5FAFC67547CA31C95A5EA8D4EB5D68B9F6D6532DB9B54584735
-9558542A2AE58C09F3BD2918EFBE1699E9C8F2C2A11EA4D224C726D2ACD4A8D8ABAEDC6588CF2AE5
-66528B94F55B823A2A1F7BE19000F3E7579D094E047075DF18C8C868760295533B26EB3ED90635B1
-29C17ACA679C3E88B06998CE5A7A2544B700229F5A6A504BD3E45B276471959C8A3F81917A534287
-39B5EF9E3D463B3BA7318448E2A3E79520D2D245A2A72F31FF7070B6E4624E3A5E216BD103640C8D
-F387E49D732529C611F8B971073F17EBD2F6EB18F9B74A67E1997926DF178D4C9EDED435B9682F1A
-279C81BB9F60DAFE125845A2FF3B02979E5481C78A45C479BEFB9FEF3CE2BA9BC46C77B50B03E48D
-A6D17B76F06F3AD118371ADC69E178C52B5FB4B261C9311874ED07DD6D5B3226A005FDD7A6D53848
-09E7063F036CDEA41619122635E835D2D74CBB6AA9B38CAA4D819C26E95115FE0DBAB4198FC5838F
-2C91B7A87B07D734C6D4F4F83444C1E90AA9BFC908A2BAC4B3DEF9157AFCA5248F2DA31CA87BD363
-AC25E9E77F741D4B2C6E02F04987A6F49D30E9038CEFC41BA172DD675AED8B392164411144E5B738
-F3210B0E66B17A13CB9631C33D44484E792A7C082DD0A5382F34C5637653261B1EB6D2035B08B4D9
-1FA9AB770CAF40A103629511F7B43F2743D7E583433DECFB19C21FD4FD0AFCC22A4119E77C87BFE6
-FE50068B22479015BE5A9F06BEAB4D37412E062A45E0CBCD7BB39FEE747E96306F79FC4F2E8942DF
-5D9DA0E55AACCDA547DA19D30B8404FA121298B44C9CCE198C708C69A8D6BF17591C5C50D3FC5BE6
-961F7ABA8F366DAE957A1C3730DA4A5B4F035A9274675EE3BBF0CA8CE9D8349F50CABB1C3EA4948A
-BE6F9F143592F1EA95404E6909A909168E3279A957AE1924245C356331A75E7008BEE92BEAA304BA
-40B7C3F48F74D9018B3247DF50EBD7CE541DA48ECCB1B0BE51A455C3C13C279D4D8676078C3EBE43
-08748D52C9B041D3E7244C745B1F2F742D010A9E60695F3EC4FDC1050AC082B905D6A57E8F407A3B
-472F731011A5798965B7B1A307E252FE02C8F79CEEDDEB6E165F1A94D7FFF18DDBDF79477F14E9E9
-3981ABD200FE7771B29D1D2D120EE79D28B9543818527039AC74085EAFF241B56D08220C958B5D9C
-87C0C04A14D52AFD475B542D391BC54FF33DEF8D9484AFF6873BEED32DDA4B371112B523B6CE22B4
-0D1B416B64C9370F1CDF2C548F4CCBE9E12E21C36CC3EA52DA232DCFB65F66B22B5E2EC04852510D
-5E264EE939BB67AEC4764B87062AEB7F680B40BCEE04AD45C7519EB3B6199C9E0E332661463647F2
-FB7EDF303EFEF84891CEBCF0FAC5F723A9D0476C3F8C092604C87FC69C7A90F4D64AE45A478EE8BA
-2DF50FB93F55A3546123F0B0E2C1C40C98EAAE9F0F26B8F80FFE6E6B94B7E27D2884D58B8A119662
-2DF6BE608C5569D7864BB756DF2EDD184B90812B44ED4A32D001C31383A40AEEE9743651F7950846
-15C48E402DBC01C818D477EAC0347795CB2792E9C11E8FD4A02E194EED1C919D4598FEC003B6D9A8
-A0BC7D456047A1C0579453FC1D7CB2D158D466939A23D7A7B8ABED7E2777EC7487973E73F2266D9C
-250CE30729E3C5223AD93B9AE8443B35711E446A3DC660123ED45CE1942A1A2AD0610467E081CE2C
-8B92A6C82F0B17B5D2429E99F1A6268072C6B5AAAA6EB6283A872C54D3694CD825EB2926E57DBBC7
-C1663075E687A144E4D61C225781D80FCAE1497B442342B4A3F1CD6BDB50E31791CC3928C30835FE
-F845B6BE5E2D7E3F2F5F085AA3FAEB45CAD0D76BCBB1ED859A9CEBB9F7457036F0BC3F195CB1A98C
-9C8648F6583CDBB23894BC719D68C2DBD8003B10D08C8CAA40BCE784D7BFB4EEC9EA5359AC056E57
-B8B0F2EBCB1F4CE40C87FC7861180133E0CB6CE2FC4FE690756D327A2B5AE063E3021C0C0BD420D0
-56F0B941E6B36088A55BA11D0C35FD0132D5F48E5D9673572347171B4328D4807B972831C0D74CFF
-A5638C145B89C989E6EC942148207D6DB82257585958034D9F9D4221C7C9F7013790DBD130F277E0
-BC88BB179DD09E27062379ED06F25EEA8B7FB33C35861A0034776E3813D2E9E5C10E227CC569AB36
-CB2D9DF2E7B7B44758F9DC4FFAD7A24AC7E9F47AA850C221048C3CB35A37CE8EA75632AE65FE3212
-175146FECD6334AE3D3C5F492F067F795E1E8FF386BA198CB74F0BB4DC0000DA383BC4CC3F070DE1
-7721431988D69C8B1A5AFDCCC83C22E16A87E01C6D3E79DC7AFA3DB0371B0866EFB8B6F88900472A
-FEF1C4A878243C52D4E02E82658979731C841C489A6B97E271C4C93800EC7D91F93EB9B9C659A554
-E1FCE42A5EC65AC39190EF4B66DEAF6FC0569A000A9E1495F42F706FBEA4D32EB7EF11A648910259
-6A65CF899C2F322F5679C6D123469192A9BF1A7F1F2C81C554ADB97BD19ADB746A4F81A4D5559E60
-AB94C483DBABF6CE2F28CDB412D50FF3FCFA3B3DAAACC6A83CFED910CCB3B8D2C19590AFF4D75303
-4A6CE7F4156896A13808E0DFEAC547E69D3C886691728E4A35ACD575B40D721E8FCC5385A2EB28D7
-08101DC50811529528F5CB0C009BA7E3C88468E37768FB0D83895AB54DB2DD5426562AF9D8AF304B
-F6EDA54E9C92643DF926F5C3578269750120302A37CB140A18BA56BA01108D4ACACE8FEAE640A6C6
-958EF156B588ADB0EA5F3B0F37BBA12B7BCB221C811415387B024B7076FA4403A3AD6EBB5D9C26EF
-EBDB7ADE7C60B444AB9F90EA493B658B7767AE2BE649BDBB3FE85F460F1ED137C61BD95F7CD3D8B0
-15CE45138538930AB62AA0E54B4CE1A5EC5FEC0A2B28B345B67089A4E4AE14D2E1F5A9C8848DA688
-CA298F93860649EC3AAFEF3E820D86988C8E3E5A4D4BB937791827994AA3E81D0BB3EE115EC36D5F
-B9A392D09E79AF514D11C7B3A03C9F9C13355CE79E119A19177FFDCA34704D38118A8976D1EE5AA0
-2D14FEB1414419F5E85244ADC5C0A765A522EEF36170064BB19FEE3B5F7B441E4DB967DAE0BAC2C4
-8FC6A836E0EF5A69F073BEE1699F55E9C757EBD6FD8B514E2B49D6333815B7DBD1E0694695FCA3D2
-1320A0C4B852D9706DADD8369A95FDD917328BE93DD33818954DBD2C212D2CA81560ED5BC284EB04
-7A5F389E24E43F4FA8C97FECF46589FA7341076555CF55B1C21B28E0C1CBB00AB8B6F67472F27BC0
-D11148F407824B0159B5188D4BB7386FBDBF1C0FAF34721B7BCB5C0FCB7C4010DCB6A1284E9D7883
-9E3C2111A05D29AB7997073B590A81C6168020F1D48951BC7D8476D5BA593F4F23CAC1F9BB0E091E
-84B4E99E5C584D1370DD12DEE8DF16AF8BC6B7B23E2FEABDB7F32779AF8E2B5094A6E9B7A7225F24
-C43A8E5D2B977E1E19E633C26771E23017ED233DBB02C64F8CF03992C6484528D0C8464B46F24F9E
-8380F385D5D01B8893C67FC103498983CF939432AA380CA576D09030CD52FD99BDC3BE16C7204CDC
-3365BF76294A83A1FC14A236F5FE5321904E779B13232A76F8FE521F425562678436359C2461BEA5
-AB27209541F557AE2AA60009C9CA0A9FC7898C14306CE35A50017BADEFDECBBF94EE2905220706DC
-806409EF87DB1D73EAB0698AD2DB72CDCDB293E7FB13C94D9FC87E74502E6927A212F0D7D2F2D194
-64F7A66AC07872E18CB1DDE8F11835DCBC5C4EF039333FFFC0FC1456DAADE7DAE3EC2EE0D3415B0C
-ABB69FC5006F4D14A4EE1A5CA99AD4D5E629C0DD1E0F097B5B93DE2DD001A8C418234C9C45E8C13D
-1AE04E9466DAB8CF1ECB88A4E059C111A6468D2DABB90DA79C7C79E94DB28F6968B1A632F8C57D9E
-565FF91C6916026FFAC0661856B9FB8DE9C81661816221B1FC159CFEF1751E7E403F5F2CE32529DD
-540792FC17A12A3DCD7C50D38EEAADBD10ADBF5D8A82442AA900CE6150EB7A4639DD9FB6E385B2FD
-093493DCCD9014B23EB172E21AA89643A6CAD1093343D85D81261972DE0ACB16A4C6B5F0BE4C978B
-FA12D3CAF0134F9EA49F6E9687C8F99A456745EA252F0BA9968C7F9586E3DD841AA92DC7705BDD68
-2DAE41518A09DF0E209F321D7FA3417202F4BA76A984DA3ADDBC58136885362F02F0A24EBC439B3D
-BBDACFFD8498EBD29F88F016B1FEABC10785438EAC860B554525F3266097A675299AA0967BD3B7A0
-EEEE3FC578D1BE99D3533BD91571AED904BFC9DA1A1451FDC5406E1CD614E0C7FBC733563CD6CE6C
-C31E9237CA153F1F0411114361D731636BCF98555ABF12848AD109371A42B63675A4130B81E97C2A
-2EE2BB5D8FAE2640156001AF0F55D9D5DF8FF23C8AEFE14F120000F14149A36E5C94CD9081DEC277
-C2C34870D05011F99D48B0875A5FF542F067F7E9880109F586BCF2B50522A1F23ECE44349E539E70
-F84E207DC9BEC7CDF856A046F1A03226AA41F541719AD1AF88FF211E57DD0C1275DD0B7B47440DA0
-89B98C6EE92A7D94700B83CEBE19EAEDD8A615F6587587BA8BBA3CE3AA5E8EAFB1FB0F486BE3609B
-169EFB178A4292F4C0378AFE5D24EED1CAAB514DDC66C696D8E37F294A6579131DDF5488E9436609
-ACD750C3DB0A940C84FE022B22ADC2676F62E91E8F891225F891FBA537679B24547BBBF35F04915D
-20B11739F620D18B5B216921D222F15044368569AA302980B9225BB839F494588481B94B0C724352
-B2DF600A22B062561D86CB8F81514FBDAA4F8A043A0265F992FAB71FC9124A45B8475E1EF3DF6B6D
-E35CF329777D45F08325E8505EC0D979F542807AE77E57E453525F23BC59A50740371EFA98678AEE
-6C425374AEB745B99DDB5D8D908FDB551FBC0DB15832107BBECC4E11A1A8DEC69358A574A2ED46CC
-31D564549EFF23102D92BFDCBB2BB985F78F36033E34F59C0EBAFA3BDD71338736464CEFDBA91398
-33995EDA4207BFD4A9867D32E867FBEB7DE60D132803EF9347CB17BD91315484EF6570892297DD8B
-7D966103339535E28A00CB1EECA4A9775F60A9F5FC9BD8B06D78FE8E6318C31DA2E847E3F9CA587C
-B01AE2BA0A2EBDE308314413F4F230A758184ED60D4F71F6CEC22A93A01B6C54E0449A3860FCA895
-4A347B7588329A80974ECBECDA1070FBC055666375229F13DD995E99265DF870BC8B8CC6347FADBC
-1A6AF64599271A475B9123493D46BEC41289BEEB67EB97A8DED7A9C9730D37C65164CFBDC22E5CA5
-89D2E7954C7136EF4E084C43A6C7F361A3E96989239BDDB9A593CC2A80BA16DE9EE90E95CD39393C
-212AB22EECB677FD36D34DEB46C4AD0D21BF7E6D7CBD0C8083842FCD87B18FEA7CECF939987E99BA
-34C214E44DD84C176C9CC5A4CEA76D380CB316BB4EF9DE73D73B4AFD4ADB54451591DEF86621D138
-D5A0A29441502BF6C2ADE671CEC3CB5CAB903A657EB2D70C943F976C110E46C5D9D29BC00A875F27
-38E5D22496A43E096E009C5D3CB724B4CABB32838DBE527F83B18CB457E57B092C302EE557FD4F00
-DB9C56E66C9FDF4EC9FFAAB85F60D02BA79694FABA476A199A0331C30A78A92E10417BA236E23364
-8174C826331DC1BAB87C5F95027846130C6A2B4027930EBF9A97BA1B039D386FC51C302648E25980
-212F6A582CDE2778C677A01FBFB3C5D1B8A374ADAF6ADBF7DC94075F25ED66D440B3922C5F255FB2
-3FD8F6E21EA65B1D93BB225684B50F11310E242B087575973345B229BA62C1E2C35BDAEC04D10148
-F5B2F3BCF7399BDFDF1F3F79119714AEA697245BC647316EA157484ECB951BE367234FD02E8B1F09
-1AAC3D29BF282DFF4011BC0CBA8E55234D943DB3017CC7A766720BBC29B2D097A956C0F1067177F0
-12D42ADCB473CDE8D1BA35B4030757FA1D8211989DF3BD22CE5D501C21EF8708FB3449DF47D88650
-9FF7B59B76C0DBAE443F336FEE2D615D7EED1C284F14335BC8A26BF4621E10DE9611FB2F1DBD52E4
-B7565D8C65B54EA36D508BCF0C578A49A2665227CDE1F9768EFE847F9D94F1BBB7DB83701C232198
-5C7283D47B2E40B27A268428AAEFE75F6B2F8764A8494E5827573758CB9CA46FA93208836BCCC8B5
-564A69F5AD882052AF1C1417C3FA7F580569528682C77080F3688B65E7FC24D2A3AEB61574B4A321
-5927281544DDD7A6EE0A3E9388F8F631CE7251724DF70726E5912DDCCC8C652DD6C9608F8462303D
-867F589DE0F2F71711B35142EE6EF93B64D6326C4DD7DC83278E057100EE772082E6BA368ED91A55
-53ECFE2293A481E42F83BC8F9148C70EACE91F7B7D9CB8A72415BDB3AF66F68EA733A17ABE9DB005
-3BF148629132969589F38D30EABFA96A01FAC72650B5A6FF3935670198A1EA33810A9B11E330EB8B
-451F24F93544263436F669AB5A90A53B16CCEEAC36B1445574EFA7E802DE73522BE725E68704822C
-B7D3912717333367895BBFBE06966A5CC653AAB5E9B3596702086BF0010085B900711932A95ACF15
-CA4DC45A754EA334E9EB84D6FC8E3FC4F897456BED64BB93B593549FF0D5352275D8E417172A6664
-C5E0ECED1019494A7ED49AB0B965BEC1A82E5873766BB38D7D856049CCE2FCA65AAF61E961B60634
-E2A69EF059754C9D8163D87F928C222772D070D83FEC6FA5AC734AF65E40BFDE521F7D9CB1650FDF
-64754BFF21EA3FF0AF7611A93D525EC9B28C51AFECB04E7FC8323DD6C9B0D8539A34FC3CD8CEB795
-8E8EBBFED4313C77ED469C199552A9FF70BA5423B03B6148D4EAAE17B71C5B39DC436AC53D6BA8A7
-AD81AA8B02335A8B2B11E9F4FA913159A725B8AB60F52F1A2EA50EAF4D56656E615BF382CC68A690
-BF83DFF24FE986570ADC0290ED1A37C1C2AD469CE789E0EA0BB5CE01020100E729721AF3B5BADD33
-A2DAA6C33EB8F9064F5292F715F820B4BBFDD56F76D42E7A1A068C1CBDCE4640082F6E7D582D1939
-990CE6EE8D270015A2C461798B37DCB5798EE9F7512168B76D26C28BE4A49A1BF96C89D235F21A1D
-B6A96E5DA474D0B19B808D13D7A11BF39EA8647499C410ED9894A1ADF33D41B6FC2E614D8087F4C8
-4E437B136F3CB32DB8393C49177A0675A0C9E7EECEF448A97AFDBE840FA01FC7E5F2E8FECEDC1884
-84C312E8635CD79195475DDBFDD4D38D5A0246DE2C7F21608F8D2C0DA1371D302E941572E5792A3C
-F4E51A33228B93A814D03FD4FC223C314CF3714BB3A34BD4F7ED6348577FEED9DEB082C4049E57B5
-D3CDB7F26629E9F3BA36893E09E3C7463D02A22D7056BE76B87763260E46E48BB832B7EE13F8DC05
-37EC8E81E9BDFEAD8C27EBDF1AD706933EFD11131E12814F236EBB01BE85B7F1B2D627413B324918
-D247604F56EC128909873FEC3857028BEF76A3494364C2A7002D104D486236C30B48E2B75D851C34
-EA50BA7FFEB4E19190898AE21768C157C0CAC628A2181A32796FBC1A7271D2473CD88E5395DDBDB1
-FC3AA8DF0F3D588637F19A8B833AFDEB5F655A8838EECD684E2315B72C75CEEFBCEF94344ACE8D6A
-DBE355008EC72FE7CEEAB01363A895F4E73F867639BE0A0BE67333848816B05B419221BE8F9066C3
-62C23FE85B7F392930BFE4C12B9526FF2FDEC38F23A159ED61A0718E7115C24597D849FA76369153
-54A40C965D4D72EC94DA61A03766AB39AAB684E134FD1407A5B1B19BFEBA52AA0DA5D99CBE5C82DB
-AA663711E6DEBA180E1D4A39C320516A4350D296BC19BF1BE054859A0889C7E9727A021F3176FE62
-0FB0C837E4141FECE531A950C03D319E3255703220B7185BD20FE5DBA673F8129AB211EFCF36EE39
-4C7E00EB0876624BC840FA86E58B2F584754CB6BFDFD76810E300741EBE4544E5AC17413ADEB21C6
-2F66CA4F075C32381796BA709782DE34A675B717A2C7F6D88104CB924FDE5DF775B4F0B68E0E2E5C
-2F788BBDEAF06D8E1FC2105CCBBD5827C0B03FD6CD64F0D073F3192D5F94839644E5EC6C5185BADC
-F04112A65F49A8C83174A9AE958E76A2F5AF469E8B76C833782C5FFB8BD7B1BBBB3EA0CB7C9786C3
-BE2ADE5E7AFA8C8F20892659A59BC421E28845A108E34EE17864042EF587A6D67DECDFB3F510EB40
-D2229585347A0035670FCC76C2837A4E4D68304FE113C539B35C1F0234B5079B8E32934546982978
-C5E4DF955A454EA263C3CA5D7101F31A318D82A3F9FCB5A8AFD7A65209663B0FC9DA400B26F285EF
-46D0E1EAF8ACB1F1CB805E3986D04BC585073FC64895E4DAE1CCB749BB439CB32EA91176D5C39C36
-50D10AFB9C9884D5FB90183424CEE67EF2175D01D2478D67511EC9F54F88763C152697B06D948BED
-49240096EEE3D06AB4575E8E8B2CB8263B5BCF4FA1608720F52B675309833071879DF52C3EC2871D
-20F398B5CAC8F8A4D41D0F1D47584DD90DCDAEA4A1CF160C4B3BF1AAB890B5CEB6CB3488672AA68F
-BD938281DBC1D8BCFE92FBF514DA5358443CB6E0147254E91B38CE6787B2BB0DEDD2D38F5938737A
-977B5EA42892520C58F8FBB53C994B57382379E9490F0D6970B980E1BDF8CF9F4C3C5E0A18F66E86
-EE93FFE7FE546DE50F41364BCB3721B637072571FA1779F1D672FAD260C16D7F13CBDF3E4376E7FF
-56D2A710AC5AC35FCBDBCE2C9C17E523BBE6218617B13C1FA6679B308979AE7C61DA6E68369324C6
-CBC7DDEC364E5A86707266C0B459EE7B2C03FE584E529BFFDCE98C90A2F3D9305AA74D3ED8430DBF
-3A49FE2ECFD9C4BC9FEFD22618FE9C8A973AD072AB6F713E4DF02DCDA7AC5359B2D652013E131B76
-B3ED6C75FD53BA58D862846264627F6B9E70D8800F6D9B32242B747A67BB2B45675840D34F852AA8
-062FA6B01E31ED24DAE02F6CF788A17F7B9368175195DB0072259CCE0FFB2C1035C1D26E1777CCA3
-D56A827C3242069E76D6DD69B653768614B9ACFF16567FEA61508D51454BC02F6C60F755AEF6AFAE
-3536BBFA1823F8E1A53C41124DE983E51CEC92AEF4F99785D554488A51C20885346D1F761DA79017
-940A0C557D93F1DB6B3D00FFD61D08E96FF3AFCE5FEDF545CC9F47A2B1BB26713431D6D1E47FD6BD
-6E3C668B0368241F0EBB5FA9C991DF79890E52E83A3675EE699B61BAF869DE91F67278F510061C6F
-E41DE2D883F48CD0E068E2A652B244128D82E5CD52F35F210DDAE3054691ED55A7D99088AAE8FB04
-F525C2084AC09F5EDF80A4EFAFE981F74C0DE9D194320709B3464F3FF2C0F6AAEA6D973D9C323F53
-DE3D741F698FBF01036716BBD62957CB32CD81D3A2674560FFBC5BDC5C6E4F547E589AD0B1CFE14F
-5E17FED1C4A8ABE4E67CCF8A49F32C4C6044F1431E1CC382E7758722A6D0DF9ED23E51F8AD14D11D
-7B6428E27443715EBA4E9C05D6F238378F9498AEF0E7EE4FE6856622CC8E6ED141EE5F109E343CB6
-695C4BE1E0F66601C27975983BF557C04ACFC19227A1AD7E6C44C00529FC7EDD7F886D24B7E029B9
-C395260088BBFB96972199A7B32796D27257DE83A7402291C14FECDF7998C5C96B1EDADE0280F856
-8A8F5007852EED303969180B3329917973C2D32C080C9765B6BAB0673BC7ECFDBBFBEA980C263843
-39B7F1052591D91667D4FEE413AFC23DE2D4B9DA742F4269C6C939F5FC32A38040730A018155AD73
-3F231E4D5B9D01C03A58EAE7B5F590CCFAF25EDC8552CFC8D95C60EBAE1837D7A97CA137E9D4A4BD
-2CD34AEFD68D64B3F4F62326AC429921D7FB3C235184FE0899690A0B775F1A566EC29D5830D32372
-6526F7E7F5AFDD71B77E07613DDC4FC63EDF49051AEB59E6337AC0A4B6DD872E776C9CD0CCB86130
-5322D816732124F5978A86C186BF0A0F88E733CE38E4D7C1BA5378C5629B1EFC97806059990ED42C
-5CD183BAD7E94070E4058569DA2E51831FFE0D080301AEAB4350BA290318AEC582C78D05DD92E5AF
-B4424EA808629BC972E68F4FF2489C245593F07555CA6A2B25964794CF31CBD3AE5C229AB9B8C298
-06C01D116EBD0FF0F159ED2D3D7DFC73EAB4910BFF5B0B0B587CD9EA6E6FC45D63C09766224D8346
-1F0588140B258B1729F70BAE7962189B1554483392988CF230AF4077193E53330519394DD99BA135
-6D4730AB221DC6A66019BFAE564893DDAD7B177DADD16ADD21D396CFA6C3DC818052E2F71149FD59
-4A16DE0C2FFDD366C99B486C55A6E991E4D22CCB15843F0C3363676AF2F5B2D1B7EF66CCF2F12DC5
-0D63776BFFB058D70A9C76DCE96C754872D72C82A0C33F90D49C935402CDD26B6D743B1F43BED5D8
-B539424849C1495DAE73044E885A7D0F307F1816DF6244A6F2D97BFD4E200E93F69B08AF39EA21E6
-E347A47CEEBF803F73B978ADBFCF056789BB8E6E2563DE87DD9A8C877157B934102DCEDAC54D487A
-1BB2694F0034093C48F10A17D32E2BDD0C723CAF59ADDD1BE373AF8C9BEB4415AA5AF36310C31F24
-354A53C0B962573148BEF91D994FE3F3D8450DD4D686725799F53C373A0A3E3C060C2E1A3E800504
-9F26D716E1F381B9F83125E4683264A07E2D8938F605978E2513DD2050B3D8A1012797CBA8961632
-BED260916338A812AE751C7B657E086A0C7DDCD3BFDDFF3E48B84751925736D1310C4910FC114387
-F3ED7FE163F91895EBF55FCB425CEF5729D99BD8F2C072E36C310523E75CD8E5DE49C031C4263410
-9D56E91A46C8C8E89FD92012A00C33D0DEC52597B5C6933291A7BDC5CEDA95DCDA5600F9AE1C8250
-54E7EE1067458CCB66610704C58E4A4FC0CB5FC933D0322A716B2CD430A3AD48DAB3D4CBE9D23F2D
-092368CFC4E1F5495C133A92942EC62118D45C17723646E69407B4A89DCDFD2AB3FFC099A21D9D29
-741D68270629AA3A414FE58658DC9170C247B6E23F35C4BC5FF83009F462F2EEF4DBAC5FD158A658
-57F9B6DC1F5192DFB169DCB65621CAB2F1B07BD22F4155A8E9E2B6388D430FDE5EC1C834D22EA035
-C52E1E34482EADC36B4CAE902AAE89A7284E62B3C84B608D6BD05F75BC31310B2DD3B2C08A00E073
-7F104F03A41989D5F6B9A2C38B22F1D1803EE5D7A4D8DE44E4ABD496A1DE0C0E12C4BC96D0122846
-3F0EA9CE9509FEE987139F3DD3F9D0DF4313F555BE85433718F6D05F197C41A9D9C7A8B0D2740196
-82D49F58DD5F66B12A6520D9F226D1DF1F1B65CDFA261F980CA25A92645B86B64606293F8BFDE364
-C47D2AF2C709BBE77A70A5712F2CC26F3D66F5BE2C307A48E6F887F681D30121E32BBD87271B5DC4
-615D28C309F15AD263FB37424E56DDA6E17B998B45BE6C7FC6C28E3394A8764C9EB2DF5C06626593
-B5C665D550D4600172791CD208AE9F37BC082B0B242B0A504B751B18F4D7495172B697EE217834A8
-A4FB7CC16D6F9E8BB400BE8AEB0850960283DCE725249FCC4DE97D9886745AB6066C3E2F64DD8AB7
-9AA11667F11188D7965DC11EB760B772E282DBF13249F31986AC6898FEBFE23E3E8B8D2C33E00EA6
-FC493850ECB2E6D831D1EFCA3C2EC8EE2E394599091ED58BEDE97D7A43B6F739EB0F845EAC1DF6B1
-EBFE876009CC5D804B15ED4B56761B3CE1AF59C07B49DC798A44532297AD73D5101ED47F36A3678F
-818297CC27F6AAA2AACCC9AA9B6F5459911D8C56CF499E390AE607F3790450B2B9C9BE0F006EDA0C
-715B5CA0481734CFB0597478E7602B0D2C1E4F78F03C68C17C70E4B42D7D2D3C95CF40F73488B371
-8E2CB05A549944D86944D78724E266C3319AF89AE430E777E95F0D792B1C654306E421F3D63A26B2
-1E74B6E8B21B2E2B9DC596D013CDA16D08E65E8F24A84B12B2BADC653E6E1110DE2E709C1C1BED13
-707B70A421B384F20CA7A9A9D20324DD383F28B2D3C7A9C53F5D4C6B7C378D26DF11CF55238BE1B2
-4FA70DCC178DAD3D35670FE4919085EB1CD905971D76A368FDFCF9D2F0A23739851A3A6D2E02D65D
-54DEE69ED5D81315D3EA5E356F94EF256DD267FD1E1A9EDC9CD63E743F299BCC4A4506233B8DD765
-2CA067F741603F93250C087D368F9E9CC4CC1A6DED567487C05BAA992B0056A77F630A72008E3946
-15A9DB24FE56A956650EC9DE90A6C2259189440247970541CA198748928215C0E132A81AA13208D8
-63C1FE817F70CA573B54577D10B73100AF8EA088208A44FB92ACA314AE5879706180788C17BB1D0B
-81B6B95A1C4E0F9EA66F9B39BFE12444A6446691A7BDB03E0F03D9F07A10A7598F2166F108529F34
-CD90E601FFED3479ABCFCBDE8F051C348E48C61D95B00C59EA1287423F05666C3D36288844067E83
-E14F6B5210842C742B89F13ACD126B9FC50ABE2CA7D7ED513D43B6AC7F41EEDA416BFFFCC5C844AB
-2D23D4DC09B2D510504CE98D02E72020D9E669DDAA344C63A1B75632F912A1C0DA3885DA4AF7E243
-E4A4C6493D6595BB6D56B0359106957259E59E336BAAF35BD1CEC5CDE735272EBCCAE8D4904AEBD2
-B32610C6FEA2B69941D6542ECB44D71092A3CF067708A3D087AE99FF29671AB7DD8758759B971A08
-AE1BAD78270D2FBEE37AA2DCB119D72F6C7B0C8509018A70D0B0BE2C6830EF8E0B24B1CE1141EF87
-3A4D7DCC501F808BFD94E4DC0F2915AA023076BCC8006490A43685EA25AAFC187302EBDE7FE1965A
-04A5A398985D29F08E085127B56B057334D88EB638A4DDE64AFD204974C3939536B1B66A54B4DB81
-151853915718F70813F096CC1B0EA25E363B49264C2AD17158A4489F91453FBEDBDE15D7B74D7F98
-E81DF23251785D58295BA297F295AA6248A912CDD4F1111E6B628EECBB5139709E76EA4AB743CEC8
-26621D08E6BC64691CC90B3C3C1778931A28D3D5B1E20E96C643316613FC487C9B604C43463FA453
-3BCA1236286E6F5A6EEB2F1D9C34BDDE4595495A365F88055D9268541CF1654ACF478D384A5496A8
-772EA1402751A093582A6625A0A44816B5FDBE166835D598644296249B92CC90AA3FD6445C9A19BF
-27F59CB0616C7306070F33C7DF4E1DE64AC8C5BB2FFAC1EF2B1B30E5A0275E6004CF64BBE2C6710E
-DCFC3AA4ADD60106334708862FFA6652825BC84842736E47AE6917180365C75B27505EED3C6108E9
-898A780E20C3F606A860229AC46D0471ACA0187D6D539A1B8820F620F72B41AD1D3BF3834BF48CA2
-AFEA8BF535AF74C4562DEADCB63D2F5C7585722B77C989342D190FF926C8A5263B4F25286F99CF6F
-C62EE6E2AD61C82B29D82468AC10FD27764278E5558CE8B41BA111CB2F040914451A480C93084237
-CAC8F66BB7C6689F340B8ABF0150E06D5B1177278A4C08742FE22F42C28680F190900344ADFA486D
-59718C25D37275BCE4DF981AAC35D2C7E85C72A0188B8953CFA516FD545AEE0BF4B8BA301CFDE214
-4241FBDF3D204E3D2823301572E23F204C97305A82401660E12926EE7BA6EA1A81FF5C007933AFC7
-3266FAC4C134ED818A48E7DA01C71A46335C845F9DA5E960B25339D551582B375814148D94CFB781
-FC56093827B78578A73D4FF67B6B87F40CFA5E3F4325D9108CDB64BD06427B88C84105187316FA29
-90B4E3E8EDB6C78ABF164F4A9717D523794B2FE772A04DABBE688CCA977090979B5F47CEB90A1DBC
-167D305EAB231C9F4260C4AD10889CB785169902FC0BED78DA15B8417453BB65856EA0BEA5245BA0
-573F623D215F6C0CF801851C305B355D26B52B0B343645FE25C78A3526841EDA480919A1BBE5F56F
-C10ABEAA3E1FCCA7C43EE560F067F1AA2AFD642F769D1ACE8E2AAAF38850F0D757CD808C921D716E
-96FBC07DA7860DFA70CEAE2888C0ED3CBF9586443532B68DAED9A926655C157A416C383A53D8F283
-2A4E67468112A09ADC837ED8EC95F70852921F50D4417239FC42EE3624CA97F682745CC5E76CC7C6
-7BD99F2180F8C0B7FB49539C8CC474C25C0DDE491671FF329E51BCFA779346D4686835A3AD6633FC
-B5E0F67E0CA9CED8F215BEF4D240453EB2EDD6ADB22278AA5B985FA140C9834D38753DF2014F8C0E
-E6DAD19E8FC54C03C1F6CB0F858986691D99592562CAD95FA0A5B2ABE4A8B54B457D42E8C33A2D19
-51C0419A72FB94FDA78ECD92BD2A1416459E9DECA9469F35E4C47DB531726DEE8F203D7042EDB32F
-025DF3D582547BB1D45F7A5B70D317DF4EBB16E36B0D798E0932FD2A85B04FD67143E4B287A50416
-2C1F5A037CCD780088C5476385AF8168E12D97D44B0630621759173C8F1E3006B5B1C6D7138B7EEF
-C3CC5F54E24B2C3CA7B41AACFD25E554880AAF406EA4C3C6E21D3B550B040FB1952598A7E8E6488F
-E38288B2AEB6C4718338598A2BFE4D2B9D14C65732DA304C16FF3E1F8F03046EF095B65FD609DA87
-EC24A69278BFE65C905CD0329F6A486B8525B7EEA4F7AE56C2633CD83543269E8ACD6D71F500D82F
-DFBDE7F7F7B1AEE67328549232E26CA55085B6E84D9E2E7F74068F93A90C4654F2F396E57C5F76F7
-E61CBBE523DBFBA6E76638BBA3064DA025A79E3A294FE7F1CC28A3B4C57DD6FDC48E541A85534B25
-E1BC11B4F78019457239EAEFD4BE9007D205F1D985F389DB22400B279C10948551A6B4A17FBDA0FF
-C9428B18B43DC76EFB15FC2182216F1B60B4E344A03AD6C00F141EF99F89F24C819C3E32877A927D
-84C2D006940F39CA8B71E5951673EA9BFD1749923219DE38929ECAA9CE43B06CFA7DA1BBEDFDA56C
-61FF6C24F40E59B13870D5FDEB82D981154FAE5D6D5152DE69339359461A41A9713B6BBE47E868C9
-33CD74C75DB71D13BAE4DEC85E02FAA14EAD6C0A253B16C79514657B15E68CCFF9EE6AA385CFF9E2
-C53D9AE40F85C793E4E8FF50B2B7420F4FE69807BC5F37C3E300E6B3C3549D1D3246A2E70F091054
-1135BDF805E0A698E236B6496702D061241687B7B8D1A0E517DF0476DA09D89667A7AB375FD2672D
-CBAB8124E511502DDBD08BA04D941DF1CEBDCCF7ED48405CBCC33774A68C5212FC6F132641FF413C
-984F8B43BDFD7B1A2A3435F15AF07EF4970D3E4A0BB947C181E9CA27CC14A35BD1BD096875B45873
-8CA244F88C28728B74E25CB8C4FC1095A56CA75E4569AD3082EF194ADD11350DB3B74B96761D4538
-596FF7243B1E1B724716A144106E080D42036444FD472998460CE9ABBD05B42AF9389AC452BDBBA3
-A13A96890025789F16B9D92251FD3B3BEB2C61EDDB370A20456E3BFE5F4039E2557C451C524F8087
-015BAF3FF05F51869FB97512968BDB2B49589C1C7AF1E085250A47657465F480B7023E24C76731AC
-0EAB6704123D77977D3A2C4C56B691346EBE589C619C04515D34F81FC6A17527D5D8319013C5D4FF
-27CC3925E24C99231AC7FB9EAF0BBA482D3B75807AC85D03CD09DE5D9AE0B07B7A813F0449786500
-0AE8A7E00080300F0AB8C399057EDDBA273DD2E1B2A0DCEFAD3B332E6D4AC1FFAD846167DFD70E03
-46DAF84AF292D4F424256ED5AC4E104F80697050D50844A708EAC9E7F7784FD01646F3BD0C595CA5
-1EE6BD607D254E78ADDC5E15C3B6AC4940EC865A5C23105B6BE09EA09F2C05D6D76960A843B81EE4
-33977FAAC3CBDA85CDD2F4DB7C28293A77825635992AF8F3B38B4480D9A139B1662345A8ABE1634A
-77496C3F57597D2985E9E54717AB2E99CA35789441BCDDEDE9A9E2106B401D9684ADBEFE40D607F0
-75C179E9CC03E59E65430DB70B441D43DF03F2AA6FF06F224B6E455B01C64FB89EEC9103E48453A9
-749B4D602808C7E408A8903091D85E06AAF635D0D529C3CDD1B8479AC0F4208C284BB678A547F2BD
-77BB17C86D4560434F7AD1937760A6AA55B614CFA9FF8C9C96561AE6C8F2121C4E20237428BC51DF
-2099B6C49E3EFA18E6D439E6E6981E746EBB1DC461259D8EA0F8099C47CCA27B2D982B72C9A07CF2
-1B3C05D6E26E6E286E348B8944078E24809F9C5F3D014B4CBA02533F5621BFBA1F0EDB776C634746
-703C9F73BA89B1960A496420C68F54E5B901A6D733D7ACC79F275FFFB253F389AA480084468BB34D
-A1E797E43B7F6E8CAF5E8C93069A3A2730E57EC39B677BB73E3F07C2055599F7062E53B37A5F0099
-907D2ED87FF7A82C95FBAEB888033BDFD67BA3A6031A4CDC56CB1E4CF5B06B46E16D988BECCEFACB
-9E1C037023D7BF5CCF5D65AA66A17AB361BE7981F132A578F3ABFB97960A6034F052D9D5AFDC0679
-782EC90F240F943A5F9A3D969ED7399254FF67D89DF668F7C56FCEA1FFDCF20481474AC8495D3AF4
-B6D7EE093E369C057F0B70858220693B398ACF8E8143558132E4391405E30A73937C53402E459F4A
-A3539CF7A99A3F51C0307D045DF8B77757E92EA2F51BF0BB4F77D3904DD355665870C2B59F1ED7F8
-4FC71FDD7F0B6C5D3182DB77827CA6A2060D2B8C83C4EA4A432EF43A4D0A952CC6CBBE52A9F0CD66
-1A538973DE41FFE9C5CF55F2506B9EFEE51FBAE5E63BDCF5528499A47C031163C88D3022606784DE
-2F46A9C9235AEE3D4F71D4959B0CFDC5B7E78C8C0A8F9DC99440C2263DBACB343C5C648577F5610B
-50EAB1CF7FD02419EF3941C7CA0B0E64EBAD4B2CB05A0793DBC38F1946D44767BD287F5E9779C611
-CA0DAAA1E7393DBE0683C8D3455CDFEBC0E64B54B737E298DDA605227C0C4BBA87AA3EC7FA6EBAEC
-39E6EF2537D5974391D31739D9FC42983D81AEE44711C823F35F8E2321AC74943871739D2DBE9748
-FE68592263E7713F27E0D49B9B5CB7A4E55DE54E6B800D15856450FFD3AE5F287B12AE4F438B20AE
-9E27E6CAA00F3EAEADBE08432684FDF9931E925544A680182602A3C1997DE5D0630BD5A010535E66
-E1C123013D23966B3545C7431C39B97295BFA4099D14461004C42C85095EEACB9B47C593BC6DB863
-533A8619BAE09095DE8ECA432D4DDD49AA600D277E75DC3F5C6631E2A05382CB007825FADB77438D
-CFA78E252D79B6A196D5164C2FEB85D75ECA25FF80B1D97FE10E87960CA0FC47C41D3A213BF141B4
-8BC3AAA93FA86245064668394665BFD52D12C3BE4CE39EFD8111754398A944C3FD1AFA98EC337BAA
-AF899D35E804CF416AD7FE45FFF13FC6354007501043F98FE8428DE8013901BA6A28711A2CA85A27
-0BB135B72F1D5026E8217581860729E94F2F1878A0E96C59E9F62714FB5F8F25003DFC7347E99007
-8A9A331CB3A6A535BC61866F02513DEB982C4A13ADBFBAC3FF70A7335F40D5489E48E5EDEDEF1619
-1973D932479C62183B0E25EE8C4F76D4F1AE45DAEA4A12AEDD9EF81D248E8D19F8C8A5BECDD1EA1E
-98783EB7A38149170851B1942C96C53DE06DEF80913BFC04E539EC67C110498D15B78268853E5C72
-F485F8A27B768569E54241F6115875E2973292CF48FF91D45EBED627AE9F0766D22201B20AFDD40E
-5B17CF337F2999E0BD15B86E46EB3C18FC12B7DCADCF9DD50C6C7E3F37E615A892DB3F57E250A072
-A49F7277DD6A2C8042698233D35A699B17ECA5DBDA6D250ED4A16FCC893BF0DC2E33FB1EBD7DEDEA
-3C1C39603C8B7E1A5A833A8FCDD5570BD088749BB232615366687962C7E56ED089CD7B092505CAFA
-5A80F503C4CF337F07ADF0D106937E25670839D491F7BFF7A523DB609D126328C16113ECBCBF9C40
-04904427A108618AE5D4ED809F8CCAF72251104C94EC5BEE21F91B179D31DBA79CEEE5EC7FF698EB
-84AB1D2D1A624F58B3622A78844CE51498B2CEF38EAFE259D22C7BA61104651A862008BC1DDDA58C
-C45F663EB26428DAA85E7785363A69D2790996EF5D9621D53042F42F794962FEA46E46F37B8AD1FB
-76FC8D5CF2146843F8CC625139C75FB42DDA71A752BAC48F294E4C0C8289FC46DA5EFD9C91BDA6D0
-27518B7E81E8B21F755A9615627D5812ACA674D1527A1185EED4E3C628196E7D0759B1CAE6B9B7E9
-01E9599A65230F1EE469CD33B9BD9C104C44E3C1AB966C9678BD0AD78111A4E0F2D07A01A038CEDE
-7036D0534D684A1562A17AD64A00F279200C0371B1CBA61747671D2A21D3F9646CA290F6B82418A9
-6FA177C6278277504B7FBA936325F5FA124AB018A15DC18D2C5E8F93CDEEA52BEEDB78A57828D81A
-3E6C38B9FAF3DC4EB7273ECE3EA4482A1C6242A335862C2C3717F9C9ED95F77B140C4E1569B2192F
-C7DCF702D0BC9A50428EC406F8BD0CAF886B4D979320D3E429816D88F7C7146D960AC12E70F2CB7A
-9F4E3E366665AB3F1B4B6440F55EEA26DC9EE0096BB7763731740A537766490C8C174723BF0EB40C
-53701AAD12B21D436ADCE22203C1053A9DC4E9F17AE617888C4B4E6F3A720E4E6366BA628221A387
-D8AB15E04AD69387C310D3528BD2FAA5B22BFF3FA494F5FBFAC4F771C9C7402B95580C5AC4BB3AF6
-92A70CB2C851FA5CF1173EEC3EC29B5A05A0B728BBBB51D3B7AD8B0AF17A1563E82FAFD93F8B7118
-1FB7AFE352874F4EC6D334AB6747519AB8E847B7BCED33EB5458A828E074E74BA621BDCD03FEA604
-7F7B6ABDA01FC7514BA1AFF0D4D0C0CB8F4E42D5A87E395D9ACDD02CCC220C157153422018725846
-009A3ACD8C8CDDB66BC6836B4026FD9F526AA275D06C813179E5924F26A25094E7BDA8BD26AFC4CE
-B41D8964D4FC4AF1DFB0595BC5D6714C32F15DC7194E9A3A73013C45D8FA55CC0550A12D9AAE8E9F
-F199FA28EFC2426D8D1DEFB93A65717AF3EA8E2D5B4AA8EF0EF38E9600F7D4E7D9F1D67A2E63ECE4
-789FA74B159BFE2F91C19B0378BA52E93DF12830D99553B6618645E26126842AB70262D96E35E5E7
-50ECA0CE3458B3E51BEE2F21191136DFDBCA39BDC07939E521E4F492F392DEBD029C1EA237BD89AF
-76BC89F618D530160AB16269FA6B693CF14BDC4EC7C630025703C5337F61458FA09104EB15C7CB20
-AA4C9BDB7CEF3A09F25BC7F3149951A7CD75372993B80CD2112F7674CEFD6AFA764AA3486730D2C1
-897A264D82A91709FEC4A21E30D812F558451804EE6F3DEE2C4C437846BCBDA07C5B6CBA1D94AF02
-9163B7383CAC6E088AB1DC14ED3743EE77E26EA7AD3119A76C0B5F925C4DE305CD7BB3A09A453947
-5B9BD79BE28FC462D8718CE05F9D94CAF3387BA55E6E447BF81A9EDDD3A34E17BE66BC52B0C0BB6F
-86F6F008829173816D205182ED2ECED319864A796AB65D4E3950288BADA94FA32B6F453AFDFC6C39
-A4FCFE60353A64627E2057D4B379D3240012B3BB0ED0C7876CB83C1BA5EFB6E2A03F340C2B576731
-F848F762A7E1CCAF267EE06D621BC33FC245D0E1547ADC12CC0EB58B26BABDB8EAE9CBFBAB93836F
-FF22BDA1831DD01B7346AD377AA298D84628BF1C07433284B0A90FC89F5AEB2651BA2CEA405D4F52
-DDC0E74B871D43F71EB4ACE0D2B401F9348EAC3A2EF0AD295036BF6CF6F870D58E00B619D50EA7DD
-77BC28DEF91D805CD527DCBCFDC16C042BF9B874E3B1567EBA4C1E70744B9E7E5BD1FDA6A5FF6E10
-1613FBE58DC46CFAC1A65ADAF65E49757E9304E2AC9A91E0588600C709A61D4231730073A36D473F
-518A145E141D0A5A494441B9EA99AC23F60F54F8127B477E1CE698BB4129B4B1DFEEDF10D9E665C2
-47A62F112F5CA30B0AE5DBF3E495FF06EB28EB438CE8AAAD84D5F50FB56A3AF002C23BCF66ABC270
-7AC233FC0F2723DB99D2CFE7D3B3667732A531F5DC315CE74EDB9050BF75D29E6430F57CB6778B2A
-CBD57DFCEF896E6766C8FC5C9F9FBD701CD62CACF33EE0FC95E78DADD205B5F42CC63024624BAA0A
-B4DD447832B4E1DBA77BDFADD223989F8E958C8D759AAA37930664C6EFEC708116248A2A7AF3D656
-DDEAFD009B7F5333854608E67E5E588A857167ADF9225CF6C641F5E19C3E08678A281199EDDAC831
-B57223B1BEEADFDCBC8F6F25D32FCA2336C808162E8F381656E847FB6CB13969572425AA05AC830C
-33DE6E030F86A3A85D2A66A77F103C7042C97205526DC882EA9A00EB8BD5519847EB424C15F808A9
-1652A6CC89B66A5731126DEBADE123C63D88A2E550FACDEB3886FF98646000C64B3A91078012CA30
-904B71737CEF6BECABD43DD702880538F5A70085E6CC6015D2163681067C3D513A8C66032C34A0FE
-17A58AD4BC97CA69BF41F11D5E910FDFE9729652D3EA21F8DD8CC19160A8FC77573B1E9CEF4E790A
-79D8AD6723B6804E9616466C935303E063DEE29CAA6C3BAEBF278B818C2EC2F13ED645AB452397BF
-00DB8B26E115026E256746CD0C78A959364FDE6DEDDCD0F441A61A1EBA32C7BC172BB09512148D1E
-BAC9E791B7D51B71CAD2DC9B83B2F99B3726607D9CBE58B499A13753CE87FCDCE21C0AD0528ED0EF
-B9B2C927F57C78C626248AA2B835A0791244C5896686A66173EC9F802C4C633A42B086334D2A4878
-0E53D00809247BE64E529F96AD2F8B3922A6097D414DDE1EC76F9552F9B8D58B8E34F359AD792B2B
-E50C26DB05035E7497162E7C49C38D3CD9B98D620AA67492BE5AFCA3A81A7080185C7F0B5105223F
-1FA77805502A2E8C5FEEA27699858D84A95842C5F2FB68686D59FE24091FCDDE139B6463BC6C7B1E
-0E90D20A83651AF00C85797BB9F53ECEC1675C7EE636D0D9E77DBD8F89670F855EE4D4800FF3F695
-0EFF09BBF8A0DAF6B8242840CFA5BA73BEB95115F4A78BCC02D85ECCE0C0F2EF6F328AD1DD6CC049
-5A3315B414A4D61DA50DA46D7ACCEFF6EE56451805D26B0359AF193531F95F6589CEAD6FA041AF15
-3067F88A0A2FECD135C56682DB2B45A71D1FA737C064EE9A4F404BB72A70B3AF0330359393247EC7
-81512482579865240A23CD8479F21C2C44A119EBC4E81B308DD8AA86E60C3DD8ADA50E0DFE8308EB
-1A7F201EDE8DCFDA405AEFB47E0E6CA7DDB376DCB21D37F7ACC4D3E9F26B03A8DE0E8940CA3A9E75
-963A389DF8038D2C486072F61C0CEAF500753C7A6352B1CD0338D9212B42A4D3DA23D5BDF44C27C9
-4B88A415A3242FFE2E1B332477A21D2B9CE075EE479C6E657A4D8874A8C53964229310E01ED4F3C6
-86FEF5258EDF3B464DD6FFD7F1CAF473BBE722D60FB14AB4918E93878A8AE4773930B8CEE110F476
-7F42A52D9304C55BE12846C911A10AB9B2E036BF9DFD597F5348D42233315FA80D0F563C388BC253
-2103F05E90DBF1923F229F980A2F4585C7A373511372D07DCBACA583099EA972C03E5AA67E663882
-6DB134564DB993CEEB6E7A6659C7C5C05C310267D5F8A24EEC2D5CC3E3F3C808E6D6068D1A57646B
-37FABD98ECB7BAF99E7D9AC4414A491A73CA34C52F394352F6B5A15F0FC4D88622DAC694699C2464
-84ADAC3B1D366AFEDE2A2CD2042C90516A666A19A91C80248B11224BEDDF1A320E230739E755D098
-B6A67315535F4C187CFA67ED817A035056353FC859BF286317996FFFB478A2248B908FF12ABDE705
-402224A3EE5F463DD3D243875C84E02DB968ECA1CC52C75171EA50D6A88CA91327A7AA5795019F36
-C0A19C093A1C9D3723C7568F9D41F2E4FFB712FD47F897703D7A620B586B81936C84AAED61D84332
-B3BEBC4F95B796B93EF7A1F565C494F8A65EDB21E2EE18DC025522EF8E599887CA2836069CDDD889
-88E5862977B7472584303198CCE97EF9F9E1446D1F1F5ED1CFC666A8A0C3A03E1792EFB60A9B4065
-49E0DEDF6ACCDBD98742568B4735A747D8E5DE21E630125AE0C691D054E42199C15B1F80CAFA6E7B
-B2005F374A9A5F9900ABB7409CCD50C3AFCCAB1214E6A856F7C7EBA89BC3291801E1343DA9DAD2C6
-ED075C8ECA1423B43E587AEC67E6145272814B3F191B3C285639F9E2D6E148A02DC2CBC0E054D629
-5CD05DBAC1950400A9189316F0265B86A732D302C5BEE8ED233768F237C62600CBAAFF3A110D5EFB
-6CC7CA3B92D965CA7C5E8D3E64ECF239FE2507FC797FDBE54C1112B28D4DA44C60AB09D994C5BA78
-D663A2591934CC052BC70CD1DCA3325C66C9CB982E2039F5DB70C848D3DCEF655B1C2CD0CEC8865F
-E8E1C0A267BE4F707ECE6F5A3DFCA3CC1EDF92C760439F51AA69A4C1801E96CA4D6EA4AD980258F3
-D15C893913ABCE09101984C61B91D603053E49A97CB82FBA707DAE8AF1D579FD69C8481CB7B712CB
-CDDB4D287BE995E32C02B399602A08B9DD849039B5673F1930BEC7BF366EB082D2CA5DB2385C8CC4
-5BE3FC0E31820191A814EBA7C4F23B1938E6C4D800732787CD2CB97F762DFC85D4B798809B5F2254
-D826CA42B32695428D120298B44CF38494E56240B75DF1E41E46E53C44DC505452256DFEC819408D
-605FF14D6C1F3F152F2FEA96EA0AB3B472D8704E06BE9F8C3E8395CAADD06D6DA033E81ADE5DC3B8
-3DAFF743C6E9E48716003D358DF63CD7FD3E2F727D1F2D0C29962F76D5C95ED44B6F08D052025A66
-5785F264A3D5F5593677B630E628B5EA81FB37CFFD7A30B7FAD226B6FDC82B0878AF4C0EC4F4243A
-807B9839EA62BCBDF7C2E9B30A623876E632E084EBF4A21EDA04FC88A1C07021D0C72EC3E969D449
-FEB08E5826EC20E55B21EA71EA59F6E3B0710B0DDAB3261B4A2029ECAB68C19ADD5174E55D5E984A
-4E5F38F592A302FEE6ECE732DDE841A28672C620CC5D687455A5C06FA9FE688394A04F96312ED025
-B7AA6FBCE2925F3AE559CC1886BEECDB70822E2E5CA3F732A87404B1536AAC469989E9610CFA440A
-CE43875A70CA51F36CB6F629D9424C1E35A88F92D5DA3CD8CBAE6E8425A36968E21F4F30349749E0
-205BFF8D552837D6FC39532525370BBAC833F75F1854C93FC533A4AA53ADF7008173A70D94A4EBF5
-38EA9E62BCDA7C20E0A073BEE2EFAC34D2EF1D03BABD5147659E50B557045B2EB89DB303749B04D3
-F54B43FED612FCC68206E001A7AFE90230D9C12F74A32C7EDB5D0241DC3A5D51481FD7C8FAE08FEE
-263FBCED7C7D911B3A303C835AF5FADFD218F61A9D6DE80485ABCA88200047B094441F7767B97A24
-E8C612590FA2407BAB1E8B56C71914EEF2355DD97CFAFCC192BC06FCE063D3D9D1A629AADC75E3BF
-207234C208E7E30663EDD691043065C9CBC473D97C6D4DD3DFF59D6A9ABCDD4412C3128F603160AA
-D8F81C6E7A4DCAF35F3A99B4EA10A34375B477C2BF846521A7EABD4D28078E9340452A198F3F5ACC
-3DB7E3908939FF6E3709C6A3FD9889439A4AE3E10B618CC92E14B68429A3AD2C80940A1079452EC2
-66F254657BE7D79A2A24084AF73F6DF71FBCD32BF6913A3FAB25F977787F7BB0C3A3E8BAB38D7A2D
-B0B4826950643DD1E03BD7DD1FB149A33862A89226B7CB454DAF613128C2075470E42E70A9444A8E
-6ECA526345AB48E6F5160BA23B5BDDFDA6049EC44ED1461C7E0DD514B16E2FB285F72039DE3C7982
-EFD40D7F6C8E8F4CF35AC71B467BFC578002E8D2239A2FD2C4BCCDD8AF3D7DB1F4AE7F2D2E0811DF
-9D0155BA6EDE50B5F052F14F6AB884FFF244D8806C07EBCB49ED22D85DF696995991A954AA97A1EC
-D86ACD76E061B7541E87997FEF0657A826BD88EF3A4A5920462C6595E7A156F453291CA044CED810
-860C3B0149BCE73BECA713040664AD0591304106129600AF71317B0D2907839CEAC99515D357E980
-B1937B6E1200AACADA205421001F1B2F91753E80D2263C56AA164A74701A8D5FD28E46480B0DD963
-A683A1F355D7FB4463C7347C94EA5E2CA40B60B56297CB22D972C5BB10E56715A955605256C1541D
-9F3BC5768A6F355CD3B863F0FA1A781EDB49368F51B29481CBB41D4AEB07AF9DBE8F52C5D0FF75F7
-FB6431D37D6AED84D78C778871CB0F715B4F07580F23B586C969C81B471FF6A6C7276F7E141E02A8
-584D4B9AB00E7BD643D2C3FAAA299B1F1E25048461952EA42D4882768A70DE46B213A287F8D31AC4
-6D5436F22A796C05D1FE50A9BC2A928066627A0D87DD57A3AD91DB446404B41557D1457873482005
-EA20916BBE46C613F456C849D46BA79D20627B446B2F49E3FA309AE14F8C420CFD94922CBC0FB9D3
-5A0F7DBEF577F1849A1A80E0011DA8AC082A8C6F61658E65AD177ABDF23EE17C8CF0D26B9FA3A6E9
-4837EB9E930336889767A8D7EA3CE980A8EA95528B004957BE6067CD9BD8E02A0F23CC1762CCA656
-D33412FF45E917FD4A03EB6E8C1F43FDB0A8965A33B4FD26BC24A20B304CA817E88495BA9B361A3E
-933717FFB0271F7F70C5D3CBA1E86D0F51BF3ABA194DAF32C35C796627D00C7B2271ACE2463E37E9
-7B3C826CF3DB60028F240F9452CBE08F7EBCC5FDB1BCBB3C327A9F450B9E5671916101D6E3E5E458
-CA31F04D12F592F83BADA2C3683D3886AA3B403963AB5DBE220FEC00037A745839F67A3635DFD3BF
-F08F367482962DED88ECF6322852D643A54D5D303EB04BFDDEE9BBA1EBCCBA7C653B3A613A8E719A
-DEBE3CE1BD7E754E5F4977E863E3C2D388A65227B451D4F3A4F94E06513CBA4AC1F2F511613FF035
-611684CCC461599000E546E4D972CA6960E095A526E4735A23421A4C9B597ECE08AFA2753592BD16
-DED93255A1E33DEECE3C5EB77B94670E8137F2A4A4B98AC193258E7DEA5DB8408A806188F2D1DDC4
-40CCF0E9A6E2F0C78FDBD7B68DD4939D2458C1965BF8BED4564B32462FFF3EC892C03B11D3EA813F
-AB4CFBE8D3016329C5B7E3DFED0F08284D44AA0B7A2F6BC96EA4503E8EF52A64C22BED6B452581AE
-8FF8917D53976471941A9116A2D878FB2541B561767ABD4E31CCD8A590CA03494C62AFFD64EA0A1B
-C779173DAD84999C7A8D844EB1259DE7BB5B25CD023537A474A524EBE4660B22568949E624D8FEA0
-AD37F4CE1EC75955EEFA49C6BF1803BE87E9C9865FF3F6B8525B8C15FE8835CA153D27E6C0FF0CA5
-1029A7A9185D25F0F14D86FC797DCC1F99EE97E2054B9C2A2E06FDBEB8DEF6CDD368BF23A858D9F8
-C1DEFDCEAF1B4A8DE5EAFC604CECCF0D285BE00AA912EAB66EFF4D37AD2EFE34853BBFD87CE09B18
-749B489943EECAE7887B006FB827D10191DAD18466CD1F86505879310A8B171F902EA0C26A388E13
-B53C700272CEE2BFB47ACB58247C13449C6BB9D01232C32517358F1A3DE064D43C18F8827D53789C
-CF3CE2EBE78949A6ABFA1A6B8414CE360A5E22AFB7D1DCE6F5A06182C3B984B4F9BB1A905A9D5A14
-83750A1DE0A857CD5C06945EB7D4A2A6BF1237F32A154FDC06D51A703D44FE052FD3C53E9E8F417B
-35D1C851F9203A8997521529F21AD8498F96930AA77EBAF82EE02A57BC77C792D9F220294B45F48E
-A8FD94E01CD25645D36D168923562F3FDC93CB79DD4760DA0C103C2675722D7A1B79FCB4245ED12F
-A0DB52492C9CCE58B333CFEE822812F7DCA68E802C451B5CFAEBAC608B950386B6C58239D1C62D62
-4DD5D15782FC552222CCA06DDF387B373E32C3C2864C63C768350C37283760F3515A5B0AFD66C48A
-B522EB3E808C061F5CD6BD96CD18C9839D30508E7D4EDB88E8F11E31E10919B16B7971F06D7877A0
-58D8A4944C84FC6CAEDF3341B48B6E0D3C7B85D710E0C35F5B5053CF4B4798B3778CC28B2DC7AE0D
-F3A49F9F3BCD8E95D746C35C3F47D68B8AA35D97AA08E711B5FBE70D1A623C82541EBDC51A827D0A
-69E6C049087AD26F256EB7577F58CCFFBCCBA5A95D093DC29464C9A38DE95BC6B1853963B2DEB0B5
-7AD1248D6F1625E115EEB9510B5772AAE4E3C866657DB0B3BF0E0AC345E116F8D4976B770876FFE3
-748C36165522991F46A36F193DD1A1C94713673C7E4C81582391B636C72DE94CE6254374F99B623E
-5686C13D8A8322E83E11BB0B0A896C6A8C2C4F756C5385CD7017F26D23F7C3EE97372C868C8C9155
-81723BB6B76B4C3CE8998E4FA6CA40B633DFDAA59BA902A4952DA90EC4FC3CF0F2676ACFA7F76F78
-236FA2DE10FD3545357215246BB7E527F277C28B353CC6D79DCEF21BCC8F77603CDD58A2CCDDBE3A
-9802F941CED8E035313875319548C41992A2BE939A17CC109426E33825AE59BCD17CB19F50D972FF
-CBE7D9B4B0BB095303D9DC9D406696C2508D6CE99E11CF00F6461147E97449ED5F486D480A86D3A7
-ACECB7E9A945984724EFC21C5079B1FD03ED803C2DEAFCE3327D2D7827715FD65D9506216C88B0FA
-26935E95C64114A51919D419038B1A7E9C1E829FBFB53275093752DF19891A97F3CBF7719C1FD6CB
-17019A6D2D25360ECA804C4B35172662CC4769D2B785C6C87E5A4ECCE31704E59F71263B7C3CAEC8
-ACB4C7426EC25F11A0042323EE6C3EEB04284DBAE2C770BC419DCE79BD4560AEA41571C3B595F525
-60191DC7A8FBF63D413A77A0905E517441B16C2B501EA2F9E99CC38D052679F288FDF1894542E3A6
-6989A0090185EB2E75134BFA3D9147C3DB8A621D9D35E37786853779E157B47F71626D6B3E633005
-9159C17596C1B87FE2B4FF47ED9D78FA4C2160077276C8B58CEF5DC030B4A5D83CF257096C047FE6
-4DE307C598B815058E72D5F57DF5C369E664E137DE29349E2F9DCD8C9F4EBA6E765B6327D7A20DFC
-B20711273FD8091CBA605C4C494248076F7E03DF65A6A50164980BBBB708741E5BF6056E6F996DC0
-7FFF408C5B8EAB8DCEC315E92873228C805D4440A6470E3EE3983758DD211C9CECDBFAA4C9300CBA
-00608A4B2404A3C7AF017A3B7E67F39F0B51ACF950D3E75CC7BC2B8D3480202FA958E8EE0B240501
-5232EE0D264C7CA02C18CA45CB3C2DE322D3EB7F00F9455DB6C5B1F4E59C3E95520EC36D7D903CBB
-625D70B54BF6F8255E412604BBB29FEE026CC660577F91DB1DB4A613EEEFB20CF7AE3CD89D565AC8
-38416B01B5DE4FFA5550D17FB51FBBEBE21CF1D56038863EE931B90DEC2E211ED42BA92EC244D4CE
-2C4EC5CA87A026992772DC2AF754FC982B94F36EA7B7BF75E0ECE90CBB2A6AA1A012E8898BD679C2
-3CB3827C35D5D02F0569C7AA82615D4AA67518ECF668D3B57D6EF1A8013424AC2268BA0D9A74D588
-79EDCF6382A89D397864940303EAEC45A38304BA8B1CB198967AE23EB81054BE74B16909A405E8A7
-799CEE3C270FE2A6DC50BD7370B6B2C8FDB9A87D88D5D40348D3984E39C693B6F4486D994778607A
-80A3122872DD65E40492107C71C3CF708A9717E9EEFAFBDDC239C53AA9645B711038E59C8B861B37
-411AB2039BEDF9CFD00F08D9C5D76154427FF5DD39878CECC5D7BFB3F1F035087185C0981F3C2139
-BE84872FFAD3408531C4EA9387B89F5E3EC779E8850D50992DFDCF9132BC551E985943B07618AC10
-D1150451F0844C0DC41D6E17EB508DC8689EC726400D5A7F6FEB3CC7BCE05F09228B7CB2C5393664
-D8DD9A4B96B1020EF25D70AA2D91CAE93AFB5F2BF0AA18CA5C599FA1A708EF35BF8F7FFEC9AFC1F2
-42870D028B2B1459063B493943EF1283829783E1010242E5CF4DA39D93D506F3892936E7D6CF1124
-70A521D397438733D053944CFF12D6FFAE8246F20618684F263715AA98E15D72A526383E05C23214
-B78338E5B476F0981D90056E6E5D0DB66B1DF2298E597B2ABE1D817E18BEB056E65EDB4234342D96
-00470B1420C9210419D834E431B82F58608C87AC361A02D0F1FE4B470A3D71E0D21BB87E1023D428
-E23D596CB9E1A2184403A16E36E644BCCF9BBDE27290485057E62827283E7380AF786BF395B3961B
-A5EA469C315763FA59E0F176EF81985F38B882DE56A74D128E256D1B89939728E55A92ABA21A6B78
-44FAC1BA7BBDD8B34A18194A2984B000380FE9F672E83EFDBF276FE797A325815B0F25CC95C97A9D
-ACF56D583486305D7C9E51A7E337D14E3B900333EB38FD93A99587DA2341B10C059C71CE080FE753
-3C0F059FA40E560AF9C4A41A4BE6FB45846FF8F78165E10B4AD40F264BCF5596A1E8EF8CB6EA4B1A
-3A5C69059AB1563843679ECB2511A90E8898F54295649CB73D277760D8D04ABACC7BCC6E777A0530
-E2067CCBC08673F9C8C178F9D672AC8A15E5367F0C5651B53E75E0CFA57C931746AE1A679C246D7C
-9417F1CD89DDDBD1173C2F880B7B3847CBCCEBF99F7122E832D7C9BAFE2B54CBAA1ED48158DE3F36
-238B76B0E67644A28AEA996DDC006F6AC0242E4B667639E7523CBC90A0561193C1AF34481C2EF402
-EE43A82E1EBF4E3D601BB36B2D95CD93550D61CEE7A94E72F6D30C32C8F91A61E964B1F66ACFC398
-7F95D4028F116E9A9A8474AA29C1C1A984BE0E393BDC41DCEF6A6F1018DB60D52024899D8EB5D55D
-324D73F39BFA47377B9E15B3B06A7585589FCF52A54684173E5183367E7B0952DC4BC2767C4C6247
-B1D6103E52BC7B7EA6298F454C5D97AC575F19C10ACDFF4E10C7D3755CFAB4200CAC545269FF1D8D
-B0D607C7AD47F40DDF257AB4E7D0750577003C13E4941960C3DD7B0774DDAC18E8ABAF8F53E03CBE
-F6D57B44F24CF821014C064278FD51B3427593D17694B4ABCE81F49CBB984C5878CDF0C38D1ED7FD
-99B0B9A3BD8D8FF6219588B3B8FA59D0CDD1D9B2F65122AB45E48F1757467B9204926140E3C350C5
-A927A2E700173053EC35D3F1DA2D7258714C97FAA857F0898917BD94625C6D1E2D77138EFCAAAF51
-7B17FE187A2212C24A881A2C6A647DEF6376ED80AE4175C5EE80921F001995B44E49F0D33DD9075A
-CF33BB03671C0BCC34AD5784AD1CDFED3A6D9BA103B3DDC1CC2DE74DBB576A0277715275218CD19C
-A8899209125266D8BF1286F881DCC2C383749D1E768D670F4099F7DE959EDFE852583183C9111601
-2881A56A24AAF020EA45CD5F39660DEBCE30AC1C7B8CFC60387B1B0C3E361BE612FDFA9F01B7E4B4
-A18839A2C7E0E393EBC5AD9A8A4EBC316A740C1C295D9EF5F4DFFA0667F9582C0BB837B142C4CFC6
-B1798E9476D0631111033B8BA75A10FDC800E2AB1E0E829632F869CFE4737BE9E2800759EE0831DC
-7D1195EAF80555771981DD6DC6606812D92CB8EF86447F5F6C6F626D0E265C67E52A6319189EE349
-D48E49DFE6A9E98F76C414A1E3217AE0A215A17E54AA498F4ECDC50242ACC7E2322F63BB2FF2189D
-057E7354E32A3ED1803116176B9B9D0129930F919E2FEC280B2C8924E49E7BB75768A2EE1DA8ADBE
-D4E3589906DF1B923AEF84C1BD327438B731012E69BB0D43A1842CB88BB54EA4516477F704CFEB28
-6E3EA483445AD4D74586FCF32E96D366901084365F693A53C5FB532FBFE7BC0CADC404C4985042D6
-8DBB90A6DCDA3531EE324D558A214F935CD9FCC9A0CEBE9B5FB0323F4B3820529599EF48EE068B5A
-CE85004FEA2984F0A86F5AC9D56163BBFE1142B774148F1EB0A4DC89C3349052533A7DE66729DB24
-41B82F8F7360111DACF69293C9B281A0534F3E9E9224A75C49A832F28B2E497262475507B6DDFA9F
-01CA0A6696E3F5AC7EA68595EBA0C2EB8A47813FF936D84AC1B23ECA7AA2862B793CCBB0DF9FDD49
-31BEF354CEC12FBF478559FEC29F81ADF4452E83963E56541D31F3691C93A50F0BBA5E9552C4F2A2
-3A6E53060729854A3DD71CC4308B91957DB19E66AAA18FA67055A950F1C2CFF78A03BC1A588CF624
-696068068719AFB1001C4581EE072113882D9052B21E355D401ED8CD24D067B99E616BDA5A0A5A93
-36FC499632B79FF2FD0DEFB096EF46B75E2D4E0F48DAEA239719FEC4D9A29818F5875FC5041A9EDB
-D26CAF0ACE14CC80BA49BBA59E918EB3D8F1E541AA16026585A2F72DF7D83541816DE46981FB3EFD
-0C30E458CFAD04C79421AB7C4925E23AEA07F9F018431C790002596D26BD9663B51B699DF53E4882
-CBC34EDE88EB55045B889B6062E35FD1E018BCE785157B85EC3B9CA6C85D4B16238275385B8285DB
-012D8FB7C9F5B946A41D7A0FB878FF72C39683144D8A007CFF631B43748F2D5FC690300F9BC0C837
-006B92ECEBE0605E8C3A4A400E18AE8997D1B45FEE10068E247C647CF82C6DFBE5E881D511FFA687
-B7AEB78546BFD07D5F7EC242DCEF4930D8AAAD8C6152B6642AAC325963FD147F236BB850A9966573
-9D06CDBD7CA79A527DCF461E33F22BC9C5DB00DA2BD3DDDD8C99D99793BC98282AA8872FF96C3942
-85D82D9419EB78B6AE37A5F519397700F75D624A09BD255B576E955A323E784E8FC31131F003B0E3
-024A4F58FEF2A6C043796201FC425482E1155E229D1B2D43EF7B0D22322B22EF5C9A1BE026A1C3D3
-75EDAFF99597E1E5477952A4E8D2ACF5D014BC00DC2A272FA62B6983E27D228881E2EF2B8B95A681
-CBE90C5FDE16331C85222FE2A16F0A3C3000A63E2E21666C0C119F8AF89A543D37977069A5ACF155
-6324F05204CE8CAD50FF4FB630D9CBBFC324DEDA584AA56A99D3A76FF55BDC2C2EA3A021361CCD4A
-83C7A5E2768D210FA6DE889FD48A39D679C94EC3C99A8D33FF11377DA7F6F1B71A2A05B302ECDE95
-4F26773F39AC881542F0D0969C3995C3519A8EF70B4220D86BF01BEECC6462855E7B686E1AFF1CA9
-1FB8FD8B4A69E10EE0C2AD94ADD44449506F9B6EF43641F2026EFF6E605C670560C2B74706FB949A
-A7E8CC6A2D0D6207E457E7FD87EC1B9092DC68B9143947CC8ED14AFDDCBF8FDDA228A76847F96802
-E561F67CEEFDE45AE587673983FC04C96744DBAA83F2DC838D633943C75DCB9E6410474EB27B348F
-26E505F0AB90878940E846C5E9F3C5FE8C3558C3236B1B88C405716949B8506841CABE1717474BB7
-C30DB91CDEE33B0F844811762FAEC535BDCF84C1C747CEF9B1FA61D2AFB5A81335BC42C06A94D7D5
-9B7EDE55BCF6F9867AEE107555CDD084B7684C2C87087475A39A9DA6347BE281CE5635A4D07865BA
-98CE26C1465B1AB0343F49FF37B4D0CA9F3BB693D78DC3B21925CB996A038DCC172527FE57C07460
-EF39C07D4396E7FA970D9F22ABD21A9C794B64AD96762C7428F59A8757C36D6C4FFB23216195A04C
-2A2C2E7B10EF7193931544D782FEE4B91E01119C5553BBC6252270A8D8C56DD62D448F5AD8DC69CC
-B45E1F17F0AA1E445129DD00F000005B23D38DE93A3BE55A4C041947F36B4E4536E307D0180553F9
-2E46B743881CB5D5386C48C7D5F84C2BCD06B9C501F78C7EE61FA23516791FCF4DB278AF688A2E60
-10A56692AD92008497487EDFE4BD5FA083FA544138B20D6940020887E35D46E093B71F7A04A67460
-DC8116B4D4839625D7CA6959D6831CD93F81AC4EA2709036DD738364FDE71113BF22EBF13DFE1642
-E564701E6F0FFE7511EDF03FE448C2B28C64FB7D54B94CA576E481FA56B2B18AF10C71F699B6BFD4
-7459CDE1869D0FD306BF489A6F42E5B2F05CCF55BB6B9526973D19CB134CA7F13F1DB3716F8CC217
-73A832568C16250B5CDB16DF24BF81D49F5B37018BD310262EA7078107868AB0216CEC83CEFCAB1E
-9F2C665A31585CA04DC01879CAA79AAA5AB201B516F7052B01B16BEE5606098393B0E5D9F9E5E3F4
-EB20F63C958E796DF41CF28839F5C62A0431648745D7837B519F3AA36BC6C08EF040CCF53D9B6D8C
-0C7D1A84D707EC57A3C6AC9A62AB37251A01A5ED40FDEC6F5BE6E34C6A91D058319439778A2EE5D0
-363E2E1F33463C33327D05FFC0CBF08D5BC457C7230448972FB9B4D0D782BA7DBF10D3FFEF8BF523
-6EC16D4DD6D0D870D9D5EB5C64C9A46A4F583D4F831FEE74B0E5B33A09ABFD4444929BD8F638CD72
-EAB99CF2E9551DF427683964A592E49D186F285258C5D5F62196A98532421D73E3495F82695FEEC6
-E1952C562D546B28618FFAEEBEFF03A57F4D855021F85B0C7BC37FCC6DA9AECA099B646B99D41896
-09D3FF2D56422F8C37E97640293EC7C90E3380887836F4938FBF495CAC14FBA5648D89282D8D49D9
-1AF73ED36581139D8BD42551E263E830EA3C6EB381D85C42D74C50DB0CCAEC03F535ADE92128A016
-0E811C34748309AF7604919B66CD43EB5CA975302DCB6076FEB6BDD6FF55976FE990FB0CE9ABB11B
-195403FB26E3D6C6A0DE1C5BE79E171A61E21F79EE8DBE7A832519813EF6B33EA098C2C32ADEA219
-AB2AAC8B093F40000995539D1276D5F2EF84CCD099B71FE4269BDBDB6A8D59C86F7D2E3FBCCF8773
-D0FAE97640BC1AD43CB4B992BFADFB09DBD0CAAEB8CD9DA264187C4F97300E9A6C9DEED5525479E6
-05C65AE336CBBDF4E5D7F79AD098F977285E065579B748FEAA97F2A753E1F962FCAB68D72BAA8EE4
-FF6691C23E31BC0F3E981A96FB440404856AE1AB32A7205B17D411D8F21C8C93B704D07EC594422A
-BC368CDA2B1610CE6A973F4474E12B78B532666797F5755D269772C9F5400B3BFC6C58395D38527E
-2CCCF29B56123F7DCEF3BDE5DC1DFC5B0293BB125085B1D2D929BC3EE84F4FAD571A4991C3DEE03F
-2DB3A3097E52B1A7D5C73CCB6148EAC62E8E36DE9A71C57638C6E4D5D9DED18174E8C390E50B4A5B
-913C074EEAEBE390B214B3A68F02862B9A296DB4B409769649E51D738CBBDFB7702E15C73C2AFC6B
-C37CE15171F4E822CF20EFE55D9F061AA43E648989628FF79E65932390CBB15D8E621333B18B11C3
-BDF96F841D7434E01AD501FEA964A75B248A35CD9DF9A37E48A1E5A09C624B93CE44F0042FA00D7F
-9EE89B9F7AB785E9C718CF6E7228F743271C2C9BBA17E5208B920E44E765D99D86650EB454B0FAAA
-112753AA1BD3A24239E9C5FC47EEB1547AC9D23731B8DC48B9707830DAEC60C8D3790BBA1120F776
-4EFAC542CFFBCD5C05F9510B27B2534B704ECD36C8B041FD49A96881302FFF5B0163A2DD09C751D6
-D6AFEA9170A4F4C4AB8D46E62F763FE1BDA51DD1CE4A27E772F3A2869155F762FF26B7AA6FCFA4F1
-292E56F03AAB6322BF867E7710C34D43B5D85B45AA68014AD7879EED051B1933E491496E3E26D9AA
-8B80A07BF2B94F1077E84A9726F08199887D66DE7A307BF33C30DD9CF3DA188088C03B2BAD09A217
-6B110DB2C868B53DA9A66C85737BA66C93C58A259860E294AD0191E3A72C73F40B0BD98699AA08DA
-F03587B78F391F3A4313C58D9F29B53C70785637BD0C58310109C54091AB0A34CBB0C478613A7AC0
-FB8F0A8B4645AC966395D8BA775262CD291136AFFDDF01C1D83DD4EB3B59CCAD18057FE7D92A8CD4
-A58F22508D9FD7CF356571F701BBB23E749BDDCBF8A317FDA0AEFD952BB18545610FFAD3AC143D35
-1B8DB3F66293375E0E50235F0D0466932181D377EDD32A5F0FFA4E22B5A0CB4F343D9A7E4A342E9D
-09DFF6C697630CD3971802C277A5590B8CA94BDE6B38446C794D072BBCCB724D5BC208EEF1B018D7
-39373BB910D668882CAA779C2D686081DE6A2606417B54D7C20E0E7F722648D893E4EDBAE8F00D6A
-6DA3712F91AE860C756D1127D133AB828E9D80023B50B162C5A1C5CDF70CCB3FDD7EA060ED20838B
-E1E50C4094C9E79E1A0187CDF780CAF45A725964F004253E034C5BE46BBF89D94631F1A33BAA35B8
-4FA2A9D08481C6674126CD96ED05DCE48BDA069D902D6836D5DFBA701DC0F98A863E64F0E312145D
-8DC0B77F25B43AEC729A1243B45B08CA228DD6101CAA2AC5ADCC8EFF84A4CA3F254176C2CC711EE6
-C273835D0FD3528ECA2A976B88E51FE347FDB60F32370B66D338931D6581630ED586F349C638960C
-31AE4204E89521A96E1219E696B913DEB2AAB7A3B022D06F34FDFCB810A04E60A4FEBE284C2F063E
-0AE9EDF87704921CCFA193BDC912B747E13570066223A49F1F6E2AF0D4D65DA04CA876FF7A462FFC
-9C0BA2CC545C3BD36DBE762F32B2D6BE5867C59F479195C92440DC165098B74EA5C3AD93CDF2D410
-B04C16BC7801E7956F4E5107450787AA592493171C3628E6B8F49D4F8429EB98DC52EF025F001387
-BC1A7093F7A99F10B5D2D7DD8BBB393BF6E56F08F4F7FA1A343F220D5A1EAE7168C74D41BE1DC1A8
-3BD65B72B982F4F7B34F24F97F9EC9A91011064031FACFF2A14921A32024385F4E061CD07D152E74
-1BF97156D951A342488FA7F5EF934CCAD13E2753A0AB7A1F565C2F7F6B349DF03BBC25BBD972A9AD
-F809BB5C5048A8CCEF9297B2ED3324D18867F293CC66E88B3A39D107B610DFE79A3B4E83A96D3D52
-A17FE8A62C9FDD271130148366942C9CE57558D023DA5F7501319EBFA33DE9E6D1E76D7C20DB8A09
-B657839DA99F3D8143F1EE6253A3295C9651FA4366547893C2DC7ABCBF4BB7609DE5D001E0A36D9F
-FBE01F7D0903B3208AE8547E2E5F14EC1AF4C2535CA8F4EA37E3F3CE172C7A1E8308995B1CC23E6E
-81190246BCAB6E755BF868D449BB02A2AA87C44C9CC0F571ADC72547CEECBE104BB274B8AC16DCB7
-5D5F458D356466B921ACDEEAE384E2EB1DF6EF393B41B9747F0A4FAEB4AF1928D9AD6FB7E06FDC62
-1E4C6FC98CFB43F88584BD55D9B97CC9549093EDE586912161931162B1B1D52D0443260DABA02AF2
-B4432100D5506546013DA703573FA8013685CC798CE501960093DED713FFCCF89CA2B9106390198C
-29A00864108CDCC1984A8BAB53919028C01B26ECC7925E38CBE6CCA8978EE21C2B06E7B3E48FBA97
-8E2A7D186E563C088F84AA23178B60E4729EE87D67B1091F3B6973676C1CBFE6530EB773C62E2C24
-97014AB0E8B71A1F4E86A378AA26591511BEE3CF3D64C94848582E1354E1605B6457823F2C5E640A
-D3802946BB2E7E8E594E8C04B430C2385DD40746CE8534F50842E74D7115F3DB0C72D1C9C607C657
-3B094AEB73B7A79876CFFC3E2F8C9FEAAA07D3BFCE05B61F7749A8793BE90CCCECA2D7077F25E899
-D3331FE161A7E86C842495D584C6E4A0880B2951D8A13B88C4672080A0B1BE36BF47C3ACE7288CFE
-41A8C1BAA6F0814A947FBD6B3AA72B6C73A8C578CA51CCC96F2352316C467BB960E981F2B6485BFB
-44B577E71EFDA16E7405954BC7C9F0759F5A9F1EBCD2FA9CC9648D5831A68887F41B15081A204C24
-B4B992A231DEF9E698D4C3A25B6F5474F5BE6A601F2D337A58A0D21FF37FD91EB86D1D738893A03A
-69F0CD743F611CDFFE69DB2C6ED0E4611D56F803BB0DC06E7FE85A303839612707647B1BE9FAF8D6
-84122CA9E5CB8BDE2936D3F4FF254D31529D7538BBD4D35539489F9E7316F24214B996BCDCF1818E
-749A71CF0E8845AA1E2A58AA62A48E02BA4564625D20AA220EE719608521D7D7A7FCA0BD8904A401
-9819D371F3F59D46C1354E5FC1A6E5F79B20CF4ACA2BF0F2DE73DA193A6F9ACBFE0B4731C4BCEBE6
-D96FE822965DE965232282A3A130361F188B3AABDA95A8A2790D9240BE008B6A6DE4BBFCADA05B67
-86B9BB8E0DFA0C30043A3B07ED46277E07B9808422C8ED16758B9C396F4EA929D769785B2C9568E5
-70A83B989B25CE200F1727D41E2B702E7F88F1784F4C83FA60A74EB26B2DA95126E508ED519A61CC
-151DB6804F61826C5F86D8FA89D06E526FED97A0DB88EDB432FF32C1ACC9B622EEDF601081AF7B96
-3C9CFC1D13E4A9C74FEA0A1C8E3D8653CD92A944D4CA6B0D306619AFD503506D77732D6514F604BE
-4610C2560931BDE0B40939BC1D126B0E97F72AE1B4A9252123B54F7A27E0CFA4425B4546526FD741
-CA77952B10D13E0AC2E32006A903808FF0CD013F936238C74CC75FD915244C56A8412F37F0134840
-347699508D6F3D7F3203A25B7C70100719582CD588590EE34B3AB13E255B613A6D00386A0104CC5E
-D2C646F09A88888D3751651D5646C5227A3C80E8DA1B0A331121DD2429F1F4775D30564DFF47D01B
-BE2C6C72CE4D1FD9A2077C04D2B0274B8916F6A9D1A4A6964A534F47CF241D5A8E34B23F85BE9ACF
-FC2FEA961F277539F215F8728D6788F67BEAF45502839BCF23D8763C3949352F00C579A9A4FC408E
-C625E310DAE61512DFE6844E82D36A2F81709E1F05B38AE9C222ED62C961EE63593CED7AAF73CE2E
-D3667740C77B309B93EEFE1B4BA65D48575A66BE86743DC9E5D3C2FF418D11F7F211B86E827EE1DF
-C3613E7498030F07050524536D1F8A94DDB6698BE7B963C55CB3F74B676CD815A7B3DF4B1A0EA2BE
-1B0B9A11FFBFD5B1FA49668AEE14629316AF436A0821C20BEEF7B3480847934A99F6D85B68F4DDF8
-859A754E009428AF89A90D1852C220A607FF0806E8080726EDC94D691D214B4521C147C4273AEBDD
-BB4A697EF16448CD9B2FC95293305858DECFD406B89B9F3FDAE2AC579E80CF321EBAE5701FB2F7CA
-D8ED04B4A63115886D45D6120F69AEF1A21D80AD3C2D35D2899F1902242B96CD349E0AAADA40F7A1
-1282B6B52BDD97708E58DC5E2D22D1153E5FA3F3B300BCDFAF98DEC2F4E3C82A1C85F985735F3987
-4F557579F422664E07CBE19DA680EFB0FC82C323EC5C4644C51709AC8D674608A8043C91E6C7988D
-430F10BA6CE1FC7FC0604FCD8F723895250AEC36CC35B3FA14FE2A0D24095DCC30B2093F2298F5F0
-A97676A0BE66C3DC9ADACFE2FC0F721A20E945AFC1096A619075D5E9A264C796EC6C90EF1AEEA8DC
-089B44FFC13D27CB2370070A52D4416C53F364393E46EDD7EDE00799960CE6E0D57E4909E88ADD64
-BDD2B0EBE2D73FA6ACF8B40280DAA0637E705C65AABD523B8815F22F23E9FF81E7829C7E4BC980C9
-143AEBE1A04DC0D253396BBB7268BD5AEEA356B610D5DCEE03135E00AE34388251F31714A1C40E18
-2652C48CDA2211A22CB6F02490E69A44CECB169754C53B16028D352E0119F5D5FAE0BD7EA1CDA647
-12A6147374B64244E21E9EC9F0D1381AD22D5B6212B26C3F9AA5F6045F25DD9F5EB4489EA39B1945
-331AC70510C5752557DE21D0A6CFC1EB10A98FA867B76DA6E4249469F591FD154D39E89364A43DB0
-07AA0D7A911CFAE6CE2B557997FBC44F55A27F622BD7B8B10EC9F5D10F2649A646FD964AE1B111B3
-5B46A252C4DEE44E7426EB5739F24E8A390694597DB3A1FE7800C97E59558322F0E49A0CCE2AD94B
-1E2D1026AFA771723E3F523916F55ED866C9FB4A2F759651C613A2CFF362028CDF9D38F05D4C7C60
-24C533E930B64B099FB1AF04B01F5FB9CA6867E6EFF55A772C5391831059987E10CBF987E3F378E0
-1329F73D54DC0484177D3C3C06F67397955FF1CA4EF8AD1606B70455255D631A7D6EB92BFDBA14A0
-FF28B2ACE7E81AD666EA9B3A0F5A6BA3B5DFE35044FA4B3D8ED956009C60E98CC132F2E84967F4A9
-8A67B336D5EE7CAF7DD1F74D1FA08619941361FA7312CF225D89CEF97E864C8369EAFAB94D97F056
-5505D825972B754F6729596EEA91210B75DD8F645382ACE36DE60819A02B3B48DD00F5485F9264F9
-FA926D732E2C267B0BE8CA98526F124F97EFDB86132C5EF16B103908172FC51F286FFE45FF253512
-E0033F037FF182BA536A9EB2DF2D1DB257D9C86C46E1B002FB32AC70CA9462E6EB48994752CEBCE3
-9F08ABD4F4B0889283E55500702185A841E328
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-cleartomark
-%%EndResource
-%%BeginResource: font NimbusMonL-ReguObli
-%!PS-AdobeFont-1.0: NimbusMonL-ReguObli 1.05
-%%CreationDate: Wed Dec 22 1999
-% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development
-% (URW)++,Copyright 1999 by (URW)++ Design & Development
-% See the file PUBLIC (Aladdin Free Public License) for license conditions.
-% As a special exception, permission is granted to include this font
-% program in a Postscript or PDF file that consists of a document that
-% contains text to be displayed or printed using this font, regardless
-% of the conditions or license applying to the document itself.
-12 dict begin
-/FontInfo 10 dict dup begin
-/version (1.05) readonly def
-/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the file PUBLIC (Aladdin Free Public License) for license conditions. As a special exception, permission is granted to include this font program in a Postscript or PDF file that consists of a document that contains text to be displayed or printed using this font, regardless of the conditions or license applying to the document itself.) readonly def
-/Copyright (Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development) readonly def
-/FullName (Nimbus Mono L Regular Oblique) readonly def
-/FamilyName (Nimbus Mono L) readonly def
-/Weight (Regular) readonly def
-/ItalicAngle -12.0 def
-/isFixedPitch false def
-/UnderlinePosition -100 def
-/UnderlineThickness 50 def
-end readonly def
-/FontName /NimbusMonL-ReguObli def
-/PaintType 0 def
-/WMode 0 def
-/FontBBox {-61 -237 774 811} readonly def
-/FontType 1 def
-/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def
-/Encoding StandardEncoding def
-/UniqueID 5020947 def
-currentdict end
-currentfile eexec
-E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942BF7D6DD84F1664B89
-699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED2AC419FF2B2BDE605B8EE3264EDD6641
-2D4F21C64AC522BDFC7C5502F9C3F3E5592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A2
-5032519D1868816E44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF
-9CDC7A1B1B598C69131DEE005B415805A16D8A123E6A208511C6D0C255B9A5BB2FDEDB4D399C6CF1
-94FFAC236883767C0F68F4EF84EE696B677DE704EC3B097384F2E673A1F51692B7B260693738C211
-9F7D90FFDB21EB715FD5B8134FC87DBA320EE54C2CEC6A4D6BB350555EAFF2EC4F84365CCC0802DB
-B3BD0E3F0D9F858647DD637725C2CAF9557FDF842A0DA6A0CA0F1B442EF8EE6CBF2B03858468A466
-AC5883CBBD3815B283343B39205803C02C917D06825C09E2BB14609FA32C28D720C0E14A4B12D4F1
-25FF6281FF324DA33A56FC49987AC7D3AA206540F8127273FFE9A3DACFFE2B1C269D3DB9A811578A
-C7D532C2EFC18376F473FBB2B32EF642B19CDEC1D6DE83643723E3C6DFC87F97A7007B6081894BBC
-45C955B7001EB36211B26AD7A3D07459CFB33F9C54A40A360CB802FD202C8E93D4DB888B325CE246
-D02D1220ABF55CE646DFB45F07CB848406E470362F80CE4C02D98DD845189877732744CC16C7F566
-9F77EF096EA55AFF98AA103EEAEFB971731EBF3782E6AB725D4E9E35B2968689E8007C038CF25B6A
-E69451A4731E79AC22BD268F56942A233E52D71873E83E00A1874E04D3B22E72FB2D0671AF81C698
-53C389B51F4A257373AEBF4DE2DA1E4DA5E2CA88941F81EAE0E32D982064C8AFDD7A9A600D56D736
-05B9463C6240606B3361BAF22AF74EF89AC804A5793BD512DA2D13F4BB1B73EFCA1E621ED2A65D66
-5AAD0AD228B3B7E3D90DBDB6061E172B686E92355A7C7459D83199040A368B5697DDC3B81DDAD341
-6FF4405E1096B1240EDC18A0E9985CA55A0D697972BB11E9F1BC30765D6775BB68C69704BE200EEF
-4E11B78ADDB6229D8FA49A6B1525ADADF17122C0FFF51A08AA7AED158724AC4352EBB91ED0C157E2
-4281BDC1FD610195F495E87062A8C38E0D046DA4067EE16E81BC5F87E583315B973184E474064482
-9B2A52E0D37E249BAB31988B906F891AC904D1BB8901F0673AECE60ACEDE97B8DB7935C6488ADE8D
-FD898027424AA85A11A3DA494498B084133B857017A6D507D70A3421235486EB3CF7613C59139FD4
-DCB92EADC60BB6225D9CD0599779217BDAF4813A453989B2E56903F4DBB83D83DF4837C86BB4C3D3
-CCF98F07A23EBBF7AB5687C3E1E6792E40F92A7A466DE352294064537505EEF3F9C308C9EB94506D
-B02CFAE289F10005A6E42D2DCE43731A7AE368564B2983038DAD6987F67062199018395BC0FCAF28
-7A2B040C71F7325FA1E9A9808979B2FEF19096B98B8A0A728EB98F2BA3D33B49E3C20BE992822C7A
-1BCCA5B4E4D1099D456D8D7D83C57ECBA0FF21428024F7572A1470317CB8CBC8679A974E13D88C68
-1338C68C9AC9557F97784F4E1C8C2E61F26023ACF46232CBBDF3C0BCC5583B935FE9FA09A562129A
-8927AE73988DB0F7E733C6561CA7C9716DCA9B88208A715166F2FAE6D5EFF289A9B2EDCE813403A4
-16F243F1B57EEDE7D81E10C2DA4065A3082BC92A38B2457368EEC9C3C17296CB09819E9E642D7365
-F9A6EF430FC7DD611EA5FDBDEDFA72634AB599EB666A5DC178B0A0BD1FAB042792115EF3B6222C12
-41DCE36CB38B738F68B1B3CB489FED9E53315553F3C5C3BBCE40451E47B7EA53FD3D3ABA6CE0AD22
-5DAEE734BDFA3BF1D81C1B42C6D856A05D0924E03F7627C5EB24D7FBEA3BD85716207F961B56803D
-BE046E81ED5FDC378F9CA52C14FD8544CA7C539201BEE06487EBDC30FF3B28E8264EC7FD5DA7E080
-65B0A9147344CE28DA5182335875E9F8B2347A44E33DFAA167232A5C3E69E8C5B58B7C7216537827
-C936F5741B87FC68753EB0D4A466961D0050DB59DF3195BD3379F5647F8CFED35DA952D7CF2DED45
-EB442DBFE992711D22EB228BDDF36B8D7DBA27062D60D2271EA8E8412F4290B58F5BE26FF06F0559
-872F9DE4DEAABA015EAB4904BA1F509F6D517C6E897312DDD571D769BC474FD378AF4360E8B1F103
-AA75F48721B9E0BA589319E15D74AC0B03D730C3EF708C7C504787483F134EA6297097B46D2680FF
-8AA50B7A255563C88D594B912F5574564A1371463674793E4834AF11D14C7991E7FDB3A6ABF8529E
-1A4F10CAE79C60D37429579093DBD041ECAF03824DF9C007E96F45595A524B27EF8774A83AEEBD3A
-7134AB4435C80944DEFF5C1CBA921B0A41B9651968581DA4834B3C0E6D4DE13C1E792FCEED26A72A
-DC4D9E3903661D8803DDB58EB2B929CE31FC9F50A694116B00AC9F3EEF53FFDB1ACA3394BF111610
-38F39917B022394C75A0D467D64B89A44E5505DED7D9C6B8BA6BA098F140C9C00E09200EB4828356
-A2D6BE9EC1D5524B09C06D9C6FCB5E2808050A339B5E5FD4DD6C2035A48FE9674520901EDCAD107F
-67AC8C8E508E6003011978D77ED225F361BC0F86A98B6120EEAFB73F7377DB1E7213E02D12C330F5
-492511B4DDE08558D75D5B8AA2D56A3111DCCD257EE96E3446EF1C76F000C8916C4CE261425ED9D1
-5B58CED128DAA6C1300466E7B152BCFB5E6FAAB2519B8A98F26B29F98133AF886A0AA7E586A090BD
-A1DC6120DBB5640885C609A8BDADEEFE5DE0DA5B75A8A29E92515E86E7E66BB29581E5AFF8CB6551
-D8D1103DF60D558E7987E6F56126A13DB2C9A04886C655064E68A0A20D1B7DE24DAD22BBFEE1B7C3
-C208D4FD6A58DE78D6A0A6126EFDEE3B1A9713DEE94069A9F0A2B392A2F391C4C75327803B53F252
-CC9EF0323F84929BA4716C50385681FF5B4ED54929821594F9026B7C1297941B178C3F8A704CE097
-60533DBC6CF4B18AFBCBAD039ECB2EBDC7838A9410E7B227924BED7123944675A5DBCA388B710F8A
-F6048B03DFB713F881EA0F3B191A5CD989EA150B979059C8AADE403855815D8F7980CE6288F47EAA
-37C1097D33F13776F08779063C5217D7408D9835AACBE5C071EA40C9AE6DF685F4A9827B828815D8
-F3A672E73A418E5CB15684EB6C6FE0998A386E124D76620446907F993BE16FE5AFCEC681F585601E
-18182EDCFD3024062A3082AF97E803C47D32229D0A24596CF7E03F18229FA631175699E2F0D60FC0
-9C4F1954C5D12D03BFB4395F0E5EB6C6877083807D91D93CA4177A6B5A8D2AA500131FCB670E7118
-73F8A3C77575EC93A3ACBA37EA117DB268CF10D04AD0F079484DB124F6DC14A50AD3B0294F7157D0
-837D8F9A6060FBCB385606066401708C041594E0396A0BE4B8B66FEA141CCE4BD29366A986ADB98D
-9A6935C49C57F8CD415E93FF8AE0DF75E463E02AAC68DF064C1B789B685F84E15E512404E065A39E
-9E8F5568A7D97671AE1602605FC7E4933975189837586FB1A55007FBB0E91382A629277C36A190BC
-85AF49EF3F0F38D4ADD2B5DEE09916B79690EC83473C63E92CF617617A66DF472A49641DA10654E3
-AD3880D060B02A4A6C75B51E4E9917A2B6D8EFDA12D59DE5A8E222DC7E82F02F23A9D3DBF637154F
-719B14114DBB102BE5EB76B441D7E9990EF6420C2E80942C8AED5A1D0B19BCE115B5929AB9E145F1
-496753DD6B1798324F5EC1D0C7F26FC3045D7BB46A14110C99BA07A45EC16002CB754C0BAE7A1A88
-EB387BB345FA70B0A38AB4D532C2DE49274D4F86F2582728A2CC54B4C09D26C0CDEB8FEE6A42885C
-6207D74953CFCC583ED82DD7C0F29D35BDAE5BB251B8A2D4B1DC97E2264DCE035E359DFBADDE84F7
-37EA6A59C23D1A64D963E635769233624F7682EA34636B595CCD064AAFF3887D916867475731BFCB
-F7F96D5E5E1FBE6AABF454C2F504EA4E8EB382911560195295C87793D5F7739AD7EC7176E126413C
-D4D1058EBD7D6EBEE14BB94A1ECF28B686411D91E07373E891F78C4C0A05D2E8D90A8AE2614F7FC2
-63A762D0F43485473A54C31726F8547701D4A38D20565ED1707847AED9C805780F062B847E668E15
-565CBA07A72B0BA99F03FB57D26FA26FF579C30EED0AAB6FEC1B5DBEA81AA88F16F0C9BE869505BE
-18C1CB79657D91D6706E2A3F0BE9920655B93EBBAE2B4D0B5DF6BE622C951F2CFA42AEDBF7AE649E
-2150FE87CDBF5C2685EF36051080BF39D864573A45AE2648AD97662B1F69787031B9BC43511FB841
-55ECDC3D91E2475D072BDE6A5207ACEA1E0D2ECB1DA8A1BC4BEEC335A5C7102963E84B97BE741C44
-58ACC3D72A7E53B1F08C955F33EDC3A0DC3E7308270C0F7FF814B111459985733C62E8863625A551
-837952F3CBF32ADCFD9F345E14B585B23ECC440775310654DAF7F41E56FF45F89701292019A94BF3
-0EB2D65E14B1A1D6BF89D4CC43187ADADF3F6E03A90ED01E5D876BD3AA56E5EE84DBAA4DAD9824DE
-9984BD45AF96FB8A56C010B3C3A3C6139D58E9D69D9109DB18561B55EAD6452497840B9AE90C749C
-155B6329716F0152A7AD52DBD0B8A25B9995E1416681F38FDBDFA443879B5C4C25AA29E0DCC07DE8
-BB161C36D76EF286EC88D57C74BF44DBCB4FEFF771D3BD82C8F4E233357C48E516EFE3DB9E60EF16
-8E2C45B54651DF9A5ACB5F1790F7929BCB16CE5E9F6A43919AD287DBC8E12D9F9E97E5DBAA592879
-1A5A02D39D259F3CE273A870906A643CC18D86E23F115D2A35DE6926053D8C84B940B362E7DB183C
-4905060316B269223DAD309EB5AC96DEBA757BEA45FA3100F77F4765334EDF3D659E09BD1A5552DA
-492BE9174DD406F8353A059ECFEE3709422940A8C369919EE1F22F7C02412C995FE93DC4559D32A3
-155DD22D3526D89B16D9ADDC30CB7ADA6E52D62C5F2DFD142D4D7B6E066671EBAD08F54917E31704
-1F410CFD8A3243F8B39459C418B7B7C6494551C6F6753A94072D09E0D812351D62916383C6E061F3
-5ED864923002007E626089772D269B298DCA2CC1F25D9BE43FD8AD62D554C16AFEB7EF6E5DDA66D0
-5A810F003CDDCFD2C02FFF02BB61344968091F67D3862C1499409ECCA137B9A2A9BE314995B818AC
-CDAE27ED4AD583BE29DDE4E8C2400C5F8152C85709AD2A4737BAC768FEB70CE81A92C9657DDDB2D0
-BCF9169D272A063C75C150ADDFCBC2F5F2503DE3D13231AA8CFB396DB38E80197A605F6BC20EFA1E
-DE40CF424CF221218D51BEACE64A3DC88377E4F3EFE43DB4F4FC0803BF61764104CFF0B618C90311
-98B094E20B0FACFB94240B438B67BA298E31D3F4E31FD190E48BFCE27B1BE29D36E765E7D295E96E
-DCE09094FAC43B87E294818FDE9363FC7DC5EA36A1497EE25762D02DFA00A9BE53F87ABE62E52ED6
-F59818FDFCA643042EC13D670DED1980413950EE43372D31AE2694B83DDA42E1FBB049F7E7B7E69C
-93FFA3195A2462423DD2C022E5141783FFA07E192AEBC5070F08B23AEC9142EED56DA74F93BDB504
-78DA55DDD0A9987FEA131E4CCA0EFC51064E4B37632728261369C3FEDACA100F1AA78FB718ECE7A9
-F56296C5FB43781E63F36B0E1D34BB748EFF35E1953941F94D1A9B0FA474FD68B47183F2AC53A63F
-9F1D30B9B89C5FE54C3765B43DB403D57994701C133E42B950D9BB1CA202F15B5E590EE75598FAE4
-3D5CF1546572770BBA9A6373F100CDC61DB4E5EBBE0A93E0E51C86005E333F69110B1C8E492F2BF2
-52CADD5B73E7D3EBB53E759353F1EF3C9B8B39C230D13AB7158A5D92EE4C452F81F6DFC18803280A
-A023832FD0DCB482CE5AF615C952BC3F7E58F6417D69775FC7C0D5B405AAC632857736ACF32B2EE0
-F2A2C0F3B3CAD483C614505BE94706322F2A2830FC5AB592907D0291ED1873377E7A6158140C2CDB
-1B0E27EEC9CA50176102200992308045CCB5A169B61EA0546778B8D280737319046716604945A21F
-2A1CB9E15E3A5DB31E0FB5A3B0AFDFDF6F3424B7536D473F9756CA3694DEE4301FB1AB1AE47128F8
-D2B461C051C1B999DBB010E78DD13AFCBBA6F7D5226D540527F17881A18F551B3EEF76A7E28B4FDD
-879381A2217EF2FF9F9982E9EA70AD2003B862D7C36D57C5FF9FBEAAB56040FEE973EFC3B34D8319
-1960010110BA10694C17B7635AE03CC1CD087C0B05522A7A791F0CA34022A3F5860B536D9551BDFD
-BF560A07F63AA4E687407E5E48584E689591F1B52671213E430A708C06A34D2E1D51CFA6B328A122
-007C81B5EB263B967746961BCFC8772F8502DD95898724ABF369B0877F3313A167F3F714023C229C
-5757D4D46FCD9B4AFECD093DCABE52B78132CE9AB6225C9A344C4BF8D96F2C50C4272CB9AA0D606F
-013B2642F8C880E08EA2822C8CF5097D2CDB64932FE195ABD5FDF36D3BE123AEDD8BA2F82A8A628D
-BE3ED6129DC0FDC4BE50D5574AE4FECC65062E70F4703BFECB35EADE196294FE173EA57938679DBA
-6D15448FF44C0D1A903B202439DA93C0B0E612110068F8079219AA89F435E44D0464F54833BEB338
-670BD820D941DF4B31F51B895BEDF833F9C43CB7616DB80F988CE72FD3C12C7D49F740CF85B4766C
-0ED398EB837695D102DEC16E24B7475A0F5DDE88FBF2D6B94F126417C811E8362B9CCC52D8891C13
-C10937AACC228D621D4712CB9DE0BAB60EDE2A97E9292BE04E42E6D3425594DF56931A61E1F96172
-6AF6E6891D63B240E6E79E5BF30C052091D681BA1102409874CFD8EDC3EE2BE331676E31AC00F807
-91D1019BB789CA4F5907F4823B002AF3581448C352BB67D80FDFFCD1C5BEEF60523330AA2C045600
-8F62DEB55E69AC2F86369FAB1ECC90D2487954E61117A90D9269A65DFBDF297EBD29C3DD1F62755F
-8F289C42A534F59650685F8576EA2FC5D26B99B8E3DCD3F1FEEC73131000F99AA9868EA9BAC0B56D
-AE2CF46DA6CC1D18C0AB8D77BECFF7B89992175CBA2E22779C13DB9DF53FF5B1C8FE95E164997D94
-202C37175E562C8622989B075CDCDE173452C064274354D5DB8F7D5A78D48AD4A103B9E47500D08E
-DC7C51C1F3CFA7F43C3686A3C24A7EB5018B0F419961564F87E212CE0A0741AC68D6822C7AB9FD68
-85F5D0B2AC249CB7F50E2353CC4B0A6A24562F564FBBC7090C3FDF1284AB0EC615E0B3FBE132F315
-70C8A65C814F93910AA4BB80D516CB70D2E1D11969238E6F022D628FA2F33A0A15C4EF0CE7F753DF
-80A8AD9494885A1B9ADAE6C38AC9DA6FB0A61696AD3A502630252AD7B574C841117D34BD20BD6581
-217D977B35F5D04E02B933E1E84F5C090F6615AF484D63265D28517BA74BEA8876FDA332A84AEA12
-E6CD82B94AE10A778CD3A216ABC08495EF319F06AD6FF8ADD237D911F846A514FDBFAA8A1EC8E0AA
-9F80F11F1CE615519A4B044F3D1CF1A17D7F3D2174222A5FFA8B39F20197FF6CAF250B6ADBDBF519
-1C525070C8D38220FB501C223F493D80F498621A02EBCCD6EFE914F16B2A435D60C0A1A453E288A5
-3D818FE1EDCA7D55A26A017F2EE47A816E90D6C3FCDF0035EEA307DFB06D2BCCE43458A67354A4ED
-B6E5C57233DE4FBE41ED07EE5EC77A5DFADC4032138DA9E1B74428CAD02A913E40152F8063A774D4
-FDD4070E4B8A6C089F199AF7C529C277E902195DB760D81EC655DFFD1BB283F3C5AA8BB58F2476BC
-797B2892E94414ABBE96D4DB93E280CF7DE23EB852E7CA954D6682A6F1A4BE0507884C2A05AC863D
-2BA73F3B54668397B6C54DC2F4183130AB414875F3C3D8792BF7E5FC4D228DF87748BF0B14178DB7
-E3FFB7891D700A1E9520D778B095DA80E4801F53442D5C073EDEB706A5DB8466FFE7E701ABA9C364
-A37169F585C883A83713A61C9C3BD9336A667EA4E3DB5F4DF6BC6A552BE8D3EF093639EC67E5FF71
-8959F9902477F5AA894ED2D1CD312ED82EE417D95C49C96671B23FB0E1738E892ADFFE62EC1C3D4C
-BEB6CD089C98DE8D247DF7ED17DFA2959D3662F105E8386D75AD308480536959F8E6CF8F2C6937B0
-9F2E8137C811327D6B165ABE46C51834A955FE8306D10033F8C2A34667F13A8BA831CCF52C7A21C1
-3DB92F3E77B55CE291F6190BB1D194A33FD73151C3F61ABD2D8A0C9BDE90E796BD996D2D0094DB2B
-E98657E751BDEEFE8A43EE4501B98F0CC6D80805189438872A60047A8CAA9039893530A3E5F6BD75
-BB466B25165737C939AFF3EA59BFF4A7DB09C2A5B36B8A1F0C6C5E5870C7C9412589877EF44F8428
-4B8A53B5B74315CE72D2EAFC631BC4CC2E5B71DC958B5A6350CB5F615C3A4502E973622E3E18193B
-69572DEF1D02303A375ED60ABA1BC8A179FAA0F221A49078FE15AE13383585FB45FF4D5F3BB3D0F6
-D8BF62E9BD6BAB3C9A7D38C8A5AB0BE57ACDADCBD02B1DC7952D73AEF702D406F62719922BEA96B8
-FDC9B879708E794891C7A0A42F2CCD6812C3F4DB030B5178E3A627C3E77621D312CE4EBE815CD387
-7208FAD92761A5396B67E835222609F823728B1C987857CFEAAE21F2AD5EA9D841212993508091A4
-A2C268BF1D8DA1C650F6AB93995E7C13A3F84DB55748C626FD09C0DA1E3325CCB0BF091E996245BF
-51EB486680162BAE63B6513C74CE83B92359938439921950D713C69324A87BCE67B45A030C9CF10A
-DFA0A82781D49FF224AC57A23C6CB321F95915C5E14E41FA852F66E1E2044A9E7B1DC3BE9E818515
-D28B2C4D2F2210098C39557067062BA4239F2AAE28816D999955910298A450741947A9A1AABCBD8A
-FF3530626089978C87DFC73618C044731B6DB8007739A9699ABC354A6F985E03C11D750B8B9E9AE0
-5436205FAAD1B895B159E2C90562B82A62EA1A7FFB501767DCE2B11C51D55A17529EF5ADF0A0EE9A
-96D0E7E89F68E50EED813836531B4B46E9071E84AA413F4135CC882CE832BF78ECFA7CAB0C9F64EB
-92C86DFCD1152BB7D4AB33831AA0C139B555967F6346068D5C3351A7A4368EEBD2933E6B9F789DAF
-37EF536FCF965C397AF1B7F98AF864B301F3F440B7ACF704B59540453678FD6C1504519481893812
-3E2F47B265EC4F5CF2172D394543D84CD4281165CBEB11349B315A85DEB2D1699507B0C8C110C726
-62EA2959C4962FF093AA5EE6F21F89B3CCB0149CEFEF1855B9A48D28BB363416C015A1F4EA1975C3
-D8807F616C5817C8162536176F464A198EBEE6C97029F15F414275A39B8219128B8C8542E9483550
-7FC2D3908BB0EC375771280B9EBE87E827811418EF93E52EF70546891BFC0FB34969FD7DEA4CE752
-4D9EEFF2B46BED908C0FB2E02EFC1D1624642EAEA1CAC1EB4841E020532E88E59AC890E6C3F44734
-B99722E9816402D1D0FDF8045C5481EC055100836EBFB48E9FBC392143032C909853C9BA38A19363
-141BED09DAF02FDF4E7CC9808321CD0708A1B45270BFFCC3A0D7C27F7E781713D5DECE82C72ED303
-86B02D14575A1A6447547ECC7FAAC1BDFF332C92984758E242256C054656CDD2C45D46E67AEC6F83
-9F95D74E222A6EAE12EFAAB723A7C816D4E42D4ED2725A794743F67597F3DB8CCDDE45BAABC25726
-B851E02E56341EBE69E4D91F2A233583EC816F18A1DECBDA4AB69320F55E730617360FCFB8AC2D2B
-737675B406297F7F8C4BC370CB084C22BFEC5FEF02E9AB290282F7B153F0A4B1AE569F1E52371A43
-46A748DDE09336CAD1F5337FC3D7CF0677091E59480AB15021E023E356B0E1BAC6C6471AD53625C7
-0206C338536F4D0D40733AB217E2297F86B593717C61458B6C93A16027CC886A8CFDC01EF19C34C9
-A608B95A84B6A2E31454BC03C10FA55CDCB7B1EB7DC16AC1E93981A46DECD7E7F00638DCAC568744
-69A2D9B45CBC81398727E4ED3DB5DB31965F358D8179CBF934EE2C4D652C9CC211807F070C80E3A8
-222B4C31FFEC8DFB9EE07A94C973462254BC1B1581903EE6F9AD91524A787129A63FCE048B45BBE6
-855826750C586B6B23B805FEC3E7AAAC079576949A06F422FC2C826BDB78AE96135E9E2C20C2B2EF
-F6171D610B2EB8635ACAB7C5C5ED9C9FFC26CD54D2FD4CB9E4294E178CECA1E16CC8E3FC06518BD1
-6F4D63AE2B435753538834CDD9D8AE7DE624006CE688938031336351A6578C304C2E5480A3FCB43A
-8BEE4953DABC30558B7790C6E7A6F0F9FFA557C50417407AC6A0DDA1E736F7070BC89455FC293453
-3DB004AA9070734C8C2608A07330E421A0220DAB99F8A77489132F6413ADB9EA637F3B75948050E6
-67276A55BEB09D4153DC126BBDBE0DB9298AC799A943D72AFB769BFA1488D311BEB86A907EC9385A
-AE4F77835DFFE4389E3D9ADED1B08BBC2B1ED6084B3D1074A326CCBF38E06BD026919107BD03BD9C
-30470DB779508DFE0DC82DFFD2DED749E872EB7EB9DDF509D5319865070DD76846C34E4E43691AF4
-29AA40DB4BF2CDD50B275589987D8081F7C5A0461AA5D1455A660178A94A0BA0DCB69C3CEBF5EE04
-26D6534F6F919D9795AD6A0E1A1F452AF3B4CB2EA54D6011FA809132421D111EFC51174E223AB6A1
-3596411A9723079231B050CEDAE7659CF168C39AEA9C6902C2CD37D25492CEE00096EDD63DC7643B
-667FDFDE5B595DC54F0A72C2650E1E46990584C78A5CEF9BFC3C5F88CFB0C49CD6CADD9DBA675177
-D601927D75C6902B55AAED0E9E3CB52A577C887D581B3CE6201A1C77C9546CEE5A13B92963337F17
-070E2BF9F5C5E86B84225863874618AA50F4DE855DE567BF2AB7163944ED43DBD7F4BBC0E1623180
-7C43DCB47B2EB694E6FEDCFBE26194D2D9943A1BFE32AA1E5305F5E341EA021F91532162978DD1B8
-C5295A5E7551E2DEE46DC2347C6B32197AF430AF3BB676A53BCA9BD1EA88678377DC0A9A86E2AB6D
-E29E3E261BFD5573C66FB5687BA9C0544D894A759866B066E1DB5C66E60AE071CC3A1C4AE40197CD
-E4EC723F7B80137619DEDC99AF57A5497D6E03C1C9E672E74F48F6C213A3CFACF2699CAE72345A51
-C71C1D69348DE5BC5F443EC0EADE1E76A8A33066922CF3869E3C1D26A3B34E540DC08EA4DA2DDE3E
-EB17C16790DA4EF1A3A76D71D34B788A87838BF2A5A3DB8176F9C097D2320050A79EA6C4A94926DA
-11ABCDCD26DBA09FD33F30AEED977E8B5AD928F3967F607628859429DCB4ECEC7DA3411BE35A0385
-1017B535985632639D378CDCD13B00FE537A49FD9EB6DF1E3AAF5C41EBE35721FA6833C2FE08AA3C
-FFC3477E7FCEBF9EF9F4DAE62FF78F319481C3F1E72999C8A493EC6EE295316B58A5CD62FFAB62C8
-96E521B678342F04BCE1613CF7F6778CBF5227BA20504500D743270771953ACBD5C6586432F3FA6C
-0987BAD33B88BC6C15D29C4B3CC54A9DD72A2357AA5BAEB2CB057CDCE72DC80CC98C62B16AC50B4C
-6A7641379B766CDDF990DBB2FC7F9CDBBA755B6E3DEA438FD6699C30A99A8B3178E6D613AA938120
-835E517431D28114BCA1AB745C11FE6E52ADB82B9D3D53A33BCC49740C93017D9531ECF43831359C
-5C93CB0E926DB440B139E3125CC2E069B1CF6D96EF68407F32DB517242C3AE0BC6723E560B0F45FC
-7F87A5E44E1751C8B7F9F669C24AD5CF16F84FB03BA121B86B0694234D8F2C9C947269AF96FCA08A
-78F736E4E04ACEA44C5BAAFDE360FCD8BA6A59724CA86160A5527FD564468123D302DB45173C1B21
-6B01DC5B6D3415B13FBDBBD3121A5493374B3357EFB131CABFE5087AA1D2C7472B0377066B3632C8
-2073C6A846285CC953A8F28E131CF587B35217EE498D9A1DB57B063CE068DAF55D8CC1771C0C3099
-9CA4FDC5D67BE4E7E69418F6334BC6149000821B89A7437CCDF9A6A0ED702D5968F1E04F7E4FE9FE
-C9D1E994885CB624035BBC5426CB8EDF0456828F8EEE75BE491B45FAC192A405EBA25CAA4F4C66C0
-DC234D7B417628DA5276C08260BE512B2432256C401A66E3B583E69D23E9FD278CD5F2178544D054
-16B9B4F61A88A4728AF2CEED07C08E207F31D644E8E3BA1E4E2F9D8E30936BCB9C6AEB54E37DB46B
-D64F2ECC1021336D0564DF0F18E5A6B6BA470233D8D41FDD9D1079706EA685B6D8A740570BFB78E3
-984BB155C3155C69BCCCB41CB51975EEA1C1B4294CB546CFB03DC31BF86EC3BCB1977E8F94A771CA
-B09DE12A82F1D6C791FA7800E5A21DF81C9C8FCDA78622ABE75B54AEEA747AA4F26D563200992E33
-7231A430137C720A17D44F3AD6CFFE63B2DE12D3184BD3E151F955786B8DDCCCB290C42718F3A219
-1759DF76371C2FC177544A6C425CAB14AAAB31628A9CF9D71B5257AFF0D59843989CF0D747375A26
-DC9ED29B66AC2147DA0168306C48C2484C70CA92F33C0C138F92F276F5EAF5EA3082A8A1CB12DB66
-1633C2F71E3B69918F509060AC949FCD52C36498A2ABB77D139DF1EB33E3B846A7C1BBDCEF5DEECA
-4EF0AD250CEA9C2751E13EF7681E8FAE0491CFA6C144DBAC1FC39D39E76EB12D3EE9CA159AA77D27
-94F0C433345B135BA632F544082BBDC9471E9FA3AED3A7D465AB7158E8AC97F68B1FBC8D368E2350
-45C18EFCCADEE98778D894D96301F903283C5AE355A863BB0DC5809158F7E108662D04A5C1234915
-E7BD5B4C30F9EFA55E702E54F87FCA06FB321507BC57A1E55CC117E21AA4E3A4DFB77C1A949EFE36
-6D93F2BD827EF8CC16D387CA82AC039F77FE995BE6D9AEFC87F8D809E90C1017803BCFA1C737DAD5
-F1A631EBE6894AD20C70791665E7BC71F21C2C3F4462F60FDE75C8A377CF49BE99314663C6ECB538
-B1BF021B2F2174D2B22CF6FAD115EB0ECE8A2E64097A5FB0A2AF666E1EE13276AEC59FD0C9D4BFF2
-3F71E835984E5EEEE36490C54E077AD7355DBC98BDD37DF29B3DDF8C55480B7349C4D17322418705
-796A8C521FFF920DD11773FC44FC631C7D6E9B420D7965D7F62EC7385F2BE30A51E2D796483134F8
-40AEC71FA19ED1272C27F98F2CDC9C7E54DAB585AC1703ED08F5F9E825564902EFD08EDF99DFD494
-44C21FA6BE16CB8A1B6D0C8A5ABF80A50BB8D055483176FD0AA07EBAEAD88FD694F96FEBD60751E5
-C4D8F9BC747D4F4030BCDF9B0370B7A5E0A6923FF60DEA16EF47F886F10CCEE6956ECF41A21F7C59
-6F3BC78299A9657266807E01762B2B2878E551914CA312C2A68D34CD91E4F5115EA1FBE801346E14
-AE529049089B6B0273E258785773A9CE8E4B6C4211CB7C2767319576758F811CBAF3A3FFB41B3130
-6C49F3798B698A47BFA2E3CA0251C4D90C0B02ACA28C611744526906791D9E157E54CE4E1BCF5B68
-6990BA8AB7897D624EF00EAB92CBAC255AE9177DA9F0D86447D35B452CD2F337147B5D3EBBF2B952
-35778A72914EB3707EA78294B3A3BC4ACB19FE87C72AA1D982E4B822F07B115CADF4D3E7EE3D1BA7
-08653BEC6F0A352A0C33252ED0630E7274961896D461EE8BF523D5911BAC1C8AC763E5FB11FDD217
-4E1F129675969C195476C7A5E18A81BF9A11ED9F2336D5301E3BD32174ED5C933E8C85D6272EA218
-52A6F7E2AAB174E0965F73E0EF89E906BAFB181DBCF8B1F5AA0C12D12C6272753C016AFEC2EC9F95
-41B8757874D6F2E061ABBE8B29281677246305B3C41E90418426C575BAA216CEE3C5EC29B2FDEE1C
-77C14FDF940792F48A56AE80AA33E370B037CB28A7373F882022AF378F26B6006A049FD3B35074A8
-65C97D153352ACC156992C00DE26AD21C982C71F0EDCFEB61593BB40FA5F2CEBF23C4FF34A4F4BDB
-73CA273C269242D1C6117262B7C47771F2619FE5710855134A80FA8F92BB2425CF88940CA3450F81
-234ABF2B11775929B12CFF86442B2AA0F4243D324A5983E5D1829775B3C7A111D5622D1C4E2B2A2F
-982FC8A95F789881416DCB34950A393F4F1720D2212F3D343A17683060182355DE9E4718506D76C9
-184F8DAC55788D7E603CFAF4907DDE965A49C323DFF425FE88C09AA4A4D16283F9B14AB9EF1BB885
-A954034710B4A9DA4C88A8A0932B18D139A687303EE562EC9F656F12F3E8F27DAA9C75DB0FA946FD
-0E1A982BB58E040BFC0A49A4AD8CD668493FCB573C849EC5474049A693CBEBD4D79AC7515047CC34
-7A9A7570C90861F3ECFB57B9F53AB9C0D6B05C8C570A8F3C04D58555A45524C98FF091B8F8A422F2
-E0E9E5A7B7FF69F1CEFC13E42F1CA276BCD584516D266BA6838D5E9CA9E9854F50C7D92CAED61AAC
-AF758A7C7BE59C3BAA82BF32B691ACA3E8EB171E08AD22C39FBE586A54E6E4DE2CD86B31138546BB
-8DA5834B2C6E4838547A1B67E651964E43988C8036931088904BBB589CA901E7EBBC094C0DA81E09
-1915D9E46828AD8596FD0FCA39FF12A6C27A359337F973809E81B2E9E3D43B3146F2516667E607FF
-EB9AC80FC95A7B7D4DED551FEE0F3561C70DB2D69ABA96673E39E3397F1C3F8FE5F48BAB8AD6E0ED
-8901F90F6CFF24E80CB5DCAC498506C4D01033E497C1241E413B022227A3264DA68BC3F91B35781F
-A2D018475C199F43CBA7D3A0D5697B45321BAD2C394B207136E1E16B41794975E8903EF2B2E1C33F
-87CF72C325C11EC0B92FD3890ACDF60B521DA32596763BDFCDCA837ADC6F26F129B23CA32F9CD39B
-33E64576970DF3C05B8DCA4BFE2F17E6C5678B84D69494F1DBA9FE0446AE6AFEAA1FF245C07916C7
-B7569E6267C42B459435A1D116CEC665B311E404171774C0ACC8DDE96B0D9167C8CC7D99C4240559
-2D745C4428755500EB4719340D2FC6BC215B67823F69FA949C08B5EC985D7AA87C9AC1F9BCC8994C
-6CBCE6027B7D1E0C22A83A5DE61DBA05D4AF6884C95F46BA7F253E0B2337E312916E163CAF9DB2EC
-56C5425990FE73EE53E42B3BCCA1CF642F02B0C5ABD529B568E9ADFF865B9DC190240AD78AD226ED
-884BED3C285B4CB0E3929E805C67F1318D186504D92085764B70DE6AB5AB6990F181BDA50FC31262
-348D980EC76608CF08176C2502E065AC2D8EA5CF9E2D44E2B70A7DDC7B922047C471DF8A0B2087D1
-106B5BD8A830EC0E53223CE3C96EF56E5541191167860EEA58D696EC357EC55799438C90156BBF2B
-13A0D5C9EE93227746654ED73EA5B9CAB61DAC5BC690F89C87FECAF9AD03BD39E438F43B81D39E07
-E0422F94E8B096AB38C88BC2E1A043811D8141C1A35DD3A6DBE41620E83C8ED3A379CD80D4F9BC30
-41BB44B933DACA7C5D4427AE94A176829F24B5968B713431CB8BD9F53080832C6B784CEA9B515687
-F121983EB9D9C9CE8BD4FA3BEC48AFE64E643B7BD86D8383D07521FE5D091392BE124CCC91113604
-3824B686988E7C83AEBF406D2DA88FD952D0FA9327F4AD04C55FEDBFBFA76ECAE8A176C516479AE1
-467125B7EB3C9E7C5B103BC0C470946346DF271F8EE19DF7E3FF7478C35EE059297F4BF21A5C7B95
-993BE6202E897776952A7ED0613A5CACAFA731FFC633CAB62963150E86EDAC796026CE02EB235B9F
-7A54E0B0C5281567138A612BAFE409A818C216DA8EAC5EDF9D1E3A1E3514AE50735A111B4D2AA083
-4EC6C11E290D58FF340F82F0E079F1C7B3566F2336EAA45BF72BCF88569988DB5F65D4C1E59B50F3
-41E45A899656A0B522847ED567B49CD5284FE50E5F8652CDAC1C076804F2B2185F6A51ED19DD4941
-2E65A0D2DBC844B75E2DF71B009776D9F97A4C6F786EFFEB87A307FB6B912BB659DC2BCC6D509A9F
-BDE87DE8D716040A8551B6CCFB7743978AD992D14D2B85CA052E87326138DB196C24593F8F7ECD6F
-486F85D1666B9DE2ACA6C7900044EE369D223524664A2790B773F9EA26E0A4CDFD709942A44298B8
-249506EB9B77BC887DC0EF947DDDC7CB3CFC6B48F060DBF032A11884E6C226D9D447A5A458CBA325
-D57E144C6DC295262763E7BB8FF6A0CA473EB7661C12E0E8E23EA37E8AB3387B9E54686F3E57765D
-4067E521BC1AFAE52394227793C737C19208803F2F2DA920B553E2AAF94EB992AB17E31B58C15CC4
-AA8A1B444DF5B3E7CD937CF03E1F7FAC63342731B4589F16939D16E8E497A74CDE5686F529E9495E
-1603D74875288CF53271DB9313A4511B104F80B179FCF213558970A002E945281BF3AE51E668DD6D
-13D9E85152747F562CA0B75DDEC8FE9FE31F8D05B0F59E802888A7A4F19B29954A31108D2F041367
-DEBD6AA1CAD856BDD1427E9EFE89956FE28D500CDC6A0CB80A76902A08D0BC6705583243F1DD8020
-749B257EDF4803BCAA653F7FD6D8B91690995BA5EA3EE92FCD367C11601C6B8ADCEDCE67B16C596C
-5D200693AC5FA15D4CC6CE9DF7A71C8A925E99F5085313D60FAD25C1BBAAD28D4AC2B69062D68F39
-0530A976319A3904CEE44DC9451E441AAB4780425440F8C499B81460B5D3E268974145117ED843B1
-71BB14AA84C3A084A7D8E07B9979260675D5CE6534DC176DDB60DDE90F6A3674F67462EF78195F8D
-FF74FB5882B079DEE31FE92816F16CE1A70D07752EA25FAF5000ADF79BBE7D17EB1BD2F9BF6CDBB6
-F078CAF97986442680A8FC4121866F9CE86C385DE34E30D8B9768A0136D9EEF79A4B38EE99CBB9A4
-D32316564C9D56996E2595753EA71BEF684834FD030D38BB100E2332B026B046316A53270A96DAB2
-182E994E91262FB03D1AFFBAD623F1689228409884F91DBA153030870A7BEB2C7EE2DEC51875B137
-33B7929041F8D23A94904BD54DD4BC9B432DD0C78DD81639F46D686FFAD39AAFBD1B6C1A37E248CE
-48F23E12464D5379B4AED0D50B5A41577E6ECB75270E9AD3EA7D0FC09DAB271FB18B51DCFC0069F1
-5D72546E6C51049F3425AD005F88FD7F02042DABE9F097F9D6A076B30D8CD777B1EC12BD163FDABA
-5972EAA61E3C87E9AC007A052B1A3FFE14D7D43C7A0ADC89B1DD4CB4F9C762A84A6C0701494B2D8C
-4E4E1A9245738BE4111805C2F153A20ED9FECF2DCF4C8F7C3BAF84D60454A7403D4F5F81C6404173
-A7BA81BB0CEAECFD493D877465DC5735D43E3102CEC57B8A589182FC65A4704661A9E351FCCBC731
-5A87E62F65D24EEB9CEE979C6E10DBCF5C162ADB926EC8CC9BFFE381F6B8A3AC0A19D1631BEA2938
-731AFC99E8EAA39BC75DDB3A39D01AD8F0BC1838F4D674B9BEE9F6F7BE4D9C8BD97E8D171EFF330C
-15B76614A1FFD25B3BE19E4A201BCC850F926ED51616318C965AD2F0E56F9433B1247C6D5B72EDF3
-D408A3E0674A509BF30BE813A5E669D72B978794683CA8B85E3469EACB167C30F7666DB5E081B81E
-E99ECFBC1704B9646B1A29E4A4CE5654CA8409ADD60145DFC54225BDB8485E39CC98CBC3F38FD0A7
-97E5DFC2099452A2418C6636BD2D5F6B24345ACFA65F4E7DBD2D0AA0C1776A4920B4466C509BB5BC
-7D6627946C4DCB38A27098B7B5BEEDC2B3BA18F927077F71E38644597719652037621BB350BB5369
-DCCC073954026E6438FD8393DDB3630C4473F06D9FB9E422E435566C396B12FDCD5605DFEA232171
-CD8EF298786806E9159B84599C26D4C7D8C3BB064665CDD072E2083190372AA808B2268B3FEC8878
-B6420CA829BCF995DC20E067EE6B8E44D2869D51BA3AEDD1763F7F8D2CFB8EC41E6E9E0129DE5343
-1457960CC51D546B10B8B6CE08A1C2B79FBA448DF9783D815608A16C55E589DCD8EF6B04C66232F4
-7A473973A35618000D79B8173258B7365C9691DDFE47B16EEB08B28F881828B946FB5D6FE10ECC6A
-FC4EA1F762E90B3320403382E42AF4885B183AA48DB5E4DFC9A54E0B4FFBF7C26EB17A4F13B4BB93
-12234434FFF05549E7587BA0373ACB3E31418BFAF400D8938FC6466B94273D1735306AB912AAB13E
-31DA3541C1733E2A7E4DA5B82767D37F3084AA7A7C488CDCA7ABEF77D19E42B4448ABBD346E9BC28
-8ABC4540C0A1CFD0BF46C5BC7454B25E27E9906A3E6CBF678BFECAD1B19B4E42398A210CD567EC35
-FB115D5C0DF0EEECE593982056B0E1D14C292F70B3E049984F8881C8B477956AD3140B4AA22256DA
-AC0D11C4126808B5B9F922BCC5F24A77FF352E2C621A3941AC07A20E550A69C49B1B87D116EE6F2F
-970918F0F1A501166AC4423FC212E4EC8039AC7F9C212D864F418CBB92948FBD588228108FAC1AD1
-837070512305C110F0FC3FAFE6E1529C2BD0DDE868A9EBE5137DFDFC5C12A3D08014BF0EE27B1080
-02AAD6B607F5C5C0F1B1EED3C552919C9A2E97204A8127F97B1066607ECFB47BA95EF2B51F007C29
-3B2F6A63041A9C1120D9CFCD5357222E5B02DFC73CF94CF9B5CB00EAF073E9BF253E30E09B50341E
-57BF245A746EA31BFFD0B00201C34CF0881BBD1006BC9BA7D420A48E53686B598BEDB3449924EBA5
-8D5DB1B1B01AE2BA281D5758C99EFE38ADCE18F7B182FBD0D0622A6EA497A4E7C00C7D17299A2765
-EFD8DE376C214D01A21819451FC04A0277EC84A151FF93903D61C78AB7886911E36E12526ED855AB
-43F6289C1890222602B8EFBF15782B374AC1E580B6E963403D6D15A051DB8558F2E61C0B9476C6DE
-5D4861585CF515CE951732F20D32969F39192FBF1690D242AC04D47E0C53D467D0FE4656B9526C0F
-7F852348B0437737CB0F29ECF9B54A5E17185236DD0C16349C3496F3ABA569EA20E343F6D771210C
-39DC932DC65ECEF94575C6E76902CDF6C8C8361F9C757A2577DA535187FD526699917CFE0AD438C2
-A758727B306BC7979547E68B94E87ED820614BDBC649D469EF6B4E4E3DD2EAEB5F80B22FE576CED2
-56495467C76A75F589460061E03F3A1B065121A5ABE3E2C51148B3DDC9F624C97889AAF7FB84B158
-C015EDA5670746C6359D27B0C2BD65144F2B88A64331816DA904572BE398E015A9924218B3EEF951
-23AABFC3AC8217B7B4F691219A1C9DD0A3EDD5C04E63ACBDE71B423522532561F4B71B7028415C34
-37E346BE728A415596AB749015C1D59BD8328E39A850CB98085B34B57FB52DD1D154F98FEC49B3AE
-BFCB1672762E4D2A1ECF02787F59DF1EBF2625C3631BED849B298C6D226BE4E6EA2AB66A287D2BA9
-2A6C9C612A5F849B3CB3C25F17164BE286F6E4F5E7E4C9EB17BC68AA5EF0190B64696A570442E1D9
-BDD1A30E7692524E30E4B4C3DF84481DCEC6E10E7308E65DE9D90099F3FABB3F4F766BB86CC98594
-6D2003E21287761A7386CD8461615B570BDA015F5EFA23D18E83C325EE444EC166A1A32D9818C2A6
-5A092D44156C06D3FD079B92450B8A491CBB3529DDAC7D95AFE8EAF33777FBB265FEB8A4B9AFF2CE
-CEFFF49AFBDCF6C4197497D3B448866D70EF28D8E4B17E7CE95F43F64BB48C4A73EB84B26650F62D
-3E5199D64DB0B5B87702650ED0B850FD5D16C848D096E4C7E61BC63B2A3ECFC099CD713E12C91A65
-77A88D6F55D348617C7A49890A86EA8FE2045704B5ED529DB128C9B19EE129E5FE6498CC97087F6B
-DE96007C9D01CE9CAF75646E5A5B32BFEAD9362A52223D746943A2D09C536CFAF78E601BC2D2F0B7
-63AD722E3A7AE7069D65F9F2BDED7278511D0120F5EA071D41A69F8C2A2D720D3B24B4BE61C83FFB
-EFFAE21B0560A6FD1A44E53E42E0D10E0E93F421A8A7E167BB65F0D7F1DDE2809FA3CDFD931CCC69
-B119C83238C1C00EC100D8E7AB1C7FB02EDE97073C8A5860371A8132BE391EB1C397B61F93876FEB
-438C288EF2E38DDCD182A5CFBBA994A94A1BF818312CD8234215FCCD7C240A15AC01A885E1179E5D
-7D6305DC2F534BAA141F25EA6A5F356486E5FA0AE3C6980A9F5E8E99E7AE5B95AC42977510970245
-4FC951E4319AE4B1DDC9B07D0998372C0A95ABA6985A4DBE6DC633154FAA30ACE689D36A7F17011B
-F29CEDC58A6692A8B3B0A5742E6CEC2F69B255BCEDA762DEE72F125EBA98891CFF4D88AAC14188A1
-8D81424979C9079E44890D94EE094D4CADDC1C7AC5F6791FAB8849CC0240A579ABD800EFE3AA4EE2
-F78119A3C2806C05C2B1F17940BE73984982D1C0065433A9BD658EA31AC819DA9A11B87475BB565C
-C294B6F302FE3F7752ED9B963C5279B5F1196762D0E12E6DA46FF9A0CADE3876D7DF695D8965CB4B
-47B351FA3F759811269376B2C3134403633FDE27C9B024F6BA81F3E1699CF64A426618428BA6C326
-6BF016C5DAA5FA4CC82FB6DC23FF2D742160518CD3A65ADB38E53F1067076CA1625466E0C64670A1
-564A54CE14DC5C57D24A12283FBCBFFD0FD594AC2A56EE58B552F7586825E4FB1EC23F8221711692
-C8C56F42272B87EBFF3865191F1C11943BB76D8C0CFC53ED452AE49404D2C8193ECC2A7BB8CFBF24
-870ABA38D2CCF7869E9363DC0AD94FACAED5922B324DC3B6FE83E7B34FE29ABC1EAD62B49FFBCB81
-1ADBB5148D5AC2743E3A058386036FADAB6FF071BC1C3B8023F908B6FF48DB0AB1C9C67487C35211
-D40995E1892C8B66AD6C9C6203F6F8B513B11117B10DA8725AB45B4437B5A88A96AF3178D856D601
-196E8162868A83DA64E408FDDEBD14D6591881EA652032CF2F88B3FD6C0479C8F89AC68D14D01AF0
-CEAFD95AD146E68FAE01A07F39E7A0C5E4FFA6D6A91D710827CA5ACFE7D1F946A8D7B67621D60F53
-41F32C12A6EFB03AE5AC5373A382C044A276F6B41C173D0AAAAE0C1DE4C3CC71EC2637225CCBFBD4
-5EAB92BF39357C57195B410F74283585B12B926438AC72AFADAAD2D0FA2CCA728C8E86BD3FE75D47
-B8BEB96AB13B5480F7A3D5741EB51E3E40C21FF2ED7D9221D9877C7D1A8CECF394E4023FCF8C4EFD
-B38B839499FF5CD96A46AB4FDB46F35D3B48B91757C0159328120E93CF1F2739E936E28908FB1947
-1D3AD7F6F1AD2BD1EC364986A411CC1B547D0CA104FBC10B1CA7B638A60E75485574034561DB345D
-DA68415146AAC632DFA34769B6ED7D7D4694E92CBFF4EFB16B55495908102E85E827FC623CF1BBE6
-A13CBF64E878E1A2A159948B5529B75E071744A5F0E50DF18C110B0AF117CE7F33F8C959D4C98CED
-5A9D492AE6F56DA57B0F17495DACB130660BCEFB064FD8309D965ABE8D2BE98F6898C1B7A39CBBE3
-E75DA0FFEF6CC3945CE76DA3BE915546FE8A5310130AE0ACAA9AB73C7E041C00533B4BC7724657AA
-649B9388B791AAC5EABFCDDDEA2CC67A0FD0AE9BE37DF9AD40636538EE55A83F60E9E026C64FBD8B
-220CEB46E67410144A520FCEACA252E8165448F84D8EA083C793AD09B90B3EE83B73FEFC3365C729
-E3C738894B8C01C2F8AEE0CC8B114E1175EFB44CC4C6CEF5C8754B1CC7CEC200AD8BF1189D741CB7
-5BCA4E88BE959E32216AD33F674F49AB20A354CF3969F1611A95D3934E148831AE7C81A7EBE3C524
-4F743E66A82E10D16CC09F8194EA7A596BC5981D833318AB4F7DBF2ABCE543E410B649D18D146F01
-486159683DF61A3F880F9B21EBFAB77E908C6CFC79F89BA5F51114F0BF7C3CCEC7BF0F3B057C3195
-CFBA6908E31E0DF10DF69163C9DA7BABC00E9A580FA7FAC202910615BD479BBF76FB8068630D1EC2
-1CD2926D351E869E16C2CF1E023CF04D4FC61607DAEFEEEDFF5593E6023492F00029E2AE4B4A2C14
-50954EFA2792F32B4934A768F892171245A1E2F034E2B9F39833F1B331A19A386BAACFEC8C929BA6
-B67CD8922BBC9DC005EC3976575D5B0508D0717C6BF11123EA36D8FD37FA77A6F1F5AA84D4AD8D25
-B2C11D1877A6E2F9B74F3B5829FAEFD4F7209CE9785AA6FDE68672554A6F29D8BF03FE108ED90A7F
-58690FAC399A8AD3A26899072B832874DDB629581A51B3325CD9EDFD49E890EA8959DB937DAB83C7
-77F2A426B967AF5888C33A3635B78D647AD6BA441E222C958EA58D61945F781D7EF409771B89B202
-42AD7D07C2EF592CBF413C5FC89EC30FC9EBEE4BC63709AE33B65EE3091CECBE610B847E12C556A2
-79C8B114C3E460822D3330ADFD72BD69F54C08A81848C2002A08326CF3B09B1305490D35AEE59179
-08E1604ECE75BBE811A715AE8AF7EA9C371B322D0428EDF4C893FDEA607E70E1B6F6614947326101
-EAEF18E29BE0557D2A92CF1FC1505E8B434BC368CE07CCAABC0774F8A63E1073FBBCEB3F4052462A
-A9008A1E53F188C9EAE339FABA74AFD6D60F47282CD9FF721F64BD51787F3C13B5A6C5A5F7861171
-0111F5E0471E206D72520F1DFA465F4A23C71DCF99A04CEEF11B0E3BDFC35B7461A60753D3AC26DC
-50A5956C9195A4F5226388E0953DDD03AF128A98F03BDFA0602CBBAA20AB9ECCDF7255962A332E16
-D4380762E498FDA4885C64FF5F9B480DA487C58E78943DF62616E6E2C69EEC8836DFCFA9EBF58938
-A878F3E792E8BD8C5D6DF557A5D82018DBAE1CA9C64BA5AF8E21BE1B6680FC5DB22422220B776E9B
-A0BF1ED2B7212F8BF111EC8C8C77B223C05EB5E5F1CFABD2D037F4BA0F9503E2CD83F4519D180476
-63F09E308883F5DA5228F83045FF41214D2273B2FE0A9017D5E0557BC2A198C35D1E7E81F7965444
-5760CBA1D3F05EA4B90658E53FDF0823BDB1501ED51DA75C47395073D8980D1E3504E3F67DB3259E
-4EE73A87CFD96F84E221796573958D364A51E635FC55478C9CBF9AEA16B7D8C25F2115CFE4B7F598
-54E24968833BA0D64D1D332A666DFA2A3FD71B05A26BAB7DA382907B13DE0B80871DF184D3622B62
-3D7E09BC32A4F6EA2E6DA450A906EAD36D53FDEC7F83E101FEF32F4FAEC581B000686D86A0D3861C
-1E67F18A4C4647F51F978484D9E3100B37BE9D20AE84C085461C1FBF929C669E936659050C2627AC
-1B019837BAA75757F5B0A82E8AE9CF2111931A38BFC94744E2FDE3F8710342AC615286E4ACE7F269
-743AA05463AF537D9416230ECCA859D8C99B7C6E70BE7FE11DB698589BE9E11900C8E9582A4EF5EA
-94B5F62820C90DBC022A620EC536E06CB8BE7526A789996D0E741AAD980880A33800A6FE92286CCD
-02C9CB407EB31FB95D9C9F4AFF38B37087AC582C1F7B64A7C3D2202BDD62E9AEB31BCA85C4CF323F
-03DA9D318B91F78FDC0D266630F7444ED068B55C05461C97552366A82C2E743CEC353D51028FDCF5
-403B3B74D379B82EB69C4380ED40239E15A86B2E5C860891E26781CC111FB5705E3B7C7AF1946006
-54B5FA1B5FC54FD0BA43666E7BABD2C91C859F393ED49F7123EDFB648A3D6152F2C17F7E438C0A63
-8968AC06B4FB3F77F64F358AE063820BD33F0213C85C40E4D97ED100EC2DA1C2E1EA258BF107AF67
-5A9D995F60BFA37222B9C2B325C0052BB8537D2B27DD43A129C7E8FF42757B3AC9B447703D382108
-DA520B8B3BB3E8C7295B776B44ED28F863B8E1F81B0BD1DAEE8A171525D09D2620C04DD3219D880C
-2ECC79282DD7B1772A9CBBCA706909AE8BC7798E6EC7375189B6CFCE8A875849176E5913B85A18FB
-197A33CA4B5B4058603CF1FA79A56856B43D538E9ECE117D99AFA73B57E307364F553644DE01EDB4
-6234EFAC13046B6E047ECC8F63942F20097AD7ACF0A45C0501A95263DE9439A880D6B5C5214D2918
-0A54D7FE9B2E627EF49E189B59FCC78745E878E45B46C0A648955D3EA8C935113D94F92EC963F66C
-F3CF3A526BA71CDF3CD4CA69EFAB08B7389E3390716892A4872BD29DC1E0889A42D7FFB4190E9A8D
-05D84EB9C5741BE6B02716BC75E0106F5F94BD3778BE985E03860D27E44088C3CB2A059DEBC420DC
-E3A8F4087A9548485E616C409AC400DD1C411CE4B6A229D091B253EB68F06E43511EC5AA6ECA4D6E
-4818D6AA2068DA1AEFCA377611BFA816B5215182432D5683294D67A7C1FD76C52233087CA44943EC
-7280005E93145F5E7AE50100C18364E1B36741E9647C4DC1F68A58EC44095920FDCF05532F603717
-80F78420077EF5C24D63E26040CDDFF8DFD65D871DB943F50CDE84900C1372EF33FD8AB9889C82F9
-4F61A0E6842219A0F39EC7B232CBF802C4A744F33159432E827006C7CA77E480A48A9B0E6A876158
-8A3102E3F98A77BBD62A3A23150FD140D3941773BF7CBBA2338FF37B9EB640558A2313E8824E8E62
-0331568A9B76F4897198A709F9313F4AC40827D8C3A71F2ABFF02BFD57D30D0B14012FB5C39B85AF
-540DDA0ADC27A85B31694E8D7B61F9D9B476571022D98F2D768246550A877293F3FF6ED918A498D6
-A600223E1A61890C49ACFB60265867CE9464F9C32C59E94F7641C3873FB4FA6EB237F8ED94579957
-270D6FD640BD9543E683F2372CCD7B60AAD269E03A72C5CDB732B128818D41A6DDD2BC139F7D3911
-F48E1B1D263DD4AE8E4CE1A686F3A00A2CBF48978631CD243566E22E68F8D7397134A3530EA3745E
-4F1EACB4D6A5FD84C3011094F37573F7F9902305020C53926716D4780C6B0A257BF711AD94C83F1D
-41A02C1C7DD203A3E6E4B14EDA2FDBB36B063A3E074495F626B0EEA146D22AC33457F44F41675967
-6D2A0566EC2B726D2F0540ABF225339F02F406D4E7A62E5233DDF20AE7C86CA0CDD561F33C422654
-BF2DC3685CA91BB9D4B09AC8B15A24A99FF56E2894F11F7BB4728FE8F0F5B799F74F475D2D01F61B
-7E9E0E541F7FEB8A557486D7DF2CE50927515D833BCAA1CD9BF7A650BEE9E003A5951C98ED147C4C
-52F64F692AB281984EE65A47E44A4A5FA93D6F18D276D3B01C5E5F6135AC6940524CD713DF4077FB
-4943E8AC927A68489EA52ACF7A854393CD027EB52EA2DC6234EF034F3DC742D6DB5A67FC21D22B97
-146B9C268BA97C30161CE01EDC69A6A1F05EFB0E06F22644E1A368F0E2C0C6C1C832878E0614B74B
-D645F5CB293CFDB7618B837FFF14A1210AA061C8C81867244305B80DAA73CB25A417228E9559E7BD
-52C119B0CCDB7C4DCE7E1B9F7E8EBBCB575E5BD213BDD6DB88769DACB05E5870232F0EF82F448559
-187423409EEF756BA6247493BE24CB1879B5DD822E03D0ADEA1EDBDD83D3FC46759C679B921F0616
-F27212903F728AB44C1784E8A7DCED0DF5625A7D3F48A20FCA34008184CECD145CCD98E31B79E174
-CF107E8F35C40C19D86B40BAEE6164353408801EDF75A619FFC5B6FAF3F3A95F64795CC40C1F8963
-4FD8C13852D265FBCEF834C800AB46E3E8167476B23CDD8AFF6E2F997C99A86A9CB30EF8C853154D
-0D89EEE9B9CDC1B4F27BDA32432A4173B55CA8D9FB50ACB2D886AD8E5862FFD5DFF224BA13C8B8A5
-4A7F1A9F987FBBDBC5A3C3D762A5BE309D5D926AE5093C40AA47B3B1BD828797CBB9BC9FEC9D19EE
-A73D2A39764816113A8EDC6CFA6E605AD578FC8E30ABD600658A49ABCD5AC54655D29C50FDB72070
-169D1B389F114B7C71EF95A80D82AB537AC8C165D47371FC142A51625029A990A577EB1618480D72
-6DA93C98E5C5F24F622A850CDD94BADAEA91D4BC32CD50CE69E9F00E77DEA8EC1D37916398FB7092
-402605359DF08AFE7B99C76C2A7C70383F28A7C000C696F45291BB8F074791798197CAFF1544C76C
-EEA8C9E6D76EDCBD92A86DF889481F3BBFF0865442264F0EA40D3CAA69AE467A08003F9C30FF7F2B
-77E767580575398462D5B1171DD441D8986F33BC7BDA17D413EBB6B7A32642E33F20B284BF3EDED0
-02352FC66C6F7741A542155F4A159CD778BE56B9492CD95115C1A06189A216CFD2E6725965A13DE9
-73765A05114D9A5A4BE0615AF8BF6A5EAFF84468B849954D15BEAE1CDD57C435788B331905C01421
-B50F20B184506A0BEF746330BC98E9C89AAA8F9D102F158043BEB6A682059A1C8B8CF67B2F3D7AF4
-D8BBE086254CDE53765E3226BA2F95AE8063649F9F94BD9519411DAF8A0287307335668190638806
-E29484A4FFBC1E46B1800E03B162C23B1DC0B4C0DD3C7ABED2F00762972EF06EEB9BCDC7B3F39C70
-BE32789D366F073AC3280C273DFF2979507671B3E1E7685A9A4F0FD3867F96DD675BF05F25ED986A
-79249B75F182FD73CDA2A6A66D693E4CC5AFE3402431B2C816DA1486C34BC9DCA4E2D51C868688A7
-787CD10ABB9ACA14B7181369DE89913CD8FAB58FC84519EA2AA14E54B7A8CE474F213E07CF2DE2E8
-88093DEEC937526816B71C96ED75FA9E2EDC0F9E6E84569C12BB8E39AAEDBF546630745553D6084F
-F9524FEC6A7264F88CEB7EC3358E923B392474E3A48865564431662988FEA768CE555AB0DA48BD52
-6A84B0CB17B4584066C1640C1023D91F7869EF0C4D701BE121A6E3C832010427490758AED7A2B30D
-6028F2215AA44E86D852FDC67DA5CCBA79EEA863BAC9EDC2535B66AB0E54EC4D4411390FDEB8D1FB
-C1743F15C3B68DC92A8659E7A892D5E53872EA51EE8CA7EF51103E87C29A2714E907C79DB9CF3744
-1785D2F73A1EE58550111A4D9BCCBEBF2E39CD3B93DCA300FAC3ED1ADD8215301E5766C30C8CF296
-75746C5A77BF1FE3CD75D25CF193DE8D9AF02AF8F7A6E8F84B548058CDD3C6998ED13463FADE7391
-26D83D3CE2C7201F955382832E32C10DCBCCA35835985B9A93F8E3B0208BE6E92428787C47D3808A
-0F77B8F1D76E6BF6A17FF81CDB065180E03809D03638307BD7BF5CEDBF64904E918FC805AC905379
-928B816480F6E3BDEE47042CBA98539DA0E113B1A5F23EAF1A3210BD18561985E6436EAB90395DA4
-77C7A6D7888D2377B3FC4169368357D880CE041E1F7C875E956600DB7D9B35D1EE66BE476E9DD806
-4CC02230276829C2C0A098F051502E828A0CC505AFD8C3DF293DA1508AC4D25866BEEE6BBD5A230E
-9C2DCDD4F06883936381F476DDCD86CCFE15C2CE3C3243E148CBE603B8513A7CE7A6910A66A90B70
-89E5CCD4368BEFFF2BCF8E918BFE0A1B069AB2A914CA7BB91A0AC3B3C0B060FA1A0316F6135E890E
-E549315897C8464496CC6DEA0F7E3AF43FFA4C3281156067582CA255B1D2E80F999A3AC0402BBD17
-01824C3BB524130F5B82A45275807BC2F3A0655EA208F968B297F98C369192C8ACA26BEBA7DC4506
-FBD1305E2EFA4DBE5375281A88EE2D6FC88FC0A755E72934B4B58F6DD3BDAF7171A4A3C776576735
-2492BFA9A7758504750AB7F38754683B70E9E293CB1CD7B23BA62BD7397ABB84D7EDB22EF6C3F58B
-3EEAF656E361747ED04020163253D1CF3F905B5E85F83FFF30AB2778CAE43781667C0F65C8FD404D
-6B9202A99EA76AF9AE1236631550B66B063847180B6DCA832EA8DC4A6EFDB674B5A26552A7C7D54C
-2799C7D4E03C24F661A91103086DE3A90A774A6988347656344CFBA06065AB22476BB09FB68F9928
-C0045F2764AF643CFEF0516D87FDE6DBF93BAE2829B176CB507BB99835E01BAD5E55C2F8798C93FA
-35EB3FEF02CFA31D3D21B030547F86D27B9448D68E2B155A65C742BD2999DAA0C3AED64447B9CC67
-F7AF33B63AFAF25F3CF7EF86657FE8F952288CA4B691D369E8F1935CDA44A180A6767560C2ED3F2F
-CC38B6BD7991D4170C7C566D690A8A25BE03212A80871108D18CCEFF246623E653107631F29227D6
-4754B2208D19F84E547799E691CA473780DDD56AE620CD953D5133D135E3D51F237078FEEBB73714
-54EE633CFE238AEA63F9999E32850E6C197687A0EC4E5908D2A18C5349627E336AB5E3185B218228
-603A4B1852069F5EE849D571B8387DCE1F8F8E9FE94FADEF128BA83BDD245F8C1C27C11F2ED1A8AB
-2D6D601726842CEE744EE7AAC6B6FA16CCAA39DBF5B3B1D47339F31DFA562671A9CF7DDE6915FEF9
-F19B3E068A464DD350A3AD146D1A241673B5112A4A8768F976723E6E184790C0604506C46591BEF2
-106C40789B733331A80740D59ABED39868F80BECC2AA21C400A0BD0CC326D186FFF9EB37680F1EDC
-32AC78F9059280D07B5FF2E354FED545129FA5FA8F3D4317FF21E027602FDB2522F049BB545FF4DA
-60248130F81F4E348373142F3148DED038AFBA818F26D5B49FC02DE9800D894E9239C88EE0EDE431
-F8083697CB0BE3B497473473E5714717C914A1A926730C249413FEA2615EF72BDB0906933387A892
-370F77EEBF62D26CD583EE643B02E323821379C0DC966407D36AE3CDF646B95DEDC7D7FD0F28E950
-78F12DFC0D6400B327B743C548A0A3517A175A7ED963ED756B1E107AE7087E2446BA702CD4E26E2D
-CDC1A8B697108B5B5E81E9F03105F220C72D4AEBC57665887C8C7964089FBE9424120EFDB14D76EE
-F8C6F7A30B13E1AE90CB9D93D2E14BDE47F4A1D05ED5B18D32AA39911B92D24C93976ACEB7EF597A
-75161923A73B2CC761785493D0EEDC08B5AFE95F3C006B41438A0785C962B070DE2BD096CB63B847
-C87539880AA3D3FC5C345E0992D7BE77C6CFF4948617FDDA784CC55652192B0ED775129C4EA4245A
-41BCF3875BE319DA0EE2DAFEFAE920CD2B6C6C2001762F88C0C5C05053025C0349DB17104360FCE1
-5D7F3A8E30ED13155A74FAF91DC77B8AABDD6FBD5A1EAF255DB209D7F2B90822296B5603FB5E2CC9
-5CBC5F7A6044058B8044ADCE73ACFD896177F1F70EAD2F6534DC3AD755AB2BA87126D63CA2E9C441
-DF0965BDDD6BE494E58D6B5057A561D1E31BD38E92CB73C1465AF6B9C001F7229059BCA4104847D1
-639E124E082F7364B56548BF8112D0EB461B316B2449049F6A476D36D6B7C0C1126C08F2E9A1246A
-3B5B21E7C8FAC6E23B82E33A7783E4F31F0240E96E69C9444E7D7A928636CFD086475DF1E0A28464
-81387BB2010655B9F81A0744121699B4905AAEDCC84BC5D5AB3674601DBBB651EDE7B5DF05C8A463
-DAB41F79706D285C4F9063997F7AC8CEF35CAD51FBE5F5BB1B3FA6DA2C3ABF2B3E925581349728D6
-DA0D59C1EF6444539742EE9A23A5727F20CF9377F4F84DEA420607015A30FB14632D084A2DD181BB
-02FC3A84FC499B318156B675B9CA3CCABD87FDB2497C6705FA70EBA43ADDB6CF961B30E8F6AB9F84
-E1DD8D6DB3314B34B7F7AA3BBE19D5BDC75ECADFD8EAE19E07B387A1FC586F0F30DB695926764B54
-0D89F1D854B0FF86528AD9523CAF56371E29498C11AFB2F4D5202670C834E930103F039D13348824
-16A49BF93B84FD3CF1209EEF7D4994C8302436C0794497461C11F5B8BA152BACBCC08AF8A15F4A4D
-F3EFFB7227CA97FC21D2D0356C93390C749CBE9750B821F1A7BCFAE2C8BC6D9A27F844D8AD088320
-79ABF0EAD8ECD4EA72846DFEED021857F33C1ACE4C07BEC90398B629814C498D33BEB375B9A53DA0
-F926FE6E89E70322C72CB2DDBFB16B13EF7A4F50DF783316584C6AC2BD7D9029124933133B2229BF
-74A228868AB30EA5C3E87C78C3F0962199480DBCADBEF53BDDE45849DA857A4FD85B96682F1EDEB8
-5384929DEE4AFAF84C51A09F5D572705673D885070303FDB47DC898F874E103A9E7C1E894115DFDD
-AD81549C7375D4AEDCCE2E52C13E5130B47F206F7C5AFAF1F9EE83DA8188D70B473269CA280A6A02
-DE85300B93D8A4F6B402FB5DF58F1327470CE11CC63ECEF2EFAA396A6680A6746A20382D9529B58E
-7CE684B39AC00F7086BCB47C2230DF0343BED9B9152A61C9826AEF9E00A1452D91305CF05490D4BC
-0BADC9C6FCBFA93FAD52C3A80705A1956890497557C0873EBDCF61CCDD2219354A4F5621AB33B119
-32065C1D990A9B68858331EE7875CAC855F98563B14EF9E1060BEA90F195AFFF94728AE935453438
-DAB35123D0E2699475884DDAFC7307A5CC06920F35341728D85965F5BA86F261CFFCB1E29B429F97
-6970D42D10E6AF6C4B792B4384122AEF2448E22A58D3AA007743C71324EA08D06819FED14AC1F22A
-4F0BE4787BC8738E1CEF240677571C65804ED3E748D72E89C94B6F310BE748FAEA31EE246859CAF7
-A1EA17CCB5B246C87EAB771E2AC5D378650191081514DDC2C66878E3766CB20DC49F630F2743A7FA
-ECBE9DBE9E815A3CB57DADF2BFF5EF2FCE23A56298A30A2E052FEAEFBD698101F9DB992613706693
-CB0EFAF6F60C8BB5E7D0A50B3392B9831EF3A304A846CD4AF431E9F018FCD3A5B16387552D55DAEA
-683D36257418AAA0E7BF8A03ED7BAB114D7C15119E6C71C1946BD7903C1C42E115E954619051B853
-BF05AE316E15E619A7DEE498F771E809D9435969C1056402725EF40C0200E083F3EC6E0EC27B8ED3
-8DFE32EA0E5E156AC36C4BB9AC5ED111A11678339703F1B9299345AEB1F251FCEFA11FB3101CC499
-907DC862B4463D5523B9B25C5B69F70AB6B29CFC1DF1ECAB8227EB3ED1F882E90B12080EE003714D
-403EC43B7B54491446B6A3DD6EB641EFBFEF060C45E873E7398025B1CB7065441F1753028F6F8C49
-A96801C0D598E098EADC96A21117F817B6FD6E6947642F93E22425A00E8F6B592AD50B317B69C0F9
-4047386A45E5EBC9504FE55451A01EB29DDF9A41D4BAD85FC84CE280971E834F06CEF49C8C20ED2C
-EAC889F158CB14A8C070900478804CFF1D1637CC880C81AA287D8382837FFA8F41FF3C9DF2F22CB2
-0044C171E4815D0D0F6C22D19A52114E780CECD71DAF63427782E85E463DCB333789F496340E8CFF
-885A9D9A4250118B439C71C6BE51A9338BE29251AA794EDC67DEEC6337FA63CA9B03C1C9F75E733A
-4A918646E7BC9792486CB5A4BCC5F84FBABDFE338C3792254A3EEA3D88903C2C47B91E076259DCCC
-8BD3DCA90ECCC832C09C45141C6242026BFE309029A562C3EE0FCCDCD40E5CF265ED9C3DE582884E
-0E14819DB98B3AF734B1B3276AC41D43384EBE73003D15CE39FFCC04109583390E470F431B4407F9
-8550E138F96C4564B494E5480F47C853BDD237E27301F55E42A3BED18FADA152572B7B465A581DBF
-E7DB2619365CF16D71BF8F091862B9FCF04BF8D0859A76F46E7B5712F2757EDCE332D3213B8A30AC
-2CE7D7797EEF6F30904906B0805DFA7CA36D32A20D989858497A66CE72491393DD79332003D55C09
-5A5AB5DF761C4BE5C041FA8407263D604E53091F7B6B15496245DBBEE96A63F10FC2978D99E65731
-28689366FE8B0BADA48B50185B861BAD03E3600F22BAD4274F2542B635F6C7944BEFC3BC741BDEF1
-1A8DD659038CB40FEF2E16AD1AE7EBEDB7D9BA15FDCF26355331505A386DD7399FB999535D6061EA
-BC61DD76EF3EB457446F29D0BB6EC2FC0AABAC20B27A3C123C27BC27A76336D0A0A6D456DA070367
-4D959A4AFE428E2206A511BFC80039ECD56E75F69786DA0A8084D81A66644DD98B6018681F1D70AD
-E09BD9BF3D16D68DD5D0A03AE26DCF1552549E459FE190B310A8776B2C8468C14CA8B1B9A7AF2956
-507A3B705AD75A17A0EEA7FE089273353CECD07BB8563465EC8DECA0EB42F43FE3664EB5F31E1D13
-24185539B28D508BCD065ED576D8814ED3FD637D576F027927162344AFB0255A91FFC616948E4E35
-8867E9FC76A9AFFACAEBFFE110808C1532A2BBB0DBEF3F010E45FFC73F228D28F12E98478B27397D
-8F456781ED9E19711DF2E9EECBC3FE61F7493FDF1A59124668A91BE51F122F93DCA4BBD22DEEA339
-E6EDA3D6EBEE03DF958113E1CA49C8398D2C59DA6764882EE3663F62A55AE50A7E91B4FEAD1B11FE
-0D50ACCC5D75F1A515F0C53616A500F1491381DFD0E2477E402AB0CF9F67D501A442629C8593ED5D
-25A72EDB9746B02F2B0F0759CC9CDCB4C9D8B4519C8C617E569B432F0CF6890372AA879CA7DE46E1
-10D95E230A4F0E52CF65811C54365DF4A3E40D819E2FD379B47DA3233D0DEF0EFBCE04AD8BAA3888
-4F6A69FE5C373E38AE0FD0241480F2BE7CCD18AF85916D2703A049779FE7398FC47D348454CF03F2
-2EB3FECC064606957898B5643464845445C25C0C7D685C8DB042AF5D5882174374ACE90081C68678
-9BCA96AC602EB41D317BD652293EE628951875641661EC86A2C40A42E8F0813A861D41A0F5178E55
-43651CA0E99150462DB5EE0010F00DE6D55B0D7FD7EC5BAEA24ED3E90A7D6A0589761922B91A6A91
-3A7FEDDD3B68254D89ECF767CE8E27F966426A8B4FB1B4085384FD09D63E288405B78A646F44C87E
-EE22C8596B13188085479F75F63D3D97A28F9C8306FD207DBFD38DEDF0FFEB7DD80B2A3292DFBF1E
-D605ADF1B33E85B010309E3EC058FCD922B1325FEE71EFF2DBBC2E68DB52D513E024C01D47CF657B
-B61C9734649A4AB63C0AF4720EC3EFCD82DD3CA6E80BB63BCF1B8DE810A0C6C517C63B76FE68C0B2
-86867BE102424FC31C4937048B6F323D039618586FC21731005D949E7D802A430DF8D2F0CE99F2A2
-376C2953EFC4184355E4D12F422C9E1E25C4DF38DEA334DBC89B540E14C61A7769D77115CE8968FB
-76B27D0863CEA2496783114C24D4CC816DA884D953DA3F9B9D3AF8938BC607BF26A071956CA07E6A
-5509EA2F5D80E5CBEB98041B197FAC760976EE75B470DC20AA023BA3F63C2876EB281FF5173BB490
-D6815604517AA1B1FA0631401B3C1A04CA103E2CA4ECCD83874D9CFC8ABC134CC0F9141D9AFA5684
-8BF222342016C556C14B3482482DCE5D0B6EF1AB522AA1812BDD8DD3397E05327EC12748FC480842
-9B97202E24E1DE0C7C0D272C046BA73B37D30930C5DE5A47D96955CB0F5DED8F3AD929A8B42D2839
-0458F5910A0F93610F79EDDB27078943DFE17C716D65F96589769349F3B66AB7B8C004CCC59EF688
-1F745EC7129865A76F9C2D029D4660CCFB4D5F9D412BA3372A27CB175E9D65F759575CF14A5899A8
-D31FF039AC02DBD8391C3397428AC0D5717C005200790785354813C8859BE90E0E17914F6CB9C674
-F1E9A9648657B54E5E1F52756C4F982DF74E73F6E4D40718C71D1D0E2420FB7462FEC9E457C0414A
-96E475C6BE2C10437096FCA0C942E995A9ADA789AB637B648781D32DFB68E62E91C2CE7E13680F8D
-31ECF8C824885FA7618981CD05FB335AA111B409C59EE337DF4E5F9DCC920A5FC0D620DC07F20DAD
-63F4FF5E0EE5A2F390AF1C32122BA7780F210229E5A5E3ED97BC1C3CDDDD456E739CA782EDBF4B81
-0552368E9C734B0C78B0B8E3F8B2DD782862B74318871BB1EF087828CC173D7B049811FCF598B8EF
-DE4D9BC5447F4848C98029C854F3AE461B9D46DDAD8CE67A521F3C811A81A396CB0F80F3C8D8EC88
-30532FB7F9624F7CAE0F8C6DF875073333DEB28AAA90AAF486AB8C932553CE697B885E71EC8E40C7
-835CD5D59A2C695DB9E51216FF9B77A15B0DA63717FF25B05B939E45CF7FBE490E51E9344213B32E
-115C2DE14D76DFD5845088DE645B0E75042A61D82FB1753C445AD0A956A1263E5A096B681D3BC51A
-9FF32EBAFFF7ECA8B59D40F0937EEFF38312AE57462C7BF3B1FE24D2BA8DFE84515270E09063CE3C
-80DF4935E409F62EB4F54AF16A186D4329972B9BDF15FB08461B688ED49928429226CAD9F67C9D63
-6D1375CBB7B08A5631956B7FE29CC9EFA8D75C9E4919C8C2C54F401D2E0D7BFBA40C50CAE214D210
-C6F3EA5802339F63FC4C1C1995787617F3EC2C806CE44CF8E29F76606CD5836F6E5A2E423CD791BE
-CD3F112F25657DFED9366FC4ADF90B685CCE4A5698E5FE16D7542B913FBC01B288DD13F43DB2B1ED
-8CCB80159DBDC90A8132125DF8DF547C4851CA609D1F6F4D647741260E845B457937787827A89E37
-CDA06BB191669AC84B8608EAE132D10177F3FC384980F3A6E439B048A38D0D6B9CEF09F3F2D732AA
-71BD058169D6D0F8C9D146D9DA046774027559A8B3843F6116B418427E78476AD8F0F81E8A6B1209
-8060FF7DD686503F972D6C42FD6CC29C083AC3D72E3751F21D2E44A572EEC80E81EE44C90FAA7AFA
-BCD3ECEB98FD4068F6C3A4DED0E6CEC523C9A0054D1FC2A8D61A4A26F9BC250B8F302416924AB22E
-722297888B85B9C12F8DFD2A744CBD143F9B2514C1CBE988D9CB4E77D90B2EFD5C2A528355A35F7C
-4AF039C7D1D756305967B847D4ACBB81263D4992C001E2A262B9FEE2D1F5022BE5B15E1D8F1D67BC
-52227344EE912C018CB73E5F47CED54FD202627777BB77AACF3EE6B22706FB2FA9062BEE87E22CD2
-802E7706322648DAA0C624EA885430175F746E1F536F9A8E1C610C4A761D07248426DB63C9319A88
-A3FA449C3FB8AC94C6003C745E6BAD717A3B2EA3862D1E08512A98E57772A62F85F1E2FFBA40E2EE
-43AEC11203DA9CE5AFBF673436F2DB6AF85BBE89D802F7A9E5FA25A408DB69E51F0577DD26F94CF2
-BA2FC53EDDD6FBEB534AF15F74F66EF8D14E7FF77D8A5D284C8202DD5A6053CEAA606BF925992382
-5EF4EFFAA8D878652A4CAF2EE43ED26BF3590402686C876F86C1AE95046E527617CDD3C429BD4CC3
-F9654D2C76DD4102471FF746FA9FA379B16DF96BFE3836D43FCC0B8E95120C27370049ACA4AC313E
-1D50D72D1814F2566B8B29FA9C9C20D0488743722A766436776783B939171FFFA00E04805A8B5821
-4D4F114F7B9C3C17CE7486AEA2BCC895ECDE809502BDE57981318A93F23016F056A421B733C4590E
-34AB08BB348DA4A48F19B6BEFAA1DDD2A49A6C440443028333CDD48C85CD698ADAF3FD8676739E44
-400A98B575BE02350576F96CFA54D4184BA47555B8D12374B86D038D085F7FA51FF4BE2FF5981408
-999B48B2FAF305212ED54B2E371F5A0074CF68D1B0E5CD279BBC8BBAEF694A89A6C43F518D01BB4E
-8402AADF34E96E9B3FCCAB4CBEA2741D3FD9ADF7AF32388F7771845AF99965A6078F4DA335EFA436
-BE36903E33A743C112C0267309F266DD44FA998C9A139704E400B89DAB952EECFE2AC09C82D9F497
-5371CCC27DA37890EC84123193314D8A7A707C217FFC951A547EE5B6D1B7C8ED85BEBD9D3F4B9B09
-6A78E5F7DF88C931E3F396973974454E59340CA51DBFEA1A00DE084B64630E26C6D6A3593B828814
-E27DB0186BF2A87EEF268AA1B135AC09B52CFE53051CBCC88CEC5657BD47F603C8E1A6249161684F
-D9084AC279F57A4F9BBD0A546A87E147B62AC860911969A29B8AA20E3AAAD0079D64E6BF1B0F2CE8
-F0C54C9019207E1B403358253C2FA93A662F63B9380B65C5173C198D86A3D0DC1800D1F5378DA39C
-E8523EB62C6AFAD8A0D7AD1629F2CECAD82B8FDE38975303768C7D3A08B91478EDB3C45A8C6B7725
-EA8596A8ED50B8355FB852FB8966479D12E1086223B1E6523A65FBA81DD106FE254F7309718768AB
-009FF7714A8C363B09DDA73CD3F81BF9C0CD3B0C806CF3B7BBFAB73E46FACAD2480EEBA97AE68EC9
-4D3D79AA01ECC22067858EFFA9D7B7F997ABD2CE5AAA8781E5499E8580C405681CC63EEA53BB47E5
-5ECC5BA2A7A3C5472DF034B022F455C60FFF971B01583A29E211A87F7163187B190B0C1083D696B5
-86E9438FD8BAA45101A5EDCD1BE5AB9A585511089DDAC8DF1B1FDBE582ABD945E67F99ADC4452988
-A9859E39C90EF794C5C4E62997085B7A16A0D90107D08610BA175AD66377345662DA7DA4D8FEF847
-EE5D57E3AC54B928A0957CC1C944E7FF14658FE4A641CD26C61105C0F136A75950764B69CA17509E
-3C19351D456B22C87C55E8DCC4ACD3E150D936333FF36499AD6B02B6403DE0F12901301ECB2EBA10
-324BA72B58206A13B8F37B0AEB12115D0C12879C8EA8A2EB70E85C95434564BA3DFF481C8972587E
-FF74EEBBBAB14FB32B8A84B8FC42EBECA65D25E8C32C19CA5962832BF45DFDA4E871508AEC318495
-0D6DBE89019CEA29E40484C36E33D76B756255531ADD1DB24C03B2A64A47BD8FBA3FDCB1F5B96F8E
-ECB60D5834AB001A70740498720AFB6EC03445CC35B51F7987109618C6C78CBE3041BEDC69B6FB12
-8142CEC5C8683B558AFE3024EFF7A12D04EF59A72E156DF11D33ABA08A8EEB16259DD9529CD003AD
-4EF4137B6FF1654236473DFB93F597331A5E26C7796F528F65C94FE07B3B4F4DD49034FA0CC189DF
-CDFF70C2F1C6D3DF30AE103E2AC5CFF20664AB934CE5C19693292071C93BD590383E0A1931E04D1D
-DD18071DAFB628F5D7472E457BF81D6064EDFA8DEBFF91701C5038CB30865D6122076A336732DBCD
-B0A625548773D0013648A76F07BBDC9C16284D158EC7A105AE37A62279419C3A2F360D0C7A74D6FD
-D0E36DCA2A8BD59945A4196598F690878F84C894852C1811AFEA4BE3B9F6A5219E6628C66669DBD8
-FA9A0CFC2DDE7716A356FC4FB271D8A2CDDC8D4684DE447355BC7A287DC56852A638C5777826EB6E
-B72FACCC86F80BEDDD0D649A883CFEEF4D74750172A90B5DD8252592FCFE19FFAAD868E99562DAEA
-E70514F5DE296EF7B57E6F193737ABB6AA317956584423817E11664A67389197AD9F8F771EA59551
-98C9EE40A0761639E638CE9D890DF468642670235F1373D3AC6B1F43B5777FC0A91A96E095E89BB9
-FD62614DE456CE7AFD6B855112367573FD9FCBBD4A4F9C676E672D62DDD34A9BFE8311B6175A003C
-D143C0DF15E4C0B48C735404086E48AEED6B6FA21FD9F40B84215DFF287F0677904E2DDFDA774A40
-19DF45CC877F553E95A1C65DF1D67BC0C60E0BBA4D205C0DA3DA80229FDD71859F65AD04506B308C
-2B783839F31CFE4425263224F08C5C7E98A2C9D3DC8EA5AC1920F4E395413262E0836BC019A092A0
-DECA104EB2DF6B63392AE8E2136379140DE5FC98B0B69860FE8E31DAB5C5DF7807D19BEA34AC14E0
-ABC6F6519C51247B104DE7D912C5BF6EF11B48FC6DF84512E9F5FEBB48F72FF1B722BDC3BB2E835B
-2E7CC6324BEE84893996B8DC2D4DC2793A4F69C18E63DAF04A7BB5C0A9076E2D5A343E134CC3C89C
-4712900656FFC202E1988526D80C7FD9281FE47FBA8AB5D025E63A84051F6B13167BEC15B346212C
-BD051AFE7A98BE3A2491F3C469718A58E783ED91F90E274FB4978F8719E92A99A1E8F142EA7E1F2C
-46AFF0A2FB50F4D105130CE8EA309B0E480DC8F80D506172B609EA4BB4E2BBAE98D8882814FB273E
-690DA990B60A9CDA20A2418246BD10AE67D846A0FA815AC25858145ADDA106A6778A11877FE59A2A
-BE300D7DB9BBAB31CB5B960B7E4EF91D4600886D8795DC361CBDDDDE05EBD54B1941F426F7FA8399
-270D2F54C998BE92D146227270A8E89AF90C48BAFC4ECCCA01E6322AFC165743475E752F39BDAEC4
-9297290510FFA264342A0AFE2985F85DEEC66C36EB4A1D46683EE7C591A89B81569A8566AFBCA268
-10DDB0970577A76EC8A066622606B08315DB0F2E6C671F3259C73637D773D1A180AAD66ADADA2A65
-95B5F481E5F59E51CBA876FA06D21E1D674CFAB46A02D267E20234324D0891E7847C13C69BFCEEA3
-AC55F2EAF753726BCEB0DE1EECF42ADA964BF9E475953302C2FCA804B70B779482DC9319B40381E0
-9C0096460AE113C19A2DC9157FA138CF0E7758F71008E71D0F7599744D647B09B16E3C795C56EE5B
-D14D8D63E7A512900D67487975EC9CEAEF69572FC3C2342AC5D365E8A4BCF462006B5268ECC15754
-94CAD9A9E7A9E8D9AFFE49AF647C017743EC7CFD5E66F4E4D845A6BBC836849274FBD270CBF263F1
-67DF7E26BA91F21C60F96257C07523AC37A2193010E976965CBD75751E312817C0564E1C5AE0CBA8
-BD12B01122D07020A0852120680985A8AC987BC33BE863EEC52AF13435B6E4048D951F5BCE36526E
-07A8661CF2538F69D1F223BC53BF5896437D1BD46F57D9698F642F0E99C7392D8EE47134E34DCE94
-D392949B418D9821E12CAFA8337323E8469DAC24DADC6AAD4A0DADD7FF65694BA3A27964D28D8EB4
-1179458F91CD3F83B8F119BF5E76184DD29CC4C0718CF7945DCECC993A7A78739363136CEC7F2FB4
-95EEA8CEDB3EBF14373A058758C442939D36774435554851E9519B6F09C31EF26B6CD997DAFA11DA
-91FA9759F17B7079164C5B47B99CCB7A876FBAB1D0D5D1E1A2683CD6914E6B3B755939CEF1C9168D
-30B2738C4349650CF86C90D2542FC9B90F36A494C035A1C86DD716014AA16E6B9EC7AA03B16554BE
-C436511DD3097FAB1FD0CD49EDAB96F74E8FD26400FC748CBD9EE1EEAEE24DA30DB6F8734B52818B
-3A5E510AA5C14E42060898033E7E36CBA9A64042CF94A74E4B52E37AC027C0DC69BAC4944CCE12E7
-AD81AEDCE642EC34CA23E3FF07B8CD35DFF19F33C8D4DBB56A52534F8A827BE47AD4AEDCAD83B273
-38409FD1101C4DFF3F12D3DF79AD1FCE65B2F419451DD059C88BF066413E23DE27D3621DAC2DCC8F
-9F3620DAD0F4B1A6E8C9E6E8ADB552E1EB2C4B2A3B73986AD53ED9ED8911F82F750DF05CD2EBA3E1
-B0DF208A87FB5ED44C3296B803881C1D9776D13350CD29C3F716F0B5A8B8557812024BA70069BE65
-89AA579EADB1F657712DF2570843D7C5FF7F4009D4D232D3547DC8B92ED5C4DB77B76255E661FF8B
-163C6F3856DE5651B597EC7C78B84F0C6C1D6EA3A82286F1D3BB45F708D564E139E81F473C705AB2
-56346328DAA64D1EA8645DC10FD449092E0634D9D7344B2AEC3C75F6B6CD8B3F3867FF3CBB0F556B
-186EE9A7C26BD2D17C8A773055D9D5013BD2F937D697A770C57BDB36D922CB911CD14E7FA14160BE
-19C1A052E297B1A2D682D4BBC9F1D2493BCD7CAD2FA75D904C5F5479179DAF7DC6A4E0D269BACA2C
-4F2430B4C8CF1572FBDC750A05DCD5B09FA3A9CD6F2F2A386E2B3D4D8E257BD43A783B38E63BCEE5
-03EA96FF2C373181744A607F0CB8D281D7DB1A6F4076AA3E2C61914BD796EF8A0873F79F964FDE28
-B792BA99A20C3F1F5ED1FD189FB1867C84DCD6AF43D49420C8B1F3DCE7DBAE71DEB17FE45644DB24
-4F44B1011C7C768EBB7254F4DACA64E9BA87AA7CD0F0C4B2228FFB9EBDCF3DDE4DCED39399FFEB34
-8811547D025320A88B480943A339E2CD2FA3605AAAE87939B1D7901465A1879BCB4C5BE1A179E7E3
-71F1BA2E0844F88AFBAE9B78DCCA47AE8AEDF5BD3D458C7D4A7A08ACCBF880D1F1DC69C636628DF1
-EBDC5C42FF88FF8B66351F3F72D703E52F3CE91E4E00759753A599FDD863788E99858498B66B93E5
-083BC3501C39A9BA928B0D763C28826FD237E949EF0BA85CCA9AA20C405DB6D5612DB718F7B4AD31
-D253AE306E4D7CB615C59AE668D347A4E60FFF7B103F8BD0E7CBDB142A763BE88AB40EEF6B8FC200
-458D728930AD0F94FE52ACBF0657C4907CC7942710AB1FD8BD149A9C9DEF6B8DCA7DB9062AA7B1B0
-11ABB5AAE8B77893A023F9EEEED4A20FBC30F922282A7AE2F1ACFF64151013D6B8AC2EAAE58171A1
-0F80BC18C3BBB5DE1E22EBE6033BF83040629023D74CCBAB3F1923CFA4A6735E1DFA8A1B261FBF1C
-397E26F3BA9C2629CFDA84DFA3D1087EBB19DDA7E2D76E30DC2E15B8821D5291DA1DFD73940E5560
-A8A6DC91BE0075E3ED8D9E8CAC85AC20768D868CD2DC45DEADCC8B59AABE6EE5B2F891E0D7CBAE82
-0F83479332BF9707486698FE196C72EF72B52F54314329FC498171782BF160E1110A19B8208FC591
-EF0F0DA71AF657B43A7CC649A8488B759F7B69134B4F9DCF79DAEBC1CE52CC8015F324C9D46320F4
-4E1551EDA6D86139DFD1DB814CF38A22A89FABB4F75FB896B00E769820F763486E86668253CC466C
-1529A5A924CC337C48448851A381DCEF63A0A302B65203D6571A1DD1FB9DC0C3BD6AEF4891497033
-109CEB5A481BFE442249940EC54096F1D0F2436D9E60495D0ACFF967A741B30467D24AC6B0032213
-18666B951EFD45324987B10BEF4AAA0FF1DF6887377A7F70F555DFB9FF1001C67438A167A00B05D2
-C37065655173A7ED9AE342DFA1497FB1F2FED6098901249A085D31B66DBB6AC25EF16C106B0A6FF3
-47CDF66434DC3F0012DAADE80B942D522CD59AF4C31C1C062157B3D000B9CB86E2AA7B4A5BF31605
-8A0D5A148EAA2C67977FAA0966E4C3454E08DF14C2498AD76E389AF65D2C139A6D8675298C46ACEB
-7DBE6904C373C06E5F71399B2EDA0B40AB96E8BE991DDC39F92F1D24797F9EC9F2FAE25669B43754
-E2498E8EA5C44B176C3FB3E8F7A7A1481275A461F2549AFC4CC73E28417BD8C5212C13105EAB967D
-AA679AE822B9B75B372A99C7E82D6BD83AA2BA00314DA4AC51B9CAA30D80507505BE24BAD0A87C5D
-5D7336EDF60CCA4CEC8201D243C3932F74D171E2409D789AAD0D04A7BB22FB6DC3AB92AE33FFEA89
-7C484D741039F38C317EA396A0FBB9F15A27D87FCBE007558799BAB73212B6E5FAF2080BA074724E
-AC87D88166DBC1464CF5D41B99428851FF1D99246944511CF42C3F9248513E9E51593F253D89C604
-388AD7132D6A169E9DD888E020AC1F8BA606F2E1EBB97977E505D8C40853653D8F398F71CC9F8F9C
-540C22A1E6195BA578AE7262FC845FCCF77B33F33EEF266489AF8B81A615D6A13464BCA58BEC16C2
-3F31D678F14A938BEC31272DAC3CCB1B2DAE577A26BED852FC59843176A5FCFCFA0AB7FB00D2309D
-E55C82CB9049F44FA61F1E313205A76317C4CF529A4456019D970624129681F46A9CD7950B8B5C40
-61853040113C8115319E68B37F88D864C6957DF813B305D09E6A1716B10F26F2EF5C727FC77AABBA
-73E12B5AE6416AB19F6563CE14046B715BD4CB2B1E4D315F42D10F74CDEDE82BCDD524A1A5460921
-9084CF1CDABFE72CC8375478B41614BC18A914903596D6FC2F361EE519F875385F4ECB50F7053127
-4EBDEB14A5DBD906A60817246042E3799BB3AC647CDA7244B7998AE4F3BFBE5C767FD2142E48518A
-4217599E0EC2CF5E86C8C270FF8B02F949EE001D6A439BCB4BC7D7F7C8167C3AE0A7E59687FB8BF6
-F37BEAA164541B8EAFD92E9D152E3FD0F413C99CCC34FCD8AA455A0B55DEC846A5874B94FC95CFF1
-BB386B2A1E22CD1C3914264B6D5BD1746972857C9235052D77A6C0DD3019F8A307FBEE63A3EF12B0
-39B224108276FFA84021F1AC5B745C54690B3FF587B4B1710AC3533A67BCEFC503ADF1F4B62B2910
-B31965E364EEC9CC437CC40181A7320CD52BE9C546B8F1DC824312216C2FD8232E2BB8D40EE2E314
-54C09772A387F9520E331456C269F51A078E6ABD9FB6A68BFD5F557215B0BBD2227B8959CBD1BD4A
-EEAB094DD18E891C61FB00933C0A0D76174D169C0B6445D34C00DC9E06D85EB086C18F3BE27DF734
-EBB9CF078AFF6514438549CBE92A0C0D25EFE4A527D86F158B4E9D8870C7AC5D6C059643A3298079
-CC20398324CA87273B86ED801057D797D91BC3CF2F96C650EE1566CD3CF8656CC577D38B830201BE
-718DC9A494268177A5019546EEEDBF101996BE593631654B638C75A6BAA648CD1E7AA9AC1EA60F4C
-D604071C89DCCFF8B3E430A57ED6DE11C5837E78956ED991058F3646219BEAE94E4D9381A33D48CA
-9B8FF12B54A73FF869D0EEED7E098D80152295E6016CDD809173C57D1F5FCE908A37010AD4C4471A
-53451DE9B4363B63437C374C598F548F145D3D288F42531FCF36A9CDF72521F1C0868FCEEEB1857E
-A983F6B75CE245D875BEAD1BCB8819E5464518E04717B78BD6E335F0AD77B832AF5682062A1E2AC7
-7CD5EDD5DC372EE456C96D38BF8BF348DAC2B4EBBB2440F2CE97B4B337F2E23247E3E8423BFA9237
-CA6CEB6FB93F960CAD894A96F0371168A33222052DE9B3BE04B022AB95C0C243486E35197721FC55
-311DC55F87BC72D09B6C940CA36E6640AEB66C394A5949A604E7F15DCE3A008BB41B0EEF2840A357
-F348443B4DCE064B4C15E5EC52E448C985FAA1C3D6526270B1CC691009959A7620C9A6202619A19B
-E410FF7BD535A8B2640AAA459DFDCB8F2BB35112626497E8A397D4F9E04788322A738DC8907CB643
-15CF63C95809E90D06EF02F72AB04AA61FE02ECCF7E9049FF9F3EF2258A75656178AAAC9F3C2A26C
-001341862D526CC14E92A81BD63502F959066E0BCD659CB9B5A45606153DD77039B8C5D5B13565F0
-0D95A41937CF97089F3938E39659A64DC3D6046D0E9EF66544CAF8A206635DF49926A3EEF3FDBC9D
-CCEA2886EC855F1821C4B9CE1D02A19A11BBBEF43A7D4D536715548A62802F64AF30BBCBEA8C7E55
-AD56C801D8A569C8183615A78CD393CA42C103F155941E845712C335F4ACFC7807202B92A983111A
-ED241BBB8501F15560E8F2157C29752BDCDB274008137277920053D6D7DCDC626A574A82A8A34F1E
-77B2FC8CF7C1A7322F22DFCB450259EB450C52B70DF3584A7C54C813DB41E3DD81253A03B02BC252
-346AF0160716355797B6F8210C453DD7E1E756FF08C7E6A5F4F87605E1DFF35A130D79148A57B7AD
-12D94A129FE3F055CF974EBA09A2B13DEECA2E02EA818A58B81E8743004646C7746110BC61B86ADF
-2D5D8C45A6A5461EB34497FCCD09E711F47BFA742C73F87B257B53F30CB68D151424DC3C210D3E8A
-C67C2495A8236EA2D7985A5E1DEAC699D7B700E6D38EEE2E93B191BAA5A8A2C916D206C63FE63427
-AAAFED2B5784276FC21EEFF2D70E47C8540DCCC3E00134642B703795CD3702631AE2A90E063A218B
-61E5B89BBCFFF84F567E37A31A9B349717A8CDB9C9377215BA838FF7469BC486B64EF2B6D92519C0
-BF0826E3652903F40E400689F5749DF86FE3DE178E21E20EDF9053081F6510D8F19ACD021CBA481C
-484D30EAD3B84ED0190087EE478A17154B243346C3938FDD5340CF6E47B185E64ABDF44F8CBCDB82
-94492B91929BFEB9DA2B033C3ACEE554F0F1A7F8A56DF7C06A3583C1E9C5CA458D40E550FDF3E2F2
-E7BE8312D5FEE98543388EDC8A04CA29F1B82B7AB4ADABBA3F2C331EFF3521B2B92F99C4377AB827
-A989B423750D36ADDD2E286E7F3B694E29B8BC403693C6F7CAB5FE34F1E48C8D41B47831E8C3F5BE
-5ED5142E3C44ACF5180CD41FDA149B1F4AED36812E42BC184227F5034220F74F67830255E1CAEC12
-66DEFA358A87D2E3B4B4E7EF30181570D0B2B43072EE0311C2C157D32EE2BEA8EA4251B59F6B61D2
-B4FDEB654DEB67AA3DFF4AD65B727F0D6B7D61523E4B44D99BA5CD33540F340A35DDD466ABEA4E72
-E504FC9BAAE51D231C33A8CE7DC2970DE4C1FB5B096A3D9C641EF77DC9039886831DDD01C4F21E6E
-168E38BBDDA5F4308C959C7BBF36A42D042DA6862937EB20D4FA2E5927741A58DA5CBFFD9553BEFF
-BD92E6D64871D8B25D9049F4E71970A8FF5557D1DE83DD24286D6C3E4770EE00F9A1A0B0063C9999
-4AEC75E84D6F9C488434D1F3DCFD0A8BEE9ED8257CA97E75E8B1285747184D6D2228EF95D4A0B8DA
-252318ABD35C8398FC6568B294D90AB308A7675F9F160140F0A08C88AD0CA1CA2CF85E4D031CFA3B
-87635F1398EB7DBC666A259F02DB6741D13E11B230025DD6DD64C438409AF109090058151E4DFB8C
-0E9CD65935C4CC063CC6100FDE70896E23E3661C7FC1B8228B26A55903E997F80207EDD8863FA074
-EE4FF23BE585BAF708040C9F8CFDEB42FB8EB71D4CB6D7757E973E4D8C9DDD082712C23F868E1135
-ECD91250BB4335958B07C12FDA75EEB56BE19D1644C1F76A8811C021122619F751CBBFEB1D3DC912
-999017FA163672A1EF754C5CB78962BAAB76EC48461B492FA88F9897170DE857CC8374C8BAE417D4
-C78A56047024731F4A45145F0393A27CAB614A7FF747BBC28E6880D4D01C0A6CF317A1DE5BB5ADFA
-4B5FBFE0C57598C79F25AE57BB797A489D51F85A9B9CF8BEA64293F8FCC43B0D5484DF99DBE19152
-692CE756F6FBE8CE5831CF4B8A5AF47524E272C45C62ACBFBDFE7E60B05BB1A1A6AF0E9210012014
-69B3DBB49EC7B23A363FA68417B7118DCEA71D4ACA2E36F88C6DDEFB70205DF3AB7C74CF65CFD01F
-F85FAF99F172689737331D4C6CFF7A29029772F487FBF625F17BDAD89B4AC076948277B4ED687840
-301016C2B7AD4C6D02F81E88C75B7A04D724E234E38A38269351582245E361A42C75B8256AFD5624
-B558ADA2190F960A896BBAE7A8C57E76DA10DC29E69BBF3AA86214C001A27B39C1D17C548DA5601E
-86A5CF53E7B1896BF003AAE9387ABA9B102EB1E9002DD3754A378F3E49F2C6EECF47EB1BAC2CFCE1
-1AC0C5CB063672D32733563F3E1E891B6073739BC53AAA0043FC45E90E413DFBD4548DD320B681ED
-70A7443A233D79E3F038D26975586E5CDD2115AA614727B1F6DD4024B85CCCFC79D10B7B6AFA789D
-B37BD0E8C423C1A4A8681B5FF3A9FA1F61A46E46C4B1836D1AA41A89264A7F4B1C259E4B10ECDF37
-5BD26A1F412FE01FBDC03368FCAF48AA0EC28B1BD603A6A0D0DADE66D14C9B7285569230FAB76803
-35BE104305E4B748FA99FA31F23991608DFDD2097DA292551136F255051C9F7EEF3FB7C7FDB4E651
-C3D03A4CA357B587245236F4FF3252563F6BE08EF8A3EC09BE2BF27B9120F7D37801F6999EFB1C8A
-D1A08698CC59CEAE2CFCDBF6BD8F94DEC94F7EBF33AF05F52C85760C63950B455510C6AB9398D09A
-C288EFA09E8F631A59B03FBBC75BBDAFD675FFACCCF8ADF71E815A4A49F14BF70E42DB0B7347B528
-4E234C24010E2177DBBD57648E398FA6B54571A37BA8C989503594D03C6E60871A7F964599022154
-02BA168B8D1D2685F5CF8645D5E11A1769473027F42564C2966C10C0DEE1EE1B6975852A4870D492
-83A470E623337544A7CDA5C16FE2855BA2A548511FB4D4FF2E3E78D108E4C734F64EE2F12CC9562C
-BDF363EFAF5201B673AD00583FF108AFF6B68055A5F299452D176EAAFB92C84F114C8C22A05EAD65
-64A3371420EA9E646308DE97D40705E1638DF08704FC90249CBC0D2D3E884A4562CC27370B1A9738
-9D8EFD237E644A7370B8B38ED1C377F522C75F981D878A5E87101E621DF9D85C7207BBE5A87CCB60
-7F93A2E52F660E05C83A7A6CE6D01AB4B62A1EF8DA47CF97D4BBA0FA8EFFA9C0F61A325A97ADA694
-45F23AB1FE27A66C271639F839203040D44B11ECC6E805FBE88843B34C4FD52D1D3C6C70FFED433F
-C04501FC20536ABDFFA429B8DC8192B2D45DD9D646049CBF40719C3D674773F9676F9FCF32817DCB
-55402A72C56D74AA4CE4035687C730B6B44A9CC614BCA5A3FD17C170ED949E588EE45E89E18B0766
-2A6327FB9E8475C43E5DA1B0AF07C23774B19C9EF59281F5D884990D6194170D8293A86DB52A0FE1
-7E88DA82209A00A16BD29B8B2F13FD60AA25FCFA9745F57C8216283C1D6EA1C119CB9B8D57C00419
-5210FFBD56395A3EC2D3098ED38F389EFC0324FD0E55EA339B3892568229D8D3E205A821E8219FCB
-1A7713FCF3450F8BEF976CA0BECA47376A8CA73DF85B340C67EFE4534D459617996526B5E5D3D19E
-17CC5449E5EF2B82B2C4C2131FF8A19FCFE6A186A9840D872D85C40665A7A04E67EE26B8BC9206C3
-5B44C8F8A1AFC3867D96DC6D48BD45063BE25B882E9BC0D0948C18DC870E6925818E1FE17D336217
-F174EB4481F5C0ED37A3BEAFAF4D46F857811B6728BEC461AE6468D87A736572F4FF95B58B04564A
-9D3C22754587DF15495A319D822B838461764B73483C1F7CB930EECC6F7424841EE10E4087E95120
-2FE88A391375C96BEC4480328A54740213F741105B12A39F19808F3823507B88115D468C61B212A8
-ABAE7480E39BA52390A1892C7EC50271156B4E8076FC3ADA222695DF372385DA7B117A29E04CD2B8
-0A320F186D61C963FBDAFE9224E537057C49E82E405196AAB621B5FE4011E1782A747EF935ED8BB1
-1BDA39A141CC0BA42D04AE123383BC95A1D03A85A9440010C3B9613064FFECA76197E10919BA5006
-F35837ED9BCD7DE5E6D968AACB6FC91178091FA467EF6FDEB728E17293DC89DDE5A5261FAA95A2B0
-000FC750E7073900D4D88247DA464613ADC2B3903A6132D96AC0E1C564385FFBF6249DEA76BEA2A9
-9160632DD2FC2B99133E9F2F470F72B45D6F18B45020F604B06CD9174BA3805DB60EB9C5E6A9C789
-ACE76AE9C79C1BD34434E95E501BC968633AF93FF4883C6A596776254C0C74993710327086B2886B
-02FD3E42A725A03459CB36EE34A094139AF5FCF487D3DFE63FAD20BF0DFB60DEEDA2ACCA3510E963
-189D1256EABD81253F7FF9D11263FDBC1DCFDA3D1EA2E52005CE3C605C993231258A717423F64BFE
-EBC34684EFA676358B9B543C2042BEF954829FE3246A879845B30EBACB43D8DD7A20FCFEDF763AD2
-C5D20A798B69E08722DCE6A5762E249ACE3055B650D9E110599EA30DE5C4FE7200D5A8DA9E1FE268
-6350D0DF334877D0B9F6524C552D0B6DFFAE125EC4C18F7547BD51C14288E4ABB7F8A1A00458596C
-390AEEE6FA308AC1F788FAE30D7F8928AFC91D4DE6352D20B19D8D8AB122B7378CB379C5BE7E3CE2
-922FE667EA057B5D7B3F0B51C7BF0C85F87AC2F360D82C38964F4DABCC9104B32F0FB8802235E8E8
-D9A5997D392259074C00AF2CE1D2BF7B8E90E2E2AC34185C68A03BAB8B267778292B227245D7FF86
-70786E3F746F86B9D4D17190DB859A0E144B2A61E6AC9254DE5DBAEF20E2E9DB0B2FF654B996E962
-F55E465DD238BD1643CE59DC2B5A58B1E6E4AE2DDC2D74D79AFF3C34E4E593E051FDA236B79CC0DB
-268D2A89B1878051223BB8F33FF99BA87A4811C0B3BCC01171D0A731EB732ECD8749D27952C27886
-B252F9C3D190419FD2900987A0A255B9753FB7AA70C37462134C467A2C4B7920BED9F9E86F8F98B9
-6D00AF8B05A4BD5F14C2A0D914A9A84160D554FD0718F50ECB5DF5E76623065852DAA74C9AD6DA07
-A119DF12C3577FE276AE551D48B1C5CD8A50E84DEC9CB0840520D78FA7F9A7C2071E28CD20EC7649
-B991F3818CDE295CDB6085F24FCF93147E9F4DD084FBD32525326D2EA147ECD5B6C9D9F4A7166663
-AD18BF234E9CB92FF72138A8A49E73E527E9A6488A4CA808AECABC94D693CD2C0C357D285F65006F
-A2F9197F61FBCA6EF07B013E2B558AB531D2FD270CEE7FA8E467FAB885E90C5884843AA08E2BBFEA
-0AA575643727BA18ACC499FF34E3438645BE2AA71EA491E54687CD305E12BBC94FAEC848311AE816
-495B013BC5075A2D2AE54A7AD7C9105B64356CB51F18C2C28E3A83B9D81A4554DBEC9BEA9A660CF7
-E1BA89E6D4DFB3EEC6A3DE3FCDED9B2D614156EDAE8CFDAD5FF0EFEE31DA3E6A54D94CE9453A1CAA
-D9756D91BE85315F6514BAFBC821EE810BB5D8E1B8F05F64F3F72C4B35D424F7E4DC3AB581B74ADE
-B6D6297CDE7AA8278909F269FED79B7DFD39B1C0338E01D556C4DB9CA3A8578ACE3EC3D743ED4B9C
-0145E4525E8C315F7A1B98584B975C70F0D415708C8CCC13F848B1D36AC8249B73638F95DE0CD27C
-7EFB52BED4339EBDA4812564D7A77416DDF4CC88CFB52D07A252D89353C6826CA1832A153242979B
-6CEE783ABDE65C8B40CF4EA7B42B8DBCC0E02423DD693108006F6A4AEBF053B666C3CB63D1861F86
-EAACD43BB9BB6F2C3A17293C189331D253B447757EE7CBF4518BABB73A1D44874D7F0625E6A013C6
-08E991B4AD17A9ADB36740D25E3E35B459B422F7370B134CDFFF3F3BCC4C32B4E9EBF6A2478013F6
-6933A1FA9403A2F1161EC632F1F04EDF95ED0F33DAD9665D54DD9DB2564E51DA7B65978CAB50D6DC
-1568976E83B056EB0E3A6758518B6E17E9EBFE49B72EB148B472BA144BDC2AC95744C9BF1258F0A2
-E47470AB0EFF90E190A41108914AB8C1ED6B11E0681778521870E80C16AF2AFC723CAD8719ADB62D
-3939D3BC8CC1D8A4E07E9D734F54ECA33D936D2C39D5C8055739C33E53359BD40E576C11E93B4B4C
-122BDBC9B1BBF44243AF4F0BCDBDFADE68C526B5CD74E29CE3F70D62BA83C489034111FE8E4DAEA2
-F01F9D938ABB532DEEAC0E329F42453FF5C15DEC2AEA8C198323C9E8FEA55B3F5DC4751D2E2E16B6
-154E7F2ADD46860E9CA71DC114C99D80E7EA1DAB51E925DE161CEDD678EE6282AFF38E3CD0E65954
-9C970613209955A3F581E1ABE485E56402A3DB0D1E9B8A9DFD05C4B0B7F97FC6D0EED0B69AD6F182
-B1D028ADD2F24463834B13F5C1307F91D363891824E81108E57CFD5211F86400D3E96B107F3B1FE8
-9C4908649D04A46DC3CEE0DE66AF03A7FF9F4DAFECDD6DF4D93784CC899B527784DBE0718050FCE1
-85BDE3F39DEBCDD660B2488D23AB1CFF87B0546D02B48E7B7724C9E87B71BF34B5D6640E0F6ECE47
-B182D41C89461F712849C6CFDB7E3F5EBC1ACDD12D65A422BA362A8FD6CAAC5104CCC5AB5FC04A46
-E4309ACAC83D659DDDA256CCDDD1BFF9AB3622450C4FBC89C82214F00C42FB0311BCB1B722A691ED
-839CAF9024FB1671F18E4639C96D84718C663A4341DEC037175C6BBD288BBF5A0478298CA726567A
-9B74C32A527339C666A294A17F6821CBF243D13EA4B1603C292953308B566653423E7301A032E5D5
-E2B93F1C1434893633DD19501AD12728B5A1D9D36635B589FA2E151140B543D7C5E469AFAE8E80C4
-FC1D9CB6C3823CC1BB7EE40AECB58CBC1465792226B19E0FE79235115F6A3AFE19F98C5DB63D372D
-D7C041CD940F4F79F2474D9CEEA0334FA04A97DC9773064895CF11CF73F11B4684F06E48F4469F6A
-1AEB2CBBC52994DFAB3319DCE3A0C8C2EFA9627496F8CC84D3DF3BDC4FFCB61672780F294F453278
-AEB9262E66486856D37B7647141A82E049364ED3D03F925284A3F1FA3DDF4C0B48B3FE22E7DF9ABA
-239D33CD300FFA8FD4B96192BD568FB18D325CAA8E1F1FD4B27527417B034841FD49E4A77F217062
-3CC8B22101166D80361EB15FA9020D24F61007B0A8274DF9DFCD8E97C85568E76D34AD5DB1779B02
-F034A69CCF9D4EBAA188EB3017EEF5B22A0A552696A574907F695098BD8A4849D5C8311F129447CD
-7A3CF88B8191AEC0AFF30A38A9AB8135608A7829207A7D242F6E1FA7DDA19F5E4C28560D42DB4405
-77CC0C5F5803EEE897103ECA0BD944E320AC26553BEE7852EAA733BD13DF760056B2F5BD1243BEDA
-BC3C1EA0531017D74B47E18F801A60074D6DF849FD0532234545E5B5E112D1E7385341D39A89551C
-80DC2DEAED5D5DA2A4BE5015D297324E92BE64C68428132E6EC654DD4BDCC6640C68835FF8A05E09
-9604B8CD43D3AF2B2FE10C8AFEDEC5A70AF8509D12F662338CBF166D9452CD36331758AC4F4CBD7E
-DD52139AD27DC52569877FE709F297444C4F31899D1945C81B14ABDECBF31DC463A4148F04EC4FB9
-703C158216C0FBE65CCD450043ABFD4E65BF8B28CC148252E9F3E797EA0B57B8721C94CBC2EA602D
-F2C57E87938C887A382D2659226463BC7D6A1DA87F4A341A59BEA458177D3F18D1213539DC0E301F
-6EFE0111FCF6921368BE17CCBB7428127E0C059C2C5ADB2A3F0197F0CEAB77FF7F3C027A8EC3EE76
-CF5C986EB47CB60561C773B3A2DA47B5A35394E29373DBD5C3FF4C9213A89AED77CC4F3FCFC49EF6
-EC7557C521979A546983C106B3627B5FD2D71CC5F08A32BF49332A89C5DA71AFBFB94C949A91220A
-B1F885C981423AF93F73BC1CA4D92D9DBAE3EFE6A76E2DE3D0F74FD3255820636E3F1A6B7C185306
-23C12AF90CDCD2C0A728521E9B639EB6345D1DE8FFFC3B19C72E7A93823DFE3115E9E7BBBEB28CB7
-3DB121AED8920D47D8CC08EA2E472E39A4CAD5881B5C4204F2B732AF9D5189D25ABF413CC78714CB
-01B1D8CA5565169A919DC481F6D2E67F1D490AEBC5CC62A8F62C1A323EBB55ED35AA5C8D6F8B970E
-93205C2701CF4817BDA994FC16197B469ECC5F5E9DDF0FA05640C2E571849571CBD26402B1EB1E80
-3FCF423345007B9B52B13E3B034E8CB3984B925EBFFE719ED4F39F3D0E3343316A6FDC26BDBEA88C
-4366D3B2F851D2B244CC4408251AE2C77348CCE9DD8BB9C89800B572D38C5D1CC34C740BEEBB5DDB
-0A8BB251655FB989840D23205D16311A9FCCF7C85F6DFFEA9704492A4E7A8F6C0BDC29745AAC2ABF
-AEBA02B0E7AEFEB92BA63AB0DF844EB09D505C3DFC1058CE42CDD8043B76398401E1DB862FF9F76C
-05E8BC6260A4443CF494BC1755913D51745BF45ADF2F8C7A9546D7EF4FB11E9D94E4539632C2A396
-06D04480EE459408D7A2A869807A4C01881C1BB21C296A402B5E6E07093D833C3DFF075F4DD426EB
-87B1B8DE16C146DE79F52F5943015331EEB852809CBB8E1D6460AC4D176FE96F8D19F6CCB22ABBBA
-A27C4497D91312C3CFB5BB913B314E43D2EC6AB6897BA7C34CF2CAA6DB4BD69EB5DFCEE0AA917D69
-50E36A68A4C22A60DCC69379D47544A58D640EB10DFE120FCA843B588CA8B94F7869F97609A6FE03
-AC86EC1F7CEAD2EC8E81977D1B946E459DFCFEFE65A7BFF67E66F5F78A45D8DF65AF0146DF74E024
-FC042328886CC1DD7779F49CDBB750345CF83CD678A6A8897577299DEB38AD665DC4F21CE1892A18
-C256F318107DD3E9245C1AD3BC93CEF7B7BF057E33EC9A3F953251261AA3D1A8347261E70A46F777
-3A84F3D4D1A0DF6DD22A96429349DE0D180310E17955B10FBF53220EF6483D03C650A8D5C16D63DA
-F65C21ADCD6C2D0B5D4ADEB2F5526AACF7CF42F9A8BF4832FB2D4F73F3D5FFD984B572232F87BD3E
-59133ED3D2FA19F7856AD812515C74F7D851574019C532C25F8E163E595FC9C83E3E820C3CBF690D
-A62578A980FC0803EB6DB9B1E90E3256BD4650816ABE5EA86CE65C2EB418D0ADDA5F3EA04E17AA8C
-4536CC471AC20236E66ECA3619F161DFEFA485386C30EBB86A7AD930FD0AADF2DA69DCAF26C0F677
-206E2030E3B15B3662C0AD03DBC1636EBFAD1F2F2C37F5FA9856B0198C5B1D80B69C5EFFD94CE071
-5135C649C26B9BA1266B0A5B270CD08A706166C0B320915C87B27DE21DEB5D7E4806F6E700B7A06A
-4E29B629CB40761983E9CA8E34E869ABD04DDA190BFE5A6EE8B22D7E511B84EA584A84211F27AF89
-18DC5AF8A1FF2D360B6BE3CA8E66BA4CD2CE6A25E7E89406684DA83FFBCCCCBFD0844FE3BECD7DE6
-7764C59C022DB1168D585FE25073FE00E30218D1DFE115CA1FC606AFCB04F2A082EF91788B6BD096
-84DEA31F20034A91AB9D971366F97B5009FEFBF1EF0AD941654081B1E8F0B2EA495069A1DDF11DC5
-6857D29533DC857958B49D1A0779732819FD22E437084BD9F3C4F2CDA4D12CA14431937AB63A03F9
-C040AF1D801F367ABDCA7302E18A9050D6026FBA5A5A7FAD44E31593173CDF277CD737D1CEF59FE9
-684252BC0DDD00A80E023B88222494C1C8C0884230AB11D1083225AFDCDBC1E24D4AD5FAB396D2E3
-70E44A7571B230660D510A5076D8E35F7DB72C0566DFC119EE1B8AC3C0406950A3C4A4DA36BDE297
-040A27F70753A87E6CD593DC6BE9962261A99AE5949340C5D45C94A9AA3DD636CE8B497BBB812345
-7C824F443A53B3EE595C38983FE3E07DBDC6ACD55CAE8BE1081AFD4857A5F52A3C925143507A3C37
-F1992CF72ED0D4C48D94AE6CADDC3BC87AC3A3EF035E02181F78449E4B063B0835E827644051551C
-1603E2EAB5875F28FC77BEBA6923428D5521C698C6B7F133B0F689F105FDBAC30A8ED2F29F0255DD
-F8A037B81F04EDF004CBE639C8DB0F94D0C5DB92D34D66C2FED66CF8B895AFC4E659D08388EA44EA
-E83CE459E5BE306750A682B627802990037157339BF142BCB9C08FAFDC3C3FB16DC3544F62C6C7E3
-3E20CC4FC7CA21E2C3F6C546CD78DEE348F1A4C8CB548EF20C049678916771D83ACC9B7B22784AD8
-580134471A3C79BC86B5D6D0D305C32E6204274351C94F9DF45D9B2AD5B5087A89F90D6AA033E4B1
-D1BED022F36147C7ABD2B73134DFFD50907258E610C3B20949E141172B1C6A76DB238C375021CBA6
-645CDC26B717428B5A9B4D3F32A4B1E22FEFF3BB93FD889E1DEF8087718D5E3E650FE4A3330DA9C3
-7E9EB499DF5A342D8BA4C0A033C3347CB25A31BE143ECBF91384F2381E323E7FD3A82A3197C18905
-3200AE2C86B9D01AB0B289841EA7E9E9A26966E0DEF54DE0B85D8DF084B8C590081E444BAF1E1F60
-670FA12AB97159318624F2AF1B5EC7DD83C1073A99398D2143A52D10A13C201FB356BC9E90C63BB0
-BC2D4C42AF4A8B9C8C4D58A1B32E0597C63B3F8B3E893BD3BE8C60231838F1BC78E73A6C8CDD5E7F
-2907F897FC8EE99BFFDA7338BCEFB5AEF950E5549ADFD207AEB15846B509FC57989883642498A381
-1B8E5CDE69C05924EFAEC232FA4CEF302EE3251366ECAEF57D25CFA3B4A9E6397D996F421C900BEB
-CF73B038FE7B16FD0A1172AC2F40D19CE0B02FCEB8BC47DA5344CB933C7FEC950184F78ACB32D3E5
-E290E84BE753B9E7A7BFC4416CCF29D023760C06CDDEF2505806A65E1508990529245059AFD301DB
-669D41BD72BF7A80A9DF66B876B3553FDF4DD38D15289AF7A1AFBC53FFFF135A6348DD784AB42A6C
-0D6AA330B069607E2DF3CBEFCE79D6F63E274C9E73A33EB85246D5EBB986BFA923DF68B2B8CF82AF
-6C33E785F35B25B1D1D614DE85A4F4510ADFE42D75B5FA5408A59ABE53859E28B3D000EB9C6A7D2F
-67C91DD14C895BA87B9CB57B851E5193FCC2A443AF85FE28DF6F39537F23A058BCF81DD8C04CB2C2
-5040300F4C55975E856DCB4E21E2B5481BDCC05601942FB25BB8A6B6F93E2C2A33CD478B44655657
-C557EBB080179EE5D98C5CEBE0B25BFDD952FFEB258014D7A5BC4BCA4F1A23BBA73C454B12960451
-CE1752401B0151CB2E01D5C72595095EAE91D8D3BD55A54A2AEA89239FA176FA7CD6F16BB0733EF6
-CE6E77763A23AAC77DA88C8EFA7BBB2991E472FF2075FB25A75ACFA70A04C28764F4AE4C12051B25
-B120CAD2E3044DA35C1F94135DBD69B10DE147321CBBDC814CE99982AC1D76CE3D3330E41AB31F3C
-76BF89B95EAB81AF3464C732D5B1411D97DB36C9063537F64756F205B16ED7058E2CB1D6946C00A1
-A0CDA9EBBE924BDA6C7D7B605C514A98133907B793C74CA858E82DA3519188CD974B34DAA74265DB
-5BC8550D5F0B1173ACEB87458BCE2AB1F96996C811699A0FE4A9B849D39023725E2B1EE7E426D30A
-6C5C75AE6BCEA6DB41E4EB2035F7F924E6B9F0DCD00EB2BB014222E55FE387FBF5B9B7C04F4688D5
-AE3529FDACB38B5EB0AF5C3A874C1AA6B17CDA8D1E22EEE05A3DA88449200D3D0D002DB86F6C51B3
-37C8E19F338E7BFA01E1202612D50E210140947D5F350E84F790286C3F679A5D7E43BCDC337265C2
-631527FD62D598B7CA1F5835C0441881B97F5197901ECDC4F195BC665A846823D2E41417373F8639
-567B228FE7B73D781F07A361AA49C3E9D80FE5B2A32C4C1E575D194E841967B08D10405FA44EEE28
-47DB9372C5CC931E50469532F1BAF577F680BAB4E30B7E1CFFA8574ABB679789F69A8A1BAC07B7C6
-4EF5CE5EB00E97B36FBEACA9BBA4A13B0293D34BDBC77AD1FF88E5744AF009823BC262511C4724DD
-585E7E17D90F230F7A5861B0DFC42F0B4E49A04EE0EE4DADB908479DEF8372F334C53D2BA5D855CB
-39DC7C9550F9D0F7F77E82D5A59FBBF34BFFE92DC9E6668B68FEEAA4F20053433D6749162BBAC5D0
-D428DCF2D58D49B127FA2E674EDC7D3613B1342F4D0ABD7F4C5B049FBF78E804D5F16505AE7EDCBF
-4D6FA08D72890F5D55199034572AB4B0C9A7E7F6F5A403198864ADF113CAFF5BF9D4AB5B16F81D0F
-C2188FC80875E10034D12E30C0364F8F72797F1AED525A2712A40D44210B813DF5A29C84E9F6D51B
-1D60A5F6F938FAABF878D29E6AB252D95D05FC1ADF5D4CE1C9E585219112112BC6CD5C766411FBD2
-2731794B5DE0A27AC57D3C57926807469C360372BE529098C350EFE2154B87F1205A57A0B04C5206
-CC4FA66B8793BBBE492CC3271FB4F90A28D0066E0D7F63B8DD01549A05AFA5482C29560ABD628568
-75CAC16100087540162473498C14087B29B86B7BFAD693E81765CEC781F3FC80E9C7B410E9B55B88
-114191A1703C638DFBB469ED1DD8254B1407003A319CE74AD419B077F17047A01F0BC0AC8507191B
-F72D77D9333C9DA8C9DA733EFB5305F49CB8C7BC451321ADD7D896395D269DCDFDD084EB3AA70338
-6C0697E962929651164135C094D9BB1C9B949D5EEBD3BB17F02C98C813CCBFB23C2C26218A2F4C63
-9A8B9DFF2C29406037F91938A5E1227310728428B56F48108CDEB33BD3191ECA89F947271983DB77
-6B2BC897A30EECF2601EE3B2A6F0E135397622AAC1F2DF523CE6E6BC720E13CB530CEF4AB9C8273B
-D3D81563AC8A8E6C44A195112DAF824BC7A72FCDC4E129A480717BEB01085DEE65EE4344D0B41EC0
-BCDF842566B1D9F5353B1F6A063FFA6CDB06EF634C8BD5A7A63F991D178F56EACA653DD67685CE49
-E98C7554745A4AC533217662D23E1D6937135D13BC2208EB8D50560A2BAAC319DFAE478B6BA4CA5E
-DA20222F0E9BDB0806320ED1665B54A347DE0C42E9F77842DE4D188E7E824EB2F0D7AD163F05480A
-7FA99C5A603BBC5DBC843774CA66E889B945054C0ED0B1A4BB14324EF901B023C208CB95DFCE9284
-89789690CC45BAB97BE449F8E2F5AA9276C0571303E9788C46E7F789555BFCDC3FA9ED8DA8AD9BA4
-8B3AE09404664391E63A989EF1E24BB464043AA099E4F2D796E352EB277106D8D81BAF2F8562EF46
-BCFD1E0047E8018CBD973021DC1C1D821AF03F083F0B088A62EBCF2BF6C5B0FCFA441AAD1625FDB8
-34F943DD47A5A42EB3E9A5B49641F797C288B799A64897F1346070461B6D535E0C4ED099199C387A
-3176AEDC7DA7E7D9E118E55565092A36F7C74ABF281720C0147F4E4F37D49436466C61FF12764E30
-43D8A6D027E70537164F0E7942F4ACA42BB2CB136177EF7197E76F49AB403F741C0EF902FEBC471A
-D6C627424320A8C3A1F04C310C511B3F91C3937D9ACF459999C18A33F2C852EC38CA806599C728C5
-43714018C65E2C5F430F6270AF52AD71ED38813B60440779455F9529A4A1623CB9F5422B9216F9CD
-BA913B9A1CD95DA225E254E8101216085020660509D03A034B5D7E32E3DB5E5962A9A27711D4C3E2
-9CD84057F7D0D7E8000947AFE896F8523253391D2E11FFFE523366B05C532D5629A90741EAB3D4A7
-31D3F6D4F03FF93233DDF88BB1913ABA22EB9AA6311E3144381DAE29BCC8639958EEE59ACCFA06F3
-5DCCC63E0609F542F3EE5DFB1CF718CA3F328455726F8F65E23ACD970E4049225998371B63E35AE9
-8DC54D8329B8DB0901FAA63129EDE21B158776981D4D094013C096E9CD020315D123C03DEBA21E97
-E4B584B4BC0AF25F5DCE53C2DC0F3E61F99BECAB40799478BE7F5AFD7F68E23EF50AD6645C967EE1
-1206B6E791769428ACDC370D64E4F2B3972E0E4F442297199350663D6E772FC6777A9B9DE215273D
-082CCE4E8678FE9948DC8D5B0E459CD02F1645AC5620F3571A40B4D5A17DF5CFF48B6C843DDEAB5E
-BF58FE13D7DA08E8AA7902119248B3B151DA583101CF80853B0150FE05BDEDBFB50A7FB0F65728C9
-3B9DF48CE8AF1DF1FAC25C1D58E1AD30274A00EB54CF2F16029E1AC0A0919C0655474B9A6936AEE0
-FB74BD185FE7D70BB84786997D34A40326A74356A4AFAEE67B6B26D1C1A7BCFF8697B55C816CCD77
-312C332A55315DC54F9BC0A0F12500E0A76B3936292A3DA2DDF5AA8CBB9B5DC32EDACC4827D684D2
-74E65B8B76FB2C2B19F7D5607523FA953E34BB39032C05B1C1244304606C55660D3CA8607E764EA5
-B03DB7FCAB5CF7788C6E60EC8C449BCAFD90BCABA4132B6CBCCFF16784FB59B36B77CF0A9EA572E4
-CA0A01C725A6CF2E4500CDDF5BACCB9094D48925434F044118CFDC2696AF5FC0CAB3884107ED17B9
-BDE0C0104B1292A1F8C99B06FC4A6360B24480BD59DF0488641899B0F42B1311B582717BA7ECFEE1
-4143654B5371C8B9B2D80685AD38D897AD1E64875C28C7020A84FBB3A3BBEE16617DCB9BC822B7C5
-9C5A18C0CF7E80163ADFB7AA03B7CDE8497C1697D90F2ED90F813095C5B91657FC294EF0E341DB33
-92ED860CB2E0AA09293D0F99AE9EB54C761CA2DB1E51E1CEAEAB276C7BD916C68510D72D9A67468B
-09B3C39A7815628FB126CDFD5EFF59CC8184C0D35A5B5960F824BD175495DD3EB12A4E96008CB13B
-8C5745303E66CF8608FF27C4709C1D854EB79608E52F068FEC0151A74C125EDEAEA555C198FC0802
-7BBBB802835E1D435077AE4B1CCDBF722354F6C572BEB1376D3E342195FA80AC9722EB2F46E44DE0
-5F5A227B731B8D4A4B6EDEF04AF2C5DEC2EEF8FF48C5B18710ADE3DBFA0C956505B6DA9CCB7CBB83
-4DB6CC754948855D833670FF0AC42A4773FEA8322BECEE04CA74AC2D66855132D11A51524488C547
-71B5B7A512796D7D7AE0F9C1FBC9CBDBA0831074F4D200349D0CA40537B92496692766F020AC43AC
-01DB8B2AA2EFA9D21732BE3A315F6CAA402BB2E61D40DDEBDE11276D90C2C601A935C168BE600464
-76ADED15087D54A14C68EECBBBB590927C1E10D291C9285334CB0C80EDBD392BDE4D535EB61F8E76
-41F58AC1DF5B1C5A5D91E3E27E05CAF7EC97ECF0C85B6425197AA856521ED701E5AEB82A7F52A8BD
-7DC97D5B3FB5C99A5DF84D1BAFF89072922509D76BC6EDB15CE5F9EB8F4154BEE1E82020240283BD
-C83A8E49AA9A2649B7955D5C058F2818A63BD0BFE7EACED4A49063C489A626277AE1246F721C9926
-E2A2B6C31045FBCD235F3CC58BC4DD6C57FE998EBD1E9FA5154652BE3A1685BCD2EFAA079A3293F7
-8142A6473822FAB627927EACCD61B3E99C3077103D2D19382BC7EE15BAD0FDE489602D055A01DBBC
-F91A566974559D1B477C209416887053169C3F8F59955BE4DE82B60558CC9AE15602A93F029F6B43
-29E0E62A03982DB32F5229714EFA1491A7B24AEFE18FEBC2C93DFE50B3F641B51BDD33DA38871BF5
-243C17502D00AEA2D9E9734E80A96788D4CF5BC12A42BC386162FC88A7435EE13200C1C2C6CCC5D2
-1A03941007B4C4291BDB711446CEAF27148104BB240357D5EDA0EA5A5CE27D4A83909D75BFC05D75
-F10AA74A6DE37D7DE15C1DDA3AC3045DA6CD48323D904E716B445E5E096FCB379353ED70CF4B6FAC
-102C762711079EFAF13FB74C9B47AF75F3F6BDA2A4647D2AB47ECAB64DA6CC01479F618E8D2D0A36
-45445E8744683CBBC560D47C98078B84206E90EB839B02D37C852B8E284463D4E4D890203C3D5B20
-352110034EAD6BD7F41456B807E1DB1631A9D499E52E9D9853D86728B1A2E511F40F8CA1E4724A0D
-17ECD640B52FF6C66E28693D89765FC391612E5889E77423EC85CBD0A038B6BA98B607701DC0C4B6
-6B3B28C7790A1F1EB8D051DC98276DD9CFEFAB3F65C1C928E48A060C992B392A43E56EAA6DED896D
-EBCE71F8245BE4687F2F1B8FC0F43ECE8DB0BD0AB0811C5CE73CBE336023A0D66168B34A95B4B0A7
-50B3BF1D197E3C042C7914FA731D7831AF798E9429571CBB977E6258244E84701E5FF91D608F98FC
-3D68A4EE5B81D5FF38B6C184F6118B875F022B4CE207DC7B37E1452DFDC591A3E506AE82C7E7BFF0
-011B0A3DBD616A993FBF878FB03B6C9F2055A2B095D29361F8253C2623653687FE0AB98078F6AEE5
-FC2C2BDE0405EABEDB3A33EB7F04CB6837176245F190C6BBBCD64522B12FE7F9CDCF201A1AA8A19A
-7BBC4AC064B4958F44AA0F8DDA23835AD28A1FD0EA105DE2F395385DCCFBE2261DC5A89A23AF606A
-3985E5038706B1FE0910400E16BF008F250F3BDE3AD806C735495D499F16F99275010478FD2127BF
-7CEDD6B5BD505FBE9BD0065B4A7090C9D27CD5B36C3AD33E1B31EB6D44E375003B51B909DA50BD18
-218418B3CD22B43278B144BE78406EAF16C7DF6B6C1C6238004AAB73736B38E168441DC16F9A5CF6
-0793A18633BC43D78674D12D38CC979F7CAADA6EFE807CEA499CB9FE616496682A66E04BBDACE1DC
-112B2156B9B0B20A58A8CB43FF0EEDB99805234B9A5789762AC7D65F5A319C33F4F7438CD15E06BB
-80A7A97E976E8CEC23F4C646A5821880A82B2F1DC27767F090997E91488BFA15064B702F864FCE65
-05D6CEF87D2A0A12B55BA189AF269811E3B8B850C8401F3906C080D32618D9698A766732A40A9FC5
-A94E5BDDA3D028D823D6B603B6D17DD046DE181FD989EA0F80B4CA62F7973E4DF5E032A31FE6BC8F
-5CDA678D4A72787EB8253EA5882C337CDF9AA3E1E7D9536DD09B047CD8962E773F72F6418A3AEF5A
-289B3406C152A50CE7BD4B493FFFC27F6AA52F79EA67E362FD92559AA4F94A2F787F6C735DFADCF2
-F08AAF98B80C53CA5607A94F25F04AA65A70A75937840E73055B3D65FB054C63E2E48E68488C9315
-A13EE949E03E46723C11CC759D222CBFAD2E1A87CAD779B23D38F7E2F660DE1388EAF1CF4D18994D
-75C6CC63F187FDB949940C18B537A0AFB12AC5F67B0283CA5EFE2E764C4369104B9D3B06490D1244
-C41D6085C85F1106082EC9DB84586230511C05C82412D2CDF3DAFBF4759A775628878F997415296B
-C416AC8352A6C6988691FCB831CF95C10BAE691ADB3BA2918B35924BD5C3ACAD8B137397B10AF82B
-479800FE16D472CD0CDBDAAB4F882A0649CF561004B8CB7CA32EC129D0A415BE6CB91DA2B65F44E8
-0D138808A127E851A7FCF927E99DAA0EA2D626B77A16C72E37F058A3B882FC4955DC8CB6312434BD
-3BCED75780B13590BF4FE8D64ACF0371F9FB1D361B05025852AAB9EDA1A0C997CFA58052C454FD45
-1E6C1F194F4D363114E312F6DC35BBAF357A32CD200A3DD9654155134259887D677ACC44F89AA401
-CA27282DF7DC3F2F04A108CBEF2558DCCE28BAC2D87B8D5B7181EA927F61977764F882626D4AB338
-D95C9477C54E9C36012A3CFFBE199EC8120A99D2D70A21F9D9A0354E4EAC7947990E8A6E0601796A
-AF6F14E758CABCABDFBD8204A8E748A3E5FEBA570D36E2BF474C0083229A63F96114182321B2EBE1
-BC76DD193724C4588C1D39D184C332FAEAF4C629F2B3B2F49996E46AA6C9F497428BEA52D58876B0
-DC07B460248BC85CC16773A5DAC36CDE8B152D96057F4EFAAF8B1DC10022038577368057699B3A37
-178A9F1F6C6CC60BAE820B7ADD0717911BD23A6DCDADAFA32473491AA80CFE90F2A77E24CE2826FF
-77B18B869C33FA292FE01D6477765044C7D14A548B28B1360125C6933F05C58B0889390537CDD16F
-8E967E0B38579449DFC1E07389B7069AA8594C5103465D5041CC929268DE863FADB6925B350AA94A
-27D421FB7FCC81C6B35F906F12246B7A5140511A97211BA9BD6831A508E963FE8BE961332F557808
-488F06EAD75E86D60DE3FA2425AE8439ECB9112BC3E4D73747C1C8E87A649919827049832DB0BF6D
-A8C85C9A2592AC002809070900ECAD52A56F1BFD456AFE066509694EAC075788456B0B0BDD7C192D
-321E9FB6AADCAEF00F570F22CD4A5322FBCE8FA98FAEB681940895426270BB4319C11DA67D88552A
-7373398AEC5DA7C9CAA9F3B34581C6E968DAAAB2751CC012199DD897B448986CFFBAE4D412BF9ECB
-F46742715A9569932516259D3B3A5431CD7028E42FC751C434E2B714C718202BF02CAF9B8A2075DE
-922322EA7CFA605C8376FA958B8FBE43031E1026FBE6126A3775F643EA67EBBD97F239FB3C435526
-75CD08B19CA5EBF53B40D728556B4481C7F73EC71CAB0F89E34D60C69B272FADC22E8E7BDC6210DB
-09FDD913E209F49FD28E8712B8508904620250746CA3B21B026EDAE60A2822F59E912E626B93E0D2
-BFB3230DFD0E54E91A1DBA25A609B64D41ABD897A5D21764C351E85F9E87BEAB9E645149AD32AEEB
-B3B1161032C701647115F98C1C2AAECE871862D91D321AB90F3E923B1FDEE00D927F897AA9812373
-6536E2E0700F10053D7E6C589BF66029D794883EAE4C8228941CE96565B50D48887B5314A2E55379
-59638222A6CA54C77CBABD460DAC11B063519AE4F50D93DE41763BA7CFBF4C7724360E750478EB62
-8921DAA065858341958E4F3EB5966C6DD77C05EEECDF4B5F6CF19AB507589B4219377959BD258EC9
-21C34FE1DB003F7D0FEA3E2FD6F5DDB0A2D62CA5A2CD3C7AB457DFF25094EFE04A9E1B9CE7AE3F30
-026B1CB039228D309A22899F6E9B9BFF922E117123347967D7C62C670E2C74579C35989925603022
-C17B1DCE378031ABC9B4B437C7B6E64620932E93189754C01D4B280B8B08699B2CA953AE4823BB9E
-E34133C5C95B3290E1BF010705AD852C72BE87291E1034B09F44A95B6A2F83FEE8841DCF661770AF
-44D0AC7F9CDB280939FC5D953D525E0B41B7BE188D5C794687330CD770D24D9CD53B895A253004E1
-8A31BE4E82B384
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-cleartomark
-%%EndResource
-/Times-Roman-iso1252 /Times-Roman ISO1252Encoding psp_definefont
-/Times-Italic-iso1252 /Times-Italic ISO1252Encoding psp_definefont
-/NimbusMonL-Regu-iso1252 /NimbusMonL-Regu ISO1252Encoding psp_definefont
-/NimbusMonL-ReguObli-iso1252 /NimbusMonL-ReguObli ISO1252Encoding psp_definefont
-220 265 moveto
-0 0 0 setrgbcolor
-/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont
-<636F706965292E>
-show
-295 383 moveto
-/Symbol findfont 50 -50 matrix scale makefont setfont
-<B7>
-show
-370 383 moveto
-/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont
-<4D6F64696669636174696F6E>
-show
-671 383 moveto
-<6475>
-show
-763 383 moveto
-<66696368696572>
-show
-934 383 moveto
-1 0 0 setrgbcolor
-/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont
-<534D4553485F5352432F7372632F534D4553482F534D4553485F4879706F746865736973466163
-746F72792E637878>
-show
-370 443 moveto
-0 0 0 setrgbcolor
-/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont
-<706F7572>
-show
-479 443 moveto
-<72616A6F75746572>
-show
-653 443 moveto
-<6C6573>
-show
-726 443 moveto
-<6E6F7576656C6C6573>
-show
-935 443 moveto
-<6879706F7468E8736573>
-show
-1175 443 moveto
-<636F6E6365726E616E74>
-show
-1411 443 moveto
-<6C65>
-show
-1466 443 moveto
-<63686F6978>
-show
-1595 443 moveto
-<6475>
-show
-1662 443 moveto
-<6D61696C6C657572>
-show
-1846 443 moveto
-<74E974726168E9647269717565>
-show
-370 499 moveto
-<6465204E657467656E206574206465206C61207461696C6C652064657320E96CE96D656E747320
-766F6C756D69717565732E>
-show
-294 601 moveto
-/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont
-<23696E636C75646520>
-show
-520 601 moveto
-<94534D4553485F4D6178456C656D656E74566F6C756D652E68787894>
-show
-294 645 moveto
-<20202020202020202020202020202020202E202020202020202020202020202020202020202020
-20202020202020202020202020202E>
-show
-294 689 moveto
-<20202020202020202020202020202020202E202020202020202020202020202020202020202020
-20202020202020202020202020202E>
-show
-294 733 moveto
-<20202020202020202020202020202020202E202020202020202020202020202020202020202020
-20202020202020202020202020202E>
-show
-294 776 moveto
-<23696E636C7564652094534D4553485F4E455447454E5F332E68787894>
-show
-294 820 moveto
-<20202020202020202020202020202020202E202020202020202020202020202020202020202020
-20202020202020202020202020202E>
-show
-294 864 moveto
-<20202020202020202020202020202020202E202020202020202020202020202020202020202020
-20202020202020202020202020202E>
-show
-294 908 moveto
-<20202020202020202020202020202020202E202020202020202020202020202020202020202020
-20202020202020202020202020202E>
-show
-294 952 moveto
-/NimbusMonL-ReguObli-iso1252 findfont 42 -42 matrix scale makefont setfont
-<63726561746F724D61705B944D6178456C656D656E74566F6C756D65945D203D>
-show
-294 996 moveto
-<20202020202020206E657720534D4553485F>
-show
-747 996 moveto
-/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont
-<4879706F74686573697343726561746F72>
-show
-1175 996 moveto
-<3C534D4553485F4D6178456C656D656E74566F6C756D653E3B>
-show
-294 1040 moveto
-<2020202020202020202020202020202020>
-show
-722 1040 moveto
-<2E20202020202020202020202020202020202020202020202020202020202020202020202E>
-show
-294 1084 moveto
-<20202020202020202020202020202020202E202020202020202020202020202020202020202020
-20202020202020202020202020202E>
-show
-294 1128 moveto
-<20202020202020202020202020202020202E202020202020202020202020202020202020202020
-20202020202020202020202020202E>
-show
-294 1172 moveto
-/NimbusMonL-ReguObli-iso1252 findfont 42 -42 matrix scale makefont setfont
-<63726561746F724D61705B944E455447454E5F3344945D203D206E657720534D4553485F>
-show
-1201 1172 moveto
-/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont
-<4879706F74686573697343726561746F72>
-show
-1629 1172 moveto
-<3C534D4553485F4E455447454E5F33443E3B>
-show
-295 1289 moveto
-/Symbol findfont 50 -50 matrix scale makefont setfont
-<B7>
-show
-370 1289 moveto
-/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont
-<4D6F64696669636174696F6E2064752066696368696572>
-show
-370 1349 moveto
-<20>
-show
-382 1349 moveto
-1 0 0 setrgbcolor
-/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont
-<534D4553485F5352432F7372632F534D4553485F492F534D4553485F4879706F74686573697346
-6163746F72795F692E6378782C>
-show
-1651 1349 moveto
-0 0 0 setrgbcolor
-<20E971756976616C656E7420434F524241206465>
-show
-370 1405 moveto
-<6C61206D6F64696669636174696F6E207072E963E964656E7465>
-show
-906 1405 moveto
-/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont
-<2E>
-show
-294 1507 moveto
-/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont
-<23696E636C7564652094534D4553485F4D6178456C656D656E74566F6C756D655F692E68787894>
-show
-294 1551 moveto
-<20202020202020202020202020202020202E202020202020202020202020202020202020202020
-20202020202020202020202020202E>
-show
-294 1595 moveto
-<20202020202020202020202020202020202E202020202020202020202020202020202020202020
-20202020202020202020202020202E>
-show
-294 1639 moveto
-<20202020202020202020202020202020202E202020202020202020202020202020202020202020
-20202020202020202020202020202E>
-show
-294 1683 moveto
-<23696E636C7564652094534D4553485F4E455447454E5F335F692E68787894>
-show
-294 1726 moveto
-<20202020202020202020202020202020202E202020202020202020202020202020202020202020
-20202020202020202020202020202E>
-show
-294 1770 moveto
-<20202020202020202020202020202020202E202020202020202020202020202020202020202020
-20202020202020202020202020202E>
-show
-294 1814 moveto
-<20202020202020202020202020202020202E202020202020202020202020202020202020202020
-20202020202020202020202020202E>
-show
-294 1858 moveto
-/NimbusMonL-ReguObli-iso1252 findfont 42 -42 matrix scale makefont setfont
-<63726561746F724D61705B944D6178456C656D656E74566F6C756D65945D203D>
-show
-294 1902 moveto
-<20202020202020206E657720534D4553485F>
-show
-747 1902 moveto
-/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont
-<4879706F74686573697343726561746F725F69>
-show
-1225 1902 moveto
-<3C534D4553485F4D6178456C656D656E74566F6C756D655F693E3B>
-show
-294 1946 moveto
-<20202020202020202020202020202020202E202020202020202020202020202020202020202020
-20202020202020202020202020202E>
-show
-294 1990 moveto
-<20202020202020202020202020202020202E202020202020202020202020202020202020202020
-20202020202020202020202020202E>
-show
-294 2034 moveto
-<20202020202020202020202020202020202E202020202020202020202020202020202020202020
-20202020202020202020202020202E>
-show
-294 2078 moveto
-/NimbusMonL-ReguObli-iso1252 findfont 42 -42 matrix scale makefont setfont
-<63726561746F724D61705B944E455447454E5F3344945D203D>
-show
-294 2122 moveto
-<20202020202020206E657720534D4553485F>
-show
-747 2122 moveto
-/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont
-<4879706F74686573697343726561746F725F69>
-show
-1225 2122 moveto
-<3C534D4553485F4E455447454E5F33445F693E3B>
-show
-295 2239 moveto
-/Symbol findfont 50 -50 matrix scale makefont setfont
-<B7>
-show
-370 2239 moveto
-/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont
-<4D6F64696669636174696F6E>
-show
-651 2239 moveto
-<6475>
-show
-723 2239 moveto
-<66696368696572>
-show
-874 2239 moveto
-1 0 0 setrgbcolor
-/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont
-<534D4553485F5352432F7372632F534D4553484755492F534D4553484755492E637878>
-show
-1843 2239 moveto
-0 0 0 setrgbcolor
-/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont
-<706F7572>
-show
-1955 2239 moveto
-<72616A6F75746572>
-show
-370 2299 moveto
-<6C6573>
-show
-443 2299 moveto
-<6E6F7576656C6C6573>
-show
-653 2299 moveto
-<6879706F7468E8736573>
-show
-892 2299 moveto
-<636F6E6365726E616E74>
-show
-1129 2299 moveto
-<6C65>
-show
-1183 2299 moveto
-<63686F6978>
-show
-1311 2299 moveto
-<6475>
-show
-1380 2299 moveto
-<6D61696C6C657572>
-show
-1564 2299 moveto
-<74E974726168E9647269717565>
-show
-1845 2299 moveto
-<6465>
-show
-1910 2299 moveto
-<4E657467656E>
-show
-2073 2299 moveto
-<6574>
-show
-370 2355 moveto
-<6465206C61207461696C6C652064657320E96CE96D656E747320766F6C756D6971756573206461
-6E73206C612047554920646520534D4553482E>
-show
-294 2457 moveto
-/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont
-<656C736520696620282054797065416C676F2E636F6D7061726528944E455447454E5F33449420
-3D3D203029>
-show
-294 2501 moveto
-<2020487970203D206D79436F6D706F6E656E744D6573682D>
-show
-898 2501 moveto
-<3E4372656174654879706F74686573697328>
-show
-1351 2501 moveto
-<54797065416C676F2C206D795374756479496420293B>
-show
-294 2545 moveto
-<20202020202020202020202020202020202E202020202020202020202020202020202020202020
-20202020202020202020202020202E>
-show
-294 2589 moveto
-<20202020202020202020202020202020202E202020202020202020202020202020202020202020
-20202020202020202020202020202E>
-show
-294 2633 moveto
-<20202020202020202020202020202020202E202020202020202020202020202020202020202020
-20202020202020202020202020202E>
-show
-294 2676 moveto
-<20202020202020202020202020202020202020202020202020202020202074722894534D455348
-5F4D41585F454C454D454E545F564F4C554D455F4859504F54484553495394292C>
-show
-294 2720 moveto
-<20202020202020202020202020202020202E202020202020202020202020202020202020202020
-20202020202020202020202020202E>
-show
-294 2764 moveto
-<20202020202020202020202020202020202E202020202020202020202020202020202020202020
-20202020202020202020202020202E>
-show
-294 2808 moveto
-<20202020202020202020202020202020202E202020202020202020202020202020202020202020
-20202020202020202020202020202E>
-show
-294 2852 moveto
-<2020627265616B3B>
-show
-294 2896 moveto
-<20207D>
-show
-294 2940 moveto
-<6361736520353032313A>
-show
-294 2984 moveto
-<20207B>
-show
-294 3028 moveto
-<2020736D6573684755492D>
-show
-571 3028 moveto
-<3E437265617465416C676F726974686D28>
-show
-999 3028 moveto
-<944E455447454E5F3344942C94546574726168656472616C20284E657467656E2994>
-show
-1855 3028 moveto
-<293B>
-show
-280 567 1 616 rectfill
-2125 567 1 616 rectfill
-280 567 1846 1 rectfill
-280 1182 1846 1 rectfill
-280 1473 1 660 rectfill
-2125 1473 1 660 rectfill
-280 1473 1846 1 rectfill
-280 2132 1846 1 rectfill
-280 2423 1 616 rectfill
-2125 2423 1 616 rectfill
-280 2423 1846 1 rectfill
-280 3038 1846 1 rectfill
-showpage
-grestore grestore
-%%PageTrailer
-
-%%Page: 4 4
-%%PageBoundingBox: 18 18 577 824
-%%BeginSetup
-%
-%%EndSetup
-%%BeginPageSetup
-%
-gsave
-[0.24 0 0 -0.24 18 824] concat
-gsave
-%%EndPageSetup
-%%BeginResource: font NimbusMonL-Regu
-%!PS-AdobeFont-1.0: NimbusMonL-Regu 1.05
-%%CreationDate: Wed Dec 22 1999
-% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development
-% (URW)++,Copyright 1999 by (URW)++ Design & Development
-% See the file PUBLIC (Aladdin Free Public License) for license conditions.
-% As a special exception, permission is granted to include this font
-% program in a Postscript or PDF file that consists of a document that
-% contains text to be displayed or printed using this font, regardless
-% of the conditions or license applying to the document itself.
-12 dict begin
-/FontInfo 10 dict dup begin
-/version (1.05) readonly def
-/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the file PUBLIC (Aladdin Free Public License) for license conditions. As a special exception, permission is granted to include this font program in a Postscript or PDF file that consists of a document that contains text to be displayed or printed using this font, regardless of the conditions or license applying to the document itself.) readonly def
-/Copyright (Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development) readonly def
-/FullName (Nimbus Mono L Regular) readonly def
-/FamilyName (Nimbus Mono L) readonly def
-/Weight (Regular) readonly def
-/ItalicAngle 0.0 def
-/isFixedPitch false def
-/UnderlinePosition -100 def
-/UnderlineThickness 50 def
-end readonly def
-/FontName /NimbusMonL-Regu def
-/PaintType 0 def
-/WMode 0 def
-/FontBBox {-12 -237 650 811} readonly def
-/FontType 1 def
-/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def
-/Encoding StandardEncoding def
-/UniqueID 5020945 def
-currentdict end
-currentfile eexec
-E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942BF7D6DD84F1664B89
-699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED2AC419FF2B2BDE605B8EE3264EDD6641
-2D4F21C64AC522BDFC7C5502F9C3F3E5592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A2
-5032519D1868816E44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF
-9CDC7A1B1B598C69131DEE005B415805A16D8A123E6A2261C63C769D2F4B60FA2C438AD7D199D8E4
-5F7E7C9A605C8CA14E21FCD81C9A515FB8DB6F99604534D06EA9D87FE0FAA852899C9D0595C7A97E
-6C55F79FAC45CD38E87B10D210CE7501E88C8FCD3444354365FB893A12F596AE2C1E70D5819EE0D0
-87D10BF8DA96F3DABD5405D28C4228C6C31BA4052464859640933FEEFD8071C0C84CDD829A9B1D0B
-A01F25A4D50EE2EA2B45160CA6333B2D2800306ED2BEFDFE155E9D9F9342EB8D5B0ADBF2460CCC98
-643FB1287CCD28ABA7B5CAB92EC39EE2E918990372B16F8487EBA30EAE88708B6CF33B6C015D8096
-C7CFE2F139F52052E3925C0D50FD64CE68236D59CB83EF56BFC584150EC38065059F3308AD6F9A99
-F83EF4E6CB13855C8175E31417D190D036B387D3952344A950F4D8C7781B307A094DF1ECAEE4D2C2
-FD747BC6F7F9C6BD0E90C19294F96C8C5CFE88FB34C477574A1B1630B8CC591529E59B20794DA32E
-61DECDA8ABBD1AE956CF74012AA01D42EE01E861B0AA6897C864788AE59DEF43C493246FDB1ACA55
-4C12594BC7B33657A9ECC9E3D1472EF826073F632BE540C35FF6FB40566773F3BB2204D3A579A08C
-CBC844C14B18C350F003B9DA23A570C362D6003893CA32F86F59B829C78EE3188B6E3F7FA81D7F62
-2825C639638DFB78B7AF1F500F5B450FA54DBFA5CBA277C794ECE93275A3DE0B452FDC8DDC2993BA
-A42F28A636008CDCB03EBF71BDCAF35019778993443F88412AD2AD0D7155A3944606463266322DBC
-0244B07DA1E9C27A27B59664E8566D7A54CC03E995AAD008B0A17E2C3EF61F720CE7F7788599C4E4
-4C709CD5C31B11107F16AD70B17B9AFE2E8CD922A7428DAC171427FFAF51067307FAB0ADB530E701
-FD22DA22C4CD3064067BD4F6089C4B2C87937DD426E4E9D2F60E608288BAC9056554D04947E69200
-61E379CF5E81BFD32FD37EFAC1F61CEBEE551B0851516471A7472C60DF89DAA9EB1DC5A67E479745
-3E69B9E22BAF4E3CCA4192D603295B018C4AB69D18DE52DFDF15E96B557F290A4B8C5B1E7A6CACA8
-1F2351B97ADFC36995ABA43803A6E5AC04A3C93495F6D38106B8B144449C07D1358210F9176E1565
-72363CFBDE576BFDF99FA329DD1346E83F79E06CF68250CA57A68931BC7F342AD295D0CBA17AA95B
-B8EEB53EA6E8E660B814E9F857CECB14F44A43288B69A9E7908D55BF19E844359879D28CAEF1C38A
-36420185D20DFB32C2E002202800E8EF3D67C5D50E919657CA958B538D537D503444865331D79BFC
-40312068D72364503BD0CC84B5F30A74D8B5B6A26AF2DB764564FB65A6BA8F9051AE2B4EA458D46A
-4569F30C6E77DC097356770362E6CF3F1661074778EBB44FF7D1E3B64FF75E77E11FE525BB121C65
-46CFD13300CA1F02D571B82A5825E6226D14FDCF27F06D87452A8B6C5DCA658535CEE2A795E58137
-D48E566B69D53A0C3B766E84C51EAA221C46999CC8065ADB2F129D5B630FAB1814C0C33B5AEA0EFB
-B6E994D80941B53079AF96D90A0B924F9B0E319BED9836B8F9053F868363D3CA554CBB181863301F
-8CB940872ED5FA7BD18CE39218B5AD8AC57D0F752D941076B1C64D99BE0DB86D7A6D96510D772EB2
-4C587F11779BD21CFE5BDE1F29C1EF9022B2B8BCD7F91153C845906722477829C40111D810480F3C
-F62DE8DBA7FD86CD236E656618CAF6FC46827FBC4898EA7672F8C9971AFE43E0E01EC8B77D4AF48C
-BF1210E98C1DB15C16D149BFF58AB0270CF015B107A3A50F5DC8F37FFB92EEC8CB6778DDB7CE4AAB
-C464C4AFF654223006A550EB52485A23D2B4AA7198D3CD54418102F1E9A4FBDE37B841E56F5C2C53
-966DB9B66B000E4588282E3FB80C2C519339F0002D2F83C979EDC5827A3B3C8EF8810A0F9DACB6B9
-998E9AF6551F56313DC4011904CB979AA2D32B11A811BC248141E4B9734D9FB7982A5671002D8279
-CAB93ABE057474628DEFC95D43890DB1ED34CFA8A20BDC3D874E7679A396158E522ED0AB969A4E3E
-C7E4474E192590504D54DEB7B260B7935C4E56548A7D121AC1F741F8CDF259EA1B5813175A77A1D2
-D30BA26F65EB765A04C09ED51F69F41551ADF399E6AA2FC09788137BEA4913F17B8EB838C38FB272
-1FDCB55FD65697FF0B850E7D3D1CE266BF90F7EC06A9A0876BDFE767D3A918B092FC78C775F945CF
-1F96E859C03DBF630D9A940939654C3549D8F7921CB94EE23D5A0535DE9DF31EA0F937F860B4F220
-A99ADDFC343D7CF7BFA0B803C12C26403F0DCFFC8EA786D0D8A8D9C367419CA8AE41190CE93A8086
-583A1E6C9D70B612C84D87D2EEAA71EC2DC12F4CDE6A821303D5F6A9BBDB7EEDCD289E80FA3B75F4
-7F481B50719DCF4A142069393593B9AF9CCEEAEC56A35B8787193D7C88113E9E1E221D151E093B01
-9EF89F6118BEC4735103CC8003CC5AD1B6727B3226CD44C497DA7052DD681695DBEC3397F9598C91
-77701C73BF0594CE93F23D50EC5BEE2FB9DA1FC966DF148B27B28EE3C89526DD6625E2887F9FA076
-7C127C609EE315626BC14D274FBEA56528DC06A27B2D476D46E9E7916590B156A5DF04A6CB15E362
-45D77021767B6E5BDFCC679670263FD891446C3371B11BB6E1DF60F960AAB4149D7753E6A5C33810
-C42C8BFF4E935003388506F8278BD7CB672F132E065AE684DCA0B9064D01DD620E7FFDFE04F14277
-EFE8E60159BA0FCA3FE2F28B902D4AC275D19F0AC6971EBE827C4A232D87650D2688345BCA78F879
-077114F0463C5F058107B669566F8171E4E284D278405580F04BFFC9902784216E0C9A17AA9B2935
-E66E18A783F723BE044389B7E9D62AA36818FF2EA406C3C1A9D2F3436F3EE7DB8BE86AFA8DAA6A4B
-1B84611350D8D27605509612B515E16AA843164D5D0805E36A2B9EF74C5F6A0B9D59A04B55697123
-27F4B1B30E9587CD103337639967CBDC655AA46E80D2CFD24BEB50815B5338E522B3A7AFE8362AB4
-F05D8BC52BBA9C5089ADA8C89529B0275AF422EB540D31A938B8740860756325B966B36817115213
-FAAF92DE63F6BAE1E0064BFBC5588098B61EB83C71F1C2082436D37DAF1ACBE186FEDC4BE7C1233B
-6F18BEC5F99002D21CB7864E4811F7AB3C03003E1E4490AD1AC793BD28FCD5EF0E6CC30EF39A08C5
-2F71939B0CEF620DC69E31E39D6DB969049031B0C92EF2DB653D97F370141456A52985076B268652
-FA2648C792780BAD637C4D7581FB2D62011D57E293719487CF2D1F013CFAA532E1C2D39178D51272
-A6AF041440BCA174B5CC902BD7390C7D3695056CB4BD7791F9FB6D88E7A70DEF2C97869F5DBC5BD8
-23C517C7B7C39D624DF627DC9653EA5347BFDA80B723F05F6DBB4C9EA501D862ACE05B9DBDF21B70
-56FBCD8C6D4B85873DCEE6166C8B5ADC0316CA12D9639F361B15A42F00E1D62EDBCA1111972FA0F4
-5758BECB31DB38316F3CDFE1B41748C93ED58B67E9B57ABBED5924A6D53E99FBC9A994A6489A8BDF
-13EB685548B4DC6D62DA7426C22227D4D43B6FFC7B5EA91C896730253E8941AFEE588359C2BECF6F
-FC415B9EB6D31CCB0F6C7F85853E6449FA6D627A97A3CE8303F148393ADCCCDFA2FE085C6908BE5C
-3C05AF00A6F02840206C3253A559AC5C049BDDFD11AD9B118403B84DA10AE3C470CB9A9A2D1D7B73
-2F59F5FE146DEDA60AE750F551AAC934621B4470E1BC324C436303E25F81D0DC3188BE0D6FEC5414
-C20E4CB18952E12CB6423DF7124627ACDE145500D77A97A8BFD9CB50D1FAA008E2CE2B2505A4749F
-1EBBB092C347023714055A9B63353AF9E7FEE05BB54C9843698101F79888A91531773830C2C967B5
-88D3ACD2192883D5CE3962D51084FC653EAE2C5FB2DA41DACEFB5C76812D2EDB5B109677289CD199
-8D457FB1023A19AC67295BBC1A9A20A426B06A368DF3C5DD083CB1180D287F5500F2C635EDE157EE
-FCEEC5503447382D15C748C1E35F68753992E5C90F900DE54D18F8E1B355D1076ADFB1F3590135FA
-D1A36F028E44F48ABB149B80CA9A54614D467F8D71CB310BBC7AC7100261092DB8C5BFD39E0AC6BC
-2C9D6CBC3A8C05FF8A74CB21608EC4A4CFE4CBAA2D056DBA14206106044DECF59F957EF8A9CADE4C
-9B19D8D30DD4FDE6A9548E50DB51ACA73330142153FC36B69C1C8D5B26D0C689B7040E81AC2C864F
-D7C097C99BE5953843E172C97AB5684F35FB03A725A89DBF371F08DDF40A1531FC1B676DB0E1543A
-EC6E97D3D2E4AA3D5831D8B3C952ABBFA112352814FB6FAB61A0D680E6640F6AEC8426200CF61286
-F7422CB2F78C61EBAA36D47EC16D7FAF8B4AF31D090CDFA255D9D7C61D46CFB22A7D6E1758E71ED5
-67E00CBD8E8F468DDFB477F091A2F915627F22FF47B876544BC1F03B6BBB98385F009C20BB1AA2A7
-A78674692B8EAC2E3C8069B79E679338DA57F72976810F845BEB6B9ADD32B95D78E5E60F16DD1668
-9C05FD82D36A3115BE8ED494A74DD211D58A2CDF983FCB9CDC29BF7F0E29988FA23560EDF514BC1D
-183F3B2A22C09FB179B47E05ADEF48DF02F31C29875D1915037B19407764A4292FE44E741651A8E3
-BEB5F0D972B6327090F664417C84F84FFBF0AFFF8B1D85C822D90730AB4140C42A51AA8B1DBE4398
-4EA8566040EB8B341CCE23FD3F69DD235A080BA5C69AECB9BC732BC2D7D40617DDA6B79FB6EE40C3
-556C7DF9B23DAD89E94054B1345DB8402AE679FC4655A4A776C0150463F8DB2BFC0608EA1F124E22
-1DDAE6026B5E5D007A7E4A0D6B3B0CF3A2669E67C5E4F01551966A7BC48F2F4B6A87E740D8095E63
-F77C7A027F26B52F2299DE5B8A2F6209BCF3D31CB0235F998F781E5CC81E31DC424E008D46EC0920
-2951E5684804A0592EA47D6C788A20487BEA2EC8F2E6C1D7F378B62DB43CA43C4B366F8B4319631C
-FE9854F0E10321CFA3B01C873584863BBEFC23C72C05E695B56E8A52E89AA2DAB543834D34DCAC5F
-ED08DC51825C5257AE59850D101D84F4CAA1D29FC932F9E0EFFBF7A9A7F3685F61F0490CD3CC8988
-2DB52A757A6AF4C4E67B407BD2316B1C0FFE7DC54E43C87B874F57E4903334E2140B011484863CDC
-ACA331175F2CF3D72E0042855983AAF8853D3015E870FF0807014C31D55060DF3FE1FCE157324481
-2744AB51322444632F9AFDA6706E320FFE82B8CBE242A19DF00CE73EE48E25FF49D5871BD3E60652
-298FE3E8D400609E232E0DDC794C0579ACEF89E841B2EDCA50D51151F65E8C1CC3B01EF1870558F0
-BF5743718C3E068617E81BFE120C6CA16E0924BFC2541177D53671CAA3AB641C41557DCDAE1A3461
-47B5E999C4541B08B4AFCBC187AFD653D5B5F8386DF6AD8FE69E21BD0567DF494F736C6A184FA4DE
-48DC9F347787CA96E2E00A296C2DA05C2AD9BC423E9CA428D7F1FA12DC9353A302FB8C529AF8688C
-BB543B45B2717EBF8F6C497935F4F3BFFD285E0402AB7544B3CA4643AE5A8B5250ED987A95FC1F27
-5B9707ACD0641BD0EE2AE9758494F8D8A51DCE408A38AC20EAF0852D72D84D0C6BE973326793AEB9
-55EAC6FE0A2813A355DCD22F6F2CE56588D1C055CDDFA98878BCEB6A018DB22922D2B600A20F8184
-2E665DF41013CA0947C4237C2BD60A75E2FD1A3FB8C8FA19485730B87461AD466ACB02DF8CA24091
-4FB090B3D2B41EB6B8FF05E1A59D9FD668AF70BA5BB72778953BA55FC5F9F626043450E1D09BC83D
-8605098ABEF884639A37809A32565CBEFB3FF39EE53D6C18C58C272BB928E4410E361E59A50F242D
-69747A032617C52DEBBF62364AB5A96EFAF642D9D82BA679B1D70FAC10A4EB62FA5CFC308E86368A
-AAD7E75948F43598CD1C544A0D4091374D7E88D4522CBE902391641327E888E7748FA889DCE67ADE
-61699E7D77763681CAEE9B1CA8837B2F7EF9C18CBCC538C465C8E2DD34616953CCB6030A222C728B
-834911C1A179E2C770289407AB28B303E724D97F747D6134B425216A64C6E0B60F633E2B85300047
-E4C90339CE030A0FAE31E830C8ABA5AB3386A3B69267351A7BFDD66356AE5E57FB2994452993E90D
-E7C4E260ABAB93C37831856A650D56E44172FECA01D6C7C380F250B82473960D2A2A5FB6B4DA668F
-46E624ACF7FA0FD4490F485D640A3ADFC9F8652E7A38CE5799F770C3606DB4B8B947F93967F779E3
-A3C0572F13A5A187D31D7BD12A5C7BE23CB6ED6192086241B76C5BA6983DB9C93E4B208D707D3760
-F03CD6272EF3A4CE89B8E52E6AC5871A3D03EB975759AB4BE239E5EC7842CBB333E692CC607C722E
-185D3C39164DD320C6945629C70FF66A5237C0A9520A1FAD6EB9816069351AB0F135D90CC0982B14
-7D2294AE4A38A527EE40BE9CDE2512AAEBB590E134388BB171D0956A7C4566D65A9A041BE6C4F883
-6B3EC3D2ED1B48B566A783292B15B6127920D247D494F070BB20BEFF60640B11B276DDEEE49706E8
-B2B21BB40B7F00AAFC594C492C25DCA774E0B80D82E927448DE2E74A9D0DC7AC9260096EAF187B6C
-D6AEAA6D1DC4205B4411122751A5B22688404EA7C5861730371FFAC10F5AFD4727A0E402AB5EA757
-606B75EB86A05E8F774D6E430A1A3FE2A37EBB06700474239FB1CFA05EE44B91B82244C575B52E7F
-AF934B04EEB0D933FEB57EBE326D75821C8B23EAA85B583AED4320B7F04B9F2DC591091216FDE52E
-064BAAA9C2C9D9714B95A4558C21F3CEBE624B5403B31508F178581AF6863083ED762F1E2E34A45C
-FDD71660D626FF8648F5D6C5E580D4765A67FB6159EC8077A9F0A88038C8D3D7C77FF0926E2123BE
-874F7BCAF129D55A5B5960F824BD1728ABCFCC51D23936DE9A25C408D786E44C3A2BAFA4423177AD
-060D21D38E15E23EB6FFC0B4120E814695D423EEFC2744A1FC81B4DF89D76F0A6803D8B14E75538C
-AAD03A72517B86514F6952F6FD619D9E910D980F00964DB325318C045BDF79647F453D4A5CF4E61D
-D5359782827229310405FBCF6107C3AD9DDEF9A9A339D5D5A6EB2E7838A0A43221BD62CBDF732DB0
-A638A52016FB35BA7761AEC846A023D3BF2D1BB183543E81EB7CAC1E5970CDC6F068C5EA118C7AAE
-528D1396E6DC939112DA4460C890EAD5C01BDC438F5BB734218BA6270ADD0DC1778FD8AB16831D6A
-302B814A1A44B07EDC65956C9E6CF4875DF521F3CE5B422F71081B6D69BD270F739095C9E81C0377
-934A8BC6390C420C4E4CDD9CF7E32544C68D884E15ACA3BCC07FC8C132D8FB9D752C15D75C52C288
-57E2EA461A6FCAD90C56843513F74461F18D7164BC597A28AE4BA7C86EE1703535A9B9ED50122627
-71FC12F102E800E0E1AF7BB46681BD2B14B614CEA91B7B2AAA35235DE76C0E113C92688F8EC81277
-D58C3406778E1EC1CC15F1CD9A137C8FFDAAB99ACE3BFC782916F1A877170589A92DC921E6740A22
-B84DC6BACDABCC76E64C79E3A588D80F8F4D376E1B426F15751CF7391102102F0AFAFD8B22DFDEB5
-48AEB5F30B1673023D22054A13391A0EC08DE6E7B685A0D031AABF20B7C62187C0284892D5EAADF1
-21BA28263EB863D5E36EA9C06A77CCFC0E17F593961591F84D82AF823EFE41044C8D606FEF83CCC7
-B0E961E7994DF8A3CC36B209D953E250ADAB8D22D7F2B4E2C9CA39EFA2D93E56195C1560E30A5190
-CC5B17FAEFCF250DF79F6B624A4B917E11C332222FCCFEC4F6A47BD9E75DA9854FC3F7AE554E91ED
-DE144D7AEF38A0E3EDB5E5A5626374DB94F022C8CF549093041DE00D7269B7CE544E748439BA2870
-718C08E58FB4A77D93EBC04B7957D272AE1601D41BF85A2BADAA0DF73B0D3841D4839C85677FB2E1
-5F1D6CE592669FF4BBC9C69DBA334DC37706F2F6BE83D5863E8CD6A30C08640AAC4C233684E66B4F
-E6B62D4A8BE9D531E47BEF5640D9B5C27D990092BE1597F6995C8A77BE9C18AAE6C1CF130775DDAC
-41D34438FC7AD8E042CB56CBF2944932EBA7D053E9376FF398367450E35A1945FE23E05C921096A1
-5454721FFD0F429A3E06DC3ED36F1C170BE79C66996EF8337AFF85B90C5D3A4A94455AE9FA32E211
-7A63E59001F052D5F6223125BFAFA40901E98960ADF7BB886729DCA82FC3B8CC52B37FF2517299E1
-D769057F8154FB95582F02CB0BECC873A9C71796ADBD3E91324FAA94F2C41CF57C30B5897D031C02
-D256C909E080E70BFD1F32E69EF67031138C2DDCD1A8E4B65E485C23C3E450ABDD9815512D6F34A8
-4B9DB715DB2C7A93BFB424316E1AA44397749CB01088428F149A3B4324737ED9957FD388248462AC
-1B2610D72BF5C073ECA567E7385CC959E37CAC7E05470160FFA5A9F63B8E9B082937E911586EA165
-374938F492EDF28CE6020953A5B5CCEC7737F9D9CC8538C4339567AAED3794ABA3B9F4EAE65466E8
-E326F6C399B36355935FBDCB9972F10B13494DC25097FCEC5A6398F275C8C151558E74C5175F7BAF
-4155E36B733F75CF9D5C5979B0764F14D8306E06BA24BF791141E404C69F3F8FCCD91B9C58C2C671
-AAE7D4F9E5D6414E46ED633A5F78AA5BF04E652246A066EAD9E582B181CC196EA2D3CFAA383B5D0E
-4CAC9336E119C08CC6AC55CBFBAE147C623B400453BBF447E96DE036FC025624384359EED7C7D5F7
-858DC0521377CF647A157FC3F188DE5EEF094DBA125510FDE34C570D7BE76AB5DF0A28BF45DDAADB
-EA7EEEDB936332DFE93081E0AFD3FDD46BED08D6914B2EFCFDC41662A33B90B03D76D34F48D30FC6
-BBBB600E90E6AC7243FDF026762A44B4D6E4ECBEF48C9D7B696AF29EEE063E557D8FCF0F09E0136F
-45D17E608DA36E59F2AECF8493F8D62536119B5F7E1554DFE3F6E8D7C9A2C6F557D18B4AF92C9F6E
-050975C3B5C54F9B5F4E39D600B6FA2CD6DE203A174028CBB2A201AF126D1013C229BB82CFD013ED
-199D01E51EE2780FE896E01C63C655087A3E61A7F1029FA5E97EA1872F1B45F22282DDC317E17926
-7368CB52DA9444F6055A3C653659CAD2A1D8712BC2B1B32C1DC6906D957FB88524EE066156ED6BDE
-B8D832F9338F9912E29A250A8C4674E667C1C278B677AEC9972BE83CBA3FB779893FCB8F81A323AC
-91474BA2A2334A07BB5628E905C518E634F6761A3289056F83D5DD7B3890987EEE1C18FB2D379CC1
-905F1AEB3B3D2AD578F0D6C845D2D40C4BCEE3F71C90E68E5417BB8CDDD878D83BA80AD8485F4067
-E5C3CABF28AB56CBB219C0AAB8FFC6C7E192BEC8CBCA1459AE4450AFCC81B9548F40CE2622E5A7C2
-81F74DCC02DAD57EFD92D072318DDF05BF42F1EA8163071E23949B0179CF7DE64677CA99B23CB926
-B3E294194EC13397EA1DC9A5E1CDCD828156CD71F81B64167D4FB01E6002713BD8AC6F82B20CD369
-9C6CA4704DC5C65A2D66EB155B7AF1C9BB46469416FB49C1C7E17A30A5F045271D7DF3FFF2F42C6B
-470701C381E3456A500C6BB3D0E47B4D91C5F34B49BB6272F1F8698B307D89EDA3A1565DAD1C0864
-627560CF922DCF5B34C67860352390B282F95394AA2CDE0E97CE3ED39546A6AF1C52BFCF81A29BE8
-2C47C99E8050E4889E4575B75F39E662F2DB7420673797E2ED3D67CDA7AE2C15D0A0A794D57D168E
-BE13214E89E0209AB2C0EB7784E9491AEFA3C02D0DF3AE5365A0FC4AE023CAB528162C7A1B173664
-9DFADDACA8DA5FA18B7D6489E4229E9E24D38A620464A744A5C60F6F9D334B908706B738AED18669
-8A8B278341FA4D65A0A88680BA484694921512F7DE93337FC1C02BBE6E64AF2DAD07603279D87329
-1D1F4D39C1DD6D89C90F65240F4808F6F1115CA55B88E242565E59F3BBF1F10EC7B88872E9AE61D4
-4CAE185463EDFAF7DF63DE4D2207D307AFB61501892965170D2945846FCF5973A1D458607F50C15E
-06E5BEC715E0C156259AAA6C735593E5564F65F443B78CC7512EC35A56F126DF9D30974A40872E42
-65E1AE5FD483CFCBBBA26DEE426CDC4721F19C3FDA86ED7AD4FA1120F63669BEFE7002B128CEAFD8
-C63E8AC09943B6CBDFB3D2476A026C00A8FF81B1F651B97F310C82ABA5F388CC1DB5AFCFF5996D52
-52A6A42FA4D972E41EE56088F78CB966F9051171C472C774879AECFFF08BFD9CEA40D7C298922ACE
-64F28C14E0B81F4DCADE81D71DE3983D87D905192EF13CEE71B2D3FF1A88AEC671EC318917DF98A3
-C9054E372D22A3CEC82FCC217F47319A40900312F6E32B536B9E7A7FA0837EC65CCDB5FB0D414371
-17596CB39D9382262DE6E65379D3A9709B2CFBABF5FC5D5B352425F06F88CD31012A2A4147B112F0
-C1C0ACCC808CD625E0228EEF66661F70AF96D3DCFECD402700E4F6522AC9A856DA466D55C84F65BE
-2810A1565163872D62EB81333A698ED7B68352CACCA2D7AD38AB55C19E4F5582F75818302F5FDADF
-1DCED09D94872F2D48FB636C8E38C7563C72C771A08C6B1F041F3532BDB39006C89A33C09BE1E3E6
-03622D891F98010BF1DE5355F557A1E09448D486ADEF565705277B31B8BF2B86761E32631E3435B6
-88B79D566F1747BA456DDB43CD239FB47FF7B425EAA4C657C8EEC26EE01AED07CF916E77D53634C1
-37AEEA009C6B515B6342C54BE2C7B95955B1A9DA277A0ABCDA2346E88018C726F481F71D6011AA42
-F8852F2E5749518FE3B3AB668213FE1A05C10A1C53953D75312631D6BBBA01D418199DFEFF8CF548
-6109B099FE8E2F606165FE30F532C03567785D5362AA873C9D3EECEB20F1945D55F49B0CCAC84967
-59FCC7292E46938943C262D78F3212D3F9D0F7B103157F423D71B1ED54B2A603F4C269029918F238
-EC6828FFCEC66009DB9C9E59534EABB183F31D7AD4C57B1BDF0BD2CE5A421882BC10CC1BCE6A970E
-2B586BB221567CCA483989DD0B8DEC424C1D1FF042DCB7834423CF244EDA28D2D969B17440CAEAF0
-24A6119DB010CE366821AFA424D1B8299609C04148275AE6E5257A7ACB3C766C747CE99CBA2D703C
-F19B7CF301B634D8B613DDC4AFE4633A4D77BFF8E00CFB5E289EBBCAC90A24307E7941EC1685CBAE
-400CADD876FCEF7F6557EEE167D2035A05120293527700DC510B038A496BE1D5CBAEF24ED39F7421
-1A93AADF22214ED606A80582485AFE358E3A46D0671148998A3B3BE209467009B43400870359D418
-9A8CEB4D5866AB52D16D9CEB1EAB71C07E6CAA34B70E3096BF7604C22C40D5FBFEEA616DA3BABD59
-DCDB97D883FC8742B8267A16A99B7953225F7144568D566E64542C92E538AC140C851E5D295528EB
-7CBB49909B1CAF6409C9BCCEB325468FA0B5F7CB2987382616B477CCFE4F4AC79E4A6F7165363543
-F04DE5B6F6E1C2E910CDC3CDD6C4C92737198F892337DCB6647BD226C820AC99C65D8E7772BBB74F
-E65DCAA8A22C33BC168BF48E40A82700A3A7668C5A9A71E397ACDFEE7D556C5C19467B7AA69C260B
-727407AC837BDB7D67DEC055C1F45D8BAC61048C45BC9FB3CEFE7549EAA2992D2EDC126FF7A05EAE
-58613332A2BC1465B2BC0429162B907D65F793D236EDDD8D35405866D71B25F62DC4A7E06D4DEE82
-840ACCAABC0774F8A63E9C0F7FC980B3583E7A8B01C46590E3BC04EBA565C2EA94F057D964A78A90
-EA9F52ABFD70F84E44E434BD10A42E98C794065724341F907E35D3CB257161E01C7084E3A0166D15
-CED65DA7BA87DBB2EA33D39BD99AFB93D3548358D08330E807F8552CECF63C84F805205491BA3A1A
-622E70C232FADF3BF2DCFD6F0539158D3306506F150B0518371912A25EB96163D73E9EEED42EDC84
-D688BC7F7708D9DCA348FAB4DF62E5809BD094842D0A31DBB7C4B41F94D946810C5EC10B69AABC2C
-91A59500B2E5D37F4755DDFB7AE4ABF757F4C5BCF77C7F95E6A616646456FE8F18407080BCABBFA5
-7704287AD26222DF91AB2613951E2D679472F8ADF06EA2A20205EC19972299A78BAC52114334470C
-5F5890C2F846B4C6042D73945127F2E3910ECA1C4CD7A16EFE4B4BE38A15AAA710682C3836A8CA83
-FD384970139D8B46FB0AEBB002DD224199672FFA02250FBCFA4E649E335428FC71F50F45E498419E
-DB0E970F46894A48F65580881C9C4250FCEF65C9B28699408E18B26FE6DB7F1CBDB767564E73CB59
-54C6D639CE33220C894F36E70F71C9F9AA3FE2AE0AA0E3F2E304EC5ABC661675CDE2E70519E4220A
-E26FBACBD01D5169EB844750753E6CED53E3678FDCD08AB93E10067E9C64F38B40B76D99B6CD92BD
-F4155A1EA5CC824998B59AAD06E09E5F15EBB2288D66EA71B296616734FEF2796F07FF0D8B047074
-A1111D68B99C2B70FC56E74A51B062F4998ACC85B1943C9477E436E5CD7AB18DBC898D21BB93475A
-623BDDA71D7B895BA2D4C10F4B90BF335126F4FD57D73AFA50170F6B3C364922E551D40E35DA75FA
-891762FA23401D39260F2E92C7807C746F13BB35CEF9DBF2E76E66A72FEFF095DA482A4DE8A42091
-7065736CF4DE904FB52E649A32255E2030A7B31B686353492F31C064A3C4B0448C4BFD44B8E15384
-FD809B8761EE26A7DFA1758D57CE4F0BC376EB2B3833534B15A83436BA553955ACB5A7A66796AC5B
-92DB5388BC53EFA27508B08E82821E5CF669BCE52BB860780F749B4F38ACDF5FF12726BF3EC2743F
-01014CDE96FE6B4C40A034E9EAFCA2A35CCC776C2669E6AD138070A40F48ED79136D7FF57E993E09
-B81C543FBADD350FF5B5F7A46F060F88E30FE2D8233832D18B6C323EE017EBC1DF5C838321CDC8A8
-4CABCAB20B60A1A3AA028F36EA6E87C850AF8AF7CD50AA6359038BFA8818821D02CEE8F51DAB8C05
-F7AE9797814D97F3DB8CCDDE45B21DBB15CEE292FAA534A5F317B357F4091F3DA357325B8B9F5EDB
-45865415973C143E5E5BAA483FBF2D06CDD4246675EC58B84C6AE65CA743117FF00F229243772561
-31A7F2BA26A9115AFD96C18216CFDF41B7220ED0CB3FCC26C36380007B382A02AEAE428887DC8BE5
-FDD630AC57EE3DC156C7B8B29E687F24442E35CE10BA4087295A641F7139C831F7CCDA6CCEB5DAFE
-537CC1A97C5A337D3C48A6AE947F58A30DC08CC7B58DBBB4737AD52783C573FC1E9408F55495A80E
-7FDA61F0B9C4F090158F1A416249EBBA936C27BEFDEF19D1BFB839EB70576A010706D8B95657B218
-9C2AE04C11EF9E57FE09880273761FB4302C388BD608FA0C7F00F033C9C00F4E3D5CE2D903E0DA52
-E69C7745EE9FA75E2AD93DC6CB5CCFCD3782A699B807AFC36AD1F62B05856D5DFD6F88831B90EB3D
-CD523582A49732E3FD7253126D39E8AFB8458B5F7AD7F94A8DAC13365F433C857AF4A42C0A08C4DB
-9887C4957259ED22D13CFDF5995DA957EA5A0F620B0214FBFE08AB6D552DBF048D62CEF6EFF12F15
-3511ECA7833E0E3E95F85E6AC0F95438AC4C126E1F1ECF336ED31CCA7EB216D279877123FD9FCD8F
-B5E52B587CFFC4428456DDCA816819A8A4A211D8F1629E5D42BA4C5C356E580C8A22C61D987552FA
-A97893816DA73D423686E4EBD44375C257F031318865A20F22115E72BF1EB9F93AAA169C140A33A0
-6C35BD4526A38BE79CF40AD1EFA10411E8F3300A8A8B97AB140EE6734E1BEE6C8EE443D698D34159
-97649C6F10F20ACD80236422E215E146D744A262DA3FC88DC0D86FF66512F49D3F957D3C5CFFEB42
-4823509F33F155057A4C6F37B52F4667767BA94F6B8B62856B553F307E5D230C44CBFDC9A97A45B1
-39FFB2F2565EB0E22026972FAD0FB7B9576FB6F368B61979943A398773600E7EE1DFEFBF26D45D40
-BDA66EBB96A56EE9CAE0B2420C5DD83E24DBA9FF885BB844BF3D2BF93B07325DFF60C0CB5FDCCA0A
-C8FB5A2E119D5AF26E53AB8E3B428481C2871DDA26EF0B621CD8572B3C664BC7AAC01A1D05B98F79
-1A7080D294BE81099BDA7982432F3DFF4775C44D23F4F1B2E0162B61A8B2CB5EE8564BF98E2ED403
-2219085FE6194C19DAC98A421826CAED7F1AB1477AB327506010217283894235D7DBFC1153D5ECC4
-8AA7293F19592B4D7E95FE55151889BCD1D7FA7DC2370D2DFE11D7E4EA34B5C7A8E73BD3A348FD38
-9EF45B6167FB90BA44C23E912F9A4F2FC0427ED070592F7110183BFDB2C400393BA7569058227926
-351F07FED4F33633BA03A72AA2DC6B598E49B96021DD868DAD0F352E5722FB714F667C15C68D49C0
-3D822D82677EDFE86FE9668E537DA284068C9B0AED83074C92A5B939296D505B837E6A9DDAB1AEAB
-7455A08A114C2222B339284674B74BF4CA9EE0C020BF2A148B439C71C6BE51A94CB64FBE4A7EB295
-5A455047CF5CB348B062ED4F6471CBC3E9ADD9BE9B96879AC7BC71BCE02FD02F17C6063985A5E898
-3D205AA1489DA13C408990ABA1C54F2F501AA172F530480D789C848118C0A74EF98D5F607A067BAF
-F6030D887AC6A6497F9A0B38F9705F328AAD4BFBB634F739386177B07F22D5771282444E5EE17335
-B4D0EC86117C697E79A5F4F65FDC08E4904DAEDAB20067EAE2448FD4301849E456D085F392DD1316
-7ADF75CCFDB723E2904A9C0C976D6B84DDEF9D92B0E15FB246C3ECC2D0BF314CFB957757B3A3E8E5
-801F520644E4601D291DA0F7507C06F3B9BB36FC1C70EAA444E14E56C0CFF06C7F853DF36DA9D8B6
-AF2544B853DFFF535A7E5C6FC145250CDDA229956019659D0D253A19A7B51A4E538BDC01F74D7704
-9949C2C97C7EC6392C2E61CCC0992B66DAF1AB08551063E53180D2A67DE496716CCBAA45462D9F91
-B66A22545962DDAB120511FF08627131B95E5DEEB8B4DD9643E7B2AF65C0FDCE11F5F1E8DD468DA1
-8D41C8C4F00EA73836F4F70EC50FC3EC6D358C0658A4261C6D15A582A2C7C994E7882E661855B352
-014576858A265FFBC425160669CE159D07EDAC04D060B44E5800A7AAE8E339C29B929AA81D2F515C
-46229D2080D5917AB20AB6B34FDCA8E4AF64ED660A3173786FB1A1D005D575C2A5187D3F7CFDC94C
-CC44A38C5CD523E9DA726D8EFA6DA7B6131DFF3435FEE838B2C7D6B97934295F06202D307FF78D90
-6699CB9C5BBB10D1D4DEA5FDA5BFB094E704607083B646D37F5DA1FC7AD21B813F44D8C1AFEAB666
-55AAA19703BEA2E77DF3BF350E17C74B3447A452235919452B5175570A006C7680AC05E8950A62E1
-1D7E3ACA35A397D1E19630D094A86807593C97F4C484E4E06BCFF708B6DCA972E3A0009E1CAC0EA4
-141530F5C1B8AEF5E1B933F37FDDBC4BE22B74FE346D1A3F5FEC0818F8E61765568A2AC04713E828
-F98C449D9A1CCE52D10D61DD8BFD084C8D099A75D89DEA64D5A7CC68BD5B0593D97953DADA976383
-F5015915618AEC56D71D1DCD55B89736395C609B315A3F1E1255432FDBD37F38CC43C354FB4B7C44
-F1A7318B0B7E99C3C08C33B953727B6A6328051783A0A33E3CD9E498346A3CA6A77B517096EDD52A
-E443B87643A646C3A7BB97F742888D33F9B3127E61942F4103C1DBDCD8EAC8F9E259773066736CA6
-53CE57E8822651261D847C131321BB9D6626A1AC50D047C0BA47B411DF2A995545BD68EC0287CC9B
-31D5DDCA8755EBEB10ACCB3903AB0FD5788E984220443B8459E7C078DA4289F1350905881AD6DFDE
-C47302B0ACB0D4AF8CAED02B4B70DF3CF8FEC118F0FC2D3DDE3E494CD160E676E300BC464BD4400D
-B50EE43B314E0517037BF971ACD7CD327CB2134893B8A0410E68DDC518F5DEC966C7884CF5FDFE74
-723177F20DEDC039D879056CAAB4BF045062D3904F615C5CFE109AC7A35599C94024B41019B9AFD4
-04A80ACAA4837929F5C9317680A13D157A03B59A5588DF79D2E113F5F51021D6F6F90E8BBBA2C252
-FD10651BE80BAFD59C53A3367BA3C28DB6EB9DABF1EA99F47B503F627E15DCF3FD645FC52C5D5D0F
-2F07DB4C25C0D1E1C00146E1C4D973E613CCDBD3F9450CC0F5343D79F05E9492E86A1BB889ADF405
-03BD7F3E7543436859184A5B20BD8A172F350D846B7570803990ADAA48D4B9155A2B4C4BFBEF1E1A
-065C08E03928559735BDD442FF1E83E1FA20A5DA57D8BDB2FF5427C034CF0128AF111E6E73099E04
-6E0C240E80A73D7BE72B87834E45898D475521CA3306707631F5C6136199F354632D1A085F12A1C7
-C473868B62E534D15F5484323E63D0574196A19EF175214EB35A90873EFCFB92D6CF68761D45E37E
-AA61E1A1979A82009507CA193E44B36A806486665CEDBCF387053ACEAB979BD35D30978FC7659ABB
-E844F4ECAB3303318ECE80777A5FA5A9DD91B3D06804C4B4E9B4EFCF07EB89866D0DD8CA390CFD15
-98651417114D78776B1A1D36B4BA17746D6BE7FC123D473EF1EFED1C3BC1D555F914536869FD5B0C
-35F9C83F65B0E6BF7A627B9202D787D72C600DDB6BCCE613D88492E13CA0AAAB196E8A49928C62CE
-A4FFE2D0208EDA334ACF47F20BD793124D2C5546C03F4A364369A76A0425262F9D9118AF54E37D32
-E33AB25DD533A49DF5FBF1BAF4CEAC2D9D378CDCD13B00FDA432D9042F623DA41AFB80699B5538A2
-5403B0B3EABEC9E8EFCF42FEF3EA9F91766902CD206B0787C187D5370B60AD6DCD002DE2DE8DCDC0
-B4719A797C5E26BAA67665016DA0D967FA1346F9588AEDA174CA001B31213617FE19EA218EC23597
-79D979E2663166489C06993230B0D07973A117C4E3F4A4C93CF8428248DD5389414D679C69644142
-67C7FEA17E35B0CEE456667A9B1875C81B2302BDDEA2818D6019FC1622A82051F60584ABC904CD91
-8676305DC03FFBCC64FDDAC8D8AA9CE2EA00D6C97BC63C8A617DEDFC0E40775649438E9F61AFD179
-5E3B20560B01BE5E0983F136CF48AB206954E41DEE0D9DDD953DFD01CAEB569151D6BC0DFEF29D70
-FAE3E198E7EDD8922C0E0BCB8BCCF1C016142C1A8B337AFA7A05A9D7534B184BF3BF827F371E9BD1
-9A71244ECA1BA73D484CD2FAD54DB2F0EEFBD54B536EBCB5094E6BC2F5B2AAE41F05B4B311115876
-ED42C34F8E643B53372E3F6350DB8A38445822EA9A33E27FB0CC42CEDCD1FE2FDF723FC47C996EE3
-56C402112F24D0AF899B2D00BEA1CFD427998BD22B2A09046D6737814448ACFB10D387547D7009FB
-384AF0562C85694C071584236D0F1F3D3FCD0CFB38B77C81889061E668BA7AB37AA60F58A3967DE2
-6F939B79CBF10A9DCC42852561D8D6754F1B660D216AAB1E133FBAA321C56E2584BE5C9BAE20CCF0
-0E8DBE6D9C2FCEBEBAD945C3C04101D2387351F132628786F6D9D4CAB83419288D31F9BC600D9664
-12E6AA457CE6CAD26A4C0671097B98C2384C81DD8B9A3222D4F4BBDA7017895C3EDC26662779AEE7
-40D9D7E24185FB821970B0A3A94041A69E4805EC88EE1EE521981536F2844FB8F5EF645F67D42CE5
-148E2DDE43AD5AEF200EDB3A2C7866C98458A92666E5F9E070178BCC39F65A893102A10564AF4E8C
-AAA5075D2F8CD7FAB0401C03AF299EA3515CC93066744EB5AF7CF0ED06675BF049A6E3C211A89E16
-DE5BF0445A7CCA6EE8EB0347454950485D884606651E5887FE8B24323E2AA16DE22FC1FC8C4F06A8
-2A1FDE5758976024068197E1F4506E4D3D8A16D40461A4586338B374A592DC60334402F76388AD6A
-457DC3F54E6169CF7AE3959676E966A45609621055EC3AF80E182633300A4418E34A66DDFA6B569E
-5A13C9115B5FD3EC1CEBE50FBA247F60803AA83976F00117536342DC3D9890C49B2AC701D370E43A
-955118967827760F7091469C5406F08F18D7E3548148CF0E312B1DC71DF67A5E7A1656CF2F47F3AF
-F3DD50FFC2FCDAB7177285B29C17CA43019F62AC6FBA52D1493ED7C427526470ACC8389BAE827759
-4958908F517B2863B83292EB5AB3F57FFFB08393CA610FB1FE905D88A0A16AC395E2A2A6DD033D6A
-0D68992F830B2E1B95FE357BF672716E88FFB92FFC3D62945D1EAD22BC68C51EE0E10A43011DB94C
-44685A5C4576F6EF44CBFB45F2A4BF110A01657DB51FD499767E78058199B31DFD60813F1A344F86
-289F9378231D5B151C92385E3650B4FEB1DC91018EAB8474CBF69FDC1496A4D078D2C351C8196451
-247A9DCF8117E5B637371D8E22E248C64D999015C3FD2311E9950B8EE0922FBDD3D7BFF766BFE9E7
-CE0BE12F318FF2A7B5A9C6D00A54401609304ED2C55F5C1EAC3D4B38355BBD85D66D61636FA6E30C
-2E82829376BEC979A6FEEE040E452359768ECF90CC539A546F17AE906C76F14F86FF697797322B05
-1EB311A759FE260C1EEE5DACF383816AAF1294CFFA7BF87A4D9BC595EE8F2C2F86FEEE11AD959D86
-F22FDAF4CEC098942A57E57813A0FA99239E994FFF353C1E781D666B8928CFC648FCF0869FC68468
-BDBDA7D280DFAB8B0B3A4CA35B074B686DE8D372C61FB32305169A1A9912F6541DA16CD6316A6EA4
-51524757BE5CF6E820011BE3859FB8B8578C100FF029680E05F0E0BF11D33FE19460C85EA5E4C0EF
-28E29407C8AE6BE01CFA0D5022BF9FB01416FFF722A784DFC8FCE330EC95737A854471D334FDC58F
-AB42867A7B62836A8B56466E9A6C1247D46EBAFFB905CD4321970F59FB8D6FF65FDDD34BF913AD32
-2E68455C5FF2D23C1A5EAE687F259BC982B6A384D35440F7C693CF50B9ECAC0B5578CAEE87588B56
-2EB6B7F42034C9F2E545EC866316552354EB3728C7D26527ED75174EAF635E048B08DC5D23E88981
-070AD5641A652F2344956E9CF4C16E652A99F4A644D1787D6D36537489DA4D74E61B2FC4DFDF1D1D
-9D58F9C26C5EB63200526AFD168AC57D5611ADE4D4A382FC28BB60F9E7D626A6C67AFBCCD1183C5E
-3CF2EF210D0BF5CFA7BB10FA3887BDD4CD96EEEAA8F9219AA2F10ABC0A960C3B57C0EC0313AE10CC
-FF1F522124CFC8D2D49BFBB0C193EAFFC5B48FB3FF30B21CB76F0A4C0F1377C9223145BB0468A5D7
-1B9BC25873EA12E1C60334571C67385C00D0B570D3FFC6C7FF0DE62C183C76AEEB12DFFEE1459E0F
-C818C621B8D12FA1357E2B55D48935D70BF140B4CFFE8813DEFD479350B20DC2EB1D3CBB1A2D3DC6
-EE975D58C89D61FC50E6A0197DA9A586B72255023DE47DABEFB11E8AA02414C2FF6258A281219B9D
-DDFE41BA7D7977D0D6F18224FE22F7D4E9355FDB35BF7ED3418F4F68D093AC48F7D8FE4194FEB6C8
-0B9DC1F74E023C604DEA27089F98C3973FF9F4AD7BF7BAE601DB89B08D5D8139B95EDCF6C885FFA8
-B3E4B0477E7040225733826BACFD1EC4A0DD72DC41734856AB9FB700DF83CA2CE812913BD142D84C
-5C83C0B2583768198AF9E885F2BA74877A414233207234AA5F18840557CA11682AABDE8993533887
-7C6D404BDE4153C9827EB16D66C1D73A8143C8A2D3604FF72CE579FAA3C5224BAC48EA83BA848429
-9472007DE96466B5B29ACC7C03B05DCAA38A48BFF9F214DE43146AE4E04FA705421917F99BC54533
-F0EBC01849E396216B9F0794E6F6C6B61B52EF1B1950C0FB609895C3C55FF574163FC8B6B09E66AB
-AED1810E698FF37CC1F926B2CDA3B48C7D77790EBD2D514B6F385D397F713EC3AD3954EA9C846158
-6031D369E8B99E53408A79D64C34EB5A56DE8A67DE91837960E98A66FC04DFA0EBDE21DB003234BB
-78665B039D0A469A0221BD541AF7149A2A659C300132C14581EF766FFFBECBA8B58A5EB3F95446DE
-F49AF863A8113D17B2E7E6ECDEAFC3834D4DF900E3475596E86FBB4E2974C090DB4AD61A737D611D
-92B4535AC291C56AD8B1C031D2F9B505BB77517B737D70AB3723DB52AE2ACCD5DD2F617423ED3CC3
-9CA882EF41757BF7151806A9B8B0F312808863E3673FB54DE939B35CDECA7FBC4DC3BDF5A5F47D35
-E345916C39366C8B4F439CE1C6F1835C320BD1E67375B03B5DE18C93256F251761A4C8CEC01019C0
-68E34447BCC503B9571FE8000627A6B3DAD5854CBC0A2D69E5A8F46BC78F6A7B1422334EC7A98ABE
-FE9B83E01DCF3C6C9273B346F3240EA225AE4A4083CC7B0EA141A0773FDE940768358EB4B13D82AA
-304A1386D450C1C0C6A7D5A8FD2BD313F78F85248B5196241E31E5595F3BC01F37700A2DD3D4A0EE
-2DD01A36569CD507130E8F5B1E96CB560BB7DA15560CCADF3B2C9804A11D9E8055C9EC70E48C1D21
-3EB756A1376F2EDCB7189D78CD3D6CA5865537EEC31C17D801605EFD860B0B629472690588D02575
-02C6F7A75B9A1C1B397781329832CF3EC43C09F1559CD562C48FA9500295CD3B0A790DD3FCD4684A
-7C7AC49AC9BFFF36B39A9FB148BC28D37907433943CBBF0CBDAB46D3EA86DC8F81C859C52D15302B
-94A9B51C199B7104DEEC9D769C2634CECF8B700CE9C04152CC59C9326BDACBEC4312DEED92DD087A
-1C4840868D9F97CAC046581F762F75E8D24D6445370A3F1E0AE74A6478D9DAC37E7FA5BEBEC0A1E0
-81AF89C1BBF7F51E3E2E22C8C405E8671BA85F1BF0DF79A465DAC7EC07F731E00632E017D190A99D
-83E27E5C2E63D7DABBA23B2E88334C63721AC5A4CBC5D45F4C177259F34C2EADE01FA008AF65EBC6
-01D8DD16436D86AA94C99F3CC0A2F87134E73BF22F108B825A8963B49C6C685474AFE4A542C8641D
-C0375D7EFE9AC1168D9700459BE52D0DA399023E141969F25C0DAC4668534B6647EC85454BE945E8
-26B26DE6E3C4584B97A38E2B40A0D23481BCA78084FE80E00A71A790BF31DF468A435ECC88E60A57
-860BBCA3D65930186E9917CBD209C230E8F8255A7ABC7D3F043AE4D7AD63D9980BEDF062B7D5C298
-C40225B6D03F29A0339E0FCA02138E526F06B9EF47F5E7A8068A846CFDE2BFDEBD24F5A73A66C079
-18662AEC80B43246284FA4E2EE0D9AAB172B1E59A6CC46B801149D8C0DF6DEC9A55D8E1B0EFD9D30
-2FF618075944CCCB6831D336B11617107B0530D09885E5CA11A5F1FCC8D69D603DA16BEA51116D42
-CAB1AA1E4D7B9B4D79993F2BFE53EAC904FEB70B2D330A89780EAC10D12CC0C35B8399F218AC2976
-E57A26BAD20CE2FA2AE2363D3FD2A8A971747556F2959DA74A8963C20B504711AE1CB0D0C02457FF
-2E9BF696B159AF031DD5155F21C0F5549B0471A3C5DC8918B675CEBCB23E29322B959ABC05283A70
-2E878DE8EF25EA760F3C5C7B7B49D398283DE2ED837FD59F7C22D62C58FE4448B1049FDEBFC8787E
-67D7DAFE9774979BB3802254DA59BCC0219F98C219F84D995CA768B8B5D9D4A32525DFECE003675E
-E4BD5D8DFFC11025AF2B468F9207B5B2B42349B98232BAC0759758C1F4A283405815BD7145C93FA0
-8F3ED2826655053A3C2559073D8ACD199DEA2C5BA5F616A2E48548B4370EC73493BA07E197165DCA
-774438B0766867819C1154D1959FE6E01E6312E0AB91FC2E2BD240FC8652A2D456A1DE7F34EF372A
-53794D4C4E050BF3CA5B7BD2F1B8DE93B4C8002485CB219AD2D029739FD3C81CC6E78EDF38723576
-1A57143EEDE5CC887F282FECD261F6A25D0A7E154ECDF5DC38E426811BE86AAA458577E5E0C5F0F7
-5AAFA9C41E5D1DC9D91ECD79B514F8CDF7A5F1A189470D35FDF4F9B8788879CCBD91B427822ED658
-389E981E0EE5F7FB87692A3E3E931DF8A1D1573E3B0166204240B7080089A09EF7487C9AEE2D665F
-5A82F94C877FB5B0DC531CEBF1E71C6592CEA2401E4B5122E5091DF03D203DF979B9A6EFBA12E2F6
-B422FDF15D49AC0914D372D21E871DE65CBECD105FD4A3E4714B9CCA5C6803FA39DBB015EA8A88BE
-7913502E562E5B170B87BFC8572DC9DF49AD63694311EF1334444BDF0B4CA3245271C1F7A4D7FAF1
-703E3AA0E1EA8D5C6E821B28707EE0C9B4F22F23796FE87356C58AE2CADC191F4C58E1FB58DA03B4
-5A25AC95DBAE13A293474217BDB214742B9D9D6AF35F70FED2891942EACE3E625E55FFB820543FBB
-250A062D3D395BC0F219ECFE0D76686AC148BC41476A887BC494DDBD396BE200FD3E03CFA12EC9AF
-6B934A283C42AA05589AA6B4A8D16946BB51F50419CABECEAEC5AEF9085C9989289E9B46BAFB6FB2
-782D84DE2B068F91A9744AAB237CEB1BA513E57E4C307108E993C972A3E0A898D5A8D27833155031
-FDB98863C3BE7FEF3004CBAA5CB60A1F2E3EB4D7290FF5FAFA088B1CECCB6CF51A58DAAD998F0839
-6CDFD68F5ABC9C1CCB8F6514107773C69C26873E889D1F79D10E866910E4684186FCD71C965ADF62
-39BA3418B313A27AD632300969B6F284519366ED85E7CD968D64823F8C59B5911A72D0A20EB72B60
-3A61E36F52F256FFCDF706B4560B4DFA5D918FBC530D83A4B3C01BDD3CB4572E24242D141BF9E775
-36693A0407D002E09CDA5B195BF1CCF430AE9824C07928A050D0B460F2704BE8F9E647A4884C4567
-0A81EACF7CC038643EB0FF18A376FF6F32B6FE4F197273327FBBDEC6443A299CAD4B26F7778A99F6
-5A11BDE047153E764039EDB251936AA43DEE50DDFDF8856519056AAFC4C5AE6F2051AF0579A9ACD4
-1D00775D7DBE70022CC263DCA5E0A25B9C7C4F5C418587666B2FE24816B1E0EC92F9074F1403BB83
-AFC3F1D52CA79C387BDEF864366E34C90BE52F7AA09935373A07E4E026224E76F9EC3CB9E7EDE50D
-EFDA48248D61F3CEC880A3B8843306375D9711E58645F3625BDB8E87052DA67F9794EF4AF8DB0BCF
-E00677C3A26907DC651BC838C40EC39E2B5A5DC0DBD345944A6C32226089D63C52490FA10B215AE7
-03CFB663EB8A47793B84CE7364DA1C4E7FCE32DFEF09490121222774915BA59C78C2275F829D15CF
-4D8686B095C38C731B83D48738C25F40B8ADD487C350A2EBE846C3916AE384CB1050F9F5DFE09FCB
-D9129C6270FD86D55A459618FDFA4F907E6B4746196BB717865AB378414029017551161A52E9D24B
-E4F7EED553A927933D4ABC8F25DF607779A717909CB4D810DE8F5762581900E224E4B91598149BA4
-71CF8068ABE8744356B261600BFCC57FB8BE45036CF6571D9B2A95304933BD4F17215F8EF53F8E08
-1AF61FA7F9583C34EB5655CB0ECB82246959F09091F36989EBDD646BEDCA614B9A61AB7696B3FF18
-1058A150FA6EC1BE2EBC7F64357A3FF2A2B0491D2F4E0B970DE5B7788B467CA678039B5EF55C88A3
-84578D427FD2CB16C87B0BF0A3D37CE8ED43E0F049AF2436344D5F47C948C632C94A287509282561
-6C64C5D262FE5B24916FFEE982A69A6CCF888BD01D62EA591EEC51F4B7DDFAFFBEEA93FE08D736C2
-0129E345D06B10246A5F57151C198D407730713F32299638EFBDC01367E23EB59AAD42A83AB41B43
-2DB462652E29813740F4680A5D4BD47B18328FAE6BDF4200CFA4CE3773809B45E8887C9B2E423698
-9F6C48D64F5986F563D9A7538A8716082F81936AEBD0461E6F4BD470436D8B7656F0FDF89108E6DD
-02ABDEF907731D458D690BC608EA9CED09EB1E6E64C0790C7A2378201CE997FFE0317679EE1D4EE9
-F91157449323E53B4ADA8096CD628B5861BF794543A98F2FA2AB54FF0F25A13DAD43DAF9394329B9
-5AA53CA32749FECB0B2BC035DD1EBD53FF9FB5AD8BCE06CD89E5568091C1CC314CFB1D9821D7F9AC
-7C55F55E0A16E39A87D43148201B928F3C42B110FC056189DEF183745F3B637441DE8BD4C3C7EF12
-F4258E306B2877ADAEC63441010750DB4E6269A4C78A0AC01BB3603C386651FE814031CB5D8C1F14
-9EEAFF652A53E57BBD4C8C0CE36A84A319A53BC1E5FD3F1ED1EE72F4C1A9BF264B594062FCAFB22C
-C1FDE3F2E3D3C17DD3F7FE0E15EBD812D550227C06D01127385374A11438ABD50048E17255FCD2BB
-85122A6FB9B7DA9D5E9DE8A747FAE0DA45A1FCEFE92B9E70A5B2CAC668D4D07527A5C1403267D823
-048BE671F725CFC7474B44FC5AAA348420B2D7C23C6CA066666FD6F2208E329878D90CEF1C2E77ED
-22D3BEBB9D547810B189F08920A27E7107F208591A84D463CE2576C70C3DFE6643E4EA93F4E1DAEB
-41D46F0E2F56FC10C69AD5034FC9859D31CF27A3A1EE256C93111F81C11ACF1FC0CE20B90BAC9AA3
-27A5C85A7985B951519FD4B03C40BE637162AF41B2FDA68F0D1E9B7602FE2659D3D75955C579AC51
-DF6A552EB9581AC3F712F083F19B52A6C4F560F36C59CEEB0C996AAF1728A2AA45DCAD79BD7B23AB
-388D5B0B64A2B95154B6259B730B0F4A72C8C7F7CC93C7D64D9D8810D1F63FF8ABD4DB89824E2D26
-4FDEE916C41E299211DB1A53256E1DB5CDD04862F034D9404B73183A99D3D13D642A663F129B6D16
-7095BEB4EAEFD03DF2FF2F0B6B594C1EE90FDB203DA89FACEE23F1BA3901FECC75FE1811BD701259
-343011262B6A0A9707AAA6316BC3C17F787BB80AC8DA5AAC942D90F80C5A3BB59E47EC767244AA95
-C63E50BF809998957936D3BF6ABC24B0A397258F9EB4DC8F65692CB023D9091FB180C69498CD0C08
-BBEBADC84A7E0016E8F8BEA325D924EB0DF82E75D2CC2CCBF039B11934363D4332C5FBC5EC556BE8
-5EE4E707CC2753CCC43D2ED50558E51A104221C9323CDCB0199B7B83454DE3FDC810D0F362C0299F
-5DD981B31D8E3DDA284FEF9DC8F9C8DE138D3065437A7FE8C30572AD06D62E8527AD37AE39AAB0B2
-25F76A25F6C6505241ED73BA494CF923E919F688DDEBF193E188F8C4C154F21631080763B4D091E8
-AD1D2FD6649E0CD9360E8D1A67A5B5FAFC67547CA31C95A5EA8D4EB5D68B9F6D6532DB9B54584735
-9558542A2AE58C09F3BD2918EFBE1699E9C8F2C2A11EA4D224C726D2ACD4A8D8ABAEDC6588CF2AE5
-66528B94F55B823A2A1F7BE19000F3E7579D094E047075DF18C8C868760295533B26EB3ED90635B1
-29C17ACA679C3E88B06998CE5A7A2544B700229F5A6A504BD3E45B276471959C8A3F81917A534287
-39B5EF9E3D463B3BA7318448E2A3E79520D2D245A2A72F31FF7070B6E4624E3A5E216BD103640C8D
-F387E49D732529C611F8B971073F17EBD2F6EB18F9B74A67E1997926DF178D4C9EDED435B9682F1A
-279C81BB9F60DAFE125845A2FF3B02979E5481C78A45C479BEFB9FEF3CE2BA9BC46C77B50B03E48D
-A6D17B76F06F3AD118371ADC69E178C52B5FB4B261C9311874ED07DD6D5B3226A005FDD7A6D53848
-09E7063F036CDEA41619122635E835D2D74CBB6AA9B38CAA4D819C26E95115FE0DBAB4198FC5838F
-2C91B7A87B07D734C6D4F4F83444C1E90AA9BFC908A2BAC4B3DEF9157AFCA5248F2DA31CA87BD363
-AC25E9E77F741D4B2C6E02F04987A6F49D30E9038CEFC41BA172DD675AED8B392164411144E5B738
-F3210B0E66B17A13CB9631C33D44484E792A7C082DD0A5382F34C5637653261B1EB6D2035B08B4D9
-1FA9AB770CAF40A103629511F7B43F2743D7E583433DECFB19C21FD4FD0AFCC22A4119E77C87BFE6
-FE50068B22479015BE5A9F06BEAB4D37412E062A45E0CBCD7BB39FEE747E96306F79FC4F2E8942DF
-5D9DA0E55AACCDA547DA19D30B8404FA121298B44C9CCE198C708C69A8D6BF17591C5C50D3FC5BE6
-961F7ABA8F366DAE957A1C3730DA4A5B4F035A9274675EE3BBF0CA8CE9D8349F50CABB1C3EA4948A
-BE6F9F143592F1EA95404E6909A909168E3279A957AE1924245C356331A75E7008BEE92BEAA304BA
-40B7C3F48F74D9018B3247DF50EBD7CE541DA48ECCB1B0BE51A455C3C13C279D4D8676078C3EBE43
-08748D52C9B041D3E7244C745B1F2F742D010A9E60695F3EC4FDC1050AC082B905D6A57E8F407A3B
-472F731011A5798965B7B1A307E252FE02C8F79CEEDDEB6E165F1A94D7FFF18DDBDF79477F14E9E9
-3981ABD200FE7771B29D1D2D120EE79D28B9543818527039AC74085EAFF241B56D08220C958B5D9C
-87C0C04A14D52AFD475B542D391BC54FF33DEF8D9484AFF6873BEED32DDA4B371112B523B6CE22B4
-0D1B416B64C9370F1CDF2C548F4CCBE9E12E21C36CC3EA52DA232DCFB65F66B22B5E2EC04852510D
-5E264EE939BB67AEC4764B87062AEB7F680B40BCEE04AD45C7519EB3B6199C9E0E332661463647F2
-FB7EDF303EFEF84891CEBCF0FAC5F723A9D0476C3F8C092604C87FC69C7A90F4D64AE45A478EE8BA
-2DF50FB93F55A3546123F0B0E2C1C40C98EAAE9F0F26B8F80FFE6E6B94B7E27D2884D58B8A119662
-2DF6BE608C5569D7864BB756DF2EDD184B90812B44ED4A32D001C31383A40AEEE9743651F7950846
-15C48E402DBC01C818D477EAC0347795CB2792E9C11E8FD4A02E194EED1C919D4598FEC003B6D9A8
-A0BC7D456047A1C0579453FC1D7CB2D158D466939A23D7A7B8ABED7E2777EC7487973E73F2266D9C
-250CE30729E3C5223AD93B9AE8443B35711E446A3DC660123ED45CE1942A1A2AD0610467E081CE2C
-8B92A6C82F0B17B5D2429E99F1A6268072C6B5AAAA6EB6283A872C54D3694CD825EB2926E57DBBC7
-C1663075E687A144E4D61C225781D80FCAE1497B442342B4A3F1CD6BDB50E31791CC3928C30835FE
-F845B6BE5E2D7E3F2F5F085AA3FAEB45CAD0D76BCBB1ED859A9CEBB9F7457036F0BC3F195CB1A98C
-9C8648F6583CDBB23894BC719D68C2DBD8003B10D08C8CAA40BCE784D7BFB4EEC9EA5359AC056E57
-B8B0F2EBCB1F4CE40C87FC7861180133E0CB6CE2FC4FE690756D327A2B5AE063E3021C0C0BD420D0
-56F0B941E6B36088A55BA11D0C35FD0132D5F48E5D9673572347171B4328D4807B972831C0D74CFF
-A5638C145B89C989E6EC942148207D6DB82257585958034D9F9D4221C7C9F7013790DBD130F277E0
-BC88BB179DD09E27062379ED06F25EEA8B7FB33C35861A0034776E3813D2E9E5C10E227CC569AB36
-CB2D9DF2E7B7B44758F9DC4FFAD7A24AC7E9F47AA850C221048C3CB35A37CE8EA75632AE65FE3212
-175146FECD6334AE3D3C5F492F067F795E1E8FF386BA198CB74F0BB4DC0000DA383BC4CC3F070DE1
-7721431988D69C8B1A5AFDCCC83C22E16A87E01C6D3E79DC7AFA3DB0371B0866EFB8B6F88900472A
-FEF1C4A878243C52D4E02E82658979731C841C489A6B97E271C4C93800EC7D91F93EB9B9C659A554
-E1FCE42A5EC65AC39190EF4B66DEAF6FC0569A000A9E1495F42F706FBEA4D32EB7EF11A648910259
-6A65CF899C2F322F5679C6D123469192A9BF1A7F1F2C81C554ADB97BD19ADB746A4F81A4D5559E60
-AB94C483DBABF6CE2F28CDB412D50FF3FCFA3B3DAAACC6A83CFED910CCB3B8D2C19590AFF4D75303
-4A6CE7F4156896A13808E0DFEAC547E69D3C886691728E4A35ACD575B40D721E8FCC5385A2EB28D7
-08101DC50811529528F5CB0C009BA7E3C88468E37768FB0D83895AB54DB2DD5426562AF9D8AF304B
-F6EDA54E9C92643DF926F5C3578269750120302A37CB140A18BA56BA01108D4ACACE8FEAE640A6C6
-958EF156B588ADB0EA5F3B0F37BBA12B7BCB221C811415387B024B7076FA4403A3AD6EBB5D9C26EF
-EBDB7ADE7C60B444AB9F90EA493B658B7767AE2BE649BDBB3FE85F460F1ED137C61BD95F7CD3D8B0
-15CE45138538930AB62AA0E54B4CE1A5EC5FEC0A2B28B345B67089A4E4AE14D2E1F5A9C8848DA688
-CA298F93860649EC3AAFEF3E820D86988C8E3E5A4D4BB937791827994AA3E81D0BB3EE115EC36D5F
-B9A392D09E79AF514D11C7B3A03C9F9C13355CE79E119A19177FFDCA34704D38118A8976D1EE5AA0
-2D14FEB1414419F5E85244ADC5C0A765A522EEF36170064BB19FEE3B5F7B441E4DB967DAE0BAC2C4
-8FC6A836E0EF5A69F073BEE1699F55E9C757EBD6FD8B514E2B49D6333815B7DBD1E0694695FCA3D2
-1320A0C4B852D9706DADD8369A95FDD917328BE93DD33818954DBD2C212D2CA81560ED5BC284EB04
-7A5F389E24E43F4FA8C97FECF46589FA7341076555CF55B1C21B28E0C1CBB00AB8B6F67472F27BC0
-D11148F407824B0159B5188D4BB7386FBDBF1C0FAF34721B7BCB5C0FCB7C4010DCB6A1284E9D7883
-9E3C2111A05D29AB7997073B590A81C6168020F1D48951BC7D8476D5BA593F4F23CAC1F9BB0E091E
-84B4E99E5C584D1370DD12DEE8DF16AF8BC6B7B23E2FEABDB7F32779AF8E2B5094A6E9B7A7225F24
-C43A8E5D2B977E1E19E633C26771E23017ED233DBB02C64F8CF03992C6484528D0C8464B46F24F9E
-8380F385D5D01B8893C67FC103498983CF939432AA380CA576D09030CD52FD99BDC3BE16C7204CDC
-3365BF76294A83A1FC14A236F5FE5321904E779B13232A76F8FE521F425562678436359C2461BEA5
-AB27209541F557AE2AA60009C9CA0A9FC7898C14306CE35A50017BADEFDECBBF94EE2905220706DC
-806409EF87DB1D73EAB0698AD2DB72CDCDB293E7FB13C94D9FC87E74502E6927A212F0D7D2F2D194
-64F7A66AC07872E18CB1DDE8F11835DCBC5C4EF039333FFFC0FC1456DAADE7DAE3EC2EE0D3415B0C
-ABB69FC5006F4D14A4EE1A5CA99AD4D5E629C0DD1E0F097B5B93DE2DD001A8C418234C9C45E8C13D
-1AE04E9466DAB8CF1ECB88A4E059C111A6468D2DABB90DA79C7C79E94DB28F6968B1A632F8C57D9E
-565FF91C6916026FFAC0661856B9FB8DE9C81661816221B1FC159CFEF1751E7E403F5F2CE32529DD
-540792FC17A12A3DCD7C50D38EEAADBD10ADBF5D8A82442AA900CE6150EB7A4639DD9FB6E385B2FD
-093493DCCD9014B23EB172E21AA89643A6CAD1093343D85D81261972DE0ACB16A4C6B5F0BE4C978B
-FA12D3CAF0134F9EA49F6E9687C8F99A456745EA252F0BA9968C7F9586E3DD841AA92DC7705BDD68
-2DAE41518A09DF0E209F321D7FA3417202F4BA76A984DA3ADDBC58136885362F02F0A24EBC439B3D
-BBDACFFD8498EBD29F88F016B1FEABC10785438EAC860B554525F3266097A675299AA0967BD3B7A0
-EEEE3FC578D1BE99D3533BD91571AED904BFC9DA1A1451FDC5406E1CD614E0C7FBC733563CD6CE6C
-C31E9237CA153F1F0411114361D731636BCF98555ABF12848AD109371A42B63675A4130B81E97C2A
-2EE2BB5D8FAE2640156001AF0F55D9D5DF8FF23C8AEFE14F120000F14149A36E5C94CD9081DEC277
-C2C34870D05011F99D48B0875A5FF542F067F7E9880109F586BCF2B50522A1F23ECE44349E539E70
-F84E207DC9BEC7CDF856A046F1A03226AA41F541719AD1AF88FF211E57DD0C1275DD0B7B47440DA0
-89B98C6EE92A7D94700B83CEBE19EAEDD8A615F6587587BA8BBA3CE3AA5E8EAFB1FB0F486BE3609B
-169EFB178A4292F4C0378AFE5D24EED1CAAB514DDC66C696D8E37F294A6579131DDF5488E9436609
-ACD750C3DB0A940C84FE022B22ADC2676F62E91E8F891225F891FBA537679B24547BBBF35F04915D
-20B11739F620D18B5B216921D222F15044368569AA302980B9225BB839F494588481B94B0C724352
-B2DF600A22B062561D86CB8F81514FBDAA4F8A043A0265F992FAB71FC9124A45B8475E1EF3DF6B6D
-E35CF329777D45F08325E8505EC0D979F542807AE77E57E453525F23BC59A50740371EFA98678AEE
-6C425374AEB745B99DDB5D8D908FDB551FBC0DB15832107BBECC4E11A1A8DEC69358A574A2ED46CC
-31D564549EFF23102D92BFDCBB2BB985F78F36033E34F59C0EBAFA3BDD71338736464CEFDBA91398
-33995EDA4207BFD4A9867D32E867FBEB7DE60D132803EF9347CB17BD91315484EF6570892297DD8B
-7D966103339535E28A00CB1EECA4A9775F60A9F5FC9BD8B06D78FE8E6318C31DA2E847E3F9CA587C
-B01AE2BA0A2EBDE308314413F4F230A758184ED60D4F71F6CEC22A93A01B6C54E0449A3860FCA895
-4A347B7588329A80974ECBECDA1070FBC055666375229F13DD995E99265DF870BC8B8CC6347FADBC
-1A6AF64599271A475B9123493D46BEC41289BEEB67EB97A8DED7A9C9730D37C65164CFBDC22E5CA5
-89D2E7954C7136EF4E084C43A6C7F361A3E96989239BDDB9A593CC2A80BA16DE9EE90E95CD39393C
-212AB22EECB677FD36D34DEB46C4AD0D21BF7E6D7CBD0C8083842FCD87B18FEA7CECF939987E99BA
-34C214E44DD84C176C9CC5A4CEA76D380CB316BB4EF9DE73D73B4AFD4ADB54451591DEF86621D138
-D5A0A29441502BF6C2ADE671CEC3CB5CAB903A657EB2D70C943F976C110E46C5D9D29BC00A875F27
-38E5D22496A43E096E009C5D3CB724B4CABB32838DBE527F83B18CB457E57B092C302EE557FD4F00
-DB9C56E66C9FDF4EC9FFAAB85F60D02BA79694FABA476A199A0331C30A78A92E10417BA236E23364
-8174C826331DC1BAB87C5F95027846130C6A2B4027930EBF9A97BA1B039D386FC51C302648E25980
-212F6A582CDE2778C677A01FBFB3C5D1B8A374ADAF6ADBF7DC94075F25ED66D440B3922C5F255FB2
-3FD8F6E21EA65B1D93BB225684B50F11310E242B087575973345B229BA62C1E2C35BDAEC04D10148
-F5B2F3BCF7399BDFDF1F3F79119714AEA697245BC647316EA157484ECB951BE367234FD02E8B1F09
-1AAC3D29BF282DFF4011BC0CBA8E55234D943DB3017CC7A766720BBC29B2D097A956C0F1067177F0
-12D42ADCB473CDE8D1BA35B4030757FA1D8211989DF3BD22CE5D501C21EF8708FB3449DF47D88650
-9FF7B59B76C0DBAE443F336FEE2D615D7EED1C284F14335BC8A26BF4621E10DE9611FB2F1DBD52E4
-B7565D8C65B54EA36D508BCF0C578A49A2665227CDE1F9768EFE847F9D94F1BBB7DB83701C232198
-5C7283D47B2E40B27A268428AAEFE75F6B2F8764A8494E5827573758CB9CA46FA93208836BCCC8B5
-564A69F5AD882052AF1C1417C3FA7F580569528682C77080F3688B65E7FC24D2A3AEB61574B4A321
-5927281544DDD7A6EE0A3E9388F8F631CE7251724DF70726E5912DDCCC8C652DD6C9608F8462303D
-867F589DE0F2F71711B35142EE6EF93B64D6326C4DD7DC83278E057100EE772082E6BA368ED91A55
-53ECFE2293A481E42F83BC8F9148C70EACE91F7B7D9CB8A72415BDB3AF66F68EA733A17ABE9DB005
-3BF148629132969589F38D30EABFA96A01FAC72650B5A6FF3935670198A1EA33810A9B11E330EB8B
-451F24F93544263436F669AB5A90A53B16CCEEAC36B1445574EFA7E802DE73522BE725E68704822C
-B7D3912717333367895BBFBE06966A5CC653AAB5E9B3596702086BF0010085B900711932A95ACF15
-CA4DC45A754EA334E9EB84D6FC8E3FC4F897456BED64BB93B593549FF0D5352275D8E417172A6664
-C5E0ECED1019494A7ED49AB0B965BEC1A82E5873766BB38D7D856049CCE2FCA65AAF61E961B60634
-E2A69EF059754C9D8163D87F928C222772D070D83FEC6FA5AC734AF65E40BFDE521F7D9CB1650FDF
-64754BFF21EA3FF0AF7611A93D525EC9B28C51AFECB04E7FC8323DD6C9B0D8539A34FC3CD8CEB795
-8E8EBBFED4313C77ED469C199552A9FF70BA5423B03B6148D4EAAE17B71C5B39DC436AC53D6BA8A7
-AD81AA8B02335A8B2B11E9F4FA913159A725B8AB60F52F1A2EA50EAF4D56656E615BF382CC68A690
-BF83DFF24FE986570ADC0290ED1A37C1C2AD469CE789E0EA0BB5CE01020100E729721AF3B5BADD33
-A2DAA6C33EB8F9064F5292F715F820B4BBFDD56F76D42E7A1A068C1CBDCE4640082F6E7D582D1939
-990CE6EE8D270015A2C461798B37DCB5798EE9F7512168B76D26C28BE4A49A1BF96C89D235F21A1D
-B6A96E5DA474D0B19B808D13D7A11BF39EA8647499C410ED9894A1ADF33D41B6FC2E614D8087F4C8
-4E437B136F3CB32DB8393C49177A0675A0C9E7EECEF448A97AFDBE840FA01FC7E5F2E8FECEDC1884
-84C312E8635CD79195475DDBFDD4D38D5A0246DE2C7F21608F8D2C0DA1371D302E941572E5792A3C
-F4E51A33228B93A814D03FD4FC223C314CF3714BB3A34BD4F7ED6348577FEED9DEB082C4049E57B5
-D3CDB7F26629E9F3BA36893E09E3C7463D02A22D7056BE76B87763260E46E48BB832B7EE13F8DC05
-37EC8E81E9BDFEAD8C27EBDF1AD706933EFD11131E12814F236EBB01BE85B7F1B2D627413B324918
-D247604F56EC128909873FEC3857028BEF76A3494364C2A7002D104D486236C30B48E2B75D851C34
-EA50BA7FFEB4E19190898AE21768C157C0CAC628A2181A32796FBC1A7271D2473CD88E5395DDBDB1
-FC3AA8DF0F3D588637F19A8B833AFDEB5F655A8838EECD684E2315B72C75CEEFBCEF94344ACE8D6A
-DBE355008EC72FE7CEEAB01363A895F4E73F867639BE0A0BE67333848816B05B419221BE8F9066C3
-62C23FE85B7F392930BFE4C12B9526FF2FDEC38F23A159ED61A0718E7115C24597D849FA76369153
-54A40C965D4D72EC94DA61A03766AB39AAB684E134FD1407A5B1B19BFEBA52AA0DA5D99CBE5C82DB
-AA663711E6DEBA180E1D4A39C320516A4350D296BC19BF1BE054859A0889C7E9727A021F3176FE62
-0FB0C837E4141FECE531A950C03D319E3255703220B7185BD20FE5DBA673F8129AB211EFCF36EE39
-4C7E00EB0876624BC840FA86E58B2F584754CB6BFDFD76810E300741EBE4544E5AC17413ADEB21C6
-2F66CA4F075C32381796BA709782DE34A675B717A2C7F6D88104CB924FDE5DF775B4F0B68E0E2E5C
-2F788BBDEAF06D8E1FC2105CCBBD5827C0B03FD6CD64F0D073F3192D5F94839644E5EC6C5185BADC
-F04112A65F49A8C83174A9AE958E76A2F5AF469E8B76C833782C5FFB8BD7B1BBBB3EA0CB7C9786C3
-BE2ADE5E7AFA8C8F20892659A59BC421E28845A108E34EE17864042EF587A6D67DECDFB3F510EB40
-D2229585347A0035670FCC76C2837A4E4D68304FE113C539B35C1F0234B5079B8E32934546982978
-C5E4DF955A454EA263C3CA5D7101F31A318D82A3F9FCB5A8AFD7A65209663B0FC9DA400B26F285EF
-46D0E1EAF8ACB1F1CB805E3986D04BC585073FC64895E4DAE1CCB749BB439CB32EA91176D5C39C36
-50D10AFB9C9884D5FB90183424CEE67EF2175D01D2478D67511EC9F54F88763C152697B06D948BED
-49240096EEE3D06AB4575E8E8B2CB8263B5BCF4FA1608720F52B675309833071879DF52C3EC2871D
-20F398B5CAC8F8A4D41D0F1D47584DD90DCDAEA4A1CF160C4B3BF1AAB890B5CEB6CB3488672AA68F
-BD938281DBC1D8BCFE92FBF514DA5358443CB6E0147254E91B38CE6787B2BB0DEDD2D38F5938737A
-977B5EA42892520C58F8FBB53C994B57382379E9490F0D6970B980E1BDF8CF9F4C3C5E0A18F66E86
-EE93FFE7FE546DE50F41364BCB3721B637072571FA1779F1D672FAD260C16D7F13CBDF3E4376E7FF
-56D2A710AC5AC35FCBDBCE2C9C17E523BBE6218617B13C1FA6679B308979AE7C61DA6E68369324C6
-CBC7DDEC364E5A86707266C0B459EE7B2C03FE584E529BFFDCE98C90A2F3D9305AA74D3ED8430DBF
-3A49FE2ECFD9C4BC9FEFD22618FE9C8A973AD072AB6F713E4DF02DCDA7AC5359B2D652013E131B76
-B3ED6C75FD53BA58D862846264627F6B9E70D8800F6D9B32242B747A67BB2B45675840D34F852AA8
-062FA6B01E31ED24DAE02F6CF788A17F7B9368175195DB0072259CCE0FFB2C1035C1D26E1777CCA3
-D56A827C3242069E76D6DD69B653768614B9ACFF16567FEA61508D51454BC02F6C60F755AEF6AFAE
-3536BBFA1823F8E1A53C41124DE983E51CEC92AEF4F99785D554488A51C20885346D1F761DA79017
-940A0C557D93F1DB6B3D00FFD61D08E96FF3AFCE5FEDF545CC9F47A2B1BB26713431D6D1E47FD6BD
-6E3C668B0368241F0EBB5FA9C991DF79890E52E83A3675EE699B61BAF869DE91F67278F510061C6F
-E41DE2D883F48CD0E068E2A652B244128D82E5CD52F35F210DDAE3054691ED55A7D99088AAE8FB04
-F525C2084AC09F5EDF80A4EFAFE981F74C0DE9D194320709B3464F3FF2C0F6AAEA6D973D9C323F53
-DE3D741F698FBF01036716BBD62957CB32CD81D3A2674560FFBC5BDC5C6E4F547E589AD0B1CFE14F
-5E17FED1C4A8ABE4E67CCF8A49F32C4C6044F1431E1CC382E7758722A6D0DF9ED23E51F8AD14D11D
-7B6428E27443715EBA4E9C05D6F238378F9498AEF0E7EE4FE6856622CC8E6ED141EE5F109E343CB6
-695C4BE1E0F66601C27975983BF557C04ACFC19227A1AD7E6C44C00529FC7EDD7F886D24B7E029B9
-C395260088BBFB96972199A7B32796D27257DE83A7402291C14FECDF7998C5C96B1EDADE0280F856
-8A8F5007852EED303969180B3329917973C2D32C080C9765B6BAB0673BC7ECFDBBFBEA980C263843
-39B7F1052591D91667D4FEE413AFC23DE2D4B9DA742F4269C6C939F5FC32A38040730A018155AD73
-3F231E4D5B9D01C03A58EAE7B5F590CCFAF25EDC8552CFC8D95C60EBAE1837D7A97CA137E9D4A4BD
-2CD34AEFD68D64B3F4F62326AC429921D7FB3C235184FE0899690A0B775F1A566EC29D5830D32372
-6526F7E7F5AFDD71B77E07613DDC4FC63EDF49051AEB59E6337AC0A4B6DD872E776C9CD0CCB86130
-5322D816732124F5978A86C186BF0A0F88E733CE38E4D7C1BA5378C5629B1EFC97806059990ED42C
-5CD183BAD7E94070E4058569DA2E51831FFE0D080301AEAB4350BA290318AEC582C78D05DD92E5AF
-B4424EA808629BC972E68F4FF2489C245593F07555CA6A2B25964794CF31CBD3AE5C229AB9B8C298
-06C01D116EBD0FF0F159ED2D3D7DFC73EAB4910BFF5B0B0B587CD9EA6E6FC45D63C09766224D8346
-1F0588140B258B1729F70BAE7962189B1554483392988CF230AF4077193E53330519394DD99BA135
-6D4730AB221DC6A66019BFAE564893DDAD7B177DADD16ADD21D396CFA6C3DC818052E2F71149FD59
-4A16DE0C2FFDD366C99B486C55A6E991E4D22CCB15843F0C3363676AF2F5B2D1B7EF66CCF2F12DC5
-0D63776BFFB058D70A9C76DCE96C754872D72C82A0C33F90D49C935402CDD26B6D743B1F43BED5D8
-B539424849C1495DAE73044E885A7D0F307F1816DF6244A6F2D97BFD4E200E93F69B08AF39EA21E6
-E347A47CEEBF803F73B978ADBFCF056789BB8E6E2563DE87DD9A8C877157B934102DCEDAC54D487A
-1BB2694F0034093C48F10A17D32E2BDD0C723CAF59ADDD1BE373AF8C9BEB4415AA5AF36310C31F24
-354A53C0B962573148BEF91D994FE3F3D8450DD4D686725799F53C373A0A3E3C060C2E1A3E800504
-9F26D716E1F381B9F83125E4683264A07E2D8938F605978E2513DD2050B3D8A1012797CBA8961632
-BED260916338A812AE751C7B657E086A0C7DDCD3BFDDFF3E48B84751925736D1310C4910FC114387
-F3ED7FE163F91895EBF55FCB425CEF5729D99BD8F2C072E36C310523E75CD8E5DE49C031C4263410
-9D56E91A46C8C8E89FD92012A00C33D0DEC52597B5C6933291A7BDC5CEDA95DCDA5600F9AE1C8250
-54E7EE1067458CCB66610704C58E4A4FC0CB5FC933D0322A716B2CD430A3AD48DAB3D4CBE9D23F2D
-092368CFC4E1F5495C133A92942EC62118D45C17723646E69407B4A89DCDFD2AB3FFC099A21D9D29
-741D68270629AA3A414FE58658DC9170C247B6E23F35C4BC5FF83009F462F2EEF4DBAC5FD158A658
-57F9B6DC1F5192DFB169DCB65621CAB2F1B07BD22F4155A8E9E2B6388D430FDE5EC1C834D22EA035
-C52E1E34482EADC36B4CAE902AAE89A7284E62B3C84B608D6BD05F75BC31310B2DD3B2C08A00E073
-7F104F03A41989D5F6B9A2C38B22F1D1803EE5D7A4D8DE44E4ABD496A1DE0C0E12C4BC96D0122846
-3F0EA9CE9509FEE987139F3DD3F9D0DF4313F555BE85433718F6D05F197C41A9D9C7A8B0D2740196
-82D49F58DD5F66B12A6520D9F226D1DF1F1B65CDFA261F980CA25A92645B86B64606293F8BFDE364
-C47D2AF2C709BBE77A70A5712F2CC26F3D66F5BE2C307A48E6F887F681D30121E32BBD87271B5DC4
-615D28C309F15AD263FB37424E56DDA6E17B998B45BE6C7FC6C28E3394A8764C9EB2DF5C06626593
-B5C665D550D4600172791CD208AE9F37BC082B0B242B0A504B751B18F4D7495172B697EE217834A8
-A4FB7CC16D6F9E8BB400BE8AEB0850960283DCE725249FCC4DE97D9886745AB6066C3E2F64DD8AB7
-9AA11667F11188D7965DC11EB760B772E282DBF13249F31986AC6898FEBFE23E3E8B8D2C33E00EA6
-FC493850ECB2E6D831D1EFCA3C2EC8EE2E394599091ED58BEDE97D7A43B6F739EB0F845EAC1DF6B1
-EBFE876009CC5D804B15ED4B56761B3CE1AF59C07B49DC798A44532297AD73D5101ED47F36A3678F
-818297CC27F6AAA2AACCC9AA9B6F5459911D8C56CF499E390AE607F3790450B2B9C9BE0F006EDA0C
-715B5CA0481734CFB0597478E7602B0D2C1E4F78F03C68C17C70E4B42D7D2D3C95CF40F73488B371
-8E2CB05A549944D86944D78724E266C3319AF89AE430E777E95F0D792B1C654306E421F3D63A26B2
-1E74B6E8B21B2E2B9DC596D013CDA16D08E65E8F24A84B12B2BADC653E6E1110DE2E709C1C1BED13
-707B70A421B384F20CA7A9A9D20324DD383F28B2D3C7A9C53F5D4C6B7C378D26DF11CF55238BE1B2
-4FA70DCC178DAD3D35670FE4919085EB1CD905971D76A368FDFCF9D2F0A23739851A3A6D2E02D65D
-54DEE69ED5D81315D3EA5E356F94EF256DD267FD1E1A9EDC9CD63E743F299BCC4A4506233B8DD765
-2CA067F741603F93250C087D368F9E9CC4CC1A6DED567487C05BAA992B0056A77F630A72008E3946
-15A9DB24FE56A956650EC9DE90A6C2259189440247970541CA198748928215C0E132A81AA13208D8
-63C1FE817F70CA573B54577D10B73100AF8EA088208A44FB92ACA314AE5879706180788C17BB1D0B
-81B6B95A1C4E0F9EA66F9B39BFE12444A6446691A7BDB03E0F03D9F07A10A7598F2166F108529F34
-CD90E601FFED3479ABCFCBDE8F051C348E48C61D95B00C59EA1287423F05666C3D36288844067E83
-E14F6B5210842C742B89F13ACD126B9FC50ABE2CA7D7ED513D43B6AC7F41EEDA416BFFFCC5C844AB
-2D23D4DC09B2D510504CE98D02E72020D9E669DDAA344C63A1B75632F912A1C0DA3885DA4AF7E243
-E4A4C6493D6595BB6D56B0359106957259E59E336BAAF35BD1CEC5CDE735272EBCCAE8D4904AEBD2
-B32610C6FEA2B69941D6542ECB44D71092A3CF067708A3D087AE99FF29671AB7DD8758759B971A08
-AE1BAD78270D2FBEE37AA2DCB119D72F6C7B0C8509018A70D0B0BE2C6830EF8E0B24B1CE1141EF87
-3A4D7DCC501F808BFD94E4DC0F2915AA023076BCC8006490A43685EA25AAFC187302EBDE7FE1965A
-04A5A398985D29F08E085127B56B057334D88EB638A4DDE64AFD204974C3939536B1B66A54B4DB81
-151853915718F70813F096CC1B0EA25E363B49264C2AD17158A4489F91453FBEDBDE15D7B74D7F98
-E81DF23251785D58295BA297F295AA6248A912CDD4F1111E6B628EECBB5139709E76EA4AB743CEC8
-26621D08E6BC64691CC90B3C3C1778931A28D3D5B1E20E96C643316613FC487C9B604C43463FA453
-3BCA1236286E6F5A6EEB2F1D9C34BDDE4595495A365F88055D9268541CF1654ACF478D384A5496A8
-772EA1402751A093582A6625A0A44816B5FDBE166835D598644296249B92CC90AA3FD6445C9A19BF
-27F59CB0616C7306070F33C7DF4E1DE64AC8C5BB2FFAC1EF2B1B30E5A0275E6004CF64BBE2C6710E
-DCFC3AA4ADD60106334708862FFA6652825BC84842736E47AE6917180365C75B27505EED3C6108E9
-898A780E20C3F606A860229AC46D0471ACA0187D6D539A1B8820F620F72B41AD1D3BF3834BF48CA2
-AFEA8BF535AF74C4562DEADCB63D2F5C7585722B77C989342D190FF926C8A5263B4F25286F99CF6F
-C62EE6E2AD61C82B29D82468AC10FD27764278E5558CE8B41BA111CB2F040914451A480C93084237
-CAC8F66BB7C6689F340B8ABF0150E06D5B1177278A4C08742FE22F42C28680F190900344ADFA486D
-59718C25D37275BCE4DF981AAC35D2C7E85C72A0188B8953CFA516FD545AEE0BF4B8BA301CFDE214
-4241FBDF3D204E3D2823301572E23F204C97305A82401660E12926EE7BA6EA1A81FF5C007933AFC7
-3266FAC4C134ED818A48E7DA01C71A46335C845F9DA5E960B25339D551582B375814148D94CFB781
-FC56093827B78578A73D4FF67B6B87F40CFA5E3F4325D9108CDB64BD06427B88C84105187316FA29
-90B4E3E8EDB6C78ABF164F4A9717D523794B2FE772A04DABBE688CCA977090979B5F47CEB90A1DBC
-167D305EAB231C9F4260C4AD10889CB785169902FC0BED78DA15B8417453BB65856EA0BEA5245BA0
-573F623D215F6C0CF801851C305B355D26B52B0B343645FE25C78A3526841EDA480919A1BBE5F56F
-C10ABEAA3E1FCCA7C43EE560F067F1AA2AFD642F769D1ACE8E2AAAF38850F0D757CD808C921D716E
-96FBC07DA7860DFA70CEAE2888C0ED3CBF9586443532B68DAED9A926655C157A416C383A53D8F283
-2A4E67468112A09ADC837ED8EC95F70852921F50D4417239FC42EE3624CA97F682745CC5E76CC7C6
-7BD99F2180F8C0B7FB49539C8CC474C25C0DDE491671FF329E51BCFA779346D4686835A3AD6633FC
-B5E0F67E0CA9CED8F215BEF4D240453EB2EDD6ADB22278AA5B985FA140C9834D38753DF2014F8C0E
-E6DAD19E8FC54C03C1F6CB0F858986691D99592562CAD95FA0A5B2ABE4A8B54B457D42E8C33A2D19
-51C0419A72FB94FDA78ECD92BD2A1416459E9DECA9469F35E4C47DB531726DEE8F203D7042EDB32F
-025DF3D582547BB1D45F7A5B70D317DF4EBB16E36B0D798E0932FD2A85B04FD67143E4B287A50416
-2C1F5A037CCD780088C5476385AF8168E12D97D44B0630621759173C8F1E3006B5B1C6D7138B7EEF
-C3CC5F54E24B2C3CA7B41AACFD25E554880AAF406EA4C3C6E21D3B550B040FB1952598A7E8E6488F
-E38288B2AEB6C4718338598A2BFE4D2B9D14C65732DA304C16FF3E1F8F03046EF095B65FD609DA87
-EC24A69278BFE65C905CD0329F6A486B8525B7EEA4F7AE56C2633CD83543269E8ACD6D71F500D82F
-DFBDE7F7F7B1AEE67328549232E26CA55085B6E84D9E2E7F74068F93A90C4654F2F396E57C5F76F7
-E61CBBE523DBFBA6E76638BBA3064DA025A79E3A294FE7F1CC28A3B4C57DD6FDC48E541A85534B25
-E1BC11B4F78019457239EAEFD4BE9007D205F1D985F389DB22400B279C10948551A6B4A17FBDA0FF
-C9428B18B43DC76EFB15FC2182216F1B60B4E344A03AD6C00F141EF99F89F24C819C3E32877A927D
-84C2D006940F39CA8B71E5951673EA9BFD1749923219DE38929ECAA9CE43B06CFA7DA1BBEDFDA56C
-61FF6C24F40E59B13870D5FDEB82D981154FAE5D6D5152DE69339359461A41A9713B6BBE47E868C9
-33CD74C75DB71D13BAE4DEC85E02FAA14EAD6C0A253B16C79514657B15E68CCFF9EE6AA385CFF9E2
-C53D9AE40F85C793E4E8FF50B2B7420F4FE69807BC5F37C3E300E6B3C3549D1D3246A2E70F091054
-1135BDF805E0A698E236B6496702D061241687B7B8D1A0E517DF0476DA09D89667A7AB375FD2672D
-CBAB8124E511502DDBD08BA04D941DF1CEBDCCF7ED48405CBCC33774A68C5212FC6F132641FF413C
-984F8B43BDFD7B1A2A3435F15AF07EF4970D3E4A0BB947C181E9CA27CC14A35BD1BD096875B45873
-8CA244F88C28728B74E25CB8C4FC1095A56CA75E4569AD3082EF194ADD11350DB3B74B96761D4538
-596FF7243B1E1B724716A144106E080D42036444FD472998460CE9ABBD05B42AF9389AC452BDBBA3
-A13A96890025789F16B9D92251FD3B3BEB2C61EDDB370A20456E3BFE5F4039E2557C451C524F8087
-015BAF3FF05F51869FB97512968BDB2B49589C1C7AF1E085250A47657465F480B7023E24C76731AC
-0EAB6704123D77977D3A2C4C56B691346EBE589C619C04515D34F81FC6A17527D5D8319013C5D4FF
-27CC3925E24C99231AC7FB9EAF0BBA482D3B75807AC85D03CD09DE5D9AE0B07B7A813F0449786500
-0AE8A7E00080300F0AB8C399057EDDBA273DD2E1B2A0DCEFAD3B332E6D4AC1FFAD846167DFD70E03
-46DAF84AF292D4F424256ED5AC4E104F80697050D50844A708EAC9E7F7784FD01646F3BD0C595CA5
-1EE6BD607D254E78ADDC5E15C3B6AC4940EC865A5C23105B6BE09EA09F2C05D6D76960A843B81EE4
-33977FAAC3CBDA85CDD2F4DB7C28293A77825635992AF8F3B38B4480D9A139B1662345A8ABE1634A
-77496C3F57597D2985E9E54717AB2E99CA35789441BCDDEDE9A9E2106B401D9684ADBEFE40D607F0
-75C179E9CC03E59E65430DB70B441D43DF03F2AA6FF06F224B6E455B01C64FB89EEC9103E48453A9
-749B4D602808C7E408A8903091D85E06AAF635D0D529C3CDD1B8479AC0F4208C284BB678A547F2BD
-77BB17C86D4560434F7AD1937760A6AA55B614CFA9FF8C9C96561AE6C8F2121C4E20237428BC51DF
-2099B6C49E3EFA18E6D439E6E6981E746EBB1DC461259D8EA0F8099C47CCA27B2D982B72C9A07CF2
-1B3C05D6E26E6E286E348B8944078E24809F9C5F3D014B4CBA02533F5621BFBA1F0EDB776C634746
-703C9F73BA89B1960A496420C68F54E5B901A6D733D7ACC79F275FFFB253F389AA480084468BB34D
-A1E797E43B7F6E8CAF5E8C93069A3A2730E57EC39B677BB73E3F07C2055599F7062E53B37A5F0099
-907D2ED87FF7A82C95FBAEB888033BDFD67BA3A6031A4CDC56CB1E4CF5B06B46E16D988BECCEFACB
-9E1C037023D7BF5CCF5D65AA66A17AB361BE7981F132A578F3ABFB97960A6034F052D9D5AFDC0679
-782EC90F240F943A5F9A3D969ED7399254FF67D89DF668F7C56FCEA1FFDCF20481474AC8495D3AF4
-B6D7EE093E369C057F0B70858220693B398ACF8E8143558132E4391405E30A73937C53402E459F4A
-A3539CF7A99A3F51C0307D045DF8B77757E92EA2F51BF0BB4F77D3904DD355665870C2B59F1ED7F8
-4FC71FDD7F0B6C5D3182DB77827CA6A2060D2B8C83C4EA4A432EF43A4D0A952CC6CBBE52A9F0CD66
-1A538973DE41FFE9C5CF55F2506B9EFEE51FBAE5E63BDCF5528499A47C031163C88D3022606784DE
-2F46A9C9235AEE3D4F71D4959B0CFDC5B7E78C8C0A8F9DC99440C2263DBACB343C5C648577F5610B
-50EAB1CF7FD02419EF3941C7CA0B0E64EBAD4B2CB05A0793DBC38F1946D44767BD287F5E9779C611
-CA0DAAA1E7393DBE0683C8D3455CDFEBC0E64B54B737E298DDA605227C0C4BBA87AA3EC7FA6EBAEC
-39E6EF2537D5974391D31739D9FC42983D81AEE44711C823F35F8E2321AC74943871739D2DBE9748
-FE68592263E7713F27E0D49B9B5CB7A4E55DE54E6B800D15856450FFD3AE5F287B12AE4F438B20AE
-9E27E6CAA00F3EAEADBE08432684FDF9931E925544A680182602A3C1997DE5D0630BD5A010535E66
-E1C123013D23966B3545C7431C39B97295BFA4099D14461004C42C85095EEACB9B47C593BC6DB863
-533A8619BAE09095DE8ECA432D4DDD49AA600D277E75DC3F5C6631E2A05382CB007825FADB77438D
-CFA78E252D79B6A196D5164C2FEB85D75ECA25FF80B1D97FE10E87960CA0FC47C41D3A213BF141B4
-8BC3AAA93FA86245064668394665BFD52D12C3BE4CE39EFD8111754398A944C3FD1AFA98EC337BAA
-AF899D35E804CF416AD7FE45FFF13FC6354007501043F98FE8428DE8013901BA6A28711A2CA85A27
-0BB135B72F1D5026E8217581860729E94F2F1878A0E96C59E9F62714FB5F8F25003DFC7347E99007
-8A9A331CB3A6A535BC61866F02513DEB982C4A13ADBFBAC3FF70A7335F40D5489E48E5EDEDEF1619
-1973D932479C62183B0E25EE8C4F76D4F1AE45DAEA4A12AEDD9EF81D248E8D19F8C8A5BECDD1EA1E
-98783EB7A38149170851B1942C96C53DE06DEF80913BFC04E539EC67C110498D15B78268853E5C72
-F485F8A27B768569E54241F6115875E2973292CF48FF91D45EBED627AE9F0766D22201B20AFDD40E
-5B17CF337F2999E0BD15B86E46EB3C18FC12B7DCADCF9DD50C6C7E3F37E615A892DB3F57E250A072
-A49F7277DD6A2C8042698233D35A699B17ECA5DBDA6D250ED4A16FCC893BF0DC2E33FB1EBD7DEDEA
-3C1C39603C8B7E1A5A833A8FCDD5570BD088749BB232615366687962C7E56ED089CD7B092505CAFA
-5A80F503C4CF337F07ADF0D106937E25670839D491F7BFF7A523DB609D126328C16113ECBCBF9C40
-04904427A108618AE5D4ED809F8CCAF72251104C94EC5BEE21F91B179D31DBA79CEEE5EC7FF698EB
-84AB1D2D1A624F58B3622A78844CE51498B2CEF38EAFE259D22C7BA61104651A862008BC1DDDA58C
-C45F663EB26428DAA85E7785363A69D2790996EF5D9621D53042F42F794962FEA46E46F37B8AD1FB
-76FC8D5CF2146843F8CC625139C75FB42DDA71A752BAC48F294E4C0C8289FC46DA5EFD9C91BDA6D0
-27518B7E81E8B21F755A9615627D5812ACA674D1527A1185EED4E3C628196E7D0759B1CAE6B9B7E9
-01E9599A65230F1EE469CD33B9BD9C104C44E3C1AB966C9678BD0AD78111A4E0F2D07A01A038CEDE
-7036D0534D684A1562A17AD64A00F279200C0371B1CBA61747671D2A21D3F9646CA290F6B82418A9
-6FA177C6278277504B7FBA936325F5FA124AB018A15DC18D2C5E8F93CDEEA52BEEDB78A57828D81A
-3E6C38B9FAF3DC4EB7273ECE3EA4482A1C6242A335862C2C3717F9C9ED95F77B140C4E1569B2192F
-C7DCF702D0BC9A50428EC406F8BD0CAF886B4D979320D3E429816D88F7C7146D960AC12E70F2CB7A
-9F4E3E366665AB3F1B4B6440F55EEA26DC9EE0096BB7763731740A537766490C8C174723BF0EB40C
-53701AAD12B21D436ADCE22203C1053A9DC4E9F17AE617888C4B4E6F3A720E4E6366BA628221A387
-D8AB15E04AD69387C310D3528BD2FAA5B22BFF3FA494F5FBFAC4F771C9C7402B95580C5AC4BB3AF6
-92A70CB2C851FA5CF1173EEC3EC29B5A05A0B728BBBB51D3B7AD8B0AF17A1563E82FAFD93F8B7118
-1FB7AFE352874F4EC6D334AB6747519AB8E847B7BCED33EB5458A828E074E74BA621BDCD03FEA604
-7F7B6ABDA01FC7514BA1AFF0D4D0C0CB8F4E42D5A87E395D9ACDD02CCC220C157153422018725846
-009A3ACD8C8CDDB66BC6836B4026FD9F526AA275D06C813179E5924F26A25094E7BDA8BD26AFC4CE
-B41D8964D4FC4AF1DFB0595BC5D6714C32F15DC7194E9A3A73013C45D8FA55CC0550A12D9AAE8E9F
-F199FA28EFC2426D8D1DEFB93A65717AF3EA8E2D5B4AA8EF0EF38E9600F7D4E7D9F1D67A2E63ECE4
-789FA74B159BFE2F91C19B0378BA52E93DF12830D99553B6618645E26126842AB70262D96E35E5E7
-50ECA0CE3458B3E51BEE2F21191136DFDBCA39BDC07939E521E4F492F392DEBD029C1EA237BD89AF
-76BC89F618D530160AB16269FA6B693CF14BDC4EC7C630025703C5337F61458FA09104EB15C7CB20
-AA4C9BDB7CEF3A09F25BC7F3149951A7CD75372993B80CD2112F7674CEFD6AFA764AA3486730D2C1
-897A264D82A91709FEC4A21E30D812F558451804EE6F3DEE2C4C437846BCBDA07C5B6CBA1D94AF02
-9163B7383CAC6E088AB1DC14ED3743EE77E26EA7AD3119A76C0B5F925C4DE305CD7BB3A09A453947
-5B9BD79BE28FC462D8718CE05F9D94CAF3387BA55E6E447BF81A9EDDD3A34E17BE66BC52B0C0BB6F
-86F6F008829173816D205182ED2ECED319864A796AB65D4E3950288BADA94FA32B6F453AFDFC6C39
-A4FCFE60353A64627E2057D4B379D3240012B3BB0ED0C7876CB83C1BA5EFB6E2A03F340C2B576731
-F848F762A7E1CCAF267EE06D621BC33FC245D0E1547ADC12CC0EB58B26BABDB8EAE9CBFBAB93836F
-FF22BDA1831DD01B7346AD377AA298D84628BF1C07433284B0A90FC89F5AEB2651BA2CEA405D4F52
-DDC0E74B871D43F71EB4ACE0D2B401F9348EAC3A2EF0AD295036BF6CF6F870D58E00B619D50EA7DD
-77BC28DEF91D805CD527DCBCFDC16C042BF9B874E3B1567EBA4C1E70744B9E7E5BD1FDA6A5FF6E10
-1613FBE58DC46CFAC1A65ADAF65E49757E9304E2AC9A91E0588600C709A61D4231730073A36D473F
-518A145E141D0A5A494441B9EA99AC23F60F54F8127B477E1CE698BB4129B4B1DFEEDF10D9E665C2
-47A62F112F5CA30B0AE5DBF3E495FF06EB28EB438CE8AAAD84D5F50FB56A3AF002C23BCF66ABC270
-7AC233FC0F2723DB99D2CFE7D3B3667732A531F5DC315CE74EDB9050BF75D29E6430F57CB6778B2A
-CBD57DFCEF896E6766C8FC5C9F9FBD701CD62CACF33EE0FC95E78DADD205B5F42CC63024624BAA0A
-B4DD447832B4E1DBA77BDFADD223989F8E958C8D759AAA37930664C6EFEC708116248A2A7AF3D656
-DDEAFD009B7F5333854608E67E5E588A857167ADF9225CF6C641F5E19C3E08678A281199EDDAC831
-B57223B1BEEADFDCBC8F6F25D32FCA2336C808162E8F381656E847FB6CB13969572425AA05AC830C
-33DE6E030F86A3A85D2A66A77F103C7042C97205526DC882EA9A00EB8BD5519847EB424C15F808A9
-1652A6CC89B66A5731126DEBADE123C63D88A2E550FACDEB3886FF98646000C64B3A91078012CA30
-904B71737CEF6BECABD43DD702880538F5A70085E6CC6015D2163681067C3D513A8C66032C34A0FE
-17A58AD4BC97CA69BF41F11D5E910FDFE9729652D3EA21F8DD8CC19160A8FC77573B1E9CEF4E790A
-79D8AD6723B6804E9616466C935303E063DEE29CAA6C3BAEBF278B818C2EC2F13ED645AB452397BF
-00DB8B26E115026E256746CD0C78A959364FDE6DEDDCD0F441A61A1EBA32C7BC172BB09512148D1E
-BAC9E791B7D51B71CAD2DC9B83B2F99B3726607D9CBE58B499A13753CE87FCDCE21C0AD0528ED0EF
-B9B2C927F57C78C626248AA2B835A0791244C5896686A66173EC9F802C4C633A42B086334D2A4878
-0E53D00809247BE64E529F96AD2F8B3922A6097D414DDE1EC76F9552F9B8D58B8E34F359AD792B2B
-E50C26DB05035E7497162E7C49C38D3CD9B98D620AA67492BE5AFCA3A81A7080185C7F0B5105223F
-1FA77805502A2E8C5FEEA27699858D84A95842C5F2FB68686D59FE24091FCDDE139B6463BC6C7B1E
-0E90D20A83651AF00C85797BB9F53ECEC1675C7EE636D0D9E77DBD8F89670F855EE4D4800FF3F695
-0EFF09BBF8A0DAF6B8242840CFA5BA73BEB95115F4A78BCC02D85ECCE0C0F2EF6F328AD1DD6CC049
-5A3315B414A4D61DA50DA46D7ACCEFF6EE56451805D26B0359AF193531F95F6589CEAD6FA041AF15
-3067F88A0A2FECD135C56682DB2B45A71D1FA737C064EE9A4F404BB72A70B3AF0330359393247EC7
-81512482579865240A23CD8479F21C2C44A119EBC4E81B308DD8AA86E60C3DD8ADA50E0DFE8308EB
-1A7F201EDE8DCFDA405AEFB47E0E6CA7DDB376DCB21D37F7ACC4D3E9F26B03A8DE0E8940CA3A9E75
-963A389DF8038D2C486072F61C0CEAF500753C7A6352B1CD0338D9212B42A4D3DA23D5BDF44C27C9
-4B88A415A3242FFE2E1B332477A21D2B9CE075EE479C6E657A4D8874A8C53964229310E01ED4F3C6
-86FEF5258EDF3B464DD6FFD7F1CAF473BBE722D60FB14AB4918E93878A8AE4773930B8CEE110F476
-7F42A52D9304C55BE12846C911A10AB9B2E036BF9DFD597F5348D42233315FA80D0F563C388BC253
-2103F05E90DBF1923F229F980A2F4585C7A373511372D07DCBACA583099EA972C03E5AA67E663882
-6DB134564DB993CEEB6E7A6659C7C5C05C310267D5F8A24EEC2D5CC3E3F3C808E6D6068D1A57646B
-37FABD98ECB7BAF99E7D9AC4414A491A73CA34C52F394352F6B5A15F0FC4D88622DAC694699C2464
-84ADAC3B1D366AFEDE2A2CD2042C90516A666A19A91C80248B11224BEDDF1A320E230739E755D098
-B6A67315535F4C187CFA67ED817A035056353FC859BF286317996FFFB478A2248B908FF12ABDE705
-402224A3EE5F463DD3D243875C84E02DB968ECA1CC52C75171EA50D6A88CA91327A7AA5795019F36
-C0A19C093A1C9D3723C7568F9D41F2E4FFB712FD47F897703D7A620B586B81936C84AAED61D84332
-B3BEBC4F95B796B93EF7A1F565C494F8A65EDB21E2EE18DC025522EF8E599887CA2836069CDDD889
-88E5862977B7472584303198CCE97EF9F9E1446D1F1F5ED1CFC666A8A0C3A03E1792EFB60A9B4065
-49E0DEDF6ACCDBD98742568B4735A747D8E5DE21E630125AE0C691D054E42199C15B1F80CAFA6E7B
-B2005F374A9A5F9900ABB7409CCD50C3AFCCAB1214E6A856F7C7EBA89BC3291801E1343DA9DAD2C6
-ED075C8ECA1423B43E587AEC67E6145272814B3F191B3C285639F9E2D6E148A02DC2CBC0E054D629
-5CD05DBAC1950400A9189316F0265B86A732D302C5BEE8ED233768F237C62600CBAAFF3A110D5EFB
-6CC7CA3B92D965CA7C5E8D3E64ECF239FE2507FC797FDBE54C1112B28D4DA44C60AB09D994C5BA78
-D663A2591934CC052BC70CD1DCA3325C66C9CB982E2039F5DB70C848D3DCEF655B1C2CD0CEC8865F
-E8E1C0A267BE4F707ECE6F5A3DFCA3CC1EDF92C760439F51AA69A4C1801E96CA4D6EA4AD980258F3
-D15C893913ABCE09101984C61B91D603053E49A97CB82FBA707DAE8AF1D579FD69C8481CB7B712CB
-CDDB4D287BE995E32C02B399602A08B9DD849039B5673F1930BEC7BF366EB082D2CA5DB2385C8CC4
-5BE3FC0E31820191A814EBA7C4F23B1938E6C4D800732787CD2CB97F762DFC85D4B798809B5F2254
-D826CA42B32695428D120298B44CF38494E56240B75DF1E41E46E53C44DC505452256DFEC819408D
-605FF14D6C1F3F152F2FEA96EA0AB3B472D8704E06BE9F8C3E8395CAADD06D6DA033E81ADE5DC3B8
-3DAFF743C6E9E48716003D358DF63CD7FD3E2F727D1F2D0C29962F76D5C95ED44B6F08D052025A66
-5785F264A3D5F5593677B630E628B5EA81FB37CFFD7A30B7FAD226B6FDC82B0878AF4C0EC4F4243A
-807B9839EA62BCBDF7C2E9B30A623876E632E084EBF4A21EDA04FC88A1C07021D0C72EC3E969D449
-FEB08E5826EC20E55B21EA71EA59F6E3B0710B0DDAB3261B4A2029ECAB68C19ADD5174E55D5E984A
-4E5F38F592A302FEE6ECE732DDE841A28672C620CC5D687455A5C06FA9FE688394A04F96312ED025
-B7AA6FBCE2925F3AE559CC1886BEECDB70822E2E5CA3F732A87404B1536AAC469989E9610CFA440A
-CE43875A70CA51F36CB6F629D9424C1E35A88F92D5DA3CD8CBAE6E8425A36968E21F4F30349749E0
-205BFF8D552837D6FC39532525370BBAC833F75F1854C93FC533A4AA53ADF7008173A70D94A4EBF5
-38EA9E62BCDA7C20E0A073BEE2EFAC34D2EF1D03BABD5147659E50B557045B2EB89DB303749B04D3
-F54B43FED612FCC68206E001A7AFE90230D9C12F74A32C7EDB5D0241DC3A5D51481FD7C8FAE08FEE
-263FBCED7C7D911B3A303C835AF5FADFD218F61A9D6DE80485ABCA88200047B094441F7767B97A24
-E8C612590FA2407BAB1E8B56C71914EEF2355DD97CFAFCC192BC06FCE063D3D9D1A629AADC75E3BF
-207234C208E7E30663EDD691043065C9CBC473D97C6D4DD3DFF59D6A9ABCDD4412C3128F603160AA
-D8F81C6E7A4DCAF35F3A99B4EA10A34375B477C2BF846521A7EABD4D28078E9340452A198F3F5ACC
-3DB7E3908939FF6E3709C6A3FD9889439A4AE3E10B618CC92E14B68429A3AD2C80940A1079452EC2
-66F254657BE7D79A2A24084AF73F6DF71FBCD32BF6913A3FAB25F977787F7BB0C3A3E8BAB38D7A2D
-B0B4826950643DD1E03BD7DD1FB149A33862A89226B7CB454DAF613128C2075470E42E70A9444A8E
-6ECA526345AB48E6F5160BA23B5BDDFDA6049EC44ED1461C7E0DD514B16E2FB285F72039DE3C7982
-EFD40D7F6C8E8F4CF35AC71B467BFC578002E8D2239A2FD2C4BCCDD8AF3D7DB1F4AE7F2D2E0811DF
-9D0155BA6EDE50B5F052F14F6AB884FFF244D8806C07EBCB49ED22D85DF696995991A954AA97A1EC
-D86ACD76E061B7541E87997FEF0657A826BD88EF3A4A5920462C6595E7A156F453291CA044CED810
-860C3B0149BCE73BECA713040664AD0591304106129600AF71317B0D2907839CEAC99515D357E980
-B1937B6E1200AACADA205421001F1B2F91753E80D2263C56AA164A74701A8D5FD28E46480B0DD963
-A683A1F355D7FB4463C7347C94EA5E2CA40B60B56297CB22D972C5BB10E56715A955605256C1541D
-9F3BC5768A6F355CD3B863F0FA1A781EDB49368F51B29481CBB41D4AEB07AF9DBE8F52C5D0FF75F7
-FB6431D37D6AED84D78C778871CB0F715B4F07580F23B586C969C81B471FF6A6C7276F7E141E02A8
-584D4B9AB00E7BD643D2C3FAAA299B1F1E25048461952EA42D4882768A70DE46B213A287F8D31AC4
-6D5436F22A796C05D1FE50A9BC2A928066627A0D87DD57A3AD91DB446404B41557D1457873482005
-EA20916BBE46C613F456C849D46BA79D20627B446B2F49E3FA309AE14F8C420CFD94922CBC0FB9D3
-5A0F7DBEF577F1849A1A80E0011DA8AC082A8C6F61658E65AD177ABDF23EE17C8CF0D26B9FA3A6E9
-4837EB9E930336889767A8D7EA3CE980A8EA95528B004957BE6067CD9BD8E02A0F23CC1762CCA656
-D33412FF45E917FD4A03EB6E8C1F43FDB0A8965A33B4FD26BC24A20B304CA817E88495BA9B361A3E
-933717FFB0271F7F70C5D3CBA1E86D0F51BF3ABA194DAF32C35C796627D00C7B2271ACE2463E37E9
-7B3C826CF3DB60028F240F9452CBE08F7EBCC5FDB1BCBB3C327A9F450B9E5671916101D6E3E5E458
-CA31F04D12F592F83BADA2C3683D3886AA3B403963AB5DBE220FEC00037A745839F67A3635DFD3BF
-F08F367482962DED88ECF6322852D643A54D5D303EB04BFDDEE9BBA1EBCCBA7C653B3A613A8E719A
-DEBE3CE1BD7E754E5F4977E863E3C2D388A65227B451D4F3A4F94E06513CBA4AC1F2F511613FF035
-611684CCC461599000E546E4D972CA6960E095A526E4735A23421A4C9B597ECE08AFA2753592BD16
-DED93255A1E33DEECE3C5EB77B94670E8137F2A4A4B98AC193258E7DEA5DB8408A806188F2D1DDC4
-40CCF0E9A6E2F0C78FDBD7B68DD4939D2458C1965BF8BED4564B32462FFF3EC892C03B11D3EA813F
-AB4CFBE8D3016329C5B7E3DFED0F08284D44AA0B7A2F6BC96EA4503E8EF52A64C22BED6B452581AE
-8FF8917D53976471941A9116A2D878FB2541B561767ABD4E31CCD8A590CA03494C62AFFD64EA0A1B
-C779173DAD84999C7A8D844EB1259DE7BB5B25CD023537A474A524EBE4660B22568949E624D8FEA0
-AD37F4CE1EC75955EEFA49C6BF1803BE87E9C9865FF3F6B8525B8C15FE8835CA153D27E6C0FF0CA5
-1029A7A9185D25F0F14D86FC797DCC1F99EE97E2054B9C2A2E06FDBEB8DEF6CDD368BF23A858D9F8
-C1DEFDCEAF1B4A8DE5EAFC604CECCF0D285BE00AA912EAB66EFF4D37AD2EFE34853BBFD87CE09B18
-749B489943EECAE7887B006FB827D10191DAD18466CD1F86505879310A8B171F902EA0C26A388E13
-B53C700272CEE2BFB47ACB58247C13449C6BB9D01232C32517358F1A3DE064D43C18F8827D53789C
-CF3CE2EBE78949A6ABFA1A6B8414CE360A5E22AFB7D1DCE6F5A06182C3B984B4F9BB1A905A9D5A14
-83750A1DE0A857CD5C06945EB7D4A2A6BF1237F32A154FDC06D51A703D44FE052FD3C53E9E8F417B
-35D1C851F9203A8997521529F21AD8498F96930AA77EBAF82EE02A57BC77C792D9F220294B45F48E
-A8FD94E01CD25645D36D168923562F3FDC93CB79DD4760DA0C103C2675722D7A1B79FCB4245ED12F
-A0DB52492C9CCE58B333CFEE822812F7DCA68E802C451B5CFAEBAC608B950386B6C58239D1C62D62
-4DD5D15782FC552222CCA06DDF387B373E32C3C2864C63C768350C37283760F3515A5B0AFD66C48A
-B522EB3E808C061F5CD6BD96CD18C9839D30508E7D4EDB88E8F11E31E10919B16B7971F06D7877A0
-58D8A4944C84FC6CAEDF3341B48B6E0D3C7B85D710E0C35F5B5053CF4B4798B3778CC28B2DC7AE0D
-F3A49F9F3BCD8E95D746C35C3F47D68B8AA35D97AA08E711B5FBE70D1A623C82541EBDC51A827D0A
-69E6C049087AD26F256EB7577F58CCFFBCCBA5A95D093DC29464C9A38DE95BC6B1853963B2DEB0B5
-7AD1248D6F1625E115EEB9510B5772AAE4E3C866657DB0B3BF0E0AC345E116F8D4976B770876FFE3
-748C36165522991F46A36F193DD1A1C94713673C7E4C81582391B636C72DE94CE6254374F99B623E
-5686C13D8A8322E83E11BB0B0A896C6A8C2C4F756C5385CD7017F26D23F7C3EE97372C868C8C9155
-81723BB6B76B4C3CE8998E4FA6CA40B633DFDAA59BA902A4952DA90EC4FC3CF0F2676ACFA7F76F78
-236FA2DE10FD3545357215246BB7E527F277C28B353CC6D79DCEF21BCC8F77603CDD58A2CCDDBE3A
-9802F941CED8E035313875319548C41992A2BE939A17CC109426E33825AE59BCD17CB19F50D972FF
-CBE7D9B4B0BB095303D9DC9D406696C2508D6CE99E11CF00F6461147E97449ED5F486D480A86D3A7
-ACECB7E9A945984724EFC21C5079B1FD03ED803C2DEAFCE3327D2D7827715FD65D9506216C88B0FA
-26935E95C64114A51919D419038B1A7E9C1E829FBFB53275093752DF19891A97F3CBF7719C1FD6CB
-17019A6D2D25360ECA804C4B35172662CC4769D2B785C6C87E5A4ECCE31704E59F71263B7C3CAEC8
-ACB4C7426EC25F11A0042323EE6C3EEB04284DBAE2C770BC419DCE79BD4560AEA41571C3B595F525
-60191DC7A8FBF63D413A77A0905E517441B16C2B501EA2F9E99CC38D052679F288FDF1894542E3A6
-6989A0090185EB2E75134BFA3D9147C3DB8A621D9D35E37786853779E157B47F71626D6B3E633005
-9159C17596C1B87FE2B4FF47ED9D78FA4C2160077276C8B58CEF5DC030B4A5D83CF257096C047FE6
-4DE307C598B815058E72D5F57DF5C369E664E137DE29349E2F9DCD8C9F4EBA6E765B6327D7A20DFC
-B20711273FD8091CBA605C4C494248076F7E03DF65A6A50164980BBBB708741E5BF6056E6F996DC0
-7FFF408C5B8EAB8DCEC315E92873228C805D4440A6470E3EE3983758DD211C9CECDBFAA4C9300CBA
-00608A4B2404A3C7AF017A3B7E67F39F0B51ACF950D3E75CC7BC2B8D3480202FA958E8EE0B240501
-5232EE0D264C7CA02C18CA45CB3C2DE322D3EB7F00F9455DB6C5B1F4E59C3E95520EC36D7D903CBB
-625D70B54BF6F8255E412604BBB29FEE026CC660577F91DB1DB4A613EEEFB20CF7AE3CD89D565AC8
-38416B01B5DE4FFA5550D17FB51FBBEBE21CF1D56038863EE931B90DEC2E211ED42BA92EC244D4CE
-2C4EC5CA87A026992772DC2AF754FC982B94F36EA7B7BF75E0ECE90CBB2A6AA1A012E8898BD679C2
-3CB3827C35D5D02F0569C7AA82615D4AA67518ECF668D3B57D6EF1A8013424AC2268BA0D9A74D588
-79EDCF6382A89D397864940303EAEC45A38304BA8B1CB198967AE23EB81054BE74B16909A405E8A7
-799CEE3C270FE2A6DC50BD7370B6B2C8FDB9A87D88D5D40348D3984E39C693B6F4486D994778607A
-80A3122872DD65E40492107C71C3CF708A9717E9EEFAFBDDC239C53AA9645B711038E59C8B861B37
-411AB2039BEDF9CFD00F08D9C5D76154427FF5DD39878CECC5D7BFB3F1F035087185C0981F3C2139
-BE84872FFAD3408531C4EA9387B89F5E3EC779E8850D50992DFDCF9132BC551E985943B07618AC10
-D1150451F0844C0DC41D6E17EB508DC8689EC726400D5A7F6FEB3CC7BCE05F09228B7CB2C5393664
-D8DD9A4B96B1020EF25D70AA2D91CAE93AFB5F2BF0AA18CA5C599FA1A708EF35BF8F7FFEC9AFC1F2
-42870D028B2B1459063B493943EF1283829783E1010242E5CF4DA39D93D506F3892936E7D6CF1124
-70A521D397438733D053944CFF12D6FFAE8246F20618684F263715AA98E15D72A526383E05C23214
-B78338E5B476F0981D90056E6E5D0DB66B1DF2298E597B2ABE1D817E18BEB056E65EDB4234342D96
-00470B1420C9210419D834E431B82F58608C87AC361A02D0F1FE4B470A3D71E0D21BB87E1023D428
-E23D596CB9E1A2184403A16E36E644BCCF9BBDE27290485057E62827283E7380AF786BF395B3961B
-A5EA469C315763FA59E0F176EF81985F38B882DE56A74D128E256D1B89939728E55A92ABA21A6B78
-44FAC1BA7BBDD8B34A18194A2984B000380FE9F672E83EFDBF276FE797A325815B0F25CC95C97A9D
-ACF56D583486305D7C9E51A7E337D14E3B900333EB38FD93A99587DA2341B10C059C71CE080FE753
-3C0F059FA40E560AF9C4A41A4BE6FB45846FF8F78165E10B4AD40F264BCF5596A1E8EF8CB6EA4B1A
-3A5C69059AB1563843679ECB2511A90E8898F54295649CB73D277760D8D04ABACC7BCC6E777A0530
-E2067CCBC08673F9C8C178F9D672AC8A15E5367F0C5651B53E75E0CFA57C931746AE1A679C246D7C
-9417F1CD89DDDBD1173C2F880B7B3847CBCCEBF99F7122E832D7C9BAFE2B54CBAA1ED48158DE3F36
-238B76B0E67644A28AEA996DDC006F6AC0242E4B667639E7523CBC90A0561193C1AF34481C2EF402
-EE43A82E1EBF4E3D601BB36B2D95CD93550D61CEE7A94E72F6D30C32C8F91A61E964B1F66ACFC398
-7F95D4028F116E9A9A8474AA29C1C1A984BE0E393BDC41DCEF6A6F1018DB60D52024899D8EB5D55D
-324D73F39BFA47377B9E15B3B06A7585589FCF52A54684173E5183367E7B0952DC4BC2767C4C6247
-B1D6103E52BC7B7EA6298F454C5D97AC575F19C10ACDFF4E10C7D3755CFAB4200CAC545269FF1D8D
-B0D607C7AD47F40DDF257AB4E7D0750577003C13E4941960C3DD7B0774DDAC18E8ABAF8F53E03CBE
-F6D57B44F24CF821014C064278FD51B3427593D17694B4ABCE81F49CBB984C5878CDF0C38D1ED7FD
-99B0B9A3BD8D8FF6219588B3B8FA59D0CDD1D9B2F65122AB45E48F1757467B9204926140E3C350C5
-A927A2E700173053EC35D3F1DA2D7258714C97FAA857F0898917BD94625C6D1E2D77138EFCAAAF51
-7B17FE187A2212C24A881A2C6A647DEF6376ED80AE4175C5EE80921F001995B44E49F0D33DD9075A
-CF33BB03671C0BCC34AD5784AD1CDFED3A6D9BA103B3DDC1CC2DE74DBB576A0277715275218CD19C
-A8899209125266D8BF1286F881DCC2C383749D1E768D670F4099F7DE959EDFE852583183C9111601
-2881A56A24AAF020EA45CD5F39660DEBCE30AC1C7B8CFC60387B1B0C3E361BE612FDFA9F01B7E4B4
-A18839A2C7E0E393EBC5AD9A8A4EBC316A740C1C295D9EF5F4DFFA0667F9582C0BB837B142C4CFC6
-B1798E9476D0631111033B8BA75A10FDC800E2AB1E0E829632F869CFE4737BE9E2800759EE0831DC
-7D1195EAF80555771981DD6DC6606812D92CB8EF86447F5F6C6F626D0E265C67E52A6319189EE349
-D48E49DFE6A9E98F76C414A1E3217AE0A215A17E54AA498F4ECDC50242ACC7E2322F63BB2FF2189D
-057E7354E32A3ED1803116176B9B9D0129930F919E2FEC280B2C8924E49E7BB75768A2EE1DA8ADBE
-D4E3589906DF1B923AEF84C1BD327438B731012E69BB0D43A1842CB88BB54EA4516477F704CFEB28
-6E3EA483445AD4D74586FCF32E96D366901084365F693A53C5FB532FBFE7BC0CADC404C4985042D6
-8DBB90A6DCDA3531EE324D558A214F935CD9FCC9A0CEBE9B5FB0323F4B3820529599EF48EE068B5A
-CE85004FEA2984F0A86F5AC9D56163BBFE1142B774148F1EB0A4DC89C3349052533A7DE66729DB24
-41B82F8F7360111DACF69293C9B281A0534F3E9E9224A75C49A832F28B2E497262475507B6DDFA9F
-01CA0A6696E3F5AC7EA68595EBA0C2EB8A47813FF936D84AC1B23ECA7AA2862B793CCBB0DF9FDD49
-31BEF354CEC12FBF478559FEC29F81ADF4452E83963E56541D31F3691C93A50F0BBA5E9552C4F2A2
-3A6E53060729854A3DD71CC4308B91957DB19E66AAA18FA67055A950F1C2CFF78A03BC1A588CF624
-696068068719AFB1001C4581EE072113882D9052B21E355D401ED8CD24D067B99E616BDA5A0A5A93
-36FC499632B79FF2FD0DEFB096EF46B75E2D4E0F48DAEA239719FEC4D9A29818F5875FC5041A9EDB
-D26CAF0ACE14CC80BA49BBA59E918EB3D8F1E541AA16026585A2F72DF7D83541816DE46981FB3EFD
-0C30E458CFAD04C79421AB7C4925E23AEA07F9F018431C790002596D26BD9663B51B699DF53E4882
-CBC34EDE88EB55045B889B6062E35FD1E018BCE785157B85EC3B9CA6C85D4B16238275385B8285DB
-012D8FB7C9F5B946A41D7A0FB878FF72C39683144D8A007CFF631B43748F2D5FC690300F9BC0C837
-006B92ECEBE0605E8C3A4A400E18AE8997D1B45FEE10068E247C647CF82C6DFBE5E881D511FFA687
-B7AEB78546BFD07D5F7EC242DCEF4930D8AAAD8C6152B6642AAC325963FD147F236BB850A9966573
-9D06CDBD7CA79A527DCF461E33F22BC9C5DB00DA2BD3DDDD8C99D99793BC98282AA8872FF96C3942
-85D82D9419EB78B6AE37A5F519397700F75D624A09BD255B576E955A323E784E8FC31131F003B0E3
-024A4F58FEF2A6C043796201FC425482E1155E229D1B2D43EF7B0D22322B22EF5C9A1BE026A1C3D3
-75EDAFF99597E1E5477952A4E8D2ACF5D014BC00DC2A272FA62B6983E27D228881E2EF2B8B95A681
-CBE90C5FDE16331C85222FE2A16F0A3C3000A63E2E21666C0C119F8AF89A543D37977069A5ACF155
-6324F05204CE8CAD50FF4FB630D9CBBFC324DEDA584AA56A99D3A76FF55BDC2C2EA3A021361CCD4A
-83C7A5E2768D210FA6DE889FD48A39D679C94EC3C99A8D33FF11377DA7F6F1B71A2A05B302ECDE95
-4F26773F39AC881542F0D0969C3995C3519A8EF70B4220D86BF01BEECC6462855E7B686E1AFF1CA9
-1FB8FD8B4A69E10EE0C2AD94ADD44449506F9B6EF43641F2026EFF6E605C670560C2B74706FB949A
-A7E8CC6A2D0D6207E457E7FD87EC1B9092DC68B9143947CC8ED14AFDDCBF8FDDA228A76847F96802
-E561F67CEEFDE45AE587673983FC04C96744DBAA83F2DC838D633943C75DCB9E6410474EB27B348F
-26E505F0AB90878940E846C5E9F3C5FE8C3558C3236B1B88C405716949B8506841CABE1717474BB7
-C30DB91CDEE33B0F844811762FAEC535BDCF84C1C747CEF9B1FA61D2AFB5A81335BC42C06A94D7D5
-9B7EDE55BCF6F9867AEE107555CDD084B7684C2C87087475A39A9DA6347BE281CE5635A4D07865BA
-98CE26C1465B1AB0343F49FF37B4D0CA9F3BB693D78DC3B21925CB996A038DCC172527FE57C07460
-EF39C07D4396E7FA970D9F22ABD21A9C794B64AD96762C7428F59A8757C36D6C4FFB23216195A04C
-2A2C2E7B10EF7193931544D782FEE4B91E01119C5553BBC6252270A8D8C56DD62D448F5AD8DC69CC
-B45E1F17F0AA1E445129DD00F000005B23D38DE93A3BE55A4C041947F36B4E4536E307D0180553F9
-2E46B743881CB5D5386C48C7D5F84C2BCD06B9C501F78C7EE61FA23516791FCF4DB278AF688A2E60
-10A56692AD92008497487EDFE4BD5FA083FA544138B20D6940020887E35D46E093B71F7A04A67460
-DC8116B4D4839625D7CA6959D6831CD93F81AC4EA2709036DD738364FDE71113BF22EBF13DFE1642
-E564701E6F0FFE7511EDF03FE448C2B28C64FB7D54B94CA576E481FA56B2B18AF10C71F699B6BFD4
-7459CDE1869D0FD306BF489A6F42E5B2F05CCF55BB6B9526973D19CB134CA7F13F1DB3716F8CC217
-73A832568C16250B5CDB16DF24BF81D49F5B37018BD310262EA7078107868AB0216CEC83CEFCAB1E
-9F2C665A31585CA04DC01879CAA79AAA5AB201B516F7052B01B16BEE5606098393B0E5D9F9E5E3F4
-EB20F63C958E796DF41CF28839F5C62A0431648745D7837B519F3AA36BC6C08EF040CCF53D9B6D8C
-0C7D1A84D707EC57A3C6AC9A62AB37251A01A5ED40FDEC6F5BE6E34C6A91D058319439778A2EE5D0
-363E2E1F33463C33327D05FFC0CBF08D5BC457C7230448972FB9B4D0D782BA7DBF10D3FFEF8BF523
-6EC16D4DD6D0D870D9D5EB5C64C9A46A4F583D4F831FEE74B0E5B33A09ABFD4444929BD8F638CD72
-EAB99CF2E9551DF427683964A592E49D186F285258C5D5F62196A98532421D73E3495F82695FEEC6
-E1952C562D546B28618FFAEEBEFF03A57F4D855021F85B0C7BC37FCC6DA9AECA099B646B99D41896
-09D3FF2D56422F8C37E97640293EC7C90E3380887836F4938FBF495CAC14FBA5648D89282D8D49D9
-1AF73ED36581139D8BD42551E263E830EA3C6EB381D85C42D74C50DB0CCAEC03F535ADE92128A016
-0E811C34748309AF7604919B66CD43EB5CA975302DCB6076FEB6BDD6FF55976FE990FB0CE9ABB11B
-195403FB26E3D6C6A0DE1C5BE79E171A61E21F79EE8DBE7A832519813EF6B33EA098C2C32ADEA219
-AB2AAC8B093F40000995539D1276D5F2EF84CCD099B71FE4269BDBDB6A8D59C86F7D2E3FBCCF8773
-D0FAE97640BC1AD43CB4B992BFADFB09DBD0CAAEB8CD9DA264187C4F97300E9A6C9DEED5525479E6
-05C65AE336CBBDF4E5D7F79AD098F977285E065579B748FEAA97F2A753E1F962FCAB68D72BAA8EE4
-FF6691C23E31BC0F3E981A96FB440404856AE1AB32A7205B17D411D8F21C8C93B704D07EC594422A
-BC368CDA2B1610CE6A973F4474E12B78B532666797F5755D269772C9F5400B3BFC6C58395D38527E
-2CCCF29B56123F7DCEF3BDE5DC1DFC5B0293BB125085B1D2D929BC3EE84F4FAD571A4991C3DEE03F
-2DB3A3097E52B1A7D5C73CCB6148EAC62E8E36DE9A71C57638C6E4D5D9DED18174E8C390E50B4A5B
-913C074EEAEBE390B214B3A68F02862B9A296DB4B409769649E51D738CBBDFB7702E15C73C2AFC6B
-C37CE15171F4E822CF20EFE55D9F061AA43E648989628FF79E65932390CBB15D8E621333B18B11C3
-BDF96F841D7434E01AD501FEA964A75B248A35CD9DF9A37E48A1E5A09C624B93CE44F0042FA00D7F
-9EE89B9F7AB785E9C718CF6E7228F743271C2C9BBA17E5208B920E44E765D99D86650EB454B0FAAA
-112753AA1BD3A24239E9C5FC47EEB1547AC9D23731B8DC48B9707830DAEC60C8D3790BBA1120F776
-4EFAC542CFFBCD5C05F9510B27B2534B704ECD36C8B041FD49A96881302FFF5B0163A2DD09C751D6
-D6AFEA9170A4F4C4AB8D46E62F763FE1BDA51DD1CE4A27E772F3A2869155F762FF26B7AA6FCFA4F1
-292E56F03AAB6322BF867E7710C34D43B5D85B45AA68014AD7879EED051B1933E491496E3E26D9AA
-8B80A07BF2B94F1077E84A9726F08199887D66DE7A307BF33C30DD9CF3DA188088C03B2BAD09A217
-6B110DB2C868B53DA9A66C85737BA66C93C58A259860E294AD0191E3A72C73F40B0BD98699AA08DA
-F03587B78F391F3A4313C58D9F29B53C70785637BD0C58310109C54091AB0A34CBB0C478613A7AC0
-FB8F0A8B4645AC966395D8BA775262CD291136AFFDDF01C1D83DD4EB3B59CCAD18057FE7D92A8CD4
-A58F22508D9FD7CF356571F701BBB23E749BDDCBF8A317FDA0AEFD952BB18545610FFAD3AC143D35
-1B8DB3F66293375E0E50235F0D0466932181D377EDD32A5F0FFA4E22B5A0CB4F343D9A7E4A342E9D
-09DFF6C697630CD3971802C277A5590B8CA94BDE6B38446C794D072BBCCB724D5BC208EEF1B018D7
-39373BB910D668882CAA779C2D686081DE6A2606417B54D7C20E0E7F722648D893E4EDBAE8F00D6A
-6DA3712F91AE860C756D1127D133AB828E9D80023B50B162C5A1C5CDF70CCB3FDD7EA060ED20838B
-E1E50C4094C9E79E1A0187CDF780CAF45A725964F004253E034C5BE46BBF89D94631F1A33BAA35B8
-4FA2A9D08481C6674126CD96ED05DCE48BDA069D902D6836D5DFBA701DC0F98A863E64F0E312145D
-8DC0B77F25B43AEC729A1243B45B08CA228DD6101CAA2AC5ADCC8EFF84A4CA3F254176C2CC711EE6
-C273835D0FD3528ECA2A976B88E51FE347FDB60F32370B66D338931D6581630ED586F349C638960C
-31AE4204E89521A96E1219E696B913DEB2AAB7A3B022D06F34FDFCB810A04E60A4FEBE284C2F063E
-0AE9EDF87704921CCFA193BDC912B747E13570066223A49F1F6E2AF0D4D65DA04CA876FF7A462FFC
-9C0BA2CC545C3BD36DBE762F32B2D6BE5867C59F479195C92440DC165098B74EA5C3AD93CDF2D410
-B04C16BC7801E7956F4E5107450787AA592493171C3628E6B8F49D4F8429EB98DC52EF025F001387
-BC1A7093F7A99F10B5D2D7DD8BBB393BF6E56F08F4F7FA1A343F220D5A1EAE7168C74D41BE1DC1A8
-3BD65B72B982F4F7B34F24F97F9EC9A91011064031FACFF2A14921A32024385F4E061CD07D152E74
-1BF97156D951A342488FA7F5EF934CCAD13E2753A0AB7A1F565C2F7F6B349DF03BBC25BBD972A9AD
-F809BB5C5048A8CCEF9297B2ED3324D18867F293CC66E88B3A39D107B610DFE79A3B4E83A96D3D52
-A17FE8A62C9FDD271130148366942C9CE57558D023DA5F7501319EBFA33DE9E6D1E76D7C20DB8A09
-B657839DA99F3D8143F1EE6253A3295C9651FA4366547893C2DC7ABCBF4BB7609DE5D001E0A36D9F
-FBE01F7D0903B3208AE8547E2E5F14EC1AF4C2535CA8F4EA37E3F3CE172C7A1E8308995B1CC23E6E
-81190246BCAB6E755BF868D449BB02A2AA87C44C9CC0F571ADC72547CEECBE104BB274B8AC16DCB7
-5D5F458D356466B921ACDEEAE384E2EB1DF6EF393B41B9747F0A4FAEB4AF1928D9AD6FB7E06FDC62
-1E4C6FC98CFB43F88584BD55D9B97CC9549093EDE586912161931162B1B1D52D0443260DABA02AF2
-B4432100D5506546013DA703573FA8013685CC798CE501960093DED713FFCCF89CA2B9106390198C
-29A00864108CDCC1984A8BAB53919028C01B26ECC7925E38CBE6CCA8978EE21C2B06E7B3E48FBA97
-8E2A7D186E563C088F84AA23178B60E4729EE87D67B1091F3B6973676C1CBFE6530EB773C62E2C24
-97014AB0E8B71A1F4E86A378AA26591511BEE3CF3D64C94848582E1354E1605B6457823F2C5E640A
-D3802946BB2E7E8E594E8C04B430C2385DD40746CE8534F50842E74D7115F3DB0C72D1C9C607C657
-3B094AEB73B7A79876CFFC3E2F8C9FEAAA07D3BFCE05B61F7749A8793BE90CCCECA2D7077F25E899
-D3331FE161A7E86C842495D584C6E4A0880B2951D8A13B88C4672080A0B1BE36BF47C3ACE7288CFE
-41A8C1BAA6F0814A947FBD6B3AA72B6C73A8C578CA51CCC96F2352316C467BB960E981F2B6485BFB
-44B577E71EFDA16E7405954BC7C9F0759F5A9F1EBCD2FA9CC9648D5831A68887F41B15081A204C24
-B4B992A231DEF9E698D4C3A25B6F5474F5BE6A601F2D337A58A0D21FF37FD91EB86D1D738893A03A
-69F0CD743F611CDFFE69DB2C6ED0E4611D56F803BB0DC06E7FE85A303839612707647B1BE9FAF8D6
-84122CA9E5CB8BDE2936D3F4FF254D31529D7538BBD4D35539489F9E7316F24214B996BCDCF1818E
-749A71CF0E8845AA1E2A58AA62A48E02BA4564625D20AA220EE719608521D7D7A7FCA0BD8904A401
-9819D371F3F59D46C1354E5FC1A6E5F79B20CF4ACA2BF0F2DE73DA193A6F9ACBFE0B4731C4BCEBE6
-D96FE822965DE965232282A3A130361F188B3AABDA95A8A2790D9240BE008B6A6DE4BBFCADA05B67
-86B9BB8E0DFA0C30043A3B07ED46277E07B9808422C8ED16758B9C396F4EA929D769785B2C9568E5
-70A83B989B25CE200F1727D41E2B702E7F88F1784F4C83FA60A74EB26B2DA95126E508ED519A61CC
-151DB6804F61826C5F86D8FA89D06E526FED97A0DB88EDB432FF32C1ACC9B622EEDF601081AF7B96
-3C9CFC1D13E4A9C74FEA0A1C8E3D8653CD92A944D4CA6B0D306619AFD503506D77732D6514F604BE
-4610C2560931BDE0B40939BC1D126B0E97F72AE1B4A9252123B54F7A27E0CFA4425B4546526FD741
-CA77952B10D13E0AC2E32006A903808FF0CD013F936238C74CC75FD915244C56A8412F37F0134840
-347699508D6F3D7F3203A25B7C70100719582CD588590EE34B3AB13E255B613A6D00386A0104CC5E
-D2C646F09A88888D3751651D5646C5227A3C80E8DA1B0A331121DD2429F1F4775D30564DFF47D01B
-BE2C6C72CE4D1FD9A2077C04D2B0274B8916F6A9D1A4A6964A534F47CF241D5A8E34B23F85BE9ACF
-FC2FEA961F277539F215F8728D6788F67BEAF45502839BCF23D8763C3949352F00C579A9A4FC408E
-C625E310DAE61512DFE6844E82D36A2F81709E1F05B38AE9C222ED62C961EE63593CED7AAF73CE2E
-D3667740C77B309B93EEFE1B4BA65D48575A66BE86743DC9E5D3C2FF418D11F7F211B86E827EE1DF
-C3613E7498030F07050524536D1F8A94DDB6698BE7B963C55CB3F74B676CD815A7B3DF4B1A0EA2BE
-1B0B9A11FFBFD5B1FA49668AEE14629316AF436A0821C20BEEF7B3480847934A99F6D85B68F4DDF8
-859A754E009428AF89A90D1852C220A607FF0806E8080726EDC94D691D214B4521C147C4273AEBDD
-BB4A697EF16448CD9B2FC95293305858DECFD406B89B9F3FDAE2AC579E80CF321EBAE5701FB2F7CA
-D8ED04B4A63115886D45D6120F69AEF1A21D80AD3C2D35D2899F1902242B96CD349E0AAADA40F7A1
-1282B6B52BDD97708E58DC5E2D22D1153E5FA3F3B300BCDFAF98DEC2F4E3C82A1C85F985735F3987
-4F557579F422664E07CBE19DA680EFB0FC82C323EC5C4644C51709AC8D674608A8043C91E6C7988D
-430F10BA6CE1FC7FC0604FCD8F723895250AEC36CC35B3FA14FE2A0D24095DCC30B2093F2298F5F0
-A97676A0BE66C3DC9ADACFE2FC0F721A20E945AFC1096A619075D5E9A264C796EC6C90EF1AEEA8DC
-089B44FFC13D27CB2370070A52D4416C53F364393E46EDD7EDE00799960CE6E0D57E4909E88ADD64
-BDD2B0EBE2D73FA6ACF8B40280DAA0637E705C65AABD523B8815F22F23E9FF81E7829C7E4BC980C9
-143AEBE1A04DC0D253396BBB7268BD5AEEA356B610D5DCEE03135E00AE34388251F31714A1C40E18
-2652C48CDA2211A22CB6F02490E69A44CECB169754C53B16028D352E0119F5D5FAE0BD7EA1CDA647
-12A6147374B64244E21E9EC9F0D1381AD22D5B6212B26C3F9AA5F6045F25DD9F5EB4489EA39B1945
-331AC70510C5752557DE21D0A6CFC1EB10A98FA867B76DA6E4249469F591FD154D39E89364A43DB0
-07AA0D7A911CFAE6CE2B557997FBC44F55A27F622BD7B8B10EC9F5D10F2649A646FD964AE1B111B3
-5B46A252C4DEE44E7426EB5739F24E8A390694597DB3A1FE7800C97E59558322F0E49A0CCE2AD94B
-1E2D1026AFA771723E3F523916F55ED866C9FB4A2F759651C613A2CFF362028CDF9D38F05D4C7C60
-24C533E930B64B099FB1AF04B01F5FB9CA6867E6EFF55A772C5391831059987E10CBF987E3F378E0
-1329F73D54DC0484177D3C3C06F67397955FF1CA4EF8AD1606B70455255D631A7D6EB92BFDBA14A0
-FF28B2ACE7E81AD666EA9B3A0F5A6BA3B5DFE35044FA4B3D8ED956009C60E98CC132F2E84967F4A9
-8A67B336D5EE7CAF7DD1F74D1FA08619941361FA7312CF225D89CEF97E864C8369EAFAB94D97F056
-5505D825972B754F6729596EEA91210B75DD8F645382ACE36DE60819A02B3B48DD00F5485F9264F9
-FA926D732E2C267B0BE8CA98526F124F97EFDB86132C5EF16B103908172FC51F286FFE45FF253512
-E0033F037FF182BA536A9EB2DF2D1DB257D9C86C46E1B002FB32AC70CA9462E6EB48994752CEBCE3
-9F08ABD4F4B0889283E55500702185A841E328
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-cleartomark
-%%EndResource
-%%BeginResource: font NimbusMonL-ReguObli
-%!PS-AdobeFont-1.0: NimbusMonL-ReguObli 1.05
-%%CreationDate: Wed Dec 22 1999
-% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development
-% (URW)++,Copyright 1999 by (URW)++ Design & Development
-% See the file PUBLIC (Aladdin Free Public License) for license conditions.
-% As a special exception, permission is granted to include this font
-% program in a Postscript or PDF file that consists of a document that
-% contains text to be displayed or printed using this font, regardless
-% of the conditions or license applying to the document itself.
-12 dict begin
-/FontInfo 10 dict dup begin
-/version (1.05) readonly def
-/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the file PUBLIC (Aladdin Free Public License) for license conditions. As a special exception, permission is granted to include this font program in a Postscript or PDF file that consists of a document that contains text to be displayed or printed using this font, regardless of the conditions or license applying to the document itself.) readonly def
-/Copyright (Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development) readonly def
-/FullName (Nimbus Mono L Regular Oblique) readonly def
-/FamilyName (Nimbus Mono L) readonly def
-/Weight (Regular) readonly def
-/ItalicAngle -12.0 def
-/isFixedPitch false def
-/UnderlinePosition -100 def
-/UnderlineThickness 50 def
-end readonly def
-/FontName /NimbusMonL-ReguObli def
-/PaintType 0 def
-/WMode 0 def
-/FontBBox {-61 -237 774 811} readonly def
-/FontType 1 def
-/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def
-/Encoding StandardEncoding def
-/UniqueID 5020947 def
-currentdict end
-currentfile eexec
-E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942BF7D6DD84F1664B89
-699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED2AC419FF2B2BDE605B8EE3264EDD6641
-2D4F21C64AC522BDFC7C5502F9C3F3E5592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A2
-5032519D1868816E44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF
-9CDC7A1B1B598C69131DEE005B415805A16D8A123E6A208511C6D0C255B9A5BB2FDEDB4D399C6CF1
-94FFAC236883767C0F68F4EF84EE696B677DE704EC3B097384F2E673A1F51692B7B260693738C211
-9F7D90FFDB21EB715FD5B8134FC87DBA320EE54C2CEC6A4D6BB350555EAFF2EC4F84365CCC0802DB
-B3BD0E3F0D9F858647DD637725C2CAF9557FDF842A0DA6A0CA0F1B442EF8EE6CBF2B03858468A466
-AC5883CBBD3815B283343B39205803C02C917D06825C09E2BB14609FA32C28D720C0E14A4B12D4F1
-25FF6281FF324DA33A56FC49987AC7D3AA206540F8127273FFE9A3DACFFE2B1C269D3DB9A811578A
-C7D532C2EFC18376F473FBB2B32EF642B19CDEC1D6DE83643723E3C6DFC87F97A7007B6081894BBC
-45C955B7001EB36211B26AD7A3D07459CFB33F9C54A40A360CB802FD202C8E93D4DB888B325CE246
-D02D1220ABF55CE646DFB45F07CB848406E470362F80CE4C02D98DD845189877732744CC16C7F566
-9F77EF096EA55AFF98AA103EEAEFB971731EBF3782E6AB725D4E9E35B2968689E8007C038CF25B6A
-E69451A4731E79AC22BD268F56942A233E52D71873E83E00A1874E04D3B22E72FB2D0671AF81C698
-53C389B51F4A257373AEBF4DE2DA1E4DA5E2CA88941F81EAE0E32D982064C8AFDD7A9A600D56D736
-05B9463C6240606B3361BAF22AF74EF89AC804A5793BD512DA2D13F4BB1B73EFCA1E621ED2A65D66
-5AAD0AD228B3B7E3D90DBDB6061E172B686E92355A7C7459D83199040A368B5697DDC3B81DDAD341
-6FF4405E1096B1240EDC18A0E9985CA55A0D697972BB11E9F1BC30765D6775BB68C69704BE200EEF
-4E11B78ADDB6229D8FA49A6B1525ADADF17122C0FFF51A08AA7AED158724AC4352EBB91ED0C157E2
-4281BDC1FD610195F495E87062A8C38E0D046DA4067EE16E81BC5F87E583315B973184E474064482
-9B2A52E0D37E249BAB31988B906F891AC904D1BB8901F0673AECE60ACEDE97B8DB7935C6488ADE8D
-FD898027424AA85A11A3DA494498B084133B857017A6D507D70A3421235486EB3CF7613C59139FD4
-DCB92EADC60BB6225D9CD0599779217BDAF4813A453989B2E56903F4DBB83D83DF4837C86BB4C3D3
-CCF98F07A23EBBF7AB5687C3E1E6792E40F92A7A466DE352294064537505EEF3F9C308C9EB94506D
-B02CFAE289F10005A6E42D2DCE43731A7AE368564B2983038DAD6987F67062199018395BC0FCAF28
-7A2B040C71F7325FA1E9A9808979B2FEF19096B98B8A0A728EB98F2BA3D33B49E3C20BE992822C7A
-1BCCA5B4E4D1099D456D8D7D83C57ECBA0FF21428024F7572A1470317CB8CBC8679A974E13D88C68
-1338C68C9AC9557F97784F4E1C8C2E61F26023ACF46232CBBDF3C0BCC5583B935FE9FA09A562129A
-8927AE73988DB0F7E733C6561CA7C9716DCA9B88208A715166F2FAE6D5EFF289A9B2EDCE813403A4
-16F243F1B57EEDE7D81E10C2DA4065A3082BC92A38B2457368EEC9C3C17296CB09819E9E642D7365
-F9A6EF430FC7DD611EA5FDBDEDFA72634AB599EB666A5DC178B0A0BD1FAB042792115EF3B6222C12
-41DCE36CB38B738F68B1B3CB489FED9E53315553F3C5C3BBCE40451E47B7EA53FD3D3ABA6CE0AD22
-5DAEE734BDFA3BF1D81C1B42C6D856A05D0924E03F7627C5EB24D7FBEA3BD85716207F961B56803D
-BE046E81ED5FDC378F9CA52C14FD8544CA7C539201BEE06487EBDC30FF3B28E8264EC7FD5DA7E080
-65B0A9147344CE28DA5182335875E9F8B2347A44E33DFAA167232A5C3E69E8C5B58B7C7216537827
-C936F5741B87FC68753EB0D4A466961D0050DB59DF3195BD3379F5647F8CFED35DA952D7CF2DED45
-EB442DBFE992711D22EB228BDDF36B8D7DBA27062D60D2271EA8E8412F4290B58F5BE26FF06F0559
-872F9DE4DEAABA015EAB4904BA1F509F6D517C6E897312DDD571D769BC474FD378AF4360E8B1F103
-AA75F48721B9E0BA589319E15D74AC0B03D730C3EF708C7C504787483F134EA6297097B46D2680FF
-8AA50B7A255563C88D594B912F5574564A1371463674793E4834AF11D14C7991E7FDB3A6ABF8529E
-1A4F10CAE79C60D37429579093DBD041ECAF03824DF9C007E96F45595A524B27EF8774A83AEEBD3A
-7134AB4435C80944DEFF5C1CBA921B0A41B9651968581DA4834B3C0E6D4DE13C1E792FCEED26A72A
-DC4D9E3903661D8803DDB58EB2B929CE31FC9F50A694116B00AC9F3EEF53FFDB1ACA3394BF111610
-38F39917B022394C75A0D467D64B89A44E5505DED7D9C6B8BA6BA098F140C9C00E09200EB4828356
-A2D6BE9EC1D5524B09C06D9C6FCB5E2808050A339B5E5FD4DD6C2035A48FE9674520901EDCAD107F
-67AC8C8E508E6003011978D77ED225F361BC0F86A98B6120EEAFB73F7377DB1E7213E02D12C330F5
-492511B4DDE08558D75D5B8AA2D56A3111DCCD257EE96E3446EF1C76F000C8916C4CE261425ED9D1
-5B58CED128DAA6C1300466E7B152BCFB5E6FAAB2519B8A98F26B29F98133AF886A0AA7E586A090BD
-A1DC6120DBB5640885C609A8BDADEEFE5DE0DA5B75A8A29E92515E86E7E66BB29581E5AFF8CB6551
-D8D1103DF60D558E7987E6F56126A13DB2C9A04886C655064E68A0A20D1B7DE24DAD22BBFEE1B7C3
-C208D4FD6A58DE78D6A0A6126EFDEE3B1A9713DEE94069A9F0A2B392A2F391C4C75327803B53F252
-CC9EF0323F84929BA4716C50385681FF5B4ED54929821594F9026B7C1297941B178C3F8A704CE097
-60533DBC6CF4B18AFBCBAD039ECB2EBDC7838A9410E7B227924BED7123944675A5DBCA388B710F8A
-F6048B03DFB713F881EA0F3B191A5CD989EA150B979059C8AADE403855815D8F7980CE6288F47EAA
-37C1097D33F13776F08779063C5217D7408D9835AACBE5C071EA40C9AE6DF685F4A9827B828815D8
-F3A672E73A418E5CB15684EB6C6FE0998A386E124D76620446907F993BE16FE5AFCEC681F585601E
-18182EDCFD3024062A3082AF97E803C47D32229D0A24596CF7E03F18229FA631175699E2F0D60FC0
-9C4F1954C5D12D03BFB4395F0E5EB6C6877083807D91D93CA4177A6B5A8D2AA500131FCB670E7118
-73F8A3C77575EC93A3ACBA37EA117DB268CF10D04AD0F079484DB124F6DC14A50AD3B0294F7157D0
-837D8F9A6060FBCB385606066401708C041594E0396A0BE4B8B66FEA141CCE4BD29366A986ADB98D
-9A6935C49C57F8CD415E93FF8AE0DF75E463E02AAC68DF064C1B789B685F84E15E512404E065A39E
-9E8F5568A7D97671AE1602605FC7E4933975189837586FB1A55007FBB0E91382A629277C36A190BC
-85AF49EF3F0F38D4ADD2B5DEE09916B79690EC83473C63E92CF617617A66DF472A49641DA10654E3
-AD3880D060B02A4A6C75B51E4E9917A2B6D8EFDA12D59DE5A8E222DC7E82F02F23A9D3DBF637154F
-719B14114DBB102BE5EB76B441D7E9990EF6420C2E80942C8AED5A1D0B19BCE115B5929AB9E145F1
-496753DD6B1798324F5EC1D0C7F26FC3045D7BB46A14110C99BA07A45EC16002CB754C0BAE7A1A88
-EB387BB345FA70B0A38AB4D532C2DE49274D4F86F2582728A2CC54B4C09D26C0CDEB8FEE6A42885C
-6207D74953CFCC583ED82DD7C0F29D35BDAE5BB251B8A2D4B1DC97E2264DCE035E359DFBADDE84F7
-37EA6A59C23D1A64D963E635769233624F7682EA34636B595CCD064AAFF3887D916867475731BFCB
-F7F96D5E5E1FBE6AABF454C2F504EA4E8EB382911560195295C87793D5F7739AD7EC7176E126413C
-D4D1058EBD7D6EBEE14BB94A1ECF28B686411D91E07373E891F78C4C0A05D2E8D90A8AE2614F7FC2
-63A762D0F43485473A54C31726F8547701D4A38D20565ED1707847AED9C805780F062B847E668E15
-565CBA07A72B0BA99F03FB57D26FA26FF579C30EED0AAB6FEC1B5DBEA81AA88F16F0C9BE869505BE
-18C1CB79657D91D6706E2A3F0BE9920655B93EBBAE2B4D0B5DF6BE622C951F2CFA42AEDBF7AE649E
-2150FE87CDBF5C2685EF36051080BF39D864573A45AE2648AD97662B1F69787031B9BC43511FB841
-55ECDC3D91E2475D072BDE6A5207ACEA1E0D2ECB1DA8A1BC4BEEC335A5C7102963E84B97BE741C44
-58ACC3D72A7E53B1F08C955F33EDC3A0DC3E7308270C0F7FF814B111459985733C62E8863625A551
-837952F3CBF32ADCFD9F345E14B585B23ECC440775310654DAF7F41E56FF45F89701292019A94BF3
-0EB2D65E14B1A1D6BF89D4CC43187ADADF3F6E03A90ED01E5D876BD3AA56E5EE84DBAA4DAD9824DE
-9984BD45AF96FB8A56C010B3C3A3C6139D58E9D69D9109DB18561B55EAD6452497840B9AE90C749C
-155B6329716F0152A7AD52DBD0B8A25B9995E1416681F38FDBDFA443879B5C4C25AA29E0DCC07DE8
-BB161C36D76EF286EC88D57C74BF44DBCB4FEFF771D3BD82C8F4E233357C48E516EFE3DB9E60EF16
-8E2C45B54651DF9A5ACB5F1790F7929BCB16CE5E9F6A43919AD287DBC8E12D9F9E97E5DBAA592879
-1A5A02D39D259F3CE273A870906A643CC18D86E23F115D2A35DE6926053D8C84B940B362E7DB183C
-4905060316B269223DAD309EB5AC96DEBA757BEA45FA3100F77F4765334EDF3D659E09BD1A5552DA
-492BE9174DD406F8353A059ECFEE3709422940A8C369919EE1F22F7C02412C995FE93DC4559D32A3
-155DD22D3526D89B16D9ADDC30CB7ADA6E52D62C5F2DFD142D4D7B6E066671EBAD08F54917E31704
-1F410CFD8A3243F8B39459C418B7B7C6494551C6F6753A94072D09E0D812351D62916383C6E061F3
-5ED864923002007E626089772D269B298DCA2CC1F25D9BE43FD8AD62D554C16AFEB7EF6E5DDA66D0
-5A810F003CDDCFD2C02FFF02BB61344968091F67D3862C1499409ECCA137B9A2A9BE314995B818AC
-CDAE27ED4AD583BE29DDE4E8C2400C5F8152C85709AD2A4737BAC768FEB70CE81A92C9657DDDB2D0
-BCF9169D272A063C75C150ADDFCBC2F5F2503DE3D13231AA8CFB396DB38E80197A605F6BC20EFA1E
-DE40CF424CF221218D51BEACE64A3DC88377E4F3EFE43DB4F4FC0803BF61764104CFF0B618C90311
-98B094E20B0FACFB94240B438B67BA298E31D3F4E31FD190E48BFCE27B1BE29D36E765E7D295E96E
-DCE09094FAC43B87E294818FDE9363FC7DC5EA36A1497EE25762D02DFA00A9BE53F87ABE62E52ED6
-F59818FDFCA643042EC13D670DED1980413950EE43372D31AE2694B83DDA42E1FBB049F7E7B7E69C
-93FFA3195A2462423DD2C022E5141783FFA07E192AEBC5070F08B23AEC9142EED56DA74F93BDB504
-78DA55DDD0A9987FEA131E4CCA0EFC51064E4B37632728261369C3FEDACA100F1AA78FB718ECE7A9
-F56296C5FB43781E63F36B0E1D34BB748EFF35E1953941F94D1A9B0FA474FD68B47183F2AC53A63F
-9F1D30B9B89C5FE54C3765B43DB403D57994701C133E42B950D9BB1CA202F15B5E590EE75598FAE4
-3D5CF1546572770BBA9A6373F100CDC61DB4E5EBBE0A93E0E51C86005E333F69110B1C8E492F2BF2
-52CADD5B73E7D3EBB53E759353F1EF3C9B8B39C230D13AB7158A5D92EE4C452F81F6DFC18803280A
-A023832FD0DCB482CE5AF615C952BC3F7E58F6417D69775FC7C0D5B405AAC632857736ACF32B2EE0
-F2A2C0F3B3CAD483C614505BE94706322F2A2830FC5AB592907D0291ED1873377E7A6158140C2CDB
-1B0E27EEC9CA50176102200992308045CCB5A169B61EA0546778B8D280737319046716604945A21F
-2A1CB9E15E3A5DB31E0FB5A3B0AFDFDF6F3424B7536D473F9756CA3694DEE4301FB1AB1AE47128F8
-D2B461C051C1B999DBB010E78DD13AFCBBA6F7D5226D540527F17881A18F551B3EEF76A7E28B4FDD
-879381A2217EF2FF9F9982E9EA70AD2003B862D7C36D57C5FF9FBEAAB56040FEE973EFC3B34D8319
-1960010110BA10694C17B7635AE03CC1CD087C0B05522A7A791F0CA34022A3F5860B536D9551BDFD
-BF560A07F63AA4E687407E5E48584E689591F1B52671213E430A708C06A34D2E1D51CFA6B328A122
-007C81B5EB263B967746961BCFC8772F8502DD95898724ABF369B0877F3313A167F3F714023C229C
-5757D4D46FCD9B4AFECD093DCABE52B78132CE9AB6225C9A344C4BF8D96F2C50C4272CB9AA0D606F
-013B2642F8C880E08EA2822C8CF5097D2CDB64932FE195ABD5FDF36D3BE123AEDD8BA2F82A8A628D
-BE3ED6129DC0FDC4BE50D5574AE4FECC65062E70F4703BFECB35EADE196294FE173EA57938679DBA
-6D15448FF44C0D1A903B202439DA93C0B0E612110068F8079219AA89F435E44D0464F54833BEB338
-670BD820D941DF4B31F51B895BEDF833F9C43CB7616DB80F988CE72FD3C12C7D49F740CF85B4766C
-0ED398EB837695D102DEC16E24B7475A0F5DDE88FBF2D6B94F126417C811E8362B9CCC52D8891C13
-C10937AACC228D621D4712CB9DE0BAB60EDE2A97E9292BE04E42E6D3425594DF56931A61E1F96172
-6AF6E6891D63B240E6E79E5BF30C052091D681BA1102409874CFD8EDC3EE2BE331676E31AC00F807
-91D1019BB789CA4F5907F4823B002AF3581448C352BB67D80FDFFCD1C5BEEF60523330AA2C045600
-8F62DEB55E69AC2F86369FAB1ECC90D2487954E61117A90D9269A65DFBDF297EBD29C3DD1F62755F
-8F289C42A534F59650685F8576EA2FC5D26B99B8E3DCD3F1FEEC73131000F99AA9868EA9BAC0B56D
-AE2CF46DA6CC1D18C0AB8D77BECFF7B89992175CBA2E22779C13DB9DF53FF5B1C8FE95E164997D94
-202C37175E562C8622989B075CDCDE173452C064274354D5DB8F7D5A78D48AD4A103B9E47500D08E
-DC7C51C1F3CFA7F43C3686A3C24A7EB5018B0F419961564F87E212CE0A0741AC68D6822C7AB9FD68
-85F5D0B2AC249CB7F50E2353CC4B0A6A24562F564FBBC7090C3FDF1284AB0EC615E0B3FBE132F315
-70C8A65C814F93910AA4BB80D516CB70D2E1D11969238E6F022D628FA2F33A0A15C4EF0CE7F753DF
-80A8AD9494885A1B9ADAE6C38AC9DA6FB0A61696AD3A502630252AD7B574C841117D34BD20BD6581
-217D977B35F5D04E02B933E1E84F5C090F6615AF484D63265D28517BA74BEA8876FDA332A84AEA12
-E6CD82B94AE10A778CD3A216ABC08495EF319F06AD6FF8ADD237D911F846A514FDBFAA8A1EC8E0AA
-9F80F11F1CE615519A4B044F3D1CF1A17D7F3D2174222A5FFA8B39F20197FF6CAF250B6ADBDBF519
-1C525070C8D38220FB501C223F493D80F498621A02EBCCD6EFE914F16B2A435D60C0A1A453E288A5
-3D818FE1EDCA7D55A26A017F2EE47A816E90D6C3FCDF0035EEA307DFB06D2BCCE43458A67354A4ED
-B6E5C57233DE4FBE41ED07EE5EC77A5DFADC4032138DA9E1B74428CAD02A913E40152F8063A774D4
-FDD4070E4B8A6C089F199AF7C529C277E902195DB760D81EC655DFFD1BB283F3C5AA8BB58F2476BC
-797B2892E94414ABBE96D4DB93E280CF7DE23EB852E7CA954D6682A6F1A4BE0507884C2A05AC863D
-2BA73F3B54668397B6C54DC2F4183130AB414875F3C3D8792BF7E5FC4D228DF87748BF0B14178DB7
-E3FFB7891D700A1E9520D778B095DA80E4801F53442D5C073EDEB706A5DB8466FFE7E701ABA9C364
-A37169F585C883A83713A61C9C3BD9336A667EA4E3DB5F4DF6BC6A552BE8D3EF093639EC67E5FF71
-8959F9902477F5AA894ED2D1CD312ED82EE417D95C49C96671B23FB0E1738E892ADFFE62EC1C3D4C
-BEB6CD089C98DE8D247DF7ED17DFA2959D3662F105E8386D75AD308480536959F8E6CF8F2C6937B0
-9F2E8137C811327D6B165ABE46C51834A955FE8306D10033F8C2A34667F13A8BA831CCF52C7A21C1
-3DB92F3E77B55CE291F6190BB1D194A33FD73151C3F61ABD2D8A0C9BDE90E796BD996D2D0094DB2B
-E98657E751BDEEFE8A43EE4501B98F0CC6D80805189438872A60047A8CAA9039893530A3E5F6BD75
-BB466B25165737C939AFF3EA59BFF4A7DB09C2A5B36B8A1F0C6C5E5870C7C9412589877EF44F8428
-4B8A53B5B74315CE72D2EAFC631BC4CC2E5B71DC958B5A6350CB5F615C3A4502E973622E3E18193B
-69572DEF1D02303A375ED60ABA1BC8A179FAA0F221A49078FE15AE13383585FB45FF4D5F3BB3D0F6
-D8BF62E9BD6BAB3C9A7D38C8A5AB0BE57ACDADCBD02B1DC7952D73AEF702D406F62719922BEA96B8
-FDC9B879708E794891C7A0A42F2CCD6812C3F4DB030B5178E3A627C3E77621D312CE4EBE815CD387
-7208FAD92761A5396B67E835222609F823728B1C987857CFEAAE21F2AD5EA9D841212993508091A4
-A2C268BF1D8DA1C650F6AB93995E7C13A3F84DB55748C626FD09C0DA1E3325CCB0BF091E996245BF
-51EB486680162BAE63B6513C74CE83B92359938439921950D713C69324A87BCE67B45A030C9CF10A
-DFA0A82781D49FF224AC57A23C6CB321F95915C5E14E41FA852F66E1E2044A9E7B1DC3BE9E818515
-D28B2C4D2F2210098C39557067062BA4239F2AAE28816D999955910298A450741947A9A1AABCBD8A
-FF3530626089978C87DFC73618C044731B6DB8007739A9699ABC354A6F985E03C11D750B8B9E9AE0
-5436205FAAD1B895B159E2C90562B82A62EA1A7FFB501767DCE2B11C51D55A17529EF5ADF0A0EE9A
-96D0E7E89F68E50EED813836531B4B46E9071E84AA413F4135CC882CE832BF78ECFA7CAB0C9F64EB
-92C86DFCD1152BB7D4AB33831AA0C139B555967F6346068D5C3351A7A4368EEBD2933E6B9F789DAF
-37EF536FCF965C397AF1B7F98AF864B301F3F440B7ACF704B59540453678FD6C1504519481893812
-3E2F47B265EC4F5CF2172D394543D84CD4281165CBEB11349B315A85DEB2D1699507B0C8C110C726
-62EA2959C4962FF093AA5EE6F21F89B3CCB0149CEFEF1855B9A48D28BB363416C015A1F4EA1975C3
-D8807F616C5817C8162536176F464A198EBEE6C97029F15F414275A39B8219128B8C8542E9483550
-7FC2D3908BB0EC375771280B9EBE87E827811418EF93E52EF70546891BFC0FB34969FD7DEA4CE752
-4D9EEFF2B46BED908C0FB2E02EFC1D1624642EAEA1CAC1EB4841E020532E88E59AC890E6C3F44734
-B99722E9816402D1D0FDF8045C5481EC055100836EBFB48E9FBC392143032C909853C9BA38A19363
-141BED09DAF02FDF4E7CC9808321CD0708A1B45270BFFCC3A0D7C27F7E781713D5DECE82C72ED303
-86B02D14575A1A6447547ECC7FAAC1BDFF332C92984758E242256C054656CDD2C45D46E67AEC6F83
-9F95D74E222A6EAE12EFAAB723A7C816D4E42D4ED2725A794743F67597F3DB8CCDDE45BAABC25726
-B851E02E56341EBE69E4D91F2A233583EC816F18A1DECBDA4AB69320F55E730617360FCFB8AC2D2B
-737675B406297F7F8C4BC370CB084C22BFEC5FEF02E9AB290282F7B153F0A4B1AE569F1E52371A43
-46A748DDE09336CAD1F5337FC3D7CF0677091E59480AB15021E023E356B0E1BAC6C6471AD53625C7
-0206C338536F4D0D40733AB217E2297F86B593717C61458B6C93A16027CC886A8CFDC01EF19C34C9
-A608B95A84B6A2E31454BC03C10FA55CDCB7B1EB7DC16AC1E93981A46DECD7E7F00638DCAC568744
-69A2D9B45CBC81398727E4ED3DB5DB31965F358D8179CBF934EE2C4D652C9CC211807F070C80E3A8
-222B4C31FFEC8DFB9EE07A94C973462254BC1B1581903EE6F9AD91524A787129A63FCE048B45BBE6
-855826750C586B6B23B805FEC3E7AAAC079576949A06F422FC2C826BDB78AE96135E9E2C20C2B2EF
-F6171D610B2EB8635ACAB7C5C5ED9C9FFC26CD54D2FD4CB9E4294E178CECA1E16CC8E3FC06518BD1
-6F4D63AE2B435753538834CDD9D8AE7DE624006CE688938031336351A6578C304C2E5480A3FCB43A
-8BEE4953DABC30558B7790C6E7A6F0F9FFA557C50417407AC6A0DDA1E736F7070BC89455FC293453
-3DB004AA9070734C8C2608A07330E421A0220DAB99F8A77489132F6413ADB9EA637F3B75948050E6
-67276A55BEB09D4153DC126BBDBE0DB9298AC799A943D72AFB769BFA1488D311BEB86A907EC9385A
-AE4F77835DFFE4389E3D9ADED1B08BBC2B1ED6084B3D1074A326CCBF38E06BD026919107BD03BD9C
-30470DB779508DFE0DC82DFFD2DED749E872EB7EB9DDF509D5319865070DD76846C34E4E43691AF4
-29AA40DB4BF2CDD50B275589987D8081F7C5A0461AA5D1455A660178A94A0BA0DCB69C3CEBF5EE04
-26D6534F6F919D9795AD6A0E1A1F452AF3B4CB2EA54D6011FA809132421D111EFC51174E223AB6A1
-3596411A9723079231B050CEDAE7659CF168C39AEA9C6902C2CD37D25492CEE00096EDD63DC7643B
-667FDFDE5B595DC54F0A72C2650E1E46990584C78A5CEF9BFC3C5F88CFB0C49CD6CADD9DBA675177
-D601927D75C6902B55AAED0E9E3CB52A577C887D581B3CE6201A1C77C9546CEE5A13B92963337F17
-070E2BF9F5C5E86B84225863874618AA50F4DE855DE567BF2AB7163944ED43DBD7F4BBC0E1623180
-7C43DCB47B2EB694E6FEDCFBE26194D2D9943A1BFE32AA1E5305F5E341EA021F91532162978DD1B8
-C5295A5E7551E2DEE46DC2347C6B32197AF430AF3BB676A53BCA9BD1EA88678377DC0A9A86E2AB6D
-E29E3E261BFD5573C66FB5687BA9C0544D894A759866B066E1DB5C66E60AE071CC3A1C4AE40197CD
-E4EC723F7B80137619DEDC99AF57A5497D6E03C1C9E672E74F48F6C213A3CFACF2699CAE72345A51
-C71C1D69348DE5BC5F443EC0EADE1E76A8A33066922CF3869E3C1D26A3B34E540DC08EA4DA2DDE3E
-EB17C16790DA4EF1A3A76D71D34B788A87838BF2A5A3DB8176F9C097D2320050A79EA6C4A94926DA
-11ABCDCD26DBA09FD33F30AEED977E8B5AD928F3967F607628859429DCB4ECEC7DA3411BE35A0385
-1017B535985632639D378CDCD13B00FE537A49FD9EB6DF1E3AAF5C41EBE35721FA6833C2FE08AA3C
-FFC3477E7FCEBF9EF9F4DAE62FF78F319481C3F1E72999C8A493EC6EE295316B58A5CD62FFAB62C8
-96E521B678342F04BCE1613CF7F6778CBF5227BA20504500D743270771953ACBD5C6586432F3FA6C
-0987BAD33B88BC6C15D29C4B3CC54A9DD72A2357AA5BAEB2CB057CDCE72DC80CC98C62B16AC50B4C
-6A7641379B766CDDF990DBB2FC7F9CDBBA755B6E3DEA438FD6699C30A99A8B3178E6D613AA938120
-835E517431D28114BCA1AB745C11FE6E52ADB82B9D3D53A33BCC49740C93017D9531ECF43831359C
-5C93CB0E926DB440B139E3125CC2E069B1CF6D96EF68407F32DB517242C3AE0BC6723E560B0F45FC
-7F87A5E44E1751C8B7F9F669C24AD5CF16F84FB03BA121B86B0694234D8F2C9C947269AF96FCA08A
-78F736E4E04ACEA44C5BAAFDE360FCD8BA6A59724CA86160A5527FD564468123D302DB45173C1B21
-6B01DC5B6D3415B13FBDBBD3121A5493374B3357EFB131CABFE5087AA1D2C7472B0377066B3632C8
-2073C6A846285CC953A8F28E131CF587B35217EE498D9A1DB57B063CE068DAF55D8CC1771C0C3099
-9CA4FDC5D67BE4E7E69418F6334BC6149000821B89A7437CCDF9A6A0ED702D5968F1E04F7E4FE9FE
-C9D1E994885CB624035BBC5426CB8EDF0456828F8EEE75BE491B45FAC192A405EBA25CAA4F4C66C0
-DC234D7B417628DA5276C08260BE512B2432256C401A66E3B583E69D23E9FD278CD5F2178544D054
-16B9B4F61A88A4728AF2CEED07C08E207F31D644E8E3BA1E4E2F9D8E30936BCB9C6AEB54E37DB46B
-D64F2ECC1021336D0564DF0F18E5A6B6BA470233D8D41FDD9D1079706EA685B6D8A740570BFB78E3
-984BB155C3155C69BCCCB41CB51975EEA1C1B4294CB546CFB03DC31BF86EC3BCB1977E8F94A771CA
-B09DE12A82F1D6C791FA7800E5A21DF81C9C8FCDA78622ABE75B54AEEA747AA4F26D563200992E33
-7231A430137C720A17D44F3AD6CFFE63B2DE12D3184BD3E151F955786B8DDCCCB290C42718F3A219
-1759DF76371C2FC177544A6C425CAB14AAAB31628A9CF9D71B5257AFF0D59843989CF0D747375A26
-DC9ED29B66AC2147DA0168306C48C2484C70CA92F33C0C138F92F276F5EAF5EA3082A8A1CB12DB66
-1633C2F71E3B69918F509060AC949FCD52C36498A2ABB77D139DF1EB33E3B846A7C1BBDCEF5DEECA
-4EF0AD250CEA9C2751E13EF7681E8FAE0491CFA6C144DBAC1FC39D39E76EB12D3EE9CA159AA77D27
-94F0C433345B135BA632F544082BBDC9471E9FA3AED3A7D465AB7158E8AC97F68B1FBC8D368E2350
-45C18EFCCADEE98778D894D96301F903283C5AE355A863BB0DC5809158F7E108662D04A5C1234915
-E7BD5B4C30F9EFA55E702E54F87FCA06FB321507BC57A1E55CC117E21AA4E3A4DFB77C1A949EFE36
-6D93F2BD827EF8CC16D387CA82AC039F77FE995BE6D9AEFC87F8D809E90C1017803BCFA1C737DAD5
-F1A631EBE6894AD20C70791665E7BC71F21C2C3F4462F60FDE75C8A377CF49BE99314663C6ECB538
-B1BF021B2F2174D2B22CF6FAD115EB0ECE8A2E64097A5FB0A2AF666E1EE13276AEC59FD0C9D4BFF2
-3F71E835984E5EEEE36490C54E077AD7355DBC98BDD37DF29B3DDF8C55480B7349C4D17322418705
-796A8C521FFF920DD11773FC44FC631C7D6E9B420D7965D7F62EC7385F2BE30A51E2D796483134F8
-40AEC71FA19ED1272C27F98F2CDC9C7E54DAB585AC1703ED08F5F9E825564902EFD08EDF99DFD494
-44C21FA6BE16CB8A1B6D0C8A5ABF80A50BB8D055483176FD0AA07EBAEAD88FD694F96FEBD60751E5
-C4D8F9BC747D4F4030BCDF9B0370B7A5E0A6923FF60DEA16EF47F886F10CCEE6956ECF41A21F7C59
-6F3BC78299A9657266807E01762B2B2878E551914CA312C2A68D34CD91E4F5115EA1FBE801346E14
-AE529049089B6B0273E258785773A9CE8E4B6C4211CB7C2767319576758F811CBAF3A3FFB41B3130
-6C49F3798B698A47BFA2E3CA0251C4D90C0B02ACA28C611744526906791D9E157E54CE4E1BCF5B68
-6990BA8AB7897D624EF00EAB92CBAC255AE9177DA9F0D86447D35B452CD2F337147B5D3EBBF2B952
-35778A72914EB3707EA78294B3A3BC4ACB19FE87C72AA1D982E4B822F07B115CADF4D3E7EE3D1BA7
-08653BEC6F0A352A0C33252ED0630E7274961896D461EE8BF523D5911BAC1C8AC763E5FB11FDD217
-4E1F129675969C195476C7A5E18A81BF9A11ED9F2336D5301E3BD32174ED5C933E8C85D6272EA218
-52A6F7E2AAB174E0965F73E0EF89E906BAFB181DBCF8B1F5AA0C12D12C6272753C016AFEC2EC9F95
-41B8757874D6F2E061ABBE8B29281677246305B3C41E90418426C575BAA216CEE3C5EC29B2FDEE1C
-77C14FDF940792F48A56AE80AA33E370B037CB28A7373F882022AF378F26B6006A049FD3B35074A8
-65C97D153352ACC156992C00DE26AD21C982C71F0EDCFEB61593BB40FA5F2CEBF23C4FF34A4F4BDB
-73CA273C269242D1C6117262B7C47771F2619FE5710855134A80FA8F92BB2425CF88940CA3450F81
-234ABF2B11775929B12CFF86442B2AA0F4243D324A5983E5D1829775B3C7A111D5622D1C4E2B2A2F
-982FC8A95F789881416DCB34950A393F4F1720D2212F3D343A17683060182355DE9E4718506D76C9
-184F8DAC55788D7E603CFAF4907DDE965A49C323DFF425FE88C09AA4A4D16283F9B14AB9EF1BB885
-A954034710B4A9DA4C88A8A0932B18D139A687303EE562EC9F656F12F3E8F27DAA9C75DB0FA946FD
-0E1A982BB58E040BFC0A49A4AD8CD668493FCB573C849EC5474049A693CBEBD4D79AC7515047CC34
-7A9A7570C90861F3ECFB57B9F53AB9C0D6B05C8C570A8F3C04D58555A45524C98FF091B8F8A422F2
-E0E9E5A7B7FF69F1CEFC13E42F1CA276BCD584516D266BA6838D5E9CA9E9854F50C7D92CAED61AAC
-AF758A7C7BE59C3BAA82BF32B691ACA3E8EB171E08AD22C39FBE586A54E6E4DE2CD86B31138546BB
-8DA5834B2C6E4838547A1B67E651964E43988C8036931088904BBB589CA901E7EBBC094C0DA81E09
-1915D9E46828AD8596FD0FCA39FF12A6C27A359337F973809E81B2E9E3D43B3146F2516667E607FF
-EB9AC80FC95A7B7D4DED551FEE0F3561C70DB2D69ABA96673E39E3397F1C3F8FE5F48BAB8AD6E0ED
-8901F90F6CFF24E80CB5DCAC498506C4D01033E497C1241E413B022227A3264DA68BC3F91B35781F
-A2D018475C199F43CBA7D3A0D5697B45321BAD2C394B207136E1E16B41794975E8903EF2B2E1C33F
-87CF72C325C11EC0B92FD3890ACDF60B521DA32596763BDFCDCA837ADC6F26F129B23CA32F9CD39B
-33E64576970DF3C05B8DCA4BFE2F17E6C5678B84D69494F1DBA9FE0446AE6AFEAA1FF245C07916C7
-B7569E6267C42B459435A1D116CEC665B311E404171774C0ACC8DDE96B0D9167C8CC7D99C4240559
-2D745C4428755500EB4719340D2FC6BC215B67823F69FA949C08B5EC985D7AA87C9AC1F9BCC8994C
-6CBCE6027B7D1E0C22A83A5DE61DBA05D4AF6884C95F46BA7F253E0B2337E312916E163CAF9DB2EC
-56C5425990FE73EE53E42B3BCCA1CF642F02B0C5ABD529B568E9ADFF865B9DC190240AD78AD226ED
-884BED3C285B4CB0E3929E805C67F1318D186504D92085764B70DE6AB5AB6990F181BDA50FC31262
-348D980EC76608CF08176C2502E065AC2D8EA5CF9E2D44E2B70A7DDC7B922047C471DF8A0B2087D1
-106B5BD8A830EC0E53223CE3C96EF56E5541191167860EEA58D696EC357EC55799438C90156BBF2B
-13A0D5C9EE93227746654ED73EA5B9CAB61DAC5BC690F89C87FECAF9AD03BD39E438F43B81D39E07
-E0422F94E8B096AB38C88BC2E1A043811D8141C1A35DD3A6DBE41620E83C8ED3A379CD80D4F9BC30
-41BB44B933DACA7C5D4427AE94A176829F24B5968B713431CB8BD9F53080832C6B784CEA9B515687
-F121983EB9D9C9CE8BD4FA3BEC48AFE64E643B7BD86D8383D07521FE5D091392BE124CCC91113604
-3824B686988E7C83AEBF406D2DA88FD952D0FA9327F4AD04C55FEDBFBFA76ECAE8A176C516479AE1
-467125B7EB3C9E7C5B103BC0C470946346DF271F8EE19DF7E3FF7478C35EE059297F4BF21A5C7B95
-993BE6202E897776952A7ED0613A5CACAFA731FFC633CAB62963150E86EDAC796026CE02EB235B9F
-7A54E0B0C5281567138A612BAFE409A818C216DA8EAC5EDF9D1E3A1E3514AE50735A111B4D2AA083
-4EC6C11E290D58FF340F82F0E079F1C7B3566F2336EAA45BF72BCF88569988DB5F65D4C1E59B50F3
-41E45A899656A0B522847ED567B49CD5284FE50E5F8652CDAC1C076804F2B2185F6A51ED19DD4941
-2E65A0D2DBC844B75E2DF71B009776D9F97A4C6F786EFFEB87A307FB6B912BB659DC2BCC6D509A9F
-BDE87DE8D716040A8551B6CCFB7743978AD992D14D2B85CA052E87326138DB196C24593F8F7ECD6F
-486F85D1666B9DE2ACA6C7900044EE369D223524664A2790B773F9EA26E0A4CDFD709942A44298B8
-249506EB9B77BC887DC0EF947DDDC7CB3CFC6B48F060DBF032A11884E6C226D9D447A5A458CBA325
-D57E144C6DC295262763E7BB8FF6A0CA473EB7661C12E0E8E23EA37E8AB3387B9E54686F3E57765D
-4067E521BC1AFAE52394227793C737C19208803F2F2DA920B553E2AAF94EB992AB17E31B58C15CC4
-AA8A1B444DF5B3E7CD937CF03E1F7FAC63342731B4589F16939D16E8E497A74CDE5686F529E9495E
-1603D74875288CF53271DB9313A4511B104F80B179FCF213558970A002E945281BF3AE51E668DD6D
-13D9E85152747F562CA0B75DDEC8FE9FE31F8D05B0F59E802888A7A4F19B29954A31108D2F041367
-DEBD6AA1CAD856BDD1427E9EFE89956FE28D500CDC6A0CB80A76902A08D0BC6705583243F1DD8020
-749B257EDF4803BCAA653F7FD6D8B91690995BA5EA3EE92FCD367C11601C6B8ADCEDCE67B16C596C
-5D200693AC5FA15D4CC6CE9DF7A71C8A925E99F5085313D60FAD25C1BBAAD28D4AC2B69062D68F39
-0530A976319A3904CEE44DC9451E441AAB4780425440F8C499B81460B5D3E268974145117ED843B1
-71BB14AA84C3A084A7D8E07B9979260675D5CE6534DC176DDB60DDE90F6A3674F67462EF78195F8D
-FF74FB5882B079DEE31FE92816F16CE1A70D07752EA25FAF5000ADF79BBE7D17EB1BD2F9BF6CDBB6
-F078CAF97986442680A8FC4121866F9CE86C385DE34E30D8B9768A0136D9EEF79A4B38EE99CBB9A4
-D32316564C9D56996E2595753EA71BEF684834FD030D38BB100E2332B026B046316A53270A96DAB2
-182E994E91262FB03D1AFFBAD623F1689228409884F91DBA153030870A7BEB2C7EE2DEC51875B137
-33B7929041F8D23A94904BD54DD4BC9B432DD0C78DD81639F46D686FFAD39AAFBD1B6C1A37E248CE
-48F23E12464D5379B4AED0D50B5A41577E6ECB75270E9AD3EA7D0FC09DAB271FB18B51DCFC0069F1
-5D72546E6C51049F3425AD005F88FD7F02042DABE9F097F9D6A076B30D8CD777B1EC12BD163FDABA
-5972EAA61E3C87E9AC007A052B1A3FFE14D7D43C7A0ADC89B1DD4CB4F9C762A84A6C0701494B2D8C
-4E4E1A9245738BE4111805C2F153A20ED9FECF2DCF4C8F7C3BAF84D60454A7403D4F5F81C6404173
-A7BA81BB0CEAECFD493D877465DC5735D43E3102CEC57B8A589182FC65A4704661A9E351FCCBC731
-5A87E62F65D24EEB9CEE979C6E10DBCF5C162ADB926EC8CC9BFFE381F6B8A3AC0A19D1631BEA2938
-731AFC99E8EAA39BC75DDB3A39D01AD8F0BC1838F4D674B9BEE9F6F7BE4D9C8BD97E8D171EFF330C
-15B76614A1FFD25B3BE19E4A201BCC850F926ED51616318C965AD2F0E56F9433B1247C6D5B72EDF3
-D408A3E0674A509BF30BE813A5E669D72B978794683CA8B85E3469EACB167C30F7666DB5E081B81E
-E99ECFBC1704B9646B1A29E4A4CE5654CA8409ADD60145DFC54225BDB8485E39CC98CBC3F38FD0A7
-97E5DFC2099452A2418C6636BD2D5F6B24345ACFA65F4E7DBD2D0AA0C1776A4920B4466C509BB5BC
-7D6627946C4DCB38A27098B7B5BEEDC2B3BA18F927077F71E38644597719652037621BB350BB5369
-DCCC073954026E6438FD8393DDB3630C4473F06D9FB9E422E435566C396B12FDCD5605DFEA232171
-CD8EF298786806E9159B84599C26D4C7D8C3BB064665CDD072E2083190372AA808B2268B3FEC8878
-B6420CA829BCF995DC20E067EE6B8E44D2869D51BA3AEDD1763F7F8D2CFB8EC41E6E9E0129DE5343
-1457960CC51D546B10B8B6CE08A1C2B79FBA448DF9783D815608A16C55E589DCD8EF6B04C66232F4
-7A473973A35618000D79B8173258B7365C9691DDFE47B16EEB08B28F881828B946FB5D6FE10ECC6A
-FC4EA1F762E90B3320403382E42AF4885B183AA48DB5E4DFC9A54E0B4FFBF7C26EB17A4F13B4BB93
-12234434FFF05549E7587BA0373ACB3E31418BFAF400D8938FC6466B94273D1735306AB912AAB13E
-31DA3541C1733E2A7E4DA5B82767D37F3084AA7A7C488CDCA7ABEF77D19E42B4448ABBD346E9BC28
-8ABC4540C0A1CFD0BF46C5BC7454B25E27E9906A3E6CBF678BFECAD1B19B4E42398A210CD567EC35
-FB115D5C0DF0EEECE593982056B0E1D14C292F70B3E049984F8881C8B477956AD3140B4AA22256DA
-AC0D11C4126808B5B9F922BCC5F24A77FF352E2C621A3941AC07A20E550A69C49B1B87D116EE6F2F
-970918F0F1A501166AC4423FC212E4EC8039AC7F9C212D864F418CBB92948FBD588228108FAC1AD1
-837070512305C110F0FC3FAFE6E1529C2BD0DDE868A9EBE5137DFDFC5C12A3D08014BF0EE27B1080
-02AAD6B607F5C5C0F1B1EED3C552919C9A2E97204A8127F97B1066607ECFB47BA95EF2B51F007C29
-3B2F6A63041A9C1120D9CFCD5357222E5B02DFC73CF94CF9B5CB00EAF073E9BF253E30E09B50341E
-57BF245A746EA31BFFD0B00201C34CF0881BBD1006BC9BA7D420A48E53686B598BEDB3449924EBA5
-8D5DB1B1B01AE2BA281D5758C99EFE38ADCE18F7B182FBD0D0622A6EA497A4E7C00C7D17299A2765
-EFD8DE376C214D01A21819451FC04A0277EC84A151FF93903D61C78AB7886911E36E12526ED855AB
-43F6289C1890222602B8EFBF15782B374AC1E580B6E963403D6D15A051DB8558F2E61C0B9476C6DE
-5D4861585CF515CE951732F20D32969F39192FBF1690D242AC04D47E0C53D467D0FE4656B9526C0F
-7F852348B0437737CB0F29ECF9B54A5E17185236DD0C16349C3496F3ABA569EA20E343F6D771210C
-39DC932DC65ECEF94575C6E76902CDF6C8C8361F9C757A2577DA535187FD526699917CFE0AD438C2
-A758727B306BC7979547E68B94E87ED820614BDBC649D469EF6B4E4E3DD2EAEB5F80B22FE576CED2
-56495467C76A75F589460061E03F3A1B065121A5ABE3E2C51148B3DDC9F624C97889AAF7FB84B158
-C015EDA5670746C6359D27B0C2BD65144F2B88A64331816DA904572BE398E015A9924218B3EEF951
-23AABFC3AC8217B7B4F691219A1C9DD0A3EDD5C04E63ACBDE71B423522532561F4B71B7028415C34
-37E346BE728A415596AB749015C1D59BD8328E39A850CB98085B34B57FB52DD1D154F98FEC49B3AE
-BFCB1672762E4D2A1ECF02787F59DF1EBF2625C3631BED849B298C6D226BE4E6EA2AB66A287D2BA9
-2A6C9C612A5F849B3CB3C25F17164BE286F6E4F5E7E4C9EB17BC68AA5EF0190B64696A570442E1D9
-BDD1A30E7692524E30E4B4C3DF84481DCEC6E10E7308E65DE9D90099F3FABB3F4F766BB86CC98594
-6D2003E21287761A7386CD8461615B570BDA015F5EFA23D18E83C325EE444EC166A1A32D9818C2A6
-5A092D44156C06D3FD079B92450B8A491CBB3529DDAC7D95AFE8EAF33777FBB265FEB8A4B9AFF2CE
-CEFFF49AFBDCF6C4197497D3B448866D70EF28D8E4B17E7CE95F43F64BB48C4A73EB84B26650F62D
-3E5199D64DB0B5B87702650ED0B850FD5D16C848D096E4C7E61BC63B2A3ECFC099CD713E12C91A65
-77A88D6F55D348617C7A49890A86EA8FE2045704B5ED529DB128C9B19EE129E5FE6498CC97087F6B
-DE96007C9D01CE9CAF75646E5A5B32BFEAD9362A52223D746943A2D09C536CFAF78E601BC2D2F0B7
-63AD722E3A7AE7069D65F9F2BDED7278511D0120F5EA071D41A69F8C2A2D720D3B24B4BE61C83FFB
-EFFAE21B0560A6FD1A44E53E42E0D10E0E93F421A8A7E167BB65F0D7F1DDE2809FA3CDFD931CCC69
-B119C83238C1C00EC100D8E7AB1C7FB02EDE97073C8A5860371A8132BE391EB1C397B61F93876FEB
-438C288EF2E38DDCD182A5CFBBA994A94A1BF818312CD8234215FCCD7C240A15AC01A885E1179E5D
-7D6305DC2F534BAA141F25EA6A5F356486E5FA0AE3C6980A9F5E8E99E7AE5B95AC42977510970245
-4FC951E4319AE4B1DDC9B07D0998372C0A95ABA6985A4DBE6DC633154FAA30ACE689D36A7F17011B
-F29CEDC58A6692A8B3B0A5742E6CEC2F69B255BCEDA762DEE72F125EBA98891CFF4D88AAC14188A1
-8D81424979C9079E44890D94EE094D4CADDC1C7AC5F6791FAB8849CC0240A579ABD800EFE3AA4EE2
-F78119A3C2806C05C2B1F17940BE73984982D1C0065433A9BD658EA31AC819DA9A11B87475BB565C
-C294B6F302FE3F7752ED9B963C5279B5F1196762D0E12E6DA46FF9A0CADE3876D7DF695D8965CB4B
-47B351FA3F759811269376B2C3134403633FDE27C9B024F6BA81F3E1699CF64A426618428BA6C326
-6BF016C5DAA5FA4CC82FB6DC23FF2D742160518CD3A65ADB38E53F1067076CA1625466E0C64670A1
-564A54CE14DC5C57D24A12283FBCBFFD0FD594AC2A56EE58B552F7586825E4FB1EC23F8221711692
-C8C56F42272B87EBFF3865191F1C11943BB76D8C0CFC53ED452AE49404D2C8193ECC2A7BB8CFBF24
-870ABA38D2CCF7869E9363DC0AD94FACAED5922B324DC3B6FE83E7B34FE29ABC1EAD62B49FFBCB81
-1ADBB5148D5AC2743E3A058386036FADAB6FF071BC1C3B8023F908B6FF48DB0AB1C9C67487C35211
-D40995E1892C8B66AD6C9C6203F6F8B513B11117B10DA8725AB45B4437B5A88A96AF3178D856D601
-196E8162868A83DA64E408FDDEBD14D6591881EA652032CF2F88B3FD6C0479C8F89AC68D14D01AF0
-CEAFD95AD146E68FAE01A07F39E7A0C5E4FFA6D6A91D710827CA5ACFE7D1F946A8D7B67621D60F53
-41F32C12A6EFB03AE5AC5373A382C044A276F6B41C173D0AAAAE0C1DE4C3CC71EC2637225CCBFBD4
-5EAB92BF39357C57195B410F74283585B12B926438AC72AFADAAD2D0FA2CCA728C8E86BD3FE75D47
-B8BEB96AB13B5480F7A3D5741EB51E3E40C21FF2ED7D9221D9877C7D1A8CECF394E4023FCF8C4EFD
-B38B839499FF5CD96A46AB4FDB46F35D3B48B91757C0159328120E93CF1F2739E936E28908FB1947
-1D3AD7F6F1AD2BD1EC364986A411CC1B547D0CA104FBC10B1CA7B638A60E75485574034561DB345D
-DA68415146AAC632DFA34769B6ED7D7D4694E92CBFF4EFB16B55495908102E85E827FC623CF1BBE6
-A13CBF64E878E1A2A159948B5529B75E071744A5F0E50DF18C110B0AF117CE7F33F8C959D4C98CED
-5A9D492AE6F56DA57B0F17495DACB130660BCEFB064FD8309D965ABE8D2BE98F6898C1B7A39CBBE3
-E75DA0FFEF6CC3945CE76DA3BE915546FE8A5310130AE0ACAA9AB73C7E041C00533B4BC7724657AA
-649B9388B791AAC5EABFCDDDEA2CC67A0FD0AE9BE37DF9AD40636538EE55A83F60E9E026C64FBD8B
-220CEB46E67410144A520FCEACA252E8165448F84D8EA083C793AD09B90B3EE83B73FEFC3365C729
-E3C738894B8C01C2F8AEE0CC8B114E1175EFB44CC4C6CEF5C8754B1CC7CEC200AD8BF1189D741CB7
-5BCA4E88BE959E32216AD33F674F49AB20A354CF3969F1611A95D3934E148831AE7C81A7EBE3C524
-4F743E66A82E10D16CC09F8194EA7A596BC5981D833318AB4F7DBF2ABCE543E410B649D18D146F01
-486159683DF61A3F880F9B21EBFAB77E908C6CFC79F89BA5F51114F0BF7C3CCEC7BF0F3B057C3195
-CFBA6908E31E0DF10DF69163C9DA7BABC00E9A580FA7FAC202910615BD479BBF76FB8068630D1EC2
-1CD2926D351E869E16C2CF1E023CF04D4FC61607DAEFEEEDFF5593E6023492F00029E2AE4B4A2C14
-50954EFA2792F32B4934A768F892171245A1E2F034E2B9F39833F1B331A19A386BAACFEC8C929BA6
-B67CD8922BBC9DC005EC3976575D5B0508D0717C6BF11123EA36D8FD37FA77A6F1F5AA84D4AD8D25
-B2C11D1877A6E2F9B74F3B5829FAEFD4F7209CE9785AA6FDE68672554A6F29D8BF03FE108ED90A7F
-58690FAC399A8AD3A26899072B832874DDB629581A51B3325CD9EDFD49E890EA8959DB937DAB83C7
-77F2A426B967AF5888C33A3635B78D647AD6BA441E222C958EA58D61945F781D7EF409771B89B202
-42AD7D07C2EF592CBF413C5FC89EC30FC9EBEE4BC63709AE33B65EE3091CECBE610B847E12C556A2
-79C8B114C3E460822D3330ADFD72BD69F54C08A81848C2002A08326CF3B09B1305490D35AEE59179
-08E1604ECE75BBE811A715AE8AF7EA9C371B322D0428EDF4C893FDEA607E70E1B6F6614947326101
-EAEF18E29BE0557D2A92CF1FC1505E8B434BC368CE07CCAABC0774F8A63E1073FBBCEB3F4052462A
-A9008A1E53F188C9EAE339FABA74AFD6D60F47282CD9FF721F64BD51787F3C13B5A6C5A5F7861171
-0111F5E0471E206D72520F1DFA465F4A23C71DCF99A04CEEF11B0E3BDFC35B7461A60753D3AC26DC
-50A5956C9195A4F5226388E0953DDD03AF128A98F03BDFA0602CBBAA20AB9ECCDF7255962A332E16
-D4380762E498FDA4885C64FF5F9B480DA487C58E78943DF62616E6E2C69EEC8836DFCFA9EBF58938
-A878F3E792E8BD8C5D6DF557A5D82018DBAE1CA9C64BA5AF8E21BE1B6680FC5DB22422220B776E9B
-A0BF1ED2B7212F8BF111EC8C8C77B223C05EB5E5F1CFABD2D037F4BA0F9503E2CD83F4519D180476
-63F09E308883F5DA5228F83045FF41214D2273B2FE0A9017D5E0557BC2A198C35D1E7E81F7965444
-5760CBA1D3F05EA4B90658E53FDF0823BDB1501ED51DA75C47395073D8980D1E3504E3F67DB3259E
-4EE73A87CFD96F84E221796573958D364A51E635FC55478C9CBF9AEA16B7D8C25F2115CFE4B7F598
-54E24968833BA0D64D1D332A666DFA2A3FD71B05A26BAB7DA382907B13DE0B80871DF184D3622B62
-3D7E09BC32A4F6EA2E6DA450A906EAD36D53FDEC7F83E101FEF32F4FAEC581B000686D86A0D3861C
-1E67F18A4C4647F51F978484D9E3100B37BE9D20AE84C085461C1FBF929C669E936659050C2627AC
-1B019837BAA75757F5B0A82E8AE9CF2111931A38BFC94744E2FDE3F8710342AC615286E4ACE7F269
-743AA05463AF537D9416230ECCA859D8C99B7C6E70BE7FE11DB698589BE9E11900C8E9582A4EF5EA
-94B5F62820C90DBC022A620EC536E06CB8BE7526A789996D0E741AAD980880A33800A6FE92286CCD
-02C9CB407EB31FB95D9C9F4AFF38B37087AC582C1F7B64A7C3D2202BDD62E9AEB31BCA85C4CF323F
-03DA9D318B91F78FDC0D266630F7444ED068B55C05461C97552366A82C2E743CEC353D51028FDCF5
-403B3B74D379B82EB69C4380ED40239E15A86B2E5C860891E26781CC111FB5705E3B7C7AF1946006
-54B5FA1B5FC54FD0BA43666E7BABD2C91C859F393ED49F7123EDFB648A3D6152F2C17F7E438C0A63
-8968AC06B4FB3F77F64F358AE063820BD33F0213C85C40E4D97ED100EC2DA1C2E1EA258BF107AF67
-5A9D995F60BFA37222B9C2B325C0052BB8537D2B27DD43A129C7E8FF42757B3AC9B447703D382108
-DA520B8B3BB3E8C7295B776B44ED28F863B8E1F81B0BD1DAEE8A171525D09D2620C04DD3219D880C
-2ECC79282DD7B1772A9CBBCA706909AE8BC7798E6EC7375189B6CFCE8A875849176E5913B85A18FB
-197A33CA4B5B4058603CF1FA79A56856B43D538E9ECE117D99AFA73B57E307364F553644DE01EDB4
-6234EFAC13046B6E047ECC8F63942F20097AD7ACF0A45C0501A95263DE9439A880D6B5C5214D2918
-0A54D7FE9B2E627EF49E189B59FCC78745E878E45B46C0A648955D3EA8C935113D94F92EC963F66C
-F3CF3A526BA71CDF3CD4CA69EFAB08B7389E3390716892A4872BD29DC1E0889A42D7FFB4190E9A8D
-05D84EB9C5741BE6B02716BC75E0106F5F94BD3778BE985E03860D27E44088C3CB2A059DEBC420DC
-E3A8F4087A9548485E616C409AC400DD1C411CE4B6A229D091B253EB68F06E43511EC5AA6ECA4D6E
-4818D6AA2068DA1AEFCA377611BFA816B5215182432D5683294D67A7C1FD76C52233087CA44943EC
-7280005E93145F5E7AE50100C18364E1B36741E9647C4DC1F68A58EC44095920FDCF05532F603717
-80F78420077EF5C24D63E26040CDDFF8DFD65D871DB943F50CDE84900C1372EF33FD8AB9889C82F9
-4F61A0E6842219A0F39EC7B232CBF802C4A744F33159432E827006C7CA77E480A48A9B0E6A876158
-8A3102E3F98A77BBD62A3A23150FD140D3941773BF7CBBA2338FF37B9EB640558A2313E8824E8E62
-0331568A9B76F4897198A709F9313F4AC40827D8C3A71F2ABFF02BFD57D30D0B14012FB5C39B85AF
-540DDA0ADC27A85B31694E8D7B61F9D9B476571022D98F2D768246550A877293F3FF6ED918A498D6
-A600223E1A61890C49ACFB60265867CE9464F9C32C59E94F7641C3873FB4FA6EB237F8ED94579957
-270D6FD640BD9543E683F2372CCD7B60AAD269E03A72C5CDB732B128818D41A6DDD2BC139F7D3911
-F48E1B1D263DD4AE8E4CE1A686F3A00A2CBF48978631CD243566E22E68F8D7397134A3530EA3745E
-4F1EACB4D6A5FD84C3011094F37573F7F9902305020C53926716D4780C6B0A257BF711AD94C83F1D
-41A02C1C7DD203A3E6E4B14EDA2FDBB36B063A3E074495F626B0EEA146D22AC33457F44F41675967
-6D2A0566EC2B726D2F0540ABF225339F02F406D4E7A62E5233DDF20AE7C86CA0CDD561F33C422654
-BF2DC3685CA91BB9D4B09AC8B15A24A99FF56E2894F11F7BB4728FE8F0F5B799F74F475D2D01F61B
-7E9E0E541F7FEB8A557486D7DF2CE50927515D833BCAA1CD9BF7A650BEE9E003A5951C98ED147C4C
-52F64F692AB281984EE65A47E44A4A5FA93D6F18D276D3B01C5E5F6135AC6940524CD713DF4077FB
-4943E8AC927A68489EA52ACF7A854393CD027EB52EA2DC6234EF034F3DC742D6DB5A67FC21D22B97
-146B9C268BA97C30161CE01EDC69A6A1F05EFB0E06F22644E1A368F0E2C0C6C1C832878E0614B74B
-D645F5CB293CFDB7618B837FFF14A1210AA061C8C81867244305B80DAA73CB25A417228E9559E7BD
-52C119B0CCDB7C4DCE7E1B9F7E8EBBCB575E5BD213BDD6DB88769DACB05E5870232F0EF82F448559
-187423409EEF756BA6247493BE24CB1879B5DD822E03D0ADEA1EDBDD83D3FC46759C679B921F0616
-F27212903F728AB44C1784E8A7DCED0DF5625A7D3F48A20FCA34008184CECD145CCD98E31B79E174
-CF107E8F35C40C19D86B40BAEE6164353408801EDF75A619FFC5B6FAF3F3A95F64795CC40C1F8963
-4FD8C13852D265FBCEF834C800AB46E3E8167476B23CDD8AFF6E2F997C99A86A9CB30EF8C853154D
-0D89EEE9B9CDC1B4F27BDA32432A4173B55CA8D9FB50ACB2D886AD8E5862FFD5DFF224BA13C8B8A5
-4A7F1A9F987FBBDBC5A3C3D762A5BE309D5D926AE5093C40AA47B3B1BD828797CBB9BC9FEC9D19EE
-A73D2A39764816113A8EDC6CFA6E605AD578FC8E30ABD600658A49ABCD5AC54655D29C50FDB72070
-169D1B389F114B7C71EF95A80D82AB537AC8C165D47371FC142A51625029A990A577EB1618480D72
-6DA93C98E5C5F24F622A850CDD94BADAEA91D4BC32CD50CE69E9F00E77DEA8EC1D37916398FB7092
-402605359DF08AFE7B99C76C2A7C70383F28A7C000C696F45291BB8F074791798197CAFF1544C76C
-EEA8C9E6D76EDCBD92A86DF889481F3BBFF0865442264F0EA40D3CAA69AE467A08003F9C30FF7F2B
-77E767580575398462D5B1171DD441D8986F33BC7BDA17D413EBB6B7A32642E33F20B284BF3EDED0
-02352FC66C6F7741A542155F4A159CD778BE56B9492CD95115C1A06189A216CFD2E6725965A13DE9
-73765A05114D9A5A4BE0615AF8BF6A5EAFF84468B849954D15BEAE1CDD57C435788B331905C01421
-B50F20B184506A0BEF746330BC98E9C89AAA8F9D102F158043BEB6A682059A1C8B8CF67B2F3D7AF4
-D8BBE086254CDE53765E3226BA2F95AE8063649F9F94BD9519411DAF8A0287307335668190638806
-E29484A4FFBC1E46B1800E03B162C23B1DC0B4C0DD3C7ABED2F00762972EF06EEB9BCDC7B3F39C70
-BE32789D366F073AC3280C273DFF2979507671B3E1E7685A9A4F0FD3867F96DD675BF05F25ED986A
-79249B75F182FD73CDA2A6A66D693E4CC5AFE3402431B2C816DA1486C34BC9DCA4E2D51C868688A7
-787CD10ABB9ACA14B7181369DE89913CD8FAB58FC84519EA2AA14E54B7A8CE474F213E07CF2DE2E8
-88093DEEC937526816B71C96ED75FA9E2EDC0F9E6E84569C12BB8E39AAEDBF546630745553D6084F
-F9524FEC6A7264F88CEB7EC3358E923B392474E3A48865564431662988FEA768CE555AB0DA48BD52
-6A84B0CB17B4584066C1640C1023D91F7869EF0C4D701BE121A6E3C832010427490758AED7A2B30D
-6028F2215AA44E86D852FDC67DA5CCBA79EEA863BAC9EDC2535B66AB0E54EC4D4411390FDEB8D1FB
-C1743F15C3B68DC92A8659E7A892D5E53872EA51EE8CA7EF51103E87C29A2714E907C79DB9CF3744
-1785D2F73A1EE58550111A4D9BCCBEBF2E39CD3B93DCA300FAC3ED1ADD8215301E5766C30C8CF296
-75746C5A77BF1FE3CD75D25CF193DE8D9AF02AF8F7A6E8F84B548058CDD3C6998ED13463FADE7391
-26D83D3CE2C7201F955382832E32C10DCBCCA35835985B9A93F8E3B0208BE6E92428787C47D3808A
-0F77B8F1D76E6BF6A17FF81CDB065180E03809D03638307BD7BF5CEDBF64904E918FC805AC905379
-928B816480F6E3BDEE47042CBA98539DA0E113B1A5F23EAF1A3210BD18561985E6436EAB90395DA4
-77C7A6D7888D2377B3FC4169368357D880CE041E1F7C875E956600DB7D9B35D1EE66BE476E9DD806
-4CC02230276829C2C0A098F051502E828A0CC505AFD8C3DF293DA1508AC4D25866BEEE6BBD5A230E
-9C2DCDD4F06883936381F476DDCD86CCFE15C2CE3C3243E148CBE603B8513A7CE7A6910A66A90B70
-89E5CCD4368BEFFF2BCF8E918BFE0A1B069AB2A914CA7BB91A0AC3B3C0B060FA1A0316F6135E890E
-E549315897C8464496CC6DEA0F7E3AF43FFA4C3281156067582CA255B1D2E80F999A3AC0402BBD17
-01824C3BB524130F5B82A45275807BC2F3A0655EA208F968B297F98C369192C8ACA26BEBA7DC4506
-FBD1305E2EFA4DBE5375281A88EE2D6FC88FC0A755E72934B4B58F6DD3BDAF7171A4A3C776576735
-2492BFA9A7758504750AB7F38754683B70E9E293CB1CD7B23BA62BD7397ABB84D7EDB22EF6C3F58B
-3EEAF656E361747ED04020163253D1CF3F905B5E85F83FFF30AB2778CAE43781667C0F65C8FD404D
-6B9202A99EA76AF9AE1236631550B66B063847180B6DCA832EA8DC4A6EFDB674B5A26552A7C7D54C
-2799C7D4E03C24F661A91103086DE3A90A774A6988347656344CFBA06065AB22476BB09FB68F9928
-C0045F2764AF643CFEF0516D87FDE6DBF93BAE2829B176CB507BB99835E01BAD5E55C2F8798C93FA
-35EB3FEF02CFA31D3D21B030547F86D27B9448D68E2B155A65C742BD2999DAA0C3AED64447B9CC67
-F7AF33B63AFAF25F3CF7EF86657FE8F952288CA4B691D369E8F1935CDA44A180A6767560C2ED3F2F
-CC38B6BD7991D4170C7C566D690A8A25BE03212A80871108D18CCEFF246623E653107631F29227D6
-4754B2208D19F84E547799E691CA473780DDD56AE620CD953D5133D135E3D51F237078FEEBB73714
-54EE633CFE238AEA63F9999E32850E6C197687A0EC4E5908D2A18C5349627E336AB5E3185B218228
-603A4B1852069F5EE849D571B8387DCE1F8F8E9FE94FADEF128BA83BDD245F8C1C27C11F2ED1A8AB
-2D6D601726842CEE744EE7AAC6B6FA16CCAA39DBF5B3B1D47339F31DFA562671A9CF7DDE6915FEF9
-F19B3E068A464DD350A3AD146D1A241673B5112A4A8768F976723E6E184790C0604506C46591BEF2
-106C40789B733331A80740D59ABED39868F80BECC2AA21C400A0BD0CC326D186FFF9EB37680F1EDC
-32AC78F9059280D07B5FF2E354FED545129FA5FA8F3D4317FF21E027602FDB2522F049BB545FF4DA
-60248130F81F4E348373142F3148DED038AFBA818F26D5B49FC02DE9800D894E9239C88EE0EDE431
-F8083697CB0BE3B497473473E5714717C914A1A926730C249413FEA2615EF72BDB0906933387A892
-370F77EEBF62D26CD583EE643B02E323821379C0DC966407D36AE3CDF646B95DEDC7D7FD0F28E950
-78F12DFC0D6400B327B743C548A0A3517A175A7ED963ED756B1E107AE7087E2446BA702CD4E26E2D
-CDC1A8B697108B5B5E81E9F03105F220C72D4AEBC57665887C8C7964089FBE9424120EFDB14D76EE
-F8C6F7A30B13E1AE90CB9D93D2E14BDE47F4A1D05ED5B18D32AA39911B92D24C93976ACEB7EF597A
-75161923A73B2CC761785493D0EEDC08B5AFE95F3C006B41438A0785C962B070DE2BD096CB63B847
-C87539880AA3D3FC5C345E0992D7BE77C6CFF4948617FDDA784CC55652192B0ED775129C4EA4245A
-41BCF3875BE319DA0EE2DAFEFAE920CD2B6C6C2001762F88C0C5C05053025C0349DB17104360FCE1
-5D7F3A8E30ED13155A74FAF91DC77B8AABDD6FBD5A1EAF255DB209D7F2B90822296B5603FB5E2CC9
-5CBC5F7A6044058B8044ADCE73ACFD896177F1F70EAD2F6534DC3AD755AB2BA87126D63CA2E9C441
-DF0965BDDD6BE494E58D6B5057A561D1E31BD38E92CB73C1465AF6B9C001F7229059BCA4104847D1
-639E124E082F7364B56548BF8112D0EB461B316B2449049F6A476D36D6B7C0C1126C08F2E9A1246A
-3B5B21E7C8FAC6E23B82E33A7783E4F31F0240E96E69C9444E7D7A928636CFD086475DF1E0A28464
-81387BB2010655B9F81A0744121699B4905AAEDCC84BC5D5AB3674601DBBB651EDE7B5DF05C8A463
-DAB41F79706D285C4F9063997F7AC8CEF35CAD51FBE5F5BB1B3FA6DA2C3ABF2B3E925581349728D6
-DA0D59C1EF6444539742EE9A23A5727F20CF9377F4F84DEA420607015A30FB14632D084A2DD181BB
-02FC3A84FC499B318156B675B9CA3CCABD87FDB2497C6705FA70EBA43ADDB6CF961B30E8F6AB9F84
-E1DD8D6DB3314B34B7F7AA3BBE19D5BDC75ECADFD8EAE19E07B387A1FC586F0F30DB695926764B54
-0D89F1D854B0FF86528AD9523CAF56371E29498C11AFB2F4D5202670C834E930103F039D13348824
-16A49BF93B84FD3CF1209EEF7D4994C8302436C0794497461C11F5B8BA152BACBCC08AF8A15F4A4D
-F3EFFB7227CA97FC21D2D0356C93390C749CBE9750B821F1A7BCFAE2C8BC6D9A27F844D8AD088320
-79ABF0EAD8ECD4EA72846DFEED021857F33C1ACE4C07BEC90398B629814C498D33BEB375B9A53DA0
-F926FE6E89E70322C72CB2DDBFB16B13EF7A4F50DF783316584C6AC2BD7D9029124933133B2229BF
-74A228868AB30EA5C3E87C78C3F0962199480DBCADBEF53BDDE45849DA857A4FD85B96682F1EDEB8
-5384929DEE4AFAF84C51A09F5D572705673D885070303FDB47DC898F874E103A9E7C1E894115DFDD
-AD81549C7375D4AEDCCE2E52C13E5130B47F206F7C5AFAF1F9EE83DA8188D70B473269CA280A6A02
-DE85300B93D8A4F6B402FB5DF58F1327470CE11CC63ECEF2EFAA396A6680A6746A20382D9529B58E
-7CE684B39AC00F7086BCB47C2230DF0343BED9B9152A61C9826AEF9E00A1452D91305CF05490D4BC
-0BADC9C6FCBFA93FAD52C3A80705A1956890497557C0873EBDCF61CCDD2219354A4F5621AB33B119
-32065C1D990A9B68858331EE7875CAC855F98563B14EF9E1060BEA90F195AFFF94728AE935453438
-DAB35123D0E2699475884DDAFC7307A5CC06920F35341728D85965F5BA86F261CFFCB1E29B429F97
-6970D42D10E6AF6C4B792B4384122AEF2448E22A58D3AA007743C71324EA08D06819FED14AC1F22A
-4F0BE4787BC8738E1CEF240677571C65804ED3E748D72E89C94B6F310BE748FAEA31EE246859CAF7
-A1EA17CCB5B246C87EAB771E2AC5D378650191081514DDC2C66878E3766CB20DC49F630F2743A7FA
-ECBE9DBE9E815A3CB57DADF2BFF5EF2FCE23A56298A30A2E052FEAEFBD698101F9DB992613706693
-CB0EFAF6F60C8BB5E7D0A50B3392B9831EF3A304A846CD4AF431E9F018FCD3A5B16387552D55DAEA
-683D36257418AAA0E7BF8A03ED7BAB114D7C15119E6C71C1946BD7903C1C42E115E954619051B853
-BF05AE316E15E619A7DEE498F771E809D9435969C1056402725EF40C0200E083F3EC6E0EC27B8ED3
-8DFE32EA0E5E156AC36C4BB9AC5ED111A11678339703F1B9299345AEB1F251FCEFA11FB3101CC499
-907DC862B4463D5523B9B25C5B69F70AB6B29CFC1DF1ECAB8227EB3ED1F882E90B12080EE003714D
-403EC43B7B54491446B6A3DD6EB641EFBFEF060C45E873E7398025B1CB7065441F1753028F6F8C49
-A96801C0D598E098EADC96A21117F817B6FD6E6947642F93E22425A00E8F6B592AD50B317B69C0F9
-4047386A45E5EBC9504FE55451A01EB29DDF9A41D4BAD85FC84CE280971E834F06CEF49C8C20ED2C
-EAC889F158CB14A8C070900478804CFF1D1637CC880C81AA287D8382837FFA8F41FF3C9DF2F22CB2
-0044C171E4815D0D0F6C22D19A52114E780CECD71DAF63427782E85E463DCB333789F496340E8CFF
-885A9D9A4250118B439C71C6BE51A9338BE29251AA794EDC67DEEC6337FA63CA9B03C1C9F75E733A
-4A918646E7BC9792486CB5A4BCC5F84FBABDFE338C3792254A3EEA3D88903C2C47B91E076259DCCC
-8BD3DCA90ECCC832C09C45141C6242026BFE309029A562C3EE0FCCDCD40E5CF265ED9C3DE582884E
-0E14819DB98B3AF734B1B3276AC41D43384EBE73003D15CE39FFCC04109583390E470F431B4407F9
-8550E138F96C4564B494E5480F47C853BDD237E27301F55E42A3BED18FADA152572B7B465A581DBF
-E7DB2619365CF16D71BF8F091862B9FCF04BF8D0859A76F46E7B5712F2757EDCE332D3213B8A30AC
-2CE7D7797EEF6F30904906B0805DFA7CA36D32A20D989858497A66CE72491393DD79332003D55C09
-5A5AB5DF761C4BE5C041FA8407263D604E53091F7B6B15496245DBBEE96A63F10FC2978D99E65731
-28689366FE8B0BADA48B50185B861BAD03E3600F22BAD4274F2542B635F6C7944BEFC3BC741BDEF1
-1A8DD659038CB40FEF2E16AD1AE7EBEDB7D9BA15FDCF26355331505A386DD7399FB999535D6061EA
-BC61DD76EF3EB457446F29D0BB6EC2FC0AABAC20B27A3C123C27BC27A76336D0A0A6D456DA070367
-4D959A4AFE428E2206A511BFC80039ECD56E75F69786DA0A8084D81A66644DD98B6018681F1D70AD
-E09BD9BF3D16D68DD5D0A03AE26DCF1552549E459FE190B310A8776B2C8468C14CA8B1B9A7AF2956
-507A3B705AD75A17A0EEA7FE089273353CECD07BB8563465EC8DECA0EB42F43FE3664EB5F31E1D13
-24185539B28D508BCD065ED576D8814ED3FD637D576F027927162344AFB0255A91FFC616948E4E35
-8867E9FC76A9AFFACAEBFFE110808C1532A2BBB0DBEF3F010E45FFC73F228D28F12E98478B27397D
-8F456781ED9E19711DF2E9EECBC3FE61F7493FDF1A59124668A91BE51F122F93DCA4BBD22DEEA339
-E6EDA3D6EBEE03DF958113E1CA49C8398D2C59DA6764882EE3663F62A55AE50A7E91B4FEAD1B11FE
-0D50ACCC5D75F1A515F0C53616A500F1491381DFD0E2477E402AB0CF9F67D501A442629C8593ED5D
-25A72EDB9746B02F2B0F0759CC9CDCB4C9D8B4519C8C617E569B432F0CF6890372AA879CA7DE46E1
-10D95E230A4F0E52CF65811C54365DF4A3E40D819E2FD379B47DA3233D0DEF0EFBCE04AD8BAA3888
-4F6A69FE5C373E38AE0FD0241480F2BE7CCD18AF85916D2703A049779FE7398FC47D348454CF03F2
-2EB3FECC064606957898B5643464845445C25C0C7D685C8DB042AF5D5882174374ACE90081C68678
-9BCA96AC602EB41D317BD652293EE628951875641661EC86A2C40A42E8F0813A861D41A0F5178E55
-43651CA0E99150462DB5EE0010F00DE6D55B0D7FD7EC5BAEA24ED3E90A7D6A0589761922B91A6A91
-3A7FEDDD3B68254D89ECF767CE8E27F966426A8B4FB1B4085384FD09D63E288405B78A646F44C87E
-EE22C8596B13188085479F75F63D3D97A28F9C8306FD207DBFD38DEDF0FFEB7DD80B2A3292DFBF1E
-D605ADF1B33E85B010309E3EC058FCD922B1325FEE71EFF2DBBC2E68DB52D513E024C01D47CF657B
-B61C9734649A4AB63C0AF4720EC3EFCD82DD3CA6E80BB63BCF1B8DE810A0C6C517C63B76FE68C0B2
-86867BE102424FC31C4937048B6F323D039618586FC21731005D949E7D802A430DF8D2F0CE99F2A2
-376C2953EFC4184355E4D12F422C9E1E25C4DF38DEA334DBC89B540E14C61A7769D77115CE8968FB
-76B27D0863CEA2496783114C24D4CC816DA884D953DA3F9B9D3AF8938BC607BF26A071956CA07E6A
-5509EA2F5D80E5CBEB98041B197FAC760976EE75B470DC20AA023BA3F63C2876EB281FF5173BB490
-D6815604517AA1B1FA0631401B3C1A04CA103E2CA4ECCD83874D9CFC8ABC134CC0F9141D9AFA5684
-8BF222342016C556C14B3482482DCE5D0B6EF1AB522AA1812BDD8DD3397E05327EC12748FC480842
-9B97202E24E1DE0C7C0D272C046BA73B37D30930C5DE5A47D96955CB0F5DED8F3AD929A8B42D2839
-0458F5910A0F93610F79EDDB27078943DFE17C716D65F96589769349F3B66AB7B8C004CCC59EF688
-1F745EC7129865A76F9C2D029D4660CCFB4D5F9D412BA3372A27CB175E9D65F759575CF14A5899A8
-D31FF039AC02DBD8391C3397428AC0D5717C005200790785354813C8859BE90E0E17914F6CB9C674
-F1E9A9648657B54E5E1F52756C4F982DF74E73F6E4D40718C71D1D0E2420FB7462FEC9E457C0414A
-96E475C6BE2C10437096FCA0C942E995A9ADA789AB637B648781D32DFB68E62E91C2CE7E13680F8D
-31ECF8C824885FA7618981CD05FB335AA111B409C59EE337DF4E5F9DCC920A5FC0D620DC07F20DAD
-63F4FF5E0EE5A2F390AF1C32122BA7780F210229E5A5E3ED97BC1C3CDDDD456E739CA782EDBF4B81
-0552368E9C734B0C78B0B8E3F8B2DD782862B74318871BB1EF087828CC173D7B049811FCF598B8EF
-DE4D9BC5447F4848C98029C854F3AE461B9D46DDAD8CE67A521F3C811A81A396CB0F80F3C8D8EC88
-30532FB7F9624F7CAE0F8C6DF875073333DEB28AAA90AAF486AB8C932553CE697B885E71EC8E40C7
-835CD5D59A2C695DB9E51216FF9B77A15B0DA63717FF25B05B939E45CF7FBE490E51E9344213B32E
-115C2DE14D76DFD5845088DE645B0E75042A61D82FB1753C445AD0A956A1263E5A096B681D3BC51A
-9FF32EBAFFF7ECA8B59D40F0937EEFF38312AE57462C7BF3B1FE24D2BA8DFE84515270E09063CE3C
-80DF4935E409F62EB4F54AF16A186D4329972B9BDF15FB08461B688ED49928429226CAD9F67C9D63
-6D1375CBB7B08A5631956B7FE29CC9EFA8D75C9E4919C8C2C54F401D2E0D7BFBA40C50CAE214D210
-C6F3EA5802339F63FC4C1C1995787617F3EC2C806CE44CF8E29F76606CD5836F6E5A2E423CD791BE
-CD3F112F25657DFED9366FC4ADF90B685CCE4A5698E5FE16D7542B913FBC01B288DD13F43DB2B1ED
-8CCB80159DBDC90A8132125DF8DF547C4851CA609D1F6F4D647741260E845B457937787827A89E37
-CDA06BB191669AC84B8608EAE132D10177F3FC384980F3A6E439B048A38D0D6B9CEF09F3F2D732AA
-71BD058169D6D0F8C9D146D9DA046774027559A8B3843F6116B418427E78476AD8F0F81E8A6B1209
-8060FF7DD686503F972D6C42FD6CC29C083AC3D72E3751F21D2E44A572EEC80E81EE44C90FAA7AFA
-BCD3ECEB98FD4068F6C3A4DED0E6CEC523C9A0054D1FC2A8D61A4A26F9BC250B8F302416924AB22E
-722297888B85B9C12F8DFD2A744CBD143F9B2514C1CBE988D9CB4E77D90B2EFD5C2A528355A35F7C
-4AF039C7D1D756305967B847D4ACBB81263D4992C001E2A262B9FEE2D1F5022BE5B15E1D8F1D67BC
-52227344EE912C018CB73E5F47CED54FD202627777BB77AACF3EE6B22706FB2FA9062BEE87E22CD2
-802E7706322648DAA0C624EA885430175F746E1F536F9A8E1C610C4A761D07248426DB63C9319A88
-A3FA449C3FB8AC94C6003C745E6BAD717A3B2EA3862D1E08512A98E57772A62F85F1E2FFBA40E2EE
-43AEC11203DA9CE5AFBF673436F2DB6AF85BBE89D802F7A9E5FA25A408DB69E51F0577DD26F94CF2
-BA2FC53EDDD6FBEB534AF15F74F66EF8D14E7FF77D8A5D284C8202DD5A6053CEAA606BF925992382
-5EF4EFFAA8D878652A4CAF2EE43ED26BF3590402686C876F86C1AE95046E527617CDD3C429BD4CC3
-F9654D2C76DD4102471FF746FA9FA379B16DF96BFE3836D43FCC0B8E95120C27370049ACA4AC313E
-1D50D72D1814F2566B8B29FA9C9C20D0488743722A766436776783B939171FFFA00E04805A8B5821
-4D4F114F7B9C3C17CE7486AEA2BCC895ECDE809502BDE57981318A93F23016F056A421B733C4590E
-34AB08BB348DA4A48F19B6BEFAA1DDD2A49A6C440443028333CDD48C85CD698ADAF3FD8676739E44
-400A98B575BE02350576F96CFA54D4184BA47555B8D12374B86D038D085F7FA51FF4BE2FF5981408
-999B48B2FAF305212ED54B2E371F5A0074CF68D1B0E5CD279BBC8BBAEF694A89A6C43F518D01BB4E
-8402AADF34E96E9B3FCCAB4CBEA2741D3FD9ADF7AF32388F7771845AF99965A6078F4DA335EFA436
-BE36903E33A743C112C0267309F266DD44FA998C9A139704E400B89DAB952EECFE2AC09C82D9F497
-5371CCC27DA37890EC84123193314D8A7A707C217FFC951A547EE5B6D1B7C8ED85BEBD9D3F4B9B09
-6A78E5F7DF88C931E3F396973974454E59340CA51DBFEA1A00DE084B64630E26C6D6A3593B828814
-E27DB0186BF2A87EEF268AA1B135AC09B52CFE53051CBCC88CEC5657BD47F603C8E1A6249161684F
-D9084AC279F57A4F9BBD0A546A87E147B62AC860911969A29B8AA20E3AAAD0079D64E6BF1B0F2CE8
-F0C54C9019207E1B403358253C2FA93A662F63B9380B65C5173C198D86A3D0DC1800D1F5378DA39C
-E8523EB62C6AFAD8A0D7AD1629F2CECAD82B8FDE38975303768C7D3A08B91478EDB3C45A8C6B7725
-EA8596A8ED50B8355FB852FB8966479D12E1086223B1E6523A65FBA81DD106FE254F7309718768AB
-009FF7714A8C363B09DDA73CD3F81BF9C0CD3B0C806CF3B7BBFAB73E46FACAD2480EEBA97AE68EC9
-4D3D79AA01ECC22067858EFFA9D7B7F997ABD2CE5AAA8781E5499E8580C405681CC63EEA53BB47E5
-5ECC5BA2A7A3C5472DF034B022F455C60FFF971B01583A29E211A87F7163187B190B0C1083D696B5
-86E9438FD8BAA45101A5EDCD1BE5AB9A585511089DDAC8DF1B1FDBE582ABD945E67F99ADC4452988
-A9859E39C90EF794C5C4E62997085B7A16A0D90107D08610BA175AD66377345662DA7DA4D8FEF847
-EE5D57E3AC54B928A0957CC1C944E7FF14658FE4A641CD26C61105C0F136A75950764B69CA17509E
-3C19351D456B22C87C55E8DCC4ACD3E150D936333FF36499AD6B02B6403DE0F12901301ECB2EBA10
-324BA72B58206A13B8F37B0AEB12115D0C12879C8EA8A2EB70E85C95434564BA3DFF481C8972587E
-FF74EEBBBAB14FB32B8A84B8FC42EBECA65D25E8C32C19CA5962832BF45DFDA4E871508AEC318495
-0D6DBE89019CEA29E40484C36E33D76B756255531ADD1DB24C03B2A64A47BD8FBA3FDCB1F5B96F8E
-ECB60D5834AB001A70740498720AFB6EC03445CC35B51F7987109618C6C78CBE3041BEDC69B6FB12
-8142CEC5C8683B558AFE3024EFF7A12D04EF59A72E156DF11D33ABA08A8EEB16259DD9529CD003AD
-4EF4137B6FF1654236473DFB93F597331A5E26C7796F528F65C94FE07B3B4F4DD49034FA0CC189DF
-CDFF70C2F1C6D3DF30AE103E2AC5CFF20664AB934CE5C19693292071C93BD590383E0A1931E04D1D
-DD18071DAFB628F5D7472E457BF81D6064EDFA8DEBFF91701C5038CB30865D6122076A336732DBCD
-B0A625548773D0013648A76F07BBDC9C16284D158EC7A105AE37A62279419C3A2F360D0C7A74D6FD
-D0E36DCA2A8BD59945A4196598F690878F84C894852C1811AFEA4BE3B9F6A5219E6628C66669DBD8
-FA9A0CFC2DDE7716A356FC4FB271D8A2CDDC8D4684DE447355BC7A287DC56852A638C5777826EB6E
-B72FACCC86F80BEDDD0D649A883CFEEF4D74750172A90B5DD8252592FCFE19FFAAD868E99562DAEA
-E70514F5DE296EF7B57E6F193737ABB6AA317956584423817E11664A67389197AD9F8F771EA59551
-98C9EE40A0761639E638CE9D890DF468642670235F1373D3AC6B1F43B5777FC0A91A96E095E89BB9
-FD62614DE456CE7AFD6B855112367573FD9FCBBD4A4F9C676E672D62DDD34A9BFE8311B6175A003C
-D143C0DF15E4C0B48C735404086E48AEED6B6FA21FD9F40B84215DFF287F0677904E2DDFDA774A40
-19DF45CC877F553E95A1C65DF1D67BC0C60E0BBA4D205C0DA3DA80229FDD71859F65AD04506B308C
-2B783839F31CFE4425263224F08C5C7E98A2C9D3DC8EA5AC1920F4E395413262E0836BC019A092A0
-DECA104EB2DF6B63392AE8E2136379140DE5FC98B0B69860FE8E31DAB5C5DF7807D19BEA34AC14E0
-ABC6F6519C51247B104DE7D912C5BF6EF11B48FC6DF84512E9F5FEBB48F72FF1B722BDC3BB2E835B
-2E7CC6324BEE84893996B8DC2D4DC2793A4F69C18E63DAF04A7BB5C0A9076E2D5A343E134CC3C89C
-4712900656FFC202E1988526D80C7FD9281FE47FBA8AB5D025E63A84051F6B13167BEC15B346212C
-BD051AFE7A98BE3A2491F3C469718A58E783ED91F90E274FB4978F8719E92A99A1E8F142EA7E1F2C
-46AFF0A2FB50F4D105130CE8EA309B0E480DC8F80D506172B609EA4BB4E2BBAE98D8882814FB273E
-690DA990B60A9CDA20A2418246BD10AE67D846A0FA815AC25858145ADDA106A6778A11877FE59A2A
-BE300D7DB9BBAB31CB5B960B7E4EF91D4600886D8795DC361CBDDDDE05EBD54B1941F426F7FA8399
-270D2F54C998BE92D146227270A8E89AF90C48BAFC4ECCCA01E6322AFC165743475E752F39BDAEC4
-9297290510FFA264342A0AFE2985F85DEEC66C36EB4A1D46683EE7C591A89B81569A8566AFBCA268
-10DDB0970577A76EC8A066622606B08315DB0F2E6C671F3259C73637D773D1A180AAD66ADADA2A65
-95B5F481E5F59E51CBA876FA06D21E1D674CFAB46A02D267E20234324D0891E7847C13C69BFCEEA3
-AC55F2EAF753726BCEB0DE1EECF42ADA964BF9E475953302C2FCA804B70B779482DC9319B40381E0
-9C0096460AE113C19A2DC9157FA138CF0E7758F71008E71D0F7599744D647B09B16E3C795C56EE5B
-D14D8D63E7A512900D67487975EC9CEAEF69572FC3C2342AC5D365E8A4BCF462006B5268ECC15754
-94CAD9A9E7A9E8D9AFFE49AF647C017743EC7CFD5E66F4E4D845A6BBC836849274FBD270CBF263F1
-67DF7E26BA91F21C60F96257C07523AC37A2193010E976965CBD75751E312817C0564E1C5AE0CBA8
-BD12B01122D07020A0852120680985A8AC987BC33BE863EEC52AF13435B6E4048D951F5BCE36526E
-07A8661CF2538F69D1F223BC53BF5896437D1BD46F57D9698F642F0E99C7392D8EE47134E34DCE94
-D392949B418D9821E12CAFA8337323E8469DAC24DADC6AAD4A0DADD7FF65694BA3A27964D28D8EB4
-1179458F91CD3F83B8F119BF5E76184DD29CC4C0718CF7945DCECC993A7A78739363136CEC7F2FB4
-95EEA8CEDB3EBF14373A058758C442939D36774435554851E9519B6F09C31EF26B6CD997DAFA11DA
-91FA9759F17B7079164C5B47B99CCB7A876FBAB1D0D5D1E1A2683CD6914E6B3B755939CEF1C9168D
-30B2738C4349650CF86C90D2542FC9B90F36A494C035A1C86DD716014AA16E6B9EC7AA03B16554BE
-C436511DD3097FAB1FD0CD49EDAB96F74E8FD26400FC748CBD9EE1EEAEE24DA30DB6F8734B52818B
-3A5E510AA5C14E42060898033E7E36CBA9A64042CF94A74E4B52E37AC027C0DC69BAC4944CCE12E7
-AD81AEDCE642EC34CA23E3FF07B8CD35DFF19F33C8D4DBB56A52534F8A827BE47AD4AEDCAD83B273
-38409FD1101C4DFF3F12D3DF79AD1FCE65B2F419451DD059C88BF066413E23DE27D3621DAC2DCC8F
-9F3620DAD0F4B1A6E8C9E6E8ADB552E1EB2C4B2A3B73986AD53ED9ED8911F82F750DF05CD2EBA3E1
-B0DF208A87FB5ED44C3296B803881C1D9776D13350CD29C3F716F0B5A8B8557812024BA70069BE65
-89AA579EADB1F657712DF2570843D7C5FF7F4009D4D232D3547DC8B92ED5C4DB77B76255E661FF8B
-163C6F3856DE5651B597EC7C78B84F0C6C1D6EA3A82286F1D3BB45F708D564E139E81F473C705AB2
-56346328DAA64D1EA8645DC10FD449092E0634D9D7344B2AEC3C75F6B6CD8B3F3867FF3CBB0F556B
-186EE9A7C26BD2D17C8A773055D9D5013BD2F937D697A770C57BDB36D922CB911CD14E7FA14160BE
-19C1A052E297B1A2D682D4BBC9F1D2493BCD7CAD2FA75D904C5F5479179DAF7DC6A4E0D269BACA2C
-4F2430B4C8CF1572FBDC750A05DCD5B09FA3A9CD6F2F2A386E2B3D4D8E257BD43A783B38E63BCEE5
-03EA96FF2C373181744A607F0CB8D281D7DB1A6F4076AA3E2C61914BD796EF8A0873F79F964FDE28
-B792BA99A20C3F1F5ED1FD189FB1867C84DCD6AF43D49420C8B1F3DCE7DBAE71DEB17FE45644DB24
-4F44B1011C7C768EBB7254F4DACA64E9BA87AA7CD0F0C4B2228FFB9EBDCF3DDE4DCED39399FFEB34
-8811547D025320A88B480943A339E2CD2FA3605AAAE87939B1D7901465A1879BCB4C5BE1A179E7E3
-71F1BA2E0844F88AFBAE9B78DCCA47AE8AEDF5BD3D458C7D4A7A08ACCBF880D1F1DC69C636628DF1
-EBDC5C42FF88FF8B66351F3F72D703E52F3CE91E4E00759753A599FDD863788E99858498B66B93E5
-083BC3501C39A9BA928B0D763C28826FD237E949EF0BA85CCA9AA20C405DB6D5612DB718F7B4AD31
-D253AE306E4D7CB615C59AE668D347A4E60FFF7B103F8BD0E7CBDB142A763BE88AB40EEF6B8FC200
-458D728930AD0F94FE52ACBF0657C4907CC7942710AB1FD8BD149A9C9DEF6B8DCA7DB9062AA7B1B0
-11ABB5AAE8B77893A023F9EEEED4A20FBC30F922282A7AE2F1ACFF64151013D6B8AC2EAAE58171A1
-0F80BC18C3BBB5DE1E22EBE6033BF83040629023D74CCBAB3F1923CFA4A6735E1DFA8A1B261FBF1C
-397E26F3BA9C2629CFDA84DFA3D1087EBB19DDA7E2D76E30DC2E15B8821D5291DA1DFD73940E5560
-A8A6DC91BE0075E3ED8D9E8CAC85AC20768D868CD2DC45DEADCC8B59AABE6EE5B2F891E0D7CBAE82
-0F83479332BF9707486698FE196C72EF72B52F54314329FC498171782BF160E1110A19B8208FC591
-EF0F0DA71AF657B43A7CC649A8488B759F7B69134B4F9DCF79DAEBC1CE52CC8015F324C9D46320F4
-4E1551EDA6D86139DFD1DB814CF38A22A89FABB4F75FB896B00E769820F763486E86668253CC466C
-1529A5A924CC337C48448851A381DCEF63A0A302B65203D6571A1DD1FB9DC0C3BD6AEF4891497033
-109CEB5A481BFE442249940EC54096F1D0F2436D9E60495D0ACFF967A741B30467D24AC6B0032213
-18666B951EFD45324987B10BEF4AAA0FF1DF6887377A7F70F555DFB9FF1001C67438A167A00B05D2
-C37065655173A7ED9AE342DFA1497FB1F2FED6098901249A085D31B66DBB6AC25EF16C106B0A6FF3
-47CDF66434DC3F0012DAADE80B942D522CD59AF4C31C1C062157B3D000B9CB86E2AA7B4A5BF31605
-8A0D5A148EAA2C67977FAA0966E4C3454E08DF14C2498AD76E389AF65D2C139A6D8675298C46ACEB
-7DBE6904C373C06E5F71399B2EDA0B40AB96E8BE991DDC39F92F1D24797F9EC9F2FAE25669B43754
-E2498E8EA5C44B176C3FB3E8F7A7A1481275A461F2549AFC4CC73E28417BD8C5212C13105EAB967D
-AA679AE822B9B75B372A99C7E82D6BD83AA2BA00314DA4AC51B9CAA30D80507505BE24BAD0A87C5D
-5D7336EDF60CCA4CEC8201D243C3932F74D171E2409D789AAD0D04A7BB22FB6DC3AB92AE33FFEA89
-7C484D741039F38C317EA396A0FBB9F15A27D87FCBE007558799BAB73212B6E5FAF2080BA074724E
-AC87D88166DBC1464CF5D41B99428851FF1D99246944511CF42C3F9248513E9E51593F253D89C604
-388AD7132D6A169E9DD888E020AC1F8BA606F2E1EBB97977E505D8C40853653D8F398F71CC9F8F9C
-540C22A1E6195BA578AE7262FC845FCCF77B33F33EEF266489AF8B81A615D6A13464BCA58BEC16C2
-3F31D678F14A938BEC31272DAC3CCB1B2DAE577A26BED852FC59843176A5FCFCFA0AB7FB00D2309D
-E55C82CB9049F44FA61F1E313205A76317C4CF529A4456019D970624129681F46A9CD7950B8B5C40
-61853040113C8115319E68B37F88D864C6957DF813B305D09E6A1716B10F26F2EF5C727FC77AABBA
-73E12B5AE6416AB19F6563CE14046B715BD4CB2B1E4D315F42D10F74CDEDE82BCDD524A1A5460921
-9084CF1CDABFE72CC8375478B41614BC18A914903596D6FC2F361EE519F875385F4ECB50F7053127
-4EBDEB14A5DBD906A60817246042E3799BB3AC647CDA7244B7998AE4F3BFBE5C767FD2142E48518A
-4217599E0EC2CF5E86C8C270FF8B02F949EE001D6A439BCB4BC7D7F7C8167C3AE0A7E59687FB8BF6
-F37BEAA164541B8EAFD92E9D152E3FD0F413C99CCC34FCD8AA455A0B55DEC846A5874B94FC95CFF1
-BB386B2A1E22CD1C3914264B6D5BD1746972857C9235052D77A6C0DD3019F8A307FBEE63A3EF12B0
-39B224108276FFA84021F1AC5B745C54690B3FF587B4B1710AC3533A67BCEFC503ADF1F4B62B2910
-B31965E364EEC9CC437CC40181A7320CD52BE9C546B8F1DC824312216C2FD8232E2BB8D40EE2E314
-54C09772A387F9520E331456C269F51A078E6ABD9FB6A68BFD5F557215B0BBD2227B8959CBD1BD4A
-EEAB094DD18E891C61FB00933C0A0D76174D169C0B6445D34C00DC9E06D85EB086C18F3BE27DF734
-EBB9CF078AFF6514438549CBE92A0C0D25EFE4A527D86F158B4E9D8870C7AC5D6C059643A3298079
-CC20398324CA87273B86ED801057D797D91BC3CF2F96C650EE1566CD3CF8656CC577D38B830201BE
-718DC9A494268177A5019546EEEDBF101996BE593631654B638C75A6BAA648CD1E7AA9AC1EA60F4C
-D604071C89DCCFF8B3E430A57ED6DE11C5837E78956ED991058F3646219BEAE94E4D9381A33D48CA
-9B8FF12B54A73FF869D0EEED7E098D80152295E6016CDD809173C57D1F5FCE908A37010AD4C4471A
-53451DE9B4363B63437C374C598F548F145D3D288F42531FCF36A9CDF72521F1C0868FCEEEB1857E
-A983F6B75CE245D875BEAD1BCB8819E5464518E04717B78BD6E335F0AD77B832AF5682062A1E2AC7
-7CD5EDD5DC372EE456C96D38BF8BF348DAC2B4EBBB2440F2CE97B4B337F2E23247E3E8423BFA9237
-CA6CEB6FB93F960CAD894A96F0371168A33222052DE9B3BE04B022AB95C0C243486E35197721FC55
-311DC55F87BC72D09B6C940CA36E6640AEB66C394A5949A604E7F15DCE3A008BB41B0EEF2840A357
-F348443B4DCE064B4C15E5EC52E448C985FAA1C3D6526270B1CC691009959A7620C9A6202619A19B
-E410FF7BD535A8B2640AAA459DFDCB8F2BB35112626497E8A397D4F9E04788322A738DC8907CB643
-15CF63C95809E90D06EF02F72AB04AA61FE02ECCF7E9049FF9F3EF2258A75656178AAAC9F3C2A26C
-001341862D526CC14E92A81BD63502F959066E0BCD659CB9B5A45606153DD77039B8C5D5B13565F0
-0D95A41937CF97089F3938E39659A64DC3D6046D0E9EF66544CAF8A206635DF49926A3EEF3FDBC9D
-CCEA2886EC855F1821C4B9CE1D02A19A11BBBEF43A7D4D536715548A62802F64AF30BBCBEA8C7E55
-AD56C801D8A569C8183615A78CD393CA42C103F155941E845712C335F4ACFC7807202B92A983111A
-ED241BBB8501F15560E8F2157C29752BDCDB274008137277920053D6D7DCDC626A574A82A8A34F1E
-77B2FC8CF7C1A7322F22DFCB450259EB450C52B70DF3584A7C54C813DB41E3DD81253A03B02BC252
-346AF0160716355797B6F8210C453DD7E1E756FF08C7E6A5F4F87605E1DFF35A130D79148A57B7AD
-12D94A129FE3F055CF974EBA09A2B13DEECA2E02EA818A58B81E8743004646C7746110BC61B86ADF
-2D5D8C45A6A5461EB34497FCCD09E711F47BFA742C73F87B257B53F30CB68D151424DC3C210D3E8A
-C67C2495A8236EA2D7985A5E1DEAC699D7B700E6D38EEE2E93B191BAA5A8A2C916D206C63FE63427
-AAAFED2B5784276FC21EEFF2D70E47C8540DCCC3E00134642B703795CD3702631AE2A90E063A218B
-61E5B89BBCFFF84F567E37A31A9B349717A8CDB9C9377215BA838FF7469BC486B64EF2B6D92519C0
-BF0826E3652903F40E400689F5749DF86FE3DE178E21E20EDF9053081F6510D8F19ACD021CBA481C
-484D30EAD3B84ED0190087EE478A17154B243346C3938FDD5340CF6E47B185E64ABDF44F8CBCDB82
-94492B91929BFEB9DA2B033C3ACEE554F0F1A7F8A56DF7C06A3583C1E9C5CA458D40E550FDF3E2F2
-E7BE8312D5FEE98543388EDC8A04CA29F1B82B7AB4ADABBA3F2C331EFF3521B2B92F99C4377AB827
-A989B423750D36ADDD2E286E7F3B694E29B8BC403693C6F7CAB5FE34F1E48C8D41B47831E8C3F5BE
-5ED5142E3C44ACF5180CD41FDA149B1F4AED36812E42BC184227F5034220F74F67830255E1CAEC12
-66DEFA358A87D2E3B4B4E7EF30181570D0B2B43072EE0311C2C157D32EE2BEA8EA4251B59F6B61D2
-B4FDEB654DEB67AA3DFF4AD65B727F0D6B7D61523E4B44D99BA5CD33540F340A35DDD466ABEA4E72
-E504FC9BAAE51D231C33A8CE7DC2970DE4C1FB5B096A3D9C641EF77DC9039886831DDD01C4F21E6E
-168E38BBDDA5F4308C959C7BBF36A42D042DA6862937EB20D4FA2E5927741A58DA5CBFFD9553BEFF
-BD92E6D64871D8B25D9049F4E71970A8FF5557D1DE83DD24286D6C3E4770EE00F9A1A0B0063C9999
-4AEC75E84D6F9C488434D1F3DCFD0A8BEE9ED8257CA97E75E8B1285747184D6D2228EF95D4A0B8DA
-252318ABD35C8398FC6568B294D90AB308A7675F9F160140F0A08C88AD0CA1CA2CF85E4D031CFA3B
-87635F1398EB7DBC666A259F02DB6741D13E11B230025DD6DD64C438409AF109090058151E4DFB8C
-0E9CD65935C4CC063CC6100FDE70896E23E3661C7FC1B8228B26A55903E997F80207EDD8863FA074
-EE4FF23BE585BAF708040C9F8CFDEB42FB8EB71D4CB6D7757E973E4D8C9DDD082712C23F868E1135
-ECD91250BB4335958B07C12FDA75EEB56BE19D1644C1F76A8811C021122619F751CBBFEB1D3DC912
-999017FA163672A1EF754C5CB78962BAAB76EC48461B492FA88F9897170DE857CC8374C8BAE417D4
-C78A56047024731F4A45145F0393A27CAB614A7FF747BBC28E6880D4D01C0A6CF317A1DE5BB5ADFA
-4B5FBFE0C57598C79F25AE57BB797A489D51F85A9B9CF8BEA64293F8FCC43B0D5484DF99DBE19152
-692CE756F6FBE8CE5831CF4B8A5AF47524E272C45C62ACBFBDFE7E60B05BB1A1A6AF0E9210012014
-69B3DBB49EC7B23A363FA68417B7118DCEA71D4ACA2E36F88C6DDEFB70205DF3AB7C74CF65CFD01F
-F85FAF99F172689737331D4C6CFF7A29029772F487FBF625F17BDAD89B4AC076948277B4ED687840
-301016C2B7AD4C6D02F81E88C75B7A04D724E234E38A38269351582245E361A42C75B8256AFD5624
-B558ADA2190F960A896BBAE7A8C57E76DA10DC29E69BBF3AA86214C001A27B39C1D17C548DA5601E
-86A5CF53E7B1896BF003AAE9387ABA9B102EB1E9002DD3754A378F3E49F2C6EECF47EB1BAC2CFCE1
-1AC0C5CB063672D32733563F3E1E891B6073739BC53AAA0043FC45E90E413DFBD4548DD320B681ED
-70A7443A233D79E3F038D26975586E5CDD2115AA614727B1F6DD4024B85CCCFC79D10B7B6AFA789D
-B37BD0E8C423C1A4A8681B5FF3A9FA1F61A46E46C4B1836D1AA41A89264A7F4B1C259E4B10ECDF37
-5BD26A1F412FE01FBDC03368FCAF48AA0EC28B1BD603A6A0D0DADE66D14C9B7285569230FAB76803
-35BE104305E4B748FA99FA31F23991608DFDD2097DA292551136F255051C9F7EEF3FB7C7FDB4E651
-C3D03A4CA357B587245236F4FF3252563F6BE08EF8A3EC09BE2BF27B9120F7D37801F6999EFB1C8A
-D1A08698CC59CEAE2CFCDBF6BD8F94DEC94F7EBF33AF05F52C85760C63950B455510C6AB9398D09A
-C288EFA09E8F631A59B03FBBC75BBDAFD675FFACCCF8ADF71E815A4A49F14BF70E42DB0B7347B528
-4E234C24010E2177DBBD57648E398FA6B54571A37BA8C989503594D03C6E60871A7F964599022154
-02BA168B8D1D2685F5CF8645D5E11A1769473027F42564C2966C10C0DEE1EE1B6975852A4870D492
-83A470E623337544A7CDA5C16FE2855BA2A548511FB4D4FF2E3E78D108E4C734F64EE2F12CC9562C
-BDF363EFAF5201B673AD00583FF108AFF6B68055A5F299452D176EAAFB92C84F114C8C22A05EAD65
-64A3371420EA9E646308DE97D40705E1638DF08704FC90249CBC0D2D3E884A4562CC27370B1A9738
-9D8EFD237E644A7370B8B38ED1C377F522C75F981D878A5E87101E621DF9D85C7207BBE5A87CCB60
-7F93A2E52F660E05C83A7A6CE6D01AB4B62A1EF8DA47CF97D4BBA0FA8EFFA9C0F61A325A97ADA694
-45F23AB1FE27A66C271639F839203040D44B11ECC6E805FBE88843B34C4FD52D1D3C6C70FFED433F
-C04501FC20536ABDFFA429B8DC8192B2D45DD9D646049CBF40719C3D674773F9676F9FCF32817DCB
-55402A72C56D74AA4CE4035687C730B6B44A9CC614BCA5A3FD17C170ED949E588EE45E89E18B0766
-2A6327FB9E8475C43E5DA1B0AF07C23774B19C9EF59281F5D884990D6194170D8293A86DB52A0FE1
-7E88DA82209A00A16BD29B8B2F13FD60AA25FCFA9745F57C8216283C1D6EA1C119CB9B8D57C00419
-5210FFBD56395A3EC2D3098ED38F389EFC0324FD0E55EA339B3892568229D8D3E205A821E8219FCB
-1A7713FCF3450F8BEF976CA0BECA47376A8CA73DF85B340C67EFE4534D459617996526B5E5D3D19E
-17CC5449E5EF2B82B2C4C2131FF8A19FCFE6A186A9840D872D85C40665A7A04E67EE26B8BC9206C3
-5B44C8F8A1AFC3867D96DC6D48BD45063BE25B882E9BC0D0948C18DC870E6925818E1FE17D336217
-F174EB4481F5C0ED37A3BEAFAF4D46F857811B6728BEC461AE6468D87A736572F4FF95B58B04564A
-9D3C22754587DF15495A319D822B838461764B73483C1F7CB930EECC6F7424841EE10E4087E95120
-2FE88A391375C96BEC4480328A54740213F741105B12A39F19808F3823507B88115D468C61B212A8
-ABAE7480E39BA52390A1892C7EC50271156B4E8076FC3ADA222695DF372385DA7B117A29E04CD2B8
-0A320F186D61C963FBDAFE9224E537057C49E82E405196AAB621B5FE4011E1782A747EF935ED8BB1
-1BDA39A141CC0BA42D04AE123383BC95A1D03A85A9440010C3B9613064FFECA76197E10919BA5006
-F35837ED9BCD7DE5E6D968AACB6FC91178091FA467EF6FDEB728E17293DC89DDE5A5261FAA95A2B0
-000FC750E7073900D4D88247DA464613ADC2B3903A6132D96AC0E1C564385FFBF6249DEA76BEA2A9
-9160632DD2FC2B99133E9F2F470F72B45D6F18B45020F604B06CD9174BA3805DB60EB9C5E6A9C789
-ACE76AE9C79C1BD34434E95E501BC968633AF93FF4883C6A596776254C0C74993710327086B2886B
-02FD3E42A725A03459CB36EE34A094139AF5FCF487D3DFE63FAD20BF0DFB60DEEDA2ACCA3510E963
-189D1256EABD81253F7FF9D11263FDBC1DCFDA3D1EA2E52005CE3C605C993231258A717423F64BFE
-EBC34684EFA676358B9B543C2042BEF954829FE3246A879845B30EBACB43D8DD7A20FCFEDF763AD2
-C5D20A798B69E08722DCE6A5762E249ACE3055B650D9E110599EA30DE5C4FE7200D5A8DA9E1FE268
-6350D0DF334877D0B9F6524C552D0B6DFFAE125EC4C18F7547BD51C14288E4ABB7F8A1A00458596C
-390AEEE6FA308AC1F788FAE30D7F8928AFC91D4DE6352D20B19D8D8AB122B7378CB379C5BE7E3CE2
-922FE667EA057B5D7B3F0B51C7BF0C85F87AC2F360D82C38964F4DABCC9104B32F0FB8802235E8E8
-D9A5997D392259074C00AF2CE1D2BF7B8E90E2E2AC34185C68A03BAB8B267778292B227245D7FF86
-70786E3F746F86B9D4D17190DB859A0E144B2A61E6AC9254DE5DBAEF20E2E9DB0B2FF654B996E962
-F55E465DD238BD1643CE59DC2B5A58B1E6E4AE2DDC2D74D79AFF3C34E4E593E051FDA236B79CC0DB
-268D2A89B1878051223BB8F33FF99BA87A4811C0B3BCC01171D0A731EB732ECD8749D27952C27886
-B252F9C3D190419FD2900987A0A255B9753FB7AA70C37462134C467A2C4B7920BED9F9E86F8F98B9
-6D00AF8B05A4BD5F14C2A0D914A9A84160D554FD0718F50ECB5DF5E76623065852DAA74C9AD6DA07
-A119DF12C3577FE276AE551D48B1C5CD8A50E84DEC9CB0840520D78FA7F9A7C2071E28CD20EC7649
-B991F3818CDE295CDB6085F24FCF93147E9F4DD084FBD32525326D2EA147ECD5B6C9D9F4A7166663
-AD18BF234E9CB92FF72138A8A49E73E527E9A6488A4CA808AECABC94D693CD2C0C357D285F65006F
-A2F9197F61FBCA6EF07B013E2B558AB531D2FD270CEE7FA8E467FAB885E90C5884843AA08E2BBFEA
-0AA575643727BA18ACC499FF34E3438645BE2AA71EA491E54687CD305E12BBC94FAEC848311AE816
-495B013BC5075A2D2AE54A7AD7C9105B64356CB51F18C2C28E3A83B9D81A4554DBEC9BEA9A660CF7
-E1BA89E6D4DFB3EEC6A3DE3FCDED9B2D614156EDAE8CFDAD5FF0EFEE31DA3E6A54D94CE9453A1CAA
-D9756D91BE85315F6514BAFBC821EE810BB5D8E1B8F05F64F3F72C4B35D424F7E4DC3AB581B74ADE
-B6D6297CDE7AA8278909F269FED79B7DFD39B1C0338E01D556C4DB9CA3A8578ACE3EC3D743ED4B9C
-0145E4525E8C315F7A1B98584B975C70F0D415708C8CCC13F848B1D36AC8249B73638F95DE0CD27C
-7EFB52BED4339EBDA4812564D7A77416DDF4CC88CFB52D07A252D89353C6826CA1832A153242979B
-6CEE783ABDE65C8B40CF4EA7B42B8DBCC0E02423DD693108006F6A4AEBF053B666C3CB63D1861F86
-EAACD43BB9BB6F2C3A17293C189331D253B447757EE7CBF4518BABB73A1D44874D7F0625E6A013C6
-08E991B4AD17A9ADB36740D25E3E35B459B422F7370B134CDFFF3F3BCC4C32B4E9EBF6A2478013F6
-6933A1FA9403A2F1161EC632F1F04EDF95ED0F33DAD9665D54DD9DB2564E51DA7B65978CAB50D6DC
-1568976E83B056EB0E3A6758518B6E17E9EBFE49B72EB148B472BA144BDC2AC95744C9BF1258F0A2
-E47470AB0EFF90E190A41108914AB8C1ED6B11E0681778521870E80C16AF2AFC723CAD8719ADB62D
-3939D3BC8CC1D8A4E07E9D734F54ECA33D936D2C39D5C8055739C33E53359BD40E576C11E93B4B4C
-122BDBC9B1BBF44243AF4F0BCDBDFADE68C526B5CD74E29CE3F70D62BA83C489034111FE8E4DAEA2
-F01F9D938ABB532DEEAC0E329F42453FF5C15DEC2AEA8C198323C9E8FEA55B3F5DC4751D2E2E16B6
-154E7F2ADD46860E9CA71DC114C99D80E7EA1DAB51E925DE161CEDD678EE6282AFF38E3CD0E65954
-9C970613209955A3F581E1ABE485E56402A3DB0D1E9B8A9DFD05C4B0B7F97FC6D0EED0B69AD6F182
-B1D028ADD2F24463834B13F5C1307F91D363891824E81108E57CFD5211F86400D3E96B107F3B1FE8
-9C4908649D04A46DC3CEE0DE66AF03A7FF9F4DAFECDD6DF4D93784CC899B527784DBE0718050FCE1
-85BDE3F39DEBCDD660B2488D23AB1CFF87B0546D02B48E7B7724C9E87B71BF34B5D6640E0F6ECE47
-B182D41C89461F712849C6CFDB7E3F5EBC1ACDD12D65A422BA362A8FD6CAAC5104CCC5AB5FC04A46
-E4309ACAC83D659DDDA256CCDDD1BFF9AB3622450C4FBC89C82214F00C42FB0311BCB1B722A691ED
-839CAF9024FB1671F18E4639C96D84718C663A4341DEC037175C6BBD288BBF5A0478298CA726567A
-9B74C32A527339C666A294A17F6821CBF243D13EA4B1603C292953308B566653423E7301A032E5D5
-E2B93F1C1434893633DD19501AD12728B5A1D9D36635B589FA2E151140B543D7C5E469AFAE8E80C4
-FC1D9CB6C3823CC1BB7EE40AECB58CBC1465792226B19E0FE79235115F6A3AFE19F98C5DB63D372D
-D7C041CD940F4F79F2474D9CEEA0334FA04A97DC9773064895CF11CF73F11B4684F06E48F4469F6A
-1AEB2CBBC52994DFAB3319DCE3A0C8C2EFA9627496F8CC84D3DF3BDC4FFCB61672780F294F453278
-AEB9262E66486856D37B7647141A82E049364ED3D03F925284A3F1FA3DDF4C0B48B3FE22E7DF9ABA
-239D33CD300FFA8FD4B96192BD568FB18D325CAA8E1F1FD4B27527417B034841FD49E4A77F217062
-3CC8B22101166D80361EB15FA9020D24F61007B0A8274DF9DFCD8E97C85568E76D34AD5DB1779B02
-F034A69CCF9D4EBAA188EB3017EEF5B22A0A552696A574907F695098BD8A4849D5C8311F129447CD
-7A3CF88B8191AEC0AFF30A38A9AB8135608A7829207A7D242F6E1FA7DDA19F5E4C28560D42DB4405
-77CC0C5F5803EEE897103ECA0BD944E320AC26553BEE7852EAA733BD13DF760056B2F5BD1243BEDA
-BC3C1EA0531017D74B47E18F801A60074D6DF849FD0532234545E5B5E112D1E7385341D39A89551C
-80DC2DEAED5D5DA2A4BE5015D297324E92BE64C68428132E6EC654DD4BDCC6640C68835FF8A05E09
-9604B8CD43D3AF2B2FE10C8AFEDEC5A70AF8509D12F662338CBF166D9452CD36331758AC4F4CBD7E
-DD52139AD27DC52569877FE709F297444C4F31899D1945C81B14ABDECBF31DC463A4148F04EC4FB9
-703C158216C0FBE65CCD450043ABFD4E65BF8B28CC148252E9F3E797EA0B57B8721C94CBC2EA602D
-F2C57E87938C887A382D2659226463BC7D6A1DA87F4A341A59BEA458177D3F18D1213539DC0E301F
-6EFE0111FCF6921368BE17CCBB7428127E0C059C2C5ADB2A3F0197F0CEAB77FF7F3C027A8EC3EE76
-CF5C986EB47CB60561C773B3A2DA47B5A35394E29373DBD5C3FF4C9213A89AED77CC4F3FCFC49EF6
-EC7557C521979A546983C106B3627B5FD2D71CC5F08A32BF49332A89C5DA71AFBFB94C949A91220A
-B1F885C981423AF93F73BC1CA4D92D9DBAE3EFE6A76E2DE3D0F74FD3255820636E3F1A6B7C185306
-23C12AF90CDCD2C0A728521E9B639EB6345D1DE8FFFC3B19C72E7A93823DFE3115E9E7BBBEB28CB7
-3DB121AED8920D47D8CC08EA2E472E39A4CAD5881B5C4204F2B732AF9D5189D25ABF413CC78714CB
-01B1D8CA5565169A919DC481F6D2E67F1D490AEBC5CC62A8F62C1A323EBB55ED35AA5C8D6F8B970E
-93205C2701CF4817BDA994FC16197B469ECC5F5E9DDF0FA05640C2E571849571CBD26402B1EB1E80
-3FCF423345007B9B52B13E3B034E8CB3984B925EBFFE719ED4F39F3D0E3343316A6FDC26BDBEA88C
-4366D3B2F851D2B244CC4408251AE2C77348CCE9DD8BB9C89800B572D38C5D1CC34C740BEEBB5DDB
-0A8BB251655FB989840D23205D16311A9FCCF7C85F6DFFEA9704492A4E7A8F6C0BDC29745AAC2ABF
-AEBA02B0E7AEFEB92BA63AB0DF844EB09D505C3DFC1058CE42CDD8043B76398401E1DB862FF9F76C
-05E8BC6260A4443CF494BC1755913D51745BF45ADF2F8C7A9546D7EF4FB11E9D94E4539632C2A396
-06D04480EE459408D7A2A869807A4C01881C1BB21C296A402B5E6E07093D833C3DFF075F4DD426EB
-87B1B8DE16C146DE79F52F5943015331EEB852809CBB8E1D6460AC4D176FE96F8D19F6CCB22ABBBA
-A27C4497D91312C3CFB5BB913B314E43D2EC6AB6897BA7C34CF2CAA6DB4BD69EB5DFCEE0AA917D69
-50E36A68A4C22A60DCC69379D47544A58D640EB10DFE120FCA843B588CA8B94F7869F97609A6FE03
-AC86EC1F7CEAD2EC8E81977D1B946E459DFCFEFE65A7BFF67E66F5F78A45D8DF65AF0146DF74E024
-FC042328886CC1DD7779F49CDBB750345CF83CD678A6A8897577299DEB38AD665DC4F21CE1892A18
-C256F318107DD3E9245C1AD3BC93CEF7B7BF057E33EC9A3F953251261AA3D1A8347261E70A46F777
-3A84F3D4D1A0DF6DD22A96429349DE0D180310E17955B10FBF53220EF6483D03C650A8D5C16D63DA
-F65C21ADCD6C2D0B5D4ADEB2F5526AACF7CF42F9A8BF4832FB2D4F73F3D5FFD984B572232F87BD3E
-59133ED3D2FA19F7856AD812515C74F7D851574019C532C25F8E163E595FC9C83E3E820C3CBF690D
-A62578A980FC0803EB6DB9B1E90E3256BD4650816ABE5EA86CE65C2EB418D0ADDA5F3EA04E17AA8C
-4536CC471AC20236E66ECA3619F161DFEFA485386C30EBB86A7AD930FD0AADF2DA69DCAF26C0F677
-206E2030E3B15B3662C0AD03DBC1636EBFAD1F2F2C37F5FA9856B0198C5B1D80B69C5EFFD94CE071
-5135C649C26B9BA1266B0A5B270CD08A706166C0B320915C87B27DE21DEB5D7E4806F6E700B7A06A
-4E29B629CB40761983E9CA8E34E869ABD04DDA190BFE5A6EE8B22D7E511B84EA584A84211F27AF89
-18DC5AF8A1FF2D360B6BE3CA8E66BA4CD2CE6A25E7E89406684DA83FFBCCCCBFD0844FE3BECD7DE6
-7764C59C022DB1168D585FE25073FE00E30218D1DFE115CA1FC606AFCB04F2A082EF91788B6BD096
-84DEA31F20034A91AB9D971366F97B5009FEFBF1EF0AD941654081B1E8F0B2EA495069A1DDF11DC5
-6857D29533DC857958B49D1A0779732819FD22E437084BD9F3C4F2CDA4D12CA14431937AB63A03F9
-C040AF1D801F367ABDCA7302E18A9050D6026FBA5A5A7FAD44E31593173CDF277CD737D1CEF59FE9
-684252BC0DDD00A80E023B88222494C1C8C0884230AB11D1083225AFDCDBC1E24D4AD5FAB396D2E3
-70E44A7571B230660D510A5076D8E35F7DB72C0566DFC119EE1B8AC3C0406950A3C4A4DA36BDE297
-040A27F70753A87E6CD593DC6BE9962261A99AE5949340C5D45C94A9AA3DD636CE8B497BBB812345
-7C824F443A53B3EE595C38983FE3E07DBDC6ACD55CAE8BE1081AFD4857A5F52A3C925143507A3C37
-F1992CF72ED0D4C48D94AE6CADDC3BC87AC3A3EF035E02181F78449E4B063B0835E827644051551C
-1603E2EAB5875F28FC77BEBA6923428D5521C698C6B7F133B0F689F105FDBAC30A8ED2F29F0255DD
-F8A037B81F04EDF004CBE639C8DB0F94D0C5DB92D34D66C2FED66CF8B895AFC4E659D08388EA44EA
-E83CE459E5BE306750A682B627802990037157339BF142BCB9C08FAFDC3C3FB16DC3544F62C6C7E3
-3E20CC4FC7CA21E2C3F6C546CD78DEE348F1A4C8CB548EF20C049678916771D83ACC9B7B22784AD8
-580134471A3C79BC86B5D6D0D305C32E6204274351C94F9DF45D9B2AD5B5087A89F90D6AA033E4B1
-D1BED022F36147C7ABD2B73134DFFD50907258E610C3B20949E141172B1C6A76DB238C375021CBA6
-645CDC26B717428B5A9B4D3F32A4B1E22FEFF3BB93FD889E1DEF8087718D5E3E650FE4A3330DA9C3
-7E9EB499DF5A342D8BA4C0A033C3347CB25A31BE143ECBF91384F2381E323E7FD3A82A3197C18905
-3200AE2C86B9D01AB0B289841EA7E9E9A26966E0DEF54DE0B85D8DF084B8C590081E444BAF1E1F60
-670FA12AB97159318624F2AF1B5EC7DD83C1073A99398D2143A52D10A13C201FB356BC9E90C63BB0
-BC2D4C42AF4A8B9C8C4D58A1B32E0597C63B3F8B3E893BD3BE8C60231838F1BC78E73A6C8CDD5E7F
-2907F897FC8EE99BFFDA7338BCEFB5AEF950E5549ADFD207AEB15846B509FC57989883642498A381
-1B8E5CDE69C05924EFAEC232FA4CEF302EE3251366ECAEF57D25CFA3B4A9E6397D996F421C900BEB
-CF73B038FE7B16FD0A1172AC2F40D19CE0B02FCEB8BC47DA5344CB933C7FEC950184F78ACB32D3E5
-E290E84BE753B9E7A7BFC4416CCF29D023760C06CDDEF2505806A65E1508990529245059AFD301DB
-669D41BD72BF7A80A9DF66B876B3553FDF4DD38D15289AF7A1AFBC53FFFF135A6348DD784AB42A6C
-0D6AA330B069607E2DF3CBEFCE79D6F63E274C9E73A33EB85246D5EBB986BFA923DF68B2B8CF82AF
-6C33E785F35B25B1D1D614DE85A4F4510ADFE42D75B5FA5408A59ABE53859E28B3D000EB9C6A7D2F
-67C91DD14C895BA87B9CB57B851E5193FCC2A443AF85FE28DF6F39537F23A058BCF81DD8C04CB2C2
-5040300F4C55975E856DCB4E21E2B5481BDCC05601942FB25BB8A6B6F93E2C2A33CD478B44655657
-C557EBB080179EE5D98C5CEBE0B25BFDD952FFEB258014D7A5BC4BCA4F1A23BBA73C454B12960451
-CE1752401B0151CB2E01D5C72595095EAE91D8D3BD55A54A2AEA89239FA176FA7CD6F16BB0733EF6
-CE6E77763A23AAC77DA88C8EFA7BBB2991E472FF2075FB25A75ACFA70A04C28764F4AE4C12051B25
-B120CAD2E3044DA35C1F94135DBD69B10DE147321CBBDC814CE99982AC1D76CE3D3330E41AB31F3C
-76BF89B95EAB81AF3464C732D5B1411D97DB36C9063537F64756F205B16ED7058E2CB1D6946C00A1
-A0CDA9EBBE924BDA6C7D7B605C514A98133907B793C74CA858E82DA3519188CD974B34DAA74265DB
-5BC8550D5F0B1173ACEB87458BCE2AB1F96996C811699A0FE4A9B849D39023725E2B1EE7E426D30A
-6C5C75AE6BCEA6DB41E4EB2035F7F924E6B9F0DCD00EB2BB014222E55FE387FBF5B9B7C04F4688D5
-AE3529FDACB38B5EB0AF5C3A874C1AA6B17CDA8D1E22EEE05A3DA88449200D3D0D002DB86F6C51B3
-37C8E19F338E7BFA01E1202612D50E210140947D5F350E84F790286C3F679A5D7E43BCDC337265C2
-631527FD62D598B7CA1F5835C0441881B97F5197901ECDC4F195BC665A846823D2E41417373F8639
-567B228FE7B73D781F07A361AA49C3E9D80FE5B2A32C4C1E575D194E841967B08D10405FA44EEE28
-47DB9372C5CC931E50469532F1BAF577F680BAB4E30B7E1CFFA8574ABB679789F69A8A1BAC07B7C6
-4EF5CE5EB00E97B36FBEACA9BBA4A13B0293D34BDBC77AD1FF88E5744AF009823BC262511C4724DD
-585E7E17D90F230F7A5861B0DFC42F0B4E49A04EE0EE4DADB908479DEF8372F334C53D2BA5D855CB
-39DC7C9550F9D0F7F77E82D5A59FBBF34BFFE92DC9E6668B68FEEAA4F20053433D6749162BBAC5D0
-D428DCF2D58D49B127FA2E674EDC7D3613B1342F4D0ABD7F4C5B049FBF78E804D5F16505AE7EDCBF
-4D6FA08D72890F5D55199034572AB4B0C9A7E7F6F5A403198864ADF113CAFF5BF9D4AB5B16F81D0F
-C2188FC80875E10034D12E30C0364F8F72797F1AED525A2712A40D44210B813DF5A29C84E9F6D51B
-1D60A5F6F938FAABF878D29E6AB252D95D05FC1ADF5D4CE1C9E585219112112BC6CD5C766411FBD2
-2731794B5DE0A27AC57D3C57926807469C360372BE529098C350EFE2154B87F1205A57A0B04C5206
-CC4FA66B8793BBBE492CC3271FB4F90A28D0066E0D7F63B8DD01549A05AFA5482C29560ABD628568
-75CAC16100087540162473498C14087B29B86B7BFAD693E81765CEC781F3FC80E9C7B410E9B55B88
-114191A1703C638DFBB469ED1DD8254B1407003A319CE74AD419B077F17047A01F0BC0AC8507191B
-F72D77D9333C9DA8C9DA733EFB5305F49CB8C7BC451321ADD7D896395D269DCDFDD084EB3AA70338
-6C0697E962929651164135C094D9BB1C9B949D5EEBD3BB17F02C98C813CCBFB23C2C26218A2F4C63
-9A8B9DFF2C29406037F91938A5E1227310728428B56F48108CDEB33BD3191ECA89F947271983DB77
-6B2BC897A30EECF2601EE3B2A6F0E135397622AAC1F2DF523CE6E6BC720E13CB530CEF4AB9C8273B
-D3D81563AC8A8E6C44A195112DAF824BC7A72FCDC4E129A480717BEB01085DEE65EE4344D0B41EC0
-BCDF842566B1D9F5353B1F6A063FFA6CDB06EF634C8BD5A7A63F991D178F56EACA653DD67685CE49
-E98C7554745A4AC533217662D23E1D6937135D13BC2208EB8D50560A2BAAC319DFAE478B6BA4CA5E
-DA20222F0E9BDB0806320ED1665B54A347DE0C42E9F77842DE4D188E7E824EB2F0D7AD163F05480A
-7FA99C5A603BBC5DBC843774CA66E889B945054C0ED0B1A4BB14324EF901B023C208CB95DFCE9284
-89789690CC45BAB97BE449F8E2F5AA9276C0571303E9788C46E7F789555BFCDC3FA9ED8DA8AD9BA4
-8B3AE09404664391E63A989EF1E24BB464043AA099E4F2D796E352EB277106D8D81BAF2F8562EF46
-BCFD1E0047E8018CBD973021DC1C1D821AF03F083F0B088A62EBCF2BF6C5B0FCFA441AAD1625FDB8
-34F943DD47A5A42EB3E9A5B49641F797C288B799A64897F1346070461B6D535E0C4ED099199C387A
-3176AEDC7DA7E7D9E118E55565092A36F7C74ABF281720C0147F4E4F37D49436466C61FF12764E30
-43D8A6D027E70537164F0E7942F4ACA42BB2CB136177EF7197E76F49AB403F741C0EF902FEBC471A
-D6C627424320A8C3A1F04C310C511B3F91C3937D9ACF459999C18A33F2C852EC38CA806599C728C5
-43714018C65E2C5F430F6270AF52AD71ED38813B60440779455F9529A4A1623CB9F5422B9216F9CD
-BA913B9A1CD95DA225E254E8101216085020660509D03A034B5D7E32E3DB5E5962A9A27711D4C3E2
-9CD84057F7D0D7E8000947AFE896F8523253391D2E11FFFE523366B05C532D5629A90741EAB3D4A7
-31D3F6D4F03FF93233DDF88BB1913ABA22EB9AA6311E3144381DAE29BCC8639958EEE59ACCFA06F3
-5DCCC63E0609F542F3EE5DFB1CF718CA3F328455726F8F65E23ACD970E4049225998371B63E35AE9
-8DC54D8329B8DB0901FAA63129EDE21B158776981D4D094013C096E9CD020315D123C03DEBA21E97
-E4B584B4BC0AF25F5DCE53C2DC0F3E61F99BECAB40799478BE7F5AFD7F68E23EF50AD6645C967EE1
-1206B6E791769428ACDC370D64E4F2B3972E0E4F442297199350663D6E772FC6777A9B9DE215273D
-082CCE4E8678FE9948DC8D5B0E459CD02F1645AC5620F3571A40B4D5A17DF5CFF48B6C843DDEAB5E
-BF58FE13D7DA08E8AA7902119248B3B151DA583101CF80853B0150FE05BDEDBFB50A7FB0F65728C9
-3B9DF48CE8AF1DF1FAC25C1D58E1AD30274A00EB54CF2F16029E1AC0A0919C0655474B9A6936AEE0
-FB74BD185FE7D70BB84786997D34A40326A74356A4AFAEE67B6B26D1C1A7BCFF8697B55C816CCD77
-312C332A55315DC54F9BC0A0F12500E0A76B3936292A3DA2DDF5AA8CBB9B5DC32EDACC4827D684D2
-74E65B8B76FB2C2B19F7D5607523FA953E34BB39032C05B1C1244304606C55660D3CA8607E764EA5
-B03DB7FCAB5CF7788C6E60EC8C449BCAFD90BCABA4132B6CBCCFF16784FB59B36B77CF0A9EA572E4
-CA0A01C725A6CF2E4500CDDF5BACCB9094D48925434F044118CFDC2696AF5FC0CAB3884107ED17B9
-BDE0C0104B1292A1F8C99B06FC4A6360B24480BD59DF0488641899B0F42B1311B582717BA7ECFEE1
-4143654B5371C8B9B2D80685AD38D897AD1E64875C28C7020A84FBB3A3BBEE16617DCB9BC822B7C5
-9C5A18C0CF7E80163ADFB7AA03B7CDE8497C1697D90F2ED90F813095C5B91657FC294EF0E341DB33
-92ED860CB2E0AA09293D0F99AE9EB54C761CA2DB1E51E1CEAEAB276C7BD916C68510D72D9A67468B
-09B3C39A7815628FB126CDFD5EFF59CC8184C0D35A5B5960F824BD175495DD3EB12A4E96008CB13B
-8C5745303E66CF8608FF27C4709C1D854EB79608E52F068FEC0151A74C125EDEAEA555C198FC0802
-7BBBB802835E1D435077AE4B1CCDBF722354F6C572BEB1376D3E342195FA80AC9722EB2F46E44DE0
-5F5A227B731B8D4A4B6EDEF04AF2C5DEC2EEF8FF48C5B18710ADE3DBFA0C956505B6DA9CCB7CBB83
-4DB6CC754948855D833670FF0AC42A4773FEA8322BECEE04CA74AC2D66855132D11A51524488C547
-71B5B7A512796D7D7AE0F9C1FBC9CBDBA0831074F4D200349D0CA40537B92496692766F020AC43AC
-01DB8B2AA2EFA9D21732BE3A315F6CAA402BB2E61D40DDEBDE11276D90C2C601A935C168BE600464
-76ADED15087D54A14C68EECBBBB590927C1E10D291C9285334CB0C80EDBD392BDE4D535EB61F8E76
-41F58AC1DF5B1C5A5D91E3E27E05CAF7EC97ECF0C85B6425197AA856521ED701E5AEB82A7F52A8BD
-7DC97D5B3FB5C99A5DF84D1BAFF89072922509D76BC6EDB15CE5F9EB8F4154BEE1E82020240283BD
-C83A8E49AA9A2649B7955D5C058F2818A63BD0BFE7EACED4A49063C489A626277AE1246F721C9926
-E2A2B6C31045FBCD235F3CC58BC4DD6C57FE998EBD1E9FA5154652BE3A1685BCD2EFAA079A3293F7
-8142A6473822FAB627927EACCD61B3E99C3077103D2D19382BC7EE15BAD0FDE489602D055A01DBBC
-F91A566974559D1B477C209416887053169C3F8F59955BE4DE82B60558CC9AE15602A93F029F6B43
-29E0E62A03982DB32F5229714EFA1491A7B24AEFE18FEBC2C93DFE50B3F641B51BDD33DA38871BF5
-243C17502D00AEA2D9E9734E80A96788D4CF5BC12A42BC386162FC88A7435EE13200C1C2C6CCC5D2
-1A03941007B4C4291BDB711446CEAF27148104BB240357D5EDA0EA5A5CE27D4A83909D75BFC05D75
-F10AA74A6DE37D7DE15C1DDA3AC3045DA6CD48323D904E716B445E5E096FCB379353ED70CF4B6FAC
-102C762711079EFAF13FB74C9B47AF75F3F6BDA2A4647D2AB47ECAB64DA6CC01479F618E8D2D0A36
-45445E8744683CBBC560D47C98078B84206E90EB839B02D37C852B8E284463D4E4D890203C3D5B20
-352110034EAD6BD7F41456B807E1DB1631A9D499E52E9D9853D86728B1A2E511F40F8CA1E4724A0D
-17ECD640B52FF6C66E28693D89765FC391612E5889E77423EC85CBD0A038B6BA98B607701DC0C4B6
-6B3B28C7790A1F1EB8D051DC98276DD9CFEFAB3F65C1C928E48A060C992B392A43E56EAA6DED896D
-EBCE71F8245BE4687F2F1B8FC0F43ECE8DB0BD0AB0811C5CE73CBE336023A0D66168B34A95B4B0A7
-50B3BF1D197E3C042C7914FA731D7831AF798E9429571CBB977E6258244E84701E5FF91D608F98FC
-3D68A4EE5B81D5FF38B6C184F6118B875F022B4CE207DC7B37E1452DFDC591A3E506AE82C7E7BFF0
-011B0A3DBD616A993FBF878FB03B6C9F2055A2B095D29361F8253C2623653687FE0AB98078F6AEE5
-FC2C2BDE0405EABEDB3A33EB7F04CB6837176245F190C6BBBCD64522B12FE7F9CDCF201A1AA8A19A
-7BBC4AC064B4958F44AA0F8DDA23835AD28A1FD0EA105DE2F395385DCCFBE2261DC5A89A23AF606A
-3985E5038706B1FE0910400E16BF008F250F3BDE3AD806C735495D499F16F99275010478FD2127BF
-7CEDD6B5BD505FBE9BD0065B4A7090C9D27CD5B36C3AD33E1B31EB6D44E375003B51B909DA50BD18
-218418B3CD22B43278B144BE78406EAF16C7DF6B6C1C6238004AAB73736B38E168441DC16F9A5CF6
-0793A18633BC43D78674D12D38CC979F7CAADA6EFE807CEA499CB9FE616496682A66E04BBDACE1DC
-112B2156B9B0B20A58A8CB43FF0EEDB99805234B9A5789762AC7D65F5A319C33F4F7438CD15E06BB
-80A7A97E976E8CEC23F4C646A5821880A82B2F1DC27767F090997E91488BFA15064B702F864FCE65
-05D6CEF87D2A0A12B55BA189AF269811E3B8B850C8401F3906C080D32618D9698A766732A40A9FC5
-A94E5BDDA3D028D823D6B603B6D17DD046DE181FD989EA0F80B4CA62F7973E4DF5E032A31FE6BC8F
-5CDA678D4A72787EB8253EA5882C337CDF9AA3E1E7D9536DD09B047CD8962E773F72F6418A3AEF5A
-289B3406C152A50CE7BD4B493FFFC27F6AA52F79EA67E362FD92559AA4F94A2F787F6C735DFADCF2
-F08AAF98B80C53CA5607A94F25F04AA65A70A75937840E73055B3D65FB054C63E2E48E68488C9315
-A13EE949E03E46723C11CC759D222CBFAD2E1A87CAD779B23D38F7E2F660DE1388EAF1CF4D18994D
-75C6CC63F187FDB949940C18B537A0AFB12AC5F67B0283CA5EFE2E764C4369104B9D3B06490D1244
-C41D6085C85F1106082EC9DB84586230511C05C82412D2CDF3DAFBF4759A775628878F997415296B
-C416AC8352A6C6988691FCB831CF95C10BAE691ADB3BA2918B35924BD5C3ACAD8B137397B10AF82B
-479800FE16D472CD0CDBDAAB4F882A0649CF561004B8CB7CA32EC129D0A415BE6CB91DA2B65F44E8
-0D138808A127E851A7FCF927E99DAA0EA2D626B77A16C72E37F058A3B882FC4955DC8CB6312434BD
-3BCED75780B13590BF4FE8D64ACF0371F9FB1D361B05025852AAB9EDA1A0C997CFA58052C454FD45
-1E6C1F194F4D363114E312F6DC35BBAF357A32CD200A3DD9654155134259887D677ACC44F89AA401
-CA27282DF7DC3F2F04A108CBEF2558DCCE28BAC2D87B8D5B7181EA927F61977764F882626D4AB338
-D95C9477C54E9C36012A3CFFBE199EC8120A99D2D70A21F9D9A0354E4EAC7947990E8A6E0601796A
-AF6F14E758CABCABDFBD8204A8E748A3E5FEBA570D36E2BF474C0083229A63F96114182321B2EBE1
-BC76DD193724C4588C1D39D184C332FAEAF4C629F2B3B2F49996E46AA6C9F497428BEA52D58876B0
-DC07B460248BC85CC16773A5DAC36CDE8B152D96057F4EFAAF8B1DC10022038577368057699B3A37
-178A9F1F6C6CC60BAE820B7ADD0717911BD23A6DCDADAFA32473491AA80CFE90F2A77E24CE2826FF
-77B18B869C33FA292FE01D6477765044C7D14A548B28B1360125C6933F05C58B0889390537CDD16F
-8E967E0B38579449DFC1E07389B7069AA8594C5103465D5041CC929268DE863FADB6925B350AA94A
-27D421FB7FCC81C6B35F906F12246B7A5140511A97211BA9BD6831A508E963FE8BE961332F557808
-488F06EAD75E86D60DE3FA2425AE8439ECB9112BC3E4D73747C1C8E87A649919827049832DB0BF6D
-A8C85C9A2592AC002809070900ECAD52A56F1BFD456AFE066509694EAC075788456B0B0BDD7C192D
-321E9FB6AADCAEF00F570F22CD4A5322FBCE8FA98FAEB681940895426270BB4319C11DA67D88552A
-7373398AEC5DA7C9CAA9F3B34581C6E968DAAAB2751CC012199DD897B448986CFFBAE4D412BF9ECB
-F46742715A9569932516259D3B3A5431CD7028E42FC751C434E2B714C718202BF02CAF9B8A2075DE
-922322EA7CFA605C8376FA958B8FBE43031E1026FBE6126A3775F643EA67EBBD97F239FB3C435526
-75CD08B19CA5EBF53B40D728556B4481C7F73EC71CAB0F89E34D60C69B272FADC22E8E7BDC6210DB
-09FDD913E209F49FD28E8712B8508904620250746CA3B21B026EDAE60A2822F59E912E626B93E0D2
-BFB3230DFD0E54E91A1DBA25A609B64D41ABD897A5D21764C351E85F9E87BEAB9E645149AD32AEEB
-B3B1161032C701647115F98C1C2AAECE871862D91D321AB90F3E923B1FDEE00D927F897AA9812373
-6536E2E0700F10053D7E6C589BF66029D794883EAE4C8228941CE96565B50D48887B5314A2E55379
-59638222A6CA54C77CBABD460DAC11B063519AE4F50D93DE41763BA7CFBF4C7724360E750478EB62
-8921DAA065858341958E4F3EB5966C6DD77C05EEECDF4B5F6CF19AB507589B4219377959BD258EC9
-21C34FE1DB003F7D0FEA3E2FD6F5DDB0A2D62CA5A2CD3C7AB457DFF25094EFE04A9E1B9CE7AE3F30
-026B1CB039228D309A22899F6E9B9BFF922E117123347967D7C62C670E2C74579C35989925603022
-C17B1DCE378031ABC9B4B437C7B6E64620932E93189754C01D4B280B8B08699B2CA953AE4823BB9E
-E34133C5C95B3290E1BF010705AD852C72BE87291E1034B09F44A95B6A2F83FEE8841DCF661770AF
-44D0AC7F9CDB280939FC5D953D525E0B41B7BE188D5C794687330CD770D24D9CD53B895A253004E1
-8A31BE4E82B384
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-cleartomark
-%%EndResource
-/Times-Roman-iso1252 /Times-Roman ISO1252Encoding psp_definefont
-/Times-Italic-iso1252 /Times-Italic ISO1252Encoding psp_definefont
-/NimbusMonL-Regu-iso1252 /NimbusMonL-Regu ISO1252Encoding psp_definefont
-/NimbusMonL-ReguObli-iso1252 /NimbusMonL-ReguObli ISO1252Encoding psp_definefont
-295 271 moveto
-0 0 0 setrgbcolor
-/Symbol findfont 50 -50 matrix scale makefont setfont
-<B7>
-show
-370 271 moveto
-/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont
-<4D6F64696669636174696F6E>
-show
-659 271 moveto
-<6475>
-show
-738 271 moveto
-<66696368696572>
-show
-897 271 moveto
-1 0 0 setrgbcolor
-/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont
-<534D4553485F5352432F7372632F534D4553485F492F534D4553485F47656E5F692E6378782C>
-show
-1898 271 moveto
-0 0 0 setrgbcolor
-<E971756976616C656E74>
-show
-370 331 moveto
-<434F52424120>
-show
-543 331 moveto
-/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont
-<706F7572206C652067E96EE97261746575722E>
-show
-294 433 moveto
-/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont
-<23696E636C7564652094534D4553485F4D6178456C656D656E74566F6C756D655F692E68787894>
-show
-294 476 moveto
-<20202020202020202020202020202020202E202020202020202020202020202020202020202020
-20202020202020202020202020202E>
-show
-294 520 moveto
-<20202020202020202020202020202020202E202020202020202020202020202020202020202020
-20202020202020202020202020202E>
-show
-294 564 moveto
-<20202020202020202020202020202020202E202020202020202020202020202020202020202020
-20202020202020202020202020202E>
-show
-294 608 moveto
-<202020202020646F75626C65206C656E6774682C6D6178456C656D656E7473417265612C6D6178
-456C656D656E7473566F6C756D653B>
-show
-294 652 moveto
-<20202020202020202020202020202020202E202020202020202020202020202020202020202020
-20202020202020202020202020202E>
-show
-294 696 moveto
-<20202020202020202020202020202020202E202020202020202020202020202020202020202020
-20202020202020202020202020202E>
-show
-294 740 moveto
-<20202020202020202020202020202020202E202020202020202020202020202020202020202020
-20202020202020202020202020202E>
-show
-294 784 moveto
-<2020202020202020656C73652069662028737472636D70286D794879702D>
-show
-1050 784 moveto
-<3E4765744E616D652C>
-show
-1276 784 moveto
-<944D6178456C656D656E74566F6C756D659429203D3D203029207B>
-show
-294 828 moveto
-<20202020202020202020534D4553483A3A534D4553485F4D6178456C656D656E74566F6C756D65
-5F766172204D4556203D>
-show
-294 872 moveto
-<202020202020202020202020202020202020534D4553483A3A534D4553485F4D6178456C656D65
-6E74566F6C756D653A3A5F6E6172726F7728206D7948797020293B>
-show
-294 916 moveto
-<202020202020202020206D6178456C656D656E74566F6C756D65203D204D45562D>
-show
-1125 916 moveto
-<3E4765744D6178456C656D656E74566F6C756D6528293B>
-show
-294 960 moveto
-<20202020202020202020667072696E7466286465737446696C652C>
-show
-974 960 moveto
-<9425665C6E942C6D6178456C656D656E74566F6C756D65>
-show
-1553 960 moveto
-<293B>
-show
-294 1004 moveto
-<20202020202020207D>
-show
-294 1048 moveto
-<20202020202020202020202020202020202E202020202020202020202020202020202020202020
-20202020202020202020202020202E>
-show
-294 1092 moveto
-<20202020202020202020202020202020202E202020202020202020202020202020202020202020
-20202020202020202020202020202E>
-show
-294 1136 moveto
-<20202020202020202020202020202020202E202020202020202020202020202020202020202020
-20202020202020202020202020202E>
-show
-294 1180 moveto
-<202020202020646F75626C65206C656E6774682C6D6178456C656D656E7473417265612C6D6178
-456C656D656E7473566F6C756D653B>
-show
-294 1224 moveto
-<20202020202020202020202020202020202E202020202020202020202020202020202020202020
-20202020202020202020202020202E>
-show
-294 1268 moveto
-<20202020202020202020202020202020202E202020202020202020202020202020202020202020
-20202020202020202020202020202E>
-show
-294 1312 moveto
-<20202020202020202020202020202020202E202020202020202020202020202020202020202020
-20202020202020202020202020202E>
-show
-294 1356 moveto
-<2020202020202020202020656C73652069662028737472636D7028614C696E65>
-show
-1100 1356 moveto
-<2C>
-show
-1125 1356 moveto
-<944D6178456C656D656E74566F6C756D659429203D3D203029207B>
-show
-294 1400 moveto
-<2020202020202020534D4553483A3A534D4553485F4879706F7468657369735F766172206D7948
-7970203D>
-show
-294 1444 moveto
-<2020202020202020202020202020202020746869732D>
-show
-848 1444 moveto
-<3E4372656174654879706F74686573697328614C696E652C73747564794964293B>
-show
-294 1488 moveto
-<2020202020202020534D4553483A3A534D4553485F4D6178456C656D656E74566F6C756D655F76
-6172204D4556203D>
-show
-294 1531 moveto
-<202020202020202020202020202020202020534D4553483A3A534D4553485F4D6178456C656D65
-6E74566F6C756D653A3A5F6E6172726F7728206D7948797020293B>
-show
-294 1575 moveto
-<2020202020202020667363616E66286C6F616446696C652C942573942C614C696E65293B>
-show
-294 1619 moveto
-<20202020202020206D6178456C656D656E74566F6C756D65203D2061746F6628614C696E65293B>
-show
-294 1663 moveto
-<20202020202020204D45562D>
-show
-596 1663 moveto
-<3E5365744D6178456C656D656E74566F6C756D6528>
-show
-1125 1663 moveto
-<6D6178456C656D656E74566F6C756D65>
-show
-1528 1663 moveto
-<293B>
-show
-294 1707 moveto
-<2020202020202020737472696E6720696F72537472696E67203D20>
-show
-974 1707 moveto
-/NimbusMonL-ReguObli-iso1252 findfont 42 -42 matrix scale makefont setfont
-<6F7262>
-show
-1049 1707 moveto
-<2D>
-show
-1074 1707 moveto
-<3E6F626A656374>
-show
-1250 1707 moveto
-/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont
-<746F5F737472696E67284D4556293B>
-show
-294 1751 moveto
-<2020202020202020737072696E7466286F626A65637449642C>
-show
-924 1751 moveto
-<942564942C4D45562D>
-show
-1150 1751 moveto
-<3E47657449642829293B>
-show
-294 1795 moveto
-<2020202020202020534D455348436F7262614F626A5B737472696E6728>
-show
-1024 1795 moveto
-<944879706F5F94>
-show
-1200 1795 moveto
-<292B737472696E67286F626A6563744964295D203D20696F72537472696E673B>
-show
-294 1839 moveto
-<2020202020202020>
-show
-495 1839 moveto
-<7D>
-show
-295 1956 moveto
-/Symbol findfont 50 -50 matrix scale makefont setfont
-<B7>
-show
-370 1956 moveto
-/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont
-<4D6F64696669636174696F6E20646573206669636869657273>
-show
-370 2015 moveto
-1 0 0 setrgbcolor
-/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont
-<534D4553485F5352432F7372632F4472697665724D45442F4472697665724D45445F575F534D44
-535F4D6573682E63787820>
-show
-1672 2015 moveto
-0 0 0 setrgbcolor
-<6574>
-show
-370 2070 moveto
-1 0 0 setrgbcolor
-<534D4553485F5352432F7372632F4472697665724D45442F4472697665724D45445F575F534D45
-534844535F4D6573682E63787820>
-show
-1764 2070 moveto
-0 0 0 setrgbcolor
-<706F7572206C27E96372697475726520E0>
-show
-370 2125 moveto
-<74726176657273>
-show
-551 2125 moveto
-<6C65>
-show
-627 2125 moveto
-<647269766572>
-show
-789 2125 moveto
-<4D4544>
-show
-937 2125 moveto
-<64616E73>
-show
-1072 2125 moveto
-<6C61>
-show
-1150 2125 moveto
-<737472756374757265>
-show
-1370 2125 moveto
-<6465>
-show
-1458 2125 moveto
-<646F6E6EE965>
-show
-1642 2125 moveto
-<534D4453>
-show
-1809 2125 moveto
-<6574>
-show
-1885 2125 moveto
-<534D4553484453>
-show
-370 2180 moveto
-<726573706563746976656D656E742028636573207374727563747572657320736F6E7420696E74
-65726E6573206175206D6F64756C6520534D455348292E>
-show
-294 2282 moveto
-/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont
-<202020202020636173652034>
-show
-596 2282 moveto
-<20>
-show
-621 2282 moveto
-<3A>
-show
-294 2326 moveto
-<2020202020202020656C656D5F49645B375D2E707573685F6261636B28656C656D2D>
-show
-1150 2326 moveto
-<3E47657449442829293B>
-show
-294 2370 moveto
-<20202020202020206E6D61696C6C65735B375D2B2B3B>
-show
-294 2414 moveto
-<2020202020202020627265616B3B>
-show
-294 2458 moveto
-<2020202020207D>
-show
-295 2575 moveto
-/Symbol findfont 50 -50 matrix scale makefont setfont
-<B7>
-show
-370 2575 moveto
-/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont
-<4D6F64696669636174696F6E2064752066696368696572>
-show
-370 2634 moveto
-1 0 0 setrgbcolor
-/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont
-<534D4553485F5352432F7372632F4472697665724D45442F4472697665724D45445F525F534D44
-535F4D6573682E637878>
-show
-1712 2634 moveto
-0 0 0 setrgbcolor
-<706F7572>
-show
-1838 2634 moveto
-<6C61>
-show
-1909 2634 moveto
-<6C656374757265>
-show
-2080 2634 moveto
-<E0>
-show
-370 2689 moveto
-<74726176657273206C6520647269766572204D454420737572206C612073747275637475726520
-646520646F6E6EE965206475206D61696C6C61676520534D44532E>
-show
-280 399 1 1451 rectfill
-2125 399 1 1451 rectfill
-280 399 1846 1 rectfill
-280 1849 1846 1 rectfill
-280 2248 1 220 rectfill
-2125 2248 1 220 rectfill
-280 2248 1846 1 rectfill
-280 2467 1846 1 rectfill
-showpage
-grestore grestore
-%%PageTrailer
-
-%%Page: 5 5
-%%PageBoundingBox: 18 18 577 824
-%%BeginSetup
-%
-%%EndSetup
-%%BeginPageSetup
-%
-gsave
-[0.24 0 0 -0.24 18 824] concat
-gsave
-%%EndPageSetup
-%%BeginResource: font NimbusMonL-Regu
-%!PS-AdobeFont-1.0: NimbusMonL-Regu 1.05
-%%CreationDate: Wed Dec 22 1999
-% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development
-% (URW)++,Copyright 1999 by (URW)++ Design & Development
-% See the file PUBLIC (Aladdin Free Public License) for license conditions.
-% As a special exception, permission is granted to include this font
-% program in a Postscript or PDF file that consists of a document that
-% contains text to be displayed or printed using this font, regardless
-% of the conditions or license applying to the document itself.
-12 dict begin
-/FontInfo 10 dict dup begin
-/version (1.05) readonly def
-/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the file PUBLIC (Aladdin Free Public License) for license conditions. As a special exception, permission is granted to include this font program in a Postscript or PDF file that consists of a document that contains text to be displayed or printed using this font, regardless of the conditions or license applying to the document itself.) readonly def
-/Copyright (Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development) readonly def
-/FullName (Nimbus Mono L Regular) readonly def
-/FamilyName (Nimbus Mono L) readonly def
-/Weight (Regular) readonly def
-/ItalicAngle 0.0 def
-/isFixedPitch false def
-/UnderlinePosition -100 def
-/UnderlineThickness 50 def
-end readonly def
-/FontName /NimbusMonL-Regu def
-/PaintType 0 def
-/WMode 0 def
-/FontBBox {-12 -237 650 811} readonly def
-/FontType 1 def
-/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def
-/Encoding StandardEncoding def
-/UniqueID 5020945 def
-currentdict end
-currentfile eexec
-E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942BF7D6DD84F1664B89
-699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED2AC419FF2B2BDE605B8EE3264EDD6641
-2D4F21C64AC522BDFC7C5502F9C3F3E5592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A2
-5032519D1868816E44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF
-9CDC7A1B1B598C69131DEE005B415805A16D8A123E6A2261C63C769D2F4B60FA2C438AD7D199D8E4
-5F7E7C9A605C8CA14E21FCD81C9A515FB8DB6F99604534D06EA9D87FE0FAA852899C9D0595C7A97E
-6C55F79FAC45CD38E87B10D210CE7501E88C8FCD3444354365FB893A12F596AE2C1E70D5819EE0D0
-87D10BF8DA96F3DABD5405D28C4228C6C31BA4052464859640933FEEFD8071C0C84CDD829A9B1D0B
-A01F25A4D50EE2EA2B45160CA6333B2D2800306ED2BEFDFE155E9D9F9342EB8D5B0ADBF2460CCC98
-643FB1287CCD28ABA7B5CAB92EC39EE2E918990372B16F8487EBA30EAE88708B6CF33B6C015D8096
-C7CFE2F139F52052E3925C0D50FD64CE68236D59CB83EF56BFC584150EC38065059F3308AD6F9A99
-F83EF4E6CB13855C8175E31417D190D036B387D3952344A950F4D8C7781B307A094DF1ECAEE4D2C2
-FD747BC6F7F9C6BD0E90C19294F96C8C5CFE88FB34C477574A1B1630B8CC591529E59B20794DA32E
-61DECDA8ABBD1AE956CF74012AA01D42EE01E861B0AA6897C864788AE59DEF43C493246FDB1ACA55
-4C12594BC7B33657A9ECC9E3D1472EF826073F632BE540C35FF6FB40566773F3BB2204D3A579A08C
-CBC844C14B18C350F003B9DA23A570C362D6003893CA32F86F59B829C78EE3188B6E3F7FA81D7F62
-2825C639638DFB78B7AF1F500F5B450FA54DBFA5CBA277C794ECE93275A3DE0B452FDC8DDC2993BA
-A42F28A636008CDCB03EBF71BDCAF35019778993443F88412AD2AD0D7155A3944606463266322DBC
-0244B07DA1E9C27A27B59664E8566D7A54CC03E995AAD008B0A17E2C3EF61F720CE7F7788599C4E4
-4C709CD5C31B11107F16AD70B17B9AFE2E8CD922A7428DAC171427FFAF51067307FAB0ADB530E701
-FD22DA22C4CD3064067BD4F6089C4B2C87937DD426E4E9D2F60E608288BAC9056554D04947E69200
-61E379CF5E81BFD32FD37EFAC1F61CEBEE551B0851516471A7472C60DF89DAA9EB1DC5A67E479745
-3E69B9E22BAF4E3CCA4192D603295B018C4AB69D18DE52DFDF15E96B557F290A4B8C5B1E7A6CACA8
-1F2351B97ADFC36995ABA43803A6E5AC04A3C93495F6D38106B8B144449C07D1358210F9176E1565
-72363CFBDE576BFDF99FA329DD1346E83F79E06CF68250CA57A68931BC7F342AD295D0CBA17AA95B
-B8EEB53EA6E8E660B814E9F857CECB14F44A43288B69A9E7908D55BF19E844359879D28CAEF1C38A
-36420185D20DFB32C2E002202800E8EF3D67C5D50E919657CA958B538D537D503444865331D79BFC
-40312068D72364503BD0CC84B5F30A74D8B5B6A26AF2DB764564FB65A6BA8F9051AE2B4EA458D46A
-4569F30C6E77DC097356770362E6CF3F1661074778EBB44FF7D1E3B64FF75E77E11FE525BB121C65
-46CFD13300CA1F02D571B82A5825E6226D14FDCF27F06D87452A8B6C5DCA658535CEE2A795E58137
-D48E566B69D53A0C3B766E84C51EAA221C46999CC8065ADB2F129D5B630FAB1814C0C33B5AEA0EFB
-B6E994D80941B53079AF96D90A0B924F9B0E319BED9836B8F9053F868363D3CA554CBB181863301F
-8CB940872ED5FA7BD18CE39218B5AD8AC57D0F752D941076B1C64D99BE0DB86D7A6D96510D772EB2
-4C587F11779BD21CFE5BDE1F29C1EF9022B2B8BCD7F91153C845906722477829C40111D810480F3C
-F62DE8DBA7FD86CD236E656618CAF6FC46827FBC4898EA7672F8C9971AFE43E0E01EC8B77D4AF48C
-BF1210E98C1DB15C16D149BFF58AB0270CF015B107A3A50F5DC8F37FFB92EEC8CB6778DDB7CE4AAB
-C464C4AFF654223006A550EB52485A23D2B4AA7198D3CD54418102F1E9A4FBDE37B841E56F5C2C53
-966DB9B66B000E4588282E3FB80C2C519339F0002D2F83C979EDC5827A3B3C8EF8810A0F9DACB6B9
-998E9AF6551F56313DC4011904CB979AA2D32B11A811BC248141E4B9734D9FB7982A5671002D8279
-CAB93ABE057474628DEFC95D43890DB1ED34CFA8A20BDC3D874E7679A396158E522ED0AB969A4E3E
-C7E4474E192590504D54DEB7B260B7935C4E56548A7D121AC1F741F8CDF259EA1B5813175A77A1D2
-D30BA26F65EB765A04C09ED51F69F41551ADF399E6AA2FC09788137BEA4913F17B8EB838C38FB272
-1FDCB55FD65697FF0B850E7D3D1CE266BF90F7EC06A9A0876BDFE767D3A918B092FC78C775F945CF
-1F96E859C03DBF630D9A940939654C3549D8F7921CB94EE23D5A0535DE9DF31EA0F937F860B4F220
-A99ADDFC343D7CF7BFA0B803C12C26403F0DCFFC8EA786D0D8A8D9C367419CA8AE41190CE93A8086
-583A1E6C9D70B612C84D87D2EEAA71EC2DC12F4CDE6A821303D5F6A9BBDB7EEDCD289E80FA3B75F4
-7F481B50719DCF4A142069393593B9AF9CCEEAEC56A35B8787193D7C88113E9E1E221D151E093B01
-9EF89F6118BEC4735103CC8003CC5AD1B6727B3226CD44C497DA7052DD681695DBEC3397F9598C91
-77701C73BF0594CE93F23D50EC5BEE2FB9DA1FC966DF148B27B28EE3C89526DD6625E2887F9FA076
-7C127C609EE315626BC14D274FBEA56528DC06A27B2D476D46E9E7916590B156A5DF04A6CB15E362
-45D77021767B6E5BDFCC679670263FD891446C3371B11BB6E1DF60F960AAB4149D7753E6A5C33810
-C42C8BFF4E935003388506F8278BD7CB672F132E065AE684DCA0B9064D01DD620E7FFDFE04F14277
-EFE8E60159BA0FCA3FE2F28B902D4AC275D19F0AC6971EBE827C4A232D87650D2688345BCA78F879
-077114F0463C5F058107B669566F8171E4E284D278405580F04BFFC9902784216E0C9A17AA9B2935
-E66E18A783F723BE044389B7E9D62AA36818FF2EA406C3C1A9D2F3436F3EE7DB8BE86AFA8DAA6A4B
-1B84611350D8D27605509612B515E16AA843164D5D0805E36A2B9EF74C5F6A0B9D59A04B55697123
-27F4B1B30E9587CD103337639967CBDC655AA46E80D2CFD24BEB50815B5338E522B3A7AFE8362AB4
-F05D8BC52BBA9C5089ADA8C89529B0275AF422EB540D31A938B8740860756325B966B36817115213
-FAAF92DE63F6BAE1E0064BFBC5588098B61EB83C71F1C2082436D37DAF1ACBE186FEDC4BE7C1233B
-6F18BEC5F99002D21CB7864E4811F7AB3C03003E1E4490AD1AC793BD28FCD5EF0E6CC30EF39A08C5
-2F71939B0CEF620DC69E31E39D6DB969049031B0C92EF2DB653D97F370141456A52985076B268652
-FA2648C792780BAD637C4D7581FB2D62011D57E293719487CF2D1F013CFAA532E1C2D39178D51272
-A6AF041440BCA174B5CC902BD7390C7D3695056CB4BD7791F9FB6D88E7A70DEF2C97869F5DBC5BD8
-23C517C7B7C39D624DF627DC9653EA5347BFDA80B723F05F6DBB4C9EA501D862ACE05B9DBDF21B70
-56FBCD8C6D4B85873DCEE6166C8B5ADC0316CA12D9639F361B15A42F00E1D62EDBCA1111972FA0F4
-5758BECB31DB38316F3CDFE1B41748C93ED58B67E9B57ABBED5924A6D53E99FBC9A994A6489A8BDF
-13EB685548B4DC6D62DA7426C22227D4D43B6FFC7B5EA91C896730253E8941AFEE588359C2BECF6F
-FC415B9EB6D31CCB0F6C7F85853E6449FA6D627A97A3CE8303F148393ADCCCDFA2FE085C6908BE5C
-3C05AF00A6F02840206C3253A559AC5C049BDDFD11AD9B118403B84DA10AE3C470CB9A9A2D1D7B73
-2F59F5FE146DEDA60AE750F551AAC934621B4470E1BC324C436303E25F81D0DC3188BE0D6FEC5414
-C20E4CB18952E12CB6423DF7124627ACDE145500D77A97A8BFD9CB50D1FAA008E2CE2B2505A4749F
-1EBBB092C347023714055A9B63353AF9E7FEE05BB54C9843698101F79888A91531773830C2C967B5
-88D3ACD2192883D5CE3962D51084FC653EAE2C5FB2DA41DACEFB5C76812D2EDB5B109677289CD199
-8D457FB1023A19AC67295BBC1A9A20A426B06A368DF3C5DD083CB1180D287F5500F2C635EDE157EE
-FCEEC5503447382D15C748C1E35F68753992E5C90F900DE54D18F8E1B355D1076ADFB1F3590135FA
-D1A36F028E44F48ABB149B80CA9A54614D467F8D71CB310BBC7AC7100261092DB8C5BFD39E0AC6BC
-2C9D6CBC3A8C05FF8A74CB21608EC4A4CFE4CBAA2D056DBA14206106044DECF59F957EF8A9CADE4C
-9B19D8D30DD4FDE6A9548E50DB51ACA73330142153FC36B69C1C8D5B26D0C689B7040E81AC2C864F
-D7C097C99BE5953843E172C97AB5684F35FB03A725A89DBF371F08DDF40A1531FC1B676DB0E1543A
-EC6E97D3D2E4AA3D5831D8B3C952ABBFA112352814FB6FAB61A0D680E6640F6AEC8426200CF61286
-F7422CB2F78C61EBAA36D47EC16D7FAF8B4AF31D090CDFA255D9D7C61D46CFB22A7D6E1758E71ED5
-67E00CBD8E8F468DDFB477F091A2F915627F22FF47B876544BC1F03B6BBB98385F009C20BB1AA2A7
-A78674692B8EAC2E3C8069B79E679338DA57F72976810F845BEB6B9ADD32B95D78E5E60F16DD1668
-9C05FD82D36A3115BE8ED494A74DD211D58A2CDF983FCB9CDC29BF7F0E29988FA23560EDF514BC1D
-183F3B2A22C09FB179B47E05ADEF48DF02F31C29875D1915037B19407764A4292FE44E741651A8E3
-BEB5F0D972B6327090F664417C84F84FFBF0AFFF8B1D85C822D90730AB4140C42A51AA8B1DBE4398
-4EA8566040EB8B341CCE23FD3F69DD235A080BA5C69AECB9BC732BC2D7D40617DDA6B79FB6EE40C3
-556C7DF9B23DAD89E94054B1345DB8402AE679FC4655A4A776C0150463F8DB2BFC0608EA1F124E22
-1DDAE6026B5E5D007A7E4A0D6B3B0CF3A2669E67C5E4F01551966A7BC48F2F4B6A87E740D8095E63
-F77C7A027F26B52F2299DE5B8A2F6209BCF3D31CB0235F998F781E5CC81E31DC424E008D46EC0920
-2951E5684804A0592EA47D6C788A20487BEA2EC8F2E6C1D7F378B62DB43CA43C4B366F8B4319631C
-FE9854F0E10321CFA3B01C873584863BBEFC23C72C05E695B56E8A52E89AA2DAB543834D34DCAC5F
-ED08DC51825C5257AE59850D101D84F4CAA1D29FC932F9E0EFFBF7A9A7F3685F61F0490CD3CC8988
-2DB52A757A6AF4C4E67B407BD2316B1C0FFE7DC54E43C87B874F57E4903334E2140B011484863CDC
-ACA331175F2CF3D72E0042855983AAF8853D3015E870FF0807014C31D55060DF3FE1FCE157324481
-2744AB51322444632F9AFDA6706E320FFE82B8CBE242A19DF00CE73EE48E25FF49D5871BD3E60652
-298FE3E8D400609E232E0DDC794C0579ACEF89E841B2EDCA50D51151F65E8C1CC3B01EF1870558F0
-BF5743718C3E068617E81BFE120C6CA16E0924BFC2541177D53671CAA3AB641C41557DCDAE1A3461
-47B5E999C4541B08B4AFCBC187AFD653D5B5F8386DF6AD8FE69E21BD0567DF494F736C6A184FA4DE
-48DC9F347787CA96E2E00A296C2DA05C2AD9BC423E9CA428D7F1FA12DC9353A302FB8C529AF8688C
-BB543B45B2717EBF8F6C497935F4F3BFFD285E0402AB7544B3CA4643AE5A8B5250ED987A95FC1F27
-5B9707ACD0641BD0EE2AE9758494F8D8A51DCE408A38AC20EAF0852D72D84D0C6BE973326793AEB9
-55EAC6FE0A2813A355DCD22F6F2CE56588D1C055CDDFA98878BCEB6A018DB22922D2B600A20F8184
-2E665DF41013CA0947C4237C2BD60A75E2FD1A3FB8C8FA19485730B87461AD466ACB02DF8CA24091
-4FB090B3D2B41EB6B8FF05E1A59D9FD668AF70BA5BB72778953BA55FC5F9F626043450E1D09BC83D
-8605098ABEF884639A37809A32565CBEFB3FF39EE53D6C18C58C272BB928E4410E361E59A50F242D
-69747A032617C52DEBBF62364AB5A96EFAF642D9D82BA679B1D70FAC10A4EB62FA5CFC308E86368A
-AAD7E75948F43598CD1C544A0D4091374D7E88D4522CBE902391641327E888E7748FA889DCE67ADE
-61699E7D77763681CAEE9B1CA8837B2F7EF9C18CBCC538C465C8E2DD34616953CCB6030A222C728B
-834911C1A179E2C770289407AB28B303E724D97F747D6134B425216A64C6E0B60F633E2B85300047
-E4C90339CE030A0FAE31E830C8ABA5AB3386A3B69267351A7BFDD66356AE5E57FB2994452993E90D
-E7C4E260ABAB93C37831856A650D56E44172FECA01D6C7C380F250B82473960D2A2A5FB6B4DA668F
-46E624ACF7FA0FD4490F485D640A3ADFC9F8652E7A38CE5799F770C3606DB4B8B947F93967F779E3
-A3C0572F13A5A187D31D7BD12A5C7BE23CB6ED6192086241B76C5BA6983DB9C93E4B208D707D3760
-F03CD6272EF3A4CE89B8E52E6AC5871A3D03EB975759AB4BE239E5EC7842CBB333E692CC607C722E
-185D3C39164DD320C6945629C70FF66A5237C0A9520A1FAD6EB9816069351AB0F135D90CC0982B14
-7D2294AE4A38A527EE40BE9CDE2512AAEBB590E134388BB171D0956A7C4566D65A9A041BE6C4F883
-6B3EC3D2ED1B48B566A783292B15B6127920D247D494F070BB20BEFF60640B11B276DDEEE49706E8
-B2B21BB40B7F00AAFC594C492C25DCA774E0B80D82E927448DE2E74A9D0DC7AC9260096EAF187B6C
-D6AEAA6D1DC4205B4411122751A5B22688404EA7C5861730371FFAC10F5AFD4727A0E402AB5EA757
-606B75EB86A05E8F774D6E430A1A3FE2A37EBB06700474239FB1CFA05EE44B91B82244C575B52E7F
-AF934B04EEB0D933FEB57EBE326D75821C8B23EAA85B583AED4320B7F04B9F2DC591091216FDE52E
-064BAAA9C2C9D9714B95A4558C21F3CEBE624B5403B31508F178581AF6863083ED762F1E2E34A45C
-FDD71660D626FF8648F5D6C5E580D4765A67FB6159EC8077A9F0A88038C8D3D7C77FF0926E2123BE
-874F7BCAF129D55A5B5960F824BD1728ABCFCC51D23936DE9A25C408D786E44C3A2BAFA4423177AD
-060D21D38E15E23EB6FFC0B4120E814695D423EEFC2744A1FC81B4DF89D76F0A6803D8B14E75538C
-AAD03A72517B86514F6952F6FD619D9E910D980F00964DB325318C045BDF79647F453D4A5CF4E61D
-D5359782827229310405FBCF6107C3AD9DDEF9A9A339D5D5A6EB2E7838A0A43221BD62CBDF732DB0
-A638A52016FB35BA7761AEC846A023D3BF2D1BB183543E81EB7CAC1E5970CDC6F068C5EA118C7AAE
-528D1396E6DC939112DA4460C890EAD5C01BDC438F5BB734218BA6270ADD0DC1778FD8AB16831D6A
-302B814A1A44B07EDC65956C9E6CF4875DF521F3CE5B422F71081B6D69BD270F739095C9E81C0377
-934A8BC6390C420C4E4CDD9CF7E32544C68D884E15ACA3BCC07FC8C132D8FB9D752C15D75C52C288
-57E2EA461A6FCAD90C56843513F74461F18D7164BC597A28AE4BA7C86EE1703535A9B9ED50122627
-71FC12F102E800E0E1AF7BB46681BD2B14B614CEA91B7B2AAA35235DE76C0E113C92688F8EC81277
-D58C3406778E1EC1CC15F1CD9A137C8FFDAAB99ACE3BFC782916F1A877170589A92DC921E6740A22
-B84DC6BACDABCC76E64C79E3A588D80F8F4D376E1B426F15751CF7391102102F0AFAFD8B22DFDEB5
-48AEB5F30B1673023D22054A13391A0EC08DE6E7B685A0D031AABF20B7C62187C0284892D5EAADF1
-21BA28263EB863D5E36EA9C06A77CCFC0E17F593961591F84D82AF823EFE41044C8D606FEF83CCC7
-B0E961E7994DF8A3CC36B209D953E250ADAB8D22D7F2B4E2C9CA39EFA2D93E56195C1560E30A5190
-CC5B17FAEFCF250DF79F6B624A4B917E11C332222FCCFEC4F6A47BD9E75DA9854FC3F7AE554E91ED
-DE144D7AEF38A0E3EDB5E5A5626374DB94F022C8CF549093041DE00D7269B7CE544E748439BA2870
-718C08E58FB4A77D93EBC04B7957D272AE1601D41BF85A2BADAA0DF73B0D3841D4839C85677FB2E1
-5F1D6CE592669FF4BBC9C69DBA334DC37706F2F6BE83D5863E8CD6A30C08640AAC4C233684E66B4F
-E6B62D4A8BE9D531E47BEF5640D9B5C27D990092BE1597F6995C8A77BE9C18AAE6C1CF130775DDAC
-41D34438FC7AD8E042CB56CBF2944932EBA7D053E9376FF398367450E35A1945FE23E05C921096A1
-5454721FFD0F429A3E06DC3ED36F1C170BE79C66996EF8337AFF85B90C5D3A4A94455AE9FA32E211
-7A63E59001F052D5F6223125BFAFA40901E98960ADF7BB886729DCA82FC3B8CC52B37FF2517299E1
-D769057F8154FB95582F02CB0BECC873A9C71796ADBD3E91324FAA94F2C41CF57C30B5897D031C02
-D256C909E080E70BFD1F32E69EF67031138C2DDCD1A8E4B65E485C23C3E450ABDD9815512D6F34A8
-4B9DB715DB2C7A93BFB424316E1AA44397749CB01088428F149A3B4324737ED9957FD388248462AC
-1B2610D72BF5C073ECA567E7385CC959E37CAC7E05470160FFA5A9F63B8E9B082937E911586EA165
-374938F492EDF28CE6020953A5B5CCEC7737F9D9CC8538C4339567AAED3794ABA3B9F4EAE65466E8
-E326F6C399B36355935FBDCB9972F10B13494DC25097FCEC5A6398F275C8C151558E74C5175F7BAF
-4155E36B733F75CF9D5C5979B0764F14D8306E06BA24BF791141E404C69F3F8FCCD91B9C58C2C671
-AAE7D4F9E5D6414E46ED633A5F78AA5BF04E652246A066EAD9E582B181CC196EA2D3CFAA383B5D0E
-4CAC9336E119C08CC6AC55CBFBAE147C623B400453BBF447E96DE036FC025624384359EED7C7D5F7
-858DC0521377CF647A157FC3F188DE5EEF094DBA125510FDE34C570D7BE76AB5DF0A28BF45DDAADB
-EA7EEEDB936332DFE93081E0AFD3FDD46BED08D6914B2EFCFDC41662A33B90B03D76D34F48D30FC6
-BBBB600E90E6AC7243FDF026762A44B4D6E4ECBEF48C9D7B696AF29EEE063E557D8FCF0F09E0136F
-45D17E608DA36E59F2AECF8493F8D62536119B5F7E1554DFE3F6E8D7C9A2C6F557D18B4AF92C9F6E
-050975C3B5C54F9B5F4E39D600B6FA2CD6DE203A174028CBB2A201AF126D1013C229BB82CFD013ED
-199D01E51EE2780FE896E01C63C655087A3E61A7F1029FA5E97EA1872F1B45F22282DDC317E17926
-7368CB52DA9444F6055A3C653659CAD2A1D8712BC2B1B32C1DC6906D957FB88524EE066156ED6BDE
-B8D832F9338F9912E29A250A8C4674E667C1C278B677AEC9972BE83CBA3FB779893FCB8F81A323AC
-91474BA2A2334A07BB5628E905C518E634F6761A3289056F83D5DD7B3890987EEE1C18FB2D379CC1
-905F1AEB3B3D2AD578F0D6C845D2D40C4BCEE3F71C90E68E5417BB8CDDD878D83BA80AD8485F4067
-E5C3CABF28AB56CBB219C0AAB8FFC6C7E192BEC8CBCA1459AE4450AFCC81B9548F40CE2622E5A7C2
-81F74DCC02DAD57EFD92D072318DDF05BF42F1EA8163071E23949B0179CF7DE64677CA99B23CB926
-B3E294194EC13397EA1DC9A5E1CDCD828156CD71F81B64167D4FB01E6002713BD8AC6F82B20CD369
-9C6CA4704DC5C65A2D66EB155B7AF1C9BB46469416FB49C1C7E17A30A5F045271D7DF3FFF2F42C6B
-470701C381E3456A500C6BB3D0E47B4D91C5F34B49BB6272F1F8698B307D89EDA3A1565DAD1C0864
-627560CF922DCF5B34C67860352390B282F95394AA2CDE0E97CE3ED39546A6AF1C52BFCF81A29BE8
-2C47C99E8050E4889E4575B75F39E662F2DB7420673797E2ED3D67CDA7AE2C15D0A0A794D57D168E
-BE13214E89E0209AB2C0EB7784E9491AEFA3C02D0DF3AE5365A0FC4AE023CAB528162C7A1B173664
-9DFADDACA8DA5FA18B7D6489E4229E9E24D38A620464A744A5C60F6F9D334B908706B738AED18669
-8A8B278341FA4D65A0A88680BA484694921512F7DE93337FC1C02BBE6E64AF2DAD07603279D87329
-1D1F4D39C1DD6D89C90F65240F4808F6F1115CA55B88E242565E59F3BBF1F10EC7B88872E9AE61D4
-4CAE185463EDFAF7DF63DE4D2207D307AFB61501892965170D2945846FCF5973A1D458607F50C15E
-06E5BEC715E0C156259AAA6C735593E5564F65F443B78CC7512EC35A56F126DF9D30974A40872E42
-65E1AE5FD483CFCBBBA26DEE426CDC4721F19C3FDA86ED7AD4FA1120F63669BEFE7002B128CEAFD8
-C63E8AC09943B6CBDFB3D2476A026C00A8FF81B1F651B97F310C82ABA5F388CC1DB5AFCFF5996D52
-52A6A42FA4D972E41EE56088F78CB966F9051171C472C774879AECFFF08BFD9CEA40D7C298922ACE
-64F28C14E0B81F4DCADE81D71DE3983D87D905192EF13CEE71B2D3FF1A88AEC671EC318917DF98A3
-C9054E372D22A3CEC82FCC217F47319A40900312F6E32B536B9E7A7FA0837EC65CCDB5FB0D414371
-17596CB39D9382262DE6E65379D3A9709B2CFBABF5FC5D5B352425F06F88CD31012A2A4147B112F0
-C1C0ACCC808CD625E0228EEF66661F70AF96D3DCFECD402700E4F6522AC9A856DA466D55C84F65BE
-2810A1565163872D62EB81333A698ED7B68352CACCA2D7AD38AB55C19E4F5582F75818302F5FDADF
-1DCED09D94872F2D48FB636C8E38C7563C72C771A08C6B1F041F3532BDB39006C89A33C09BE1E3E6
-03622D891F98010BF1DE5355F557A1E09448D486ADEF565705277B31B8BF2B86761E32631E3435B6
-88B79D566F1747BA456DDB43CD239FB47FF7B425EAA4C657C8EEC26EE01AED07CF916E77D53634C1
-37AEEA009C6B515B6342C54BE2C7B95955B1A9DA277A0ABCDA2346E88018C726F481F71D6011AA42
-F8852F2E5749518FE3B3AB668213FE1A05C10A1C53953D75312631D6BBBA01D418199DFEFF8CF548
-6109B099FE8E2F606165FE30F532C03567785D5362AA873C9D3EECEB20F1945D55F49B0CCAC84967
-59FCC7292E46938943C262D78F3212D3F9D0F7B103157F423D71B1ED54B2A603F4C269029918F238
-EC6828FFCEC66009DB9C9E59534EABB183F31D7AD4C57B1BDF0BD2CE5A421882BC10CC1BCE6A970E
-2B586BB221567CCA483989DD0B8DEC424C1D1FF042DCB7834423CF244EDA28D2D969B17440CAEAF0
-24A6119DB010CE366821AFA424D1B8299609C04148275AE6E5257A7ACB3C766C747CE99CBA2D703C
-F19B7CF301B634D8B613DDC4AFE4633A4D77BFF8E00CFB5E289EBBCAC90A24307E7941EC1685CBAE
-400CADD876FCEF7F6557EEE167D2035A05120293527700DC510B038A496BE1D5CBAEF24ED39F7421
-1A93AADF22214ED606A80582485AFE358E3A46D0671148998A3B3BE209467009B43400870359D418
-9A8CEB4D5866AB52D16D9CEB1EAB71C07E6CAA34B70E3096BF7604C22C40D5FBFEEA616DA3BABD59
-DCDB97D883FC8742B8267A16A99B7953225F7144568D566E64542C92E538AC140C851E5D295528EB
-7CBB49909B1CAF6409C9BCCEB325468FA0B5F7CB2987382616B477CCFE4F4AC79E4A6F7165363543
-F04DE5B6F6E1C2E910CDC3CDD6C4C92737198F892337DCB6647BD226C820AC99C65D8E7772BBB74F
-E65DCAA8A22C33BC168BF48E40A82700A3A7668C5A9A71E397ACDFEE7D556C5C19467B7AA69C260B
-727407AC837BDB7D67DEC055C1F45D8BAC61048C45BC9FB3CEFE7549EAA2992D2EDC126FF7A05EAE
-58613332A2BC1465B2BC0429162B907D65F793D236EDDD8D35405866D71B25F62DC4A7E06D4DEE82
-840ACCAABC0774F8A63E9C0F7FC980B3583E7A8B01C46590E3BC04EBA565C2EA94F057D964A78A90
-EA9F52ABFD70F84E44E434BD10A42E98C794065724341F907E35D3CB257161E01C7084E3A0166D15
-CED65DA7BA87DBB2EA33D39BD99AFB93D3548358D08330E807F8552CECF63C84F805205491BA3A1A
-622E70C232FADF3BF2DCFD6F0539158D3306506F150B0518371912A25EB96163D73E9EEED42EDC84
-D688BC7F7708D9DCA348FAB4DF62E5809BD094842D0A31DBB7C4B41F94D946810C5EC10B69AABC2C
-91A59500B2E5D37F4755DDFB7AE4ABF757F4C5BCF77C7F95E6A616646456FE8F18407080BCABBFA5
-7704287AD26222DF91AB2613951E2D679472F8ADF06EA2A20205EC19972299A78BAC52114334470C
-5F5890C2F846B4C6042D73945127F2E3910ECA1C4CD7A16EFE4B4BE38A15AAA710682C3836A8CA83
-FD384970139D8B46FB0AEBB002DD224199672FFA02250FBCFA4E649E335428FC71F50F45E498419E
-DB0E970F46894A48F65580881C9C4250FCEF65C9B28699408E18B26FE6DB7F1CBDB767564E73CB59
-54C6D639CE33220C894F36E70F71C9F9AA3FE2AE0AA0E3F2E304EC5ABC661675CDE2E70519E4220A
-E26FBACBD01D5169EB844750753E6CED53E3678FDCD08AB93E10067E9C64F38B40B76D99B6CD92BD
-F4155A1EA5CC824998B59AAD06E09E5F15EBB2288D66EA71B296616734FEF2796F07FF0D8B047074
-A1111D68B99C2B70FC56E74A51B062F4998ACC85B1943C9477E436E5CD7AB18DBC898D21BB93475A
-623BDDA71D7B895BA2D4C10F4B90BF335126F4FD57D73AFA50170F6B3C364922E551D40E35DA75FA
-891762FA23401D39260F2E92C7807C746F13BB35CEF9DBF2E76E66A72FEFF095DA482A4DE8A42091
-7065736CF4DE904FB52E649A32255E2030A7B31B686353492F31C064A3C4B0448C4BFD44B8E15384
-FD809B8761EE26A7DFA1758D57CE4F0BC376EB2B3833534B15A83436BA553955ACB5A7A66796AC5B
-92DB5388BC53EFA27508B08E82821E5CF669BCE52BB860780F749B4F38ACDF5FF12726BF3EC2743F
-01014CDE96FE6B4C40A034E9EAFCA2A35CCC776C2669E6AD138070A40F48ED79136D7FF57E993E09
-B81C543FBADD350FF5B5F7A46F060F88E30FE2D8233832D18B6C323EE017EBC1DF5C838321CDC8A8
-4CABCAB20B60A1A3AA028F36EA6E87C850AF8AF7CD50AA6359038BFA8818821D02CEE8F51DAB8C05
-F7AE9797814D97F3DB8CCDDE45B21DBB15CEE292FAA534A5F317B357F4091F3DA357325B8B9F5EDB
-45865415973C143E5E5BAA483FBF2D06CDD4246675EC58B84C6AE65CA743117FF00F229243772561
-31A7F2BA26A9115AFD96C18216CFDF41B7220ED0CB3FCC26C36380007B382A02AEAE428887DC8BE5
-FDD630AC57EE3DC156C7B8B29E687F24442E35CE10BA4087295A641F7139C831F7CCDA6CCEB5DAFE
-537CC1A97C5A337D3C48A6AE947F58A30DC08CC7B58DBBB4737AD52783C573FC1E9408F55495A80E
-7FDA61F0B9C4F090158F1A416249EBBA936C27BEFDEF19D1BFB839EB70576A010706D8B95657B218
-9C2AE04C11EF9E57FE09880273761FB4302C388BD608FA0C7F00F033C9C00F4E3D5CE2D903E0DA52
-E69C7745EE9FA75E2AD93DC6CB5CCFCD3782A699B807AFC36AD1F62B05856D5DFD6F88831B90EB3D
-CD523582A49732E3FD7253126D39E8AFB8458B5F7AD7F94A8DAC13365F433C857AF4A42C0A08C4DB
-9887C4957259ED22D13CFDF5995DA957EA5A0F620B0214FBFE08AB6D552DBF048D62CEF6EFF12F15
-3511ECA7833E0E3E95F85E6AC0F95438AC4C126E1F1ECF336ED31CCA7EB216D279877123FD9FCD8F
-B5E52B587CFFC4428456DDCA816819A8A4A211D8F1629E5D42BA4C5C356E580C8A22C61D987552FA
-A97893816DA73D423686E4EBD44375C257F031318865A20F22115E72BF1EB9F93AAA169C140A33A0
-6C35BD4526A38BE79CF40AD1EFA10411E8F3300A8A8B97AB140EE6734E1BEE6C8EE443D698D34159
-97649C6F10F20ACD80236422E215E146D744A262DA3FC88DC0D86FF66512F49D3F957D3C5CFFEB42
-4823509F33F155057A4C6F37B52F4667767BA94F6B8B62856B553F307E5D230C44CBFDC9A97A45B1
-39FFB2F2565EB0E22026972FAD0FB7B9576FB6F368B61979943A398773600E7EE1DFEFBF26D45D40
-BDA66EBB96A56EE9CAE0B2420C5DD83E24DBA9FF885BB844BF3D2BF93B07325DFF60C0CB5FDCCA0A
-C8FB5A2E119D5AF26E53AB8E3B428481C2871DDA26EF0B621CD8572B3C664BC7AAC01A1D05B98F79
-1A7080D294BE81099BDA7982432F3DFF4775C44D23F4F1B2E0162B61A8B2CB5EE8564BF98E2ED403
-2219085FE6194C19DAC98A421826CAED7F1AB1477AB327506010217283894235D7DBFC1153D5ECC4
-8AA7293F19592B4D7E95FE55151889BCD1D7FA7DC2370D2DFE11D7E4EA34B5C7A8E73BD3A348FD38
-9EF45B6167FB90BA44C23E912F9A4F2FC0427ED070592F7110183BFDB2C400393BA7569058227926
-351F07FED4F33633BA03A72AA2DC6B598E49B96021DD868DAD0F352E5722FB714F667C15C68D49C0
-3D822D82677EDFE86FE9668E537DA284068C9B0AED83074C92A5B939296D505B837E6A9DDAB1AEAB
-7455A08A114C2222B339284674B74BF4CA9EE0C020BF2A148B439C71C6BE51A94CB64FBE4A7EB295
-5A455047CF5CB348B062ED4F6471CBC3E9ADD9BE9B96879AC7BC71BCE02FD02F17C6063985A5E898
-3D205AA1489DA13C408990ABA1C54F2F501AA172F530480D789C848118C0A74EF98D5F607A067BAF
-F6030D887AC6A6497F9A0B38F9705F328AAD4BFBB634F739386177B07F22D5771282444E5EE17335
-B4D0EC86117C697E79A5F4F65FDC08E4904DAEDAB20067EAE2448FD4301849E456D085F392DD1316
-7ADF75CCFDB723E2904A9C0C976D6B84DDEF9D92B0E15FB246C3ECC2D0BF314CFB957757B3A3E8E5
-801F520644E4601D291DA0F7507C06F3B9BB36FC1C70EAA444E14E56C0CFF06C7F853DF36DA9D8B6
-AF2544B853DFFF535A7E5C6FC145250CDDA229956019659D0D253A19A7B51A4E538BDC01F74D7704
-9949C2C97C7EC6392C2E61CCC0992B66DAF1AB08551063E53180D2A67DE496716CCBAA45462D9F91
-B66A22545962DDAB120511FF08627131B95E5DEEB8B4DD9643E7B2AF65C0FDCE11F5F1E8DD468DA1
-8D41C8C4F00EA73836F4F70EC50FC3EC6D358C0658A4261C6D15A582A2C7C994E7882E661855B352
-014576858A265FFBC425160669CE159D07EDAC04D060B44E5800A7AAE8E339C29B929AA81D2F515C
-46229D2080D5917AB20AB6B34FDCA8E4AF64ED660A3173786FB1A1D005D575C2A5187D3F7CFDC94C
-CC44A38C5CD523E9DA726D8EFA6DA7B6131DFF3435FEE838B2C7D6B97934295F06202D307FF78D90
-6699CB9C5BBB10D1D4DEA5FDA5BFB094E704607083B646D37F5DA1FC7AD21B813F44D8C1AFEAB666
-55AAA19703BEA2E77DF3BF350E17C74B3447A452235919452B5175570A006C7680AC05E8950A62E1
-1D7E3ACA35A397D1E19630D094A86807593C97F4C484E4E06BCFF708B6DCA972E3A0009E1CAC0EA4
-141530F5C1B8AEF5E1B933F37FDDBC4BE22B74FE346D1A3F5FEC0818F8E61765568A2AC04713E828
-F98C449D9A1CCE52D10D61DD8BFD084C8D099A75D89DEA64D5A7CC68BD5B0593D97953DADA976383
-F5015915618AEC56D71D1DCD55B89736395C609B315A3F1E1255432FDBD37F38CC43C354FB4B7C44
-F1A7318B0B7E99C3C08C33B953727B6A6328051783A0A33E3CD9E498346A3CA6A77B517096EDD52A
-E443B87643A646C3A7BB97F742888D33F9B3127E61942F4103C1DBDCD8EAC8F9E259773066736CA6
-53CE57E8822651261D847C131321BB9D6626A1AC50D047C0BA47B411DF2A995545BD68EC0287CC9B
-31D5DDCA8755EBEB10ACCB3903AB0FD5788E984220443B8459E7C078DA4289F1350905881AD6DFDE
-C47302B0ACB0D4AF8CAED02B4B70DF3CF8FEC118F0FC2D3DDE3E494CD160E676E300BC464BD4400D
-B50EE43B314E0517037BF971ACD7CD327CB2134893B8A0410E68DDC518F5DEC966C7884CF5FDFE74
-723177F20DEDC039D879056CAAB4BF045062D3904F615C5CFE109AC7A35599C94024B41019B9AFD4
-04A80ACAA4837929F5C9317680A13D157A03B59A5588DF79D2E113F5F51021D6F6F90E8BBBA2C252
-FD10651BE80BAFD59C53A3367BA3C28DB6EB9DABF1EA99F47B503F627E15DCF3FD645FC52C5D5D0F
-2F07DB4C25C0D1E1C00146E1C4D973E613CCDBD3F9450CC0F5343D79F05E9492E86A1BB889ADF405
-03BD7F3E7543436859184A5B20BD8A172F350D846B7570803990ADAA48D4B9155A2B4C4BFBEF1E1A
-065C08E03928559735BDD442FF1E83E1FA20A5DA57D8BDB2FF5427C034CF0128AF111E6E73099E04
-6E0C240E80A73D7BE72B87834E45898D475521CA3306707631F5C6136199F354632D1A085F12A1C7
-C473868B62E534D15F5484323E63D0574196A19EF175214EB35A90873EFCFB92D6CF68761D45E37E
-AA61E1A1979A82009507CA193E44B36A806486665CEDBCF387053ACEAB979BD35D30978FC7659ABB
-E844F4ECAB3303318ECE80777A5FA5A9DD91B3D06804C4B4E9B4EFCF07EB89866D0DD8CA390CFD15
-98651417114D78776B1A1D36B4BA17746D6BE7FC123D473EF1EFED1C3BC1D555F914536869FD5B0C
-35F9C83F65B0E6BF7A627B9202D787D72C600DDB6BCCE613D88492E13CA0AAAB196E8A49928C62CE
-A4FFE2D0208EDA334ACF47F20BD793124D2C5546C03F4A364369A76A0425262F9D9118AF54E37D32
-E33AB25DD533A49DF5FBF1BAF4CEAC2D9D378CDCD13B00FDA432D9042F623DA41AFB80699B5538A2
-5403B0B3EABEC9E8EFCF42FEF3EA9F91766902CD206B0787C187D5370B60AD6DCD002DE2DE8DCDC0
-B4719A797C5E26BAA67665016DA0D967FA1346F9588AEDA174CA001B31213617FE19EA218EC23597
-79D979E2663166489C06993230B0D07973A117C4E3F4A4C93CF8428248DD5389414D679C69644142
-67C7FEA17E35B0CEE456667A9B1875C81B2302BDDEA2818D6019FC1622A82051F60584ABC904CD91
-8676305DC03FFBCC64FDDAC8D8AA9CE2EA00D6C97BC63C8A617DEDFC0E40775649438E9F61AFD179
-5E3B20560B01BE5E0983F136CF48AB206954E41DEE0D9DDD953DFD01CAEB569151D6BC0DFEF29D70
-FAE3E198E7EDD8922C0E0BCB8BCCF1C016142C1A8B337AFA7A05A9D7534B184BF3BF827F371E9BD1
-9A71244ECA1BA73D484CD2FAD54DB2F0EEFBD54B536EBCB5094E6BC2F5B2AAE41F05B4B311115876
-ED42C34F8E643B53372E3F6350DB8A38445822EA9A33E27FB0CC42CEDCD1FE2FDF723FC47C996EE3
-56C402112F24D0AF899B2D00BEA1CFD427998BD22B2A09046D6737814448ACFB10D387547D7009FB
-384AF0562C85694C071584236D0F1F3D3FCD0CFB38B77C81889061E668BA7AB37AA60F58A3967DE2
-6F939B79CBF10A9DCC42852561D8D6754F1B660D216AAB1E133FBAA321C56E2584BE5C9BAE20CCF0
-0E8DBE6D9C2FCEBEBAD945C3C04101D2387351F132628786F6D9D4CAB83419288D31F9BC600D9664
-12E6AA457CE6CAD26A4C0671097B98C2384C81DD8B9A3222D4F4BBDA7017895C3EDC26662779AEE7
-40D9D7E24185FB821970B0A3A94041A69E4805EC88EE1EE521981536F2844FB8F5EF645F67D42CE5
-148E2DDE43AD5AEF200EDB3A2C7866C98458A92666E5F9E070178BCC39F65A893102A10564AF4E8C
-AAA5075D2F8CD7FAB0401C03AF299EA3515CC93066744EB5AF7CF0ED06675BF049A6E3C211A89E16
-DE5BF0445A7CCA6EE8EB0347454950485D884606651E5887FE8B24323E2AA16DE22FC1FC8C4F06A8
-2A1FDE5758976024068197E1F4506E4D3D8A16D40461A4586338B374A592DC60334402F76388AD6A
-457DC3F54E6169CF7AE3959676E966A45609621055EC3AF80E182633300A4418E34A66DDFA6B569E
-5A13C9115B5FD3EC1CEBE50FBA247F60803AA83976F00117536342DC3D9890C49B2AC701D370E43A
-955118967827760F7091469C5406F08F18D7E3548148CF0E312B1DC71DF67A5E7A1656CF2F47F3AF
-F3DD50FFC2FCDAB7177285B29C17CA43019F62AC6FBA52D1493ED7C427526470ACC8389BAE827759
-4958908F517B2863B83292EB5AB3F57FFFB08393CA610FB1FE905D88A0A16AC395E2A2A6DD033D6A
-0D68992F830B2E1B95FE357BF672716E88FFB92FFC3D62945D1EAD22BC68C51EE0E10A43011DB94C
-44685A5C4576F6EF44CBFB45F2A4BF110A01657DB51FD499767E78058199B31DFD60813F1A344F86
-289F9378231D5B151C92385E3650B4FEB1DC91018EAB8474CBF69FDC1496A4D078D2C351C8196451
-247A9DCF8117E5B637371D8E22E248C64D999015C3FD2311E9950B8EE0922FBDD3D7BFF766BFE9E7
-CE0BE12F318FF2A7B5A9C6D00A54401609304ED2C55F5C1EAC3D4B38355BBD85D66D61636FA6E30C
-2E82829376BEC979A6FEEE040E452359768ECF90CC539A546F17AE906C76F14F86FF697797322B05
-1EB311A759FE260C1EEE5DACF383816AAF1294CFFA7BF87A4D9BC595EE8F2C2F86FEEE11AD959D86
-F22FDAF4CEC098942A57E57813A0FA99239E994FFF353C1E781D666B8928CFC648FCF0869FC68468
-BDBDA7D280DFAB8B0B3A4CA35B074B686DE8D372C61FB32305169A1A9912F6541DA16CD6316A6EA4
-51524757BE5CF6E820011BE3859FB8B8578C100FF029680E05F0E0BF11D33FE19460C85EA5E4C0EF
-28E29407C8AE6BE01CFA0D5022BF9FB01416FFF722A784DFC8FCE330EC95737A854471D334FDC58F
-AB42867A7B62836A8B56466E9A6C1247D46EBAFFB905CD4321970F59FB8D6FF65FDDD34BF913AD32
-2E68455C5FF2D23C1A5EAE687F259BC982B6A384D35440F7C693CF50B9ECAC0B5578CAEE87588B56
-2EB6B7F42034C9F2E545EC866316552354EB3728C7D26527ED75174EAF635E048B08DC5D23E88981
-070AD5641A652F2344956E9CF4C16E652A99F4A644D1787D6D36537489DA4D74E61B2FC4DFDF1D1D
-9D58F9C26C5EB63200526AFD168AC57D5611ADE4D4A382FC28BB60F9E7D626A6C67AFBCCD1183C5E
-3CF2EF210D0BF5CFA7BB10FA3887BDD4CD96EEEAA8F9219AA2F10ABC0A960C3B57C0EC0313AE10CC
-FF1F522124CFC8D2D49BFBB0C193EAFFC5B48FB3FF30B21CB76F0A4C0F1377C9223145BB0468A5D7
-1B9BC25873EA12E1C60334571C67385C00D0B570D3FFC6C7FF0DE62C183C76AEEB12DFFEE1459E0F
-C818C621B8D12FA1357E2B55D48935D70BF140B4CFFE8813DEFD479350B20DC2EB1D3CBB1A2D3DC6
-EE975D58C89D61FC50E6A0197DA9A586B72255023DE47DABEFB11E8AA02414C2FF6258A281219B9D
-DDFE41BA7D7977D0D6F18224FE22F7D4E9355FDB35BF7ED3418F4F68D093AC48F7D8FE4194FEB6C8
-0B9DC1F74E023C604DEA27089F98C3973FF9F4AD7BF7BAE601DB89B08D5D8139B95EDCF6C885FFA8
-B3E4B0477E7040225733826BACFD1EC4A0DD72DC41734856AB9FB700DF83CA2CE812913BD142D84C
-5C83C0B2583768198AF9E885F2BA74877A414233207234AA5F18840557CA11682AABDE8993533887
-7C6D404BDE4153C9827EB16D66C1D73A8143C8A2D3604FF72CE579FAA3C5224BAC48EA83BA848429
-9472007DE96466B5B29ACC7C03B05DCAA38A48BFF9F214DE43146AE4E04FA705421917F99BC54533
-F0EBC01849E396216B9F0794E6F6C6B61B52EF1B1950C0FB609895C3C55FF574163FC8B6B09E66AB
-AED1810E698FF37CC1F926B2CDA3B48C7D77790EBD2D514B6F385D397F713EC3AD3954EA9C846158
-6031D369E8B99E53408A79D64C34EB5A56DE8A67DE91837960E98A66FC04DFA0EBDE21DB003234BB
-78665B039D0A469A0221BD541AF7149A2A659C300132C14581EF766FFFBECBA8B58A5EB3F95446DE
-F49AF863A8113D17B2E7E6ECDEAFC3834D4DF900E3475596E86FBB4E2974C090DB4AD61A737D611D
-92B4535AC291C56AD8B1C031D2F9B505BB77517B737D70AB3723DB52AE2ACCD5DD2F617423ED3CC3
-9CA882EF41757BF7151806A9B8B0F312808863E3673FB54DE939B35CDECA7FBC4DC3BDF5A5F47D35
-E345916C39366C8B4F439CE1C6F1835C320BD1E67375B03B5DE18C93256F251761A4C8CEC01019C0
-68E34447BCC503B9571FE8000627A6B3DAD5854CBC0A2D69E5A8F46BC78F6A7B1422334EC7A98ABE
-FE9B83E01DCF3C6C9273B346F3240EA225AE4A4083CC7B0EA141A0773FDE940768358EB4B13D82AA
-304A1386D450C1C0C6A7D5A8FD2BD313F78F85248B5196241E31E5595F3BC01F37700A2DD3D4A0EE
-2DD01A36569CD507130E8F5B1E96CB560BB7DA15560CCADF3B2C9804A11D9E8055C9EC70E48C1D21
-3EB756A1376F2EDCB7189D78CD3D6CA5865537EEC31C17D801605EFD860B0B629472690588D02575
-02C6F7A75B9A1C1B397781329832CF3EC43C09F1559CD562C48FA9500295CD3B0A790DD3FCD4684A
-7C7AC49AC9BFFF36B39A9FB148BC28D37907433943CBBF0CBDAB46D3EA86DC8F81C859C52D15302B
-94A9B51C199B7104DEEC9D769C2634CECF8B700CE9C04152CC59C9326BDACBEC4312DEED92DD087A
-1C4840868D9F97CAC046581F762F75E8D24D6445370A3F1E0AE74A6478D9DAC37E7FA5BEBEC0A1E0
-81AF89C1BBF7F51E3E2E22C8C405E8671BA85F1BF0DF79A465DAC7EC07F731E00632E017D190A99D
-83E27E5C2E63D7DABBA23B2E88334C63721AC5A4CBC5D45F4C177259F34C2EADE01FA008AF65EBC6
-01D8DD16436D86AA94C99F3CC0A2F87134E73BF22F108B825A8963B49C6C685474AFE4A542C8641D
-C0375D7EFE9AC1168D9700459BE52D0DA399023E141969F25C0DAC4668534B6647EC85454BE945E8
-26B26DE6E3C4584B97A38E2B40A0D23481BCA78084FE80E00A71A790BF31DF468A435ECC88E60A57
-860BBCA3D65930186E9917CBD209C230E8F8255A7ABC7D3F043AE4D7AD63D9980BEDF062B7D5C298
-C40225B6D03F29A0339E0FCA02138E526F06B9EF47F5E7A8068A846CFDE2BFDEBD24F5A73A66C079
-18662AEC80B43246284FA4E2EE0D9AAB172B1E59A6CC46B801149D8C0DF6DEC9A55D8E1B0EFD9D30
-2FF618075944CCCB6831D336B11617107B0530D09885E5CA11A5F1FCC8D69D603DA16BEA51116D42
-CAB1AA1E4D7B9B4D79993F2BFE53EAC904FEB70B2D330A89780EAC10D12CC0C35B8399F218AC2976
-E57A26BAD20CE2FA2AE2363D3FD2A8A971747556F2959DA74A8963C20B504711AE1CB0D0C02457FF
-2E9BF696B159AF031DD5155F21C0F5549B0471A3C5DC8918B675CEBCB23E29322B959ABC05283A70
-2E878DE8EF25EA760F3C5C7B7B49D398283DE2ED837FD59F7C22D62C58FE4448B1049FDEBFC8787E
-67D7DAFE9774979BB3802254DA59BCC0219F98C219F84D995CA768B8B5D9D4A32525DFECE003675E
-E4BD5D8DFFC11025AF2B468F9207B5B2B42349B98232BAC0759758C1F4A283405815BD7145C93FA0
-8F3ED2826655053A3C2559073D8ACD199DEA2C5BA5F616A2E48548B4370EC73493BA07E197165DCA
-774438B0766867819C1154D1959FE6E01E6312E0AB91FC2E2BD240FC8652A2D456A1DE7F34EF372A
-53794D4C4E050BF3CA5B7BD2F1B8DE93B4C8002485CB219AD2D029739FD3C81CC6E78EDF38723576
-1A57143EEDE5CC887F282FECD261F6A25D0A7E154ECDF5DC38E426811BE86AAA458577E5E0C5F0F7
-5AAFA9C41E5D1DC9D91ECD79B514F8CDF7A5F1A189470D35FDF4F9B8788879CCBD91B427822ED658
-389E981E0EE5F7FB87692A3E3E931DF8A1D1573E3B0166204240B7080089A09EF7487C9AEE2D665F
-5A82F94C877FB5B0DC531CEBF1E71C6592CEA2401E4B5122E5091DF03D203DF979B9A6EFBA12E2F6
-B422FDF15D49AC0914D372D21E871DE65CBECD105FD4A3E4714B9CCA5C6803FA39DBB015EA8A88BE
-7913502E562E5B170B87BFC8572DC9DF49AD63694311EF1334444BDF0B4CA3245271C1F7A4D7FAF1
-703E3AA0E1EA8D5C6E821B28707EE0C9B4F22F23796FE87356C58AE2CADC191F4C58E1FB58DA03B4
-5A25AC95DBAE13A293474217BDB214742B9D9D6AF35F70FED2891942EACE3E625E55FFB820543FBB
-250A062D3D395BC0F219ECFE0D76686AC148BC41476A887BC494DDBD396BE200FD3E03CFA12EC9AF
-6B934A283C42AA05589AA6B4A8D16946BB51F50419CABECEAEC5AEF9085C9989289E9B46BAFB6FB2
-782D84DE2B068F91A9744AAB237CEB1BA513E57E4C307108E993C972A3E0A898D5A8D27833155031
-FDB98863C3BE7FEF3004CBAA5CB60A1F2E3EB4D7290FF5FAFA088B1CECCB6CF51A58DAAD998F0839
-6CDFD68F5ABC9C1CCB8F6514107773C69C26873E889D1F79D10E866910E4684186FCD71C965ADF62
-39BA3418B313A27AD632300969B6F284519366ED85E7CD968D64823F8C59B5911A72D0A20EB72B60
-3A61E36F52F256FFCDF706B4560B4DFA5D918FBC530D83A4B3C01BDD3CB4572E24242D141BF9E775
-36693A0407D002E09CDA5B195BF1CCF430AE9824C07928A050D0B460F2704BE8F9E647A4884C4567
-0A81EACF7CC038643EB0FF18A376FF6F32B6FE4F197273327FBBDEC6443A299CAD4B26F7778A99F6
-5A11BDE047153E764039EDB251936AA43DEE50DDFDF8856519056AAFC4C5AE6F2051AF0579A9ACD4
-1D00775D7DBE70022CC263DCA5E0A25B9C7C4F5C418587666B2FE24816B1E0EC92F9074F1403BB83
-AFC3F1D52CA79C387BDEF864366E34C90BE52F7AA09935373A07E4E026224E76F9EC3CB9E7EDE50D
-EFDA48248D61F3CEC880A3B8843306375D9711E58645F3625BDB8E87052DA67F9794EF4AF8DB0BCF
-E00677C3A26907DC651BC838C40EC39E2B5A5DC0DBD345944A6C32226089D63C52490FA10B215AE7
-03CFB663EB8A47793B84CE7364DA1C4E7FCE32DFEF09490121222774915BA59C78C2275F829D15CF
-4D8686B095C38C731B83D48738C25F40B8ADD487C350A2EBE846C3916AE384CB1050F9F5DFE09FCB
-D9129C6270FD86D55A459618FDFA4F907E6B4746196BB717865AB378414029017551161A52E9D24B
-E4F7EED553A927933D4ABC8F25DF607779A717909CB4D810DE8F5762581900E224E4B91598149BA4
-71CF8068ABE8744356B261600BFCC57FB8BE45036CF6571D9B2A95304933BD4F17215F8EF53F8E08
-1AF61FA7F9583C34EB5655CB0ECB82246959F09091F36989EBDD646BEDCA614B9A61AB7696B3FF18
-1058A150FA6EC1BE2EBC7F64357A3FF2A2B0491D2F4E0B970DE5B7788B467CA678039B5EF55C88A3
-84578D427FD2CB16C87B0BF0A3D37CE8ED43E0F049AF2436344D5F47C948C632C94A287509282561
-6C64C5D262FE5B24916FFEE982A69A6CCF888BD01D62EA591EEC51F4B7DDFAFFBEEA93FE08D736C2
-0129E345D06B10246A5F57151C198D407730713F32299638EFBDC01367E23EB59AAD42A83AB41B43
-2DB462652E29813740F4680A5D4BD47B18328FAE6BDF4200CFA4CE3773809B45E8887C9B2E423698
-9F6C48D64F5986F563D9A7538A8716082F81936AEBD0461E6F4BD470436D8B7656F0FDF89108E6DD
-02ABDEF907731D458D690BC608EA9CED09EB1E6E64C0790C7A2378201CE997FFE0317679EE1D4EE9
-F91157449323E53B4ADA8096CD628B5861BF794543A98F2FA2AB54FF0F25A13DAD43DAF9394329B9
-5AA53CA32749FECB0B2BC035DD1EBD53FF9FB5AD8BCE06CD89E5568091C1CC314CFB1D9821D7F9AC
-7C55F55E0A16E39A87D43148201B928F3C42B110FC056189DEF183745F3B637441DE8BD4C3C7EF12
-F4258E306B2877ADAEC63441010750DB4E6269A4C78A0AC01BB3603C386651FE814031CB5D8C1F14
-9EEAFF652A53E57BBD4C8C0CE36A84A319A53BC1E5FD3F1ED1EE72F4C1A9BF264B594062FCAFB22C
-C1FDE3F2E3D3C17DD3F7FE0E15EBD812D550227C06D01127385374A11438ABD50048E17255FCD2BB
-85122A6FB9B7DA9D5E9DE8A747FAE0DA45A1FCEFE92B9E70A5B2CAC668D4D07527A5C1403267D823
-048BE671F725CFC7474B44FC5AAA348420B2D7C23C6CA066666FD6F2208E329878D90CEF1C2E77ED
-22D3BEBB9D547810B189F08920A27E7107F208591A84D463CE2576C70C3DFE6643E4EA93F4E1DAEB
-41D46F0E2F56FC10C69AD5034FC9859D31CF27A3A1EE256C93111F81C11ACF1FC0CE20B90BAC9AA3
-27A5C85A7985B951519FD4B03C40BE637162AF41B2FDA68F0D1E9B7602FE2659D3D75955C579AC51
-DF6A552EB9581AC3F712F083F19B52A6C4F560F36C59CEEB0C996AAF1728A2AA45DCAD79BD7B23AB
-388D5B0B64A2B95154B6259B730B0F4A72C8C7F7CC93C7D64D9D8810D1F63FF8ABD4DB89824E2D26
-4FDEE916C41E299211DB1A53256E1DB5CDD04862F034D9404B73183A99D3D13D642A663F129B6D16
-7095BEB4EAEFD03DF2FF2F0B6B594C1EE90FDB203DA89FACEE23F1BA3901FECC75FE1811BD701259
-343011262B6A0A9707AAA6316BC3C17F787BB80AC8DA5AAC942D90F80C5A3BB59E47EC767244AA95
-C63E50BF809998957936D3BF6ABC24B0A397258F9EB4DC8F65692CB023D9091FB180C69498CD0C08
-BBEBADC84A7E0016E8F8BEA325D924EB0DF82E75D2CC2CCBF039B11934363D4332C5FBC5EC556BE8
-5EE4E707CC2753CCC43D2ED50558E51A104221C9323CDCB0199B7B83454DE3FDC810D0F362C0299F
-5DD981B31D8E3DDA284FEF9DC8F9C8DE138D3065437A7FE8C30572AD06D62E8527AD37AE39AAB0B2
-25F76A25F6C6505241ED73BA494CF923E919F688DDEBF193E188F8C4C154F21631080763B4D091E8
-AD1D2FD6649E0CD9360E8D1A67A5B5FAFC67547CA31C95A5EA8D4EB5D68B9F6D6532DB9B54584735
-9558542A2AE58C09F3BD2918EFBE1699E9C8F2C2A11EA4D224C726D2ACD4A8D8ABAEDC6588CF2AE5
-66528B94F55B823A2A1F7BE19000F3E7579D094E047075DF18C8C868760295533B26EB3ED90635B1
-29C17ACA679C3E88B06998CE5A7A2544B700229F5A6A504BD3E45B276471959C8A3F81917A534287
-39B5EF9E3D463B3BA7318448E2A3E79520D2D245A2A72F31FF7070B6E4624E3A5E216BD103640C8D
-F387E49D732529C611F8B971073F17EBD2F6EB18F9B74A67E1997926DF178D4C9EDED435B9682F1A
-279C81BB9F60DAFE125845A2FF3B02979E5481C78A45C479BEFB9FEF3CE2BA9BC46C77B50B03E48D
-A6D17B76F06F3AD118371ADC69E178C52B5FB4B261C9311874ED07DD6D5B3226A005FDD7A6D53848
-09E7063F036CDEA41619122635E835D2D74CBB6AA9B38CAA4D819C26E95115FE0DBAB4198FC5838F
-2C91B7A87B07D734C6D4F4F83444C1E90AA9BFC908A2BAC4B3DEF9157AFCA5248F2DA31CA87BD363
-AC25E9E77F741D4B2C6E02F04987A6F49D30E9038CEFC41BA172DD675AED8B392164411144E5B738
-F3210B0E66B17A13CB9631C33D44484E792A7C082DD0A5382F34C5637653261B1EB6D2035B08B4D9
-1FA9AB770CAF40A103629511F7B43F2743D7E583433DECFB19C21FD4FD0AFCC22A4119E77C87BFE6
-FE50068B22479015BE5A9F06BEAB4D37412E062A45E0CBCD7BB39FEE747E96306F79FC4F2E8942DF
-5D9DA0E55AACCDA547DA19D30B8404FA121298B44C9CCE198C708C69A8D6BF17591C5C50D3FC5BE6
-961F7ABA8F366DAE957A1C3730DA4A5B4F035A9274675EE3BBF0CA8CE9D8349F50CABB1C3EA4948A
-BE6F9F143592F1EA95404E6909A909168E3279A957AE1924245C356331A75E7008BEE92BEAA304BA
-40B7C3F48F74D9018B3247DF50EBD7CE541DA48ECCB1B0BE51A455C3C13C279D4D8676078C3EBE43
-08748D52C9B041D3E7244C745B1F2F742D010A9E60695F3EC4FDC1050AC082B905D6A57E8F407A3B
-472F731011A5798965B7B1A307E252FE02C8F79CEEDDEB6E165F1A94D7FFF18DDBDF79477F14E9E9
-3981ABD200FE7771B29D1D2D120EE79D28B9543818527039AC74085EAFF241B56D08220C958B5D9C
-87C0C04A14D52AFD475B542D391BC54FF33DEF8D9484AFF6873BEED32DDA4B371112B523B6CE22B4
-0D1B416B64C9370F1CDF2C548F4CCBE9E12E21C36CC3EA52DA232DCFB65F66B22B5E2EC04852510D
-5E264EE939BB67AEC4764B87062AEB7F680B40BCEE04AD45C7519EB3B6199C9E0E332661463647F2
-FB7EDF303EFEF84891CEBCF0FAC5F723A9D0476C3F8C092604C87FC69C7A90F4D64AE45A478EE8BA
-2DF50FB93F55A3546123F0B0E2C1C40C98EAAE9F0F26B8F80FFE6E6B94B7E27D2884D58B8A119662
-2DF6BE608C5569D7864BB756DF2EDD184B90812B44ED4A32D001C31383A40AEEE9743651F7950846
-15C48E402DBC01C818D477EAC0347795CB2792E9C11E8FD4A02E194EED1C919D4598FEC003B6D9A8
-A0BC7D456047A1C0579453FC1D7CB2D158D466939A23D7A7B8ABED7E2777EC7487973E73F2266D9C
-250CE30729E3C5223AD93B9AE8443B35711E446A3DC660123ED45CE1942A1A2AD0610467E081CE2C
-8B92A6C82F0B17B5D2429E99F1A6268072C6B5AAAA6EB6283A872C54D3694CD825EB2926E57DBBC7
-C1663075E687A144E4D61C225781D80FCAE1497B442342B4A3F1CD6BDB50E31791CC3928C30835FE
-F845B6BE5E2D7E3F2F5F085AA3FAEB45CAD0D76BCBB1ED859A9CEBB9F7457036F0BC3F195CB1A98C
-9C8648F6583CDBB23894BC719D68C2DBD8003B10D08C8CAA40BCE784D7BFB4EEC9EA5359AC056E57
-B8B0F2EBCB1F4CE40C87FC7861180133E0CB6CE2FC4FE690756D327A2B5AE063E3021C0C0BD420D0
-56F0B941E6B36088A55BA11D0C35FD0132D5F48E5D9673572347171B4328D4807B972831C0D74CFF
-A5638C145B89C989E6EC942148207D6DB82257585958034D9F9D4221C7C9F7013790DBD130F277E0
-BC88BB179DD09E27062379ED06F25EEA8B7FB33C35861A0034776E3813D2E9E5C10E227CC569AB36
-CB2D9DF2E7B7B44758F9DC4FFAD7A24AC7E9F47AA850C221048C3CB35A37CE8EA75632AE65FE3212
-175146FECD6334AE3D3C5F492F067F795E1E8FF386BA198CB74F0BB4DC0000DA383BC4CC3F070DE1
-7721431988D69C8B1A5AFDCCC83C22E16A87E01C6D3E79DC7AFA3DB0371B0866EFB8B6F88900472A
-FEF1C4A878243C52D4E02E82658979731C841C489A6B97E271C4C93800EC7D91F93EB9B9C659A554
-E1FCE42A5EC65AC39190EF4B66DEAF6FC0569A000A9E1495F42F706FBEA4D32EB7EF11A648910259
-6A65CF899C2F322F5679C6D123469192A9BF1A7F1F2C81C554ADB97BD19ADB746A4F81A4D5559E60
-AB94C483DBABF6CE2F28CDB412D50FF3FCFA3B3DAAACC6A83CFED910CCB3B8D2C19590AFF4D75303
-4A6CE7F4156896A13808E0DFEAC547E69D3C886691728E4A35ACD575B40D721E8FCC5385A2EB28D7
-08101DC50811529528F5CB0C009BA7E3C88468E37768FB0D83895AB54DB2DD5426562AF9D8AF304B
-F6EDA54E9C92643DF926F5C3578269750120302A37CB140A18BA56BA01108D4ACACE8FEAE640A6C6
-958EF156B588ADB0EA5F3B0F37BBA12B7BCB221C811415387B024B7076FA4403A3AD6EBB5D9C26EF
-EBDB7ADE7C60B444AB9F90EA493B658B7767AE2BE649BDBB3FE85F460F1ED137C61BD95F7CD3D8B0
-15CE45138538930AB62AA0E54B4CE1A5EC5FEC0A2B28B345B67089A4E4AE14D2E1F5A9C8848DA688
-CA298F93860649EC3AAFEF3E820D86988C8E3E5A4D4BB937791827994AA3E81D0BB3EE115EC36D5F
-B9A392D09E79AF514D11C7B3A03C9F9C13355CE79E119A19177FFDCA34704D38118A8976D1EE5AA0
-2D14FEB1414419F5E85244ADC5C0A765A522EEF36170064BB19FEE3B5F7B441E4DB967DAE0BAC2C4
-8FC6A836E0EF5A69F073BEE1699F55E9C757EBD6FD8B514E2B49D6333815B7DBD1E0694695FCA3D2
-1320A0C4B852D9706DADD8369A95FDD917328BE93DD33818954DBD2C212D2CA81560ED5BC284EB04
-7A5F389E24E43F4FA8C97FECF46589FA7341076555CF55B1C21B28E0C1CBB00AB8B6F67472F27BC0
-D11148F407824B0159B5188D4BB7386FBDBF1C0FAF34721B7BCB5C0FCB7C4010DCB6A1284E9D7883
-9E3C2111A05D29AB7997073B590A81C6168020F1D48951BC7D8476D5BA593F4F23CAC1F9BB0E091E
-84B4E99E5C584D1370DD12DEE8DF16AF8BC6B7B23E2FEABDB7F32779AF8E2B5094A6E9B7A7225F24
-C43A8E5D2B977E1E19E633C26771E23017ED233DBB02C64F8CF03992C6484528D0C8464B46F24F9E
-8380F385D5D01B8893C67FC103498983CF939432AA380CA576D09030CD52FD99BDC3BE16C7204CDC
-3365BF76294A83A1FC14A236F5FE5321904E779B13232A76F8FE521F425562678436359C2461BEA5
-AB27209541F557AE2AA60009C9CA0A9FC7898C14306CE35A50017BADEFDECBBF94EE2905220706DC
-806409EF87DB1D73EAB0698AD2DB72CDCDB293E7FB13C94D9FC87E74502E6927A212F0D7D2F2D194
-64F7A66AC07872E18CB1DDE8F11835DCBC5C4EF039333FFFC0FC1456DAADE7DAE3EC2EE0D3415B0C
-ABB69FC5006F4D14A4EE1A5CA99AD4D5E629C0DD1E0F097B5B93DE2DD001A8C418234C9C45E8C13D
-1AE04E9466DAB8CF1ECB88A4E059C111A6468D2DABB90DA79C7C79E94DB28F6968B1A632F8C57D9E
-565FF91C6916026FFAC0661856B9FB8DE9C81661816221B1FC159CFEF1751E7E403F5F2CE32529DD
-540792FC17A12A3DCD7C50D38EEAADBD10ADBF5D8A82442AA900CE6150EB7A4639DD9FB6E385B2FD
-093493DCCD9014B23EB172E21AA89643A6CAD1093343D85D81261972DE0ACB16A4C6B5F0BE4C978B
-FA12D3CAF0134F9EA49F6E9687C8F99A456745EA252F0BA9968C7F9586E3DD841AA92DC7705BDD68
-2DAE41518A09DF0E209F321D7FA3417202F4BA76A984DA3ADDBC58136885362F02F0A24EBC439B3D
-BBDACFFD8498EBD29F88F016B1FEABC10785438EAC860B554525F3266097A675299AA0967BD3B7A0
-EEEE3FC578D1BE99D3533BD91571AED904BFC9DA1A1451FDC5406E1CD614E0C7FBC733563CD6CE6C
-C31E9237CA153F1F0411114361D731636BCF98555ABF12848AD109371A42B63675A4130B81E97C2A
-2EE2BB5D8FAE2640156001AF0F55D9D5DF8FF23C8AEFE14F120000F14149A36E5C94CD9081DEC277
-C2C34870D05011F99D48B0875A5FF542F067F7E9880109F586BCF2B50522A1F23ECE44349E539E70
-F84E207DC9BEC7CDF856A046F1A03226AA41F541719AD1AF88FF211E57DD0C1275DD0B7B47440DA0
-89B98C6EE92A7D94700B83CEBE19EAEDD8A615F6587587BA8BBA3CE3AA5E8EAFB1FB0F486BE3609B
-169EFB178A4292F4C0378AFE5D24EED1CAAB514DDC66C696D8E37F294A6579131DDF5488E9436609
-ACD750C3DB0A940C84FE022B22ADC2676F62E91E8F891225F891FBA537679B24547BBBF35F04915D
-20B11739F620D18B5B216921D222F15044368569AA302980B9225BB839F494588481B94B0C724352
-B2DF600A22B062561D86CB8F81514FBDAA4F8A043A0265F992FAB71FC9124A45B8475E1EF3DF6B6D
-E35CF329777D45F08325E8505EC0D979F542807AE77E57E453525F23BC59A50740371EFA98678AEE
-6C425374AEB745B99DDB5D8D908FDB551FBC0DB15832107BBECC4E11A1A8DEC69358A574A2ED46CC
-31D564549EFF23102D92BFDCBB2BB985F78F36033E34F59C0EBAFA3BDD71338736464CEFDBA91398
-33995EDA4207BFD4A9867D32E867FBEB7DE60D132803EF9347CB17BD91315484EF6570892297DD8B
-7D966103339535E28A00CB1EECA4A9775F60A9F5FC9BD8B06D78FE8E6318C31DA2E847E3F9CA587C
-B01AE2BA0A2EBDE308314413F4F230A758184ED60D4F71F6CEC22A93A01B6C54E0449A3860FCA895
-4A347B7588329A80974ECBECDA1070FBC055666375229F13DD995E99265DF870BC8B8CC6347FADBC
-1A6AF64599271A475B9123493D46BEC41289BEEB67EB97A8DED7A9C9730D37C65164CFBDC22E5CA5
-89D2E7954C7136EF4E084C43A6C7F361A3E96989239BDDB9A593CC2A80BA16DE9EE90E95CD39393C
-212AB22EECB677FD36D34DEB46C4AD0D21BF7E6D7CBD0C8083842FCD87B18FEA7CECF939987E99BA
-34C214E44DD84C176C9CC5A4CEA76D380CB316BB4EF9DE73D73B4AFD4ADB54451591DEF86621D138
-D5A0A29441502BF6C2ADE671CEC3CB5CAB903A657EB2D70C943F976C110E46C5D9D29BC00A875F27
-38E5D22496A43E096E009C5D3CB724B4CABB32838DBE527F83B18CB457E57B092C302EE557FD4F00
-DB9C56E66C9FDF4EC9FFAAB85F60D02BA79694FABA476A199A0331C30A78A92E10417BA236E23364
-8174C826331DC1BAB87C5F95027846130C6A2B4027930EBF9A97BA1B039D386FC51C302648E25980
-212F6A582CDE2778C677A01FBFB3C5D1B8A374ADAF6ADBF7DC94075F25ED66D440B3922C5F255FB2
-3FD8F6E21EA65B1D93BB225684B50F11310E242B087575973345B229BA62C1E2C35BDAEC04D10148
-F5B2F3BCF7399BDFDF1F3F79119714AEA697245BC647316EA157484ECB951BE367234FD02E8B1F09
-1AAC3D29BF282DFF4011BC0CBA8E55234D943DB3017CC7A766720BBC29B2D097A956C0F1067177F0
-12D42ADCB473CDE8D1BA35B4030757FA1D8211989DF3BD22CE5D501C21EF8708FB3449DF47D88650
-9FF7B59B76C0DBAE443F336FEE2D615D7EED1C284F14335BC8A26BF4621E10DE9611FB2F1DBD52E4
-B7565D8C65B54EA36D508BCF0C578A49A2665227CDE1F9768EFE847F9D94F1BBB7DB83701C232198
-5C7283D47B2E40B27A268428AAEFE75F6B2F8764A8494E5827573758CB9CA46FA93208836BCCC8B5
-564A69F5AD882052AF1C1417C3FA7F580569528682C77080F3688B65E7FC24D2A3AEB61574B4A321
-5927281544DDD7A6EE0A3E9388F8F631CE7251724DF70726E5912DDCCC8C652DD6C9608F8462303D
-867F589DE0F2F71711B35142EE6EF93B64D6326C4DD7DC83278E057100EE772082E6BA368ED91A55
-53ECFE2293A481E42F83BC8F9148C70EACE91F7B7D9CB8A72415BDB3AF66F68EA733A17ABE9DB005
-3BF148629132969589F38D30EABFA96A01FAC72650B5A6FF3935670198A1EA33810A9B11E330EB8B
-451F24F93544263436F669AB5A90A53B16CCEEAC36B1445574EFA7E802DE73522BE725E68704822C
-B7D3912717333367895BBFBE06966A5CC653AAB5E9B3596702086BF0010085B900711932A95ACF15
-CA4DC45A754EA334E9EB84D6FC8E3FC4F897456BED64BB93B593549FF0D5352275D8E417172A6664
-C5E0ECED1019494A7ED49AB0B965BEC1A82E5873766BB38D7D856049CCE2FCA65AAF61E961B60634
-E2A69EF059754C9D8163D87F928C222772D070D83FEC6FA5AC734AF65E40BFDE521F7D9CB1650FDF
-64754BFF21EA3FF0AF7611A93D525EC9B28C51AFECB04E7FC8323DD6C9B0D8539A34FC3CD8CEB795
-8E8EBBFED4313C77ED469C199552A9FF70BA5423B03B6148D4EAAE17B71C5B39DC436AC53D6BA8A7
-AD81AA8B02335A8B2B11E9F4FA913159A725B8AB60F52F1A2EA50EAF4D56656E615BF382CC68A690
-BF83DFF24FE986570ADC0290ED1A37C1C2AD469CE789E0EA0BB5CE01020100E729721AF3B5BADD33
-A2DAA6C33EB8F9064F5292F715F820B4BBFDD56F76D42E7A1A068C1CBDCE4640082F6E7D582D1939
-990CE6EE8D270015A2C461798B37DCB5798EE9F7512168B76D26C28BE4A49A1BF96C89D235F21A1D
-B6A96E5DA474D0B19B808D13D7A11BF39EA8647499C410ED9894A1ADF33D41B6FC2E614D8087F4C8
-4E437B136F3CB32DB8393C49177A0675A0C9E7EECEF448A97AFDBE840FA01FC7E5F2E8FECEDC1884
-84C312E8635CD79195475DDBFDD4D38D5A0246DE2C7F21608F8D2C0DA1371D302E941572E5792A3C
-F4E51A33228B93A814D03FD4FC223C314CF3714BB3A34BD4F7ED6348577FEED9DEB082C4049E57B5
-D3CDB7F26629E9F3BA36893E09E3C7463D02A22D7056BE76B87763260E46E48BB832B7EE13F8DC05
-37EC8E81E9BDFEAD8C27EBDF1AD706933EFD11131E12814F236EBB01BE85B7F1B2D627413B324918
-D247604F56EC128909873FEC3857028BEF76A3494364C2A7002D104D486236C30B48E2B75D851C34
-EA50BA7FFEB4E19190898AE21768C157C0CAC628A2181A32796FBC1A7271D2473CD88E5395DDBDB1
-FC3AA8DF0F3D588637F19A8B833AFDEB5F655A8838EECD684E2315B72C75CEEFBCEF94344ACE8D6A
-DBE355008EC72FE7CEEAB01363A895F4E73F867639BE0A0BE67333848816B05B419221BE8F9066C3
-62C23FE85B7F392930BFE4C12B9526FF2FDEC38F23A159ED61A0718E7115C24597D849FA76369153
-54A40C965D4D72EC94DA61A03766AB39AAB684E134FD1407A5B1B19BFEBA52AA0DA5D99CBE5C82DB
-AA663711E6DEBA180E1D4A39C320516A4350D296BC19BF1BE054859A0889C7E9727A021F3176FE62
-0FB0C837E4141FECE531A950C03D319E3255703220B7185BD20FE5DBA673F8129AB211EFCF36EE39
-4C7E00EB0876624BC840FA86E58B2F584754CB6BFDFD76810E300741EBE4544E5AC17413ADEB21C6
-2F66CA4F075C32381796BA709782DE34A675B717A2C7F6D88104CB924FDE5DF775B4F0B68E0E2E5C
-2F788BBDEAF06D8E1FC2105CCBBD5827C0B03FD6CD64F0D073F3192D5F94839644E5EC6C5185BADC
-F04112A65F49A8C83174A9AE958E76A2F5AF469E8B76C833782C5FFB8BD7B1BBBB3EA0CB7C9786C3
-BE2ADE5E7AFA8C8F20892659A59BC421E28845A108E34EE17864042EF587A6D67DECDFB3F510EB40
-D2229585347A0035670FCC76C2837A4E4D68304FE113C539B35C1F0234B5079B8E32934546982978
-C5E4DF955A454EA263C3CA5D7101F31A318D82A3F9FCB5A8AFD7A65209663B0FC9DA400B26F285EF
-46D0E1EAF8ACB1F1CB805E3986D04BC585073FC64895E4DAE1CCB749BB439CB32EA91176D5C39C36
-50D10AFB9C9884D5FB90183424CEE67EF2175D01D2478D67511EC9F54F88763C152697B06D948BED
-49240096EEE3D06AB4575E8E8B2CB8263B5BCF4FA1608720F52B675309833071879DF52C3EC2871D
-20F398B5CAC8F8A4D41D0F1D47584DD90DCDAEA4A1CF160C4B3BF1AAB890B5CEB6CB3488672AA68F
-BD938281DBC1D8BCFE92FBF514DA5358443CB6E0147254E91B38CE6787B2BB0DEDD2D38F5938737A
-977B5EA42892520C58F8FBB53C994B57382379E9490F0D6970B980E1BDF8CF9F4C3C5E0A18F66E86
-EE93FFE7FE546DE50F41364BCB3721B637072571FA1779F1D672FAD260C16D7F13CBDF3E4376E7FF
-56D2A710AC5AC35FCBDBCE2C9C17E523BBE6218617B13C1FA6679B308979AE7C61DA6E68369324C6
-CBC7DDEC364E5A86707266C0B459EE7B2C03FE584E529BFFDCE98C90A2F3D9305AA74D3ED8430DBF
-3A49FE2ECFD9C4BC9FEFD22618FE9C8A973AD072AB6F713E4DF02DCDA7AC5359B2D652013E131B76
-B3ED6C75FD53BA58D862846264627F6B9E70D8800F6D9B32242B747A67BB2B45675840D34F852AA8
-062FA6B01E31ED24DAE02F6CF788A17F7B9368175195DB0072259CCE0FFB2C1035C1D26E1777CCA3
-D56A827C3242069E76D6DD69B653768614B9ACFF16567FEA61508D51454BC02F6C60F755AEF6AFAE
-3536BBFA1823F8E1A53C41124DE983E51CEC92AEF4F99785D554488A51C20885346D1F761DA79017
-940A0C557D93F1DB6B3D00FFD61D08E96FF3AFCE5FEDF545CC9F47A2B1BB26713431D6D1E47FD6BD
-6E3C668B0368241F0EBB5FA9C991DF79890E52E83A3675EE699B61BAF869DE91F67278F510061C6F
-E41DE2D883F48CD0E068E2A652B244128D82E5CD52F35F210DDAE3054691ED55A7D99088AAE8FB04
-F525C2084AC09F5EDF80A4EFAFE981F74C0DE9D194320709B3464F3FF2C0F6AAEA6D973D9C323F53
-DE3D741F698FBF01036716BBD62957CB32CD81D3A2674560FFBC5BDC5C6E4F547E589AD0B1CFE14F
-5E17FED1C4A8ABE4E67CCF8A49F32C4C6044F1431E1CC382E7758722A6D0DF9ED23E51F8AD14D11D
-7B6428E27443715EBA4E9C05D6F238378F9498AEF0E7EE4FE6856622CC8E6ED141EE5F109E343CB6
-695C4BE1E0F66601C27975983BF557C04ACFC19227A1AD7E6C44C00529FC7EDD7F886D24B7E029B9
-C395260088BBFB96972199A7B32796D27257DE83A7402291C14FECDF7998C5C96B1EDADE0280F856
-8A8F5007852EED303969180B3329917973C2D32C080C9765B6BAB0673BC7ECFDBBFBEA980C263843
-39B7F1052591D91667D4FEE413AFC23DE2D4B9DA742F4269C6C939F5FC32A38040730A018155AD73
-3F231E4D5B9D01C03A58EAE7B5F590CCFAF25EDC8552CFC8D95C60EBAE1837D7A97CA137E9D4A4BD
-2CD34AEFD68D64B3F4F62326AC429921D7FB3C235184FE0899690A0B775F1A566EC29D5830D32372
-6526F7E7F5AFDD71B77E07613DDC4FC63EDF49051AEB59E6337AC0A4B6DD872E776C9CD0CCB86130
-5322D816732124F5978A86C186BF0A0F88E733CE38E4D7C1BA5378C5629B1EFC97806059990ED42C
-5CD183BAD7E94070E4058569DA2E51831FFE0D080301AEAB4350BA290318AEC582C78D05DD92E5AF
-B4424EA808629BC972E68F4FF2489C245593F07555CA6A2B25964794CF31CBD3AE5C229AB9B8C298
-06C01D116EBD0FF0F159ED2D3D7DFC73EAB4910BFF5B0B0B587CD9EA6E6FC45D63C09766224D8346
-1F0588140B258B1729F70BAE7962189B1554483392988CF230AF4077193E53330519394DD99BA135
-6D4730AB221DC6A66019BFAE564893DDAD7B177DADD16ADD21D396CFA6C3DC818052E2F71149FD59
-4A16DE0C2FFDD366C99B486C55A6E991E4D22CCB15843F0C3363676AF2F5B2D1B7EF66CCF2F12DC5
-0D63776BFFB058D70A9C76DCE96C754872D72C82A0C33F90D49C935402CDD26B6D743B1F43BED5D8
-B539424849C1495DAE73044E885A7D0F307F1816DF6244A6F2D97BFD4E200E93F69B08AF39EA21E6
-E347A47CEEBF803F73B978ADBFCF056789BB8E6E2563DE87DD9A8C877157B934102DCEDAC54D487A
-1BB2694F0034093C48F10A17D32E2BDD0C723CAF59ADDD1BE373AF8C9BEB4415AA5AF36310C31F24
-354A53C0B962573148BEF91D994FE3F3D8450DD4D686725799F53C373A0A3E3C060C2E1A3E800504
-9F26D716E1F381B9F83125E4683264A07E2D8938F605978E2513DD2050B3D8A1012797CBA8961632
-BED260916338A812AE751C7B657E086A0C7DDCD3BFDDFF3E48B84751925736D1310C4910FC114387
-F3ED7FE163F91895EBF55FCB425CEF5729D99BD8F2C072E36C310523E75CD8E5DE49C031C4263410
-9D56E91A46C8C8E89FD92012A00C33D0DEC52597B5C6933291A7BDC5CEDA95DCDA5600F9AE1C8250
-54E7EE1067458CCB66610704C58E4A4FC0CB5FC933D0322A716B2CD430A3AD48DAB3D4CBE9D23F2D
-092368CFC4E1F5495C133A92942EC62118D45C17723646E69407B4A89DCDFD2AB3FFC099A21D9D29
-741D68270629AA3A414FE58658DC9170C247B6E23F35C4BC5FF83009F462F2EEF4DBAC5FD158A658
-57F9B6DC1F5192DFB169DCB65621CAB2F1B07BD22F4155A8E9E2B6388D430FDE5EC1C834D22EA035
-C52E1E34482EADC36B4CAE902AAE89A7284E62B3C84B608D6BD05F75BC31310B2DD3B2C08A00E073
-7F104F03A41989D5F6B9A2C38B22F1D1803EE5D7A4D8DE44E4ABD496A1DE0C0E12C4BC96D0122846
-3F0EA9CE9509FEE987139F3DD3F9D0DF4313F555BE85433718F6D05F197C41A9D9C7A8B0D2740196
-82D49F58DD5F66B12A6520D9F226D1DF1F1B65CDFA261F980CA25A92645B86B64606293F8BFDE364
-C47D2AF2C709BBE77A70A5712F2CC26F3D66F5BE2C307A48E6F887F681D30121E32BBD87271B5DC4
-615D28C309F15AD263FB37424E56DDA6E17B998B45BE6C7FC6C28E3394A8764C9EB2DF5C06626593
-B5C665D550D4600172791CD208AE9F37BC082B0B242B0A504B751B18F4D7495172B697EE217834A8
-A4FB7CC16D6F9E8BB400BE8AEB0850960283DCE725249FCC4DE97D9886745AB6066C3E2F64DD8AB7
-9AA11667F11188D7965DC11EB760B772E282DBF13249F31986AC6898FEBFE23E3E8B8D2C33E00EA6
-FC493850ECB2E6D831D1EFCA3C2EC8EE2E394599091ED58BEDE97D7A43B6F739EB0F845EAC1DF6B1
-EBFE876009CC5D804B15ED4B56761B3CE1AF59C07B49DC798A44532297AD73D5101ED47F36A3678F
-818297CC27F6AAA2AACCC9AA9B6F5459911D8C56CF499E390AE607F3790450B2B9C9BE0F006EDA0C
-715B5CA0481734CFB0597478E7602B0D2C1E4F78F03C68C17C70E4B42D7D2D3C95CF40F73488B371
-8E2CB05A549944D86944D78724E266C3319AF89AE430E777E95F0D792B1C654306E421F3D63A26B2
-1E74B6E8B21B2E2B9DC596D013CDA16D08E65E8F24A84B12B2BADC653E6E1110DE2E709C1C1BED13
-707B70A421B384F20CA7A9A9D20324DD383F28B2D3C7A9C53F5D4C6B7C378D26DF11CF55238BE1B2
-4FA70DCC178DAD3D35670FE4919085EB1CD905971D76A368FDFCF9D2F0A23739851A3A6D2E02D65D
-54DEE69ED5D81315D3EA5E356F94EF256DD267FD1E1A9EDC9CD63E743F299BCC4A4506233B8DD765
-2CA067F741603F93250C087D368F9E9CC4CC1A6DED567487C05BAA992B0056A77F630A72008E3946
-15A9DB24FE56A956650EC9DE90A6C2259189440247970541CA198748928215C0E132A81AA13208D8
-63C1FE817F70CA573B54577D10B73100AF8EA088208A44FB92ACA314AE5879706180788C17BB1D0B
-81B6B95A1C4E0F9EA66F9B39BFE12444A6446691A7BDB03E0F03D9F07A10A7598F2166F108529F34
-CD90E601FFED3479ABCFCBDE8F051C348E48C61D95B00C59EA1287423F05666C3D36288844067E83
-E14F6B5210842C742B89F13ACD126B9FC50ABE2CA7D7ED513D43B6AC7F41EEDA416BFFFCC5C844AB
-2D23D4DC09B2D510504CE98D02E72020D9E669DDAA344C63A1B75632F912A1C0DA3885DA4AF7E243
-E4A4C6493D6595BB6D56B0359106957259E59E336BAAF35BD1CEC5CDE735272EBCCAE8D4904AEBD2
-B32610C6FEA2B69941D6542ECB44D71092A3CF067708A3D087AE99FF29671AB7DD8758759B971A08
-AE1BAD78270D2FBEE37AA2DCB119D72F6C7B0C8509018A70D0B0BE2C6830EF8E0B24B1CE1141EF87
-3A4D7DCC501F808BFD94E4DC0F2915AA023076BCC8006490A43685EA25AAFC187302EBDE7FE1965A
-04A5A398985D29F08E085127B56B057334D88EB638A4DDE64AFD204974C3939536B1B66A54B4DB81
-151853915718F70813F096CC1B0EA25E363B49264C2AD17158A4489F91453FBEDBDE15D7B74D7F98
-E81DF23251785D58295BA297F295AA6248A912CDD4F1111E6B628EECBB5139709E76EA4AB743CEC8
-26621D08E6BC64691CC90B3C3C1778931A28D3D5B1E20E96C643316613FC487C9B604C43463FA453
-3BCA1236286E6F5A6EEB2F1D9C34BDDE4595495A365F88055D9268541CF1654ACF478D384A5496A8
-772EA1402751A093582A6625A0A44816B5FDBE166835D598644296249B92CC90AA3FD6445C9A19BF
-27F59CB0616C7306070F33C7DF4E1DE64AC8C5BB2FFAC1EF2B1B30E5A0275E6004CF64BBE2C6710E
-DCFC3AA4ADD60106334708862FFA6652825BC84842736E47AE6917180365C75B27505EED3C6108E9
-898A780E20C3F606A860229AC46D0471ACA0187D6D539A1B8820F620F72B41AD1D3BF3834BF48CA2
-AFEA8BF535AF74C4562DEADCB63D2F5C7585722B77C989342D190FF926C8A5263B4F25286F99CF6F
-C62EE6E2AD61C82B29D82468AC10FD27764278E5558CE8B41BA111CB2F040914451A480C93084237
-CAC8F66BB7C6689F340B8ABF0150E06D5B1177278A4C08742FE22F42C28680F190900344ADFA486D
-59718C25D37275BCE4DF981AAC35D2C7E85C72A0188B8953CFA516FD545AEE0BF4B8BA301CFDE214
-4241FBDF3D204E3D2823301572E23F204C97305A82401660E12926EE7BA6EA1A81FF5C007933AFC7
-3266FAC4C134ED818A48E7DA01C71A46335C845F9DA5E960B25339D551582B375814148D94CFB781
-FC56093827B78578A73D4FF67B6B87F40CFA5E3F4325D9108CDB64BD06427B88C84105187316FA29
-90B4E3E8EDB6C78ABF164F4A9717D523794B2FE772A04DABBE688CCA977090979B5F47CEB90A1DBC
-167D305EAB231C9F4260C4AD10889CB785169902FC0BED78DA15B8417453BB65856EA0BEA5245BA0
-573F623D215F6C0CF801851C305B355D26B52B0B343645FE25C78A3526841EDA480919A1BBE5F56F
-C10ABEAA3E1FCCA7C43EE560F067F1AA2AFD642F769D1ACE8E2AAAF38850F0D757CD808C921D716E
-96FBC07DA7860DFA70CEAE2888C0ED3CBF9586443532B68DAED9A926655C157A416C383A53D8F283
-2A4E67468112A09ADC837ED8EC95F70852921F50D4417239FC42EE3624CA97F682745CC5E76CC7C6
-7BD99F2180F8C0B7FB49539C8CC474C25C0DDE491671FF329E51BCFA779346D4686835A3AD6633FC
-B5E0F67E0CA9CED8F215BEF4D240453EB2EDD6ADB22278AA5B985FA140C9834D38753DF2014F8C0E
-E6DAD19E8FC54C03C1F6CB0F858986691D99592562CAD95FA0A5B2ABE4A8B54B457D42E8C33A2D19
-51C0419A72FB94FDA78ECD92BD2A1416459E9DECA9469F35E4C47DB531726DEE8F203D7042EDB32F
-025DF3D582547BB1D45F7A5B70D317DF4EBB16E36B0D798E0932FD2A85B04FD67143E4B287A50416
-2C1F5A037CCD780088C5476385AF8168E12D97D44B0630621759173C8F1E3006B5B1C6D7138B7EEF
-C3CC5F54E24B2C3CA7B41AACFD25E554880AAF406EA4C3C6E21D3B550B040FB1952598A7E8E6488F
-E38288B2AEB6C4718338598A2BFE4D2B9D14C65732DA304C16FF3E1F8F03046EF095B65FD609DA87
-EC24A69278BFE65C905CD0329F6A486B8525B7EEA4F7AE56C2633CD83543269E8ACD6D71F500D82F
-DFBDE7F7F7B1AEE67328549232E26CA55085B6E84D9E2E7F74068F93A90C4654F2F396E57C5F76F7
-E61CBBE523DBFBA6E76638BBA3064DA025A79E3A294FE7F1CC28A3B4C57DD6FDC48E541A85534B25
-E1BC11B4F78019457239EAEFD4BE9007D205F1D985F389DB22400B279C10948551A6B4A17FBDA0FF
-C9428B18B43DC76EFB15FC2182216F1B60B4E344A03AD6C00F141EF99F89F24C819C3E32877A927D
-84C2D006940F39CA8B71E5951673EA9BFD1749923219DE38929ECAA9CE43B06CFA7DA1BBEDFDA56C
-61FF6C24F40E59B13870D5FDEB82D981154FAE5D6D5152DE69339359461A41A9713B6BBE47E868C9
-33CD74C75DB71D13BAE4DEC85E02FAA14EAD6C0A253B16C79514657B15E68CCFF9EE6AA385CFF9E2
-C53D9AE40F85C793E4E8FF50B2B7420F4FE69807BC5F37C3E300E6B3C3549D1D3246A2E70F091054
-1135BDF805E0A698E236B6496702D061241687B7B8D1A0E517DF0476DA09D89667A7AB375FD2672D
-CBAB8124E511502DDBD08BA04D941DF1CEBDCCF7ED48405CBCC33774A68C5212FC6F132641FF413C
-984F8B43BDFD7B1A2A3435F15AF07EF4970D3E4A0BB947C181E9CA27CC14A35BD1BD096875B45873
-8CA244F88C28728B74E25CB8C4FC1095A56CA75E4569AD3082EF194ADD11350DB3B74B96761D4538
-596FF7243B1E1B724716A144106E080D42036444FD472998460CE9ABBD05B42AF9389AC452BDBBA3
-A13A96890025789F16B9D92251FD3B3BEB2C61EDDB370A20456E3BFE5F4039E2557C451C524F8087
-015BAF3FF05F51869FB97512968BDB2B49589C1C7AF1E085250A47657465F480B7023E24C76731AC
-0EAB6704123D77977D3A2C4C56B691346EBE589C619C04515D34F81FC6A17527D5D8319013C5D4FF
-27CC3925E24C99231AC7FB9EAF0BBA482D3B75807AC85D03CD09DE5D9AE0B07B7A813F0449786500
-0AE8A7E00080300F0AB8C399057EDDBA273DD2E1B2A0DCEFAD3B332E6D4AC1FFAD846167DFD70E03
-46DAF84AF292D4F424256ED5AC4E104F80697050D50844A708EAC9E7F7784FD01646F3BD0C595CA5
-1EE6BD607D254E78ADDC5E15C3B6AC4940EC865A5C23105B6BE09EA09F2C05D6D76960A843B81EE4
-33977FAAC3CBDA85CDD2F4DB7C28293A77825635992AF8F3B38B4480D9A139B1662345A8ABE1634A
-77496C3F57597D2985E9E54717AB2E99CA35789441BCDDEDE9A9E2106B401D9684ADBEFE40D607F0
-75C179E9CC03E59E65430DB70B441D43DF03F2AA6FF06F224B6E455B01C64FB89EEC9103E48453A9
-749B4D602808C7E408A8903091D85E06AAF635D0D529C3CDD1B8479AC0F4208C284BB678A547F2BD
-77BB17C86D4560434F7AD1937760A6AA55B614CFA9FF8C9C96561AE6C8F2121C4E20237428BC51DF
-2099B6C49E3EFA18E6D439E6E6981E746EBB1DC461259D8EA0F8099C47CCA27B2D982B72C9A07CF2
-1B3C05D6E26E6E286E348B8944078E24809F9C5F3D014B4CBA02533F5621BFBA1F0EDB776C634746
-703C9F73BA89B1960A496420C68F54E5B901A6D733D7ACC79F275FFFB253F389AA480084468BB34D
-A1E797E43B7F6E8CAF5E8C93069A3A2730E57EC39B677BB73E3F07C2055599F7062E53B37A5F0099
-907D2ED87FF7A82C95FBAEB888033BDFD67BA3A6031A4CDC56CB1E4CF5B06B46E16D988BECCEFACB
-9E1C037023D7BF5CCF5D65AA66A17AB361BE7981F132A578F3ABFB97960A6034F052D9D5AFDC0679
-782EC90F240F943A5F9A3D969ED7399254FF67D89DF668F7C56FCEA1FFDCF20481474AC8495D3AF4
-B6D7EE093E369C057F0B70858220693B398ACF8E8143558132E4391405E30A73937C53402E459F4A
-A3539CF7A99A3F51C0307D045DF8B77757E92EA2F51BF0BB4F77D3904DD355665870C2B59F1ED7F8
-4FC71FDD7F0B6C5D3182DB77827CA6A2060D2B8C83C4EA4A432EF43A4D0A952CC6CBBE52A9F0CD66
-1A538973DE41FFE9C5CF55F2506B9EFEE51FBAE5E63BDCF5528499A47C031163C88D3022606784DE
-2F46A9C9235AEE3D4F71D4959B0CFDC5B7E78C8C0A8F9DC99440C2263DBACB343C5C648577F5610B
-50EAB1CF7FD02419EF3941C7CA0B0E64EBAD4B2CB05A0793DBC38F1946D44767BD287F5E9779C611
-CA0DAAA1E7393DBE0683C8D3455CDFEBC0E64B54B737E298DDA605227C0C4BBA87AA3EC7FA6EBAEC
-39E6EF2537D5974391D31739D9FC42983D81AEE44711C823F35F8E2321AC74943871739D2DBE9748
-FE68592263E7713F27E0D49B9B5CB7A4E55DE54E6B800D15856450FFD3AE5F287B12AE4F438B20AE
-9E27E6CAA00F3EAEADBE08432684FDF9931E925544A680182602A3C1997DE5D0630BD5A010535E66
-E1C123013D23966B3545C7431C39B97295BFA4099D14461004C42C85095EEACB9B47C593BC6DB863
-533A8619BAE09095DE8ECA432D4DDD49AA600D277E75DC3F5C6631E2A05382CB007825FADB77438D
-CFA78E252D79B6A196D5164C2FEB85D75ECA25FF80B1D97FE10E87960CA0FC47C41D3A213BF141B4
-8BC3AAA93FA86245064668394665BFD52D12C3BE4CE39EFD8111754398A944C3FD1AFA98EC337BAA
-AF899D35E804CF416AD7FE45FFF13FC6354007501043F98FE8428DE8013901BA6A28711A2CA85A27
-0BB135B72F1D5026E8217581860729E94F2F1878A0E96C59E9F62714FB5F8F25003DFC7347E99007
-8A9A331CB3A6A535BC61866F02513DEB982C4A13ADBFBAC3FF70A7335F40D5489E48E5EDEDEF1619
-1973D932479C62183B0E25EE8C4F76D4F1AE45DAEA4A12AEDD9EF81D248E8D19F8C8A5BECDD1EA1E
-98783EB7A38149170851B1942C96C53DE06DEF80913BFC04E539EC67C110498D15B78268853E5C72
-F485F8A27B768569E54241F6115875E2973292CF48FF91D45EBED627AE9F0766D22201B20AFDD40E
-5B17CF337F2999E0BD15B86E46EB3C18FC12B7DCADCF9DD50C6C7E3F37E615A892DB3F57E250A072
-A49F7277DD6A2C8042698233D35A699B17ECA5DBDA6D250ED4A16FCC893BF0DC2E33FB1EBD7DEDEA
-3C1C39603C8B7E1A5A833A8FCDD5570BD088749BB232615366687962C7E56ED089CD7B092505CAFA
-5A80F503C4CF337F07ADF0D106937E25670839D491F7BFF7A523DB609D126328C16113ECBCBF9C40
-04904427A108618AE5D4ED809F8CCAF72251104C94EC5BEE21F91B179D31DBA79CEEE5EC7FF698EB
-84AB1D2D1A624F58B3622A78844CE51498B2CEF38EAFE259D22C7BA61104651A862008BC1DDDA58C
-C45F663EB26428DAA85E7785363A69D2790996EF5D9621D53042F42F794962FEA46E46F37B8AD1FB
-76FC8D5CF2146843F8CC625139C75FB42DDA71A752BAC48F294E4C0C8289FC46DA5EFD9C91BDA6D0
-27518B7E81E8B21F755A9615627D5812ACA674D1527A1185EED4E3C628196E7D0759B1CAE6B9B7E9
-01E9599A65230F1EE469CD33B9BD9C104C44E3C1AB966C9678BD0AD78111A4E0F2D07A01A038CEDE
-7036D0534D684A1562A17AD64A00F279200C0371B1CBA61747671D2A21D3F9646CA290F6B82418A9
-6FA177C6278277504B7FBA936325F5FA124AB018A15DC18D2C5E8F93CDEEA52BEEDB78A57828D81A
-3E6C38B9FAF3DC4EB7273ECE3EA4482A1C6242A335862C2C3717F9C9ED95F77B140C4E1569B2192F
-C7DCF702D0BC9A50428EC406F8BD0CAF886B4D979320D3E429816D88F7C7146D960AC12E70F2CB7A
-9F4E3E366665AB3F1B4B6440F55EEA26DC9EE0096BB7763731740A537766490C8C174723BF0EB40C
-53701AAD12B21D436ADCE22203C1053A9DC4E9F17AE617888C4B4E6F3A720E4E6366BA628221A387
-D8AB15E04AD69387C310D3528BD2FAA5B22BFF3FA494F5FBFAC4F771C9C7402B95580C5AC4BB3AF6
-92A70CB2C851FA5CF1173EEC3EC29B5A05A0B728BBBB51D3B7AD8B0AF17A1563E82FAFD93F8B7118
-1FB7AFE352874F4EC6D334AB6747519AB8E847B7BCED33EB5458A828E074E74BA621BDCD03FEA604
-7F7B6ABDA01FC7514BA1AFF0D4D0C0CB8F4E42D5A87E395D9ACDD02CCC220C157153422018725846
-009A3ACD8C8CDDB66BC6836B4026FD9F526AA275D06C813179E5924F26A25094E7BDA8BD26AFC4CE
-B41D8964D4FC4AF1DFB0595BC5D6714C32F15DC7194E9A3A73013C45D8FA55CC0550A12D9AAE8E9F
-F199FA28EFC2426D8D1DEFB93A65717AF3EA8E2D5B4AA8EF0EF38E9600F7D4E7D9F1D67A2E63ECE4
-789FA74B159BFE2F91C19B0378BA52E93DF12830D99553B6618645E26126842AB70262D96E35E5E7
-50ECA0CE3458B3E51BEE2F21191136DFDBCA39BDC07939E521E4F492F392DEBD029C1EA237BD89AF
-76BC89F618D530160AB16269FA6B693CF14BDC4EC7C630025703C5337F61458FA09104EB15C7CB20
-AA4C9BDB7CEF3A09F25BC7F3149951A7CD75372993B80CD2112F7674CEFD6AFA764AA3486730D2C1
-897A264D82A91709FEC4A21E30D812F558451804EE6F3DEE2C4C437846BCBDA07C5B6CBA1D94AF02
-9163B7383CAC6E088AB1DC14ED3743EE77E26EA7AD3119A76C0B5F925C4DE305CD7BB3A09A453947
-5B9BD79BE28FC462D8718CE05F9D94CAF3387BA55E6E447BF81A9EDDD3A34E17BE66BC52B0C0BB6F
-86F6F008829173816D205182ED2ECED319864A796AB65D4E3950288BADA94FA32B6F453AFDFC6C39
-A4FCFE60353A64627E2057D4B379D3240012B3BB0ED0C7876CB83C1BA5EFB6E2A03F340C2B576731
-F848F762A7E1CCAF267EE06D621BC33FC245D0E1547ADC12CC0EB58B26BABDB8EAE9CBFBAB93836F
-FF22BDA1831DD01B7346AD377AA298D84628BF1C07433284B0A90FC89F5AEB2651BA2CEA405D4F52
-DDC0E74B871D43F71EB4ACE0D2B401F9348EAC3A2EF0AD295036BF6CF6F870D58E00B619D50EA7DD
-77BC28DEF91D805CD527DCBCFDC16C042BF9B874E3B1567EBA4C1E70744B9E7E5BD1FDA6A5FF6E10
-1613FBE58DC46CFAC1A65ADAF65E49757E9304E2AC9A91E0588600C709A61D4231730073A36D473F
-518A145E141D0A5A494441B9EA99AC23F60F54F8127B477E1CE698BB4129B4B1DFEEDF10D9E665C2
-47A62F112F5CA30B0AE5DBF3E495FF06EB28EB438CE8AAAD84D5F50FB56A3AF002C23BCF66ABC270
-7AC233FC0F2723DB99D2CFE7D3B3667732A531F5DC315CE74EDB9050BF75D29E6430F57CB6778B2A
-CBD57DFCEF896E6766C8FC5C9F9FBD701CD62CACF33EE0FC95E78DADD205B5F42CC63024624BAA0A
-B4DD447832B4E1DBA77BDFADD223989F8E958C8D759AAA37930664C6EFEC708116248A2A7AF3D656
-DDEAFD009B7F5333854608E67E5E588A857167ADF9225CF6C641F5E19C3E08678A281199EDDAC831
-B57223B1BEEADFDCBC8F6F25D32FCA2336C808162E8F381656E847FB6CB13969572425AA05AC830C
-33DE6E030F86A3A85D2A66A77F103C7042C97205526DC882EA9A00EB8BD5519847EB424C15F808A9
-1652A6CC89B66A5731126DEBADE123C63D88A2E550FACDEB3886FF98646000C64B3A91078012CA30
-904B71737CEF6BECABD43DD702880538F5A70085E6CC6015D2163681067C3D513A8C66032C34A0FE
-17A58AD4BC97CA69BF41F11D5E910FDFE9729652D3EA21F8DD8CC19160A8FC77573B1E9CEF4E790A
-79D8AD6723B6804E9616466C935303E063DEE29CAA6C3BAEBF278B818C2EC2F13ED645AB452397BF
-00DB8B26E115026E256746CD0C78A959364FDE6DEDDCD0F441A61A1EBA32C7BC172BB09512148D1E
-BAC9E791B7D51B71CAD2DC9B83B2F99B3726607D9CBE58B499A13753CE87FCDCE21C0AD0528ED0EF
-B9B2C927F57C78C626248AA2B835A0791244C5896686A66173EC9F802C4C633A42B086334D2A4878
-0E53D00809247BE64E529F96AD2F8B3922A6097D414DDE1EC76F9552F9B8D58B8E34F359AD792B2B
-E50C26DB05035E7497162E7C49C38D3CD9B98D620AA67492BE5AFCA3A81A7080185C7F0B5105223F
-1FA77805502A2E8C5FEEA27699858D84A95842C5F2FB68686D59FE24091FCDDE139B6463BC6C7B1E
-0E90D20A83651AF00C85797BB9F53ECEC1675C7EE636D0D9E77DBD8F89670F855EE4D4800FF3F695
-0EFF09BBF8A0DAF6B8242840CFA5BA73BEB95115F4A78BCC02D85ECCE0C0F2EF6F328AD1DD6CC049
-5A3315B414A4D61DA50DA46D7ACCEFF6EE56451805D26B0359AF193531F95F6589CEAD6FA041AF15
-3067F88A0A2FECD135C56682DB2B45A71D1FA737C064EE9A4F404BB72A70B3AF0330359393247EC7
-81512482579865240A23CD8479F21C2C44A119EBC4E81B308DD8AA86E60C3DD8ADA50E0DFE8308EB
-1A7F201EDE8DCFDA405AEFB47E0E6CA7DDB376DCB21D37F7ACC4D3E9F26B03A8DE0E8940CA3A9E75
-963A389DF8038D2C486072F61C0CEAF500753C7A6352B1CD0338D9212B42A4D3DA23D5BDF44C27C9
-4B88A415A3242FFE2E1B332477A21D2B9CE075EE479C6E657A4D8874A8C53964229310E01ED4F3C6
-86FEF5258EDF3B464DD6FFD7F1CAF473BBE722D60FB14AB4918E93878A8AE4773930B8CEE110F476
-7F42A52D9304C55BE12846C911A10AB9B2E036BF9DFD597F5348D42233315FA80D0F563C388BC253
-2103F05E90DBF1923F229F980A2F4585C7A373511372D07DCBACA583099EA972C03E5AA67E663882
-6DB134564DB993CEEB6E7A6659C7C5C05C310267D5F8A24EEC2D5CC3E3F3C808E6D6068D1A57646B
-37FABD98ECB7BAF99E7D9AC4414A491A73CA34C52F394352F6B5A15F0FC4D88622DAC694699C2464
-84ADAC3B1D366AFEDE2A2CD2042C90516A666A19A91C80248B11224BEDDF1A320E230739E755D098
-B6A67315535F4C187CFA67ED817A035056353FC859BF286317996FFFB478A2248B908FF12ABDE705
-402224A3EE5F463DD3D243875C84E02DB968ECA1CC52C75171EA50D6A88CA91327A7AA5795019F36
-C0A19C093A1C9D3723C7568F9D41F2E4FFB712FD47F897703D7A620B586B81936C84AAED61D84332
-B3BEBC4F95B796B93EF7A1F565C494F8A65EDB21E2EE18DC025522EF8E599887CA2836069CDDD889
-88E5862977B7472584303198CCE97EF9F9E1446D1F1F5ED1CFC666A8A0C3A03E1792EFB60A9B4065
-49E0DEDF6ACCDBD98742568B4735A747D8E5DE21E630125AE0C691D054E42199C15B1F80CAFA6E7B
-B2005F374A9A5F9900ABB7409CCD50C3AFCCAB1214E6A856F7C7EBA89BC3291801E1343DA9DAD2C6
-ED075C8ECA1423B43E587AEC67E6145272814B3F191B3C285639F9E2D6E148A02DC2CBC0E054D629
-5CD05DBAC1950400A9189316F0265B86A732D302C5BEE8ED233768F237C62600CBAAFF3A110D5EFB
-6CC7CA3B92D965CA7C5E8D3E64ECF239FE2507FC797FDBE54C1112B28D4DA44C60AB09D994C5BA78
-D663A2591934CC052BC70CD1DCA3325C66C9CB982E2039F5DB70C848D3DCEF655B1C2CD0CEC8865F
-E8E1C0A267BE4F707ECE6F5A3DFCA3CC1EDF92C760439F51AA69A4C1801E96CA4D6EA4AD980258F3
-D15C893913ABCE09101984C61B91D603053E49A97CB82FBA707DAE8AF1D579FD69C8481CB7B712CB
-CDDB4D287BE995E32C02B399602A08B9DD849039B5673F1930BEC7BF366EB082D2CA5DB2385C8CC4
-5BE3FC0E31820191A814EBA7C4F23B1938E6C4D800732787CD2CB97F762DFC85D4B798809B5F2254
-D826CA42B32695428D120298B44CF38494E56240B75DF1E41E46E53C44DC505452256DFEC819408D
-605FF14D6C1F3F152F2FEA96EA0AB3B472D8704E06BE9F8C3E8395CAADD06D6DA033E81ADE5DC3B8
-3DAFF743C6E9E48716003D358DF63CD7FD3E2F727D1F2D0C29962F76D5C95ED44B6F08D052025A66
-5785F264A3D5F5593677B630E628B5EA81FB37CFFD7A30B7FAD226B6FDC82B0878AF4C0EC4F4243A
-807B9839EA62BCBDF7C2E9B30A623876E632E084EBF4A21EDA04FC88A1C07021D0C72EC3E969D449
-FEB08E5826EC20E55B21EA71EA59F6E3B0710B0DDAB3261B4A2029ECAB68C19ADD5174E55D5E984A
-4E5F38F592A302FEE6ECE732DDE841A28672C620CC5D687455A5C06FA9FE688394A04F96312ED025
-B7AA6FBCE2925F3AE559CC1886BEECDB70822E2E5CA3F732A87404B1536AAC469989E9610CFA440A
-CE43875A70CA51F36CB6F629D9424C1E35A88F92D5DA3CD8CBAE6E8425A36968E21F4F30349749E0
-205BFF8D552837D6FC39532525370BBAC833F75F1854C93FC533A4AA53ADF7008173A70D94A4EBF5
-38EA9E62BCDA7C20E0A073BEE2EFAC34D2EF1D03BABD5147659E50B557045B2EB89DB303749B04D3
-F54B43FED612FCC68206E001A7AFE90230D9C12F74A32C7EDB5D0241DC3A5D51481FD7C8FAE08FEE
-263FBCED7C7D911B3A303C835AF5FADFD218F61A9D6DE80485ABCA88200047B094441F7767B97A24
-E8C612590FA2407BAB1E8B56C71914EEF2355DD97CFAFCC192BC06FCE063D3D9D1A629AADC75E3BF
-207234C208E7E30663EDD691043065C9CBC473D97C6D4DD3DFF59D6A9ABCDD4412C3128F603160AA
-D8F81C6E7A4DCAF35F3A99B4EA10A34375B477C2BF846521A7EABD4D28078E9340452A198F3F5ACC
-3DB7E3908939FF6E3709C6A3FD9889439A4AE3E10B618CC92E14B68429A3AD2C80940A1079452EC2
-66F254657BE7D79A2A24084AF73F6DF71FBCD32BF6913A3FAB25F977787F7BB0C3A3E8BAB38D7A2D
-B0B4826950643DD1E03BD7DD1FB149A33862A89226B7CB454DAF613128C2075470E42E70A9444A8E
-6ECA526345AB48E6F5160BA23B5BDDFDA6049EC44ED1461C7E0DD514B16E2FB285F72039DE3C7982
-EFD40D7F6C8E8F4CF35AC71B467BFC578002E8D2239A2FD2C4BCCDD8AF3D7DB1F4AE7F2D2E0811DF
-9D0155BA6EDE50B5F052F14F6AB884FFF244D8806C07EBCB49ED22D85DF696995991A954AA97A1EC
-D86ACD76E061B7541E87997FEF0657A826BD88EF3A4A5920462C6595E7A156F453291CA044CED810
-860C3B0149BCE73BECA713040664AD0591304106129600AF71317B0D2907839CEAC99515D357E980
-B1937B6E1200AACADA205421001F1B2F91753E80D2263C56AA164A74701A8D5FD28E46480B0DD963
-A683A1F355D7FB4463C7347C94EA5E2CA40B60B56297CB22D972C5BB10E56715A955605256C1541D
-9F3BC5768A6F355CD3B863F0FA1A781EDB49368F51B29481CBB41D4AEB07AF9DBE8F52C5D0FF75F7
-FB6431D37D6AED84D78C778871CB0F715B4F07580F23B586C969C81B471FF6A6C7276F7E141E02A8
-584D4B9AB00E7BD643D2C3FAAA299B1F1E25048461952EA42D4882768A70DE46B213A287F8D31AC4
-6D5436F22A796C05D1FE50A9BC2A928066627A0D87DD57A3AD91DB446404B41557D1457873482005
-EA20916BBE46C613F456C849D46BA79D20627B446B2F49E3FA309AE14F8C420CFD94922CBC0FB9D3
-5A0F7DBEF577F1849A1A80E0011DA8AC082A8C6F61658E65AD177ABDF23EE17C8CF0D26B9FA3A6E9
-4837EB9E930336889767A8D7EA3CE980A8EA95528B004957BE6067CD9BD8E02A0F23CC1762CCA656
-D33412FF45E917FD4A03EB6E8C1F43FDB0A8965A33B4FD26BC24A20B304CA817E88495BA9B361A3E
-933717FFB0271F7F70C5D3CBA1E86D0F51BF3ABA194DAF32C35C796627D00C7B2271ACE2463E37E9
-7B3C826CF3DB60028F240F9452CBE08F7EBCC5FDB1BCBB3C327A9F450B9E5671916101D6E3E5E458
-CA31F04D12F592F83BADA2C3683D3886AA3B403963AB5DBE220FEC00037A745839F67A3635DFD3BF
-F08F367482962DED88ECF6322852D643A54D5D303EB04BFDDEE9BBA1EBCCBA7C653B3A613A8E719A
-DEBE3CE1BD7E754E5F4977E863E3C2D388A65227B451D4F3A4F94E06513CBA4AC1F2F511613FF035
-611684CCC461599000E546E4D972CA6960E095A526E4735A23421A4C9B597ECE08AFA2753592BD16
-DED93255A1E33DEECE3C5EB77B94670E8137F2A4A4B98AC193258E7DEA5DB8408A806188F2D1DDC4
-40CCF0E9A6E2F0C78FDBD7B68DD4939D2458C1965BF8BED4564B32462FFF3EC892C03B11D3EA813F
-AB4CFBE8D3016329C5B7E3DFED0F08284D44AA0B7A2F6BC96EA4503E8EF52A64C22BED6B452581AE
-8FF8917D53976471941A9116A2D878FB2541B561767ABD4E31CCD8A590CA03494C62AFFD64EA0A1B
-C779173DAD84999C7A8D844EB1259DE7BB5B25CD023537A474A524EBE4660B22568949E624D8FEA0
-AD37F4CE1EC75955EEFA49C6BF1803BE87E9C9865FF3F6B8525B8C15FE8835CA153D27E6C0FF0CA5
-1029A7A9185D25F0F14D86FC797DCC1F99EE97E2054B9C2A2E06FDBEB8DEF6CDD368BF23A858D9F8
-C1DEFDCEAF1B4A8DE5EAFC604CECCF0D285BE00AA912EAB66EFF4D37AD2EFE34853BBFD87CE09B18
-749B489943EECAE7887B006FB827D10191DAD18466CD1F86505879310A8B171F902EA0C26A388E13
-B53C700272CEE2BFB47ACB58247C13449C6BB9D01232C32517358F1A3DE064D43C18F8827D53789C
-CF3CE2EBE78949A6ABFA1A6B8414CE360A5E22AFB7D1DCE6F5A06182C3B984B4F9BB1A905A9D5A14
-83750A1DE0A857CD5C06945EB7D4A2A6BF1237F32A154FDC06D51A703D44FE052FD3C53E9E8F417B
-35D1C851F9203A8997521529F21AD8498F96930AA77EBAF82EE02A57BC77C792D9F220294B45F48E
-A8FD94E01CD25645D36D168923562F3FDC93CB79DD4760DA0C103C2675722D7A1B79FCB4245ED12F
-A0DB52492C9CCE58B333CFEE822812F7DCA68E802C451B5CFAEBAC608B950386B6C58239D1C62D62
-4DD5D15782FC552222CCA06DDF387B373E32C3C2864C63C768350C37283760F3515A5B0AFD66C48A
-B522EB3E808C061F5CD6BD96CD18C9839D30508E7D4EDB88E8F11E31E10919B16B7971F06D7877A0
-58D8A4944C84FC6CAEDF3341B48B6E0D3C7B85D710E0C35F5B5053CF4B4798B3778CC28B2DC7AE0D
-F3A49F9F3BCD8E95D746C35C3F47D68B8AA35D97AA08E711B5FBE70D1A623C82541EBDC51A827D0A
-69E6C049087AD26F256EB7577F58CCFFBCCBA5A95D093DC29464C9A38DE95BC6B1853963B2DEB0B5
-7AD1248D6F1625E115EEB9510B5772AAE4E3C866657DB0B3BF0E0AC345E116F8D4976B770876FFE3
-748C36165522991F46A36F193DD1A1C94713673C7E4C81582391B636C72DE94CE6254374F99B623E
-5686C13D8A8322E83E11BB0B0A896C6A8C2C4F756C5385CD7017F26D23F7C3EE97372C868C8C9155
-81723BB6B76B4C3CE8998E4FA6CA40B633DFDAA59BA902A4952DA90EC4FC3CF0F2676ACFA7F76F78
-236FA2DE10FD3545357215246BB7E527F277C28B353CC6D79DCEF21BCC8F77603CDD58A2CCDDBE3A
-9802F941CED8E035313875319548C41992A2BE939A17CC109426E33825AE59BCD17CB19F50D972FF
-CBE7D9B4B0BB095303D9DC9D406696C2508D6CE99E11CF00F6461147E97449ED5F486D480A86D3A7
-ACECB7E9A945984724EFC21C5079B1FD03ED803C2DEAFCE3327D2D7827715FD65D9506216C88B0FA
-26935E95C64114A51919D419038B1A7E9C1E829FBFB53275093752DF19891A97F3CBF7719C1FD6CB
-17019A6D2D25360ECA804C4B35172662CC4769D2B785C6C87E5A4ECCE31704E59F71263B7C3CAEC8
-ACB4C7426EC25F11A0042323EE6C3EEB04284DBAE2C770BC419DCE79BD4560AEA41571C3B595F525
-60191DC7A8FBF63D413A77A0905E517441B16C2B501EA2F9E99CC38D052679F288FDF1894542E3A6
-6989A0090185EB2E75134BFA3D9147C3DB8A621D9D35E37786853779E157B47F71626D6B3E633005
-9159C17596C1B87FE2B4FF47ED9D78FA4C2160077276C8B58CEF5DC030B4A5D83CF257096C047FE6
-4DE307C598B815058E72D5F57DF5C369E664E137DE29349E2F9DCD8C9F4EBA6E765B6327D7A20DFC
-B20711273FD8091CBA605C4C494248076F7E03DF65A6A50164980BBBB708741E5BF6056E6F996DC0
-7FFF408C5B8EAB8DCEC315E92873228C805D4440A6470E3EE3983758DD211C9CECDBFAA4C9300CBA
-00608A4B2404A3C7AF017A3B7E67F39F0B51ACF950D3E75CC7BC2B8D3480202FA958E8EE0B240501
-5232EE0D264C7CA02C18CA45CB3C2DE322D3EB7F00F9455DB6C5B1F4E59C3E95520EC36D7D903CBB
-625D70B54BF6F8255E412604BBB29FEE026CC660577F91DB1DB4A613EEEFB20CF7AE3CD89D565AC8
-38416B01B5DE4FFA5550D17FB51FBBEBE21CF1D56038863EE931B90DEC2E211ED42BA92EC244D4CE
-2C4EC5CA87A026992772DC2AF754FC982B94F36EA7B7BF75E0ECE90CBB2A6AA1A012E8898BD679C2
-3CB3827C35D5D02F0569C7AA82615D4AA67518ECF668D3B57D6EF1A8013424AC2268BA0D9A74D588
-79EDCF6382A89D397864940303EAEC45A38304BA8B1CB198967AE23EB81054BE74B16909A405E8A7
-799CEE3C270FE2A6DC50BD7370B6B2C8FDB9A87D88D5D40348D3984E39C693B6F4486D994778607A
-80A3122872DD65E40492107C71C3CF708A9717E9EEFAFBDDC239C53AA9645B711038E59C8B861B37
-411AB2039BEDF9CFD00F08D9C5D76154427FF5DD39878CECC5D7BFB3F1F035087185C0981F3C2139
-BE84872FFAD3408531C4EA9387B89F5E3EC779E8850D50992DFDCF9132BC551E985943B07618AC10
-D1150451F0844C0DC41D6E17EB508DC8689EC726400D5A7F6FEB3CC7BCE05F09228B7CB2C5393664
-D8DD9A4B96B1020EF25D70AA2D91CAE93AFB5F2BF0AA18CA5C599FA1A708EF35BF8F7FFEC9AFC1F2
-42870D028B2B1459063B493943EF1283829783E1010242E5CF4DA39D93D506F3892936E7D6CF1124
-70A521D397438733D053944CFF12D6FFAE8246F20618684F263715AA98E15D72A526383E05C23214
-B78338E5B476F0981D90056E6E5D0DB66B1DF2298E597B2ABE1D817E18BEB056E65EDB4234342D96
-00470B1420C9210419D834E431B82F58608C87AC361A02D0F1FE4B470A3D71E0D21BB87E1023D428
-E23D596CB9E1A2184403A16E36E644BCCF9BBDE27290485057E62827283E7380AF786BF395B3961B
-A5EA469C315763FA59E0F176EF81985F38B882DE56A74D128E256D1B89939728E55A92ABA21A6B78
-44FAC1BA7BBDD8B34A18194A2984B000380FE9F672E83EFDBF276FE797A325815B0F25CC95C97A9D
-ACF56D583486305D7C9E51A7E337D14E3B900333EB38FD93A99587DA2341B10C059C71CE080FE753
-3C0F059FA40E560AF9C4A41A4BE6FB45846FF8F78165E10B4AD40F264BCF5596A1E8EF8CB6EA4B1A
-3A5C69059AB1563843679ECB2511A90E8898F54295649CB73D277760D8D04ABACC7BCC6E777A0530
-E2067CCBC08673F9C8C178F9D672AC8A15E5367F0C5651B53E75E0CFA57C931746AE1A679C246D7C
-9417F1CD89DDDBD1173C2F880B7B3847CBCCEBF99F7122E832D7C9BAFE2B54CBAA1ED48158DE3F36
-238B76B0E67644A28AEA996DDC006F6AC0242E4B667639E7523CBC90A0561193C1AF34481C2EF402
-EE43A82E1EBF4E3D601BB36B2D95CD93550D61CEE7A94E72F6D30C32C8F91A61E964B1F66ACFC398
-7F95D4028F116E9A9A8474AA29C1C1A984BE0E393BDC41DCEF6A6F1018DB60D52024899D8EB5D55D
-324D73F39BFA47377B9E15B3B06A7585589FCF52A54684173E5183367E7B0952DC4BC2767C4C6247
-B1D6103E52BC7B7EA6298F454C5D97AC575F19C10ACDFF4E10C7D3755CFAB4200CAC545269FF1D8D
-B0D607C7AD47F40DDF257AB4E7D0750577003C13E4941960C3DD7B0774DDAC18E8ABAF8F53E03CBE
-F6D57B44F24CF821014C064278FD51B3427593D17694B4ABCE81F49CBB984C5878CDF0C38D1ED7FD
-99B0B9A3BD8D8FF6219588B3B8FA59D0CDD1D9B2F65122AB45E48F1757467B9204926140E3C350C5
-A927A2E700173053EC35D3F1DA2D7258714C97FAA857F0898917BD94625C6D1E2D77138EFCAAAF51
-7B17FE187A2212C24A881A2C6A647DEF6376ED80AE4175C5EE80921F001995B44E49F0D33DD9075A
-CF33BB03671C0BCC34AD5784AD1CDFED3A6D9BA103B3DDC1CC2DE74DBB576A0277715275218CD19C
-A8899209125266D8BF1286F881DCC2C383749D1E768D670F4099F7DE959EDFE852583183C9111601
-2881A56A24AAF020EA45CD5F39660DEBCE30AC1C7B8CFC60387B1B0C3E361BE612FDFA9F01B7E4B4
-A18839A2C7E0E393EBC5AD9A8A4EBC316A740C1C295D9EF5F4DFFA0667F9582C0BB837B142C4CFC6
-B1798E9476D0631111033B8BA75A10FDC800E2AB1E0E829632F869CFE4737BE9E2800759EE0831DC
-7D1195EAF80555771981DD6DC6606812D92CB8EF86447F5F6C6F626D0E265C67E52A6319189EE349
-D48E49DFE6A9E98F76C414A1E3217AE0A215A17E54AA498F4ECDC50242ACC7E2322F63BB2FF2189D
-057E7354E32A3ED1803116176B9B9D0129930F919E2FEC280B2C8924E49E7BB75768A2EE1DA8ADBE
-D4E3589906DF1B923AEF84C1BD327438B731012E69BB0D43A1842CB88BB54EA4516477F704CFEB28
-6E3EA483445AD4D74586FCF32E96D366901084365F693A53C5FB532FBFE7BC0CADC404C4985042D6
-8DBB90A6DCDA3531EE324D558A214F935CD9FCC9A0CEBE9B5FB0323F4B3820529599EF48EE068B5A
-CE85004FEA2984F0A86F5AC9D56163BBFE1142B774148F1EB0A4DC89C3349052533A7DE66729DB24
-41B82F8F7360111DACF69293C9B281A0534F3E9E9224A75C49A832F28B2E497262475507B6DDFA9F
-01CA0A6696E3F5AC7EA68595EBA0C2EB8A47813FF936D84AC1B23ECA7AA2862B793CCBB0DF9FDD49
-31BEF354CEC12FBF478559FEC29F81ADF4452E83963E56541D31F3691C93A50F0BBA5E9552C4F2A2
-3A6E53060729854A3DD71CC4308B91957DB19E66AAA18FA67055A950F1C2CFF78A03BC1A588CF624
-696068068719AFB1001C4581EE072113882D9052B21E355D401ED8CD24D067B99E616BDA5A0A5A93
-36FC499632B79FF2FD0DEFB096EF46B75E2D4E0F48DAEA239719FEC4D9A29818F5875FC5041A9EDB
-D26CAF0ACE14CC80BA49BBA59E918EB3D8F1E541AA16026585A2F72DF7D83541816DE46981FB3EFD
-0C30E458CFAD04C79421AB7C4925E23AEA07F9F018431C790002596D26BD9663B51B699DF53E4882
-CBC34EDE88EB55045B889B6062E35FD1E018BCE785157B85EC3B9CA6C85D4B16238275385B8285DB
-012D8FB7C9F5B946A41D7A0FB878FF72C39683144D8A007CFF631B43748F2D5FC690300F9BC0C837
-006B92ECEBE0605E8C3A4A400E18AE8997D1B45FEE10068E247C647CF82C6DFBE5E881D511FFA687
-B7AEB78546BFD07D5F7EC242DCEF4930D8AAAD8C6152B6642AAC325963FD147F236BB850A9966573
-9D06CDBD7CA79A527DCF461E33F22BC9C5DB00DA2BD3DDDD8C99D99793BC98282AA8872FF96C3942
-85D82D9419EB78B6AE37A5F519397700F75D624A09BD255B576E955A323E784E8FC31131F003B0E3
-024A4F58FEF2A6C043796201FC425482E1155E229D1B2D43EF7B0D22322B22EF5C9A1BE026A1C3D3
-75EDAFF99597E1E5477952A4E8D2ACF5D014BC00DC2A272FA62B6983E27D228881E2EF2B8B95A681
-CBE90C5FDE16331C85222FE2A16F0A3C3000A63E2E21666C0C119F8AF89A543D37977069A5ACF155
-6324F05204CE8CAD50FF4FB630D9CBBFC324DEDA584AA56A99D3A76FF55BDC2C2EA3A021361CCD4A
-83C7A5E2768D210FA6DE889FD48A39D679C94EC3C99A8D33FF11377DA7F6F1B71A2A05B302ECDE95
-4F26773F39AC881542F0D0969C3995C3519A8EF70B4220D86BF01BEECC6462855E7B686E1AFF1CA9
-1FB8FD8B4A69E10EE0C2AD94ADD44449506F9B6EF43641F2026EFF6E605C670560C2B74706FB949A
-A7E8CC6A2D0D6207E457E7FD87EC1B9092DC68B9143947CC8ED14AFDDCBF8FDDA228A76847F96802
-E561F67CEEFDE45AE587673983FC04C96744DBAA83F2DC838D633943C75DCB9E6410474EB27B348F
-26E505F0AB90878940E846C5E9F3C5FE8C3558C3236B1B88C405716949B8506841CABE1717474BB7
-C30DB91CDEE33B0F844811762FAEC535BDCF84C1C747CEF9B1FA61D2AFB5A81335BC42C06A94D7D5
-9B7EDE55BCF6F9867AEE107555CDD084B7684C2C87087475A39A9DA6347BE281CE5635A4D07865BA
-98CE26C1465B1AB0343F49FF37B4D0CA9F3BB693D78DC3B21925CB996A038DCC172527FE57C07460
-EF39C07D4396E7FA970D9F22ABD21A9C794B64AD96762C7428F59A8757C36D6C4FFB23216195A04C
-2A2C2E7B10EF7193931544D782FEE4B91E01119C5553BBC6252270A8D8C56DD62D448F5AD8DC69CC
-B45E1F17F0AA1E445129DD00F000005B23D38DE93A3BE55A4C041947F36B4E4536E307D0180553F9
-2E46B743881CB5D5386C48C7D5F84C2BCD06B9C501F78C7EE61FA23516791FCF4DB278AF688A2E60
-10A56692AD92008497487EDFE4BD5FA083FA544138B20D6940020887E35D46E093B71F7A04A67460
-DC8116B4D4839625D7CA6959D6831CD93F81AC4EA2709036DD738364FDE71113BF22EBF13DFE1642
-E564701E6F0FFE7511EDF03FE448C2B28C64FB7D54B94CA576E481FA56B2B18AF10C71F699B6BFD4
-7459CDE1869D0FD306BF489A6F42E5B2F05CCF55BB6B9526973D19CB134CA7F13F1DB3716F8CC217
-73A832568C16250B5CDB16DF24BF81D49F5B37018BD310262EA7078107868AB0216CEC83CEFCAB1E
-9F2C665A31585CA04DC01879CAA79AAA5AB201B516F7052B01B16BEE5606098393B0E5D9F9E5E3F4
-EB20F63C958E796DF41CF28839F5C62A0431648745D7837B519F3AA36BC6C08EF040CCF53D9B6D8C
-0C7D1A84D707EC57A3C6AC9A62AB37251A01A5ED40FDEC6F5BE6E34C6A91D058319439778A2EE5D0
-363E2E1F33463C33327D05FFC0CBF08D5BC457C7230448972FB9B4D0D782BA7DBF10D3FFEF8BF523
-6EC16D4DD6D0D870D9D5EB5C64C9A46A4F583D4F831FEE74B0E5B33A09ABFD4444929BD8F638CD72
-EAB99CF2E9551DF427683964A592E49D186F285258C5D5F62196A98532421D73E3495F82695FEEC6
-E1952C562D546B28618FFAEEBEFF03A57F4D855021F85B0C7BC37FCC6DA9AECA099B646B99D41896
-09D3FF2D56422F8C37E97640293EC7C90E3380887836F4938FBF495CAC14FBA5648D89282D8D49D9
-1AF73ED36581139D8BD42551E263E830EA3C6EB381D85C42D74C50DB0CCAEC03F535ADE92128A016
-0E811C34748309AF7604919B66CD43EB5CA975302DCB6076FEB6BDD6FF55976FE990FB0CE9ABB11B
-195403FB26E3D6C6A0DE1C5BE79E171A61E21F79EE8DBE7A832519813EF6B33EA098C2C32ADEA219
-AB2AAC8B093F40000995539D1276D5F2EF84CCD099B71FE4269BDBDB6A8D59C86F7D2E3FBCCF8773
-D0FAE97640BC1AD43CB4B992BFADFB09DBD0CAAEB8CD9DA264187C4F97300E9A6C9DEED5525479E6
-05C65AE336CBBDF4E5D7F79AD098F977285E065579B748FEAA97F2A753E1F962FCAB68D72BAA8EE4
-FF6691C23E31BC0F3E981A96FB440404856AE1AB32A7205B17D411D8F21C8C93B704D07EC594422A
-BC368CDA2B1610CE6A973F4474E12B78B532666797F5755D269772C9F5400B3BFC6C58395D38527E
-2CCCF29B56123F7DCEF3BDE5DC1DFC5B0293BB125085B1D2D929BC3EE84F4FAD571A4991C3DEE03F
-2DB3A3097E52B1A7D5C73CCB6148EAC62E8E36DE9A71C57638C6E4D5D9DED18174E8C390E50B4A5B
-913C074EEAEBE390B214B3A68F02862B9A296DB4B409769649E51D738CBBDFB7702E15C73C2AFC6B
-C37CE15171F4E822CF20EFE55D9F061AA43E648989628FF79E65932390CBB15D8E621333B18B11C3
-BDF96F841D7434E01AD501FEA964A75B248A35CD9DF9A37E48A1E5A09C624B93CE44F0042FA00D7F
-9EE89B9F7AB785E9C718CF6E7228F743271C2C9BBA17E5208B920E44E765D99D86650EB454B0FAAA
-112753AA1BD3A24239E9C5FC47EEB1547AC9D23731B8DC48B9707830DAEC60C8D3790BBA1120F776
-4EFAC542CFFBCD5C05F9510B27B2534B704ECD36C8B041FD49A96881302FFF5B0163A2DD09C751D6
-D6AFEA9170A4F4C4AB8D46E62F763FE1BDA51DD1CE4A27E772F3A2869155F762FF26B7AA6FCFA4F1
-292E56F03AAB6322BF867E7710C34D43B5D85B45AA68014AD7879EED051B1933E491496E3E26D9AA
-8B80A07BF2B94F1077E84A9726F08199887D66DE7A307BF33C30DD9CF3DA188088C03B2BAD09A217
-6B110DB2C868B53DA9A66C85737BA66C93C58A259860E294AD0191E3A72C73F40B0BD98699AA08DA
-F03587B78F391F3A4313C58D9F29B53C70785637BD0C58310109C54091AB0A34CBB0C478613A7AC0
-FB8F0A8B4645AC966395D8BA775262CD291136AFFDDF01C1D83DD4EB3B59CCAD18057FE7D92A8CD4
-A58F22508D9FD7CF356571F701BBB23E749BDDCBF8A317FDA0AEFD952BB18545610FFAD3AC143D35
-1B8DB3F66293375E0E50235F0D0466932181D377EDD32A5F0FFA4E22B5A0CB4F343D9A7E4A342E9D
-09DFF6C697630CD3971802C277A5590B8CA94BDE6B38446C794D072BBCCB724D5BC208EEF1B018D7
-39373BB910D668882CAA779C2D686081DE6A2606417B54D7C20E0E7F722648D893E4EDBAE8F00D6A
-6DA3712F91AE860C756D1127D133AB828E9D80023B50B162C5A1C5CDF70CCB3FDD7EA060ED20838B
-E1E50C4094C9E79E1A0187CDF780CAF45A725964F004253E034C5BE46BBF89D94631F1A33BAA35B8
-4FA2A9D08481C6674126CD96ED05DCE48BDA069D902D6836D5DFBA701DC0F98A863E64F0E312145D
-8DC0B77F25B43AEC729A1243B45B08CA228DD6101CAA2AC5ADCC8EFF84A4CA3F254176C2CC711EE6
-C273835D0FD3528ECA2A976B88E51FE347FDB60F32370B66D338931D6581630ED586F349C638960C
-31AE4204E89521A96E1219E696B913DEB2AAB7A3B022D06F34FDFCB810A04E60A4FEBE284C2F063E
-0AE9EDF87704921CCFA193BDC912B747E13570066223A49F1F6E2AF0D4D65DA04CA876FF7A462FFC
-9C0BA2CC545C3BD36DBE762F32B2D6BE5867C59F479195C92440DC165098B74EA5C3AD93CDF2D410
-B04C16BC7801E7956F4E5107450787AA592493171C3628E6B8F49D4F8429EB98DC52EF025F001387
-BC1A7093F7A99F10B5D2D7DD8BBB393BF6E56F08F4F7FA1A343F220D5A1EAE7168C74D41BE1DC1A8
-3BD65B72B982F4F7B34F24F97F9EC9A91011064031FACFF2A14921A32024385F4E061CD07D152E74
-1BF97156D951A342488FA7F5EF934CCAD13E2753A0AB7A1F565C2F7F6B349DF03BBC25BBD972A9AD
-F809BB5C5048A8CCEF9297B2ED3324D18867F293CC66E88B3A39D107B610DFE79A3B4E83A96D3D52
-A17FE8A62C9FDD271130148366942C9CE57558D023DA5F7501319EBFA33DE9E6D1E76D7C20DB8A09
-B657839DA99F3D8143F1EE6253A3295C9651FA4366547893C2DC7ABCBF4BB7609DE5D001E0A36D9F
-FBE01F7D0903B3208AE8547E2E5F14EC1AF4C2535CA8F4EA37E3F3CE172C7A1E8308995B1CC23E6E
-81190246BCAB6E755BF868D449BB02A2AA87C44C9CC0F571ADC72547CEECBE104BB274B8AC16DCB7
-5D5F458D356466B921ACDEEAE384E2EB1DF6EF393B41B9747F0A4FAEB4AF1928D9AD6FB7E06FDC62
-1E4C6FC98CFB43F88584BD55D9B97CC9549093EDE586912161931162B1B1D52D0443260DABA02AF2
-B4432100D5506546013DA703573FA8013685CC798CE501960093DED713FFCCF89CA2B9106390198C
-29A00864108CDCC1984A8BAB53919028C01B26ECC7925E38CBE6CCA8978EE21C2B06E7B3E48FBA97
-8E2A7D186E563C088F84AA23178B60E4729EE87D67B1091F3B6973676C1CBFE6530EB773C62E2C24
-97014AB0E8B71A1F4E86A378AA26591511BEE3CF3D64C94848582E1354E1605B6457823F2C5E640A
-D3802946BB2E7E8E594E8C04B430C2385DD40746CE8534F50842E74D7115F3DB0C72D1C9C607C657
-3B094AEB73B7A79876CFFC3E2F8C9FEAAA07D3BFCE05B61F7749A8793BE90CCCECA2D7077F25E899
-D3331FE161A7E86C842495D584C6E4A0880B2951D8A13B88C4672080A0B1BE36BF47C3ACE7288CFE
-41A8C1BAA6F0814A947FBD6B3AA72B6C73A8C578CA51CCC96F2352316C467BB960E981F2B6485BFB
-44B577E71EFDA16E7405954BC7C9F0759F5A9F1EBCD2FA9CC9648D5831A68887F41B15081A204C24
-B4B992A231DEF9E698D4C3A25B6F5474F5BE6A601F2D337A58A0D21FF37FD91EB86D1D738893A03A
-69F0CD743F611CDFFE69DB2C6ED0E4611D56F803BB0DC06E7FE85A303839612707647B1BE9FAF8D6
-84122CA9E5CB8BDE2936D3F4FF254D31529D7538BBD4D35539489F9E7316F24214B996BCDCF1818E
-749A71CF0E8845AA1E2A58AA62A48E02BA4564625D20AA220EE719608521D7D7A7FCA0BD8904A401
-9819D371F3F59D46C1354E5FC1A6E5F79B20CF4ACA2BF0F2DE73DA193A6F9ACBFE0B4731C4BCEBE6
-D96FE822965DE965232282A3A130361F188B3AABDA95A8A2790D9240BE008B6A6DE4BBFCADA05B67
-86B9BB8E0DFA0C30043A3B07ED46277E07B9808422C8ED16758B9C396F4EA929D769785B2C9568E5
-70A83B989B25CE200F1727D41E2B702E7F88F1784F4C83FA60A74EB26B2DA95126E508ED519A61CC
-151DB6804F61826C5F86D8FA89D06E526FED97A0DB88EDB432FF32C1ACC9B622EEDF601081AF7B96
-3C9CFC1D13E4A9C74FEA0A1C8E3D8653CD92A944D4CA6B0D306619AFD503506D77732D6514F604BE
-4610C2560931BDE0B40939BC1D126B0E97F72AE1B4A9252123B54F7A27E0CFA4425B4546526FD741
-CA77952B10D13E0AC2E32006A903808FF0CD013F936238C74CC75FD915244C56A8412F37F0134840
-347699508D6F3D7F3203A25B7C70100719582CD588590EE34B3AB13E255B613A6D00386A0104CC5E
-D2C646F09A88888D3751651D5646C5227A3C80E8DA1B0A331121DD2429F1F4775D30564DFF47D01B
-BE2C6C72CE4D1FD9A2077C04D2B0274B8916F6A9D1A4A6964A534F47CF241D5A8E34B23F85BE9ACF
-FC2FEA961F277539F215F8728D6788F67BEAF45502839BCF23D8763C3949352F00C579A9A4FC408E
-C625E310DAE61512DFE6844E82D36A2F81709E1F05B38AE9C222ED62C961EE63593CED7AAF73CE2E
-D3667740C77B309B93EEFE1B4BA65D48575A66BE86743DC9E5D3C2FF418D11F7F211B86E827EE1DF
-C3613E7498030F07050524536D1F8A94DDB6698BE7B963C55CB3F74B676CD815A7B3DF4B1A0EA2BE
-1B0B9A11FFBFD5B1FA49668AEE14629316AF436A0821C20BEEF7B3480847934A99F6D85B68F4DDF8
-859A754E009428AF89A90D1852C220A607FF0806E8080726EDC94D691D214B4521C147C4273AEBDD
-BB4A697EF16448CD9B2FC95293305858DECFD406B89B9F3FDAE2AC579E80CF321EBAE5701FB2F7CA
-D8ED04B4A63115886D45D6120F69AEF1A21D80AD3C2D35D2899F1902242B96CD349E0AAADA40F7A1
-1282B6B52BDD97708E58DC5E2D22D1153E5FA3F3B300BCDFAF98DEC2F4E3C82A1C85F985735F3987
-4F557579F422664E07CBE19DA680EFB0FC82C323EC5C4644C51709AC8D674608A8043C91E6C7988D
-430F10BA6CE1FC7FC0604FCD8F723895250AEC36CC35B3FA14FE2A0D24095DCC30B2093F2298F5F0
-A97676A0BE66C3DC9ADACFE2FC0F721A20E945AFC1096A619075D5E9A264C796EC6C90EF1AEEA8DC
-089B44FFC13D27CB2370070A52D4416C53F364393E46EDD7EDE00799960CE6E0D57E4909E88ADD64
-BDD2B0EBE2D73FA6ACF8B40280DAA0637E705C65AABD523B8815F22F23E9FF81E7829C7E4BC980C9
-143AEBE1A04DC0D253396BBB7268BD5AEEA356B610D5DCEE03135E00AE34388251F31714A1C40E18
-2652C48CDA2211A22CB6F02490E69A44CECB169754C53B16028D352E0119F5D5FAE0BD7EA1CDA647
-12A6147374B64244E21E9EC9F0D1381AD22D5B6212B26C3F9AA5F6045F25DD9F5EB4489EA39B1945
-331AC70510C5752557DE21D0A6CFC1EB10A98FA867B76DA6E4249469F591FD154D39E89364A43DB0
-07AA0D7A911CFAE6CE2B557997FBC44F55A27F622BD7B8B10EC9F5D10F2649A646FD964AE1B111B3
-5B46A252C4DEE44E7426EB5739F24E8A390694597DB3A1FE7800C97E59558322F0E49A0CCE2AD94B
-1E2D1026AFA771723E3F523916F55ED866C9FB4A2F759651C613A2CFF362028CDF9D38F05D4C7C60
-24C533E930B64B099FB1AF04B01F5FB9CA6867E6EFF55A772C5391831059987E10CBF987E3F378E0
-1329F73D54DC0484177D3C3C06F67397955FF1CA4EF8AD1606B70455255D631A7D6EB92BFDBA14A0
-FF28B2ACE7E81AD666EA9B3A0F5A6BA3B5DFE35044FA4B3D8ED956009C60E98CC132F2E84967F4A9
-8A67B336D5EE7CAF7DD1F74D1FA08619941361FA7312CF225D89CEF97E864C8369EAFAB94D97F056
-5505D825972B754F6729596EEA91210B75DD8F645382ACE36DE60819A02B3B48DD00F5485F9264F9
-FA926D732E2C267B0BE8CA98526F124F97EFDB86132C5EF16B103908172FC51F286FFE45FF253512
-E0033F037FF182BA536A9EB2DF2D1DB257D9C86C46E1B002FB32AC70CA9462E6EB48994752CEBCE3
-9F08ABD4F4B0889283E55500702185A841E328
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-cleartomark
-%%EndResource
-/NimbusMonL-Regu-iso1252 /NimbusMonL-Regu ISO1252Encoding psp_definefont
-/Times-Roman-iso1252 /Times-Roman ISO1252Encoding psp_definefont
-/Times-Italic-iso1252 /Times-Italic ISO1252Encoding psp_definefont
-294 254 moveto
-0 0 0 setrgbcolor
-/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont
-<202020202020>
-show
-445 254 moveto
-<63617365204D45445F544554524134>
-show
-823 254 moveto
-<20>
-show
-848 254 moveto
-<3A207B>
-show
-294 298 moveto
-<202020202020202069662028696E75656C6529207B>
-show
-294 342 moveto
-<20202020202020202020666F7220286A3D303B6A>
-show
-798 342 moveto
-<3C6E6D61696C6C65735B695D3B6A2B2B29207B>
-show
-294 386 moveto
-<202020202020202020202020656C656D5F69643D2A286E756D656C652B6A293B>
-show
-294 430 moveto
-<2020202020202020202020206F6B203D206D794D657368>
-show
-873 430 moveto
-<2D>
-show
-898 430 moveto
-<3E416464566F6C756D65576974684944282A28636F6E6E65637469766974652B6A2A287461696C
-6C6529292C>
-show
-294 474 moveto
-<202020202020202020202020202020202020202020202020202020202020202020202020202020
-20202A28636F6E6E65637469766974652B6A2A287461696C6C65292B31292C>
-show
-294 518 moveto
-<202020202020202020202020202020202020202020202020202020202020202020202020202020
-20202A28636F6E6E65637469766974652B6A2A287461696C6C65292B32292C>
-show
-294 562 moveto
-<202020202020202020202020202020202020202020202020202020202020202020202020202020
-20202A28636F6E6E65637469766974652B6A2A287461696C6C65292B33292C>
-show
-294 606 moveto
-<202020202020202020202020202020202020202020202020202020202020202020202020202020
-2020656C656D5F6964293B>
-show
-294 650 moveto
-<202020202020202020207D>
-show
-294 694 moveto
-<2020202020202020>
-show
-495 694 moveto
-<7D>
-show
-294 738 moveto
-<2020202020202020656C7365207B>
-show
-294 782 moveto
-<20202020202020202020666F7220286A3D303B6A>
-show
-798 782 moveto
-<3C6E6D61696C6C65735B695D3B6A2B2B29207B>
-show
-294 826 moveto
-<202020202020202020202020>
-show
-596 826 moveto
-<636D70743B>
-show
-294 870 moveto
-<202020202020202020202020>
-show
-596 870 moveto
-<6F6B203D206D794D657368>
-show
-874 870 moveto
-<2D>
-show
-899 870 moveto
-<3E416464566F6C756D65576974684944282A28636F6E6E65637469766974652B6A2A287461696C
-6C6529292C>
-show
-294 914 moveto
-<202020202020202020202020202020202020202020202020202020202020202020202020202020
-2020>
-show
-1327 914 moveto
-<2A28636F6E6E65637469766974652B6A2A287461696C6C65292B31292C>
-show
-294 958 moveto
-<202020202020202020202020202020202020202020202020202020202020202020202020202020
-20202A28636F6E6E65637469766974652B6A2A287461696C6C65292B32292C>
-show
-294 1002 moveto
-<202020202020202020202020202020202020202020202020202020202020202020202020202020
-20202A28636F6E6E65637469766974652B6A2A287461696C6C65292B33292C>
-show
-294 1046 moveto
-<202020202020202020202020202020202020202020202020202020202020202020202020202020
-2020636D7074293B>
-show
-294 1090 moveto
-<20202020202020207D>
-show
-294 1134 moveto
-<2020202020202020627265616B3B>
-show
-294 1178 moveto
-<2020202020207D>
-show
-220 1289 moveto
-/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont
-<4D6F64696669636174696F6E>
-show
-507 1289 moveto
-<6475>
-show
-583 1289 moveto
-<66696368696572>
-show
-740 1289 moveto
-1 0 0 setrgbcolor
-/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont
-<534D4553485F5352432F7372632F4472697665724D45442F4472697665724D45445F525F534D45
-534844535F4D6573682E637878>
-show
-220 1344 moveto
-0 0 0 setrgbcolor
-<706F7572206C61206C65637475726520E02074726176657273206C6520647269766572204D4544
-20737572206C612073747275637475726520646520646F6E6EE965206475206D61696C6C61676520
-534D45534844532E>
-show
-294 1445 moveto
-/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont
-<202020202020>
-show
-445 1445 moveto
-<63617365204D45445F544554524134>
-show
-823 1445 moveto
-<20>
-show
-848 1445 moveto
-<3A207B>
-show
-294 1489 moveto
-<202020202020202069662028696E75656C6529207B>
-show
-294 1533 moveto
-<20202020202020202020666F7220286A3D303B6A>
-show
-798 1533 moveto
-<3C6E6D61696C6C65735B695D3B6A2B2B29207B>
-show
-294 1577 moveto
-<202020202020202020202020>
-show
-596 1577 moveto
-<656C656D5F69643D2A286E756D656C652B6A293B>
-show
-294 1621 moveto
-<2020202020202020202020206F6B203D206D79534D45534844534D657368>
-show
-1050 1621 moveto
-<2D>
-show
-1075 1621 moveto
-<3E416464566F6C756D6557697468494428>
-show
-294 1665 moveto
-<20202020202020202020202020202020202020202020202020202020202020202A28636F6E6E65
-637469766974652B6A2A287461696C6C652D6E73757029292C>
-show
-294 1709 moveto
-<20202020202020202020202020202020202020202020202020202020202020202A28636F6E6E65
-637469766974652B6A2A287461696C6C652D6E737570292B31292C>
-show
-294 1753 moveto
-<20202020202020202020202020202020202020202020202020202020202020202A28636F6E6E65
-637469766974652B6A2A287461696C6C652D6E737570292B32292C>
-show
-294 1797 moveto
-<20202020202020202020202020202020202020202020202020202020202020202A28636F6E6E65
-637469766974652B6A2A287461696C6C652D6E737570292B33292C>
-show
-294 1841 moveto
-<2020202020202020202020202020202020202020202020202020202020202020>
-show
-1100 1841 moveto
-<656C656D5F6964293B>
-show
-294 1885 moveto
-<202020202020202020207D>
-show
-294 1929 moveto
-<20202020202020207D>
-show
-294 1973 moveto
-<2020202020202020656C7365207B>
-show
-294 2016 moveto
-<20202020202020202020666F7220286A3D303B6A>
-show
-798 2016 moveto
-<3C6E6D61696C6C65735B695D3B6A2B2B29207B>
-show
-294 2060 moveto
-<202020202020202020202020636D70743B>
-show
-294 2104 moveto
-<2020202020202020202020206F6B203D206D79534D45534844534D657368>
-show
-1050 2104 moveto
-<2D>
-show
-1075 2104 moveto
-<3E416464566F6C756D6557697468494428>
-show
-294 2148 moveto
-<20202020202020202020202020202020202020202020202020202020202020202A28636F6E6E65
-637469766974652B6A2A287461696C6C6529292C>
-show
-294 2192 moveto
-<20202020202020202020202020202020202020202020202020202020202020202A28636F6E6E65
-637469766974652B6A2A287461696C6C65292B31292C>
-show
-294 2236 moveto
-<20202020202020202020202020202020202020202020202020202020202020202A28636F6E6E65
-637469766974652B6A2A287461696C6C65292B32292C>
-show
-294 2280 moveto
-<20202020202020202020202020202020202020202020202020202020202020202A28636F6E6E65
-637469766974652B6A2A287461696C6C65292B33292C>
-show
-294 2324 moveto
-<2020202020202020202020202020202020202020202020202020202020202020636D7074293B>
-show
-294 2368 moveto
-<20202020202020207D>
-show
-294 2412 moveto
-<2020202020202020627265616B3B>
-show
-294 2456 moveto
-<2020202020207D>
-show
-295 2573 moveto
-/Symbol findfont 50 -50 matrix scale makefont setfont
-<B7>
-show
-370 2573 moveto
-/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont
-<4D6F64696669636174696F6E>
-show
-656 2573 moveto
-<6475>
-show
-733 2573 moveto
-<66696368696572>
-show
-889 2573 moveto
-1 0 0 setrgbcolor
-/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont
-<534D4553485F535243>
-show
-1161 2573 moveto
-/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont
-<2F>
-show
-1174 2573 moveto
-/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont
-<737263>
-show
-1235 2573 moveto
-/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont
-<2F>
-show
-1248 2573 moveto
-/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont
-<534D4553485F53574947>
-show
-1550 2573 moveto
-/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont
-<2F>
-show
-1563 2573 moveto
-/Times-Italic-iso1252 findfont 50 -50 matrix scale makefont setfont
-<4D616B6566696C652E696E2C>
-show
-1826 2573 moveto
-0 0 0 setrgbcolor
-/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont
-<706F7572>
-show
-1943 2573 moveto
-<6578706F72746572>
-show
-370 2633 moveto
-<6C6573>
-show
-465 2633 moveto
-<73637269707473>
-show
-635 2633 moveto
-<707974686F6E>
-show
-813 2633 moveto
-<6465>
-show
-900 2633 moveto
-<7465737465>
-show
-1031 2633 moveto
-<6475>
-show
-1119 2633 moveto
-<6D61696C6C657572>
-show
-1326 2633 moveto
-<74E974726168E9647269717565>
-show
-1589 2633 moveto
-<20>
-show
-1601 2633 moveto
-<3A>
-show
-1654 2633 moveto
-<534D4553485F626F785F74657472612E70792C>
-show
-370 2689 moveto
-<534D4553485F626F78325F74657472612E70792C20534D4553485F626F78335F74657472612E70
-792C20534D4553485F6D656368616E69635F74657472612E70792C>
-show
-370 2745 moveto
-<534D4553485F6669786174696F6E5F74657472612E7079>
-show
-912 2745 moveto
-<6574>
-show
-966 2745 moveto
-<534D4553485F506172746974696F6E315F74657472612E70792E>
-show
-1581 2745 moveto
-<534D4553485F6669786174696F6E5F686578612E7079>
-show
-370 2801 moveto
-<657374>
-show
-468 2801 moveto
-<756E>
-show
-560 2801 moveto
-<6175747265>
-show
-703 2801 moveto
-<736372697074>
-show
-856 2801 moveto
-<707974686F6E>
-show
-1038 2801 moveto
-<6465>
-show
-1127 2801 moveto
-<7465737465>
-show
-1261 2801 moveto
-<6475>
-show
-1354 2801 moveto
-<6D61696C6C657572>
-show
-1563 2801 moveto
-<6865786168E9647269717565>
-show
-1875 2801 moveto
-<74616E646973>
-show
-2037 2801 moveto
-<717565>
-show
-370 2858 moveto
-<534D4553485F666C696768745F736B696E2E7079>
-show
-859 2858 moveto
-<657374>
-show
-933 2858 moveto
-<756E>
-show
-1001 2858 moveto
-<6175747265>
-show
-1120 2858 moveto
-<736372697074>
-show
-1249 2858 moveto
-<707974686F6E>
-show
-1406 2858 moveto
-<6465>
-show
-1472 2858 moveto
-<7465737465>
-show
-1582 2858 moveto
-<6475>
-show
-1650 2858 moveto
-<6D61696C6C657572>
-show
-1835 2858 moveto
-<73757266616369717565>
-show
-2061 2858 moveto
-<656E>
-show
-370 2914 moveto
-<747269616E676C65>
-show
-621 2914 moveto
-<7574696C6973616E74>
-show
-880 2914 moveto
-<4D45464953544F5F3244>
-show
-1279 2914 moveto
-<61766563>
-show
-1469 2914 moveto
-<6C276879706F7468E87365>
-show
-1792 2914 moveto
-<6465>
-show
-1938 2914 moveto
-<6D61696C6C616765>
-show
-370 2970 moveto
-<534D4553485F4C656E67746846726F6D45646765732E>
-show
-1028 2970 moveto
-<4427617574726573>
-show
-1275 2970 moveto
-<6669636869657273>
-show
-1508 2970 moveto
-<6465>
-show
-1637 2970 moveto
-<7465737465>
-show
-1811 2970 moveto
-<736F6E74>
-show
-1977 2970 moveto
-<7072E9767573>
-show
-370 3026 moveto
-<534D4553485F506172746974696F6E5B322C332C342C355D2E7079>
-show
-1000 3026 moveto
-<6D616973>
-show
-1110 3026 moveto
-<636575782D6369>
-show
-1273 3026 moveto
-<6EE9636573736974656E74>
-show
-1509 3026 moveto
-<756E>
-show
-1576 3026 moveto
-<616A757374656D656E74>
-show
-1809 3026 moveto
-<646573>
-show
-1891 3026 moveto
-<706172616DE874726573>
-show
-370 3082 moveto
-<6465206D61696C6C6167652E>
-show
-280 221 1 967 rectfill
-2125 221 1 967 rectfill
-280 221 1846 1 rectfill
-280 1187 1846 1 rectfill
-280 1411 1 1056 rectfill
-2125 1411 1 1056 rectfill
-280 1411 1846 1 rectfill
-280 2466 1846 1 rectfill
-showpage
-grestore grestore
-%%PageTrailer
-
-%%Page: 6 6
-%%PageBoundingBox: 18 18 577 824
-%%BeginSetup
-%
-%%EndSetup
-%%BeginPageSetup
-%
-gsave
-[0.24 0 0 -0.24 18 824] concat
-gsave
-%%EndPageSetup
-%%BeginResource: font NimbusMonL-Regu
-%!PS-AdobeFont-1.0: NimbusMonL-Regu 1.05
-%%CreationDate: Wed Dec 22 1999
-% Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development
-% (URW)++,Copyright 1999 by (URW)++ Design & Development
-% See the file PUBLIC (Aladdin Free Public License) for license conditions.
-% As a special exception, permission is granted to include this font
-% program in a Postscript or PDF file that consists of a document that
-% contains text to be displayed or printed using this font, regardless
-% of the conditions or license applying to the document itself.
-12 dict begin
-/FontInfo 10 dict dup begin
-/version (1.05) readonly def
-/Notice ((URW)++,Copyright 1999 by (URW)++ Design & Development. See the file PUBLIC (Aladdin Free Public License) for license conditions. As a special exception, permission is granted to include this font program in a Postscript or PDF file that consists of a document that contains text to be displayed or printed using this font, regardless of the conditions or license applying to the document itself.) readonly def
-/Copyright (Copyright (URW)++,Copyright 1999 by (URW)++ Design & Development) readonly def
-/FullName (Nimbus Mono L Regular) readonly def
-/FamilyName (Nimbus Mono L) readonly def
-/Weight (Regular) readonly def
-/ItalicAngle 0.0 def
-/isFixedPitch false def
-/UnderlinePosition -100 def
-/UnderlineThickness 50 def
-end readonly def
-/FontName /NimbusMonL-Regu def
-/PaintType 0 def
-/WMode 0 def
-/FontBBox {-12 -237 650 811} readonly def
-/FontType 1 def
-/FontMatrix [0.001 0.0 0.0 0.001 0.0 0.0] readonly def
-/Encoding StandardEncoding def
-/UniqueID 5020945 def
-currentdict end
-currentfile eexec
-E98D09D760A3C22CF119F9DC699A22C35B5B35ED6AA23593C76D54CABB5E942BF7D6DD84F1664B89
-699C74B472DE9F8E6DF925F6C4F204E9F1C639B4DBA988ED2AC419FF2B2BDE605B8EE3264EDD6641
-2D4F21C64AC522BDFC7C5502F9C3F3E5592B3B2093D33C9BFAEDD2D49E89AABAA832E23F062E91A2
-5032519D1868816E44B4E0747795003D7930299D6E1E2A5BFE0D595DC97E140989CE81D8D7F852FF
-9CDC7A1B1B598C69131DEE005B415805A16D8A123E6A2261C63C769D2F4B60FA2C438AD7D199D8E4
-5F7E7C9A605C8CA14E21FCD81C9A515FB8DB6F99604534D06EA9D87FE0FAA852899C9D0595C7A97E
-6C55F79FAC45CD38E87B10D210CE7501E88C8FCD3444354365FB893A12F596AE2C1E70D5819EE0D0
-87D10BF8DA96F3DABD5405D28C4228C6C31BA4052464859640933FEEFD8071C0C84CDD829A9B1D0B
-A01F25A4D50EE2EA2B45160CA6333B2D2800306ED2BEFDFE155E9D9F9342EB8D5B0ADBF2460CCC98
-643FB1287CCD28ABA7B5CAB92EC39EE2E918990372B16F8487EBA30EAE88708B6CF33B6C015D8096
-C7CFE2F139F52052E3925C0D50FD64CE68236D59CB83EF56BFC584150EC38065059F3308AD6F9A99
-F83EF4E6CB13855C8175E31417D190D036B387D3952344A950F4D8C7781B307A094DF1ECAEE4D2C2
-FD747BC6F7F9C6BD0E90C19294F96C8C5CFE88FB34C477574A1B1630B8CC591529E59B20794DA32E
-61DECDA8ABBD1AE956CF74012AA01D42EE01E861B0AA6897C864788AE59DEF43C493246FDB1ACA55
-4C12594BC7B33657A9ECC9E3D1472EF826073F632BE540C35FF6FB40566773F3BB2204D3A579A08C
-CBC844C14B18C350F003B9DA23A570C362D6003893CA32F86F59B829C78EE3188B6E3F7FA81D7F62
-2825C639638DFB78B7AF1F500F5B450FA54DBFA5CBA277C794ECE93275A3DE0B452FDC8DDC2993BA
-A42F28A636008CDCB03EBF71BDCAF35019778993443F88412AD2AD0D7155A3944606463266322DBC
-0244B07DA1E9C27A27B59664E8566D7A54CC03E995AAD008B0A17E2C3EF61F720CE7F7788599C4E4
-4C709CD5C31B11107F16AD70B17B9AFE2E8CD922A7428DAC171427FFAF51067307FAB0ADB530E701
-FD22DA22C4CD3064067BD4F6089C4B2C87937DD426E4E9D2F60E608288BAC9056554D04947E69200
-61E379CF5E81BFD32FD37EFAC1F61CEBEE551B0851516471A7472C60DF89DAA9EB1DC5A67E479745
-3E69B9E22BAF4E3CCA4192D603295B018C4AB69D18DE52DFDF15E96B557F290A4B8C5B1E7A6CACA8
-1F2351B97ADFC36995ABA43803A6E5AC04A3C93495F6D38106B8B144449C07D1358210F9176E1565
-72363CFBDE576BFDF99FA329DD1346E83F79E06CF68250CA57A68931BC7F342AD295D0CBA17AA95B
-B8EEB53EA6E8E660B814E9F857CECB14F44A43288B69A9E7908D55BF19E844359879D28CAEF1C38A
-36420185D20DFB32C2E002202800E8EF3D67C5D50E919657CA958B538D537D503444865331D79BFC
-40312068D72364503BD0CC84B5F30A74D8B5B6A26AF2DB764564FB65A6BA8F9051AE2B4EA458D46A
-4569F30C6E77DC097356770362E6CF3F1661074778EBB44FF7D1E3B64FF75E77E11FE525BB121C65
-46CFD13300CA1F02D571B82A5825E6226D14FDCF27F06D87452A8B6C5DCA658535CEE2A795E58137
-D48E566B69D53A0C3B766E84C51EAA221C46999CC8065ADB2F129D5B630FAB1814C0C33B5AEA0EFB
-B6E994D80941B53079AF96D90A0B924F9B0E319BED9836B8F9053F868363D3CA554CBB181863301F
-8CB940872ED5FA7BD18CE39218B5AD8AC57D0F752D941076B1C64D99BE0DB86D7A6D96510D772EB2
-4C587F11779BD21CFE5BDE1F29C1EF9022B2B8BCD7F91153C845906722477829C40111D810480F3C
-F62DE8DBA7FD86CD236E656618CAF6FC46827FBC4898EA7672F8C9971AFE43E0E01EC8B77D4AF48C
-BF1210E98C1DB15C16D149BFF58AB0270CF015B107A3A50F5DC8F37FFB92EEC8CB6778DDB7CE4AAB
-C464C4AFF654223006A550EB52485A23D2B4AA7198D3CD54418102F1E9A4FBDE37B841E56F5C2C53
-966DB9B66B000E4588282E3FB80C2C519339F0002D2F83C979EDC5827A3B3C8EF8810A0F9DACB6B9
-998E9AF6551F56313DC4011904CB979AA2D32B11A811BC248141E4B9734D9FB7982A5671002D8279
-CAB93ABE057474628DEFC95D43890DB1ED34CFA8A20BDC3D874E7679A396158E522ED0AB969A4E3E
-C7E4474E192590504D54DEB7B260B7935C4E56548A7D121AC1F741F8CDF259EA1B5813175A77A1D2
-D30BA26F65EB765A04C09ED51F69F41551ADF399E6AA2FC09788137BEA4913F17B8EB838C38FB272
-1FDCB55FD65697FF0B850E7D3D1CE266BF90F7EC06A9A0876BDFE767D3A918B092FC78C775F945CF
-1F96E859C03DBF630D9A940939654C3549D8F7921CB94EE23D5A0535DE9DF31EA0F937F860B4F220
-A99ADDFC343D7CF7BFA0B803C12C26403F0DCFFC8EA786D0D8A8D9C367419CA8AE41190CE93A8086
-583A1E6C9D70B612C84D87D2EEAA71EC2DC12F4CDE6A821303D5F6A9BBDB7EEDCD289E80FA3B75F4
-7F481B50719DCF4A142069393593B9AF9CCEEAEC56A35B8787193D7C88113E9E1E221D151E093B01
-9EF89F6118BEC4735103CC8003CC5AD1B6727B3226CD44C497DA7052DD681695DBEC3397F9598C91
-77701C73BF0594CE93F23D50EC5BEE2FB9DA1FC966DF148B27B28EE3C89526DD6625E2887F9FA076
-7C127C609EE315626BC14D274FBEA56528DC06A27B2D476D46E9E7916590B156A5DF04A6CB15E362
-45D77021767B6E5BDFCC679670263FD891446C3371B11BB6E1DF60F960AAB4149D7753E6A5C33810
-C42C8BFF4E935003388506F8278BD7CB672F132E065AE684DCA0B9064D01DD620E7FFDFE04F14277
-EFE8E60159BA0FCA3FE2F28B902D4AC275D19F0AC6971EBE827C4A232D87650D2688345BCA78F879
-077114F0463C5F058107B669566F8171E4E284D278405580F04BFFC9902784216E0C9A17AA9B2935
-E66E18A783F723BE044389B7E9D62AA36818FF2EA406C3C1A9D2F3436F3EE7DB8BE86AFA8DAA6A4B
-1B84611350D8D27605509612B515E16AA843164D5D0805E36A2B9EF74C5F6A0B9D59A04B55697123
-27F4B1B30E9587CD103337639967CBDC655AA46E80D2CFD24BEB50815B5338E522B3A7AFE8362AB4
-F05D8BC52BBA9C5089ADA8C89529B0275AF422EB540D31A938B8740860756325B966B36817115213
-FAAF92DE63F6BAE1E0064BFBC5588098B61EB83C71F1C2082436D37DAF1ACBE186FEDC4BE7C1233B
-6F18BEC5F99002D21CB7864E4811F7AB3C03003E1E4490AD1AC793BD28FCD5EF0E6CC30EF39A08C5
-2F71939B0CEF620DC69E31E39D6DB969049031B0C92EF2DB653D97F370141456A52985076B268652
-FA2648C792780BAD637C4D7581FB2D62011D57E293719487CF2D1F013CFAA532E1C2D39178D51272
-A6AF041440BCA174B5CC902BD7390C7D3695056CB4BD7791F9FB6D88E7A70DEF2C97869F5DBC5BD8
-23C517C7B7C39D624DF627DC9653EA5347BFDA80B723F05F6DBB4C9EA501D862ACE05B9DBDF21B70
-56FBCD8C6D4B85873DCEE6166C8B5ADC0316CA12D9639F361B15A42F00E1D62EDBCA1111972FA0F4
-5758BECB31DB38316F3CDFE1B41748C93ED58B67E9B57ABBED5924A6D53E99FBC9A994A6489A8BDF
-13EB685548B4DC6D62DA7426C22227D4D43B6FFC7B5EA91C896730253E8941AFEE588359C2BECF6F
-FC415B9EB6D31CCB0F6C7F85853E6449FA6D627A97A3CE8303F148393ADCCCDFA2FE085C6908BE5C
-3C05AF00A6F02840206C3253A559AC5C049BDDFD11AD9B118403B84DA10AE3C470CB9A9A2D1D7B73
-2F59F5FE146DEDA60AE750F551AAC934621B4470E1BC324C436303E25F81D0DC3188BE0D6FEC5414
-C20E4CB18952E12CB6423DF7124627ACDE145500D77A97A8BFD9CB50D1FAA008E2CE2B2505A4749F
-1EBBB092C347023714055A9B63353AF9E7FEE05BB54C9843698101F79888A91531773830C2C967B5
-88D3ACD2192883D5CE3962D51084FC653EAE2C5FB2DA41DACEFB5C76812D2EDB5B109677289CD199
-8D457FB1023A19AC67295BBC1A9A20A426B06A368DF3C5DD083CB1180D287F5500F2C635EDE157EE
-FCEEC5503447382D15C748C1E35F68753992E5C90F900DE54D18F8E1B355D1076ADFB1F3590135FA
-D1A36F028E44F48ABB149B80CA9A54614D467F8D71CB310BBC7AC7100261092DB8C5BFD39E0AC6BC
-2C9D6CBC3A8C05FF8A74CB21608EC4A4CFE4CBAA2D056DBA14206106044DECF59F957EF8A9CADE4C
-9B19D8D30DD4FDE6A9548E50DB51ACA73330142153FC36B69C1C8D5B26D0C689B7040E81AC2C864F
-D7C097C99BE5953843E172C97AB5684F35FB03A725A89DBF371F08DDF40A1531FC1B676DB0E1543A
-EC6E97D3D2E4AA3D5831D8B3C952ABBFA112352814FB6FAB61A0D680E6640F6AEC8426200CF61286
-F7422CB2F78C61EBAA36D47EC16D7FAF8B4AF31D090CDFA255D9D7C61D46CFB22A7D6E1758E71ED5
-67E00CBD8E8F468DDFB477F091A2F915627F22FF47B876544BC1F03B6BBB98385F009C20BB1AA2A7
-A78674692B8EAC2E3C8069B79E679338DA57F72976810F845BEB6B9ADD32B95D78E5E60F16DD1668
-9C05FD82D36A3115BE8ED494A74DD211D58A2CDF983FCB9CDC29BF7F0E29988FA23560EDF514BC1D
-183F3B2A22C09FB179B47E05ADEF48DF02F31C29875D1915037B19407764A4292FE44E741651A8E3
-BEB5F0D972B6327090F664417C84F84FFBF0AFFF8B1D85C822D90730AB4140C42A51AA8B1DBE4398
-4EA8566040EB8B341CCE23FD3F69DD235A080BA5C69AECB9BC732BC2D7D40617DDA6B79FB6EE40C3
-556C7DF9B23DAD89E94054B1345DB8402AE679FC4655A4A776C0150463F8DB2BFC0608EA1F124E22
-1DDAE6026B5E5D007A7E4A0D6B3B0CF3A2669E67C5E4F01551966A7BC48F2F4B6A87E740D8095E63
-F77C7A027F26B52F2299DE5B8A2F6209BCF3D31CB0235F998F781E5CC81E31DC424E008D46EC0920
-2951E5684804A0592EA47D6C788A20487BEA2EC8F2E6C1D7F378B62DB43CA43C4B366F8B4319631C
-FE9854F0E10321CFA3B01C873584863BBEFC23C72C05E695B56E8A52E89AA2DAB543834D34DCAC5F
-ED08DC51825C5257AE59850D101D84F4CAA1D29FC932F9E0EFFBF7A9A7F3685F61F0490CD3CC8988
-2DB52A757A6AF4C4E67B407BD2316B1C0FFE7DC54E43C87B874F57E4903334E2140B011484863CDC
-ACA331175F2CF3D72E0042855983AAF8853D3015E870FF0807014C31D55060DF3FE1FCE157324481
-2744AB51322444632F9AFDA6706E320FFE82B8CBE242A19DF00CE73EE48E25FF49D5871BD3E60652
-298FE3E8D400609E232E0DDC794C0579ACEF89E841B2EDCA50D51151F65E8C1CC3B01EF1870558F0
-BF5743718C3E068617E81BFE120C6CA16E0924BFC2541177D53671CAA3AB641C41557DCDAE1A3461
-47B5E999C4541B08B4AFCBC187AFD653D5B5F8386DF6AD8FE69E21BD0567DF494F736C6A184FA4DE
-48DC9F347787CA96E2E00A296C2DA05C2AD9BC423E9CA428D7F1FA12DC9353A302FB8C529AF8688C
-BB543B45B2717EBF8F6C497935F4F3BFFD285E0402AB7544B3CA4643AE5A8B5250ED987A95FC1F27
-5B9707ACD0641BD0EE2AE9758494F8D8A51DCE408A38AC20EAF0852D72D84D0C6BE973326793AEB9
-55EAC6FE0A2813A355DCD22F6F2CE56588D1C055CDDFA98878BCEB6A018DB22922D2B600A20F8184
-2E665DF41013CA0947C4237C2BD60A75E2FD1A3FB8C8FA19485730B87461AD466ACB02DF8CA24091
-4FB090B3D2B41EB6B8FF05E1A59D9FD668AF70BA5BB72778953BA55FC5F9F626043450E1D09BC83D
-8605098ABEF884639A37809A32565CBEFB3FF39EE53D6C18C58C272BB928E4410E361E59A50F242D
-69747A032617C52DEBBF62364AB5A96EFAF642D9D82BA679B1D70FAC10A4EB62FA5CFC308E86368A
-AAD7E75948F43598CD1C544A0D4091374D7E88D4522CBE902391641327E888E7748FA889DCE67ADE
-61699E7D77763681CAEE9B1CA8837B2F7EF9C18CBCC538C465C8E2DD34616953CCB6030A222C728B
-834911C1A179E2C770289407AB28B303E724D97F747D6134B425216A64C6E0B60F633E2B85300047
-E4C90339CE030A0FAE31E830C8ABA5AB3386A3B69267351A7BFDD66356AE5E57FB2994452993E90D
-E7C4E260ABAB93C37831856A650D56E44172FECA01D6C7C380F250B82473960D2A2A5FB6B4DA668F
-46E624ACF7FA0FD4490F485D640A3ADFC9F8652E7A38CE5799F770C3606DB4B8B947F93967F779E3
-A3C0572F13A5A187D31D7BD12A5C7BE23CB6ED6192086241B76C5BA6983DB9C93E4B208D707D3760
-F03CD6272EF3A4CE89B8E52E6AC5871A3D03EB975759AB4BE239E5EC7842CBB333E692CC607C722E
-185D3C39164DD320C6945629C70FF66A5237C0A9520A1FAD6EB9816069351AB0F135D90CC0982B14
-7D2294AE4A38A527EE40BE9CDE2512AAEBB590E134388BB171D0956A7C4566D65A9A041BE6C4F883
-6B3EC3D2ED1B48B566A783292B15B6127920D247D494F070BB20BEFF60640B11B276DDEEE49706E8
-B2B21BB40B7F00AAFC594C492C25DCA774E0B80D82E927448DE2E74A9D0DC7AC9260096EAF187B6C
-D6AEAA6D1DC4205B4411122751A5B22688404EA7C5861730371FFAC10F5AFD4727A0E402AB5EA757
-606B75EB86A05E8F774D6E430A1A3FE2A37EBB06700474239FB1CFA05EE44B91B82244C575B52E7F
-AF934B04EEB0D933FEB57EBE326D75821C8B23EAA85B583AED4320B7F04B9F2DC591091216FDE52E
-064BAAA9C2C9D9714B95A4558C21F3CEBE624B5403B31508F178581AF6863083ED762F1E2E34A45C
-FDD71660D626FF8648F5D6C5E580D4765A67FB6159EC8077A9F0A88038C8D3D7C77FF0926E2123BE
-874F7BCAF129D55A5B5960F824BD1728ABCFCC51D23936DE9A25C408D786E44C3A2BAFA4423177AD
-060D21D38E15E23EB6FFC0B4120E814695D423EEFC2744A1FC81B4DF89D76F0A6803D8B14E75538C
-AAD03A72517B86514F6952F6FD619D9E910D980F00964DB325318C045BDF79647F453D4A5CF4E61D
-D5359782827229310405FBCF6107C3AD9DDEF9A9A339D5D5A6EB2E7838A0A43221BD62CBDF732DB0
-A638A52016FB35BA7761AEC846A023D3BF2D1BB183543E81EB7CAC1E5970CDC6F068C5EA118C7AAE
-528D1396E6DC939112DA4460C890EAD5C01BDC438F5BB734218BA6270ADD0DC1778FD8AB16831D6A
-302B814A1A44B07EDC65956C9E6CF4875DF521F3CE5B422F71081B6D69BD270F739095C9E81C0377
-934A8BC6390C420C4E4CDD9CF7E32544C68D884E15ACA3BCC07FC8C132D8FB9D752C15D75C52C288
-57E2EA461A6FCAD90C56843513F74461F18D7164BC597A28AE4BA7C86EE1703535A9B9ED50122627
-71FC12F102E800E0E1AF7BB46681BD2B14B614CEA91B7B2AAA35235DE76C0E113C92688F8EC81277
-D58C3406778E1EC1CC15F1CD9A137C8FFDAAB99ACE3BFC782916F1A877170589A92DC921E6740A22
-B84DC6BACDABCC76E64C79E3A588D80F8F4D376E1B426F15751CF7391102102F0AFAFD8B22DFDEB5
-48AEB5F30B1673023D22054A13391A0EC08DE6E7B685A0D031AABF20B7C62187C0284892D5EAADF1
-21BA28263EB863D5E36EA9C06A77CCFC0E17F593961591F84D82AF823EFE41044C8D606FEF83CCC7
-B0E961E7994DF8A3CC36B209D953E250ADAB8D22D7F2B4E2C9CA39EFA2D93E56195C1560E30A5190
-CC5B17FAEFCF250DF79F6B624A4B917E11C332222FCCFEC4F6A47BD9E75DA9854FC3F7AE554E91ED
-DE144D7AEF38A0E3EDB5E5A5626374DB94F022C8CF549093041DE00D7269B7CE544E748439BA2870
-718C08E58FB4A77D93EBC04B7957D272AE1601D41BF85A2BADAA0DF73B0D3841D4839C85677FB2E1
-5F1D6CE592669FF4BBC9C69DBA334DC37706F2F6BE83D5863E8CD6A30C08640AAC4C233684E66B4F
-E6B62D4A8BE9D531E47BEF5640D9B5C27D990092BE1597F6995C8A77BE9C18AAE6C1CF130775DDAC
-41D34438FC7AD8E042CB56CBF2944932EBA7D053E9376FF398367450E35A1945FE23E05C921096A1
-5454721FFD0F429A3E06DC3ED36F1C170BE79C66996EF8337AFF85B90C5D3A4A94455AE9FA32E211
-7A63E59001F052D5F6223125BFAFA40901E98960ADF7BB886729DCA82FC3B8CC52B37FF2517299E1
-D769057F8154FB95582F02CB0BECC873A9C71796ADBD3E91324FAA94F2C41CF57C30B5897D031C02
-D256C909E080E70BFD1F32E69EF67031138C2DDCD1A8E4B65E485C23C3E450ABDD9815512D6F34A8
-4B9DB715DB2C7A93BFB424316E1AA44397749CB01088428F149A3B4324737ED9957FD388248462AC
-1B2610D72BF5C073ECA567E7385CC959E37CAC7E05470160FFA5A9F63B8E9B082937E911586EA165
-374938F492EDF28CE6020953A5B5CCEC7737F9D9CC8538C4339567AAED3794ABA3B9F4EAE65466E8
-E326F6C399B36355935FBDCB9972F10B13494DC25097FCEC5A6398F275C8C151558E74C5175F7BAF
-4155E36B733F75CF9D5C5979B0764F14D8306E06BA24BF791141E404C69F3F8FCCD91B9C58C2C671
-AAE7D4F9E5D6414E46ED633A5F78AA5BF04E652246A066EAD9E582B181CC196EA2D3CFAA383B5D0E
-4CAC9336E119C08CC6AC55CBFBAE147C623B400453BBF447E96DE036FC025624384359EED7C7D5F7
-858DC0521377CF647A157FC3F188DE5EEF094DBA125510FDE34C570D7BE76AB5DF0A28BF45DDAADB
-EA7EEEDB936332DFE93081E0AFD3FDD46BED08D6914B2EFCFDC41662A33B90B03D76D34F48D30FC6
-BBBB600E90E6AC7243FDF026762A44B4D6E4ECBEF48C9D7B696AF29EEE063E557D8FCF0F09E0136F
-45D17E608DA36E59F2AECF8493F8D62536119B5F7E1554DFE3F6E8D7C9A2C6F557D18B4AF92C9F6E
-050975C3B5C54F9B5F4E39D600B6FA2CD6DE203A174028CBB2A201AF126D1013C229BB82CFD013ED
-199D01E51EE2780FE896E01C63C655087A3E61A7F1029FA5E97EA1872F1B45F22282DDC317E17926
-7368CB52DA9444F6055A3C653659CAD2A1D8712BC2B1B32C1DC6906D957FB88524EE066156ED6BDE
-B8D832F9338F9912E29A250A8C4674E667C1C278B677AEC9972BE83CBA3FB779893FCB8F81A323AC
-91474BA2A2334A07BB5628E905C518E634F6761A3289056F83D5DD7B3890987EEE1C18FB2D379CC1
-905F1AEB3B3D2AD578F0D6C845D2D40C4BCEE3F71C90E68E5417BB8CDDD878D83BA80AD8485F4067
-E5C3CABF28AB56CBB219C0AAB8FFC6C7E192BEC8CBCA1459AE4450AFCC81B9548F40CE2622E5A7C2
-81F74DCC02DAD57EFD92D072318DDF05BF42F1EA8163071E23949B0179CF7DE64677CA99B23CB926
-B3E294194EC13397EA1DC9A5E1CDCD828156CD71F81B64167D4FB01E6002713BD8AC6F82B20CD369
-9C6CA4704DC5C65A2D66EB155B7AF1C9BB46469416FB49C1C7E17A30A5F045271D7DF3FFF2F42C6B
-470701C381E3456A500C6BB3D0E47B4D91C5F34B49BB6272F1F8698B307D89EDA3A1565DAD1C0864
-627560CF922DCF5B34C67860352390B282F95394AA2CDE0E97CE3ED39546A6AF1C52BFCF81A29BE8
-2C47C99E8050E4889E4575B75F39E662F2DB7420673797E2ED3D67CDA7AE2C15D0A0A794D57D168E
-BE13214E89E0209AB2C0EB7784E9491AEFA3C02D0DF3AE5365A0FC4AE023CAB528162C7A1B173664
-9DFADDACA8DA5FA18B7D6489E4229E9E24D38A620464A744A5C60F6F9D334B908706B738AED18669
-8A8B278341FA4D65A0A88680BA484694921512F7DE93337FC1C02BBE6E64AF2DAD07603279D87329
-1D1F4D39C1DD6D89C90F65240F4808F6F1115CA55B88E242565E59F3BBF1F10EC7B88872E9AE61D4
-4CAE185463EDFAF7DF63DE4D2207D307AFB61501892965170D2945846FCF5973A1D458607F50C15E
-06E5BEC715E0C156259AAA6C735593E5564F65F443B78CC7512EC35A56F126DF9D30974A40872E42
-65E1AE5FD483CFCBBBA26DEE426CDC4721F19C3FDA86ED7AD4FA1120F63669BEFE7002B128CEAFD8
-C63E8AC09943B6CBDFB3D2476A026C00A8FF81B1F651B97F310C82ABA5F388CC1DB5AFCFF5996D52
-52A6A42FA4D972E41EE56088F78CB966F9051171C472C774879AECFFF08BFD9CEA40D7C298922ACE
-64F28C14E0B81F4DCADE81D71DE3983D87D905192EF13CEE71B2D3FF1A88AEC671EC318917DF98A3
-C9054E372D22A3CEC82FCC217F47319A40900312F6E32B536B9E7A7FA0837EC65CCDB5FB0D414371
-17596CB39D9382262DE6E65379D3A9709B2CFBABF5FC5D5B352425F06F88CD31012A2A4147B112F0
-C1C0ACCC808CD625E0228EEF66661F70AF96D3DCFECD402700E4F6522AC9A856DA466D55C84F65BE
-2810A1565163872D62EB81333A698ED7B68352CACCA2D7AD38AB55C19E4F5582F75818302F5FDADF
-1DCED09D94872F2D48FB636C8E38C7563C72C771A08C6B1F041F3532BDB39006C89A33C09BE1E3E6
-03622D891F98010BF1DE5355F557A1E09448D486ADEF565705277B31B8BF2B86761E32631E3435B6
-88B79D566F1747BA456DDB43CD239FB47FF7B425EAA4C657C8EEC26EE01AED07CF916E77D53634C1
-37AEEA009C6B515B6342C54BE2C7B95955B1A9DA277A0ABCDA2346E88018C726F481F71D6011AA42
-F8852F2E5749518FE3B3AB668213FE1A05C10A1C53953D75312631D6BBBA01D418199DFEFF8CF548
-6109B099FE8E2F606165FE30F532C03567785D5362AA873C9D3EECEB20F1945D55F49B0CCAC84967
-59FCC7292E46938943C262D78F3212D3F9D0F7B103157F423D71B1ED54B2A603F4C269029918F238
-EC6828FFCEC66009DB9C9E59534EABB183F31D7AD4C57B1BDF0BD2CE5A421882BC10CC1BCE6A970E
-2B586BB221567CCA483989DD0B8DEC424C1D1FF042DCB7834423CF244EDA28D2D969B17440CAEAF0
-24A6119DB010CE366821AFA424D1B8299609C04148275AE6E5257A7ACB3C766C747CE99CBA2D703C
-F19B7CF301B634D8B613DDC4AFE4633A4D77BFF8E00CFB5E289EBBCAC90A24307E7941EC1685CBAE
-400CADD876FCEF7F6557EEE167D2035A05120293527700DC510B038A496BE1D5CBAEF24ED39F7421
-1A93AADF22214ED606A80582485AFE358E3A46D0671148998A3B3BE209467009B43400870359D418
-9A8CEB4D5866AB52D16D9CEB1EAB71C07E6CAA34B70E3096BF7604C22C40D5FBFEEA616DA3BABD59
-DCDB97D883FC8742B8267A16A99B7953225F7144568D566E64542C92E538AC140C851E5D295528EB
-7CBB49909B1CAF6409C9BCCEB325468FA0B5F7CB2987382616B477CCFE4F4AC79E4A6F7165363543
-F04DE5B6F6E1C2E910CDC3CDD6C4C92737198F892337DCB6647BD226C820AC99C65D8E7772BBB74F
-E65DCAA8A22C33BC168BF48E40A82700A3A7668C5A9A71E397ACDFEE7D556C5C19467B7AA69C260B
-727407AC837BDB7D67DEC055C1F45D8BAC61048C45BC9FB3CEFE7549EAA2992D2EDC126FF7A05EAE
-58613332A2BC1465B2BC0429162B907D65F793D236EDDD8D35405866D71B25F62DC4A7E06D4DEE82
-840ACCAABC0774F8A63E9C0F7FC980B3583E7A8B01C46590E3BC04EBA565C2EA94F057D964A78A90
-EA9F52ABFD70F84E44E434BD10A42E98C794065724341F907E35D3CB257161E01C7084E3A0166D15
-CED65DA7BA87DBB2EA33D39BD99AFB93D3548358D08330E807F8552CECF63C84F805205491BA3A1A
-622E70C232FADF3BF2DCFD6F0539158D3306506F150B0518371912A25EB96163D73E9EEED42EDC84
-D688BC7F7708D9DCA348FAB4DF62E5809BD094842D0A31DBB7C4B41F94D946810C5EC10B69AABC2C
-91A59500B2E5D37F4755DDFB7AE4ABF757F4C5BCF77C7F95E6A616646456FE8F18407080BCABBFA5
-7704287AD26222DF91AB2613951E2D679472F8ADF06EA2A20205EC19972299A78BAC52114334470C
-5F5890C2F846B4C6042D73945127F2E3910ECA1C4CD7A16EFE4B4BE38A15AAA710682C3836A8CA83
-FD384970139D8B46FB0AEBB002DD224199672FFA02250FBCFA4E649E335428FC71F50F45E498419E
-DB0E970F46894A48F65580881C9C4250FCEF65C9B28699408E18B26FE6DB7F1CBDB767564E73CB59
-54C6D639CE33220C894F36E70F71C9F9AA3FE2AE0AA0E3F2E304EC5ABC661675CDE2E70519E4220A
-E26FBACBD01D5169EB844750753E6CED53E3678FDCD08AB93E10067E9C64F38B40B76D99B6CD92BD
-F4155A1EA5CC824998B59AAD06E09E5F15EBB2288D66EA71B296616734FEF2796F07FF0D8B047074
-A1111D68B99C2B70FC56E74A51B062F4998ACC85B1943C9477E436E5CD7AB18DBC898D21BB93475A
-623BDDA71D7B895BA2D4C10F4B90BF335126F4FD57D73AFA50170F6B3C364922E551D40E35DA75FA
-891762FA23401D39260F2E92C7807C746F13BB35CEF9DBF2E76E66A72FEFF095DA482A4DE8A42091
-7065736CF4DE904FB52E649A32255E2030A7B31B686353492F31C064A3C4B0448C4BFD44B8E15384
-FD809B8761EE26A7DFA1758D57CE4F0BC376EB2B3833534B15A83436BA553955ACB5A7A66796AC5B
-92DB5388BC53EFA27508B08E82821E5CF669BCE52BB860780F749B4F38ACDF5FF12726BF3EC2743F
-01014CDE96FE6B4C40A034E9EAFCA2A35CCC776C2669E6AD138070A40F48ED79136D7FF57E993E09
-B81C543FBADD350FF5B5F7A46F060F88E30FE2D8233832D18B6C323EE017EBC1DF5C838321CDC8A8
-4CABCAB20B60A1A3AA028F36EA6E87C850AF8AF7CD50AA6359038BFA8818821D02CEE8F51DAB8C05
-F7AE9797814D97F3DB8CCDDE45B21DBB15CEE292FAA534A5F317B357F4091F3DA357325B8B9F5EDB
-45865415973C143E5E5BAA483FBF2D06CDD4246675EC58B84C6AE65CA743117FF00F229243772561
-31A7F2BA26A9115AFD96C18216CFDF41B7220ED0CB3FCC26C36380007B382A02AEAE428887DC8BE5
-FDD630AC57EE3DC156C7B8B29E687F24442E35CE10BA4087295A641F7139C831F7CCDA6CCEB5DAFE
-537CC1A97C5A337D3C48A6AE947F58A30DC08CC7B58DBBB4737AD52783C573FC1E9408F55495A80E
-7FDA61F0B9C4F090158F1A416249EBBA936C27BEFDEF19D1BFB839EB70576A010706D8B95657B218
-9C2AE04C11EF9E57FE09880273761FB4302C388BD608FA0C7F00F033C9C00F4E3D5CE2D903E0DA52
-E69C7745EE9FA75E2AD93DC6CB5CCFCD3782A699B807AFC36AD1F62B05856D5DFD6F88831B90EB3D
-CD523582A49732E3FD7253126D39E8AFB8458B5F7AD7F94A8DAC13365F433C857AF4A42C0A08C4DB
-9887C4957259ED22D13CFDF5995DA957EA5A0F620B0214FBFE08AB6D552DBF048D62CEF6EFF12F15
-3511ECA7833E0E3E95F85E6AC0F95438AC4C126E1F1ECF336ED31CCA7EB216D279877123FD9FCD8F
-B5E52B587CFFC4428456DDCA816819A8A4A211D8F1629E5D42BA4C5C356E580C8A22C61D987552FA
-A97893816DA73D423686E4EBD44375C257F031318865A20F22115E72BF1EB9F93AAA169C140A33A0
-6C35BD4526A38BE79CF40AD1EFA10411E8F3300A8A8B97AB140EE6734E1BEE6C8EE443D698D34159
-97649C6F10F20ACD80236422E215E146D744A262DA3FC88DC0D86FF66512F49D3F957D3C5CFFEB42
-4823509F33F155057A4C6F37B52F4667767BA94F6B8B62856B553F307E5D230C44CBFDC9A97A45B1
-39FFB2F2565EB0E22026972FAD0FB7B9576FB6F368B61979943A398773600E7EE1DFEFBF26D45D40
-BDA66EBB96A56EE9CAE0B2420C5DD83E24DBA9FF885BB844BF3D2BF93B07325DFF60C0CB5FDCCA0A
-C8FB5A2E119D5AF26E53AB8E3B428481C2871DDA26EF0B621CD8572B3C664BC7AAC01A1D05B98F79
-1A7080D294BE81099BDA7982432F3DFF4775C44D23F4F1B2E0162B61A8B2CB5EE8564BF98E2ED403
-2219085FE6194C19DAC98A421826CAED7F1AB1477AB327506010217283894235D7DBFC1153D5ECC4
-8AA7293F19592B4D7E95FE55151889BCD1D7FA7DC2370D2DFE11D7E4EA34B5C7A8E73BD3A348FD38
-9EF45B6167FB90BA44C23E912F9A4F2FC0427ED070592F7110183BFDB2C400393BA7569058227926
-351F07FED4F33633BA03A72AA2DC6B598E49B96021DD868DAD0F352E5722FB714F667C15C68D49C0
-3D822D82677EDFE86FE9668E537DA284068C9B0AED83074C92A5B939296D505B837E6A9DDAB1AEAB
-7455A08A114C2222B339284674B74BF4CA9EE0C020BF2A148B439C71C6BE51A94CB64FBE4A7EB295
-5A455047CF5CB348B062ED4F6471CBC3E9ADD9BE9B96879AC7BC71BCE02FD02F17C6063985A5E898
-3D205AA1489DA13C408990ABA1C54F2F501AA172F530480D789C848118C0A74EF98D5F607A067BAF
-F6030D887AC6A6497F9A0B38F9705F328AAD4BFBB634F739386177B07F22D5771282444E5EE17335
-B4D0EC86117C697E79A5F4F65FDC08E4904DAEDAB20067EAE2448FD4301849E456D085F392DD1316
-7ADF75CCFDB723E2904A9C0C976D6B84DDEF9D92B0E15FB246C3ECC2D0BF314CFB957757B3A3E8E5
-801F520644E4601D291DA0F7507C06F3B9BB36FC1C70EAA444E14E56C0CFF06C7F853DF36DA9D8B6
-AF2544B853DFFF535A7E5C6FC145250CDDA229956019659D0D253A19A7B51A4E538BDC01F74D7704
-9949C2C97C7EC6392C2E61CCC0992B66DAF1AB08551063E53180D2A67DE496716CCBAA45462D9F91
-B66A22545962DDAB120511FF08627131B95E5DEEB8B4DD9643E7B2AF65C0FDCE11F5F1E8DD468DA1
-8D41C8C4F00EA73836F4F70EC50FC3EC6D358C0658A4261C6D15A582A2C7C994E7882E661855B352
-014576858A265FFBC425160669CE159D07EDAC04D060B44E5800A7AAE8E339C29B929AA81D2F515C
-46229D2080D5917AB20AB6B34FDCA8E4AF64ED660A3173786FB1A1D005D575C2A5187D3F7CFDC94C
-CC44A38C5CD523E9DA726D8EFA6DA7B6131DFF3435FEE838B2C7D6B97934295F06202D307FF78D90
-6699CB9C5BBB10D1D4DEA5FDA5BFB094E704607083B646D37F5DA1FC7AD21B813F44D8C1AFEAB666
-55AAA19703BEA2E77DF3BF350E17C74B3447A452235919452B5175570A006C7680AC05E8950A62E1
-1D7E3ACA35A397D1E19630D094A86807593C97F4C484E4E06BCFF708B6DCA972E3A0009E1CAC0EA4
-141530F5C1B8AEF5E1B933F37FDDBC4BE22B74FE346D1A3F5FEC0818F8E61765568A2AC04713E828
-F98C449D9A1CCE52D10D61DD8BFD084C8D099A75D89DEA64D5A7CC68BD5B0593D97953DADA976383
-F5015915618AEC56D71D1DCD55B89736395C609B315A3F1E1255432FDBD37F38CC43C354FB4B7C44
-F1A7318B0B7E99C3C08C33B953727B6A6328051783A0A33E3CD9E498346A3CA6A77B517096EDD52A
-E443B87643A646C3A7BB97F742888D33F9B3127E61942F4103C1DBDCD8EAC8F9E259773066736CA6
-53CE57E8822651261D847C131321BB9D6626A1AC50D047C0BA47B411DF2A995545BD68EC0287CC9B
-31D5DDCA8755EBEB10ACCB3903AB0FD5788E984220443B8459E7C078DA4289F1350905881AD6DFDE
-C47302B0ACB0D4AF8CAED02B4B70DF3CF8FEC118F0FC2D3DDE3E494CD160E676E300BC464BD4400D
-B50EE43B314E0517037BF971ACD7CD327CB2134893B8A0410E68DDC518F5DEC966C7884CF5FDFE74
-723177F20DEDC039D879056CAAB4BF045062D3904F615C5CFE109AC7A35599C94024B41019B9AFD4
-04A80ACAA4837929F5C9317680A13D157A03B59A5588DF79D2E113F5F51021D6F6F90E8BBBA2C252
-FD10651BE80BAFD59C53A3367BA3C28DB6EB9DABF1EA99F47B503F627E15DCF3FD645FC52C5D5D0F
-2F07DB4C25C0D1E1C00146E1C4D973E613CCDBD3F9450CC0F5343D79F05E9492E86A1BB889ADF405
-03BD7F3E7543436859184A5B20BD8A172F350D846B7570803990ADAA48D4B9155A2B4C4BFBEF1E1A
-065C08E03928559735BDD442FF1E83E1FA20A5DA57D8BDB2FF5427C034CF0128AF111E6E73099E04
-6E0C240E80A73D7BE72B87834E45898D475521CA3306707631F5C6136199F354632D1A085F12A1C7
-C473868B62E534D15F5484323E63D0574196A19EF175214EB35A90873EFCFB92D6CF68761D45E37E
-AA61E1A1979A82009507CA193E44B36A806486665CEDBCF387053ACEAB979BD35D30978FC7659ABB
-E844F4ECAB3303318ECE80777A5FA5A9DD91B3D06804C4B4E9B4EFCF07EB89866D0DD8CA390CFD15
-98651417114D78776B1A1D36B4BA17746D6BE7FC123D473EF1EFED1C3BC1D555F914536869FD5B0C
-35F9C83F65B0E6BF7A627B9202D787D72C600DDB6BCCE613D88492E13CA0AAAB196E8A49928C62CE
-A4FFE2D0208EDA334ACF47F20BD793124D2C5546C03F4A364369A76A0425262F9D9118AF54E37D32
-E33AB25DD533A49DF5FBF1BAF4CEAC2D9D378CDCD13B00FDA432D9042F623DA41AFB80699B5538A2
-5403B0B3EABEC9E8EFCF42FEF3EA9F91766902CD206B0787C187D5370B60AD6DCD002DE2DE8DCDC0
-B4719A797C5E26BAA67665016DA0D967FA1346F9588AEDA174CA001B31213617FE19EA218EC23597
-79D979E2663166489C06993230B0D07973A117C4E3F4A4C93CF8428248DD5389414D679C69644142
-67C7FEA17E35B0CEE456667A9B1875C81B2302BDDEA2818D6019FC1622A82051F60584ABC904CD91
-8676305DC03FFBCC64FDDAC8D8AA9CE2EA00D6C97BC63C8A617DEDFC0E40775649438E9F61AFD179
-5E3B20560B01BE5E0983F136CF48AB206954E41DEE0D9DDD953DFD01CAEB569151D6BC0DFEF29D70
-FAE3E198E7EDD8922C0E0BCB8BCCF1C016142C1A8B337AFA7A05A9D7534B184BF3BF827F371E9BD1
-9A71244ECA1BA73D484CD2FAD54DB2F0EEFBD54B536EBCB5094E6BC2F5B2AAE41F05B4B311115876
-ED42C34F8E643B53372E3F6350DB8A38445822EA9A33E27FB0CC42CEDCD1FE2FDF723FC47C996EE3
-56C402112F24D0AF899B2D00BEA1CFD427998BD22B2A09046D6737814448ACFB10D387547D7009FB
-384AF0562C85694C071584236D0F1F3D3FCD0CFB38B77C81889061E668BA7AB37AA60F58A3967DE2
-6F939B79CBF10A9DCC42852561D8D6754F1B660D216AAB1E133FBAA321C56E2584BE5C9BAE20CCF0
-0E8DBE6D9C2FCEBEBAD945C3C04101D2387351F132628786F6D9D4CAB83419288D31F9BC600D9664
-12E6AA457CE6CAD26A4C0671097B98C2384C81DD8B9A3222D4F4BBDA7017895C3EDC26662779AEE7
-40D9D7E24185FB821970B0A3A94041A69E4805EC88EE1EE521981536F2844FB8F5EF645F67D42CE5
-148E2DDE43AD5AEF200EDB3A2C7866C98458A92666E5F9E070178BCC39F65A893102A10564AF4E8C
-AAA5075D2F8CD7FAB0401C03AF299EA3515CC93066744EB5AF7CF0ED06675BF049A6E3C211A89E16
-DE5BF0445A7CCA6EE8EB0347454950485D884606651E5887FE8B24323E2AA16DE22FC1FC8C4F06A8
-2A1FDE5758976024068197E1F4506E4D3D8A16D40461A4586338B374A592DC60334402F76388AD6A
-457DC3F54E6169CF7AE3959676E966A45609621055EC3AF80E182633300A4418E34A66DDFA6B569E
-5A13C9115B5FD3EC1CEBE50FBA247F60803AA83976F00117536342DC3D9890C49B2AC701D370E43A
-955118967827760F7091469C5406F08F18D7E3548148CF0E312B1DC71DF67A5E7A1656CF2F47F3AF
-F3DD50FFC2FCDAB7177285B29C17CA43019F62AC6FBA52D1493ED7C427526470ACC8389BAE827759
-4958908F517B2863B83292EB5AB3F57FFFB08393CA610FB1FE905D88A0A16AC395E2A2A6DD033D6A
-0D68992F830B2E1B95FE357BF672716E88FFB92FFC3D62945D1EAD22BC68C51EE0E10A43011DB94C
-44685A5C4576F6EF44CBFB45F2A4BF110A01657DB51FD499767E78058199B31DFD60813F1A344F86
-289F9378231D5B151C92385E3650B4FEB1DC91018EAB8474CBF69FDC1496A4D078D2C351C8196451
-247A9DCF8117E5B637371D8E22E248C64D999015C3FD2311E9950B8EE0922FBDD3D7BFF766BFE9E7
-CE0BE12F318FF2A7B5A9C6D00A54401609304ED2C55F5C1EAC3D4B38355BBD85D66D61636FA6E30C
-2E82829376BEC979A6FEEE040E452359768ECF90CC539A546F17AE906C76F14F86FF697797322B05
-1EB311A759FE260C1EEE5DACF383816AAF1294CFFA7BF87A4D9BC595EE8F2C2F86FEEE11AD959D86
-F22FDAF4CEC098942A57E57813A0FA99239E994FFF353C1E781D666B8928CFC648FCF0869FC68468
-BDBDA7D280DFAB8B0B3A4CA35B074B686DE8D372C61FB32305169A1A9912F6541DA16CD6316A6EA4
-51524757BE5CF6E820011BE3859FB8B8578C100FF029680E05F0E0BF11D33FE19460C85EA5E4C0EF
-28E29407C8AE6BE01CFA0D5022BF9FB01416FFF722A784DFC8FCE330EC95737A854471D334FDC58F
-AB42867A7B62836A8B56466E9A6C1247D46EBAFFB905CD4321970F59FB8D6FF65FDDD34BF913AD32
-2E68455C5FF2D23C1A5EAE687F259BC982B6A384D35440F7C693CF50B9ECAC0B5578CAEE87588B56
-2EB6B7F42034C9F2E545EC866316552354EB3728C7D26527ED75174EAF635E048B08DC5D23E88981
-070AD5641A652F2344956E9CF4C16E652A99F4A644D1787D6D36537489DA4D74E61B2FC4DFDF1D1D
-9D58F9C26C5EB63200526AFD168AC57D5611ADE4D4A382FC28BB60F9E7D626A6C67AFBCCD1183C5E
-3CF2EF210D0BF5CFA7BB10FA3887BDD4CD96EEEAA8F9219AA2F10ABC0A960C3B57C0EC0313AE10CC
-FF1F522124CFC8D2D49BFBB0C193EAFFC5B48FB3FF30B21CB76F0A4C0F1377C9223145BB0468A5D7
-1B9BC25873EA12E1C60334571C67385C00D0B570D3FFC6C7FF0DE62C183C76AEEB12DFFEE1459E0F
-C818C621B8D12FA1357E2B55D48935D70BF140B4CFFE8813DEFD479350B20DC2EB1D3CBB1A2D3DC6
-EE975D58C89D61FC50E6A0197DA9A586B72255023DE47DABEFB11E8AA02414C2FF6258A281219B9D
-DDFE41BA7D7977D0D6F18224FE22F7D4E9355FDB35BF7ED3418F4F68D093AC48F7D8FE4194FEB6C8
-0B9DC1F74E023C604DEA27089F98C3973FF9F4AD7BF7BAE601DB89B08D5D8139B95EDCF6C885FFA8
-B3E4B0477E7040225733826BACFD1EC4A0DD72DC41734856AB9FB700DF83CA2CE812913BD142D84C
-5C83C0B2583768198AF9E885F2BA74877A414233207234AA5F18840557CA11682AABDE8993533887
-7C6D404BDE4153C9827EB16D66C1D73A8143C8A2D3604FF72CE579FAA3C5224BAC48EA83BA848429
-9472007DE96466B5B29ACC7C03B05DCAA38A48BFF9F214DE43146AE4E04FA705421917F99BC54533
-F0EBC01849E396216B9F0794E6F6C6B61B52EF1B1950C0FB609895C3C55FF574163FC8B6B09E66AB
-AED1810E698FF37CC1F926B2CDA3B48C7D77790EBD2D514B6F385D397F713EC3AD3954EA9C846158
-6031D369E8B99E53408A79D64C34EB5A56DE8A67DE91837960E98A66FC04DFA0EBDE21DB003234BB
-78665B039D0A469A0221BD541AF7149A2A659C300132C14581EF766FFFBECBA8B58A5EB3F95446DE
-F49AF863A8113D17B2E7E6ECDEAFC3834D4DF900E3475596E86FBB4E2974C090DB4AD61A737D611D
-92B4535AC291C56AD8B1C031D2F9B505BB77517B737D70AB3723DB52AE2ACCD5DD2F617423ED3CC3
-9CA882EF41757BF7151806A9B8B0F312808863E3673FB54DE939B35CDECA7FBC4DC3BDF5A5F47D35
-E345916C39366C8B4F439CE1C6F1835C320BD1E67375B03B5DE18C93256F251761A4C8CEC01019C0
-68E34447BCC503B9571FE8000627A6B3DAD5854CBC0A2D69E5A8F46BC78F6A7B1422334EC7A98ABE
-FE9B83E01DCF3C6C9273B346F3240EA225AE4A4083CC7B0EA141A0773FDE940768358EB4B13D82AA
-304A1386D450C1C0C6A7D5A8FD2BD313F78F85248B5196241E31E5595F3BC01F37700A2DD3D4A0EE
-2DD01A36569CD507130E8F5B1E96CB560BB7DA15560CCADF3B2C9804A11D9E8055C9EC70E48C1D21
-3EB756A1376F2EDCB7189D78CD3D6CA5865537EEC31C17D801605EFD860B0B629472690588D02575
-02C6F7A75B9A1C1B397781329832CF3EC43C09F1559CD562C48FA9500295CD3B0A790DD3FCD4684A
-7C7AC49AC9BFFF36B39A9FB148BC28D37907433943CBBF0CBDAB46D3EA86DC8F81C859C52D15302B
-94A9B51C199B7104DEEC9D769C2634CECF8B700CE9C04152CC59C9326BDACBEC4312DEED92DD087A
-1C4840868D9F97CAC046581F762F75E8D24D6445370A3F1E0AE74A6478D9DAC37E7FA5BEBEC0A1E0
-81AF89C1BBF7F51E3E2E22C8C405E8671BA85F1BF0DF79A465DAC7EC07F731E00632E017D190A99D
-83E27E5C2E63D7DABBA23B2E88334C63721AC5A4CBC5D45F4C177259F34C2EADE01FA008AF65EBC6
-01D8DD16436D86AA94C99F3CC0A2F87134E73BF22F108B825A8963B49C6C685474AFE4A542C8641D
-C0375D7EFE9AC1168D9700459BE52D0DA399023E141969F25C0DAC4668534B6647EC85454BE945E8
-26B26DE6E3C4584B97A38E2B40A0D23481BCA78084FE80E00A71A790BF31DF468A435ECC88E60A57
-860BBCA3D65930186E9917CBD209C230E8F8255A7ABC7D3F043AE4D7AD63D9980BEDF062B7D5C298
-C40225B6D03F29A0339E0FCA02138E526F06B9EF47F5E7A8068A846CFDE2BFDEBD24F5A73A66C079
-18662AEC80B43246284FA4E2EE0D9AAB172B1E59A6CC46B801149D8C0DF6DEC9A55D8E1B0EFD9D30
-2FF618075944CCCB6831D336B11617107B0530D09885E5CA11A5F1FCC8D69D603DA16BEA51116D42
-CAB1AA1E4D7B9B4D79993F2BFE53EAC904FEB70B2D330A89780EAC10D12CC0C35B8399F218AC2976
-E57A26BAD20CE2FA2AE2363D3FD2A8A971747556F2959DA74A8963C20B504711AE1CB0D0C02457FF
-2E9BF696B159AF031DD5155F21C0F5549B0471A3C5DC8918B675CEBCB23E29322B959ABC05283A70
-2E878DE8EF25EA760F3C5C7B7B49D398283DE2ED837FD59F7C22D62C58FE4448B1049FDEBFC8787E
-67D7DAFE9774979BB3802254DA59BCC0219F98C219F84D995CA768B8B5D9D4A32525DFECE003675E
-E4BD5D8DFFC11025AF2B468F9207B5B2B42349B98232BAC0759758C1F4A283405815BD7145C93FA0
-8F3ED2826655053A3C2559073D8ACD199DEA2C5BA5F616A2E48548B4370EC73493BA07E197165DCA
-774438B0766867819C1154D1959FE6E01E6312E0AB91FC2E2BD240FC8652A2D456A1DE7F34EF372A
-53794D4C4E050BF3CA5B7BD2F1B8DE93B4C8002485CB219AD2D029739FD3C81CC6E78EDF38723576
-1A57143EEDE5CC887F282FECD261F6A25D0A7E154ECDF5DC38E426811BE86AAA458577E5E0C5F0F7
-5AAFA9C41E5D1DC9D91ECD79B514F8CDF7A5F1A189470D35FDF4F9B8788879CCBD91B427822ED658
-389E981E0EE5F7FB87692A3E3E931DF8A1D1573E3B0166204240B7080089A09EF7487C9AEE2D665F
-5A82F94C877FB5B0DC531CEBF1E71C6592CEA2401E4B5122E5091DF03D203DF979B9A6EFBA12E2F6
-B422FDF15D49AC0914D372D21E871DE65CBECD105FD4A3E4714B9CCA5C6803FA39DBB015EA8A88BE
-7913502E562E5B170B87BFC8572DC9DF49AD63694311EF1334444BDF0B4CA3245271C1F7A4D7FAF1
-703E3AA0E1EA8D5C6E821B28707EE0C9B4F22F23796FE87356C58AE2CADC191F4C58E1FB58DA03B4
-5A25AC95DBAE13A293474217BDB214742B9D9D6AF35F70FED2891942EACE3E625E55FFB820543FBB
-250A062D3D395BC0F219ECFE0D76686AC148BC41476A887BC494DDBD396BE200FD3E03CFA12EC9AF
-6B934A283C42AA05589AA6B4A8D16946BB51F50419CABECEAEC5AEF9085C9989289E9B46BAFB6FB2
-782D84DE2B068F91A9744AAB237CEB1BA513E57E4C307108E993C972A3E0A898D5A8D27833155031
-FDB98863C3BE7FEF3004CBAA5CB60A1F2E3EB4D7290FF5FAFA088B1CECCB6CF51A58DAAD998F0839
-6CDFD68F5ABC9C1CCB8F6514107773C69C26873E889D1F79D10E866910E4684186FCD71C965ADF62
-39BA3418B313A27AD632300969B6F284519366ED85E7CD968D64823F8C59B5911A72D0A20EB72B60
-3A61E36F52F256FFCDF706B4560B4DFA5D918FBC530D83A4B3C01BDD3CB4572E24242D141BF9E775
-36693A0407D002E09CDA5B195BF1CCF430AE9824C07928A050D0B460F2704BE8F9E647A4884C4567
-0A81EACF7CC038643EB0FF18A376FF6F32B6FE4F197273327FBBDEC6443A299CAD4B26F7778A99F6
-5A11BDE047153E764039EDB251936AA43DEE50DDFDF8856519056AAFC4C5AE6F2051AF0579A9ACD4
-1D00775D7DBE70022CC263DCA5E0A25B9C7C4F5C418587666B2FE24816B1E0EC92F9074F1403BB83
-AFC3F1D52CA79C387BDEF864366E34C90BE52F7AA09935373A07E4E026224E76F9EC3CB9E7EDE50D
-EFDA48248D61F3CEC880A3B8843306375D9711E58645F3625BDB8E87052DA67F9794EF4AF8DB0BCF
-E00677C3A26907DC651BC838C40EC39E2B5A5DC0DBD345944A6C32226089D63C52490FA10B215AE7
-03CFB663EB8A47793B84CE7364DA1C4E7FCE32DFEF09490121222774915BA59C78C2275F829D15CF
-4D8686B095C38C731B83D48738C25F40B8ADD487C350A2EBE846C3916AE384CB1050F9F5DFE09FCB
-D9129C6270FD86D55A459618FDFA4F907E6B4746196BB717865AB378414029017551161A52E9D24B
-E4F7EED553A927933D4ABC8F25DF607779A717909CB4D810DE8F5762581900E224E4B91598149BA4
-71CF8068ABE8744356B261600BFCC57FB8BE45036CF6571D9B2A95304933BD4F17215F8EF53F8E08
-1AF61FA7F9583C34EB5655CB0ECB82246959F09091F36989EBDD646BEDCA614B9A61AB7696B3FF18
-1058A150FA6EC1BE2EBC7F64357A3FF2A2B0491D2F4E0B970DE5B7788B467CA678039B5EF55C88A3
-84578D427FD2CB16C87B0BF0A3D37CE8ED43E0F049AF2436344D5F47C948C632C94A287509282561
-6C64C5D262FE5B24916FFEE982A69A6CCF888BD01D62EA591EEC51F4B7DDFAFFBEEA93FE08D736C2
-0129E345D06B10246A5F57151C198D407730713F32299638EFBDC01367E23EB59AAD42A83AB41B43
-2DB462652E29813740F4680A5D4BD47B18328FAE6BDF4200CFA4CE3773809B45E8887C9B2E423698
-9F6C48D64F5986F563D9A7538A8716082F81936AEBD0461E6F4BD470436D8B7656F0FDF89108E6DD
-02ABDEF907731D458D690BC608EA9CED09EB1E6E64C0790C7A2378201CE997FFE0317679EE1D4EE9
-F91157449323E53B4ADA8096CD628B5861BF794543A98F2FA2AB54FF0F25A13DAD43DAF9394329B9
-5AA53CA32749FECB0B2BC035DD1EBD53FF9FB5AD8BCE06CD89E5568091C1CC314CFB1D9821D7F9AC
-7C55F55E0A16E39A87D43148201B928F3C42B110FC056189DEF183745F3B637441DE8BD4C3C7EF12
-F4258E306B2877ADAEC63441010750DB4E6269A4C78A0AC01BB3603C386651FE814031CB5D8C1F14
-9EEAFF652A53E57BBD4C8C0CE36A84A319A53BC1E5FD3F1ED1EE72F4C1A9BF264B594062FCAFB22C
-C1FDE3F2E3D3C17DD3F7FE0E15EBD812D550227C06D01127385374A11438ABD50048E17255FCD2BB
-85122A6FB9B7DA9D5E9DE8A747FAE0DA45A1FCEFE92B9E70A5B2CAC668D4D07527A5C1403267D823
-048BE671F725CFC7474B44FC5AAA348420B2D7C23C6CA066666FD6F2208E329878D90CEF1C2E77ED
-22D3BEBB9D547810B189F08920A27E7107F208591A84D463CE2576C70C3DFE6643E4EA93F4E1DAEB
-41D46F0E2F56FC10C69AD5034FC9859D31CF27A3A1EE256C93111F81C11ACF1FC0CE20B90BAC9AA3
-27A5C85A7985B951519FD4B03C40BE637162AF41B2FDA68F0D1E9B7602FE2659D3D75955C579AC51
-DF6A552EB9581AC3F712F083F19B52A6C4F560F36C59CEEB0C996AAF1728A2AA45DCAD79BD7B23AB
-388D5B0B64A2B95154B6259B730B0F4A72C8C7F7CC93C7D64D9D8810D1F63FF8ABD4DB89824E2D26
-4FDEE916C41E299211DB1A53256E1DB5CDD04862F034D9404B73183A99D3D13D642A663F129B6D16
-7095BEB4EAEFD03DF2FF2F0B6B594C1EE90FDB203DA89FACEE23F1BA3901FECC75FE1811BD701259
-343011262B6A0A9707AAA6316BC3C17F787BB80AC8DA5AAC942D90F80C5A3BB59E47EC767244AA95
-C63E50BF809998957936D3BF6ABC24B0A397258F9EB4DC8F65692CB023D9091FB180C69498CD0C08
-BBEBADC84A7E0016E8F8BEA325D924EB0DF82E75D2CC2CCBF039B11934363D4332C5FBC5EC556BE8
-5EE4E707CC2753CCC43D2ED50558E51A104221C9323CDCB0199B7B83454DE3FDC810D0F362C0299F
-5DD981B31D8E3DDA284FEF9DC8F9C8DE138D3065437A7FE8C30572AD06D62E8527AD37AE39AAB0B2
-25F76A25F6C6505241ED73BA494CF923E919F688DDEBF193E188F8C4C154F21631080763B4D091E8
-AD1D2FD6649E0CD9360E8D1A67A5B5FAFC67547CA31C95A5EA8D4EB5D68B9F6D6532DB9B54584735
-9558542A2AE58C09F3BD2918EFBE1699E9C8F2C2A11EA4D224C726D2ACD4A8D8ABAEDC6588CF2AE5
-66528B94F55B823A2A1F7BE19000F3E7579D094E047075DF18C8C868760295533B26EB3ED90635B1
-29C17ACA679C3E88B06998CE5A7A2544B700229F5A6A504BD3E45B276471959C8A3F81917A534287
-39B5EF9E3D463B3BA7318448E2A3E79520D2D245A2A72F31FF7070B6E4624E3A5E216BD103640C8D
-F387E49D732529C611F8B971073F17EBD2F6EB18F9B74A67E1997926DF178D4C9EDED435B9682F1A
-279C81BB9F60DAFE125845A2FF3B02979E5481C78A45C479BEFB9FEF3CE2BA9BC46C77B50B03E48D
-A6D17B76F06F3AD118371ADC69E178C52B5FB4B261C9311874ED07DD6D5B3226A005FDD7A6D53848
-09E7063F036CDEA41619122635E835D2D74CBB6AA9B38CAA4D819C26E95115FE0DBAB4198FC5838F
-2C91B7A87B07D734C6D4F4F83444C1E90AA9BFC908A2BAC4B3DEF9157AFCA5248F2DA31CA87BD363
-AC25E9E77F741D4B2C6E02F04987A6F49D30E9038CEFC41BA172DD675AED8B392164411144E5B738
-F3210B0E66B17A13CB9631C33D44484E792A7C082DD0A5382F34C5637653261B1EB6D2035B08B4D9
-1FA9AB770CAF40A103629511F7B43F2743D7E583433DECFB19C21FD4FD0AFCC22A4119E77C87BFE6
-FE50068B22479015BE5A9F06BEAB4D37412E062A45E0CBCD7BB39FEE747E96306F79FC4F2E8942DF
-5D9DA0E55AACCDA547DA19D30B8404FA121298B44C9CCE198C708C69A8D6BF17591C5C50D3FC5BE6
-961F7ABA8F366DAE957A1C3730DA4A5B4F035A9274675EE3BBF0CA8CE9D8349F50CABB1C3EA4948A
-BE6F9F143592F1EA95404E6909A909168E3279A957AE1924245C356331A75E7008BEE92BEAA304BA
-40B7C3F48F74D9018B3247DF50EBD7CE541DA48ECCB1B0BE51A455C3C13C279D4D8676078C3EBE43
-08748D52C9B041D3E7244C745B1F2F742D010A9E60695F3EC4FDC1050AC082B905D6A57E8F407A3B
-472F731011A5798965B7B1A307E252FE02C8F79CEEDDEB6E165F1A94D7FFF18DDBDF79477F14E9E9
-3981ABD200FE7771B29D1D2D120EE79D28B9543818527039AC74085EAFF241B56D08220C958B5D9C
-87C0C04A14D52AFD475B542D391BC54FF33DEF8D9484AFF6873BEED32DDA4B371112B523B6CE22B4
-0D1B416B64C9370F1CDF2C548F4CCBE9E12E21C36CC3EA52DA232DCFB65F66B22B5E2EC04852510D
-5E264EE939BB67AEC4764B87062AEB7F680B40BCEE04AD45C7519EB3B6199C9E0E332661463647F2
-FB7EDF303EFEF84891CEBCF0FAC5F723A9D0476C3F8C092604C87FC69C7A90F4D64AE45A478EE8BA
-2DF50FB93F55A3546123F0B0E2C1C40C98EAAE9F0F26B8F80FFE6E6B94B7E27D2884D58B8A119662
-2DF6BE608C5569D7864BB756DF2EDD184B90812B44ED4A32D001C31383A40AEEE9743651F7950846
-15C48E402DBC01C818D477EAC0347795CB2792E9C11E8FD4A02E194EED1C919D4598FEC003B6D9A8
-A0BC7D456047A1C0579453FC1D7CB2D158D466939A23D7A7B8ABED7E2777EC7487973E73F2266D9C
-250CE30729E3C5223AD93B9AE8443B35711E446A3DC660123ED45CE1942A1A2AD0610467E081CE2C
-8B92A6C82F0B17B5D2429E99F1A6268072C6B5AAAA6EB6283A872C54D3694CD825EB2926E57DBBC7
-C1663075E687A144E4D61C225781D80FCAE1497B442342B4A3F1CD6BDB50E31791CC3928C30835FE
-F845B6BE5E2D7E3F2F5F085AA3FAEB45CAD0D76BCBB1ED859A9CEBB9F7457036F0BC3F195CB1A98C
-9C8648F6583CDBB23894BC719D68C2DBD8003B10D08C8CAA40BCE784D7BFB4EEC9EA5359AC056E57
-B8B0F2EBCB1F4CE40C87FC7861180133E0CB6CE2FC4FE690756D327A2B5AE063E3021C0C0BD420D0
-56F0B941E6B36088A55BA11D0C35FD0132D5F48E5D9673572347171B4328D4807B972831C0D74CFF
-A5638C145B89C989E6EC942148207D6DB82257585958034D9F9D4221C7C9F7013790DBD130F277E0
-BC88BB179DD09E27062379ED06F25EEA8B7FB33C35861A0034776E3813D2E9E5C10E227CC569AB36
-CB2D9DF2E7B7B44758F9DC4FFAD7A24AC7E9F47AA850C221048C3CB35A37CE8EA75632AE65FE3212
-175146FECD6334AE3D3C5F492F067F795E1E8FF386BA198CB74F0BB4DC0000DA383BC4CC3F070DE1
-7721431988D69C8B1A5AFDCCC83C22E16A87E01C6D3E79DC7AFA3DB0371B0866EFB8B6F88900472A
-FEF1C4A878243C52D4E02E82658979731C841C489A6B97E271C4C93800EC7D91F93EB9B9C659A554
-E1FCE42A5EC65AC39190EF4B66DEAF6FC0569A000A9E1495F42F706FBEA4D32EB7EF11A648910259
-6A65CF899C2F322F5679C6D123469192A9BF1A7F1F2C81C554ADB97BD19ADB746A4F81A4D5559E60
-AB94C483DBABF6CE2F28CDB412D50FF3FCFA3B3DAAACC6A83CFED910CCB3B8D2C19590AFF4D75303
-4A6CE7F4156896A13808E0DFEAC547E69D3C886691728E4A35ACD575B40D721E8FCC5385A2EB28D7
-08101DC50811529528F5CB0C009BA7E3C88468E37768FB0D83895AB54DB2DD5426562AF9D8AF304B
-F6EDA54E9C92643DF926F5C3578269750120302A37CB140A18BA56BA01108D4ACACE8FEAE640A6C6
-958EF156B588ADB0EA5F3B0F37BBA12B7BCB221C811415387B024B7076FA4403A3AD6EBB5D9C26EF
-EBDB7ADE7C60B444AB9F90EA493B658B7767AE2BE649BDBB3FE85F460F1ED137C61BD95F7CD3D8B0
-15CE45138538930AB62AA0E54B4CE1A5EC5FEC0A2B28B345B67089A4E4AE14D2E1F5A9C8848DA688
-CA298F93860649EC3AAFEF3E820D86988C8E3E5A4D4BB937791827994AA3E81D0BB3EE115EC36D5F
-B9A392D09E79AF514D11C7B3A03C9F9C13355CE79E119A19177FFDCA34704D38118A8976D1EE5AA0
-2D14FEB1414419F5E85244ADC5C0A765A522EEF36170064BB19FEE3B5F7B441E4DB967DAE0BAC2C4
-8FC6A836E0EF5A69F073BEE1699F55E9C757EBD6FD8B514E2B49D6333815B7DBD1E0694695FCA3D2
-1320A0C4B852D9706DADD8369A95FDD917328BE93DD33818954DBD2C212D2CA81560ED5BC284EB04
-7A5F389E24E43F4FA8C97FECF46589FA7341076555CF55B1C21B28E0C1CBB00AB8B6F67472F27BC0
-D11148F407824B0159B5188D4BB7386FBDBF1C0FAF34721B7BCB5C0FCB7C4010DCB6A1284E9D7883
-9E3C2111A05D29AB7997073B590A81C6168020F1D48951BC7D8476D5BA593F4F23CAC1F9BB0E091E
-84B4E99E5C584D1370DD12DEE8DF16AF8BC6B7B23E2FEABDB7F32779AF8E2B5094A6E9B7A7225F24
-C43A8E5D2B977E1E19E633C26771E23017ED233DBB02C64F8CF03992C6484528D0C8464B46F24F9E
-8380F385D5D01B8893C67FC103498983CF939432AA380CA576D09030CD52FD99BDC3BE16C7204CDC
-3365BF76294A83A1FC14A236F5FE5321904E779B13232A76F8FE521F425562678436359C2461BEA5
-AB27209541F557AE2AA60009C9CA0A9FC7898C14306CE35A50017BADEFDECBBF94EE2905220706DC
-806409EF87DB1D73EAB0698AD2DB72CDCDB293E7FB13C94D9FC87E74502E6927A212F0D7D2F2D194
-64F7A66AC07872E18CB1DDE8F11835DCBC5C4EF039333FFFC0FC1456DAADE7DAE3EC2EE0D3415B0C
-ABB69FC5006F4D14A4EE1A5CA99AD4D5E629C0DD1E0F097B5B93DE2DD001A8C418234C9C45E8C13D
-1AE04E9466DAB8CF1ECB88A4E059C111A6468D2DABB90DA79C7C79E94DB28F6968B1A632F8C57D9E
-565FF91C6916026FFAC0661856B9FB8DE9C81661816221B1FC159CFEF1751E7E403F5F2CE32529DD
-540792FC17A12A3DCD7C50D38EEAADBD10ADBF5D8A82442AA900CE6150EB7A4639DD9FB6E385B2FD
-093493DCCD9014B23EB172E21AA89643A6CAD1093343D85D81261972DE0ACB16A4C6B5F0BE4C978B
-FA12D3CAF0134F9EA49F6E9687C8F99A456745EA252F0BA9968C7F9586E3DD841AA92DC7705BDD68
-2DAE41518A09DF0E209F321D7FA3417202F4BA76A984DA3ADDBC58136885362F02F0A24EBC439B3D
-BBDACFFD8498EBD29F88F016B1FEABC10785438EAC860B554525F3266097A675299AA0967BD3B7A0
-EEEE3FC578D1BE99D3533BD91571AED904BFC9DA1A1451FDC5406E1CD614E0C7FBC733563CD6CE6C
-C31E9237CA153F1F0411114361D731636BCF98555ABF12848AD109371A42B63675A4130B81E97C2A
-2EE2BB5D8FAE2640156001AF0F55D9D5DF8FF23C8AEFE14F120000F14149A36E5C94CD9081DEC277
-C2C34870D05011F99D48B0875A5FF542F067F7E9880109F586BCF2B50522A1F23ECE44349E539E70
-F84E207DC9BEC7CDF856A046F1A03226AA41F541719AD1AF88FF211E57DD0C1275DD0B7B47440DA0
-89B98C6EE92A7D94700B83CEBE19EAEDD8A615F6587587BA8BBA3CE3AA5E8EAFB1FB0F486BE3609B
-169EFB178A4292F4C0378AFE5D24EED1CAAB514DDC66C696D8E37F294A6579131DDF5488E9436609
-ACD750C3DB0A940C84FE022B22ADC2676F62E91E8F891225F891FBA537679B24547BBBF35F04915D
-20B11739F620D18B5B216921D222F15044368569AA302980B9225BB839F494588481B94B0C724352
-B2DF600A22B062561D86CB8F81514FBDAA4F8A043A0265F992FAB71FC9124A45B8475E1EF3DF6B6D
-E35CF329777D45F08325E8505EC0D979F542807AE77E57E453525F23BC59A50740371EFA98678AEE
-6C425374AEB745B99DDB5D8D908FDB551FBC0DB15832107BBECC4E11A1A8DEC69358A574A2ED46CC
-31D564549EFF23102D92BFDCBB2BB985F78F36033E34F59C0EBAFA3BDD71338736464CEFDBA91398
-33995EDA4207BFD4A9867D32E867FBEB7DE60D132803EF9347CB17BD91315484EF6570892297DD8B
-7D966103339535E28A00CB1EECA4A9775F60A9F5FC9BD8B06D78FE8E6318C31DA2E847E3F9CA587C
-B01AE2BA0A2EBDE308314413F4F230A758184ED60D4F71F6CEC22A93A01B6C54E0449A3860FCA895
-4A347B7588329A80974ECBECDA1070FBC055666375229F13DD995E99265DF870BC8B8CC6347FADBC
-1A6AF64599271A475B9123493D46BEC41289BEEB67EB97A8DED7A9C9730D37C65164CFBDC22E5CA5
-89D2E7954C7136EF4E084C43A6C7F361A3E96989239BDDB9A593CC2A80BA16DE9EE90E95CD39393C
-212AB22EECB677FD36D34DEB46C4AD0D21BF7E6D7CBD0C8083842FCD87B18FEA7CECF939987E99BA
-34C214E44DD84C176C9CC5A4CEA76D380CB316BB4EF9DE73D73B4AFD4ADB54451591DEF86621D138
-D5A0A29441502BF6C2ADE671CEC3CB5CAB903A657EB2D70C943F976C110E46C5D9D29BC00A875F27
-38E5D22496A43E096E009C5D3CB724B4CABB32838DBE527F83B18CB457E57B092C302EE557FD4F00
-DB9C56E66C9FDF4EC9FFAAB85F60D02BA79694FABA476A199A0331C30A78A92E10417BA236E23364
-8174C826331DC1BAB87C5F95027846130C6A2B4027930EBF9A97BA1B039D386FC51C302648E25980
-212F6A582CDE2778C677A01FBFB3C5D1B8A374ADAF6ADBF7DC94075F25ED66D440B3922C5F255FB2
-3FD8F6E21EA65B1D93BB225684B50F11310E242B087575973345B229BA62C1E2C35BDAEC04D10148
-F5B2F3BCF7399BDFDF1F3F79119714AEA697245BC647316EA157484ECB951BE367234FD02E8B1F09
-1AAC3D29BF282DFF4011BC0CBA8E55234D943DB3017CC7A766720BBC29B2D097A956C0F1067177F0
-12D42ADCB473CDE8D1BA35B4030757FA1D8211989DF3BD22CE5D501C21EF8708FB3449DF47D88650
-9FF7B59B76C0DBAE443F336FEE2D615D7EED1C284F14335BC8A26BF4621E10DE9611FB2F1DBD52E4
-B7565D8C65B54EA36D508BCF0C578A49A2665227CDE1F9768EFE847F9D94F1BBB7DB83701C232198
-5C7283D47B2E40B27A268428AAEFE75F6B2F8764A8494E5827573758CB9CA46FA93208836BCCC8B5
-564A69F5AD882052AF1C1417C3FA7F580569528682C77080F3688B65E7FC24D2A3AEB61574B4A321
-5927281544DDD7A6EE0A3E9388F8F631CE7251724DF70726E5912DDCCC8C652DD6C9608F8462303D
-867F589DE0F2F71711B35142EE6EF93B64D6326C4DD7DC83278E057100EE772082E6BA368ED91A55
-53ECFE2293A481E42F83BC8F9148C70EACE91F7B7D9CB8A72415BDB3AF66F68EA733A17ABE9DB005
-3BF148629132969589F38D30EABFA96A01FAC72650B5A6FF3935670198A1EA33810A9B11E330EB8B
-451F24F93544263436F669AB5A90A53B16CCEEAC36B1445574EFA7E802DE73522BE725E68704822C
-B7D3912717333367895BBFBE06966A5CC653AAB5E9B3596702086BF0010085B900711932A95ACF15
-CA4DC45A754EA334E9EB84D6FC8E3FC4F897456BED64BB93B593549FF0D5352275D8E417172A6664
-C5E0ECED1019494A7ED49AB0B965BEC1A82E5873766BB38D7D856049CCE2FCA65AAF61E961B60634
-E2A69EF059754C9D8163D87F928C222772D070D83FEC6FA5AC734AF65E40BFDE521F7D9CB1650FDF
-64754BFF21EA3FF0AF7611A93D525EC9B28C51AFECB04E7FC8323DD6C9B0D8539A34FC3CD8CEB795
-8E8EBBFED4313C77ED469C199552A9FF70BA5423B03B6148D4EAAE17B71C5B39DC436AC53D6BA8A7
-AD81AA8B02335A8B2B11E9F4FA913159A725B8AB60F52F1A2EA50EAF4D56656E615BF382CC68A690
-BF83DFF24FE986570ADC0290ED1A37C1C2AD469CE789E0EA0BB5CE01020100E729721AF3B5BADD33
-A2DAA6C33EB8F9064F5292F715F820B4BBFDD56F76D42E7A1A068C1CBDCE4640082F6E7D582D1939
-990CE6EE8D270015A2C461798B37DCB5798EE9F7512168B76D26C28BE4A49A1BF96C89D235F21A1D
-B6A96E5DA474D0B19B808D13D7A11BF39EA8647499C410ED9894A1ADF33D41B6FC2E614D8087F4C8
-4E437B136F3CB32DB8393C49177A0675A0C9E7EECEF448A97AFDBE840FA01FC7E5F2E8FECEDC1884
-84C312E8635CD79195475DDBFDD4D38D5A0246DE2C7F21608F8D2C0DA1371D302E941572E5792A3C
-F4E51A33228B93A814D03FD4FC223C314CF3714BB3A34BD4F7ED6348577FEED9DEB082C4049E57B5
-D3CDB7F26629E9F3BA36893E09E3C7463D02A22D7056BE76B87763260E46E48BB832B7EE13F8DC05
-37EC8E81E9BDFEAD8C27EBDF1AD706933EFD11131E12814F236EBB01BE85B7F1B2D627413B324918
-D247604F56EC128909873FEC3857028BEF76A3494364C2A7002D104D486236C30B48E2B75D851C34
-EA50BA7FFEB4E19190898AE21768C157C0CAC628A2181A32796FBC1A7271D2473CD88E5395DDBDB1
-FC3AA8DF0F3D588637F19A8B833AFDEB5F655A8838EECD684E2315B72C75CEEFBCEF94344ACE8D6A
-DBE355008EC72FE7CEEAB01363A895F4E73F867639BE0A0BE67333848816B05B419221BE8F9066C3
-62C23FE85B7F392930BFE4C12B9526FF2FDEC38F23A159ED61A0718E7115C24597D849FA76369153
-54A40C965D4D72EC94DA61A03766AB39AAB684E134FD1407A5B1B19BFEBA52AA0DA5D99CBE5C82DB
-AA663711E6DEBA180E1D4A39C320516A4350D296BC19BF1BE054859A0889C7E9727A021F3176FE62
-0FB0C837E4141FECE531A950C03D319E3255703220B7185BD20FE5DBA673F8129AB211EFCF36EE39
-4C7E00EB0876624BC840FA86E58B2F584754CB6BFDFD76810E300741EBE4544E5AC17413ADEB21C6
-2F66CA4F075C32381796BA709782DE34A675B717A2C7F6D88104CB924FDE5DF775B4F0B68E0E2E5C
-2F788BBDEAF06D8E1FC2105CCBBD5827C0B03FD6CD64F0D073F3192D5F94839644E5EC6C5185BADC
-F04112A65F49A8C83174A9AE958E76A2F5AF469E8B76C833782C5FFB8BD7B1BBBB3EA0CB7C9786C3
-BE2ADE5E7AFA8C8F20892659A59BC421E28845A108E34EE17864042EF587A6D67DECDFB3F510EB40
-D2229585347A0035670FCC76C2837A4E4D68304FE113C539B35C1F0234B5079B8E32934546982978
-C5E4DF955A454EA263C3CA5D7101F31A318D82A3F9FCB5A8AFD7A65209663B0FC9DA400B26F285EF
-46D0E1EAF8ACB1F1CB805E3986D04BC585073FC64895E4DAE1CCB749BB439CB32EA91176D5C39C36
-50D10AFB9C9884D5FB90183424CEE67EF2175D01D2478D67511EC9F54F88763C152697B06D948BED
-49240096EEE3D06AB4575E8E8B2CB8263B5BCF4FA1608720F52B675309833071879DF52C3EC2871D
-20F398B5CAC8F8A4D41D0F1D47584DD90DCDAEA4A1CF160C4B3BF1AAB890B5CEB6CB3488672AA68F
-BD938281DBC1D8BCFE92FBF514DA5358443CB6E0147254E91B38CE6787B2BB0DEDD2D38F5938737A
-977B5EA42892520C58F8FBB53C994B57382379E9490F0D6970B980E1BDF8CF9F4C3C5E0A18F66E86
-EE93FFE7FE546DE50F41364BCB3721B637072571FA1779F1D672FAD260C16D7F13CBDF3E4376E7FF
-56D2A710AC5AC35FCBDBCE2C9C17E523BBE6218617B13C1FA6679B308979AE7C61DA6E68369324C6
-CBC7DDEC364E5A86707266C0B459EE7B2C03FE584E529BFFDCE98C90A2F3D9305AA74D3ED8430DBF
-3A49FE2ECFD9C4BC9FEFD22618FE9C8A973AD072AB6F713E4DF02DCDA7AC5359B2D652013E131B76
-B3ED6C75FD53BA58D862846264627F6B9E70D8800F6D9B32242B747A67BB2B45675840D34F852AA8
-062FA6B01E31ED24DAE02F6CF788A17F7B9368175195DB0072259CCE0FFB2C1035C1D26E1777CCA3
-D56A827C3242069E76D6DD69B653768614B9ACFF16567FEA61508D51454BC02F6C60F755AEF6AFAE
-3536BBFA1823F8E1A53C41124DE983E51CEC92AEF4F99785D554488A51C20885346D1F761DA79017
-940A0C557D93F1DB6B3D00FFD61D08E96FF3AFCE5FEDF545CC9F47A2B1BB26713431D6D1E47FD6BD
-6E3C668B0368241F0EBB5FA9C991DF79890E52E83A3675EE699B61BAF869DE91F67278F510061C6F
-E41DE2D883F48CD0E068E2A652B244128D82E5CD52F35F210DDAE3054691ED55A7D99088AAE8FB04
-F525C2084AC09F5EDF80A4EFAFE981F74C0DE9D194320709B3464F3FF2C0F6AAEA6D973D9C323F53
-DE3D741F698FBF01036716BBD62957CB32CD81D3A2674560FFBC5BDC5C6E4F547E589AD0B1CFE14F
-5E17FED1C4A8ABE4E67CCF8A49F32C4C6044F1431E1CC382E7758722A6D0DF9ED23E51F8AD14D11D
-7B6428E27443715EBA4E9C05D6F238378F9498AEF0E7EE4FE6856622CC8E6ED141EE5F109E343CB6
-695C4BE1E0F66601C27975983BF557C04ACFC19227A1AD7E6C44C00529FC7EDD7F886D24B7E029B9
-C395260088BBFB96972199A7B32796D27257DE83A7402291C14FECDF7998C5C96B1EDADE0280F856
-8A8F5007852EED303969180B3329917973C2D32C080C9765B6BAB0673BC7ECFDBBFBEA980C263843
-39B7F1052591D91667D4FEE413AFC23DE2D4B9DA742F4269C6C939F5FC32A38040730A018155AD73
-3F231E4D5B9D01C03A58EAE7B5F590CCFAF25EDC8552CFC8D95C60EBAE1837D7A97CA137E9D4A4BD
-2CD34AEFD68D64B3F4F62326AC429921D7FB3C235184FE0899690A0B775F1A566EC29D5830D32372
-6526F7E7F5AFDD71B77E07613DDC4FC63EDF49051AEB59E6337AC0A4B6DD872E776C9CD0CCB86130
-5322D816732124F5978A86C186BF0A0F88E733CE38E4D7C1BA5378C5629B1EFC97806059990ED42C
-5CD183BAD7E94070E4058569DA2E51831FFE0D080301AEAB4350BA290318AEC582C78D05DD92E5AF
-B4424EA808629BC972E68F4FF2489C245593F07555CA6A2B25964794CF31CBD3AE5C229AB9B8C298
-06C01D116EBD0FF0F159ED2D3D7DFC73EAB4910BFF5B0B0B587CD9EA6E6FC45D63C09766224D8346
-1F0588140B258B1729F70BAE7962189B1554483392988CF230AF4077193E53330519394DD99BA135
-6D4730AB221DC6A66019BFAE564893DDAD7B177DADD16ADD21D396CFA6C3DC818052E2F71149FD59
-4A16DE0C2FFDD366C99B486C55A6E991E4D22CCB15843F0C3363676AF2F5B2D1B7EF66CCF2F12DC5
-0D63776BFFB058D70A9C76DCE96C754872D72C82A0C33F90D49C935402CDD26B6D743B1F43BED5D8
-B539424849C1495DAE73044E885A7D0F307F1816DF6244A6F2D97BFD4E200E93F69B08AF39EA21E6
-E347A47CEEBF803F73B978ADBFCF056789BB8E6E2563DE87DD9A8C877157B934102DCEDAC54D487A
-1BB2694F0034093C48F10A17D32E2BDD0C723CAF59ADDD1BE373AF8C9BEB4415AA5AF36310C31F24
-354A53C0B962573148BEF91D994FE3F3D8450DD4D686725799F53C373A0A3E3C060C2E1A3E800504
-9F26D716E1F381B9F83125E4683264A07E2D8938F605978E2513DD2050B3D8A1012797CBA8961632
-BED260916338A812AE751C7B657E086A0C7DDCD3BFDDFF3E48B84751925736D1310C4910FC114387
-F3ED7FE163F91895EBF55FCB425CEF5729D99BD8F2C072E36C310523E75CD8E5DE49C031C4263410
-9D56E91A46C8C8E89FD92012A00C33D0DEC52597B5C6933291A7BDC5CEDA95DCDA5600F9AE1C8250
-54E7EE1067458CCB66610704C58E4A4FC0CB5FC933D0322A716B2CD430A3AD48DAB3D4CBE9D23F2D
-092368CFC4E1F5495C133A92942EC62118D45C17723646E69407B4A89DCDFD2AB3FFC099A21D9D29
-741D68270629AA3A414FE58658DC9170C247B6E23F35C4BC5FF83009F462F2EEF4DBAC5FD158A658
-57F9B6DC1F5192DFB169DCB65621CAB2F1B07BD22F4155A8E9E2B6388D430FDE5EC1C834D22EA035
-C52E1E34482EADC36B4CAE902AAE89A7284E62B3C84B608D6BD05F75BC31310B2DD3B2C08A00E073
-7F104F03A41989D5F6B9A2C38B22F1D1803EE5D7A4D8DE44E4ABD496A1DE0C0E12C4BC96D0122846
-3F0EA9CE9509FEE987139F3DD3F9D0DF4313F555BE85433718F6D05F197C41A9D9C7A8B0D2740196
-82D49F58DD5F66B12A6520D9F226D1DF1F1B65CDFA261F980CA25A92645B86B64606293F8BFDE364
-C47D2AF2C709BBE77A70A5712F2CC26F3D66F5BE2C307A48E6F887F681D30121E32BBD87271B5DC4
-615D28C309F15AD263FB37424E56DDA6E17B998B45BE6C7FC6C28E3394A8764C9EB2DF5C06626593
-B5C665D550D4600172791CD208AE9F37BC082B0B242B0A504B751B18F4D7495172B697EE217834A8
-A4FB7CC16D6F9E8BB400BE8AEB0850960283DCE725249FCC4DE97D9886745AB6066C3E2F64DD8AB7
-9AA11667F11188D7965DC11EB760B772E282DBF13249F31986AC6898FEBFE23E3E8B8D2C33E00EA6
-FC493850ECB2E6D831D1EFCA3C2EC8EE2E394599091ED58BEDE97D7A43B6F739EB0F845EAC1DF6B1
-EBFE876009CC5D804B15ED4B56761B3CE1AF59C07B49DC798A44532297AD73D5101ED47F36A3678F
-818297CC27F6AAA2AACCC9AA9B6F5459911D8C56CF499E390AE607F3790450B2B9C9BE0F006EDA0C
-715B5CA0481734CFB0597478E7602B0D2C1E4F78F03C68C17C70E4B42D7D2D3C95CF40F73488B371
-8E2CB05A549944D86944D78724E266C3319AF89AE430E777E95F0D792B1C654306E421F3D63A26B2
-1E74B6E8B21B2E2B9DC596D013CDA16D08E65E8F24A84B12B2BADC653E6E1110DE2E709C1C1BED13
-707B70A421B384F20CA7A9A9D20324DD383F28B2D3C7A9C53F5D4C6B7C378D26DF11CF55238BE1B2
-4FA70DCC178DAD3D35670FE4919085EB1CD905971D76A368FDFCF9D2F0A23739851A3A6D2E02D65D
-54DEE69ED5D81315D3EA5E356F94EF256DD267FD1E1A9EDC9CD63E743F299BCC4A4506233B8DD765
-2CA067F741603F93250C087D368F9E9CC4CC1A6DED567487C05BAA992B0056A77F630A72008E3946
-15A9DB24FE56A956650EC9DE90A6C2259189440247970541CA198748928215C0E132A81AA13208D8
-63C1FE817F70CA573B54577D10B73100AF8EA088208A44FB92ACA314AE5879706180788C17BB1D0B
-81B6B95A1C4E0F9EA66F9B39BFE12444A6446691A7BDB03E0F03D9F07A10A7598F2166F108529F34
-CD90E601FFED3479ABCFCBDE8F051C348E48C61D95B00C59EA1287423F05666C3D36288844067E83
-E14F6B5210842C742B89F13ACD126B9FC50ABE2CA7D7ED513D43B6AC7F41EEDA416BFFFCC5C844AB
-2D23D4DC09B2D510504CE98D02E72020D9E669DDAA344C63A1B75632F912A1C0DA3885DA4AF7E243
-E4A4C6493D6595BB6D56B0359106957259E59E336BAAF35BD1CEC5CDE735272EBCCAE8D4904AEBD2
-B32610C6FEA2B69941D6542ECB44D71092A3CF067708A3D087AE99FF29671AB7DD8758759B971A08
-AE1BAD78270D2FBEE37AA2DCB119D72F6C7B0C8509018A70D0B0BE2C6830EF8E0B24B1CE1141EF87
-3A4D7DCC501F808BFD94E4DC0F2915AA023076BCC8006490A43685EA25AAFC187302EBDE7FE1965A
-04A5A398985D29F08E085127B56B057334D88EB638A4DDE64AFD204974C3939536B1B66A54B4DB81
-151853915718F70813F096CC1B0EA25E363B49264C2AD17158A4489F91453FBEDBDE15D7B74D7F98
-E81DF23251785D58295BA297F295AA6248A912CDD4F1111E6B628EECBB5139709E76EA4AB743CEC8
-26621D08E6BC64691CC90B3C3C1778931A28D3D5B1E20E96C643316613FC487C9B604C43463FA453
-3BCA1236286E6F5A6EEB2F1D9C34BDDE4595495A365F88055D9268541CF1654ACF478D384A5496A8
-772EA1402751A093582A6625A0A44816B5FDBE166835D598644296249B92CC90AA3FD6445C9A19BF
-27F59CB0616C7306070F33C7DF4E1DE64AC8C5BB2FFAC1EF2B1B30E5A0275E6004CF64BBE2C6710E
-DCFC3AA4ADD60106334708862FFA6652825BC84842736E47AE6917180365C75B27505EED3C6108E9
-898A780E20C3F606A860229AC46D0471ACA0187D6D539A1B8820F620F72B41AD1D3BF3834BF48CA2
-AFEA8BF535AF74C4562DEADCB63D2F5C7585722B77C989342D190FF926C8A5263B4F25286F99CF6F
-C62EE6E2AD61C82B29D82468AC10FD27764278E5558CE8B41BA111CB2F040914451A480C93084237
-CAC8F66BB7C6689F340B8ABF0150E06D5B1177278A4C08742FE22F42C28680F190900344ADFA486D
-59718C25D37275BCE4DF981AAC35D2C7E85C72A0188B8953CFA516FD545AEE0BF4B8BA301CFDE214
-4241FBDF3D204E3D2823301572E23F204C97305A82401660E12926EE7BA6EA1A81FF5C007933AFC7
-3266FAC4C134ED818A48E7DA01C71A46335C845F9DA5E960B25339D551582B375814148D94CFB781
-FC56093827B78578A73D4FF67B6B87F40CFA5E3F4325D9108CDB64BD06427B88C84105187316FA29
-90B4E3E8EDB6C78ABF164F4A9717D523794B2FE772A04DABBE688CCA977090979B5F47CEB90A1DBC
-167D305EAB231C9F4260C4AD10889CB785169902FC0BED78DA15B8417453BB65856EA0BEA5245BA0
-573F623D215F6C0CF801851C305B355D26B52B0B343645FE25C78A3526841EDA480919A1BBE5F56F
-C10ABEAA3E1FCCA7C43EE560F067F1AA2AFD642F769D1ACE8E2AAAF38850F0D757CD808C921D716E
-96FBC07DA7860DFA70CEAE2888C0ED3CBF9586443532B68DAED9A926655C157A416C383A53D8F283
-2A4E67468112A09ADC837ED8EC95F70852921F50D4417239FC42EE3624CA97F682745CC5E76CC7C6
-7BD99F2180F8C0B7FB49539C8CC474C25C0DDE491671FF329E51BCFA779346D4686835A3AD6633FC
-B5E0F67E0CA9CED8F215BEF4D240453EB2EDD6ADB22278AA5B985FA140C9834D38753DF2014F8C0E
-E6DAD19E8FC54C03C1F6CB0F858986691D99592562CAD95FA0A5B2ABE4A8B54B457D42E8C33A2D19
-51C0419A72FB94FDA78ECD92BD2A1416459E9DECA9469F35E4C47DB531726DEE8F203D7042EDB32F
-025DF3D582547BB1D45F7A5B70D317DF4EBB16E36B0D798E0932FD2A85B04FD67143E4B287A50416
-2C1F5A037CCD780088C5476385AF8168E12D97D44B0630621759173C8F1E3006B5B1C6D7138B7EEF
-C3CC5F54E24B2C3CA7B41AACFD25E554880AAF406EA4C3C6E21D3B550B040FB1952598A7E8E6488F
-E38288B2AEB6C4718338598A2BFE4D2B9D14C65732DA304C16FF3E1F8F03046EF095B65FD609DA87
-EC24A69278BFE65C905CD0329F6A486B8525B7EEA4F7AE56C2633CD83543269E8ACD6D71F500D82F
-DFBDE7F7F7B1AEE67328549232E26CA55085B6E84D9E2E7F74068F93A90C4654F2F396E57C5F76F7
-E61CBBE523DBFBA6E76638BBA3064DA025A79E3A294FE7F1CC28A3B4C57DD6FDC48E541A85534B25
-E1BC11B4F78019457239EAEFD4BE9007D205F1D985F389DB22400B279C10948551A6B4A17FBDA0FF
-C9428B18B43DC76EFB15FC2182216F1B60B4E344A03AD6C00F141EF99F89F24C819C3E32877A927D
-84C2D006940F39CA8B71E5951673EA9BFD1749923219DE38929ECAA9CE43B06CFA7DA1BBEDFDA56C
-61FF6C24F40E59B13870D5FDEB82D981154FAE5D6D5152DE69339359461A41A9713B6BBE47E868C9
-33CD74C75DB71D13BAE4DEC85E02FAA14EAD6C0A253B16C79514657B15E68CCFF9EE6AA385CFF9E2
-C53D9AE40F85C793E4E8FF50B2B7420F4FE69807BC5F37C3E300E6B3C3549D1D3246A2E70F091054
-1135BDF805E0A698E236B6496702D061241687B7B8D1A0E517DF0476DA09D89667A7AB375FD2672D
-CBAB8124E511502DDBD08BA04D941DF1CEBDCCF7ED48405CBCC33774A68C5212FC6F132641FF413C
-984F8B43BDFD7B1A2A3435F15AF07EF4970D3E4A0BB947C181E9CA27CC14A35BD1BD096875B45873
-8CA244F88C28728B74E25CB8C4FC1095A56CA75E4569AD3082EF194ADD11350DB3B74B96761D4538
-596FF7243B1E1B724716A144106E080D42036444FD472998460CE9ABBD05B42AF9389AC452BDBBA3
-A13A96890025789F16B9D92251FD3B3BEB2C61EDDB370A20456E3BFE5F4039E2557C451C524F8087
-015BAF3FF05F51869FB97512968BDB2B49589C1C7AF1E085250A47657465F480B7023E24C76731AC
-0EAB6704123D77977D3A2C4C56B691346EBE589C619C04515D34F81FC6A17527D5D8319013C5D4FF
-27CC3925E24C99231AC7FB9EAF0BBA482D3B75807AC85D03CD09DE5D9AE0B07B7A813F0449786500
-0AE8A7E00080300F0AB8C399057EDDBA273DD2E1B2A0DCEFAD3B332E6D4AC1FFAD846167DFD70E03
-46DAF84AF292D4F424256ED5AC4E104F80697050D50844A708EAC9E7F7784FD01646F3BD0C595CA5
-1EE6BD607D254E78ADDC5E15C3B6AC4940EC865A5C23105B6BE09EA09F2C05D6D76960A843B81EE4
-33977FAAC3CBDA85CDD2F4DB7C28293A77825635992AF8F3B38B4480D9A139B1662345A8ABE1634A
-77496C3F57597D2985E9E54717AB2E99CA35789441BCDDEDE9A9E2106B401D9684ADBEFE40D607F0
-75C179E9CC03E59E65430DB70B441D43DF03F2AA6FF06F224B6E455B01C64FB89EEC9103E48453A9
-749B4D602808C7E408A8903091D85E06AAF635D0D529C3CDD1B8479AC0F4208C284BB678A547F2BD
-77BB17C86D4560434F7AD1937760A6AA55B614CFA9FF8C9C96561AE6C8F2121C4E20237428BC51DF
-2099B6C49E3EFA18E6D439E6E6981E746EBB1DC461259D8EA0F8099C47CCA27B2D982B72C9A07CF2
-1B3C05D6E26E6E286E348B8944078E24809F9C5F3D014B4CBA02533F5621BFBA1F0EDB776C634746
-703C9F73BA89B1960A496420C68F54E5B901A6D733D7ACC79F275FFFB253F389AA480084468BB34D
-A1E797E43B7F6E8CAF5E8C93069A3A2730E57EC39B677BB73E3F07C2055599F7062E53B37A5F0099
-907D2ED87FF7A82C95FBAEB888033BDFD67BA3A6031A4CDC56CB1E4CF5B06B46E16D988BECCEFACB
-9E1C037023D7BF5CCF5D65AA66A17AB361BE7981F132A578F3ABFB97960A6034F052D9D5AFDC0679
-782EC90F240F943A5F9A3D969ED7399254FF67D89DF668F7C56FCEA1FFDCF20481474AC8495D3AF4
-B6D7EE093E369C057F0B70858220693B398ACF8E8143558132E4391405E30A73937C53402E459F4A
-A3539CF7A99A3F51C0307D045DF8B77757E92EA2F51BF0BB4F77D3904DD355665870C2B59F1ED7F8
-4FC71FDD7F0B6C5D3182DB77827CA6A2060D2B8C83C4EA4A432EF43A4D0A952CC6CBBE52A9F0CD66
-1A538973DE41FFE9C5CF55F2506B9EFEE51FBAE5E63BDCF5528499A47C031163C88D3022606784DE
-2F46A9C9235AEE3D4F71D4959B0CFDC5B7E78C8C0A8F9DC99440C2263DBACB343C5C648577F5610B
-50EAB1CF7FD02419EF3941C7CA0B0E64EBAD4B2CB05A0793DBC38F1946D44767BD287F5E9779C611
-CA0DAAA1E7393DBE0683C8D3455CDFEBC0E64B54B737E298DDA605227C0C4BBA87AA3EC7FA6EBAEC
-39E6EF2537D5974391D31739D9FC42983D81AEE44711C823F35F8E2321AC74943871739D2DBE9748
-FE68592263E7713F27E0D49B9B5CB7A4E55DE54E6B800D15856450FFD3AE5F287B12AE4F438B20AE
-9E27E6CAA00F3EAEADBE08432684FDF9931E925544A680182602A3C1997DE5D0630BD5A010535E66
-E1C123013D23966B3545C7431C39B97295BFA4099D14461004C42C85095EEACB9B47C593BC6DB863
-533A8619BAE09095DE8ECA432D4DDD49AA600D277E75DC3F5C6631E2A05382CB007825FADB77438D
-CFA78E252D79B6A196D5164C2FEB85D75ECA25FF80B1D97FE10E87960CA0FC47C41D3A213BF141B4
-8BC3AAA93FA86245064668394665BFD52D12C3BE4CE39EFD8111754398A944C3FD1AFA98EC337BAA
-AF899D35E804CF416AD7FE45FFF13FC6354007501043F98FE8428DE8013901BA6A28711A2CA85A27
-0BB135B72F1D5026E8217581860729E94F2F1878A0E96C59E9F62714FB5F8F25003DFC7347E99007
-8A9A331CB3A6A535BC61866F02513DEB982C4A13ADBFBAC3FF70A7335F40D5489E48E5EDEDEF1619
-1973D932479C62183B0E25EE8C4F76D4F1AE45DAEA4A12AEDD9EF81D248E8D19F8C8A5BECDD1EA1E
-98783EB7A38149170851B1942C96C53DE06DEF80913BFC04E539EC67C110498D15B78268853E5C72
-F485F8A27B768569E54241F6115875E2973292CF48FF91D45EBED627AE9F0766D22201B20AFDD40E
-5B17CF337F2999E0BD15B86E46EB3C18FC12B7DCADCF9DD50C6C7E3F37E615A892DB3F57E250A072
-A49F7277DD6A2C8042698233D35A699B17ECA5DBDA6D250ED4A16FCC893BF0DC2E33FB1EBD7DEDEA
-3C1C39603C8B7E1A5A833A8FCDD5570BD088749BB232615366687962C7E56ED089CD7B092505CAFA
-5A80F503C4CF337F07ADF0D106937E25670839D491F7BFF7A523DB609D126328C16113ECBCBF9C40
-04904427A108618AE5D4ED809F8CCAF72251104C94EC5BEE21F91B179D31DBA79CEEE5EC7FF698EB
-84AB1D2D1A624F58B3622A78844CE51498B2CEF38EAFE259D22C7BA61104651A862008BC1DDDA58C
-C45F663EB26428DAA85E7785363A69D2790996EF5D9621D53042F42F794962FEA46E46F37B8AD1FB
-76FC8D5CF2146843F8CC625139C75FB42DDA71A752BAC48F294E4C0C8289FC46DA5EFD9C91BDA6D0
-27518B7E81E8B21F755A9615627D5812ACA674D1527A1185EED4E3C628196E7D0759B1CAE6B9B7E9
-01E9599A65230F1EE469CD33B9BD9C104C44E3C1AB966C9678BD0AD78111A4E0F2D07A01A038CEDE
-7036D0534D684A1562A17AD64A00F279200C0371B1CBA61747671D2A21D3F9646CA290F6B82418A9
-6FA177C6278277504B7FBA936325F5FA124AB018A15DC18D2C5E8F93CDEEA52BEEDB78A57828D81A
-3E6C38B9FAF3DC4EB7273ECE3EA4482A1C6242A335862C2C3717F9C9ED95F77B140C4E1569B2192F
-C7DCF702D0BC9A50428EC406F8BD0CAF886B4D979320D3E429816D88F7C7146D960AC12E70F2CB7A
-9F4E3E366665AB3F1B4B6440F55EEA26DC9EE0096BB7763731740A537766490C8C174723BF0EB40C
-53701AAD12B21D436ADCE22203C1053A9DC4E9F17AE617888C4B4E6F3A720E4E6366BA628221A387
-D8AB15E04AD69387C310D3528BD2FAA5B22BFF3FA494F5FBFAC4F771C9C7402B95580C5AC4BB3AF6
-92A70CB2C851FA5CF1173EEC3EC29B5A05A0B728BBBB51D3B7AD8B0AF17A1563E82FAFD93F8B7118
-1FB7AFE352874F4EC6D334AB6747519AB8E847B7BCED33EB5458A828E074E74BA621BDCD03FEA604
-7F7B6ABDA01FC7514BA1AFF0D4D0C0CB8F4E42D5A87E395D9ACDD02CCC220C157153422018725846
-009A3ACD8C8CDDB66BC6836B4026FD9F526AA275D06C813179E5924F26A25094E7BDA8BD26AFC4CE
-B41D8964D4FC4AF1DFB0595BC5D6714C32F15DC7194E9A3A73013C45D8FA55CC0550A12D9AAE8E9F
-F199FA28EFC2426D8D1DEFB93A65717AF3EA8E2D5B4AA8EF0EF38E9600F7D4E7D9F1D67A2E63ECE4
-789FA74B159BFE2F91C19B0378BA52E93DF12830D99553B6618645E26126842AB70262D96E35E5E7
-50ECA0CE3458B3E51BEE2F21191136DFDBCA39BDC07939E521E4F492F392DEBD029C1EA237BD89AF
-76BC89F618D530160AB16269FA6B693CF14BDC4EC7C630025703C5337F61458FA09104EB15C7CB20
-AA4C9BDB7CEF3A09F25BC7F3149951A7CD75372993B80CD2112F7674CEFD6AFA764AA3486730D2C1
-897A264D82A91709FEC4A21E30D812F558451804EE6F3DEE2C4C437846BCBDA07C5B6CBA1D94AF02
-9163B7383CAC6E088AB1DC14ED3743EE77E26EA7AD3119A76C0B5F925C4DE305CD7BB3A09A453947
-5B9BD79BE28FC462D8718CE05F9D94CAF3387BA55E6E447BF81A9EDDD3A34E17BE66BC52B0C0BB6F
-86F6F008829173816D205182ED2ECED319864A796AB65D4E3950288BADA94FA32B6F453AFDFC6C39
-A4FCFE60353A64627E2057D4B379D3240012B3BB0ED0C7876CB83C1BA5EFB6E2A03F340C2B576731
-F848F762A7E1CCAF267EE06D621BC33FC245D0E1547ADC12CC0EB58B26BABDB8EAE9CBFBAB93836F
-FF22BDA1831DD01B7346AD377AA298D84628BF1C07433284B0A90FC89F5AEB2651BA2CEA405D4F52
-DDC0E74B871D43F71EB4ACE0D2B401F9348EAC3A2EF0AD295036BF6CF6F870D58E00B619D50EA7DD
-77BC28DEF91D805CD527DCBCFDC16C042BF9B874E3B1567EBA4C1E70744B9E7E5BD1FDA6A5FF6E10
-1613FBE58DC46CFAC1A65ADAF65E49757E9304E2AC9A91E0588600C709A61D4231730073A36D473F
-518A145E141D0A5A494441B9EA99AC23F60F54F8127B477E1CE698BB4129B4B1DFEEDF10D9E665C2
-47A62F112F5CA30B0AE5DBF3E495FF06EB28EB438CE8AAAD84D5F50FB56A3AF002C23BCF66ABC270
-7AC233FC0F2723DB99D2CFE7D3B3667732A531F5DC315CE74EDB9050BF75D29E6430F57CB6778B2A
-CBD57DFCEF896E6766C8FC5C9F9FBD701CD62CACF33EE0FC95E78DADD205B5F42CC63024624BAA0A
-B4DD447832B4E1DBA77BDFADD223989F8E958C8D759AAA37930664C6EFEC708116248A2A7AF3D656
-DDEAFD009B7F5333854608E67E5E588A857167ADF9225CF6C641F5E19C3E08678A281199EDDAC831
-B57223B1BEEADFDCBC8F6F25D32FCA2336C808162E8F381656E847FB6CB13969572425AA05AC830C
-33DE6E030F86A3A85D2A66A77F103C7042C97205526DC882EA9A00EB8BD5519847EB424C15F808A9
-1652A6CC89B66A5731126DEBADE123C63D88A2E550FACDEB3886FF98646000C64B3A91078012CA30
-904B71737CEF6BECABD43DD702880538F5A70085E6CC6015D2163681067C3D513A8C66032C34A0FE
-17A58AD4BC97CA69BF41F11D5E910FDFE9729652D3EA21F8DD8CC19160A8FC77573B1E9CEF4E790A
-79D8AD6723B6804E9616466C935303E063DEE29CAA6C3BAEBF278B818C2EC2F13ED645AB452397BF
-00DB8B26E115026E256746CD0C78A959364FDE6DEDDCD0F441A61A1EBA32C7BC172BB09512148D1E
-BAC9E791B7D51B71CAD2DC9B83B2F99B3726607D9CBE58B499A13753CE87FCDCE21C0AD0528ED0EF
-B9B2C927F57C78C626248AA2B835A0791244C5896686A66173EC9F802C4C633A42B086334D2A4878
-0E53D00809247BE64E529F96AD2F8B3922A6097D414DDE1EC76F9552F9B8D58B8E34F359AD792B2B
-E50C26DB05035E7497162E7C49C38D3CD9B98D620AA67492BE5AFCA3A81A7080185C7F0B5105223F
-1FA77805502A2E8C5FEEA27699858D84A95842C5F2FB68686D59FE24091FCDDE139B6463BC6C7B1E
-0E90D20A83651AF00C85797BB9F53ECEC1675C7EE636D0D9E77DBD8F89670F855EE4D4800FF3F695
-0EFF09BBF8A0DAF6B8242840CFA5BA73BEB95115F4A78BCC02D85ECCE0C0F2EF6F328AD1DD6CC049
-5A3315B414A4D61DA50DA46D7ACCEFF6EE56451805D26B0359AF193531F95F6589CEAD6FA041AF15
-3067F88A0A2FECD135C56682DB2B45A71D1FA737C064EE9A4F404BB72A70B3AF0330359393247EC7
-81512482579865240A23CD8479F21C2C44A119EBC4E81B308DD8AA86E60C3DD8ADA50E0DFE8308EB
-1A7F201EDE8DCFDA405AEFB47E0E6CA7DDB376DCB21D37F7ACC4D3E9F26B03A8DE0E8940CA3A9E75
-963A389DF8038D2C486072F61C0CEAF500753C7A6352B1CD0338D9212B42A4D3DA23D5BDF44C27C9
-4B88A415A3242FFE2E1B332477A21D2B9CE075EE479C6E657A4D8874A8C53964229310E01ED4F3C6
-86FEF5258EDF3B464DD6FFD7F1CAF473BBE722D60FB14AB4918E93878A8AE4773930B8CEE110F476
-7F42A52D9304C55BE12846C911A10AB9B2E036BF9DFD597F5348D42233315FA80D0F563C388BC253
-2103F05E90DBF1923F229F980A2F4585C7A373511372D07DCBACA583099EA972C03E5AA67E663882
-6DB134564DB993CEEB6E7A6659C7C5C05C310267D5F8A24EEC2D5CC3E3F3C808E6D6068D1A57646B
-37FABD98ECB7BAF99E7D9AC4414A491A73CA34C52F394352F6B5A15F0FC4D88622DAC694699C2464
-84ADAC3B1D366AFEDE2A2CD2042C90516A666A19A91C80248B11224BEDDF1A320E230739E755D098
-B6A67315535F4C187CFA67ED817A035056353FC859BF286317996FFFB478A2248B908FF12ABDE705
-402224A3EE5F463DD3D243875C84E02DB968ECA1CC52C75171EA50D6A88CA91327A7AA5795019F36
-C0A19C093A1C9D3723C7568F9D41F2E4FFB712FD47F897703D7A620B586B81936C84AAED61D84332
-B3BEBC4F95B796B93EF7A1F565C494F8A65EDB21E2EE18DC025522EF8E599887CA2836069CDDD889
-88E5862977B7472584303198CCE97EF9F9E1446D1F1F5ED1CFC666A8A0C3A03E1792EFB60A9B4065
-49E0DEDF6ACCDBD98742568B4735A747D8E5DE21E630125AE0C691D054E42199C15B1F80CAFA6E7B
-B2005F374A9A5F9900ABB7409CCD50C3AFCCAB1214E6A856F7C7EBA89BC3291801E1343DA9DAD2C6
-ED075C8ECA1423B43E587AEC67E6145272814B3F191B3C285639F9E2D6E148A02DC2CBC0E054D629
-5CD05DBAC1950400A9189316F0265B86A732D302C5BEE8ED233768F237C62600CBAAFF3A110D5EFB
-6CC7CA3B92D965CA7C5E8D3E64ECF239FE2507FC797FDBE54C1112B28D4DA44C60AB09D994C5BA78
-D663A2591934CC052BC70CD1DCA3325C66C9CB982E2039F5DB70C848D3DCEF655B1C2CD0CEC8865F
-E8E1C0A267BE4F707ECE6F5A3DFCA3CC1EDF92C760439F51AA69A4C1801E96CA4D6EA4AD980258F3
-D15C893913ABCE09101984C61B91D603053E49A97CB82FBA707DAE8AF1D579FD69C8481CB7B712CB
-CDDB4D287BE995E32C02B399602A08B9DD849039B5673F1930BEC7BF366EB082D2CA5DB2385C8CC4
-5BE3FC0E31820191A814EBA7C4F23B1938E6C4D800732787CD2CB97F762DFC85D4B798809B5F2254
-D826CA42B32695428D120298B44CF38494E56240B75DF1E41E46E53C44DC505452256DFEC819408D
-605FF14D6C1F3F152F2FEA96EA0AB3B472D8704E06BE9F8C3E8395CAADD06D6DA033E81ADE5DC3B8
-3DAFF743C6E9E48716003D358DF63CD7FD3E2F727D1F2D0C29962F76D5C95ED44B6F08D052025A66
-5785F264A3D5F5593677B630E628B5EA81FB37CFFD7A30B7FAD226B6FDC82B0878AF4C0EC4F4243A
-807B9839EA62BCBDF7C2E9B30A623876E632E084EBF4A21EDA04FC88A1C07021D0C72EC3E969D449
-FEB08E5826EC20E55B21EA71EA59F6E3B0710B0DDAB3261B4A2029ECAB68C19ADD5174E55D5E984A
-4E5F38F592A302FEE6ECE732DDE841A28672C620CC5D687455A5C06FA9FE688394A04F96312ED025
-B7AA6FBCE2925F3AE559CC1886BEECDB70822E2E5CA3F732A87404B1536AAC469989E9610CFA440A
-CE43875A70CA51F36CB6F629D9424C1E35A88F92D5DA3CD8CBAE6E8425A36968E21F4F30349749E0
-205BFF8D552837D6FC39532525370BBAC833F75F1854C93FC533A4AA53ADF7008173A70D94A4EBF5
-38EA9E62BCDA7C20E0A073BEE2EFAC34D2EF1D03BABD5147659E50B557045B2EB89DB303749B04D3
-F54B43FED612FCC68206E001A7AFE90230D9C12F74A32C7EDB5D0241DC3A5D51481FD7C8FAE08FEE
-263FBCED7C7D911B3A303C835AF5FADFD218F61A9D6DE80485ABCA88200047B094441F7767B97A24
-E8C612590FA2407BAB1E8B56C71914EEF2355DD97CFAFCC192BC06FCE063D3D9D1A629AADC75E3BF
-207234C208E7E30663EDD691043065C9CBC473D97C6D4DD3DFF59D6A9ABCDD4412C3128F603160AA
-D8F81C6E7A4DCAF35F3A99B4EA10A34375B477C2BF846521A7EABD4D28078E9340452A198F3F5ACC
-3DB7E3908939FF6E3709C6A3FD9889439A4AE3E10B618CC92E14B68429A3AD2C80940A1079452EC2
-66F254657BE7D79A2A24084AF73F6DF71FBCD32BF6913A3FAB25F977787F7BB0C3A3E8BAB38D7A2D
-B0B4826950643DD1E03BD7DD1FB149A33862A89226B7CB454DAF613128C2075470E42E70A9444A8E
-6ECA526345AB48E6F5160BA23B5BDDFDA6049EC44ED1461C7E0DD514B16E2FB285F72039DE3C7982
-EFD40D7F6C8E8F4CF35AC71B467BFC578002E8D2239A2FD2C4BCCDD8AF3D7DB1F4AE7F2D2E0811DF
-9D0155BA6EDE50B5F052F14F6AB884FFF244D8806C07EBCB49ED22D85DF696995991A954AA97A1EC
-D86ACD76E061B7541E87997FEF0657A826BD88EF3A4A5920462C6595E7A156F453291CA044CED810
-860C3B0149BCE73BECA713040664AD0591304106129600AF71317B0D2907839CEAC99515D357E980
-B1937B6E1200AACADA205421001F1B2F91753E80D2263C56AA164A74701A8D5FD28E46480B0DD963
-A683A1F355D7FB4463C7347C94EA5E2CA40B60B56297CB22D972C5BB10E56715A955605256C1541D
-9F3BC5768A6F355CD3B863F0FA1A781EDB49368F51B29481CBB41D4AEB07AF9DBE8F52C5D0FF75F7
-FB6431D37D6AED84D78C778871CB0F715B4F07580F23B586C969C81B471FF6A6C7276F7E141E02A8
-584D4B9AB00E7BD643D2C3FAAA299B1F1E25048461952EA42D4882768A70DE46B213A287F8D31AC4
-6D5436F22A796C05D1FE50A9BC2A928066627A0D87DD57A3AD91DB446404B41557D1457873482005
-EA20916BBE46C613F456C849D46BA79D20627B446B2F49E3FA309AE14F8C420CFD94922CBC0FB9D3
-5A0F7DBEF577F1849A1A80E0011DA8AC082A8C6F61658E65AD177ABDF23EE17C8CF0D26B9FA3A6E9
-4837EB9E930336889767A8D7EA3CE980A8EA95528B004957BE6067CD9BD8E02A0F23CC1762CCA656
-D33412FF45E917FD4A03EB6E8C1F43FDB0A8965A33B4FD26BC24A20B304CA817E88495BA9B361A3E
-933717FFB0271F7F70C5D3CBA1E86D0F51BF3ABA194DAF32C35C796627D00C7B2271ACE2463E37E9
-7B3C826CF3DB60028F240F9452CBE08F7EBCC5FDB1BCBB3C327A9F450B9E5671916101D6E3E5E458
-CA31F04D12F592F83BADA2C3683D3886AA3B403963AB5DBE220FEC00037A745839F67A3635DFD3BF
-F08F367482962DED88ECF6322852D643A54D5D303EB04BFDDEE9BBA1EBCCBA7C653B3A613A8E719A
-DEBE3CE1BD7E754E5F4977E863E3C2D388A65227B451D4F3A4F94E06513CBA4AC1F2F511613FF035
-611684CCC461599000E546E4D972CA6960E095A526E4735A23421A4C9B597ECE08AFA2753592BD16
-DED93255A1E33DEECE3C5EB77B94670E8137F2A4A4B98AC193258E7DEA5DB8408A806188F2D1DDC4
-40CCF0E9A6E2F0C78FDBD7B68DD4939D2458C1965BF8BED4564B32462FFF3EC892C03B11D3EA813F
-AB4CFBE8D3016329C5B7E3DFED0F08284D44AA0B7A2F6BC96EA4503E8EF52A64C22BED6B452581AE
-8FF8917D53976471941A9116A2D878FB2541B561767ABD4E31CCD8A590CA03494C62AFFD64EA0A1B
-C779173DAD84999C7A8D844EB1259DE7BB5B25CD023537A474A524EBE4660B22568949E624D8FEA0
-AD37F4CE1EC75955EEFA49C6BF1803BE87E9C9865FF3F6B8525B8C15FE8835CA153D27E6C0FF0CA5
-1029A7A9185D25F0F14D86FC797DCC1F99EE97E2054B9C2A2E06FDBEB8DEF6CDD368BF23A858D9F8
-C1DEFDCEAF1B4A8DE5EAFC604CECCF0D285BE00AA912EAB66EFF4D37AD2EFE34853BBFD87CE09B18
-749B489943EECAE7887B006FB827D10191DAD18466CD1F86505879310A8B171F902EA0C26A388E13
-B53C700272CEE2BFB47ACB58247C13449C6BB9D01232C32517358F1A3DE064D43C18F8827D53789C
-CF3CE2EBE78949A6ABFA1A6B8414CE360A5E22AFB7D1DCE6F5A06182C3B984B4F9BB1A905A9D5A14
-83750A1DE0A857CD5C06945EB7D4A2A6BF1237F32A154FDC06D51A703D44FE052FD3C53E9E8F417B
-35D1C851F9203A8997521529F21AD8498F96930AA77EBAF82EE02A57BC77C792D9F220294B45F48E
-A8FD94E01CD25645D36D168923562F3FDC93CB79DD4760DA0C103C2675722D7A1B79FCB4245ED12F
-A0DB52492C9CCE58B333CFEE822812F7DCA68E802C451B5CFAEBAC608B950386B6C58239D1C62D62
-4DD5D15782FC552222CCA06DDF387B373E32C3C2864C63C768350C37283760F3515A5B0AFD66C48A
-B522EB3E808C061F5CD6BD96CD18C9839D30508E7D4EDB88E8F11E31E10919B16B7971F06D7877A0
-58D8A4944C84FC6CAEDF3341B48B6E0D3C7B85D710E0C35F5B5053CF4B4798B3778CC28B2DC7AE0D
-F3A49F9F3BCD8E95D746C35C3F47D68B8AA35D97AA08E711B5FBE70D1A623C82541EBDC51A827D0A
-69E6C049087AD26F256EB7577F58CCFFBCCBA5A95D093DC29464C9A38DE95BC6B1853963B2DEB0B5
-7AD1248D6F1625E115EEB9510B5772AAE4E3C866657DB0B3BF0E0AC345E116F8D4976B770876FFE3
-748C36165522991F46A36F193DD1A1C94713673C7E4C81582391B636C72DE94CE6254374F99B623E
-5686C13D8A8322E83E11BB0B0A896C6A8C2C4F756C5385CD7017F26D23F7C3EE97372C868C8C9155
-81723BB6B76B4C3CE8998E4FA6CA40B633DFDAA59BA902A4952DA90EC4FC3CF0F2676ACFA7F76F78
-236FA2DE10FD3545357215246BB7E527F277C28B353CC6D79DCEF21BCC8F77603CDD58A2CCDDBE3A
-9802F941CED8E035313875319548C41992A2BE939A17CC109426E33825AE59BCD17CB19F50D972FF
-CBE7D9B4B0BB095303D9DC9D406696C2508D6CE99E11CF00F6461147E97449ED5F486D480A86D3A7
-ACECB7E9A945984724EFC21C5079B1FD03ED803C2DEAFCE3327D2D7827715FD65D9506216C88B0FA
-26935E95C64114A51919D419038B1A7E9C1E829FBFB53275093752DF19891A97F3CBF7719C1FD6CB
-17019A6D2D25360ECA804C4B35172662CC4769D2B785C6C87E5A4ECCE31704E59F71263B7C3CAEC8
-ACB4C7426EC25F11A0042323EE6C3EEB04284DBAE2C770BC419DCE79BD4560AEA41571C3B595F525
-60191DC7A8FBF63D413A77A0905E517441B16C2B501EA2F9E99CC38D052679F288FDF1894542E3A6
-6989A0090185EB2E75134BFA3D9147C3DB8A621D9D35E37786853779E157B47F71626D6B3E633005
-9159C17596C1B87FE2B4FF47ED9D78FA4C2160077276C8B58CEF5DC030B4A5D83CF257096C047FE6
-4DE307C598B815058E72D5F57DF5C369E664E137DE29349E2F9DCD8C9F4EBA6E765B6327D7A20DFC
-B20711273FD8091CBA605C4C494248076F7E03DF65A6A50164980BBBB708741E5BF6056E6F996DC0
-7FFF408C5B8EAB8DCEC315E92873228C805D4440A6470E3EE3983758DD211C9CECDBFAA4C9300CBA
-00608A4B2404A3C7AF017A3B7E67F39F0B51ACF950D3E75CC7BC2B8D3480202FA958E8EE0B240501
-5232EE0D264C7CA02C18CA45CB3C2DE322D3EB7F00F9455DB6C5B1F4E59C3E95520EC36D7D903CBB
-625D70B54BF6F8255E412604BBB29FEE026CC660577F91DB1DB4A613EEEFB20CF7AE3CD89D565AC8
-38416B01B5DE4FFA5550D17FB51FBBEBE21CF1D56038863EE931B90DEC2E211ED42BA92EC244D4CE
-2C4EC5CA87A026992772DC2AF754FC982B94F36EA7B7BF75E0ECE90CBB2A6AA1A012E8898BD679C2
-3CB3827C35D5D02F0569C7AA82615D4AA67518ECF668D3B57D6EF1A8013424AC2268BA0D9A74D588
-79EDCF6382A89D397864940303EAEC45A38304BA8B1CB198967AE23EB81054BE74B16909A405E8A7
-799CEE3C270FE2A6DC50BD7370B6B2C8FDB9A87D88D5D40348D3984E39C693B6F4486D994778607A
-80A3122872DD65E40492107C71C3CF708A9717E9EEFAFBDDC239C53AA9645B711038E59C8B861B37
-411AB2039BEDF9CFD00F08D9C5D76154427FF5DD39878CECC5D7BFB3F1F035087185C0981F3C2139
-BE84872FFAD3408531C4EA9387B89F5E3EC779E8850D50992DFDCF9132BC551E985943B07618AC10
-D1150451F0844C0DC41D6E17EB508DC8689EC726400D5A7F6FEB3CC7BCE05F09228B7CB2C5393664
-D8DD9A4B96B1020EF25D70AA2D91CAE93AFB5F2BF0AA18CA5C599FA1A708EF35BF8F7FFEC9AFC1F2
-42870D028B2B1459063B493943EF1283829783E1010242E5CF4DA39D93D506F3892936E7D6CF1124
-70A521D397438733D053944CFF12D6FFAE8246F20618684F263715AA98E15D72A526383E05C23214
-B78338E5B476F0981D90056E6E5D0DB66B1DF2298E597B2ABE1D817E18BEB056E65EDB4234342D96
-00470B1420C9210419D834E431B82F58608C87AC361A02D0F1FE4B470A3D71E0D21BB87E1023D428
-E23D596CB9E1A2184403A16E36E644BCCF9BBDE27290485057E62827283E7380AF786BF395B3961B
-A5EA469C315763FA59E0F176EF81985F38B882DE56A74D128E256D1B89939728E55A92ABA21A6B78
-44FAC1BA7BBDD8B34A18194A2984B000380FE9F672E83EFDBF276FE797A325815B0F25CC95C97A9D
-ACF56D583486305D7C9E51A7E337D14E3B900333EB38FD93A99587DA2341B10C059C71CE080FE753
-3C0F059FA40E560AF9C4A41A4BE6FB45846FF8F78165E10B4AD40F264BCF5596A1E8EF8CB6EA4B1A
-3A5C69059AB1563843679ECB2511A90E8898F54295649CB73D277760D8D04ABACC7BCC6E777A0530
-E2067CCBC08673F9C8C178F9D672AC8A15E5367F0C5651B53E75E0CFA57C931746AE1A679C246D7C
-9417F1CD89DDDBD1173C2F880B7B3847CBCCEBF99F7122E832D7C9BAFE2B54CBAA1ED48158DE3F36
-238B76B0E67644A28AEA996DDC006F6AC0242E4B667639E7523CBC90A0561193C1AF34481C2EF402
-EE43A82E1EBF4E3D601BB36B2D95CD93550D61CEE7A94E72F6D30C32C8F91A61E964B1F66ACFC398
-7F95D4028F116E9A9A8474AA29C1C1A984BE0E393BDC41DCEF6A6F1018DB60D52024899D8EB5D55D
-324D73F39BFA47377B9E15B3B06A7585589FCF52A54684173E5183367E7B0952DC4BC2767C4C6247
-B1D6103E52BC7B7EA6298F454C5D97AC575F19C10ACDFF4E10C7D3755CFAB4200CAC545269FF1D8D
-B0D607C7AD47F40DDF257AB4E7D0750577003C13E4941960C3DD7B0774DDAC18E8ABAF8F53E03CBE
-F6D57B44F24CF821014C064278FD51B3427593D17694B4ABCE81F49CBB984C5878CDF0C38D1ED7FD
-99B0B9A3BD8D8FF6219588B3B8FA59D0CDD1D9B2F65122AB45E48F1757467B9204926140E3C350C5
-A927A2E700173053EC35D3F1DA2D7258714C97FAA857F0898917BD94625C6D1E2D77138EFCAAAF51
-7B17FE187A2212C24A881A2C6A647DEF6376ED80AE4175C5EE80921F001995B44E49F0D33DD9075A
-CF33BB03671C0BCC34AD5784AD1CDFED3A6D9BA103B3DDC1CC2DE74DBB576A0277715275218CD19C
-A8899209125266D8BF1286F881DCC2C383749D1E768D670F4099F7DE959EDFE852583183C9111601
-2881A56A24AAF020EA45CD5F39660DEBCE30AC1C7B8CFC60387B1B0C3E361BE612FDFA9F01B7E4B4
-A18839A2C7E0E393EBC5AD9A8A4EBC316A740C1C295D9EF5F4DFFA0667F9582C0BB837B142C4CFC6
-B1798E9476D0631111033B8BA75A10FDC800E2AB1E0E829632F869CFE4737BE9E2800759EE0831DC
-7D1195EAF80555771981DD6DC6606812D92CB8EF86447F5F6C6F626D0E265C67E52A6319189EE349
-D48E49DFE6A9E98F76C414A1E3217AE0A215A17E54AA498F4ECDC50242ACC7E2322F63BB2FF2189D
-057E7354E32A3ED1803116176B9B9D0129930F919E2FEC280B2C8924E49E7BB75768A2EE1DA8ADBE
-D4E3589906DF1B923AEF84C1BD327438B731012E69BB0D43A1842CB88BB54EA4516477F704CFEB28
-6E3EA483445AD4D74586FCF32E96D366901084365F693A53C5FB532FBFE7BC0CADC404C4985042D6
-8DBB90A6DCDA3531EE324D558A214F935CD9FCC9A0CEBE9B5FB0323F4B3820529599EF48EE068B5A
-CE85004FEA2984F0A86F5AC9D56163BBFE1142B774148F1EB0A4DC89C3349052533A7DE66729DB24
-41B82F8F7360111DACF69293C9B281A0534F3E9E9224A75C49A832F28B2E497262475507B6DDFA9F
-01CA0A6696E3F5AC7EA68595EBA0C2EB8A47813FF936D84AC1B23ECA7AA2862B793CCBB0DF9FDD49
-31BEF354CEC12FBF478559FEC29F81ADF4452E83963E56541D31F3691C93A50F0BBA5E9552C4F2A2
-3A6E53060729854A3DD71CC4308B91957DB19E66AAA18FA67055A950F1C2CFF78A03BC1A588CF624
-696068068719AFB1001C4581EE072113882D9052B21E355D401ED8CD24D067B99E616BDA5A0A5A93
-36FC499632B79FF2FD0DEFB096EF46B75E2D4E0F48DAEA239719FEC4D9A29818F5875FC5041A9EDB
-D26CAF0ACE14CC80BA49BBA59E918EB3D8F1E541AA16026585A2F72DF7D83541816DE46981FB3EFD
-0C30E458CFAD04C79421AB7C4925E23AEA07F9F018431C790002596D26BD9663B51B699DF53E4882
-CBC34EDE88EB55045B889B6062E35FD1E018BCE785157B85EC3B9CA6C85D4B16238275385B8285DB
-012D8FB7C9F5B946A41D7A0FB878FF72C39683144D8A007CFF631B43748F2D5FC690300F9BC0C837
-006B92ECEBE0605E8C3A4A400E18AE8997D1B45FEE10068E247C647CF82C6DFBE5E881D511FFA687
-B7AEB78546BFD07D5F7EC242DCEF4930D8AAAD8C6152B6642AAC325963FD147F236BB850A9966573
-9D06CDBD7CA79A527DCF461E33F22BC9C5DB00DA2BD3DDDD8C99D99793BC98282AA8872FF96C3942
-85D82D9419EB78B6AE37A5F519397700F75D624A09BD255B576E955A323E784E8FC31131F003B0E3
-024A4F58FEF2A6C043796201FC425482E1155E229D1B2D43EF7B0D22322B22EF5C9A1BE026A1C3D3
-75EDAFF99597E1E5477952A4E8D2ACF5D014BC00DC2A272FA62B6983E27D228881E2EF2B8B95A681
-CBE90C5FDE16331C85222FE2A16F0A3C3000A63E2E21666C0C119F8AF89A543D37977069A5ACF155
-6324F05204CE8CAD50FF4FB630D9CBBFC324DEDA584AA56A99D3A76FF55BDC2C2EA3A021361CCD4A
-83C7A5E2768D210FA6DE889FD48A39D679C94EC3C99A8D33FF11377DA7F6F1B71A2A05B302ECDE95
-4F26773F39AC881542F0D0969C3995C3519A8EF70B4220D86BF01BEECC6462855E7B686E1AFF1CA9
-1FB8FD8B4A69E10EE0C2AD94ADD44449506F9B6EF43641F2026EFF6E605C670560C2B74706FB949A
-A7E8CC6A2D0D6207E457E7FD87EC1B9092DC68B9143947CC8ED14AFDDCBF8FDDA228A76847F96802
-E561F67CEEFDE45AE587673983FC04C96744DBAA83F2DC838D633943C75DCB9E6410474EB27B348F
-26E505F0AB90878940E846C5E9F3C5FE8C3558C3236B1B88C405716949B8506841CABE1717474BB7
-C30DB91CDEE33B0F844811762FAEC535BDCF84C1C747CEF9B1FA61D2AFB5A81335BC42C06A94D7D5
-9B7EDE55BCF6F9867AEE107555CDD084B7684C2C87087475A39A9DA6347BE281CE5635A4D07865BA
-98CE26C1465B1AB0343F49FF37B4D0CA9F3BB693D78DC3B21925CB996A038DCC172527FE57C07460
-EF39C07D4396E7FA970D9F22ABD21A9C794B64AD96762C7428F59A8757C36D6C4FFB23216195A04C
-2A2C2E7B10EF7193931544D782FEE4B91E01119C5553BBC6252270A8D8C56DD62D448F5AD8DC69CC
-B45E1F17F0AA1E445129DD00F000005B23D38DE93A3BE55A4C041947F36B4E4536E307D0180553F9
-2E46B743881CB5D5386C48C7D5F84C2BCD06B9C501F78C7EE61FA23516791FCF4DB278AF688A2E60
-10A56692AD92008497487EDFE4BD5FA083FA544138B20D6940020887E35D46E093B71F7A04A67460
-DC8116B4D4839625D7CA6959D6831CD93F81AC4EA2709036DD738364FDE71113BF22EBF13DFE1642
-E564701E6F0FFE7511EDF03FE448C2B28C64FB7D54B94CA576E481FA56B2B18AF10C71F699B6BFD4
-7459CDE1869D0FD306BF489A6F42E5B2F05CCF55BB6B9526973D19CB134CA7F13F1DB3716F8CC217
-73A832568C16250B5CDB16DF24BF81D49F5B37018BD310262EA7078107868AB0216CEC83CEFCAB1E
-9F2C665A31585CA04DC01879CAA79AAA5AB201B516F7052B01B16BEE5606098393B0E5D9F9E5E3F4
-EB20F63C958E796DF41CF28839F5C62A0431648745D7837B519F3AA36BC6C08EF040CCF53D9B6D8C
-0C7D1A84D707EC57A3C6AC9A62AB37251A01A5ED40FDEC6F5BE6E34C6A91D058319439778A2EE5D0
-363E2E1F33463C33327D05FFC0CBF08D5BC457C7230448972FB9B4D0D782BA7DBF10D3FFEF8BF523
-6EC16D4DD6D0D870D9D5EB5C64C9A46A4F583D4F831FEE74B0E5B33A09ABFD4444929BD8F638CD72
-EAB99CF2E9551DF427683964A592E49D186F285258C5D5F62196A98532421D73E3495F82695FEEC6
-E1952C562D546B28618FFAEEBEFF03A57F4D855021F85B0C7BC37FCC6DA9AECA099B646B99D41896
-09D3FF2D56422F8C37E97640293EC7C90E3380887836F4938FBF495CAC14FBA5648D89282D8D49D9
-1AF73ED36581139D8BD42551E263E830EA3C6EB381D85C42D74C50DB0CCAEC03F535ADE92128A016
-0E811C34748309AF7604919B66CD43EB5CA975302DCB6076FEB6BDD6FF55976FE990FB0CE9ABB11B
-195403FB26E3D6C6A0DE1C5BE79E171A61E21F79EE8DBE7A832519813EF6B33EA098C2C32ADEA219
-AB2AAC8B093F40000995539D1276D5F2EF84CCD099B71FE4269BDBDB6A8D59C86F7D2E3FBCCF8773
-D0FAE97640BC1AD43CB4B992BFADFB09DBD0CAAEB8CD9DA264187C4F97300E9A6C9DEED5525479E6
-05C65AE336CBBDF4E5D7F79AD098F977285E065579B748FEAA97F2A753E1F962FCAB68D72BAA8EE4
-FF6691C23E31BC0F3E981A96FB440404856AE1AB32A7205B17D411D8F21C8C93B704D07EC594422A
-BC368CDA2B1610CE6A973F4474E12B78B532666797F5755D269772C9F5400B3BFC6C58395D38527E
-2CCCF29B56123F7DCEF3BDE5DC1DFC5B0293BB125085B1D2D929BC3EE84F4FAD571A4991C3DEE03F
-2DB3A3097E52B1A7D5C73CCB6148EAC62E8E36DE9A71C57638C6E4D5D9DED18174E8C390E50B4A5B
-913C074EEAEBE390B214B3A68F02862B9A296DB4B409769649E51D738CBBDFB7702E15C73C2AFC6B
-C37CE15171F4E822CF20EFE55D9F061AA43E648989628FF79E65932390CBB15D8E621333B18B11C3
-BDF96F841D7434E01AD501FEA964A75B248A35CD9DF9A37E48A1E5A09C624B93CE44F0042FA00D7F
-9EE89B9F7AB785E9C718CF6E7228F743271C2C9BBA17E5208B920E44E765D99D86650EB454B0FAAA
-112753AA1BD3A24239E9C5FC47EEB1547AC9D23731B8DC48B9707830DAEC60C8D3790BBA1120F776
-4EFAC542CFFBCD5C05F9510B27B2534B704ECD36C8B041FD49A96881302FFF5B0163A2DD09C751D6
-D6AFEA9170A4F4C4AB8D46E62F763FE1BDA51DD1CE4A27E772F3A2869155F762FF26B7AA6FCFA4F1
-292E56F03AAB6322BF867E7710C34D43B5D85B45AA68014AD7879EED051B1933E491496E3E26D9AA
-8B80A07BF2B94F1077E84A9726F08199887D66DE7A307BF33C30DD9CF3DA188088C03B2BAD09A217
-6B110DB2C868B53DA9A66C85737BA66C93C58A259860E294AD0191E3A72C73F40B0BD98699AA08DA
-F03587B78F391F3A4313C58D9F29B53C70785637BD0C58310109C54091AB0A34CBB0C478613A7AC0
-FB8F0A8B4645AC966395D8BA775262CD291136AFFDDF01C1D83DD4EB3B59CCAD18057FE7D92A8CD4
-A58F22508D9FD7CF356571F701BBB23E749BDDCBF8A317FDA0AEFD952BB18545610FFAD3AC143D35
-1B8DB3F66293375E0E50235F0D0466932181D377EDD32A5F0FFA4E22B5A0CB4F343D9A7E4A342E9D
-09DFF6C697630CD3971802C277A5590B8CA94BDE6B38446C794D072BBCCB724D5BC208EEF1B018D7
-39373BB910D668882CAA779C2D686081DE6A2606417B54D7C20E0E7F722648D893E4EDBAE8F00D6A
-6DA3712F91AE860C756D1127D133AB828E9D80023B50B162C5A1C5CDF70CCB3FDD7EA060ED20838B
-E1E50C4094C9E79E1A0187CDF780CAF45A725964F004253E034C5BE46BBF89D94631F1A33BAA35B8
-4FA2A9D08481C6674126CD96ED05DCE48BDA069D902D6836D5DFBA701DC0F98A863E64F0E312145D
-8DC0B77F25B43AEC729A1243B45B08CA228DD6101CAA2AC5ADCC8EFF84A4CA3F254176C2CC711EE6
-C273835D0FD3528ECA2A976B88E51FE347FDB60F32370B66D338931D6581630ED586F349C638960C
-31AE4204E89521A96E1219E696B913DEB2AAB7A3B022D06F34FDFCB810A04E60A4FEBE284C2F063E
-0AE9EDF87704921CCFA193BDC912B747E13570066223A49F1F6E2AF0D4D65DA04CA876FF7A462FFC
-9C0BA2CC545C3BD36DBE762F32B2D6BE5867C59F479195C92440DC165098B74EA5C3AD93CDF2D410
-B04C16BC7801E7956F4E5107450787AA592493171C3628E6B8F49D4F8429EB98DC52EF025F001387
-BC1A7093F7A99F10B5D2D7DD8BBB393BF6E56F08F4F7FA1A343F220D5A1EAE7168C74D41BE1DC1A8
-3BD65B72B982F4F7B34F24F97F9EC9A91011064031FACFF2A14921A32024385F4E061CD07D152E74
-1BF97156D951A342488FA7F5EF934CCAD13E2753A0AB7A1F565C2F7F6B349DF03BBC25BBD972A9AD
-F809BB5C5048A8CCEF9297B2ED3324D18867F293CC66E88B3A39D107B610DFE79A3B4E83A96D3D52
-A17FE8A62C9FDD271130148366942C9CE57558D023DA5F7501319EBFA33DE9E6D1E76D7C20DB8A09
-B657839DA99F3D8143F1EE6253A3295C9651FA4366547893C2DC7ABCBF4BB7609DE5D001E0A36D9F
-FBE01F7D0903B3208AE8547E2E5F14EC1AF4C2535CA8F4EA37E3F3CE172C7A1E8308995B1CC23E6E
-81190246BCAB6E755BF868D449BB02A2AA87C44C9CC0F571ADC72547CEECBE104BB274B8AC16DCB7
-5D5F458D356466B921ACDEEAE384E2EB1DF6EF393B41B9747F0A4FAEB4AF1928D9AD6FB7E06FDC62
-1E4C6FC98CFB43F88584BD55D9B97CC9549093EDE586912161931162B1B1D52D0443260DABA02AF2
-B4432100D5506546013DA703573FA8013685CC798CE501960093DED713FFCCF89CA2B9106390198C
-29A00864108CDCC1984A8BAB53919028C01B26ECC7925E38CBE6CCA8978EE21C2B06E7B3E48FBA97
-8E2A7D186E563C088F84AA23178B60E4729EE87D67B1091F3B6973676C1CBFE6530EB773C62E2C24
-97014AB0E8B71A1F4E86A378AA26591511BEE3CF3D64C94848582E1354E1605B6457823F2C5E640A
-D3802946BB2E7E8E594E8C04B430C2385DD40746CE8534F50842E74D7115F3DB0C72D1C9C607C657
-3B094AEB73B7A79876CFFC3E2F8C9FEAAA07D3BFCE05B61F7749A8793BE90CCCECA2D7077F25E899
-D3331FE161A7E86C842495D584C6E4A0880B2951D8A13B88C4672080A0B1BE36BF47C3ACE7288CFE
-41A8C1BAA6F0814A947FBD6B3AA72B6C73A8C578CA51CCC96F2352316C467BB960E981F2B6485BFB
-44B577E71EFDA16E7405954BC7C9F0759F5A9F1EBCD2FA9CC9648D5831A68887F41B15081A204C24
-B4B992A231DEF9E698D4C3A25B6F5474F5BE6A601F2D337A58A0D21FF37FD91EB86D1D738893A03A
-69F0CD743F611CDFFE69DB2C6ED0E4611D56F803BB0DC06E7FE85A303839612707647B1BE9FAF8D6
-84122CA9E5CB8BDE2936D3F4FF254D31529D7538BBD4D35539489F9E7316F24214B996BCDCF1818E
-749A71CF0E8845AA1E2A58AA62A48E02BA4564625D20AA220EE719608521D7D7A7FCA0BD8904A401
-9819D371F3F59D46C1354E5FC1A6E5F79B20CF4ACA2BF0F2DE73DA193A6F9ACBFE0B4731C4BCEBE6
-D96FE822965DE965232282A3A130361F188B3AABDA95A8A2790D9240BE008B6A6DE4BBFCADA05B67
-86B9BB8E0DFA0C30043A3B07ED46277E07B9808422C8ED16758B9C396F4EA929D769785B2C9568E5
-70A83B989B25CE200F1727D41E2B702E7F88F1784F4C83FA60A74EB26B2DA95126E508ED519A61CC
-151DB6804F61826C5F86D8FA89D06E526FED97A0DB88EDB432FF32C1ACC9B622EEDF601081AF7B96
-3C9CFC1D13E4A9C74FEA0A1C8E3D8653CD92A944D4CA6B0D306619AFD503506D77732D6514F604BE
-4610C2560931BDE0B40939BC1D126B0E97F72AE1B4A9252123B54F7A27E0CFA4425B4546526FD741
-CA77952B10D13E0AC2E32006A903808FF0CD013F936238C74CC75FD915244C56A8412F37F0134840
-347699508D6F3D7F3203A25B7C70100719582CD588590EE34B3AB13E255B613A6D00386A0104CC5E
-D2C646F09A88888D3751651D5646C5227A3C80E8DA1B0A331121DD2429F1F4775D30564DFF47D01B
-BE2C6C72CE4D1FD9A2077C04D2B0274B8916F6A9D1A4A6964A534F47CF241D5A8E34B23F85BE9ACF
-FC2FEA961F277539F215F8728D6788F67BEAF45502839BCF23D8763C3949352F00C579A9A4FC408E
-C625E310DAE61512DFE6844E82D36A2F81709E1F05B38AE9C222ED62C961EE63593CED7AAF73CE2E
-D3667740C77B309B93EEFE1B4BA65D48575A66BE86743DC9E5D3C2FF418D11F7F211B86E827EE1DF
-C3613E7498030F07050524536D1F8A94DDB6698BE7B963C55CB3F74B676CD815A7B3DF4B1A0EA2BE
-1B0B9A11FFBFD5B1FA49668AEE14629316AF436A0821C20BEEF7B3480847934A99F6D85B68F4DDF8
-859A754E009428AF89A90D1852C220A607FF0806E8080726EDC94D691D214B4521C147C4273AEBDD
-BB4A697EF16448CD9B2FC95293305858DECFD406B89B9F3FDAE2AC579E80CF321EBAE5701FB2F7CA
-D8ED04B4A63115886D45D6120F69AEF1A21D80AD3C2D35D2899F1902242B96CD349E0AAADA40F7A1
-1282B6B52BDD97708E58DC5E2D22D1153E5FA3F3B300BCDFAF98DEC2F4E3C82A1C85F985735F3987
-4F557579F422664E07CBE19DA680EFB0FC82C323EC5C4644C51709AC8D674608A8043C91E6C7988D
-430F10BA6CE1FC7FC0604FCD8F723895250AEC36CC35B3FA14FE2A0D24095DCC30B2093F2298F5F0
-A97676A0BE66C3DC9ADACFE2FC0F721A20E945AFC1096A619075D5E9A264C796EC6C90EF1AEEA8DC
-089B44FFC13D27CB2370070A52D4416C53F364393E46EDD7EDE00799960CE6E0D57E4909E88ADD64
-BDD2B0EBE2D73FA6ACF8B40280DAA0637E705C65AABD523B8815F22F23E9FF81E7829C7E4BC980C9
-143AEBE1A04DC0D253396BBB7268BD5AEEA356B610D5DCEE03135E00AE34388251F31714A1C40E18
-2652C48CDA2211A22CB6F02490E69A44CECB169754C53B16028D352E0119F5D5FAE0BD7EA1CDA647
-12A6147374B64244E21E9EC9F0D1381AD22D5B6212B26C3F9AA5F6045F25DD9F5EB4489EA39B1945
-331AC70510C5752557DE21D0A6CFC1EB10A98FA867B76DA6E4249469F591FD154D39E89364A43DB0
-07AA0D7A911CFAE6CE2B557997FBC44F55A27F622BD7B8B10EC9F5D10F2649A646FD964AE1B111B3
-5B46A252C4DEE44E7426EB5739F24E8A390694597DB3A1FE7800C97E59558322F0E49A0CCE2AD94B
-1E2D1026AFA771723E3F523916F55ED866C9FB4A2F759651C613A2CFF362028CDF9D38F05D4C7C60
-24C533E930B64B099FB1AF04B01F5FB9CA6867E6EFF55A772C5391831059987E10CBF987E3F378E0
-1329F73D54DC0484177D3C3C06F67397955FF1CA4EF8AD1606B70455255D631A7D6EB92BFDBA14A0
-FF28B2ACE7E81AD666EA9B3A0F5A6BA3B5DFE35044FA4B3D8ED956009C60E98CC132F2E84967F4A9
-8A67B336D5EE7CAF7DD1F74D1FA08619941361FA7312CF225D89CEF97E864C8369EAFAB94D97F056
-5505D825972B754F6729596EEA91210B75DD8F645382ACE36DE60819A02B3B48DD00F5485F9264F9
-FA926D732E2C267B0BE8CA98526F124F97EFDB86132C5EF16B103908172FC51F286FFE45FF253512
-E0033F037FF182BA536A9EB2DF2D1DB257D9C86C46E1B002FB32AC70CA9462E6EB48994752CEBCE3
-9F08ABD4F4B0889283E55500702185A841E328
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-0000000000000000000000000000000000000000000000000000000000000000
-cleartomark
-%%EndResource
-/NimbusMonL-Regu-iso1252 /NimbusMonL-Regu ISO1252Encoding psp_definefont
-/Times-Roman-iso1252 /Times-Roman ISO1252Encoding psp_definefont
-294 310 moveto
-0 0 0 setrgbcolor
-/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont
-<4558504F52545F505953435249505453202B3D20534D4553485F6669786174696F6E5F68657861
-2E70792C20534D4553485F666C696768745F736B696E2E7079>
-show
-294 398 moveto
-<69666571202840574954484E455447454E402C79657329>
-show
-294 442 moveto
-<20204558504F52545F505953435249505453202B3D20534D4553485F626F785F74657472612E70
-792C20534D4553485F626F78325F74657472612E70792C205C202020>
-show
-294 486 moveto
-<20202020202020202020202020202020202020202020534D4553485F626F78335F74657472612E
-70792C20534D4553485F6669786174696F6E5F74657472612E70792C205C>
-show
-294 530 moveto
-<20202020202020202020202020202020202020202020534D4553485F506172746974696F6E315F
-74657472612E7079>
-show
-294 574 moveto
-<656E646966>
-show
-295 691 moveto
-/Symbol findfont 50 -50 matrix scale makefont setfont
-<B7>
-show
-370 691 moveto
-/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont
-<46696E616C656D656E74>
-show
-595 691 moveto
-<20>
-show
-607 691 moveto
-<3A>
-show
-294 797 moveto
-/NimbusMonL-Regu-iso1252 findfont 42 -42 matrix scale makefont setfont
-<2E2F6275696C645F636F6E666967757265>
-show
-294 841 moveto
-<636420534D4553485F4255494C44>
-show
-294 885 moveto
-<726D20636F6E6669672E2A>
-show
-294 929 moveto
-<53414C4F4D45325F524F4F542F534D4553485F5352432F636F6E6669677572652096776974682D
-6E657467656E3D6E657467656E5F696E7374616C6C6174696F6E5F70617468205C>
-show
-294 973 moveto
-<967072656669783D736D6573685F696E7374616C6C5F70617468>
-show
-294 1016 moveto
-<6D616B65>
-show
-220 1128 moveto
-/Times-Roman-iso1252 findfont 50 -50 matrix scale makefont setfont
-<6FF920736D6573685F696E7374616C6C5F7061746820657374206C61206469726563746F727920
-6427696E7374616C6C6174696F6E206475206D6F64756C6520534D4553482E>
-show
-280 277 1 308 rectfill
-2125 277 1 308 rectfill
-280 277 1846 1 rectfill
-280 584 1846 1 rectfill
-280 763 1 264 rectfill
-2125 763 1 264 rectfill
-280 763 1846 1 rectfill
-280 1026 1846 1 rectfill
-showpage
-grestore grestore
-%%PageTrailer
-
-%%Trailer
-%%Pages: 7
-%%EOF
+++ /dev/null
-#######################################################################################
-# File : PluginMeshers.txt
-# Author : Julia DOROVSKIKH
-# Module : SMESH
-# $Header$
-#######################################################################################
-#
-# How to add your own mesher (as a set of hypotheses and algorithms) to the application
-#
-#######################################################################################
-
-1. Create mesher plugin package, e.g. MyMesher.
-
-2. Create XML file to describe all algorithms and hypotheses, provided by plugin package
- (see SMESH_SRC/resources/SMESH_Meshers.xml for example).
-
- <meshers-group name="MyName"
- resources="MyResourceKey"
- server-lib="libMyServerLib.so"
- gui-lib="libMyClientLib.so">
- <hypotheses>
- <hypothesis type="MyHypType1"
- label-id="My beautiful hypothesis name"
- icon-id="my_hypo_1_icon.png"/>
- </hypotheses>
- <algorithms>
- <algorithm type="MyAlgType1"
- label-id="My beautiful algorithm name"
- icon-id="my_algo_1_icon.png"/>
- </algorithms>
- </meshers-group>
-
- Attributes of <meshers-group> tag:
-
- - value of <name> attribute is used to collect hypotheses/algoritms in groups;
- you can also use this attribute for short description of your mesher plugin
-
- - value of <resources> attribute (MyResourceKey) is used to access resources
- (messages and icons) from GUI (see paragraphs 4.2 and 5);
- currently it should coincide with the name of plugin package; this limitation
- will be eliminated in the further development.
-
- - value of <server-lib> attribute describes the name of your mesher's
- server plugin library (See paragraph 3)
-
- - value of <gui-lib> attribute describes the name of your mesher's
- client plugin library (See paragraph 4)
-
- Attributes of <hypothesis/algorithm> tag:
-
- - value of <type> attribute is an unique name of the hypothesis/algorithm
-
- * It is a value of _name field of your hypothesis class
- (see paragraph 3, implementation of constructor of
- StdMeshers_LocalLength class: _name = "LocalLength")
-
- * It is a key to each certain hypothesis class
- (see paragraph 3, implementation of "GetHypothesisCreator()" method in StdMeshers_i.cxx)
-
- * It is a key to each certain hypothesis GUI
- (see paragraph 4, implementation of "StdMeshersGUI_HypothesisCreator::CreateHypothesis()"
- and "StdMeshersGUI_HypothesisCreator::EditHypothesis()" methods in StdMeshersGUI.cxx)
-
- * It is a key to each certain hypothesis icon in Object Browser
- (see paragraph 4.2.1)
-
- - value of <label-id> attribute is displayed in the GUI in the list
- of available hypotheses/algorithms ("Create Hypothesis/Algorithm" dialog)
-
- - value of <icon-id> attribute is a name of icon file, which is displayed in GUI
- in the list of available hypotheses/algorithms ("Create Hypothesis/Algorithm" dialog)
-
- Note: All attributes values are accessible in your GUI via HypothesisData class
- (see paragraph 4.1)
-
- Note: The environment variable SMESH_MeshersList contains the list of plugins names,
- separated by colon (":") symbol, e.g.:
-
- setenv SMESH_MeshersList StdMeshers:NETGENPlugin
-
- Please, pay attention that StdMeshers should also be included into this environment variable,
- if you want to use standard hypotheses/algorithms, provided with SMESH module.
-
- The SALOME automatically locates XML files, searching them in the following directories:
-
- ${<PLUGINNAME>_ROOT_DIR}/share/salome/resources
- ${SALOME_<PluginName>Resources}
- ${HOME}/.salome/resources
- ${KERNEL_ROOT_DIR}/share/salome/resources
-
- where <PluginName> is a name of each mesher plugin package
-
-3. Build server plugin library <libMyServerLib.so>.
-
- 3.1. Define interface to your hypotheses and algorithms.
-
- Example: SMESH_SRC/idl/SMESH_BasicHypothesis.idl
- NETGENPLUGIN_SRC/src/NETGENPlugin_Algorithm.idl
-
- 3.2. Implement functionality of your hypotheses and algorithms.
- Inherit corresponding classes from SMESH.
-
- Example: SMESH_SRC/src/StdMeshers/StdMeshers_*
- NETGENPLUGIN_SRC/src/NETGENPlugin_NETGEN_3D
-
- 3.3. Implement interface to your hypotheses and algorithms.
- Inherit corresponding classes from SMESH_I.
-
- Example: SMESH_SRC/src/StdMeshers_I/SMESH_*_i
- NETGENPLUGIN_SRC/src/NETGENPlugin_NETGEN_3D_i
-
- 3.4. Implement being exported method.
-
- GenericHypothesisCreator_i* GetHypothesisCreator (const char* aHypType)
-
- <aHypType> is a value of <type> attribute in the XML-description file
-
- Example: SMESH_SRC/src/StdMeshers_I/StdMeshers_i.cxx
- NETGENPLUGIN_SRC/src/NETGENPlugin_i.cxx
-
-4. Build client (GUI) plugin library <libMyClientLib.so>.
- This step is required only if your hypotheses/algorithms need specific GUI for their construction.
-
- 4.1. Implement the required GUI (e.g. construction dialog boxes).
-
- Example: SMESH_SRC/src/StdMeshersGUI/StdMeshersGUI_*Dlg
-
- Note: all data from XML-description files is accessible in your GUI via HypothesisData class
- (mySMESHGUI->GetHypothesisData (aHypType),
- see SMESHGUI_Hypotheses.h for HypothesisData definition)
-
- 4.2. Provide icons and messages for your GUI.
-
- 4.2.1. Implement resource files
- MyResourceKey_icons.po and MyResourceKey_msg_en.po
-
- Example: SMESH_SRC/src/StdMeshersGUI/StdMeshers_*.po
- NETGENPLUGIN_SRC/src/NETGENPlugin_icons.po
-
- Note: ICON_SMESH_TREE_HYPO_MyHypType1 is ID of icon for Object Browser
- for hypothesis with type="MyHypType1".
-
- ICON_SMESH_TREE_ALGO_MyAlgType1 is ID of icon for Object Browser
- for algorithm with type="MyAlgType1".
-
- See paragraph 2 for definition of MyResourceKey, MyHypType1, MyAlgType1.
-
- 4.2.2. Define environment variable SALOME_<MyResourceKey>Resources to point to the
- directory where resources are situated.
-
- Example: setenv SALOME_StdMeshersResources ${SMESH_ROOT_DIR}/share/salome/resources
-
- 4.3. Implement your Hypothesis Creator and being exported method
-
- SMESHGUI_GenericHypothesisCreator* GetHypothesisCreator
- (QString aHypType, QString aServerLibName, SMESHGUI* aSMESHGUI)
-
- <aHypType> is to pass a value of <type> attribute in XML-description file;
- <aServerLibName> is to pass a value of <server-lib> attribute in XML-description file.
-
- Example: SMESH_SRC/src/StdMeshersGUI/StdMeshersGUI.cxx
-
-5. If your hypotheses/algorithms do not need specific GUI,
- but you want to provide icons for object browser, see 4.2 paragrath
-
-6. Setup your SALOME environment.
-
- 6.1. Add your plugin to the LD_LIBRARY_PATH, PYTHONPATH (and maybe PATH) environment variables, e.g.:
-
- setenv PATH <path-to-my-plugin>/bin/salome:${PATH}
- setenv LD_LIBRARY_PATH <path-to-my-plugin>/lib/salome:${LD_LIBRARY_PATH}
- setenv PYTHONPATH <path-to-my-plugin>/lib/python2.2/site-packages/salome:${PYTHONPATH}
-
- 6.2. Set mesher plugin resources environment variable (see 4.2.2 paragraph)
-
-Note: If you use runSalome.py script from KERNEL package to launch SALOME, you may not to set
- environment variables, because this script sets them itself. All what you should do is
- to add <plugin> section to your ${HOME}/.salome/salome.launch file for SMESH module section:
-
- ...
- <modules-list>
- ...
- <module name="SMESH">
- <plugin name="MyMesher"/>
- </module>
- ...
- </modules-list>
- ...
\ No newline at end of file
+++ /dev/null
-# Copyright (C) 2003 CEA/DEN, EDF R&D
-#
-#
-#
-# File : Makefile.in
-# Author : Vasily Rusyaev (Open Cascade NN)
-# Module : doc
-# $Header:
-
-top_srcdir=@top_srcdir@
-top_builddir=../../..
-srcdir=@srcdir@
-VPATH=.:@srcdir@
-
-@COMMENCE@
-
-docs:
- cp -fr $(srcdir)/SMESH ./
- -find $(PWD) -name CVS -exec rm -rf {} \;
-
-clean:
- rm -fr `ls | grep -v "Makefile"`
-
-distclean: clean
- rm -fr SMESH
-
-install:
- mkdir -p $(docdir)/gui
- cp -rf SMESH $(docdir)/gui
- -find $(PWD) -name CVS -exec rm -rf {} \;
-
-uninstall:
- rm -rf $(docdir)/gui/SMESH
+++ /dev/null
-# Copyright (C) 2003 CEA/DEN, EDF R&D
-#
-#
-#
-# File : Makefile.in
-# Author : Vasily Rusyaev (Open Cascade NN)
-# Module : doc
-# $Header:
-
-top_srcdir=@top_srcdir@
-top_builddir=../../..
-root_srcdir=@ROOT_SRCDIR@
-srcdir=@srcdir@
-VPATH=.:@srcdir@
-doxygen=@DOXYGEN@
-
-@COMMENCE@
-
-PYTHON_SCRIPTS = \
- smesh.py
-
-docs:
- cp -fr $(srcdir)/SMESH ./INPUT; \
- cd INPUT; \
- sed 's|../../../share/salome|$(root_srcdir)|' ./doxyfile > ./doxyfile1; \
- mv -f doxyfile1 doxyfile; \
- $(doxygen) ./doxyfile; \
- mkdir py1; mkdir py2; \
- cd ..
- for file in $(PYTHON_SCRIPTS) dummy; do \
- if [ $$file != "dummy" ]; then \
- cp $(root_srcdir)/src/SMESH_SWIG/$$file INPUT/py1/; \
- fi ; \
- done
- cd INPUT; \
- python $(KERNEL_ROOT_DIR)/doc/salome/tui/KERNEL/pythfilter.py ./py1 ./py2; \
- sed 's|list_py_files_to_process|$(PYTHON_SCRIPTS)|' ./doxyfile_py > py2/doxyfile_py; \
- cd py2; \
- $(doxygen) ./doxyfile_py; \
- cd ../..; \
- cp -fr $(srcdir)/SMESH/sources/static/*.* ./SMESH/
- cp -fr $(srcdir)/SMESH/sources/ SMESH/
- cp -fr $(srcdir)/SMESH/HTML/ SMESH/
- rm -fr INPUT
-
-clean:
- rm -fr SMESH
-
-distclean: clean
- rm -fr INPUT
-
-install:
- $(INSTALL) -d $(docdir); \
- mkdir -p $(docdir)/tui
- cp -fr SMESH $(docdir)/tui
-
-uninstall:
- rm -fr $(docdir)/tui/SMESH
+++ /dev/null
-<HTML><b>
-<table width="100%" BORDER>
-<tr bgcolor="#FFFFCC">
-<td colspan="11"><font size="+3"><b><div align="center"><i>interface StdMeshers_LocalLength</i></div></b></font></td>
-</tr>
-<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
-<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>void SetLength ( in double length )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>SetLength ( length )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>double GetLength ( )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetLength ( )</b></div></td>
-</tr>
-</table><br>
-<table width="100%" BORDER>
-<tr bgcolor="#FFFFCC">
-<td colspan="11"><font size="+3"><b><div align="center"><i>interface StdMeshers_NumberOfSegments</i></div></b></font></td>
-</tr>
-<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
-<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>void SetNumberOfSegments ( in long segmentsNumber )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>SetNumberOfSegments ( segmentsNumber )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>long GetNumberOfSegments ( )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetNumberOfSegments ( )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>void SetScaleFactor ( in double scaleFactor )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>SetScaleFactor ( scaleFactor )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>double GetScaleFactor ( )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetScaleFactor ( )</b></div></td>
-</tr>
-</table><br>
-<table width="100%" BORDER>
-<tr bgcolor="#FFFFCC">
-<td colspan="11"><font size="+3"><b><div align="center"><i>interface StdMeshers_Arithmetic1D</i></div></b></font></td>
-</tr>
-<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
-<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>void SetLength ( in double length, in boolean isStartLength )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>SetLength ( length, isStartLength )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>double GetLength ( in boolean isStartLength )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetLength ( isStartLength )</b></div></td>
-</tr>
-</table><br>
-<table width="100%" BORDER>
-<tr bgcolor="#FFFFCC">
-<td colspan="11"><font size="+3"><b><div align="center"><i>interface StdMeshers_MaxElementArea</i></div></b></font></td>
-</tr>
-<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
-<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>void SetMaxElementArea ( in double area )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>SetMaxElementArea ( area )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>double GetMaxElementArea ( )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetMaxElementArea ( )</b></div></td>
-</tr>
-</table><br>
-<table width="100%" BORDER>
-<tr bgcolor="#FFFFCC">
-<td colspan="11"><font size="+3"><b><div align="center"><i>interface StdMeshers_LengthFromEdges</i></div></b></font></td>
-</tr>
-<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
-<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>void SetMode ( in long mode )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>SetMode ( mode )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>long GetMode ( )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetMode ( )</b></div></td>
-</tr>
-</table><br>
-<table width="100%" BORDER>
-<tr bgcolor="#FFFFCC">
-<td colspan="11"><font size="+3"><b><div align="center"><i>interface StdMeshers_StartEndLength</i></div></b></font></td>
-</tr>
-<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
-<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>void SetLength ( in double length, in boolean isStartLength )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>SetLength ( length, isStartLength )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>double GetLength ( in boolean isStartLength )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetLength ( isStartLength )</b></div></td>
-</tr>
-</table><br>
-<table width="100%" BORDER>
-<tr bgcolor="#FFFFCC">
-<td colspan="11"><font size="+3"><b><div align="center"><i>interface StdMeshers_Deflection1D</i></div></b></font></td>
-</tr>
-<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
-<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>void SetDeflection ( in double deflection )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>SetDeflection ( deflection )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>double GetDeflection ( )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetDeflection ( )</b></div></td>
-</tr>
-</table><br>
-<table width="100%" BORDER>
-<tr bgcolor="#FFFFCC">
-<td colspan="11"><font size="+3"><b><div align="center"><i>interface StdMeshers_MaxElementVolume</i></div></b></font></td>
-</tr>
-<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
-<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>void SetMaxElementVolume ( in double volume )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>SetMaxElementVolume ( volume )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>double GetMaxElementVolume ( )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetMaxElementVolume ( )</b></div></td>
-</tr>
-</table><br>
-<table width="100%" BORDER>
-<tr bgcolor="#FFFFCC">
-<td colspan="11"><font size="+3"><b><div align="center"><i>interface StdMeshers_NotConformAllowed</i></div></b></font></td>
-</tr>
-<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
-<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
-</tr>
-</table><br>
-<table width="100%" BORDER>
-<tr bgcolor="#FFFFCC">
-<td colspan="11"><font size="+3"><b><div align="center"><i>interface StdMeshers_Propagation</i></div></b></font></td>
-</tr>
-<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
-<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
-</tr>
-</table><br>
-<table width="100%" BORDER>
-<tr bgcolor="#FFFFCC">
-<td colspan="11"><font size="+3"><b><div align="center"><i>interface StdMeshers_Regular_1D</i></div></b></font></td>
-</tr>
-<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
-<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
-</tr>
-</table><br>
-<table width="100%" BORDER>
-<tr bgcolor="#FFFFCC">
-<td colspan="11"><font size="+3"><b><div align="center"><i>interface StdMeshers_MEFISTO_2D</i></div></b></font></td>
-</tr>
-<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
-<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
-</tr>
-</table><br>
-<table width="100%" BORDER>
-<tr bgcolor="#FFFFCC">
-<td colspan="11"><font size="+3"><b><div align="center"><i>interface StdMeshers_Quadrangle_2D</i></div></b></font></td>
-</tr>
-<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
-<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
-</tr>
-</table><br>
-<table width="100%" BORDER>
-<tr bgcolor="#FFFFCC">
-<td colspan="11"><font size="+3"><b><div align="center"><i>interface StdMeshers_Hexa_3D</i></div></b></font></td>
-</tr>
-<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
-<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
-</tr>
-</table><br>
-</b></HTML>
+++ /dev/null
-<HTML><b>
-<table width="100%" BORDER>
-<tr bgcolor="#FFFFCC">
-<td colspan="11"><font size="+3"><b><div align="center"><i>interface SMESH_Gen</i></div></b></font></td>
-</tr>
-<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
-<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>FilterManager CreateFilterManager ( )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = CreateFilterManager ( )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>SMESH_Pattern GetPattern ( )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetPattern ( )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>void SetCurrentStudy ( in Study theStudy )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>SetCurrentStudy ( theStudy )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>Study GetCurrentStudy ( )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetCurrentStudy ( )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>SMESH_Hypothesis CreateHypothesis ( in string theHypName, in string theLibName )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = CreateHypothesis ( theHypName, theLibName )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>SMESH_Mesh CreateMesh ( in GEOM_Object theObject )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = CreateMesh ( theObject )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>SMESH_Mesh CreateMeshesFromUNV ( in string theFileName )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = CreateMeshesFromUNV ( theFileName )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>mesh_array CreateMeshesFromMED ( in string theFileName, out DriverMED_ReadStatus theStatus )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>[ return_value, theStatus ] = CreateMeshesFromMED ( theFileName )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>SMESH_Mesh CreateMeshesFromSTL ( in string theFileName )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = CreateMeshesFromSTL ( theFileName )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>boolean Compute ( in SMESH_Mesh theMesh, in GEOM_Object theSubObject )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = Compute ( theMesh, theSubObject )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>boolean IsReadyToCompute ( in SMESH_Mesh theMesh, in GEOM_Object theSubObject )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = IsReadyToCompute ( theMesh, theSubObject )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>long_array GetSubShapesId ( in GEOM_Object theMainObject, in object_array theListOfSubObjects )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetSubShapesId ( theMainObject, theListOfSubObjects )</b></div></td>
-</tr>
-</table><br>
-</b></HTML>
+++ /dev/null
-<HTML><b>
-<table width="100%" BORDER>
-<tr bgcolor="#FFFFCC">
-<td colspan="11"><font size="+3"><b><div align="center"><i>interface SMESH_Hypothesis</i></div></b></font></td>
-</tr>
-<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
-<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>string GetName ( )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetName ( )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>string GetLibName ( )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetLibName ( )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>long GetId ( )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetId ( )</b></div></td>
-</tr>
-</table><br>
-<table width="100%" BORDER>
-<tr bgcolor="#FFFFCC">
-<td colspan="11"><font size="+3"><b><div align="center"><i>interface SMESH_Algo</i></div></b></font></td>
-</tr>
-<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
-<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>ListOfHypothesisName GetCompatibleHypothesis ( )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetCompatibleHypothesis ( )</b></div></td>
-</tr>
-</table><br>
-<table width="100%" BORDER>
-<tr bgcolor="#FFFFCC">
-<td colspan="11"><font size="+3"><b><div align="center"><i>interface SMESH_1D_Algo</i></div></b></font></td>
-</tr>
-<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
-<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
-</tr>
-</table><br>
-<table width="100%" BORDER>
-<tr bgcolor="#FFFFCC">
-<td colspan="11"><font size="+3"><b><div align="center"><i>interface SMESH_2D_Algo</i></div></b></font></td>
-</tr>
-<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
-<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
-</tr>
-</table><br>
-<table width="100%" BORDER>
-<tr bgcolor="#FFFFCC">
-<td colspan="11"><font size="+3"><b><div align="center"><i>interface SMESH_3D_Algo</i></div></b></font></td>
-</tr>
-<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
-<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
-</tr>
-</table><br>
-</b></HTML>
+++ /dev/null
-<HTML><b>
-<table width="100%" BORDER>
-<tr bgcolor="#FFFFCC">
-<td colspan="11"><font size="+3"><b><div align="center"><i>interface SMESH_Mesh</i></div></b></font></td>
-</tr>
-<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
-<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>SMESH_subMesh GetSubMesh ( in GEOM_Object aSubObject, in string name )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetSubMesh ( aSubObject, name )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>void RemoveSubMesh ( in SMESH_subMesh aSubMesh )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>RemoveSubMesh ( aSubMesh )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>SMESH_Group CreateGroup ( in ElementType elem_type, in string name )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = CreateGroup ( elem_type, name )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>SMESH_Group CreateGroupFromGEOM ( in ElementType elem_type, in string name, in GEOM_Object theGEOMGroup )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = CreateGroupFromGEOM ( elem_type, name, theGEOMGroup )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>void RemoveGroup ( in SMESH_Group aGroup )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>RemoveGroup ( aGroup )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>void RemoveGroupWithContents ( in SMESH_Group aGroup )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>RemoveGroupWithContents ( aGroup )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>SMESH_Group UnionGroups ( in SMESH_Group aGroup1, in SMESH_Group aGroup2, in string name )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = UnionGroups ( aGroup1, aGroup2, name )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>SMESH_Group IntersectGroups ( in SMESH_Group aGroup1, in SMESH_Group aGroup2, in string name )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = IntersectGroups ( aGroup1, aGroup2, name )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>SMESH_Group CutGroups ( in SMESH_Group aMainGroup, in SMESH_Group aToolGroup, in string name )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = CutGroups ( aMainGroup, aToolGroup, name )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>Hypothesis_Status AddHypothesis ( in GEOM_Object aSubObject, in SMESH_Hypothesis anHyp )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = AddHypothesis ( aSubObject, anHyp )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>Hypothesis_Status RemoveHypothesis ( in GEOM_Object aSubObject, in SMESH_Hypothesis anHyp )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = RemoveHypothesis ( aSubObject, anHyp )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>ListOfHypothesis GetHypothesisList ( in GEOM_Object aSubObject )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetHypothesisList ( aSubObject )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>log_array GetLog ( in boolean clearAfterGet )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetLog ( clearAfterGet )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>void ClearLog ( )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>ClearLog ( )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>long GetId ( )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetId ( )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>long GetStudyId ( )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetStudyId ( )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>SMESH_MeshEditor GetMeshEditor ( )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetMeshEditor ( )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>void ExportDAT ( in string file )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>ExportDAT ( file )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>void ExportMED ( in string file, in boolean auto_groups )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>ExportMED ( file, auto_groups )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>void ExportUNV ( in string file )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>ExportUNV ( file )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>void ExportSTL ( in string file, in boolean isascii )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>ExportSTL ( file, isascii )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>MESH GetMEDMesh ( )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetMEDMesh ( )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>long NbNodes ( )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = NbNodes ( )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>long NbEdges ( )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = NbEdges ( )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>long NbFaces ( )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = NbFaces ( )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>long NbTriangles ( )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = NbTriangles ( )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>long NbQuadrangles ( )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = NbQuadrangles ( )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>long NbVolumes ( )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = NbVolumes ( )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>long NbTetras ( )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = NbTetras ( )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>long NbHexas ( )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = NbHexas ( )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>long NbPyramids ( )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = NbPyramids ( )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>long NbPrisms ( )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = NbPrisms ( )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>long NbSubMesh ( )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = NbSubMesh ( )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>string Dump ( )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = Dump ( )</b></div></td>
-</tr>
-</table><br>
-<table width="100%" BORDER>
-<tr bgcolor="#FFFFCC">
-<td colspan="11"><font size="+3"><b><div align="center"><i>interface SMESH_subMesh</i></div></b></font></td>
-</tr>
-<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
-<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>long GetNumberOfElements ( )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetNumberOfElements ( )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>long GetNumberOfNodes ( in boolean all )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetNumberOfNodes ( all )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>long_array GetElementsId ( )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetElementsId ( )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>long_array GetElementsByType ( in ElementType theType )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetElementsByType ( theType )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>long_array GetNodesId ( )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetNodesId ( )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>SMESH_Mesh GetFather ( )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetFather ( )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>long GetId ( )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetId ( )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>FAMILY GetFamily ( )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = GetFamily ( )</b></div></td>
-</tr>
-</table><br>
-<table width="100%" BORDER>
-<tr bgcolor="#FFFFCC">
-<td colspan="11"><font size="+3"><b><div align="center"><i>interface SMESH_MeshEditor</i></div></b></font></td>
-</tr>
-<td width="50%" bgcolor= "lightgreen" ><font size="+2"><div align="center"><b><i>IDL file</i></b></div></font></td>
-<td width="50%" bgcolor= "lightgreen"><font size="+2"><div align="center"><b><i>Python</i></b></div></font></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>boolean RemoveElements ( in long_array IDsOfElements )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = RemoveElements ( IDsOfElements )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>boolean RemoveNodes ( in long_array IDsOfNodes )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = RemoveNodes ( IDsOfNodes )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>boolean AddNode ( in double x, in double y, in double z )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = AddNode ( x, y, z )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>boolean AddEdge ( in long_array IDsOfNodes )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = AddEdge ( IDsOfNodes )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>boolean AddFace ( in long_array IDsOfNodes )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = AddFace ( IDsOfNodes )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>boolean AddVolume ( in long_array IDsOfNodes )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = AddVolume ( IDsOfNodes )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>boolean MoveNode ( in long NodeID, in double x, in double y, in double z )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = MoveNode ( NodeID, x, y, z )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>boolean InverseDiag ( in long NodeID1, in long NodeID2 )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = InverseDiag ( NodeID1, NodeID2 )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>boolean DeleteDiag ( in long NodeID1, in long NodeID2 )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = DeleteDiag ( NodeID1, NodeID2 )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>boolean Reorient ( in long_array IDsOfElements )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = Reorient ( IDsOfElements )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>boolean TriToQuad ( in long_array IDsOfElements, in NumericalFunctor Criterion, in double MaxAngle )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = TriToQuad ( IDsOfElements, Criterion, MaxAngle )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>boolean QuadToTri ( in long_array IDsOfElements, in NumericalFunctor Criterion )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = QuadToTri ( IDsOfElements, Criterion )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>boolean SplitQuad ( in long_array IDsOfElements, in boolean Diag13 )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = SplitQuad ( IDsOfElements, Diag13 )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>boolean Smooth ( in long_array IDsOfElements, in long_array IDsOfFixedNodes, in long MaxNbOfIterations, in double MaxAspectRatio, in Smooth_Method Method )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = Smooth ( IDsOfElements, IDsOfFixedNodes, MaxNbOfIterations, MaxAspectRatio, Method )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>void RenumberNodes ( )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>RenumberNodes ( )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>void RenumberElements ( )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>RenumberElements ( )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>void RotationSweep ( in long_array IDsOfElements, in AxisStruct Axix, in double AngleInRadians, in long NbOfSteps, in double Tolerance )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>RotationSweep ( IDsOfElements, Axix, AngleInRadians, NbOfSteps, Tolerance )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>void ExtrusionSweep ( in long_array IDsOfElements, in DirStruct StepVector, in long NbOfSteps )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>ExtrusionSweep ( IDsOfElements, StepVector, NbOfSteps )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>void Mirror ( in long_array IDsOfElements, in AxisStruct Mirror, in MirrorType theMirrorType, in boolean Copy )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>Mirror ( IDsOfElements, Mirror, theMirrorType, Copy )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>void Translate ( in long_array IDsOfElements, in DirStruct Vector, in boolean Copy )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>Translate ( IDsOfElements, Vector, Copy )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>void Rotate ( in long_array IDsOfElements, in AxisStruct Axis, in double AngleInRadians, in boolean Copy )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>Rotate ( IDsOfElements, Axis, AngleInRadians, Copy )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>void FindCoincidentNodes ( in double Tolerance, out array_of_long_array GroupsOfNodes )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>GroupsOfNodes = FindCoincidentNodes ( Tolerance )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>void MergeNodes ( in array_of_long_array GroupsOfNodes )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>MergeNodes ( GroupsOfNodes )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>void MergeEqualElements ( )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>MergeEqualElements ( )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>boolean SewFreeBorders ( in long FirstNodeID1, in long SecondNodeID1, in long LastNodeID1, in long FirstNodeID2, in long SecondNodeID2, in long LastNodeID2 )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = SewFreeBorders ( FirstNodeID1, SecondNodeID1, LastNodeID1, FirstNodeID2, SecondNodeID2, LastNodeID2 )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>boolean SewConformFreeBorders ( in long FirstNodeID1, in long SecondNodeID1, in long LastNodeID1, in long FirstNodeID2, in long SecondNodeID2 )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = SewConformFreeBorders ( FirstNodeID1, SecondNodeID1, LastNodeID1, FirstNodeID2, SecondNodeID2 )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>boolean SewBorderToSide ( in long FirstNodeIDOnFreeBorder, in long SecondNodeIDOnFreeBorder, in long LastNodeIDOnFreeBorder, in long FirstNodeIDOnSide, in long LastNodeIDOnSide )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = SewBorderToSide ( FirstNodeIDOnFreeBorder, SecondNodeIDOnFreeBorder, LastNodeIDOnFreeBorder, FirstNodeIDOnSide, LastNodeIDOnSide )</b></div></td>
-</tr>
-<tr>
-<td bgcolor= "lightgreen"><div align="center"><b>boolean SewSideElements ( in long_array IDsOfSide1Elements, in long_array IDsOfSide2Elements, in long NodeID1OfSide1ToMerge, in long NodeID1OfSide2ToMerge, in long NodeID2OfSide1ToMerge, in long NodeID2OfSide2ToMerge )</b></div></td>
-<td bgcolor= "lightgreen"><div align="center"><b>return_value = SewSideElements ( IDsOfSide1Elements, IDsOfSide2Elements, NodeID1OfSide1ToMerge, NodeID1OfSide2ToMerge, NodeID2OfSide1ToMerge, NodeID2OfSide2ToMerge )</b></div></td>
-</tr>
-</table><br>
-</b></HTML>
+++ /dev/null
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
-<html>
-<head>
- <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
- <meta name="GENERATOR" content="Mozilla/4.73 [en] (WinNT; I) [Netscape]">
- <title>Main Page</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-</head>
-<body>
-
-<center><table WIDTH="96%" >
-<tr>
-<td><a href="http://www.opencascade.com"><img src="sources/logocorp.gif" BORDER=0 height=46 width=122></a></td>
-
-
-<td>
-<div align=right><a href="http://www.opencascade.org/SALOME/"><img src="sources/application.gif" BORDER=0 height=46 width=108></a></div>
-</td>
-</tr>
-</table></center>
-
-
-</body>
-</html>
+++ /dev/null
-<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
-<html>
-<head>
- <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
- <meta name="GENERATOR" content="Mozilla/4.73 [en] (WinNT; I) [Netscape]">
- <title>Main Page</title>
-<link href="doxygen.css" rel="stylesheet" type="text/css">
-</head>
-<body>
-
-<center><table WIDTH="96%" >
-<tr>
-<td><a href="http://www.opencascade.com"><img src="../sources/logocorp.gif" BORDER=0 height=46 width=122></a></td>
-
-
-<td>
-<div align=right><a href="http://www.opencascade.org/SALOME/"><img src="../sources/application.gif" BORDER=0 height=46 width=108></a></div>
-</td>
-</tr>
-</table></center>
-
-
-</body>
-</html>
+++ /dev/null
-<!DOCTYPE doctype PUBLIC "-//w3c//dtd html 4.0 transitional//en">
-<html>
-<head>
-
- <meta http-equiv="Content-Type"
- content="text/html; charset=iso-8859-1">
-
- <meta name="GENERATOR"
- content="Mozilla/4.79 [en] (X11; U; SunOS 5.6 sun4u) [Netscape]">
- <title>Main Page</title>
-
- <link href="doxygen.css" rel="stylesheet" type="text/css">
-</head>
- <body>
-
-<center>
-<table width="96%">
- <tbody>
- <tr>
- <td>
- <h1> <a href="http://www.opencascade.com"><img
- src="sources/logocorp.gif" border="0" height="46" width="122"
- align="left">
- </a></h1>
- </td>
- <td>
- <div align="right"><a href="http://www.opencascade.org/SALOME/"><img
- src="sources/application.gif" border="0" height="46" width="108"
- align="right">
- </a></div>
- </td>
- </tr>
-
- </tbody>
-</table>
-</center>
-
-<center>
-<h1> <a name="page2"></a>How to add your own mesher</h1>
-</center>
-
-<center>
-<h1> (as a set of hypotheses and algorithms)</h1>
-</center>
-
-<center>
-<h1> to the application.</h1>
-</center>
-
-<h2> <a name="cont"></a>Table of contents</h2>
-
-<ul>
- <li> <b><i><a href="#1">1. Introduction</a></i></b></li>
- <li> <b><i><a href="#2">2. Implementation steps</a></i></b></li>
-
- <ul>
- <li> <b><i><a href="#2_1">2.1. Mesher plugin package</a></i></b></li>
- <li> <b><i><a href="#2_2">2.2. List of available hypotheses and algorithms</a></i></b></li>
- <li> <b><i><a href="#2_3">2.3. Build server plugin library</a></i></b></li>
-
- <ul>
- <li> <b><i><a href="#2_3_1">2.3.1. Define interface to your hypotheses and
-algorithms</a></i></b></li>
- <li> <b><i><a href="#2_3_2">2.3.2. Implement functionality of your hypotheses
-and algorithms</a></i></b></li>
- <li> <b><i><a href="#2_3_3">2.3.3. Implement interface to your hypotheses
-and algorithms</a></i></b></li>
- <li> <b><i><a href="#2_3_4">2.3.4. Implement being exported method</a></i></b></li>
-
- </ul>
- <li> <b><i><a href="#2_4">2.4. Build client (GUI) plugin library</a></i></b></li>
-
- <ul>
- <li> <b><i><a href="#2_4_1">2.4.1. Implement the required GUI</a></i></b></li>
- <li> <b><i><a href="#2_4_2">2.4.2. Provide icons and messages for your
-GUI</a></i></b></li>
- <li> <b><i><a href="#2_4_3">2.4.3. Implement your hypotheses creator and
-being exported method</a></i></b></li>
-
- </ul>
- <li> <b><i><a href="#2_5">2.5. Provide icons for Object Browser</a></i></b></li>
- <li> <b><i><a href="#2_6">2.6. Setup SALOME environment</a></i></b></li>
- <ul type="square">
- <li><b><i><a href="#2_6_1">2.6.1. Set LD_LIBRARY_PATH, PYTHONPATH,
-PATH environment variables</a></i></b></li>
- <li><b><i><a href="#2_6_2">2.6.2. Set mesher plugin resources environment
-variable</a><br>
- </i></b></li>
- </ul>
- </ul>
-</ul>
-
-<h2> <a name="1"></a>1. Introduction</h2>
- All hypotheses and algorithms are available in SMESH module via plugin mechanism.
-Such approach allows easily to introduce new hypotheses and algorithms types
-to the application. Also, it makes possible the customization of available
-hypotheses and algorithms list for different users without recompilation
-of sources.<br>
-The goal of this document is to describe the process of creation external
-mesher plugins.
-<p><i><a href="#cont">Back to the contents</a></i> </p>
-<h2> <a name="2"></a>2. Implementation steps</h2>
-
-<h3>
-<h3> <a name="2_1"></a>2.1. <small>Mesher plugin package</small></h3>
-</h3>
-Create your mesher plugin package which will contain the sources files, e.g.
- MyMesherPlugin.<br>
-<br>
-<i><a
- href="file:///home/vsr-local/work/SALOME/SALOME2/SMESH_SRC/doc/salome/tui/SMESH/sources/static/PluginMeshers.html#cont">Back
-to the contents</a></i><br>
-<h3><a name="2_2"></a>2.2. List of available hypotheses and algorithms</h3>
-Create XML file to describe all algorithms and hypotheses, provided by your
-plugin package (see SMESH_SRC/resources/SMESH_Meshers.xml for example).<br>
-<blockquote><small><tt><big><meshers-group name="MyName"<br>
- resources="MyResourceKey"<br>
-
-server-lib="libMyServerLib.so"<br>
- gui-lib="libMyClientLib.so"><br>
- <hypotheses><br>
- <hypothesis type="MyHypType1"<br>
-
- label-id="My beautiful hypothesis name"<br>
-
- icon-id="my_hypo_1_icon.png"/><br>
- </hypotheses><br>
- <algorithms><br>
- <algorithm type="MyAlgType1"<br>
-
- label-id="My beautiful algorithm name"<br>
-
- icon-id="my_algo_1_icon.png"/><br>
- </algorithms><br>
-</meshers-group><br>
- </big></tt></small><br>
-
- <ul>
- <li>Attributes of <meshers-group> tag:</li>
- </ul>
- <blockquote>
- <ul type="circle">
- <li>value of <name> attribute is used to collect hypotheses/algoritms
-in groups; you can also use this attribute for short description of your
-mesher plugin.</li>
- <li>value of <resources> attribute (MyResourceKey) is used to
-access resources (messages and icons) from GUI (see paragraphs <a
- href="#2_4_2">2.4.2</a> and <a href="#2_5">2.5</a>); in the current implementation
-it should coincide with the name of plugin package; this limitation will
-be eliminated in the further development.</li>
- <li>value of <server-lib> attribute describes the name of your
-mesher's server plugin library (See paragraph <a href="#2_3">2.3</a>)</li>
- <li>value of <gui-lib> attribute describes the name of your mesher's
-client plugin library (See paragraph <a href="#2_4">2.4</a>)</li>
- </ul>
- </blockquote>
- <ul>
- <li>Attributes of <hypothesis/algorithm> tag:</li>
- </ul>
- <blockquote>
- <ul type="circle">
- <li>value of <type> attribute is an unique name of the hypothesis/algorithm</li>
- </ul>
- <ul type="circle">
- <ul type="square">
- <li>It is a value of _name field of your hypothesis class (see paragraph
- <a href="#2_3">2.3</a>, implementation of constructor of StdMeshers_LocalLength
-class: _name = "LocalLength")</li>
- <li>It is a key to each certain hypothesis class (see paragraph <a
- href="#2_3">2.3</a>, implementation of "GetHypothesisCreator()" method in
-StdMeshers_i.cxx)</li>
- <li>It is a key to each certain hypothesis GUI (see paragraph <a
- href="#2_4">2.4</a>, implementation of "StdMeshersGUI_HypothesisCreator::CreateHypothesis()"
-and "StdMeshersGUI_HypothesisCreator::EditHypothesis()" methods in StdMeshersGUI.cxx)</li>
- <li>It is a key to each certain hypothesis icon in Object Browser
-(see paragraph <a href="#2_4_2_1">2.4.2.1</a>)</li>
- </ul>
- </ul>
- </blockquote>
- <blockquote>
- <ul type="circle">
- <li>value of <label-id> attribute is displayed in the GUI in
-the list of available hypotheses/algorithms ("Create Hypothesis/Algorithm"
-dialog)</li>
- <li>value of <icon-id> attribute is a name of icon file, which
-is displayed in GUI in the list of available hypotheses/algorithms ("Create
-Hypothesis/Algorithm" dialog)</li>
- </ul>
- </blockquote>
-Note: All attributes values are accessible in your GUI via HypothesisData
-class (see paragraph <a href="#2_4_1">2.4.1</a>)<br>
- <br>
-Note: The environment variable SMESH_MeshersList contains the list of plugins
-names, separated by colon (":") symbol, e.g.:<br>
- <br>
- <tt> setenv SMESH_MeshersList StdMeshers:NETGENPlugin</tt><br>
- <br>
-Please, pay attention that StdMeshers should also be included into this environment
-variable, if you want to use standard hypotheses/algorithms, provided with
-SMESH module.<br>
- <br>
-The SALOME automatically locates XML files, searching them in the following
-directories:<br>
- <tt><br>
- ${<PLUGINNAME>_ROOT_DIR}/share/salome/resources<br>
- ${SALOME_<PluginName>Resources}<br>
- ${HOME}/.salome/resources<br>
- ${KERNEL_ROOT_DIR}/share/salome/resources</tt><br>
- <br>
-where <PluginName> is a name of each mesher plugin package<br>
-</blockquote>
-<i><a href="#cont">Back to the contents</a></i>
-<h3> <a name="2_3"></a>2.3. Build server plugin library <libMyServerLib.so>.</h3>
-
-<h4> <a name="2_3_1"></a>2.3.1. Define interface to your hypotheses and algorithms.</h4>
-
-<blockquote><tt>Example: SMESH_SRC/idl/SMESH_BasicHypothesis.idl<br>
- NETGENPLUGIN_SRC/src/NETGENPlugin_Algorithm.idl<br>
- </tt><tt></tt></blockquote>
-
-<h4> <a name="2_3_2"></a>2.3.2. Implement functionality of your hypotheses
-and algorithms.</h4>
-
-<blockquote>Inherit corresponding classes from SMESH.
- <p><tt>Example: SMESH_SRC/src/StdMeshers/StdMeshers_*<br>
- NETGENPLUGIN_SRC/src/NETGENPlugin_NETGEN_3D<br>
- </tt><tt></tt></p>
-</blockquote>
-
-<h4> <a name="2_3_3"></a>2.3.3.Implement interface to your hypotheses and
-algorithms.</h4>
-
-<blockquote><tt>Inherit corresponding classes from SMESH_I.</tt>
- <p><tt>Example: SMESH_SRC/src/StdMeshers_I/SMESH_*_i<br>
- NETGENPLUGIN_SRC/src/NETGENPlugin_NETGEN_3D_i<br>
- </tt><tt></tt></p>
-</blockquote>
-
-<h4> <a name="2_3_4"></a>2.3.4. Implement being exported method.</h4>
-
-<blockquote><tt>GenericHypothesisCreator_i* GetHypothesisCreator (const char*
-aHypType)</tt>
- <p><aHypType> is a value of <type> attribute in the XML-description
-file</p>
-</blockquote>
-
-<blockquote><tt>Example: SMESH_SRC/src/StdMeshers_I/StdMeshers_i.cxx<br>
- NETGENPLUGIN_SRC/src/NETGENPlugin_i.cxx<br>
- </tt><tt></tt></blockquote>
- <i><a href="#cont">Back to the contents</a></i>
-<h3> <a name="2_4"></a>2.4. Build client (GUI) plugin library <libMyClientLib.so>.</h3>
-
-<blockquote>This step is required only if your hypotheses/algorithms need
-specific GUI for their construction.</blockquote>
-
-<h4> <a name="2_4_1"></a>2.4.1. Implement the required GUI (e.g. construction
-dialog boxes).</h4>
-
-<blockquote><tt>Example: SMESH_SRC/src/StdMeshersGUI/StdMeshersGUI_*Dlg</tt>
- <p>Note: all data from XML-description files is accessible in your GUI
-via HypothesisData class (mySMESHGUI->GetHypothesisData (aHypType),
-see SMESHGUI_Hypotheses.h for HypothesisData definition)</p>
-</blockquote>
-
-<h4> <a name="2_4_2"></a>2.4.2. Provide icons and messages for your GUI.</h4>
-
-<h5> <a name="2_4_2_1"></a>2.4.2.1. Implement resource files</h5>
-
-<blockquote><tt>MyResourceKey_icons.po and MyResourceKey_msg_en.po</tt>
- <p><tt>Example: SMESH_SRC/src/StdMeshersGUI/StdMeshers_*.po<br>
- NETGENPLUGIN_SRC/src/NETGENPlugin_icons.po<br>
- </tt><br>
-Note: ICON_SMESH_TREE_HYPO_MyHypType1 is ID of icon for Object Browser for
-hypothesis with type="MyHypType1"; ICON_SMESH_TREE_ALGO_MyAlgType1 is ID
-of icon for Object Browser for algorithm with type="MyAlgType1".<br>
-See paragraph 2 for definition of MyResourceKey, MyHypType1, MyAlgType1.<tt><br>
- </tt></p>
-</blockquote>
-
-<h5> <a name="2_4_2_2"></a>2.4.2.2. Define environment variable SALOME_<MyResourceKey>Resources</h5>
-<blockquote>It should point to the directory where resources are situated.</blockquote>
-
-<blockquote><tt>Example: setenv SALOME_StdMeshersResources ${SMESH_ROOT_DIR}/share/salome/resources</tt></blockquote>
-
-<h4> <a name="2_4_3"></a>2.4.3. Implement your Hypothesis Creator and being
-exported method</h4>
-
-<blockquote><tt>SMESHGUI_GenericHypothesisCreator* GetHypothesisCreator</tt>
- <br>
- <tt> (QString aHypType, QString aServerLibName, SMESHGUI* aSMESHGUI)</tt>
- <p><aHypType> is to pass a value of <type> attribute in XML-description
-file;<br>
-<aServerLibName> is to pass a value of <server-lib> attribute
-in XML-description file. </p>
- <p><tt>Example: SMESH_SRC/src/StdMeshersGUI/StdMeshersGUI.cxx</tt></p>
-</blockquote>
- <i><a href="#cont">Back to the contents</a></i>
-<h3> <a name="2_5"></a>2.5. Provide icons for object browser.</h3>
-
-<blockquote>If your hypotheses/algorithms do not need specific GUI, but you
-want to provide icons for object browser, see <a href="#2_4_2">2.4.2</a> paragrath.<br>
-</blockquote>
-<div align="left">
-<p><i><a
- href="file:///home/vsr-local/work/SALOME/SALOME2/SMESH_SRC/doc/salome/tui/SMESH/sources/static/PluginMeshers.html#cont">Back
-to the contents</a></i> </p>
-</div>
-
-<h3> <a name="2_6"></a>2.6. Setup your SALOME environment.</h3>
-
-<h4> <a name="2_6_1"></a>2.6.1. Add your plugin to the LD_LIBRARY_PATH,
-PYTHONPATH (and maybe PATH) environment variables.<br>
-</h4>
-<blockquote><tt>setenv PATH <path-to-my-plugin>/bin/salome:${PATH}<br>
-setenv LD_LIBRARY_PATH <path-to-my-plugin>/lib/salome:${LD_LIBRARY_PATH}<br>
-Setenv PYTHONPATH <path-to-my-plugin>/lib/python2.2/site-packages/salome:${PYTHONPATH}<br>
- </tt> <br>
-</blockquote>
-<h4> <a name="2_6_2"></a>2.6.2. Set mesher plugin resources environment
-variable</h4>
-<blockquote> This enviroment variable is used to set meshers plugins
-which should be loaded by SMESH module (see <a href="#2_4_2_2">2.4.2.2</a>
-paragraph). Add your plugin to this variable. All plugins are separated by
-colon (":") symbol.<br>
- <br>
-Note: If you use runSalome.py script from KERNEL package to launch SALOME,
-you may not to set environment variables, because this script sets them itself.
-All what you should do is to add <plugin> section to your ${HOME}/.salome/salome.launch
-file for SMESH module section:<br>
- <tt><br>
-...<br>
-<modules-list><br>
- ...<br>
- <module name="SMESH"><br>
- <plugin name="MyMesher"/><br>
- </module><br>
- ...<br>
-</modules-list><br>
-...</tt><br>
-</blockquote>
-<i><a href="#cont">Back to the contents</a></i> <br>
- <br>
-</body>
-</html>
+++ /dev/null
-H1 { text-align: center; }
-CAPTION { font-weight: bold }
-A.qindex {}
-A.qindexRef {}
-A.el { text-decoration: none; font-weight: bold }
-A.elRef { font-weight: bold }
-A.code { text-decoration: none; font-weight: normal; color: #4444ee }
-A.codeRef { font-weight: normal; color: #4444ee }
-A:hover { text-decoration: none; background-color: lightblue }
-DL.el { margin-left: -1cm }
-DIV.fragment { width: 100%; border: none; background-color: #CCCCCC }
-DIV.ah { background-color: #CCCCCC; font-weight: bold; color: #ffffff; margin-bottom: 3px; margin-top: 3px }
-TD.md { background-color: lightblue; font-weight: bold; }
-TD.mdname1 { background-color: lightblue; font-weight: bold; color: #602020; }
-TD.mdname { background-color: lightblue; font-weight: bold; color: #602020; width: 600px; }
-DIV.groupHeader { margin-left: 16px; margin-top: 12px; margin-bottom: 6px; font-weight: bold }
-DIV.groupText { margin-left: 16px; font-style: italic; font-size: smaller }
-BODY { background: url(sources/bg_salome.gif) }
-TD.indexkey {
- background-color: #CCCCCC;
- font-weight: bold;
- padding-right : 10px;
- padding-top : 2px;
- padding-left : 10px;
- padding-bottom : 2px;
- margin-left : 0px;
- margin-right : 0px;
- margin-top : 2px;
- margin-bottom : 2px
-}
-TD.indexvalue {
- background-color: #CCCCCC;
- font-style: italic;
- padding-right : 10px;
- padding-top : 2px;
- padding-left : 10px;
- padding-bottom : 2px;
- margin-left : 0px;
- margin-right : 0px;
- margin-top : 2px;
- margin-bottom : 2px
-}
-span.keyword { color: #008000 }
-span.keywordtype { color: #604020 }
-span.keywordflow { color: #e08000 }
-span.comment { color: #800000 }
-span.preprocessor { color: #806020 }
-span.stringliteral { color: #002080 }
-span.charliteral { color: #008080 }
+++ /dev/null
-<!DOCTYPE doctype PUBLIC "-//w3c//dtd html 4.0 transitional//en">
-<html>
-<head>
-
- <meta http-equiv="Content-Type"
- content="text/html; charset=iso-8859-1">
-
- <meta name="GENERATOR"
- content="Mozilla/4.73 [en] (WinNT; I) [Netscape]">
- <title>Main Page</title>
-
- <link href="doxygen.css" rel="stylesheet" type="text/css">
-</head>
- <body>
-
-<center>
-<table width="96%">
- <tbody>
- <tr>
- <td><a href="http://www.opencascade.com"><img
- src="sources/logocorp.gif" border="0" height="46" width="122">
- </a></td>
- <td>
- <div align="right"><a href="http://www.opencascade.org/SALOME/"><img
- src="sources/application.gif" border="0" height="46" width="108">
- </a></div>
- </td>
- </tr>
-
- </tbody>
-</table>
-</center>
- <!-- Generated by Doxygen 1.3-rc2 -->
-<ul>
- <li><b>SALOME SMESH module</b>
- <ul>
- <li><a href="HTML/SMESH_Gen.html">Mapping of SMESH_Gen functions</a></li>
- <li><a href="HTML/SMESH_BasicHypothesis.html">Mapping of SMESH_BasicHypothesis functions</a></li>
- <li><a href="HTML/SMESH_Hypothesis.html">Mapping of SMESH_Hypothesis functions</a></li>
- <li><a href="HTML/SMESH_Mesh.html">Mapping of SMESH_Mesh functions</a></li>
- <li><a href="HTML/SMESH_Filter.html">Mapping of SMESH_Filter functions</a></li>
- <li><a href="HTML/SMESH_Gen.html">Mapping of SMESH_Gen functions</a></li>
- <li><a href="HTML/SMESH_Group.html">Mapping of SMESH_Group functions</a></li>
- <li><a href="HTML/SMESH_Pattern.html">Mapping of SMESH_Pattern functions</a></li>
- </ul>
- </li>
-</ul>
- <br>
-</body>
-</html>
+++ /dev/null
-//****************************************************************
-// You are free to copy the "Folder-Tree" script as long as you
-// keep this copyright notice:
-// Script found in: http://www.geocities.com/Paris/LeftBank/2178/
-// Author: Marcelino Alves Martins (martins@hks.com) December '97.
-//****************************************************************
-
-//Log of changes:
-// 17 Feb 98 - Fix initialization flashing problem with Netscape
-//
-// 27 Jan 98 - Root folder starts open; support for USETEXTLINKS;
-// make the ftien4 a js file
-//
-// DvH: Dec 2000 - Made some minor changes to support external
-// references
-
-// Definition of class Folder
-// *****************************************************************
-
-function Folder(folderDescription, tagName, hreference) //constructor
-{
- //constant data
- this.desc = folderDescription
- this.tagName = tagName
- this.hreference = hreference
- this.id = -1
- this.navObj = 0
- this.iconImg = 0
- this.nodeImg = 0
- this.isLastNode = 0
-
- //dynamic data
- this.isOpen = true
- this.iconSrc = "ftv2folderopen.png"
- this.children = new Array
- this.nChildren = 0
-
- //methods
- this.initialize = initializeFolder
- this.setState = setStateFolder
- this.addChild = addChild
- this.createIndex = createEntryIndex
- this.hide = hideFolder
- this.display = display
- this.renderOb = drawFolder
- this.totalHeight = totalHeight
- this.subEntries = folderSubEntries
- this.outputLink = outputFolderLink
-}
-
-function setStateFolder(isOpen)
-{
- var subEntries
- var totalHeight
- var fIt = 0
- var i=0
-
- if (isOpen == this.isOpen)
- return
-
- if (browserVersion == 2)
- {
- totalHeight = 0
- for (i=0; i < this.nChildren; i++)
- totalHeight = totalHeight + this.children[i].navObj.clip.height
- subEntries = this.subEntries()
- if (this.isOpen)
- totalHeight = 0 - totalHeight
- for (fIt = this.id + subEntries + 1; fIt < nEntries; fIt++)
- indexOfEntries[fIt].navObj.moveBy(0, totalHeight)
- }
- this.isOpen = isOpen
- propagateChangesInState(this)
-}
-
-function propagateChangesInState(folder)
-{
- var i=0
-
- if (folder.isOpen)
- {
- if (folder.nodeImg)
- if (folder.isLastNode)
- folder.nodeImg.src = "ftv2mlastnode.png"
- else
- folder.nodeImg.src = "ftv2mnode.png"
- folder.iconImg.src = "ftv2folderopen.png"
- for (i=0; i<folder.nChildren; i++)
- folder.children[i].display()
- }
- else
- {
- if (folder.nodeImg)
- if (folder.isLastNode)
- folder.nodeImg.src = "ftv2plastnode.png"
- else
- folder.nodeImg.src = "ftv2pnode.png"
- folder.iconImg.src = "ftv2folderclosed.png"
- for (i=0; i<folder.nChildren; i++)
- folder.children[i].hide()
- }
-}
-
-function hideFolder()
-{
- if (browserVersion == 1 || browserVersion == 3) {
- if (this.navObj.style.display == "none")
- return
- this.navObj.style.display = "none"
- } else {
- if (this.navObj.visibility == "hidden")
- return
- this.navObj.visibility = "hidden"
- }
-
- this.setState(0)
-}
-
-function initializeFolder(level, lastNode, leftSide)
-{
-var j=0
-var i=0
-var numberOfFolders
-var numberOfDocs
-var nc
-
- nc = this.nChildren
-
- this.createIndex()
-
- var auxEv = ""
-
- if (browserVersion > 0)
- auxEv = "<a href='javascript:clickOnNode("+this.id+")'>"
- else
- auxEv = "<a>"
-
- if (level>0)
- if (lastNode) //the last 'brother' in the children array
- {
- this.renderOb(leftSide + auxEv + "<img name='nodeIcon" + this.id + "' src='ftv2mlastnode.png' width=16 height=22 border=0></a>")
-// leftSide = leftSide + "<img src='ftv2blank.png' width=16 height=22>"
- this.isLastNode = 1
- }
- else
- {
- this.renderOb(leftSide + auxEv + "<img name='nodeIcon" + this.id + "' src='ftv2mnode.png' width=16 height=22 border=0></a>")
- leftSide = leftSide + "<img src='ftv2vertline.png' width=16 height=22>"
- this.isLastNode = 0
- }
- else
- this.renderOb("")
-
- if (nc > 0)
- {
- level = level + 1
- for (i=0 ; i < this.nChildren; i++)
- {
- if (i == this.nChildren-1)
- this.children[i].initialize(level, 1, leftSide)
- else
- this.children[i].initialize(level, 0, leftSide)
- }
- }
-}
-
-function drawFolder(leftSide)
-{
- if (browserVersion == 2) {
- if (!doc.yPos)
- doc.yPos=8
- doc.write("<layer id='folder" + this.id + "' top=" + doc.yPos + " visibility=hidden>")
- }
- if (browserVersion == 3)
- {
- doc.write("<div id='folder" + this.id + "' style='visibility:hide;'>")
- }
-
- doc.write("\n<table ")
- if (browserVersion == 1)
- doc.write(" id='folder" + this.id + "' style='position:block;' ")
- doc.write(" border=0 cellspacing=0 cellpadding=0>")
- doc.write("\n<tr><td>")
- doc.write(leftSide)
- this.outputLink()
- doc.write("<img name='folderIcon" + this.id + "' ")
- doc.write("src='" + this.iconSrc+"' border=0></a>")
- doc.write("</td>\n<td valign=middle nowrap>")
- if (USETEXTLINKS)
- {
- this.outputLink()
- doc.write(this.desc + "</a>")
- }
- else
- doc.write(this.desc)
-
-/*!
- if (this.tagName!="")
- {
- doc.write(" [external]")
- }
-*/
- doc.write("</td>")
- doc.write("\n</table>\n")
-
- if (browserVersion == 2) {
- doc.write("</layer>")
- }
- if (browserVersion == 3) {
- doc.write("</div>")
- }
-
- if (browserVersion == 1) {
- this.navObj = doc.all["folder"+this.id]
- this.iconImg = doc.all["folderIcon"+this.id]
- this.nodeImg = doc.all["nodeIcon"+this.id]
- } else if (browserVersion == 2) {
- this.navObj = doc.layers["folder"+this.id]
- this.iconImg = this.navObj.document.images["folderIcon"+this.id]
- this.nodeImg = this.navObj.document.images["nodeIcon"+this.id]
- doc.yPos=doc.yPos+this.navObj.clip.height
- } else if (browserVersion == 3) {
- this.navObj = doc.getElementById("folder"+this.id)
- this.iconImg = doc.images.namedItem("folderIcon"+this.id)
- this.nodeImg = doc.images.namedItem("nodeIcon"+this.id)
- }
-}
-
-function outputFolderLink()
-{
- if (this.hreference)
- {
- doc.write("<a ")
- if (this.tagName)
- {
- doc.write("doxygen='" + this.tagName + "' ");
- }
- doc.write("href='" + this.hreference + "' TARGET=\"basefrm\" ")
- if (browserVersion > 0)
- doc.write("onClick='javascript:clickOnFolder("+this.id+")'")
- doc.write(">")
- }
- else
- doc.write("<a>")
-}
-
-function addChild(childNode)
-{
- this.children[this.nChildren] = childNode
- this.nChildren++
- return childNode
-}
-
-function folderSubEntries()
-{
- var i = 0
- var se = this.nChildren
-
- for (i=0; i < this.nChildren; i++){
- if (this.children[i].children) //is a folder
- se = se + this.children[i].subEntries()
- }
-
- return se
-}
-
-
-// Definition of class Item (a document or link inside a Folder)
-// *************************************************************
-
-function Item(itemDescription, tagName, itemLink) // Constructor
-{
- // constant data
- this.desc = itemDescription
- this.tagName = tagName
- this.link = itemLink
- this.id = -1 //initialized in initalize()
- this.navObj = 0 //initialized in render()
- this.iconImg = 0 //initialized in render()
- this.iconSrc = "ftv2doc.png"
-
- // methods
- this.initialize = initializeItem
- this.createIndex = createEntryIndex
- this.hide = hideItem
- this.display = display
- this.renderOb = drawItem
- this.totalHeight = totalHeight
-}
-
-function hideItem()
-{
- if (browserVersion == 1 || browserVersion == 3) {
- if (this.navObj.style.display == "none")
- return
- this.navObj.style.display = "none"
- } else {
- if (this.navObj.visibility == "hidden")
- return
- this.navObj.visibility = "hidden"
- }
-}
-
-function initializeItem(level, lastNode, leftSide)
-{
- this.createIndex()
-
- if (level>0)
- if (lastNode) //the last 'brother' in the children array
- {
- this.renderOb(leftSide + "<img src='ftv2lastnode.png' width=16 height=22>")
- leftSide = leftSide + "<img src='ftv2blank.png' width=16 height=22>"
- }
- else
- {
- this.renderOb(leftSide + "<img src='ftv2node.png' width=16 height=22>")
- leftSide = leftSide + "<img src='ftv2vertline.png' width=16 height=22>"
- }
- else
- this.renderOb("")
-}
-
-function drawItem(leftSide)
-{
- if (browserVersion == 2)
- doc.write("<layer id='item" + this.id + "' top=" + doc.yPos + " visibility=hidden>")
- if (browserVersion == 3)
- doc.write("<div id='item" + this.id + "' style='display:block;'>")
-
- doc.write("\n<table ")
- if (browserVersion == 1)
- doc.write(" id='item" + this.id + "' style='position:block;' ")
- doc.write(" border=0 cellspacing=0 cellpadding=0>\n")
- doc.write("<tr><td>")
- doc.write(leftSide)
- if (this.link!="")
- {
- doc.write("<a href=" + this.link + ">")
- }
- doc.write("<img id='itemIcon"+this.id+"' ")
- doc.write("src='"+this.iconSrc+"' border=0>")
- if (this.link!="")
- {
- doc.write("</a>")
- }
- doc.write("</td>\n<td valign=middle nowrap>")
- if (USETEXTLINKS && this.link!="")
- doc.write("<a href=" + this.link + ">" + this.desc + "</a>")
- else
- doc.write(this.desc)
-/*!
- if (this.tagName!="")
- {
- doc.write(" [external]");
- }
-*/
- doc.write("\n</table>\n")
-
- if (browserVersion == 2)
- doc.write("</layer>")
- if (browserVersion == 3)
- doc.write("</div>")
-
- if (browserVersion == 1) {
- this.navObj = doc.all["item"+this.id]
- this.iconImg = doc.all["itemIcon"+this.id]
- } else if (browserVersion == 2) {
- this.navObj = doc.layers["item"+this.id]
- this.iconImg = this.navObj.document.images["itemIcon"+this.id]
- doc.yPos=doc.yPos+this.navObj.clip.height
- } else if (browserVersion == 3) {
- this.navObj = doc.getElementById("item"+this.id)
- this.iconImg = doc.images.namedItem("itemIcon"+this.id)
- }
-}
-
-
-// Methods common to both objects (pseudo-inheritance)
-// ********************************************************
-
-function display()
-{
- if (browserVersion == 1 || browserVersion == 3)
- this.navObj.style.display = "block"
- else
- this.navObj.visibility = "show"
-}
-
-function createEntryIndex()
-{
- this.id = nEntries
- indexOfEntries[nEntries] = this
- nEntries++
-}
-
-// total height of subEntries open
-function totalHeight() //used with browserVersion == 2
-{
- var h = this.navObj.clip.height
- var i = 0
-
- if (this.isOpen) //is a folder and _is_ open
- for (i=0 ; i < this.nChildren; i++)
- h = h + this.children[i].totalHeight()
-
- return h
-}
-
-
-// Events
-// *********************************************************
-
-function clickOnFolder(folderId)
-{
- var clicked = indexOfEntries[folderId]
-
- if (!clicked.isOpen)
- clickOnNode(folderId)
-
- return
-
- if (clicked.isSelected)
- return
-}
-
-function clickOnNode(folderId)
-{
- var clickedFolder = 0
- var state = 0
-
- clickedFolder = indexOfEntries[folderId]
- state = clickedFolder.isOpen
-
- clickedFolder.setState(!state) //open<->close
-}
-
-function initializeDocument()
-{
- doc = document;
- if (doc.all)
- browserVersion = 1 //IE4
- else
- if (doc.layers)
- browserVersion = 2 //NS4
- else if(navigator.userAgent.toLowerCase().indexOf('gecko') != -1)
- browserVersion = 3 //mozilla
- else
- browserVersion = 0 //other
-
- foldersTree.initialize(0, 1, "")
- foldersTree.display()
-
- if (browserVersion > 0)
- {
- if(browserVersion != 3)
- doc.write("<layer top="+indexOfEntries[nEntries-1].navObj.top+"> </layer>")
-
- // close the whole tree
- clickOnNode(0)
- // open the root folder
- clickOnNode(0)
- }
-}
-
-// Auxiliary Functions for Folder-Treee backward compatibility
-// *********************************************************
-
-function gFld(description, tagName, hreference)
-{
- folder = new Folder(description, tagName, hreference)
- return folder
-}
-
-function gLnk(description, tagName, linkData)
-{
- fullLink = ""
-
- if (linkData!="")
- {
- fullLink = "'"+linkData+"' target=\"basefrm\""
- }
-
- linkItem = new Item(description, tagName, fullLink)
- return linkItem
-}
-
-function insFld(parentFolder, childFolder)
-{
- return parentFolder.addChild(childFolder)
-}
-
-function insDoc(parentFolder, document)
-{
- parentFolder.addChild(document)
-}
-
-// Global variables
-// ****************
-
-USETEXTLINKS = 1
-indexOfEntries = new Array
-nEntries = 0
-doc = document
-browserVersion = 0
-selectedFolder=0
+++ /dev/null
-#
-# generate dependencies for idl file :
-#
-
-# source path
-top_srcdir=@top_srcdir@
-top_builddir=..
-srcdir=@srcdir@
-VPATH=.:${KERNEL_ROOT_DIR}/idl/salome:${GEOM_ROOT_DIR}/idl/salome:${MED_ROOT_DIR}/idl/salome
-
-@COMMENCE@
-
-IDL_FILES = \
- SMESH_Gen.idl \
- SMESH_Mesh.idl \
- SMESH_Hypothesis.idl \
- SMESH_BasicHypothesis.idl \
- SMESH_Filter.idl \
- SMESH_Group.idl \
- SMESH_Pattern.idl
-
-PY_CLIENT_IDL = $(IDL_FILES)
-
-# we copy all idl file in $(top_builddir)/idl
-inc: $(top_builddir)/idl/salome $(IDL_FILES:%=$(top_builddir)/idl/salome/%)
-
-$(top_builddir)/idl/salome:
- mkdir $@
-
-$(IDL_FILES:%=$(top_builddir)/idl/salome/%):$(IDL_FILES:%=$(top_srcdir)/idl/%)
-# $(CP) $< $@
- cp -f $^ $(top_builddir)/idl/salome
-
-
-lib: pyidl
-
-PYTHON_BUILD_SITE=$(top_builddir)/lib/python$(PYTHON_VERSION)/site-packages/@PACKAGE@
-
-pyidl: $(PYTHON_BUILD_SITE) $(IDL_FILES:%.idl=$(PYTHON_BUILD_SITE)/%_idl.py)
-
-$(PYTHON_BUILD_SITE):
- $(INSTALL) -d $@
-
-$(PYTHON_BUILD_SITE)/%_idl.py: $(top_builddir)/idl/salome/%.idl
- $(OMNIORB_IDL) $(OMNIORB_IDLPYFLAGS) -C$(PYTHON_BUILD_SITE) $<
-
-
-# install python client (generated from idl file
-install: install-pyidl install-idl
-
-# create directory $(idldir) and copy idl files into it
-install-idl: $(IDL_FILES:%=$(top_builddir)/idl/salome/%)
- $(INSTALL) -d $(idldir)
- $(INSTALL_DATA) $^ $(idldir)
-
-
-install-pyidl: $(IDL_FILES:%=$(top_builddir)/idl/salome/%)
- $(INSTALL) -d $(PYTHON_SITE_INSTALL)
- @for file in $^ dummy; do \
- if [ $$file != "dummy" ]; then \
- $(OMNIORB_IDL) $(OMNIORB_IDLPYFLAGS) -C$(PYTHON_SITE_INSTALL) $$file ; \
- fi ; \
- done ;
-
-#@ CONCLUDE @
-
-cleandep:
- -$(RM) .dep*
-
-distclean:
- -$(RM) *.py
- -$(RM) $(IDL_FILES:%=$(top_builddir)/idl/salome/%)
- -$(RM) Makefile
-
+++ /dev/null
-// Copyright (C) 2004 CEA
-//
-// 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.org
-//
-//
-//
-// File : SMESH_Group.idl
-// Author : Sergey ANIKIN, OCC
-// $Header$
-
-
-#ifndef _SMESH_GROUP_IDL_
-#define _SMESH_GROUP_IDL_
-
-#include "SALOME_Exception.idl"
-#include "SALOME_GenericObj.idl"
-
-#include "SMESH_Mesh.idl"
-
-module SMESH
-{
- interface Predicate;
-
- /*!
- * SMESH_Group: base interface of group object
- */
- interface SMESH_GroupBase : SALOME::GenericObj, SMESH_IDSource
- {
- /*!
- * Sets group name
- */
- void SetName( in string name );
-
- /*!
- * Returns group name
- */
- string GetName();
-
- /*!
- * Returns group type (type of elements in the group)
- */
- ElementType GetType();
-
- /*!
- * Returns the number of elements in the group
- */
- long Size();
-
- /*!
- * Returns true if the group does not contain any elements
- */
- boolean IsEmpty();
-
- /*!
- * returns true if the group contains an element with ID == <elem_id>
- */
- boolean Contains( in long elem_id );
-
- /*!
- * Returns ID of an element at position <elem_index>
- */
- long GetID( in long elem_index );
-
- /*!
- * Returns a sequence of all element IDs in the group
- */
- long_array GetListOfID();
-
- /*!
- * Returns the mesh object this group belongs to
- */
- SMESH_Mesh GetMesh();
- };
-
- /*!
- * SMESH_Group: interface of group object
- */
- interface SMESH_Group : SMESH_GroupBase
- {
- /*!
- * Clears the group's contents
- */
- void Clear();
-
- /*!
- * Adds elements to the group
- */
- long Add( in long_array elem_ids );
- long AddByPredicate( in Predicate thePredicate );
-
- /*!
- * Removes elements from the group
- */
- long Remove( in long_array elem_ids );
- long RemoveByPredicate( in Predicate thePredicate );
-
- };
- /*!
- * SMESH_Group: interface of group object linked to geometry
- */
- interface SMESH_GroupOnGeom : SMESH_GroupBase
- {
- GEOM::GEOM_Object GetShape();
- };
-
-};
-
-
-#endif
+++ /dev/null
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESH_Hypothesis.idl
-// Author : Paul RASCLE, EDF
-// $Header$
-
-#ifndef _SMESH_HYPOTHESIS_IDL_
-#define _SMESH_HYPOTHESIS_IDL_
-
-#include "SALOME_Exception.idl"
-#include "SALOME_GenericObj.idl"
-
-module SMESH
-{
- enum Dimension
- {
- DIM_1D,
- DIM_2D,
- DIM_3D
- };
-
- interface SMESH_Hypothesis : SALOME::GenericObj
- {
- /*!
- * Get the Hypothesis typeName
- */
- string GetName();
-
- /*!
- * Get the Hypothesis plugin library Name
- */
- string GetLibName();
-
- /*!
- * Get the internal Id
- */
- long GetId();
-
- /*!
- * Verify whether hypothesis supports given entity type
- */
- boolean IsDimSupported( in Dimension type );
- };
-
- typedef sequence<string> ListOfHypothesisName;
-
- interface SMESH_Algo : SMESH_Hypothesis
- {
- /*!
- * Get list of hypothesis that can be used with this algorithm
- */
- ListOfHypothesisName GetCompatibleHypothesis();
-
- };
-
- interface SMESH_1D_Algo : SMESH_Algo
- {
- /*!
- *
- */
- };
-
- interface SMESH_2D_Algo : SMESH_Algo
- {
- /*!
- *
- */
- };
-
- interface SMESH_3D_Algo : SMESH_Algo
- {
- /*!
- *
- */
- };
-};
-
- // -----------------------------------------------------------------
- // Specific Algorithms in separate idl file
- // -----------------------------------------------------------------
-
-
-#endif
+++ /dev/null
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESH_Pattern.idl
-// Created : Mon Aug 2 10:48:36 2004
-// Author : Edward AGAPOV (eap)
-// $Header:
-
-#ifndef _SMESH_PATTERN_IDL_
-#define _SMESH_PATTERN_IDL_
-
-#include "SMESH_Mesh.idl"
-
-module SMESH
-{
-
- typedef sequence<SMESH::PointStruct> point_array;
-
- /*!
- * SMESH_Pattern: interface of mesh pattern
- */
- interface SMESH_Pattern {
-
- /*!
- * Load a pattern from the string <theFileContents>
- */
- boolean LoadFromFile(in string theFileContents);
-
- /*!
- * Create a pattern from the mesh built on <theFace>.
- * <theProject>==true makes override nodes positions
- * on <theFace> computed by mesher
- */
- boolean LoadFromFace(in SMESH_Mesh theMesh,
- in GEOM::GEOM_Object theFace,
- in boolean theProject);
-
- /*!
- * Create a pattern from the mesh built on <theBlock>
- */
- boolean LoadFrom3DBlock(in SMESH_Mesh theMesh,
- in GEOM::GEOM_Object theBlock);
-
- /*!
- * Compute nodes coordinates applying
- * the loaded pattern to <theFace>. The first key-point
- * will be mapped into <theVertexOnKeyPoint1>, which must
- * be in the outer wire of theFace
- */
- point_array ApplyToFace(in GEOM::GEOM_Object theFace,
- in GEOM::GEOM_Object theVertexOnKeyPoint1,
- in boolean theReverse);
-
- /*!
- * Compute nodes coordinates applying
- * the loaded pattern to <theBlock>. The (0,0,0) key-point
- * will be mapped into <theVertex000>. The (0,0,1)
- * key-point will be mapped into <theVertex001>.
- */
- point_array ApplyTo3DBlock(in GEOM::GEOM_Object theBlock,
- in GEOM::GEOM_Object theVertex000,
- in GEOM::GEOM_Object theVertex001);
-
- /*!
- * Compute nodes coordinates applying
- * the loaded pattern to mesh faces. The first key-point
- * will be mapped into <theNodeIndexOnKeyPoint1>-th node of each face
- */
- point_array ApplyToMeshFaces(in SMESH_Mesh theMesh,
- in long_array theFacesIDs,
- in long theNodeIndexOnKeyPoint1,
- in boolean theReverse);
-
- /*!
- * Compute nodes coordinates applying
- * the loaded pattern to hexahedrons. The (0,0,0) key-point
- * will be mapped into <theNode000Index>-th node of each volume.
- * The (0,0,1) key-point will be mapped into <theNode001Index>-th
- * node of each volume.
- */
- point_array ApplyToHexahedrons(in SMESH_Mesh theMesh,
- in long_array theVolumesIDs,
- in long theNode000Index,
- in long theNode001Index);
-
- /*!
- * Create nodes and elements in <theMesh> using nodes
- * coordinates computed by either of Apply...() methods.
- * If CreatePolygons is TRUE, replace adjacent faces by polygons
- * to keep mesh conformity.
- * If CreatePolyedrs is TRUE, replace adjacent volumes by polyedrs
- * to keep mesh conformity.
- */
- boolean MakeMesh (in SMESH_Mesh theMesh,
- in boolean CreatePolygons,
- in boolean CreatePolyedrs);
-
- /*!
- * Return the loaded pattern in the string form to be saved in file
- */
- string GetString();
-
- /*!
- * error code of the last of one of above operations
- */
- enum ErrorCode {
- ERR_OK,
- // Load(file)
- ERR_READ_NB_POINTS, // couldn't read nb of points
- ERR_READ_POINT_COORDS, // invalid nb of point coordinates
- ERR_READ_TOO_FEW_POINTS, // too few points in a pattern
- ERR_READ_3D_COORD, // coordinate of 3D point out of [0,1] range
- ERR_READ_NO_KEYPOINT, // no key-points in 2D pattern
- ERR_READ_BAD_INDEX, // invalid point index
- ERR_READ_ELEM_POINTS, // invalid nb of points in element
- ERR_READ_NO_ELEMS, // no elements in a pattern
- ERR_READ_BAD_KEY_POINT, // a key-point not on a boundary
- // Save(file)
- ERR_SAVE_NOT_LOADED, // pattern was not loaded
- // Load(shape)
- ERR_LOAD_EMPTY_SUBMESH, // no elements to load
- // Load(face)
- ERR_LOADF_NARROW_FACE, // too narrow face
- ERR_LOADF_CLOSED_FACE, // closed face
- // Load(volume)
- ERR_LOADV_BAD_SHAPE, // volume is not a brick of 6 faces
- ERR_LOADV_COMPUTE_PARAMS, // cant compute point parameters
- // Apply(shape)
- ERR_APPL_NOT_LOADED, // pattern was not loaded
- ERR_APPL_BAD_DIMENTION, // wrong shape dimention
- ERR_APPL_BAD_NB_VERTICES, // keypoints - vertices mismatch
- // Apply(face)
- ERR_APPLF_BAD_TOPOLOGY, // bad pattern topology
- ERR_APPLF_BAD_VERTEX, // first vertex not on an outer face boundary
- ERR_APPLF_INTERNAL_EEROR, // program error
- // Apply(volume)
- ERR_APPLV_BAD_SHAPE, // volume is not a brick of 6 faces
- // MakeMesh
- ERR_MAKEM_NOT_COMPUTED // mapping failed
- };
-
- /*!
- * Return error code of the last operation
- */
- ErrorCode GetErrorCode();
-
- /*!
- * Return true if the loaded pattern is a 2D one
- */
- boolean Is2D();
-
- /*!
- * Return coordinates of pattern points
- */
- point_array GetPoints();
-
- /*!
- * Return indices of key-points within the arrays returned by
- * GetPoints()
- */
- long_array GetKeyPoints();
-
- /*!
- * Return nodal connectivity of the elements of the pattern
- * or of all elements to be crated
- */
- array_of_long_array GetElementPoints(in boolean all);
- };
-};
-
-#endif
+++ /dev/null
-language=en
-resources=StdMeshers:NETGENPlugin
\ No newline at end of file
+++ /dev/null
-<?xml version='1.0' encoding='us-ascii'?>
-<!DOCTYPE application PUBLIC "" "desktop.dtd">
-
-<!-- GUI customization for MESH component -->
-
-<application
- title="Mesh component"
- date="13/05/2002"
- author="Nicolas REJNERI"
- appId="Mesh for Salome" >
-
-<desktop>
-<menubar>
-
-<!-- ************************** File (menubar) ************************************ -->
-<menu-item label-id="File" item-id="1" pos-id="">
- <submenu label-id="Import" item-id="11" pos-id="8">
- <popup-item item-id="111" pos-id="" label-id="DAT file" icon-id="" tooltip-id="" accel-id="Ctrl+B" toggle-id="" execute-action=""/>
- <popup-item item-id="112" pos-id="" label-id="UNV File" icon-id="" tooltip-id="" accel-id="Ctrl+U" toggle-id="" execute-action=""/>
- <popup-item item-id="113" pos-id="" label-id="MED File" icon-id="" tooltip-id="" accel-id="Ctrl+M" toggle-id="" execute-action=""/>
- </submenu>
- <endsubmenu />
- <submenu label-id="Export" item-id="12" pos-id="9">
- <popup-item item-id="121" pos-id="" label-id="DAT File" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="122" pos-id="" label-id="MED File" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="123" pos-id="" label-id="UNV File" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- </submenu>
- <endsubmenu />
- <separator pos-id="10"/>
-</menu-item>
-
-<!-- ************************* Edit (menubar) ************************************** -->
-
-<menu-item label-id="Edit" item-id="3" pos-id="2">
- <separator pos-id=""/>
- <popup-item item-id="33" pos-id="" label-id="Delete" icon-id="delete.png" tooltip-id="" accel-id="" toggle-id="" execute-action="" />
-</menu-item>
-
-<!-- ************************* Tools (menubar) ************************************** -->
-
-<menu-item label-id="Tools" item-id="5" pos-id="">
- <separator pos-id=""/>
- <popup-item item-id="5105" pos-id="" label-id="Selection filters library" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
-</menu-item>
-
-<!-- ************************** Hypothesis (menubar) ************************************ -->
-<menu-item label-id="Hypotheses" item-id="50" pos-id="3">
- <popup-item item-id="5000" pos-id="" label-id="Create Hypotheses" icon-id="mesh_hypo_length.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="5010" pos-id="" label-id="Create Algorithms" icon-id="mesh_algo_mefisto.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
-</menu-item>
-
-<!-- ************************** Mesh (menubar) ************************************ -->
-<menu-item label-id="Mesh" item-id="70" pos-id="4">
- <popup-item item-id="703" pos-id="" label-id="Global Hypothesis" icon-id="mesh_init.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="702" pos-id="" label-id="Local Hypothesis" icon-id="mesh_add_sub.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="704" pos-id="" label-id="Edit Hypothesis" icon-id="mesh_edit.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <separator pos-id=""/>
- <popup-item item-id="701" pos-id="" label-id="Compute" icon-id="mesh_compute.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <separator pos-id=""/>
- <popup-item item-id="801" pos-id="" label-id="Create Group" icon-id="mesh_tree_group.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="802" pos-id="" label-id="Construct Group" icon-id="mesh_make_group.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="803" pos-id="" label-id="Edit Group" icon-id="mesh_edit_group.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <separator pos-id=""/>
- <popup-item item-id="810" pos-id="" label-id="Union Groups" icon-id="mesh_unionGroups.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="811" pos-id="" label-id="Intersect Groups" icon-id="mesh_intersectGroups.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="812" pos-id="" label-id="Cut Groups" icon-id="mesh_cutGroups.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <separator pos-id=""/>
- <popup-item item-id="813" pos-id="" label-id="Delete Groups" icon-id="mesh_deleteGroups.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <separator pos-id=""/>
- <popup-item item-id="900" pos-id="" label-id="Advanced Mesh Infos" icon-id="advanced_mesh_info.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="902" pos-id="" label-id="Standard Mesh Infos" icon-id="standard_mesh_info.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
-</menu-item>
-
-<!-- ************************** Control (menubar) ************************************ -->
-<menu-item label-id="Controls" item-id="60" pos-id="5">
- <popup-item item-id="6003" pos-id="" label-id="Free Borders" icon-id="mesh_free_edges.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="6001" pos-id="" label-id="Length" icon-id="mesh_length.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="6004" pos-id="" label-id="Borders at Multi-Connection" icon-id="mesh_multi_edges.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <separator pos-id=""/>
- <popup-item item-id="6002" pos-id="" label-id="Free Edges" icon-id="mesh_free_edges_2d.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="6018" pos-id="" label-id="Length 2D" icon-id="mesh_length_2d.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="6019" pos-id="" label-id="Borders at Multi-Connection 2D" icon-id="mesh_multi_edges_2d.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="6011" pos-id="" label-id="Area" icon-id="mesh_area.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="6012" pos-id="" label-id="Taper" icon-id="mesh_taper.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="6013" pos-id="" label-id="Aspect Ratio" icon-id="mesh_aspect.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="6014" pos-id="" label-id="Minimum Angle" icon-id="mesh_angle.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="6015" pos-id="" label-id="Warping" icon-id="mesh_wrap.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="6016" pos-id="" label-id="Skew" icon-id="mesh_skew.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <separator pos-id=""/>
- <popup-item item-id="6017" pos-id="" label-id="Aspect Ratio 3D" icon-id="mesh_aspect_3d.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
-</menu-item>
-
-<!-- ************************** Entity (menubar) ************************************ -->
-<menu-item label-id="Modification" item-id="40" pos-id="6">
- <submenu label-id="Add" item-id="402" pos-id="">
- <popup-item item-id="400" pos-id="" label-id="Node" icon-id="mesh_vertex.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="401" pos-id="" label-id="Edge" icon-id="mesh_line.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="4021" pos-id="" label-id="Triangle" icon-id="mesh_triangle.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="4022" pos-id="" label-id="Quadrangle" icon-id="mesh_quad.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="4023" pos-id="" label-id="Polygon" icon-id="mesh_polygon.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="4031" pos-id="" label-id="Tetrahedron" icon-id="mesh_tetra.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="4032" pos-id="" label-id="Hexahedron" icon-id="mesh_hexa.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="4033" pos-id="" label-id="Polyhedron" icon-id="mesh_polyhedron.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- </submenu>
- <endsubmenu />
- <submenu label-id="Remove" item-id="403" pos-id="">
- <popup-item item-id="4041" pos-id="" label-id="Nodes" icon-id="mesh_rem_node.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="4042" pos-id="" label-id="Elements" icon-id="mesh_rem_element.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- </submenu>
- <endsubmenu />
- <submenu label-id="Renumbering" item-id="404" pos-id="">
- <popup-item item-id="4051" pos-id="" label-id="Nodes" icon-id="mesh_renumbering_nodes.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="4052" pos-id="" label-id="Elements" icon-id="mesh_renumbering_elements.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- </submenu>
- <endsubmenu />
- <submenu label-id="Transformation" item-id="405" pos-id="">
- <popup-item item-id="4061" pos-id="" label-id="Translation" icon-id="mesh_translation_vector.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="4062" pos-id="" label-id="Rotation" icon-id="mesh_rotation.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="4063" pos-id="" label-id="Symmetry" icon-id="mesh_symmetry_plane.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="4064" pos-id="" label-id="Sewing" icon-id="mesh_sew_freeborders.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="4065" pos-id="" label-id="Merge nodes" icon-id="mesh_merge_nodes.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- </submenu>
- <endsubmenu />
- <popup-item item-id="406" pos-id="" label-id="Move Node" icon-id="mesh_move_node.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="407" pos-id="" label-id="Diagonal Inversion" icon-id="mesh_diagonal.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="408" pos-id="" label-id="Union of two triangles" icon-id="mesh_union2tri.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="409" pos-id="" label-id="Orientation" icon-id="mesh_orientation.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="410" pos-id="" label-id="Union of triangles" icon-id="mesh_uniontri.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="411" pos-id="" label-id="Cutting of quadrangles" icon-id="mesh_cutquad.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="412" pos-id="" label-id="Smoothing" icon-id="mesh_smoothing.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="413" pos-id="" label-id="Extrusion" icon-id="mesh_extrusion.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="416" pos-id="" label-id="Extrusion along a path" icon-id="mesh_extrusionpath.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="414" pos-id="" label-id="Revolution" icon-id="mesh_revolution.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="415" pos-id="" label-id="Pattern mapping" icon-id="mesh_pattern.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
-</menu-item>
-
-<!-- ********************************* Settings (menubar) ********************************* -->
-<menu-item label-id="Preferences" item-id="4" pos-id="">
- <submenu label-id="Mesh" item-id="100" pos-id="-1">
- <submenu label-id="Display Mode" item-id="1000" pos-id="">
- <popup-item item-id="10001" pos-id="" label-id="Wireframe" icon-id="mesh_wireframe.png" tooltip-id="" accel-id="" toggle-id="false" execute-action=""/>
- <popup-item item-id="10002" pos-id="" label-id="Shading" icon-id="mesh_shading.png" tooltip-id="" accel-id="" toggle-id="true" execute-action=""/>
- <popup-item item-id="10004" pos-id="" label-id="Nodes" icon-id="mesh_points.png" tooltip-id="" accel-id="" toggle-id="false" execute-action=""/>
- <separator pos-id=""/>
- <popup-item item-id="10003" pos-id="" label-id="Shrink" icon-id="mesh_shrink.png" tooltip-id="" accel-id="" toggle-id="false" execute-action=""/>
- </submenu>
- <endsubmenu />
- <popup-item item-id="1001" pos-id="" label-id="Automatic Update" icon-id="" tooltip-id="" accel-id="" toggle-id="false" execute-action=""/>
- <separator pos-id=""/>
- <popup-item item-id="1003" pos-id="" label-id="Colors / Size" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <separator pos-id=""/>
- <popup-item item-id="1005" pos-id="" label-id="Scalar Bar" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <separator pos-id=""/>
- <popup-item item-id="1006" pos-id="" label-id="Selection" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <separator pos-id=""/>
- <submenu label-id="Quality controls" item-id="1007" pos-id="">
- <popup-item item-id="10070" pos-id="" label-id="Precision" icon-id="" tooltip-id="" accel-id="" toggle-id="false" execute-action=""/>
- <popup-item item-id="10071" pos-id="" label-id="Display Entity" icon-id="" tooltip-id="" accel-id="" toggle-id="true" execute-action=""/>
- </submenu>
- <endsubmenu />
- </submenu>
- <endsubmenu />
- <separator pos-id="-1"/>
-</menu-item>
-
-<!-- ********************************* View (menubar) ********************************* -->
-<menu-item label-id="View" item-id="2" pos-id="">
- <separator pos-id=""/>
- <popup-item item-id="214" pos-id="" label-id="Update" icon-id="mesh_update.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
-</menu-item>
-
-<!-- ################################# POPUP MENU ################################# -->
-
-<popupmenu label-id="Popup for ObjectBrowser" context-id="" parent-id="ObjectBrowser" object-id="Mesh">
- <popup-item item-id="705" pos-id="" label-id="Edit Global Hypothesis" icon-id="mesh_edit.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <separator pos-id=""/>
- <popup-item item-id="701" pos-id="" label-id="Compute" icon-id="mesh_compute.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="214" pos-id="" label-id="Update" icon-id="mesh_update.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="900" pos-id="" label-id="Show Advanced Info" icon-id="advanced_mesh_info.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="902" pos-id="" label-id="Show Standard Info" icon-id="standard_mesh_info.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <separator pos-id=""/>
- <popup-item item-id="801" pos-id="" label-id="Create Group" icon-id="mesh_tree_group.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <separator pos-id=""/>
- <popup-item item-id="1101" pos-id="" label-id="Rename" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <separator pos-id=""/>
- <popup-item item-id="122" pos-id="" label-id="Export to MED" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="123" pos-id="" label-id="Export to UNV" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
-</popupmenu>
-
-<popupmenu label-id="Popup for ObjectBrowser" context-id="" parent-id="ObjectBrowser" object-id="SubMesh">
- <popup-item item-id="706" pos-id="" label-id="Edit Local Hypothesis" icon-id="mesh_edit.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <separator pos-id=""/>
- <popup-item item-id="214" pos-id="" label-id="Update" icon-id="mesh_update.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="900" pos-id="" label-id="Show Info" icon-id="mesh_info.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <separator pos-id=""/>
- <popup-item item-id="802" pos-id="" label-id="Construct Group" icon-id="mesh_make_group.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <separator pos-id=""/>
- <popup-item item-id="1101" pos-id="" label-id="Rename" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <separator pos-id=""/>
- <popup-item item-id="33" pos-id="" label-id="Delete" icon-id="delete.png" tooltip-id="" accel-id="" toggle-id="" execute-action="" />
-</popupmenu>
-
-<popupmenu label-id="Popup for ObjectBrowser" context-id="" parent-id="ObjectBrowser" object-id="Group">
- <popup-item item-id="803" pos-id="" label-id="Edit" icon-id="mesh_edit_group.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <separator pos-id=""/>
- <popup-item item-id="214" pos-id="" label-id="Update" icon-id="mesh_update.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="900" pos-id="" label-id="Show Info" icon-id="mesh_info.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <separator pos-id=""/>
- <popup-item item-id="1101" pos-id="" label-id="Rename" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <separator pos-id=""/>
- <popup-item item-id="33" pos-id="" label-id="Delete" icon-id="delete.png" tooltip-id="" accel-id="" toggle-id="" execute-action="" />
-</popupmenu>
-
-<popupmenu label-id="Popup for ObjectBrowser" context-id="" parent-id="ObjectBrowser" object-id="Hypothesis">
- <popup-item item-id="1100" pos-id="" label-id="Edit" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="1102" pos-id="" label-id="Unassign Hypothesis" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="1101" pos-id="" label-id="Rename" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
-</popupmenu>
-
-<popupmenu label-id="Popup for ObjectBrowser" context-id="" parent-id="ObjectBrowser" object-id="Algorithm">
- <popup-item item-id="1102" pos-id="" label-id="Unassign Algorithm" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="1101" pos-id="" label-id="Rename" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
-</popupmenu>
-
-
-<popupmenu label-id="Popup for Viewer" context-id="" parent-id="Viewer" object-id="Mesh">
- <popup-item item-id="214" pos-id="" label-id="Update" icon-id="mesh_update.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="900" pos-id="" label-id="Show Advanced Info" icon-id="advanced_mesh_info.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="902" pos-id="" label-id="Show Standard Info" icon-id="standard_mesh_info.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <separator pos-id=""/>
- <submenu label-id="Numbering" item-id="114" pos-id="">
- <popup-item item-id="9010" pos-id="" label-id="Display Nodes #" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="9011" pos-id="" label-id="Display Elements #" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- </submenu>
- <endsubmenu />
- <separator pos-id=""/>
- <submenu label-id="Display Mode" item-id="1131" pos-id="">
- <popup-item item-id="211" pos-id="" label-id="Wireframe" icon-id="mesh_wireframe.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="212" pos-id="" label-id="Shading" icon-id="mesh_shading.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="215" pos-id="" label-id="Nodes" icon-id="mesh_points.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <separator pos-id=""/>
- <popup-item item-id="213" pos-id="" label-id="Shrink" icon-id="mesh_shrink.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- </submenu>
- <endsubmenu />
- <submenu label-id="Display Entity" item-id="1135" pos-id="">
- <popup-item item-id="217" pos-id="" label-id="Edges" icon-id="mesh_line.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="218" pos-id="" label-id="Faces" icon-id="mesh_triangle.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="219" pos-id="" label-id="Volumes" icon-id="mesh_tetra.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <separator pos-id=""/>
- <popup-item item-id="220" pos-id="" label-id="All" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- </submenu>
- <endsubmenu />
- <popup-item item-id="1132" pos-id="" label-id="Colors / Size" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="1133" pos-id="" label-id="Transparency" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="1134" pos-id="" label-id="Clipping" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <separator pos-id=""/>
- <submenu label-id="Control" item-id="2000" pos-id="">
- <popup-item item-id="200" pos-id="" label-id="Reset" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <separator pos-id=""/>
- <popup-item item-id="6003" pos-id="" label-id="Free Borders" icon-id="mesh_free_edges.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="6001" pos-id="" label-id="Length" icon-id="mesh_length.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="6004" pos-id="" label-id="Borders at Multi-Connection" icon-id="mesh_multi_edges.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <separator pos-id=""/>
- <popup-item item-id="6002" pos-id="" label-id="Free Edges" icon-id="mesh_free_edges_2d.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="6018" pos-id="" label-id="Length 2D" icon-id="mesh_length_2d.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="6019" pos-id="" label-id="Borders at Multi-Connection 2D" icon-id="mesh_multi_edges_2d.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="6011" pos-id="" label-id="Area" icon-id="mesh_area.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="6012" pos-id="" label-id="Taper" icon-id="mesh_taper.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="6013" pos-id="" label-id="Aspect Ratio" icon-id="mesh_aspect.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="6014" pos-id="" label-id="Minimum Angle" icon-id="mesh_angle.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="6015" pos-id="" label-id="Warping" icon-id="mesh_wrap.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="6016" pos-id="" label-id="Skew" icon-id="mesh_skew.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <separator pos-id=""/>
- <popup-item item-id="6017" pos-id="" label-id="Aspect Ratio 3D" icon-id="mesh_aspect_3d.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <separator pos-id=""/>
- <popup-item item-id="201" pos-id="" label-id="Scalar Bar Properties" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- </submenu>
- <endsubmenu />
- <separator pos-id=""/>
-</popupmenu>
-
-<popupmenu label-id="Popup for Viewer" context-id="" parent-id="Viewer" object-id="SubMesh">
- <popup-item item-id="214" pos-id="" label-id="Update" icon-id="mesh_update.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="900" pos-id="" label-id="Show Info" icon-id="mesh_info.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <separator pos-id=""/>
- <submenu label-id="Numbering" item-id="114" pos-id="">
- <popup-item item-id="9010" pos-id="" label-id="Display Nodes #" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="9011" pos-id="" label-id="Display Elements #" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- </submenu>
- <endsubmenu />
- <separator pos-id=""/>
- <submenu label-id="Display Mode" item-id="1131" pos-id="">
- <popup-item item-id="211" pos-id="" label-id="Wireframe" icon-id="mesh_wireframe.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="212" pos-id="" label-id="Shading" icon-id="mesh_shading.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="215" pos-id="" label-id="Nodes" icon-id="mesh_points.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <separator pos-id=""/>
- <popup-item item-id="213" pos-id="" label-id="Shrink" icon-id="mesh_shrink.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- </submenu>
- <endsubmenu />
- <submenu label-id="Display Entity" item-id="1135" pos-id="">
- <popup-item item-id="217" pos-id="" label-id="Edges" icon-id="mesh_line.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="218" pos-id="" label-id="Faces" icon-id="mesh_triangle.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="219" pos-id="" label-id="Volumes" icon-id="mesh_tetra.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <separator pos-id=""/>
- <popup-item item-id="220" pos-id="" label-id="All" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- </submenu>
- <endsubmenu />
- <popup-item item-id="1132" pos-id="" label-id="Colors / Size" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="1133" pos-id="" label-id="Transparency" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="1134" pos-id="" label-id="Clipping" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <separator pos-id=""/>
- <submenu label-id="Control" item-id="2000" pos-id="">
- <popup-item item-id="200" pos-id="" label-id="Reset" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <separator pos-id=""/>
- <popup-item item-id="6001" pos-id="" label-id="Length" icon-id="mesh_length.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="6003" pos-id="" label-id="Free Borders" icon-id="mesh_free_edges.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="6004" pos-id="" label-id="Borders at Multi-Connection" icon-id="mesh_multi_edges.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <separator pos-id=""/>
- <popup-item item-id="6002" pos-id="" label-id="Free Edges" icon-id="mesh_free_edges_2d.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="6018" pos-id="" label-id="Length 2D" icon-id="mesh_length_2d.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="6019" pos-id="" label-id="Borders at Multi-Connection 2D" icon-id="mesh_multi_edges_2d.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="6011" pos-id="" label-id="Area" icon-id="mesh_area.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="6012" pos-id="" label-id="Taper" icon-id="mesh_taper.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="6013" pos-id="" label-id="Aspect Ratio" icon-id="mesh_aspect.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="6014" pos-id="" label-id="Minimum Angle" icon-id="mesh_angle.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="6015" pos-id="" label-id="Warping" icon-id="mesh_wrap.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="6016" pos-id="" label-id="Skew" icon-id="mesh_skew.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <separator pos-id=""/>
- <popup-item item-id="6017" pos-id="" label-id="Aspect Ratio 3D" icon-id="mesh_aspect_3d.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <separator pos-id=""/>
- <popup-item item-id="201" pos-id="" label-id="Scalar Bar Properties" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- </submenu>
- <endsubmenu />
- <separator pos-id=""/>
-</popupmenu>
-
-<popupmenu label-id="Popup for Viewer" context-id="" parent-id="Viewer" object-id="Group">
- <popup-item item-id="803" pos-id="" label-id="Edit" icon-id="mesh_edit_group.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <separator pos-id=""/>
- <popup-item item-id="214" pos-id="" label-id="Update" icon-id="mesh_update.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="900" pos-id="" label-id="Show Info" icon-id="mesh_info.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <separator pos-id=""/>
- <submenu label-id="Numbering" item-id="114" pos-id="">
- <popup-item item-id="9010" pos-id="" label-id="Display Nodes #" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="9011" pos-id="" label-id="Display Elements #" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- </submenu>
- <endsubmenu />
- <separator pos-id=""/>
- <submenu label-id="Display Mode" item-id="1131" pos-id="">
- <popup-item item-id="211" pos-id="" label-id="Wireframe" icon-id="mesh_wireframe.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="212" pos-id="" label-id="Shading" icon-id="mesh_shading.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="215" pos-id="" label-id="Nodes" icon-id="mesh_points.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <separator pos-id=""/>
- <popup-item item-id="213" pos-id="" label-id="Shrink" icon-id="mesh_shrink.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- </submenu>
- <endsubmenu />
- <submenu label-id="Display Entity" item-id="1135" pos-id="">
- <popup-item item-id="217" pos-id="" label-id="Edges" icon-id="mesh_line.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="218" pos-id="" label-id="Faces" icon-id="mesh_triangle.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="219" pos-id="" label-id="Volumes" icon-id="mesh_tetra.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <separator pos-id=""/>
- <popup-item item-id="220" pos-id="" label-id="All" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- </submenu>
- <endsubmenu />
- <popup-item item-id="1132" pos-id="" label-id="Colors / Size" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="1133" pos-id="" label-id="Transparency" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="1134" pos-id="" label-id="Clipping" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <separator pos-id=""/>
- <submenu label-id="Control" item-id="2000" pos-id="">
- <popup-item item-id="200" pos-id="" label-id="Reset" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <separator pos-id=""/>
- <popup-item item-id="6003" pos-id="" label-id="Free Borders" icon-id="mesh_free_edges.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="6001" pos-id="" label-id="Length" icon-id="mesh_length.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="6004" pos-id="" label-id="Borders at Multi-Connection" icon-id="mesh_multi_edges.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <separator pos-id=""/>
- <popup-item item-id="6002" pos-id="" label-id="Free Edges" icon-id="mesh_free_edges_2d.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="6018" pos-id="" label-id="Length 2D" icon-id="mesh_length_2d.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="6019" pos-id="" label-id="Borders at Multi-Connection 2D" icon-id="mesh_multi_edges_2d.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="6011" pos-id="" label-id="Area" icon-id="mesh_area.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="6012" pos-id="" label-id="Taper" icon-id="mesh_taper.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="6013" pos-id="" label-id="Aspect Ratio" icon-id="mesh_aspect.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="6014" pos-id="" label-id="Minimum Angle" icon-id="mesh_angle.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="6015" pos-id="" label-id="Warping" icon-id="mesh_wrap.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="6016" pos-id="" label-id="Skew" icon-id="mesh_skew.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <separator pos-id=""/>
- <popup-item item-id="6017" pos-id="" label-id="Aspect Ratio 3D" icon-id="mesh_aspect_3d.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <separator pos-id=""/>
- <popup-item item-id="201" pos-id="" label-id="Scalar Bar Properties" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- </submenu>
- <endsubmenu />
- <separator pos-id=""/>
-</popupmenu>
-
-<popupmenu label-id="Elements" context-id="" parent-id="Viewer" object-id="Elements">
- <popup-item item-id="804" pos-id="" label-id="Add" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="805" pos-id="" label-id="Remove" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
-</popupmenu>
-
-</menubar>
-
-<!-- ///////////////////////////////////// TOOLBARS ////////////////////////////////////// -->
-<toolbar label-id="Mesh Toolbar">
- <toolbutton-item item-id="703" pos-id="" label-id="Init" icon-id="mesh_init.png" tooltip-id="Global Hypothesis" accel-id="" toggle-id="" execute-action=""/>
- <toolbutton-item item-id="702" pos-id="" label-id="Add SubMesh" icon-id="mesh_add_sub.png" tooltip-id="Local Hypothesis" accel-id="" toggle-id="" execute-action=""/>
- <toolbutton-item item-id="704" pos-id="" label-id="Edit" icon-id="mesh_edit.png" tooltip-id="Edit Hypothesis" accel-id="" toggle-id="" execute-action=""/>
- <separatorTB/>
- <toolbutton-item item-id="701" pos-id="" label-id="Compute" icon-id="mesh_compute.png" tooltip-id="Compute" accel-id="" toggle-id="" execute-action=""/>
- <separatorTB/>
- <toolbutton-item item-id="801" pos-id="" label-id="Create Group" icon-id="mesh_tree_group.png" tooltip-id="Create Group" accel-id="" toggle-id="" execute-action=""/>
- <toolbutton-item item-id="802" pos-id="" label-id="Construct Group" icon-id="mesh_make_group.png" tooltip-id="Construct Group" accel-id="" toggle-id="" execute-action=""/>
- <toolbutton-item item-id="803" pos-id="" label-id="Edit Group" icon-id="mesh_edit_group.png" tooltip-id="Edit Group" accel-id="" toggle-id="" execute-action=""/>
- <separatorTB/>
- <toolbutton-item item-id="900" pos-id="" label-id="Advanced Mesh Infos" icon-id="advanced_mesh_info.png" tooltip-id="Advanced Mesh Infos" accel-id="" toggle-id="" execute-action=""/>
- <toolbutton-item item-id="902" pos-id="" label-id="Standard Mesh Infos" icon-id="standard_mesh_info.png" tooltip-id="Standard Mesh Infos" accel-id="" toggle-id="" execute-action=""/>
-</toolbar>
-
-<toolbar label-id="Hypotheses Toolbar">
- <toolbutton-item item-id="5000" label-id="Create Hypotheses" icon-id="mesh_hypo_length.png" tooltip-id="Create Hypotheses" accel-id="" toggle-id="" execute-action=""/>
- <toolbutton-item item-id="5010" label-id="Create Algorithms" icon-id="mesh_algo_mefisto.png" tooltip-id="Create Algorithms" accel-id="" toggle-id="" execute-action=""/>
-</toolbar>
-
-<toolbar label-id="Controls toolbar">
- <toolbutton-item item-id="6001" label-id="Length" icon-id="mesh_length.png" tooltip-id="Length" accel-id="" toggle-id="" execute-action=""/>
- <toolbutton-item item-id="6003" label-id="Free Borders" icon-id="mesh_free_edges.png" tooltip-id="Free borders" accel-id="" toggle-id="" execute-action=""/>
- <toolbutton-item item-id="6004" label-id="Borders at Multi-Connection" icon-id="mesh_multi_edges.png" tooltip-id="Borders at multi-connection" accel-id="" toggle-id="" execute-action=""/>
- <separatorTB/>
- <toolbutton-item item-id="6002" label-id="Free Edges" icon-id="mesh_free_edges_2d.png" tooltip-id="Free edges" accel-id="" toggle-id="" execute-action=""/>
- <toolbutton-item item-id="6018" label-id="Length 2D" icon-id="mesh_length_2d.png" tooltip-id="Length2D" accel-id="" toggle-id="" execute-action=""/>
- <toolbutton-item item-id="6019" label-id="Borders at Multi-Connection 2D" icon-id="mesh_multi_edges_2d.png" tooltip-id="Multiconnection 2D" accel-id="" toggle-id="" execute-action=""/>
- <toolbutton-item item-id="6011" label-id="Area" icon-id="mesh_area.png" tooltip-id="Area" accel-id="" toggle-id="" execute-action=""/>
- <toolbutton-item item-id="6012" label-id="Taper" icon-id="mesh_taper.png" tooltip-id="Taper" accel-id="" toggle-id="" execute-action=""/>
- <toolbutton-item item-id="6013" label-id="Aspect Ratio" icon-id="mesh_aspect.png" tooltip-id="Aspect Ratio" accel-id="" toggle-id="" execute-action=""/>
- <toolbutton-item item-id="6014" label-id="Minimum Angle" icon-id="mesh_angle.png" tooltip-id="Minimum angle" accel-id="" toggle-id="" execute-action=""/>
- <toolbutton-item item-id="6015" label-id="Warping" icon-id="mesh_wrap.png" tooltip-id="Warping angle" accel-id="" toggle-id="" execute-action=""/>
- <toolbutton-item item-id="6016" label-id="Skew" icon-id="mesh_skew.png" tooltip-id="Skew" accel-id="" toggle-id="" execute-action=""/>
- <separatorTB/>
- <toolbutton-item item-id="6017" label-id="Aspect Ratio 3D" icon-id="mesh_aspect_3d.png" tooltip-id="Aspect Ratio 3D" accel-id="" toggle-id="" execute-action=""/>
-</toolbar>
-
-<toolbar label-id="Add/Remove toolbar">
- <toolbutton-item item-id="400" label-id="Node" icon-id="mesh_vertex.png" tooltip-id="Add Node" accel-id="" toggle-id="" execute-action=""/>
- <toolbutton-item item-id="401" label-id="Edge" icon-id="mesh_line.png" tooltip-id="Add Edge" accel-id="" toggle-id="" execute-action=""/>
- <toolbutton-item item-id="4021" label-id="Triangle" icon-id="mesh_triangle.png" tooltip-id="Add Triangle" accel-id="" toggle-id="" execute-action=""/>
- <toolbutton-item item-id="4022" label-id="Quadrangle" icon-id="mesh_quad.png" tooltip-id="Add Quadrangle" accel-id="" toggle-id="" execute-action=""/>
- <toolbutton-item item-id="4023" label-id="Polygon" icon-id="mesh_polygon.png" tooltip-id="Add Polygon" accel-id="" toggle-id="" execute-action=""/>
- <toolbutton-item item-id="4031" label-id="Tetrahedron" icon-id="mesh_tetra.png" tooltip-id="Add Tetrahedron" accel-id="" toggle-id="" execute-action=""/>
- <toolbutton-item item-id="4032" label-id="Hexahedron" icon-id="mesh_hexa.png" tooltip-id="Add Hexahedron" accel-id="" toggle-id="" execute-action=""/>
- <toolbutton-item item-id="4033" label-id="Polyhedron" icon-id="mesh_polyhedron.png" tooltip-id="Add Polyhedron" accel-id="" toggle-id="" execute-action=""/>
- <separatorTB/>
- <toolbutton-item item-id="4041" label-id="Nodes" icon-id="mesh_rem_node.png" tooltip-id="Remove Nodes" accel-id="" toggle-id="" execute-action=""/>
- <toolbutton-item item-id="4042" label-id="Elements" icon-id="mesh_rem_element.png" tooltip-id="Remove Elements" accel-id="" toggle-id="" execute-action=""/>
- <separatorTB/>
- <toolbutton-item item-id="4051" label-id="Nodes" icon-id="mesh_renumbering_nodes.png" tooltip-id="Renumbering Nodes" accel-id="" toggle-id="" execute-action=""/>
- <toolbutton-item item-id="4052" label-id="Elements" icon-id="mesh_renumbering_elements.png" tooltip-id="Renumbering Elements" accel-id="" toggle-id="" execute-action=""/>
- <separatorTB/>
- <toolbutton-item item-id="4061" label-id="Translation" icon-id="mesh_translation_vector.png" tooltip-id="Displacement of a mesh by Translation" accel-id="" toggle-id="" execute-action=""/>
- <toolbutton-item item-id="4062" label-id="Rotation" icon-id="mesh_rotation.png" tooltip-id="Displacement of a mesh by Rotation" accel-id="" toggle-id="" execute-action=""/>
- <toolbutton-item item-id="4063" label-id="Symmetry" icon-id="mesh_symmetry_plane.png" tooltip-id="Displacement of a mesh by Symmetry" accel-id="" toggle-id="" execute-action=""/>
- <toolbutton-item item-id="4064" label-id="Sewing" icon-id="mesh_sew_freeborders.png" tooltip-id="Sewing of meshes" accel-id="" toggle-id="" execute-action=""/>
- <toolbutton-item item-id="4065" label-id="Merge nodes" icon-id="mesh_merge_nodes.png" tooltip-id="Merge nodes" accel-id="" toggle-id="" execute-action=""/>
-</toolbar>
-
-<toolbar label-id="Modification toolbar">
- <toolbutton-item item-id="406" label-id="Move Node" icon-id="mesh_move_node.png" tooltip-id="Move Node" accel-id="" toggle-id="" execute-action=""/>
- <toolbutton-item item-id="407" label-id="Diagonal Inversion" icon-id="mesh_diagonal.png" tooltip-id="Diagonal Inversion" accel-id="" toggle-id="" execute-action=""/>
- <toolbutton-item item-id="408" label-id="Union of two triangles" icon-id="mesh_union2tri.png" tooltip-id="Union of two triangles" accel-id="" toggle-id="" execute-action=""/>
- <toolbutton-item item-id="409" label-id="Orientation" icon-id="mesh_orientation.png" tooltip-id="Orientation" accel-id="" toggle-id="" execute-action=""/>
- <toolbutton-item item-id="410" label-id="Union of triangles" icon-id="mesh_uniontri.png" tooltip-id="Union of triangles" accel-id="" toggle-id="" execute-action=""/>
- <toolbutton-item item-id="411" label-id="Cutting of quadrangles" icon-id="mesh_cutquad.png" tooltip-id="Cutting of quadrangles" accel-id="" toggle-id="" execute-action=""/>
- <toolbutton-item item-id="412" label-id="Smoothing" icon-id="mesh_smoothing.png" tooltip-id="Smoothing" accel-id="" toggle-id="" execute-action=""/>
- <toolbutton-item item-id="413" label-id="Extrusion" icon-id="mesh_extrusion.png" tooltip-id="Extrusion along a line" accel-id="" toggle-id="" execute-action=""/>
- <toolbutton-item item-id="416" label-id="Extrusion along a path" icon-id="mesh_extrusionpath.png" tooltip-id="Extrusion along a path" accel-id="" toggle-id="" execute-action=""/>
- <toolbutton-item item-id="414" label-id="Revolution" icon-id="mesh_revolution.png" tooltip-id="Revolution around an axis" accel-id="" toggle-id="" execute-action=""/>
- <toolbutton-item item-id="415" label-id="Pattern mapping" icon-id="mesh_pattern.png" tooltip-id="2D and 3D pattern mapping" accel-id="" toggle-id="" execute-action=""/>
-</toolbar>
-
-<toolbar label-id="Display Mode Toolbar">
- <toolbutton-item item-id="214" pos-id="" label-id="Update" icon-id="mesh_update.png" tooltip-id="Update View" accel-id="" toggle-id="" execute-action=""/>
-</toolbar>
-
-</desktop>
-
-</application>
+++ /dev/null
-<?xml version='1.0' encoding='us-ascii'?>
-<!DOCTYPE application PUBLIC "" "desktop.dtd">
-
-<!-- GUI customization for MESH component -->
-
-<application
- title="Mesh component"
- date="13/05/2002"
- author="Nicolas REJNERI"
- appId="Mesh for Salome" >
-
-<desktop>
-<menubar>
-
-<!-- ************************** File (menubar) ************************************ -->
-<menu-item label-id="File" item-id="1" pos-id="">
- <submenu label-id="Import" item-id="11" pos-id="8">
- <popup-item item-id="111" pos-id="" label-id="DAT file" icon-id="" tooltip-id="" accel-id="Ctrl+B" toggle-id="" execute-action=""/>
- <popup-item item-id="112" pos-id="" label-id="UNV File" icon-id="" tooltip-id="" accel-id="Ctrl+I" toggle-id="" execute-action=""/>
- <popup-item item-id="113" pos-id="" label-id="MED File" icon-id="" tooltip-id="" accel-id="Ctrl+M" toggle-id="" execute-action=""/>
- </submenu>
- <endsubmenu />
- <submenu label-id="Export" item-id="12" pos-id="9">
- <popup-item item-id="121" pos-id="" label-id="DAT File" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="122" pos-id="" label-id="MED File" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="123" pos-id="" label-id="UNV File" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- </submenu>
- <endsubmenu />
- <separator pos-id="10"/>
-</menu-item>
-
-<!-- ************************* Edit (menubar) ************************************** -->
-<menu-item label-id="Edit" item-id="3" pos-id="2">
- <separator pos-id=""/>
- <popup-item item-id="33" pos-id="" label-id="Delete" icon-id="delete.png" tooltip-id="" accel-id="" toggle-id="" execute-action="" />
-</menu-item>
-
-<!-- ************************** Hypothesis (menubar) ************************************ -->
-<menu-item label-id="Hypotheses" item-id="50" pos-id="3">
- <popup-item item-id="5000" pos-id="" label-id="Create Hypothesis" icon-id="mesh_hypo_length.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="5010" pos-id="" label-id="Create Algorithm" icon-id="mesh_algo_mefisto.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
-</menu-item>
-
-<!-- ************************** Mesh (menubar) ************************************ -->
-<menu-item label-id="Mesh" item-id="70" pos-id="4">
- <popup-item item-id="703" pos-id="" label-id="Global Hyp." icon-id="mesh_init.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="702" pos-id="" label-id="Local Hyp." icon-id="mesh_add_sub.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="704" pos-id="" label-id="Edit Hyp." icon-id="mesh_edit.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <separator pos-id=""/>
- <popup-item item-id="701" pos-id="" label-id="Compute" icon-id="mesh_compute.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <separator pos-id=""/>
- <popup-item item-id="801" pos-id="" label-id="Create Group" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <separator pos-id=""/>
- <popup-item item-id="900" pos-id="" label-id="Mesh Infos" icon-id="mesh_info.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
-</menu-item>
-
-<!-- ************************** Control (menubar) ************************************ -->
-<menu-item label-id="Controls" item-id="60" pos-id="5">
- <popup-item item-id="6001" pos-id="" label-id="Length" icon-id="mesh_length.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="6002" pos-id="" label-id="Connectivity" icon-id="mesh_connectivity.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="6011" pos-id="" label-id="Area" icon-id="mesh_area.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="6012" pos-id="" label-id="Taper" icon-id="mesh_taper.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="6013" pos-id="" label-id="Aspect Ratio" icon-id="mesh_aspect.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="6014" pos-id="" label-id="Minimum angle" icon-id="mesh_angle.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="6015" pos-id="" label-id="Warp" icon-id="mesh_wrap.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="6016" pos-id="" label-id="Skew" icon-id="mesh_skew.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
-</menu-item>
-
-<!-- ************************** Entity (menubar) ************************************ -->
-<menu-item label-id="Modification" item-id="40" pos-id="6">
- <submenu label-id="Add" item-id="402" pos-id="">
- <popup-item item-id="400" pos-id="" label-id="Node" icon-id="mesh_vertex.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="401" pos-id="" label-id="Edge" icon-id="mesh_line.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="4021" pos-id="" label-id="Triangle" icon-id="mesh_triangle.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="4022" pos-id="" label-id="Quadrangle" icon-id="mesh_quad.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="4031" pos-id="" label-id="Tetrahedron" icon-id="mesh_tetra.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="4032" pos-id="" label-id="Hexahedron" icon-id="mesh_hexa.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- </submenu>
- <endsubmenu />
- <submenu label-id="Remove" item-id="403" pos-id="">
- <popup-item item-id="4041" pos-id="" label-id="Nodes" icon-id="mesh_rem_node.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="4042" pos-id="" label-id="Elements" icon-id="mesh_rem_element.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- </submenu>
- <endsubmenu />
- <submenu label-id="Renumbering" item-id="404" pos-id="">
- <popup-item item-id="4051" pos-id="" label-id="Nodes" icon-id="mesh_renumbering_nodes.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="4052" pos-id="" label-id="Elements" icon-id="mesh_renumbering_elements.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- </submenu>
- <endsubmenu />
- <popup-item item-id="405" pos-id="" label-id="Move Node" icon-id="mesh_move_node.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="406" pos-id="" label-id="Orientation" icon-id="mesh_orientation.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="407" pos-id="" label-id="Diagonal Inversion" icon-id="mesh_diagonal.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="408" pos-id="" label-id="Union of two triangles" icon-id="mesh_union2tri.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="406" pos-id="" label-id="Orientation" icon-id="mesh_orientation.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="409" pos-id="" label-id="Union of triangles" icon-id="mesh_uniontri.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="410" pos-id="" label-id="Cutting of quadrangles" icon-id="mesh_cutquad.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="411" pos-id="" label-id="Smoothing" icon-id="mesh_smoothing.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="412" pos-id="" label-id="Extrusion" icon-id="mesh_extrusion.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="413" pos-id="" label-id="Revolution" icon-id="mesh_revolution.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
-</menu-item>
-
-<!-- ************************** Numbering (menubar) ************************************ -->
-<menu-item label-id="Numbering" item-id="80" pos-id="7">
- <popup-item item-id="9010" pos-id="" label-id="Display Nodes #" icon-id="" tooltip-id="" accel-id="" toggle-id="false" execute-action=""/>
- <popup-item item-id="9011" pos-id="" label-id="Display Elements #" icon-id="" tooltip-id="" accel-id="" toggle-id="false" execute-action=""/>
-</menu-item>
-
-<!-- ********************************* Settings (menubar) ********************************* -->
-<menu-item label-id="Preferences" item-id="4" pos-id="">
- <submenu label-id="Mesh" item-id="100" pos-id="-1">
- <submenu label-id="Display Mode" item-id="1000" pos-id="">
- <popup-item item-id="10001" pos-id="" label-id="Wireframe" icon-id="" tooltip-id="" accel-id="" toggle-id="false" execute-action=""/>
- <popup-item item-id="10002" pos-id="" label-id="Shading" icon-id="" tooltip-id="" accel-id="" toggle-id="true" execute-action=""/>
- <popup-item item-id="10003" pos-id="" label-id="Shrink" icon-id="" tooltip-id="" accel-id="" toggle-id="false" execute-action=""/>
- </submenu>
- <endsubmenu />
- <popup-item item-id="1001" pos-id="" label-id="Automatic Update" icon-id="" tooltip-id="" accel-id="" toggle-id="false" execute-action=""/>
- <separator pos-id=""/>
- <popup-item item-id="1003" pos-id="" label-id="Colors - Size" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <separator pos-id=""/>
- <popup-item item-id="1005" pos-id="" label-id="Scalars Bar" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- </submenu>
- <endsubmenu />
- <separator pos-id="-1"/>
-</menu-item>
-
-<!-- ********************************* View (menubar) ********************************* -->
-<menu-item label-id="View" item-id="2" pos-id="">
- <submenu label-id="Display Mode" item-id="21" pos-id="">
- <popup-item item-id="211" pos-id="" label-id="Wireframe" icon-id="mesh_wireframe.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="212" pos-id="" label-id="Shading" icon-id="mesh_shading.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="213" pos-id="" label-id="Shrink" icon-id="mesh_shrink.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- </submenu>
- <endsubmenu />
- <separator pos-id=""/>
- <popup-item item-id="214" pos-id="" label-id="Update" icon-id="mesh_update.png" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
-</menu-item>
-
-<!-- ################################# POPUP MENU ################################# -->
-
-<popupmenu label-id="Popup for ObjectBrowser" context-id="" parent-id="ObjectBrowser" object-id="Mesh">
- <popup-item item-id="705" pos-id="" label-id="Edit Global Hyp." icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <separator pos-id=""/>
- <popup-item item-id="701" pos-id="" label-id="Compute" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="214" pos-id="" label-id="Update" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <separator pos-id=""/>
- <popup-item item-id="801" pos-id="" label-id="Create Group" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <separator pos-id=""/>
- <popup-item item-id="1101" pos-id="" label-id="Rename" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
-</popupmenu>
-
-<popupmenu label-id="Popup for ObjectBrowser" context-id="" parent-id="ObjectBrowser" object-id="SubMesh">
- <popup-item item-id="706" pos-id="" label-id="Edit Local Hyp." icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <separator pos-id=""/>
- <popup-item item-id="802" pos-id="" label-id="Construct Group" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <separator pos-id=""/>
- <popup-item item-id="1101" pos-id="" label-id="Rename" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
-</popupmenu>
-
-<popupmenu label-id="Popup for ObjectBrowser" context-id="" parent-id="ObjectBrowser" object-id="Hypothesis">
- <popup-item item-id="1100" pos-id="" label-id="Edit" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="1102" pos-id="" label-id="Unassign Hyp." icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="1101" pos-id="" label-id="Rename" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
-</popupmenu>
-
-<popupmenu label-id="Popup for ObjectBrowser" context-id="" parent-id="ObjectBrowser" object-id="Algorithm">
- <popup-item item-id="1102" pos-id="" label-id="Unassign Algo." icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="1101" pos-id="" label-id="Rename" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
-</popupmenu>
-
-
-<popupmenu label-id="Popup for Viewer" context-id="" parent-id="Viewer" object-id="Mesh">
- <popup-item item-id="214" pos-id="" label-id="Update" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <separator pos-id=""/>
- <submenu label-id="Properties" item-id="113" pos-id="">
- <submenu label-id="Display Mode" item-id="1131" pos-id="">
- <popup-item item-id="211" pos-id="" label-id="Wireframe" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="212" pos-id="" label-id="Shading" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="213" pos-id="" label-id="Shrink" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- </submenu>
- <endsubmenu />
- <separator pos-id=""/>
- <popup-item item-id="1132" pos-id="" label-id="Colors - Size" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="1133" pos-id="" label-id="Transparency" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- </submenu>
- <endsubmenu />
-</popupmenu>
-
-<popupmenu label-id="ScalarBar" context-id="" parent-id="Viewer" object-id="ScalarBar">
- <popup-item item-id="200" pos-id="" label-id="Erase" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="201" pos-id="" label-id="Edit" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
- <popup-item item-id="202" pos-id="" label-id="Update View" icon-id="" tooltip-id="" accel-id="" toggle-id="" execute-action=""/>
-</popupmenu>
-
-</menubar>
-
-<!-- ///////////////////////////////////// TOOLBARS ////////////////////////////////////// -->
-<toolbar label-id="Mesh Toolbar">
- <toolbutton-item item-id="703" pos-id="" label-id="Init" icon-id="mesh_init.png" tooltip-id="Global Hyp." accel-id="" toggle-id="" execute-action=""/>
- <toolbutton-item item-id="702" pos-id="" label-id="Add SubMesh" icon-id="mesh_add_sub.png" tooltip-id="Local Hyp." accel-id="" toggle-id="" execute-action=""/>
- <toolbutton-item item-id="704" pos-id="" label-id="Edit" icon-id="mesh_edit.png" tooltip-id="Edit Hyp." accel-id="" toggle-id="" execute-action=""/>
- <separatorTB/>
- <toolbutton-item item-id="701" pos-id="" label-id="Compute" icon-id="mesh_compute.png" tooltip-id="Compute" accel-id="" toggle-id="" execute-action=""/>
- <separatorTB/>
- <toolbutton-item item-id="900" pos-id="" label-id="Mesh Infos" icon-id="mesh_info.png" tooltip-id="Mesh Infos" accel-id="" toggle-id="" execute-action=""/>
-</toolbar>
-
-<toolbar label-id="Hypotheses Toolbar">
- <toolbutton-item item-id="5000" label-id="Create Hypothesis" icon-id="mesh_hypo_length.png" tooltip-id="Create Hypothesis" accel-id="" toggle-id="" execute-action=""/>
- <toolbutton-item item-id="5010" label-id="Create Algorithm" icon-id="mesh_algo_mefisto.png" tooltip-id="Create Algorithm" accel-id="" toggle-id="" execute-action=""/>
-</toolbar>
-
-<toolbar label-id="Controls toolbar">
- <toolbutton-item item-id="6001" label-id="Length" icon-id="mesh_length.png" tooltip-id="Length" accel-id="" toggle-id="" execute-action=""/>
- <toolbutton-item item-id="6002" label-id="Connectivity" icon-id="mesh_connectivity.png" tooltip-id="Connectivity" accel-id="" toggle-id="" execute-action=""/>
- <toolbutton-item item-id="6011" label-id="Area" icon-id="mesh_area.png" tooltip-id="Area" accel-id="" toggle-id="" execute-action=""/>
- <toolbutton-item item-id="6012" label-id="Taper" icon-id="mesh_taper.png" tooltip-id="Taper" accel-id="" toggle-id="" execute-action=""/>
- <toolbutton-item item-id="6013" label-id="Aspect Ratio" icon-id="mesh_aspect.png" tooltip-id="Aspect Ratio" accel-id="" toggle-id="" execute-action=""/>
- <toolbutton-item item-id="6014" label-id="Minimum angle" icon-id="mesh_angle.png" tooltip-id="Minimum angle" accel-id="" toggle-id="" execute-action=""/>
- <toolbutton-item item-id="6015" label-id="Warp" icon-id="mesh_wrap.png" tooltip-id="Warp" accel-id="" toggle-id="" execute-action=""/>
- <toolbutton-item item-id="6016" label-id="Skew" icon-id="mesh_skew.png" tooltip-id="Skew" accel-id="" toggle-id="" execute-action=""/>
-</toolbar>
-
-<toolbar label-id="Add/Remove toolbar">
- <toolbutton-item item-id="400" label-id="Node" icon-id="mesh_vertex.png" tooltip-id="Add Node" accel-id="" toggle-id="" execute-action=""/>
- <toolbutton-item item-id="401" label-id="Edge" icon-id="mesh_line.png" tooltip-id="Add Edge" accel-id="" toggle-id="" execute-action=""/>
- <toolbutton-item item-id="4021" label-id="Triangle" icon-id="mesh_triangle.png" tooltip-id="Add Triangle" accel-id="" toggle-id="" execute-action=""/>
- <toolbutton-item item-id="4022" label-id="Quadrangle" icon-id="mesh_quad.png" tooltip-id="Add Quadrangle" accel-id="" toggle-id="" execute-action=""/>
- <toolbutton-item item-id="4031" label-id="Tetrahedron" icon-id="mesh_tetra.png" tooltip-id="Add Tetrahedron" accel-id="" toggle-id="" execute-action=""/>
- <toolbutton-item item-id="4032" label-id="Hexahedron" icon-id="mesh_hexa.png" tooltip-id="Add Hexahedron" accel-id="" toggle-id="" execute-action=""/>
- <separatorTB/>
- <toolbutton-item item-id="4041" label-id="Nodes" icon-id="mesh_rem_node.png" tooltip-id="Remove Nodes" accel-id="" toggle-id="" execute-action=""/>
- <toolbutton-item item-id="4042" label-id="Elements" icon-id="mesh_rem_element.png" tooltip-id="Remove Elements" accel-id="" toggle-id="" execute-action=""/>
- <separatorTB/>
- <toolbutton-item item-id="4051" label-id="Nodes" icon-id="mesh_renumbering_nodes.png" tooltip-id="Renumbering Nodes" accel-id="" toggle-id="" execute-action=""/>
- <toolbutton-item item-id="4052" label-id="Elements" icon-id="mesh_renumbering_elements.png" tooltip-id="Renumbering Elements" accel-id="" toggle-id="" execute-action=""/>
-</toolbar>
-
-<toolbar label-id="Modification toolbar">
- <toolbutton-item item-id="405" label-id="Move Node" icon-id="mesh_move_node.png" tooltip-id="Move Node" accel-id="" toggle-id="" execute-action=""/>
- <toolbutton-item item-id="406" label-id="Orientation" icon-id="mesh_orientation.png" tooltip-id="Orientation" accel-id="" toggle-id="" execute-action=""/>
- <toolbutton-item item-id="407" label-id="Diagonal Inversion" icon-id="mesh_diagonal.png" tooltip-id="Diagonal Inversion" accel-id="" toggle-id="" execute-action=""/>
- <toolbutton-item item-id="408" label-id="Union of two triangles" icon-id="mesh_union2tri.png" tooltip-id="Union of two triangles" accel-id="" toggle-id="" execute-action=""/>
- <toolbutton-item item-id="406" label-id="Orientation" icon-id="mesh_orientation.png" tooltip-id="Orientation" accel-id="" toggle-id="" execute-action=""/>
- <toolbutton-item item-id="409" label-id="Union of triangles" icon-id="mesh_uniontri.png" tooltip-id="Union of triangles" accel-id="" toggle-id="" execute-action=""/>
- <toolbutton-item item-id="410" label-id="Cutting of quadrangles" icon-id="mesh_cutquad.png" tooltip-id="Cutting of quadrangles" accel-id="" toggle-id="" execute-action=""/>
- <toolbutton-item item-id="411" label-id="Smoothing" icon-id="mesh_smoothing.png" tooltip-id="Smoothing" accel-id="" toggle-id="" execute-action=""/>
- <toolbutton-item item-id="412" label-id="Extrusion" icon-id="mesh_extrusion.png" tooltip-id="Extrusion along a line" accel-id="" toggle-id="" execute-action=""/>
- <toolbutton-item item-id="413" label-id="Revolution" icon-id="mesh_revolution.png" tooltip-id="Revolution around an axis" accel-id="" toggle-id="" execute-action=""/>
-</toolbar>
-
-<toolbar label-id="Display Mode Toolbar">
- <toolbutton-item item-id="214" pos-id="" label-id="Update" icon-id="mesh_update.png" tooltip-id="Update View" accel-id="" toggle-id="" execute-action=""/>
- <separatorTB/>
- <toolbutton-item item-id="211" pos-id="" label-id="Wireframe" icon-id="mesh_wireframe.png" tooltip-id="Wireframe" accel-id="" toggle-id="" execute-action=""/>
- <toolbutton-item item-id="212" pos-id="" label-id="Shading" icon-id="mesh_shading.png" tooltip-id="shading" accel-id="" toggle-id="" execute-action=""/>
- <toolbutton-item item-id="213" pos-id="" label-id="Shrink" icon-id="mesh_shrink.png" tooltip-id="shrink" accel-id="" toggle-id="" execute-action=""/>
-</toolbar>
-
-</desktop>
-
-</application>
+++ /dev/null
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-#include "SMESH_ControlsDef.hxx"
-
-int main(int argc, char** argv)
-{
- using namespace SMESH::Controls;
- new MinimumAngle();
- new AspectRatio();
- new Warping();
- new Taper();
- new Skew();
- new Area();
- new Length();
- // new Length2D();
- new MultiConnection();
- // new MultiConnection2D();
- new FreeBorders();
- new LessThan();
- new MoreThan();
- new EqualTo();
- new LogicalNOT();
- new LogicalAND();
- new LogicalOR();
- new ManifoldPart();
-
- return 1;
-}
+++ /dev/null
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-#ifndef _SMESH_CONTROLS_HXX_
-#define _SMESH_CONTROLS_HXX_
-
-#include <boost/shared_ptr.hpp>
-
-namespace SMESH{
- namespace Controls{
-
- class Functor;
- typedef boost::shared_ptr<Functor> FunctorPtr;
-
-
- class NumericalFunctor;
- typedef boost::shared_ptr<NumericalFunctor> NumericalFunctorPtr;
-
-
- class Predicate;
- typedef boost::shared_ptr<Predicate> PredicatePtr;
-
- }
-}
-
-
-#endif
+++ /dev/null
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-#ifndef _SMESH_CONTROLSDEF_HXX_
-#define _SMESH_CONTROLSDEF_HXX_
-
-#include <set>
-#include <map>
-#include <vector>
-#include <boost/shared_ptr.hpp>
-#include <gp_XYZ.hxx>
-#include <Geom_Surface.hxx>
-#include <TColStd_SequenceOfInteger.hxx>
-#include <TColStd_MapOfInteger.hxx>
-#include <TCollection_AsciiString.hxx>
-
-#include "SMDSAbs_ElementType.hxx"
-#include "SMDS_MeshNode.hxx"
-
-#include "SMESH_Controls.hxx"
-
-class SMDS_MeshElement;
-class SMDS_MeshFace;
-class SMDS_MeshNode;
-class SMDS_Mesh;
-
-class SMESHDS_Mesh;
-class SMESHDS_SubMesh;
-
-class gp_Pnt;
-class TopoDS_Shape;
-
-
-namespace SMESH{
- namespace Controls{
-
- class TSequenceOfXYZ: public std::vector<gp_XYZ>
- {
- public:
- typedef std::vector<gp_XYZ> TSuperClass;
- TSequenceOfXYZ()
- {}
-
- TSequenceOfXYZ(size_type n):
- TSuperClass(n)
- {}
-
- TSequenceOfXYZ(size_type n, const value_type& t):
- TSuperClass(n,t)
- {}
-
- TSequenceOfXYZ(const TSequenceOfXYZ& theSequenceOfXYZ):
- TSuperClass(theSequenceOfXYZ)
- {}
-
- template <class InputIterator>
- TSequenceOfXYZ(InputIterator theBegin, InputIterator theEnd):
- TSuperClass(theBegin,theEnd)
- {}
-
- TSequenceOfXYZ& operator=(const TSequenceOfXYZ& theSequenceOfXYZ){
- TSuperClass::operator=(theSequenceOfXYZ);
- return *this;
- }
-
- reference operator()(size_type n){
- return TSuperClass::operator[](n-1);
- }
-
- const_reference operator()(size_type n) const{
- return TSuperClass::operator[](n-1);
- }
-
- private:
- reference operator[](size_type n);
-
- const_reference operator[](size_type n) const;
- };
-
- /*
- Class : Functor
- Description : Root of all Functors
- */
- class Functor
- {
- public:
- ~Functor(){}
- virtual void SetMesh( const SMDS_Mesh* theMesh ) = 0;
- virtual SMDSAbs_ElementType GetType() const = 0;
- };
-
- /*
- Class : NumericalFunctor
- Description : Root of all Functors returning numeric value
- */
- class NumericalFunctor: public virtual Functor{
- public:
- NumericalFunctor();
- virtual void SetMesh( const SMDS_Mesh* theMesh );
- virtual double GetValue( long theElementId );
- virtual double GetValue(const TSequenceOfXYZ& thePoints) { return -1.0;};
- virtual SMDSAbs_ElementType GetType() const = 0;
- virtual double GetBadRate( double Value, int nbNodes ) const = 0;
- long GetPrecision() const;
- void SetPrecision( const long thePrecision );
-
- bool GetPoints(const int theId,
- TSequenceOfXYZ& theRes) const;
- static bool GetPoints(const SMDS_MeshElement* theElem,
- TSequenceOfXYZ& theRes);
- protected:
- const SMDS_Mesh* myMesh;
- long myPrecision;
- };
-
-
- /*
- Class : Volume
- Description : Functor calculating volume of 3D mesh element
- */
- class Volume: public virtual NumericalFunctor{
- public:
- virtual double GetValue( long theElementId );
- //virtual double GetValue( const TSequenceOfXYZ& thePoints );
- virtual double GetBadRate( double Value, int nbNodes ) const;
- virtual SMDSAbs_ElementType GetType() const;
- };
-
-
- /*
- Class : SMESH_MinimumAngle
- Description : Functor for calculation of minimum angle
- */
- class MinimumAngle: public virtual NumericalFunctor{
- public:
- virtual double GetValue( const TSequenceOfXYZ& thePoints );
- virtual double GetBadRate( double Value, int nbNodes ) const;
- virtual SMDSAbs_ElementType GetType() const;
- };
-
-
- /*
- Class : AspectRatio
- Description : Functor for calculating aspect ratio
- */
- class AspectRatio: public virtual NumericalFunctor{
- public:
- virtual double GetValue( const TSequenceOfXYZ& thePoints );
- virtual double GetBadRate( double Value, int nbNodes ) const;
- virtual SMDSAbs_ElementType GetType() const;
- };
-
-
- /*
- Class : AspectRatio3D
- Description : Functor for calculating aspect ratio of 3D elems.
- */
- class AspectRatio3D: public virtual NumericalFunctor{
- public:
- virtual double GetValue( const TSequenceOfXYZ& thePoints );
- virtual double GetBadRate( double Value, int nbNodes ) const;
- virtual SMDSAbs_ElementType GetType() const;
- };
-
-
- /*
- Class : Warping
- Description : Functor for calculating warping
- */
- class Warping: public virtual NumericalFunctor{
- public:
- virtual double GetValue( const TSequenceOfXYZ& thePoints );
- virtual double GetBadRate( double Value, int nbNodes ) const;
- virtual SMDSAbs_ElementType GetType() const;
-
- private:
- double ComputeA( const gp_XYZ&, const gp_XYZ&, const gp_XYZ&, const gp_XYZ& ) const;
- };
-
-
- /*
- Class : Taper
- Description : Functor for calculating taper
- */
- class Taper: public virtual NumericalFunctor{
- public:
- virtual double GetValue( const TSequenceOfXYZ& thePoints );
- virtual double GetBadRate( double Value, int nbNodes ) const;
- virtual SMDSAbs_ElementType GetType() const;
- };
-
-
- /*
- Class : Skew
- Description : Functor for calculating skew in degrees
- */
- class Skew: public virtual NumericalFunctor{
- public:
- virtual double GetValue( const TSequenceOfXYZ& thePoints );
- virtual double GetBadRate( double Value, int nbNodes ) const;
- virtual SMDSAbs_ElementType GetType() const;
- };
-
-
- /*
- Class : Area
- Description : Functor for calculating area
- */
- class Area: public virtual NumericalFunctor{
- public:
- virtual double GetValue( const TSequenceOfXYZ& thePoints );
- virtual double GetBadRate( double Value, int nbNodes ) const;
- virtual SMDSAbs_ElementType GetType() const;
- };
-
-
- /*
- Class : Length
- Description : Functor for calculating length of edge
- */
- class Length: public virtual NumericalFunctor{
- public:
- virtual double GetValue( const TSequenceOfXYZ& thePoints );
- virtual double GetBadRate( double Value, int nbNodes ) const;
- virtual SMDSAbs_ElementType GetType() const;
- };
-
- /*
- Class : Length2D
- Description : Functor for calculating length of edge
- */
- class Length2D: public virtual NumericalFunctor{
- public:
- virtual double GetValue( long theElementId );
- virtual double GetBadRate( double Value, int nbNodes ) const;
- virtual SMDSAbs_ElementType GetType() const;
- struct Value{
- double myLength;
- long myPntId[2];
- Value(double theLength, long thePntId1, long thePntId2);
- bool operator<(const Value& x) const;
- };
- typedef std::set<Value> TValues;
- void GetValues(TValues& theValues);
-
- };
- typedef boost::shared_ptr<Length2D> Length2DPtr;
-
- /*
- Class : MultiConnection
- Description : Functor for calculating number of faces conneted to the edge
- */
- class MultiConnection: public virtual NumericalFunctor{
- public:
- virtual double GetValue( long theElementId );
- virtual double GetValue( const TSequenceOfXYZ& thePoints );
- virtual double GetBadRate( double Value, int nbNodes ) const;
- virtual SMDSAbs_ElementType GetType() const;
- };
-
- /*
- Class : MultiConnection2D
- Description : Functor for calculating number of faces conneted to the edge
- */
- class MultiConnection2D: public virtual NumericalFunctor{
- public:
- virtual double GetValue( long theElementId );
- virtual double GetValue( const TSequenceOfXYZ& thePoints );
- virtual double GetBadRate( double Value, int nbNodes ) const;
- virtual SMDSAbs_ElementType GetType() const;
- struct Value{
- long myPntId[2];
- Value(long thePntId1, long thePntId2);
- bool operator<(const Value& x) const;
- };
- typedef std::map<Value,int> MValues;
-
- void GetValues(MValues& theValues);
- };
- typedef boost::shared_ptr<MultiConnection2D> MultiConnection2DPtr;
- /*
- PREDICATES
- */
- /*
- Class : Predicate
- Description : Base class for all predicates
- */
- class Predicate: public virtual Functor{
- public:
- virtual bool IsSatisfy( long theElementId ) = 0;
- virtual SMDSAbs_ElementType GetType() const = 0;
- };
-
-
-
- /*
- Class : FreeBorders
- Description : Predicate for free borders
- */
- class FreeBorders: public virtual Predicate{
- public:
- FreeBorders();
- virtual void SetMesh( const SMDS_Mesh* theMesh );
- virtual bool IsSatisfy( long theElementId );
- virtual SMDSAbs_ElementType GetType() const;
-
- protected:
- const SMDS_Mesh* myMesh;
- };
-
-
- /*
- Class : BadOrientedVolume
- Description : Predicate bad oriented volumes
- */
- class BadOrientedVolume: public virtual Predicate{
- public:
- BadOrientedVolume();
- virtual void SetMesh( const SMDS_Mesh* theMesh );
- virtual bool IsSatisfy( long theElementId );
- virtual SMDSAbs_ElementType GetType() const;
-
- protected:
- const SMDS_Mesh* myMesh;
- };
-
-
- /*
- Class : FreeEdges
- Description : Predicate for free Edges
- */
- class FreeEdges: public virtual Predicate{
- public:
- FreeEdges();
- virtual void SetMesh( const SMDS_Mesh* theMesh );
- virtual bool IsSatisfy( long theElementId );
- virtual SMDSAbs_ElementType GetType() const;
- static bool IsFreeEdge( const SMDS_MeshNode** theNodes, const int theFaceId );
- typedef long TElemId;
- struct Border{
- TElemId myElemId;
- TElemId myPntId[2];
- Border(long theElemId, long thePntId1, long thePntId2);
- bool operator<(const Border& x) const;
- };
- typedef std::set<Border> TBorders;
- void GetBoreders(TBorders& theBorders);
-
- protected:
- const SMDS_Mesh* myMesh;
- };
- typedef boost::shared_ptr<FreeEdges> FreeEdgesPtr;
-
-
- /*
- Class : RangeOfIds
- Description : Predicate for Range of Ids.
- Range may be specified with two ways.
- 1. Using AddToRange method
- 2. With SetRangeStr method. Parameter of this method is a string
- like as "1,2,3,50-60,63,67,70-"
- */
- class RangeOfIds: public virtual Predicate
- {
- public:
- RangeOfIds();
- virtual void SetMesh( const SMDS_Mesh* theMesh );
- virtual bool IsSatisfy( long theNodeId );
- virtual SMDSAbs_ElementType GetType() const;
- virtual void SetType( SMDSAbs_ElementType theType );
-
- bool AddToRange( long theEntityId );
- void GetRangeStr( TCollection_AsciiString& );
- bool SetRangeStr( const TCollection_AsciiString& );
-
- protected:
- const SMDS_Mesh* myMesh;
-
- TColStd_SequenceOfInteger myMin;
- TColStd_SequenceOfInteger myMax;
- TColStd_MapOfInteger myIds;
-
- SMDSAbs_ElementType myType;
- };
-
- typedef boost::shared_ptr<RangeOfIds> RangeOfIdsPtr;
-
-
- /*
- Class : Comparator
- Description : Base class for comparators
- */
- class Comparator: public virtual Predicate{
- public:
- Comparator();
- virtual ~Comparator();
- virtual void SetMesh( const SMDS_Mesh* theMesh );
- virtual void SetMargin(double theValue);
- virtual void SetNumFunctor(NumericalFunctorPtr theFunct);
- virtual bool IsSatisfy( long theElementId ) = 0;
- virtual SMDSAbs_ElementType GetType() const;
- double GetMargin();
-
- protected:
- double myMargin;
- NumericalFunctorPtr myFunctor;
- };
- typedef boost::shared_ptr<Comparator> ComparatorPtr;
-
-
- /*
- Class : LessThan
- Description : Comparator "<"
- */
- class LessThan: public virtual Comparator{
- public:
- virtual bool IsSatisfy( long theElementId );
- };
-
-
- /*
- Class : MoreThan
- Description : Comparator ">"
- */
- class MoreThan: public virtual Comparator{
- public:
- virtual bool IsSatisfy( long theElementId );
- };
-
-
- /*
- Class : EqualTo
- Description : Comparator "="
- */
- class EqualTo: public virtual Comparator{
- public:
- EqualTo();
- virtual bool IsSatisfy( long theElementId );
- virtual void SetTolerance( double theTol );
- virtual double GetTolerance();
-
- private:
- double myToler;
- };
- typedef boost::shared_ptr<EqualTo> EqualToPtr;
-
-
- /*
- Class : LogicalNOT
- Description : Logical NOT predicate
- */
- class LogicalNOT: public virtual Predicate{
- public:
- LogicalNOT();
- virtual ~LogicalNOT();
- virtual bool IsSatisfy( long theElementId );
- virtual void SetMesh( const SMDS_Mesh* theMesh );
- virtual void SetPredicate(PredicatePtr thePred);
- virtual SMDSAbs_ElementType GetType() const;
-
- private:
- PredicatePtr myPredicate;
- };
- typedef boost::shared_ptr<LogicalNOT> LogicalNOTPtr;
-
-
- /*
- Class : LogicalBinary
- Description : Base class for binary logical predicate
- */
- class LogicalBinary: public virtual Predicate{
- public:
- LogicalBinary();
- virtual ~LogicalBinary();
- virtual void SetMesh( const SMDS_Mesh* theMesh );
- virtual void SetPredicate1(PredicatePtr thePred);
- virtual void SetPredicate2(PredicatePtr thePred);
- virtual SMDSAbs_ElementType GetType() const;
-
- protected:
- PredicatePtr myPredicate1;
- PredicatePtr myPredicate2;
- };
- typedef boost::shared_ptr<LogicalBinary> LogicalBinaryPtr;
-
-
- /*
- Class : LogicalAND
- Description : Logical AND
- */
- class LogicalAND: public virtual LogicalBinary{
- public:
- virtual bool IsSatisfy( long theElementId );
- };
-
-
- /*
- Class : LogicalOR
- Description : Logical OR
- */
- class LogicalOR: public virtual LogicalBinary{
- public:
- virtual bool IsSatisfy( long theElementId );
- };
-
-
- /*
- Class : ManifoldPart
- Description : Predicate for manifold part of mesh
- */
- class ManifoldPart: public virtual Predicate{
- public:
-
- /* internal class for algorithm uses */
- class Link
- {
- public:
- Link( SMDS_MeshNode* theNode1,
- SMDS_MeshNode* theNode2 );
- ~Link();
-
- bool IsEqual( const ManifoldPart::Link& theLink ) const;
- bool operator<(const ManifoldPart::Link& x) const;
-
- SMDS_MeshNode* myNode1;
- SMDS_MeshNode* myNode2;
- };
-
- bool IsEqual( const ManifoldPart::Link& theLink1,
- const ManifoldPart::Link& theLink2 );
-
- typedef std::set<ManifoldPart::Link> TMapOfLink;
- typedef std::vector<SMDS_MeshFace*> TVectorOfFacePtr;
- typedef std::vector<ManifoldPart::Link> TVectorOfLink;
- typedef std::map<SMDS_MeshFace*,int> TDataMapFacePtrInt;
- typedef std::map<ManifoldPart::Link,SMDS_MeshFace*> TDataMapOfLinkFacePtr;
-
- ManifoldPart();
- ~ManifoldPart();
- virtual void SetMesh( const SMDS_Mesh* theMesh );
- // inoke when all parameters already set
- virtual bool IsSatisfy( long theElementId );
- virtual SMDSAbs_ElementType GetType() const;
-
- void SetAngleTolerance( const double theAngToler );
- double GetAngleTolerance() const;
- void SetIsOnlyManifold( const bool theIsOnly );
- void SetStartElem( const long theStartElemId );
-
- private:
- bool process();
- bool findConnected( const TDataMapFacePtrInt& theAllFacePtrInt,
- SMDS_MeshFace* theStartFace,
- TMapOfLink& theNonManifold,
- TColStd_MapOfInteger& theResFaces );
- bool isInPlane( const SMDS_MeshFace* theFace1,
- const SMDS_MeshFace* theFace2 );
- void expandBoundary( TMapOfLink& theMapOfBoundary,
- TVectorOfLink& theSeqOfBoundary,
- TDataMapOfLinkFacePtr& theDMapLinkFacePtr,
- TMapOfLink& theNonManifold,
- SMDS_MeshFace* theNextFace ) const;
-
- void getFacesByLink( const Link& theLink,
- TVectorOfFacePtr& theFaces ) const;
-
- private:
- const SMDS_Mesh* myMesh;
- TColStd_MapOfInteger myMapIds;
- TColStd_MapOfInteger myMapBadGeomIds;
- TVectorOfFacePtr myAllFacePtr;
- TDataMapFacePtrInt myAllFacePtrIntDMap;
- double myAngToler;
- bool myIsOnlyManifold;
- long myStartElemId;
-
- };
- typedef boost::shared_ptr<ManifoldPart> ManifoldPartPtr;
-
-
- /*
- Class : ElementsOnSurface
- Description : Predicate elements that lying on indicated surface
- (plane or cylinder)
- */
- class ElementsOnSurface : public virtual Predicate {
- public:
- ElementsOnSurface();
- ~ElementsOnSurface();
- virtual void SetMesh( const SMDS_Mesh* theMesh );
- virtual bool IsSatisfy( long theElementId );
- virtual SMDSAbs_ElementType GetType() const;
-
- void SetTolerance( const double theToler );
- double GetTolerance() const;
- void SetSurface( const TopoDS_Shape& theShape,
- const SMDSAbs_ElementType theType );
-
- private:
- void process();
- void process( const SMDS_MeshElement* theElem );
- bool isOnSurface( const SMDS_MeshNode* theNode ) const;
-
- private:
- const SMDS_Mesh* myMesh;
- TColStd_MapOfInteger myIds;
- SMDSAbs_ElementType myType;
- Handle(Geom_Surface) mySurf;
- double myToler;
- };
-
- typedef boost::shared_ptr<ElementsOnSurface> ElementsOnSurfacePtr;
-
-
- /*
- FILTER
- */
- class Filter{
- public:
- Filter();
- virtual ~Filter();
- virtual void SetPredicate(PredicatePtr thePred);
-
- typedef std::vector<long> TIdSequence;
-
- virtual
- void
- GetElementsId( const SMDS_Mesh* theMesh,
- TIdSequence& theSequence );
-
- static
- void
- GetElementsId( const SMDS_Mesh* theMesh,
- PredicatePtr thePredicate,
- TIdSequence& theSequence );
-
- protected:
- PredicatePtr myPredicate;
- };
- };
-};
-
-
-#endif
+++ /dev/null
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-#include "Driver_Document.h"
-
-Driver_Document::Driver_Document():
- myDocument(NULL)
-{}
-
-
-void Driver_Document::SetFile(const std::string& theFileName)
-{
- myFile = theFileName;
-}
-
-
-void Driver_Document::SetDocument(SMESHDS_Document * theDocument)
-{
- myDocument = theDocument;
-}
+++ /dev/null
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-#ifndef _INCLUDE_DRIVER_DOCUMENT
-#define _INCLUDE_DRIVER_DOCUMENT
-
-#include <string>
-
-class SMESHDS_Document;
-
-class Driver_Document
-{
- public:
- Driver_Document();
- virtual ~Driver_Document(){}
-
- virtual void Perform() = 0;
- void SetFile(const std::string& theFileName);
- void SetDocument(SMESHDS_Document *theDocument);
-
- protected:
- SMESHDS_Document * myDocument;
- std::string myFile;
-
-};
-
-
-#endif
+++ /dev/null
-// SMESH Driver : implementaion of driver for reading and writing
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : Mesh_Reader.cxx
-// Module : SMESH
-
-#include "Driver_Mesh.h"
-
-using namespace std;
-
-Driver_Mesh::Driver_Mesh():
- myFile(""),
- myMeshId(-1)
-{}
-
-
-void Driver_Mesh::SetMeshId(int theMeshId)
-{
- myMeshId = theMeshId;
-}
-
-
-void Driver_Mesh::SetFile(const std::string& theFileName)
-{
- myFile = theFileName;
-}
+++ /dev/null
-// SMESH Driver : implementaion of driver for reading and writing
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : Mesh_Reader.h
-// Module : SMESH
-
-#ifndef _INCLUDE_DRIVER_MESH
-#define _INCLUDE_DRIVER_MESH
-
-#include <string>
-
-#if defined WNT && defined WIN32 && defined DRIVER_EXPORTS
-#define DRIVER_WNT_EXPORT __declspec( dllexport )
-#else
-#define DRIVER_WNT_EXPORT
-#endif
-
-class DRIVER_WNT_EXPORT Driver_Mesh
-{
- public:
- Driver_Mesh();
- virtual ~Driver_Mesh(){}
-
- enum Status {
- DRS_OK,
- DRS_EMPTY, // a file contains no mesh with the given name
- DRS_WARN_RENUMBER, // a file has overlapped ranges of element numbers,
- // so the numbers from the file are ignored
- DRS_WARN_SKIP_ELEM, // some elements were skipped due to incorrect file data
- DRS_FAIL // general failure (exception etc.)
- };
-
- virtual Status Perform() = 0;
- void SetMeshId(int theMeshId);
- void SetFile(const std::string& theFileName);
-
- protected:
- std::string myFile;
- int myMeshId;
-
-};
-
-#endif
+++ /dev/null
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-#include "Driver_SMDS_Mesh.h"
-
-using namespace std;
-
-Driver_SMDS_Mesh::Driver_SMDS_Mesh():
- myMesh(NULL)
-{}
-
-void Driver_SMDS_Mesh::SetMesh(SMDS_Mesh *theMesh)
-{
- myMesh = theMesh;
-}
+++ /dev/null
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-#ifndef _INCLUDE_DRIVER_SMDS_MESH
-#define _INCLUDE_DRIVER_SMDS_MESH
-
-#include "Driver_Mesh.h"
-
-class SMDS_Mesh;
-
-class Driver_SMDS_Mesh: public Driver_Mesh
-{
- public:
- Driver_SMDS_Mesh();
- void SetMesh(SMDS_Mesh *theMesh);
-
- protected:
- SMDS_Mesh *myMesh;
-
-};
-
-#endif
+++ /dev/null
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-#include "Driver_SMESHDS_Mesh.h"
-
-using namespace std;
-
-Driver_SMESHDS_Mesh::Driver_SMESHDS_Mesh():
- myMesh(NULL)
-{}
-
-void Driver_SMESHDS_Mesh::SetMesh(SMESHDS_Mesh *theMesh)
-{
- myMesh = theMesh;
-}
+++ /dev/null
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-#ifndef _INCLUDE_DRIVER_SMESHDS_MESH
-#define _INCLUDE_DRIVER_SMESHDS_MESH
-
-#include "Driver_Mesh.h"
-
-class SMESHDS_Mesh;
-
-#if defined WNT && defined WIN32 && defined DRIVER_EXPORTS
-#define DRIVER_WNT_EXPORT __declspec( dllexport )
-#else
-#define DRIVER_WNT_EXPORT
-#endif
-
-class DRIVER_WNT_EXPORT Driver_SMESHDS_Mesh: public Driver_Mesh
-{
- public:
- Driver_SMESHDS_Mesh();
- void SetMesh(SMESHDS_Mesh *theMesh);
-
- protected:
- SMESHDS_Mesh *myMesh;
-
-};
-
-#endif
+++ /dev/null
-# SMESH Driver : implementaion of driver for reading and writing
-#
-# Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-#
-# See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-#
-#
-#
-# File : Makefile.in
-# Author : Marc Tajchman (CEA)
-# Module : SMESH
-# $Header$
-
-top_srcdir=@top_srcdir@
-top_builddir=../..
-srcdir=@srcdir@
-VPATH=.:@srcdir@
-
-
-@COMMENCE@
-
-# header files
-EXPORT_HEADERS= Driver_Document.h Driver_Mesh.h \
- Driver_SMDS_Mesh.h Driver_SMESHDS_Mesh.h
-
-# Libraries targets
-LIB = libMeshDriver.la
-LIB_SRC = Driver_Document.cxx Driver_Mesh.cxx \
- Driver_SMDS_Mesh.cxx Driver_SMESHDS_Mesh.cxx
-
-LIB_CLIENT_IDL =
-
-LIB_SERVER_IDL =
-
-# additionnal information to compil and link file
-CPPFLAGS +=
-CXXFLAGS +=
-
-LDFLAGS += $(OCC_KERNEL_LIBS) -lTKTopAlgo -lSMESHDS -L${KERNEL_ROOT_DIR}/lib/salome -lOpUtil
-
-
-@CONCLUDE@
-
-
-
+++ /dev/null
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-#include "DriverDAT_R_SMDS_Mesh.h"
-#include "DriverDAT_W_SMDS_Mesh.h"
-
-int main(int argc, char** argv)
-{
- DriverDAT_R_SMDS_Mesh aR;
- DriverDAT_W_SMDS_Mesh aW;
- return 1;
-}
+++ /dev/null
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-#include <stdio.h>
-
-#include "DriverDAT_R_SMDS_Mesh.h"
-#include "SMDS_Mesh.hxx"
-
-#include "utilities.h"
-
-using namespace std;
-
-Driver_Mesh::Status DriverDAT_R_SMDS_Mesh::Perform()
-{
- Status aResult = DRS_OK;
-
- int i, j;
- int nbNodes, nbCells;
- int intNumPoint;
- float coordX, coordY, coordZ;
- int nbNoeuds;
-
- int intNumMaille, Degre;
- int ValElement;
- int ValDegre;
- int NoeudsMaille[20];
- int NoeudMaille;
-
- bool ok;
-
- MESSAGE("in DriverDAT_R_SMDS_Mesh::Read()");
- /****************************************************************************
- * OUVERTURE DU FICHIER EN LECTURE *
- ****************************************************************************/
- char *file2Read = (char *)myFile.c_str();
- FILE* aFileId = fopen(file2Read, "r");
- if (aFileId < 0) {
- fprintf(stderr, ">> ERREUR : ouverture du fichier %s \n", file2Read);
- return DRS_FAIL;
- }
-
- fscanf(aFileId, "%d %d\n", &nbNodes, &nbCells);
-
- /****************************************************************************
- * LECTURE DES NOEUDS *
- ****************************************************************************/
- fprintf(stdout, "\n(************************)\n");
- fprintf(stdout, "(* NOEUDS DU MAILLAGE : *)\n");
- fprintf(stdout, "(************************)\n");
-
- for (i = 0; i < nbNodes; i++){
- fscanf(aFileId, "%d %e %e %e\n", &intNumPoint, &coordX, &coordY, &coordZ);
- ok = myMesh->AddNodeWithID(coordX, coordY, coordZ, intNumPoint);
- }
-
- fprintf(stdout, "%d noeuds\n", myMesh->NbNodes());
- /****************************************************************************
- * LECTURE DES ELEMENTS *
- ****************************************************************************/
- fprintf(stdout, "\n(**************************)\n");
- fprintf(stdout, "(* ELEMENTS DU MAILLAGE : *)\n");
- fprintf(stdout, "(**************************)");
-
- fprintf(stdout, "%d elements\n", nbCells);
-
- for (i = 0; i < nbCells; i++) {
- fscanf(aFileId, "%d %d", &intNumMaille, &ValElement);
- Degre = abs(ValElement / 100);
- nbNoeuds = ValElement - (Degre * 100);
-
- // Recuperation des noeuds de la maille
- for (j = 0; j < nbNoeuds; j++) {
- fscanf(aFileId, "%d", &NoeudMaille);
- NoeudsMaille[j] = NoeudMaille;
- }
-
- // Analyse des cas de cellules
- switch (ValElement) {
- case 102:
- case 103:
- ValDegre = 3;
- nbNoeuds = 2;
- ok = myMesh->AddEdgeWithID(NoeudsMaille[0], NoeudsMaille[1],
- intNumMaille);
- break;
- case 204:
- case 208:
- ValDegre = 9;
- nbNoeuds = 4;
- ok = myMesh->AddFaceWithID(NoeudsMaille[0], NoeudsMaille[1],
- NoeudsMaille[2], NoeudsMaille[3],
- intNumMaille);
- break;
- case 203:
- case 206:
- ValDegre = 5;
- nbNoeuds = 3;
- ok = myMesh->AddFaceWithID(NoeudsMaille[0], NoeudsMaille[1],
- NoeudsMaille[2], intNumMaille);
- break;
- case 308:
- case 320:
- ValDegre = 12;
- nbNoeuds = 8;
- if (ValElement == 320){
- //A voir, correspondance VTK
- NoeudsMaille[4] = NoeudsMaille[8];
- NoeudsMaille[5] = NoeudsMaille[9];
- NoeudsMaille[6] = NoeudsMaille[10];
- NoeudsMaille[7] = NoeudsMaille[11];
- }
- ok = myMesh->AddVolumeWithID(NoeudsMaille[0], NoeudsMaille[1],
- NoeudsMaille[2], NoeudsMaille[3],
- NoeudsMaille[4], NoeudsMaille[5],
- NoeudsMaille[6], NoeudsMaille[7],
- intNumMaille);
- break;
- case 304:
- case 310:
- ValDegre = 10;
- nbNoeuds = 4;
- if (ValElement == 310)
- NoeudsMaille[3] = NoeudsMaille[6];
- ok = myMesh->AddVolumeWithID(NoeudsMaille[0], NoeudsMaille[1],
- NoeudsMaille[2], NoeudsMaille[3],
- intNumMaille);
- break;
- case 306:
- case 315:
- ValDegre = 12;
- nbNoeuds = 8;
- if (ValElement == 315) {
- NoeudsMaille[3] = NoeudsMaille[6];
- NoeudsMaille[4] = NoeudsMaille[7];
- NoeudsMaille[5] = NoeudsMaille[8];
- }
- NoeudsMaille[7] = NoeudsMaille[5];
- NoeudsMaille[6] = NoeudsMaille[5];
- NoeudsMaille[5] = NoeudsMaille[4];
- NoeudsMaille[4] = NoeudsMaille[3];
- NoeudsMaille[3] = NoeudsMaille[2];
- ok = myMesh->AddVolumeWithID(NoeudsMaille[0], NoeudsMaille[1],
- NoeudsMaille[2], NoeudsMaille[3],
- NoeudsMaille[4], NoeudsMaille[5],
- intNumMaille);
- break;
- }
- }
- /****************************************************************************
- * FERMETURE DU FICHIER *
- ****************************************************************************/
- fclose(aFileId);
- return aResult;
-}
+++ /dev/null
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-#ifndef _INCLUDE_DRIVERDAT_R_SMDS_MESH
-#define _INCLUDE_DRIVERDAT_R_SMDS_MESH
-
-#include "Driver_SMDS_Mesh.h"
-
-class DriverDAT_R_SMDS_Mesh: public Driver_SMDS_Mesh
-{
- public:
- virtual Status Perform();
-};
-
-#endif
+++ /dev/null
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-#include "DriverDAT_R_SMESHDS_Document.h"
+++ /dev/null
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-#ifndef _INCLUDE_DRIVERDAT_R_SMESHDS_DOCUMENT
-#define _INCLUDE_DRIVERDAT_R_SMESHDS_DOCUMENT
-
-#include "Driver_Document.h"
-
-class DriverDAT_R_SMESHDS_Document : public Driver_Document
-{};
-
-#endif
+++ /dev/null
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-#include "DriverDAT_R_SMESHDS_Mesh.h"
+++ /dev/null
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-#ifndef _INCLUDE_DRIVERDAT_R_SMESHDS_MESH
-#define _INCLUDE_DRIVERDAT_R_SMESHDS_MESH
-
-#include "Driver_SMESHDS_Mesh.h"
-
-class DriverDAT_R_SMESHDS_Mesh: public Driver_SMESHDS_Mesh
-{};
-
-#endif
+++ /dev/null
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-#include <stdio.h>
-
-#include "DriverDAT_W_SMDS_Mesh.h"
-
-#include "SMDS_Mesh.hxx"
-
-#include "utilities.h"
-
-using namespace std;
-
-Driver_Mesh::Status DriverDAT_W_SMDS_Mesh::Perform()
-{
- Status aResult = DRS_OK;
-
- int nbNodes, nbCells;
- int i;
-
- char *file2Read = (char *)myFile.c_str();
- FILE* aFileId = fopen(file2Read, "w+");
- if (aFileId < 0) {
- fprintf(stderr, ">> ERREUR : ouverture du fichier %s \n", file2Read);
- return DRS_FAIL;
- }
- SCRUTE(myMesh);
- /****************************************************************************
- * NOMBRES D'OBJETS *
- ****************************************************************************/
- fprintf(stdout, "\n(****************************)\n");
- fprintf(stdout, "(* INFORMATIONS GENERALES : *)\n");
- fprintf(stdout, "(****************************)\n");
-
- /* Combien de noeuds ? */
- nbNodes = myMesh->NbNodes();
-
- /* Combien de mailles, faces ou aretes ? */
- int nb_of_nodes, nb_of_edges, nb_of_faces, nb_of_volumes;
- nb_of_edges = myMesh->NbEdges();
- nb_of_faces = myMesh->NbFaces();
- nb_of_volumes = myMesh->NbVolumes();
- nbCells = nb_of_edges + nb_of_faces + nb_of_volumes;
- SCRUTE(nb_of_edges);
- SCRUTE(nb_of_faces);
- SCRUTE(nb_of_volumes);
-
- fprintf(stdout, "%d %d\n", nbNodes, nbCells);
- fprintf(aFileId, "%d %d\n", nbNodes, nbCells);
-
- /****************************************************************************
- * ECRITURE DES NOEUDS *
- ****************************************************************************/
- fprintf(stdout, "\n(************************)\n");
- fprintf(stdout, "(* NOEUDS DU MAILLAGE : *)\n");
- fprintf(stdout, "(************************)\n");
-
- SMDS_NodeIteratorPtr itNodes=myMesh->nodesIterator();
- while(itNodes->more()){
- const SMDS_MeshNode * node = itNodes->next();
- fprintf(aFileId, "%d %e %e %e\n", node->GetID(), node->X(), node->Y(), node->Z());
- }
-
- /****************************************************************************
- * ECRITURE DES ELEMENTS *
- ****************************************************************************/
- fprintf(stdout, "\n(**************************)\n");
- fprintf(stdout, "(* ELEMENTS DU MAILLAGE : *)\n");
- fprintf(stdout, "(**************************)");
- /* Ecriture des connectivites, noms, numeros des mailles */
-
- SMDS_EdgeIteratorPtr itEdges=myMesh->edgesIterator();
- while(itEdges->more()){
- const SMDS_MeshElement * elem = itEdges->next();
- switch (elem->NbNodes()) {
- case 2:
- fprintf(aFileId, "%d %d ", elem->GetID(), 102);
- break;
- case 3:
- fprintf(aFileId, "%d %d ", elem->GetID(), 103);
- break;
- }
- SMDS_ElemIteratorPtr it=elem->nodesIterator();
- while(it->more())
- fprintf(aFileId, "%d ", it->next()->GetID());
- fprintf(aFileId, "\n");
- }
-
- SMDS_FaceIteratorPtr itFaces=myMesh->facesIterator();
- while(itFaces->more()){
- const SMDS_MeshElement * elem = itFaces->next();
- switch (elem->NbNodes()) {
- case 3:
- fprintf(aFileId, "%d %d ", elem->GetID(), 203);
- break;
- case 4:
- fprintf(aFileId, "%d %d ", elem->GetID(), 204);
- break;
- case 6:
- fprintf(aFileId, "%d %d ", elem->GetID(), 206);
- break;
- }
- SMDS_ElemIteratorPtr it=elem->nodesIterator();
- while(it->more())
- fprintf(aFileId, "%d ", it->next()->GetID());
- fprintf(aFileId, "\n");
- }
-
- SMDS_VolumeIteratorPtr itVolumes=myMesh->volumesIterator();
- while(itVolumes->more()){
- const SMDS_MeshElement * elem = itVolumes->next();
- switch (elem->NbNodes()) {
- case 8:
- fprintf(aFileId, "%d %d ", elem->GetID(), 308);
- break;
- }
-
- SMDS_ElemIteratorPtr it=elem->nodesIterator();
- while(it->more())
- fprintf(aFileId, "%d ", it->next()->GetID());
-
- fprintf(aFileId, "\n");
- }
-
- fclose(aFileId);
-
- return aResult;
-}
+++ /dev/null
-// SMESH DriverDAT : driver to read and write 'dat' files
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : DriverDAT_W_SMDS_Mesh.h
-// Module : SMESH
-
-#ifndef _INCLUDE_DRIVERDAT_W_SMDS_MESH
-#define _INCLUDE_DRIVERDAT_W_SMDS_MESH
-
-#include "Driver_SMDS_Mesh.h"
-
-class DriverDAT_W_SMDS_Mesh: public Driver_SMDS_Mesh
-{
- public:
- virtual Status Perform();
-};
-
-#endif
+++ /dev/null
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-#include "DriverDAT_W_SMESHDS_Document.h"
+++ /dev/null
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-#ifndef _INCLUDE_DRIVERDAT_W_SMESHDS_DOCUMENT
-#define _INCLUDE_DRIVERDAT_W_SMESHDS_DOCUMENT
-
-#include "Driver_Document.h"
-
-class DriverDAT_W_SMESHDS_Document: public Driver_Document
-{};
-
-#endif
+++ /dev/null
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-#include "DriverDAT_W_SMESHDS_Mesh.h"
+++ /dev/null
-// SMESH DriverDAT : driver to read and write 'dat' files
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : DriverDAT_W_SMESHDS_Mesh.h
-// Module : SMESH
-
-#ifndef _INCLUDE_DRIVERDAT_W_SMESHDS_MESH
-#define _INCLUDE_DRIVERDAT_W_SMESHDS_MESH
-
-#include "Driver_SMESHDS_Mesh.h"
-
-class DriverDAT_W_SMESHDS_Mesh: public Driver_SMESHDS_Mesh
-{};
-
-#endif
+++ /dev/null
-// SMESH DriverMED : tool to split groups on families
-//
-// Copyright (C) 2003 CEA
-//
-// 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.org
-//
-//
-//
-// File : DriverMED_Family.cxx
-// Author : Julia DOROVSKIKH
-// Module : SMESH
-// $Header$
-
-#include "DriverMED_Family.h"
-#include "MED_Factory.hxx"
-
-#include <sstream>
-
-using namespace std;
-
-//=============================================================================
-/*!
- * Split each group from list <aGroups> on some parts (families)
- * on the basis of the elements membership in other groups from this list.
- * Resulting families have no common elements.
- */
-//=============================================================================
-list<DriverMED_FamilyPtr> DriverMED_Family::MakeFamilies
- (const map <int, SMESHDS_SubMesh*>& theSubMeshes,
- const list<SMESHDS_GroupBase*>& theGroups,
- const bool doGroupOfNodes,
- const bool doGroupOfEdges,
- const bool doGroupOfFaces,
- const bool doGroupOfVolumes)
-{
- list<DriverMED_FamilyPtr> aFamilies;
-
- string anAllNodesGroupName = "Group_Of_All_Nodes";
- string anAllEdgesGroupName = "Group_Of_All_Edges";
- string anAllFacesGroupName = "Group_Of_All_Faces";
- string anAllVolumesGroupName = "Group_Of_All_Volumes";
-
- // Reserve four ids for families of free elements
- // (1 - nodes, -1 - edges, -2 - faces, -3 - volumes).
- // 'Free' means here not belonging to any group.
- int aNodeFamId = FIRST_NODE_FAMILY;
- int aElemFamId = FIRST_ELEM_FAMILY;
-
- // Process sub-meshes
- map<int, SMESHDS_SubMesh*>::const_iterator aSMIter = theSubMeshes.begin();
- for (; aSMIter != theSubMeshes.end(); aSMIter++)
- {
- if ( aSMIter->second->IsComplexSubmesh() )
- continue; // submesh containing other submeshs
- list<DriverMED_FamilyPtr> aSMFams = SplitByType((*aSMIter).second, (*aSMIter).first);
- list<DriverMED_FamilyPtr>::iterator aSMFamsIter = aSMFams.begin();
- for (; aSMFamsIter != aSMFams.end(); aSMFamsIter++)
- {
- DriverMED_FamilyPtr aFam2 = (*aSMFamsIter);
-
- list<DriverMED_FamilyPtr>::iterator aFamsIter = aFamilies.begin();
- while (aFamsIter != aFamilies.end())
- {
- DriverMED_FamilyPtr aFam1 = *aFamsIter;
- list<DriverMED_FamilyPtr>::iterator aCurrIter = aFamsIter++;
- if (aFam1->myType == aFam2->myType)
- {
- DriverMED_FamilyPtr aCommon (new DriverMED_Family);
- aFam1->Split(aFam2, aCommon);
- if (!aCommon->IsEmpty())
- {
- aFamilies.push_back(aCommon);
- }
- if (aFam1->IsEmpty())
- {
- aFamilies.erase(aCurrIter);
- }
- if (aFam2->IsEmpty()) break;
- }
- }
- // The rest elements of family
- if (!aFam2->IsEmpty())
- {
- aFamilies.push_back(aFam2);
- }
- }
- }
-
- // Process groups
- list<SMESHDS_GroupBase*>::const_iterator aGroupsIter = theGroups.begin();
- for (; aGroupsIter != theGroups.end(); aGroupsIter++)
- {
- DriverMED_FamilyPtr aFam2 (new DriverMED_Family);
- aFam2->Init(*aGroupsIter);
-
- list<DriverMED_FamilyPtr>::iterator aFamsIter = aFamilies.begin();
- while (aFamsIter != aFamilies.end())
- {
- DriverMED_FamilyPtr aFam1 = *aFamsIter;
- list<DriverMED_FamilyPtr>::iterator aCurrIter = aFamsIter++;
- if (aFam1->myType == aFam2->myType)
- {
- DriverMED_FamilyPtr aCommon (new DriverMED_Family);
- aFam1->Split(aFam2, aCommon);
- if (!aCommon->IsEmpty())
- {
- aFamilies.push_back(aCommon);
- }
- if (aFam1->IsEmpty())
- {
- aFamilies.erase(aCurrIter);
- }
- if (aFam2->IsEmpty()) break;
- }
- }
- // The rest elements of group
- if (!aFam2->IsEmpty())
- {
- aFamilies.push_back(aFam2);
- }
- }
-
- list<DriverMED_FamilyPtr>::iterator aFamsIter = aFamilies.begin();
- for (; aFamsIter != aFamilies.end(); aFamsIter++)
- {
- DriverMED_FamilyPtr aFam = *aFamsIter;
- if (aFam->myType == SMDSAbs_Node) {
- aFam->SetId(aNodeFamId++);
- if (doGroupOfNodes) aFam->myGroupNames.insert(anAllNodesGroupName);
- }
- else {
- aFam->SetId(aElemFamId--);
- if (aFam->myType == SMDSAbs_Edge) {
- if (doGroupOfEdges) aFam->myGroupNames.insert(anAllEdgesGroupName);
- }
- else if (aFam->myType == SMDSAbs_Face) {
- if (doGroupOfFaces) aFam->myGroupNames.insert(anAllFacesGroupName);
- }
- else if (aFam->myType == SMDSAbs_Volume) {
- if (doGroupOfVolumes) aFam->myGroupNames.insert(anAllVolumesGroupName);
- }
- }
- }
-
- // Create families for elements, not belonging to any group
- if (doGroupOfNodes)
- {
- DriverMED_FamilyPtr aFreeNodesFam (new DriverMED_Family);
- aFreeNodesFam->SetId(REST_NODES_FAMILY);
- aFreeNodesFam->myType = SMDSAbs_Node;
- aFreeNodesFam->myGroupNames.insert(anAllNodesGroupName);
- aFamilies.push_back(aFreeNodesFam);
- }
-
- if (doGroupOfEdges)
- {
- DriverMED_FamilyPtr aFreeEdgesFam (new DriverMED_Family);
- aFreeEdgesFam->SetId(REST_EDGES_FAMILY);
- aFreeEdgesFam->myType = SMDSAbs_Edge;
- aFreeEdgesFam->myGroupNames.insert(anAllEdgesGroupName);
- aFamilies.push_back(aFreeEdgesFam);
- }
-
- if (doGroupOfFaces)
- {
- DriverMED_FamilyPtr aFreeFacesFam (new DriverMED_Family);
- aFreeFacesFam->SetId(REST_FACES_FAMILY);
- aFreeFacesFam->myType = SMDSAbs_Face;
- aFreeFacesFam->myGroupNames.insert(anAllFacesGroupName);
- aFamilies.push_back(aFreeFacesFam);
- }
-
- if (doGroupOfVolumes)
- {
- DriverMED_FamilyPtr aFreeVolumesFam (new DriverMED_Family);
- aFreeVolumesFam->SetId(REST_VOLUMES_FAMILY);
- aFreeVolumesFam->myType = SMDSAbs_Volume;
- aFreeVolumesFam->myGroupNames.insert(anAllVolumesGroupName);
- aFamilies.push_back(aFreeVolumesFam);
- }
-
- DriverMED_FamilyPtr aNullFam (new DriverMED_Family);
- aNullFam->SetId(0);
- aNullFam->myType = SMDSAbs_All;
- aFamilies.push_back(aNullFam);
-
- return aFamilies;
-}
-
-//=============================================================================
-/*!
- * Create TFamilyInfo for this family
- */
-//=============================================================================
-MED::PFamilyInfo
-DriverMED_Family::GetFamilyInfo(const MED::PWrapper& theWrapper,
- const MED::PMeshInfo& theMeshInfo) const
-{
- string aValue;
-
- ostringstream aStr;
-
- aStr << "FAM_" << myId;
- set<string>::const_iterator aGrIter = myGroupNames.begin();
- for (; aGrIter != myGroupNames.end(); aGrIter++)
- {
- aStr << "_" << *aGrIter;
- }
-
- aValue = aStr.str();
- /*
- MED::TStringVector anAttrDescs (1, ""); // 1 attribute with empty description,
- MED::TIntVector anAttrIds (1, myId); // Id=0,
- MED::TIntVector anAttrVals (1, myId); // Value=0
- */
-
- MED::PFamilyInfo anInfo = theWrapper->CrFamilyInfo(theMeshInfo,
- aValue,
- myId,
- myGroupNames);
-/*
- anAttrDescs,
- anAttrIds,
- anAttrVals);
-*/
-
-// cout << endl;
-// cout << "Groups: ";
-// set<string>::iterator aGrIter = myGroupNames.begin();
-// for (; aGrIter != myGroupNames.end(); aGrIter++)
-// {
-// cout << " " << *aGrIter;
-// }
-// cout << endl;
-//
-// cout << "Elements: ";
-// set<const SMDS_MeshElement *>::iterator anIter = myElements.begin();
-// for (; anIter != myElements.end(); anIter++)
-// {
-// cout << " " << (*anIter)->GetID();
-// }
-// cout << endl;
-
- return anInfo;
-}
-
-//=============================================================================
-/*!
- * Initialize the tool by SMESHDS_GroupBase
- */
-//=============================================================================
-void DriverMED_Family::Init (SMESHDS_GroupBase* theGroup)
-{
- // Elements
- myElements.clear();
- SMDS_ElemIteratorPtr elemIt = theGroup->GetElements();
- while (elemIt->more())
- {
- myElements.insert(elemIt->next());
- }
-
- // Type
- myType = theGroup->GetType();
-
- // Groups list
- myGroupNames.clear();
- myGroupNames.insert(string(theGroup->GetStoreName()));
-}
-
-//=============================================================================
-/*!
- * Split <theSubMesh> on some parts (families)
- * on the basis of the elements type.
- */
-//=============================================================================
-list<DriverMED_FamilyPtr> DriverMED_Family::SplitByType (SMESHDS_SubMesh* theSubMesh,
- const int theId)
-{
- list<DriverMED_FamilyPtr> aFamilies;
- DriverMED_FamilyPtr aNodesFamily (new DriverMED_Family);
- DriverMED_FamilyPtr anEdgesFamily (new DriverMED_Family);
- DriverMED_FamilyPtr aFacesFamily (new DriverMED_Family);
- DriverMED_FamilyPtr aVolumesFamily (new DriverMED_Family);
-
- char submeshGrpName[ 30 ];
- sprintf( submeshGrpName, "SubMesh %d", theId );
-
- SMDS_NodeIteratorPtr aNodesIter = theSubMesh->GetNodes();
- while (aNodesIter->more())
- {
- const SMDS_MeshNode* aNode = aNodesIter->next();
- aNodesFamily->AddElement(aNode);
- }
-
- SMDS_ElemIteratorPtr anElemsIter = theSubMesh->GetElements();
- while (anElemsIter->more())
- {
- const SMDS_MeshElement* anElem = anElemsIter->next();
- switch (anElem->GetType())
- {
- case SMDSAbs_Edge:
- anEdgesFamily->AddElement(anElem);
- break;
- case SMDSAbs_Face:
- aFacesFamily->AddElement(anElem);
- break;
- case SMDSAbs_Volume:
- aVolumesFamily->AddElement(anElem);
- break;
- default:
- break;
- }
- }
-
- if (!aNodesFamily->IsEmpty()) {
- aNodesFamily->SetType(SMDSAbs_Node);
- aNodesFamily->AddGroupName(submeshGrpName);
- aFamilies.push_back(aNodesFamily);
- }
- if (!anEdgesFamily->IsEmpty()) {
- anEdgesFamily->SetType(SMDSAbs_Edge);
- anEdgesFamily->AddGroupName(submeshGrpName);
- aFamilies.push_back(anEdgesFamily);
- }
- if (!aFacesFamily->IsEmpty()) {
- aFacesFamily->SetType(SMDSAbs_Face);
- aFacesFamily->AddGroupName(submeshGrpName);
- aFamilies.push_back(aFacesFamily);
- }
- if (!aVolumesFamily->IsEmpty()) {
- aVolumesFamily->SetType(SMDSAbs_Volume);
- aVolumesFamily->AddGroupName(submeshGrpName);
- aFamilies.push_back(aVolumesFamily);
- }
-
- return aFamilies;
-}
-
-//=============================================================================
-/*!
- * Remove from <myElements> elements, common with <by>,
- * Remove from <by> elements, common with <myElements>,
- * Create family <common> from common elements, with combined groups list.
- */
-//=============================================================================
-void DriverMED_Family::Split (DriverMED_FamilyPtr by,
- DriverMED_FamilyPtr common)
-{
- // Elements
- set<const SMDS_MeshElement *>::iterator anIter = by->myElements.begin();
- while ( anIter != by->myElements.end())
- {
- if (myElements.find(*anIter) != myElements.end())
- {
- common->myElements.insert(*anIter);
- myElements.erase(*anIter);
- by->myElements.erase(anIter++);
- }
- else
- anIter++;
- }
-
- if (!common->IsEmpty())
- {
- // Groups list
- common->myGroupNames = myGroupNames;
- set<string>::iterator aGrNamesIter = by->myGroupNames.begin();
- for (; aGrNamesIter != by->myGroupNames.end(); aGrNamesIter++)
- {
- common->myGroupNames.insert(*aGrNamesIter);
- }
-
- // Type
- common->myType = myType;
- }
-}
+++ /dev/null
-// SMESH DriverMED : tool to split groups on families
-//
-// Copyright (C) 2003 CEA
-//
-// 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.org
-//
-//
-//
-// File : DriverMED_Family.hxx
-// Author : Julia DOROVSKIKH
-// Module : SMESH
-// $Header$
-
-#ifndef _INCLUDE_DRIVERMED_FAMILY
-#define _INCLUDE_DRIVERMED_FAMILY
-
-#include "SMDS_Mesh.hxx"
-#include "SMESHDS_GroupBase.hxx"
-#include "SMESHDS_SubMesh.hxx"
-#include "MED_Common.hxx"
-
-#include <boost/shared_ptr.hpp>
-#include <set>
-
-#define REST_NODES_FAMILY 1
-#define REST_EDGES_FAMILY -1
-#define REST_FACES_FAMILY -2
-#define REST_VOLUMES_FAMILY -3
-#define FIRST_NODE_FAMILY 2
-#define FIRST_ELEM_FAMILY -4
-
-class DriverMED_Family;
-typedef boost::shared_ptr<DriverMED_Family> DriverMED_FamilyPtr;
-
-class DriverMED_Family
-{
- public:
-
- // Methods for groups storing to MED
-
- static std::list<DriverMED_FamilyPtr> MakeFamilies (const std::map <int, SMESHDS_SubMesh*>& theSubMeshes,
- const std::list<SMESHDS_GroupBase*>& theGroups,
- const bool doGroupOfNodes,
- const bool doGroupOfEdges,
- const bool doGroupOfFaces,
- const bool doGroupOfVolumes);
- // Split each group from list <theGroups> and each sub-mesh from list <theSubMeshes>
- // on some parts (families) on the basis of the elements membership in other groups
- // from <theGroups> and other sub-meshes from <theSubMeshes>.
- // Resulting families have no common elements.
-
- MED::PFamilyInfo GetFamilyInfo (const MED::PWrapper& theWrapper,
- const MED::PMeshInfo& theMeshInfo) const;
- // Create TFamilyInfo for this family
-
- const std::set<const SMDS_MeshElement *>& GetElements () const { return myElements; }
- // Returns elements of this family
-
- int GetId () const { return myId; }
- // Returns a family ID
-
- public:
-
- // Methods for groups reading from MED
-
- void AddElement (const SMDS_MeshElement* theElement) { myElements.insert(theElement); }
-
- void AddGroupName (std::string theGroupName) { myGroupNames.insert(theGroupName); }
-
- void SetType (const SMDSAbs_ElementType theType) { myType = theType; }
- SMDSAbs_ElementType GetType () { return myType; }
-
- bool MemberOf (std::string theGroupName) const
- { return (myGroupNames.find(theGroupName) != myGroupNames.end()); }
-
- const MED::TStringSet& GetGroupNames () const { return myGroupNames; }
-
- void SetId (const int theId) { myId = theId; }
- // Sets a family ID
-
- private:
- void Init (SMESHDS_GroupBase* group);
- // Initialize the tool by SMESHDS_GroupBase
-
- static std::list<DriverMED_FamilyPtr> SplitByType (SMESHDS_SubMesh* theSubMesh,
- const int theId);
- // Split <theSubMesh> on some parts (families)
- // on the basis of the elements type.
-
- void Split (DriverMED_FamilyPtr by,
- DriverMED_FamilyPtr common);
- // Remove from <Elements> elements, common with <by>,
- // Remove from <by> elements, common with <Elements>,
- // Create family <common> from common elements, with combined groups list.
-
- bool IsEmpty () const { return myElements.empty(); }
- // Check, if this family has empty list of elements
-
- private:
- int myId;
- SMDSAbs_ElementType myType;
- std::set<const SMDS_MeshElement *> myElements;
- MED::TStringSet myGroupNames;
-};
-
-#endif
+++ /dev/null
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-#include "DriverMED_R_SMDS_Mesh.h"
+++ /dev/null
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-#ifndef _INCLUDE_DRIVERMED_R_SMDS_MESH
-#define _INCLUDE_DRIVERMED_R_SMDS_MESH
-
-#include "Driver_SMDS_Mesh.h"
-
-class DriverMED_R_SMDS_Mesh: public Driver_SMDS_Mesh
-{};
-
-#endif
+++ /dev/null
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-#include "DriverMED_R_SMESHDS_Document.h"
+++ /dev/null
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-#ifndef _INCLUDE_DRIVERMED_R_SMESHDS_DOCUMENT
-#define _INCLUDE_DRIVERMED_R_SMESHDS_DOCUMENT
-
-#include "Driver_Document.h"
-
-class DriverMED_R_SMESHDS_Document : public Driver_Document
-{};
-
-#endif
+++ /dev/null
-// SMESH DriverMED : driver to read and write 'med' files
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : DriverMED_R_SMESHDS_Mesh.h
-// Module : SMESH
-
-#ifndef _INCLUDE_DRIVERMED_R_SMESHDS_MESH
-#define _INCLUDE_DRIVERMED_R_SMESHDS_MESH
-
-#include "Driver_SMESHDS_Mesh.h"
-#include "DriverMED_Family.h"
-
-#include <list>
-
-class SMESHDS_Mesh;
-class SMESHDS_Group;
-class SMESHDS_SubMesh;
-
-typedef std::pair< std::string, SMDSAbs_ElementType > TNameAndType;
-
-class DriverMED_R_SMESHDS_Mesh: public Driver_SMESHDS_Mesh
-{
- public:
- virtual Status Perform();
-
- std::list< TNameAndType > GetGroupNamesAndTypes();
- void GetGroup(SMESHDS_Group* theGroup);
- void CreateAllSubMeshes();
- void GetSubMesh(SMESHDS_SubMesh* theSubMesh, const int theId);
-
- std::list<std::string> GetMeshNames(Status& theStatus);
- void SetMeshName(std::string theMeshName);
-
- private:
- /*!
- * \brief Ensure aFamily has required ID
- * \param aFamily - a family to check
- * \param anID - an ID aFamily should have
- * \retval bool - true if successful
- */
- bool checkFamilyID(DriverMED_FamilyPtr & aFamily, int anID) const;
-
- private:
- std::string myMeshName;
- std::map<int, DriverMED_FamilyPtr> myFamilies;
-
-};
-
-#endif
+++ /dev/null
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-#include "DriverMED_W_SMDS_Mesh.h"
+++ /dev/null
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-#ifndef _INCLUDE_DRIVERMED_W_SMDS_MESH
-#define _INCLUDE_DRIVERMED_W_SMDS_MESH
-
-#include "Driver_SMDS_Mesh.h"
-
-class DriverMED_W_SMDS_Mesh: public Driver_SMDS_Mesh
-{};
-
-#endif
+++ /dev/null
-// SMESH DriverMED : driver to read and write 'med' files
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : DriverMED_W_SMESHDS_Document.cxx
-// Module : SMESH
-
-#include "DriverMED_W_SMESHDS_Document.h"
+++ /dev/null
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-#ifndef _INCLUDE_DRIVERMED_W_SMESHDS_DOCUMENT
-#define _INCLUDE_DRIVERMED_W_SMESHDS_DOCUMENT
-
-#include "Driver_Document.h"
-
-class DriverMED_W_SMESHDS_Document : public Driver_Document
-{};
-
-#endif
+++ /dev/null
-// SMESH DriverMED : driver to read and write 'med' files
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : DriverMED_W_SMESHDS_Mesh.h
-// Module : SMESH
-
-#ifndef _INCLUDE_DRIVERMED_W_SMESHDS_MESH
-#define _INCLUDE_DRIVERMED_W_SMESHDS_MESH
-
-#include "Driver_SMESHDS_Mesh.h"
-#include "MED_Factory.hxx"
-
-#include <string>
-#include <list>
-#include <map>
-
-class SMESHDS_Mesh;
-class SMESHDS_GroupBase;
-class SMESHDS_SubMesh;
-
-class DriverMED_W_SMESHDS_Mesh: public Driver_SMESHDS_Mesh
-{
- public:
-
- DriverMED_W_SMESHDS_Mesh();
-
- virtual void SetFile(const std::string& theFileName);
- void SetFile(const std::string& theFileName, MED::EVersion theId);
-
- /*! sets file name; only for usage with Add(), not Write()
- */
- void AddGroupOfNodes();
- void AddGroupOfEdges();
- void AddGroupOfFaces();
- void AddGroupOfVolumes();
-
- /*! functions to prepare adding one mesh
- */
- void SetMeshName(const std::string& theMeshName);
- void AddGroup(SMESHDS_GroupBase * theGroup);
- void AddAllSubMeshes();
- void AddSubMesh(SMESHDS_SubMesh* theSubMesh, int theID);
-
- /*! add one mesh
- */
- virtual Status Perform();
-
- private:
-
- MED::PWrapper myMed;
- std::string myMeshName;
- std::list<SMESHDS_GroupBase*> myGroups;
- bool myAllSubMeshes;
- std::map<int,SMESHDS_SubMesh*> mySubMeshes;
- bool myDoGroupOfNodes;
- bool myDoGroupOfEdges;
- bool myDoGroupOfFaces;
- bool myDoGroupOfVolumes;
-};
-
-
-#endif
-
+++ /dev/null
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-#include "DriverMED_R_SMESHDS_Mesh.h"
-#include "DriverMED_W_SMESHDS_Mesh.h"
-
-int main(int argc, char** argv)
-{
- DriverMED_R_SMESHDS_Mesh aR;
- DriverMED_W_SMESHDS_Mesh aW;
- return 1;
-}
+++ /dev/null
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-#include <stdio.h>
-#include <gp_Pnt.hxx>
-//=======================================================================
-//function : HashCode
-//purpose :
-//=======================================================================
-inline Standard_Integer HashCode
- (const gp_Pnt& point, Standard_Integer Upper)
-{
- union
- {
- Standard_Real R[3];
- Standard_Integer I[6];
- } U;
-
- point.Coord(U.R[0],U.R[1],U.R[2]);
-
- return ::HashCode(U.I[0]/23+U.I[1]/19+U.I[2]/17+U.I[3]/13+U.I[4]/11+U.I[5]/7,Upper);
-}
-static Standard_Real tab1[3];
-static Standard_Real tab2[3];
-//=======================================================================
-//function : IsEqual
-//purpose :
-//=======================================================================
-inline Standard_Boolean IsEqual
- (const gp_Pnt& point1, const gp_Pnt& point2)
-{
- point1.Coord(tab1[0],tab1[1],tab1[2]);
- point2.Coord(tab2[0],tab2[1],tab2[2]);
- return (memcmp(tab1,tab2,sizeof(tab1)) == 0);
-}
-#include "DriverSTL_R_SMDS_Mesh.h"
-
-#include "SMDS_Mesh.hxx"
-#include "SMDS_MeshElement.hxx"
-#include "SMDS_MeshNode.hxx"
-
-#include <OSD_Path.hxx>
-#include <OSD_File.hxx>
-#include <OSD_FromWhere.hxx>
-#include <OSD_Protection.hxx>
-#include <OSD_SingleProtection.hxx>
-#include <Standard_NoMoreObject.hxx>
-
-#include "utilities.h"
-
-static const int HEADER_SIZE = 84;
-static const int SIZEOF_STL_FACET = 50;
-//static const int STL_MIN_FILE_SIZE = 284;
-static const int ASCII_LINES_PER_FACET = 7;
-
-
-//typedef NCollection_BaseCollection<SMDS_MeshNodePtr> DriverSTL_ColOfNodePtr;
-
-
-#include <NCollection_DataMap.hxx>
-typedef NCollection_DataMap<gp_Pnt,SMDS_MeshNode*> DriverSTL_DataMapOfPntNodePtr;
-//=======================================================================
-//function : DriverSTL_R_SMDS_Mesh
-//purpose :
-//=======================================================================
-
-DriverSTL_R_SMDS_Mesh::DriverSTL_R_SMDS_Mesh()
-{
- myIsCreateFaces = true;
- myIsAscii = Standard_True;
-}
-
-//=======================================================================
-//function : SetIsCreateFaces
-//purpose :
-//=======================================================================
-
-void DriverSTL_R_SMDS_Mesh::SetIsCreateFaces( const bool theIsCreate )
-{ myIsCreateFaces = theIsCreate; }
-
-//=======================================================================
-//function : Perform
-//purpose :
-//=======================================================================
-
-Driver_Mesh::Status DriverSTL_R_SMDS_Mesh::Perform()
-{
- Status aResult = DRS_OK;
-
- TCollection_AsciiString aFileName( (char *)myFile.c_str() );
- if ( aFileName.IsEmpty() ) {
- fprintf(stderr, ">> ERREOR : invalid file name \n");
- return DRS_FAIL;
- }
-
- filebuf fic;
- Standard_IStream is(&fic);
- if (!fic.open(aFileName.ToCString(),ios::in)) {
- fprintf(stderr, ">> ERROR : cannot open file %s \n", aFileName.ToCString());
- return DRS_FAIL;
- }
-
-
- OSD_Path aPath( aFileName );
- OSD_File file = OSD_File( aPath );
- file.Open(OSD_ReadOnly,OSD_Protection(OSD_RWD,OSD_RWD,OSD_RWD,OSD_RWD));
- unsigned char str[128];
- Standard_Integer lread,i;
- Standard_Address ach;
- ach = (Standard_Address)str;
- // we skip the header which is in Ascii for both modes
- file.Read(ach,HEADER_SIZE,lread);
-
- // we read 128 characters to detect if we have a non-ascii char
- file.Read(ach,sizeof(str),lread);
-
- myIsAscii = Standard_True;
- for (i = 0; i < lread; ++i) {
- if (str[i] > '~') {
- myIsAscii = Standard_False;
- break;
- }
- }
-
- file.Close();
-
- if ( !myMesh ) {
- fprintf(stderr, ">> ERREOR : cannot create mesh \n");
- return DRS_FAIL;
- }
-
- if ( myIsAscii )
- aResult = readAscii();
- else
- aResult = readBinary();
-
- return aResult;
-}
-
-// static methods
-
-static Standard_Real readFloat(OSD_File& theFile)
-{
- union {
- Standard_Boolean i;
- Standard_ShortReal f;
- }u;
-
- char c[4];
- Standard_Address adr;
- adr = (Standard_Address)c;
- Standard_Integer lread;
- theFile.Read(adr,4,lread);
- u.i = c[0] & 0xFF;
- u.i |= (c[1] & 0xFF) << 0x08;
- u.i |= (c[2] & 0xFF) << 0x10;
- u.i |= (c[3] & 0xFF) << 0x18;
-
- return u.f;
-}
-
-static SMDS_MeshNode* addNode(const gp_Pnt& P,
- DriverSTL_DataMapOfPntNodePtr& uniqnodes,
- SMDS_Mesh* theMesh)
-{
- SMDS_MeshNode* node = 0;
- if ( uniqnodes.IsBound(P) ) {
- node = uniqnodes.Find(P);
- } else {
- node = theMesh->AddNode(P.X(), P.Y(), P.Z() );
- uniqnodes.Bind(P,node);
- }
-
- return node;
-}
-
-static SMDS_MeshNode* readNode(FILE* file,
- DriverSTL_DataMapOfPntNodePtr& uniqnodes,
- SMDS_Mesh* theMesh)
-{
- Standard_ShortReal coord[3];
- // reading vertex
- fscanf(file,"%*s %f %f %f\n",&coord[0],&coord[1],&coord[2]);
-
- gp_Pnt P(coord[0],coord[1],coord[2]);
- return addNode( P, uniqnodes, theMesh );
-}
-
-static SMDS_MeshNode* readNode(OSD_File& theFile,
- DriverSTL_DataMapOfPntNodePtr& uniqnodes,
- SMDS_Mesh* theMesh)
-{
- Standard_ShortReal coord[3];
- coord[0] = readFloat(theFile);
- coord[1] = readFloat(theFile);
- coord[2] = readFloat(theFile);
-
- gp_Pnt P(coord[0],coord[1],coord[2]);
- return addNode( P, uniqnodes, theMesh );
-}
-
-//=======================================================================
-//function : readAscii
-//purpose :
-//=======================================================================
-
-Driver_Mesh::Status DriverSTL_R_SMDS_Mesh::readAscii() const
-{
- Status aResult = DRS_OK;
- long ipos;
- Standard_Integer nbLines = 0;
-
- // Open the file
- TCollection_AsciiString aFileName( (char *)myFile.c_str() );
- FILE* file = fopen(aFileName.ToCString(),"r");
- fseek(file,0L,SEEK_END);
- // get the file size
- long filesize = ftell(file);
- fclose(file);
- file = fopen(aFileName.ToCString(),"r");
-
- // count the number of lines
- for (ipos = 0; ipos < filesize; ++ipos) {
- if (getc(file) == '\n')
- nbLines++;
- }
-
- // go back to the beginning of the file
-// fclose(file);
-// file = fopen(aFileName.ToCString(),"r");
- rewind(file);
-
- Standard_Integer nbTri = (nbLines / ASCII_LINES_PER_FACET);
-
- DriverSTL_DataMapOfPntNodePtr uniqnodes;
- // skip header
- while (getc(file) != '\n');
-
- // main reading
- for (Standard_Integer iTri = 0; iTri < nbTri; ++iTri) {
-
- // skipping the facet normal
- Standard_ShortReal normal[3];
- fscanf(file,"%*s %*s %f %f %f\n",&normal[0],&normal[1],&normal[2]);
-
- // skip the keywords "outer loop"
- fscanf(file,"%*s %*s");
-
- // reading nodes
- SMDS_MeshNode* node1 = readNode( file, uniqnodes, myMesh );
- SMDS_MeshNode* node2 = readNode( file, uniqnodes, myMesh );
- SMDS_MeshNode* node3 = readNode( file, uniqnodes, myMesh );
-
- if (myIsCreateFaces)
- myMesh->AddFace(node1,node2,node3);
-
- // skip the keywords "endloop"
- fscanf(file,"%*s");
-
- // skip the keywords "endfacet"
- fscanf(file,"%*s");
- }
-
- fclose(file);
- return aResult;
-}
-
-//=======================================================================
-//function : readBinary
-//purpose :
-//=======================================================================
-
-Driver_Mesh::Status DriverSTL_R_SMDS_Mesh::readBinary() const
-{
- Status aResult = DRS_OK;
-
- char buftest[5];
- Standard_Address adr;
- adr = (Standard_Address)buftest;
-
- TCollection_AsciiString aFileName( (char *)myFile.c_str() );
- OSD_File aFile = OSD_File(OSD_Path( aFileName ));
- aFile.Open(OSD_ReadOnly,OSD_Protection(OSD_RWD,OSD_RWD,OSD_RWD,OSD_RWD));
-
- // the size of the file (minus the header size)
- // must be a multiple of SIZEOF_STL_FACET
-
- // compute file size
- Standard_Integer filesize = aFile.Size();
-
- if ( (filesize - HEADER_SIZE) % SIZEOF_STL_FACET !=0
- // Commented to allow reading small files (ex: 1 face)
- /*|| (filesize < STL_MIN_FILE_SIZE)*/) {
- Standard_NoMoreObject::Raise("DriverSTL_R_SMDS_MESH::readBinary (wrong file size)");
- }
-
- // don't trust the number of triangles which is coded in the file
- // sometimes it is wrong, and with this technique we don't need to swap endians for integer
- Standard_Integer nbTri = ((filesize - HEADER_SIZE) / SIZEOF_STL_FACET);
-
- // skip the header
- aFile.Seek(HEADER_SIZE,OSD_FromBeginning);
-
- DriverSTL_DataMapOfPntNodePtr uniqnodes;
- Standard_Integer lread;
-
- for (Standard_Integer iTri = 0; iTri < nbTri; ++iTri) {
-
- // ignore normals
- readFloat(aFile);
- readFloat(aFile);
- readFloat(aFile);
-
- // read vertices
- SMDS_MeshNode* node1 = readNode( aFile, uniqnodes, myMesh );
- SMDS_MeshNode* node2 = readNode( aFile, uniqnodes, myMesh );
- SMDS_MeshNode* node3 = readNode( aFile, uniqnodes, myMesh );
-
- if (myIsCreateFaces)
- myMesh->AddFace(node1,node2,node3);
-
- // skip extra bytes
- aFile.Read(adr,2,lread);
- }
- aFile.Close();
- return aResult;
-}
+++ /dev/null
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-#ifndef _INCLUDE_DRIVERSTL_R_SMDS_MESH
-#define _INCLUDE_DRIVERSTL_R_SMDS_MESH
-
-#include "Driver_SMDS_Mesh.h"
-
-#include <Standard_TypeDef.hxx>
-
-class DriverSTL_R_SMDS_Mesh: public Driver_SMDS_Mesh
-{
- public:
- DriverSTL_R_SMDS_Mesh();
- virtual Status Perform();
- void SetIsCreateFaces( const bool theIsCreate = true );
-
- private:
- // PRIVATE METHODS
- Status readAscii() const;
- Status readBinary() const;
-
- private:
- // PRIVATE FIELDS
- bool myIsCreateFaces;
- bool myIsAscii;
-};
-
-#endif
+++ /dev/null
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-#include <stdio.h>
-
-#include "DriverSTL_W_SMDS_Mesh.h"
-
-#include "SMDS_Mesh.hxx"
-#include "SMDS_MeshElement.hxx"
-#include "SMDS_MeshNode.hxx"
-#include <gp_XYZ.hxx>
-#include <OSD_Path.hxx>
-#include <OSD_File.hxx>
-#include <OSD_FromWhere.hxx>
-#include <OSD_Protection.hxx>
-#include <OSD_SingleProtection.hxx>
-#include <TCollection_AsciiString.hxx>
-#include <TColgp_Array1OfXYZ.hxx>
-
-#include "utilities.h"
-
-//using namespace std;
-
-// definition des constantes
-static const int LABEL_SIZE = 80;
-
-DriverSTL_W_SMDS_Mesh::DriverSTL_W_SMDS_Mesh()
-{
- myIsAscii = false;
-}
-
-void DriverSTL_W_SMDS_Mesh::SetIsAscii( const bool theIsAscii )
-{
- myIsAscii = theIsAscii;
-}
-
-Driver_Mesh::Status DriverSTL_W_SMDS_Mesh::Perform()
-{
- Status aResult = DRS_OK;
-
- if ( !myMesh ) {
- fprintf(stderr, ">> ERROR : Mesh is null \n");
- return DRS_FAIL;
- }
- if ( myIsAscii )
- aResult = writeAscii();
- else
- aResult = writeBinary();
-
- return aResult;
-}
-
-// static methods
-
-static void writeInteger( const Standard_Integer& theVal,
- OSD_File& ofile )
-{
- union {
- Standard_Integer i;
- char c[4];
- }u;
-
- u.i = theVal;
-
- Standard_Integer entier;
- entier = u.c[0] & 0xFF;
- entier |= (u.c[1] & 0xFF) << 0x08;
- entier |= (u.c[2] & 0xFF) << 0x10;
- entier |= (u.c[3] & 0xFF) << 0x18;
-
- ofile.Write((char *)&entier,sizeof(u.c));
-}
-
-static void writeFloat ( const Standard_ShortReal& theVal,
- OSD_File& ofile)
-{
- union {
- Standard_ShortReal f;
- char c[4];
- }u;
-
- u.f = theVal;
-
- Standard_Integer entier;
-
- entier = u.c[0] & 0xFF;
- entier |= (u.c[1] & 0xFF) << 0x08;
- entier |= (u.c[2] & 0xFF) << 0x10;
- entier |= (u.c[3] & 0xFF) << 0x18;
-
- ofile.Write((char *)&entier,sizeof(u.c));
-}
-
-static gp_XYZ getNormale( const SMDS_MeshFace* theFace )
-{
- gp_XYZ n;
- int aNbNode = theFace->NbNodes();
- TColgp_Array1OfXYZ anArrOfXYZ(1,4);
- gp_XYZ p1, p2, p3, p4;
- SMDS_ElemIteratorPtr aNodeItr = theFace->nodesIterator();
- int i = 1;
- for ( ; aNodeItr->more() && i <= 4; i++ )
- {
- SMDS_MeshNode* aNode = (SMDS_MeshNode*)aNodeItr->next();
- anArrOfXYZ.SetValue(i, gp_XYZ( aNode->X(), aNode->Y(), aNode->Z() ) );
- }
-
- gp_XYZ q1 = anArrOfXYZ.Value(2) - anArrOfXYZ.Value(1);
- gp_XYZ q2 = anArrOfXYZ.Value(3) - anArrOfXYZ.Value(1);
- n = q1 ^ q2;
- if ( aNbNode > 3 )
- {
- gp_XYZ q3 = anArrOfXYZ.Value(4) - anArrOfXYZ.Value(1);
- n += q2 ^ q3;
- }
- double len = n.Modulus();
- if ( len > 0 )
- n /= len;
-
- return n;
-}
-
-// private methods
-
-Driver_Mesh::Status DriverSTL_W_SMDS_Mesh::writeAscii() const
-{
- Status aResult = DRS_OK;
- TCollection_AsciiString aFileName( (char *)myFile.c_str() );
- if ( aFileName.IsEmpty() ) {
- fprintf(stderr, ">> ERREOR : invalid file name \n");
- return DRS_FAIL;
- }
-
- OSD_File aFile = OSD_File(OSD_Path(aFileName));
- aFile.Build(OSD_WriteOnly,OSD_Protection());
- TCollection_AsciiString buf = TCollection_AsciiString ("solid\n");
- aFile.Write (buf,buf.Length());buf.Clear();
- char sval[16];
-
- SMDS_FaceIteratorPtr itFaces = myMesh->facesIterator();
-
- for (; itFaces->more() ;) {
- SMDS_MeshFace* aFace = (SMDS_MeshFace*)itFaces->next();
-
- if (aFace->NbNodes() == 3) {
- gp_XYZ normale = getNormale( aFace );
-
- buf += " facet normal ";
- sprintf (sval,"% 12e",normale.X());
- buf += sval;
- buf += " ";
- sprintf (sval,"% 12e",normale.Y());
- buf += sval;
- buf += " ";
- sprintf (sval,"% 12e",normale.Z());
- buf += sval;
- buf += '\n';
- aFile.Write (buf,buf.Length());buf.Clear();
- buf += " outer loop\n";
- aFile.Write (buf,buf.Length());buf.Clear();
-
- SMDS_ElemIteratorPtr aNodeIter = aFace->nodesIterator();
- for (; aNodeIter->more(); ) {
- SMDS_MeshNode* node = (SMDS_MeshNode*)aNodeIter->next();
- buf += " vertex ";
- sprintf (sval,"% 12e",node->X());
- buf += sval;
- buf += " ";
- sprintf (sval,"% 12e",node->Y());
- buf += sval;
- buf += " ";
- sprintf (sval,"% 12e",node->Z());
- buf += sval;
- buf += '\n';
- aFile.Write (buf,buf.Length());buf.Clear();
- }
- buf += " endloop\n";
- aFile.Write (buf,buf.Length());buf.Clear();
- buf += " endfacet\n";
- aFile.Write (buf,buf.Length());buf.Clear();
- }
- }
- buf += "endsolid\n";
- aFile.Write (buf,buf.Length());buf.Clear();
-
- aFile.Close ();
-
- return aResult;
-}
-
-Driver_Mesh::Status DriverSTL_W_SMDS_Mesh::writeBinary() const
-{
- Status aResult = DRS_OK;
- TCollection_AsciiString aFileName( (char *)myFile.c_str() );
- if ( aFileName.IsEmpty() ) {
- fprintf(stderr, ">> ERREOR : invalid filename \n");
- return DRS_FAIL;
- }
-
- OSD_File aFile = OSD_File(OSD_Path(aFileName));
- aFile.Build(OSD_WriteOnly,OSD_Protection());
-
- char sval[80];
- Standard_Integer nbTri = 0;
- SMDS_FaceIteratorPtr itFaces = myMesh->facesIterator();
-
- // we first count the number of triangles
- for (;itFaces->more();) {
- SMDS_MeshFace* aFace = (SMDS_MeshFace*)itFaces->next();
- if (aFace->NbNodes() == 3)
- nbTri++;
- }
-
- // write number of triangles
- unsigned int NBT = nbTri;
- aFile.Write((Standard_Address)sval,LABEL_SIZE);
- writeInteger(nbTri,aFile);
-
- // loop writing nodes. take face iterator again
- int dum=0;
- itFaces = myMesh->facesIterator();
-
- for (;itFaces->more();) {
- SMDS_MeshFace* aFace = (SMDS_MeshFace*)itFaces->next();
-
- if (aFace->NbNodes() == 3) {
- gp_XYZ aNorm = getNormale( aFace );
- writeFloat(aNorm.X(),aFile);
- writeFloat(aNorm.Y(),aFile);
- writeFloat(aNorm.Z(),aFile);
-
- SMDS_ElemIteratorPtr aNodeIter = aFace->nodesIterator();
- for (; aNodeIter->more(); ) {
- SMDS_MeshNode* node = (SMDS_MeshNode*)aNodeIter->next();
- writeFloat(node->X(),aFile);
- writeFloat(node->Y(),aFile);
- writeFloat(node->Z(),aFile);
- }
- aFile.Write (&dum,2);
- }
- }
- aFile.Close ();
-
- return aResult;
-}
+++ /dev/null
-// SMESH DriverSTL : driver to read and write 'stl' files
-//
-// Copyright (C) 2004 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : DriverSTL_W_SMDS_Mesh.h
-// Module : SMESH
-
-#ifndef _INCLUDE_DRIVERSTL_W_SMDS_MESH
-#define _INCLUDE_DRIVERSTL_W_SMDS_MESH
-
-#include "Driver_SMDS_Mesh.h"
-#include <Standard_TypeDef.hxx>
-
-class DriverSTL_W_SMDS_Mesh: public Driver_SMDS_Mesh
-{
- public:
-
- DriverSTL_W_SMDS_Mesh();
- virtual Status Perform();
- void SetIsAscii( const bool theIsAscii = false );
-
- private:
- // PRIVATE METHODS
- Status writeAscii () const;
- Status writeBinary () const;
-
- private:
- // PRIVATE FIELDS
- bool myIsAscii;
-};
-
-#endif
+++ /dev/null
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-//#include "DriverSTL_R_SMDS_Mesh.h"
-#include "DriverSTL_W_SMDS_Mesh.h"
-
-int main(int argc, char** argv)
-{
-// DriverSTL_R_SMDS_Mesh aR;
- DriverSTL_W_SMDS_Mesh aW;
- return 1;
-}
+++ /dev/null
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-#ifndef _INCLUDE_DRIVERUNV_R_SMDS_MESH
-#define _INCLUDE_DRIVERUNV_R_SMDS_MESH
-
-#include "Driver_SMDS_Mesh.h"
-
-class SMDS_Mesh;
-
-class DriverUNV_R_SMDS_Mesh: public Driver_SMDS_Mesh
-{
- public:
- virtual Status Perform();
-};
-
-#endif
+++ /dev/null
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-#include "DriverUNV_R_SMESHDS_Document.h"
+++ /dev/null
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-#ifndef _INCLUDE_DRIVERUNV_R_SMESHDS_DOCUMENT
-#define _INCLUDE_DRIVERUNV_R_SMESHDS_DOCUMENT
-
-#include "Driver_Document.h"
-
-class DriverUNV_R_SMESHDS_Document: public Driver_Document
-{};
-
-#endif
+++ /dev/null
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-#include "DriverUNV_R_SMESHDS_Mesh.h"
+++ /dev/null
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-#ifndef _INCLUDE_DRIVERUNV_R_SMESHDS_MESH
-#define _INCLUDE_DRIVERUNV_R_SMESHDS_MESH
-
-#include "Driver_SMESHDS_Mesh.h"
-
-class DriverUNV_R_SMESHDS_Mesh: public Driver_SMESHDS_Mesh
-{};
-
-#endif
+++ /dev/null
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-#include <algorithm>
-
-#include "DriverUNV_W_SMDS_Mesh.h"
-
-#include "SMDS_Mesh.hxx"
-
-#include "utilities.h"
-
-#include "UNV2411_Structure.hxx"
-#include "UNV2412_Structure.hxx"
-#include "UNV_Utilities.hxx"
-
-using namespace std;
-
-namespace{
- typedef std::vector<size_t> TConnect;
-
- int GetConnect(const SMDS_ElemIteratorPtr& theNodesIter,
- TConnect& theConnect)
- {
- theConnect.clear();
- for(; theNodesIter->more();){
- const SMDS_MeshElement* anElem = theNodesIter->next();
- theConnect.push_back(anElem->GetID());
- }
- return theConnect.size();
- }
-
-}
-
-Driver_Mesh::Status DriverUNV_W_SMDS_Mesh::Perform()
-{
- Status aResult = DRS_OK;
- std::ofstream out_stream(myFile.c_str());
- try{
- {
- using namespace UNV2411;
- TDataSet aDataSet2411;
- // Storing SMDS nodes to the UNV file
- //-----------------------------------
- MESSAGE("Perform - myMesh->NbNodes() = "<<myMesh->NbNodes());
- SMDS_NodeIteratorPtr aNodesIter = myMesh->nodesIterator();
- for(; aNodesIter->more();){
- const SMDS_MeshNode* aNode = aNodesIter->next();
- TRecord aRec;
- aRec.coord[0] = aNode->X();
- aRec.coord[1] = aNode->Y();
- aRec.coord[2] = aNode->Z();
- const TNodeLab& aLabel = aNode->GetID();
- aDataSet2411.insert(TDataSet::value_type(aLabel,aRec));
- }
- MESSAGE("Perform - aDataSet2411.size() = "<<aDataSet2411.size());
- UNV2411::Write(out_stream,aDataSet2411);
- }
- {
- using namespace UNV2412;
- TDataSet aDataSet2412;
- TConnect aConnect;
-
- // Storing SMDS Edges
- MESSAGE("Perform - myMesh->NbEdges() = "<<myMesh->NbEdges());
- if(myMesh->NbEdges()){
- SMDS_EdgeIteratorPtr anIter = myMesh->edgesIterator();
- for(; anIter->more();){
- const SMDS_MeshEdge* anElem = anIter->next();
- TElementLab aLabel = anElem->GetID();
- int aNbNodes = anElem->NbNodes();
- TRecord aRec;
- aRec.node_labels.reserve(aNbNodes);
- SMDS_ElemIteratorPtr aNodesIter = anElem->nodesIterator();
- for(; aNodesIter->more();){
- const SMDS_MeshElement* aNode = aNodesIter->next();
- aRec.node_labels.push_back(aNode->GetID());
- }
- aRec.fe_descriptor_id = 11;
- aDataSet2412.insert(TDataSet::value_type(aLabel,aRec));
- }
- MESSAGE("Perform - aDataSet2412.size() = "<<aDataSet2412.size());
- }
-
- MESSAGE("Perform - myMesh->NbFaces() = "<<myMesh->NbFaces());
- if(myMesh->NbFaces()){
- SMDS_FaceIteratorPtr anIter = myMesh->facesIterator();
- for(; anIter->more();){
- const SMDS_MeshFace* anElem = anIter->next();
- TElementLab aLabel = anElem->GetID();
- int aNbNodes = anElem->NbNodes();
- TRecord aRec;
- aRec.node_labels.reserve(aNbNodes);
- SMDS_ElemIteratorPtr aNodesIter = anElem->nodesIterator();
- for(; aNodesIter->more();){
- const SMDS_MeshElement* aNode = aNodesIter->next();
- aRec.node_labels.push_back(aNode->GetID());
- }
- switch(aNbNodes){
- case 3:
- aRec.fe_descriptor_id = 41;
- break;
- case 4:
- aRec.fe_descriptor_id = 44;
- break;
- default:
- continue;
- }
- aDataSet2412.insert(TDataSet::value_type(aLabel,aRec));
- }
- MESSAGE("Perform - aDataSet2412.size() = "<<aDataSet2412.size());
- }
-
- MESSAGE("Perform - myMesh->NbVolumes() = "<<myMesh->NbVolumes());
- if(myMesh->NbVolumes()){
- SMDS_VolumeIteratorPtr anIter = myMesh->volumesIterator();
- for(; anIter->more();){
- const SMDS_MeshVolume* anElem = anIter->next();
- TElementLab aLabel = anElem->GetID();
-
- int aNbNodes = anElem->NbNodes();
- aConnect.resize(aNbNodes);
-
- SMDS_ElemIteratorPtr aNodesIter = anElem->nodesIterator();
- GetConnect(aNodesIter,aConnect);
-
- int anId = -1;
- int* aConn = NULL;
- switch(aNbNodes){
- case 4: {
- static int anIds[] = {0,2,1,3};
- aConn = anIds;
- anId = 111;
- break;
- }
- case 6: {
- static int anIds[] = {0,2,1,3,5,4};
- aConn = anIds;
- anId = 112;
- break;
- }
- case 8: {
- static int anIds[] = {0,3,2,1,4,7,6,5};
- aConn = anIds;
- anId = 115;
- break;
- }
- default:
- continue;
- }
- if(aConn){
- TRecord aRec;
- aRec.fe_descriptor_id = anId;
- aRec.node_labels.resize(aNbNodes);
- for(int aNodeId = 0; aNodeId < aNbNodes; aNodeId++){
- aRec.node_labels[aConn[aNodeId]] = aConnect[aNodeId];
- }
- aDataSet2412.insert(TDataSet::value_type(aLabel,aRec));
- }
- }
- MESSAGE("Perform - aDataSet2412.size() = "<<aDataSet2412.size());
- }
- UNV2412::Write(out_stream,aDataSet2412);
- }
- }catch(const std::exception& exc){
- INFOS("Follow exception was cought:\n\t"<<exc.what());
- }catch(...){
- INFOS("Unknown exception was cought !!!");
- }
- return aResult;
-}
+++ /dev/null
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-#ifndef _INCLUDE_DRIVERUNV_W_SMDS_MESH
-#define _INCLUDE_DRIVERUNV_W_SMDS_MESH
-
-#include "Driver_SMDS_Mesh.h"
-
-class DriverUNV_W_SMDS_Mesh: public Driver_SMDS_Mesh
-{
- public:
- virtual Status Perform();
-};
-
-
-#endif
+++ /dev/null
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-#include "DriverUNV_W_SMESHDS_Document.h"
+++ /dev/null
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-#ifndef _INCLUDE_DRIVERUNV_W_SMESHDS_DOCUMENT
-#define _INCLUDE_DRIVERUNV_W_SMESHDS_DOCUMENT
-
-#include "Driver_Document.h"
-
-class DriverUNV_W_SMESHDS_Document : public Driver_Document
-{};
-
-#endif
+++ /dev/null
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-#include "DriverUNV_W_SMESHDS_Mesh.h"
+++ /dev/null
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-#ifndef _INCLUDE_DRIVERUNV_W_SMESHDS_MESH
-#define _INCLUDE_DRIVERUNV_W_SMESHDS_MESH
-
-#include "Driver_SMESHDS_Mesh.h"
-
-class DriverUNV_W_SMESHDS_Mesh: public Driver_SMESHDS_Mesh
-{};
-
-#endif
+++ /dev/null
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-#include <fstream>
-#include <stdio.h>
-
-#include "UNV2411_Structure.hxx"
-#include "UNV_Utilities.hxx"
-
-using namespace std;
-using namespace UNV;
-using namespace UNV2411;
-
-#ifdef _DEBUG_
-static int MYDEBUG = 1;
-#else
-static int MYDEBUG = 0;
-#endif
-
-static string _label_dataset = "2411";
-
-UNV2411::TRecord::TRecord():
- exp_coord_sys_num(0),
- disp_coord_sys_num(0),
- color(0)
-{}
-
-void UNV2411::Read(std::ifstream& in_stream, TDataSet& theDataSet)
-{
- if(!in_stream.good())
- EXCEPTION(runtime_error,"ERROR: Input file not good.");
-
- /*
- * adjust the \p istream to our
- * position
- */
- if(!beginning_of_dataset(in_stream,_label_dataset))
- EXCEPTION(runtime_error,"ERROR: Could not find "<<_label_dataset<<" dataset!");
-
- /**
- * always 3 coordinates in the UNV file, no matter
- * which dimensionality libMesh is in
- */
- TNodeLab aLabel;
- std::string num_buf;
- for(; !in_stream.eof();){
- in_stream >> aLabel ;
- if(aLabel == -1){
- // end of dataset is reached
- break;
- }
-
- TRecord aRec;
- in_stream>>aRec.exp_coord_sys_num;
- in_stream>>aRec.disp_coord_sys_num;
- in_stream>>aRec.color;
-
- /*
- * take care of the
- * floating-point data
- */
- for(int d = 0; d < 3; d++){
- in_stream>>num_buf;
- aRec.coord[d] = D_to_e(num_buf);
- }
-
- theDataSet.insert(TDataSet::value_type(aLabel,aRec));
- }
-}
-
-
-void UNV2411::Write(std::ofstream& out_stream, const TDataSet& theDataSet)
-{
- if(!out_stream.good())
- EXCEPTION(runtime_error,"ERROR: Output file not good.");
-
- /*
- * Write beginning of dataset
- */
- out_stream<<" -1\n";
- out_stream<<" "<<_label_dataset<<"\n";
-
- TDataSet::const_iterator anIter = theDataSet.begin();
- for(; anIter != theDataSet.end(); anIter++){
- const TNodeLab& aLabel = anIter->first;
- const TRecord& aRec = anIter->second;
- char buf[78];
- sprintf(buf, "%10d%10d%10d%10d\n",
- aLabel,
- aRec.exp_coord_sys_num,
- aRec.disp_coord_sys_num,
- aRec.color);
- out_stream<<buf;
-
- // the coordinates
- sprintf(buf, "%25.16E%25.16E%25.16E\n",
- aRec.coord[0],
- aRec.coord[1],
- aRec.coord[2]);
- out_stream<<buf;
- }
-
-
- /*
- * Write end of dataset
- */
- out_stream<<" -1\n";
-}
+++ /dev/null
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-#ifndef UNV2411_Structure_HeaderFile
-#define UNV2411_Structure_HeaderFile
-
-#include <map>
-#include <fstream>
-
-namespace UNV2411{
-
- struct TRecord{
- TRecord();
- int exp_coord_sys_num; // export coordinate system number
- int disp_coord_sys_num; // displacement coordinate system number
- int color; // color
- double coord[3]; // node coordinates in the part coordinate system
- };
-
- typedef int TNodeLab; // type of node label
- typedef std::map<TNodeLab,TRecord> TDataSet;
-
- void Read(std::ifstream& in_stream, TDataSet& theDataSet);
-
- void Write(std::ofstream& out_stream, const TDataSet& theDataSet);
-
-};
-
-
-#endif
+++ /dev/null
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-#include <fstream>
-#include <iomanip>
-
-#include "UNV2412_Structure.hxx"
-#include "UNV_Utilities.hxx"
-
-using namespace std;
-using namespace UNV;
-using namespace UNV2412;
-
-#ifdef _DEBUG_
-static int MYDEBUG = 1;
-#else
-static int MYDEBUG = 0;
-#endif
-
-static string _label_dataset = "2412";
-
-UNV2412::TRecord::TRecord():
- phys_prop_tab_num(2),
- mat_prop_tab_num(1),
- color(7),
- beam_orientation(0),
- beam_fore_end(0),
- beam_aft_end(0)
-{}
-
-void UNV2412::Read(std::ifstream& in_stream, TDataSet& theDataSet)
-{
- if(!in_stream.good())
- EXCEPTION(runtime_error,"ERROR: Input file not good.");
-
- /*
- * adjust the \p istream to our
- * position
- */
- if(!beginning_of_dataset(in_stream,_label_dataset))
- EXCEPTION(runtime_error,"ERROR: Could not find "<<_label_dataset<<" dataset!");
-
- TElementLab aLabel;
- for(; !in_stream.eof();){
- in_stream >> aLabel ;
- if(aLabel == -1){
- // end of dataset is reached
- break;
- }
-
- int n_nodes;
- TRecord aRec;
- in_stream>>aRec.fe_descriptor_id;
- in_stream>>aRec.phys_prop_tab_num;
- in_stream>>aRec.mat_prop_tab_num;
- in_stream>>aRec.color;
- in_stream>>n_nodes;
-
- if(IsBeam(aRec.fe_descriptor_id)){
- in_stream>>aRec.beam_orientation;
- in_stream>>aRec.beam_fore_end;
- in_stream>>aRec.beam_aft_end;
- }
-
- aRec.node_labels.resize(n_nodes);
- for(int j=0; j < n_nodes; j++){
- // read node labels
- in_stream>>aRec.node_labels[j];
- }
-
- theDataSet.insert(TDataSet::value_type(aLabel,aRec));
- }
-
-}
-
-
-void UNV2412::Write(std::ofstream& out_stream, const TDataSet& theDataSet)
-{
- if(!out_stream.good())
- EXCEPTION(runtime_error,"ERROR: Output file not good.");
-
- /*
- * Write beginning of dataset
- */
- out_stream<<" -1\n";
- out_stream<<" "<<_label_dataset<<"\n";
-
- TDataSet::const_iterator anIter = theDataSet.begin();
- for(; anIter != theDataSet.end(); anIter++){
- const TElementLab& aLabel = anIter->first;
- const TRecord& aRec = anIter->second;
- out_stream<<std::setw(10)<<aLabel; /* element ID */
- out_stream<<std::setw(10)<<aRec.fe_descriptor_id; /* type of element */
- out_stream<<std::setw(10)<<aRec.phys_prop_tab_num;
- out_stream<<std::setw(10)<<aRec.mat_prop_tab_num;
- out_stream<<std::setw(10)<<aRec.color;
- out_stream<<std::setw(10)<<aRec.node_labels.size()<<std::endl; /* No. of nodes per element */
-
- if(IsBeam(aRec.fe_descriptor_id)){
- out_stream<<std::setw(10)<<aRec.beam_orientation;
- out_stream<<std::setw(10)<<aRec.beam_fore_end;
- out_stream<<std::setw(10)<<aRec.beam_aft_end<<std::endl;
- }
-
- int n_nodes = aRec.node_labels.size();
- int iEnd = (n_nodes-1)/8 + 1;
- for(int i = 0, k = 0; i < iEnd; i++){
- int jEnd = n_nodes - 8*(i+1);
- if(jEnd < 0)
- jEnd = 8 + jEnd;
- else
- jEnd = 8;
- for(int j = 0; j < jEnd ; k++, j++){
- out_stream<<std::setw(10)<<aRec.node_labels[k];
- }
- out_stream<<std::endl;
- }
- }
-
- /*
- * Write end of dataset
- */
- out_stream<<" -1\n";
-}
-
-
-bool UNV2412::IsBeam(int theFeDescriptorId){
- switch (theFeDescriptorId){
- case 11:
- case 21:
- case 22:
- case 24:
- case 25:
- return true;
- }
- return false;
-}
-
-
-bool UNV2412::IsFace(int theFeDescriptorId){
- switch (theFeDescriptorId){
-
- case 71: // TRI3
- case 72:
- case 74:
-
- case 41: // Plane Stress Linear Triangle - TRI3
- case 91: // Thin Shell Linear Triangle - TRI3
-
- case 42: // Plane Stress Quadratic Triangle - TRI6
- case 92: // Thin Shell Quadratic Triangle - TRI6
-
- case 43: // Plane Stress Cubic Triangle
-
- case 44: // Plane Stress Linear Quadrilateral - QUAD4
- case 94: // Thin Shell Linear Quadrilateral - QUAD4
-
- case 45: // Plane Stress Quadratic Quadrilateral - QUAD8
- case 95: // Thin Shell Quadratic Quadrilateral - QUAD8
-
- case 46: // Plane Stress Cubic Quadrilateral
-
- return true;
- }
- return false;
-}
-
-
-bool UNV2412::IsVolume(int theFeDescriptorId){
- //if(!IsBeam(theFeDescriptorId) && !IsFace(theFeDescriptorId))
- // return true;
- switch (theFeDescriptorId){
-
- case 111: // Solid Linear Tetrahedron - TET4
- case 118: // Solid Quadratic Tetrahedron - TET10
-
- case 112: // Solid Linear Prism - PRISM6
- case 113: // Solid Quadratic Prism - PRISM15
-
- case 115: // Solid Linear Brick - HEX8
- case 116: // Solid Quadratic Brick - HEX20
-
- case 117: // Solid Cubic Brick
- return true;
- }
- return false;
-}
+++ /dev/null
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-#ifndef UNV2412_Structure_HeaderFile
-#define UNV2412_Structure_HeaderFile
-
-#include <map>
-#include <vector>
-#include <fstream>
-
-
-namespace UNV2412{
-
- typedef std::vector<int> TNodeLabels; // Nodal connectivities
-
- struct TRecord{
- TRecord();
-
- int fe_descriptor_id; // FE descriptor id
- int phys_prop_tab_num; // physical property table number
- int mat_prop_tab_num; // material property table number
- int color; // color
- TNodeLabels node_labels; // node labels defining element
-
- //FOR BEAM ELEMENTS ONLY
- int beam_orientation; // beam orientation node number
- int beam_fore_end; // beam fore-end cross section number
- int beam_aft_end; // beam aft-end cross section number
- };
-
- typedef int TElementLab; // type of element label
- typedef std::map<TElementLab,TRecord> TDataSet;
-
- void Read(std::ifstream& in_stream, TDataSet& theDataSet);
-
- void Write(std::ofstream& out_stream, const TDataSet& theDataSet);
-
- bool IsBeam(int theFeDescriptorId);
- bool IsFace(int theFeDescriptorId);
- bool IsVolume(int theFeDescriptorId);
-
-};
-
-
-#endif
+++ /dev/null
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-#include "UNV2411_Structure.hxx"
-#include "UNV2412_Structure.hxx"
-#include "UNV_Utilities.hxx"
-
-#include "DriverUNV_R_SMDS_Mesh.h"
-#include "DriverUNV_W_SMDS_Mesh.h"
-
-using namespace std;
-
-#ifdef DEBUG
-static int MYDEBUG = 1;
-#else
-static int MYDEBUG = 0;
-#endif
-
-
-void ReadMed(const char* theFileName){
- std::ifstream in_stream(theFileName);
-
- UNV2411::TDataSet aDataSet2411;
- UNV2411::Read(in_stream,aDataSet2411);
-
- in_stream.seekg(0);
- UNV2412::TDataSet aDataSet2412;
- UNV2412::Read(in_stream,aDataSet2412);
-
- string aFileName(theFileName);
- aFileName += "-";
- std::ofstream out_stream(aFileName.c_str());
-
- UNV2411::Write(out_stream,aDataSet2411);
- UNV2412::Write(out_stream,aDataSet2412);
-}
-
-
-int main(int argc, char** argv){
- DriverUNV_R_SMDS_Mesh aR;
- DriverUNV_W_SMDS_Mesh aW;
- try{
- if(argc > 1){
- ReadMed(argv[1]);
- }
- return 0;
- }catch(std::exception& exc){
- MESSAGE("Follow exception was accured :\n"<<exc.what());
- }catch(...){
- MESSAGE("Unknown exception was accured !!!");
- }
- return 1;
-}
+++ /dev/null
-// Copyright (C) 2003 CEA/DEN, EDF R&D
-//
-//
-//
-// File : VISU_DatConvertor.cxx
-// Author : Alexey PETROV
-// Module : VISU
-
-#include "UNV_Utilities.hxx"
-
-using namespace std;
-
-#ifdef _DEBUG_
-static int MYDEBUG = 1;
-#else
-static int MYDEBUG = 0;
-#endif
-
-
-int UNV::PrefixPrinter::myCounter = 0;
-
-UNV::PrefixPrinter::PrefixPrinter()
-{
- myCounter++;
-}
-
-UNV::PrefixPrinter::~PrefixPrinter()
-{
- myCounter--;
-}
-
-string UNV::PrefixPrinter::GetPrefix()
-{
- if(myCounter)
- return string(myCounter*2,' ');
- return "";
-}
+++ /dev/null
-// Copyright (C) 2003 CEA/DEN, EDF R&D
-//
-//
-//
-// File : VISU_DatConvertor.hxx
-// Author : Alexey PETROV
-// Module : VISU
-
-#ifndef MED_Utilities_HeaderFile
-#define MED_Utilities_HeaderFile
-
-#include <iostream>
-#include <sstream>
-#include <string>
-#include <stdexcept>
-#include <cassert>
-
-namespace UNV{
- using namespace std;
-
- class PrefixPrinter{
- static int myCounter;
- public:
- PrefixPrinter();
- ~PrefixPrinter();
-
- static string GetPrefix();
- };
-
- /**
- * @returns \p false when error occured, \p true otherwise.
- * Adjusts the \p in_stream to the beginning of the
- * dataset \p ds_name.
- */
- inline bool beginning_of_dataset(std::istream& in_file, const std::string& ds_name)
- {
- assert (in_file.good());
- assert (!ds_name.empty());
-
- std::string olds, news;
-
- while(true){
- in_file >> olds >> news;
- /*
- * a "-1" followed by a number means the beginning of a dataset
- * stop combing at the end of the file
- */
- while( ((olds != "-1") || (news == "-1") ) && !in_file.eof() ){
- olds = news;
- in_file >> news;
- }
- if(in_file.eof())
- return false;
- if (news == ds_name)
- return true;
- }
- // should never end up here
- return false;
- }
-
- /**
- * Method for converting exponential notation
- * from "D" to "e", for example
- * \p 3.141592654D+00 \p --> \p 3.141592654e+00
- * in order to make it readable for C++.
- */
- inline double D_to_e(std::string& number)
- {
- /* find "D" in string, start looking at
- * 6th element, to improve speed.
- * We dont expect a "D" earlier
- */
- const int position = number.find("D",6);
- if(position != std::string::npos){
- number.replace(position, 1, "e");
- }
- return atof (number.c_str());
- }
-
-};
-
-
-#ifndef MESSAGE
-
-#define MESSAGE(msg) std::cout<<__FILE__<<"["<<__LINE__<<"]::"<<msg<<endl;
-
-#define BEGMSG(msg) std::cout<<UNV::PrefixPrinter::GetPrefix()<<msg
-
-#define ADDMSG(msg) std::cout<<msg
-
-#endif
-
-
-#ifndef EXCEPTION
-
-#define EXCEPTION(TYPE, MSG) {\
- std::ostringstream aStream;\
- aStream<<__FILE__<<"["<<__LINE__<<"]::"<<MSG;\
- throw TYPE(aStream.str());\
-}
-
-#endif
-
-#endif
+++ /dev/null
-// MEFISTO : library to compute 2D triangulation from segmented boundaries
-//
-// Copyright (C) 2003 Laboratoire J.-L. Lions UPMC Paris
-//
-// 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.ann.jussieu.fr/~perronne or email Perronnet@ann.jussieu.fr
-// or email Hecht@ann.jussieu.fr
-//
-//
-// File : Rn.h
-// Module : SMESH
-// Authors: Frederic HECHT & Alain PERRONNET
-//
-
-#ifndef Rn__h
-#define Rn__h
-
-#include <gp_Pnt.hxx> //Dans OpenCascade
-#include <gp_Vec.hxx> //Dans OpenCascade
-#include <gp_Dir.hxx> //Dans OpenCascade
-
-//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-// BUT: Definir les espaces affines R R2 R3 R4 soit Rn pour n=1,2,3,4
-//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-// AUTEUR : Frederic HECHT ANALYSE NUMERIQUE UPMC PARIS OCTOBRE 2000
-// MODIFS : Alain PERRONNET ANALYSE NUMERIQUE UPMC PARIS NOVEMBRE 2000
-//...............................................................................
-#include <iostream>
-#include <cmath>
-
-
-template<class T> inline T Abs (const T &a){return a <0 ? -a : a;}
-template<class T> inline void Echange (T& a,T& b) {T c=a;a=b;b=c;}
-
-template<class T> inline T Min (const T &a,const T &b) {return a < b ? a : b;}
-template<class T> inline T Max (const T &a,const T & b) {return a > b ? a : b;}
-
-template<class T> inline T Max (const T &a,const T & b,const T & c){return Max(Max(a,b),c);}
-template<class T> inline T Min (const T &a,const T & b,const T & c){return Min(Min(a,b),c);}
-
-template<class T> inline T Max (const T &a,const T & b,const T & c,const T & d)
- {return Max(Max(a,b),Max(c,d));}
-template<class T> inline T Min (const T &a,const T & b,const T & c,const T & d)
- {return Min(Min(a,b),Min(c,d));}
-
-//le type Nom des entites geometriques P L S V O
-//===========
-typedef char Nom[1+24];
-
-//le type N des nombres entiers positifs
-//=========
-typedef unsigned long int N;
-
-//le type Z des nombres entiers relatifs
-//=========
-typedef long int Z;
-
-//le type R des nombres "reels"
-//=========
-typedef double R;
-
-//le type XPoint des coordonnees d'un pixel dans une fenetre
-//==============
-//typedef struct { short int x,y } XPoint; //en fait ce type est defini dans X11-Window
- // #include <X11/Xlib.h>
-//la classe R2
-//============
-class R2
-{
- friend std::ostream& operator << (std::ostream& f, const R2 & P)
- { f << P.x << ' ' << P.y ; return f; }
- friend std::istream& operator >> (std::istream& f, R2 & P)
- { f >> P.x >> P.y ; return f; }
-
- friend std::ostream& operator << (std::ostream& f, const R2 * P)
- { f << P->x << ' ' << P->y ; return f; }
- friend std::istream& operator >> (std::istream& f, R2 * P)
- { f >> P->x >> P->y ; return f; }
-
-public:
- R x,y; //les donnees
-
- R2 () :x(0),y(0) {} //les constructeurs
- R2 (R a,R b) :x(a),y(b) {}
- R2 (R2 A,R2 B) :x(B.x-A.x),y(B.y-A.y) {} //vecteur defini par 2 points
-
- R2 operator+(R2 P) const {return R2(x+P.x,y+P.y);} // Q+P possible
- R2 operator+=(R2 P) {x += P.x;y += P.y; return *this;}// Q+=P;
- R2 operator-(R2 P) const {return R2(x-P.x,y-P.y);} // Q-P
- R2 operator-=(R2 P) {x -= P.x;y -= P.y; return *this;} // Q-=P;
- R2 operator-()const {return R2(-x,-y);} // -Q
- R2 operator+()const {return *this;} // +Q
- R operator,(R2 P)const {return x*P.x+y*P.y;} // produit scalaire (Q,P)
- R operator^(R2 P)const {return x*P.y-y*P.x;} // produit vectoriel Q^P
- R2 operator*(R c)const {return R2(x*c,y*c);} // produit a droite P*c
- R2 operator*=(R c) {x *= c; y *= c; return *this;}
- R2 operator/(R c)const {return R2(x/c,y/c);} // division par un reel
- R2 operator/=(R c) {x /= c; y /= c; return *this;}
- R & operator[](int i) {return (&x)[i];} // la coordonnee i
- R2 orthogonal() {return R2(-y,x);} //le vecteur orthogonal dans R2
- friend R2 operator*(R c,R2 P) {return P*c;} // produit a gauche c*P
-};
-
-
-//la classe R3
-//============
-class R3
-{
- friend std::ostream& operator << (std::ostream& f, const R3 & P)
- { f << P.x << ' ' << P.y << ' ' << P.z ; return f; }
- friend std::istream& operator >> (std::istream& f, R3 & P)
- { f >> P.x >> P.y >> P.z ; return f; }
-
- friend std::ostream& operator << (std::ostream& f, const R3 * P)
- { f << P->x << ' ' << P->y << ' ' << P->z ; return f; }
- friend std::istream& operator >> (std::istream& f, R3 * P)
- { f >> P->x >> P->y >> P->z ; return f; }
-
-public:
- R x,y,z; //les 3 coordonnees
-
- R3 () :x(0),y(0),z(0) {} //les constructeurs
- R3 (R a,R b,R c):x(a),y(b),z(c) {} //Point ou Vecteur (a,b,c)
- R3 (R3 A,R3 B):x(B.x-A.x),y(B.y-A.y),z(B.z-A.z) {} //Vecteur AB
-
- R3 (gp_Pnt P) : x(P.X()), y(P.Y()), z(P.Z()) {} //Point d'OpenCascade
- R3 (gp_Vec V) : x(V.X()), y(V.Y()), z(V.Z()) {} //Vecteur d'OpenCascade
- R3 (gp_Dir P) : x(P.X()), y(P.Y()), z(P.Z()) {} //Direction d'OpenCascade
-
- R3 operator+(R3 P)const {return R3(x+P.x,y+P.y,z+P.z);}
- R3 operator+=(R3 P) {x += P.x; y += P.y; z += P.z; return *this;}
- R3 operator-(R3 P)const {return R3(x-P.x,y-P.y,z-P.z);}
- R3 operator-=(R3 P) {x -= P.x; y -= P.y; z -= P.z; return *this;}
- R3 operator-()const {return R3(-x,-y,-z);}
- R3 operator+()const {return *this;}
- R operator,(R3 P)const {return x*P.x+y*P.y+z*P.z;} // produit scalaire
- R3 operator^(R3 P)const {return R3(y*P.z-z*P.y ,P.x*z-x*P.z, x*P.y-y*P.x);} // produit vectoriel
- R3 operator*(R c)const {return R3(x*c,y*c,z*c);}
- R3 operator*=(R c) {x *= c; y *= c; z *= c; return *this;}
- R3 operator/(R c)const {return R3(x/c,y/c,z/c);}
- R3 operator/=(R c) {x /= c; y /= c; z /= c; return *this;}
- R & operator[](int i) {return (&x)[i];}
- friend R3 operator*(R c,R3 P) {return P*c;}
-
- R3 operator=(gp_Pnt P) {return R3(P.X(),P.Y(),P.Z());}
- R3 operator=(gp_Dir P) {return R3(P.X(),P.Y(),P.Z());}
-
- friend gp_Pnt gp_pnt(R3 xyz) { return gp_Pnt(xyz.x,xyz.y,xyz.z); }
- //friend gp_Pnt operator=() { return gp_Pnt(x,y,z); }
- friend gp_Dir gp_dir(R3 xyz) { return gp_Dir(xyz.x,xyz.y,xyz.z); }
-
- bool DansPave( R3 & xyzMin, R3 & xyzMax )
- { return xyzMin.x<=x && x<=xyzMax.x &&
- xyzMin.y<=y && y<=xyzMax.y &&
- xyzMin.z<=z && z<=xyzMax.z; }
-};
-
-//la classe R4
-//============
-class R4: public R3
-{
- friend std::ostream& operator <<(std::ostream& f, const R4 & P )
- { f << P.x << ' ' << P.y << ' ' << P.z << ' ' << P.omega; return f; }
- friend istream& operator >>(istream& f, R4 & P)
- { f >> P.x >> P.y >> P.z >> P.omega ; return f; }
-
- friend std::ostream& operator <<(std::ostream& f, const R4 * P )
- { f << P->x << ' ' << P->y << ' ' << P->z << ' ' << P->omega; return f; }
- friend istream& operator >>(istream& f, R4 * P)
- { f >> P->x >> P->y >> P->z >> P->omega ; return f; }
-
-public:
- R omega; //la donnee du poids supplementaire
-
- R4 () :omega(1.0) {} //les constructeurs
- R4 (R a,R b,R c,R d):R3(a,b,c),omega(d) {}
- R4 (R4 A,R4 B) :R3(B.x-A.x,B.y-A.y,B.z-A.z),omega(B.omega-A.omega) {}
-
- R4 operator+(R4 P)const {return R4(x+P.x,y+P.y,z+P.z,omega+P.omega);}
- R4 operator+=(R4 P) {x += P.x;y += P.y;z += P.z;omega += P.omega;return *this;}
- R4 operator-(R4 P)const {return R4(x-P.x,y-P.y,z-P.z,omega-P.omega);}
- R4 operator-=(R4 P) {x -= P.x;y -= P.y;z -= P.z;omega -= P.omega;return *this;}
- R4 operator-()const {return R4(-x,-y,-z,-omega);}
- R4 operator+()const {return *this;}
- R operator,(R4 P)const {return x*P.x+y*P.y+z*P.z+omega*P.omega;} // produit scalaire
- R4 operator*(R c)const {return R4(x*c,y*c,z*c,omega*c);}
- R4 operator*=(R c) {x *= c; y *= c; z *= c; omega *= c; return *this;}
- R4 operator/(R c)const {return R4(x/c,y/c,z/c,omega/c);}
- R4 operator/=(R c) {x /= c; y /= c; z /= c; omega /= c; return *this;}
- R & operator[](int i) {return (&x)[i];}
- friend R4 operator*(R c,R4 P) {return P*c;}
-};
-
-//quelques fonctions supplementaires sur ces classes
-//==================================================
-inline R Aire2d(const R2 A,const R2 B,const R2 C){return (B-A)^(C-A);}
-inline R Angle2d(R2 P){ return atan2(P.y,P.x);}
-
-inline R Norme2_2(const R2 & A){ return (A,A);}
-inline R Norme2(const R2 & A){ return sqrt((A,A));}
-inline R NormeInfinie(const R2 & A){return Max(Abs(A.x),Abs(A.y));}
-
-inline R Norme2_2(const R3 & A){ return (A,A);}
-inline R Norme2(const R3 & A){ return sqrt((A,A));}
-inline R NormeInfinie(const R3 & A){return Max(Abs(A.x),Abs(A.y),Abs(A.z));}
-
-inline R Norme2_2(const R4 & A){ return (A,A);}
-inline R Norme2(const R4 & A){ return sqrt((A,A));}
-inline R NormeInfinie(const R4 & A){return Max(Abs(A.x),Abs(A.y),Abs(A.z),Abs(A.omega));}
-
-inline R2 XY(R3 P) {return R2(P.x, P.y);} //restriction a R2 d'un R3 par perte de z
-inline R3 Min(R3 P, R3 Q)
-{return R3(P.x<Q.x ? P.x : Q.x, P.y<Q.y ? P.y : Q.y, P.z<Q.z ? P.z : Q.z);} //Pt de xyz Min
-inline R3 Max(R3 P, R3 Q)
-{return R3(P.x>Q.x ? P.x : Q.x, P.y>Q.y ? P.y : Q.y, P.z>Q.z ? P.z : Q.z);} //Pt de xyz Max
-
-#endif
+++ /dev/null
-// MEFISTO : library to compute 2D triangulation from segmented boundaries
-//
-// Copyright (C) 2003 Laboratoire J.-L. Lions UPMC Paris
-//
-// 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.ann.jussieu.fr/~perronne or email Perronnet@ann.jussieu.fr
-//
-//
-// File : aptrte.cxx
-// Module : SMESH
-// Author: Alain PERRONNET
-
-#include "Rn.h"
-#include "aptrte.h"
-#include "utilities.h"
-
-using namespace std;
-
-extern "C"
-{
- R aretemaxface_;
- R areteideale_( R3 xyz, R3 direction )
- {
- return aretemaxface_;
- }
-}
-//calcul de la longueur ideale de l'arete au sommet xyz (z ici inactif)
-//dans la direction donnee
-//a ajuster pour chaque surface plane et selon l'entier notysu (voir plus bas)
-
-
-static double cpunew, cpuold=0;
-
-void tempscpu_( double & tempsec )
-//Retourne le temps CPU utilise en secondes
-{
- tempsec = ( (double) clock() ) / CLOCKS_PER_SEC;
- //MESSAGE( "temps cpu=" << tempsec );
-}
-
-
-void deltacpu_( R & dtcpu )
-//Retourne le temps CPU utilise en secondes depuis le precedent appel
-{
- tempscpu_( cpunew );
- dtcpu = R( cpunew - cpuold );
- cpuold = cpunew;
- //MESSAGE( "delta temps cpu=" << dtcpu );
- return;
-}
-
-
-void aptrte( Z nutysu, R aretmx,
- Z nblf, Z * nudslf, R2 * uvslf,
- Z nbpti, R2 *uvpti,
- Z & nbst, R2 * & uvst, Z & nbt, Z * & nust,
- Z & ierr )
-//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-// but : appel de la triangulation par un arbre-4 recouvrant
-// ----- de triangles equilateraux
-// le contour du domaine plan est defini par des lignes fermees
-// la premiere ligne etant l'enveloppe de toutes les autres
-// la fonction areteideale(s,d) donne la taille d'arete
-// au point s dans la direction (actuellement inactive) d
-// des lors toute arete issue d'un sommet s devrait avoir une longueur
-// comprise entre 0.65 areteideale_(s,d) et 1.3 areteideale_(s,d)
-//
-//Attention:
-// Les tableaux uvslf et uvpti sont supposes ne pas avoir de sommets identiques!
-// De meme, un sommet d'une ligne fermee ne peut appartenir a une autre ligne fermee
-//
-// entrees:
-// --------
-// nutysu : numero de traitement de areteideale_(s,d) selon le type de surface
-// 0 pas d'emploi de la fonction areteideale_() et aretmx est active
-// 1 il existe une fonction areteideale_(s,d)
-// dont seules les 2 premieres composantes de uv sont actives
-// ... autres options a definir ...
-// aretmx : longueur maximale des aretes de la future triangulation
-// nblf : nombre de lignes fermees de la surface
-// nudslf : numero du dernier sommet de chacune des nblf lignes fermees
-// nudslf(0)=0 pour permettre la difference sans test
-// Attention le dernier sommet de chaque ligne est raccorde au premier
-// tous les sommets et les points internes ont des coordonnees
-// UV differentes <=> Pas de point double!
-// uvslf : uv des nudslf(nblf) sommets des lignes fermees
-// nbpti : nombre de points internes futurs sommets de la triangulation
-// uvpti : uv des points internes futurs sommets de la triangulation
-//
-// sorties:
-// --------
-// nbst : nombre de sommets de la triangulation finale
-// uvst : coordonnees uv des nbst sommets de la triangulation
-// nbt : nombre de triangles de la triangulation finale
-// nust : 4 numeros dans uvst des sommets des nbt triangles
-// s1, s2, s3, 0: no dans uvst des 3 sommets et 0 car quadrangle!
-// ierr : 0 si pas d'erreur
-// > 0 sinon
-//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-// auteur : Alain Perronnet Analyse Numerique Paris UPMC decembre 2001
-//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-{
- R d, tcpu=0;
- R3 direction=R3(0,0,0); //direction pour areteideale() inactive ici!
- Z nbarfr=nudslf[nblf]; //nombre total d'aretes des lignes fermees
- Z mxtrou = Max( 1024, nblf ); //nombre maximal de trous dans la surface
-
- R3 *mnpxyd=NULL;
- Z *mnsoar=NULL, mosoar=7, mxsoar, n1soar; //le hachage des aretes
- Z *mnartr=NULL, moartr=3, mxartr, n1artr; //le no des 3 aretes des triangles
- Z *mntree=NULL, motree=9, mxtree; //L'arbre 4 de TE et nombre d'entiers par TE
- Z *mnqueu=NULL, mxqueu;
- Z *mn1arcf=NULL;
- Z *mnarcf=NULL, mxarcf;
- Z *mnarcf1=NULL;
- Z *mnarcf2=NULL;
- Z *mnarcf3=NULL;
- Z *mntrsu=NULL;
- Z *mndalf=NULL;
- Z *mnslig=NULL;
- Z *mnarst=NULL;
- Z *mnlftr=NULL;
-
- R3 comxmi[2]; //coordonnees UV Min et Maximales
- R aremin, aremax; //longueur minimale et maximale des aretes
- R quamoy, quamin;
-
- Z noar0, noar, na;
- Z i, l, n, ns, ns0, ns1, ns2, nosotr[3], nt;
- Z mxsomm, nbsomm, nbarpi, nbarli, ndtri0, mn;
- Z moins1=-1;
-
- aretemaxface_ = aretmx;
-
- // initialisation du temps cpu
- deltacpu_( d );
- ierr = 0;
-
- // quelques reservations de tableaux pour faire les calculs
- // ========================================================
- // le tableau pointeur sur la premiere arete de chaque ligne fermee
- if( mndalf!=NULL ) delete [] mndalf;
- mndalf = new Z[1+nblf];
- if( mndalf==NULL ) goto ERREUR;
- mndalf[0]=0;
-
- // declaration du tableau des coordonnees des sommets de la frontiere
- // puis des sommets internes ajoutes
- // majoration empirique du nombre de sommets de la triangulation
- i = 4*nbarfr/10;
- mxsomm = Max( 20000, 64*nbpti+i*i );
- MESSAGE( "APTRTE: Depart de la triangulation avec " );
- MESSAGE( "nutysu=" << nutysu << " aretmx=" << aretmx << " mxsomm=" << mxsomm );
-
- NEWDEPART:
- //mnpxyd( 3, mxsomm ) les coordonnees UV des sommets et la taille d'arete aux sommets
- if( mnpxyd!=NULL ) delete [] mnpxyd;
- mnpxyd = new R3[mxsomm];
- if( mnpxyd==NULL ) goto ERREUR;
-
- // le tableau mnsoar des aretes des triangles
- // 1: sommet 1 dans pxyd,
- // 2: sommet 2 dans pxyd,
- // 3: numero de 1 a nblf de la ligne qui supporte l'arete
- // 4: numero dans mnartr du triangle 1 partageant cette arete,
- // 5: numero dans mnartr du triangle 2 partageant cette arete,
- // 6: chainage des aretes frontalieres ou internes ou
- // des aretes simples des etoiles de triangles,
- // 7: chainage du hachage des aretes
- // nombre d'aretes = 3 ( nombre de sommets - 1 + nombre de trous )
- // pour le hachage des aretes mxsoar doit etre > 3*mxsomm!
- // h(ns1,ns2) = min( ns1, ns2 )
- if( mnsoar!=NULL ) delete [] mnsoar;
- mxsoar = 3 * ( mxsomm + mxtrou );
- mnsoar = new Z[mosoar*mxsoar];
- if( mnsoar==NULL ) goto ERREUR;
- //initialiser le tableau mnsoar pour le hachage des aretes
- insoar_( mxsomm, mosoar, mxsoar, n1soar, mnsoar );
-
- // mnarst( mxsomm ) numero mnsoar d'une arete pour chacun des sommets
- if( mnarst!=NULL ) delete [] mnarst;
- mnarst = new Z[1+mxsomm];
- if( mnarst==NULL ) goto ERREUR;
- n = 1+mxsomm;
- azeroi_( n, mnarst );
-
- // mnslig( mxsomm ) no de sommet dans sa ligne pour chaque sommet frontalier
- // ou no du point si interne forc'e par l'utilisateur
- // ou 0 si interne cree par le module
- if( mnslig!=NULL ) delete [] mnslig;
- mnslig = new Z[mxsomm];
- if( mnslig==NULL ) goto ERREUR;
- azeroi_( mxsomm, mnslig );
-
- // initialisation des aretes frontalieres de la triangulation future
- // renumerotation des sommets des aretes des lignes pour la triangulation
- // mise a l'echelle des coordonnees des sommets pour obtenir une
- // meilleure precision lors des calculs + quelques verifications
- // boucle sur les lignes fermees qui forment la frontiere
- // ======================================================================
- noar = 0;
- aremin = 1e100;
- aremax = 0;
-
- for (n=1; n<=nblf; n++)
- {
- //l'initialisation de la premiere arete de la ligne n dans la triangulation
- //-------------------------------------------------------------------------
- //le sommet ns0 est le numero de l'origine de la ligne
- ns0 = nudslf[n-1];
- mnpxyd[ns0].x = uvslf[ns0].x;
- mnpxyd[ns0].y = uvslf[ns0].y;
- mnpxyd[ns0].z = areteideale_( mnpxyd[ns0], direction );
-// MESSAGE("Sommet " << ns0 << ": " << mnpxyd[ns0].x
-// << " " << mnpxyd[ns0].y << " longueur arete=" << mnpxyd[ns0].z);
-
- //carre de la longueur de l'arete 1 de la ligne fermee n
- d = pow( uvslf[ns0+1].x - uvslf[ns0].x, 2 )
- + pow( uvslf[ns0+1].y - uvslf[ns0].y, 2 ) ;
- aremin = Min( aremin, d );
- aremax = Max( aremax, d );
-
- //le numero des 2 sommets (ns1,ns2) de la premiere arete de la ligne
- //initialisation de la 1-ere arete ns1-ns1+1 de cette ligne fermee n
- //le numero des 2 sommets ns1 ns2 de la 1-ere arete
- //Attention: les numeros ns debutent a 1 (ils ont >0)
- // les tableaux c++ demarrent a zero!
- // les tableaux fortran demarrent ou l'on veut!
- ns0++;
- ns1 = ns0;
- ns2 = ns1+1;
-
- //le numero n de la ligne du sommet et son numero ns1 dans la ligne
- mnslig[ns0-1] = 1000000 * n + ns1-nudslf[n-1];
- fasoar_( ns1, ns2, moins1, moins1, n,
- mosoar, mxsoar, n1soar, mnsoar, mnarst,
- noar0, ierr );
- //pas de test sur ierr car pas de saturation possible a ce niveau
-
- //le pointeur dans le hachage sur la premiere arete de la ligne fermee n
- mndalf[n] = noar0;
-
- //la nouvelle arete est la suivante de l'arete definie juste avant
- if( noar > 0 )
- mnsoar[mosoar * noar - mosoar + 5] = noar0;
-
- //l'initialisation des aretes suivantes de la ligne dans la triangulation
- //-----------------------------------------------------------------------
- nbarli = nudslf[n] - nudslf[n-1]; //nombre d'aretes=sommets de la ligne n
- for (i=2; i<=nbarli; i++)
- {
- ns1 = ns2; //le numero de l'arete et le numero du premier sommet de l'arete
- if( i < nbarli )
- //nbs+1 est le 2-eme sommet de l'arete i de la ligne fermee n
- ns2 = ns1+1;
- else
- //le 2-eme sommet de la derniere arete est le premier sommet de la ligne
- ns2 = ns0;
-
- //l'arete precedente est dotee de sa suivante:celle cree ensuite
- //les 2 coordonnees du sommet ns2 de la ligne
- ns = ns1 - 1;
- mnpxyd[ns].x = uvslf[ns].x;
- mnpxyd[ns].y = uvslf[ns].y;
- mnpxyd[ns].z = areteideale_( mnpxyd[ns], direction );
-// MESSAGE("Sommet " << ns << ": " << mnpxyd[ns].x
-// << " " << mnpxyd[ns].y << " longueur arete=" << mnpxyd[ns].z);
-
- //carre de la longueur de l'arete
- d = pow( uvslf[ns2-1].x - uvslf[ns1-1].x, 2)
- + pow( uvslf[ns2-1].y - uvslf[ns1-1].y, 2);
- aremin = Min( aremin, d );
- aremax = Max( aremax, d );
-
- //le numero n de la ligne du sommet et son numero ns1 dans la ligne
- mnslig[ns] = 1000000 * n + ns1-nudslf[n-1];
-
- //ajout de l'arete dans la liste
- fasoar_( ns1, ns2, moins1, moins1, n,
- mosoar, mxsoar, n1soar, mnsoar,
- mnarst, noar, ierr );
- //pas de test sur ierr car pas de saturation possible a ce niveau
-
- //chainage des aretes frontalieres en position 6 du tableau mnsoar
- //la nouvelle arete est la suivante de l'arete definie juste avant
- mnsoar[ mosoar * noar0 - mosoar + 5 ] = noar;
- noar0 = noar;
- }
- //attention: la derniere arete de la ligne fermee enveloppe
- // devient en fait la premiere arete de cette ligne
- // dans le chainage des aretes de la frontiere!
- }
- if( ierr != 0 ) goto ERREUR;
-
- aremin = sqrt( aremin ); //longueur minimale d'une arete des lignes fermees
- aremax = sqrt( aremax ); //longueur maximale d'une arete
-
- aretmx = Min( aretmx, aremax ); //pour homogeneiser
- MESSAGE("nutysu=" << nutysu << " aretmx=" << aretmx
- << " arete min=" << aremin << " arete max=" << aremax);
-
- //chainage des aretes frontalieres : la derniere arete frontaliere
- mnsoar[ mosoar * noar - mosoar + 5 ] = 0;
-
- //tous les sommets et aretes frontaliers sont numerotes de 1 a nbarfr
- //reservation du tableau des numeros des 3 aretes de chaque triangle
- //mnartr( moartr, mxartr )
- //En nombre: Triangles = Aretes Internes + Aretes Frontalieres - Sommets + 1-Trous
- // 3Triangles = 2 Aretes internes + Aretes frontalieres
- // d'ou 3T/2 < AI + AF => T < 3T/2 - Sommets + 1-Trous
- //nombre de triangles < 2 ( nombre de sommets - 1 + nombre de trous )
- if( mnartr!=NULL ) delete [] mnartr;
- mxartr = 2 * ( mxsomm + mxtrou );
- mnartr = new Z[moartr*mxartr];
- if( mnartr==NULL ) goto ERREUR;
-
- //Ajout des points internes
- ns1 = nudslf[ nblf ];
- for (i=0; i<nbpti; i++)
- {
- //les 2 coordonnees du point i de sommet nbs
- mnpxyd[ns1].x = uvpti[i].x;
- mnpxyd[ns1].y = uvpti[i].y;
- mnpxyd[ns1].z = areteideale_( mnpxyd[ns1], direction );
- //le numero i du point interne
- mnslig[ns1] = i+1;
- ns1++;
- }
-
- //nombre de sommets de la frontiere et internes
- nbarpi = ns1;
-
- // creation de l'arbre-4 des te (tableau letree)
- // ajout dans les te des sommets des lignes et des points internes imposes
- // =======================================================================
- // premiere estimation de mxtree
- mxtree = 2 * mxsomm;
-
- NEWTREE: //en cas de saturation de l'un des tableaux, on boucle
- MESSAGE( "Debut triangulation avec mxsomm=" << mxsomm );
- if( mntree != NULL ) delete [] mntree;
- nbsomm = nbarpi;
- mntree = new Z[motree*(1+mxtree)];
- if( mntree==NULL ) goto ERREUR;
-
- //initialisation du tableau letree et ajout dans letree des sommets 1 a nbsomm
- teajte_( mxsomm, nbsomm, mnpxyd, comxmi, aretmx, mxtree, mntree, ierr );
- comxmi[0].z=0;
- comxmi[1].z=0;
-
- if( ierr == 51 )
- {
- //saturation de letree => sa taille est augmentee et relance
- mxtree = mxtree * 2;
- ierr = 0;
- MESSAGE( "Nouvelle valeur de mxtree=" << mxtree );
- goto NEWTREE;
- }
-
- deltacpu_( d );
- tcpu += d;
- MESSAGE( "Temps de l'ajout arbre-4 des Triangles Equilateraux=" << d << " secondes" );
- if( ierr != 0 ) goto ERREUR;
- //ici le tableau mnpxyd contient les sommets des te et les points frontaliers et internes
-
- // homogeneisation de l'arbre des te a un saut de taille au plus
- // prise en compte des tailles d'aretes souhaitees autour des sommets initiaux
- // ===========================================================================
- // reservation de la queue pour parcourir les te de l'arbre
- if( mnqueu != NULL ) delete [] mnqueu;
- mxqueu = mxtree;
- mnqueu = new Z[mxqueu];
- if( mnqueu==NULL) goto ERREUR;
-
- tehote_( nutysu, nbarpi, mxsomm, nbsomm, mnpxyd,
- comxmi, aretmx,
- mntree, mxqueu, mnqueu,
- ierr );
-
- deltacpu_( d );
- tcpu += d;
- MESSAGE("Temps de l'adaptation et l'homogeneisation de l'arbre-4 des TE="
- << d << " secondes");
- if( ierr != 0 )
- {
- //destruction du tableau auxiliaire et de l'arbre
- if( ierr == 51 )
- {
- //letree sature
- mxtree = mxtree * 2;
- MESSAGE( "Redemarrage avec la valeur de mxtree=" << mxtree );
- ierr = 0;
- goto NEWTREE;
- }
- else
- goto ERREUR;
- }
-
- // trianguler les triangles equilateraux feuilles a partir de leurs 3 sommets
- // et des points de la frontiere, des points internes imposes interieurs
- // ==========================================================================
- tetrte_( comxmi, aretmx, nbarpi, mxsomm, mnpxyd,
- mxqueu, mnqueu, mntree, mosoar, mxsoar, n1soar, mnsoar,
- moartr, mxartr, n1artr, mnartr, mnarst,
- ierr );
-
- // destruction de la queue et de l'arbre devenus inutiles
- delete [] mnqueu; mnqueu=NULL;
- delete [] mntree; mntree=NULL;
-
- //Temps calcul
- deltacpu_( d );
- tcpu += d;
- MESSAGE( "Temps de la triangulation des TE=" << d << " secondes" );
-
- // ierr =0 si pas d'erreur
- // =1 si le tableau mnsoar est sature
- // =2 si le tableau mnartr est sature
- // =3 si aucun des triangles ne contient l'un des points internes
- // =5 si saturation de la queue de parcours de l'arbre des te
- if( ierr != 0 ) goto ERREUR;
-
- //qualites de la triangulation actuelle
- qualitetrte( mnpxyd, mosoar, mxsoar, mnsoar, moartr, mxartr, mnartr,
- nbt, quamoy, quamin );
-
- // boucle sur les aretes internes (non sur une ligne de la frontiere)
- // avec echange des 2 diagonales afin de rendre la triangulation delaunay
- // ======================================================================
- // formation du chainage 6 des aretes internes a echanger eventuellement
- aisoar_( mosoar, mxsoar, mnsoar, na );
- tedela_( mnpxyd, mnarst,
- mosoar, mxsoar, n1soar, mnsoar, na,
- moartr, mxartr, n1artr, mnartr, n );
-
- MESSAGE( "Nombre d'echanges des diagonales de 2 triangles=" << n );
- deltacpu_( d );
- tcpu += d;
- MESSAGE("Temps de la triangulation Delaunay par echange des diagonales="
- << d << " secondes");
-
- //qualites de la triangulation actuelle
- qualitetrte( mnpxyd, mosoar, mxsoar, mnsoar, moartr, mxartr, mnartr,
- nbt, quamoy, quamin );
-
- // detection des aretes frontalieres initiales perdues
- // triangulation frontale pour les restaurer
- // ===================================================
- mxarcf = mxsomm/5;
- if( mn1arcf != NULL ) delete [] mn1arcf;
- if( mnarcf != NULL ) delete [] mnarcf;
- if( mnarcf1 != NULL ) delete [] mnarcf1;
- if( mnarcf2 != NULL ) delete [] mnarcf2;
- mn1arcf = new Z[1+mxarcf];
- if( mn1arcf == NULL ) goto ERREUR;
- mnarcf = new Z[3*mxarcf];
- if( mnarcf == NULL ) goto ERREUR;
- mnarcf1 = new Z[mxarcf];
- if( mnarcf1 == NULL ) goto ERREUR;
- mnarcf2 = new Z[mxarcf];
- if( mnarcf2 == NULL ) goto ERREUR;
-
- terefr_( nbarpi, mnpxyd,
- mosoar, mxsoar, n1soar, mnsoar,
- moartr, n1artr, mnartr, mnarst,
- mxarcf, mn1arcf, mnarcf, mnarcf1, mnarcf2,
- n, ierr );
-
- MESSAGE( "Restauration de " << n << " aretes perdues de la frontiere" );
- deltacpu_( d );
- tcpu += d;
- MESSAGE("Temps de la recuperation des aretes perdues de la frontiere="
- << d << " secondes");
-
- if( ierr != 0 ) goto ERREUR;
-
- //qualites de la triangulation actuelle
- qualitetrte( mnpxyd, mosoar, mxsoar, mnsoar, moartr, mxartr, mnartr,
- nbt, quamoy, quamin );
-
- // fin de la triangulation avec respect des aretes initiales frontalieres
-
- // suppression des triangles externes a la surface
- // ===============================================
- // recherche du dernier triangle utilise
- mn = mxartr * moartr;
- for ( ndtri0=mxartr; ndtri0<=1; ndtri0-- )
- {
- mn -= moartr;
- if( mnartr[mn] != 0 ) break;
- }
-
- if( mntrsu != NULL ) delete [] mntrsu;
- mntrsu = new Z[ndtri0];
- if( mntrsu == NULL ) goto ERREUR;
-
- if( mnlftr != NULL ) delete [] mnlftr;
- mnlftr = new Z[nblf];
- if( mnlftr == NULL ) goto ERREUR;
-
- for (n=0; n<nblf; n++) //numero de la ligne fermee de 1 a nblf
- mnlftr[n] = n+1;
-
- tesuex_( nblf, mnlftr,
- ndtri0, nbsomm, mnpxyd, mnslig,
- mosoar, mxsoar, mnsoar,
- moartr, mxartr, n1artr, mnartr, mnarst,
- nbt, mntrsu, ierr );
-
- delete [] mnlftr; mnlftr=NULL;
- delete [] mntrsu; mntrsu=NULL;
-
- deltacpu_( d );
- tcpu += d;
- MESSAGE( "Temps de la suppression des triangles externes=" << d );
- if( ierr != 0 ) goto ERREUR;
-
- //qualites de la triangulation actuelle
- qualitetrte( mnpxyd, mosoar, mxsoar, mnsoar, moartr, mxartr, mnartr,
- nbt, quamoy, quamin );
-
- // amelioration de la qualite de la triangulation par
- // barycentrage des sommets internes a la triangulation
- // suppression des aretes trop longues ou trop courtes
- // modification de la topologie des groupes de triangles
- // mise en delaunay de la triangulation
- // =====================================================
- mnarcf3 = new Z[mxarcf];
- if( mnarcf3 == NULL ) goto ERREUR;
-
- teamqt_( nutysu,
- mnarst, mosoar, mxsoar, n1soar, mnsoar,
- moartr, mxartr, n1artr, mnartr,
- mxarcf, mnarcf2, mnarcf3,
- mn1arcf, mnarcf, mnarcf1,
- comxmi, nbarpi, nbsomm, mxsomm, mnpxyd, mnslig,
- ierr );
- if( mn1arcf != NULL ) {delete [] mn1arcf; mn1arcf=NULL;}
- if( mnarcf != NULL ) {delete [] mnarcf; mnarcf =NULL;}
- if( mnarcf1 != NULL ) {delete [] mnarcf1; mnarcf1=NULL;}
- if( mnarcf2 != NULL ) {delete [] mnarcf2; mnarcf2=NULL;}
- if( mnarcf3 != NULL ) {delete [] mnarcf3; mnarcf3=NULL;}
-
- deltacpu_( d );
- tcpu += d;
- MESSAGE( "Temps de l'amelioration de la qualite de la triangulation=" << d );
- if( ierr != 0 ) goto ERREUR;
-
- //qualites de la triangulation finale
- qualitetrte( mnpxyd, mosoar, mxsoar, mnsoar, moartr, mxartr, mnartr,
- nbt, quamoy, quamin );
-
- // renumerotation des sommets internes: mnarst(i)=numero final du sommet
- // ===================================
- for (i=0; i<=nbsomm; i++)
- mnarst[i] = 0;
-
- for (nt=1; nt<=mxartr; nt++)
- {
- if( mnartr[nt*moartr-moartr] != 0 )
- {
- //le numero des 3 sommets du triangle nt
- nusotr_( nt, mosoar, mnsoar, moartr, mnartr, nosotr );
- //les 3 sommets du triangle sont actifs
- mnarst[ nosotr[0] ] = 1;
- mnarst[ nosotr[1] ] = 1;
- mnarst[ nosotr[2] ] = 1;
- }
- }
- nbst = 0;
- for (i=1; i<=nbsomm; i++)
- {
- if( mnarst[i] >0 )
- mnarst[i] = ++nbst;
- }
-
- // generation du tableau uvst de la surface triangulee
- // ---------------------------------------------------
- if( uvst != NULL ) delete [] uvst;
- uvst = new R2[nbst];
- if( uvst == NULL ) goto ERREUR;
-
- nbst=-1;
- for (i=0; i<nbsomm; i++ )
- {
- if( mnarst[i+1]>0 )
- {
- nbst++;
- uvst[nbst].x = mnpxyd[i].x;
- uvst[nbst].y = mnpxyd[i].y;
-
- //si le sommet est un point ou appartient a une ligne
- //ses coordonnees initiales sont restaurees
- n = mnslig[i];
- if( n > 0 )
- {
- if( n >= 1000000 )
- {
- //sommet d'une ligne
- //retour aux coordonnees initiales dans uvslf
- l = n / 1000000;
- n = n - 1000000 * l + nudslf[l-1] - 1;
- uvst[nbst].x = uvslf[n].x;
- uvst[nbst].y = uvslf[n].y;
- }
- else
- {
- //point utilisateur n interne impose
- //retour aux coordonnees initiales dans uvpti
- uvst[nbst].x = uvpti[n-1].x;
- uvst[nbst].y = uvpti[n-1].y;
- }
- }
- }
- }
- nbst++;
-
- // generation du tableau 'nsef' de la surface triangulee
- // -----------------------------------------------------
- // boucle sur les triangles occupes (internes et externes)
- if( nust != NULL ) delete [] nust;
- nust = new Z[4*nbt];
- if( nust == NULL ) goto ERREUR;
- nbt = 0;
- for (i=1; i<=mxartr; i++)
- {
- //le triangle i de mnartr
- if( mnartr[i*moartr-moartr] != 0 )
- {
- //le triangle i est interne => nosotr numero de ses 3 sommets
- nusotr_( i, mosoar, mnsoar, moartr, mnartr, nosotr );
- nust[nbt++] = mnarst[ nosotr[0] ];
- nust[nbt++] = mnarst[ nosotr[1] ];
- nust[nbt++] = mnarst[ nosotr[2] ];
- nust[nbt++] = 0;
- }
- }
- nbt /= 4; //le nombre final de triangles de la surface
- MESSAGE("Nombre de sommets=" << nbst
- << " Nombre de triangles=" << nbt);
-
- deltacpu_( d );
- tcpu += d;
- MESSAGE( "Temps total de la triangulation=" << tcpu << " secondes" );
-
- // destruction des tableaux auxiliaires
- // ------------------------------------
- NETTOYAGE:
- if( mnarst != NULL ) delete [] mnarst;
- if( mnartr != NULL ) delete [] mnartr;
- if( mnslig != NULL ) delete [] mnslig;
- if( mnsoar != NULL ) delete [] mnsoar;
- if( mnpxyd != NULL ) delete [] mnpxyd;
- if( mndalf != NULL ) delete [] mndalf;
- if( mntree != NULL ) delete [] mntree;
- if( mnqueu != NULL ) delete [] mnqueu;
- if( mntrsu != NULL ) delete [] mntrsu;
- if( mnlftr != NULL ) delete [] mnlftr;
- if( mn1arcf != NULL ) delete [] mn1arcf;
- if( mnarcf != NULL ) delete [] mnarcf;
- if( mnarcf1 != NULL ) delete [] mnarcf1;
- if( mnarcf2 != NULL ) delete [] mnarcf2;
- if( mnarcf3 != NULL ) delete [] mnarcf3;
- return;
-
- ERREUR:
- if( ierr == 51 || ierr == 52 )
- {
- //saturation des sommets => redepart avec 2 fois plus de sommets
- mxsomm = 2 * mxsomm;
- ierr = 0;
- goto NEWDEPART;
- }
- else
- {
- MESSAGE( "Triangulation non realisee " << ierr );
- if( ierr == 0 ) ierr=1;
- goto NETTOYAGE;
- }
-}
-
-
-void qualitetrte( R3 *mnpxyd,
- Z & mosoar, Z & mxsoar, Z *mnsoar,
- Z & moartr, Z & mxartr, Z *mnartr,
- Z & nbtria, R & quamoy, R & quamin )
-// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-// but : calculer la qualite moyenne et minimale de la triangulation
-// ----- actuelle definie par les tableaux mnsoar et mnartr
-// entrees:
-// --------
-// mnpxyd : tableau des coordonnees 2d des points
-// par point : x y distance_souhaitee
-// mosoar : nombre maximal d'entiers par arete et
-// indice dans mnsoar de l'arete suivante dans le hachage
-// mxsoar : nombre maximal d'aretes stockables dans le tableau mnsoar
-// attention: mxsoar>3*mxsomm obligatoire!
-// mnsoar : numero des 2 sommets , no ligne, 2 triangles de l'arete,
-// chainage des aretes frontalieres, chainage du hachage des aretes
-// hachage des aretes = mnsoar(1)+mnsoar(2)*2
-// avec mxsoar>=3*mxsomm
-// une arete i de mnsoar est vide <=> mnsoar(1,i)=0 et
-// mnsoar(2,arete vide)=l'arete vide qui precede
-// mnsoar(3,arete vide)=l'arete vide qui suit
-// moartr : nombre maximal d'entiers par arete du tableau mnartr
-// mxartr : nombre maximal de triangles declarables
-// mnartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3
-// arete1 = 0 si triangle vide => arete2 = triangle vide suivant
-// sorties:
-// --------
-// nbtria : nombre de triangles internes au domaine
-// quamoy : qualite moyenne des triangles actuels
-// quamin : qualite minimale des triangles actuels
-// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-{
- R d, aire, qualite;
- Z nosotr[3], mn, nbtrianeg, nt;
-
- aire = 0;
- quamoy = 0;
- quamin = 2.0;
- nbtria = 0;
- nbtrianeg = 0;
-
- mn = -moartr;
- for ( nt=1; nt<=mxartr; nt++ )
- {
- mn += moartr;
- if( mnartr[mn]!=0 )
- {
- //un triangle occupe de plus
- nbtria++;
-
- //le numero des 3 sommets du triangle nt
- nusotr_( nt, mosoar, mnsoar, moartr, mnartr, nosotr );
-
- //la qualite du triangle ns1 ns2 ns3
- qutr2d_( mnpxyd[nosotr[0]-1], mnpxyd[nosotr[1]-1], mnpxyd[nosotr[2]-1],
- qualite );
-
- //la qualite moyenne
- quamoy += qualite;
-
- //la qualite minimale
- quamin = Min( quamin, qualite );
-
- //aire signee du triangle nt
- d = surtd2_( mnpxyd[nosotr[0]-1], mnpxyd[nosotr[1]-1], mnpxyd[nosotr[2]-1] );
- if( d<0 )
- {
- //un triangle d'aire negative de plus
- nbtrianeg++;
- MESSAGE("ATTENTION: le triangle " << nt << " de sommets:"
- << nosotr[0] << " " << nosotr[1] << " " << nosotr[2]
- << " a une aire " << d <<"<=0");
- }
-
- //aire des triangles actuels
- aire += Abs(d);
- }
- }
-
- //les affichages
- quamoy /= nbtria;
- MESSAGE("Qualite moyenne=" << quamoy
- << " Qualite minimale=" << quamin
- << " des " << nbtria << " triangles de surface totale="
- << aire);
-
- if( nbtrianeg>0 )
- MESSAGE( "ATTENTION: nombre de triangles d'aire negative=" << nbtrianeg );
- return;
-}
+++ /dev/null
-// SMESH MEFISTO2 : algorithm for meshing
-//
-// Copyright (C) 2003 Laboratoire J.-L. Lions UPMC Paris
-//
-// 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.ann.jussieu.fr/~perronne or email Perronnet@ann.jussieu.fr
-//
-//
-//
-// File : aptrte.h
-// Author: Alain PERRONNET
-// Module : SMESH
-
-#ifndef aptrte__h
-#define aptrte__h
-
-#include <limits.h> // limites min max int long real ...
-#include <unistd.h> // gethostname, ...
-#include <stdio.h>
-#include <iostream.h> // pour cout cin ...
-#include <iomanip.h> // pour le format des io setw, stx, setfill, ...
-#include <string.h> // pour les fonctions sur les chaines de caracteres
-#include <ctype.h>
-#include <stdlib.h>
-#include <math.h> // pour les fonctions mathematiques
-#include <time.h>
-
-#include <sys/types.h>
-#include <sys/time.h>
-
-void qualitetrte( R3 *mnpxyd,
- Z & mosoar, Z & mxsoar, Z *mnsoar,
- Z & moartr, Z & mxartr, Z *mnartr,
- Z & nbtria, R & quamoy, R & quamin );
-// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-// but : calculer la qualite moyenne et minimale de la triangulation
-// ----- actuelle definie par les tableaux nosoar et noartr
-// entrees:
-// --------
-// mnpxyd : tableau des coordonnees 2d des points
-// par point : x y distance_souhaitee
-// mosoar : nombre maximal d'entiers par arete et
-// indice dans nosoar de l'arete suivante dans le hachage
-// mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar
-// attention: mxsoar>3*mxsomm obligatoire!
-// nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete,
-// chainage des aretes frontalieres, chainage du hachage des aretes
-// hachage des aretes = nosoar(1)+nosoar(2)*2
-// avec mxsoar>=3*mxsomm
-// une arete i de nosoar est vide <=> nosoar(1,i)=0 et
-// nosoar(2,arete vide)=l'arete vide qui precede
-// nosoar(3,arete vide)=l'arete vide qui suit
-// moartr : nombre maximal d'entiers par arete du tableau noartr
-// mxartr : nombre maximal de triangles declarables
-// noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3
-// arete1 = 0 si triangle vide => arete2 = triangle vide suivant
-// sorties:
-// --------
-// nbtria : nombre de triangles internes au domaine
-// quamoy : qualite moyenne des triangles actuels
-// quamin : qualite minimale des triangles actuels
-// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-
-void aptrte( Z nutysu, R aretmx,
- Z nblf, Z *nudslf, R2 *uvslf,
- Z nbpti, R2 *uvpti,
- Z & nbst, R2 * & uvst, Z & nbt, Z * & nust,
- Z & ierr );
-//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-// but : appel de la triangulation par un arbre-4 recouvrant
-// ----- de triangles equilateraux
-// le contour du domaine plan est defini par des lignes fermees
-// la premiere ligne etant l'enveloppe de toutes les autres
-// la fonction areteideale_(s,d) donne la taille d'arete
-// au point s dans la direction d (direction inactive pour l'instant)
-// des lors toute arete issue d'un sommet s devrait avoir une longueur
-// comprise entre 0.65 areteideale_(s,d) et 1.3 areteideale_(s,d)
-//
-//Attention:
-// Les tableaux uvslf et uvpti sont supposes ne pas avoir de sommets identiques!
-// De meme, un sommet d'une ligne fermee ne peut appartenir a une autre ligne fermee
-//
-// entrees:
-// --------
-// nutysu : numero de traitement de areteideale_() selon le type de surface
-// 0 pas d'emploi de la fonction areteideale_() et aretmx est active
-// 1 il existe une fonction areteideale_(s,d)
-// dont seules les 2 premieres composantes de uv sont actives
-// ... autres options a definir ...
-// aretmx : longueur maximale des aretes de la future triangulation
-// nblf : nombre de lignes fermees de la surface
-// nudslf : numero du dernier sommet de chacune des nblf lignes fermees
-// nudslf(0)=0 pour permettre la difference sans test
-// Attention le dernier sommet de chaque ligne est raccorde au premier
-// tous les sommets et les points internes ont des coordonnees
-// UV differentes <=> Pas de point double!
-// uvslf : uv des nudslf(nblf) sommets des lignes fermees
-// nbpti : nombre de points internes futurs sommets de la triangulation
-// uvpti : uv des points internes futurs sommets de la triangulation
-//
-// sorties:
-// --------
-// nbst : nombre de sommets de la triangulation finale
-// uvst : coordonnees uv des nbst sommets de la triangulation
-// nbt : nombre de triangles de la triangulation finale
-// nust : 3 numeros dans uvst des sommets des nbt triangles
-// ierr : 0 si pas d'erreur
-// > 0 sinon
-//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-// auteur : Alain Perronnet Analyse Numerique Paris UPMC decembre 2001
-//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-extern "C" { void tempscpu_( double & tempsec ); }
-//Retourne le temps CPU utilise en secondes
-
-extern "C" { void deltacpu_( R & dtcpu ); }
-//Retourne le temps CPU utilise en secondes depuis le precedent appel
-
-//initialiser le tableau mnsoar pour le hachage des aretes
-extern "C" {void insoar_( Z & mxsomm, Z & mosoar, Z & mxsoar, Z & n1soar, Z * mnsoar );}
-
-//mettre a zero les nb entiers de tab
-extern "C" {void azeroi_( Z & nb, Z * tab );}
-
-extern "C" {void fasoar_( Z & ns1, Z & ns2, Z & nt1, Z & nt2, Z & nolign,
- Z & mosoar, Z & mxsoar, Z & n1soar, Z * mnsoar, Z * mnarst,
- Z & noar, Z & ierr );}
-//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-// but : former l'arete de sommet ns1-ns2 dans le hachage du tableau
-// ----- nosoar des aretes de la triangulation
-// entrees:
-// --------
-// ns1 ns2: numero pxyd des 2 sommets de l'arete
-// nt1 : numero du triangle auquel appartient l'arete
-// nt1=-1 si numero inconnu
-// nt2 : numero de l'eventuel second triangle de l'arete si connu
-// nt2=-1 si numero inconnu
-// nolign : numero de la ligne fermee de l'arete
-// =0 si l'arete n'est une arete de ligne
-// ce numero est ajoute seulement si l'arete est creee
-// mosoar : nombre maximal d'entiers par arete du tableau nosoar
-// mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar
-// modifies:
-// ---------
-// n1soar : numero de la premiere arete vide dans le tableau nosoar
-// une arete i de nosoar est vide <=> nosoar(1,i)=0
-// chainage des aretes vides amont et aval
-// l'arete vide qui precede=nosoar(4,i)
-// l'arete vide qui suit =nosoar(5,i)
-// nosoar : numero des 2 sommets, no ligne, 2 triangles de l'arete,
-// chainage momentan'e d'aretes, chainage du hachage des aretes
-// hachage des aretes = min( nosoar(1), nosoar(2) )
-// noarst : noarst(np) numero d'une arete du sommet np
-
-// ierr : si < 0 en entree pas d'affichage en cas d'erreur du type
-// "arete appartenant a plus de 2 triangles et a creer!"
-// si >=0 en entree affichage de ce type d'erreur
-// sorties:
-// --------
-// noar : >0 numero de l'arete retrouvee ou ajoutee
-// ierr : =0 si pas d'erreur
-// =1 si le tableau nosoar est sature
-// =2 si arete a creer et appartenant a 2 triangles distincts
-// des triangles nt1 et nt2
-// =3 si arete appartenant a 2 triangles distincts
-// differents des triangles nt1 et nt2
-// =4 si arete appartenant a 2 triangles distincts
-// dont le second n'est pas le triangle nt2
-//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-
-//initialisation du tableau letree et ajout dans letree des sommets 1 a nbsomm
-extern "C" {void teajte_( Z & mxsomm, Z & nbsomm, R3 * mnpxyd, R3 * comxmi,
- R & aretmx, Z & mxtree, Z * letree,
- Z & ierr );}
-
-
-extern "C" {void tehote_( Z & nutysu, Z & nbarpi, Z & mxsomm, Z & nbsomm, R3 * mnpxyd,
- R3 * comxmi, R & aretmx,
- Z * letree, Z & mxqueu, Z * mnqueu,
- Z & ierr );}
-// homogeneisation de l'arbre des te a un saut de taille au plus
-// prise en compte des tailles d'aretes souhaitees autour des sommets initiaux
-
-extern "C" {void tetrte_( R3 * comxmi, R & aretmx, Z & nbarpi, Z & mxsomm, R3 * mnpxyd,
- Z & mxqueu, Z * mnqueu, Z * mntree,
- Z & mosoar, Z & mxsoar, Z & n1soar, Z * mnsoar,
- Z & moartr, Z & mxartr, Z & n1artr, Z * mnartr, Z * mnarst,
- Z & ierr );}
-// trianguler les triangles equilateraux feuilles a partir de leurs 3 sommets
-// et des points de la frontiere, des points internes imposes interieurs
-
-extern "C" {void aisoar_( Z & mosoar, Z & mxsoar, Z * mnsoar, Z & na );}
- // formation du chainage 6 des aretes internes a echanger eventuellement
-
-extern "C" {void tedela_( R3 * mnpxyd, Z * mnarst,
- Z & mosoar, Z & mxsoar, Z & n1soar, Z * mnsoar, Z & na,
- Z & moartr, Z & mxartr, Z & n1artr, Z * mnartr, Z & n );}
- // boucle sur les aretes internes (non sur une ligne de la frontiere)
- // avec echange des 2 diagonales afin de rendre la triangulation delaunay
-
-extern "C" {void terefr_( Z & nbarpi, R3 * mnpxyd,
- Z & mosoar, Z & mxsoar, Z & n1soar, Z * mnsoar,
- Z & moartr, Z & n1artr, Z * mnartr, Z * mnarst,
- Z & mxarcf, Z * mnarc1, Z * mnarc2,
- Z * mnarc3, Z * mnarc4,
- Z & n, Z & ierr );}
-// detection des aretes frontalieres initiales perdues
-// triangulation frontale pour les restaurer
-
-extern "C" {void tesuex_( Z & nblf, Z * nulftr,
- Z & ndtri0, Z & nbsomm, R3 * mnpxyd, Z * mnslig,
- Z & mosoar, Z & mxsoar, Z * mnsoar,
- Z & moartr, Z & mxartr, Z & n1artr, Z * mnartr, Z * mnarst,
- Z & nbtria, Z * mntrsu, Z & ierr );}
-// suppression des triangles externes a la surface
-
-extern "C" {void teamqt_( Z & nutysu,
- Z * mnarst, Z & mosoar, Z & mxsoar, Z & n1soar, Z * mnsoar,
- Z & moartr, Z & mxartr, Z & n1artr, Z * mnartr,
- Z & mxarcf, Z * mntrcf, Z * mnstbo,
- Z * n1arcf, Z * mnarcf, Z * mnarc1,
- R3 * comxmi, Z & nbarpi, Z & nbsomm, Z & mxsomm,
- R3 * mnpxyd, Z * mnslig,
- Z & ierr );}
-// amelioration de la qualite de la triangulation par
-// barycentrage des sommets internes a la triangulation
-// suppression des aretes trop longues ou trop courtes
-// modification de la topologie des groupes de triangles
-// mise en delaunay de la triangulation
-
-extern "C" {void nusotr_( Z & nt, Z & mosoar, Z * mnsoar, Z & moartr, Z * mnartr,
- Z * nosotr );}
-//retrouver les numero des 3 sommets du triangle nt
-
-extern "C" {void qutr2d_( R3 & p1, R3 & p2, R3 & p3, R & qualite );}
-//calculer la qualite d'un triangle de R2 de sommets p1, p2, p3
-
-extern "C" { R surtd2_( R3 & p1, R3 & p2, R3 & p3 ); }
-//calcul de la surface d'un triangle defini par 3 points de r**2
-
-#endif
+++ /dev/null
-c MEFISTO : library to compute 2D triangulation from segmented boundaries
-c
-c Copyright (C) 2003 Laboratoire J.-L. Lions UPMC Paris
-c
-c This library is free software; you can redistribute it and/or
-c modify it under the terms of the GNU Lesser General Public
-c License as published by the Free Software Foundation; either
-c version 2.1 of the License.
-c
-c This library is distributed in the hope that it will be useful,
-c but WITHOUT ANY WARRANTY; without even the implied warranty of
-c MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-c Lesser General Public License for more details.
-c
-c You should have received a copy of the GNU Lesser General Public
-c License along with this library; if not, write to the Free Software
-c Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-c
-c See http://www.ann.jussieu.fr/~perronne or email Perronnet@ann.jussieu.fr
-c
-c
-c File : areteideale.f
-c Module : SMESH
-c Author: Alain PERRONNET
-
- double precision function areteideale( xyz, direction )
- double precision xyz(3), direction(3)
- areteideale = 10
- return
- end
+++ /dev/null
-c MEFISTO : library to compute 2D triangulation from segmented boundaries
-c
-c Copyright (C) 2003 Laboratoire J.-L. Lions UPMC Paris
-c
-c This library is free software; you can redistribute it and/or
-c modify it under the terms of the GNU Lesser General Public
-c License as published by the Free Software Foundation; either
-c version 2.1 of the License.
-c
-c This library is distributed in the hope that it will be useful,
-c but WITHOUT ANY WARRANTY; without even the implied warranty of
-c MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-c Lesser General Public License for more details.
-c
-c You should have received a copy of the GNU Lesser General Public
-c License along with this library; if not, write to the Free Software
-c Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-c
-c See http://www.ann.jussieu.fr/~perronne or email Perronnet@ann.jussieu.fr
-c
-c
-c File : trte.f
-c Module : SMESH
-c Author: Alain PERRONNET
-
- subroutine qutr2d( p1, p2, p3, qualite )
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c but : calculer la qualite d'un triangle de r**2
-c ----- 2 coordonnees des 3 sommets en double precision
-c
-c entrees :
-c ---------
-c p1,p2,p3 : les 3 coordonnees des 3 sommets du triangle
-c sens direct pour une surface et qualite >0
-c sorties :
-c ---------
-c qualite: valeur de la qualite du triangle entre 0 et 1 (equilateral)
-c 1 etant la qualite optimale
-c ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c auteur : alain perronnet analyse numerique upmc paris janvier 1995
-c2345x7..............................................................012
- parameter ( d2uxr3 = 3.4641016151377544d0 )
-c d2uxr3 = 2 * sqrt(3)
- double precision p1(2), p2(2), p3(2), qualite, a, b, c, p
-c
-c la longueur des 3 cotes
- a = sqrt( (p2(1)-p1(1))**2 + (p2(2)-p1(2))**2 )
- b = sqrt( (p3(1)-p2(1))**2 + (p3(2)-p2(2))**2 )
- c = sqrt( (p1(1)-p3(1))**2 + (p1(2)-p3(2))**2 )
-c
-c demi perimetre
- p = (a+b+c) * 0.5d0
-c
- if ( (a*b*c) .ne. 0d0 ) then
-c critere : 2 racine(3) * rayon_inscrit / plus longue arete
- qualite = d2uxr3 * sqrt( abs( (p-a) / p * (p-b) * (p-c) ) )
- % / max(a,b,c)
- else
- qualite = 0d0
- endif
-c
-c
-c autres criteres possibles:
-c critere : 2 * rayon_inscrit / rayon_circonscrit
-c qualite = 8d0 * (p-a) * (p-b) * (p-c) / (a * b * c)
-c
-c critere : 3*sqrt(3.) * ray_inscrit / demi perimetre
-c qualite = 3*sqrt(3.) * sqrt ((p-a)*(p-b)*(p-c) / p**3)
-c
-c critere : 2*sqrt(3.) * ray_inscrit / max( des aretes )
-c qualite = 2*sqrt(3.) * sqrt( (p-a)*(p-b)*(p-c) / p ) / max(a,b,c)
- end
-
-
- double precision function surtd2( p1 , p2 , p3 )
-c ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c but : calcul de la surface d'un triangle defini par 3 points de R**2
-c -----
-c parametres d entree :
-c ---------------------
-c p1 p2 p3 : les 3 fois 2 coordonnees des sommets du triangle
-c
-c parametre resultat :
-c --------------------
-c surtd2 : surface du triangle
-c ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c auteur : alain perronnet analyse numerique upmc paris fevrier 1992
-c2345x7..............................................................012
- double precision p1(2), p2(2), p3(2)
-c
-c la surface du triangle
- surtd2 = ( ( p2(1)-p1(1) ) * ( p3(2)-p1(2) )
- % - ( p2(2)-p1(2) ) * ( p3(1)-p1(1) ) ) * 0.5d0
- end
-
- integer function nopre3( i )
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c but : numero precedent i dans le sens circulaire 1 2 3 1 ...
-c -----
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c auteur : alain perronnet analyse numerique paris upmc fevrier 1992
-c2345x7..............................................................012
- if( i .eq. 1 ) then
- nopre3 = 3
- else
- nopre3 = i - 1
- endif
- end
-
- integer function nosui3( i )
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c but : numero suivant i dans le sens circulaire 1 2 3 1 ...
-c -----
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c auteur : alain perronnet analyse numerique paris upmc fevrier 1992
-c2345x7..............................................................012
- if( i .eq. 3 ) then
- nosui3 = 1
- else
- nosui3 = i + 1
- endif
- end
-
- subroutine provec( v1 , v2 , v3 )
-c ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c but : v3 vecteur = produit vectoriel de 2 vecteurs de r ** 3
-c -----
-c entrees:
-c --------
-c v1, v2 : les 2 vecteurs de 3 composantes
-c
-c sortie :
-c --------
-c v3 : vecteur = v1 produit vectoriel v2
-cc++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c auteur : perronnet alain upmc analyse numerique paris mars 1987
-c2345x7..............................................................012
- double precision v1(3), v2(3), v3(3)
-c
- v3( 1 ) = v1( 2 ) * v2( 3 ) - v1( 3 ) * v2( 2 )
- v3( 2 ) = v1( 3 ) * v2( 1 ) - v1( 1 ) * v2( 3 )
- v3( 3 ) = v1( 1 ) * v2( 2 ) - v1( 2 ) * v2( 1 )
-c
- return
- end
-
- subroutine norme1( n, v, ierr )
-c ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c but : normalisation euclidienne a 1 d un vecteur v de n composantes
-c -----
-c entrees :
-c ---------
-c n : nombre de composantes du vecteur
-c
-c modifie :
-c ---------
-c v : le vecteur a normaliser a 1
-c
-c sortie :
-c ---------
-c ierr : 1 si la norme de v est egale a 0
-c 0 si pas d'erreur
-c ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c auteur : alain perronnet analyse numerique paris mars 1987
-c ......................................................................
- double precision v( n ), s, sqrt
-c
- s = 0.0d0
- do 10 i=1,n
- s = s + v( i ) * v( i )
- 10 continue
-c
-c test de nullite de la norme du vecteur
-c --------------------------------------
- if( s .le. 0.0d0 ) then
-c norme nulle du vecteur non normalisable a 1
- ierr = 1
- return
- endif
-c
- s = 1.0d0 / sqrt( s )
- do 20 i=1,n
- v( i ) = v ( i ) * s
- 20 continue
-c
- ierr = 0
- end
-
-
- subroutine insoar( mxsomm, mosoar, mxsoar, n1soar, nosoar )
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c but : initialiser le tableau nosoar pour le hachage des aretes
-c -----
-c
-c entrees:
-c --------
-c mxsomm : plus grand numero de sommet d'une arete au cours du calcul
-c mosoar : nombre maximal d'entiers par arete du tableau nosoar
-c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar
-c avec mxsoar>=3*mxsomm
-c
-c sorties:
-c --------
-c n1soar : numero de la premiere arete vide dans le tableau nosoar
-c une arete i de nosoar est vide <=> nosoar(1,i)=0
-c chainage des aretes vides amont et aval
-c l'arete vide qui precede=nosoar(4,i)
-c l'arete vide qui suit =nosoar(5,i)
-c nosoar : numero des 2 sommets, no ligne, 2 triangles de l'arete,
-c chainage momentan'e d'aretes, chainage du hachage des aretes
-c hachage des aretes = min( nosoar(1), nosoar(2) )
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c auteur : alain perronnet analyse numerique paris upmc mars 1997
-c2345x7..............................................................012
- integer nosoar(mosoar,mxsoar)
-c
-c initialisation des aretes 1 a mxsomm
- do 10 i=1,mxsomm
-c
-c sommet 1 = 0 <=> temoin d'arete vide pour le hachage
- nosoar( 1, i ) = 0
-c
-c arete sur aucune ligne
- nosoar( 3, i ) = 0
-c
-c la position de l'arete interne ou frontaliere est inconnue
- nosoar( 6, i ) = -2
-c
-c fin de chainage du hachage pas d'arete suivante
- nosoar( mosoar, i ) = 0
-c
- 10 continue
-c
-c la premiere arete vide chainee est la mxsomm+1 du tableau
-c car ces aretes ne sont pas atteignables par le hachage direct
- n1soar = mxsomm + 1
-c
-c initialisation des aretes vides et des chainages
- do 20 i = n1soar, mxsoar
-c
-c sommet 1 = 0 <=> temoin d'arete vide pour le hachage
- nosoar( 1, i ) = 0
-c
-c arete sur aucune ligne
- nosoar( 3, i ) = 0
-c
-c chainage sur l'arete vide qui precede
-c (si arete occupee cela deviendra le no du triangle 1 de l'arete)
- nosoar( 4, i ) = i-1
-c
-c chainage sur l'arete vide qui suit
-c (si arete occupee cela deviendra le no du triangle 2 de l'arete)
- nosoar( 5, i ) = i+1
-c
-c chainages des aretes frontalieres ou internes ou ...
- nosoar( 6, i ) = -2
-c
-c fin de chainage du hachage
- nosoar( mosoar, i ) = 0
-c
- 20 continue
-c
-c la premiere arete vide n'a pas de precedent
- nosoar( 4, n1soar ) = 0
-c
-c la derniere arete vide est mxsoar sans arete vide suivante
- nosoar( 5, mxsoar ) = 0
- end
-
-
- subroutine azeroi ( l , ntab )
-c ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c but : initialisation a zero d un tableau ntab de l variables entieres
-c -----
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c auteur : alain perronnet analyse numerique upmc paris septembre 1988
-c23456---------------------------------------------------------------012
- integer ntab(l)
- do 1 i = 1 , l
- ntab( i ) = 0
- 1 continue
- end
-
-
- subroutine fasoar( ns1, ns2, nt1, nt2, nolign,
- % mosoar, mxsoar, n1soar, nosoar, noarst,
- % noar, ierr )
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c but : former l'arete de sommet ns1-ns2 dans le hachage du tableau
-c ----- nosoar des aretes de la triangulation
-c
-c entrees:
-c --------
-c ns1 ns2: numero pxyd des 2 sommets de l'arete
-c nt1 : numero du triangle auquel appartient l'arete
-c nt1=-1 si numero inconnu
-c nt2 : numero de l'eventuel second triangle de l'arete si connu
-c nt2=-1 si numero inconnu
-c nolign : numero de la ligne de l'arete dans ladefi(wulftr-1+nolign)
-c =0 si l'arete n'est une arete de ligne
-c ce numero est ajoute seulement si l'arete est creee
-c mosoar : nombre maximal d'entiers par arete du tableau nosoar
-c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar
-c
-c modifies:
-c ---------
-c n1soar : numero de la premiere arete vide dans le tableau nosoar
-c une arete i de nosoar est vide <=> nosoar(1,i)=0
-c chainage des aretes vides amont et aval
-c l'arete vide qui precede=nosoar(4,i)
-c l'arete vide qui suit =nosoar(5,i)
-c nosoar : numero des 2 sommets, no ligne, 2 triangles de l'arete,
-c chainage momentan'e d'aretes, chainage du hachage des aretes
-c hachage des aretes = min( nosoar(1), nosoar(2) )
-c noarst : noarst(np) numero d'une arete du sommet np
-c
-c ierr : si < 0 en entree pas d'affichage en cas d'erreur du type
-c "arete appartenant a plus de 2 triangles et a creer!"
-c si >=0 en entree affichage de ce type d'erreur
-c
-c sorties:
-c --------
-c noar : >0 numero de l'arete retrouvee ou ajoutee
-c ierr : =0 si pas d'erreur
-c =1 si le tableau nosoar est sature
-c =2 si arete a creer et appartenant a 2 triangles distincts
-c des triangles nt1 et nt2
-c =3 si arete appartenant a 2 triangles distincts
-c differents des triangles nt1 et nt2
-c =4 si arete appartenant a 2 triangles distincts
-c dont le second n'est pas le triangle nt2
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c auteur : alain perronnet analyse numerique paris upmc mars 1997
-c2345x7..............................................................012
- common / unites / lecteu, imprim, nunite(30)
- integer nosoar(mosoar,mxsoar), noarst(*)
- integer nu2sar(2)
-c
-c ajout eventuel de l'arete s1 s2 dans nosoar
- nu2sar(1) = ns1
- nu2sar(2) = ns2
-c
-c hachage de l'arete de sommets nu2sar
- call hasoar( mosoar, mxsoar, n1soar, nosoar, nu2sar, noar )
-c en sortie: noar>0 => no arete retrouvee
-c <0 => no arete ajoutee
-c =0 => saturation du tableau nosoar
-c
- if( noar .eq. 0 ) then
-c
-c saturation du tableau nosoar
- write(imprim,*) 'fasoar: tableau nosoar sature'
- ierr = 1
- return
-c
- else if( noar .lt. 0 ) then
-c
-c l'arete a ete ajoutee. initialisation des autres informations
- noar = -noar
-c le numero de la ligne de l'arete
- nosoar(3,noar) = nolign
-c le triangle 1 de l'arete => le triangle nt1
- nosoar(4,noar) = nt1
-c le triangle 2 de l'arete => le triangle nt2
- nosoar(5,noar) = nt2
-c
-c le sommet appartient a l'arete noar
- noarst( nu2sar(1) ) = noar
- noarst( nu2sar(2) ) = noar
-c
- else
-c
-c l'arete a ete retrouvee.
-c si elle appartient a 2 triangles differents de nt1 et nt2
-c alors il y a une erreur
- if( nosoar(4,noar) .gt. 0 .and.
- % nosoar(5,noar) .gt. 0 ) then
- if( nosoar(4,noar) .ne. nt1 .and.
- % nosoar(4,noar) .ne. nt2 .or.
- % nosoar(5,noar) .ne. nt1 .and.
- % nosoar(5,noar) .ne. nt2 ) then
-c arete appartenant a plus de 2 triangles => erreur
- if( ierr .ge. 0 ) then
- write(imprim,*) 'erreur fasoar: arete ',noar,
- % ' dans 2 triangles et a creer!'
- endif
- ierr = 2
- return
- endif
- endif
-c
-c mise a jour du numero des triangles de l'arete noar
-c le triangle 2 de l'arete => le triangle nt1
- if( nosoar(4,noar) .lt. 0 ) then
-c pas de triangle connu pour cette arete
- n = 4
- else
-c deja un triangle connu. ce nouveau est le second
- if( nosoar(5,noar) .gt. 0 .and. nt1 .gt. 0 .and.
- % nosoar(5,noar) .ne. nt1 ) then
-c arete appartenant a plus de 2 triangles => erreur
- write(imprim,*) 'erreur fasoar: arete ',noar,
- % ' dans plus de 2 triangles'
- ierr = 3
- return
- endif
- n = 5
- endif
- nosoar(n,noar) = nt1
-c
-c cas de l'arete frontaliere retrouvee comme diagonale d'un quadrangle
- if( nt2 .gt. 0 ) then
-c l'arete appartient a 2 triangles
- if( nosoar(5,noar) .gt. 0 .and.
- % nosoar(5,noar) .ne. nt2 ) then
-c arete appartenant a plus de 2 triangles => erreur
- write(imprim,*) 'erreur fasoar: arete ',noar,
- % ' dans plus de 2 triangles'
- ierr = 4
- return
- endif
- nosoar(5,noar) = nt2
- endif
-c
- endif
-c
-c pas d'erreur
- ierr = 0
- end
-
- subroutine fq1inv( x, y, s, xc, yc, ierr )
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c but : calcul des 2 coordonnees (xc,yc) dans le carre (0,1)
-c ----- image par f:carre unite-->quadrangle appartenant a q1**2
-c par une resolution directe due a nicolas thenault
-c
-c entrees:
-c --------
-c x,y : coordonnees du point image dans le quadrangle de sommets s
-c s : les 2 coordonnees des 4 sommets du quadrangle
-c
-c sorties:
-c --------
-c xc,yc : coordonnees dans le carre dont l'image par f vaut (x,y)
-c ierr : 0 si calcul sans erreur, 1 si quadrangle degenere
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c auteurs: thenault tulenew analyse numerique paris janvier 1998
-c modifs : perronnet alain analyse numerique paris janvier 1998
-c234567..............................................................012
- real s(1:2,1:4), dist(2)
- double precision a,b,c,d,alpha,beta,gamma,delta,x0,y0,t(2),u,v,w
-c
- a = s(1,1)
- b = s(1,2) - s(1,1)
- c = s(1,4) - s(1,1)
- d = s(1,1) - s(1,2) + s(1,3) - s(1,4)
-c
- alpha = s(2,1)
- beta = s(2,2) - s(2,1)
- gamma = s(2,4) - s(2,1)
- delta = s(2,1) - s(2,2) + s(2,3) - s(2,4)
-c
- u = beta * c - b * gamma
- if( u .eq. 0 ) then
-c quadrangle degenere
- ierr = 1
- return
- endif
- v = delta * c - d * gamma
- w = b * delta - beta * d
-c
- x0 = c * (y-alpha) - gamma * (x-a)
- y0 = b * (y-alpha) - beta * (x-a)
-c
- a = v * w
- b = u * u - w * x0 - v * y0
- c = x0 * y0
-c
- if( a .ne. 0 ) then
-c
- delta = sqrt( b*b-4*a*c )
- if( b .ge. 0.0 ) then
- t(2) = -b - delta
- else
- t(2) = -b + delta
- endif
-c la racine de plus grande valeur absolue
-c (elle donne le plus souvent le point exterieur au carre unite
-c donc a tester en second pour reduire les calculs)
- t(2) = t(2) / ( 2 * a )
-c calcul de la seconde racine a partir de la somme => plus stable
- t(1) = - b/a - t(2)
-c
- do 10 i=1,2
-c
-c la solution i donne t elle un point interne au carre unite?
- xc = ( x0 - v * t(i) ) / u
- yc = ( w * t(i) - y0 ) / u
- if( 0.0 .le. xc .and. xc .le. 1.0 ) then
- if( 0.0 .le. yc .and. yc .le. 1.0 ) goto 9000
- endif
-c
-c le point (xc,yc) n'est pas dans le carre unite
-c cela peut etre du aux erreurs d'arrondi
-c => choix par le minimum de la distance aux bords du carre
- dist(i) = max( 0.0, -xc, xc-1.0, -yc, yc-1.0 )
-c
- 10 continue
-c
- if( dist(1) .gt. dist(2) ) then
-c f(xc,yc) pour la racine 2 est plus proche de x,y
-c xc yc sont deja calcules
- goto 9000
- endif
-c
- else if ( b .ne. 0 ) then
- t(1) = - c / b
- else
- t(1) = 0
- endif
-c
-c les 2 coordonnees du point dans le carre unite
- xc = ( x0 - v * t(1) ) / u
- yc = ( w * t(1) - y0 ) / u
-c
- 9000 ierr = 0
- return
- end
-
-
- subroutine ptdatr( point, pxyd, nosotr, nsigne )
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c but : le point est il dans le triangle de sommets nosotr
-c -----
-c
-c entrees:
-c --------
-c point : les 2 coordonnees du point
-c pxyd : les 2 coordonnees et distance souhaitee des points du maillage
-c nosotr : le numero des 3 sommets du triangle
-c
-c sorties:
-c --------
-c nsigne : >0 si le point est dans le triangle ou sur une des 3 aretes
-c =0 si le triangle est degenere ou indirect ou ne contient pas le poin
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c auteur : alain perronnet analyse numerique paris upmc mars 1997
-c....................................................................012
- integer nosotr(3)
- double precision point(2), pxyd(3,*)
- double precision xp,yp, x1,x2,x3, y1,y2,y3, d,dd, cb1,cb2,cb3
-c
- xp = point( 1 )
- yp = point( 2 )
-c
- n1 = nosotr( 1 )
- x1 = pxyd( 1 , n1 )
- y1 = pxyd( 2 , n1 )
-c
- n2 = nosotr( 2 )
- x2 = pxyd( 1 , n2 )
- y2 = pxyd( 2 , n2 )
-c
- n3 = nosotr( 3 )
- x3 = pxyd( 1 , n3 )
- y3 = pxyd( 2 , n3 )
-c
-c 2 fois la surface du triangle = determinant de la matrice
-c de calcul des coordonnees barycentriques du point p
- d = ( x2 - x1 ) * ( y3 - y1 ) - ( x3 - x1 ) * ( y2 - y1 )
-c
- if( d .gt. 0 ) then
-c
-c triangle non degenere
-c =====================
-c calcul des 3 coordonnees barycentriques du
-c point xp yp dans le triangle
- cb1 = ( ( x2-xp ) * ( y3-yp ) - ( x3-xp ) * ( y2-yp ) ) / d
- cb2 = ( ( x3-xp ) * ( y1-yp ) - ( x1-xp ) * ( y3-yp ) ) / d
- cb3 = 1d0 - cb1 -cb2
-ccc cb3 = ( ( x1-xp ) * ( y2-yp ) - ( x2-xp ) * ( y1-yp ) ) / d
-c
-ccc if( cb1 .ge. -0.00005d0 .and. cb1 .le. 1.00005d0 .and.
- if( cb1 .ge. 0d0 .and. cb1 .le. 1d0 .and.
- % cb2 .ge. 0d0 .and. cb2 .le. 1d0 .and.
- % cb3 .ge. 0d0 .and. cb3 .le. 1d0 ) then
-c
-c le triangle nosotr contient le point
- nsigne = 1
- else
- nsigne = 0
- endif
-c
- else
-c
-c triangle degenere
-c =================
-c le point est il du meme cote que le sommet oppose de chaque arete?
- nsigne = 0
- do 10 i=1,3
-c le sinus de l'angle p1 p2-p1 point
- x1 = pxyd(1,n1)
- y1 = pxyd(2,n1)
- d = ( pxyd(1,n2) - x1 ) * ( point(2) - y1 )
- % - ( pxyd(2,n2) - y1 ) * ( point(1) - x1 )
- dd = ( pxyd(1,n2) - x1 ) * ( pxyd(2,n3) - y1 )
- % - ( pxyd(2,n2) - y1 ) * ( pxyd(1,n3) - x1 )
- cb1 = ( pxyd(1,n2) - x1 ) ** 2
- % + ( pxyd(2,n2) - y1 ) ** 2
- cb2 = ( point(1) - x1 ) ** 2
- % + ( point(2) - y1 ) ** 2
- cb3 = ( pxyd(1,n3) - x1 ) ** 2
- % + ( pxyd(2,n3) - y1 ) ** 2
- if( abs( dd ) .le. 1e-4 * sqrt( cb1 * cb3 ) ) then
-c le point 3 est sur l'arete 1-2
-c le point doit y etre aussi
- if( abs( d ) .le. 1e-4 * sqrt( cb1 * cb2 ) ) then
-c point sur l'arete
- nsigne = nsigne + 1
- endif
- else
-c le point 3 n'est pas sur l'arete . test des signes
- if( d * dd .ge. 0 ) then
- nsigne = nsigne + 1
- endif
- endif
-c permutation circulaire des 3 sommets et aretes
- n = n1
- n1 = n2
- n2 = n3
- n3 = n
- 10 continue
- if( nsigne .ne. 3 ) nsigne = 0
- endif
- end
-
- integer function nosstr( p, pxyd, nt, letree )
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c but : calculer le numero 0 a 3 du sous-triangle te contenant
-c ----- le point p
-c
-c entrees:
-c --------
-c p : point de r**2 contenu dans le te nt de letree
-c pxyd : x y distance des points
-c nt : numero letree du te de te voisin a calculer
-c letree : arbre-4 des triangles equilateraux (te) fond de la triangulation
-c letree(0,0) no du 1-er te vide dans letree
-c letree(0,1) : maximum du 1-er indice de letree (ici 8)
-c letree(0,2) : maximum declare du 2-eme indice de letree (ici mxtree)
-c letree(0:8,1) : racine de l'arbre (triangle sans sur triangle)
-c si letree(0,.)>0 alors
-c letree(0:3,j) : no (>0) letree des 4 sous-triangles du triangle j
-c sinon
-c letree(0:3,j) :-no pxyd des 1 \85a 4 points internes au triangle j
-c 0 si pas de point
-c ( j est alors une feuille de l'arbre )
-c letree(4,j) : no letree du sur-triangle du triangle j
-c letree(5,j) : 0 1 2 3 no du sous-triangle j pour son sur-triangle
-c letree(6:8,j) : no pxyd des 3 sommets du triangle j
-c
-c sorties :
-c ---------
-c nosstr : 0 si le sous-triangle central contient p
-c i =1,2,3 numero du sous-triangle contenant p
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c auteur : alain perronnet analyse numerique paris upmc fevrier 1992
-c2345x7..............................................................012
- integer letree(0:8,0:*)
- double precision pxyd(3,*), p(2),
- % x1, y1, x21, y21, x31, y31, d, xe, ye
-c
-c le numero des 3 sommets du triangle
- ns1 = letree( 6, nt )
- ns2 = letree( 7, nt )
- ns3 = letree( 8, nt )
-c
-c les coordonnees entre 0 et 1 du point p
- x1 = pxyd(1,ns1)
- y1 = pxyd(2,ns1)
-c
- x21 = pxyd(1,ns2) - x1
- y21 = pxyd(2,ns2) - y1
-c
- x31 = pxyd(1,ns3) - x1
- y31 = pxyd(2,ns3) - y1
-c
- d = 1.0 / ( x21 * y31 - x31 * y21 )
-c
- xe = ( ( p(1) - x1 ) * y31 - ( p(2) - y1 ) * x31 ) * d
- ye = ( ( p(2) - y1 ) * x21 - ( p(1) - x1 ) * y21 ) * d
-c
- if( xe .gt. 0.5d0 ) then
-c sous-triangle droit
- nosstr = 2
- else if( ye .gt. 0.5d0 ) then
-c sous-triangle haut
- nosstr = 3
- else if( xe+ye .lt. 0.5d0 ) then
-c sous-triangle gauche
- nosstr = 1
- else
-c sous-triangle central
- nosstr = 0
- endif
- end
-
-
- integer function notrpt( p, pxyd, notrde, letree )
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c but : calculer le numero letree du sous-triangle feuille contenant
-c ----- le point p a partir du te notrde de letree
-c
-c entrees:
-c --------
-c p : point de r**2 contenu dans le te nt de letree
-c pxyd : x y distance des points
-c notrde : numero letree du triangle depart de recherche (1=>racine)
-c letree : arbre-4 des triangles equilateraux (te) fond de la triangulation
-c letree(0,0) no du 1-er te vide dans letree
-c letree(0,1) : maximum du 1-er indice de letree (ici 8)
-c letree(0,2) : maximum declare du 2-eme indice de letree (ici mxtree)
-c letree(0:8,1) : racine de l'arbre (triangle sans sur triangle)
-c si letree(0,.)>0 alors
-c letree(0:3,j) : no (>0) letree des 4 sous-triangles du triangle j
-c sinon
-c letree(0:3,j) :-no pxyd des 1 \85 4 points internes au triangle j
-c 0 si pas de point
-c ( j est alors une feuille de l'arbre )
-c letree(4,j) : no letree du sur-triangle du triangle j
-c letree(5,j) : 0 1 2 3 no du sous-triangle j pour son sur-triangle
-c letree(6:8,j) : no pxyd des 3 sommets du triangle j
-c
-c sorties :
-c ---------
-c notrpt : numero letree du triangle contenant le point p
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c auteur : alain perronnet analyse numerique paris upmc fevrier 1992
-c2345x7..............................................................012
- integer letree(0:8,0:*)
- double precision pxyd(1:3,*), p(2)
-c
-c la racine depart de la recherche
- notrpt = notrde
-c
-c tant que la feuille n'est pas atteinte descendre l'arbre
- 10 if( letree(0,notrpt) .gt. 0 ) then
-c
-c recherche du sous-triangle contenant p
- nsot = nosstr( p, pxyd, notrpt, letree )
-c
-c le numero letree du sous-triangle
- notrpt = letree( nsot, notrpt )
- goto 10
-c
- endif
- end
-
-
- subroutine teajpt( ns, nbsomm, mxsomm, pxyd, letree,
- & ntrp, ierr )
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c but : ajout du point ns de pxyd dans letree
-c -----
-c
-c entrees:
-c --------
-c ns : numero du point a ajouter dans letree
-c mxsomm : nombre maximal de points declarables dans pxyd
-c pxyd : tableau des coordonnees des points
-c par point : x y distance_souhaitee
-c
-c modifies :
-c ----------
-c nbsomm : nombre actuel de points dans pxyd
-c
-c letree : arbre-4 des triangles equilateraux (te) fond de la triangulation
-c letree(0,0) : no du 1-er te vide dans letree
-c letree(0,1) : maximum du 1-er indice de letree (ici 8)
-c letree(0,2) : maximum declare du 2-eme indice de letree (ici mxtree)
-c letree(0:8,1) : racine de l'arbre (triangle sans sur triangle)
-c si letree(0,.)>0 alors
-c letree(0:3,j) : no (>0) letree des 4 sous-triangles du triangle j
-c sinon
-c letree(0:3,j) :-no pxyd des 1 \85a 4 points internes au triangle j
-c 0 si pas de point
-c ( j est alors une feuille de l'arbre )
-c letree(4,j) : no letree du sur-triangle du triangle j
-c letree(5,j) : 0 1 2 3 no du sous-triangle j pour son sur-triangle
-c letree(6:8,j) : no pxyd des 3 sommets du triangle j
-c
-c sorties :
-c ---------
-c ntrp : numero letree du triangle te ou a ete ajoute le point
-c ierr : 0 si pas d'erreur, 51 saturation letree, 52 saturation pxyd
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c auteur : alain perronnet analyse numerique paris upmc fevrier 1992
-c2345x7..............................................................012
- integer letree(0:8,0:*)
- double precision pxyd(3,mxsomm)
-c
-c depart de la racine
- ntrp = 1
-c
-c recherche du triangle contenant le point pxyd(ns)
- 1 ntrp = notrpt( pxyd(1,ns), pxyd, ntrp, letree )
-c
-c existe t il un point libre
- do 10 i=0,3
- if( letree(i,ntrp) .eq. 0 ) then
-c la place i est libre
- letree(i,ntrp) = -ns
- return
- endif
- 10 continue
-c
-c pas de place libre => 4 sous-triangles sont crees
-c a partir des 3 milieux des aretes
- call te4ste( nbsomm, mxsomm, pxyd, ntrp, letree, ierr )
- if( ierr .ne. 0 ) return
-c
-c ajout du point ns
- goto 1
- end
-
- subroutine n1trva( nt, lar, letree, notrva, lhpile )
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c but : calculer le numero letree du triangle voisin du te nt
-c ----- par l'arete lar (1 a 3 ) de nt
-c attention : notrva n'est pas forcement minimal
-c
-c entrees:
-c --------
-c nt : numero letree du te de te voisin a calculer
-c lar : numero 1 a 3 de l'arete du triangle nt
-c letree : arbre-4 des triangles equilateraux (te) fond de la triangulation
-c letree(0,0) no du 1-er te vide dans letree
-c letree(0,1) : maximum du 1-er indice de letree (ici 8)
-c letree(0,2) : maximum declare du 2-eme indice de letree (ici mxtree)
-c letree(0:8,1) : racine de l'arbre (triangle sans sur-triangle)
-c si letree(0,.)>0 alors
-c letree(0:3,j) : no (>0) letree des 4 sous-triangles du triangle j
-c sinon
-c letree(0:3,j) :-no pxyd des 1 a 4 points internes au triangle j
-c 0 si pas de point
-c ( j est alors une feuille de l'arbre )
-c letree(4,j) : no letree du sur-triangle du triangle j
-c letree(5,j) : 0 1 2 3 no du sous-triangle j pour son sur-triangle
-c letree(6:8,j) : no pxyd des 3 sommets du triangle j
-c
-c sorties :
-c ---------
-c notrva : >0 numero letree du te voisin par l'arete lar
-c =0 si pas de te voisin (racine , ... )
-c lhpile : =0 si nt et notrva ont meme taille
-c >0 nt est 4**lhpile fois plus petit que notrva
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c auteur : alain perronnet analyse numerique paris upmc fevrier 1992
-c2345x7..............................................................012
- integer letree(0:8,0:*)
- integer lapile(1:64)
-c
-c initialisation de la pile
-c le triangle est empile
- lapile(1) = nt
- lhpile = 1
-c
-c tant qu'il existe un sur-triangle
- 10 ntr = lapile( lhpile )
- if( ntr .eq. 1 ) then
-c racine atteinte => pas de triangle voisin
- notrva = 0
- lhpile = lhpile - 1
- return
- endif
-c
-c le type du triangle ntr
- nty = letree( 5, ntr )
-c l'eventuel sur-triangle
- nsut = letree( 4, ntr )
-c
- if( nty .eq. 0 ) then
-c
-c triangle de type 0 => triangle voisin de type precedent(lar)
-c dans le sur-triangle de ntr
-c ce triangle remplace ntr dans lapile
- lapile( lhpile ) = letree( nopre3(lar), nsut )
- goto 20
- endif
-c
-c triangle ntr de type nty>0
- if( nosui3(nty) .eq. lar ) then
-c
-c le triangle voisin par lar est le triangle 0
- lapile( lhpile ) = letree( 0, nsut )
- goto 20
- endif
-c
-c triangle sans voisin direct => passage par le sur-triangle
- if( nsut .eq. 0 ) then
-c
-c ntr est la racine => pas de triangle voisin par cette arete
- notrva = 0
- return
- else
-c
-c le sur-triangle est empile
- lhpile = lhpile + 1
- lapile(lhpile) = nsut
- goto 10
- endif
-c
-c descente aux sous-triangles selon la meme arete
- 20 notrva = lapile( lhpile )
-c
- 30 lhpile = lhpile - 1
- if( letree(0,notrva) .le. 0 ) then
-c le triangle est une feuille de l'arbre 0 sous-triangle
-c lhpile = nombre de differences de niveaux dans l'arbre
- return
- else
-c le triangle a 4 sous-triangles
- if( lhpile .gt. 0 ) then
-c
-c bas de pile non atteint
- nty = letree( 5, lapile(lhpile) )
- if( nty .eq. lar ) then
-c l'oppose est suivant(nty) de notrva
- notrva = letree( nosui3(nty) , notrva )
- else
-c l'oppose est precedent(nty) de notrva
- notrva = letree( nopre3(nty) , notrva )
- endif
- goto 30
- endif
- endif
-c
-c meme niveau dans l'arbre lhpile = 0
- end
-
-
- subroutine cenced( xy1, xy2, xy3, cetria, ierr )
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c but : calcul des coordonnees du centre du cercle circonscrit
-c ----- du triangle defini par ses 3 sommets de coordonnees
-c xy1 xy2 xy3 ainsi que le carre du rayon de ce cercle
-c
-c entrees :
-c ---------
-c xy1 xy2 xy3 : les 2 coordonnees des 3 sommets du triangle
-c ierr : <0 => pas d'affichage si triangle degenere
-c >=0 => affichage si triangle degenere
-c
-c sortie :
-c --------
-c cetria : cetria(1)=abcisse du centre
-c cetria(2)=ordonnee du centre
-c cetria(3)=carre du rayon 1d28 si triangle degenere
-c ierr : 0 si triangle non degenere
-c 1 si triangle degenere
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c auteur : perronnet alain upmc analyse numerique paris juin 1995
-c2345x7..............................................................012
- parameter (epsurf=1d-7)
- common / unites / lecteu,imprim,nunite(30)
- double precision x1,y1,x21,y21,x31,y31,
- % aire2,xc,yc,rot,
- % xy1(2),xy2(2),xy3(2),cetria(3)
-c
-c le calcul de 2 fois l'aire du triangle
-c attention l'ordre des 3 sommets est direct ou non
- x1 = xy1(1)
- x21 = xy2(1) - x1
- x31 = xy3(1) - x1
-c
- y1 = xy1(2)
- y21 = xy2(2) - y1
- y31 = xy3(2) - y1
-c
- aire2 = x21 * y31 - x31 * y21
-c
-c recherche d'un test relatif peu couteux
-c pour reperer la degenerescence du triangle
- if( abs(aire2) .le.
- % epsurf*(abs(x21)+abs(x31))*(abs(y21)+abs(y31)) ) then
-c triangle de qualite trop faible
- if( ierr .ge. 0 ) then
-c nblgrc(nrerr) = 1
-c kerr(1) = 'erreur cenced: triangle degenere'
-c call lereur
- write(imprim,*) 'erreur cenced: triangle degenere'
- write(imprim,10000) xy1,xy2,xy3,aire2
- endif
-10000 format( 3(' x=',g24.16,' y=',g24.16/),' aire*2=',g24.16)
- cetria(1) = 0d0
- cetria(2) = 0d0
- cetria(3) = 1d28
- ierr = 1
- return
- endif
-c
-c les 2 coordonnees du centre intersection des 2 mediatrices
-c x = (x1+x2)/2 + lambda * (y2-y1)
-c y = (y1+y2)/2 - lambda * (x2-x1)
-c x = (x1+x3)/2 + rot * (y3-y1)
-c y = (y1+y3)/2 - rot * (x3-x1)
-c ==========================================================
- rot = ((xy2(1)-xy3(1))*x21 + (xy2(2)-xy3(2))*y21) / (2 * aire2)
-c
- xc = ( x1 + xy3(1) ) * 0.5d0 + rot * y31
- yc = ( y1 + xy3(2) ) * 0.5d0 - rot * x31
-c
- cetria(1) = xc
- cetria(2) = yc
-c
-c le carre du rayon
- cetria(3) = (x1-xc) ** 2 + (y1-yc) ** 2
-c
-c pas d'erreur rencontree
- ierr = 0
- end
-
-
- double precision function angled( p1, p2, p3 )
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c but : calculer l'angle (p1p2,p1p3) en radians
-c -----
-c
-c entrees :
-c ---------
-c p1,p2,p3 : les 2 coordonnees des 3 sommets de l'angle
-c sens direct pour une surface >0
-c sorties :
-c ---------
-c angled : angle (p1p2,p1p3) en radians entre [0 et 2pi]
-c 0 si p1=p2 ou p1=p3
-c ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c auteur : alain perronnet analyse numerique upmc paris fevrier 1992
-c2345x7..............................................................012
- double precision p1(2),p2(2),p3(2),x21,y21,x31,y31,a1,a2,d,c
-c
-c les cotes
- x21 = p2(1) - p1(1)
- y21 = p2(2) - p1(2)
- x31 = p3(1) - p1(1)
- y31 = p3(2) - p1(2)
-c
-c longueur des cotes
- a1 = x21 * x21 + y21 * y21
- a2 = x31 * x31 + y31 * y31
- d = sqrt( a1 * a2 )
- if( d .eq. 0 ) then
- angled = 0
- return
- endif
-c
-c cosinus de l'angle
- c = ( x21 * x31 + y21 * y31 ) / d
- if( c .le. -1.d0 ) then
-c tilt sur apollo si acos( -1 -eps )
- angled = atan( 1.d0 ) * 4.d0
- return
- else if( c .ge. 1.d0 ) then
-c tilt sur apollo si acos( 1 + eps )
- angled = 0
- return
- endif
-c
- angled = acos( c )
- if( x21 * y31 - x31 * y21 .lt. 0 ) then
-c demi plan inferieur
- angled = 8.d0 * atan( 1.d0 ) - angled
- endif
- end
-
-
- subroutine teajte( mxsomm, nbsomm, pxyd, comxmi,
- % aretmx, mxtree, letree,
- % ierr )
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c but : initialisation des tableaux letree
-c ----- ajout des sommets 1 a nbsomm (valeur en entree) dans letree
-c
-c entrees:
-c --------
-c mxsomm : nombre maximal de sommets permis pour la triangulation
-c mxtree : nombre maximal de triangles equilateraux (te) declarables
-c aretmx : longueur maximale des aretes des triangles equilateraux
-c
-c entrees et sorties :
-c --------------------
-c nbsomm : nombre de sommets apres identification
-c pxyd : tableau des coordonnees 2d des points
-c par point : x y distance_souhaitee
-c tableau reel(3,mxsomm)
-c
-c sorties:
-c --------
-c comxmi : coordonnees minimales et maximales des points frontaliers
-c letree : arbre-4 des triangles equilateraux (te) fond de la triangulation
-c letree(0,0) : no du 1-er te vide dans letree
-c letree(0,1) : maximum du 1-er indice de letree (ici 8)
-c letree(0,2) : maximum declare du 2-eme indice de letree (ici mxtree)
-c letree(0:8,1) : racine de l'arbre (triangle sans sur triangle)
-c si letree(0,.)>0 alors
-c letree(0:3,j) : no (>0) letree des 4 sous-triangles du triangle j
-c sinon
-c letree(0:3,j) :-no pxyd des 1 a 4 points internes au triangle j
-c 0 si pas de point
-c ( j est alors une feuille de l'arbre )
-c letree(4,j) : no letree du sur-triangle du triangle j
-c letree(5,j) : 0 1 2 3 no du sous-triangle j pour son sur-triangle
-c letree(6:8,j) : no pxyd des 3 sommets du triangle j
-c
-c ierr : 0 si pas d'erreur
-c 51 saturation letree
-c 52 saturation pxyd
-c 7 tous les points sont alignes
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c auteur : alain perronnet analyse numerique paris upmc juillet 1994
-c....................................................................012
- integer letree(0:8,0:mxtree)
- double precision pxyd(3,mxsomm)
- double precision comxmi(3,2)
- double precision a(2),s,aretmx,rac3
-c
-c protection du nombre de sommets avant d'ajouter ceux de tetree
- nbsofr = nbsomm
- do 1 i = 1, nbsomm
- comxmi(1,1) = min( comxmi(1,1), pxyd(1,i) )
- comxmi(1,2) = max( comxmi(1,2), pxyd(1,i) )
- comxmi(2,1) = min( comxmi(2,1), pxyd(2,i) )
- comxmi(2,2) = max( comxmi(2,2), pxyd(2,i) )
- 1 continue
-c
-c creation de l'arbre tee
-c =======================
-c la premiere colonne vide de letree
- letree(0,0) = 2
-c chainage des te vides
- do 4 i = 2 , mxtree
- letree(0,i) = i+1
- 4 continue
- letree(0,mxtree) = 0
-c les maxima des 2 indices de letree
- letree(1,0) = 8
- letree(2,0) = mxtree
-c
-c la racine
-c aucun point interne au triangle equilateral (te) 1
- letree(0,1) = 0
- letree(1,1) = 0
- letree(2,1) = 0
- letree(3,1) = 0
-c pas de sur-triangle
- letree(4,1) = 0
- letree(5,1) = 0
-c le numero pxyd des 3 sommets du te 1
- letree(6,1) = nbsomm + 1
- letree(7,1) = nbsomm + 2
- letree(8,1) = nbsomm + 3
-c
-c calcul de la largeur et hauteur du rectangle englobant
-c ======================================================
- a(1) = comxmi(1,2) - comxmi(1,1)
- a(2) = comxmi(2,2) - comxmi(2,1)
-c la longueur de la diagonale
- s = sqrt( a(1)**2 + a(2)**2 )
- do 60 k=1,2
- if( a(k) .lt. 1e-4 * s ) then
-c nblgrc(nrerr) = 1
- write(imprim,*) 'tous les points sont alignes'
-c call lereur
- ierr = 7
- return
- endif
- 60 continue
-c
-c le maximum des ecarts
- s = s + s
-c
-c le triangle equilateral englobant
-c =================================
-c ecart du rectangle au triangle equilateral
- rac3 = sqrt( 3.0d0 )
- arete = a(1) + 2 * aretmx + 2 * ( a(2) + aretmx ) / rac3
-c
-c le point nbsomm + 1 en bas a gauche
- nbsomm = nbsomm + 1
- pxyd(1,nbsomm) = (comxmi(1,1)+comxmi(1,2))*0.5d0 - arete*0.5d0
- pxyd(2,nbsomm) = comxmi(2,1) - aretmx
- pxyd(3,nbsomm) = s
-c
-c le point nbsomm + 2 en bas a droite
- nbsomm = nbsomm + 1
- pxyd(1,nbsomm) = pxyd(1,nbsomm-1) + arete
- pxyd(2,nbsomm) = pxyd(2,nbsomm-1)
- pxyd(3,nbsomm) = s
-c
-c le point nbsomm + 3 sommet au dessus
- nbsomm = nbsomm + 1
- pxyd(1,nbsomm) = pxyd(1,nbsomm-2) + arete * 0.5d0
- pxyd(2,nbsomm) = pxyd(2,nbsomm-2) + arete * 0.5d0 * rac3
- pxyd(3,nbsomm) = s
-c
-c ajout des sommets des lignes pour former letree
-c ===============================================
- do 150 i=1,nbsofr
-c ajout du point i de pxyd a letree
- call teajpt( i, nbsomm, mxsomm, pxyd, letree,
- & nt, ierr )
- if( ierr .ne. 0 ) return
- 150 continue
-c
- return
- end
-
-
- subroutine tetaid( nutysu, dx, dy, longai, ierr )
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c but : calculer la longueur de l'arete ideale en dx,dy
-c -----
-c
-c entrees:
-c --------
-c nutysu : numero de traitement de areteideale() selon le type de surface
-c 0 pas d'emploi de la fonction areteideale() => aretmx active
-c 1 il existe une fonction areteideale(xyz,xyzdir)
-c ... autres options a definir ...
-c dx, dy : abscisse et ordonnee dans le plan du point (reel2!)
-c
-c sorties:
-c --------
-c longai : longueur de l'areteideale(xyz,xyzdir) autour du point xyz
-c ierr : 0 si pas d'erreur, <>0 sinon
-c 1 calcul incorrect de areteideale(xyz,xyzdir)
-c 2 longueur calculee nulle
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c auteur : alain perronnet analyse numerique paris upmc mars 1997
-c2345x7..............................................................012
- common / unites / lecteu, imprim, nunite(30)
-c
- double precision areteideale
- double precision dx, dy, longai
- double precision xyz(3), xyzd(3), d0
-c
- ierr = 0
- if( nutysu .gt. 0 ) then
- d0 = longai
-c le point ou se calcule la longueur
- xyz(1) = dx
- xyz(2) = dy
-c z pour le calcul de la longueur (inactif ici!)
- xyz(3) = 0d0
-c la direction pour le calcul de la longueur (inactif ici!)
- xyzd(1) = 0d0
- xyzd(2) = 0d0
- xyzd(3) = 0d0
-
- longai = areteideale(xyz,xyzd)
- if( longai .lt. 0d0 ) then
- write(imprim,10000) xyz
-10000 format('attention: longueur de areteideale(',
- % g14.6,',',g14.6,',',g14.6,')<=0! => rendue >0' )
- longai = -longai
- endif
- if( longai .eq. 0d0 ) then
- write(imprim,10001) xyz
-10001 format('erreur: longueur de areteideale(',
- % g14.6,',',g14.6,',',g14.6,')=0!' )
- ierr = 2
- longai = d0
- endif
- endif
- end
-
-
- subroutine tehote( nutysu,
- % nbarpi, mxsomm, nbsomm, pxyd,
- % comxmi, aretmx,
- % letree, mxqueu, laqueu,
- % ierr )
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c but : homogeneisation de l'arbre des te a un saut de taille au plus
-c ----- prise en compte des distances souhaitees autour des sommets initiaux
-c
-c entrees:
-c --------
-c nutysu : numero de traitement de areteideale() selon le type de surface
-c 0 pas d'emploi de la fonction areteideale() => aretmx active
-c 1 il existe une fonction areteideale()
-c dont seules les 2 premieres composantes de uv sont actives
-c autres options a definir...
-c nbarpi : nombre de sommets de la frontiere + nombre de points internes
-c imposes par l'utilisateur
-c mxsomm : nombre maximal de sommets permis pour la triangulation et te
-c mxqueu : nombre d'entiers utilisables dans laqueu
-c comxmi : minimum et maximum des coordonnees de l'objet
-c aretmx : longueur maximale des aretes des triangles equilateraux
-c permtr : perimetre de la ligne enveloppe dans le plan
-c avant mise a l'echelle a 2**20
-c
-c modifies :
-c ----------
-c nbsomm : nombre de sommets apres identification
-c pxyd : tableau des coordonnees 2d des points
-c par point : x y distance_souhaitee
-c letree : arbre-4 des triangles equilateraux (te) fond de la triangulation
-c letree(0,0) : no du 1-er te vide dans letree
-c letree(1,0) : maximum du 1-er indice de letree (ici 8)
-c letree(2,0) : maximum declare du 2-eme indice de letree (ici mxtree)
-c letree(0:8,1) : racine de l'arbre (triangle sans sur triangle)
-c si letree(0,.)>0 alors
-c letree(0:3,j) : no (>0) letree des 4 sous-triangles du triangle j
-c sinon
-c letree(0:3,j) :-no pxyd des 1 a 4 points internes au triangle j
-c 0 si pas de point
-c ( j est alors une feuille de l'arbre )
-c letree(4,j) : no letree du sur-triangle du triangle j
-c letree(5,j) : 0 1 2 3 no du sous-triangle j pour son sur-triangle
-c letree(6:8,j) : no pxyd des 3 sommets du triangle j
-c
-c auxiliaire :
-c ------------
-c laqueu : mxqueu entiers servant de queue pour le parcours de letree
-c
-c sorties:
-c --------
-c ierr : 0 si pas d'erreur
-c 51 si saturation letree dans te4ste
-c 52 si saturation pxyd dans te4ste
-c >0 si autre erreur
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c auteur : alain perronnet analyse numerique paris upmc avril 1997
-c2345x7..............................................................012
- double precision ampli
- parameter (ampli=1.34d0)
- common / unites / lecteu, imprim, intera, nunite(29)
-c
- double precision pxyd(3,mxsomm), d2, aretm2
- double precision comxmi(3,2),aretmx,a,s,xrmin,xrmax,yrmin,yrmax
- double precision dmin, dmax
- integer letree(0:8,0:*)
-c
- integer laqueu(1:mxqueu),lequeu
-c lequeu : entree dans la queue
-c lhqueu : longueur de la queue
-c gestion circulaire
-c
- integer nuste(3)
- equivalence (nuste(1),ns1),(nuste(2),ns2),(nuste(3),ns3)
-c
-c existence ou non de la fonction 'taille_ideale' des aretes
-c autour du point. ici la carte est supposee isotrope
-c ==========================================================
-c attention: si la fonction taille_ideale existe
-c alors pxyd(3,*) est la taille_ideale dans l'espace initial
-c sinon pxyd(3,*) est la distance calculee dans le plan par
-c propagation a partir des tailles des aretes de la frontiere
-c
- if( nutysu .gt. 0 ) then
-c
-c la fonction taille_ideale(x,y,z) existe
-c ---------------------------------------
-c initialisation de la distance souhaitee autour des points 1 a nbsomm
- do 1 i=1,nbsomm
-c calcul de pxyzd(3,i)
- call tetaid( nutysu, pxyd(1,i), pxyd(2,i),
- % pxyd(3,i), ierr )
- if( ierr .ne. 0 ) goto 9999
- 1 continue
-c
- else
-c
-c la fonction taille_ideale(x,y,z) n'existe pas
-c ---------------------------------------------
-c prise en compte des distances souhaitees dans le plan
-c autour des points frontaliers et des points internes imposes
-c toutes les autres distances souhaitees ont ete mis a aretmx
-c lors de l'execution du sp teqini
- do 3 i=1,nbarpi
-c le sommet i n'est pas un sommet de letree => sommet frontalier
-c recherche du sous-triangle minimal feuille contenant le point i
- nte = 1
- 2 nte = notrpt( pxyd(1,i), pxyd, nte, letree )
-c la distance au sommet le plus eloigne est elle inferieure
-c a la distance souhaitee?
- ns1 = letree(6,nte)
- ns2 = letree(7,nte)
- ns3 = letree(8,nte)
- d2 = max( ( pxyd(1,i)-pxyd(1,ns1) )**2 +
- % ( pxyd(2,i)-pxyd(2,ns1) )**2
- % , ( pxyd(1,i)-pxyd(1,ns2) )**2 +
- % ( pxyd(2,i)-pxyd(2,ns2) )**2
- % , ( pxyd(1,i)-pxyd(1,ns3) )**2 +
- % ( pxyd(2,i)-pxyd(2,ns3) )**2 )
- if( d2 .gt. pxyd(3,i)**2 ) then
-c le triangle nte trop grand doit etre subdivise en 4 sous-triangle
- call te4ste( nbsomm, mxsomm, pxyd, nte, letree,
- & ierr )
- if( ierr .ne. 0 ) return
- goto 2
- endif
- 3 continue
- endif
-c
-c le sous-triangle central de la racine est decoupe systematiquement
-c ==================================================================
- nte = 2
- if( letree(0,2) .le. 0 ) then
-c le sous-triangle central de la racine n'est pas subdivise
-c il est donc decoupe en 4 soustriangles
- nbsom0 = nbsomm
- call te4ste( nbsomm, mxsomm, pxyd, nte, letree,
- % ierr )
- if( ierr .ne. 0 ) return
- do 4 i=nbsom0+1,nbsomm
-c mise a jour de taille_ideale des nouveaux sommets de te
- call tetaid( nutysu, pxyd(1,i), pxyd(2,i), pxyd(3,i), ierr )
- if( ierr .ne. 0 ) goto 9999
- 4 continue
- endif
-c
-c le carre de la longueur de l'arete de triangles equilateraux
-c souhaitee pour le fond de la triangulation
- aretm2 = (aretmx*ampli) ** 2
-c
-c tout te contenu dans le rectangle englobant doit avoir un
-c cote < aretmx et etre de meme taille que les te voisins
-c s'il contient un point; sinon un seul saut de taille est permis
-c ===============================================================
-c le rectangle englobant pour selectionner les te "internes"
-c le numero des 3 sommets du te englobant racine de l'arbre des te
- ns1 = letree(6,1)
- ns2 = letree(7,1)
- ns3 = letree(8,1)
- a = aretmx * 0.01d0
-c abscisse du milieu de l'arete gauche du te 1
- s = ( pxyd(1,ns1) + pxyd(1,ns3) ) / 2
- xrmin = min( s, comxmi(1,1) - aretmx ) - a
-c abscisse du milieu de l'arete droite du te 1
- s = ( pxyd(1,ns2) + pxyd(1,ns3) ) / 2
- xrmax = max( s, comxmi(1,2) + aretmx ) + a
- yrmin = comxmi(2,1) - aretmx
-c ordonnee de la droite passant par les milieus des 2 aretes
-c droite gauche du te 1
- s = ( pxyd(2,ns1) + pxyd(2,ns3) ) / 2
- yrmax = max( s, comxmi(2,2) + aretmx ) + a
-c
-c cas particulier de 3 ou 4 ou peu d'aretes frontalieres
- if( nbarpi .le. 8 ) then
-c tout le triangle englobant (racine) est a prendre en compte
- xrmin = pxyd(1,ns1) - a
- xrmax = pxyd(1,ns2) + a
- yrmin = pxyd(2,ns1) - a
- yrmax = pxyd(2,ns3) + a
- endif
-c
- nbs0 = nbsomm
- nbiter = -1
-c
-c initialisation de la queue
- 5 nbiter = nbiter + 1
- lequeu = 1
- lhqueu = 0
-c la racine de letree initialise la queue
- laqueu(1) = 1
-c
-c tant que la longueur de la queue est >=0 traiter le debut de queue
- 10 if( lhqueu .ge. 0 ) then
-c
-c le triangle te a traiter
- i = lequeu - lhqueu
- if( i .le. 0 ) i = mxqueu + i
- nte = laqueu( i )
-c la longueur de la queue est reduite
- lhqueu = lhqueu - 1
-c
-c nte est il un sous-triangle feuille minimal ?
- 15 if( letree(0,nte) .gt. 0 ) then
-c
-c non les 4 sous-triangles sont mis dans la queue
- if( lhqueu + 4 .ge. mxqueu ) then
- write(imprim,*) 'tehote: saturation de la queue'
- ierr = 7
- return
- endif
- do 20 i=3,0,-1
-c ajout du sous-triangle i
- lhqueu = lhqueu + 1
- lequeu = lequeu + 1
- if( lequeu .gt. mxqueu ) lequeu = lequeu - mxqueu
- laqueu( lequeu ) = letree( i, nte )
- 20 continue
- goto 10
-c
- endif
-c
-c ici nte est un triangle minimal non subdivise
-c ---------------------------------------------
-c le te est il dans le cadre englobant de l'objet ?
- ns1 = letree(6,nte)
- ns2 = letree(7,nte)
- ns3 = letree(8,nte)
- if( pxyd(1,ns1) .gt. pxyd(1,ns2) ) then
- dmin = pxyd(1,ns2)
- dmax = pxyd(1,ns1)
- else
- dmin = pxyd(1,ns1)
- dmax = pxyd(1,ns2)
- endif
- if( (xrmin .le. dmin .and. dmin .le. xrmax) .or.
- % (xrmin .le. dmax .and. dmax .le. xrmax) ) then
- if( pxyd(2,ns1) .gt. pxyd(2,ns3) ) then
- dmin = pxyd(2,ns3)
- dmax = pxyd(2,ns1)
- else
- dmin = pxyd(2,ns1)
- dmax = pxyd(2,ns3)
- endif
- if( (yrmin .le. dmin .and. dmin .le. yrmax) .or.
- % (yrmin .le. dmax .and. dmax .le. yrmax) ) then
-c
-c nte est un te feuille et interne au rectangle englobant
-c =======================================================
-c le carre de la longueur de l'arete du te de numero nte
- d2 = (pxyd(1,ns1)-pxyd(1,ns2)) ** 2 +
- % (pxyd(2,ns1)-pxyd(2,ns2)) ** 2
-c
- if( nutysu .eq. 0 ) then
-c
-c il n'existe pas de fonction 'taille_ideale'
-c -------------------------------------------
-c si la taille effective de l'arete du te est superieure a aretmx
-c alors le te est decoupe
- if( d2 .gt. aretm2 ) then
-c le triangle nte trop grand doit etre subdivise
-c en 4 sous-triangles
- call te4ste( nbsomm,mxsomm, pxyd,
- % nte, letree, ierr )
- if( ierr .ne. 0 ) return
- goto 15
- endif
-c
- else
-c
-c il existe ici une fonction 'taille_ideale'
-c ------------------------------------------
-c si la taille effective de l'arete du te est superieure au mini
-c des 3 tailles_ideales aux sommets alors le te est decoupe
- do 28 i=1,3
- if( d2 .gt. (pxyd(3,nuste(i))*ampli)**2 ) then
-c le triangle nte trop grand doit etre subdivise
-c en 4 sous-triangles
- nbsom0 = nbsomm
- call te4ste( nbsomm, mxsomm, pxyd,
- & nte, letree, ierr )
- if( ierr .ne. 0 ) return
- do 27 j=nbsom0+1,nbsomm
-c mise a jour de taille_ideale des nouveaux sommets de
- call tetaid( nutysu, pxyd(1,j), pxyd(2,j),
- % pxyd(3,j), ierr )
- if( ierr .ne. 0 ) goto 9999
- 27 continue
- goto 15
- endif
- 28 continue
- endif
-c
-c recherche du nombre de niveaux entre nte et les te voisins par se
-c si la difference de subdivisions excede 1 alors le plus grand des
-c =================================================================
- 29 do 30 i=1,3
-c
-c noteva triangle voisin de nte par l'arete i
- call n1trva( nte, i, letree, noteva, niveau )
- if( noteva .le. 0 ) goto 30
-c il existe un te voisin
- if( niveau .gt. 0 ) goto 30
-c nte a un te voisin plus petit ou egal
- if( letree(0,noteva) .le. 0 ) goto 30
-c nte a un te voisin noteva subdivise au moins une fois
-c
- if( nbiter .gt. 0 ) then
-c les 2 sous triangles voisins sont-ils subdivises?
- ns2 = letree(i,noteva)
- if( letree(0,ns2) .le. 0 ) then
-c ns2 n'est pas subdivise
- ns2 = letree(nosui3(i),noteva)
- if( letree(0,ns2) .le. 0 ) then
-c les 2 sous-triangles ne sont pas subdivises
- goto 30
- endif
- endif
- endif
-c
-c saut>1 => le triangle nte doit etre subdivise en 4 sous-triang
-c --------------------------------------------------------------
- nbsom0 = nbsomm
- call te4ste( nbsomm,mxsomm, pxyd, nte, letree,
- & ierr )
- if( ierr .ne. 0 ) return
- if( nutysu .gt. 0 ) then
- do 32 j=nbsom0+1,nbsomm
-c mise a jour de taille_ideale des nouveaux sommets de te
- call tetaid( nutysu, pxyd(1,j), pxyd(2,j),
- % pxyd(3,j), ierr )
- if( ierr .ne. 0 ) goto 9999
- 32 continue
- endif
- goto 15
-c
- 30 continue
- endif
- endif
- goto 10
- endif
- if( nbs0 .lt. nbsomm ) then
- nbs0 = nbsomm
- goto 5
- endif
- return
-c
-c pb dans le calcul de la fonction taille_ideale
-
- 9999 write(imprim,*) 'pb dans le calcul de taille_ideale'
-c nblgrc(nrerr) = 1
-c kerr(1) = 'pb dans le calcul de taille_ideale'
-c call lereur
- return
- end
-
-
- subroutine tetrte( comxmi, aretmx, nbarpi, mxsomm, pxyd,
- % mxqueu, laqueu, letree,
- % mosoar, mxsoar, n1soar, nosoar,
- % moartr, mxartr, n1artr, noartr, noarst,
- % ierr )
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c but : trianguler les triangles equilateraux feuilles et
-c ----- les points de la frontiere et les points internes imposes
-c
-c attention: la triangulation finale n'est pas de type delaunay!
-c
-c entrees:
-c --------
-c comxmi : minimum et maximum des coordonnees de l'objet
-c aretmx : longueur maximale des aretes des triangles equilateraux
-c nbarpi : nombre de sommets de la frontiere + nombre de points internes
-c imposes par l'utilisateur
-c mxsomm : nombre maximal de sommets declarables dans pxyd
-c pxyd : tableau des coordonnees 2d des points
-c par point : x y distance_souhaitee
-c
-c mxqueu : nombre d'entiers utilisables dans laqueu
-c mosoar : nombre maximal d'entiers par arete du tableau nosoar
-c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar
-c moartr : nombre maximal d'entiers par arete du tableau noartr
-c mxartr : nombre maximal de triangles stockables dans le tableau noartr
-c letree : arbre-4 des triangles equilateraux (te) fond de la triangulation
-c letree(0,0) : no du 1-er te vide dans letree
-c letree(0,1) : maximum du 1-er indice de letree (ici 8)
-c letree(0,2) : maximum declare du 2-eme indice de letree (ici mxtree)
-c letree(0:8,1) : racine de l'arbre (triangle sans sur triangle)
-c si letree(0,.)>0 alors
-c letree(0:3,j) : no (>0) letree des 4 sous-triangles du triangle j
-c sinon
-c letree(0:3,j) :-no pxyd des 1 a 4 points internes au triangle j
-c 0 si pas de point
-c ( j est alors une feuille de l'arbre )
-c letree(4,j) : no letree du sur-triangle du triangle j
-c letree(5,j) : 0 1 2 3 no du sous-triangle j pour son sur-triangle
-c letree(6:8,j) : no pxyd des 3 sommets du triangle j
-c
-c modifies:
-c ---------
-c n1soar : numero de la premiere arete vide dans le tableau nosoar
-c une arete i de nosoar est vide <=> nosoar(1,i)=0
-c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete,
-c chainage des aretes frontalieres, chainage du hachage des aretes
-c hachage des aretes = nosoar(1)+nosoar(2)*2
-c noarst : noarst(i) numero d'une arete de sommet i
-c
-c auxiliaire :
-c ------------
-c laqueu : mxqueu entiers servant de queue pour le parcours de letree
-c
-c sorties:
-c --------
-c n1artr : numero du premier triangle vide dans le tableau noartr
-c le chainage des triangles vides se fait sur noartr(2,.)
-c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3
-c arete1 = 0 si triangle vide => arete2 = triangle vide suivant
-c ierr : =0 si pas d'erreur
-c =1 si le tableau nosoar est sature
-c =2 si le tableau noartr est sature
-c =3 si aucun des triangles ne contient l'un des points internes d'un t
-c =5 si saturation de la queue de parcours de l'arbre des te
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c auteur : alain perronnet analyse numerique paris upmc mars 1997
-c2345x7..............................................................012
- common / unites / lecteu, imprim, intera, nunite(29)
-c
- double precision pxyd(3,mxsomm)
- double precision comxmi(3,2),aretmx,a,s,xrmin,xrmax,yrmin,yrmax
- double precision dmin, dmax
-c
- integer nosoar(mosoar,mxsoar),
- % noartr(moartr,mxartr),
- % noarst(mxsomm)
-c
- integer letree(0:8,0:*)
- integer laqueu(1:mxqueu)
-c lequeu:entree dans la queue en gestion circulaire
-c lhqueu:longueur de la queue en gestion circulaire
-c
- integer milieu(3), nutr(1:13)
-c
-c le rectangle englobant pour selectionner les te "internes"
-c le numero des 3 sommets du te englobant racine de l'arbre des te
- ns1 = letree(6,1)
- ns2 = letree(7,1)
- ns3 = letree(8,1)
- a = aretmx * 0.01d0
-c abscisse du milieu de l'arete gauche du te 1
- s = ( pxyd(1,ns1) + pxyd(1,ns3) ) / 2
- xrmin = min( s, comxmi(1,1) - aretmx ) - a
-c abscisse du milieu de l'arete droite du te 1
- s = ( pxyd(1,ns2) + pxyd(1,ns3) ) / 2
- xrmax = max( s, comxmi(1,2) + aretmx ) + a
- yrmin = comxmi(2,1) - aretmx
-c ordonnee de la droite passant par les milieus des 2 aretes
-c droite gauche du te 1
- s = ( pxyd(2,ns1) + pxyd(2,ns3) ) / 2
- yrmax = max( s, comxmi(2,2) + aretmx ) + a
-c
-c cas particulier de 3 ou 4 ou peu d'aretes frontalieres
- if( nbarpi .le. 8 ) then
-c tout le triangle englobant (racine) est a prendre en compte
- xrmin = pxyd(1,ns1) - a
- xrmax = pxyd(1,ns2) + a
- yrmin = pxyd(2,ns1) - a
- yrmax = pxyd(2,ns3) + a
- endif
-c
-c initialisation du tableau noartr
- do 5 i=1,mxartr
-c le numero de l'arete est inconnu
- noartr(1,i) = 0
-c le chainage sur le triangle vide suivant
- noartr(2,i) = i+1
- 5 continue
- noartr(2,mxartr) = 0
- n1artr = 1
-c
-c parcours des te jusqu'a trianguler toutes les feuilles (triangles eq)
-c =====================================================================
-c initialisation de la queue sur les te
- ierr = 0
- lequeu = 1
- lhqueu = 0
-c la racine de letree initialise la queue
- laqueu(1) = 1
-c
-c tant que la longueur de la queue est >=0 traiter le debut de queue
- 10 if( lhqueu .ge. 0 ) then
-c
-c le triangle te a traiter
- i = lequeu - lhqueu
- if( i .le. 0 ) i = mxqueu + i
- nte = laqueu( i )
-c la longueur est reduite
- lhqueu = lhqueu - 1
-c
-c nte est il un sous-triangle feuille (minimal) ?
- 15 if( letree(0,nte) .gt. 0 ) then
-c non les 4 sous-triangles sont mis dans la queue
- if( lhqueu + 4 .ge. mxqueu ) then
- write(imprim,*) 'tetrte: saturation de la queue'
- ierr = 5
- return
- endif
- do 20 i=3,0,-1
-c ajout du sous-triangle i
- lhqueu = lhqueu + 1
- lequeu = lequeu + 1
- if( lequeu .gt. mxqueu ) lequeu = lequeu - mxqueu
- laqueu( lequeu ) = letree( i, nte )
- 20 continue
- goto 10
- endif
-c
-c ici nte est un triangle minimal non subdivise
-c ---------------------------------------------
-c le te est il dans le cadre englobant de l'objet ?
- ns1 = letree(6,nte)
- ns2 = letree(7,nte)
- ns3 = letree(8,nte)
- if( pxyd(1,ns1) .gt. pxyd(1,ns2) ) then
- dmin = pxyd(1,ns2)
- dmax = pxyd(1,ns1)
- else
- dmin = pxyd(1,ns1)
- dmax = pxyd(1,ns2)
- endif
- if( (xrmin .le. dmin .and. dmin .le. xrmax) .or.
- % (xrmin .le. dmax .and. dmax .le. xrmax) ) then
- if( pxyd(2,ns1) .gt. pxyd(2,ns3) ) then
- dmin = pxyd(2,ns3)
- dmax = pxyd(2,ns1)
- else
- dmin = pxyd(2,ns1)
- dmax = pxyd(2,ns3)
- endif
- if( (yrmin .le. dmin .and. dmin .le. yrmax) .or.
- % (yrmin .le. dmax .and. dmax .le. yrmax) ) then
-c
-c te minimal et interne au rectangle englobant
-c --------------------------------------------
-c recherche du nombre de niveaux entre nte et les te voisins
-c par ses aretes
- nbmili = 0
- do 30 i=1,3
-c
-c a priori pas de milieu de l'arete i du te nte
- milieu(i) = 0
-c
-c recherche de noteva te voisin de nte par l'arete i
- call n1trva( nte, i, letree, noteva, niveau )
-c noteva : >0 numero letree du te voisin par l'arete i
-c =0 si pas de te voisin (racine , ... )
-c niveau : =0 si nte et noteva ont meme taille
-c >0 nte est 4**niveau fois plus petit que noteva
- if( noteva .gt. 0 ) then
-c il existe un te voisin
- if( letree(0,noteva) .gt. 0 ) then
-c noteva est plus petit que nte
-c => recherche du numero du milieu du cote=sommet du te no
-c le sous-te 0 du te noteva
- nsot = letree(0,noteva)
-c le numero dans pxyd du milieu de l'arete i de nte
- milieu( i ) = letree( 5+nopre3(i), nsot )
- nbmili = nbmili + 1
- endif
- endif
-c
- 30 continue
-c
-c triangulation du te nte en fonction du nombre de ses milieux
- goto( 50, 100, 200, 300 ) , nbmili + 1
-c
-c 0 milieu => 1 triangle = le te nte
-c ----------------------------------
- 50 call f0trte( letree(0,nte), pxyd,
- % mosoar, mxsoar, n1soar, nosoar,
- % moartr, mxartr, n1artr, noartr,
- % noarst,
- % nbtr, nutr, ierr )
- if( ierr .ne. 0 ) return
- goto 10
-c
-c 1 milieu => 2 triangles = 2 demi te
-c -----------------------------------
- 100 call f1trte( letree(0,nte), pxyd, milieu,
- % mosoar, mxsoar, n1soar, nosoar,
- % moartr, mxartr, n1artr, noartr,
- % noarst,
- % nbtr, nutr, ierr )
- if( ierr .ne. 0 ) return
- goto 10
-c
-c 2 milieux => 3 triangles
-c -----------------------------------
- 200 call f2trte( letree(0,nte), pxyd, milieu,
- % mosoar, mxsoar, n1soar, nosoar,
- % moartr, mxartr, n1artr, noartr,
- % noarst,
- % nbtr, nutr, ierr )
- if( ierr .ne. 0 ) return
- goto 10
-c
-c 3 milieux => 4 triangles = 4 quart te
-c -------------------------------------
- 300 call f3trte( letree(0,nte), pxyd, milieu,
- % mosoar, mxsoar, n1soar, nosoar,
- % moartr, mxartr, n1artr, noartr,
- % noarst,
- % nbtr, nutr, ierr )
- if( ierr .ne. 0 ) return
- goto 10
- endif
- endif
- goto 10
- endif
- end
-
-
- subroutine aisoar( mosoar, mxsoar, nosoar, na1 )
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c but : chainer en colonne lchain les aretes non vides et
-c ----- non frontalieres du tableau nosoar
-c
-c entrees:
-c --------
-c mosoar : nombre maximal d'entiers par arete dans le tableau nosoar
-c mxsoar : nombre maximal d'aretes frontalieres declarables
-c
-c modifies :
-c ----------
-c nosoar : numero des 2 sommets , no ligne, 2 triangles, chainages en +
-c nosoar(lchain,i)=arete interne suivante
-c
-c sortie :
-c --------
-c na1 : numero dans nosoar de la premiere arete interne
-c les suivantes sont nosoar(lchain,na1), ...
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c auteur : alain perronnet analyse numerique paris upmc mars 1997
-c....................................................................012
- parameter (lchain=6)
- integer nosoar(mosoar,mxsoar)
-c
-c formation du chainage des aretes internes a echanger eventuellement
-c recherche de la premiere arete non vide et non frontaliere
- do 10 na1=1,mxsoar
- if( nosoar(1,na1) .gt. 0 .and. nosoar(3,na1) .le. 0 ) goto 15
- 10 continue
-c
-c protection de la premiere arete non vide et non frontaliere
- 15 na0 = na1
- do 20 na=na1+1,mxsoar
- if( nosoar(1,na) .gt. 0 .and. nosoar(3,na) .le. 0 ) then
-c arete interne => elle est chainee a partir de la precedente
- nosoar(lchain,na0) = na
- na0 = na
- endif
- 20 continue
-c
-c la derniere arete interne n'a pas de suivante
- nosoar(lchain,na0) = 0
- end
-
-
- subroutine tedela( pxyd, noarst,
- % mosoar, mxsoar, n1soar, nosoar, n1ardv,
- % moartr, mxartr, n1artr, noartr, modifs )
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c but : pour toutes les aretes chainees dans nosoar(lchain,*)
-c ----- du tableau nosoar
-c echanger la diagonale des 2 triangles si le sommet oppose
-c a un triangle ayant en commun une arete appartient au cercle
-c circonscrit de l'autre (violation boule vide delaunay)
-c
-c entrees:
-c --------
-c pxyd : tableau des x y distance_souhaitee de chaque sommet
-c
-c modifies :
-c ----------
-c noarst : noarst(i) numero d'une arete de sommet i
-c mosoar : nombre maximal d'entiers par arete dans le tableau nosoar
-c mxsoar : nombre maximal d'aretes frontalieres declarables
-c n1soar : numero de la premiere arete vide dans le tableau nosoar
-c nosoar : numero des 2 sommets , no ligne, 2 triangles, chainages en +
-c n1ardv : numero dans nosoar de la premiere arete du chainage
-c des aretes a rendre delaunay
-c
-c moartr : nombre d'entiers par triangle dans le tableau noartr
-c mxartr : nombre maximal de triangles declarables dans noartr
-c n1artr : numero du premier triangle vide dans le tableau noartr
-c le chainage des triangles vides se fait sur noartr(2,.)
-c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3
-c arete1 = 0 si triangle vide => arete2 = triangle vide suivant
-c modifs : nombre d'echanges de diagonales pour maximiser la qualite
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c auteur : alain perronnet analyse numerique paris upmc mars 1997
-c....................................................................012
- parameter (lchain=6)
- common / unites / lecteu, imprim, nunite(30)
- double precision pxyd(3,*), surtd2, s123, s142, s143, s234,
- % s12, s34, a12, cetria(3), r0
- integer nosoar(mosoar,mxsoar),
- % noartr(moartr,mxartr),
- % noarst(*)
-c
-c le nombre d'echanges de diagonales pour minimiser l'aire
- modifs = 0
- r0 = 0
-c
-c la premiere arete du chainage des aretes a rendre delaunay
- na0 = n1ardv
-c
-c tant que la pile des aretes a echanger eventuellement est non vide
-c ==================================================================
- 20 if( na0 .gt. 0 ) then
-c
-c l'arete a traiter
- na = na0
-c la prochaine arete a traiter
- na0 = nosoar(lchain,na0)
-c
-c l'arete est marquee traitee avec le numero -1
- nosoar(lchain,na) = -1
-c
-c l'arete est elle active?
- if( nosoar(1,na) .eq. 0 ) goto 20
-c
-c si arete frontaliere pas d'echange possible
- if( nosoar(3,na) .gt. 0 ) goto 20
-c
-c existe-t-il 2 triangles ayant cette arete commune?
- if( nosoar(4,na) .le. 0 .or. nosoar(5,na) .le. 0 ) goto 20
-c
-c aucun des 2 triangles est-il desactive?
- if( noartr(1,nosoar(4,na)) .eq. 0 .or.
- % noartr(1,nosoar(5,na)) .eq. 0 ) goto 20
-c
-c l'arete appartient a deux triangles actifs
-c le numero des 4 sommets du quadrangle des 2 triangles
- call mt4sqa( na, moartr, noartr, mosoar, nosoar,
- % ns1, ns2, ns3, ns4 )
- if( ns4 .eq. 0 ) goto 20
-c
-c carre de la longueur de l'arete ns1 ns2
- a12 = (pxyd(1,ns2)-pxyd(1,ns1))**2+(pxyd(2,ns2)-pxyd(2,ns1))**2
-c
-c comparaison de la somme des aires des 2 triangles
-c -------------------------------------------------
-c calcul des surfaces des triangles 123 et 142 de cette arete
- s123=surtd2( pxyd(1,ns1), pxyd(1,ns2), pxyd(1,ns3) )
- s142=surtd2( pxyd(1,ns1), pxyd(1,ns4), pxyd(1,ns2) )
- s12 = abs( s123 ) + abs( s142 )
- if( s12 .le. 0.001*a12 ) goto 20
-c
-c calcul des surfaces des triangles 143 et 234 de cette arete
- s143=surtd2( pxyd(1,ns1), pxyd(1,ns4), pxyd(1,ns3) )
- s234=surtd2( pxyd(1,ns2), pxyd(1,ns3), pxyd(1,ns4) )
- s34 = abs( s234 ) + abs( s143 )
-c
- if( abs(s34-s12) .gt. 1d-15*s34 ) goto 20
-c
-c quadrangle convexe : le critere de delaunay intervient
-c ------------------ ---------------------------------
-c calcul du centre et rayon de la boule circonscrite a 123
-c pas d'affichage si le triangle est degenere
- ierr = -1
- call cenced( pxyd(1,ns1), pxyd(1,ns2), pxyd(1,ns3), cetria,
- % ierr )
- if( ierr .gt. 0 ) then
-c ierr=1 si triangle degenere => abandon
- goto 20
- endif
-c
- if( (cetria(1)-pxyd(1,ns4))**2+(cetria(2)-pxyd(2,ns4))**2
- % .lt. cetria(3) ) then
-c
-c protection contre une boucle infinie sur le meme cercle
- if( r0 .eq. cetria(3) ) goto 20
-c
-c oui: ns4 est dans le cercle circonscrit a ns1 ns2 ns3
-c => ns3 est aussi dans le cercle circonscrit de ns1 ns2 ns4
-c
-cccc les 2 triangles d'arete na sont effaces
-ccc do 25 j=4,5
-ccc nt = nosoar(j,na)
-cccc trace du triangle nt
-ccc call mttrtr( pxyd, nt, moartr, noartr, mosoar, nosoar,
-ccc % ncnoir, ncjaun )
-ccc 25 continue
-c
-c echange de la diagonale 12 par 34 des 2 triangles
- call te2t2t( na, mosoar, n1soar, nosoar, noarst,
- % moartr, noartr, na34 )
- if( na34 .eq. 0 ) goto 20
- r0 = cetria(3)
-c
-c l'arete na34 est marquee traitee
- nosoar(lchain,na34) = -1
- modifs = modifs + 1
-c
-c les aretes internes peripheriques des 2 triangles sont enchainees
- do 60 j=4,5
- nt = nosoar(j,na34)
-cccc trace du triangle nt
-ccc call mttrtr( pxyd, nt, moartr, noartr, mosoar, nosoar,
-ccc % ncoran, ncgric )
- do 50 i=1,3
- n = abs( noartr(i,nt) )
- if( n .ne. na34 ) then
- if( nosoar(3,n) .eq. 0 .and.
- % nosoar(lchain,n) .eq. -1 ) then
-c cette arete marquee est chainee pour etre traitee
- nosoar(lchain,n) = na0
- na0 = n
- endif
- endif
- 50 continue
- 60 continue
- goto 20
- endif
-c
-c retour en haut de la pile des aretes a traiter
- goto 20
- endif
- end
-
-
- subroutine terefr( nbarpi, pxyd,
- % mosoar, mxsoar, n1soar, nosoar,
- % moartr, n1artr, noartr, noarst,
- % mxarcf, n1arcf, noarcf, larmin, notrcf,
- % nbarpe, ierr )
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c but : recherche des aretes de la frontiere non dans la triangulation
-c ----- triangulation frontale pour les reobtenir
-c
-c attention: le chainage lchain de nosoar devient celui des cf
-c
-c entrees:
-c --------
-c le tableau nosoar
-c nbarpi : numero du dernier point interne impose par l'utilisateur
-c pxyd : tableau des coordonnees 2d des points
-c par point : x y distance_souhaitee
-c mosoar : nombre maximal d'entiers par arete et
-c indice dans nosoar de l'arete suivante dans le hachage
-c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar
-c attention: mxsoar>3*mxsomm obligatoire!
-c moartr : nombre maximal d'entiers par arete du tableau noartr
-c mxarcf : nombre de variables des tableaux n1arcf, noarcf, larmin, notrcf
-c
-c modifies:
-c ---------
-c n1soar : no de l'eventuelle premiere arete libre dans le tableau nosoar
-c chainage des vides suivant en 3 et precedant en 2 de nosoar
-c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete,
-c chainage des aretes frontalieres, chainage du hachage des aretes
-c hachage des aretes = nosoar(1)+nosoar(2)*2
-c avec mxsoar>=3*mxsomm
-c une arete i de nosoar est vide <=> nosoar(1,i)=0 et
-c nosoar(2,arete vide)=l'arete vide qui precede
-c nosoar(3,arete vide)=l'arete vide qui suit
-c n1artr : numero du premier triangle vide dans le tableau noartr
-c le chainage des triangles vides se fait sur noartr(2,.)
-c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3
-c arete1 = 0 si triangle vide => arete2 = triangle vide suivant
-c noarst : noarst(i) numero d'une arete de sommet i
-c
-c
-c auxiliaires :
-c -------------
-c n1arcf : tableau (0:mxarcf) auxiliaire d'entiers
-c noarcf : tableau (3,mxarcf) auxiliaire d'entiers
-c larmin : tableau (mxarcf) auxiliaire d'entiers
-c notrcf : tableau (mxarcf) auxiliaire d'entiers
-c
-c sortie :
-c --------
-c nbarpe : nombre d'aretes perdues puis retrouvees
-c ierr : =0 si pas d'erreur
-c >0 si une erreur est survenue
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c auteur : alain perronnet analyse numerique paris upmc mars 1997
-c....................................................................012
- parameter (lchain=6)
- common / unites / lecteu,imprim,intera,nunite(29)
- double precision pxyd(3,*)
- integer nosoar(mosoar,mxsoar),
- % noartr(moartr,*),
- % noarst(*),
- % n1arcf(0:mxarcf),
- % noarcf(3,mxarcf),
- % larmin(mxarcf),
- % notrcf(mxarcf)
-c
-c le nombre d'aretes de la frontiere non arete de la triangulation
- nbarpe = 0
-c
-c initialisation du chainage des aretes des cf => 0 arete de cf
- do 10 narete=1,mxsoar
- nosoar( lchain, narete) = -1
- 10 continue
-c
-c boucle sur l'ensemble des aretes actuelles
-c ==========================================
- do 30 narete=1,mxsoar
-c
- if( nosoar(3,narete) .gt. 0 ) then
-c arete appartenant a une ligne => frontaliere
-c
- if(nosoar(4,narete) .le. 0 .or. nosoar(5,narete) .le. 0)then
-c l'arete narete frontaliere n'appartient pas a 2 triangles
-c => elle est perdue
- nbarpe = nbarpe + 1
-c
-c le numero des 2 sommets de l'arete frontaliere perdue
- ns1 = nosoar( 1, narete )
- ns2 = nosoar( 2, narete )
-c write(imprim,10000) ns1,(pxyd(j,ns1),j=1,2),
-c % ns2,(pxyd(j,ns2),j=1,2)
-10000 format(' arete perdue a forcer',
- % (t24,'sommet=',i6,' x=',g13.5,' y=',g13.5))
-c
-c traitement de cette arete perdue ns1-ns2
- call tefoar( narete, nbarpi, pxyd,
- % mosoar, mxsoar, n1soar, nosoar,
- % moartr, n1artr, noartr, noarst,
- % mxarcf, n1arcf, noarcf, larmin, notrcf,
- % ierr )
- if( ierr .ne. 0 ) return
-c
-c fin du traitement de cette arete perdue et retrouvee
- endif
- endif
-c
- 30 continue
- end
-
-
- subroutine tesuex( nblftr, nulftr,
- % ndtri0, nbsomm, pxyd, nslign,
- % mosoar, mxsoar, nosoar,
- % moartr, mxartr, n1artr, noartr, noarst,
- % nbtria, letrsu, ierr )
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c but : supprimer du tableau noartr les triangles externes au domaine
-c ----- en annulant le numero de leur 1-ere arete dans noartr
-c et en les chainant comme triangles vides
-c
-c entrees:
-c --------
-c nblftr : nombre de lignes fermees definissant la surface
-c nulftr : numero des lignes fermees definissant la surface
-c ndtri0 : plus grand numero dans noartr d'un triangle
-c pxyd : tableau des coordonnees 2d des points
-c par point : x y distance_souhaitee
-c nslign : tableau du numero de sommet dans sa ligne pour chaque
-c sommet frontalier
-c numero du point dans le lexique point si interne impose
-c 0 si le point est interne non impose par l'utilisateur
-c -1 si le sommet est externe au domaine
-c mosoar : nombre maximal d'entiers par arete et
-c indice dans nosoar de l'arete suivante dans le hachage
-c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar
-c attention: mxsoar>3*mxsomm obligatoire!
-c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete,
-c chainage des aretes frontalieres, chainage du hachage des aretes
-c hachage des aretes = nosoar(1)+nosoar(2)*2
-c avec mxsoar>=3*mxsomm
-c une arete i de nosoar est vide <=> nosoar(1,i)=0 et
-c nosoar(2,arete vide)=l'arete vide qui precede
-c nosoar(3,arete vide)=l'arete vide qui suit
-c moartr : nombre maximal d'entiers par arete du tableau noartr
-c mxartr : nombre maximal de triangles declarables
-c n1artr : numero du premier triangle vide dans le tableau noartr
-c le chainage des triangles vides se fait sur noartr(2,.)
-c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3
-c arete1 = 0 si triangle vide => arete2 = triangle vide suivant
-c noarst : noarst(i) numero nosoar d'une arete de sommet i
-c
-c sorties:
-c --------
-c nbtria : nombre de triangles internes au domaine
-c letrsu : letrsu(nt)=numero du triangle interne, 0 sinon
-c noarst : noarst(i) numero nosoar d'une arete du sommet i (modifi'e)
-c ierr : 0 si pas d'erreur, >0 sinon
-cc++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c auteur : alain perronnet analyse numerique paris upmc mai 1999
-c2345x7..............................................................012
- double precision pxyd(3,*)
- integer nulftr(nblftr),nslign(nbsomm),
- % nosoar(mosoar,mxsoar),
- % noartr(moartr,mxartr),
- % noarst(*)
- integer letrsu(1:ndtri0)
- double precision dmin
-c
-c les triangles sont a priori non marques
- do 5 nt=1,ndtri0
- letrsu(nt) = 0
- 5 continue
-c
-c les aretes sont marquees non chainees
- do 10 noar1=1,mxsoar
- nosoar(6,noar1) = -2
- 10 continue
-c
-c recherche du sommet de la triangulation de plus petite abscisse
-c ===============================================================
- ntmin = 0
- dmin = 1d38
- do 20 i=1,nbsomm
- if( pxyd(1,i) .lt. dmin ) then
-c le nouveau minimum
- noar1 = noarst(i)
- if( noar1 .gt. 0 ) then
-c le sommet appartient a une arete de triangle
- if( nosoar(4,noar1) .gt. 0 ) then
-c le nouveau minimum
- dmin = pxyd(1,i)
- ntmin = i
- endif
- endif
- endif
- 20 continue
-c
-c une arete de sommet ntmin
- noar1 = noarst( ntmin )
-c un triangle d'arete noar1
- ntmin = nosoar( 4, noar1 )
- if( ntmin .le. 0 ) then
-c nblgrc(nrerr) = 1
-c kerr(1) = 'pas de triangle d''abscisse minimale'
-c call lereur
- write(imprim,*) 'pas de triangle d''abscisse minimale'
- ierr = 2
- goto 9990
- endif
-c
-c chainage des 3 aretes du triangle ntmin
-c =======================================
-c la premiere arete du chainage des aretes traitees
- noar1 = abs( noartr(1,ntmin) )
- na0 = abs( noartr(2,ntmin) )
-c elle est chainee sur la seconde arete du triangle ntmin
- nosoar(6,noar1) = na0
-c les 2 autres aretes du triangle ntmin sont chainees
- na1 = abs( noartr(3,ntmin) )
-c la seconde est chainee sur la troisieme arete
- nosoar(6,na0) = na1
-c la troisieme n'a pas de suivante
- nosoar(6,na1) = 0
-c
-c le triangle ntmin est a l'exterieur du domaine
-c tous les triangles externes sont marques -123 456 789
-c les triangles de l'autre cote d'une arete sur une ligne
-c sont marques: no de la ligne de l'arete * signe oppose
-c =======================================================
- ligne0 = 0
- ligne = -123 456 789
-c
- 40 if( noar1 .ne. 0 ) then
-c
-c l'arete noar1 du tableau nosoar est a traiter
-c ---------------------------------------------
- noar = noar1
-c l'arete suivante devient la premiere a traiter ensuite
- noar1 = nosoar(6,noar1)
-c l'arete noar est traitee
- nosoar(6,noar) = -3
-c
- do 60 i=4,5
-c
-c l'un des 2 triangles de l'arete
- nt = nosoar(i,noar)
- if( nt .gt. 0 ) then
-c
-c triangle deja traite pour une ligne anterieure?
- if( letrsu(nt) .ne. 0 .and.
- % abs(letrsu(nt)) .ne. ligne ) goto 60
-c
-cccc trace du triangle nt en couleur ligne0
-ccc call mttrtr( pxyd, nt, moartr, noartr, mosoar, nosoar,
-ccc % ligne0, ncnoir )
-c
-c le triangle est marque avec la valeur de ligne
- letrsu(nt) = ligne
-c
-c chainage eventuel des autres aretes de ce triangle
-c si ce n'est pas encore fait
- do 50 j=1,3
-c
-c le numero na de l'arete j du triangle nt dans nosoar
- na = abs( noartr(j,nt) )
- if( nosoar(6,na) .ne. -2 ) goto 50
-c
-c le numero de 1 a nblftr dans nulftr de la ligne de l'arete
- nl = nosoar(3,na)
-c
-c si l'arete est sur une ligne fermee differente de celle envelo
-c et non marquee alors examen du triangle oppose
- if( nl .gt. 0 ) then
-c
- if( nl .eq. ligne0 ) goto 50
-c
-c arete frontaliere de ligne non traitee
-c => passage de l'autre cote de la ligne
-c le triangle de l'autre cote de la ligne est recherche
- if( nt .eq. abs( nosoar(4,na) ) ) then
- nt2 = 5
- else
- nt2 = 4
- endif
- nt2 = abs( nosoar(nt2,na) )
- if( nt2 .gt. 0 ) then
-c
-c le triangle nt2 de l'autre cote est marque avec le
-c avec le signe oppose de celui de ligne
- if( ligne .ge. 0 ) then
- lsigne = -1
- else
- lsigne = 1
- endif
- letrsu(nt2) = lsigne * nl
-c
-c temoin de ligne a traiter ensuite dans nulftr
- nulftr(nl) = -abs( nulftr(nl) )
-c
-cccc trace du triangle nt2 en jaune borde de magenta
-ccc call mttrtr( pxyd,nt2,
-ccc % moartr,noartr,mosoar,nosoar,
-ccc % ncjaun, ncmage )
-c
-c l'arete est traitee
- nosoar(6,na) = -3
-c
- endif
-c
-c l'arete est traitee
- goto 50
-c
- endif
-c
-c arete non traitee => elle est chainee
- nosoar(6,na) = noar1
- noar1 = na
-c
- 50 continue
-c
- endif
- 60 continue
-c
- goto 40
- endif
-c les triangles de la ligne fermee ont tous ete marques
-c plus d'arete chainee
-c
-c recherche d'une nouvelle ligne fermee a traiter
-c ===============================================
- 65 do 70 nl=1,nblftr
- if( nulftr(nl) .lt. 0 ) goto 80
- 70 continue
-c plus de ligne fermee a traiter
- goto 110
-c
-c tous les triangles de cette composante connexe
-c entre ligne et ligne0 vont etre marques
-c ==============================================
-c remise en etat du numero de ligne
-c nl est le numero de la ligne dans nulftr a traiter
- 80 nulftr(nl) = -nulftr(nl)
- do 90 nt2=1,ndtri0
- if( abs(letrsu(nt2)) .eq. nl ) goto 92
- 90 continue
-c
-c recherche de l'arete j du triangle nt2 avec ce numero de ligne nl
- 92 do 95 j=1,3
-c
-c le numero de l'arete j du triangle dans nosoar
- noar1 = 0
- na0 = abs( noartr(j,nt2) )
- if( nl .eq. nosoar(3,na0) ) then
-c
-c na0 est l'arete de ligne nl
-c l'arete suivante du triangle nt2
- i = mod(j,3) + 1
-c le numero dans nosoar de l'arete i de nt2
- na1 = abs( noartr(i,nt2) )
- if( nosoar(6,na1) .eq. -2 ) then
-c arete non traitee => elle est la premiere du chainage
- noar1 = na1
-c pas de suivante dans ce chainage
- nosoar(6,na1) = 0
- else
- na1 = 0
- endif
-c
-c l'eventuelle seconde arete suivante
- i = mod(i,3) + 1
- na = abs( noartr(i,nt2) )
- if( nosoar(6,na) .eq. -2 ) then
- if( na1 .eq. 0 ) then
-c 1 arete non traitee et seule a chainer
- noar1 = na
- nosoar(6,na) = 0
- else
-c 2 aretes a chainer
- noar1 = na
- nosoar(6,na) = na1
- endif
- endif
-c
- if( noar1 .gt. 0 ) then
-c
-c il existe au moins une arete a visiter pour ligne
-c marquage des triangles internes a la ligne nl
- ligne = letrsu(nt2)
- ligne0 = nl
- goto 40
-c
- else
-c
-c nt2 est le seul triangle de la ligne fermee
- goto 65
-c
- endif
- endif
- 95 continue
-c
-c reperage des sommets internes ou externes dans nslign
-c nslign(sommet externe au domaine)=-1
-c nslign(sommet interne au domaine)= 0
-c =====================================================
- 110 do 170 ns1=1,nbsomm
-c tout sommet non sur la frontiere ou interne impose
-c est suppose externe
- if( nslign(ns1) .eq. 0 ) nslign(ns1) = -1
- 170 continue
-c
-c les triangles externes sont marques vides dans le tableau noartr
-c ================================================================
- nbtria = 0
- do 200 nt=1,ndtri0
-c
- if( letrsu(nt) .le. 0 ) then
-c
-c triangle nt externe
- if( noartr(1,nt) .ne. 0 ) then
-c la premiere arete est annulee
- noartr(1,nt) = 0
-c le triangle nt est considere comme etant vide
- noartr(2,nt) = n1artr
- n1artr = nt
- endif
-c
- else
-c
-c triangle nt interne
- nbtria = nbtria + 1
- letrsu(nt) = nbtria
-c
-c marquage des 3 sommets du triangle nt
- do 190 i=1,3
-c le numero nosoar de l'arete i du triangle nt
- noar = abs( noartr(i,nt) )
-c le numero des 2 sommets
- ns1 = nosoar(1,noar)
- ns2 = nosoar(2,noar)
-c mise a jour du numero d'une arete des 2 sommets de l'arete
- noarst( ns1 ) = noar
- noarst( ns2 ) = noar
-c ns1 et ns2 sont des sommets de la triangulation du domaine
- if( nslign(ns1) .lt. 0 ) nslign(ns1)=0
- if( nslign(ns2) .lt. 0 ) nslign(ns2)=0
- 190 continue
-c
- endif
-c
- 200 continue
-c ici tout sommet externe ns verifie nslign(ns)=-1
-c
-c les triangles externes sont mis a zero dans nosoar
-c ==================================================
- do 300 noar=1,mxsoar
-c
- if( nosoar(1,noar) .gt. 0 ) then
-c
-c le second triangle de l'arete noar
- nt = nosoar(5,noar)
- if( nt .gt. 0 ) then
-c si le triangle nt est externe
-c alors il est supprime pour l'arete noar
- if( letrsu(nt) .le. 0 ) nosoar(5,noar)=0
- endif
-c
-c le premier triangle de l'arete noar
- nt = nosoar(4,noar)
- if( nt .gt. 0 ) then
- if( letrsu(nt) .le. 0 ) then
-c si le triangle nt est externe
-c alors il est supprime pour l'arete noar
-c et l'eventuel triangle oppose prend sa place
-c en position 4 de nosoar
- if( nosoar(5,noar) .gt. 0 ) then
- nosoar(4,noar)=nosoar(5,noar)
- nosoar(5,noar)=0
- else
- nosoar(4,noar)=0
- endif
- endif
- endif
- endif
-c
- 300 continue
-c
-c remise en etat pour eviter les modifications de ladefi
- 9990 do 9991 nl=1,nblftr
- if( nulftr(nl) .lt. 0 ) nulftr(nl)=-nulftr(nl)
- 9991 continue
- return
- end
-
-
-
- subroutine trp1st( ns, noarst, mosoar, nosoar, moartr, noartr,
- % mxpile, lhpile, lapile )
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c but : recherche des triangles de noartr partageant le sommet ns
-c -----
-c limite: un camembert de centre ns entame 2 fois
-c ne donne que l'une des parties
-c
-c entrees:
-c --------
-c ns : numero du sommet
-c noarst : noarst(i) numero d'une arete de sommet i
-c mosoar : nombre maximal d'entiers par arete et
-c indice dans nosoar de l'arete suivante dans le hachage
-c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete,
-c chainage des aretes frontalieres, chainage du hachage des aretes
-c moartr : nombre maximal d'entiers par arete du tableau noartr
-c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3
-c mxpile : nombre maximal de triangles empilables
-c
-c sorties :
-c --------
-c lhpile : >0 nombre de triangles empiles
-c =0 si impossible de tourner autour du point
-c =-lhpile si apres butee sur la frontiere il y a a nouveau
-c butee sur la frontiere . a ce stade on ne peut dire si tous
-c les triangles ayant ce sommet ont ete recenses
-c ce cas arrive seulement si le sommet est sur la frontiere
-c lapile : numero dans noartr des triangles de sommet ns
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c auteur : alain perronnet analyse numerique paris upmc mars 1997
-c....................................................................012
- common / unites / lecteu, imprim, nunite(30)
- integer noartr(moartr,*),
- % nosoar(mosoar,*),
- % noarst(*)
- integer lapile(1:mxpile)
- integer nosotr(3)
-c
-c la premiere arete de sommet ns
- nar = noarst( ns )
- if( nar .le. 0 ) then
- write(imprim,*) 'trp1st: sommet',ns,' sans arete'
- goto 9999
- endif
-c
-c l'arete nar est elle active?
- if( nosoar(1,nar) .le. 0 ) then
-ccc write(imprim,*) 'trp1st: arete vide',nar,
-ccc % ' st1:', nosoar(1,nar),' st2:',nosoar(2,nar)
- goto 9999
- endif
-c
-c le premier triangle de sommet ns
- nt0 = abs( nosoar(4,nar) )
- if( nt0 .le. 0 ) then
- write(imprim,*) 'trp1st: sommet',ns,' dans aucun triangle'
- goto 9999
- endif
-c
-c le triangle est il interne?
- if( noartr(1,nt0) .eq. 0 ) goto 9999
-c
-c le numero des 3 sommets du triangle nt0 dans le sens direct
- call nusotr( nt0, mosoar, nosoar, moartr, noartr, nosotr )
-c
-c reperage du sommet ns dans le triangle nt0
- do 5 nar=1,3
- if( nosotr(nar) .eq. ns ) goto 10
- 5 continue
- nta = nt0
- goto 9995
-c
-c ns retrouve : le triangle nt0 est empile
- 10 lhpile = 1
- lapile(1) = nt0
- nta = nt0
-c
-c recherche dans le sens des aiguilles d'une montre
-c (sens indirect) du triangle nt1 de l'autre cote de l'arete
-c nar du triangle et en tournant autour du sommet ns
-c ==========================================================
- noar = abs( noartr(nar,nt0) )
-c le triangle nt1 oppose du triangle nt0 par l'arete noar
- if( nosoar(4,noar) .eq. nt0 ) then
- nt1 = nosoar(5,noar)
- else
- nt1 = nosoar(4,noar)
- endif
-c
-c la boucle sur les triangles nt1 de sommet ns dans le sens indirect
-c ==================================================================
- if( nt1 .gt. 0 ) then
-c
- if( noartr(1,nt1) .eq. 0 ) goto 30
-c
-c le triangle nt1 n'a pas ete detruit. il est actif
-c le triangle oppose par l'arete noar existe
-c le numero des 3 sommets du triangle nt1 dans le sens direct
- 15 call nusotr( nt1, mosoar, nosoar, moartr, noartr, nosotr )
-c
-c reperage du sommet ns dans nt1
- do 20 nar=1,3
- if( nosotr(nar) .eq. ns ) goto 25
- 20 continue
- nta = nt1
- goto 9995
-c
-c nt1 est empile
- 25 if( lhpile .ge. mxpile ) goto 9990
- lhpile = lhpile + 1
- lapile(lhpile) = nt1
-c
-c le triangle nt1 de l'autre cote de l'arete de sommet ns
-c sauvegarde du precedent triangle dans nta
- nta = nt1
- noar = abs( noartr(nar,nt1) )
- if( nosoar(4,noar) .eq. nt1 ) then
- nt1 = nosoar(5,noar)
- else
- nt1 = nosoar(4,noar)
- endif
- if( nt1 .le. 0 ) goto 30
-c le triangle suivant est a l'exterieur
- if( nt1 .ne. nt0 ) goto 15
-c
-c recherche terminee par arrivee sur nt0
-c les triangles forment un "cercle" de "centre" ns
- return
-c
- endif
-c
-c pas de triangle voisin a nt1
-c ============================
-c le parcours passe par 1 des triangles exterieurs
-c le parcours est inverse par l'arete de gauche
-c le triangle nta est le premier triangle empile
- 30 lhpile = 1
- lapile(lhpile) = nta
-c
-c le numero des 3 sommets du triangle nta dans le sens direct
- call nusotr( nta, mosoar, nosoar, moartr, noartr, nosotr )
- do 32 nar=1,3
- if( nosotr(nar) .eq. ns ) goto 33
- 32 continue
- goto 9995
-c
-c l'arete qui precede (rotation / ns dans le sens direct)
- 33 if( nar .eq. 1 ) then
- nar = 3
- else
- nar = nar - 1
- endif
-c
-c le triangle voisin de nta dans le sens direct
- noar = abs( noartr(nar,nta) )
- if( nosoar(4,noar) .eq. nta ) then
- nt1 = nosoar(5,noar)
- else
- nt1 = nosoar(4,noar)
- endif
- if( nt1 .le. 0 ) then
-c un seul triangle contient ns
- goto 70
- endif
-c
-c boucle sur les triangles de sommet ns dans le sens direct
-c ==========================================================
- 40 if( noartr(1,nt1) .eq. 0 ) goto 70
-c
-c le triangle nt1 n'a pas ete detruit. il est actif
-c le numero des 3 sommets du triangle nt1 dans le sens direct
- call nusotr( nt1, mosoar, nosoar, moartr, noartr, nosotr )
-c
-c reperage du sommet ns dans nt1
- do 50 nar=1,3
- if( nosotr(nar) .eq. ns ) goto 60
- 50 continue
- nta = nt1
- goto 9995
-c
-c nt1 est empile
- 60 if( lhpile .ge. mxpile ) goto 9990
- lhpile = lhpile + 1
- lapile(lhpile) = nt1
-c
-c l'arete qui precede dans le sens direct
- if( nar .eq. 1 ) then
- nar = 3
- else
- nar = nar - 1
- endif
-c
-c l'arete de sommet ns dans nosoar
- noar = abs( noartr(nar,nt1) )
-c
-c le triangle voisin de nta dans le sens direct
- nta = nt1
- if( nosoar(4,noar) .eq. nt1 ) then
- nt1 = nosoar(5,noar)
- else
- nt1 = nosoar(4,noar)
- endif
- nta = nt1
- if( nt1 .gt. 0 ) goto 40
-c
-c butee sur le trou => fin des triangles de sommet ns
-c ----------------------------------------------------
- 70 lhpile = -lhpile
-c impossible ici de trouver les autres triangles de sommet ns
-c les triangles de sommet ns ne forment pas une boule de centre ns
- return
-c
-c saturation de la pile des triangles
-c -----------------------------------
- 9990 write(imprim,*) 'trp1st:saturation pile des triangles autour ',
- %'sommet',ns
- goto 9999
-c
-c erreur triangle ne contenant pas le sommet ns
-c ----------------------------------------------
- 9995 write(imprim,*) 'trp1st:triangle ',nta,' st=',
- % (nosotr(nar),nar=1,3),' sans le sommet' ,ns
-c
- 9999 lhpile = 0
- return
- end
-
-
-
- subroutine nusotr( nt, mosoar, nosoar, moartr, noartr, nosotr )
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c but : calcul du numero des 3 sommets du triangle nt de noartr
-c ----- dans le sens direct (aire>0 si non degenere)
-c
-c entrees:
-c --------
-c nt : numero du triangle dans le tableau noartr
-c mosoar : nombre maximal d'entiers par arete
-c nosoar : numero des 2 sommets , no ligne, 2 triangles, chainages en +
-c sommet 1 = 0 si arete vide => sommet 2 = arete vide suivante
-c moartr : nombre maximal d'entiers par arete du tableau noartr
-c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3
-c arete1=0 si triangle vide => arete2=triangle vide suivant
-c
-c sorties:
-c --------
-c nosotr : numero (dans le tableau pxyd) des 3 sommets du triangle
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c auteur : alain perronnet analyse numerique paris upmc mars 1997
-c2345x7..............................................................012
- integer nosoar(mosoar,*), noartr(moartr,*), nosotr(3)
-c
-c les 2 sommets de l'arete 1 du triangle nt dans le sens direct
- na = noartr( 1, nt )
- if( na .gt. 0 ) then
- nosotr(1) = 1
- nosotr(2) = 2
- else
- nosotr(1) = 2
- nosotr(2) = 1
- na = -na
- endif
- nosotr(1) = nosoar( nosotr(1), na )
- nosotr(2) = nosoar( nosotr(2), na )
-c
-c l'arete suivante
- na = abs( noartr(2,nt) )
-c
-c le sommet nosotr(3 du triangle 123
- nosotr(3) = nosoar( 1, na )
- if( nosotr(3) .eq. nosotr(1) .or. nosotr(3) .eq. nosotr(2) ) then
- nosotr(3) = nosoar(2,na)
- endif
- end
-
-
- subroutine tesusp( nbarpi, pxyd, noarst,
- % mosoar, mxsoar, n1soar, nosoar,
- % moartr, mxartr, n1artr, noartr,
- % mxarcf, n1arcf, noarcf, larmin, notrcf, liarcf,
- % nbstsu, ierr )
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c but : supprimer de la triangulation les sommets de te trop proches
-c ----- soit d'un sommet frontalier ou point interne impose
-c soit d'une arete frontaliere
-c
-c attention: le chainage lchain de nosoar devient celui des cf
-c
-c entrees:
-c --------
-c nbarpi : numero du dernier point interne impose par l'utilisateur
-c pxyd : tableau des coordonnees 2d des points
-c par point : x y distance_souhaitee
-c mosoar : nombre maximal d'entiers par arete et
-c indice dans nosoar de l'arete suivante dans le hachage
-c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar
-c attention: mxsoar>3*mxsomm obligatoire!
-c moartr : nombre maximal d'entiers par arete du tableau noartr
-c mxarcf : nombre de variables des tableaux n1arcf, noarcf, larmin, notrcf
-c
-c modifies:
-c ---------
-c noarst : noarst(i) numero d'une arete de sommet i
-c n1soar : no de l'eventuelle premiere arete libre dans le tableau nosoar
-c chainage des vides suivant en 3 et precedant en 2 de nosoar
-c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete,
-c chainage des aretes frontalieres, chainage du hachage des aretes
-c hachage des aretes = nosoar(1)+nosoar(2)*2
-c avec mxsoar>=3*mxsomm
-c une arete i de nosoar est vide <=> nosoar(1,i)=0 et
-c nosoar(2,arete vide)=l'arete vide qui precede
-c nosoar(3,arete vide)=l'arete vide qui suit
-c n1artr : numero du premier triangle vide dans le tableau noartr
-c le chainage des triangles vides se fait sur noartr(2,.)
-c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3
-c arete1 = 0 si triangle vide => arete2 = triangle vide suivant
-c
-c
-c auxiliaires :
-c -------------
-c n1arcf : tableau (0:mxarcf) auxiliaire d'entiers
-c noarcf : tableau (3,mxarcf) auxiliaire d'entiers
-c larmin : tableau ( mxarcf ) auxiliaire d'entiers
-c notrcf : tableau ( mxarcf ) auxiliaire d'entiers
-c liarcf : tableau ( mxarcf ) auxiliaire d'entiers
-c
-c sortie :
-c --------
-c nbstsu : nombre de sommets de te supprimes
-c ierr : =0 si pas d'erreur
-c >0 si une erreur est survenue
-c 11 algorithme defaillant
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c auteur : alain perronnet analyse numerique paris upmc mars 1997
-c....................................................................012
-c parameter ( quamal=0.3 ) => ok
-c parameter ( quamal=0.4 ) => pb pour le test ocean
-c parameter ( quamal=0.5 ) => pb pour le test ocean
-c
- parameter ( quamal=0.333, lchain=6 )
- common / unites / lecteu,imprim,intera,nunite(29)
- double precision pxyd(3,*), qualit
- integer nosoar(mosoar,mxsoar),
- % noartr(moartr,*),
- % noarst(*),
- % n1arcf(0:mxarcf),
- % noarcf(3,mxarcf),
- % larmin(mxarcf),
- % notrcf(mxarcf),
- % liarcf(mxarcf)
-c
- integer nosotr(3)
- equivalence (nosotr(1),ns1), (nosotr(2),ns2),
- % (nosotr(3),ns3)
-c
-c le nombre de sommets de te supprimes
- nbstsu = 0
-c
-c initialisation du chainage des aretes des cf => 0 arete de cf
- do 10 narete=1,mxsoar
- nosoar( lchain, narete ) = -1
- 10 continue
-c
-c boucle sur l'ensemble des sommets frontaliers ou points internes
-c ================================================================
- do 100 ns = 1, nbarpi
-c
-cccc le nombre de sommets supprimes pour ce sommet ns
-ccc nbsuns = 0
-c
-c la qualite minimale au dessous de laquelle le point proche
-c interne est supprime
- quaopt = quamal
-c
-c une arete de sommet ns
- 15 narete = noarst( ns )
- if( narete .le. 0 ) then
-c erreur: le point appartient a aucune arete
- write(imprim,*) 'sommet ',ns,' dans aucune arete'
- ierr = 11
- return
- endif
-c
-c recherche des triangles de sommet ns
-c ils doivent former un contour ferme de type etoile
- call trp1st( ns, noarst, mosoar, nosoar, moartr, noartr,
- % mxarcf, nbtrcf, notrcf )
- if( nbtrcf .le. 0 ) then
-c erreur: impossible de trouver tous les triangles de sommet ns
-c seule une partie est a priori retrouvee
- nbtrcf = -nbtrcf
- endif
-c
-c boucle sur les triangles de l'etoile du sommet ns
- quamin = 2.0
- do 20 i=1,nbtrcf
-c
-c le numero des 3 sommets du triangle nt
- nt = notrcf(i)
- call nusotr( nt, mosoar, nosoar, moartr, noartr,
- % nosotr )
-c nosotr(1:3) est en equivalence avec ns1, ns2, ns3
-c
-c la qualite du triangle ns1 ns2 ns3
- call qutr2d( pxyd(1,ns1), pxyd(1,ns2), pxyd(1,ns3), qualit )
- if( qualit .lt. quamin ) then
- quamin = qualit
- ntqmin = nt
- endif
- 20 continue
-c
-c bilan sur la qualite des triangles de sommet ns
- if( quamin .lt. quaopt ) then
-c
-c recherche du sommet de ntqmin le plus proche et non frontalier
-c ==============================================================
-c le numero des 3 sommets du triangle nt
- call nusotr( ntqmin, mosoar, nosoar, moartr, noartr,
- % nosotr )
- nste = 0
- quamin = 1e28
- do 30 j=1,3
- if( nosotr(j) .ne. ns .and. nosotr(j) .gt. nbarpi ) then
- d = (pxyd(1,nosotr(j))-pxyd(1,ns))**2
- % + (pxyd(2,nosotr(j))-pxyd(2,ns))**2
- if( d .lt. quamin ) then
- quamin = d
- nste = j
- endif
- endif
- 30 continue
-c
- if( nste .gt. 0 ) then
-c
-c nste est le sommet le plus proche de ns de ce
-c triangle de mauvaise qualite et sommet non encore traite
- nste = nosotr( nste )
-c
-c nste est un sommet de triangle equilateral
-c => le sommet nste va etre supprime
-c ==========================================
- call te1stm( nste, pxyd, noarst,
- % mosoar, mxsoar, n1soar, nosoar,
- % moartr, mxartr, n1artr, noartr,
- % mxarcf, n1arcf, noarcf,
- % larmin, notrcf, liarcf, ierr )
- if( ierr .eq. 0 ) then
-c un sommet de te supprime de plus
- nbstsu = nbstsu + 1
- else if( ierr .lt. 0 ) then
-c le sommet nste est externe donc non supprime
-c ou bien le sommet nste est le centre d'un cf dont toutes
-c les aretes simples sont frontalieres
-c dans les 2 cas le sommet n'est pas supprime
- ierr = 0
- goto 100
- else
-c erreur motivant un arret de la triangulation
- return
- endif
-c
-c boucle jusqu'a obtenir une qualite suffisante
-c si triangulation tres irreguliere =>
-c destruction de beaucoup de points internes
-c les 2 variables suivantes brident ces destructions massives
-ccc nbsuns = nbsuns + 1
- quaopt = quaopt * 0.8
-ccc if( nbsuns .le. 5 ) goto 15
- goto 15
- endif
- endif
-c
- 100 continue
- end
-
-
- subroutine teamqa( nutysu,
- % noarst, mosoar, mxsoar, n1soar, nosoar,
- % moartr, mxartr, n1artr, noartr,
- % mxtrcf, notrcf, nostbo,
- % n1arcf, noarcf, larmin,
- % comxmi, nbarpi, nbsomm, mxsomm, pxyd, nslign,
- % ierr )
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c but: si la taille de l'arete moyenne est >ampli*taille souhaitee
-c ---- alors ajout d'un sommet barycentre du plus grand triangle
-c de sommet ns
-c si la taille de l'arete moyenne est <ampli/2*taille souhaitee
-c alors suppression du sommet ns
-c sinon le sommet ns devient le barycentre pondere de ses voisins
-c
-c remarque: ampli est defini dans $mefisto/mail/tehote.f
-c et doit avoir la meme valeur pour eviter trop de modifications
-c
-c entrees:
-c --------
-c nutysu : numero de traitement de areteideale() selon le type de surface
-c 0 pas d'emploi de la fonction areteideale() => aretmx active
-c 1 il existe une fonction areteideale()
-c dont seules les 2 premieres composantes de uv sont actives
-c autres options a definir...
-c noarst : noarst(i) numero d'une arete de sommet i
-c mosoar : nombre maximal d'entiers par arete et
-c indice dans nosoar de l'arete suivante dans le hachage
-c mxsoar : nombre maximal d'aretes frontalieres declarables
-c n1soar : numero de la premiere arete vide dans le tableau nosoar
-c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete,
-c chainage des aretes frontalieres, chainage du hachage des aretes
-c moartr : nombre maximal d'entiers par arete du tableau noartr
-c mxartr : nombre maximal de triangles declarables dans noartr
-c n1artr : numero du premier triangle vide dans le tableau noartr
-c le chainage des triangles vides se fait sur noartr(2,.)
-c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3
-c mxtrcf : nombre maximal de triangles empilables
-c nbarpi : numero du dernier sommet frontalier ou interne impose
-c nslign : tableau du numero de sommet dans sa ligne pour chaque
-c sommet frontalier
-c numero du point dans le lexique point si interne impose
-c 0 si le point est interne non impose par l'utilisateur
-c -1 si le sommet est externe au domaine
-c comxmi : min et max des coordonneees des sommets du maillage
-c
-c modifies :
-c ----------
-c nbsomm : nombre actuel de sommets de la triangulation
-c (certains sommets internes ont ete desactives ou ajoutes)
-c pxyd : tableau des coordonnees 2d des points
-c
-c auxiliaires:
-c ------------
-c notrcf : tableau ( mxtrcf ) auxiliaire d'entiers
-c numero dans noartr des triangles de sommet ns
-c nostbo : tableau ( mxtrcf ) auxiliaire d'entiers
-c numero dans pxyd des sommets des aretes simples de la boule
-c n1arcf : tableau (0:mxtrcf) auxiliaire d'entiers
-c noarcf : tableau (3,mxtrcf) auxiliaire d'entiers
-c larmin : tableau ( mxtrcf ) auxiliaire d'entiers
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c auteur : alain perronnet analyse numerique paris upmc juin 1997
-c....................................................................012
- double precision ampli,ampli2
- parameter (ampli=1.34d0,ampli2=ampli/2d0)
- parameter (lchain=6)
- common / unites / lecteu, imprim, nunite(30)
- double precision pxyd(3,*)
- double precision ponder, ponde1, xbar, ybar, x, y, surtd2
- double precision d, dmoy
- double precision d2d3(3,3)
- real origin(3), xyz(3)
- integer noartr(moartr,*),
- % nosoar(mosoar,*),
- % noarst(*),
- % notrcf(mxtrcf),
- % nslign(*),
- % nostbo(*),
- % n1arcf(0:mxtrcf),
- % noarcf(3,mxtrcf),
- % larmin(mxtrcf)
- double precision comxmi(3,2)
- integer nosotr(3)
-c
-c le nombre d'iterations pour ameliorer la qualite
- nbitaq = 4
- ier = 0
-c
-c initialisation du parcours
- nbs1 = nbsomm
- nbs2 = nbarpi + 1
- nbs3 = -1
-c
- do 5000 iter=1,nbitaq
-c
-c le nombre de sommets supprimes
- nbstsu = 0
- nbbaaj = 0
-c
-c coefficient de ponderation croissant avec les iterations
- ponder = min( 1d0, ( 50 + (50*iter)/nbitaq ) * 0.01d0 )
- ponde1 = 1d0 - ponder
-c
-c l'ordre du parcours dans le sens croissant ou decroissant
- nt = nbs1
- nbs1 = nbs2
- nbs2 = nt
-c alternance du parcours
- nbs3 = -nbs3
-c
- do 1000 ns = nbs1, nbs2, nbs3
-c
-c le sommet est il interne au domaine?
- if( nslign(ns) .ne. 0 ) goto 1000
-c
-c existe-t-il une arete de sommet ns ?
- 10 noar = noarst( ns )
- if( noar .le. 0 ) goto 1000
-c
-c le 1-er triangle de l'arete noar
- nt = nosoar( 4, noar )
- if( nt .le. 0 ) goto 1000
-c
-c recherche des triangles de sommet ns
-c ils doivent former un contour ferme de type etoile
- call trp1st( ns, noarst, mosoar, nosoar, moartr, noartr,
- % mxtrcf, nbtrcf, notrcf )
- if( nbtrcf .le. 0 ) goto 1000
-c
-c mise a jour de la distance souhaitee
- if( nutysu .gt. 0 ) then
-c la fonction taille_ideale(x,y,z) existe
-c calcul de pxyzd(3,ns) dans le repere initial => xyz(1:3)
- call tetaid( nutysu, pxyd(1,ns), pxyd(2,ns),
- % pxyd(3,ns), ier )
- endif
-c
-c boucle sur les triangles qui forment une boule autour du sommet ns
- nbstbo = 0
-c chainage des aretes simples de la boule a rendre delaunay
- noar0 = 0
- do 40 i=1,nbtrcf
-c
-c le numero de l'arete du triangle nt ne contenant pas le sommet ns
- nt = notrcf(i)
- do 20 na=1,3
-c le numero de l'arete na dans le tableau nosoar
- noar = abs( noartr(na,nt) )
- if( nosoar(1,noar) .ne. ns .and.
- % nosoar(2,noar) .ne. ns ) goto 25
- 20 continue
-c
-c construction de la liste des sommets des aretes simples
-c de la boule des triangles de sommet ns
-c -------------------------------------------------------
- 25 do 35 na=1,2
- ns1 = nosoar(na,noar)
- do 30 j=nbstbo,1,-1
- if( ns1 .eq. nostbo(j) ) goto 35
- 30 continue
-c ns1 est un nouveau sommet a ajouter
- nbstbo = nbstbo + 1
- nostbo(nbstbo) = ns1
- 35 continue
-c
-c noar est une arete potentielle a rendre delaunay
- if( nosoar(3,noar) .eq. 0 ) then
-c arete non frontaliere
- nosoar(lchain,noar) = noar0
- noar0 = noar
- endif
-c
- 40 continue
-c
-c calcul des 2 coordonnees du barycentre de la boule du sommet ns
-c calcul de la longueur moyenne des aretes issues du sommet ns
-c ---------------------------------------------------------------
- xbar = 0d0
- ybar = 0d0
- dmoy = 0d0
- do 50 i=1,nbstbo
- x = pxyd(1,nostbo(i))
- y = pxyd(2,nostbo(i))
- xbar = xbar + x
- ybar = ybar + y
- dmoy = dmoy + sqrt( (x-pxyd(1,ns))**2+(y-pxyd(2,ns))**2 )
- 50 continue
- dmoy = dmoy / nbstbo
-c
-c pas de modification de la topologie lors de la derniere iteration
-c =================================================================
- if( iter .eq. nbitaq ) goto 200
-c
-c si la taille de l'arete moyenne est >ampli*taille souhaitee
-c alors ajout d'un sommet barycentre du plus grand triangle
-c de sommet ns
-c ===========================================================
- if( dmoy .gt. ampli*pxyd(3,ns) ) then
-c
- dmoy = 0d0
- do 150 i=1,nbtrcf
-c recherche du plus grand triangle en surface
- call nusotr( notrcf(i), mosoar, nosoar,
- % moartr, noartr, nosotr )
- d = surtd2( pxyd(1,nosotr(1)),
- % pxyd(1,nosotr(2)),
- % pxyd(1,nosotr(3)) )
- if( d .gt. dmoy ) then
- dmoy = d
- imax = i
- endif
- 150 continue
-c
-c ajout du barycentre du triangle notrcf(imax)
- nt = notrcf( imax )
- call nusotr( nt, mosoar, nosoar,
- % moartr, noartr, nosotr )
- if( nbsomm .ge. mxsomm ) then
- write(imprim,*) 'saturation du tableau pxyd'
-c abandon de l'amelioration du sommet ns
- goto 9999
- endif
- nbsomm = nbsomm + 1
- do 160 i=1,3
- pxyd(i,nbsomm) = ( pxyd(i,nosotr(1))
- % + pxyd(i,nosotr(2))
- % + pxyd(i,nosotr(3)) ) / 3d0
- 160 continue
-c
- if( nutysu .gt. 0 ) then
-c la fonction taille_ideale(x,y,z) existe
-c calcul de pxyzd(3,nbsomm) dans le repere initial => xyz(1:3)
- call tetaid( nutysu, pxyd(1,nbsomm), pxyd(2,nbsomm),
- % pxyd(3,nbsomm), ier )
- endif
-c
-c sommet interne a la triangulation
- nslign(nbsomm) = 0
-c
-c les 3 aretes du triangle nt sont a rendre delaunay
- do 170 i=1,3
- noar = abs( noartr(i,nt) )
- if( nosoar(3,noar) .eq. 0 ) then
-c arete non frontaliere
- if( nosoar(lchain,noar) .lt. 0 ) then
-c arete non encore chainee
- nosoar(lchain,noar) = noar0
- noar0 = noar
- endif
- endif
- 170 continue
-c
-c triangulation du triangle de barycentre nbsomm
-c protection a ne pas modifier sinon erreur!
- call tr3str( nbsomm, nt,
- % mosoar, mxsoar, n1soar, nosoar,
- % moartr, mxartr, n1artr, noartr,
- % noarst,
- % nosotr, ierr )
- if( ierr .ne. 0 ) goto 9999
-c
-c un barycentre ajoute de plus
- nbbaaj = nbbaaj + 1
-c
-c les aretes chainees de la boule sont rendues delaunay
- goto 900
-c
- endif
-c
-c si la taille de l'arete moyenne est <ampli/2*taille souhaitee
-c alors suppression du sommet ns
-c =============================================================
- if( dmoy .lt. ampli2*pxyd(3,ns) ) then
-c remise a -1 du chainage des aretes peripheriques de la boule ns
- noar = noar0
- 90 if( noar .gt. 0 ) then
-c protection du no de l'arete suivante
- na = nosoar(lchain,noar)
-c l'arete interne est remise a -1
- nosoar(lchain,noar) = -1
-c l'arete suivante
- noar = na
- goto 90
- endif
- call te1stm( ns, pxyd, noarst,
- % mosoar, mxsoar, n1soar, nosoar,
- % moartr, mxartr, n1artr, noartr,
- % mxtrcf, n1arcf, noarcf,
- % larmin, notrcf, nostbo,
- % ierr )
- if( ierr .lt. 0 ) then
-c le sommet ns est externe donc non supprime
-c ou bien le sommet ns est le centre d'un cf dont toutes
-c les aretes simples sont frontalieres
-c dans les 2 cas le sommet ns n'est pas supprime
- ierr = 0
- goto 200
- else if( ierr .gt. 0 ) then
-c erreur irrecuperable
- goto 9999
- endif
- nbstsu = nbstsu + 1
- goto 1000
-c
- endif
-c
-c les 2 coordonnees du barycentre des sommets des aretes
-c simples de la boule du sommet ns
-c ======================================================
- 200 xbar = xbar / nbstbo
- ybar = ybar / nbstbo
-c
-c ponderation pour eviter les degenerescenses
- pxyd(1,ns) = ponde1 * pxyd(1,ns) + ponder * xbar
- pxyd(2,ns) = ponde1 * pxyd(2,ns) + ponder * ybar
-c
- if( nutysu .gt. 0 ) then
-c la fonction taille_ideale(x,y,z) existe
-c calcul de pxyzd(3,ns) dans le repere initial => xyz(1:3)
- call tetaid( nutysu, pxyd(1,ns), pxyd(2,ns),
- % pxyd(3,ns), ier )
- endif
-c
-c les aretes chainees de la boule sont rendues delaunay
- 900 call tedela( pxyd, noarst,
- % mosoar, mxsoar, n1soar, nosoar, noar0,
- % moartr, mxartr, n1artr, noartr, modifs )
-c
- 1000 continue
-c
-ccc write(imprim,11000) nbstsu, nbbaaj
-ccc11000 format( i6,' sommets supprimes ' ,
-ccc % i6,' barycentres ajoutes' )
-c
-c mise a jour pour ne pas oublier les nouveaux sommets
- if( nbs1 .gt. nbs2 ) then
- nbs1 = nbsomm
- else
- nbs2 = nbsomm
- endif
-c
- 5000 continue
-c
- 9999 return
- end
-
-
- subroutine teamsf( nutysu,
- % noarst, mosoar, mxsoar, n1soar, nosoar,
- % moartr, mxartr, n1artr, noartr,
- % mxtrcf, notrcf, nostbo,
- % n1arcf, noarcf, larmin,
- % comxmi, nbarpi, nbsomm, mxsomm, pxyd, nslign,
- % ierr )
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c but : modification de la topologie des triangles autour des
-c ----- sommets frontaliers et mise en triangulation delaunay locale
-c
-c entrees:
-c --------
-c nutysu : numero de traitement de areteideale() selon le type de surface
-c 0 pas d'emploi de la fonction areteideale() => aretmx active
-c 1 il existe une fonction areteideale()
-c dont seules les 2 premieres composantes de uv sont actives
-c autres options a definir...
-c noarst : noarst(i) numero d'une arete de sommet i
-c mosoar : nombre maximal d'entiers par arete et
-c indice dans nosoar de l'arete suivante dans le hachage
-c mxsoar : nombre maximal d'aretes frontalieres declarables
-c n1soar : numero de la premiere arete vide dans le tableau nosoar
-c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete,
-c chainage des aretes frontalieres, chainage du hachage des aretes
-c moartr : nombre maximal d'entiers par arete du tableau noartr
-c mxartr : nombre maximal de triangles declarables dans noartr
-c n1artr : numero du premier triangle vide dans le tableau noartr
-c le chainage des triangles vides se fait sur noartr(2,.)
-c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3
-c mxtrcf : nombre maximal de triangles empilables
-c nbarpi : numero du dernier sommet frontalier ou interne impose
-c nslign : >0 => ns numero du point dans le lexique point si interne impose
-c ou => 1 000 000 * n + ns1
-c ou n est le numero (1 a nblftr) de la ligne de ce point
-c ns1 est le numero du point dans sa ligne
-c = 0 si le point est interne non impose par l'utilisateur
-c =-1 si le sommet est externe au domaine
-c comxmi : min et max des coordonneees des sommets du maillage
-c
-c modifies :
-c ----------
-c nbsomm : nombre actuel de sommets de la triangulation
-c (certains sommets internes ont ete desactives ou ajoutes)
-c pxyd : tableau des coordonnees 2d des points
-c
-c auxiliaires:
-c ------------
-c notrcf : tableau ( mxtrcf ) auxiliaire d'entiers
-c numero dans noartr des triangles de sommet ns
-c nostbo : tableau ( mxtrcf ) auxiliaire d'entiers
-c numero dans pxyd des sommets des aretes simples de la boule
-c n1arcf : tableau (0:mxtrcf) auxiliaire d'entiers
-c noarcf : tableau (3,mxtrcf) auxiliaire d'entiers
-c larmin : tableau ( mxtrcf ) auxiliaire d'entiers
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c auteur : alain perronnet analyse numerique paris upmc janvier 1998
-c....................................................................012
- parameter (lchain=6)
- common / unites / lecteu, imprim, nunite(30)
- double precision pxyd(3,*)
- double precision a, angle, angled, pi, deuxpi, pis3
- double precision d2d3(3,3)
- real origin(3), xyz(3)
- integer noartr(moartr,*),
- % nosoar(mosoar,*),
- % noarst(*),
- % notrcf(mxtrcf),
- % nslign(*),
- % nostbo(*),
- % n1arcf(0:mxtrcf),
- % noarcf(3,mxtrcf),
- % larmin(mxtrcf),
- % nosotr(3)
- double precision comxmi(3,2)
-c
-c le nombre d'iterations pour ameliorer la qualite
- nbitaq = 2
- ier = 0
-c
-c pi / 3
- pi = atan(1d0) * 4d0
- pis3 = pi / 3d0
- deuxpi = 2d0 * pi
-c
-c initialisation du parcours
- modifs = 0
- nbs1 = nbarpi
- nbs2 = 1
-c => pas de traitement sur les points des lignes de la frontiere
- nbs3 = -1
-c
- do 5000 iter=1,nbitaq
-c
-c le nombre de sommets supprimes
- nbstsu = 0
-c
-c l'ordre du parcours dans le sens croissant ou decroissant
- nt = nbs1
- nbs1 = nbs2
- nbs2 = nt
-c alternance du parcours
- nbs3 = -nbs3
-c
- do 1000 ns = nbs1, nbs2, nbs3
-c
-c le sommet est il sur une ligne de la frontiere?
-c if( nslign(ns) .lt. 1 000 000 ) goto 1000
-c
-c traitement d'un sommet d'une ligne de la frontiere
-c ==================================================
-c existe-t-il une arete de sommet ns ?
- noar = noarst( ns )
- if( noar .le. 0 ) goto 1000
-c
-c le 1-er triangle de l'arete noar
- nt = nosoar( 4, noar )
- if( nt .le. 0 ) goto 1000
-c
-c recherche des triangles de sommet ns
-c ils doivent former un contour ferme de type camembert
- call trp1st( ns, noarst, mosoar, nosoar, moartr, noartr,
- % mxtrcf, nbtrcf, notrcf )
- if( nbtrcf .ge. -1 ) goto 1000
-c
-c boucle sur les triangles qui forment un camembert autour du sommet n
- nbtrcf = -nbtrcf
-c
-c angle interne au camembert autour du sommet ns
- angle = 0d0
- do 540 i=1,nbtrcf
-c
-c le numero de l'arete du triangle nt ne contenant pas le sommet ns
- nt = notrcf(i)
- do 520 na=1,3
-c le numero de l'arete na dans le tableau nosoar
- noar = abs( noartr(na,nt) )
- if( nosoar(1,noar) .ne. ns .and.
- % nosoar(2,noar) .ne. ns ) goto 525
- 520 continue
-c
-c calcul de l'angle (ns-st1 arete, ns-st2 arete)
- 525 ns1 = nosoar(1,noar)
- ns2 = nosoar(2,noar)
- a = angled( pxyd(1,ns), pxyd(1,ns1), pxyd(1,ns2) )
- if( a .gt. pi ) a = deuxpi - a
- angle = angle + a
-c
- 540 continue
-c
-c nombre ideal de triangles autour du sommet ns
- n = nint( angle / pis3 )
- if( n .le. 1 ) goto 1000
- i = 1
- if( nbtrcf .gt. n ) then
-c
-c ajout du barycentre du triangle "milieu"
- nt = notrcf( (n+1)/2 )
- call nusotr( nt, mosoar, nosoar,
- % moartr, noartr, nosotr )
- if( nbsomm .ge. mxsomm ) then
- write(imprim,*) 'saturation du tableau pxyd'
-c abandon de l'amelioration du sommet ns
- goto 1000
- endif
- nbsomm = nbsomm + 1
- do 560 i=1,3
- pxyd(i,nbsomm) = ( pxyd(i,nosotr(1))
- % + pxyd(i,nosotr(2))
- % + pxyd(i,nosotr(3)) ) / 3d0
- 560 continue
-c
- if( nutysu .gt. 0 ) then
-c la fonction taille_ideale(x,y,z) existe
-c calcul de pxyzd(3,nbsomm) dans le repere initial => xyz(1:3)
- call tetaid( nutysu, pxyd(1,nbsomm), pxyd(2,nbsomm),
- % pxyd(3,nbsomm), ier )
- endif
-c
-c sommet interne a la triangulation
- nslign(nbsomm) = 0
-c
-c les 3 aretes du triangle nt sont a rendre delaunay
- noar0 = 0
- do 570 i=1,3
- noar = abs( noartr(i,nt) )
- if( nosoar(3,noar) .eq. 0 ) then
-c arete non frontaliere
- if( nosoar(lchain,noar) .lt. 0 ) then
-c arete non encore chainee
- nosoar(lchain,noar) = noar0
- noar0 = noar
- endif
- endif
- 570 continue
-c
-c triangulation du triangle de barycentre nbsomm
-c protection a ne pas modifier sinon erreur!
- call tr3str( nbsomm, nt,
- % mosoar, mxsoar, n1soar, nosoar,
- % moartr, mxartr, n1artr, noartr,
- % noarst,
- % nosotr, ierr )
- if( ierr .ne. 0 ) goto 9999
-c
-c les aretes chainees de la boule sont rendues delaunay
- call tedela( pxyd, noarst,
- % mosoar, mxsoar, n1soar, nosoar, noar0,
- % moartr, mxartr, n1artr, noartr, modifs )
- endif
-c
- 1000 continue
-c
- 5000 continue
-c
- 9999 return
- end
-
-
- subroutine teamqs( nutysu,
- % noarst, mosoar, mxsoar, n1soar, nosoar,
- % moartr, mxartr, n1artr, noartr,
- % mxtrcf, notrcf, nostbo,
- % n1arcf, noarcf, larmin,
- % comxmi, nbarpi, nbsomm, mxsomm, pxyd, nslign,
- % ierr )
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c but : une iteration de barycentrage des points internes
-c ----- modification de la topologie pour avoir 4 ou 5 ou 6 triangles
-c pour chaque sommet de la triangulation
-c mise en triangulation delaunay
-c
-c entrees:
-c --------
-c nutysu : numero de traitement de areteideale() selon le type de surface
-c 0 pas d'emploi de la fonction areteideale() => aretmx active
-c 1 il existe une fonction areteideale()
-c dont seules les 2 premieres composantes de uv sont actives
-c autres options a definir...
-c noarst : noarst(i) numero d'une arete de sommet i
-c mosoar : nombre maximal d'entiers par arete et
-c indice dans nosoar de l'arete suivante dans le hachage
-c mxsoar : nombre maximal d'aretes frontalieres declarables
-c n1soar : numero de la premiere arete vide dans le tableau nosoar
-c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete,
-c chainage des aretes frontalieres, chainage du hachage des aretes
-c moartr : nombre maximal d'entiers par arete du tableau noartr
-c mxartr : nombre maximal de triangles declarables dans noartr
-c n1artr : numero du premier triangle vide dans le tableau noartr
-c le chainage des triangles vides se fait sur noartr(2,.)
-c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3
-c mxtrcf : nombre maximal de triangles empilables
-c nbarpi : numero du dernier sommet frontalier ou interne impose
-c nslign : >0 => ns numero du point dans le lexique point si interne impose
-c ou => 1 000 000 * n + ns1
-c ou n est le numero (1 a nblftr) de la ligne de ce point
-c ns1 est le numero du point dans sa ligne
-c = 0 si le point est interne non impose par l'utilisateur
-c =-1 si le sommet est externe au domaine
-c comxmi : min et max des coordonneees des sommets du maillage
-c
-c modifies :
-c ----------
-c nbsomm : nombre actuel de sommets de la triangulation
-c (certains sommets internes ont ete desactives ou ajoutes)
-c pxyd : tableau des coordonnees 2d des points
-c
-c auxiliaires:
-c ------------
-c notrcf : tableau ( mxtrcf ) auxiliaire d'entiers
-c numero dans noartr des triangles de sommet ns
-c nostbo : tableau ( mxtrcf ) auxiliaire d'entiers
-c numero dans pxyd des sommets des aretes simples de la boule
-c n1arcf : tableau (0:mxtrcf) auxiliaire d'entiers
-c noarcf : tableau (3,mxtrcf) auxiliaire d'entiers
-c larmin : tableau ( mxtrcf ) auxiliaire d'entiers
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c auteur : alain perronnet analyse numerique paris upmc mai 1997
-c....................................................................012
- parameter (lchain=6)
- common / unites / lecteu, imprim, nunite(30)
- double precision pxyd(3,*)
- double precision ponder, ponde1, xbar, ybar, x, y, d, dmin, dmax
- double precision d2d3(3,3)
- real origin(3), xyz(3)
- integer noartr(moartr,*),
- % nosoar(mosoar,*),
- % noarst(*),
- % notrcf(mxtrcf),
- % nslign(*),
- % nostbo(*),
- % n1arcf(0:mxtrcf),
- % noarcf(3,mxtrcf),
- % larmin(mxtrcf)
- integer nosotr(3,2)
- double precision comxmi(3,2)
-c
-c le nombre d'iterations pour ameliorer la qualite
- nbitaq = 6
- ier = 0
-c
-c initialisation du parcours
- nbs1 = nbsomm
- nbs2 = nbarpi + 1
-c => pas de traitement sur les points des lignes de la frontiere
- nbs3 = -1
-c
- do 5000 iter=1,nbitaq
-c
-c le nombre de sommets supprimes
- nbstsu = 0
-c
-c les compteurs de passage sur les differents cas
- nbst4 = 0
- nbst5 = 0
- nbst8 = 0
-c
-c coefficient de ponderation croissant avec les iterations
- ponder = min( 1d0, ( 50 + (50*iter)/nbitaq ) * 0.01d0 )
- ponde1 = 1d0 - ponder
-c
-c l'ordre du parcours dans le sens croissant ou decroissant
- nt = nbs1
- nbs1 = nbs2
- nbs2 = nt
-c alternance du parcours
- nbs3 = -nbs3
-c
- do 1000 ns = nbs1, nbs2, nbs3
-c
-c le sommet est il interne au domaine?
- if( nslign(ns) .ne. 0 ) goto 1000
-c
-c traitement d'un sommet interne non impose par l'utilisateur
-c ===========================================================
-c existe-t-il une arete de sommet ns ?
- 10 noar = noarst( ns )
- if( noar .le. 0 ) goto 1000
-c
-c le 1-er triangle de l'arete noar
- nt = nosoar( 4, noar )
- if( nt .le. 0 ) goto 1000
-c
-c recherche des triangles de sommet ns
-c ils doivent former un contour ferme de type etoile
- call trp1st( ns, noarst, mosoar, nosoar, moartr, noartr,
- % mxtrcf, nbtrcf, notrcf )
- if( nbtrcf .le. 0 ) goto 1000
-c
-c boucle sur les triangles qui forment une boule autour du sommet ns
- nbstbo = 0
-c chainage des aretes simples de la boule a rendre delaunay
- noar0 = 0
- do 40 i=1,nbtrcf
-c
-c le numero de l'arete du triangle nt ne contenant pas le sommet ns
- nt = notrcf(i)
- do 20 na=1,3
-c le numero de l'arete na dans le tableau nosoar
- noar = abs( noartr(na,nt) )
- if( nosoar(1,noar) .ne. ns .and.
- % nosoar(2,noar) .ne. ns ) goto 25
- 20 continue
-c
-c construction de la liste des sommets des aretes simples
-c de la boule des triangles de sommet ns
-c -------------------------------------------------------
- 25 do 35 na=1,2
- ns1 = nosoar(na,noar)
- do 30 j=nbstbo,1,-1
- if( ns1 .eq. nostbo(j) ) goto 35
- 30 continue
-c ns1 est un nouveau sommet a ajouter
- nbstbo = nbstbo + 1
- nostbo(nbstbo) = ns1
- 35 continue
-c
-c noar est une arete potentielle a rendre delaunay
- if( nosoar(3,noar) .eq. 0 ) then
-c arete non frontaliere
- nosoar(lchain,noar) = noar0
- noar0 = noar
- endif
-c
- 40 continue
-c
-c calcul des 2 coordonnees du barycentre de la boule du sommet ns
-c calcul de l'arete de taille maximale et minimale issue de ns
-c ---------------------------------------------------------------
- xbar = 0d0
- ybar = 0d0
- dmin = 1d28
- dmax = 0d0
- do 50 i=1,nbstbo
- x = pxyd(1,nostbo(i))
- y = pxyd(2,nostbo(i))
- xbar = xbar + x
- ybar = ybar + y
- d = (x-pxyd(1,ns)) ** 2 + (y-pxyd(2,ns)) ** 2
- if( d .gt. dmax ) then
- dmax = d
- imax = i
- endif
- if( d .lt. dmin ) then
- dmin = d
- imin = i
- endif
- 50 continue
-c
-c pas de modification de la topologie lors de la derniere iteration
-c =================================================================
- if( iter .ge. nbitaq ) goto 200
-c
-c si la boule de ns contient 3 ou 4 triangles le sommet ns est detruit
-c ====================================================================
- if( nbtrcf .le. 4 ) then
-c
-c remise a -1 du chainage des aretes peripheriques de la boule ns
- noar = noar0
- 60 if( noar .gt. 0 ) then
-c protection du no de l'arete suivante
- na = nosoar(lchain,noar)
-c l'arete interne est remise a -1
- nosoar(lchain,noar) = -1
-c l'arete suivante
- noar = na
- goto 60
- endif
- call te1stm( ns, pxyd, noarst,
- % mosoar, mxsoar, n1soar, nosoar,
- % moartr, mxartr, n1artr, noartr,
- % mxtrcf, n1arcf, noarcf,
- % larmin, notrcf, nostbo,
- % ierr )
- if( ierr .lt. 0 ) then
-c le sommet ns est externe donc non supprime
-c ou bien le sommet ns est le centre d'un cf dont toutes
-c les aretes simples sont frontalieres
-c dans les 2 cas le sommet ns n'est pas supprime
- ierr = 0
- goto 200
- else if( ierr .eq. 0 ) then
- nbst4 = nbst4 + 1
- nbstsu = nbstsu + 1
- else
-c erreur irrecuperable
- goto 9999
- endif
- goto 1000
-c
- endif
-c
-c si la boule de ns contient 5 triangles et a un sommet voisin
-c sommet de 5 triangles alors l'arete joignant ces 2 sommets
-c est transformee en un seul sommet de 6 triangles
-c ============================================================
- if( nbtrcf .eq. 5 ) then
-c
- do 80 i=1,5
-c le numero du sommet de l'arete i et different de ns
- ns1 = nostbo(i)
-c la liste des triangles de sommet ns1
- call trp1st( ns1, noarst,
- % mosoar, nosoar, moartr, noartr,
- % mxtrcf-5, nbtrc1, notrcf(6) )
- if( nbtrc1 .eq. 5 ) then
-c
-c l'arete de sommets ns-ns1 devient un point
-c par suppression du sommet ns
-c
-c remise a -1 du chainage des aretes peripheriques de la boul
- noar = noar0
- 70 if( noar .gt. 0 ) then
-c protection du no de l'arete suivante
- na = nosoar(lchain,noar)
-c l'arete interne est remise a -1
- nosoar(lchain,noar) = -1
-c l'arete suivante
- noar = na
- goto 70
- endif
-c
-c le point ns1 devient le milieu de l'arete ns-ns1
- do 75 j=1,3
- pxyd(j,ns1) = (pxyd(j,ns) + pxyd(j,ns1)) * 0.5d0
- 75 continue
-c
- if( nutysu .gt. 0 ) then
-c la fonction taille_ideale(x,y,z) existe
-c calcul de pxyzd(3,ns1) dans le repere initial => xyz(1:3
- call tetaid( nutysu,pxyd(1,ns1),pxyd(2,ns1),
- % pxyd(3,ns1), ier )
- endif
-c
-c suppression du point ns et mise en delaunay
- call te1stm( ns, pxyd, noarst,
- % mosoar, mxsoar, n1soar, nosoar,
- % moartr, mxartr, n1artr, noartr,
- % mxtrcf, n1arcf, noarcf,
- % larmin, notrcf, nostbo,
- % ierr )
- if( ierr .lt. 0 ) then
-c le sommet ns est externe donc non supprime
-c ou bien le sommet ns est le centre d'un cf dont toutes
-c les aretes simples sont frontalieres
-c dans les 2 cas le sommet ns n'est pas supprime
- ierr = 0
- goto 200
- else if( ierr .eq. 0 ) then
- nbstsu = nbstsu + 1
- nbst5 = nbst5 + 1
- goto 1000
- else
-c erreur irrecuperable
- goto 9999
- endif
- endif
- 80 continue
- endif
-c
-c si la boule de ns contient au moins 8 triangles
-c alors un triangle interne est ajoute + 3 triangles (1 par arete)
-c ================================================================
- if( nbtrcf .ge. 8 ) then
-c
-c modification des coordonnees du sommet ns
-c il devient le barycentre du triangle notrcf(1)
- call nusotr( notrcf(1), mosoar, nosoar,
- % moartr, noartr, nosotr )
- do 110 i=1,3
- pxyd(i,ns) = ( pxyd(i,nosotr(1,1))
- % + pxyd(i,nosotr(2,1))
- % + pxyd(i,nosotr(3,1)) ) / 3d0
- 110 continue
-c
- if( nutysu .gt. 0 ) then
-c la fonction taille_ideale(x,y,z) existe
-c calcul de pxyzd(3,nbsomm) dans le repere initial => xyz(1:3)
- call tetaid( nutysu, pxyd(1,ns), pxyd(2,ns),
- % pxyd(3,ns), ier )
- endif
-c
-c ajout des 2 autres sommets comme barycentres des triangles
-c notrcf(1+nbtrcf/3) et notrcf(1+2*nbtrcf/3)
- nbt1 = ( nbtrcf + 1 ) / 3
- do 140 n=1,2
-c
-c le triangle traite
- nt = notrcf(1 + n * nbt1 )
-c
-c le numero pxyd de ses 3 sommets
- call nusotr( nt, mosoar, nosoar,
- % moartr, noartr, nosotr )
-c
-c ajout du nouveau barycentre
- if( nbsomm .ge. mxsomm ) then
- write(imprim,*) 'saturation du tableau pxyd'
-c abandon de l'amelioration
- goto 1100
- endif
- nbsomm = nbsomm + 1
- do 120 i=1,3
- pxyd(i,nbsomm) = ( pxyd(i,nosotr(1,1))
- % + pxyd(i,nosotr(2,1))
- % + pxyd(i,nosotr(3,1)) ) / 3d0
- 120 continue
-c
- if( nutysu .gt. 0 ) then
-c la fonction taille_ideale(x,y,z) existe
-c calcul de pxyzd(3,nbsomm) dans le repere initial => xyz(1:3
- call tetaid( nutysu, pxyd(1,nbsomm),pxyd(2,nbsomm),
- % pxyd(3,nbsomm), ier )
- endif
-c
-c sommet interne a la triangulation
- nslign(nbsomm) = 0
-c
-c les 3 aretes du triangle nt sont a rendre delaunay
- do 130 i=1,3
- noar = abs( noartr(i,nt) )
- if( nosoar(3,noar) .eq. 0 ) then
-c arete non frontaliere
- if( nosoar(lchain,noar) .lt. 0 ) then
-c arete non encore chainee
- nosoar(lchain,noar) = noar0
- noar0 = noar
- endif
- endif
- 130 continue
-c
-c triangulation du triangle de barycentre nbsomm
-c protection a ne pas modifier sinon erreur!
- call tr3str( nbsomm, nt,
- % mosoar, mxsoar, n1soar, nosoar,
- % moartr, mxartr, n1artr, noartr,
- % noarst,
- % nosotr, ierr )
- if( ierr .ne. 0 ) goto 9999
- 140 continue
-c
- nbst8 = nbst8 + 1
-c
-c les aretes chainees de la boule sont rendues delaunay
- goto 300
-c
- endif
-c
-c nbtrcf est compris entre 5 et 7 => barycentrage simple
-c ======================================================
-c les 2 coordonnees du barycentre des sommets des aretes
-c simples de la boule du sommet ns
- 200 xbar = xbar / nbstbo
- ybar = ybar / nbstbo
-c
-c ponderation pour eviter les degenerescenses
- pxyd(1,ns) = ponde1 * pxyd(1,ns) + ponder * xbar
- pxyd(2,ns) = ponde1 * pxyd(2,ns) + ponder * ybar
-c
-c les aretes chainees de la boule sont rendues delaunay
- 300 call tedela( pxyd, noarst,
- % mosoar, mxsoar, n1soar, nosoar, noar0,
- % moartr, mxartr, n1artr, noartr, modifs )
-c
- 1000 continue
-c
-c trace de la triangulation actuelle et calcul de la qualite
- 1100 continue
-c
-ccc write(imprim,11000) nbst4, nbst5, nbst8
-ccc11000 format( i7,' sommets de 4t',
-ccc % i7,' sommets 5t+5t',
-ccc % i7,' sommets >7t' )
-c
-c mise a jour pour ne pas oublier les nouveaux sommets
- if( nbs1 .gt. nbs2 ) then
- nbs1 = nbsomm
- nbs2 = nbarpi + 1
- else
- nbs1 = nbarpi + 1
- nbs2 = nbsomm
- endif
-c
- 5000 continue
-c
- 9999 return
- end
-
-
- subroutine teamqt( nutysu,
- % noarst, mosoar, mxsoar, n1soar, nosoar,
- % moartr, mxartr, n1artr, noartr,
- % mxarcf, notrcf, nostbo,
- % n1arcf, noarcf, larmin,
- % comxmi, nbarpi, nbsomm, mxsomm, pxyd, nslign,
- % ierr )
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c but : amelioration de la qualite de la triangulation issue de teabr4
-c -----
-c
-c entrees:
-c --------
-c nutysu : numero de traitement de areteideale() selon le type de surface
-c 0 pas d'emploi de la fonction areteideale() => aretmx active
-c 1 il existe une fonction areteideale()
-c dont seules les 2 premieres composantes de uv sont actives
-c autres options a definir...
-c noarst : noarst(i) numero d'une arete de sommet i
-c mosoar : nombre maximal d'entiers par arete et
-c indice dans nosoar de l'arete suivante dans le hachage
-c mxsoar : nombre maximal d'aretes frontalieres declarables
-c n1soar : numero de la premiere arete vide dans le tableau nosoar
-c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete,
-c chainage des aretes frontalieres, chainage du hachage des aretes
-c moartr : nombre maximal d'entiers par arete du tableau noartr
-c mxartr : nombre maximal de triangles declarables dans noartr
-c n1artr : numero du premier triangle vide dans le tableau noartr
-c le chainage des triangles vides se fait sur noartr(2,.)
-c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3
-c mxarcf : nombre maximal de triangles empilables
-c nbarpi : numero du dernier sommet frontalier ou interne impose
-c nslign : tableau du numero de sommet dans sa ligne pour chaque
-c sommet frontalier
-c numero du point dans le lexique point si interne impose
-c 0 si le point est interne non impose par l'utilisateur
-c -1 si le sommet est externe au domaine
-c comxmi : min et max des coordonneees des sommets du maillage
-c
-c modifies :
-c ----------
-c nbsomm : nombre actuel de sommets de la triangulation
-c (certains sommets internes ont ete desactives ou ajoutes)
-c pxyd : tableau des coordonnees 2d des points
-c
-c auxiliaires:
-c ------------
-c notrcf : tableau ( mxarcf ) auxiliaire d'entiers
-c numero dans noartr des triangles de sommet ns
-c nostbo : tableau ( mxarcf ) auxiliaire d'entiers
-c numero dans pxyd des sommets des aretes simples de la boule
-c n1arcf : tableau (0:mxarcf) auxiliaire d'entiers
-c noarcf : tableau (3,mxarcf) auxiliaire d'entiers
-c larmin : tableau ( mxarcf ) auxiliaire d'entiers
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c auteur : alain perronnet analyse numerique paris upmc juin 1997
-c....................................................................012
- common / unites / lecteu, imprim, nunite(30)
- double precision pxyd(3,*), d2d3(3,3)
- integer noartr(moartr,*),
- % nosoar(mosoar,*),
- % noarst(*),
- % notrcf(mxarcf),
- % nslign(*),
- % nostbo(mxarcf),
- % n1arcf(0:mxarcf),
- % noarcf(3,mxarcf),
- % larmin(mxarcf)
- double precision comxmi(3,2)
-c
-c suppression des sommets de triangles equilateraux trop proches
-c d'un sommet frontalier ou d'un point interne impose par
-c triangulation frontale de l'etoile et mise en delaunay
-c ==============================================================
- call tesusp( nbarpi, pxyd, noarst,
- % mosoar, mxsoar, n1soar, nosoar,
- % moartr, mxartr, n1artr, noartr,
- % mxarcf, n1arcf, noarcf, larmin, notrcf, nostbo,
- % nbstsu, ierr )
- if( ierr .ne. 0 ) goto 9999
-c write(imprim,*) 'retrait de',nbstsu,
-c % ' sommets de te trop proches de la frontiere'
-c
-c ajustage des tailles moyennes des aretes avec ampli=1.34d0 entre
-c ampli/2 x taille_souhaitee et ampli x taille_souhaitee
-c + barycentrage des sommets et mise en triangulation delaunay
-c ================================================================
- call teamqa( nutysu,
- % noarst, mosoar, mxsoar, n1soar, nosoar,
- % moartr, mxartr, n1artr, noartr,
- % mxarcf, notrcf, nostbo,
- % n1arcf, noarcf, larmin,
- % comxmi, nbarpi, nbsomm, mxsomm, pxyd, nslign,
- % ierr )
- if( ierr .ne. 0 ) goto 9999
-c
-c modification de la topologie autour des sommets frontaliers
-c pour avoir un nombre de triangles egal a l'angle/60 degres
-c et mise en triangulation delaunay locale
-c ===========================================================
- call teamsf( nutysu,
- % noarst, mosoar, mxsoar, n1soar, nosoar,
- % moartr, mxartr, n1artr, noartr,
- % mxarcf, notrcf, nostbo,
- % n1arcf, noarcf, larmin,
- % comxmi, nbarpi, nbsomm, mxsomm, pxyd, nslign,
- % ierr )
- if( ierr .ne. 0 ) goto 9999
-c
-c quelques iterations de barycentrage des points internes
-c modification de la topologie pour avoir 4 ou 5 ou 6 triangles
-c pour chaque sommet de la triangulation
-c et mise en triangulation delaunay
-c =============================================================
- call teamqs( nutysu,
- % noarst, mosoar, mxsoar, n1soar, nosoar,
- % moartr, mxartr, n1artr, noartr,
- % mxarcf, notrcf, nostbo,
- % n1arcf, noarcf, larmin,
- % comxmi, nbarpi, nbsomm, mxsomm, pxyd, nslign,
- % ierr )
-c
- 9999 return
- end
-
- subroutine trfrcf( nscent, mosoar, nosoar, moartr, noartr,
- % nbtrcf, notrcf, nbarfr )
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c but : calculer le nombre d'aretes simples du contour ferme des
-c ----- nbtrcf triangles de numeros stockes dans le tableau notrcf
-c ayant tous le sommet nscent
-c
-c entrees:
-c --------
-c nscent : numero du sommet appartenant a tous les triangles notrcf
-c mosoar : nombre maximal d'entiers par arete et
-c indice dans nosoar de l'arete suivante dans le hachage
-c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete,
-c chainage des aretes frontalieres, chainage du hachage des aretes
-c moartr : nombre maximal d'entiers par arete du tableau noartr
-c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3
-c nbtrcf : >0 nombre de triangles empiles
-c =0 si impossible de tourner autour du point
-c =-nbtrcf si apres butee sur la frontiere il y a a nouveau
-c butee sur la frontiere . a ce stade on ne peut dire si tous
-c les triangles ayant ce sommet ont ete recenses
-c ce cas arrive seulement si le sommet est sur la frontiere
-c notrcf : numero dans noartr des triangles de sommet ns
-c
-c sortie :
-c --------
-c nbarfr : nombre d'aretes simples frontalieres
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c auteur : alain perronnet analyse numerique paris upmc juin 1997
-c....................................................................012
- integer noartr(moartr,*),
- % nosoar(mosoar,*),
- % notrcf(1:nbtrcf)
-c
- nbarfr = 0
- do 50 n=1,nbtrcf
-c le numero du triangle n dans le tableau noartr
- nt = notrcf( n )
-c parcours des 3 aretes du triangle nt
- do 40 i=1,3
-c le numero de l'arete i dans le tableau nosoar
- noar = abs( noartr( i, nt ) )
- do 30 j=1,2
-c le numero du sommet j de l'arete noar
- ns = nosoar( j, noar )
- if( ns .eq. nscent ) goto 40
- 30 continue
-c l'arete noar (sans sommet nscent) est elle frontaliere?
- if( nosoar( 5, noar ) .le. 0 ) then
-c l'arete appartient au plus a un triangle
-c une arete simple frontaliere de plus
- nbarfr = nbarfr + 1
- endif
-c le triangle a au plus une arete sans sommet nscent
- goto 50
- 40 continue
- 50 continue
- end
-
- subroutine int2ar( p1, p2, p3, p4, oui )
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c but : les 2 aretes de r**2 p1-p2 p3-p4 s'intersectent elles
-c ----- entre leurs sommets?
-c
-c entrees:
-c --------
-c p1,p2,p3,p4 : les 2 coordonnees reelles des sommets des 2 aretes
-c
-c sortie :
-c --------
-c oui : .true. si intersection, .false. sinon
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c auteur : alain perronnet analyse numerique paris upmc octobre 1991
-c2345x7..............................................................012
- double precision p1(2),p2(2),p3(2),p4(2)
- double precision x21,y21,d21,x43,y43,d43,d,x,y,xx
- logical oui
-c
-c longueur des aretes
- x21 = p2(1)-p1(1)
- y21 = p2(2)-p1(2)
- d21 = x21**2 + y21**2
-c
- x43 = p4(1)-p3(1)
- y43 = p4(2)-p3(2)
- d43 = x43**2 + y43**2
-c
-c les 2 aretes sont-elles jugees paralleles ?
- d = x43 * y21 - y43 * x21
- if( abs(d) .le. 0.001 * sqrt(d21 * d43) ) then
-c aretes paralleles . pas d'intersection
- oui = .false.
- return
- endif
-c
-c les 2 coordonnees du point d'intersection
- x = ( p1(1)*x43*y21 - p3(1)*x21*y43 - (p1(2)-p3(2))*x21*x43 ) / d
- y =-( p1(2)*y43*x21 - p3(2)*y21*x43 - (p1(1)-p3(1))*y21*y43 ) / d
-c
-c coordonnees de x,y dans le repere ns1-ns2
- xx = ( x - p1(1) ) * x21 + ( y - p1(2) ) * y21
-c le point est il entre p1 et p2 ?
- oui = -0.00001d0*d21 .le. xx .and. xx .le. 1.00001d0*d21
-c
-c coordonnees de x,y dans le repere ns3-ns4
- xx = ( x - p3(1) ) * x43 + ( y - p3(2) ) * y43
-c le point est il entre p3 et p4 ?
- oui = oui .and. -0.00001d0*d43 .le. xx .and. xx .le. 1.00001d0*d43
- end
-
-
- subroutine trchtd( pxyd, nar00, nar0, noarcf,
- % namin0, namin, larmin )
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c but : recherche dans le contour ferme du sommet qui joint a la plus
-c ----- courte arete nar00 donne le triangle sans intersection
-c avec le contour ferme de meilleure qualite
-c
-c entrees:
-c --------
-c pxyd : tableau des coordonnees des sommets et distance_souhaitee
-c
-c entrees et sorties:
-c -------------------
-c nar00 : numero dans noarcf de l'arete avant nar0
-c nar0 : numero dans noarcf de la plus petite arete du contour ferme
-c a joindre a noarcf(1,namin) pour former le triangle ideal
-c noarcf : numero du sommet , numero de l'arete suivante
-c numero du triangle exterieur a l'etoile
-c
-c sortie :
-c --------
-c namin0 : numero dans noarcf de l'arete avant namin
-c namin : numero dans noarcf du sommet choisi
-c 0 si contour ferme reduit a moins de 3 aretes
-c larmin : tableau auxiliaire pour stocker la liste des numeros des
-c aretes de meilleure qualite pour faire le choix final
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c auteur : alain perronnet analyse numerique paris upmc fevrier 1992
-c2345x7..............................................................012
- double precision dmaxim, precision
- parameter (dmaxim=1.7d+308, precision=1d-16)
-c ATTENTION:variables a ajuster selon la machine!
-c ATTENTION:dmaxim : le plus grand reel machine
-c ATTENTION:sur dec-alpha la precision est de 10**-14 seulement
-
- common / unites / lecteu,imprim,nunite(30)
- double precision pxyd(1:3,1:*)
- integer noarcf(1:3,1:*),
- % larmin(1:*)
- double precision q, dd, dmima,
- % unpeps, rayon, surtd2
- logical oui
- double precision centre(3)
-c
-c initialisations
-c dmaxim : le plus grand reel machine
- unpeps = 1d0 + 100d0 * precision
-c
-c recherche de la plus courte arete du contour ferme
- nbmin = 0
- na00 = nar00
- dmima = dmaxim
- nbar = 0
-c
- 2 na0 = noarcf( 2, na00 )
- na1 = noarcf( 2, na0 )
- nbar = nbar + 1
-c les 2 sommets de l'arete na0 du cf
- ns1 = noarcf( 1, na0 )
- ns2 = noarcf( 1, na1 )
- dd = (pxyd(1,ns2)-pxyd(1,ns1))**2 + (pxyd(2,ns2)-pxyd(2,ns1))**2
- if( dd .lt. dmima ) then
- dmima = dd
- larmin(1) = na00
- endif
- na00 = na0
- if( na00 .ne. nar00 ) then
-c derniere arete non atteinte
- goto 2
- endif
-c
- if( nbar .eq. 3 ) then
-c
-c contour ferme reduit a un triangle
-c ----------------------------------
- namin = nar00
- nar0 = noarcf( 2, nar00 )
- namin0 = noarcf( 2, nar0 )
- return
-c
- else if( nbar .le. 2 ) then
- write(imprim,*) 'erreur trchtd: cf<3 aretes'
- namin = 0
- namin0 = 0
- return
- endif
-c
-c cf non reduit a un triangle
-c la plus petite arete est nar0 dans noarcf
- nar00 = larmin( 1 )
- nar0 = noarcf( 2, nar00 )
- nar = noarcf( 2, nar0 )
-c
- ns1 = noarcf( 1, nar0 )
- ns2 = noarcf( 1, nar )
-c
-c recherche dans cette etoile du sommet offrant la meilleure qualite
-c du triangle ns1-ns2 ns3 sans intersection avec le contour ferme
-c ==================================================================
- nar3 = nar
- qmima = -1
-c
-c parcours des sommets possibles ns3
- 10 nar3 = noarcf( 2, nar3 )
- if( nar3 .ne. nar0 ) then
-c
-c il existe un sommet ns3 different de ns1 et ns2
- ns3 = noarcf( 1, nar3 )
-c
-c les aretes ns1-ns3 et ns2-ns3 intersectent-elles une arete
-c du contour ferme ?
-c ----------------------------------------------------------
-c intersection de l'arete ns2-ns3 et des aretes du cf
-c jusqu'au sommet ns3
- nar1 = noarcf( 2, nar )
-c
- 15 if( nar1 .ne. nar3 .and. noarcf( 2, nar1 ) .ne. nar3 ) then
-c l'arete suivante
- nar2 = noarcf( 2, nar1 )
-c le numero des 2 sommets de l'arete
- np1 = noarcf( 1, nar1 )
- np2 = noarcf( 1, nar2 )
- call int2ar( pxyd(1,ns2), pxyd(1,ns3),
- % pxyd(1,np1), pxyd(1,np2), oui )
- if( oui ) goto 10
-c les 2 aretes ne s'intersectent pas entre leurs sommets
- nar1 = nar2
- goto 15
- endif
-c
-c intersection de l'arete ns3-ns1 et des aretes du cf
-c jusqu'au sommet de l'arete nar0
- nar1 = noarcf( 2, nar3 )
-c
- 18 if( nar1 .ne. nar0 .and. noarcf( 2, nar1 ) .ne. nar0 ) then
-c l'arete suivante
- nar2 = noarcf( 2, nar1 )
-c le numero des 2 sommets de l'arete
- np1 = noarcf( 1, nar1 )
- np2 = noarcf( 1, nar2 )
- call int2ar( pxyd(1,ns1), pxyd(1,ns3),
- % pxyd(1,np1), pxyd(1,np2), oui )
- if( oui ) goto 10
-c les 2 aretes ne s'intersectent pas entre leurs sommets
- nar1 = nar2
- goto 18
- endif
-c
-c le triangle ns1-ns2-ns3 n'intersecte pas une arete du contour ferme
-c le calcul de la surface du triangle
- dd = surtd2( pxyd(1,ns1), pxyd(1,ns2), pxyd(1,ns3) )
- if( dd .le. 0d0 ) then
-c surface negative => triangle a rejeter
- q = 0
- else
-c calcul de la qualite du triangle ns1-ns2-ns3
- call qutr2d( pxyd(1,ns1), pxyd(1,ns2), pxyd(1,ns3), q )
- endif
-c
- if( q .ge. qmima*1.00001 ) then
-c q est un vrai maximum de la qualite
- qmima = q
- nbmin = 1
- larmin(1) = nar3
- else if( q .ge. qmima*0.999998 ) then
-c q est voisin de qmima
-c il est empile
- nbmin = nbmin + 1
- larmin( nbmin ) = nar3
- endif
- goto 10
- endif
-c
-c bilan : existe t il plusieurs sommets de meme qualite?
-c ======================================================
- if( nbmin .gt. 1 ) then
-c
-c oui:recherche de ceux de cercle ne contenant pas d'autres sommets
- do 80 i=1,nbmin
-c le sommet
- nar = larmin( i )
- if( nar .le. 0 ) goto 80
- ns3 = noarcf(1,nar)
-c les coordonnees du centre du cercle circonscrit
-c et son rayon
- ier = -1
- call cenced( pxyd(1,ns1), pxyd(1,ns2), pxyd(1,ns3),
- % centre, ier )
- if( ier .ne. 0 ) then
-c le sommet ns3 ne convient pas
- larmin( i ) = 0
- goto 80
- endif
- rayon = centre(3) * unpeps
- do 70 j=1,nbmin
- if( j .ne. i ) then
-c l'autre sommet
- nar1 = larmin(j)
- if( nar1 .le. 0 ) goto 70
- ns4 = noarcf(1,nar1)
-c appartient t il au cercle ns1 ns2 ns3 ?
- dd = (centre(1)-pxyd(1,ns4))**2 +
- % (centre(2)-pxyd(2,ns4))**2
- if( dd .le. rayon ) then
-c ns4 est dans le cercle circonscrit ns1 ns2 ns3
-c le sommet ns3 ne convient pas
- larmin( i ) = 0
- goto 80
- endif
- endif
- 70 continue
- 80 continue
-c
-c existe t il plusieurs sommets ?
- j = 0
- do 90 i=1,nbmin
- if( larmin( i ) .gt. 0 ) then
-c compactage des min
- j = j + 1
- larmin(j) = larmin(i)
- endif
- 90 continue
-c
- if( j .gt. 1 ) then
-c oui : choix du plus petit rayon de cercle circonscrit
- dmima = dmaxim
- do 120 i=1,nbmin
- ns3 = noarcf(1,larmin(i))
-c
-c les coordonnees du centre de cercle circonscrit
-c au triangle nt et son rayon
- ier = -1
- call cenced( pxyd(1,ns1), pxyd(1,ns2), pxyd(1,ns3),
- % centre, ier )
- if( ier .ne. 0 ) then
-c le sommet ns3 ne convient pas
- goto 120
- endif
- rayon = sqrt( centre(3) )
- if( rayon .lt. dmima ) then
- dmima = rayon
- larmin(1) = larmin(i)
- endif
- 120 continue
- endif
- endif
-c
-c le choix final
-c ==============
- namin = larmin(1)
-c
-c recherche de l'arete avant namin ( nar0 <> namin )
-c ==================================================
- nar1 = nar0
- 200 if( nar1 .ne. namin ) then
- namin0 = nar1
- nar1 = noarcf( 2, nar1 )
- goto 200
- endif
- end
-
- subroutine trcf0a( nbcf, na01, na1, na2, na3,
- % noar1, noar2, noar3,
- % mosoar, mxsoar, n1soar, nosoar,
- % moartr, n1artr, noartr, noarst,
- % mxarcf, n1arcf, noarcf, nt )
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c but : modification de la triangulation du contour ferme nbcf
-c ----- par ajout d'un triangle ayant 0 arete sur le contour
-c creation des 3 aretes dans le tableau nosoar
-c modification du contour par ajout de la 3-eme arete
-c creation d'un contour ferme a partir de la seconde arete
-c
-c entrees:
-c --------
-c nbcf : numero dans n1arcf du cf traite ici
-c na01 : numero noarcf de l'arete precedent l'arete na1 de noarcf
-c na1 : numero noarcf du 1-er sommet du triangle
-c implicitement l'arete na1 n'est pas une arete du triangle
-c na2 : numero noarcf du 2-eme sommet du triangle
-c implicitement l'arete na1 n'est pas une arete du triangle
-c na3 : numero noarcf du 3-eme sommet du triangle
-c implicitement l'arete na1 n'est pas une arete du triangle
-c
-c mosoar : nombre maximal d'entiers par arete et
-c indice dans nosoar de l'arete suivante dans le hachage
-c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar
-c attention: mxsoar>3*mxsomm obligatoire!
-c moartr : nombre maximal d'entiers par arete du tableau noartr
-c
-c entrees et sorties :
-c --------------------
-c n1soar : numero de la premiere arete vide dans le tableau nosoar
-c une arete i de nosoar est vide <=> nosoar(1,i)=0
-c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete,
-c chainage des aretes frontalieres, chainage du hachage des aretes
-c hachage des aretes = nosoar(1)+nosoar(2)*2
-c n1artr : numero du premier triangle vide dans le tableau noartr
-c le chainage des triangles vides se fait sur noartr(2,.)
-c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3
-c arete1 = 0 si triangle vide => arete2 = triangle vide suivant
-c
-c noarst : noarst(i) numero d'une arete de sommet i
-c n1arcf : numero d'une arete de chaque contour
-c noarcf : numero des aretes de la ligne du contour ferme
-c attention : chainage circulaire des aretes
-c
-c sortie :
-c --------
-c noar1 : numero dans le tableau nosoar de l'arete 1 du triangle
-c noar2 : numero dans le tableau nosoar de l'arete 2 du triangle
-c noar3 : numero dans le tableau nosoar de l'arete 3 du triangle
-c nt : numero du triangle ajoute dans noartr
-c 0 si saturation du tableau noartr ou noarcf ou n1arcf
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c auteur : alain perronnet analyse numerique paris upmc mars 1997
-c2345x7..............................................................012
- common / unites / lecteu, imprim, nunite(30)
- integer nosoar(mosoar,*),
- % noartr(moartr,*),
- % noarst(*),
- % n1arcf(0:*),
- % noarcf(3,*)
-c
- ierr = 0
-c
-c 2 contours fermes peuvent ils etre ajoutes ?
- if( nbcf+2 .gt. mxarcf ) goto 9100
-c
-c creation des 3 aretes du triangle dans le tableau nosoar
-c ========================================================
-c la formation de l'arete sommet1-sommet2 dans le tableau nosoar
- call fasoar( noarcf(1,na1), noarcf(1,na2), -1, -1, 0,
- % mosoar, mxsoar, n1soar, nosoar, noarst,
- % noar1, ierr )
- if( ierr .ne. 0 ) goto 9900
-c
-c la formation de l'arete sommet2-sommet3 dans le tableau nosoar
- call fasoar( noarcf(1,na2), noarcf(1,na3), -1, -1, 0,
- % mosoar, mxsoar, n1soar, nosoar, noarst,
- % noar2, ierr )
- if( ierr .ne. 0 ) goto 9900
-c
-c la formation de l'arete sommet3-sommet1 dans le tableau nosoar
- call fasoar( noarcf(1,na3), noarcf(1,na1), -1, -1, 0,
- % mosoar, mxsoar, n1soar, nosoar, noarst,
- % noar3, ierr )
- if( ierr .ne. 0 ) goto 9900
-c
-c ajout dans noartr de ce triangle nt
-c ===================================
- call trcf3a( noarcf(1,na1), noarcf(1,na2), noarcf(1,na3),
- % noar1, noar2, noar3,
- % mosoar, nosoar,
- % moartr, n1artr, noartr,
- % nt )
- if( nt .le. 0 ) return
-c
-c modification du contour nbcf existant
-c chainage de l'arete na2 vers l'arete na1
-c ========================================
-c modification du cf en pointant na2 sur na1
- na2s = noarcf( 2, na2 )
- noarcf( 2, na2 ) = na1
-c le numero de l'arete dans le tableau nosoar
- noar2s = noarcf( 3, na2 )
-c le numero de l'arete dans le tableau nosoar
- noarcf( 3, na2 ) = noar1
-c debut du cf
- n1arcf( nbcf ) = na2
-c
-c creation d'un nouveau contour ferme na2 - na3
-c =============================================
- nbcf = nbcf + 1
-c recherche d'une arete de cf vide
- nav = n1arcf(0)
- if( nav .le. 0 ) goto 9100
-c la 1-ere arete vide est mise a jour
- n1arcf(0) = noarcf( 2, nav )
-c
-c ajout de l'arete nav pointant sur na2s
-c le numero du sommet
- noarcf( 1, nav ) = noarcf( 1, na2 )
-c l'arete suivante
- noarcf( 2, nav ) = na2s
-c le numero nosoar de cette arete
- noarcf( 3, nav ) = noar2s
-c
-c l'arete na3 se referme sur nav
- na3s = noarcf( 2, na3 )
- noarcf( 2, na3 ) = nav
-c le numero de l'arete dans le tableau nosoar
- noar3s = noarcf( 3, na3 )
- noarcf( 3, na3 ) = noar2
-c debut du cf+1
- n1arcf( nbcf ) = na3
-c
-c creation d'un nouveau contour ferme na3 - na1
-c =============================================
- nbcf = nbcf + 1
-c recherche d'une arete de cf vide
- nav = n1arcf(0)
- if( nav .le. 0 ) goto 9100
-c la 1-ere arete vide est mise a jour
- n1arcf(0) = noarcf( 2, nav )
-c
-c ajout de l'arete nav pointant sur na3s
-c le numero du sommet
- noarcf( 1, nav ) = noarcf( 1, na3 )
-c l'arete suivante
- noarcf( 2, nav ) = na3s
-c le numero de l'arete dans le tableau nosoar
- noarcf( 3, nav ) = noar3s
-c
-c recherche d'une arete de cf vide
- nav1 = n1arcf(0)
- if( nav1 .le. 0 ) goto 9100
-c la 1-ere arete vide est mise a jour
- n1arcf(0) = noarcf( 2, nav1 )
-c
-c l'arete precedente na01 de na1 pointe sur la nouvelle nav1
- noarcf( 2, na01 ) = nav1
-c
-c ajout de l'arete nav1 pointant sur nav
-c le numero du sommet
- noarcf( 1, nav1 ) = noarcf( 1, na1 )
-c l'arete suivante
- noarcf( 2, nav1 ) = nav
-c le numero de l'arete dans le tableau nosoar
- noarcf( 3, nav1 ) = noar3
-c
-c debut du cf+2
- n1arcf( nbcf ) = nav1
- return
-c
-c erreur
- 9100 write(imprim,*) 'saturation du tableau mxarcf'
- nt = 0
- return
-c
-c erreur tableau nosoar sature
- 9900 write(imprim,*) 'saturation du tableau nosoar'
- nt = 0
- return
- end
-
-
- subroutine trcf1a( nbcf, na01, na1, na2, noar1, noar3,
- % mosoar, mxsoar, n1soar, nosoar,
- % moartr, n1artr, noartr, noarst,
- % mxarcf, n1arcf, noarcf, nt )
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c but : modification de la triangulation du contour ferme nbcf
-c ----- par ajout d'un triangle ayant 1 arete sur le contour
-c modification du contour par ajout de la 3-eme arete
-c creation d'un contour ferme a partir de la seconde arete
-c
-c entrees:
-c --------
-c nbcf : numero dans n1arcf du cf traite ici
-c na01 : numero noarcf de l'arete precedant l'arete na1 de noarcf
-c na1 : numero noarcf du 1-er sommet du triangle
-c implicitement l'arete na1 n'est pas une arete du triangle
-c na2 : numero noarcf du 2-eme sommet du triangle
-c cette arete est l'arete 2 du triangle a ajouter
-c son arete suivante dans noarcf n'est pas sur le contour
-c mosoar : nombre maximal d'entiers par arete et
-c indice dans nosoar de l'arete suivante dans le hachage
-c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar
-c attention: mxsoar>3*mxsomm obligatoire!
-c moartr : nombre maximal d'entiers par arete du tableau noartr
-c
-c entrees et sorties :
-c --------------------
-c n1soar : numero de la premiere arete vide dans le tableau nosoar
-c une arete i de nosoar est vide <=> nosoar(1,i)=0
-c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete,
-c chainage des aretes frontalieres, chainage du hachage des aretes
-c hachage des aretes = nosoar(1)+nosoar(2)*2
-c n1artr : numero du premier triangle vide dans le tableau noartr
-c le chainage des triangles vides se fait sur noartr(2,.)
-c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3
-c arete1 = 0 si triangle vide => arete2 = triangle vide suivant
-c
-c noarst : noarst(i) numero d'une arete de sommet i
-c n1arcf : numero d'une arete de chaque contour
-c noarcf : numero des aretes de la ligne du contour ferme
-c attention : chainage circulaire des aretes
-c
-c sortie :
-c --------
-c noar1 : numero nosoar de l'arete 1 du triangle cree
-c noar3 : numero nosoar de l'arete 3 du triangle cree
-c nt : numero du triangle ajoute dans notria
-c 0 si saturation du tableau notria ou noarcf ou n1arcf
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c auteur : alain perronnet analyse numerique paris upmc mars 1997
-c2345x7..............................................................012
- common / unites / lecteu, imprim, nunite(30)
- integer nosoar(mosoar,mxsoar),
- % noartr(moartr,*),
- % noarst(*),
- % n1arcf(0:*),
- % noarcf(3,*)
-c
-c un cf supplementaire peut il etre ajoute ?
- if( nbcf .ge. mxarcf ) then
- write(imprim,*) 'saturation du tableau noarcf'
- nt = 0
- return
- endif
-c
- ierr = 0
-c
-c l' arete suivante du triangle non sur le cf
- na3 = noarcf( 2, na2 )
-c
-c creation des 2 nouvelles aretes du triangle dans le tableau nosoar
-c ==================================================================
-c la formation de l'arete sommet1-sommet2 dans le tableau nosoar
- call fasoar( noarcf(1,na1), noarcf(1,na2), -1, -1, 0,
- % mosoar, mxsoar, n1soar, nosoar, noarst,
- % noar1, ierr )
- if( ierr .ne. 0 ) goto 9900
-c
-c la formation de l'arete sommet1-sommet3 dans le tableau nosoar
- call fasoar( noarcf(1,na3), noarcf(1,na1), -1, -1, 0,
- % mosoar, mxsoar, n1soar, nosoar, noarst,
- % noar3, ierr )
- if( ierr .ne. 0 ) goto 9900
-c
-c le triangle nt de noartr a l'arete 2 comme arete du contour na2
-c ===============================================================
- call trcf3a( noarcf(1,na1), noarcf(1,na2), noarcf(1,na3),
- % noar1, noarcf(3,na2), noar3,
- % mosoar, nosoar,
- % moartr, n1artr, noartr,
- % nt )
- if( nt .le. 0 ) return
-c
-c modification du contour ferme existant
-c suppression de l'arete na2 du cf
-c ======================================
-c modification du cf en pointant na2 sur na1
- noarcf( 2, na2 ) = na1
- noarcf( 3, na2 ) = noar1
-c debut du cf
- n1arcf( nbcf ) = na2
-c
-c creation d'un nouveau contour ferme na3 - na1
-c =============================================
- nbcf = nbcf + 1
-c
-c recherche d'une arete de cf vide
- nav = n1arcf(0)
- if( nav .le. 0 ) then
- write(imprim,*) 'saturation du tableau noarcf'
- nt = 0
- return
- endif
-c
-c la 1-ere arete vide est mise a jour
- n1arcf(0) = noarcf( 2, nav )
-c
-c ajout de l'arete nav pointant sur na3
-c le numero du sommet
- noarcf( 1, nav ) = noarcf( 1, na1 )
-c l'arete suivante
- noarcf( 2, nav ) = na3
-c le numero de l'arete dans le tableau nosoar
- noarcf( 3, nav ) = noar3
-c
-c l'arete precedente na01 de na1 pointe sur la nouvelle nav
- noarcf( 2, na01 ) = nav
-c
-c debut du cf
- n1arcf( nbcf ) = nav
- return
-c
-c erreur tableau nosoar sature
- 9900 write(imprim,*) 'saturation du tableau nosoar'
- nt = 0
- return
- end
-
-
- subroutine trcf2a( nbcf, na1, noar3,
- % mosoar, mxsoar, n1soar, nosoar,
- % moartr, n1artr, noartr, noarst,
- % n1arcf, noarcf, nt )
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c but : modification de la triangulation du contour ferme nbcf
-c ----- par ajout d'un triangle ayant 2 aretes sur le contour
-c creation d'une arete dans nosoar (sommet3-sommet1)
-c et modification du contour par ajout de la 3-eme arete
-c
-c entrees:
-c --------
-c nbcf : numero dans n1arcf du cf traite ici
-c na1 : numero noarcf de la premiere arete sur le contour
-c implicitement sa suivante est sur le contour
-c la suivante de la suivante n'est pas sur le contour
-c mosoar : nombre maximal d'entiers par arete et
-c indice dans nosoar de l'arete suivante dans le hachage
-c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar
-c attention: mxsoar>3*mxsomm obligatoire!
-c moartr : nombre maximal d'entiers par arete du tableau noartr
-c
-c entrees et sorties :
-c --------------------
-c n1soar : numero de la premiere arete vide dans le tableau nosoar
-c une arete i de nosoar est vide <=> nosoar(1,i)=0
-c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete,
-c chainage des aretes frontalieres, chainage du hachage des aretes
-c hachage des aretes = nosoar(1)+nosoar(2)*2
-c n1artr : numero du premier triangle vide dans le tableau noartr
-c le chainage des triangles vides se fait sur noartr(2,.)
-c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3
-c arete1 = 0 si triangle vide => arete2 = triangle vide suivant
-c
-c noarst : noarst(i) numero d'une arete de sommet i
-c n1arcf : numero d'une arete de chaque contour
-c noarcf : numero des aretes de la ligne du contour ferme
-c attention : chainage circulaire des aretes
-c
-c sortie :
-c --------
-c noar3 : numero de l'arete 3 dans le tableau nosoar
-c nt : numero du triangle ajoute dans noartr
-c 0 si saturation du tableau noartr ou nosoar
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c auteur : alain perronnet analyse numerique paris upmc mars 1997
-c2345x7..............................................................012
- common / unites / lecteu, imprim, nunite(30)
- integer nosoar(mosoar,*),
- % noartr(moartr,*),
- % noarst(*)
- integer n1arcf(0:*),
- % noarcf(3,*)
-c
- ierr = 0
-c
-c l'arete suivante de l'arete na1 dans noarcf
- na2 = noarcf( 2, na1 )
-c l'arete suivante de l'arete na2 dans noarcf
- na3 = noarcf( 2, na2 )
-c
-c la formation de l'arete sommet3-sommet1 dans le tableau nosoar
- call fasoar( noarcf(1,na3), noarcf(1,na1), -1, -1, 0,
- % mosoar, mxsoar, n1soar, nosoar, noarst,
- % noar3, ierr )
- if( ierr .ne. 0 ) then
- if( ierr .eq. 1 ) then
- write(imprim,*) 'saturation des aretes (tableau nosoar)'
- endif
- nt = 0
- return
- endif
-c
-c le triangle a ses 2 aretes na1 na2 sur le contour ferme
-c ajout dans noartr de ce triangle nt
- call trcf3a( noarcf(1,na1), noarcf(1,na2), noarcf(1,na3),
- % noarcf(3,na1), noarcf(3,na2), noar3,
- % mosoar, nosoar,
- % moartr, n1artr, noartr,
- % nt )
- if( nt .le. 0 ) return
-c
-c suppression des 2 aretes (na1 na2) du cf
-c ces 2 aretes se suivent dans le chainage du cf
-c ajout de la 3-eme arete (noar3) dans le cf
-c l'arete suivante de na1 devient la suivante de na2
- noarcf(2,na1) = na3
- noarcf(3,na1) = noar3
-c
-c l'arete na2 devient vide dans noarcf
- noarcf(2,na2) = n1arcf( 0 )
- n1arcf( 0 ) = na2
-c
-c la premiere pointee dans noarcf est na1
-c chainage circulaire => ce peut etre n'importe laquelle
- n1arcf(nbcf) = na1
- end
-
-
- subroutine trcf3a( ns1, ns2, ns3,
- % noar1, noar2, noar3,
- % mosoar, nosoar,
- % moartr, n1artr, noartr,
- % nt )
-c++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c but : ajouter dans le tableau noartr le triangle
-c ----- de sommets ns1 ns2 ns3
-c d'aretes noar1 noar2 noar3 deja existantes
-c dans le tableau nosoar des aretes
-c
-c entrees:
-c --------
-c ns1, ns2, ns3 : le numero dans pxyd des 3 sommets du triangle
-c noar1,noar2,noar3 : le numero dans nosoar des 3 aretes du triangle
-c mosoar : nombre maximal d'entiers par arete et
-c indice dans nosoar de l'arete suivante dans le hachage
-c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar
-c attention: mxsoar>3*mxsomm obligatoire!
-c moartr : nombre maximal d'entiers par arete du tableau noartr
-c mxartr : nombre maximal de triangles stockables dans le tableau noartr
-c
-c modifies :
-c ----------
-c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete,
-c chainage des aretes frontalieres, chainage du hachage des aretes
-c hachage des aretes = nosoar(1)+nosoar(2)*2
-c n1artr : numero du premier triangle vide dans le tableau noartr
-c le chainage des triangles vides se fait sur noartr(2,.)
-c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3
-c arete1 = 0 si triangle vide => arete2 = triangle vide suivant
-c
-c sorties:
-c --------
-c nt : numero dans noartr du triangle ajoute
-c =0 si le tableau noartr est sature
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c auteur : alain perronnet analyse numerique paris upmc mars 1997
-c....................................................................012
- common / unites / lecteu,imprim,nunite(30)
- integer nosoar(mosoar,*),
- % noartr(moartr,*)
-c
-c recherche d'un triangle libre dans le tableau noartr
- if( n1artr .le. 0 ) then
- write(imprim,*) 'saturation du tableau noartr des aretes'
- nt = 0
- return
- endif
-c
-c le numero dans noartr du nouveau triangle
- nt = n1artr
-c
-c le nouveau premier triangle vide dans le tableau noartr
- n1artr = noartr(2,n1artr)
-c
-c arete 1 du triangle nt
-c ======================
-c orientation des 3 aretes du triangle pour qu'il soit direct
- if( ns1 .eq. nosoar(1,noar1) ) then
- n = 1
- else
- n = -1
- endif
-c le numero de l'arete 1 du triangle nt
- noartr(1,nt) = n * noar1
-c
-c le numero du triangle nt pour l'arete
- if( nosoar(4,noar1) .le. 0 ) then
- n = 4
- else
- n = 5
- endif
- nosoar(n,noar1) = nt
-c
-c arete 2 du triangle nt
-c ======================
-c orientation des 3 aretes du triangle pour qu'il soit direct
- if( ns2 .eq. nosoar(1,noar2) ) then
- n = 1
- else
- n = -1
- endif
-c le numero de l'arete 2 du triangle nt
- noartr(2,nt) = n * noar2
-c
-c le numero du triangle nt pour l'arete
- if( nosoar(4,noar2) .le. 0 ) then
- n = 4
- else
- n = 5
- endif
- nosoar(n,noar2) = nt
-c
-c arete 3 du triangle nt
-c ======================
-c orientation des 3 aretes du triangle pour qu'il soit direct
- if( ns3 .eq. nosoar(1,noar3) ) then
- n = 1
- else
- n = -1
- endif
-c le numero de l'arete 3 du triangle nt
- noartr(3,nt) = n * noar3
-c
-c le numero du triangle nt pour l'arete
- if( nosoar(4,noar3) .le. 0 ) then
- n = 4
- else
- n = 5
- endif
- nosoar(n,noar3) = nt
- end
-
-
-
- subroutine trcf3s( nbcf, na01, na1, na02, na2, na03, na3,
- % mosoar, mxsoar, n1soar, nosoar,
- % moartr, n1artr, noartr, noarst,
- % mxarcf, n1arcf, noarcf, nt )
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c but : ajout d'un triangle d'aretes na1 2 3 du tableau noarcf
-c ----- a la triangulation d'un contour ferme (cf)
-c
-c entrees:
-c --------
-c nbcf : numero dans n1arcf du cf traite ici
-c mais aussi nombre actuel de cf avant ajout du triangle
-c na01 : numero noarcf de l'arete precedent l'arete na1 de noarcf
-c na1 : numero noarcf du 1-er sommet du triangle
-c na02 : numero noarcf de l'arete precedent l'arete na2 de noarcf
-c na2 : numero noarcf du 2-eme sommet du triangle
-c na03 : numero noarcf de l'arete precedent l'arete na3 de noarcf
-c na3 : numero noarcf du 3-eme sommet du triangle
-c
-c mosoar : nombre maximal d'entiers par arete et
-c indice dans nosoar de l'arete suivante dans le hachage
-c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar
-c attention: mxsoar>3*mxsomm obligatoire!
-c moartr : nombre maximal d'entiers par arete du tableau noartr
-c mxarcf : nombre maximal d'aretes declarables dans noarcf, n1arcf
-c
-c modifies:
-c ---------
-c n1soar : no de l'eventuelle premiere arete libre dans le tableau nosoar
-c chainage des vides suivant en 3 et precedant en 2 de nosoar
-c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete,
-c chainage des aretes frontalieres, chainage du hachage des aretes
-c hachage des aretes = nosoar(1)+nosoar(2)*2
-c avec mxsoar>=3*mxsomm
-c une arete i de nosoar est vide <=> nosoar(1,i)=0 et
-c nosoar(2,arete vide)=l'arete vide qui precede
-c nosoar(3,arete vide)=l'arete vide qui suit
-c
-c n1artr : numero du premier triangle vide dans le tableau noartr
-c le chainage des triangles vides se fait sur noartr(2,.)
-c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3
-c arete1 = 0 si triangle vide => arete2 = triangle vide suivant
-c noarst : noarst(i) numero d'une arete de sommet i
-c
-c n1arcf : numero d'une arete de chaque contour ferme
-c noarcf : numero du sommet , numero de l'arete suivante
-c numero de l'arete dans le tableau nosoar
-c attention : chainage circulaire des aretes
-c
-c sortie :
-c --------
-c nbcf : nombre actuel de cf apres ajout du triangle
-c nt : numero du triangle ajoute dans noartr
-c 0 si saturation du tableau nosoar ou noartr ou noarcf ou n1arcf
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c auteur : alain perronnet analyse numerique paris upmc mars 1997
-c2345x7..............................................................012
- integer nosoar(mosoar,*),
- % noartr(moartr,*),
- % noarst(*),
- % n1arcf(0:mxarcf),
- % noarcf(3,mxarcf)
-c
-c combien y a t il d'aretes nbascf sur le cf ?
-c ============================================
-c la premiere arete est elle sur le cf?
- if( noarcf(2,na1) .eq. na2 ) then
-c la 1-ere arete est sur le cf
- na1cf = 1
- else
-c la 1-ere arete n'est pas sur le cf
- na1cf = 0
- endif
-c
-c la seconde arete est elle sur le cf?
- if( noarcf(2,na2) .eq. na3 ) then
-c la 2-eme arete est sur le cf
- na2cf = 1
- else
- na2cf = 0
- endif
-c
-c la troisieme arete est elle sur le cf?
- if( noarcf(2,na3) .eq. na1 ) then
-c la 3-eme arete est sur le cf
- na3cf = 1
- else
- na3cf = 0
- endif
-c
-c le nombre d'aretes sur le cf
- nbascf = na1cf + na2cf + na3cf
-c
-c traitement selon le nombre d'aretes sur le cf
-c =============================================
- if( nbascf .eq. 3 ) then
-c
-c le contour ferme se reduit a un triangle avec 3 aretes sur le cf
-c ----------------------------------------------------------------
-c ajout dans noartr de ce nouveau triangle
- call trcf3a( noarcf(1,na1), noarcf(1,na2), noarcf(1,na3),
- % noarcf(3,na1), noarcf(3,na2), noarcf(3,na3),
- % mosoar, nosoar,
- % moartr, n1artr, noartr,
- % nt )
- if( nt .le. 0 ) return
-c
-c le cf est supprime et chaine vide
- noarcf(2,na3) = n1arcf(0)
- n1arcf( 0 ) = na1
-c
-c ce cf a ete traite => un cf de moins a traiter
- nbcf = nbcf - 1
-c
- else if( nbascf .eq. 2 ) then
-c
-c le triangle a 2 aretes sur le contour
-c -------------------------------------
-c les 2 aretes sont la 1-ere et 2-eme du triangle
- if( na1cf .eq. 0 ) then
-c l'arete 1 n'est pas sur le cf
- naa1 = na2
- else if( na2cf .eq. 0 ) then
-c l'arete 2 n'est pas sur le cf
- naa1 = na3
- else
-c l'arete 3 n'est pas sur le cf
- naa1 = na1
- endif
-c le triangle oppose a l'arete 3 est inconnu
-c modification du contour apres integration du
-c triangle ayant ses 2-eres aretes sur le cf
- call trcf2a( nbcf, naa1, naor3,
- % mosoar, mxsoar, n1soar, nosoar,
- % moartr, n1artr, noartr, noarst,
- % n1arcf, noarcf, nt )
-c
- else if( nbascf .eq. 1 ) then
-c
-c le triangle a 1 arete sur le contour
-c ------------------------------------
-c cette arete est la seconde du triangle
- if( na3cf .ne. 0 ) then
-c l'arete 3 est sur le cf
- naa01 = na02
- naa1 = na2
- naa2 = na3
- else if( na1cf .ne. 0 ) then
-c l'arete 1 est sur le cf
- naa01 = na03
- naa1 = na3
- naa2 = na1
- else
-c l'arete 2 est sur le cf
- naa01 = na01
- naa1 = na1
- naa2 = na2
- endif
-c le triangle oppose a l'arete 1 et 3 est inconnu
-c modification du contour apres integration du
-c triangle ayant 1 arete sur le cf avec creation
-c d'un nouveau contour ferme
- call trcf1a( nbcf, naa01, naa1, naa2, naor1, naor3,
- % mosoar, mxsoar, n1soar, nosoar,
- % moartr, n1artr, noartr, noarst,
- % mxarcf, n1arcf, noarcf, nt )
-c
- else
-c
-c le triangle a 0 arete sur le contour
-c ------------------------------------
-c modification du contour apres integration du
-c triangle ayant 0 arete sur le cf avec creation
-c de 2 nouveaux contours fermes
- call trcf0a( nbcf, na01, na1, na2, na3,
- % naa1, naa2, naa01,
- % mosoar, mxsoar, n1soar, nosoar,
- % moartr, n1artr, noartr, noarst,
- % mxarcf, n1arcf, noarcf, nt )
- endif
- end
-
-
- subroutine tridcf( nbcf0, pxyd, noarst,
- % mosoar, mxsoar, n1soar, nosoar,
- % moartr, n1artr, noartr,
- % mxarcf, n1arcf, noarcf, larmin,
- % nbtrcf, notrcf, ierr )
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c but : triangulation directe de nbcf0 contours fermes (cf)
-c ----- definis par la liste circulaire de leurs aretes peripheriques
-c
-c entrees:
-c --------
-c nbcf0 : nombre initial de cf a trianguler
-c pxyd : tableau des coordonnees 2d des points
-c par point : x y distance_souhaitee
-c mosoar : nombre maximal d'entiers par arete et
-c indice dans nosoar de l'arete suivante dans le hachage
-c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar
-c attention: mxsoar>3*mxsomm obligatoire!
-c moartr : nombre maximal d'entiers par arete du tableau noartr
-c mxarcf : nombre maximal d'aretes declarables dans noarcf, n1arcf, larmin, not
-c
-c modifies:
-c ---------
-c noarst : noarst(i) numero d'une arete de sommet i
-c n1soar : no de l'eventuelle premiere arete libre dans le tableau nosoar
-c chainage des vides suivant en 3 et precedant en 2 de nosoar
-c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete,
-c chainage des aretes frontalieres, chainage du hachage des aretes
-c hachage des aretes = nosoar(1)+nosoar(2)*2
-c avec mxsoar>=3*mxsomm
-c une arete i de nosoar est vide <=> nosoar(1,i)=0 et
-c nosoar(2,arete vide)=l'arete vide qui precede
-c nosoar(3,arete vide)=l'arete vide qui suit
-c
-c n1artr : numero du premier triangle vide dans le tableau noartr
-c le chainage des triangles vides se fait sur noartr(2,.)
-c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3
-c arete1 = 0 si triangle vide => arete2 = triangle vide suivant
-c
-c n1arcf : numero de la premiere arete de chacun des nbcf0 cf
-c n1arcf(0) no de la premiere arete vide du tableau noarcf
-c noarcf(2,i) no de l'arete suivante
-c noarcf : numero du sommet , numero de l'arete suivante du cf
-c numero de l'arete dans le tableau nosoar
-c
-c auxiliaires :
-c -------------
-c larmin : tableau (mxarcf) auxiliaire
-c stocker la liste des numeros des meilleures aretes
-c lors de la selection du meilleur sommet du cf a trianguler
-c cf le sp trchtd
-c
-c sortie :
-c --------
-c nbtrcf : nombre de triangles des nbcf0 cf
-c notrcf : numero des triangles des nbcf0 cf dans le tableau noartr
-c ierr : 0 si pas d'erreur
-c 2 saturation de l'un des des tableaux nosoar, noartr, ...
-c 3 si contour ferme reduit a moins de 3 aretes
-c 4 saturation du tableau notrcf
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c auteur : alain perronnet analyse numerique paris upmc mars 1997
-c....................................................................012
- common / unites / lecteu, imprim, nunite(30)
- double precision pxyd(3,*)
- integer noartr(moartr,*),
- % nosoar(mosoar,mxsoar),
- % noarst(*),
- % n1arcf(0:mxarcf),
- % noarcf(3,mxarcf),
- % larmin(mxarcf),
- % notrcf(mxarcf)
-c
-ccc integer nosotr(3)
-ccc double precision d, surtd2
-c
-c depart avec nbcf0 cf a trianguler
- nbcf = nbcf0
-c
-c le nombre de triangles formes dans l'ensemble des cf
- nbtrcf = 0
-c
-c tant qu'il existe un cf a trianguler faire
-c la triangulation directe du cf
-c ==========================================
- 10 if( nbcf .gt. 0 ) then
-c
-c le cf en haut de pile a pour premiere arete
- na01 = n1arcf( nbcf )
- na1 = noarcf( 2, na01 )
-c
-c choix du sommet du cf a relier a l'arete na1
-c --------------------------------------------
- call trchtd( pxyd, na01, na1, noarcf,
- % na03, na3, larmin )
- if( na3 .eq. 0 ) then
- ierr = 3
- return
- endif
-c
-c l'arete suivante de na1
- na02 = na1
- na2 = noarcf( 2, na1 )
-c
-c formation du triangle arete na1 - sommet noarcf(1,na3)
-c ------------------------------------------------------
- call trcf3s( nbcf, na01, na1, na02, na2, na03, na3,
- % mosoar, mxsoar, n1soar, nosoar,
- % moartr, n1artr, noartr, noarst,
- % mxarcf, n1arcf, noarcf, nt )
- if( nt .le. 0 ) then
-c saturation du tableau noartr ou noarcf ou n1arcf
- ierr = 2
- return
- endif
-c
-c ajout du triangle cree a sa pile
- if( nbtrcf .ge. mxarcf ) then
- write(imprim,*) 'saturation du tableau notrcf'
- ierr = 4
- return
- endif
- nbtrcf = nbtrcf + 1
- notrcf( nbtrcf ) = nt
- goto 10
- endif
-c
-c mise a jour du chainage des triangles des aretes
-c ================================================
- do 30 ntp0 = 1, nbtrcf
-c
-c le numero du triangle ajoute dans le tableau noartr
- nt0 = notrcf( ntp0 )
-c
-cccc aire signee du triangle nt0
-cccc le numero des 3 sommets du triangle nt
-ccc call nusotr( nt0, mosoar, nosoar, moartr, noartr,
-ccc % nosotr )
-ccc d = surtd2( pxyd(1,nosotr(1)), pxyd(1,nosotr(2)),
-ccc % pxyd(1,nosotr(3)) )
-ccc if( d .le. 0 ) then
-cccc
-cccc un triangle d'aire negative de plus
-ccc write(imprim,*) 'triangle ',nt0,' st:',nosotr,
-ccc % ' d aire ',d,'<=0'
-ccc pause
-ccc endif
-c
-cccc trace du triangle nt0
-ccc call mttrtr( pxyd, nt0, moartr, noartr, mosoar, nosoar,
-ccc % ncturq, ncblan )
-c
-c boucle sur les 3 aretes du triangle
- do 20 i=1,3
-c
-c le numero de l'arete i du triangle dans le tableau nosoar
- noar = abs( noartr(i,nt0) )
-c
-c ce triangle est il deja chaine dans cette arete?
- nt1 = nosoar(4,noar)
- nt2 = nosoar(5,noar)
- if( nt1 .eq. nt0 .or. nt2 .eq. nt0 ) goto 20
-c
-c ajout de ce triangle nt0 a l'arete noar
- if( nt1 .le. 0 ) then
-c le triangle est ajoute a l'arete
- nosoar( 4, noar ) = nt0
- else if( nt2 .le. 0 ) then
-c le triangle est ajoute a l'arete
- nosoar( 5, noar ) = nt0
- else
-c l'arete appartient a 2 triangles differents de nt0
-c anomalie. chainage des triangles des aretes defectueux
-c a corriger
- write(imprim,*) 'pause dans tridcf'
- ierr = 5
- return
- endif
-c
- 20 continue
-c
- 30 continue
- end
-
-
- subroutine te1stm( nsasup, pxyd, noarst,
- % mosoar, mxsoar, n1soar, nosoar,
- % moartr, mxartr, n1artr, noartr,
- % mxarcf, n1arcf, noarcf, larmin, notrcf, liarcf,
- % ierr )
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c but : supprimer de la triangulation le sommet nsasup qui doit
-c ----- etre un sommet interne ("centre" d'une boule de triangles)
-c
-c attention: le chainage lchain de nosoar devient celui des cf
-c
-c entrees:
-c --------
-c nsasup : numero dans le tableau pxyd du sommet a supprimer
-c pxyd : tableau des coordonnees 2d des points
-c par point : x y distance_souhaitee
-c mosoar : nombre maximal d'entiers par arete et
-c indice dans nosoar de l'arete suivante dans le hachage
-c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar
-c attention: mxsoar>3*mxsomm obligatoire!
-c moartr : nombre maximal d'entiers par arete du tableau noartr
-c mxarcf : nombre de variables des tableaux n1arcf, noarcf, larmin, notrcf
-c
-c modifies:
-c ---------
-c noarst : noarst(i) numero d'une arete de sommet i
-c n1soar : no de l'eventuelle premiere arete libre dans le tableau nosoar
-c chainage des vides suivant en 3 et precedant en 2 de nosoar
-c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete,
-c chainage des aretes frontalieres, chainage du hachage des aretes
-c hachage des aretes = nosoar(1)+nosoar(2)*2
-c avec mxsoar>=3*mxsomm
-c une arete i de nosoar est vide <=> nosoar(1,i)=0 et
-c nosoar(2,arete vide)=l'arete vide qui precede
-c nosoar(3,arete vide)=l'arete vide qui suit
-c n1artr : numero du premier triangle vide dans le tableau noartr
-c le chainage des triangles vides se fait sur noartr(2,.)
-c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3
-c arete1 = 0 si triangle vide => arete2 = triangle vide suivant
-c
-c
-c auxiliaires :
-c -------------
-c n1arcf : tableau (0:mxarcf) auxiliaire d'entiers
-c noarcf : tableau (3,mxarcf) auxiliaire d'entiers
-c larmin : tableau ( mxarcf ) auxiliaire d'entiers
-c notrcf : tableau ( mxarcf ) auxiliaire d'entiers
-c liarcf : tableau ( mxarcf ) auxiliaire d'entiers
-c
-c sortie :
-c --------
-c ierr : =0 si pas d'erreur
-c -1 le sommet a supprimer n'est pas le centre d'une boule
-c de triangles. il est suppose externe
-c ou bien le sommet est centre d'un cf dont toutes les
-c aretes sont frontalieres
-c dans les 2 cas => retour sans modifs
-c >0 si une erreur est survenue
-c =11 algorithme defaillant
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c auteur : alain perronnet analyse numerique paris upmc mars 1997
-c....................................................................012
- parameter ( lchain=6, quamal=0.3)
- common / unites / lecteu,imprim,intera,nunite(29)
- double precision pxyd(3,*)
- integer nosoar(mosoar,mxsoar),
- % noartr(moartr,*),
- % noarst(*),
- % n1arcf(0:mxarcf),
- % noarcf(3,mxarcf),
- % larmin(mxarcf),
- % notrcf(mxarcf),
- % liarcf(mxarcf)
-c
-c nsasup est il un sommet interne, "centre" d'une boule de triangles?
-c => le sommet nsasup peut etre supprime
-c ===================================================================
-c formation du cf de ''centre'' le sommet nsasup
- call trp1st( nsasup, noarst, mosoar, nosoar,
- % moartr, noartr,
- % mxarcf, nbtrcf, notrcf )
- if( nbtrcf .le. 0 ) then
-c erreur: impossible de trouver tous les triangles de sommet nsasup
-c le sommet nsasup n'est pas supprime de la triangulation
- ierr = -1
- return
- else if( nbtrcf .le. 2 ) then
-c le sommet nsasup n'est pas supprime
- ierr = -1
- return
- endif
- if( nbtrcf*3 .gt. mxarcf ) then
- write(imprim,*) 'saturation du tableau noarcf'
- ierr = 10
- return
- endif
-c
-ccc trace des triangles de l'etoile du sommet nsasup
-ccc call trpltr( nbtrcf, notrcf, pxyd,
-ccc % moartr, noartr, mosoar, nosoar,
-ccc % ncroug, ncblan )
-c
-c si toutes les aretes du cf sont frontalieres, alors il est
-c interdit de detruire le sommet "centre" du cf
-c calcul du nombre nbarfr des aretes simples des nbtrcf triangles
- call trfrcf( nsasup, mosoar, nosoar, moartr, noartr,
- % nbtrcf, notrcf, nbarfr )
- if( nbarfr .ge. nbtrcf ) then
-c toutes les aretes simples sont frontalieres
-c le sommet nsasup ("centre" de la cavite) n'est pas supprime
- ierr = -1
- return
- endif
-c
-c formation du contour ferme (liste chainee des aretes simples)
-c forme a partir des aretes des triangles de l'etoile du sommet nsasup
- call focftr( nbtrcf, notrcf, pxyd, noarst,
- % mosoar, mxsoar, n1soar, nosoar,
- % moartr, n1artr, noartr,
- % nbarcf, n1arcf, noarcf,
- % ierr )
- if( ierr .ne. 0 ) return
-c
-c ici le sommet nsasup appartient a aucune arete
- noarst( nsasup ) = 0
-c
-c chainage des aretes vides dans le tableau noarcf
- n1arcf(0) = nbarcf+1
- mmarcf = min(8*nbarcf,mxarcf)
- do 40 i=nbarcf+1,mmarcf
- noarcf(2,i) = i+1
- 40 continue
- noarcf(2,mmarcf) = 0
-c
-c sauvegarde du chainage des aretes peripheriques
-c pour la mise en delaunay du maillage
- nbcf = n1arcf(1)
- do 50 i=1,nbarcf
-c le numero de l'arete dans le tableau nosoar
- liarcf( i ) = noarcf( 3, nbcf )
-c l'arete suivante dans le cf
- nbcf = noarcf( 2, nbcf )
- 50 continue
-c
-c triangulation directe du contour ferme sans le sommet nsasup
-c ============================================================
- nbcf = 1
- call tridcf( nbcf, pxyd, noarst,
- % mosoar, mxsoar, n1soar, nosoar,
- % moartr, n1artr, noartr,
- % mxarcf, n1arcf, noarcf, larmin,
- % nbtrcf, notrcf, ierr )
- if( ierr .ne. 0 ) return
-c
-c transformation des triangles du cf en triangles delaunay
-c ========================================================
-c construction du chainage lchain dans nosoar
-c des aretes peripheriques du cf a partir de la sauvegarde liarcf
- noar0 = liarcf(1)
- do 60 i=2,nbarcf
-c le numero de l'arete peripherique du cf dans nosoar
- noar = liarcf( i )
- if( nosoar(3,noar) .le. 0 ) then
-c arete interne => elle est chainee a partir de la precedente
- nosoar( lchain, noar0 ) = noar
- noar0 = noar
- endif
- 60 continue
-c la derniere arete peripherique n'a pas de suivante
- nosoar(lchain,noar0) = 0
-c
-c mise en delaunay des aretes chainees
- call tedela( pxyd, noarst,
- % mosoar, mxsoar, n1soar, nosoar, liarcf(1),
- % moartr, mxartr, n1artr, noartr, modifs )
-ccc write(imprim,*) 'nombre echanges diagonales =',modifs
- return
- end
-
-
- subroutine tr3str( np, nt,
- % mosoar, mxsoar, n1soar, nosoar,
- % moartr, mxartr, n1artr, noartr,
- % noarst,
- % nutr, ierr )
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c but : former les 3 sous-triangles du triangle nt a partir
-c ----- du point interne np
-c
-c entrees:
-c --------
-c np : numero dans le tableau pxyd du point
-c nt : numero dans le tableau noartr du triangle a trianguler
-c mosoar : nombre maximal d'entiers par arete du tableau nosoar
-c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar
-c moartr : nombre maximal d'entiers par arete du tableau noartr
-c mxartr : nombre maximal de triangles stockables dans le tableau noartr
-c
-c modifies:
-c ---------
-c n1soar : numero de la premiere arete vide dans le tableau nosoar
-c une arete i de nosoar est vide <=> nosoar(1,i)=0
-c nosoar : numero des 2 sommets , no ligne, 2 triangles, chainages
-c sommet 1 = 0 si arete vide => sommet 2 = arete vide suivante
-c hachage des aretes = (nosoar(1)+nosoar(2)) modulo mxsoar
-c n1artr : numero du premier triangle vide dans le tableau noartr
-c le chainage des triangles vides se fait sur noartr(2,.)
-c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3
-c arete1 = 0 si triangle vide => arete2 = triangle vide suivant
-c noarst : noarst(i) numero d'une arete de sommet i
-c
-c sorties:
-c --------
-c nutr : le numero des 3 sous-triangles du triangle nt
-c nt : en sortie le triangle initial n'est plus actif dans noartr
-c c'est en fait le premier triangle vide de noartr
-c ierr : =0 si pas d'erreur
-c =1 si le tableau nosoar est sature
-c =2 si le tableau noartr est sature
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c auteur : alain perronnet analyse numerique paris upmc mars 1997
-c....................................................................012
- integer nosoar(mosoar,mxsoar),
- % noartr(moartr,mxartr),
- % noarst(*),
- % nutr(3)
-c
- integer nosotr(3), nu2sar(2), nuarco(3)
-c
-c reservation des 3 nouveaux triangles dans le tableau noartr
-c ===========================================================
- do 10 i=1,3
-c le numero du sous-triangle i dans le tableau noartr
- if( n1artr .le. 0 ) then
-c tableau noartr sature
- ierr = 2
- return
- endif
- nutr(i) = n1artr
-c le nouveau premier triangle libre dans noartr
- n1artr = noartr(2,n1artr)
- 10 continue
-c
-c les numeros des 3 sommets du triangle nt
- call nusotr( nt, mosoar, nosoar, moartr, noartr, nosotr )
-c
-c formation des 3 aretes nosotr(i)-np dans le tableau nosoar
-c ==========================================================
- nt0 = nutr(3)
- do 20 i=1,3
-c
-c le triangle a creer
- nti = nutr(i)
-c
-c les 2 sommets du cote i du triangle nosotr
- nu2sar(1) = nosotr(i)
- nu2sar(2) = np
- call hasoar( mosoar, mxsoar, n1soar, nosoar, nu2sar, noar )
-c en sortie: noar>0 => no arete retrouvee
-c <0 => no arete ajoutee
-c =0 => saturation du tableau nosoar
-c
- if( noar .eq. 0 ) then
-c saturation du tableau nosoar
- ierr = 1
- return
- else if( noar .lt. 0 ) then
-c l'arete a ete ajoutee. initialisation des autres informations
- noar = -noar
-c le numero des 2 sommets a ete initialise par hasoar
-c et (nosoar(1,noar)<nosoar(2,noar))
-c le numero de la ligne de l'arete: ici arete interne
- nosoar(3,noar) = 0
-c else
-c l'arete a ete retrouvee
-c le numero des 2 sommets a ete retrouve par hasoar
-c et (nosoar(1,noar)<nosoar(2,noar))
-c le numero de ligne reste inchange
- endif
-c
-c le triangle 1 de l'arete noar => le triangle nt0
- nosoar(4,noar) = nt0
-c le triangle 2 de l'arete noar => le triangle nti
- nosoar(5,noar) = nti
-c
-c le sommet nosotr(i) appartient a l'arete noar
- noarst( nosotr(i) ) = noar
-c
-c le numero d'arete nosotr(i)-np
- nuarco(i) = noar
-c
-c le triangle qui precede le suivant
- nt0 = nti
- 20 continue
-c
-c le numero d'une arete du point np
- noarst( np ) = noar
-c
-c les 3 sous-triangles du triangle nt sont formes dans le tableau noartr
-c ======================================================================
- do 30 i=1,3
-c
-c le numero suivant i => i mod 3 + 1
- if( i .ne. 3 ) then
- i1 = i + 1
- else
- i1 = 1
- endif
-c
-c le numero dans noartr du sous-triangle a ajouter
- nti = nutr( i )
-c
-c le numero de l'arete i du triangle initial nt
-c est l'arete 1 du sous-triangle i
- noar = noartr(i,nt)
- noartr( 1, nti ) = noar
-c
-c mise a jour du numero de triangle de cette arete
- noar = abs( noar )
- if( nosoar(4,noar) .eq. nt ) then
-c le sous-triangle nti remplace le triangle nt
- nosoar(4,noar) = nti
- else
-c le sous-triangle nti remplace le triangle nt
- nosoar(5,noar) = nti
- endif
-c
-c l'arete 2 du sous-triangle i est l'arete i1 ajoutee
- if( nosotr(i1) .eq. nosoar(1,nuarco(i1)) ) then
-c l'arete ns i1-np dans nosoar est dans le sens direct
- noartr( 2, nti ) = nuarco(i1)
- else
-c l'arete ns i1-np dans nosoar est dans le sens indirect
- noartr( 2, nti ) = -nuarco(i1)
- endif
-c
-c l'arete 3 du sous-triangle i est l'arete i ajoutee
- if( nosotr(i) .eq. nosoar(1,nuarco(i)) ) then
-c l'arete ns i1-np dans nosoar est dans le sens indirect
- noartr( 3, nti ) = -nuarco(i)
- else
-c l'arete ns i1-np dans nosoar est dans le sens direct
- noartr( 3, nti ) = nuarco(i)
- endif
- 30 continue
-c
-c le triangle nt est rendu libre
-c ==============================
-c il devient n1artr le premier triangle libre
- noartr( 1, nt ) = 0
- noartr( 2, nt ) = n1artr
- n1artr = nt
- end
-
-
- subroutine mt4sqa( na, moartr, noartr, mosoar, nosoar,
- % ns1, ns2, ns3, ns4)
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c but : calcul du numero des 4 sommets de l'arete na de nosoar
-c ----- formant un quadrangle
-c
-c entrees:
-c --------
-c na : numero de l'arete dans nosoar a traiter
-c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3
-c arete1=0 si triangle vide => arete2=triangle vide suivant
-c mosoar : nombre maximal d'entiers par arete
-c nosoar : numero des 2 sommets , no ligne, 2 triangles, chainages en +
-c sommet 1 = 0 si arete vide => sommet 2 = arete vide suivante
-c
-c sorties:
-c --------
-c ns1,ns2,ns3 : les 3 numeros des sommets du triangle t1 en sens direct
-c ns1,ns4,ns2 : les 3 numeros des sommets du triangle t2 en sens direct
-c
-c si erreur rencontree => ns4 = 0
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c auteur : alain perronnet analyse numerique paris upmc mars 1997
-c2345x7..............................................................012
- common / unites / lecteu, imprim, nunite(30)
- integer noartr(moartr,*), nosoar(mosoar,*)
-c
-c le numero de triangle est il correct ?
-c a supprimer apres mise au point
- if( na .le. 0 ) then
-c nblgrc(nrerr) = 1
-c write(kerr(mxlger)(1:6),'(i6)') na
-c kerr(1) = kerr(mxlger)(1:6) //
-c % ' no incorrect arete dans nosoar'
-c call lereur
- write(imprim,*) na, ' no incorrect arete dans nosoar'
- ns4 = 0
- return
- endif
-c
- if( nosoar(1,na) .le. 0 ) then
-c nblgrc(nrerr) = 1
-c write(kerr(mxlger)(1:6),'(i6)') na
-c kerr(1) = kerr(mxlger)(1:6) //
-c % ' arete non active dans nosoar'
-c call lereur
- write(imprim,*) na, ' arete non active dans nosoar'
- ns4 = 0
- return
- endif
-c
-c recherche de l'arete na dans le premier triangle
- nt = nosoar(4,na)
- if( nt .le. 0 ) then
-c nblgrc(nrerr) = 1
-c write(kerr(mxlger)(1:6),'(i6)') na
-c kerr(1) = 'triangle 1 incorrect pour l''arete ' //
-c % kerr(mxlger)(1:6)
-c call lereur
- write(imprim,*) 'triangle 1 incorrect pour l''arete ', na
- ns4 = 0
- return
- endif
-c
- do 5 i=1,3
- if( abs( noartr(i,nt) ) .eq. na ) goto 8
- 5 continue
-c si arrivee ici => bogue avant
- write(imprim,*) 'mt4sqa: arete',na,' non dans le triangle',nt
- ns4 = 0
- return
-c
-c les 2 sommets de l'arete na
- 8 if( noartr(i,nt) .gt. 0 ) then
- ns1 = 1
- ns2 = 2
- else
- ns1 = 2
- ns2 = 1
- endif
- ns1 = nosoar(ns1,na)
- ns2 = nosoar(ns2,na)
-c
-c l'arete suivante
- if( i .lt. 3 ) then
- i = i + 1
- else
- i = 1
- endif
- naa = abs( noartr(i,nt) )
-c
-c le sommet ns3 du triangle 123
- ns3 = nosoar(1,naa)
- if( ns3 .eq. ns1 .or. ns3 .eq. ns2 ) then
- ns3 = nosoar(2,naa)
- endif
-c
-c le triangle de l'autre cote de l'arete na
-c =========================================
- nt = nosoar(5,na)
- if( nt .le. 0 ) then
-c nblgrc(nrerr) = 1
-c write(kerr(mxlger)(1:6),'(i6)') na
-c kerr(1) = 'triangle 2 incorrect pour l''arete ' //
-c % kerr(mxlger)(1:6)
-c call lereur
- write(imprim,*) 'triangle 2 incorrect pour l''arete ',na
- ns4 = 0
- return
- endif
-c
-c le numero de l'arete naa du triangle nt
- naa = abs( noartr(1,nt) )
- if( naa .eq. na ) naa = abs( noartr(2,nt) )
- ns4 = nosoar(1,naa)
- if( ns4 .eq. ns1 .or. ns4 .eq. ns2 ) then
- ns4 = nosoar(2,naa)
- endif
- end
-
-
- subroutine te2t2t( noaret, mosoar, n1soar, nosoar, noarst,
- % moartr, noartr, noar34 )
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c but : echanger la diagonale des 2 triangles ayant en commun
-c ----- l'arete noaret du tableau nosoar si c'est possible
-c
-c entrees:
-c --------
-c noaret : numero de l'arete a echanger entre les 2 triangles
-c mosoar : nombre maximal d'entiers par arete
-c moartr : nombre maximal d'entiers par triangle
-c
-c modifies :
-c ----------
-c n1soar : numero de la premiere arete vide dans le tableau nosoar
-c nosoar : numero des 2 sommets , no ligne, 2 triangles, chainages en +
-c sommet 1 = 0 si arete vide => sommet 2 = arete vide suivante
-c noarst : noarst(i) numero d'une arete de sommet i
-c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3
-c arete1 = 0 si triangle vide => arete2 = triangle vide suivant
-c
-c sortie :
-c --------
-c noar34 : numero nosoar de la nouvelle arete diagonale
-c 0 si pas d'echange des aretes diagonales
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c auteur : alain perronnet analyse numerique paris upmc avril 1997
-c....................................................................012
- integer nosoar(mosoar,*),
- % noartr(moartr,*),
- % noarst(*)
-c
-c une arete frontaliere ne peut etre echangee
- noar34 = 0
- if( nosoar(3,noaret) .gt. 0 ) return
-c
-c les 4 sommets des 2 triangles ayant l'arete noaret en commun
- call mt4sqa( noaret, moartr, noartr, mosoar, nosoar,
- % ns1, ns2, ns3, ns4)
-c ns1,ns2,ns3 : les 3 numeros des sommets du triangle nt1 en sens direct
-c ns1,ns4,ns2 : les 3 numeros des sommets du triangle nt2 en sens direct
-c
-c recherche du numero de l'arete noaret dans le triangle nt1
- nt1 = nosoar(4,noaret)
- do 10 n1 = 1, 3
- if( abs(noartr(n1,nt1)) .eq. noaret ) goto 15
- 10 continue
-c impossible d'arriver ici sans bogue!
- write(imprim,*) 'pause dans te2t2t 1'
-c
-c l'arete de sommets 2 et 3
- 15 if( n1 .lt. 3 ) then
- n2 = n1 + 1
- else
- n2 = 1
- endif
- na23 = noartr(n2,nt1)
-c
-c l'arete de sommets 3 et 1
- if( n2 .lt. 3 ) then
- n3 = n2 + 1
- else
- n3 = 1
- endif
- na31 = noartr(n3,nt1)
-c
-c recherche du numero de l'arete noaret dans le triangle nt2
- nt2 = nosoar(5,noaret)
- do 20 n1 = 1, 3
- if( abs(noartr(n1,nt2)) .eq. noaret ) goto 25
- 20 continue
-c impossible d'arriver ici sans bogue!
- write(imprim,*) 'pause dans te2t2t 2'
-c
-c l'arete de sommets 1 et 4
- 25 if( n1 .lt. 3 ) then
- n2 = n1 + 1
- else
- n2 = 1
- endif
- na14 = noartr(n2,nt2)
-c
-c l'arete de sommets 4 et 2
- if( n2 .lt. 3 ) then
- n3 = n2 + 1
- else
- n3 = 1
- endif
- na42 = noartr(n3,nt2)
-c
-c les triangles 123 142 deviennent 143 234
-c ========================================
-c ajout de l'arete ns3-ns4
-c on evite l'affichage de l'erreur
- ierr = -1
- call fasoar( ns3, ns4, nt1, nt2, 0,
- % mosoar, mxsoar, n1soar, nosoar, noarst,
- % noar34, ierr )
- if( ierr .gt. 0 ) then
-c ierr=1 si le tableau nosoar est sature
-c =2 si arete a creer et appartenant a 2 triangles distincts
-c des triangles nt1 et nt2
-c =3 si arete appartenant a 2 triangles distincts
-c differents des triangles nt1 et nt2
-c =4 si arete appartenant a 2 triangles distincts
-c dont le second n'est pas le triangle nt2
-c => pas d'echange
- noar34 = 0
- return
- endif
-c
-c suppression de l'arete noaret
- call sasoar( noaret, mosoar, mxsoar, n1soar, nosoar )
-c
-c nt1 = triangle 143
- noartr(1,nt1) = na14
-c sens de stockage de l'arete ns3-ns4 dans nosoar?
- if( nosoar(1,noar34) .eq. ns3 ) then
- n1 = -1
- else
- n1 = 1
- endif
- noartr(2,nt1) = noar34 * n1
- noartr(3,nt1) = na31
-c
-c nt2 = triangle 234
- noartr(1,nt2) = na23
- noartr(2,nt2) = -noar34 * n1
- noartr(3,nt2) = na42
-c
-c echange nt1 -> nt2 pour l'arete na23
- na23 = abs( na23 )
- if( nosoar(4,na23) .eq. nt1 ) then
- n1 = 4
- else
- n1 = 5
- endif
- nosoar(n1,na23) = nt2
-c
-c echange nt2 -> nt1 pour l'arete na14
- na14 = abs( na14 )
- if( nosoar(4,na14) .eq. nt2 ) then
- n1 = 4
- else
- n1 = 5
- endif
- nosoar(n1,na14) = nt1
-c
-c numero d'une arete de chacun des 4 sommets
- noarst(ns1) = na14
- noarst(ns2) = na23
- noarst(ns3) = noar34
- noarst(ns4) = noar34
- end
-
-
-
- subroutine f0trte( letree, pxyd,
- % mosoar, mxsoar, n1soar, nosoar,
- % moartr, mxartr, n1artr, noartr,
- % noarst,
- % nbtr, nutr, ierr )
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c but : former le ou les triangles du triangle equilateral letree
-c ----- les points internes au te deviennent des sommets des
-c sous-triangles du te
-c
-c entrees:
-c --------
-c letree : arbre-4 des triangles equilateraux (te) fond de la triangulation
-c si letree(0)>0 alors
-c letree(0:3) : no (>0) letree des 4 sous-triangles du triangle j
-c sinon
-c letree(0:3) :-no pxyd des 1 a 4 points internes au triangle j
-c 0 si pas de point
-c ( le te est une feuille de l'arbre )
-c letree(4) : no letree du sur-triangle du triangle j
-c letree(5) : 0 1 2 3 no du sous-triangle j pour son sur-triangle
-c letree(6:8) : no pxyd des 3 sommets du triangle j
-c pxyd : tableau des x y distance_souhaitee de chaque sommet
-c mosoar : nombre maximal d'entiers par arete du tableau nosoar
-c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar
-c moartr : nombre maximal d'entiers par arete du tableau noartr
-c mxartr : nombre maximal de triangles stockables dans le tableau noartr
-c
-c modifies:
-c ---------
-c n1soar : numero de la premiere arete vide dans le tableau nosoar
-c une arete i de nosoar est vide <=> nosoar(1,i)=0
-c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete,
-c chainage des aretes frontalieres, chainage du hachage des aretes
-c hachage des aretes = (nosoar(1)+nosoar(2)) modulo mxsoar
-c sommet 1 = 0 si arete vide => sommet 2 = arete vide suivante
-c n1artr : numero du premier triangle vide dans le tableau noartr
-c le chainage des triangles vides se fait sur noartr(2,.)
-c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3
-c arete1 = 0 si triangle vide => arete2 = triangle vide suivant
-c noarst : noarst(i) numero d'une arete de sommet i
-c
-c sorties:
-c --------
-c nbtr : nombre de sous-triangles du te, triangulation du te
-c nutr : numero des nbtr sous-triangles du te dans le tableau noartr
-c ierr : =0 si pas d'erreur
-c =1 si le tableau nosoar est sature
-c =2 si le tableau noartr est sature
-c =3 si aucun des triangles ne contient l'un des points internes au te
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c auteur : alain perronnet analyse numerique paris upmc mars 1997
-c....................................................................012
- common / unites / lecteu, imprim, nunite(30)
- double precision pxyd(3,*)
- integer letree(0:8),
- % nosoar(mosoar,mxsoar),
- % noartr(moartr,mxartr),
- % noarst(*),
- % nutr(1:nbtr)
- integer nuarco(3)
-c
-c le numero nt du triangle dans le tableau noartr
- if( n1artr .le. 0 ) then
-c tableau noartr sature
- write(imprim,*) 'f0trte: tableau noartr sature'
- ierr = 2
- return
- endif
- nt = n1artr
-c le numero du nouveau premier triangle libre dans noartr
- n1artr = noartr( 2, n1artr )
-c
-c formation du triangle = le triangle equilateral letree
- do 10 i=1,3
- if( i .ne. 3 ) then
- i1 = i + 1
- else
- i1 = 1
- endif
-c ajout eventuel de l'arete si si+1 dans le tableau nosoar
- call fasoar( letree(5+i), letree(5+i1), nt, -1, 0,
- % mosoar, mxsoar, n1soar, nosoar, noarst,
- % nuarco(i), ierr )
- if( ierr .ne. 0 ) return
- 10 continue
-c
-c le triangle nt est forme dans le tableau noartr
- do 20 i=1,3
-c letree(5+i) est le numero du sommet 1 de l'arete i du te
- if( letree(5+i) .eq. nosoar(1,nuarco(i)) ) then
- lesign = 1
- else
- lesign = -1
- endif
-c l'arete ns1-ns2 dans nosoar est celle du cote du te
- noartr( i, nt ) = lesign * nuarco(i)
- 20 continue
-c
-c triangulation du te=triangle nt par ajout des points internes du te
- nbtr = 1
- nutr(1) = nt
- call trpite( letree, pxyd,
- % mosoar, mxsoar, n1soar, nosoar,
- % moartr, mxartr, n1artr, noartr, noarst,
- % nbtr, nutr, ierr )
- end
-
-
- subroutine f1trte( letree, pxyd, milieu,
- % mosoar, mxsoar, n1soar, nosoar,
- % moartr, mxartr, n1artr, noartr,
- % noarst,
- % nbtr, nutr, ierr )
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c but : former les triangles du triangle equilateral letree
-c ----- a partir de l'un des 3 milieux des cotes du te
-c et des points internes au te
-c ils deviennent tous des sommets des sous-triangles du te
-c
-c entrees:
-c --------
-c letree : arbre-4 des triangles equilateraux (te) fond de la triangulation
-c si letree(0)>0 alors
-c letree(0:3) : no (>0) letree des 4 sous-triangles du triangle j
-c sinon
-c letree(0:3) :-no pxyd des 1 a 4 points internes au triangle j
-c 0 si pas de point
-c ( le te est une feuille de l'arbre )
-c letree(4) : no letree du sur-triangle du triangle j
-c letree(5) : 0 1 2 3 no du sous-triangle j pour son sur-triangle
-c letree(6:8) : no pxyd des 3 sommets du triangle j
-c pxyd : tableau des x y distance_souhaitee de chaque sommet
-c milieu : milieu(i) numero dans pxyd du milieu de l'arete i du te
-c 0 si pas de milieu du cote i a ajouter
-c mosoar : nombre maximal d'entiers par arete du tableau nosoar
-c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar
-c moartr : nombre maximal d'entiers par arete du tableau noartr
-c mxartr : nombre maximal de triangles stockables dans le tableau noartr
-c
-c modifies:
-c ---------
-c n1soar : numero de la premiere arete vide dans le tableau nosoar
-c une arete i de nosoar est vide <=> nosoar(1,i)=0
-c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete,
-c chainage des aretes frontalieres, chainage du hachage des aretes
-c hachage des aretes = (nosoar(1)+nosoar(2)) modulo mxsoar
-c sommet 1 = 0 si arete vide => sommet 2 = arete vide suivante
-c n1artr : numero du premier triangle vide dans le tableau noartr
-c le chainage des triangles vides se fait sur noartr(2,.)
-c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3
-c arete1 = 0 si triangle vide => arete2 = triangle vide suivant
-c noarst : noarst(np) numero d'une arete du sommet np
-c
-c sorties:
-c --------
-c nbtr : nombre de sous-triangles du te, triangulation du te
-c nutr : numero des nbtr sous-triangles du te dans le tableau noartr
-c ierr : =0 si pas d'erreur
-c =1 si le tableau nosoar est sature
-c =2 si le tableau noartr est sature
-c =3 si aucun des triangles ne contient l'un des points internes au te
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c auteur : alain perronnet analyse numerique paris upmc mars 1997
-c....................................................................012
- double precision pxyd(3,*)
- integer letree(0:8),
- % milieu(3),
- % nosoar(mosoar,mxsoar),
- % noartr(moartr,mxartr),
- % noarst(*),
- % nutr(1:nbtr)
-c
- integer nosotr(3), nuarco(5)
-c
-c le numero des 2 triangles (=2 demi te) a creer dans le tableau noartr
- do 5 nbtr=1,2
- if( n1artr .le. 0 ) then
-c tableau noartr sature
- ierr = 2
- return
- endif
- nutr(nbtr) = n1artr
-c le nouveau premier triangle libre dans noartr
- n1artr = noartr(2,n1artr)
- 5 continue
- nbtr = 2
-c
-c recherche du milieu a creer
- do 7 i=1,3
- if( milieu(i) .ne. 0 ) goto 9
- 7 continue
-c le numero pxyd du point milieu du cote i
- 9 nm = milieu( i )
-c
-c on se ramene au seul cas i=3 c-a-d le milieu est sur le cote 3
- if( i .eq. 1 ) then
-c milieu sur le cote 1
- nosotr(1) = letree(7)
- nosotr(2) = letree(8)
- nosotr(3) = letree(6)
- else if( i .eq. 2 ) then
-c milieu sur le cote 2
- nosotr(1) = letree(8)
- nosotr(2) = letree(6)
- nosotr(3) = letree(7)
- else
-c milieu sur le cote 3
- nosotr(1) = letree(6)
- nosotr(2) = letree(7)
- nosotr(3) = letree(8)
- endif
-c
-c formation des 2 aretes s1 s2 et s2 s3
- do 10 i=1,2
- if( i .ne. 3 ) then
- i1 = i + 1
- else
- i1 = 1
- endif
-c ajout eventuel de l'arete dans nosoar
- call fasoar( nosotr(i), nosotr(i1), nutr(i), -1, 0,
- % mosoar, mxsoar, n1soar, nosoar, noarst,
- % nuarco(i), ierr )
- if( ierr .ne. 0 ) return
- 10 continue
-c
-c ajout eventuel de l'arete s3 milieu dans nosoar
- call fasoar( nosotr(3), nm, nutr(2), -1, 0,
- % mosoar, mxsoar, n1soar, nosoar, noarst,
- % nuarco(3), ierr )
- if( ierr .ne. 0 ) return
-c
-c ajout eventuel de l'arete milieu s1 dans nosoar
- call fasoar( nosotr(1), nm, nutr(1), -1, 0,
- % mosoar, mxsoar, n1soar, nosoar, noarst,
- % nuarco(4), ierr )
- if( ierr .ne. 0 ) return
-c
-c ajout eventuel de l'arete milieu s2 dans nosoar
- call fasoar( nosotr(2), nm, nutr(1), nutr(2), 0,
- % mosoar, mxsoar, n1soar, nosoar, noarst,
- % nuarco(5), ierr )
- if( ierr .ne. 0 ) return
-c
-c les aretes s1 s2 et s2 s3 dans le tableau noartr
- do 20 i=1,2
-c nosotr(i) est le numero du sommet 1 de l'arete i du te
- if( nosotr(i) .eq. nosoar(1,nuarco(i)) ) then
- lesign = 1
- else
- lesign = -1
- endif
-c l'arete ns1-ns2 dans nosoar est celle du cote du te
- noartr( 1, nutr(i) ) = lesign * nuarco(i)
- 20 continue
-c
-c l'arete mediane s2 milieu
- if( nm .eq. nosoar(1,nuarco(5)) ) then
- lesign = -1
- else
- lesign = 1
- endif
- noartr( 2, nutr(1) ) = lesign * nuarco(5)
- noartr( 3, nutr(2) ) = -lesign * nuarco(5)
-c
-c l'arete s1 milieu
- if( nm .eq. nosoar(1,nuarco(4)) ) then
- lesign = 1
- else
- lesign = -1
- endif
- noartr( 3, nutr(1) ) = lesign * nuarco(4)
-c
-c l'arete s3 milieu
- if( nm .eq. nosoar(1,nuarco(3)) ) then
- lesign = -1
- else
- lesign = 1
- endif
- noartr( 2, nutr(2) ) = lesign * nuarco(3)
-c
-c triangulation des 2 demi te par ajout des points internes du te
- call trpite( letree, pxyd,
- % mosoar, mxsoar, n1soar, nosoar,
- % moartr, mxartr, n1artr, noartr, noarst,
- % nbtr, nutr, ierr )
- end
-
-
- subroutine f2trte( letree, pxyd, milieu,
- % mosoar, mxsoar, n1soar, nosoar,
- % moartr, mxartr, n1artr, noartr,
- % noarst,
- % nbtr, nutr, ierr )
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c but : former les triangles du triangle equilateral letree
-c ----- a partir de 2 milieux des cotes du te
-c et des points internes au te
-c ils deviennent tous des sommets des sous-triangles du te
-c
-c entrees:
-c --------
-c letree : arbre-4 des triangles equilateraux (te) fond de la triangulation
-c si letree(0)>0 alors
-c letree(0:3) : no (>0) letree des 4 sous-triangles du triangle j
-c sinon
-c letree(0:3) :-no pxyd des 1 a 4 points internes au triangle j
-c 0 si pas de point
-c ( le te est une feuille de l'arbre )
-c letree(4) : no letree du sur-triangle du triangle j
-c letree(5) : 0 1 2 3 no du sous-triangle j pour son sur-triangle
-c letree(6:8) : no pxyd des 3 sommets du triangle j
-c pxyd : tableau des x y distance_souhaitee de chaque sommet
-c milieu : milieu(i) numero dans pxyd du milieu de l'arete i du te
-c 0 si pas de milieu du cote i a ajouter
-c mosoar : nombre maximal d'entiers par arete du tableau nosoar
-c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar
-c moartr : nombre maximal d'entiers par arete du tableau noartr
-c mxartr : nombre maximal de triangles stockables dans le tableau noartr
-c
-c modifies:
-c ---------
-c n1soar : numero de la premiere arete vide dans le tableau nosoar
-c une arete i de nosoar est vide <=> nosoar(1,i)=0
-c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete,
-c chainage des aretes frontalieres, chainage du hachage des aretes
-c hachage des aretes = (nosoar(1)+nosoar(2)) modulo mxsoar
-c sommet 1 = 0 si arete vide => sommet 2 = arete vide suivante
-c n1artr : numero du premier triangle vide dans le tableau noartr
-c le chainage des triangles vides se fait sur noartr(2,.)
-c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3
-c arete1 = 0 si triangle vide => arete2 = triangle vide suivant
-c noarst : noarst(np) numero d'une arete du sommet np
-c
-c sorties:
-c --------
-c nbtr : nombre de sous-triangles du te, triangulation du te
-c nutr : numero des nbtr sous-triangles du te dans le tableau noartr
-c ierr : =0 si pas d'erreur
-c =1 si le tableau nosoar est sature
-c =2 si le tableau noartr est sature
-c =3 si aucun des triangles ne contient l'un des points internes au te
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c auteur : alain perronnet analyse numerique paris upmc mars 1997
-c....................................................................012
- common / unites / lecteu, imprim, nunite(30)
- double precision pxyd(3,*)
- integer letree(0:8),
- % milieu(3),
- % nosoar(mosoar,mxsoar),
- % noartr(moartr,mxartr),
- % noarst(*),
- % nutr(1:nbtr)
-c
- integer nosotr(3), nuarco(7)
-c
-c le numero des 3 triangles a creer dans le tableau noartr
- do 5 nbtr=1,3
- if( n1artr .le. 0 ) then
-c tableau noartr sature
- ierr = 2
- return
- endif
- nutr(nbtr) = n1artr
-c le nouveau premier triangle libre dans noartr
- n1artr = noartr(2,n1artr)
- 5 continue
- nbtr = 3
-c
-c recherche du premier milieu a creer
- do 7 i=1,3
- if( milieu(i) .ne. 0 ) goto 9
- 7 continue
-c
-c on se ramene au seul cas i=2 c-a-d le cote 1 n'a pas de milieu
- 9 if( i .eq. 2 ) then
-c pas de milieu sur le cote 1
- nosotr(1) = letree(6)
- nosotr(2) = letree(7)
- nosotr(3) = letree(8)
-c le numero pxyd du milieu du cote 2
- nm2 = milieu( 2 )
-c le numero pxyd du milieu du cote 3
- nm3 = milieu( 3 )
- else if( milieu(2) .ne. 0 ) then
-c pas de milieu sur le cote 3
- nosotr(1) = letree(8)
- nosotr(2) = letree(6)
- nosotr(3) = letree(7)
-c le numero pxyd du milieu du cote 2
- nm2 = milieu( 1 )
-c le numero pxyd du milieu du cote 3
- nm3 = milieu( 2 )
- else
-c pas de milieu sur le cote 2
- nosotr(1) = letree(7)
- nosotr(2) = letree(8)
- nosotr(3) = letree(6)
-c le numero pxyd du milieu du cote 2
- nm2 = milieu( 3 )
-c le numero pxyd du milieu du cote 3
- nm3 = milieu( 1 )
- endif
-c
-c ici seul le cote 1 n'a pas de milieu
-c nm2 est le milieu du cote 2
-c nm3 est le milieu du cote 3
-c
-c ajout eventuel de l'arete s1 s2 dans nosoar
- call fasoar( nosotr(1), nosotr(2), nutr(1), -1, 0,
- % mosoar, mxsoar, n1soar, nosoar, noarst,
- % nuarco(1), ierr )
- if( ierr .ne. 0 ) return
-c
-c ajout eventuel de l'arete s1 s2 dans nosoar
- call fasoar( nosotr(2), nm2, nutr(1), -1, 0,
- % mosoar, mxsoar, n1soar, nosoar, noarst,
- % nuarco(2), ierr )
- if( ierr .ne. 0 ) return
-c
-c ajout eventuel de l'arete s1 nm2 dans nosoar
- call fasoar( nosotr(1), nm2, nutr(1), nutr(2), 0,
- % mosoar, mxsoar, n1soar, nosoar, noarst,
- % nuarco(3), ierr )
- if( ierr .ne. 0 ) return
-c
-c ajout eventuel de l'arete nm2 nm3 dans nosoar
- call fasoar( nm3, nm2, nutr(2), nutr(3), 0,
- % mosoar, mxsoar, n1soar, nosoar, noarst,
- % nuarco(4), ierr )
- if( ierr .ne. 0 ) return
-c
-c ajout eventuel de l'arete s1 nm3 dans nosoar
- call fasoar( nosotr(1), nm3, nutr(2), -1, 0,
- % mosoar, mxsoar, n1soar, nosoar, noarst,
- % nuarco(5), ierr )
- if( ierr .ne. 0 ) return
-c
-c ajout eventuel de l'arete nm2 s3 dans nosoar
- call fasoar( nm2, nosotr(3), nutr(3), -1, 0,
- % mosoar, mxsoar, n1soar, nosoar, noarst,
- % nuarco(6), ierr )
-c
-c ajout eventuel de l'arete nm3 s3 dans nosoar
- call fasoar( nosotr(3), nm3, nutr(3), -1, 0,
- % mosoar, mxsoar, n1soar, nosoar, noarst,
- % nuarco(7), ierr )
- if( ierr .ne. 0 ) return
-c
-c le triangle s1 s2 nm2 ou arete1 arete2 arete3
- do 20 i=1,2
-c nosotr(i) est le numero du sommet 1 de l'arete i du te
- if( nosotr(i) .eq. nosoar(1,nuarco(i)) ) then
- lesign = 1
- else
- lesign = -1
- endif
-c l'arete ns1-ns2 dans nosoar est celle du cote du te
- noartr( i, nutr(1) ) = lesign * nuarco(i)
- 20 continue
- if( nm2 .eq. nosoar(1,nuarco(3)) ) then
- lesign = 1
- else
- lesign = -1
- endif
- noartr( 3, nutr(1) ) = lesign * nuarco(3)
-c
-c le triangle s1 nm2 nm3
- noartr( 1, nutr(2) ) = -lesign * nuarco(3)
- if( nm2 .eq. nosoar(1,nuarco(4)) ) then
- lesign = 1
- else
- lesign = -1
- endif
- noartr( 2, nutr(2) ) = lesign * nuarco(4)
- noartr( 1, nutr(3) ) = -lesign * nuarco(4)
- if( nm3 .eq. nosoar(1,nuarco(5)) ) then
- lesign = 1
- else
- lesign = -1
- endif
- noartr( 3, nutr(2) ) = lesign * nuarco(5)
-c
-c le triangle nm2 nm3 s3
- if( nm2 .eq. nosoar(1,nuarco(6)) ) then
- lesign = 1
- else
- lesign = -1
- endif
- noartr( 2, nutr(3) ) = lesign * nuarco(6)
- if( nm3 .eq. nosoar(1,nuarco(7)) ) then
- lesign = -1
- else
- lesign = 1
- endif
- noartr( 3, nutr(3) ) = lesign * nuarco(7)
-c
-c triangulation des 3 sous-te par ajout des points internes du te
- call trpite( letree, pxyd,
- % mosoar, mxsoar, n1soar, nosoar,
- % moartr, mxartr, n1artr, noartr, noarst,
- % nbtr, nutr, ierr )
- end
-
-
- subroutine f3trte( letree, pxyd, milieu,
- % mosoar, mxsoar, n1soar, nosoar,
- % moartr, mxartr, n1artr, noartr,
- % noarst,
- % nbtr, nutr, ierr )
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c but : former les triangles du triangle equilateral letree
-c ----- a partir de 3 milieux des cotes du te
-c et des points internes au te
-c ils deviennent tous des sommets des sous-triangles du te
-c
-c entrees:
-c --------
-c letree : arbre-4 des triangles equilateraux (te) fond de la triangulation
-c si letree(0)>0 alors
-c letree(0:3) : no (>0) letree des 4 sous-triangles du triangle j
-c sinon
-c letree(0:3) :-no pxyd des 1 a 4 points internes au triangle j
-c 0 si pas de point
-c ( le te est une feuille de l'arbre )
-c letree(4) : no letree du sur-triangle du triangle j
-c letree(5) : 0 1 2 3 no du sous-triangle j pour son sur-triangle
-c letree(6:8) : no pxyd des 3 sommets du triangle j
-c pxyd : tableau des x y distance_souhaitee de chaque sommet
-c milieu : milieu(i) numero dans pxyd du milieu de l'arete i du te
-c 0 si pas de milieu du cote i a ajouter
-c mosoar : nombre maximal d'entiers par arete du tableau nosoar
-c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar
-c moartr : nombre maximal d'entiers par arete du tableau noartr
-c mxartr : nombre maximal de triangles stockables dans le tableau noartr
-c
-c modifies:
-c ---------
-c n1soar : numero de la premiere arete vide dans le tableau nosoar
-c une arete i de nosoar est vide <=> nosoar(1,i)=0
-c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete,
-c chainage des aretes frontalieres, chainage du hachage des aretes
-c hachage des aretes = (nosoar(1)+nosoar(2)) modulo mxsoar
-c sommet 1 = 0 si arete vide => sommet 2 = arete vide suivante
-c n1artr : numero du premier triangle vide dans le tableau noartr
-c le chainage des triangles vides se fait sur noartr(2,.)
-c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3
-c arete1 = 0 si triangle vide => arete2 = triangle vide suivant
-c noarst : noarst(np) numero d'une arete du sommet np
-c
-c sorties:
-c --------
-c nbtr : nombre de sous-triangles du te, triangulation du te
-c nutr : numero des nbtr sous-triangles du te dans le tableau noartr
-c ierr : =0 si pas d'erreur
-c =1 si le tableau nosoar est sature
-c =2 si le tableau noartr est sature
-c =3 si aucun des triangles ne contient l'un des points internes au te
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c auteur : alain perronnet analyse numerique paris upmc mars 1997
-c....................................................................012
- common / unites / lecteu, imprim, nunite(30)
- double precision pxyd(3,*)
- integer letree(0:8),
- % milieu(3),
- % nosoar(mosoar,mxsoar),
- % noartr(moartr,mxartr),
- % noarst(*),
- % nutr(1:nbtr)
-c
- integer nuarco(9)
-c
-c le numero des 4 triangles a creer dans le tableau noartr
- do 5 nbtr=1,4
- if( n1artr .le. 0 ) then
-c tableau noartr sature
- ierr = 2
- return
- endif
- nutr(nbtr) = n1artr
-c le nouveau premier triangle libre dans noartr
- n1artr = noartr(2,n1artr)
- 5 continue
- nbtr = 4
-c
- do 10 i=1,3
-c le sommet suivant
- if( i .ne. 3 ) then
- i1 = i + 1
- else
- i1 = 1
- endif
-c le sommet precedant
- if( i .ne. 1 ) then
- i0 = i - 1
- else
- i0 = 3
- endif
- i3 = 3 * i
-c
-c ajout eventuel de l'arete si mi dans nosoar
- call fasoar( letree(5+i), milieu(i), nutr(i), -1, 0,
- % mosoar, mxsoar, n1soar, nosoar, noarst,
- % nuarco(i3-2), ierr )
- if( ierr .ne. 0 ) return
-c
-c ajout eventuel de l'arete mi mi-1 dans nosoar
- call fasoar( milieu(i), milieu(i0), nutr(i), nutr(4), 0,
- % mosoar, mxsoar, n1soar, nosoar, noarst,
- % nuarco(i3-1), ierr )
- if( ierr .ne. 0 ) return
-c
-c ajout eventuel de l'arete m i-1 si dans nosoar
- call fasoar( milieu(i0), letree(5+i), nutr(i), -1, 0,
- % mosoar, mxsoar, n1soar, nosoar, noarst,
- % nuarco(i3), ierr )
- if( ierr .ne. 0 ) return
-c
- 10 continue
-c
-c les 3 sous-triangles pres des sommets
- do 20 i=1,3
-c le sommet suivant
- if( i .ne. 3 ) then
- i1 = i + 1
- else
- i1 = 1
- endif
-c le sommet precedant
- if( i .ne. 1 ) then
- i0 = i - 1
- else
- i0 = 3
- endif
- i3 = 3 * i
-c
-c ajout du triangle arete3i-2 arete3i-1 arete3i
- if( letree(5+i) .eq. nosoar(1,nuarco(i3-2)) ) then
- lesign = 1
- else
- lesign = -1
- endif
- noartr( 1, nutr(i) ) = lesign * nuarco(i3-2)
-c
- if( milieu(i) .eq. nosoar(1,nuarco(i3-1)) ) then
- lesign = 1
- else
- lesign = -1
- endif
- noartr( 2, nutr(i) ) = lesign * nuarco(i3-1)
-c
- if( milieu(i0) .eq. nosoar(1,nuarco(i3)) ) then
- lesign = 1
- else
- lesign = -1
- endif
- noartr( 3, nutr(i) ) = lesign * nuarco(i3)
-c
- 20 continue
-c
-c le sous triangle central
- i3 = -1
- do 30 i=1,3
- i3 = i3 + 3
- if( milieu(i) .eq. nosoar(1,nuarco(i3)) ) then
- lesign = -1
- else
- lesign = 1
- endif
- noartr( i, nutr(4) ) = lesign * nuarco(i3)
- 30 continue
-c
-c triangulation des 3 sous-te par ajout des points internes du te
- call trpite( letree, pxyd,
- % mosoar, mxsoar, n1soar, nosoar,
- % moartr, mxartr, n1artr, noartr, noarst,
- % nbtr, nutr, ierr )
- end
-
-
-
- subroutine hasoar( mosoar, mxsoar, n1soar, nosoar, nu2sar,
- % noar )
-c ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c but : rechercher le numero des 2 sommets d'une arete parmi
-c ----- les numeros des 2 sommets des aretes du tableau nosoar
-c s ils n y sont pas stockes les y ajouter
-c dans tous les cas retourner le numero de l'arete dans nosoar
-c
-c la methode employee ici est celle du hachage
-c avec pour fonction d'adressage h(ns1,ns2)=min(ns1,ns2)
-c
-c remarque: h(ns1,ns2)=ns1 + 2*ns2
-c ne marche pas si des aretes sont detruites
-c et ajoutees aux aretes vides
-c le chainage est commun a plusieurs hachages!
-c d'ou ce choix du minimum pour le hachage
-c
-c entrees:
-c --------
-c mosoar : nombre maximal d'entiers par arete et
-c indice dans nosoar de l'arete suivante dans le hachage
-c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar
-c attention: mxsoar>3*mxsomm obligatoire!
-c
-c modifies:
-c ---------
-c n1soar : numero de la premiere arete vide dans le tableau nosoar
-c une arete i de nosoar est vide <=> nosoar(1,i)=0
-c chainage des aretes vides amont et aval
-c l'arete vide qui precede=nosoar(4,i)
-c l'arete vide qui suit =nosoar(5,i)
-c nosoar : numero des 2 sommets, no ligne, 2 triangles de l'arete,
-c chainage momentan'e d'aretes, chainage du hachage des aretes
-c hachage des aretes = min( nosoar(1), nosoar(2) )
-c nu2sar : en entree les 2 numeros des sommets de l'arete
-c en sortie nu2sar(1)<nu2sar(2) numeros des 2 sommets de l'arete
-c
-c sorties:
-c --------
-c noar : numero dans nosoar de l'arete apres hachage
-c =0 si saturation du tableau nosoar
-c >0 si le tableau nu2sar est l'arete noar retrouvee
-c dans le tableau nosoar
-c <0 si le tableau nu2sar a ete ajoute et forme l'arete
-c -noar du tableau nosoar avec nosoar(1,noar)<nosoar(2,noar)
-c ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c auteur : alain perronnet analyse numerique upmc paris mars 1997
-c ...................................................................012
- integer nu2sar(2), nosoar(mosoar,mxsoar)
-c
- if( nu2sar(1) .gt. nu2sar(2) ) then
-c
-c permutation des numeros des 2 sommets pour
-c amener le plus petit dans nu2sar(1)
- i = nu2sar(1)
- nu2sar(1) = nu2sar(2)
- nu2sar(2) = i
- endif
-c
-c la fonction d'adressage du hachage des aretes : h(ns1,ns2)=min(ns1,ns2)
-c ===============================================
- noar = nu2sar(1)
-c
-c la recherche de l'arete dans le chainage du hachage
-c ---------------------------------------------------
- 10 if( nu2sar(1) .eq. nosoar(1,noar) ) then
- if( nu2sar(2) .eq. nosoar(2,noar) ) then
-c
-c l'arete est retrouvee
-c .....................
- return
- endif
- endif
-c
-c l'arete suivante parmi celles ayant meme fonction d'adressage
- i = nosoar( mosoar, noar )
- if( i .gt. 0 ) then
- noar = i
- goto 10
- endif
-c
-c noar est ici la derniere arete (sans suivante) du chainage
-c a partir de l'adressage du hachage
-c
-c l'arete non retrouvee doit etre ajoutee
-c .......................................
- if( nosoar( 1, nu2sar(1) ) .eq. 0 ) then
-c
-c l'adresse de hachage est libre => elle devient la nouvelle arete
-c retouche des chainages de cette arete noar qui ne sera plus vide
- noar = nu2sar(1)
-c l'eventuel chainage du hachage n'est pas modifie
-c
- else
-c
-c la premiere arete dans l'adressage du hachage n'est pas libre
-c => choix quelconque d'une arete vide pour ajouter cette arete
- if( n1soar .le. 0 ) then
-c
-c le tableau nosoar est sature avec pour temoin d'erreur
- noar = 0
- return
-c
- else
-c
-c l'arete n1soar est vide => c'est la nouvelle arete
-c mise a jour du chainage de la derniere arete noar du chainage
-c sa suivante est la nouvelle arete n1soar
- nosoar( mosoar, noar ) = n1soar
-c
-c l'arete ajoutee est n1soar
- noar = n1soar
-c
-c la nouvelle premiere arete vide
- n1soar = nosoar( 5, n1soar )
-c
-c la premiere arete vide n1soar n'a pas d'arete vide precedente
- nosoar( 4, n1soar ) = 0
-c
-c noar la nouvelle arete est la derniere du chainage du hachage
- nosoar( mosoar, noar ) = 0
-c
- endif
-c
- endif
-c
-c les 2 sommets de la nouvelle arete noar
- nosoar( 1, noar ) = nu2sar(1)
- nosoar( 2, noar ) = nu2sar(2)
-c
-c le tableau nu2sar a ete ajoute avec l'indice -noar
- noar = - noar
- end
-
-
- subroutine mt3str( nt, moartr, noartr, mosoar, nosoar,
- % ns1, ns2, ns3 )
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c but : calcul du numero des 3 sommets du triangle nt du tableau noartr
-c -----
-c
-c entrees:
-c --------
-c nt : numero du triangle de noartr a traiter
-c moartr : nombre maximal d'entiers par triangle
-c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3
-c arete1=0 si triangle vide => arete2=triangle vide suivant
-c mosoar : nombre maximal d'entiers par arete
-c nosoar : numero des 2 sommets , no ligne, 2 triangles, chainages en +
-c sommet 1 = 0 si arete vide => sommet 2 = arete vide suivante
-c
-c sorties:
-c --------
-c ns1,ns2,ns3 : les 3 numeros des sommets du triangle en sens direct
-c
-c si erreur rencontree => ns1 = 0
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c auteur : alain perronnet analyse numerique paris upmc juillet 1995
-c2345x7..............................................................012
- integer noartr(moartr,*), nosoar(mosoar,*)
-c
-c le numero de triangle est il correct ?
-c a supprimer apres mise au point
- if( nt .le. 0 ) then
-c nblgrc(nrerr) = 1
-c write(kerr(mxlger)(1:6),'(i6)') nt
-c kerr(1) = kerr(mxlger)(1:6) //
-c % ' no triangle dans noartr incorrect'
-c call lereur
- write(imprim,*) nt,' no triangle dans noartr incorrect'
- ns1 = 0
- return
- endif
-c
- na = noartr(1,nt)
- if( na .gt. 0 ) then
-c arete dans le sens direct
- ns1 = nosoar(1,na)
- ns2 = nosoar(2,na)
- else
-c arete dans le sens indirect
- ns1 = nosoar(2,-na)
- ns2 = nosoar(1,-na)
- endif
-c
- na = noartr(2,nt)
- if( na .gt. 0 ) then
-c arete dans le sens direct => ns3 est le second sommet de l'arete
- ns3 = nosoar(2,na)
- else
-c arete dans le sens indirect => ns3 est le premier sommet de l'arete
- ns3 = nosoar(1,-na)
- endif
- end
- subroutine trpite( letree, pxyd,
- % mosoar, mxsoar, n1soar, nosoar,
- % moartr, mxartr, n1artr, noartr,
- % noarst,
- % nbtr, nutr, ierr )
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c but : former le ou les sous-triangles des nbtr triangles nutr
-c ----- qui forment le triangle equilateral letree par ajout
-c des points internes au te qui deviennent des sommets des
-c sous-triangles des nbtr triangles
-c
-c entrees:
-c --------
-c letree : arbre-4 des triangles equilateraux (te) fond de la triangulation
-c letree(0:3):-no pxyd des 1 a 4 points internes au triangle j
-c 0 si pas de point
-c ( le te est ici une feuille de l'arbre )
-c letree(4) : no letree du sur-triangle du triangle j
-c letree(5) : 0 1 2 3 no du sous-triangle j pour son sur-triangle
-c letree(6:8) : no pxyd des 3 sommets du triangle j
-c pxyd : tableau des x y distance_souhaitee de chaque sommet
-c mosoar : nombre maximal d'entiers par arete du tableau nosoar
-c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar
-c moartr : nombre maximal d'entiers par arete du tableau noartr
-c mxartr : nombre maximal de triangles stockables dans le tableau noartr
-c
-c modifies:
-c ---------
-c n1soar : numero de la premiere arete vide dans le tableau nosoar
-c une arete i de nosoar est vide <=> nosoar(1,i)=0
-c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete,
-c chainage des aretes frontalieres, chainage du hachage des aretes
-c hachage des aretes = (nosoar(1)+nosoar(2)) modulo mxsoar
-c sommet 1 = 0 si arete vide => sommet 2 = arete vide suivante
-c n1artr : numero du premier triangle vide dans le tableau noartr
-c le chainage des triangles vides se fait sur noartr(2,.)
-c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3
-c arete1 = 0 si triangle vide => arete2 = triangle vide suivant
-c noarst : noarst(i) numero d'une arete de sommet i
-c
-c sorties:
-c --------
-c nbtr : nombre de sous-triangles du te
-c nutr : numero des nbtr sous-triangles du te dans le tableau noartr
-c ierr : =0 si pas d'erreur
-c =1 si le tableau nosoar est sature
-c =2 si le tableau noartr est sature
-c =3 si aucun des triangles ne contient l'un des points internes au te
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c auteur : alain perronnet analyse numerique paris upmc mars 1997
-c....................................................................012
- logical tratri
- common / dv2dco / tratri
-c trace ou non des triangles generes dans la triangulation
- common / unites / lecteu, imprim, nunite(30)
- double precision pxyd(3,*)
- integer letree(0:8),
- % nosoar(mosoar,mxsoar),
- % noartr(moartr,mxartr),
- % noarst(*),
- % nutr(1:nbtr)
-c
- integer nosotr(3)
-c
-c si pas de point interne alors trace eventuel puis retour
- if( letree(0) .eq. 0 ) goto 150
-c
-c il existe au moins un point interne a trianguler
-c dans les nbtr triangles
- do 100 k=0,3
-c
-c le numero du point
- np = -letree(k)
- if( np .eq. 0 ) goto 150
-c
-c le point np dans pxyd est a traiter
- do 10 n = 1, nbtr
-c
-c les numeros des 3 sommets du triangle nt=nutr(n)
- nt = nutr(n)
- call nusotr( nt, mosoar, nosoar, moartr, noartr, nosotr )
-c
-c le triangle nt contient il le point np?
- call ptdatr( pxyd(1,np), pxyd, nosotr, nsigne )
-c nsigne>0 si le point est dans le triangle ou sur une des 3 aretes
-c =0 si triangle degenere ou indirect ou ne contient pas le poin
-c
- if( nsigne .gt. 0 ) then
-c
-c le triangle nt est triangule en 3 sous-triangles
- call tr3str( np, nt,
- % mosoar, mxsoar, n1soar, nosoar,
- % moartr, mxartr, n1artr, noartr,
- % noarst,
- % nutr(nbtr+1), ierr )
- if( ierr .ne. 0 ) return
-c
-c reamenagement des 3 triangles crees dans nutr
-c en supprimant le triangle nt
- nutr( n ) = nutr( nbtr + 3 )
- nbtr = nbtr + 2
-c le point np est triangule
- goto 100
-c
- endif
- 10 continue
-c
-c erreur: le point np n'est pas dans l'un des nbtr triangles
- write(imprim,10010) np
- ierr = 3
- return
-c
- 100 continue
-10010 format(' erreur trpite: pas de triangle contenant le point',i7)
-c
- 150 continue
-
-ccc 150 if( tratri ) then
-cccc les traces sont demandes
-ccc call efface
-cccc le cadre objet global en unites utilisateur
-ccc xx1 = min(pxyd(1,nosotr(1)),pxyd(1,nosotr(2)),pxyd(1,nosotr(3)))
-ccc xx2 = max(pxyd(1,nosotr(1)),pxyd(1,nosotr(2)),pxyd(1,nosotr(3)))
-ccc yy1 = min(pxyd(2,nosotr(1)),pxyd(2,nosotr(2)),pxyd(2,nosotr(3)))
-ccc yy2 = max(pxyd(2,nosotr(1)),pxyd(2,nosotr(2)),pxyd(2,nosotr(3)))
-ccc if( xx1 .ge. xx2 ) xx2 = xx1 + (yy2-yy1)
-ccc if( yy1 .ge. yy2 ) yy2 = yy1 + (xx2-xx1)*0.5
-ccc call isofenetre( xx1-(xx2-xx1), xx2+(xx2-xx1),
-ccc % yy1-(yy2-yy1), yy2+(yy2-yy1) )
-ccc do 200 i=1,nbtr
-cccc trace du triangle nutr(i)
-ccc call mttrtr( pxyd, nutr(i), moartr, noartr, mosoar, nosoar,
-ccc % i, ncblan )
-ccc 200 continue
-ccc endif
-
- end
-
-
- subroutine sasoar( noar, mosoar, mxsoar, n1soar, nosoar )
-c ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c but : supprimer l'arete noar du tableau nosoar
-c ----- si celle ci n'est pas une arete des lignes de la frontiere
-c
-c la methode employee ici est celle du hachage
-c avec pour fonction d'adressage h = min( nu2sar(1), nu2sar(2) )
-c
-c attention: il faut mettre a jour le no d'arete des 2 sommets
-c de l'arete supprimee dans le tableau noarst!
-c
-c entrees:
-c --------
-c noar : numero de l'arete de nosoar a supprimer
-c mosoar : nombre maximal d'entiers par arete et
-c indice dans nosoar de l'arete suivante dans le hachage h
-c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar
-c attention: mxsoar>3*mxsomm obligatoire!
-c
-c modifies:
-c ---------
-c n1soar : no de l'eventuelle premiere arete libre dans le tableau nosoar
-c chainage des vides suivant en 3 et precedant en 2 de nosoar
-c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete,
-c chainage des aretes frontalieres, chainage du hachage des aretes
-c une arete i de nosoar est vide <=> nosoar(1,i)=0 et
-c nosoar(4,arete vide)=l'arete vide qui precede
-c nosoar(5,arete vide)=l'arete vide qui suit
-c ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c auteur : alain perronnet analyse numerique upmc paris mars 1997
-c ...................................................................012
- common / unites / lecteu, imprim, nunite(30)
- integer nosoar(mosoar,mxsoar)
-c
- if( nosoar(3,noar) .le. 0 ) then
-c
-c l'arete n'est pas frontaliere => elle devient une arete vide
-c
-c recherche de l'arete qui precede dans le chainage du hachage
- noar1 = nosoar(1,noar)
-c
-c parcours du chainage du hachage jusqu'a retrouver l'arete noar
- 10 if( noar1 .ne. noar ) then
-c
-c l'arete suivante parmi celles ayant meme fonction d'adressage
- noar0 = noar1
- noar1 = nosoar( mosoar, noar1 )
- if( noar1 .gt. 0 ) goto 10
-c
-c l'arete noar n'a pas ete retrouvee dans le chainage => erreur
- write(imprim,*) 'erreur sasoar:arete non dans le chainage '
- % ,noar
- write(imprim,*) 'arete de st1=',nosoar(1,noar),
- % ' st2=',nosoar(2,noar),' ligne=',nosoar(3,noar),
- % ' tr1=',nosoar(4,noar),' tr2=',nosoar(5,noar)
- write(imprim,*) 'chainages=',(nosoar(i,noar),i=6,mosoar)
-c l'arete n'est pas detruite
- return
-c
- endif
-c
- if( noar .ne. nosoar(1,noar) ) then
-c
-c saut de l'arete noar dans le chainage du hachage
-c noar0 initialisee est ici l'arete qui precede noar dans ce chainage
- nosoar( mosoar, noar0 ) = nosoar( mosoar, noar )
-c
-c le chainage du hachage n'existe plus pour noar
-c pas utile car mise a zero faite dans le sp hasoar
-ccc nosoar( mosoar, noar ) = 0
-c
-c noar devient la nouvelle premiere arete du chainage des vides
- nosoar( 4, noar ) = 0
- nosoar( 5, noar ) = n1soar
-c la nouvelle precede l'ancienne premiere
- nosoar( 4, n1soar ) = noar
- n1soar = noar
-c
-ccc else
-c
-c noar est la premiere arete du chainage du hachage h
-c cette arete ne peut etre consideree dans le chainage des vides
-c car le chainage du hachage doit etre conserve (sinon perte...)
-c
- endif
-c
-c le temoin d'arete vide
- nosoar( 1, noar ) = 0
- endif
- end
-
-
- subroutine caetoi( noar, mosoar, mxsoar, n1soar, nosoar,
- % n1aeoc, nbtrar )
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c but : ajouter (ou retirer) l'arete noar de nosoar de l'etoile
-c ----- des aretes simples chainees en position lchain de nosoar
-c detruire du tableau nosoar les aretes doubles
-c
-c attention: le chainage lchain de nosoar devient celui des cf
-c
-c entree :
-c --------
-c noar : numero dans le tableau nosoar de l'arete a traiter
-c mosoar : nombre maximal d'entiers par arete et
-c indice dans nosoar de l'arete suivante dans le hachage
-c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar
-c attention: mxsoar>3*mxsomm obligatoire!
-c
-c entrees et sorties:
-c -------------------
-c n1soar : numero de la premiere arete vide dans le tableau nosoar
-c une arete i de nosoar est vide <=> nosoar(1,i)=0
-c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete,
-c chainage des aretes frontalieres, chainage du hachage des aretes
-c n1aeoc : numero dans nosoar de la premiere arete simple de l'etoile
-c
-c sortie :
-c --------
-c nbtrar : 1 si arete ajoutee, 2 si arete double supprimee
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c auteur : alain perronnet analyse numerique paris upmc mars 1997
-c2345x7..............................................................012
- parameter (lchain=6)
- integer nosoar(mosoar,mxsoar)
-c
-c si l'arete n'appartient pas aux aretes de l'etoile naetoi
-c alors elle est ajoutee a l'etoile dans naetoi
-c sinon elle est empilee dans npile pour etre detruite ensuite
-c elle est supprimee de l'etoile naetoi
-c
- if( nosoar( lchain, noar ) .lt. 0 ) then
-c
-c arete de l'etoile vue pour la premiere fois
-c elle est ajoutee au chainage
- nosoar( lchain, noar ) = n1aeoc
-c elle devient la premiere du chainage
- n1aeoc = noar
-c arete simple
- nbtrar = 1
-c
- else
-c
-c arete double de l'etoile. elle est supprimee du chainage
- na0 = 0
- na = n1aeoc
-c parcours des aretes chainees jusqu'a trouver l'arete noar
- 10 if( na .ne. noar ) then
-c passage a la suivante
- na0 = na
- na = nosoar( lchain, na )
- goto 10
- endif
-c
-c suppression de noar du chainage des aretes simples de l'etoile
- if( na0 .gt. 0 ) then
-c il existe une arete qui precede
- nosoar( lchain, na0 ) = nosoar( lchain, noar )
- else
-c noar est en fait n1aeoc la premiere du chainage
- n1aeoc = nosoar( lchain, noar )
- endif
-c noar n'est plus une arete simple de l'etoile
- nosoar( lchain, noar ) = -1
-c
-c destruction du tableau nosoar de l'arete double noar
- call sasoar( noar, mosoar, mxsoar, n1soar, nosoar )
-c
-c arete double
- nbtrar = 2
- endif
- end
-
-
- subroutine focftr( nbtrcf, notrcf, pxyd, noarst,
- % mosoar, mxsoar, n1soar, nosoar,
- % moartr, n1artr, noartr,
- % nbarcf, n1arcf, noarcf,
- % ierr )
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c but : former un contour ferme (cf) avec les aretes simples des
-c ----- nbtrcf triangles du tableau notrcf
-c destruction des nbtrcf triangles du tableau noartr
-c destruction des aretes doubles du tableau nosoar
-c
-c attention: le chainage lchain de nosoar devient celui des cf
-c
-c entrees:
-c --------
-c nbtrcf : nombre de triangles du cf a former
-c notrcf : numero des triangles dans le tableau noartr
-c pxyd : tableau des coordonnees 2d des points
-c par point : x y distance_souhaitee
-c
-c mosoar : nombre maximal d'entiers par arete et
-c indice dans nosoar de l'arete suivante dans le hachage
-c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar
-c attention: mxsoar>3*mxsomm obligatoire!
-c moartr : nombre maximal d'entiers par arete du tableau noartr
-c
-c entrees et sorties :
-c --------------------
-c noarst : noarst(i) numero d'une arete de sommet i
-c n1soar : numero de la premiere arete vide dans le tableau nosoar
-c une arete i de nosoar est vide <=> nosoar(1,i)=0
-c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete,
-c chainage des aretes frontalieres, chainage du hachage des aretes
-c hachage des aretes = nosoar(1)+nosoar(2)*2
-c n1artr : numero du premier triangle vide dans le tableau noartr
-c le chainage des triangles vides se fait sur noartr(2,.)
-c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3
-c arete1 = 0 si triangle vide => arete2 = triangle vide suivant
-c
-c sorties:
-c --------
-c nbarcf : nombre d'aretes du cf
-c n1arcf : numero d'une arete de chaque contour
-c noarcf : numero des aretes de la ligne du contour ferme
-c attention: chainage circulaire des aretes
-c les aretes vides pointes par n1arcf(0) ne sont pas chainees
-c ierr : 0 si pas d'erreur
-c 14 si les lignes fermees se coupent => donnees a revoir
-c 15 si une seule arete simple frontaliere
-c 16 si boucle infinie car toutes les aretes simples
-c de la boule sont frontalieres!
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c auteur : alain perronnet analyse numerique paris upmc mars 1997
-c....................................................................012
- parameter (lchain=6)
- common / unites / lecteu, imprim, nunite(30)
- double precision pxyd(3,*)
- integer notrcf(1:nbtrcf)
- integer nosoar(mosoar,mxsoar),
- % noartr(moartr,*),
- % n1arcf(0:*),
- % noarcf(3,*),
- % noarst(*)
-c
-c formation des aretes simples du cf autour de l'arete ns1-ns2
-c attention: le chainage lchain du tableau nosoar devient actif
-c ============================================================
-c ici toutes les aretes du tableau nosoar verifient nosoar(lchain,i) = -1
-c ce qui equivaut a dire que l'etoile des aretes simples est vide
-c (initialisation dans le sp insoar puis remise a -1 dans la suite!)
- n1aeoc = 0
-c
-c ajout a l'etoile des aretes simples des 3 aretes des triangles a supprimer
-c suppression des triangles de l'etoile pour les aretes simples de l'etoile
- do 10 i=1,nbtrcf
-c ajout ou retrait des 3 aretes du triangle notrcf(i) de l'etoile
- nt = notrcf( i )
- do 5 j=1,3
-c l'arete de nosoar a traiter
- noar = abs( noartr(j,nt) )
- call caetoi( noar, mosoar, mxsoar, n1soar, nosoar,
- % n1aeoc, nbtrar )
-c si arete simple alors suppression du numero de triangle pour cette a
- if( nbtrar .eq. 1 ) then
- if( nosoar(4,noar) .eq. nt ) then
- nosoar(4,noar) = nosoar(5,noar)
- endif
- nosoar(5,noar) = -1
-c else
-c l'arete appartient a aucun triangle => elle est vide
-c les positions 4 et 5 servent maintenant aux chainages des vides
- endif
- 5 continue
- 10 continue
-c
-c les aretes simples de l'etoile sont reordonnees pour former une
-c ligne fermee = un contour ferme peripherique de l'etoile encore dit 1 cf
-c ========================================================================
- n1ae00 = n1aeoc
- 12 na1 = n1aeoc
-c la premiere arete du contour ferme
- ns0 = nosoar(1,na1)
- ns1 = nosoar(2,na1)
-c
-c l'arete est-elle dans le sens direct?
-c recherche de l'arete du triangle exterieur nt d'arete na1
- nt = nosoar(4,na1)
- if( nt .le. 0 ) nt = nosoar(5,na1)
-c
-c attention au cas de l'arete initiale frontaliere de no de triangles 0 et -
- if( nt .le. 0 ) then
-c permutation circulaire des aretes simples chainees
-c la premiere arete doit devenir la derniere du chainage,
-c la 2=>1, la 3=>2, ... , la derniere=>l'avant derniere, 1=>derniere
- n1aeoc = nosoar( lchain, n1aeoc )
- if( n1aeoc .eq. n1ae00 ) then
-c attention: boucle infinie si toutes les aretes simples
-c de la boule sont frontalieres!... arretee par ce test
- ierr = 16
- return
- endif
- noar = n1aeoc
- na0 = 0
- 14 if( noar .gt. 0 ) then
-c la sauvegarde de l'arete et l'arete suivante
- na0 = noar
- noar = nosoar(lchain,noar)
- goto 14
- endif
- if( na0 .le. 0 ) then
-c une seule arete simple frontaliere
- ierr = 15
- return
- endif
-c le suivant de l'ancien dernier est l'ancien premier
- nosoar(lchain,na0) = na1
-c le nouveau dernier est l'ancien premier
- nosoar(lchain,na1) = 0
- goto 12
- endif
-c
-c ici l'arete na1 est l'une des aretes du triangle nt
- do 15 i=1,3
- if( abs(noartr(i,nt)) .eq. na1 ) then
-c c'est l'arete
- if( noartr(i,nt) .gt. 0 ) then
-c elle est parcourue dans le sens indirect de l'etoile
-c (car c'est en fait le triangle exterieur a la boule)
- ns0 = nosoar(2,na1)
- ns1 = nosoar(1,na1)
- endif
- goto 17
- endif
- 15 continue
-c
-c le 1-er sommet ou arete du contour ferme
- 17 n1arcf( 1 ) = 1
-c le nombre de sommets du contour ferme de l'etoile
- nbarcf = 1
-c le premier sommet de l'etoile
- noarcf( 1, nbarcf ) = ns0
-c l'arete suivante du cf
- noarcf( 2, nbarcf ) = nbarcf + 1
-c le numero de cette arete dans le tableau nosoar
- noarcf( 3, nbarcf ) = na1
-c mise a jour du numero d'arete du sommet ns0
- noarst(ns0) = na1
-c
-cccc trace de l'arete
-ccc call dvtrar( pxyd, ns0, ns1, ncvert, ncblan )
-c
-c l'arete suivante a chainer
- n1aeoc = nosoar( lchain, na1 )
-c l'arete na1 n'est plus dans l'etoile
- nosoar( lchain, na1 ) = -1
-c
-c boucle sur les aretes simples de l'etoile
- 20 if( n1aeoc .gt. 0 ) then
-c
-c recherche de l'arete de 1-er sommet ns1
- na0 = -1
- na1 = n1aeoc
- 25 if( na1 .gt. 0 ) then
-c
-c le numero du dernier sommet de l'arete precedente
-c est il l'un des 2 sommets de l'arete na1?
- if ( ns1 .eq. nosoar(1,na1) ) then
-c l'autre sommet de l'arete na1
- ns2 = nosoar(2,na1)
- else if( ns1 .eq. nosoar(2,na1) ) then
-c l'autre sommet de l'arete na1
- ns2 = nosoar(1,na1)
- else
-c non: passage a l'arete suivante
- na0 = na1
- na1 = nosoar( lchain, na1 )
- goto 25
- endif
-c
-c oui: na1 est l'arete peripherique suivante
-c na0 est sa precedente dans le chainage
-c une arete de plus dans le contour ferme (cf)
- nbarcf = nbarcf + 1
-c le premier sommet de l'arete nbarcf peripherique
- noarcf( 1, nbarcf ) = ns1
-c l'arete suivante du cf
- noarcf( 2, nbarcf ) = nbarcf + 1
-c le numero de cette arete dans le tableau nosoar
- noarcf( 3, nbarcf ) = na1
-c mise a jour du numero d'arete du sommet ns1
- noarst(ns1) = na1
-c
-cccc trace de l'arete
-ccc call dvtrar( pxyd, ns1, ns2, ncvert, ncblan )
-c
-c suppression de l'arete des aretes simples de l'etoile
- if( n1aeoc .eq. na1 ) then
- n1aeoc = nosoar( lchain, na1 )
- else
- nosoar( lchain, na0 ) = nosoar( lchain, na1 )
- endif
-c l'arete n'est plus une arete simple de l'etoile
- nosoar( lchain, na1 ) = -1
-c
-c le sommet final de l'arete a rechercher ensuite
- ns1 = ns2
- goto 20
- endif
- endif
-c
-c verification
- if( ns1 .ne. ns0 ) then
-c arete non retrouvee : l'etoile ne se referme pas
-c nblgrc(nrerr) = 3
-c kerr(1) = 'focftr: revoyez vos donnees'
-c kerr(2) = 'les lignes fermees doivent etre disjointes'
-c kerr(3) = 'verifiez si elles ne se coupent pas'
-c call lereur
- write(imprim,*) 'focftr: revoyez vos donnees'
- write(imprim,*)'les lignes fermees doivent etre disjointes'
- write(imprim,*)'verifiez si elles ne se coupent pas'
- ierr = 14
- return
- endif
-c
-c l'arete suivant la derniere arete du cf est la premiere du cf
-c => realisation d'un chainage circulaire des aretes du cf
- noarcf( 2, nbarcf ) = 1
-c
-c destruction des triangles de l'etoile du tableau noartr
-c -------------------------------------------------------
- do 50 i=1,nbtrcf
-c le numero du triangle dans noartr
- nt0 = notrcf( i )
-c l'arete 1 de nt0 devient nulle
- noartr( 1, nt0 ) = 0
-c chainage de nt0 en tete du chainage des triangles vides de noartr
- noartr( 2, nt0 ) = n1artr
- n1artr = nt0
- 50 continue
- end
-
-
- subroutine int1sd( ns1, ns2, ns3, ns4, pxyd, linter, x0, y0 )
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c but : existence ou non d'une intersection a l'interieur
-c ----- des 2 aretes ns1-ns2 et ns3-ns4
-c attention les intersections au sommet sont comptees
-c
-c entrees:
-c --------
-c ns1,...ns4 : numero pxyd des 4 sommets
-c pxyd : les coordonnees des sommets
-c
-c sortie :
-c --------
-c linter : -1 si ns3-ns4 parallele a ns1 ns2
-c 0 si ns3-ns4 n'intersecte pas ns1-ns2 entre les aretes
-c 1 si ns3-ns4 intersecte ns1-ns2 entre les aretes
-c 2 si le point d'intersection est ns1 entre ns3-ns4
-c 3 si le point d'intersection est ns3 entre ns1-ns2
-c 4 si le point d'intersection est ns4 entre ns1-ns2
-c x0,y0 : 2 coordonnees du point d'intersection s'il existe(linter>=1)
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c auteur : alain perronnet analyse numerique paris upmc fevrier 1992
-c2345x7..............................................................012
- parameter ( epsmoi=-0.000001d0, eps=0.001d0,
- % unmeps= 0.999d0, unpeps=1.000001d0 )
- double precision pxyd(3,*), x0, y0
- double precision x1,y1,x21,y21,d21,x43,y43,d43,d,x,y,p21,p43
-c
- x1 = pxyd(1,ns1)
- y1 = pxyd(2,ns1)
- x21 = pxyd(1,ns2) - x1
- y21 = pxyd(2,ns2) - y1
- d21 = x21**2 + y21**2
-c
- x43 = pxyd(1,ns4) - pxyd(1,ns3)
- y43 = pxyd(2,ns4) - pxyd(2,ns3)
- d43 = x43**2 + y43**2
-c
-c les 2 aretes sont-elles jugees paralleles ?
- d = x43 * y21 - y43 * x21
- if( d*d .le. 0.000001d0 * d21 * d43 ) then
-c cote i parallele a ns1-ns2
- linter = -1
- return
- endif
-c
-c les 2 coordonnees du point d'intersection
- x =( x1*x43*y21-pxyd(1,ns3)*x21*y43-(y1-pxyd(2,ns3))*x21*x43)/d
- y =(-y1*y43*x21+pxyd(2,ns3)*y21*x43+(x1-pxyd(1,ns3))*y21*y43)/d
-c
-c coordonnee barycentrique de x,y dans le repere ns1-ns2
- p21 = ( ( x - x1 ) * x21 + ( y - y1 ) * y21 ) / d21
-c coordonnee barycentrique de x,y dans le repere ns3-ns4
- p43 = ( (x - pxyd(1,ns3))* x43 + (y - pxyd(2,ns3)) * y43 ) / d43
-c
-c
- if( epsmoi .le. p21 .and. p21 .le. unpeps ) then
-c x,y est entre ns1-ns2
- if( (p21 .le. eps) .and.
- % (epsmoi .le. p43 .and. p43 .le. unpeps) ) then
-c le point x,y est proche de ns1 et interne a ns3-ns4
- linter = 2
- x0 = pxyd(1,ns1)
- y0 = pxyd(2,ns1)
- return
- else if( epsmoi .le. p43 .and. p43 .le. eps ) then
-c le point x,y est proche de ns3 et entre ns1-ns2
- linter = 3
- x0 = pxyd(1,ns3)
- y0 = pxyd(2,ns3)
- return
- else if( unmeps .le. p43 .and. p43 .le. unpeps ) then
-c le point x,y est proche de ns4 et entre ns1-ns2
- linter = 4
- x0 = pxyd(1,ns4)
- y0 = pxyd(2,ns4)
- return
- else if( eps .le. p43 .and. p43 .le. unmeps ) then
-c le point x,y est entre ns3-ns4
- linter = 1
- x0 = x
- y0 = y
- return
- endif
- endif
-c
-c pas d'intersection a l'interieur des aretes
- linter = 0
- end
-
-
- subroutine tefoar( narete, nbarpi, pxyd,
- % mosoar, mxsoar, n1soar, nosoar,
- % moartr, n1artr, noartr, noarst,
- % mxarcf, n1arcf, noarcf, larmin, notrcf,
- % ierr )
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c but : forcer l'arete narete de nosoar dans la triangulation actuelle
-c ----- triangulation frontale pour la reobtenir
-c
-c attention: le chainage lchain(=6) de nosoar devient actif
-c durant la formation des contours fermes (cf)
-c
-c entrees:
-c --------
-c narete : numero nosoar de l'arete frontaliere a forcer
-c nbarpi : numero du dernier point interne impose par l'utilisateur
-c pxyd : tableau des coordonnees 2d des points
-c par point : x y distance_souhaitee
-c
-c mosoar : nombre maximal d'entiers par arete et
-c indice dans nosoar de l'arete suivante dans le hachage
-c mxsoar : nombre maximal d'aretes stockables dans le tableau nosoar
-c attention: mxsoar>3*mxsomm obligatoire!
-c moartr : nombre maximal d'entiers par arete du tableau noartr
-c
-c modifies:
-c ---------
-c n1soar : no de l'eventuelle premiere arete libre dans le tableau nosoar
-c chainage des vides suivant en 3 et precedant en 2 de nosoar
-c nosoar : numero des 2 sommets , no ligne, 2 triangles de l'arete,
-c chainage des aretes frontalieres, chainage du hachage des aretes
-c hachage des aretes = nosoar(1)+nosoar(2)*2
-c avec mxsoar>=3*mxsomm
-c une arete i de nosoar est vide <=> nosoar(1,i)=0 et
-c nosoar(2,arete vide)=l'arete vide qui precede
-c nosoar(3,arete vide)=l'arete vide qui suit
-c n1artr : numero du premier triangle vide dans le tableau noartr
-c le chainage des triangles vides se fait sur noartr(2,.)
-c noartr : les 3 aretes des triangles +-arete1, +-arete2, +-arete3
-c arete1 = 0 si triangle vide => arete2 = triangle vide suivant
-c noarst : noarst(i) numero d'une arete de sommet i
-c
-c mxarcf : nombre de variables des tableaux n1arcf, noarcf, larmin, notrcf
-c
-c tableaux auxiliaires :
-c ----------------------
-c n1arcf : tableau (0:mxarcf) auxiliaire
-c noarcf : tableau (3,mxarcf) auxiliaire
-c larmin : tableau (mxarcf) auxiliaire
-c notrcf : tableau (1:mxarcf) auxiliaire
-c
-c sortie :
-c --------
-c ierr : 0 si pas d'erreur
-c 1 saturation des sommets
-c 2 ns1 dans aucun triangle
-c 9 tableau nosoar de taille insuffisante car trop d'aretes
-c a probleme
-c 10 un des tableaux n1arcf, noarcf notrcf est sature
-c augmenter a l'appel mxarcf
-c 11 algorithme defaillant
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c auteur : alain perronnet analyse numerique paris upmc mars 1997
-c....................................................................012
- parameter (mxpitr=32)
- common / unites / lecteu,imprim,intera,nunite(29)
- logical tratri
- common / dv2dco / tratri
- double precision pxyd(3,*)
- integer noartr(moartr,*),
- % nosoar(mosoar,mxsoar),
- % noarst(*),
- % n1arcf(0:mxarcf),
- % noarcf(3,mxarcf),
- % larmin(mxarcf),
- % notrcf(mxarcf)
-c
- integer lapitr(mxpitr)
- double precision x1,y1,x2,y2,d12,d3,d4,x,y,d,dmin
- integer nosotr(3), ns(2)
- integer nacf(1:2), nacf1, nacf2
- equivalence (nacf(1),nacf1), (nacf(2),nacf2)
-c
-c traitement de cette arete perdue
- ns1 = nosoar( 1, narete )
- ns2 = nosoar( 2, narete )
-c
- if( tratri ) then
-c les traces sont demandes
-c call efface
-c le cadre objet global en unites utilisateur
- xx1 = min( pxyd(1,ns1), pxyd(1,ns2) )
- xx2 = max( pxyd(1,ns1), pxyd(1,ns2) )
- yy1 = min( pxyd(2,ns1), pxyd(2,ns2) )
- yy2 = max( pxyd(2,ns1), pxyd(2,ns2) )
- if( xx1 .ge. xx2 ) xx2 = xx1 + (yy2-yy1)
- if( yy1 .ge. yy2 ) yy2 = yy1 + (xx2-xx1)*0.5
-c call isofenetre( xx1-(xx2-xx1), xx2+(xx2-xx1),
-c % yy1-(yy2-yy1), yy2+(yy2-yy1) )
- endif
-c
-cccc trace de l'arete perdue
-ccc call dvtrar( pxyd, ns1, ns2, ncroug, ncblan )
-c
-c le sommet ns2 est il correct?
- na = noarst( ns2 )
- if( na .le. 0 ) then
- write(imprim,*) 'tefoar: erreur sommet ',ns2,' sans arete'
- ierr = 8
- return
- endif
- if( nosoar(4,na) .le. 0 ) then
- write(imprim,*) 'tefoar: erreur sommet ',ns2,
- % ' dans aucun triangle'
- ierr = 8
- return
- endif
-c
-c recherche du triangle voisin dans le sens indirect de rotation
- nsens = -1
-c le premier passage: recherche dans le sens ns1->ns2
- ipas = 0
-c
-c recherche des triangles intersectes par le segment ns1-ns2
-c ==========================================================
- 3 x1 = pxyd(1,ns1)
- y1 = pxyd(2,ns1)
- x2 = pxyd(1,ns2)
- y2 = pxyd(2,ns2)
- d12 = (x2-x1)**2 + (y2-y1)**2
-c
-c recherche du no local du sommet ns1 dans l'un de ses triangles
- na01 = noarst( ns1 )
- if( na01 .le. 0 ) then
- write(imprim,*) 'tefoar: sommet ',ns1,' sans arete'
- ierr = 8
- return
- endif
- nt0 = nosoar(4,na01)
- if( nt0 .le. 0 ) then
- write(imprim,*) 'tefoar: sommet ',ns1,' dans aucun triangle'
- ierr = 8
- return
- endif
-c
-c le numero des 3 sommets du triangle nt0 dans le sens direct
- 20 call nusotr( nt0, mosoar, nosoar, moartr, noartr, nosotr )
- do 22 na00=1,3
- if( nosotr(na00) .eq. ns1 ) goto 26
- 22 continue
-c
- 25 if( ipas .eq. 0 ) then
-c le second passage: recherche dans le sens ns2->ns1
-c tentative d'inversion des 2 sommets extremites de l'arete a forcer
- na00 = ns1
- ns1 = ns2
- ns2 = na00
- ipas = 1
- goto 3
- else
-c les sens ns1->ns2 et ns2->ns1 ne donne pas de solution!
- write(imprim,*)'tefoar:arete ',ns1,' - ',ns2,' a imposer'
- write(imprim,*)'tefoar:anomalie sommet ',ns1,
- % 'non dans le triangle de sommets ',(nosotr(i),i=1,3)
- ierr = 11
- return
- endif
-c
-c le numero des aretes suivante et precedente
- 26 na0 = nosui3( na00 )
- na1 = nopre3( na00 )
- ns3 = nosotr( na0 )
- ns4 = nosotr( na1 )
-c
-cccc trace du triangle nt0 et de l'arete perdue
-ccc call mttrtr( pxyd, nt0, moartr, noartr, mosoar, nosoar,
-ccc % ncblan, ncjaun )
-ccc call dvtrar( pxyd, ns1, ns2, ncroug, ncblan )
-ccc call dvtrar( pxyd, ns3, ns4, ncbleu, nccyan )
-c
-c point d'intersection du segment ns1-ns2 avec l'arete ns3-ns4
-c ------------------------------------------------------------
- call int1sd( ns1, ns2, ns3, ns4, pxyd, linter, x1, y1 )
- if( linter .le. 0 ) then
-c
-c pas d'intersection: rotation autour du point ns1
-c pour trouver le triangle de l'autre cote de l'arete na01
- if( nsens .lt. 0 ) then
-c sens indirect de rotation: l'arete de sommet ns1
- na01 = abs( noartr(na00,nt0) )
- else
-c sens direct de rotation: l'arete de sommet ns1 qui precede
- na01 = abs( noartr(na1,nt0) )
- endif
-c le triangle de l'autre cote de l'arete na01
- if( nosoar(4,na01) .eq. nt0 ) then
- nt0 = nosoar(5,na01)
- else
- nt0 = nosoar(4,na01)
- endif
- if( nt0 .gt. 0 ) goto 20
-c
-c le parcours sort du domaine
-c il faut tourner dans l'autre sens autour de ns1
- if( nsens .lt. 0 ) then
- nsens = 1
- nt0 = noarst( ns1 )
- goto 20
- endif
-c
-c dans les 2 sens, pas d'intersection => impossible
-c essai avec l'arete inversee ns1 <-> ns2
- if( ipas .eq. 0 ) goto 25
- write(imprim,*) 'tefoar: arete ',ns1,' ',ns2,
- % ' sans intersection avec les triangles actuels'
- write(imprim,*) 'revoyez les lignes du contour'
- ierr = 11
- return
- endif
-c
-c il existe une intersection avec l'arete opposee au sommet ns1
-c =============================================================
-c nbtrcf : nombre de triangles du cf
- nbtrcf = 1
- notrcf( 1 ) = nt0
-c
-c le triangle oppose a l'arete na0 de nt0
- 30 noar = abs( noartr(na0,nt0) )
- if( nosoar(4,noar) .eq. nt0 ) then
- nt1 = nosoar(5,noar)
- else
- nt1 = nosoar(4,noar)
- endif
-c
-cccc trace du triangle nt1 et de l'arete perdue
-ccc call mttrtr( pxyd, nt1, moartr, noartr, mosoar, nosoar,
-ccc % ncjaun, ncmage )
-ccc call dvtrar( pxyd, ns1, ns2, ncroug, ncblan )
-c
-c le numero des 3 sommets du triangle nt1 dans le sens direct
- call nusotr( nt1, mosoar, nosoar, moartr, noartr, nosotr )
-c
-c le triangle nt1 contient il ns2 ?
- do 32 j=1,3
- if( nosotr(j) .eq. ns2 ) goto 70
- 32 continue
-c
-c recherche de l'arete noar, na1 dans nt1 qui est l'arete na0 de nt0
- do 34 na1=1,3
- if( abs( noartr(na1,nt1) ) .eq. noar ) goto 35
- 34 continue
-c
-c trace du triangle nt1 et de l'arete perdue
- 35 continue
-ccc 35 call mttrtr( pxyd, nt1, moartr, noartr, mosoar, nosoar,
-ccc % ncjaun, ncmage )
-ccc call dvtrar( pxyd, ns1, ns2, ncroug, ncblan )
-c
-c recherche de l'intersection de ns1-ns2 avec les 2 autres aretes de nt1
-c ======================================================================
- na2 = na1
- do 50 i1 = 1,2
-c l'arete suivante
- na2 = nosui3(na2)
-c
-c les 2 sommets de l'arete na2 de nt1
- noar = abs( noartr(na2,nt1) )
- ns3 = nosoar( 1, noar )
- ns4 = nosoar( 2, noar )
-ccc call dvtrar( pxyd, ns3, ns4, ncbleu, nccyan )
-c
-c point d'intersection du segment ns1-ns2 avec l'arete ns3-ns4
-c ------------------------------------------------------------
- call int1sd( ns1, ns2, ns3, ns4, pxyd, linter, x , y )
- if( linter .gt. 0 ) then
-c
-c les 2 aretes s'intersectent en (x,y)
-c distance de (x,y) a ns3 et ns4
- d3 = (pxyd(1,ns3)-x)**2 + (pxyd(2,ns3)-y)**2
- d4 = (pxyd(1,ns4)-x)**2 + (pxyd(2,ns4)-y)**2
-c nsp est le point le plus proche de (x,y)
- if( d3 .lt. d4 ) then
- nsp = ns3
- d = d3
- else
- nsp = ns4
- d = d4
- endif
- if( d .gt. 1d-5*d12 ) goto 60
-c
-c ici le sommet nsp est trop proche de l'arete perdue ns1-ns2
- if( nsp .le. nbarpi ) then
-c point utilisateur ou frontalier non supprimable
- ierr = 11
- write(imprim,*) 'pause dans tefoar 1', d, d3, d4, d12
- return
- endif
-c
-c le sommet interne nsp est supprime en mettant tous les triangles
-c l'ayant comme sommet dans la pile notrcf des triangles a supprimer
-c ------------------------------------------------------------------
-ccc write(imprim,*) 'tefoar: le sommet ',nsp,' est supprime'
-c construction de la liste des triangles de sommet nsp
- call trp1st( nsp, noarst, mosoar, nosoar, moartr, noartr,
- % mxpitr, nbt, lapitr )
- if( nbt .le. 0 ) then
-c les triangles de sommet nsp ne forme pas une "boule"
-c avec ce sommet nsp pour "centre"
- write(imprim,*)
- % 'tefoar: pas d''etoile de triangles autour du sommet',nsp
-cccc trace des triangles de l'etoile du sommet nsp
-ccc tratri = .true.
-ccc call trpltr( nbt, lapitr, pxyd,
-ccc % moartr, noartr, mosoar, nosoar,
-ccc % ncroug, ncblan )
-ccc tratri = .false.
- ierr = 11
- write(imprim,*) 'pause dans tefoar 2'
- return
- endif
-c
-c ajout des triangles de sommet ns1 a notrcf
- nbtrc0 = nbtrcf
- do 38 j=1,nbt
- nt = lapitr(j)
- do 37 k=nbtrcf,1,-1
- if( nt .eq. notrcf(k) ) goto 38
- 37 continue
-c triangle ajoute
- nbtrcf = nbtrcf + 1
- notrcf( nbtrcf ) = nt
-ccc call mttrtr( pxyd, nt, moartr, noartr, mosoar, nosoar,
-ccc % ncjaun, ncmage )
-ccc call dvtrar( pxyd, ns1, ns2, ncroug, ncblan )
- 38 continue
-c
-c ce sommet supprime n'appartient plus a aucun triangle
- noarst( nsp ) = 0
-c
-c ns2 est-il un sommet des triangles empiles?
-c -------------------------------------------
- do 40 nt=nbtrc0+1,nbtrcf
-c le triangle a supprimer nt
- nt1 = notrcf( nt )
-c le numero des 3 sommets du triangle nt1 dans le sens direct
- call nusotr( nt1, mosoar, nosoar, moartr, noartr, nosotr)
- do 39 k=1,3
-c le sommet k de nt1
- if( nosotr( k ) .eq. ns2 ) then
-c but atteint
- goto 80
- endif
- 39 continue
- 40 continue
-c
-c recherche du plus proche point d'intersection de ns1-ns2
-c par rapport a ns2 avec les aretes des triangles ajoutes
- nt0 = 0
- dmin = d12 * 10000
- do 48 nt=nbtrc0+1,nbtrcf
- nt1 = notrcf( nt )
-c le numero des 3 sommets du triangle nt1 dans le sens direct
- call nusotr( nt1, mosoar, nosoar, moartr, noartr, nosotr)
- do 45 k=1,3
-c les 2 sommets de l'arete k de nt
- ns3 = nosotr( k )
- ns4 = nosotr( nosui3(k) )
-c
-c point d'intersection du segment ns1-ns2 avec l'arete ns3-ns4
-c ------------------------------------------------------------
- call int1sd( ns1, ns2, ns3, ns4, pxyd,
- % linter, x , y )
- if( linter .gt. 0 ) then
-c les 2 aretes s'intersectent en (x,y)
- d = (x-x2)**2+(y-y2)**2
- if( d .lt. dmin ) then
- nt0 = nt1
- na0 = k
- dmin = d
- endif
- endif
- 45 continue
- 48 continue
-c
-c redemarrage avec le triangle nt0 et l'arete na0
- if( nt0 .gt. 0 ) goto 30
-c
- write(imprim,*) 'tefoar: algorithme defaillant'
- ierr = 11
- return
- endif
- 50 continue
-c
-c pas d'intersection differente de l'initiale => sommet sur ns1-ns2
-c rotation autour du sommet par l'arete suivant na1
- write(imprim,*)
- write(imprim,*) 'tefoar 50: revoyez vos donnees'
- write(imprim,*) 'les lignes fermees doivent etre disjointes'
- write(imprim,*) 'verifiez si elles ne se coupent pas'
- ierr = 13
- return
-c
-c cas sans probleme : intersection differente de celle initiale
-c ================= =========================================
- 60 nbtrcf = nbtrcf + 1
- notrcf( nbtrcf ) = nt1
-c passage au triangle suivant
- na0 = na2
- nt0 = nt1
- goto 30
-c
-c ----------------------------------------------------------
-c ici toutes les intersections de ns1-ns2 ont ete parcourues
-c tous les triangles intersectes ou etendus forment les
-c nbtrcf triangles du tableau notrcf
-c ----------------------------------------------------------
- 70 nbtrcf = nbtrcf + 1
- notrcf( nbtrcf ) = nt1
-c
-c formation du cf des aretes simples des triangles de notrcf
-c et destruction des nbtrcf triangles du tableau noartr
-c attention: le chainage lchain du tableau nosoar devient actif
-c =============================================================
- 80 if( nbtrcf*3 .gt. mxarcf ) then
- write(imprim,*) 'saturation du tableau noarcf'
- ierr = 10
- return
- endif
-c
- call focftr( nbtrcf, notrcf, pxyd, noarst,
- % mosoar, mxsoar, n1soar, nosoar,
- % moartr, n1artr, noartr,
- % nbarcf, n1arcf, noarcf,
- % ierr )
- if( ierr .ne. 0 ) return
-c
-c chainage des aretes vides dans le tableau noarcf
-c ------------------------------------------------
-c decalage de 2 aretes car 2 aretes sont necessaires ensuite pour
-c integrer 2 fois l'arete perdue et former ainsi 2 cf
-c comme nbtrcf*3 minore mxarcf il existe au moins 2 places vides
-c derriere => pas de test de debordement
- n1arcf(0) = nbarcf+3
- mmarcf = min(8*nbarcf,mxarcf)
- do 90 i=nbarcf+3,mmarcf
- noarcf(2,i) = i+1
- 90 continue
- noarcf(2,mmarcf) = 0
-c
-c reperage des sommets ns1 ns2 de l'arete perdue dans le cf
-c ---------------------------------------------------------
- ns1 = nosoar( 1, narete )
- ns2 = nosoar( 2, narete )
- ns(1) = ns1
- ns(2) = ns2
- do 120 i=1,2
-c la premiere arete dans noarcf du cf
- na0 = n1arcf(1)
- 110 if( noarcf(1,na0) .ne. ns(i) ) then
-c passage a l'arete suivante
- na0 = noarcf( 2, na0 )
- goto 110
- endif
-c position dans noarcf du sommet i de l'arete perdue
- nacf(i) = na0
- 120 continue
-c
-c formation des 2 cf chacun contenant l'arete ns1-ns2
-c ---------------------------------------------------
-c sauvegarde de l'arete suivante de celle de sommet ns1
- na0 = noarcf( 2, nacf1 )
- nt1 = noarcf( 3, nacf1 )
-c
-c le premier cf
- n1arcf( 1 ) = nacf1
-c l'arete suivante dans le premier cf
- noarcf( 2, nacf1 ) = nacf2
-c cette arete est celle perdue
- noarcf( 3, nacf1 ) = narete
-c
-c le second cf
-c l'arete doublee
- n1 = nbarcf + 1
- n2 = nbarcf + 2
-c le premier sommet de la premiere arete du second cf
- noarcf( 1, n1 ) = ns2
-c l'arete suivante dans le second cf
- noarcf( 2, n1 ) = n2
-c cette arete est celle perdue
- noarcf( 3, n1 ) = narete
-c la seconde arete du second cf
- noarcf( 1, n2 ) = ns1
- noarcf( 2, n2 ) = na0
- noarcf( 3, n2 ) = nt1
- n1arcf( 2 ) = n1
-c
-c recherche du precedent de nacf2
- 130 na1 = noarcf( 2, na0 )
- if( na1 .ne. nacf2 ) then
-c passage a l'arete suivante
- na0 = na1
- goto 130
- endif
-c na0 precede nacf2 => il precede n1
- noarcf( 2, na0 ) = n1
-c
-c depart avec 2 cf
- nbcf = 2
-c
-c triangulation directe des 2 contours fermes
-c l'arete ns1-ns2 devient une arete de la triangulation des 2 cf
-c ==============================================================
- call tridcf( nbcf, pxyd, noarst,
- % mosoar, mxsoar, n1soar, nosoar,
- % moartr, n1artr, noartr,
- % mxarcf, n1arcf, noarcf, larmin,
- % nbtrcf, notrcf, ierr )
- end
-
-
- subroutine te4ste( nbsomm, mxsomm, pxyd, ntrp, letree,
- & ierr )
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c but : decouper un te ntrp de letree en 4 sous-triangles
-c ----- eliminer les sommets de te trop proches des points
-c
-c entrees:
-c --------
-c mxsomm : nombre maximal de points declarables dans pxyd
-c ntrp : numero letree du triangle a decouper en 4 sous-triangles
-c
-c modifies :
-c ----------
-c nbsomm : nombre actuel de points dans pxyd
-c pxyd : tableau des coordonnees des points
-c par point : x y distance_souhaitee
-c letree : arbre-4 des triangles equilateraux (te) fond de la triangulation
-c letree(0,0) : no du 1-er te vide dans letree
-c letree(0,1) : maximum du 1-er indice de letree (ici 8)
-c letree(0,2) : maximum declare du 2-eme indice de letree (ici mxtree)
-c letree(0:8,1) : racine de l'arbre (triangle sans sur triangle)
-c si letree(0,.)>0 alors
-c letree(0:3,j) : no (>0) letree des 4 sous-triangles du triangle j
-c sinon
-c letree(0:3,j) :-no pxyd des 1 a 4 points internes au triangle j
-c 0 si pas de point
-c ( j est alors une feuille de l'arbre )
-c letree(4,j) : no letree du sur-triangle du triangle j
-c letree(5,j) : 0 1 2 3 no du sous-triangle j pour son sur-triangle
-c letree(6:8,j) : no pxyd des 3 sommets du triangle j
-c
-c sorties :
-c ---------
-c ierr : 0 si pas d'erreur, 51 saturation letree, 52 saturation pxyd
-c+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-c auteur : alain perronnet analyse numerique paris upmc juillet 1994
-c2345x7..............................................................012
- common / unites / lecteu,imprim,nunite(30)
- integer letree(0:8,0:*)
- double precision pxyd(3,mxsomm)
- integer np(0:3),milieu(3)
-c
-c debut par l'arete 2 du triangle ntrp
- i1 = 2
- i2 = 3
- do 30 i=1,3
-c
-c le milieu de l'arete i1 existe t il deja ?
- call n1trva( ntrp, i1, letree, noteva, niveau )
- if( noteva .gt. 0 ) then
-c il existe un te voisin
-c s'il existe 4 sous-triangles le milieu existe deja
- if( letree(0,noteva) .gt. 0 ) then
-c le milieu existe
- nsot = letree(0,noteva)
- milieu(i) = letree( 5+nopre3(i1), nsot )
- goto 25
- endif
- endif
-c
-c le milieu n'existe pas. il est cree
- nbsomm = nbsomm + 1
- if( nbsomm .gt. mxsomm ) then
-c plus assez de place dans pxyd
- write(imprim,*) 'te4ste: saturation pxyd'
- write(imprim,*)
- ierr = 52
- return
- endif
-c le milieu de l'arete i
- milieu(i) = nbsomm
-c
-c ntrp est le triangle de milieux d'arete ces 3 sommets
- ns1 = letree( 5+i1, ntrp )
- ns2 = letree( 5+i2, ntrp )
- pxyd(1,nbsomm) = ( pxyd(1,ns1) + pxyd(1,ns2) ) * 0.5
- pxyd(2,nbsomm) = ( pxyd(2,ns1) + pxyd(2,ns2) ) * 0.5
-c
-c l'arete et milieu suivant
- 25 i1 = i2
- i2 = nosui3( i2 )
- 30 continue
-c
- do 50 i=0,3
-c
-c le premier triangle vide
- nsot = letree(0,0)
- if( nsot .le. 0 ) then
-c manque de place. saturation letree
- ierr = 51
- write(imprim,*) 'te4ste: saturation letree'
- write(imprim,*)
- return
- endif
-c
-c mise a jour du premier te libre
- letree(0,0) = letree(0,nsot)
-c
-c nsot est le i-eme sous triangle
- letree(0,nsot) = 0
- letree(1,nsot) = 0
- letree(2,nsot) = 0
- letree(3,nsot) = 0
-c
-c le numero des points et sous triangles dans ntrp
- np(i) = -letree(i,ntrp)
- letree(i,ntrp) = nsot
-c
-c le sommet commun avec le triangle ntrp
- letree(5+i,nsot) = letree(5+i,ntrp)
-c
-c le sur-triangle et numero de sous-triangle de nsot
-c a laisser ici car incorrect sinon pour i=0
- letree(4,nsot) = ntrp
- letree(5,nsot) = i
-c
-c le sous-triangle du triangle
- letree(i,ntrp) = nsot
- 50 continue
-c
-c le numero des nouveaux sommets milieux
- nsot = letree(0,ntrp)
- letree(6,nsot) = milieu(1)
- letree(7,nsot) = milieu(2)
- letree(8,nsot) = milieu(3)
-c
- nsot = letree(1,ntrp)
- letree(7,nsot) = milieu(3)
- letree(8,nsot) = milieu(2)
-c
- nsot = letree(2,ntrp)
- letree(6,nsot) = milieu(3)
- letree(8,nsot) = milieu(1)
-c
- nsot = letree(3,ntrp)
- letree(6,nsot) = milieu(2)
- letree(7,nsot) = milieu(1)
-c
-c repartition des eventuels 4 points np dans ces 4 sous-triangles
-c il y a obligatoirement suffisamment de place
- do 110 i=0,3
- if( np(i) .gt. 0 ) then
- nsot = notrpt( pxyd(1,np(i)), pxyd, ntrp, letree )
-c ajout du point
- do 100 i1=0,3
- if( letree(i1,nsot) .eq. 0 ) then
-c place libre a occuper
- letree(i1,nsot) = -np(i)
- goto 110
- endif
- 100 continue
- endif
- 110 continue
- end
+++ /dev/null
-# Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-#
-# See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-#
-#
-#
-# File : Makefile.in
-# Author : Patrick GOLDBRONN (CEA)
-# Module : SMESH
-# $Header$
-
-top_srcdir=@top_srcdir@
-top_builddir=..
-srcdir=@srcdir@
-VPATH=.:@srcdir@
-
-@COMMENCE@
-
-SUBDIRS = \
- SMDS SMESHDS Controls Driver DriverMED DriverDAT DriverUNV DriverSTL \
- SMESH SMESH_I OBJECT SMESHFiltersSelection SMESHGUI SMESH_SWIG \
- MEFISTO2 StdMeshers StdMeshers_I StdMeshersGUI
-
-@MODULE@
+++ /dev/null
-# -* Makefile *-
-#
-# Author : Nadir Bouhamou (CEA)
-# Module : SMESH
-# Date : 10/10/2003
-#
-#
-
-# source path
-top_srcdir=@top_srcdir@
-top_builddir=../..
-srcdir=@srcdir@
-VPATH=.:@srcdir@
-
-@COMMENCE@
-
-# Libraries targets
-LIB = libNETGEN.la
-
-# additionnal information to compil and link file
-CPPFLAGS += -DSOLIDGEOM -DLINUX $(OCC_INCLUDES)
-CXXFLAGS += -DSOLIDGEOM -DLINUX $(OCC_CXXFLAGS)
-
-LDFLAGS += $(OCC_KERNEL_LIBS) $(OCC_MODELER_LIBS) -lg2c
-
-NETGEN_LIBS_DIR=@NETGEN_LIBS_DIR@
-
-LIB_OBJ_O = linopt.o \
- bfgs.o \
- linsearch.o \
- global.o \
- bisect.o \
- meshtool.o \
- refine.o \
- ruler3.o \
- improve3.o \
- adfront3.o \
- tetrarls.o \
- prism2rls.o \
- pyramidrls.o \
- pyramid2rls.o \
- netrule3.o \
- ruler2.o \
- meshclass.o \
- improve2.o \
- adfront2.o \
- netrule2.o \
- triarls.o \
- geomsearch.o \
- secondorder.o \
- meshtype.o \
- parser3.o \
- quadrls.o \
- specials.o \
- parser2.o \
- meshing2.o \
- meshing3.o \
- meshfunc.o \
- localh.o \
- improve2gen.o \
- delaunay.o \
- boundarylayer.o \
- msghandler.o \
- meshfunc2d.o \
- smoothing2.o \
- smoothing3.o \
- topology.o \
- curvedelems.o \
- clusters.o \
- zrefine.o \
- ngexception.o \
- geomtest3d.o \
- geom2d.o \
- geom3d.o \
- adtree.o \
- transform3d.o \
- geomfuncs.o \
- polynomial.o \
- densemat.o \
- vector.o \
- basemat.o \
- sparsmat.o \
- algprim.o \
- brick.o \
- manifold.o \
- bspline2d.o \
- meshsurf.o \
- csgeom.o \
- polyhedra.o \
- curve2d.o \
- singularref.o \
- edgeflw.o \
- solid.o \
- explicitcurve2d.o \
- specpoin.o \
- gencyl.o \
- revolution.o \
- genmesh.o \
- spline3d.o \
- surface.o \
- identify.o \
- triapprox.o \
- meshstlsurface.o \
- stlline.o \
- stltopology.o \
- stltool.o \
- stlgeom.o \
- stlgeomchart.o \
- stlgeommesh.o \
- table.o \
- optmem.o \
- spbita2d.o \
- hashtabl.o \
- sort.o \
- flags.o \
- seti.o \
- bitarray.o \
- array.o \
- symbolta.o \
- mystring.o \
- moveablemem.o \
- spline2d.o \
- splinegeometry2.o \
- ngnewdelete.o \
- nglib.o
-
-$(LIB_OBJ_O):
- ar x $(NETGEN_LIBS_DIR)/libnginterface.a
- ar x $(NETGEN_LIBS_DIR)/libcsg.a
- ar x $(NETGEN_LIBS_DIR)/libgprim.a
- ar x $(NETGEN_LIBS_DIR)/libmesh.a
- ar x $(NETGEN_LIBS_DIR)/libopti.a
- ar x $(NETGEN_LIBS_DIR)/libgen.a
- ar x $(NETGEN_LIBS_DIR)/libla.a
- ar x $(NETGEN_LIBS_DIR)/libstlgeom.a
- ar x $(NETGEN_LIBS_DIR)/libgeom2d.a
- rm -rf sgparser.o hprefinement.o parthreads.o writediffpack.o writepermas.o writeuser.o dynamicmem.o importsolution.o readuser.o writefeap.o writetecplot.o wuchemnitz.o extrusion.o writeabaqus.o writefluent.o writetochnog.o csgparser.o geom2dmesh.o
-
-LIB_OBJ_LO = $(LIB_OBJ_O:%.o=%.lo)
-
-#implicits rules
-
-.o.lo:
- ln -s $< $@ || true
-
-@CONCLUDE@
-
-$(LIB): $(LIB_OBJ_O) $(LIB_OBJ_LO)
- @$(LT) --mode=link $(CXX) -rpath $(libdir) -o $@ $(CXXFLAGS) $(LIB_OBJ_LO) $(LDFLAGS) $(LIBS)
-
-mostlyclean: cleandep
- -$(RM) $(LIB_OBJ_O) $(LIB_OBJ_LO)
+++ /dev/null
-The Netgen 4.3 from the web location : http://www.hpfem.jku.at/netgen/ is used
-in the SMESH Module of Salome2 distribution.
-
-How to build Netgen for Salome
-------------------------------
-
-Patch the official netgen 4.3 distribution:
-
-$ cd netgen43
-$ patch -p1 < patch_directory/netgen43ForSalome.patch
-
-Then run makeForSalome.sh:
-$ sh makeForSalome.sh
-
-
-Additional information for maintainers
---------------------------------------
-
-The SMESH Engine of SALOME2 (particularly the m4 file check_Netgen.m4) assume
-that Netgen is installed in the directory <netgen_installation_path> as follow:
-
-prompt> ls <netgen_installation_path>
-
-bin/ cshrc_for_netgen doc/ include/ lib/ tutorials/
-
-prompt> ls <netgen_installation_path>/bin
-
-LINUX/
-
-prompt> ls <netgen_installation_path>/bin/LINUX/
-
-demoapp/ ng ng.tcl ngtcltk/ startup.tcl
-
-prompt> ls <netgen_installation_path>/bin/LINUX/demoapp/
-
-demoapp.tcl
-
-prompt> ls <netgen_installation_path>/bin/LINUX/ngtcltk/
-
-dialog.tcl menustat.tcl ngicon.tcl parameters.tcl
-drawing.tcl nghelp.tcl ngvisual.tcl variables.tcl
-
-prompt> ls <netgen_installation_path>/doc/
-
-ng4.pdf usenetgen.ps
-
-prompt> ls <netgen_installation_path>/include/
-
-nglib.h
-
-prompt> ls <netgen_installation_path>/lib/
-
-LINUX/
-
-prompt> ls <netgen_installation_path>/lib/LINUX/
-
-libcsg.a libgeom2d.a libla.a libnginterface.a libstlgeom.a
-libgen.a libgprim.a libmesh.a libopti.a libvis.a
-
-prompt> ls <netgen_installation_path>/tutorials/
-
-boxcyl.geo cylinder.geo ficherea.geo part1.stl square.in2d
-cone.geo cylsphere.geo hinge.stl sculpture.geo trafo.geo
-cubeandspheres.geo demo2d.in2d lshape3d.geo shaft.geo twobricks.geo
-cube.geo ellipsoid.geo manyholes.geo sphere.geo twocubes.geo
-cubemcyl.geo ellipticcyl.geo matrix.geo sphereincube.geo twocyl.geo
-cubemsphere.geo
-
-All *.tcl files are needed to control and initiate the Netgen mesher throughout its
-MHI (Machine Human Interface).<netgen_installation_path>/bin/LINUX/ng is the Netgen
-executable with its embarked MHI. All the libraries *.a should be compiled without
-the option -DOPENGL which is only needed for the Netgen MHI. netgen43 is assumed to
-be the directory downloaded from the above web location archive of Netgen. The library
-<netgen_installation_path>/lib/LINUX/libnginterface.a should contain the objects
-nglib.o (from netgen43/libsrc/interface/nglib.cpp) and ngnewdelete.o
-(from netgen43/ngtcltk/ngnewdelete.cpp).
-
-To have that kind of distribution from the version in the above web location you
-should first compile Netgen as suggested in the netgen43/README.INSTALL file. It will
-then produce the executable ng linked statically with the libraries *.a. Then modify
-the Makefiles to remove -DOPENGL from compiler flags list, add the objects nglib.o
-and ngnewdelete.o to the library libnginterface.a and recompile the libraries only.
-
-From the above web location perhaps, you will have to alter some Netgen sources to
-compile them; if you find any difficulties to do that, just ask me.
-
-Nadir
-
-********************************
-* Dr Nadir Bouhamou *
-* Ingénieur-chercheur *
-* Engineer-Researcher *
-* *
-* CEA Saclay *
-* DEN/DM2S/SFME/LGLS *
-* Bat 454 Pièce 5A *
-* 91191 Gif-Sur-Yvette cédex *
-* *
-* Tél: +33 (0)1 69 08 73 07 *
-* Fax: +33 (0)1 69 08 96 96 *
-* email: nadir.bouhamou@cea.fr *
-********************************
+++ /dev/null
-diff -N -r -u netgen43/libsrc/include/spline2d.hpp /tmp/netgen43/libsrc/include/spline2d.hpp
---- netgen43/libsrc/include/spline2d.hpp 1970-01-01 01:00:00.000000000 +0100
-+++ /tmp/netgen43/libsrc/include/spline2d.hpp 2003-12-10 16:28:12.000000000 +0100
-@@ -0,0 +1 @@
-+#include "../geom2d/spline2d.hpp"
-diff -N -r -u netgen43/libsrc/include/splinegeometry2.hpp /tmp/netgen43/libsrc/include/splinegeometry2.hpp
---- netgen43/libsrc/include/splinegeometry2.hpp 1970-01-01 01:00:00.000000000 +0100
-+++ /tmp/netgen43/libsrc/include/splinegeometry2.hpp 2003-12-10 16:28:23.000000000 +0100
-@@ -0,0 +1 @@
-+#include "../geom2d/splinegeometry2.hpp"
-diff -N -r -u netgen43/libsrc/interface/Makefile /tmp/netgen43/libsrc/interface/Makefile
---- netgen43/libsrc/interface/Makefile 2003-05-07 16:01:43.000000000 +0200
-+++ /tmp/netgen43/libsrc/interface/Makefile 2003-12-10 15:59:47.000000000 +0100
-@@ -1,4 +1,4 @@
--src = nginterface.cpp writeuser.cpp writediffpack.cpp writeabaqus.cpp writefluent.cpp writepermas.cpp writetochnog.cpp writetecplot.cpp wuchemnitz.cpp writetochnog.cpp writefeap.cpp readuser.cpp importsolution.cpp
-+src = writeuser.cpp writediffpack.cpp writeabaqus.cpp writefluent.cpp writepermas.cpp writetochnog.cpp writetecplot.cpp wuchemnitz.cpp writetochnog.cpp writefeap.cpp readuser.cpp importsolution.cpp nglib.cpp ngnewdelete.cpp
- #
- lib = nginterface
- libpath = libsrc/interface
-diff -N -r -u netgen43/libsrc/interface/nglib.cpp /tmp/netgen43/libsrc/interface/nglib.cpp
---- netgen43/libsrc/interface/nglib.cpp 2003-05-07 16:01:43.000000000 +0200
-+++ /tmp/netgen43/libsrc/interface/nglib.cpp 2003-12-10 16:32:54.000000000 +0100
-@@ -23,6 +23,20 @@
-
- #include "nglib.h"
-
-+namespace netgen
-+{
-+ char geomfilename [100];
-+
-+ //Destination for messages, errors, ...
-+ void Ng_PrintDest(const char * s)
-+ {
-+ (*mycout) << s << flush;
-+ }
-+
-+#include <spline2d.hpp>
-+#include <splinegeometry2.hpp>
-+}
-+
- using namespace netgen;
-
- // constants and types:
-@@ -171,8 +185,6 @@
- // CSG Geometry
-
- // FlexLexer * lexer;
--char geomfilename [100];
--
-
- // 2D Meshing Functions:
-
-@@ -362,7 +374,18 @@
- cout << "e(" << readedges.Get(i) << "," << readedges.Get(i+1) << ")" << endl;
- }
- */
-- geo->AddEdges(readedges);
-+
-+ ARRAY< Point<3> > readedges1;
-+
-+ for (i = 1; i <= readedges.Size(); i++)
-+ {
-+ Point3d readedgesData = readedges.Get(i);
-+ Point <3> readedges1Data = Point<3>(readedgesData.X(),readedgesData.Y(),readedgesData.Z());
-+
-+ readedges1.Append(readedges1Data);
-+ }
-+
-+ geo->AddEdges(readedges1);
- }
-
- if (geo->GetStatus() == STLTopology::STL_GOOD || geo->GetStatus() == STLTopology::STL_WARNING) return NG_OK;
-@@ -472,7 +495,14 @@
- n = Vec3d(nv[0],nv[1],nv[2]);
- }
-
-- readtrias.Append(STLReadTriangle(apts,n));
-+ Point<3> apts1[3];
-+ apts1[0] = Point<3>(p1[0],p1[1],p1[2]);
-+ apts1[1] = Point<3>(p2[0],p2[1],p2[2]);
-+ apts1[2] = Point<3>(p3[0],p3[1],p3[2]);
-+
-+ Vec<3> n1 = Vec<3>(n.X(),n.Y(),n.Z());
-+
-+ readtrias.Append(STLReadTriangle(apts1,n1));
- }
-
- // add (optional) edges:
-@@ -487,30 +517,29 @@
-
- // compatibility functions:
-
--void MyError (const char * ch)
-+void netgen::MyError (const char * ch)
- {
- cerr << ch;
- }
-
--//Destination for messages, errors, ...
--void Ng_PrintDest(const char * s)
--{
-- (*mycout) << s << flush;
--}
--
--
--double GetTime ()
-+double netgen::GetTime ()
- {
- return 0;
- }
-
--void ResetTime ()
-+void netgen::ResetTime ()
- {
- ;
- }
-
--void MyBeep (int i)
-+void netgen::MyBeep (int i)
- {
- ;
- }
-
-+void MeshFromSpline2D (SplineGeometry2d & geometry,
-+ Mesh *& mesh,
-+ MeshingParameters & mp)
-+{
-+ MeshFromSpline2D (geometry, mesh, mp);
-+}
-diff -N -r -u netgen43/libsrc/makefile.mach.LINUX /tmp/netgen43/libsrc/makefile.mach.LINUX
---- netgen43/libsrc/makefile.mach.LINUX 2003-05-07 16:01:43.000000000 +0200
-+++ /tmp/netgen43/libsrc/makefile.mach.LINUX 2003-12-10 15:12:18.000000000 +0100
-@@ -14,7 +14,8 @@
- #
- CFLAGS2 =
- # pg stands for profiling - also in linkflags2
--CPLUSPLUSFLAGS2 = -O2 -I/usr/X11R6/include -DLINUX -DOPENGL
-+#CPLUSPLUSFLAGS2 = -O2 -I/usr/X11R6/include -DLINUX -DOPENGL
-+CPLUSPLUSFLAGS2 = -O2 -I/usr/X11R6/include -DLINUX
- # -fomit-frame-pointer
- # -ffast-math
- #
-diff -N -r -u netgen43/libsrc/meshing/improve2.cpp /tmp/netgen43/libsrc/meshing/improve2.cpp
---- netgen43/libsrc/meshing/improve2.cpp 2003-05-07 16:01:43.000000000 +0200
-+++ /tmp/netgen43/libsrc/meshing/improve2.cpp 2003-12-10 15:42:00.000000000 +0100
-@@ -3,7 +3,7 @@
- #include "meshing.hpp"
- #include <opti.hpp>
-
--#include <visual.hpp>
-+/*#include <visual.hpp>*/
-
-
- namespace netgen
-diff -N -r -u netgen43/libsrc/meshing/meshing2.cpp /tmp/netgen43/libsrc/meshing/meshing2.cpp
---- netgen43/libsrc/meshing/meshing2.cpp 2003-05-07 16:01:43.000000000 +0200
-+++ /tmp/netgen43/libsrc/meshing/meshing2.cpp 2003-12-10 15:34:35.000000000 +0100
-@@ -1785,7 +1785,7 @@
-
-
- #else
--void glrender (int wait)
-+void netgen::glrender (int wait)
- {
- ;
- }
-diff -N -r -u netgen43/libsrc/visualization/stlmeshing.cpp /tmp/netgen43/libsrc/visualization/stlmeshing.cpp
---- netgen43/libsrc/visualization/stlmeshing.cpp 2003-05-07 16:01:43.000000000 +0200
-+++ /tmp/netgen43/libsrc/visualization/stlmeshing.cpp 2003-12-10 15:52:53.000000000 +0100
-@@ -5,7 +5,7 @@
- #include <stlgeom.hpp>
-
- #include <meshing.hpp>
--#include <visual.hpp>
-+/*#include <visual.hpp>*/
-
- namespace netgen
- {
-diff -N -r -u netgen43/Makefile /tmp/netgen43/Makefile
---- netgen43/Makefile 2003-05-07 16:01:43.000000000 +0200
-+++ /tmp/netgen43/Makefile 2003-12-10 15:11:41.000000000 +0100
-@@ -35,7 +35,8 @@
- .SUFFIXES: .cpp .o
- #
- #
--CPLUSPLUSFLAGS1 = -c -I$(LIBSRC_DIR)/include -DOPENGL
-+#CPLUSPLUSFLAGS1 = -c -I$(LIBSRC_DIR)/include -DOPENGL
-+CPLUSPLUSFLAGS1 = -c -I$(LIBSRC_DIR)/include
- LINKFLAGS1 = -lGL -lGLU -lX11 -lXext -lXmu
- #
- CPLUSPLUSFLAGS = $(CPLUSPLUSFLAGS1) $(CPLUSPLUSFLAGS2) $(CPLUSPLUSFLAGS3)
-diff -N -r -u netgen43/makeForSalome.sh /tmp/netgen43/makeForSalome.sh
---- netgen43/makeForSalome.sh 1970-01-01 01:00:00.000000000 +0100
-+++ /tmp/netgen43/makeForSalome.sh 2004-01-05 12:33:59.000000000 +0100
-@@ -0,0 +1,26 @@
-+#! /bin/sh
-+cp ngtcltk/ngnewdelete.* libsrc/interface/
-+
-+MACHINE=LINUX
-+export MACHINE
-+make -C libsrc/csg
-+make -C libsrc/general
-+make -C libsrc/geom2d
-+make -C libsrc/gprim
-+make -C libsrc/interface
-+make -C libsrc/linalg
-+make -C libsrc/meshing
-+make -C libsrc/opti
-+make -C libsrc/stlgeom
-+
-+if [ ! -d install ] ; then
-+ mkdir install
-+fi
-+
-+cp -r lib install/
-+
-+if [ ! -d install/include ] ; then
-+ mkdir install/include
-+fi
-+
-+cp libsrc/interface/nglib.h install/include
+++ /dev/null
-# SMESH NETGENPlugin : implementaion of SMESH idl descriptions
-#
-# Copyright (C) 2004 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-#
-#
-#
-# File : Makefile.in
-# Author : Julia DOROVSKIKH
-# Module : SMESH
-# $Header$
-
-top_srcdir=@top_srcdir@
-top_builddir=../..
-srcdir=@srcdir@
-VPATH=.:@srcdir@:@top_srcdir@/idl:$(top_builddir)/idl:
-
-
-@COMMENCE@
-
-EXPORT_PYSCRIPTS =
-
-# .po files to transform in .qm
-PO_FILES = NETGENPlugin_icons.po
-
-# Libraries targets
-LIB = libNETGENEngine.la
-LIB_SRC = \
- NETGENPlugin_NETGEN_3D.cxx \
- NETGENPlugin_NETGEN_3D_i.cxx \
- NETGENPlugin_i.cxx
-
-LIB_SERVER_IDL = SMESH_NetgenAlgorithm.idl
-
-LIB_CLIENT_IDL = SMESH_Gen.idl SMESH_Mesh.idl SMESH_Group.idl
-
-# Executables targets
-BIN =
-BIN_SRC =
-
-# additionnal information to compil and link file
-NETGEN_INCLUDES=@NETGEN_INCLUDES@
-
-CPPFLAGS+= $(OCC_INCLUDES) $(HDF5_INCLUDES) -I${KERNEL_ROOT_DIR}/include/salome \
- -I${GEOM_ROOT_DIR}/include/salome $(NETGEN_INCLUDES) $(BOOST_CPPFLAGS)
-CXXFLAGS+= $(OCC_CXXFLAGS) $(HDF5_INCLUDES) -I${KERNEL_ROOT_DIR}/include/salome \
- -I${GEOM_ROOT_DIR}/include/salome $(NETGEN_INCLUDES)
-
-LDFLAGS+= $(HDF5_LIBS) -lSMESHimpl -lSMESHEngine -lStdMeshers -lStdMeshersEngine -lNETGEN -L${KERNEL_ROOT_DIR}/lib/salome -L${GEOM_ROOT_DIR}/lib/salome -lSalomeGenericObj
-
-@CONCLUDE@
+++ /dev/null
-// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : NETGENPlugin_NETGEN_3D_i.cxx
-// Moved here from SMESH_NETGEN_3D_i.cxx
-// Author : Nadir Bouhamou CEA
-// Module : SMESH
-// $Header$
-
-using namespace std;
-#include "NETGENPlugin_NETGEN_3D_i.hxx"
-#include "SMESH_Gen.hxx"
-
-#include "Utils_CorbaException.hxx"
-#include "utilities.h"
-
-//=============================================================================
-/*!
- * NETGENPlugin_NETGEN_3D_i::NETGENPlugin_NETGEN_3D_i
- *
- * Constructor
- */
-//=============================================================================
-
-NETGENPlugin_NETGEN_3D_i::NETGENPlugin_NETGEN_3D_i( PortableServer::POA_ptr thePOA,
- int theStudyId,
- ::SMESH_Gen* theGenImpl )
- : SALOME::GenericObj_i( thePOA ),
- SMESH_Hypothesis_i( thePOA ),
- SMESH_Algo_i( thePOA ),
- SMESH_3D_Algo_i( thePOA )
-{
- MESSAGE( "NETGENPlugin_NETGEN_3D_i::NETGENPlugin_NETGEN_3D_i" );
- myBaseImpl = new ::NETGENPlugin_NETGEN_3D( theGenImpl->GetANewId(),
- theStudyId,
- theGenImpl );
-}
-
-//=============================================================================
-/*!
- * NETGENPlugin_NETGEN_3D_i::~NETGENPlugin_NETGEN_3D_i
- *
- * Destructor
- */
-//=============================================================================
-
-NETGENPlugin_NETGEN_3D_i::~NETGENPlugin_NETGEN_3D_i()
-{
- MESSAGE( "NETGENPlugin_NETGEN_3D_i::~NETGENPlugin_NETGEN_3D_i" );
-}
-
-//=============================================================================
-/*!
- * NETGENPlugin_NETGEN_3D_i::GetImpl
- *
- * Get implementation
- */
-//=============================================================================
-
-::NETGENPlugin_NETGEN_3D* NETGENPlugin_NETGEN_3D_i::GetImpl()
-{
- MESSAGE( "NETGENPlugin_NETGEN_3D_i::GetImpl" );
- return ( ::NETGENPlugin_NETGEN_3D* )myBaseImpl;
-}
-
+++ /dev/null
-// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : NETGENPlugin_NETGEN_3D_i.hxx
-// Moved here from SMESH_NETGEN_3D_i.hxx
-// Author : Nadir Bouhamou CEA
-// Module : SMESH
-// $Header$
-
-#ifndef _NETGENPlugin_NETGEN_3D_I_HXX_
-#define _NETGENPlugin_NETGEN_3D_I_HXX_
-
-#include <SALOMEconfig.h>
-#include CORBA_SERVER_HEADER(SMESH_NetgenAlgorithm)
-
-#include "SMESH_3D_Algo_i.hxx"
-#include "NETGENPlugin_NETGEN_3D.hxx"
-
-// ======================================================
-// NETGEN 3d algorithm
-// ======================================================
-class NETGENPlugin_NETGEN_3D_i:
- public virtual POA_NETGENPlugin::NETGENPlugin_NETGEN_3D,
- public virtual SMESH_3D_Algo_i
-{
-public:
- // Constructor
- NETGENPlugin_NETGEN_3D_i( PortableServer::POA_ptr thePOA,
- int theStudyId,
- ::SMESH_Gen* theGenImpl );
- // Destructor
- virtual ~NETGENPlugin_NETGEN_3D_i();
-
- // Get implementation
- ::NETGENPlugin_NETGEN_3D* GetImpl();
-};
-
-#endif
+++ /dev/null
-// SMESH NETGENPlugin : implementaion of SMESH idl descriptions
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : NETGENPlugin.cxx
-// Author : Julia DOROVSKIKH
-// Module : SMESH
-// $Header$
-
-using namespace std;
-#include "SMESH_Hypothesis_i.hxx"
-#include "SMESH_Gen_i.hxx"
-
-#include "utilities.h"
-
-#include "NETGENPlugin_NETGEN_3D_i.hxx"
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-extern "C"
-{
- GenericHypothesisCreator_i* GetHypothesisCreator (const char* aHypName)
- {
- MESSAGE("GetHypothesisCreator " << aHypName);
-
- GenericHypothesisCreator_i* aCreator = 0;
-
- // Hypotheses
-
- // Algorithms
- if (strcmp(aHypName, "NETGEN_3D") == 0)
- aCreator = new HypothesisCreator_i<NETGENPlugin_NETGEN_3D_i>;
- else ;
-
- return aCreator;
- }
-}
+++ /dev/null
-# This is a Qt message file in .po format. Each msgid starts with
-# a scope. This scope should *NOT* be translated - eg. "Foo::Bar"
-# would be translated to "Pub", not "Foo::Pub".
-msgid ""
-msgstr ""
-"Project-Id-Version: PROJECT VERSION\n"
-"POT-Creation-Date: 2002-05-28 10:57:43 AM CEST\n"
-"PO-Revision-Date: YYYY-MM-DD\n"
-"Last-Translator: FULLNAME <EMAIL@ADDRESS>\n"
-"Content-Type: text/plain; charset=iso-8859-1\n"
-
-
-#-----------------------------------------------------------
-# ObjectBrowser
-#-----------------------------------------------------------
-
-#mesh_tree_algo_netgen
-msgid "ICON_SMESH_TREE_ALGO_NETGEN_3D"
-msgstr "mesh_tree_algo_tetra.png"
-#msgstr "mesh_tree_algo_netgen.png"
+++ /dev/null
-# SMESH OBJECT : interactive object for SMESH visualization
-#
-# Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-#
-# See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-#
-#
-#
-# File : Makefile.in
-# Module : SMESH
-
-top_srcdir=@top_srcdir@
-top_builddir=../..
-srcdir=@srcdir@
-VPATH=.:@srcdir@:@top_srcdir@/idl:$(top_builddir)/idl
-
-@COMMENCE@
-
-EXPORT_HEADERS = SMESH_Actor.h SMESH_Object.h SMESH_ObjectDef.h SMESH_ActorUtils.h
-
-
-# Libraries targets
-
-LIB = libSMESHObject.la
-LIB_SRC = SMESH_Object.cxx SMESH_DeviceActor.cxx SMESH_Actor.cxx \
- SMESH_ExtractGeometry.cxx SMESH_ActorUtils.cxx
-
-LIB_CLIENT_IDL = SALOME_Exception.idl \
- SALOME_GenericObj.idl \
- SMESH_Mesh.idl \
- SMESH_Group.idl
-
-
-# Executables targets
-BIN =
-BIN_SRC =
-
-CPPFLAGS+=$(OCC_INCLUDES) $(VTK_INCLUDES) -I${KERNEL_ROOT_DIR}/include/salome -I${GUI_ROOT_DIR}/include/salome \
- $(BOOST_CPPFLAGS) $(QT_INCLUDES)
-LDFLAGS+=$(OCC_KERNEL_LIBS) $(VTK_LIBS) -L${KERNEL_ROOT_DIR}/lib/salome -L${GUI_ROOT_DIR}/lib/salome -lSMDS \
- -lSalomeApp -lSalomeObject -lSMESHControls
-
-@CONCLUDE@
+++ /dev/null
-// SMESH OBJECT : interactive object for SMESH visualization
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESH_Actor.cxx
-// Author : Nicolas REJNERI
-// Module : SMESH
-// $Header$
-
-
-#include "SMESH_ActorDef.h"
-#include "SMESH_ActorUtils.h"
-#include "SMESH_DeviceActor.h"
-#include "SMESH_ControlsDef.hxx"
-#include <VTKViewer_ExtractUnstructuredGrid.h>
-
-#include "SUIT_Session.h"
-#include "SUIT_ResourceMgr.h"
-
-#include <qstringlist.h>
-
-#include <vtkTimeStamp.h>
-#include <vtkObjectFactory.h>
-#include <vtkShrinkPolyData.h>
-#include <vtkMergeFilter.h>
-
-#include <vtkMatrix4x4.h>
-#include <vtkUnstructuredGrid.h>
-#include <vtkPointData.h>
-#include <vtkCellData.h>
-
-#include <vtkMapper.h>
-#include <vtkRenderer.h>
-
-#include <vtkCell.h>
-#include <vtkIdList.h>
-#include <vtkIntArray.h>
-
-#include <vtkActor2D.h>
-#include <vtkProperty2D.h>
-#include <vtkPolyData.h>
-#include <vtkMaskPoints.h>
-#include <vtkCellCenters.h>
-#include <vtkTextProperty.h>
-#include <vtkLabeledDataMapper.h>
-#include <vtkSelectVisiblePoints.h>
-
-#include <vtkScalarBarActor.h>
-#include <vtkLookupTable.h>
-
-#include <vtkMath.h>
-#include <vtkPlane.h>
-#include <vtkImplicitBoolean.h>
-#include <vtkImplicitFunctionCollection.h>
-
-#include "utilities.h"
-
-#ifdef _DEBUG_
-static int MYDEBUG = 1;
-#else
-static int MYDEBUG = 0;
-#endif
-
-static int aLineWidthInc = 2;
-static int aPointSizeInc = 2;
-
-
-SMESH_ActorDef* SMESH_ActorDef::New(){
- return new SMESH_ActorDef();
-}
-
-
-SMESH_Actor* SMESH_Actor::New(TVisualObjPtr theVisualObj,
- const char* theEntry,
- const char* theName,
- int theIsClear)
-{
- SMESH_ActorDef* anActor = SMESH_ActorDef::New();
- if(!anActor->Init(theVisualObj,theEntry,theName,theIsClear)){
- anActor->Delete();
- anActor = NULL;
- }
- if( anActor )
- anActor->UpdateScalarBar();
- return anActor;
-}
-
-
-SMESH_ActorDef::SMESH_ActorDef()
-{
- if(MYDEBUG) MESSAGE("SMESH_ActorDef - "<<this);
-
- myTimeStamp = vtkTimeStamp::New();
-
- myIsPointsVisible = false;
-
- myIsShrinkable = false;
- myIsShrunk = false;
-
- myControlsPrecision = -1;
- SUIT_ResourceMgr* mgr = SUIT_Session::session()->resourceMgr();
- if ( mgr && mgr->booleanValue( "SMESH", "use_precision", false ) )
- myControlsPrecision = (long)SMESH::GetFloat( "SMESH", "controls_precision", -1 );
-
- float aPointSize = SMESH::GetFloat("SMESH:node_size",3);
- float aLineWidth = SMESH::GetFloat("SMESH:element_width",1);
-
- vtkMatrix4x4 *aMatrix = vtkMatrix4x4::New();
- VTKViewer_ExtractUnstructuredGrid* aFilter = NULL;
-
- //Definition 2D and 3D divices of the actor
- //-----------------------------------------
- float anRGB[3] = {1,1,1};
- mySurfaceProp = vtkProperty::New();
- SMESH::GetColor( "SMESH", "fill_color", anRGB[0], anRGB[1], anRGB[2], QColor( 0, 170, 255 ) );
- mySurfaceProp->SetColor( anRGB[0], anRGB[1], anRGB[2] );
-
- myBackSurfaceProp = vtkProperty::New();
- SMESH::GetColor( "SMESH", "backface_color", anRGB[0], anRGB[1], anRGB[2], QColor( 0, 0, 255 ) );
- myBackSurfaceProp->SetColor( anRGB[0], anRGB[1], anRGB[2] );
-
- my2DActor = SMESH_DeviceActor::New();
- my2DActor->SetUserMatrix(aMatrix);
- my2DActor->PickableOff();
- my2DActor->SetProperty(mySurfaceProp);
- my2DActor->SetBackfaceProperty(myBackSurfaceProp);
- my2DActor->SetRepresentation(SMESH_DeviceActor::eSurface);
- aFilter = my2DActor->GetExtractUnstructuredGrid();
- aFilter->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::eAdding);
- aFilter->RegisterCellsWithType(VTK_TRIANGLE);
- aFilter->RegisterCellsWithType(VTK_POLYGON);
- aFilter->RegisterCellsWithType(VTK_QUAD);
-
- my3DActor = SMESH_DeviceActor::New();
- my3DActor->SetUserMatrix(aMatrix);
- my3DActor->PickableOff();
- my3DActor->SetProperty(mySurfaceProp);
- my3DActor->SetBackfaceProperty(myBackSurfaceProp);
- my3DActor->SetRepresentation(SMESH_DeviceActor::eSurface);
- aFilter = my3DActor->GetExtractUnstructuredGrid();
- aFilter->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::eAdding);
- aFilter->RegisterCellsWithType(VTK_TETRA);
- aFilter->RegisterCellsWithType(VTK_VOXEL);
- aFilter->RegisterCellsWithType(VTK_HEXAHEDRON);
- aFilter->RegisterCellsWithType(VTK_WEDGE);
- aFilter->RegisterCellsWithType(VTK_PYRAMID);
- aFilter->RegisterCellsWithType(VTK_CONVEX_POINT_SET);
-
- //Definition 1D divice of the actor
- //---------------------------------
- myEdgeProp = vtkProperty::New();
- myEdgeProp->SetAmbient(1.0);
- myEdgeProp->SetDiffuse(0.0);
- myEdgeProp->SetSpecular(0.0);
- SMESH::GetColor( "SMESH", "outline_color", anRGB[0], anRGB[1], anRGB[2], QColor( 0, 170, 255 ) );
- myEdgeProp->SetColor(anRGB[0],anRGB[1],anRGB[2]);
- myEdgeProp->SetLineWidth(aLineWidth);
-
- my1DActor = SMESH_DeviceActor::New();
- my1DActor->SetUserMatrix(aMatrix);
- my1DActor->PickableOff();
- my1DActor->SetHighlited(true);
- my1DActor->SetProperty(myEdgeProp);
- my1DActor->SetRepresentation(SMESH_DeviceActor::eSurface);
- aFilter = my1DActor->GetExtractUnstructuredGrid();
- aFilter->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::eAdding);
- aFilter->RegisterCellsWithType(VTK_LINE);
-
- my1DProp = vtkProperty::New();
- my1DProp->DeepCopy(myEdgeProp);
- my1DProp->SetLineWidth(aLineWidth + aLineWidthInc);
- my1DProp->SetPointSize(aPointSize);
-
- my1DExtProp = vtkProperty::New();
- my1DExtProp->DeepCopy(myEdgeProp);
- anRGB[0] = 1 - anRGB[0];
- anRGB[1] = 1 - anRGB[1];
- anRGB[2] = 1 - anRGB[2];
- my1DExtProp->SetColor(anRGB[0],anRGB[1],anRGB[2]);
- my1DExtProp->SetLineWidth(aLineWidth + aLineWidthInc);
- my1DExtProp->SetPointSize(aPointSize + aPointSizeInc);
-
- my1DExtActor = SMESH_DeviceActor::New();
- my1DExtActor->SetUserMatrix(aMatrix);
- my1DExtActor->PickableOff();
- my1DExtActor->SetHighlited(true);
- my1DExtActor->SetVisibility(false);
- my1DExtActor->SetProperty(my1DExtProp);
- my1DExtActor->SetRepresentation(SMESH_DeviceActor::eInsideframe);
- aFilter = my1DExtActor->GetExtractUnstructuredGrid();
- aFilter->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::eAdding);
- aFilter->RegisterCellsWithType(VTK_LINE);
-
-
- //Definition 0D divice of the actor
- //---------------------------------
- myNodeProp = vtkProperty::New();
- SMESH::GetColor( "SMESH", "node_color", anRGB[0], anRGB[1], anRGB[2], QColor( 255, 0, 0 ) );
- myNodeProp->SetColor(anRGB[0],anRGB[1],anRGB[2]);
- myNodeProp->SetPointSize(aPointSize);
-
- myNodeActor = SMESH_DeviceActor::New();
- myNodeActor->SetUserMatrix(aMatrix);
- myNodeActor->SetStoreClippingMapping(true);
- myNodeActor->PickableOff();
- myNodeActor->SetVisibility(false);
- myNodeActor->SetProperty(myNodeProp);
- myNodeActor->SetRepresentation(SMESH_DeviceActor::ePoint);
- aFilter = myNodeActor->GetExtractUnstructuredGrid();
- aFilter->SetModeOfExtraction(VTKViewer_ExtractUnstructuredGrid::ePoints);
-
-
- //Definition of Pickable and Highlitable engines
- //----------------------------------------------
-
- myBaseActor = SMESH_DeviceActor::New();
- myBaseActor->SetUserMatrix(aMatrix);
- myBaseActor->SetStoreGemetryMapping(true);
- myBaseActor->GetProperty()->SetOpacity(0.0);
-
- myPickableActor = myBaseActor;
-
- myHighlightProp = vtkProperty::New();
- myHighlightProp->SetAmbient(1.0);
- myHighlightProp->SetDiffuse(0.0);
- myHighlightProp->SetSpecular(0.0);
- SMESH::GetColor( "SMESH", "selection_object_color", anRGB[0], anRGB[1], anRGB[2], QColor( 255, 255, 255 ) );
- myHighlightProp->SetColor(anRGB[0],anRGB[1],anRGB[2]);
- myHighlightProp->SetPointSize(aPointSize);
- myHighlightProp->SetRepresentation(1);
-
- myPreselectProp = vtkProperty::New();
- myPreselectProp->SetAmbient(1.0);
- myPreselectProp->SetDiffuse(0.0);
- myPreselectProp->SetSpecular(0.0);
- SMESH::GetColor( "SMESH", "highlight_color", anRGB[0], anRGB[1], anRGB[2], QColor( 0, 255, 255 ) );
- myPreselectProp->SetColor(anRGB[0],anRGB[1],anRGB[2]);
- myPreselectProp->SetPointSize(aPointSize);
- myPreselectProp->SetRepresentation(1);
-
- myHighlitableActor = SMESH_DeviceActor::New();
- myHighlitableActor->SetUserMatrix(aMatrix);
- myHighlitableActor->PickableOff();
- myHighlitableActor->SetRepresentation(SMESH_DeviceActor::eWireframe);
-
- SetShrinkFactor( SMESH::GetFloat( "SMESH:shrink_coeff", 0.75 ) );
-
- myName = "";
- myIO = NULL;
-
- myControlMode = eNone;
- myControlActor = my2DActor;
-
- //Definition of myScalarBarActor
- //------------------------------
- myLookupTable = vtkLookupTable::New();
- //Fix for Bug PAL5195 - SMESH764:
- //Controls - Aspect Ratio: incorrect colors of the best and worst values
- myLookupTable->SetHueRange(0.667,0.0);
-
- myScalarBarActor = vtkScalarBarActor::New();
- myScalarBarActor->SetVisibility(false);
- myScalarBarActor->SetLookupTable(myLookupTable);
-
- mgr = SUIT_Session::session()->resourceMgr();
- if( !mgr )
- return;
-
- //Definition of points numbering pipeline
- //---------------------------------------
- myPointsNumDataSet = vtkUnstructuredGrid::New();
-
- myPtsMaskPoints = vtkMaskPoints::New();
- myPtsMaskPoints->SetInput(myPointsNumDataSet);
- myPtsMaskPoints->SetOnRatio(1);
-
- myPtsSelectVisiblePoints = vtkSelectVisiblePoints::New();
- myPtsSelectVisiblePoints->SetInput(myPtsMaskPoints->GetOutput());
- myPtsSelectVisiblePoints->SelectInvisibleOff();
- myPtsSelectVisiblePoints->SetTolerance(0.1);
-
- myPtsLabeledDataMapper = vtkLabeledDataMapper::New();
- myPtsLabeledDataMapper->SetInput(myPtsSelectVisiblePoints->GetOutput());
- myPtsLabeledDataMapper->SetLabelFormat("%g");
- myPtsLabeledDataMapper->SetLabelModeToLabelScalars();
-
- vtkTextProperty* aPtsTextProp = vtkTextProperty::New();
- aPtsTextProp->SetFontFamilyToTimes();
- static int aPointsFontSize = 10;
- aPtsTextProp->SetFontSize(aPointsFontSize);
- aPtsTextProp->SetBold(1);
- aPtsTextProp->SetItalic(0);
- aPtsTextProp->SetShadow(0);
- myPtsLabeledDataMapper->SetLabelTextProperty(aPtsTextProp);
- aPtsTextProp->Delete();
-
- myEntityMode = eAllEntity;
-
- myIsPointsLabeled = false;
-
- myPointLabels = vtkActor2D::New();
- myPointLabels->SetMapper(myPtsLabeledDataMapper);
- myPointLabels->GetProperty()->SetColor(1,1,1);
- myPointLabels->SetVisibility(myIsPointsLabeled);
-
-
- //Definition of cells numbering pipeline
- //---------------------------------------
- myCellsNumDataSet = vtkUnstructuredGrid::New();
-
- myCellCenters = vtkCellCenters::New();
- myCellCenters->SetInput(myCellsNumDataSet);
-
- myClsMaskPoints = vtkMaskPoints::New();
- myClsMaskPoints->SetInput(myCellCenters->GetOutput());
- myClsMaskPoints->SetOnRatio(1);
-
- myClsSelectVisiblePoints = vtkSelectVisiblePoints::New();
- myClsSelectVisiblePoints->SetInput(myClsMaskPoints->GetOutput());
- myClsSelectVisiblePoints->SelectInvisibleOff();
- myClsSelectVisiblePoints->SetTolerance(0.1);
-
- myClsLabeledDataMapper = vtkLabeledDataMapper::New();
- myClsLabeledDataMapper->SetInput(myClsSelectVisiblePoints->GetOutput());
- myClsLabeledDataMapper->SetLabelFormat("%g");
- myClsLabeledDataMapper->SetLabelModeToLabelScalars();
-
- vtkTextProperty* aClsTextProp = vtkTextProperty::New();
- aClsTextProp->SetFontFamilyToTimes();
- static int aCellsFontSize = 12;
- aClsTextProp->SetFontSize(aCellsFontSize);
- aClsTextProp->SetBold(1);
- aClsTextProp->SetItalic(0);
- aClsTextProp->SetShadow(0);
- myClsLabeledDataMapper->SetLabelTextProperty(aClsTextProp);
- aClsTextProp->Delete();
-
- myIsCellsLabeled = false;
-
- myCellsLabels = vtkActor2D::New();
- myCellsLabels->SetMapper(myClsLabeledDataMapper);
- myCellsLabels->GetProperty()->SetColor(0,1,0);
- myCellsLabels->SetVisibility(myIsCellsLabeled);
-
- // Clipping planes
- myImplicitBoolean = vtkImplicitBoolean::New();
- myImplicitBoolean->SetOperationTypeToIntersection();
-}
-
-
-SMESH_ActorDef::~SMESH_ActorDef()
-{
- if(MYDEBUG) MESSAGE("~SMESH_ActorDef - "<<this);
-
- myScalarBarActor->Delete();
- myLookupTable->Delete();
-
- mySurfaceProp->Delete();
- myBackSurfaceProp->Delete();
-
- myEdgeProp->Delete();
- myHighlightProp->Delete();
- myPreselectProp->Delete();
-
- myNodeProp->Delete();
-
- my1DProp->Delete();
- my1DActor->Delete();
-
- my1DExtProp->Delete();
- my1DExtActor->Delete();
-
- my2DActor->Delete();
- my3DActor->Delete();
-
- myNodeActor->Delete();
- myBaseActor->Delete();
-
- myHighlitableActor->Delete();
-
- //Deleting of pints numbering pipeline
- //---------------------------------------
- myPointsNumDataSet->Delete();
-
- myPtsLabeledDataMapper->RemoveAllInputs();
- myPtsLabeledDataMapper->Delete();
-
- myPtsSelectVisiblePoints->UnRegisterAllOutputs();
- myPtsSelectVisiblePoints->Delete();
-
- myPtsMaskPoints->UnRegisterAllOutputs();
- myPtsMaskPoints->Delete();
-
- myPointLabels->Delete();
-
-
- //Deleting of cells numbering pipeline
- //---------------------------------------
- myCellsNumDataSet->Delete();
-
- myClsLabeledDataMapper->RemoveAllInputs();
- myClsLabeledDataMapper->Delete();
-
- myClsSelectVisiblePoints->UnRegisterAllOutputs();
- myClsSelectVisiblePoints->Delete();
-
- myClsMaskPoints->UnRegisterAllOutputs();
- myClsMaskPoints->Delete();
-
- myCellCenters->UnRegisterAllOutputs();
- myCellCenters->Delete();
-
- myCellsLabels->Delete();
-
- myImplicitBoolean->Delete();
-
- myTimeStamp->Delete();
-}
-
-
-void SMESH_ActorDef::SetPointsLabeled( bool theIsPointsLabeled )
-{
- vtkUnstructuredGrid* aGrid = GetUnstructuredGrid();
- myIsPointsLabeled = theIsPointsLabeled && aGrid->GetNumberOfPoints();
-
- if ( myIsPointsLabeled )
- {
- myPointsNumDataSet->ShallowCopy(aGrid);
- vtkDataSet *aDataSet = myPointsNumDataSet;
-
- int aNbElem = aDataSet->GetNumberOfPoints();
-
- vtkIntArray *anArray = vtkIntArray::New();
- anArray->SetNumberOfValues( aNbElem );
-
- for ( int anId = 0; anId < aNbElem; anId++ )
- {
- int aSMDSId = myVisualObj->GetNodeObjId( anId );
- anArray->SetValue( anId, aSMDSId );
- }
-
- aDataSet->GetPointData()->SetScalars( anArray );
- anArray->Delete();
- myPtsMaskPoints->SetInput( aDataSet );
- myPointLabels->SetVisibility( GetVisibility() );
- }
- else
- {
- myPointLabels->SetVisibility( false );
- }
- SetRepresentation(GetRepresentation());
- myTimeStamp->Modified();
-}
-
-
-void SMESH_ActorDef::SetCellsLabeled(bool theIsCellsLabeled)
-{
- vtkUnstructuredGrid* aGrid = GetUnstructuredGrid();
- myIsCellsLabeled = theIsCellsLabeled && aGrid->GetNumberOfPoints();
- if(myIsCellsLabeled){
- myCellsNumDataSet->ShallowCopy(aGrid);
- vtkDataSet *aDataSet = myCellsNumDataSet;
- int aNbElem = aDataSet->GetNumberOfCells();
- vtkIntArray *anArray = vtkIntArray::New();
- anArray->SetNumberOfValues(aNbElem);
- for(int anId = 0; anId < aNbElem; anId++){
- int aSMDSId = myVisualObj->GetElemObjId(anId);
- anArray->SetValue(anId,aSMDSId);
- }
- aDataSet->GetCellData()->SetScalars(anArray);
- myCellCenters->SetInput(aDataSet);
- myCellsLabels->SetVisibility(GetVisibility());
- }else{
- myCellsLabels->SetVisibility(false);
- }
- myTimeStamp->Modified();
-}
-
-
-void
-SMESH_ActorDef::
-SetControlMode(eControl theMode)
-{
- SetControlMode(theMode,true);
-}
-
-
-void
-SMESH_ActorDef::
-SetControlMode(eControl theMode,
- bool theCheckEntityMode)
-{
- SUIT_ResourceMgr* mgr = SUIT_Session::session()->resourceMgr();
- if( !mgr )
- return;
-
- myControlMode = eNone;
- theCheckEntityMode &= mgr->booleanValue( "SMESH", "display_entity", false );
-
- my1DActor->GetMapper()->SetScalarVisibility(false);
- my2DActor->GetMapper()->SetScalarVisibility(false);
- my3DActor->GetMapper()->SetScalarVisibility(false);
- myScalarBarActor->SetVisibility(false);
-
- bool anIsScalarVisible = theMode > eNone;
-
- if(anIsScalarVisible){
- SMESH::Controls::FunctorPtr aFunctor;
- switch(theMode){
- case eLength:
- {
- SMESH::Controls::Length* aControl = new SMESH::Controls::Length();
- aControl->SetPrecision( myControlsPrecision );
- aFunctor.reset( aControl );
- myControlActor = my1DActor;
- break;
- }
- case eLength2D:
- {
- aFunctor.reset(new SMESH::Controls::Length2D());
- myControlActor = my2DActor;
- break;
- }
- case eFreeBorders:
- aFunctor.reset(new SMESH::Controls::FreeBorders());
- myControlActor = my1DActor;
- break;
- case eFreeEdges:
- aFunctor.reset(new SMESH::Controls::FreeEdges());
- myControlActor = my2DActor;
- break;
- case eMultiConnection:
- aFunctor.reset(new SMESH::Controls::MultiConnection());
- myControlActor = my1DActor;
- break;
- case eMultiConnection2D:
- aFunctor.reset(new SMESH::Controls::MultiConnection2D());
- myControlActor = my2DActor;
- break;
- case eArea:
- {
- SMESH::Controls::Area* aControl = new SMESH::Controls::Area();
- aControl->SetPrecision( myControlsPrecision );
- aFunctor.reset( aControl );
- myControlActor = my2DActor;
- break;
- }
- case eTaper:
- {
- SMESH::Controls::Taper* aControl = new SMESH::Controls::Taper();
- aControl->SetPrecision( myControlsPrecision );
- aFunctor.reset( aControl );
- myControlActor = my2DActor;
- break;
- }
- case eAspectRatio:
- {
- SMESH::Controls::AspectRatio* aControl = new SMESH::Controls::AspectRatio();
- aControl->SetPrecision( myControlsPrecision );
- aFunctor.reset( aControl );
- myControlActor = my2DActor;
- break;
- }
- case eAspectRatio3D:
- {
- SMESH::Controls::AspectRatio3D* aControl = new SMESH::Controls::AspectRatio3D();
- aControl->SetPrecision( myControlsPrecision );
- aFunctor.reset( aControl );
- myControlActor = my3DActor;
- break;
- }
- case eVolume3D:
- {
- SMESH::Controls::Volume* aControl = new SMESH::Controls::Volume();
- aControl->SetPrecision( myControlsPrecision );
- aFunctor.reset( aControl );
- myControlActor = my3DActor;
- break;
- }
- case eMinimumAngle:
- {
- SMESH::Controls::MinimumAngle* aControl = new SMESH::Controls::MinimumAngle();
- aControl->SetPrecision( myControlsPrecision );
- aFunctor.reset( aControl );
- myControlActor = my2DActor;
- break;
- }
- case eWarping:
- {
- SMESH::Controls::Warping* aControl = new SMESH::Controls::Warping();
- aControl->SetPrecision( myControlsPrecision );
- aFunctor.reset( aControl );
- myControlActor = my2DActor;
- break;
- }
- case eSkew:
- {
- SMESH::Controls::Skew* aControl = new SMESH::Controls::Skew();
- aControl->SetPrecision( myControlsPrecision );
- aFunctor.reset( aControl );
- myControlActor = my2DActor;
- break;
- }
- default:
- return;
- }
-
- vtkUnstructuredGrid* aGrid = myControlActor->GetUnstructuredGrid();
- vtkIdType aNbCells = aGrid->GetNumberOfCells();
- if(aNbCells){
- myControlMode = theMode;
- switch(myControlMode){
- case eFreeEdges:
- case eFreeBorders:
- my1DExtActor->SetExtControlMode(aFunctor);
- break;
- case eLength2D:
- case eMultiConnection2D:
- my1DExtActor->SetExtControlMode(aFunctor,myScalarBarActor,myLookupTable);
- break;
- default:
- myControlActor->SetControlMode(aFunctor,myScalarBarActor,myLookupTable);
- }
- }
-
- if(theCheckEntityMode){
- if(myControlActor == my1DActor)
- SetEntityMode(eEdges);
- else if(myControlActor == my2DActor){
- switch(myControlMode){
- case eLength2D:
- case eFreeEdges:
- case eMultiConnection2D:
- //SetEntityMode(eEdges);
- SetEntityMode(eFaces);
- break;
- default:
- SetEntityMode(eFaces);
- }
- }else if(myControlActor == my3DActor)
- SetEntityMode(eVolumes);
- }
-
- }else if(theCheckEntityMode){
- myEntityMode = eAllEntity;
- }
-
- SetRepresentation(GetRepresentation());
-
- myTimeStamp->Modified();
- Modified();
-}
-
-
-void SMESH_ActorDef::AddToRender(vtkRenderer* theRenderer){
- SALOME_Actor::AddToRender(theRenderer);
-
- theRenderer->AddActor(myNodeActor);
- theRenderer->AddActor(myBaseActor);
-
- theRenderer->AddActor(my3DActor);
- theRenderer->AddActor(my2DActor);
-
- theRenderer->AddActor(my1DActor);
- theRenderer->AddActor(my1DExtActor);
-
- theRenderer->AddActor(myHighlitableActor);
-
- theRenderer->AddActor2D(myScalarBarActor);
-
- myPtsSelectVisiblePoints->SetRenderer(theRenderer);
- myClsSelectVisiblePoints->SetRenderer(theRenderer);
-
- theRenderer->AddActor2D(myPointLabels);
- theRenderer->AddActor2D(myCellsLabels);
-}
-
-void SMESH_ActorDef::RemoveFromRender(vtkRenderer* theRenderer){
- SALOME_Actor::RemoveFromRender(theRenderer);
-
- theRenderer->RemoveActor(myNodeActor);
- theRenderer->RemoveActor(myBaseActor);
-
- theRenderer->RemoveActor(myHighlitableActor);
-
- theRenderer->RemoveActor(my1DActor);
- theRenderer->RemoveActor(my1DExtActor);
-
- theRenderer->RemoveActor(my2DActor);
- theRenderer->RemoveActor(my3DActor);
-
- theRenderer->RemoveActor(myScalarBarActor);
- theRenderer->RemoveActor(myPointLabels);
- theRenderer->RemoveActor(myCellsLabels);
-}
-
-
-bool SMESH_ActorDef::Init(TVisualObjPtr theVisualObj,
- const char* theEntry,
- const char* theName,
- int theIsClear)
-{
- Handle(SALOME_InteractiveObject) anIO = new SALOME_InteractiveObject(theEntry,"SMESH",theName);
- setIO(anIO);
- setName(theName);
-
- myVisualObj = theVisualObj;
- myVisualObj->Update(theIsClear);
-
- myNodeActor->Init(myVisualObj,myImplicitBoolean);
- myBaseActor->Init(myVisualObj,myImplicitBoolean);
-
- myHighlitableActor->Init(myVisualObj,myImplicitBoolean);
-
- my1DActor->Init(myVisualObj,myImplicitBoolean);
- my1DExtActor->Init(myVisualObj,myImplicitBoolean);
-
- my2DActor->Init(myVisualObj,myImplicitBoolean);
- my3DActor->Init(myVisualObj,myImplicitBoolean);
-
- my1DActor->GetMapper()->SetLookupTable(myLookupTable);
- my1DExtActor->GetMapper()->SetLookupTable(myLookupTable);
-
- my2DActor->GetMapper()->SetLookupTable(myLookupTable);
- my3DActor->GetMapper()->SetLookupTable(myLookupTable);
-
- float aFactor, aUnits;
- my2DActor->GetPolygonOffsetParameters(aFactor,aUnits);
- my2DActor->SetPolygonOffsetParameters(aFactor,aUnits*0.75);
-
- //SetIsShrunkable(theGrid->GetNumberOfCells() > 10);
- SetIsShrunkable(true);
-
- SUIT_ResourceMgr* mgr = SUIT_Session::session()->resourceMgr();
- if( !mgr )
- return false;
-
- int aMode = mgr->integerValue( "SMESH", "display_mode" );
- SetRepresentation(-1);
-
- if(aMode == 0){
- SetRepresentation(eEdge);
- }else if(aMode == 1){
- SetRepresentation(eSurface);
- }else if(aMode == 2){
- SetRepresentation(ePoint);
- }
-
- if(aMode == 3){
- SetShrink();
- }
-
- myTimeStamp->Modified();
- Modified();
- return true;
-}
-
-
-float* SMESH_ActorDef::GetBounds(){
- return myNodeActor->GetBounds();
-}
-
-
-vtkDataSet* SMESH_ActorDef::GetInput(){
- return GetUnstructuredGrid();
-}
-
-
-void SMESH_ActorDef::SetTransform(VTKViewer_Transform* theTransform){
- myNodeActor->SetTransform(theTransform);
- myBaseActor->SetTransform(theTransform);
-
- myHighlitableActor->SetTransform(theTransform);
-
- my1DActor->SetTransform(theTransform);
- my1DExtActor->SetTransform(theTransform);
-
- my2DActor->SetTransform(theTransform);
- my3DActor->SetTransform(theTransform);
-
- Modified();
-}
-
-
-void SMESH_ActorDef::SetMapper(vtkMapper* theMapper){
- vtkLODActor::SetMapper(theMapper);
-}
-
-
-void SMESH_ActorDef::ShallowCopy(vtkProp *prop){
- SALOME_Actor::ShallowCopy(prop);
-}
-
-
-vtkMapper* SMESH_ActorDef::GetMapper(){
- return myPickableActor->GetMapper();
-}
-
-
-vtkUnstructuredGrid* SMESH_ActorDef::GetUnstructuredGrid(){
- return myVisualObj->GetUnstructuredGrid();
-}
-
-
-bool SMESH_ActorDef::IsInfinitive(){
- vtkDataSet *aDataSet = myPickableActor->GetUnstructuredGrid();
- aDataSet->Update();
- myIsInfinite = aDataSet->GetNumberOfCells() == 0 ||
- aDataSet->GetNumberOfCells() == 1 &&
- aDataSet->GetCell(0)->GetCellType() == VTK_VERTEX;
- return SALOME_Actor::IsInfinitive();
-}
-
-
-void SMESH_ActorDef::SetIsShrunkable(bool theShrunkable){
- myIsShrinkable = theShrunkable;
- Modified();
-}
-
-float SMESH_ActorDef::GetShrinkFactor(){
- return myBaseActor->GetShrinkFactor();
-}
-
-void SMESH_ActorDef::SetShrinkFactor(float theValue){
- myBaseActor->SetShrinkFactor(theValue);
-
- my1DActor->SetShrinkFactor(theValue);
- my1DExtActor->SetShrinkFactor(theValue);
-
- my2DActor->SetShrinkFactor(theValue);
- my3DActor->SetShrinkFactor(theValue);
-
- Modified();
-}
-
-void SMESH_ActorDef::SetShrink(){
- if(!myIsShrinkable) return;
-
- myBaseActor->SetShrink();
-
- my1DActor->SetShrink();
- my1DExtActor->SetShrink();
-
- my2DActor->SetShrink();
- my3DActor->SetShrink();
-
- myIsShrunk = true;
- Modified();
-}
-
-void SMESH_ActorDef::UnShrink(){
- if(!myIsShrunk) return;
-
- myBaseActor->UnShrink();
-
- my1DActor->UnShrink();
- my1DExtActor->UnShrink();
-
- my2DActor->UnShrink();
- my3DActor->UnShrink();
-
- myIsShrunk = false;
- Modified();
-}
-
-
-int SMESH_ActorDef::GetNodeObjId(int theVtkID){
- return myPickableActor->GetNodeObjId(theVtkID);
-}
-
-float* SMESH_ActorDef::GetNodeCoord(int theObjID){
- return myPickableActor->GetNodeCoord(theObjID);
-}
-
-
-int SMESH_ActorDef::GetElemObjId(int theVtkID){
- return myPickableActor->GetElemObjId(theVtkID);
-}
-
-vtkCell* SMESH_ActorDef::GetElemCell(int theObjID){
- return myPickableActor->GetElemCell(theObjID);
-}
-
-
-void SMESH_ActorDef::SetVisibility(int theMode){
- SetVisibility(theMode,true);
-}
-
-
-void SMESH_ActorDef::SetVisibility(int theMode, bool theIsUpdateRepersentation){
- SALOME_Actor::SetVisibility(theMode);
-
- myNodeActor->VisibilityOff();
- myBaseActor->VisibilityOff();
-
- my1DActor->VisibilityOff();
- my1DExtActor->VisibilityOff();
-
- my2DActor->VisibilityOff();
- my3DActor->VisibilityOff();
-
- myScalarBarActor->VisibilityOff();
- myPointLabels->VisibilityOff();
- myCellsLabels->VisibilityOff();
-
- if(GetVisibility()){
- if(theIsUpdateRepersentation)
- SetRepresentation(GetRepresentation());
-
- if(myControlMode != eNone){
- switch(myControlMode){
- case eFreeEdges:
- case eFreeBorders:
- my1DExtActor->VisibilityOn();
- break;
- case eLength2D:
- case eMultiConnection2D:
- my1DExtActor->VisibilityOn();
- default:
- if(myControlActor->GetUnstructuredGrid()->GetNumberOfCells())
- myScalarBarActor->VisibilityOn();
- }
- }
-
- if(myRepresentation != ePoint)
- myPickableActor->VisibilityOn();
- else {
- myNodeActor->VisibilityOn();
- }
-
- if(myEntityMode & eEdges){
- my1DActor->VisibilityOn();
- }
-
- if(myEntityMode & eFaces){
- my2DActor->VisibilityOn();
- }
-
- if(myEntityMode & eVolumes){
- my3DActor->VisibilityOn();
- }
-
- if(myIsPointsLabeled){
- myPointLabels->VisibilityOn();
- myNodeActor->VisibilityOn();
- }
-
- if(myIsCellsLabeled)
- myCellsLabels->VisibilityOn();
- }
-
- Modified();
-}
-
-
-void SMESH_ActorDef::SetEntityMode(unsigned int theMode){
- myEntityState = eAllEntity;
-
- if(!myVisualObj->GetNbEntities(SMDSAbs_Edge)){
- myEntityState &= ~eEdges;
- theMode &= ~eEdges;
- }
-
- if(!myVisualObj->GetNbEntities(SMDSAbs_Face)){
- myEntityState &= ~eFaces;
- theMode &= ~eFaces;
- }
-
- if(!myVisualObj->GetNbEntities(SMDSAbs_Volume)){
- myEntityState &= ~eVolumes;
- theMode &= ~eVolumes;
- }
-
- if(!theMode){
- if(myVisualObj->GetNbEntities(SMDSAbs_Edge))
- theMode |= eEdges;
-
- if(myVisualObj->GetNbEntities(SMDSAbs_Face))
- theMode |= eFaces;
-
- if(myVisualObj->GetNbEntities(SMDSAbs_Volume))
- theMode |= eVolumes;
- }
-
- myBaseActor->myGeomFilter->SetInside(myEntityMode != myEntityState);
-
- myEntityMode = theMode;
- VTKViewer_ExtractUnstructuredGrid* aFilter = NULL;
- aFilter = myBaseActor->GetExtractUnstructuredGrid();
- aFilter->ClearRegisteredCellsWithType();
- aFilter->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::eAdding);
-
- if(myEntityMode & eEdges){
- if (MYDEBUG) MESSAGE("EDGES");
- aFilter->RegisterCellsWithType(VTK_LINE);
- }
-
- if(myEntityMode & eFaces){
- if (MYDEBUG) MESSAGE("FACES");
- aFilter->RegisterCellsWithType(VTK_TRIANGLE);
- aFilter->RegisterCellsWithType(VTK_POLYGON);
- aFilter->RegisterCellsWithType(VTK_QUAD);
- }
-
- if(myEntityMode & eVolumes){
- if (MYDEBUG) MESSAGE("VOLUMES");
- aFilter->RegisterCellsWithType(VTK_TETRA);
- aFilter->RegisterCellsWithType(VTK_VOXEL);
- aFilter->RegisterCellsWithType(VTK_HEXAHEDRON);
- aFilter->RegisterCellsWithType(VTK_WEDGE);
- aFilter->RegisterCellsWithType(VTK_PYRAMID);
- aFilter->RegisterCellsWithType(VTK_CONVEX_POINT_SET);
- }
- aFilter->Update();
- if (MYDEBUG) MESSAGE(aFilter->GetOutput()->GetNumberOfCells());
- SetVisibility(GetVisibility(),false);
-}
-
-void SMESH_ActorDef::SetRepresentation(int theMode){
- int aNbEdges = myVisualObj->GetNbEntities(SMDSAbs_Edge);
- int aNbFaces = myVisualObj->GetNbEntities(SMDSAbs_Face);
- int aNbVolumes = myVisualObj->GetNbEntities(SMDSAbs_Volume);
- if(theMode < 0){
- myRepresentation = eSurface;
- if(!aNbFaces && !aNbVolumes && aNbEdges){
- myRepresentation = eEdge;
- }else if(!aNbFaces && !aNbVolumes && !aNbEdges){
- myRepresentation = ePoint;
- }
- }else{
- switch(theMode){
- case eEdge:
- if(!aNbFaces && !aNbVolumes && !aNbEdges) return;
- break;
- case eSurface:
- if(!aNbFaces && !aNbVolumes) return;
- break;
- }
- myRepresentation = theMode;
- }
-
- if(!GetUnstructuredGrid()->GetNumberOfCells())
- myRepresentation = ePoint;
-
- if(myIsShrunk){
- if(myRepresentation == ePoint){
- UnShrink();
- myIsShrunk = true;
- }else{
- SetShrink();
- }
- }
-
- myPickableActor = myBaseActor;
- myNodeActor->SetVisibility(false);
- vtkProperty *aProp = NULL, *aBackProp = NULL;
- SMESH_DeviceActor::EReperesent aReperesent = SMESH_DeviceActor::EReperesent(-1);
- switch(myRepresentation){
- case ePoint:
- myPickableActor = myNodeActor;
- myNodeActor->SetVisibility(true);
-
- aProp = aBackProp = myNodeProp;
- aReperesent = SMESH_DeviceActor::ePoint;
- break;
- case eEdge:
- aProp = aBackProp = myEdgeProp;
- aReperesent = SMESH_DeviceActor::eInsideframe;
- break;
- case eSurface:
- aProp = mySurfaceProp;
- aBackProp = myBackSurfaceProp;
- aReperesent = SMESH_DeviceActor::eSurface;
- break;
- }
-
- my2DActor->SetProperty(aProp);
- my2DActor->SetBackfaceProperty(aBackProp);
- my2DActor->SetRepresentation(aReperesent);
-
- my3DActor->SetProperty(aProp);
- my3DActor->SetBackfaceProperty(aBackProp);
- my3DActor->SetRepresentation(aReperesent);
-
- my1DExtActor->SetVisibility(false);
-
- switch(myControlMode){
- case eLength:
- case eMultiConnection:
- aProp = aBackProp = my1DProp;
- if(myRepresentation != ePoint)
- aReperesent = SMESH_DeviceActor::eInsideframe;
- break;
- }
-
- my1DActor->SetProperty(aProp);
- my1DActor->SetBackfaceProperty(aBackProp);
- my1DActor->SetRepresentation(aReperesent);
-
- my1DExtActor->SetRepresentation(aReperesent);
-
- if(myIsPointsVisible)
- myPickableActor = myNodeActor;
- if(GetPointRepresentation())
- myNodeActor->SetVisibility(true);
-
- SetMapper(myPickableActor->GetMapper());
-
- SetVisibility(GetVisibility(),false);
-
- Modified();
-}
-
-
-void SMESH_ActorDef::SetPointRepresentation(bool theIsPointsVisible){
- myIsPointsVisible = theIsPointsVisible;
- SetRepresentation(GetRepresentation());
-}
-
-bool SMESH_ActorDef::GetPointRepresentation(){
- return myIsPointsVisible || myIsPointsLabeled;
-}
-
-
-void SMESH_ActorDef::UpdateHighlight(){
- myHighlitableActor->SetVisibility(false);
- myHighlitableActor->SetHighlited(false);
-
- if(myIsHighlighted){
- myHighlitableActor->SetProperty(myHighlightProp);
- }else if(myIsPreselected){
- myHighlitableActor->SetProperty(myPreselectProp);
- }
-
- bool anIsVisible = GetVisibility();
-
- if(myIsHighlighted || myIsPreselected){
- if(GetUnstructuredGrid()->GetNumberOfCells()){
- myHighlitableActor->SetHighlited(anIsVisible);
- myHighlitableActor->SetVisibility(anIsVisible);
- myHighlitableActor->GetExtractUnstructuredGrid()->
- SetModeOfExtraction(VTKViewer_ExtractUnstructuredGrid::eCells);
- myHighlitableActor->SetRepresentation(SMESH_DeviceActor::eWireframe);
- }else if(myRepresentation == ePoint || GetPointRepresentation()){
- myHighlitableActor->SetHighlited(anIsVisible);
- myHighlitableActor->SetVisibility(anIsVisible);
- myHighlitableActor->GetExtractUnstructuredGrid()->
- SetModeOfExtraction(VTKViewer_ExtractUnstructuredGrid::ePoints);
- myHighlitableActor->SetRepresentation(SMESH_DeviceActor::ePoint);
- }
- }
-}
-
-
-void SMESH_ActorDef::highlight(bool theHighlight){
- myIsHighlighted = theHighlight;
- UpdateHighlight();
-}
-
-
-void SMESH_ActorDef::SetPreSelected(bool thePreselect){
- myIsPreselected = thePreselect;
- UpdateHighlight();
-}
-
-
-// From vtkFollower
-int SMESH_ActorDef::RenderOpaqueGeometry(vtkViewport *vp)
-{
- if (myPickableActor->GetIsOpaque())
- {
- vtkRenderer *ren = static_cast<vtkRenderer *>(vp);
- this->Render(ren);
- return 1;
- }
- return 0;
-}
-
-
-int SMESH_ActorDef::RenderTranslucentGeometry(vtkViewport *vp)
-{
- if (!myPickableActor->GetIsOpaque())
- {
- vtkRenderer *ren = static_cast<vtkRenderer *>(vp);
- this->Render(ren);
- return 1;
- }
- return 0;
-}
-
-
-void SMESH_ActorDef::Render(vtkRenderer *ren){
- unsigned long aTime = myTimeStamp->GetMTime();
- unsigned long anObjTime = myVisualObj->GetUnstructuredGrid()->GetMTime();
- unsigned long aClippingTime = myImplicitBoolean->GetMTime();
- if(anObjTime > aTime || aClippingTime > aTime)
- Update();
-}
-
-
-void SMESH_ActorDef::Update(){
- if(MYDEBUG) MESSAGE("SMESH_ActorDef::Update");
-
- if(GetControlMode() != eNone) {
- unsigned long aTime = myTimeStamp->GetMTime();
- unsigned long anObjTime = myVisualObj->GetUnstructuredGrid()->GetMTime();
- if (anObjTime > aTime)
- SetControlMode(GetControlMode(),false);
- }
- if(myIsPointsLabeled){
- SetPointsLabeled(myIsPointsLabeled);
- }
- if(myIsCellsLabeled){
- SetCellsLabeled(myIsCellsLabeled);
- }
- SetEntityMode(GetEntityMode());
- SetVisibility(GetVisibility());
-
- myTimeStamp->Modified();
- Modified();
-}
-
-
-void SMESH_ActorDef::ReleaseGraphicsResources(vtkWindow *renWin){
- SALOME_Actor::ReleaseGraphicsResources(renWin);
-
- myPickableActor->ReleaseGraphicsResources(renWin);
-}
-
-
-static void GetColor(vtkProperty *theProperty, float& r,float& g,float& b){
- float* aColor = theProperty->GetColor();
- r = aColor[0];
- g = aColor[1];
- b = aColor[2];
-}
-
-
-void SMESH_ActorDef::SetOpacity(float theValue){
- mySurfaceProp->SetOpacity(theValue);
- myBackSurfaceProp->SetOpacity(theValue);
- myEdgeProp->SetOpacity(theValue);
- myNodeProp->SetOpacity(theValue);
-
- my1DProp->SetOpacity(theValue);
-}
-
-
-float SMESH_ActorDef::GetOpacity(){
- return mySurfaceProp->GetOpacity();
-}
-
-
-void SMESH_ActorDef::SetSufaceColor(float r,float g,float b){
- mySurfaceProp->SetColor(r,g,b);
- Modified();
-}
-
-void SMESH_ActorDef::GetSufaceColor(float& r,float& g,float& b){
- ::GetColor(mySurfaceProp,r,g,b);
-}
-
-void SMESH_ActorDef::SetBackSufaceColor(float r,float g,float b){
- myBackSurfaceProp->SetColor(r,g,b);
- Modified();
-}
-
-void SMESH_ActorDef::GetBackSufaceColor(float& r,float& g,float& b){
- ::GetColor(myBackSurfaceProp,r,g,b);
-}
-
-void SMESH_ActorDef::SetEdgeColor(float r,float g,float b){
- myEdgeProp->SetColor(r,g,b);
- my1DProp->SetColor(r,g,b);
- my1DExtProp->SetColor(1.0-r,1.0-g,1.0-b);
- Modified();
-}
-
-void SMESH_ActorDef::GetEdgeColor(float& r,float& g,float& b){
- ::GetColor(myEdgeProp,r,g,b);
-}
-
-void SMESH_ActorDef::SetNodeColor(float r,float g,float b){
- myNodeProp->SetColor(r,g,b);
- Modified();
-}
-
-void SMESH_ActorDef::GetNodeColor(float& r,float& g,float& b){
- ::GetColor(myNodeProp,r,g,b);
-}
-
-void SMESH_ActorDef::SetHighlightColor(float r,float g,float b){
- myHighlightProp->SetColor(r,g,b);
- Modified();
-}
-
-void SMESH_ActorDef::GetHighlightColor(float& r,float& g,float& b){
- ::GetColor(myHighlightProp,r,g,b);
-}
-
-void SMESH_ActorDef::SetPreHighlightColor(float r,float g,float b){
- myPreselectProp->SetColor(r,g,b);
- Modified();
-}
-
-void SMESH_ActorDef::GetPreHighlightColor(float& r,float& g,float& b){
- ::GetColor(myPreselectProp,r,g,b);
-}
-
-
-float SMESH_ActorDef::GetLineWidth(){
- return myEdgeProp->GetLineWidth();
-}
-
-
-void SMESH_ActorDef::SetLineWidth(float theVal){
- myEdgeProp->SetLineWidth(theVal);
-
- my1DProp->SetLineWidth(theVal + aLineWidthInc);
- my1DExtProp->SetLineWidth(theVal + aLineWidthInc);
-
- Modified();
-}
-
-
-void SMESH_ActorDef::SetNodeSize(float theVal){
- myNodeProp->SetPointSize(theVal);
- myHighlightProp->SetPointSize(theVal);
- myPreselectProp->SetPointSize(theVal);
-
- my1DProp->SetPointSize(theVal + aPointSizeInc);
- my1DExtProp->SetPointSize(theVal + aPointSizeInc);
-
- Modified();
-}
-
-float SMESH_ActorDef::GetNodeSize(){
- return myNodeProp->GetPointSize();
-}
-
-int SMESH_ActorDef::GetObjDimension( const int theObjId )
-{
- return myVisualObj->GetElemDimension( theObjId );
-}
-
-bool
-SMESH_ActorDef::
-IsImplicitFunctionUsed() const
-{
- return myBaseActor->IsImplicitFunctionUsed();
-}
-
-void
-SMESH_ActorDef::
-SetImplicitFunctionUsed(bool theIsImplicitFunctionUsed)
-{
- myNodeActor->SetImplicitFunctionUsed(theIsImplicitFunctionUsed);
- myBaseActor->SetImplicitFunctionUsed(theIsImplicitFunctionUsed);
-
- myHighlitableActor->SetImplicitFunctionUsed(theIsImplicitFunctionUsed);
-
- my1DActor->SetImplicitFunctionUsed(theIsImplicitFunctionUsed);
- my1DExtActor->SetImplicitFunctionUsed(theIsImplicitFunctionUsed);
-
- my2DActor->SetImplicitFunctionUsed(theIsImplicitFunctionUsed);
- my3DActor->SetImplicitFunctionUsed(theIsImplicitFunctionUsed);
-}
-
-vtkIdType
-SMESH_ActorDef::
-AddClippingPlane(vtkPlane* thePlane)
-{
- if(thePlane){
- myImplicitBoolean->GetFunction()->AddItem(thePlane);
- myCippingPlaneCont.push_back(thePlane);
- if(!IsImplicitFunctionUsed())
- SetImplicitFunctionUsed(true);
- }
- return myCippingPlaneCont.size();
-}
-
-void
-SMESH_ActorDef::
-RemoveAllClippingPlanes()
-{
- myImplicitBoolean->GetFunction()->RemoveAllItems();
- myImplicitBoolean->GetFunction()->Modified(); // VTK bug
- myCippingPlaneCont.clear();
- SetImplicitFunctionUsed(false);
-}
-
-vtkIdType
-SMESH_ActorDef::
-GetNumberOfClippingPlanes()
-{
- return myCippingPlaneCont.size();
-}
-
-vtkPlane*
-SMESH_ActorDef::
-GetClippingPlane(vtkIdType theID)
-{
- if(theID >= myCippingPlaneCont.size())
- return NULL;
- return myCippingPlaneCont[theID].Get();
-}
-
-
-static void ComputeBoundsParam(vtkDataSet* theDataSet,
- float theDirection[3], float theMinPnt[3],
- float& theMaxBoundPrj, float& theMinBoundPrj)
-{
- float aBounds[6];
- theDataSet->GetBounds(aBounds);
-
- //Enlarge bounds in order to avoid conflicts of precision
- for(int i = 0; i < 6; i += 2){
- static double EPS = 1.0E-3;
- float aDelta = (aBounds[i+1] - aBounds[i])*EPS;
- aBounds[i] -= aDelta;
- aBounds[i+1] += aDelta;
- }
-
- float aBoundPoints[8][3] = { {aBounds[0],aBounds[2],aBounds[4]},
- {aBounds[1],aBounds[2],aBounds[4]},
- {aBounds[0],aBounds[3],aBounds[4]},
- {aBounds[1],aBounds[3],aBounds[4]},
- {aBounds[0],aBounds[2],aBounds[5]},
- {aBounds[1],aBounds[2],aBounds[5]},
- {aBounds[0],aBounds[3],aBounds[5]},
- {aBounds[1],aBounds[3],aBounds[5]}};
-
- int aMaxId = 0, aMinId = aMaxId;
- theMaxBoundPrj = vtkMath::Dot(theDirection,aBoundPoints[aMaxId]);
- theMinBoundPrj = theMaxBoundPrj;
- for(int i = 1; i < 8; i++){
- float aTmp = vtkMath::Dot(theDirection,aBoundPoints[i]);
- if(theMaxBoundPrj < aTmp){
- theMaxBoundPrj = aTmp;
- aMaxId = i;
- }
- if(theMinBoundPrj > aTmp){
- theMinBoundPrj = aTmp;
- aMinId = i;
- }
- }
- float *aMinPnt = aBoundPoints[aMaxId];
- theMinPnt[0] = aMinPnt[0];
- theMinPnt[1] = aMinPnt[1];
- theMinPnt[2] = aMinPnt[2];
-}
-
-
-static void DistanceToPosition(vtkDataSet* theDataSet,
- float theDirection[3], float theDist, float thePos[3])
-{
- float aMaxBoundPrj, aMinBoundPrj, aMinPnt[3];
- ComputeBoundsParam(theDataSet,theDirection,aMinPnt,aMaxBoundPrj,aMinBoundPrj);
- float aLength = (aMaxBoundPrj-aMinBoundPrj)*theDist;
- thePos[0] = aMinPnt[0]-theDirection[0]*aLength;
- thePos[1] = aMinPnt[1]-theDirection[1]*aLength;
- thePos[2] = aMinPnt[2]-theDirection[2]*aLength;
-}
-
-
-static void PositionToDistance(vtkDataSet* theDataSet,
- float theDirection[3], float thePos[3], float& theDist)
-{
- float aMaxBoundPrj, aMinBoundPrj, aMinPnt[3];
- ComputeBoundsParam(theDataSet,theDirection,aMinPnt,aMaxBoundPrj,aMinBoundPrj);
- float aPrj = vtkMath::Dot(theDirection,thePos);
- theDist = (aPrj-aMinBoundPrj)/(aMaxBoundPrj-aMinBoundPrj);
-}
-
-
-void SMESH_ActorDef::SetPlaneParam(float theDir[3], float theDist, vtkPlane* thePlane)
-{
- thePlane->SetNormal(theDir);
- float anOrigin[3];
- ::DistanceToPosition(GetUnstructuredGrid(),theDir,theDist,anOrigin);
- thePlane->SetOrigin(anOrigin);
-}
-
-
-void SMESH_ActorDef::GetPlaneParam(float theDir[3], float& theDist, vtkPlane* thePlane)
-{
- thePlane->GetNormal(theDir);
-
- float anOrigin[3];
- thePlane->GetOrigin(anOrigin);
- ::PositionToDistance(GetUnstructuredGrid(),theDir,anOrigin,theDist);
-}
-
-void SMESH_ActorDef::UpdateScalarBar()
-{
- SUIT_ResourceMgr* mgr = SUIT_Session::session()->resourceMgr();
- if( !mgr )
- return;
-
- vtkTextProperty* aScalarBarTitleProp = vtkTextProperty::New();
-
- QColor aTColor = mgr->colorValue( "SMESH", "scalar_bar_title_color", QColor( 255, 255, 255 ) );
- aScalarBarTitleProp->SetColor( aTColor.red()/255., aTColor.green()/255., aTColor.blue()/255. );
-
- aScalarBarTitleProp->SetFontFamilyToArial();
-
- if ( mgr->hasValue( "SMESH", "scalar_bar_title_font" ) )
- {
- QFont f = mgr->fontValue( "SMESH", "scalar_bar_title_font" );
- if ( f.family() == "Arial" )
- aScalarBarTitleProp->SetFontFamilyToArial();
- else if ( f.family() == "Courier" )
- aScalarBarTitleProp->SetFontFamilyToCourier();
- else if ( f.family() == "Times" )
- aScalarBarTitleProp->SetFontFamilyToTimes();
-
- if ( f.bold() )
- aScalarBarTitleProp->BoldOn();
- else
- aScalarBarTitleProp->BoldOff();
-
- if ( f.italic() )
- aScalarBarTitleProp->ItalicOn();
- else
- aScalarBarTitleProp->ItalicOff();
-
- if ( f.underline() )
- aScalarBarTitleProp->ShadowOn();
- else
- aScalarBarTitleProp->ShadowOff();
- }
-
- myScalarBarActor->SetTitleTextProperty( aScalarBarTitleProp );
- aScalarBarTitleProp->Delete();
-
- vtkTextProperty* aScalarBarLabelProp = vtkTextProperty::New();
-
- aTColor = mgr->colorValue( "SMESH", "scalar_bar_label_color", QColor( 255, 255, 255 ) );
- aScalarBarLabelProp->SetColor( aTColor.red()/255., aTColor.green()/255., aTColor.blue()/255. );
-
- aScalarBarLabelProp->SetFontFamilyToArial();
- if( mgr->hasValue( "SMESH", "scalar_bar_label_font" ) )
- {
- QFont f = mgr->stringValue( "SMESH", "scalar_bar_label_font" );
- if( f.family() == "Arial" )
- aScalarBarLabelProp->SetFontFamilyToArial();
- else if( f.family() == "Courier" )
- aScalarBarLabelProp->SetFontFamilyToCourier();
- else if( f.family() == "Times" )
- aScalarBarLabelProp->SetFontFamilyToTimes();
-
- if ( f.bold() )
- aScalarBarLabelProp->BoldOn();
- else
- aScalarBarLabelProp->BoldOff();
-
- if ( f.italic() )
- aScalarBarLabelProp->ItalicOn();
- else
- aScalarBarLabelProp->ItalicOff();
-
- if( f.underline() )
- aScalarBarLabelProp->ShadowOn();
- else
- aScalarBarLabelProp->ShadowOff();
- }
-
- myScalarBarActor->SetLabelTextProperty( aScalarBarLabelProp );
- aScalarBarLabelProp->Delete();
-
- bool horiz = ( mgr->integerValue( "SMESH", "scalar_bar_orientation" ) == 1 );
- QString name = QString( "scalar_bar_%1_" ).arg( horiz ? "horizontal" : "vertical" );
- if( horiz )
- myScalarBarActor->SetOrientationToHorizontal();
- else
- myScalarBarActor->SetOrientationToVertical();
-
-
- float aXVal = horiz ? 0.20 : 0.01;
- if( mgr->hasValue( "SMESH", name + "x" ) )
- aXVal = mgr->doubleValue( "SMESH", name + "x", aXVal );
-
- float aYVal = horiz ? 0.01 : 0.1;
- if( mgr->hasValue( "SMESH", name + "y" ) )
- aYVal = mgr->doubleValue( "SMESH", name + "y", aYVal );
- myScalarBarActor->SetPosition( aXVal, aYVal );
-
- float aWVal = horiz ? 0.60 : 0.10;
- if( mgr->hasValue( "SMESH", name + "width" ) )
- aWVal = mgr->doubleValue( "SMESH", name + "width", aWVal );
- myScalarBarActor->SetWidth( aWVal );
-
- float aHVal = horiz ? 0.12 : 0.80;
- if( mgr->hasValue( "SMESH", name + "height" ) )
- aHVal = mgr->doubleValue( "SMESH", name + "height", aHVal );
- myScalarBarActor->SetHeight( aHVal );
-
- int anIntVal = 5;
- if( mgr->hasValue( "SMESH", "scalar_bar_num_labels" ) )
- anIntVal = mgr->integerValue( "SMESH", "scalar_bar_num_labels", anIntVal );
- myScalarBarActor->SetNumberOfLabels( anIntVal == 0 ? 5: anIntVal );
-
- anIntVal = 64;
- if( mgr->hasValue( "SMESH", "scalar_bar_num_colors" ) )
- anIntVal = mgr->integerValue( "SMESH", "scalar_bar_num_colors", anIntVal );
- myScalarBarActor->SetMaximumNumberOfColors( anIntVal == 0 ? 64 : anIntVal );
-
-}
+++ /dev/null
-// SMESH OBJECT : interactive object for SMESH visualization
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESH_Actor.h
-// Author : Nicolas REJNERI
-// Module : SMESH
-// $Header$
-
-#ifndef SMESH_ACTOR_H
-#define SMESH_ACTOR_H
-
-#include <SALOME_Actor.h>
-#include "SMESH_Object.h"
-
-class vtkUnstructuredGrid;
-
-class vtkScalarBarActor;
-
-class vtkPlane;
-class vtkImplicitBoolean;
-
-class SMESH_Actor: public SALOME_Actor
-{
- static SMESH_Actor* New() { return NULL;}
-
- public:
- vtkTypeMacro(SMESH_Actor,SALOME_Actor);
- static SMESH_Actor* New(TVisualObjPtr theVisualObj,
- const char* theEntry,
- const char* theName,
- int theIsClear);
-
- virtual void SetSufaceColor(float r,float g,float b) = 0;
- virtual void GetSufaceColor(float& r,float& g,float& b) = 0;
-
- virtual void SetBackSufaceColor(float r,float g,float b) = 0;
- virtual void GetBackSufaceColor(float& r,float& g,float& b) = 0;
-
- virtual void SetEdgeColor(float r,float g,float b) = 0;
- virtual void GetEdgeColor(float& r,float& g,float& b) = 0;
-
- virtual void SetNodeColor(float r,float g,float b) = 0;
- virtual void GetNodeColor(float& r,float& g,float& b) = 0;
-
- virtual void SetHighlightColor(float r,float g,float b) = 0;
- virtual void GetHighlightColor(float& r,float& g,float& b) = 0;
-
- virtual void SetPreHighlightColor(float r,float g,float b) = 0;
- virtual void GetPreHighlightColor(float& r,float& g,float& b) = 0;
-
- virtual float GetLineWidth() = 0;
- virtual void SetLineWidth(float theVal) = 0;
-
- virtual void SetNodeSize(float size) = 0;
- virtual float GetNodeSize() = 0;
-
- enum EReperesent { ePoint, eEdge, eSurface};
-
- enum EEntityMode { eEdges = 0x01, eFaces = 0x02, eVolumes = 0x04, eAllEntity = 0x07};
- virtual void SetEntityMode(unsigned int theMode) = 0;
- virtual unsigned int GetEntityMode() const = 0;
-
- virtual void SetPointRepresentation(bool theIsPointsVisible) = 0;
- virtual bool GetPointRepresentation() = 0;
-
- virtual vtkUnstructuredGrid* GetUnstructuredGrid() = 0;
-
- virtual void SetShrinkFactor(float theValue) = 0;
-
- virtual void SetPointsLabeled(bool theIsPointsLabeled) = 0;
- virtual bool GetPointsLabeled() = 0;
-
- virtual void SetCellsLabeled(bool theIsCellsLabeled) = 0;
- virtual bool GetCellsLabeled() = 0;
-
- enum eControl{eNone, eLength, eLength2D, eFreeBorders, eFreeEdges, eMultiConnection,
- eArea, eTaper, eAspectRatio, eMinimumAngle, eWarping, eSkew,
- eAspectRatio3D, eMultiConnection2D, eVolume3D};
- virtual void SetControlMode(eControl theMode) = 0;
- virtual eControl GetControlMode() = 0;
-
- virtual vtkScalarBarActor* GetScalarBarActor() = 0;
-
- virtual void SetPlaneParam(float theDir[3], float theDist, vtkPlane* thePlane) = 0;
- virtual void GetPlaneParam(float theDir[3], float& theDist, vtkPlane* thePlane) = 0;
-
- virtual void RemoveAllClippingPlanes() = 0;
- virtual vtkIdType GetNumberOfClippingPlanes() = 0;
- virtual vtkPlane* GetClippingPlane(vtkIdType theID) = 0;
- virtual vtkIdType AddClippingPlane(vtkPlane* thePlane) = 0;
-
- virtual TVisualObjPtr GetObject() = 0;
-
- virtual void SetControlsPrecision( const long ) = 0;
- virtual long GetControlsPrecision() const = 0;
-
- virtual void UpdateScalarBar() = 0;
-};
-
-
-#endif //SMESH_ACTOR_H
+++ /dev/null
-// SMESH OBJECT : interactive object for SMESH visualization
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESH_ActorDef.h
-// Author : Nicolas REJNERI
-// Module : SMESH
-// $Header$
-
-#ifndef SMESH_ACTORDEF_H
-#define SMESH_ACTORDEF_H
-
-#include "SMESH_Actor.h"
-#include "SMESH_Object.h"
-
-#include <vtkSmartPointer.h>
-
-template <class T>
-class TVTKSmartPtr: public vtkSmartPointer<T>
-{
-public:
- TVTKSmartPtr() {}
- TVTKSmartPtr(T* r, bool theIsOwner = false): vtkSmartPointer<T>(r) {
- if(r && theIsOwner)
- r->Delete();
- }
- TVTKSmartPtr& operator()(T* r, bool theIsOwner = false){
- vtkSmartPointer<T>::operator=(r);
- if(r && theIsOwner)
- r->Delete();
- return *this;
- }
- TVTKSmartPtr& operator=(T* r){ vtkSmartPointer<T>::operator=(r); return *this;}
- T* Get() const { return this->GetPointer();}
-};
-
-
-class vtkProperty;
-class vtkShrinkFilter;
-class vtkPolyDataMapper;
-class vtkUnstructuredGrid;
-class vtkMergeFilter;
-class vtkPolyData;
-
-class vtkMapper;
-class vtkActor2D;
-class vtkMaskPoints;
-class vtkCellCenters;
-class vtkLabeledDataMapper;
-class vtkSelectVisiblePoints;
-
-class vtkScalarBarActor;
-class vtkLookupTable;
-
-class vtkPlane;
-class vtkImplicitBoolean;
-
-class vtkTimeStamp;
-
-class SMESH_DeviceActor;
-
-
-class SMESH_ActorDef : public SMESH_Actor{
- friend class SMESH_VisualObj;
- friend class SMESH_Actor;
-
- public:
- vtkTypeMacro(SMESH_ActorDef,SMESH_Actor);
-
- virtual void ReleaseGraphicsResources(vtkWindow *renWin);
- virtual int RenderOpaqueGeometry(vtkViewport *viewport);
- virtual int RenderTranslucentGeometry(vtkViewport *viewport);
- virtual void Render(vtkRenderer *ren);
-
- virtual void AddToRender(vtkRenderer* theRenderer);
- virtual void RemoveFromRender(vtkRenderer* theRenderer);
-
- virtual bool hasHighlight() { return true; }
- virtual void highlight(bool theHighlight);
- virtual void SetPreSelected(bool thePreselect = false);
-
- virtual bool IsInfinitive();
-
- virtual void SetOpacity(float theValue);
- virtual float GetOpacity();
-
- virtual void SetSufaceColor(float r,float g,float b);
- virtual void GetSufaceColor(float& r,float& g,float& b);
-
- virtual void SetBackSufaceColor(float r,float g,float b);
- virtual void GetBackSufaceColor(float& r,float& g,float& b);
-
- virtual void SetEdgeColor(float r,float g,float b);
- virtual void GetEdgeColor(float& r,float& g,float& b);
-
- virtual void SetNodeColor(float r,float g,float b);
- virtual void GetNodeColor(float& r,float& g,float& b);
-
- virtual void SetHighlightColor(float r,float g,float b);
- virtual void GetHighlightColor(float& r,float& g,float& b);
-
- virtual void SetPreHighlightColor(float r,float g,float b);
- virtual void GetPreHighlightColor(float& r,float& g,float& b);
-
- virtual float GetLineWidth();
- virtual void SetLineWidth(float theVal);
-
- virtual void SetNodeSize(float size) ;
- virtual float GetNodeSize() ;
-
- virtual int GetNodeObjId(int theVtkID);
- virtual float* GetNodeCoord(int theObjID);
-
- virtual int GetElemObjId(int theVtkID);
- virtual vtkCell* GetElemCell(int theObjID);
-
- virtual int GetObjDimension( const int theObjId );
-
- virtual void SetVisibility(int theMode);
- void SetVisibility(int theMode, bool theIsUpdateRepersentation);
-
- virtual void SetRepresentation(int theMode);
-
- virtual unsigned int GetEntityMode() const { return myEntityMode;}
- virtual void SetEntityMode(unsigned int theMode);
-
- virtual void SetPointRepresentation(bool theIsPointsVisible);
- virtual bool GetPointRepresentation();
-
- virtual float* GetBounds();
- virtual void SetTransform(VTKViewer_Transform* theTransform);
-
- virtual vtkUnstructuredGrid* GetUnstructuredGrid();
- virtual vtkDataSet* GetInput();
- virtual vtkMapper* GetMapper();
-
- virtual float GetShrinkFactor();
- virtual void SetShrinkFactor(float theValue);
-
- virtual bool IsShrunkable() { return myIsShrinkable;}
- virtual bool IsShrunk() { return myIsShrunk;}
- virtual void SetShrink();
- virtual void UnShrink();
-
- virtual void SetPointsLabeled(bool theIsPointsLabeled);
- virtual bool GetPointsLabeled(){ return myIsPointsLabeled;}
-
- virtual void SetCellsLabeled(bool theIsCellsLabeled);
- virtual bool GetCellsLabeled(){ return myIsCellsLabeled;}
-
- virtual void SetControlMode(eControl theMode);
- virtual eControl GetControlMode(){ return myControlMode;}
-
- virtual vtkScalarBarActor* GetScalarBarActor(){ return myScalarBarActor;}
-
- virtual void SetPlaneParam(float theDir[3], float theDist, vtkPlane* thePlane);
- virtual void GetPlaneParam(float theDir[3], float& theDist, vtkPlane* thePlane);
-
- virtual void RemoveAllClippingPlanes();
- virtual vtkIdType GetNumberOfClippingPlanes();
- virtual vtkPlane* GetClippingPlane(vtkIdType theID);
- virtual vtkIdType AddClippingPlane(vtkPlane* thePlane);
-
- virtual TVisualObjPtr GetObject() { return myVisualObj;}
-
- virtual void SetControlsPrecision( const long p ) { myControlsPrecision = p; }
- virtual long GetControlsPrecision() const { return myControlsPrecision; }
-
- virtual void UpdateScalarBar();
-
- protected:
- void SetControlMode(eControl theMode, bool theCheckEntityMode);
- void SetImplicitFunctionUsed(bool theIsImplicitFunctionUsed);
- bool IsImplicitFunctionUsed() const;
-
- TVisualObjPtr myVisualObj;
- vtkTimeStamp* myTimeStamp;
-
- vtkScalarBarActor* myScalarBarActor;
- vtkLookupTable* myLookupTable;
-
- vtkProperty* mySurfaceProp;
- vtkProperty* myBackSurfaceProp;
- vtkProperty* myEdgeProp;
- vtkProperty* myNodeProp;
-
- SMESH_DeviceActor* myBaseActor;
- SMESH_DeviceActor* myNodeActor;
- SMESH_DeviceActor* myPickableActor;
-
- vtkProperty* myHighlightProp;
- vtkProperty* myPreselectProp;
- SMESH_DeviceActor* myHighlitableActor;
-
- eControl myControlMode;
- SMESH_DeviceActor* my2DActor;
- SMESH_DeviceActor* my3DActor;
- SMESH_DeviceActor* myControlActor;
-
- vtkProperty* my1DProp;
- SMESH_DeviceActor* my1DActor;
- vtkProperty* my1DExtProp;
- SMESH_DeviceActor* my1DExtActor;
-
- unsigned int myEntityMode;
- unsigned int myEntityState;
- bool myIsPointsVisible;
-
- bool myIsShrinkable;
- bool myIsShrunk;
-
- bool myIsPointsLabeled;
- vtkUnstructuredGrid* myPointsNumDataSet;
- vtkActor2D *myPointLabels;
- vtkMaskPoints* myPtsMaskPoints;
- vtkLabeledDataMapper* myPtsLabeledDataMapper;
- vtkSelectVisiblePoints* myPtsSelectVisiblePoints;
-
- bool myIsCellsLabeled;
- vtkUnstructuredGrid* myCellsNumDataSet;
- vtkActor2D *myCellsLabels;
- vtkMaskPoints* myClsMaskPoints;
- vtkCellCenters* myCellCenters;
- vtkLabeledDataMapper* myClsLabeledDataMapper;
- vtkSelectVisiblePoints* myClsSelectVisiblePoints;
-
- vtkImplicitBoolean* myImplicitBoolean;
- typedef TVTKSmartPtr<vtkPlane> TPlanePtr;
- typedef std::vector<TPlanePtr> TCippingPlaneCont;
- TCippingPlaneCont myCippingPlaneCont;
- long myControlsPrecision;
-
- SMESH_ActorDef();
- ~SMESH_ActorDef();
-
- bool Init(TVisualObjPtr theVisualObj,
- const char* theEntry,
- const char* theName,
- int theIsClear);
-
- void SetIsShrunkable(bool theShrunkable);
- void UpdateHighlight();
- void Update();
-
- private:
- // hide the two parameter Render() method from the user and the compiler.
- virtual void Render(vtkRenderer *, vtkMapper *) {};
- virtual void ShallowCopy(vtkProp *prop);
- virtual void SetMapper(vtkMapper *);
- static SMESH_ActorDef* New();
-
- // Not implemented.
- SMESH_ActorDef(const SMESH_ActorDef&);
- void operator=(const SMESH_ActorDef&);
-};
-
-
-#endif //SMESH_ACTORDEF_H
+++ /dev/null
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-
-#include "SMESH_ActorUtils.h"
-
-#include "SUIT_Tools.h"
-#include "SUIT_Session.h"
-#include "SUIT_ResourceMgr.h"
-
-#include "utilities.h"
-
-#include <vtkUnstructuredGrid.h>
-#include <vtkUnstructuredGridWriter.h>
-
-#ifdef _DEBUG_
-static int MYDEBUG = 1;
-#else
-static int MYDEBUG = 0;
-#endif
-
-namespace SMESH{
-
- float GetFloat( const QString& theValue, float theDefault )
- {
- int pos = theValue.find( ":" );
- float val = theDefault;
- if( pos>=0 )
- {
- QString name = theValue.right( theValue.length()-pos-1 ),
- sect = theValue.left( pos );
- if( !name.isEmpty() && !sect.isEmpty() )
- val = GetFloat( name, sect, theDefault );
- }
- return val;
- }
-
- float GetFloat( const QString& theValue, const QString& theSection, float theDefault )
- {
- float val = theDefault;
- SUIT_ResourceMgr* mgr = SUIT_Session::session()->resourceMgr();
- if( mgr )
- val = (float) mgr->doubleValue( theValue, theSection, theDefault );
-
- return val;
- }
-
- void WriteUnstructuredGrid(vtkUnstructuredGrid* theGrid, const char* theFileName){
- vtkUnstructuredGridWriter* aWriter = vtkUnstructuredGridWriter::New();
- aWriter->SetFileName(theFileName);
- aWriter->SetInput(theGrid);
- if(theGrid->GetNumberOfCells()){
- aWriter->Write();
- }
- aWriter->Delete();
- }
-
- QColor GetColor( const QString& theSect, const QString& theName, const QColor& def )
- {
- QColor c = def;
- SUIT_ResourceMgr* mgr = SUIT_Session::session()->resourceMgr();
- if ( mgr )
- c = mgr->colorValue( theSect, theName, def );
- return c;
- }
-
- void GetColor( const QString& theSect, const QString& theName, int& r, int& g, int& b, const QColor& def )
- {
- QColor c = def;
- SUIT_ResourceMgr* mgr = SUIT_Session::session()->resourceMgr();
- if ( mgr )
- c = mgr->colorValue( theSect, theName, def );
-
- SUIT_Tools::rgbSet( SUIT_Tools::rgbSet( c ), r, g, b );
- }
-
- void GetColor( const QString& theSect, const QString& theName, float& r, float& g, float& b, const QColor& def )
- {
- int ir( 0 ), ig( 0 ), ib( 0 );
- GetColor( theSect, theName, ir, ig, ib, def );
- r = ir / 255.;
- g = ig / 255.;
- b = ib / 255.;
- }
-}
+++ /dev/null
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-#ifndef SMESH_ACTORUTILS_H
-#define SMESH_ACTORUTILS_H
-
-#include <qcolor.h>
-#include <qstring.h>
-
-class vtkUnstructuredGrid;
-
-namespace SMESH{
-
- float GetFloat( const QString& theValue, float theDefault = 0 );
- float GetFloat( const QString& theName, const QString& theSection, float theDefault = 0 );
-
- QColor GetColor( const QString& theSect, const QString& theName, const QColor&t = QColor() );
- void GetColor( const QString& theSect, const QString& theName, int&, int&, int&, const QColor&t = QColor() );
- void GetColor( const QString& theSect, const QString& theName, float&, float&, float&, const QColor&t = QColor() );
-
- void WriteUnstructuredGrid(vtkUnstructuredGrid* theGrid, const char* theFileName);
-
-}
-
-#endif
+++ /dev/null
-// SMESH OBJECT : interactive object for SMESH visualization
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESH_DeviceActor.cxx
-// Author :
-// Module : SMESH
-// $Header$
-
-
-#include "SMESH_DeviceActor.h"
-#include "SMESH_ExtractGeometry.h"
-#include "SMESH_ControlsDef.hxx"
-#include "SMESH_ActorUtils.h"
-
-#include <VTKViewer_Transform.h>
-#include <VTKViewer_TransformFilter.h>
-#include <VTKViewer_PassThroughFilter.h>
-#include <VTKViewer_ExtractUnstructuredGrid.h>
-
-// VTK Includes
-#include <vtkObjectFactory.h>
-#include <vtkShrinkFilter.h>
-#include <vtkShrinkPolyData.h>
-
-#include <vtkProperty.h>
-#include <vtkPolyData.h>
-#include <vtkMergeFilter.h>
-#include <vtkPolyDataMapper.h>
-#include <vtkUnstructuredGrid.h>
-
-#include <vtkScalarBarActor.h>
-#include <vtkLookupTable.h>
-#include <vtkDoubleArray.h>
-#include <vtkCellData.h>
-
-#include <vtkCell.h>
-#include <vtkIdList.h>
-#include <vtkIntArray.h>
-#include <vtkCellArray.h>
-#include <vtkUnsignedCharArray.h>
-
-#include <vtkImplicitBoolean.h>
-
-#include "utilities.h"
-
-#ifdef _DEBUG_
-static int MYDEBUG = 0;
-#else
-static int MYDEBUG = 0;
-#endif
-
-using namespace std;
-
-
-vtkStandardNewMacro(SMESH_DeviceActor);
-
-
-SMESH_DeviceActor::SMESH_DeviceActor()
-{
- if(MYDEBUG) MESSAGE("SMESH_DeviceActor - "<<this);
-
- myIsShrunk = false;
- myIsShrinkable = false;
- myRepresentation = eSurface;
-
- myProperty = vtkProperty::New();
- myMapper = vtkPolyDataMapper::New();
-
- vtkMapper::GetResolveCoincidentTopologyPolygonOffsetParameters(myPolygonOffsetFactor,
- myPolygonOffsetUnits);
-
- myMapper->UseLookupTableScalarRangeOn();
- myMapper->SetColorModeToMapScalars();
-
- myShrinkFilter = vtkShrinkFilter::New();
-
- myStoreClippingMapping = false;
-
- myExtractGeometry = SMESH_ExtractGeometry::New();
- myExtractGeometry->SetReleaseDataFlag(true);
- myIsImplicitFunctionUsed = false;
-
- myExtractUnstructuredGrid = VTKViewer_ExtractUnstructuredGrid::New();
-
- myMergeFilter = vtkMergeFilter::New();
-
- myGeomFilter = VTKViewer_GeometryFilter::New();
-
- myTransformFilter = VTKViewer_TransformFilter::New();
-
- for(int i = 0; i < 6; i++)
- myPassFilter.push_back(VTKViewer_PassThroughFilter::New());
-}
-
-
-SMESH_DeviceActor::~SMESH_DeviceActor(){
- if(MYDEBUG) MESSAGE("~SMESH_DeviceActor - "<<this);
-
- myProperty->Delete();
-
- myMapper->Delete();
-
- myShrinkFilter->Delete();
-
- myExtractUnstructuredGrid->Delete();
-
- myMergeFilter->Delete();
-
- myGeomFilter->Delete();
-
- myExtractGeometry->Delete();
-
- myTransformFilter->Delete();
-
- for(int i = 0, iEnd = myPassFilter.size(); i < iEnd; i++){
- myPassFilter[i]->Delete();
- }
-}
-
-
-void
-SMESH_DeviceActor::
-SetStoreGemetryMapping(bool theStoreMapping)
-{
- myGeomFilter->SetStoreMapping(theStoreMapping);
- SetStoreClippingMapping(theStoreMapping);
-}
-
-
-void
-SMESH_DeviceActor::
-SetStoreClippingMapping(bool theStoreMapping)
-{
- myStoreClippingMapping = theStoreMapping;
- myExtractGeometry->SetStoreMapping(theStoreMapping && myIsImplicitFunctionUsed);
- SetStoreIDMapping(theStoreMapping);
-}
-
-
-void
-SMESH_DeviceActor::
-SetStoreIDMapping(bool theStoreMapping)
-{
- myExtractUnstructuredGrid->SetStoreMapping(theStoreMapping);
-}
-
-
-void SMESH_DeviceActor::Init(TVisualObjPtr theVisualObj,
- vtkImplicitBoolean* theImplicitBoolean)
-{
- myVisualObj = theVisualObj;
- myExtractGeometry->SetImplicitFunction(theImplicitBoolean);
- SetUnstructuredGrid(myVisualObj->GetUnstructuredGrid());
-}
-
-
-void
-SMESH_DeviceActor::
-SetImplicitFunctionUsed(bool theIsImplicitFunctionUsed)
-{
- int anId = 0;
- if(theIsImplicitFunctionUsed)
- myPassFilter[ anId ]->SetInput( myExtractGeometry->GetOutput() );
- else
- myPassFilter[ anId ]->SetInput( myMergeFilter->GetOutput() );
-
- myIsImplicitFunctionUsed = theIsImplicitFunctionUsed;
- SetStoreClippingMapping(myStoreClippingMapping);
-}
-
-
-void SMESH_DeviceActor::SetUnstructuredGrid(vtkUnstructuredGrid* theGrid){
- if(theGrid){
- //myIsShrinkable = theGrid->GetNumberOfCells() > 10;
- myIsShrinkable = true;
-
- myExtractUnstructuredGrid->SetInput(theGrid);
-
- myMergeFilter->SetGeometry(myExtractUnstructuredGrid->GetOutput());
-
- myExtractGeometry->SetInput(myMergeFilter->GetOutput());
-
- int anId = 0;
- SetImplicitFunctionUsed(myIsImplicitFunctionUsed);
- myPassFilter[ anId + 1]->SetInput( myPassFilter[ anId ]->GetOutput() );
-
- anId++; // 1
- myGeomFilter->SetInput( myPassFilter[ anId ]->GetOutput() );
-
- anId++; // 2
- myPassFilter[ anId ]->SetInput( myGeomFilter->GetOutput() );
- myPassFilter[ anId + 1 ]->SetInput( myPassFilter[ anId ]->GetOutput() );
-
- anId++; // 3
- myTransformFilter->SetInput( myPassFilter[ anId ]->GetPolyDataOutput() );
- myTransformFilter->SetInput( myPassFilter[ anId ]->GetPolyDataOutput() );
-
- anId++; // 4
- myPassFilter[ anId ]->SetInput( myTransformFilter->GetOutput() );
- myPassFilter[ anId + 1 ]->SetInput( myPassFilter[ anId ]->GetOutput() );
- myPassFilter[ anId ]->SetInput( myTransformFilter->GetOutput() );
- myPassFilter[ anId + 1 ]->SetInput( myPassFilter[ anId ]->GetOutput() );
-
- anId++; // 5
- myMapper->SetInput( myPassFilter[ anId ]->GetPolyDataOutput() );
- myMapper->SetInput( myPassFilter[ anId ]->GetPolyDataOutput() );
-
- vtkLODActor::SetMapper( myMapper );
- Modified();
- }
-}
-
-
-VTKViewer_ExtractUnstructuredGrid* SMESH_DeviceActor::GetExtractUnstructuredGrid(){
- return myExtractUnstructuredGrid;
-}
-
-
-vtkUnstructuredGrid* SMESH_DeviceActor::GetUnstructuredGrid(){
- myExtractUnstructuredGrid->Update();
- return myExtractUnstructuredGrid->GetOutput();
-}
-
-
-void SMESH_DeviceActor::SetControlMode(SMESH::Controls::FunctorPtr theFunctor,
- vtkScalarBarActor* theScalarBarActor,
- vtkLookupTable* theLookupTable)
-{
- bool anIsInitialized = theFunctor;
- if(anIsInitialized){
- vtkUnstructuredGrid* aDataSet = vtkUnstructuredGrid::New();
-
- SetStoreIDMapping(true);
- myExtractUnstructuredGrid->Update();
- vtkUnstructuredGrid* aGrid = myExtractUnstructuredGrid->GetOutput();
-
- aDataSet->ShallowCopy(aGrid);
-
- vtkDoubleArray *aScalars = vtkDoubleArray::New();
- vtkIdType aNbCells = aGrid->GetNumberOfCells();
- aScalars->SetNumberOfComponents(1);
- aScalars->SetNumberOfTuples(aNbCells);
-
- myVisualObj->UpdateFunctor(theFunctor);
-
- using namespace SMESH::Controls;
- if(NumericalFunctor* aNumericalFunctor = dynamic_cast<NumericalFunctor*>(theFunctor.get())){
- for(vtkIdType i = 0; i < aNbCells; i++){
- vtkIdType anId = myExtractUnstructuredGrid->GetInputId(i);
- vtkIdType anObjId = myVisualObj->GetElemObjId(anId);
- double aValue = aNumericalFunctor->GetValue(anObjId);
- aScalars->SetValue(i,aValue);
- }
- }else if(Predicate* aPredicate = dynamic_cast<Predicate*>(theFunctor.get())){
- for(vtkIdType i = 0; i < aNbCells; i++){
- vtkIdType anId = myExtractUnstructuredGrid->GetInputId(i);
- vtkIdType anObjId = myVisualObj->GetElemObjId(anId);
- bool aValue = aPredicate->IsSatisfy(anObjId);
- aScalars->SetValue(i,aValue);
- }
- }
-
- aDataSet->GetCellData()->SetScalars(aScalars);
- aScalars->Delete();
-
- theLookupTable->SetRange(aScalars->GetRange());
- theLookupTable->Build();
-
- myMergeFilter->SetScalars(aDataSet);
- aDataSet->Delete();
- }
- GetMapper()->SetScalarVisibility(anIsInitialized);
- theScalarBarActor->SetVisibility(anIsInitialized);
-}
-
-void SMESH_DeviceActor::SetExtControlMode(SMESH::Controls::FunctorPtr theFunctor,
- vtkScalarBarActor* theScalarBarActor,
- vtkLookupTable* theLookupTable)
-{
- bool anIsInitialized = theFunctor;
- myExtractUnstructuredGrid->ClearRegisteredCells();
- myExtractUnstructuredGrid->ClearRegisteredCellsWithType();
- myExtractUnstructuredGrid->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::ePassAll);
- myVisualObj->UpdateFunctor(theFunctor);
-
- using namespace SMESH::Controls;
- if (anIsInitialized){
- if (Length2D* aLength2D = dynamic_cast<Length2D*>(theFunctor.get())){
- SMESH::Controls::Length2D::TValues aValues;
-
- aLength2D->GetValues(aValues);
- vtkUnstructuredGrid* aDataSet = vtkUnstructuredGrid::New();
- vtkUnstructuredGrid* aGrid = myVisualObj->GetUnstructuredGrid();
-
- aDataSet->SetPoints(aGrid->GetPoints());
-
- vtkIdType aNbCells = aValues.size();
-
- vtkDoubleArray *aScalars = vtkDoubleArray::New();
- aScalars->SetNumberOfComponents(1);
- aScalars->SetNumberOfTuples(aNbCells);
-
- vtkIdType aCellsSize = 3*aNbCells;
- vtkCellArray* aConnectivity = vtkCellArray::New();
- aConnectivity->Allocate( aCellsSize, 0 );
-
- vtkUnsignedCharArray* aCellTypesArray = vtkUnsignedCharArray::New();
- aCellTypesArray->SetNumberOfComponents( 1 );
- aCellTypesArray->Allocate( aNbCells * aCellTypesArray->GetNumberOfComponents() );
-
- vtkIdList *anIdList = vtkIdList::New();
- anIdList->SetNumberOfIds(2);
-
- Length2D::TValues::const_iterator anIter = aValues.begin();
- for(vtkIdType aVtkId = 0; anIter != aValues.end(); anIter++,aVtkId++){
- const Length2D::Value& aValue = *anIter;
- int aNode[2] = {
- myVisualObj->GetNodeVTKId(aValue.myPntId[0]),
- myVisualObj->GetNodeVTKId(aValue.myPntId[1])
- };
- if(aNode[0] >= 0 && aNode[1] >= 0){
- anIdList->SetId( 0, aNode[0] );
- anIdList->SetId( 1, aNode[1] );
- aConnectivity->InsertNextCell( anIdList );
- aCellTypesArray->InsertNextValue( VTK_LINE );
- aScalars->SetValue(aVtkId,aValue.myLength);
- }
- }
-
- vtkIntArray* aCellLocationsArray = vtkIntArray::New();
- aCellLocationsArray->SetNumberOfComponents( 1 );
- aCellLocationsArray->SetNumberOfTuples( aNbCells );
-
- aConnectivity->InitTraversal();
- for( vtkIdType idType = 0, *pts, npts; aConnectivity->GetNextCell( npts, pts ); idType++ )
- aCellLocationsArray->SetValue( idType, aConnectivity->GetTraversalLocation( npts ) );
-
- aDataSet->SetCells( aCellTypesArray, aCellLocationsArray,aConnectivity );
- SetUnstructuredGrid(aDataSet);
-
- aDataSet->GetCellData()->SetScalars(aScalars);
- aScalars->Delete();
-
- theLookupTable->SetRange(aScalars->GetRange());
- theLookupTable->Build();
-
- myMergeFilter->SetScalars(aDataSet);
- aDataSet->Delete();
- }
- else if (MultiConnection2D* aMultiConnection2D = dynamic_cast<MultiConnection2D*>(theFunctor.get())){
- SMESH::Controls::MultiConnection2D::MValues aValues;
-
- aMultiConnection2D->GetValues(aValues);
- vtkUnstructuredGrid* aDataSet = vtkUnstructuredGrid::New();
- vtkUnstructuredGrid* aGrid = myVisualObj->GetUnstructuredGrid();
- aDataSet->SetPoints(aGrid->GetPoints());
-
- vtkIdType aNbCells = aValues.size();
- vtkDoubleArray *aScalars = vtkDoubleArray::New();
- aScalars->SetNumberOfComponents(1);
- aScalars->SetNumberOfTuples(aNbCells);
-
- vtkIdType aCellsSize = 3*aNbCells;
- vtkCellArray* aConnectivity = vtkCellArray::New();
- aConnectivity->Allocate( aCellsSize, 0 );
-
- vtkUnsignedCharArray* aCellTypesArray = vtkUnsignedCharArray::New();
- aCellTypesArray->SetNumberOfComponents( 1 );
- aCellTypesArray->Allocate( aNbCells * aCellTypesArray->GetNumberOfComponents() );
-
- vtkIdList *anIdList = vtkIdList::New();
- anIdList->SetNumberOfIds(2);
-
- MultiConnection2D::MValues::const_iterator anIter = aValues.begin();
- for(vtkIdType aVtkId = 0; anIter != aValues.end(); anIter++,aVtkId++){
- const MultiConnection2D::Value& aValue = (*anIter).first;
- int aNode[2] = {
- myVisualObj->GetNodeVTKId(aValue.myPntId[0]),
- myVisualObj->GetNodeVTKId(aValue.myPntId[1])
- };
- if(aNode[0] >= 0 && aNode[1] >= 0){
- anIdList->SetId( 0, aNode[0] );
- anIdList->SetId( 1, aNode[1] );
- aConnectivity->InsertNextCell( anIdList );
- aCellTypesArray->InsertNextValue( VTK_LINE );
- aScalars->SetValue(aVtkId,(*anIter).second);
- }
- }
-
- vtkIntArray* aCellLocationsArray = vtkIntArray::New();
- aCellLocationsArray->SetNumberOfComponents( 1 );
- aCellLocationsArray->SetNumberOfTuples( aNbCells );
-
- aConnectivity->InitTraversal();
- for( vtkIdType idType = 0, *pts, npts; aConnectivity->GetNextCell( npts, pts ); idType++ )
- aCellLocationsArray->SetValue( idType, aConnectivity->GetTraversalLocation( npts ) );
-
- aDataSet->SetCells( aCellTypesArray, aCellLocationsArray,aConnectivity );
- SetUnstructuredGrid(aDataSet);
-
- aDataSet->GetCellData()->SetScalars(aScalars);
- aScalars->Delete();
-
- theLookupTable->SetRange(aScalars->GetRange());
- theLookupTable->Build();
-
- myMergeFilter->SetScalars(aDataSet);
- aDataSet->Delete();
- }
- }
- GetMapper()->SetScalarVisibility(anIsInitialized);
- theScalarBarActor->SetVisibility(anIsInitialized);
-}
-
-void SMESH_DeviceActor::SetExtControlMode(SMESH::Controls::FunctorPtr theFunctor)
-{
- myExtractUnstructuredGrid->ClearRegisteredCells();
- myExtractUnstructuredGrid->ClearRegisteredCellsWithType();
- myExtractUnstructuredGrid->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::ePassAll);
- myVisualObj->UpdateFunctor(theFunctor);
-
- using namespace SMESH::Controls;
- if(FreeBorders* aFreeBorders = dynamic_cast<FreeBorders*>(theFunctor.get())){
- myExtractUnstructuredGrid->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::eAdding);
- vtkUnstructuredGrid* aGrid = myVisualObj->GetUnstructuredGrid();
- vtkIdType aNbCells = aGrid->GetNumberOfCells();
- for( vtkIdType i = 0; i < aNbCells; i++ ){
- vtkIdType anObjId = myVisualObj->GetElemObjId(i);
- if(aFreeBorders->IsSatisfy(anObjId))
- myExtractUnstructuredGrid->RegisterCell(i);
- }
- if(!myExtractUnstructuredGrid->IsCellsRegistered())
- myExtractUnstructuredGrid->RegisterCell(-1);
- SetUnstructuredGrid(myVisualObj->GetUnstructuredGrid());
- }else if(FreeEdges* aFreeEdges = dynamic_cast<FreeEdges*>(theFunctor.get())){
- SMESH::Controls::FreeEdges::TBorders aBorders;
- aFreeEdges->GetBoreders(aBorders);
- vtkUnstructuredGrid* aDataSet = vtkUnstructuredGrid::New();
- vtkUnstructuredGrid* aGrid = myVisualObj->GetUnstructuredGrid();
- aDataSet->SetPoints(aGrid->GetPoints());
-
- vtkIdType aNbCells = aBorders.size();
- vtkIdType aCellsSize = 3*aNbCells;
- vtkCellArray* aConnectivity = vtkCellArray::New();
- aConnectivity->Allocate( aCellsSize, 0 );
-
- vtkUnsignedCharArray* aCellTypesArray = vtkUnsignedCharArray::New();
- aCellTypesArray->SetNumberOfComponents( 1 );
- aCellTypesArray->Allocate( aNbCells * aCellTypesArray->GetNumberOfComponents() );
-
- vtkIdList *anIdList = vtkIdList::New();
- anIdList->SetNumberOfIds(2);
-
- FreeEdges::TBorders::const_iterator anIter = aBorders.begin();
- for(; anIter != aBorders.end(); anIter++){
- const FreeEdges::Border& aBorder = *anIter;
- int aNode[2] = {
- myVisualObj->GetNodeVTKId(aBorder.myPntId[0]),
- myVisualObj->GetNodeVTKId(aBorder.myPntId[1])
- };
- //cout<<"aNode = "<<aBorder.myPntId[0]<<"; "<<aBorder.myPntId[1]<<endl;
- if(aNode[0] >= 0 && aNode[1] >= 0){
- anIdList->SetId( 0, aNode[0] );
- anIdList->SetId( 1, aNode[1] );
- aConnectivity->InsertNextCell( anIdList );
- aCellTypesArray->InsertNextValue( VTK_LINE );
- }
- }
-
- vtkIntArray* aCellLocationsArray = vtkIntArray::New();
- aCellLocationsArray->SetNumberOfComponents( 1 );
- aCellLocationsArray->SetNumberOfTuples( aNbCells );
-
- aConnectivity->InitTraversal();
- for( vtkIdType idType = 0, *pts, npts; aConnectivity->GetNextCell( npts, pts ); idType++ )
- aCellLocationsArray->SetValue( idType, aConnectivity->GetTraversalLocation( npts ) );
-
- aDataSet->SetCells( aCellTypesArray, aCellLocationsArray,aConnectivity );
-
- SetUnstructuredGrid(aDataSet);
- aDataSet->Delete();
- }
-}
-
-
-
-
-unsigned long int SMESH_DeviceActor::GetMTime(){
- unsigned long mTime = this->Superclass::GetMTime();
- mTime = max(mTime,myExtractGeometry->GetMTime());
- mTime = max(mTime,myExtractUnstructuredGrid->GetMTime());
- mTime = max(mTime,myMergeFilter->GetMTime());
- mTime = max(mTime,myGeomFilter->GetMTime());
- mTime = max(mTime,myTransformFilter->GetMTime());
- return mTime;
-}
-
-
-void SMESH_DeviceActor::SetTransform(VTKViewer_Transform* theTransform){
- myTransformFilter->SetTransform(theTransform);
-}
-
-
-void SMESH_DeviceActor::SetShrink() {
- if ( !myIsShrinkable ) return;
- if ( vtkDataSet* aDataSet = myPassFilter[ 0 ]->GetOutput() )
- {
- myShrinkFilter->SetInput( aDataSet );
- myPassFilter[ 1 ]->SetInput( myShrinkFilter->GetOutput() );
- myIsShrunk = true;
- }
-}
-
-void SMESH_DeviceActor::UnShrink() {
- if ( !myIsShrunk ) return;
- if ( vtkDataSet* aDataSet = myPassFilter[ 0 ]->GetOutput() )
- {
- myPassFilter[ 1 ]->SetInput( aDataSet );
- myPassFilter[ 1 ]->Modified();
- myIsShrunk = false;
- Modified();
- }
-}
-
-
-void SMESH_DeviceActor::SetRepresentation(EReperesent theMode){
- switch(theMode){
- case ePoint:
- myGeomFilter->SetInside(true);
- GetProperty()->SetRepresentation(0);
- break;
- case eInsideframe:
- myGeomFilter->SetInside(true);
- GetProperty()->SetRepresentation(1);
- break;
- default :
- myGeomFilter->SetInside(false);
- GetProperty()->SetRepresentation(theMode);
- }
- myRepresentation = theMode;
- GetProperty()->Modified();
- myMapper->Modified();
- Modified();
-}
-
-
-void SMESH_DeviceActor::SetVisibility(int theMode){
- if(!myExtractUnstructuredGrid->GetInput() ||
- GetUnstructuredGrid()->GetNumberOfCells())
- {
- vtkLODActor::SetVisibility(theMode);
- }else{
- vtkLODActor::SetVisibility(false);
- }
-}
-
-
-int SMESH_DeviceActor::GetVisibility(){
- if(!GetUnstructuredGrid()->GetNumberOfCells()){
- vtkLODActor::SetVisibility(false);
- }
- return vtkLODActor::GetVisibility();
-}
-
-
-int SMESH_DeviceActor::GetNodeObjId(int theVtkID){
- vtkIdType anID = theVtkID;
-
- if(IsImplicitFunctionUsed())
- anID = myExtractGeometry->GetNodeObjId(theVtkID);
-
- vtkIdType aRetID = myVisualObj->GetNodeObjId(anID);
- if(MYDEBUG) MESSAGE("GetNodeObjId - theVtkID = "<<theVtkID<<"; anID = "<<anID<<"; aRetID = "<<aRetID);
- return aRetID;
-}
-
-float* SMESH_DeviceActor::GetNodeCoord(int theObjID){
- vtkDataSet* aDataSet = myMergeFilter->GetOutput();
- vtkIdType anID = myVisualObj->GetNodeVTKId(theObjID);
- float* aCoord = aDataSet->GetPoint(anID);
- if(MYDEBUG) MESSAGE("GetNodeCoord - theObjID = "<<theObjID<<"; anID = "<<anID);
- return aCoord;
-}
-
-
-int SMESH_DeviceActor::GetElemObjId(int theVtkID){
- vtkIdType anId = myGeomFilter->GetElemObjId(theVtkID);
- if(anId < 0)
- return -1;
-
- vtkIdType anId2 = anId;
- if(IsImplicitFunctionUsed())
- anId2 = myExtractGeometry->GetElemObjId(anId);
- if(anId2 < 0)
- return -1;
-
- vtkIdType anId3 = myExtractUnstructuredGrid->GetInputId(anId2);
- if(anId3 < 0)
- return -1;
-
- vtkIdType aRetID = myVisualObj->GetElemObjId(anId3);
- if(MYDEBUG)
- MESSAGE("GetElemObjId - theVtkID = "<<theVtkID<<"; anId2 = "<<anId2<<"; anId3 = "<<anId3<<"; aRetID = "<<aRetID);
- return aRetID;
-}
-
-vtkCell* SMESH_DeviceActor::GetElemCell(int theObjID){
- vtkDataSet* aDataSet = myVisualObj->GetUnstructuredGrid();
- vtkIdType aGridID = myVisualObj->GetElemVTKId(theObjID);
- vtkCell* aCell = aDataSet->GetCell(aGridID);
- if(MYDEBUG)
- MESSAGE("GetElemCell - theObjID = "<<theObjID<<"; aGridID = "<<aGridID);
- return aCell;
-}
-
-
-float SMESH_DeviceActor::GetShrinkFactor(){
- return myShrinkFilter->GetShrinkFactor();
-}
-
-void SMESH_DeviceActor::SetShrinkFactor(float theValue){
- theValue = theValue > 0.1? theValue: 0.8;
- myShrinkFilter->SetShrinkFactor(theValue);
- Modified();
-}
-
-
-void SMESH_DeviceActor::SetHighlited(bool theIsHighlited){
- myIsHighlited = theIsHighlited;
- Modified();
-}
-
-void SMESH_DeviceActor::Render(vtkRenderer *ren, vtkMapper* m){
- int aResolveCoincidentTopology = vtkMapper::GetResolveCoincidentTopology();
- float aStoredFactor, aStoredUnit;
- vtkMapper::GetResolveCoincidentTopologyPolygonOffsetParameters(aStoredFactor,aStoredUnit);
-
- vtkMapper::SetResolveCoincidentTopologyToPolygonOffset();
- float aFactor = myPolygonOffsetFactor, aUnits = myPolygonOffsetUnits;
- if(myIsHighlited){
- static float EPS = .01;
- aUnits *= (1.0-EPS);
- }
- vtkMapper::SetResolveCoincidentTopologyPolygonOffsetParameters(aFactor,aUnits);
- vtkLODActor::Render(ren,m);
-
- vtkMapper::SetResolveCoincidentTopologyPolygonOffsetParameters(aStoredFactor,aStoredUnit);
- vtkMapper::SetResolveCoincidentTopology(aResolveCoincidentTopology);
-}
-
-
-void SMESH_DeviceActor::SetPolygonOffsetParameters(float factor, float units){
- myPolygonOffsetFactor = factor;
- myPolygonOffsetUnits = units;
-}
-
+++ /dev/null
-// SMESH OBJECT : interactive object for SMESH visualization
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESH_DeviceActor.h
-// Author : Nicolas REJNERI
-// Module : SMESH
-// $Header$
-
-#ifndef SMESH_DEVICE_ACTOR_H
-#define SMESH_DEVICE_ACTOR_H
-
-#include <VTKViewer_GeometryFilter.h>
-#include "SMESH_Controls.hxx"
-#include "SMESH_Object.h"
-
-#include <vtkLODActor.h>
-#include <vtkSmartPointer.h>
-
-class vtkCell;
-class vtkProperty;
-class vtkMergeFilter;
-class vtkShrinkFilter;
-class vtkPolyDataMapper;
-class vtkUnstructuredGrid;
-class vtkScalarBarActor;
-class vtkLookupTable;
-class vtkImplicitBoolean;
-
-class VTKViewer_Transform;
-class VTKViewer_TransformFilter;
-class VTKViewer_PassThroughFilter;
-class VTKViewer_ExtractUnstructuredGrid;
-
-class SMESH_ExtractGeometry;
-
-
-class SMESH_DeviceActor: public vtkLODActor{
- friend class SMESH_ActorDef;
-
- public:
- vtkTypeMacro(SMESH_DeviceActor,vtkLODActor);
- static SMESH_DeviceActor* New();
-
- void SetStoreClippingMapping(bool theStoreMapping);
- void SetStoreGemetryMapping(bool theStoreMapping);
- void SetStoreIDMapping(bool theStoreMapping);
-
- virtual int GetNodeObjId(int theVtkID);
- virtual float* GetNodeCoord(int theObjID);
-
- virtual int GetElemObjId(int theVtkID);
- virtual vtkCell* GetElemCell(int theObjID);
-
- virtual void SetTransform(VTKViewer_Transform* theTransform);
- virtual unsigned long int GetMTime();
-
- float GetShrinkFactor();
- void SetShrinkFactor(float value);
-
- bool IsShrunkable() { return myIsShrinkable;}
- bool IsShrunk() { return myIsShrunk;}
- void SetShrink();
- void UnShrink();
-
- enum EReperesent { ePoint, eWireframe, eSurface, eInsideframe};
- EReperesent GetRepresentation(){ return myRepresentation;}
- void SetRepresentation(EReperesent theMode);
-
- virtual void SetVisibility(int theMode);
- virtual int GetVisibility();
-
- VTKViewer_ExtractUnstructuredGrid* GetExtractUnstructuredGrid();
- vtkUnstructuredGrid* GetUnstructuredGrid();
-
- void SetControlMode(SMESH::Controls::FunctorPtr theFunctor,
- vtkScalarBarActor* theScalarBarActor,
- vtkLookupTable* theLookupTable);
- void SetExtControlMode(SMESH::Controls::FunctorPtr theFunctor,
- vtkScalarBarActor* theScalarBarActor,
- vtkLookupTable* theLookupTable);
- void SetExtControlMode(SMESH::Controls::FunctorPtr theFunctor);
-
- bool IsHighlited() { return myIsHighlited;}
- void SetHighlited(bool theIsHighlited);
-
- virtual void Render(vtkRenderer *, vtkMapper *);
-
- void SetImplicitFunctionUsed(bool theIsImplicitFunctionUsed);
- bool IsImplicitFunctionUsed() const{ return myIsImplicitFunctionUsed;}
-
- protected:
- void Init(TVisualObjPtr theVisualObj, vtkImplicitBoolean* theImplicitBoolean);
- void SetUnstructuredGrid(vtkUnstructuredGrid* theGrid);
-
- vtkPolyDataMapper *myMapper;
- TVisualObjPtr myVisualObj;
-
- vtkProperty *myProperty;
- EReperesent myRepresentation;
-
- SMESH_ExtractGeometry* myExtractGeometry;
- bool myIsImplicitFunctionUsed;
-
- vtkMergeFilter* myMergeFilter;
- VTKViewer_ExtractUnstructuredGrid* myExtractUnstructuredGrid;
-
- bool myStoreClippingMapping;
- VTKViewer_GeometryFilter *myGeomFilter;
- VTKViewer_TransformFilter *myTransformFilter;
- std::vector<VTKViewer_PassThroughFilter*> myPassFilter;
-
- vtkShrinkFilter* myShrinkFilter;
- bool myIsShrinkable;
- bool myIsShrunk;
-
- bool myIsHighlited;
-
- float myPolygonOffsetFactor;
- float myPolygonOffsetUnits;
-
- void SetPolygonOffsetParameters(float factor, float units);
- void GetPolygonOffsetParameters(float& factor, float& units){
- factor = myPolygonOffsetFactor;
- units = myPolygonOffsetUnits;
- }
-
- SMESH_DeviceActor();
- ~SMESH_DeviceActor();
- SMESH_DeviceActor(const SMESH_DeviceActor&);
- void operator=(const SMESH_DeviceActor&);
-
-};
-
-
-#endif //SMESH_DEVICE_ACTOR_H
+++ /dev/null
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-
-#include "SMESH_ExtractGeometry.h"
-
-#include "vtkCell.h"
-#include "vtkCellData.h"
-#include "vtkFloatArray.h"
-#include "vtkIdList.h"
-#include "vtkImplicitFunction.h"
-#include "vtkObjectFactory.h"
-#include "vtkPointData.h"
-#include "vtkUnstructuredGrid.h"
-
-using namespace std;
-
-#ifdef _DEBUG_
-static int MYDEBUG = 0;
-#else
-static int MYDEBUG = 0;
-#endif
-
-#if defined __GNUC__
- #if __GNUC__ == 2
- #define __GNUC_2__
- #endif
-#endif
-
-
-vtkStandardNewMacro(SMESH_ExtractGeometry);
-
-
-SMESH_ExtractGeometry::SMESH_ExtractGeometry()
-{}
-
-
-SMESH_ExtractGeometry::~SMESH_ExtractGeometry(){}
-
-
-vtkIdType SMESH_ExtractGeometry::GetElemObjId(int theVtkID){
- if(myElemVTK2ObjIds.empty() || theVtkID > myElemVTK2ObjIds.size()) return -1;
-#if defined __GNUC_2__
- return myElemVTK2ObjIds[theVtkID];
-#else
- return myElemVTK2ObjIds.at(theVtkID);
-#endif
-}
-
-
-vtkIdType SMESH_ExtractGeometry::GetNodeObjId(int theVtkID){
- if(myNodeVTK2ObjIds.empty() || theVtkID > myNodeVTK2ObjIds.size()) return -1;
-#if defined __GNUC_2__
- return myNodeVTK2ObjIds[theVtkID];
-#else
- return myNodeVTK2ObjIds.at(theVtkID);
-#endif
-}
-
-
-void SMESH_ExtractGeometry::Execute()
-{
- vtkIdType ptId, numPts, numCells, i, cellId, newCellId, newId, *pointMap;
- vtkIdList *cellPts;
- vtkCell *cell;
- int numCellPts;
- float *x;
- float multiplier;
- vtkPoints *newPts;
- vtkIdList *newCellPts;
- vtkDataSet *input = this->GetInput();
- vtkPointData *pd = input->GetPointData();
- vtkCellData *cd = input->GetCellData();
- vtkUnstructuredGrid *output = this->GetOutput();
- vtkPointData *outputPD = output->GetPointData();
- vtkCellData *outputCD = output->GetCellData();
- int npts;
- numCells = input->GetNumberOfCells();
- numPts = input->GetNumberOfPoints();
-
- vtkDebugMacro(<< "Extracting geometry");
-
- if ( ! this->ImplicitFunction )
- {
- vtkErrorMacro(<<"No implicit function specified");
- return;
- }
-
- newCellPts = vtkIdList::New();
- newCellPts->Allocate(VTK_CELL_SIZE);
-
- if ( this->ExtractInside )
- {
- multiplier = 1.0;
- }
- else
- {
- multiplier = -1.0;
- }
-
- // Loop over all points determining whether they are inside the
- // implicit function. Copy the points and point data if they are.
- //
- pointMap = new vtkIdType[numPts]; // maps old point ids into new
- for (i=0; i < numPts; i++)
- {
- pointMap[i] = -1;
- }
-
- output->Allocate(numCells/4); //allocate storage for geometry/topology
- newPts = vtkPoints::New();
- newPts->Allocate(numPts/4,numPts);
- outputPD->CopyAllocate(pd);
- outputCD->CopyAllocate(cd);
- vtkFloatArray *newScalars = NULL;
-
- if(myStoreMapping){
- myElemVTK2ObjIds.clear();
- myElemVTK2ObjIds.reserve(numCells);
- myNodeVTK2ObjIds.clear();
- myNodeVTK2ObjIds.reserve(numPts);
- }
-
- if ( ! this->ExtractBoundaryCells )
- {
- for ( ptId=0; ptId < numPts; ptId++ )
- {
- x = input->GetPoint(ptId);
- if ( (this->ImplicitFunction->FunctionValue(x)*multiplier) < 0.0 )
- {
- newId = newPts->InsertNextPoint(x);
- pointMap[ptId] = newId;
- myNodeVTK2ObjIds.push_back(ptId);
- outputPD->CopyData(pd,ptId,newId);
- }
- }
- }
- else
- {
- // To extract boundary cells, we have to create supplemental information
- if ( this->ExtractBoundaryCells )
- {
- float val;
- newScalars = vtkFloatArray::New();
- newScalars->SetNumberOfValues(numPts);
-
- for (ptId=0; ptId < numPts; ptId++ )
- {
- x = input->GetPoint(ptId);
- val = this->ImplicitFunction->FunctionValue(x) * multiplier;
- newScalars->SetValue(ptId, val);
- if ( val < 0.0 )
- {
- newId = newPts->InsertNextPoint(x);
- pointMap[ptId] = newId;
- myNodeVTK2ObjIds.push_back(ptId);
- outputPD->CopyData(pd,ptId,newId);
- }
- }
- }
- }
-
- // Now loop over all cells to see whether they are inside implicit
- // function (or on boundary if ExtractBoundaryCells is on).
- //
- for (cellId=0; cellId < numCells; cellId++)
- {
- cell = input->GetCell(cellId);
- cellPts = cell->GetPointIds();
- numCellPts = cell->GetNumberOfPoints();
-
- newCellPts->Reset();
- if ( ! this->ExtractBoundaryCells ) //requires less work
- {
- for ( npts=0, i=0; i < numCellPts; i++, npts++)
- {
- ptId = cellPts->GetId(i);
- if ( pointMap[ptId] < 0 )
- {
- break; //this cell won't be inserted
- }
- else
- {
- newCellPts->InsertId(i,pointMap[ptId]);
- }
- }
- } //if don't want to extract boundary cells
-
- else //want boundary cells
- {
- for ( npts=0, i=0; i < numCellPts; i++ )
- {
- ptId = cellPts->GetId(i);
- if ( newScalars->GetValue(ptId) <= 0.0 )
- {
- npts++;
- }
- }
- if ( npts > 0 )
- {
- for ( i=0; i < numCellPts; i++ )
- {
- ptId = cellPts->GetId(i);
- if ( pointMap[ptId] < 0 )
- {
- x = input->GetPoint(ptId);
- newId = newPts->InsertNextPoint(x);
- pointMap[ptId] = newId;
- myNodeVTK2ObjIds.push_back(ptId);
- outputPD->CopyData(pd,ptId,newId);
- }
- newCellPts->InsertId(i,pointMap[ptId]);
- }
- }//a boundary or interior cell
- }//if mapping boundary cells
-
- if ( npts >= numCellPts || (this->ExtractBoundaryCells && npts > 0) )
- {
- newCellId = output->InsertNextCell(cell->GetCellType(),newCellPts);
- myElemVTK2ObjIds.push_back(cellId);
- outputCD->CopyData(cd,cellId,newCellId);
- }
- }//for all cells
-
- // Update ourselves and release memory
- //
- delete [] pointMap;
- newCellPts->Delete();
- output->SetPoints(newPts);
- newPts->Delete();
-
- if ( this->ExtractBoundaryCells )
- {
- newScalars->Delete();
- }
-
- output->Squeeze();
-}
+++ /dev/null
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-#ifndef SALOME_ExtractGeometry_HeaderFile
-#define SALOME_ExtractGeometry_HeaderFile
-
-#include <vtkExtractGeometry.h>
-#include <vector>
-
-
-class SMESH_ExtractGeometry : public vtkExtractGeometry{
-public:
- vtkTypeMacro(SMESH_ExtractGeometry,vtkExtractGeometry);
-
- static SMESH_ExtractGeometry *New();
-
- void SetStoreMapping(bool theStoreMapping){
- myStoreMapping = theStoreMapping;
- Modified();
- }
- bool GetStoreMapping(){ return myStoreMapping;}
-
- virtual vtkIdType GetNodeObjId(int theVtkID);
- virtual vtkIdType GetElemObjId(int theVtkID);
-
-protected:
- SMESH_ExtractGeometry();
- ~SMESH_ExtractGeometry();
-
- void Execute();
-
-private:
- bool myStoreMapping;
- typedef std::vector<vtkIdType> TVectorId;
- TVectorId myElemVTK2ObjIds;
- TVectorId myNodeVTK2ObjIds;
-
- SMESH_ExtractGeometry(const SMESH_ExtractGeometry&); // Not implemented.
- void operator=(const SMESH_ExtractGeometry&); // Not implemented.
-};
-
-
-#endif
-
-
+++ /dev/null
-// SMESH OBJECT : interactive object for SMESH visualization
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESH_Grid.cxx
-// Author : Nicolas REJNERI
-// Module : SMESH
-
-#include "SMESH_ObjectDef.h"
-#include "SMESH_ActorUtils.h"
-
-#include "SMDS_Mesh.hxx"
-#include "SMESH_Actor.h"
-#include "SMESH_ControlsDef.hxx"
-#include <VTKViewer_ExtractUnstructuredGrid.h>
-
-#include CORBA_SERVER_HEADER(SALOME_Exception)
-
-#include <vtkCell.h>
-#include <vtkIdList.h>
-#include <vtkIntArray.h>
-#include <vtkCellArray.h>
-#include <vtkUnsignedCharArray.h>
-
-#include <vtkUnstructuredGrid.h>
-
-#include <memory>
-#include <sstream>
-#include <stdexcept>
-#include <set>
-
-#include "utilities.h"
-
-using namespace std;
-
-#ifndef EXCEPTION
-#define EXCEPTION(TYPE, MSG) {\
- std::ostringstream aStream;\
- aStream<<__FILE__<<"["<<__LINE__<<"]::"<<MSG;\
- throw TYPE(aStream.str());\
-}
-#endif
-
-#ifdef _DEBUG_
-static int MYDEBUG = 0;
-static int MYDEBUGWITHFILES = 0;
-#else
-static int MYDEBUG = 0;
-static int MYDEBUGWITHFILES = 0;
-#endif
-
-
-namespace{
-
- inline const SMDS_MeshNode* FindNode(const SMDS_Mesh* theMesh, int theId){
- if(const SMDS_MeshNode* anElem = theMesh->FindNode(theId)) return anElem;
- EXCEPTION(runtime_error,"SMDS_Mesh::FindNode - cannot find a SMDS_MeshNode for ID = "<<theId);
- }
-
-
- inline const SMDS_MeshElement* FindElement(const SMDS_Mesh* theMesh, int theId){
- if(const SMDS_MeshElement* anElem = theMesh->FindElement(theId)) return anElem;
- EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot find a SMDS_MeshElement for ID = "<<theId);
- }
-
-
- inline void AddNodesWithID(SMDS_Mesh* theMesh,
- SMESH::log_array_var& theSeq,
- CORBA::Long theId)
- {
- const SMESH::double_array& aCoords = theSeq[theId].coords;
- const SMESH::long_array& anIndexes = theSeq[theId].indexes;
- CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
- if(3*aNbElems != aCoords.length())
- EXCEPTION(runtime_error,"AddNodesWithID - 3*aNbElems != aCoords.length()");
- for(CORBA::Long aCoordId = 0; anElemId < aNbElems; anElemId++, aCoordId+=3){
- SMDS_MeshElement* anElem = theMesh->AddNodeWithID(aCoords[aCoordId],
- aCoords[aCoordId+1],
- aCoords[aCoordId+2],
- anIndexes[anElemId]);
- if(!anElem)
- EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddNodeWithID for ID = "<<anElemId);
- }
- }
-
-
- inline void AddEdgesWithID(SMDS_Mesh* theMesh,
- SMESH::log_array_var& theSeq,
- CORBA::Long theId)
- {
- const SMESH::long_array& anIndexes = theSeq[theId].indexes;
- CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
- if(3*aNbElems != anIndexes.length())
- EXCEPTION(runtime_error,"AddEdgeWithID - 3*aNbElems != aCoords.length()");
- for(CORBA::Long anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=3){
- SMDS_MeshElement* anElem = theMesh->AddEdgeWithID(anIndexes[anIndexId+1],
- anIndexes[anIndexId+2],
- anIndexes[anIndexId]);
- if(!anElem)
- EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddEdgeWithID for ID = "<<anElemId);
- }
- }
-
-
- inline void AddTriasWithID(SMDS_Mesh* theMesh,
- SMESH::log_array_var& theSeq,
- CORBA::Long theId)
- {
- const SMESH::long_array& anIndexes = theSeq[theId].indexes;
- CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
- if(4*aNbElems != anIndexes.length())
- EXCEPTION(runtime_error,"AddEdgeWithID - 4*aNbElems != anIndexes.length()");
- for(CORBA::Long anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=4){
- SMDS_MeshElement* anElem = theMesh->AddFaceWithID(anIndexes[anIndexId+1],
- anIndexes[anIndexId+2],
- anIndexes[anIndexId+3],
- anIndexes[anIndexId]);
- if(!anElem)
- EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddFaceWithID for ID = "<<anElemId);
- }
- }
-
-
- inline void AddQuadsWithID(SMDS_Mesh* theMesh,
- SMESH::log_array_var theSeq,
- CORBA::Long theId)
- {
- const SMESH::long_array& anIndexes = theSeq[theId].indexes;
- CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
- if(5*aNbElems != anIndexes.length())
- EXCEPTION(runtime_error,"AddEdgeWithID - 4*aNbElems != anIndexes.length()");
- for(CORBA::Long anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=5){
- SMDS_MeshElement* anElem = theMesh->AddFaceWithID(anIndexes[anIndexId+1],
- anIndexes[anIndexId+2],
- anIndexes[anIndexId+3],
- anIndexes[anIndexId+4],
- anIndexes[anIndexId]);
- if(!anElem)
- EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddFaceWithID for ID = "<<anElemId);
- }
- }
-
-
- inline void AddPolygonsWithID(SMDS_Mesh* theMesh,
- SMESH::log_array_var& theSeq,
- CORBA::Long theId)
- {
- const SMESH::long_array& anIndexes = theSeq[theId].indexes;
- CORBA::Long anIndexId = 0, aNbElems = theSeq[theId].number;
-
- for (CORBA::Long anElemId = 0; anElemId < aNbElems; anElemId++) {
- int aFaceId = anIndexes[anIndexId++];
-
- int aNbNodes = anIndexes[anIndexId++];
- std::vector<int> nodes_ids (aNbNodes);
- for (int i = 0; i < aNbNodes; i++) {
- nodes_ids[i] = anIndexes[anIndexId++];
- }
-
- SMDS_MeshElement* anElem = theMesh->AddPolygonalFaceWithID(nodes_ids, aFaceId);
- if (!anElem)
- EXCEPTION(runtime_error, "SMDS_Mesh::FindElement - cannot AddPolygonalFaceWithID for ID = "
- << anElemId);
- }
- }
-
-
- inline void AddTetrasWithID(SMDS_Mesh* theMesh,
- SMESH::log_array_var& theSeq,
- CORBA::Long theId)
- {
- const SMESH::long_array& anIndexes = theSeq[theId].indexes;
- CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
- if(5*aNbElems != anIndexes.length())
- EXCEPTION(runtime_error,"AddEdgeWithID - 5*aNbElems != anIndexes.length()");
- for(CORBA::Long anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=5){
- SMDS_MeshElement* anElem = theMesh->AddVolumeWithID(anIndexes[anIndexId+1],
- anIndexes[anIndexId+2],
- anIndexes[anIndexId+3],
- anIndexes[anIndexId+4],
- anIndexes[anIndexId]);
- if(!anElem)
- EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddVolumeWithID for ID = "<<anElemId);
- }
- }
-
-
- inline void AddPiramidsWithID(SMDS_Mesh* theMesh,
- SMESH::log_array_var& theSeq,
- CORBA::Long theId)
- {
- const SMESH::long_array& anIndexes = theSeq[theId].indexes;
- CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
- if(6*aNbElems != anIndexes.length())
- EXCEPTION(runtime_error,"AddEdgeWithID - 6*aNbElems != anIndexes.length()");
- for(CORBA::Long anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=6){
- SMDS_MeshElement* anElem = theMesh->AddVolumeWithID(anIndexes[anIndexId+1],
- anIndexes[anIndexId+2],
- anIndexes[anIndexId+3],
- anIndexes[anIndexId+4],
- anIndexes[anIndexId+5],
- anIndexes[anIndexId]);
- if(!anElem)
- EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddVolumeWithID for ID = "<<anElemId);
- }
- }
-
-
- inline void AddPrismsWithID(SMDS_Mesh* theMesh,
- SMESH::log_array_var& theSeq,
- CORBA::Long theId)
- {
- const SMESH::long_array& anIndexes = theSeq[theId].indexes;
- CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
- if(7*aNbElems != anIndexes.length())
- EXCEPTION(runtime_error,"AddEdgeWithID - 7*aNbElems != anIndexes.length()");
- for(CORBA::Long anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=7){
- SMDS_MeshElement* anElem = theMesh->AddVolumeWithID(anIndexes[anIndexId+1],
- anIndexes[anIndexId+2],
- anIndexes[anIndexId+3],
- anIndexes[anIndexId+4],
- anIndexes[anIndexId+5],
- anIndexes[anIndexId+6],
- anIndexes[anIndexId]);
- if(!anElem)
- EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddVolumeWithID for ID = "<<anElemId);
- }
- }
-
-
- inline void AddHexasWithID(SMDS_Mesh* theMesh,
- SMESH::log_array_var& theSeq,
- CORBA::Long theId)
- {
- const SMESH::long_array& anIndexes = theSeq[theId].indexes;
- CORBA::Long anElemId = 0, aNbElems = theSeq[theId].number;
- if(9*aNbElems != anIndexes.length())
- EXCEPTION(runtime_error,"AddEdgeWithID - 9*aNbElems != anIndexes.length()");
- for(CORBA::Long anIndexId = 0; anElemId < aNbElems; anElemId++, anIndexId+=9){
- SMDS_MeshElement* anElem = theMesh->AddVolumeWithID(anIndexes[anIndexId+1],
- anIndexes[anIndexId+2],
- anIndexes[anIndexId+3],
- anIndexes[anIndexId+4],
- anIndexes[anIndexId+5],
- anIndexes[anIndexId+6],
- anIndexes[anIndexId+7],
- anIndexes[anIndexId+8],
- anIndexes[anIndexId]);
- if(!anElem)
- EXCEPTION(runtime_error,"SMDS_Mesh::FindElement - cannot AddVolumeWithID for ID = "<<anElemId);
- }
- }
-
-
- inline void AddPolyhedronsWithID (SMDS_Mesh* theMesh,
- SMESH::log_array_var& theSeq,
- CORBA::Long theId)
- {
- const SMESH::long_array& anIndexes = theSeq[theId].indexes;
- CORBA::Long anIndexId = 0, aNbElems = theSeq[theId].number;
-
- for (CORBA::Long anElemId = 0; anElemId < aNbElems; anElemId++) {
- int aFaceId = anIndexes[anIndexId++];
-
- int aNbNodes = anIndexes[anIndexId++];
- std::vector<int> nodes_ids (aNbNodes);
- for (int i = 0; i < aNbNodes; i++) {
- nodes_ids[i] = anIndexes[anIndexId++];
- }
-
- int aNbFaces = anIndexes[anIndexId++];
- std::vector<int> quantities (aNbFaces);
- for (int i = 0; i < aNbFaces; i++) {
- quantities[i] = anIndexes[anIndexId++];
- }
-
- SMDS_MeshElement* anElem =
- theMesh->AddPolyhedralVolumeWithID(nodes_ids, quantities, aFaceId);
- if (!anElem)
- EXCEPTION(runtime_error, "SMDS_Mesh::FindElement - cannot AddPolyhedralVolumeWithID for ID = "
- << anElemId);
- }
- }
-
-
- inline void ChangePolyhedronNodes (SMDS_Mesh* theMesh,
- SMESH::log_array_var& theSeq,
- CORBA::Long theId)
- {
- const SMESH::long_array& anIndexes = theSeq[theId].indexes;
- CORBA::Long iind = 0, aNbElems = theSeq[theId].number;
-
- for (CORBA::Long anElemId = 0; anElemId < aNbElems; anElemId++)
- {
- // find element
- const SMDS_MeshElement* elem = FindElement(theMesh, anIndexes[iind++]);
- // nb nodes
- int nbNodes = anIndexes[iind++];
- // nodes
- std::vector<const SMDS_MeshNode*> aNodes (nbNodes);
- for (int iNode = 0; iNode < nbNodes; iNode++) {
- aNodes[iNode] = FindNode(theMesh, anIndexes[iind++]);
- }
- // nb faces
- int nbFaces = anIndexes[iind++];
- // quantities
- std::vector<int> quantities (nbFaces);
- for (int iFace = 0; iFace < nbFaces; iFace++) {
- quantities[iFace] = anIndexes[iind++];
- }
- // change
- theMesh->ChangePolyhedronNodes(elem, aNodes, quantities);
- }
- }
-
-
-}
-/*
- Class : SMESH_VisualObjDef
- Description : Base class for all mesh objects to be visuilised
-*/
-
-//=================================================================================
-// function : getCellType
-// purpose : Get type of VTK cell
-//=================================================================================
-static inline vtkIdType getCellType( const SMDSAbs_ElementType theType,
- const bool thePoly,
- const int theNbNodes )
-{
- switch( theType )
- {
- case SMDSAbs_Edge:
- return theNbNodes == 2 ? VTK_LINE : VTK_EMPTY_CELL;
-
- case SMDSAbs_Face :
- if (thePoly && theNbNodes>2 ) return VTK_POLYGON;
- else if ( theNbNodes == 3 ) return VTK_TRIANGLE;
- else if ( theNbNodes == 4 ) return VTK_QUAD;
- else return VTK_EMPTY_CELL;
-
- case SMDSAbs_Volume:
- if (thePoly && theNbNodes>3 ) return VTK_CONVEX_POINT_SET;
- else if ( theNbNodes == 4 ) return VTK_TETRA;
- else if ( theNbNodes == 5 ) return VTK_PYRAMID;
- else if ( theNbNodes == 6 ) return VTK_WEDGE;
- else if ( theNbNodes == 8 ) return VTK_HEXAHEDRON;
- else return VTK_EMPTY_CELL;
-
- default: return VTK_EMPTY_CELL;
- }
-}
-
-//=================================================================================
-// functions : SMESH_VisualObjDef
-// purpose : Constructor
-//=================================================================================
-SMESH_VisualObjDef::SMESH_VisualObjDef()
-{
- myGrid = vtkUnstructuredGrid::New();
-}
-SMESH_VisualObjDef::~SMESH_VisualObjDef()
-{
- if ( MYDEBUG )
- MESSAGE( "~SMESH_MeshObj - myGrid->GetReferenceCount() = " << myGrid->GetReferenceCount() );
- myGrid->Delete();
-}
-
-//=================================================================================
-// functions : GetNodeObjId, GetNodeVTKId, GetElemObjId, GetElemVTKId
-// purpose : Methods for retrieving VTK IDs by SMDS IDs and vice versa
-//=================================================================================
-vtkIdType SMESH_VisualObjDef::GetNodeObjId( int theVTKID )
-{
- return myVTK2SMDSNodes.find(theVTKID) == myVTK2SMDSNodes.end() ? -1 : myVTK2SMDSNodes[theVTKID];
-}
-
-vtkIdType SMESH_VisualObjDef::GetNodeVTKId( int theObjID )
-{
- return mySMDS2VTKNodes.find(theObjID) == mySMDS2VTKNodes.end() ? -1 : mySMDS2VTKNodes[theObjID];
-}
-
-vtkIdType SMESH_VisualObjDef::GetElemObjId( int theVTKID )
-{
- return myVTK2SMDSElems.find(theVTKID) == myVTK2SMDSElems.end() ? -1 : myVTK2SMDSElems[theVTKID];
-}
-
-vtkIdType SMESH_VisualObjDef::GetElemVTKId( int theObjID )
-{
- return mySMDS2VTKElems.find(theObjID) == mySMDS2VTKElems.end() ? -1 : mySMDS2VTKElems[theObjID];
-}
-
-//=================================================================================
-// function : SMESH_VisualObjDef::createPoints
-// purpose : Create points from nodes
-//=================================================================================
-void SMESH_VisualObjDef::createPoints( vtkPoints* thePoints )
-{
- if ( thePoints == 0 )
- return;
-
- TEntityList aNodes;
- vtkIdType nbNodes = GetEntities( SMDSAbs_Node, aNodes );
- thePoints->SetNumberOfPoints( nbNodes );
-
- int nbPoints = 0;
-
- TEntityList::const_iterator anIter;
- for ( anIter = aNodes.begin(); anIter != aNodes.end(); ++anIter )
- {
- const SMDS_MeshNode* aNode = ( const SMDS_MeshNode* )(*anIter);
- if ( aNode != 0 )
- {
- thePoints->SetPoint( nbPoints, aNode->X(), aNode->Y(), aNode->Z() );
- int anId = aNode->GetID();
- mySMDS2VTKNodes.insert( TMapOfIds::value_type( anId, nbPoints ) );
- myVTK2SMDSNodes.insert( TMapOfIds::value_type( nbPoints, anId ) );
- nbPoints++;
- }
- }
-
- if ( nbPoints != nbNodes )
- thePoints->SetNumberOfPoints( nbPoints );
-}
-
-//=================================================================================
-// function : buildPrs
-// purpose : create VTK cells( fill unstructured grid )
-//=================================================================================
-void SMESH_VisualObjDef::buildPrs()
-{
- try
- {
- mySMDS2VTKNodes.clear();
- myVTK2SMDSNodes.clear();
- mySMDS2VTKElems.clear();
- myVTK2SMDSElems.clear();
-
- if ( IsNodePrs() )
- buildNodePrs();
- else
- buildElemPrs();
- }
- catch( const std::exception& exc )
- {
- INFOS("Follow exception was cought:\n\t"<<exc.what());
- }
- catch(...)
- {
- INFOS("Unknown exception was cought !!!");
- }
-
- if( MYDEBUG ) MESSAGE( "Update - myGrid->GetNumberOfCells() = "<<myGrid->GetNumberOfCells() );
- if( MYDEBUGWITHFILES ) SMESH::WriteUnstructuredGrid( myGrid,"/tmp/buildPrs" );
-}
-
-//=================================================================================
-// function : buildNodePrs
-// purpose : create VTK cells for nodes
-//=================================================================================
-void SMESH_VisualObjDef::buildNodePrs()
-{
- vtkPoints* aPoints = vtkPoints::New();
- createPoints( aPoints );
- myGrid->SetPoints( aPoints );
- aPoints->Delete();
-
- myGrid->SetCells( 0, 0, 0 );
-
- // Create cells
- /*
- int nbPoints = aPoints->GetNumberOfPoints();
- vtkIdList *anIdList = vtkIdList::New();
- anIdList->SetNumberOfIds( 1 );
-
- vtkCellArray *aCells = vtkCellArray::New();
- aCells->Allocate( 2 * nbPoints, 0 );
-
- vtkUnsignedCharArray* aCellTypesArray = vtkUnsignedCharArray::New();
- aCellTypesArray->SetNumberOfComponents( 1 );
- aCellTypesArray->Allocate( nbPoints );
-
- for( vtkIdType aCellId = 0; aCellId < nbPoints; aCellId++ )
- {
- anIdList->SetId( 0, aCellId );
- aCells->InsertNextCell( anIdList );
- aCellTypesArray->InsertNextValue( VTK_VERTEX );
- }
-
- vtkIntArray* aCellLocationsArray = vtkIntArray::New();
- aCellLocationsArray->SetNumberOfComponents( 1 );
- aCellLocationsArray->SetNumberOfTuples( nbPoints );
-
- aCells->InitTraversal();
- for( vtkIdType i = 0, *pts, npts; aCells->GetNextCell( npts, pts ); i++ )
- aCellLocationsArray->SetValue( i, aCells->GetTraversalLocation( npts ) );
-
- myGrid->SetCells( aCellTypesArray, aCellLocationsArray, aCells );
-
- aCellLocationsArray->Delete();
- aCellTypesArray->Delete();
- aCells->Delete();
- anIdList->Delete();
- */
-}
-
-//=================================================================================
-// function : buildElemPrs
-// purpose : Create VTK cells for elements
-//=================================================================================
-
-namespace{
- typedef std::vector<const SMDS_MeshElement*> TConnect;
-
- int GetConnect(const SMDS_ElemIteratorPtr& theNodesIter,
- TConnect& theConnect)
- {
- theConnect.clear();
- for(; theNodesIter->more();)
- theConnect.push_back(theNodesIter->next());
- return theConnect.size();
- }
-
- inline
- void SetId(vtkIdList *theIdList,
- const SMESH_VisualObjDef::TMapOfIds& theSMDS2VTKNodes,
- const TConnect& theConnect,
- int thePosition,
- int theId)
- {
- theIdList->SetId(thePosition,theSMDS2VTKNodes.find(theConnect[theId]->GetID())->second);
- }
-
-}
-
-
-void SMESH_VisualObjDef::buildElemPrs()
-{
- // Create points
-
- vtkPoints* aPoints = vtkPoints::New();
- createPoints( aPoints );
- myGrid->SetPoints( aPoints );
- aPoints->Delete();
-
- if ( MYDEBUG )
- MESSAGE("Update - myGrid->GetNumberOfPoints() = "<<myGrid->GetNumberOfPoints());
-
- // Calculate cells size
-
- static SMDSAbs_ElementType aTypes[ 3 ] = { SMDSAbs_Edge, SMDSAbs_Face, SMDSAbs_Volume };
-
- // get entity data
- map<SMDSAbs_ElementType,int> nbEnts;
- map<SMDSAbs_ElementType,TEntityList> anEnts;
-
- for ( int i = 0; i <= 2; i++ )
- nbEnts[ aTypes[ i ] ] = GetEntities( aTypes[ i ], anEnts[ aTypes[ i ] ] );
-
- vtkIdType aCellsSize = 3 * nbEnts[ SMDSAbs_Edge ];
-
- for ( int i = 1; i <= 2; i++ ) // iterate through faces and volumes
- {
- if ( nbEnts[ aTypes[ i ] ] )
- {
- const TEntityList& aList = anEnts[ aTypes[ i ] ];
- TEntityList::const_iterator anIter;
- for ( anIter = aList.begin(); anIter != aList.end(); ++anIter )
- aCellsSize += (*anIter)->NbNodes() + 1;
- }
- }
-
- vtkIdType aNbCells = nbEnts[ SMDSAbs_Edge ] + nbEnts[ SMDSAbs_Face ] + nbEnts[ SMDSAbs_Volume ];
-
- if ( MYDEBUG )
- MESSAGE( "Update - aNbCells = "<<aNbCells<<"; aCellsSize = "<<aCellsSize );
-
- // 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 iElem = 0;
-
- TConnect aConnect;
- aConnect.reserve(VTK_CELL_SIZE);
-
- for ( int i = 0; i <= 2; i++ ) // iterate through edges, faces and volumes
- {
- if( nbEnts[ aTypes[ i ] ] > 0 )
- {
- const SMDSAbs_ElementType& aType = aTypes[ i ];
- const TEntityList& aList = anEnts[ aType ];
- TEntityList::const_iterator anIter;
- for ( anIter = aList.begin(); anIter != aList.end(); ++anIter )
- {
- const SMDS_MeshElement* anElem = *anIter;
-
- vtkIdType aNbNodes = anElem->NbNodes();
- anIdList->SetNumberOfIds( aNbNodes );
-
- int anId = anElem->GetID();
-
- mySMDS2VTKElems.insert( TMapOfIds::value_type( anId, iElem ) );
- myVTK2SMDSElems.insert( TMapOfIds::value_type( iElem, anId ) );
-
- SMDS_ElemIteratorPtr aNodesIter = anElem->nodesIterator();
- switch(aType){
- case SMDSAbs_Volume:{
- std::vector<int> aConnectivities;
- GetConnect(aNodesIter,aConnect);
- // Convertions connectivities from SMDS to VTK
- if (anElem->IsPoly() && aNbNodes > 3) { // POLYEDRE
- for (int k = 0; k < aNbNodes; k++) {
- aConnectivities.push_back(k);
- }
-
- } else if (aNbNodes == 4) {
- static int anIds[] = {0,2,1,3};
- for (int k = 0; k < aNbNodes; k++) aConnectivities.push_back(anIds[k]);
-
- } else if (aNbNodes == 5) {
- static int anIds[] = {0,3,2,1,4};
- for (int k = 0; k < aNbNodes; k++) aConnectivities.push_back(anIds[k]);
-
- } else if (aNbNodes == 6) {
- static int anIds[] = {0,1,2,3,4,5};
- for (int k = 0; k < aNbNodes; k++) aConnectivities.push_back(anIds[k]);
-
- } else if (aNbNodes == 8) {
- static int anIds[] = {0,3,2,1,4,7,6,5};
- for (int k = 0; k < aNbNodes; k++) aConnectivities.push_back(anIds[k]);
-
- } else {
- }
-
- if (aConnectivities.size() > 0) {
- for (vtkIdType aNodeId = 0; aNodeId < aNbNodes; aNodeId++)
- SetId(anIdList,mySMDS2VTKNodes,aConnect,aNodeId,aConnectivities[aNodeId]);
- }
- break;
- }
- default:
- for( vtkIdType aNodeId = 0; aNodesIter->more(); aNodeId++ ){
- const SMDS_MeshElement* aNode = aNodesIter->next();
- anIdList->SetId( aNodeId, mySMDS2VTKNodes[aNode->GetID()] );
- }
- }
-
- aConnectivity->InsertNextCell( anIdList );
- aCellTypesArray->InsertNextValue( getCellType( aType, anElem->IsPoly(), aNbNodes ) );
-
- iElem++;
- }
- }
- }
-
- // Insert cells in grid
-
- vtkIntArray* aCellLocationsArray = vtkIntArray::New();
- aCellLocationsArray->SetNumberOfComponents( 1 );
- aCellLocationsArray->SetNumberOfTuples( aNbCells );
-
- aConnectivity->InitTraversal();
- for( vtkIdType idType = 0, *pts, npts; aConnectivity->GetNextCell( npts, pts ); idType++ )
- aCellLocationsArray->SetValue( idType, aConnectivity->GetTraversalLocation( npts ) );
-
- myGrid->SetCells( aCellTypesArray, aCellLocationsArray,aConnectivity );
-
- aCellLocationsArray->Delete();
- aCellTypesArray->Delete();
- aConnectivity->Delete();
- anIdList->Delete();
-}
-
-//=================================================================================
-// function : GetEdgeNodes
-// purpose : Retrieve ids of nodes from edge of elements ( edge is numbered from 1 )
-//=================================================================================
-bool SMESH_VisualObjDef::GetEdgeNodes( const int theElemId,
- const int theEdgeNum,
- int& theNodeId1,
- int& theNodeId2 ) const
-{
- const SMDS_Mesh* aMesh = GetMesh();
- if ( aMesh == 0 )
- return false;
-
- const SMDS_MeshElement* anElem = aMesh->FindElement( theElemId );
- if ( anElem == 0 )
- return false;
-
- int nbNodes = anElem->NbNodes();
-
- if ( theEdgeNum < 0 || theEdgeNum > 3 || nbNodes != 3 && nbNodes != 4 || theEdgeNum > nbNodes )
- return false;
-
- int anIds[ nbNodes ];
- SMDS_ElemIteratorPtr anIter = anElem->nodesIterator();
- int i = 0;
- while( anIter->more() )
- anIds[ i++ ] = anIter->next()->GetID();
-
- if ( theEdgeNum < nbNodes - 1 )
- {
- theNodeId1 = anIds[ theEdgeNum ];
- theNodeId2 = anIds[ theEdgeNum + 1 ];
- }
- else
- {
- theNodeId1 = anIds[ nbNodes - 1 ];
- theNodeId2 = anIds[ 0 ];
- }
-
- return true;
-}
-
-/*
- Class : SMESH_MeshObj
- Description : Class for visualisation of mesh
-*/
-
-//=================================================================================
-// function : SMESH_MeshObj
-// purpose : Constructor
-//=================================================================================
-SMESH_MeshObj::SMESH_MeshObj(SMESH::SMESH_Mesh_ptr theMesh)
-{
- if ( MYDEBUG )
- MESSAGE("SMESH_MeshObj - theMesh->_is_nil() = "<<theMesh->_is_nil());
-
- myMeshServer = SMESH::SMESH_Mesh::_duplicate( theMesh );
- myMeshServer->Register();
- myMesh = new SMDS_Mesh();
-}
-
-//=================================================================================
-// function : ~SMESH_MeshObj
-// purpose : Destructor
-//=================================================================================
-SMESH_MeshObj::~SMESH_MeshObj()
-{
- myMeshServer->Destroy();
- delete myMesh;
-}
-
-//=================================================================================
-// function : Update
-// purpose : Update mesh and fill grid with new values if necessary
-//=================================================================================
-void SMESH_MeshObj::Update( int theIsClear )
-{
- // Update SMDS_Mesh on client part
-
- try
- {
- SMESH::log_array_var aSeq = myMeshServer->GetLog( theIsClear );
- CORBA::Long aLength = aSeq->length();
-
- if( MYDEBUG ) MESSAGE( "Update: length of the script is "<<aLength );
-
- if( !aLength )
- return;
-
- for ( CORBA::Long anId = 0; anId < aLength; anId++)
- {
- const SMESH::double_array& aCoords = aSeq[anId].coords;
- const SMESH::long_array& anIndexes = aSeq[anId].indexes;
- CORBA::Long anElemId = 0, aNbElems = aSeq[anId].number;
- CORBA::Long aCommand = aSeq[anId].commandType;
-
- switch(aCommand)
- {
- case SMESH::ADD_NODE : AddNodesWithID ( myMesh, aSeq, anId ); break;
- case SMESH::ADD_EDGE : AddEdgesWithID ( myMesh, aSeq, anId ); break;
- case SMESH::ADD_TRIANGLE : AddTriasWithID ( myMesh, aSeq, anId ); break;
- case SMESH::ADD_QUADRANGLE : AddQuadsWithID ( myMesh, aSeq, anId ); break;
- case SMESH::ADD_POLYGON : AddPolygonsWithID ( myMesh, aSeq, anId ); break;
- case SMESH::ADD_TETRAHEDRON: AddTetrasWithID ( myMesh, aSeq, anId ); break;
- case SMESH::ADD_PYRAMID : AddPiramidsWithID ( myMesh, aSeq, anId ); break;
- case SMESH::ADD_PRISM : AddPrismsWithID ( myMesh, aSeq, anId ); break;
- case SMESH::ADD_HEXAHEDRON : AddHexasWithID ( myMesh, aSeq, anId ); break;
- case SMESH::ADD_POLYHEDRON : AddPolyhedronsWithID( myMesh, aSeq, anId ); break;
-
- case SMESH::REMOVE_NODE:
- for( ; anElemId < aNbElems; anElemId++ )
- myMesh->RemoveNode( FindNode( myMesh, anIndexes[anElemId] ) );
- break;
-
- case SMESH::REMOVE_ELEMENT:
- for( ; anElemId < aNbElems; anElemId++ )
- myMesh->RemoveElement( FindElement( myMesh, anIndexes[anElemId] ) );
- break;
-
- case SMESH::MOVE_NODE:
- for(CORBA::Long aCoordId=0; anElemId < aNbElems; anElemId++, aCoordId+=3)
- {
- SMDS_MeshNode* node =
- const_cast<SMDS_MeshNode*>( FindNode( myMesh, anIndexes[anElemId] ));
- node->setXYZ( aCoords[aCoordId], aCoords[aCoordId+1], aCoords[aCoordId+2] );
- }
- break;
-
- case SMESH::CHANGE_ELEMENT_NODES:
- for ( CORBA::Long i = 0; anElemId < aNbElems; anElemId++ )
- {
- // find element
- const SMDS_MeshElement* elem = FindElement( myMesh, anIndexes[i++] );
- // nb nodes
- int nbNodes = anIndexes[i++];
- // nodes
- //ASSERT( nbNodes < 9 );
- const SMDS_MeshNode* aNodes[ nbNodes ];
- for ( int iNode = 0; iNode < nbNodes; iNode++ )
- aNodes[ iNode ] = FindNode( myMesh, anIndexes[i++] );
- // change
- myMesh->ChangeElementNodes( elem, aNodes, nbNodes );
- }
- break;
-
- case SMESH::CHANGE_POLYHEDRON_NODES:
- ChangePolyhedronNodes(myMesh, aSeq, anId);
- break;
- case SMESH::RENUMBER:
- for(CORBA::Long i=0; anElemId < aNbElems; anElemId++, i+=3)
- {
- myMesh->Renumber( anIndexes[i], anIndexes[i+1], anIndexes[i+2] );
- }
- break;
-
- default:;
- }
- }
- }
- catch ( SALOME::SALOME_Exception& exc )
- {
- INFOS("Following exception was cought:\n\t"<<exc.details.text);
- }
- catch( const std::exception& exc)
- {
- INFOS("Following exception was cought:\n\t"<<exc.what());
- }
- catch(...)
- {
- INFOS("Unknown exception was cought !!!");
- }
-
- if ( MYDEBUG )
- {
- MESSAGE("Update - myMesh->NbNodes() = "<<myMesh->NbNodes());
- MESSAGE("Update - myMesh->NbEdges() = "<<myMesh->NbEdges());
- MESSAGE("Update - myMesh->NbFaces() = "<<myMesh->NbFaces());
- MESSAGE("Update - myMesh->NbVolumes() = "<<myMesh->NbVolumes());
- }
-
- // Fill unstructured grid
- buildPrs();
-}
-
-//=================================================================================
-// function : GetElemDimension
-// purpose : Get dimension of element
-//=================================================================================
-int SMESH_MeshObj::GetElemDimension( const int theObjId )
-{
- const SMDS_MeshElement* anElem = myMesh->FindElement( theObjId );
- if ( anElem == 0 )
- return 0;
-
- int aType = anElem->GetType();
- switch ( aType )
- {
- case SMDSAbs_Edge : return 1;
- case SMDSAbs_Face : return 2;
- case SMDSAbs_Volume: return 3;
- default : return 0;
- }
-}
-
-//=================================================================================
-// function : GetEntities
-// purpose : Get entities of specified type. Return number of entities
-//=================================================================================
-int SMESH_MeshObj::GetNbEntities( const SMDSAbs_ElementType theType) const
-{
- switch ( theType )
- {
- case SMDSAbs_Node:
- {
- return myMesh->NbNodes();
- }
- break;
- case SMDSAbs_Edge:
- {
- return myMesh->NbEdges();
- }
- break;
- case SMDSAbs_Face:
- {
- return myMesh->NbFaces();
- }
- break;
- case SMDSAbs_Volume:
- {
- return myMesh->NbVolumes();
- }
- break;
- default:
- return 0;
- break;
- }
-}
-
-int SMESH_MeshObj::GetEntities( const SMDSAbs_ElementType theType, TEntityList& theObjs ) const
-{
- theObjs.clear();
-
- switch ( theType )
- {
- case SMDSAbs_Node:
- {
- SMDS_NodeIteratorPtr anIter = myMesh->nodesIterator();
- while ( anIter->more() ) theObjs.push_back( anIter->next() );
- }
- break;
- case SMDSAbs_Edge:
- {
- SMDS_EdgeIteratorPtr anIter = myMesh->edgesIterator();
- while ( anIter->more() ) theObjs.push_back( anIter->next() );
- }
- break;
- case SMDSAbs_Face:
- {
- SMDS_FaceIteratorPtr anIter = myMesh->facesIterator();
- while ( anIter->more() ) theObjs.push_back( anIter->next() );
- }
- break;
- case SMDSAbs_Volume:
- {
- SMDS_VolumeIteratorPtr anIter = myMesh->volumesIterator();
- while ( anIter->more() ) theObjs.push_back( anIter->next() );
- }
- break;
- default:
- break;
- }
-
- return theObjs.size();
-}
-
-//=================================================================================
-// function : UpdateFunctor
-// purpose : Update functor in accordance with current mesh
-//=================================================================================
-void SMESH_MeshObj::UpdateFunctor( const SMESH::Controls::FunctorPtr& theFunctor )
-{
- theFunctor->SetMesh( GetMesh() );
-}
-
-//=================================================================================
-// function : IsNodePrs
-// purpose : Return true if node presentation is used
-//=================================================================================
-bool SMESH_MeshObj::IsNodePrs() const
-{
- return myMesh->NbEdges() == 0 &&myMesh->NbFaces() == 0 &&myMesh->NbVolumes() == 0 ;
-}
-
-
-/*
- Class : SMESH_SubMeshObj
- Description : Base class for visualisation of submeshes and groups
-*/
-
-//=================================================================================
-// function : SMESH_SubMeshObj
-// purpose : Constructor
-//=================================================================================
-SMESH_SubMeshObj::SMESH_SubMeshObj( SMESH_MeshObj* theMeshObj )
-{
- if ( MYDEBUG ) MESSAGE( "SMESH_SubMeshObj - theMeshObj = " << theMeshObj );
-
- myMeshObj = theMeshObj;
-}
-
-SMESH_SubMeshObj::~SMESH_SubMeshObj()
-{
-}
-
-//=================================================================================
-// function : GetElemDimension
-// purpose : Get dimension of element
-//=================================================================================
-int SMESH_SubMeshObj::GetElemDimension( const int theObjId )
-{
- return myMeshObj == 0 ? 0 : myMeshObj->GetElemDimension( theObjId );
-}
-
-//=================================================================================
-// function : UpdateFunctor
-// purpose : Update functor in accordance with current mesh
-//=================================================================================
-void SMESH_SubMeshObj::UpdateFunctor( const SMESH::Controls::FunctorPtr& theFunctor )
-{
- theFunctor->SetMesh( myMeshObj->GetMesh() );
-}
-
-//=================================================================================
-// function : Update
-// purpose : Update mesh object and fill grid with new values
-//=================================================================================
-void SMESH_SubMeshObj::Update( int theIsClear )
-{
- myMeshObj->Update( theIsClear );
- buildPrs();
-}
-
-
-/*
- Class : SMESH_GroupObj
- Description : Class for visualisation of groups
-*/
-
-//=================================================================================
-// function : SMESH_GroupObj
-// purpose : Constructor
-//=================================================================================
-SMESH_GroupObj::SMESH_GroupObj( SMESH::SMESH_GroupBase_ptr theGroup,
- SMESH_MeshObj* theMeshObj )
-: SMESH_SubMeshObj( theMeshObj ),
- myGroupServer( SMESH::SMESH_GroupBase::_duplicate(theGroup) )
-{
- if ( MYDEBUG ) MESSAGE("SMESH_GroupObj - theGroup->_is_nil() = "<<theGroup->_is_nil());
- myGroupServer->Register();
-}
-
-SMESH_GroupObj::~SMESH_GroupObj()
-{
- if ( MYDEBUG ) MESSAGE("~SMESH_GroupObj");
- myGroupServer->Destroy();
-}
-
-//=================================================================================
-// function : IsNodePrs
-// purpose : Return true if node presentation is used
-//=================================================================================
-bool SMESH_GroupObj::IsNodePrs() const
-{
- return myGroupServer->GetType() == SMESH::NODE;
-}
-
-//=================================================================================
-// function : getNodesFromElems
-// purpose : Retrieve nodes from elements
-//=================================================================================
-static int getNodesFromElems( SMESH::long_array_var& theElemIds,
- const SMDS_Mesh* theMesh,
- std::list<const SMDS_MeshElement*>& theResList )
-{
- set<const SMDS_MeshElement*> aNodeSet;
-
- for ( CORBA::Long i = 0, n = theElemIds->length(); i < n; i++ )
- {
- const SMDS_MeshElement* anElem = theMesh->FindElement( theElemIds[ i ] );
- if ( anElem != 0 )
- {
- SMDS_ElemIteratorPtr anIter = anElem->nodesIterator();
- while ( anIter->more() )
- {
- const SMDS_MeshElement* aNode = anIter->next();
- if ( aNode != 0 )
- aNodeSet.insert( aNode );
- }
- }
- }
-
- set<const SMDS_MeshElement*>::const_iterator anIter;
- for ( anIter = aNodeSet.begin(); anIter != aNodeSet.end(); ++anIter )
- theResList.push_back( *anIter );
-
- return theResList.size();
-}
-
-//=================================================================================
-// function : getPointers
-// purpose : Get std::list<const SMDS_MeshElement*> from list of IDs
-//=================================================================================
-static int getPointers( const SMDSAbs_ElementType theRequestType,
- SMESH::long_array_var& theElemIds,
- const SMDS_Mesh* theMesh,
- std::list<const SMDS_MeshElement*>& theResList )
-{
- for ( CORBA::Long i = 0, n = theElemIds->length(); i < n; i++ )
- {
- const SMDS_MeshElement* anElem = theRequestType == SMDSAbs_Node
- ? theMesh->FindNode( theElemIds[ i ] ) : theMesh->FindElement( theElemIds[ i ] );
-
- if ( anElem != 0 )
- theResList.push_back( anElem );
- }
-
- return theResList.size();
-}
-
-
-//=================================================================================
-// function : GetEntities
-// purpose : Get entities of specified type. Return number of entities
-//=================================================================================
-int SMESH_GroupObj::GetNbEntities( const SMDSAbs_ElementType theType) const
-{
- if(SMDSAbs_ElementType(myGroupServer->GetType()) == theType){
- return myGroupServer->Size();
- }
- return 0;
-}
-
-int SMESH_GroupObj::GetEntities( const SMDSAbs_ElementType theType, TEntityList& theResList ) const
-{
- theResList.clear();
- SMDS_Mesh* aMesh = myMeshObj->GetMesh();
-
- if ( myGroupServer->Size() == 0 || aMesh == 0 )
- return 0;
-
- SMDSAbs_ElementType aGrpType = SMDSAbs_ElementType(myGroupServer->GetType());
- SMESH::long_array_var anIds = myGroupServer->GetListOfID();
-
- if ( aGrpType == theType )
- return getPointers( theType, anIds, aMesh, theResList );
- else if ( theType == SMDSAbs_Node )
- return getNodesFromElems( anIds, aMesh, theResList );
- else
- return 0;
-}
-
-
-
-/*
- Class : SMESH_subMeshObj
- Description : Class for visualisation of submeshes
-*/
-
-//=================================================================================
-// function : SMESH_subMeshObj
-// purpose : Constructor
-//=================================================================================
-SMESH_subMeshObj::SMESH_subMeshObj( SMESH::SMESH_subMesh_ptr theSubMesh,
- SMESH_MeshObj* theMeshObj )
-: SMESH_SubMeshObj( theMeshObj ),
- mySubMeshServer( SMESH::SMESH_subMesh::_duplicate( theSubMesh ) )
-{
- if ( MYDEBUG ) MESSAGE( "SMESH_subMeshObj - theSubMesh->_is_nil() = " << theSubMesh->_is_nil() );
-
- mySubMeshServer->Register();
-}
-
-SMESH_subMeshObj::~SMESH_subMeshObj()
-{
- if ( MYDEBUG ) MESSAGE( "~SMESH_subMeshObj" );
- mySubMeshServer->Destroy();
-}
-
-//=================================================================================
-// function : GetEntities
-// purpose : Get entities of specified type. Return number of entities
-//=================================================================================
-int SMESH_subMeshObj::GetNbEntities( const SMDSAbs_ElementType theType) const
-{
- switch ( theType )
- {
- case SMDSAbs_Node:
- {
- return mySubMeshServer->GetNumberOfNodes( false );
- }
- break;
- case SMDSAbs_Edge:
- case SMDSAbs_Face:
- case SMDSAbs_Volume:
- {
- SMESH::long_array_var anIds =
- mySubMeshServer->GetElementsByType( SMESH::ElementType(theType) );
- return anIds->length();
- }
- default:
- return 0;
- break;
- }
-}
-
-int SMESH_subMeshObj::GetEntities( const SMDSAbs_ElementType theType, TEntityList& theResList ) const
-{
- theResList.clear();
-
- SMDS_Mesh* aMesh = myMeshObj->GetMesh();
- if ( aMesh == 0 )
- return 0;
-
- bool isNodal = IsNodePrs();
-
- if ( isNodal )
- {
- if ( theType == SMDSAbs_Node )
- {
- SMESH::long_array_var anIds = mySubMeshServer->GetNodesId();
- return getPointers( SMDSAbs_Node, anIds, aMesh, theResList );
- }
- }
- else
- {
- if ( theType == SMDSAbs_Node )
- {
- SMESH::long_array_var anIds = mySubMeshServer->GetElementsId();
- return getNodesFromElems( anIds, aMesh, theResList );
- }
- else
- {
- SMESH::long_array_var anIds =
- mySubMeshServer->GetElementsByType( SMESH::ElementType(theType) );
- return getPointers( theType, anIds, aMesh, theResList );
- }
- }
-
- return 0;
-}
-
-//=================================================================================
-// function : IsNodePrs
-// purpose : Return true if node presentation is used
-//=================================================================================
-bool SMESH_subMeshObj::IsNodePrs() const
-{
- return mySubMeshServer->GetNumberOfElements() == 0;
-}
-
-
-
-
-
-
-
-
-
-
-
-
+++ /dev/null
-// SMESH OBJECT : interactive object for SMESH visualization
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESH_Object.h
-// Author : Nicolas REJNERI
-// Module : SMESH
-// $Header$
-
-#ifndef SMESH_OBJECT_H
-#define SMESH_OBJECT_H
-
-#include <boost/shared_ptr.hpp>
-#include <vtkSystemIncludes.h>
-
-#include "SMESH_Controls.hxx"
-#include "SMDSAbs_ElementType.hxx"
-
-class SMDS_Mesh;
-class vtkUnstructuredGrid;
-
-/*
- Class : SMESH_VisualObj
- Description : Base class for all mesh objects to be visuilised
-*/
-class SMESH_VisualObj
-{
-public:
- virtual void Update( int theIsClear = true ) = 0;
- virtual void UpdateFunctor( const SMESH::Controls::FunctorPtr& theFunctor ) = 0;
- virtual int GetElemDimension( const int theObjId ) = 0;
-
- virtual int GetNbEntities( const SMDSAbs_ElementType theType) const = 0;
- virtual SMDS_Mesh* GetMesh() const = 0;
-
- virtual bool GetEdgeNodes( const int theElemId,
- const int theEdgeNum,
- int& theNodeId1,
- int& theNodeId2 ) const = 0;
-
- virtual vtkUnstructuredGrid* GetUnstructuredGrid() = 0;
-
- virtual vtkIdType GetNodeObjId( int theVTKID ) = 0;
- virtual vtkIdType GetNodeVTKId( int theObjID ) = 0;
- virtual vtkIdType GetElemObjId( int theVTKID ) = 0;
- virtual vtkIdType GetElemVTKId( int theObjID ) = 0;
-};
-
-typedef boost::shared_ptr<SMESH_VisualObj> TVisualObjPtr;
-
-#endif
+++ /dev/null
-// SMESH OBJECT : interactive object for SMESH visualization
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESH_Object.h
-// Author : Nicolas REJNERI
-// Module : SMESH
-// $Header$
-
-#ifndef SMESH_OBJECTDEF_H
-#define SMESH_OBJECTDEF_H
-
-// IDL Headers
-#include <SALOMEconfig.h>
-#include CORBA_SERVER_HEADER(SMESH_Mesh)
-#include CORBA_SERVER_HEADER(SMESH_Group)
-
-#include <map>
-#include <list>
-
-#include "SMESH_Controls.hxx"
-#include "SMESH_Object.h"
-
-class vtkPoints;
-class SALOME_ExtractUnstructuredGrid;
-
-class SMESH_Actor;
-class SMDS_MeshNode;
-class SMDS_MeshElement;
-
-/*
- Class : SMESH_VisualObj
- Description : Base class for all mesh objects to be visuilised
-*/
-class SMESH_VisualObjDef: public SMESH_VisualObj
-{
-public:
- typedef std::list<const SMDS_MeshElement*> TEntityList;
- typedef std::map<vtkIdType,vtkIdType> TMapOfIds;
-
- SMESH_VisualObjDef();
- virtual ~SMESH_VisualObjDef();
-
- virtual void Update( int theIsClear = true ) = 0;
- virtual void UpdateFunctor( const SMESH::Controls::FunctorPtr& theFunctor ) = 0;
- virtual int GetElemDimension( const int theObjId ) = 0;
-
- virtual int GetNbEntities( const SMDSAbs_ElementType theType) const = 0;
- virtual int GetEntities( const SMDSAbs_ElementType, TEntityList& ) const = 0;
- virtual bool IsNodePrs() const = 0;
- virtual SMDS_Mesh* GetMesh() const = 0;
-
- virtual bool GetEdgeNodes( const int theElemId,
- const int theEdgeNum,
- int& theNodeId1,
- int& theNodeId2 ) const;
-
- virtual vtkUnstructuredGrid* GetUnstructuredGrid() { return myGrid; }
-
- virtual vtkIdType GetNodeObjId( int theVTKID );
- virtual vtkIdType GetNodeVTKId( int theObjID );
- virtual vtkIdType GetElemObjId( int theVTKID );
- virtual vtkIdType GetElemVTKId( int theObjID );
-
-protected:
-
- void createPoints( vtkPoints* );
- void buildPrs();
- void buildNodePrs();
- void buildElemPrs();
-
-private:
-
- TMapOfIds mySMDS2VTKNodes;
- TMapOfIds myVTK2SMDSNodes;
- TMapOfIds mySMDS2VTKElems;
- TMapOfIds myVTK2SMDSElems;
-
- vtkUnstructuredGrid* myGrid;
-};
-
-
-/*
- Class : SMESH_MeshObj
- Description : Class for visualisation of mesh
-*/
-
-class SMESH_MeshObj: public SMESH_VisualObjDef
-{
-public:
-
- SMESH_MeshObj( SMESH::SMESH_Mesh_ptr );
- virtual ~SMESH_MeshObj();
-
- virtual void Update( int theIsClear = true );
-
- virtual int GetNbEntities( const SMDSAbs_ElementType) const;
- virtual int GetEntities( const SMDSAbs_ElementType, TEntityList& ) const;
- virtual bool IsNodePrs() const;
-
- virtual int GetElemDimension( const int theObjId );
-
- virtual void UpdateFunctor( const SMESH::Controls::FunctorPtr& theFunctor );
-
- SMESH::SMESH_Mesh_ptr GetMeshServer() { return myMeshServer.in(); }
- SMDS_Mesh* GetMesh() const { return myMesh; }
-
-protected:
-
- SMESH::SMESH_Mesh_var myMeshServer;
- SMDS_Mesh* myMesh;
-};
-
-
-/*
- Class : SMESH_SubMeshObj
- Description : Base class for visualisation of submeshes and groups
-*/
-
-class SMESH_SubMeshObj: public SMESH_VisualObjDef
-{
-public:
-
- SMESH_SubMeshObj(SMESH_MeshObj* theMeshObj);
- virtual ~SMESH_SubMeshObj();
-
- virtual void Update( int theIsClear = true );
-
- virtual void UpdateFunctor( const SMESH::Controls::FunctorPtr& theFunctor );
- virtual int GetElemDimension( const int theObjId );
- virtual SMDS_Mesh* GetMesh() const { return myMeshObj->GetMesh(); }
-
-protected:
-
- SMESH_MeshObj* myMeshObj;
-};
-
-
-/*
- Class : SMESH_GroupObj
- Description : Class for visualisation of groups
-*/
-
-class SMESH_GroupObj: public SMESH_SubMeshObj
-{
-public:
- SMESH_GroupObj( SMESH::SMESH_GroupBase_ptr, SMESH_MeshObj* );
- virtual ~SMESH_GroupObj();
-
- virtual int GetNbEntities( const SMDSAbs_ElementType) const;
- virtual int GetEntities( const SMDSAbs_ElementType, TEntityList& ) const;
- virtual bool IsNodePrs() const;
-
-private:
-
- SMESH::SMESH_GroupBase_var myGroupServer;
-};
-
-
-/*
- Class : SMESH_subMeshObj
- Description : Class for visualisation of submeshes
-*/
-
-class SMESH_subMeshObj : public SMESH_SubMeshObj
-{
-public:
-
- SMESH_subMeshObj( SMESH::SMESH_subMesh_ptr,
- SMESH_MeshObj* );
- virtual ~SMESH_subMeshObj();
-
- virtual int GetNbEntities( const SMDSAbs_ElementType) const;
- virtual int GetEntities( const SMDSAbs_ElementType, TEntityList& ) const;
- virtual bool IsNodePrs() const;
-
-protected:
-
- SMESH::SMESH_subMesh_var mySubMeshServer;
-};
-
-
-#endif
+++ /dev/null
-# SMESH SMDS : implementaion of Salome mesh data structure
-#
-# Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-#
-# See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-#
-#
-#
-# File : Makefile.in
-# Author : Patrick GOLDBRONN (CEA)
-# Module : SMESH
-
-top_srcdir=@top_srcdir@
-top_builddir=../..
-srcdir=@srcdir@
-VPATH=.:@srcdir@:@top_srcdir@/idl
-
-
-@COMMENCE@
-
-# Libraries targets
-
-LIB = libSMDS.la
-LIB_SRC = \
- SMDS_MeshObject.cxx \
- SMDS_MeshElement.cxx \
- SMDS_Position.cxx \
- SMDS_EdgePosition.cxx \
- SMDS_FacePosition.cxx \
- SMDS_SpacePosition.cxx \
- SMDS_VertexPosition.cxx \
- SMDS_MeshNode.cxx \
- SMDS_MeshEdge.cxx \
- SMDS_MeshFace.cxx \
- SMDS_MeshVolume.cxx \
- SMDS_MeshElementIDFactory.cxx \
- SMDS_MeshGroup.cxx \
- SMDS_MeshIDFactory.cxx \
- SMDS_Mesh.cxx \
- SMDS_IteratorOfElements.cxx \
- SMDS_VolumeOfFaces.cxx \
- SMDS_VolumeOfNodes.cxx \
- SMDS_PolyhedralVolumeOfNodes.cxx \
- SMDS_FaceOfEdges.cxx \
- SMDS_FaceOfNodes.cxx \
- SMDS_PolygonalFaceOfNodes.cxx \
- SMDS_VolumeTool.cxx
-# SMDS_Tria3OfNodes.cxx \
-# SMDS_HexahedronOfNodes.cxx
-
-#SMDSControl_BoundaryEdges.cxx \
-#SMDSControl_BoundaryFaces.cxx \
-#SMDSControl.cxx \
-#SMDSControl_MeshBoundary.cxx \
-#SMDSEdit_Transform.cxx \
-#SMDS_MeshNodeIDFactory.cxx \
-#SMDS_MeshPrism.cxx \
-#SMDS_MeshPyramid.cxx \
-#SMDS_MeshQuadrangle.cxx \
-#SMDS_MeshTetrahedron.cxx \
-#SMDS_MeshTriangle.cxx \
-
-
-LIB_CLIENT_IDL =
-LIB_SERVER_IDL =
-
-# Executables targets
-BIN =
-BIN_SRC =
-BIN_CLIENT_IDL =
-BIN_SERVER_IDL =
-
-# header files
-EXPORT_HEADERS= \
- SMDS_TypeOfPosition.hxx \
- SMDSAbs_ElementType.hxx \
- SMDS_EdgePosition.hxx \
- SMDS_ElemIterator.hxx \
- SMDS_FacePosition.hxx \
- SMDS_Mesh.hxx \
- SMDS_MeshEdge.hxx \
- SMDS_MeshElement.hxx \
- SMDS_MeshElementIDFactory.hxx \
- SMDS_MeshFace.hxx \
- SMDS_MeshGroup.hxx \
- SMDS_MeshIDFactory.hxx \
- SMDS_MeshNode.hxx \
- SMDS_MeshObject.hxx \
- SMDS_MeshVolume.hxx \
- SMDS_Position.hxx \
- SMDS_SpacePosition.hxx \
- SMDS_VertexPosition.hxx \
- SMDS_Iterator.hxx \
- SMDS_IteratorOfElements.hxx \
- SMDS_VolumeOfFaces.hxx \
- SMDS_VolumeOfNodes.hxx \
- SMDS_PolyhedralVolumeOfNodes.hxx \
- SMDS_FaceOfEdges.hxx \
- SMDS_FaceOfNodes.hxx \
- SMDS_PolygonalFaceOfNodes.hxx \
- SMDS_VolumeTool.hxx
-# SMDS_Tria3OfNodes.hxx \
-# SMDS_HexahedronOfNodes.hxx
-
-#SMDSControl_BoundaryEdges.hxx \
-#SMDSControl_BoundaryFaces.hxx \
-#SMDSControl.hxx \
-#SMDSControl_MeshBoundary.hxx \
-#SMDSEdit_Transform.hxx \
-#SMDS_MeshPrism.hxx \
-#SMDS_MeshPyramid.hxx \
-#SMDS_MeshQuadrangle.hxx \
-#SMDS_MeshTetrahedron.hxx \
-#SMDS_MeshTriangle.hxx \
-#SMDS_MeshNodeIDFactory.hxx
-
-# additionnal information to compil and link file
-CPPFLAGS += -I${KERNEL_ROOT_DIR}/include/salome $(OCC_INCLUDES) $(BOOST_CPPFLAGS)
-CXXFLAGS += -I${KERNEL_ROOT_DIR}/include/salome
-LDFLAGS += -L${KERNEL_ROOT_DIR}/lib/salome $(OCC_KERNEL_LIBS)
-
-
-# additional file to be cleaned
-MOSTLYCLEAN =
-CLEAN =
-DISTCLEAN =
-
-@CONCLUDE@
+++ /dev/null
-// SMESH SMDS : implementaion of Salome mesh data structure
-//
-// Copyright (C) 2003 OPEN CASCADE
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org or email : webmaster@opencascade.org
-//
-//
-//
-// File : SMDSAbs_ElementType.hxx
-// Module : SMESH
-
-#ifndef _SMDSAbs_ElementType_HeaderFile
-#define _SMDSAbs_ElementType_HeaderFile
-
-///////////////////////////////////////////////////////////////////////////////
-/// Type (node, edge, face or volume) of elements
-///////////////////////////////////////////////////////////////////////////////
-enum SMDSAbs_ElementType
-{
- SMDSAbs_All,
- SMDSAbs_Node,
- SMDSAbs_Edge,
- SMDSAbs_Face,
- SMDSAbs_Volume
-};
-
-#endif
+++ /dev/null
-// SMESH SMDS : implementaion of Salome mesh data structure
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMDS_EdgePosition.cxx
-// Author : Jean-Michel BOULCOURT
-// Module : SMESH
-
-#include "SMDS_EdgePosition.hxx"
-
-#include "utilities.h"
-
-using namespace std;
-
-//=======================================================================
-//function : SMDS_EdgePosition
-//purpose :
-//=======================================================================
-
-SMDS_EdgePosition::SMDS_EdgePosition(const int aEdgeId,
- const double aUParam):SMDS_Position(aEdgeId), myUParameter(aUParam)
-{
-}
-
-//=======================================================================
-//function : Coords
-//purpose :
-//=======================================================================
-
-const double *SMDS_EdgePosition::Coords() const
-{
- static double origin[]={0,0,0};
- MESSAGE("SMDS_EdgePosition::Coords not implemented");
- return origin;
-}
-
-/**
-*/
-SMDS_TypeOfPosition SMDS_EdgePosition::GetTypeOfPosition() const
-{
- return SMDS_TOP_EDGE;
-}
-
-void SMDS_EdgePosition::SetUParameter(double aUparam)
-{
- myUParameter = aUparam;
-}
-
-//=======================================================================
-//function : GetUParameter
-//purpose :
-//=======================================================================
-
-double SMDS_EdgePosition::GetUParameter() const
-{
- return myUParameter;
-}
+++ /dev/null
-// SMESH SMDS : implementaion of Salome mesh data structure
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMDS_EdgePosition.hxx
-// Module : SMESH
-
-#ifndef _SMDS_EdgePosition_HeaderFile
-#define _SMDS_EdgePosition_HeaderFile
-
-#include "SMDS_Position.hxx"
-
-//#ifdef WNT
-//#include <SALOME_WNT.hxx>
-//#else
-//#define SALOME_WNT_EXPORT
-//#endif
-
-#if defined WNT && defined WIN32 && defined SMDS_EXPORTS
-#define SMDS_WNT_EXPORT __declspec( dllexport )
-#else
-#define SMDS_WNT_EXPORT
-#endif
-
-class SMDS_WNT_EXPORT SMDS_EdgePosition:public SMDS_Position
-{
-
- public:
- SMDS_EdgePosition(const int aEdgeId=0, const double aUParam=0);
- const virtual double * Coords() const;
- SMDS_TypeOfPosition GetTypeOfPosition() const;
- void SetUParameter(double aUparam);
- double GetUParameter() const;
-
- private:
-
- double myUParameter;
-
-};
-
-#endif
+++ /dev/null
-// SMESH SMDS : implementaion of Salome mesh data structure
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMDS_MeshElement.hxx
-// Module : SMESH
-// Created: 12.01.05 18:02:52
-// Author: Michael Sazonov
-
-#ifndef SMDS_ElemIterator_HeaderFile
-#define SMDS_ElemIterator_HeaderFile
-
-#include "SMDS_Iterator.hxx"
-#include <boost/shared_ptr.hpp>
-
-class SMDS_MeshElement;
-
-typedef SMDS_Iterator<const SMDS_MeshElement *> SMDS_ElemIterator;
-typedef boost::shared_ptr<SMDS_Iterator<const SMDS_MeshElement *> > SMDS_ElemIteratorPtr;
-
-#endif
+++ /dev/null
-// SMESH SMDS : implementaion of Salome mesh data structure
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-#ifdef _MSC_VER
-#pragma warning(disable:4786)
-#endif
-
-#include "SMDS_FaceOfEdges.hxx"
-#include "SMDS_IteratorOfElements.hxx"
-#include "SMDS_MeshNode.hxx"
-
-using namespace std;
-
-//=======================================================================
-//function : NbEdges
-//purpose :
-//=======================================================================
-
-int SMDS_FaceOfEdges::NbEdges() const
-{
- return myNbEdges;
-}
-
-int SMDS_FaceOfEdges::NbFaces() const
-{
- return 1;
-}
-//=======================================================================
-//function : Print
-//purpose :
-//=======================================================================
-
-void SMDS_FaceOfEdges::Print(ostream & OS) const
-{
- OS << "face <" << GetID() << " > : ";
- int i;
- for (i = 0; i < NbEdges() - 1; i++) OS << myEdges[i] << ",";
- OS << myEdges[i] << ") " << endl;
-}
-
-SMDSAbs_ElementType SMDS_FaceOfEdges::GetType() const
-{
- return SMDSAbs_Face;
-}
-
-//=======================================================================
-//function : elementsIterator
-//purpose :
-//=======================================================================
-
-class SMDS_FaceOfEdges_MyIterator:public SMDS_ElemIterator
-{
- const SMDS_MeshEdge* const *mySet;
- int myLength;
- int index;
- public:
- SMDS_FaceOfEdges_MyIterator(const SMDS_MeshEdge* const *s, int l):
- mySet(s),myLength(l),index(0) {}
-
- bool more()
- {
- return index<myLength;
- }
-
- const SMDS_MeshElement* next()
- {
- index++;
- return mySet[index-1];
- }
-};
-
-SMDS_ElemIteratorPtr SMDS_FaceOfEdges::elementsIterator
- (SMDSAbs_ElementType type) const
-{
- switch(type)
- {
- case SMDSAbs_Face:
- return SMDS_MeshElement::elementsIterator(SMDSAbs_Face);
- case SMDSAbs_Edge:
- return SMDS_ElemIteratorPtr(new SMDS_FaceOfEdges_MyIterator(myEdges,myNbEdges));
- default:
- return SMDS_ElemIteratorPtr
- (new SMDS_IteratorOfElements
- (this,type, SMDS_ElemIteratorPtr
- (new SMDS_FaceOfEdges_MyIterator(myEdges,myNbEdges))));
- }
-}
-
-SMDS_FaceOfEdges::SMDS_FaceOfEdges(const SMDS_MeshEdge* edge1,
- const SMDS_MeshEdge* edge2,
- const SMDS_MeshEdge* edge3)
-{
- myNbEdges = 3;
- myEdges[0]=edge1;
- myEdges[1]=edge2;
- myEdges[2]=edge3;
- myEdges[3]=0;
-}
-
-SMDS_FaceOfEdges::SMDS_FaceOfEdges(const SMDS_MeshEdge* edge1,
- const SMDS_MeshEdge* edge2,
- const SMDS_MeshEdge* edge3,
- const SMDS_MeshEdge* edge4)
-{
- myNbEdges = 4;
- myEdges[0]=edge1;
- myEdges[1]=edge2;
- myEdges[2]=edge3;
- myEdges[3]=edge4;
-}
-
-/*bool operator<(const SMDS_FaceOfEdges& f1, const SMDS_FaceOfEdges& f2)
-{
- set<SMDS_MeshNode> set1,set2;
- SMDS_ElemIteratorPtr it;
- const SMDS_MeshNode * n;
-
- it=f1.nodesIterator();
-
- while(it->more())
- {
- n=static_cast<const SMDS_MeshNode *>(it->next());
- set1.insert(*n);
- }
-
- delete it;
- it=f2.nodesIterator();
-
- while(it->more())
- {
- n=static_cast<const SMDS_MeshNode *>(it->next());
- set2.insert(*n);
- }
-
- delete it;
- return set1<set2;
-
-}*/
-
+++ /dev/null
-// SMESH SMDS : implementaion of Salome mesh data structure
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-#ifndef _SMDS_FaceOfEdges_HeaderFile
-#define _SMDS_FaceOfEdges_HeaderFile
-
-#include "SMDS_MeshFace.hxx"
-#include "SMDS_MeshEdge.hxx"
-#include "SMDS_Iterator.hxx"
-
-#include <iostream>
-
-
-class SMDS_FaceOfEdges:public SMDS_MeshFace
-{
- public:
- void Print(std::ostream & OS) const;
- SMDS_FaceOfEdges(const SMDS_MeshEdge* edge1,
- const SMDS_MeshEdge* edge2,
- const SMDS_MeshEdge* edge3);
- SMDS_FaceOfEdges(const SMDS_MeshEdge* edge1,
- const SMDS_MeshEdge* edge2,
- const SMDS_MeshEdge* edge3,
- const SMDS_MeshEdge* edge4);
-
- SMDSAbs_ElementType GetType() const;
- int NbEdges() const;
- int NbFaces() const;
-// friend bool operator<(const SMDS_FaceOfEdges& e1, const SMDS_FaceOfEdges& e2);
-
- protected:
- SMDS_ElemIteratorPtr
- elementsIterator(SMDSAbs_ElementType type) const;
-
- private:
- const SMDS_MeshEdge* myEdges[4];
- int myNbEdges;
-
-};
-
-#endif
+++ /dev/null
-// SMESH SMDS : implementaion of Salome mesh data structure
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-#ifdef _MSC_VER
-#pragma warning(disable:4786)
-#endif
-
-#include "SMDS_FaceOfNodes.hxx"
-#include "SMDS_IteratorOfElements.hxx"
-#include "SMDS_MeshNode.hxx"
-#include "utilities.h"
-
-using namespace std;
-
-//=======================================================================
-//function : NbEdges
-//purpose :
-//=======================================================================
-
-int SMDS_FaceOfNodes::NbEdges() const
-{
- return NbNodes();
-}
-
-int SMDS_FaceOfNodes::NbFaces() const
-{
- return 1;
-}
-
-int SMDS_FaceOfNodes::NbNodes() const
-{
- return myNbNodes;
-}
-
-//=======================================================================
-//function : Print
-//purpose :
-//=======================================================================
-
-void SMDS_FaceOfNodes::Print(ostream & OS) const
-{
- OS << "face <" << GetID() << " > : ";
- int i;
- for (i = 0; i < NbNodes() - 1; i++) OS << myNodes[i] << ",";
- OS << myNodes[i] << ") " << endl;
-}
-
-//=======================================================================
-//function : elementsIterator
-//purpose :
-//=======================================================================
-
-class SMDS_FaceOfNodes_MyIterator:public SMDS_ElemIterator
-{
- const SMDS_MeshNode* const *mySet;
- int myLength;
- int index;
- public:
- SMDS_FaceOfNodes_MyIterator(const SMDS_MeshNode* const *s, int l):
- mySet(s),myLength(l),index(0) {}
-
- bool more()
- {
- return index<myLength;
- }
-
- const SMDS_MeshElement* next()
- {
- index++;
- return mySet[index-1];
- }
-};
-
-SMDS_ElemIteratorPtr SMDS_FaceOfNodes::elementsIterator
- (SMDSAbs_ElementType type) const
-{
- switch(type)
- {
- case SMDSAbs_Face:
- return SMDS_MeshElement::elementsIterator(SMDSAbs_Face);
- case SMDSAbs_Node:
- return SMDS_ElemIteratorPtr(new SMDS_FaceOfNodes_MyIterator(myNodes,myNbNodes));
- case SMDSAbs_Edge:
- MESSAGE("Error : edge iterator for SMDS_FaceOfNodes not implemented");
- break;
- default:
- return SMDS_ElemIteratorPtr
- (new SMDS_IteratorOfElements
- (this,type,SMDS_ElemIteratorPtr
- (new SMDS_FaceOfNodes_MyIterator(myNodes,myNbNodes))));
- }
- return SMDS_ElemIteratorPtr();
-}
-
-SMDS_FaceOfNodes::SMDS_FaceOfNodes(const SMDS_MeshNode* node1,
- const SMDS_MeshNode* node2,
- const SMDS_MeshNode* node3)
-{
- myNbNodes = 3;
- myNodes[0]=node1;
- myNodes[1]=node2;
- myNodes[2]=node3;
- myNodes[3]=0;
-}
-
-SMDS_FaceOfNodes::SMDS_FaceOfNodes(const SMDS_MeshNode* node1,
- const SMDS_MeshNode* node2,
- const SMDS_MeshNode* node3,
- const SMDS_MeshNode* node4)
-{
- myNbNodes = 4;
- myNodes[0]=node1;
- myNodes[1]=node2;
- myNodes[2]=node3;
- myNodes[3]=node4;
-}
-bool SMDS_FaceOfNodes::ChangeNodes(const SMDS_MeshNode* nodes[],
- const int nbNodes)
-{
- myNbNodes = nbNodes;
- myNodes[0]=nodes[0];
- myNodes[1]=nodes[1];
- myNodes[2]=nodes[2];
- if (nbNodes == 4)
- myNodes[3]=nodes[3];
- else if (nbNodes != 3)
- return false;
-
- return true;
-}
-
-/*bool operator<(const SMDS_FaceOfNodes& f1, const SMDS_FaceOfNodes& f2)
-{
- set<SMDS_MeshNode> set1,set2;
- SMDS_ElemIteratorPtr it;
- const SMDS_MeshNode * n;
-
- it=f1.nodesIterator();
-
- while(it->more())
- {
- n=static_cast<const SMDS_MeshNode *>(it->next());
- set1.insert(*n);
- }
-
- delete it;
- it=f2.nodesIterator();
-
- while(it->more())
- {
- n=static_cast<const SMDS_MeshNode *>(it->next());
- set2.insert(*n);
- }
-
- delete it;
- return set1<set2;
-
-}*/
-
+++ /dev/null
-// SMESH SMDS : implementaion of Salome mesh data structure
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-#ifndef _SMDS_FaceOfNodes_HeaderFile
-#define _SMDS_FaceOfNodes_HeaderFile
-
-#include "SMDS_MeshFace.hxx"
-#include "SMDS_MeshNode.hxx"
-#include "SMDS_Iterator.hxx"
-
-#include <iostream>
-
-class SMDS_FaceOfNodes:public SMDS_MeshFace
-{
- public:
- void Print(std::ostream & OS) const;
- SMDS_FaceOfNodes(const SMDS_MeshNode* node1,
- const SMDS_MeshNode* node2,
- const SMDS_MeshNode* node3);
- SMDS_FaceOfNodes(const SMDS_MeshNode* node1,
- const SMDS_MeshNode* node2,
- const SMDS_MeshNode* node3,
- const SMDS_MeshNode* node4);
- bool ChangeNodes(const SMDS_MeshNode* nodes[],
- const int nbNodes);
- int NbEdges() const;
- int NbFaces() const;
- int NbNodes() const;
- protected:
- SMDS_ElemIteratorPtr
- elementsIterator(SMDSAbs_ElementType type) const;
-
- private:
- const SMDS_MeshNode* myNodes[4];
- int myNbNodes;
-
-};
-
-#endif
+++ /dev/null
-// SMESH SMDS : implementaion of Salome mesh data structure
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMDS_FacePosition.cxx
-// Author : Jean-Michel BOULCOURT
-// Module : SMESH
-
-#include "SMDS_FacePosition.hxx"
-
-#include "utilities.h"
-
-using namespace std;
-
-//=======================================================================
-//function : SMDS_FacePosition
-//purpose :
-//=======================================================================
-
-SMDS_FacePosition::SMDS_FacePosition(const int aEdgeId,
- const double aUParam,
- const double aVParam)
- :SMDS_Position(aEdgeId),
- myUParameter(aUParam),myVParameter(aVParam)
-{
-}
-
-//=======================================================================
-//function : Coords
-//purpose :
-//=======================================================================
-const double *SMDS_FacePosition::Coords() const
-{
- static double origin[]={0,0,0};
- MESSAGE("SMDS_EdgePosition::Coords not implemented");
- return origin;
-}
-
-/**
-*/
-SMDS_TypeOfPosition SMDS_FacePosition::GetTypeOfPosition() const
-{
- return SMDS_TOP_FACE;
-}
-
-void SMDS_FacePosition::SetUParameter(double aUparam)
-{
- myUParameter = aUparam;
-}
-
-//=======================================================================
-//function : SetVParameter
-//purpose :
-//=======================================================================
-
-void SMDS_FacePosition::SetVParameter(double aVparam)
-{
- myVParameter = aVparam;
-}
-
-//=======================================================================
-//function : GetUParameter
-//purpose :
-//=======================================================================
-
-double SMDS_FacePosition::GetUParameter() const
-{
- return myUParameter;
-}
-
-//=======================================================================
-//function : GetVParameter
-//purpose :
-//=======================================================================
-
-double SMDS_FacePosition::GetVParameter() const
-{
- return myVParameter;
-}
+++ /dev/null
-// SMESH SMDS : implementaion of Salome mesh data structure
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMDS_FacePosition.hxx
-// Module : SMESH
-
-#ifndef _SMDS_FacePosition_HeaderFile
-#define _SMDS_FacePosition_HeaderFile
-
-#include "SMDS_Position.hxx"
-
-//#ifdef WNT
-//#include <SALOME_WNT.hxx>
-//#else
-//#define SALOME_WNT_EXPORT
-//#endif
-
-#if defined WNT && defined WIN32 && defined SMDS_EXPORTS
-#define SMDS_WNT_EXPORT __declspec( dllexport )
-#else
-#define SMDS_WNT_EXPORT
-#endif
-
-class SMDS_WNT_EXPORT SMDS_FacePosition:public SMDS_Position
-{
-
- public:
- SMDS_FacePosition(int aFaceId=0, double aUParam=0,
- double aVParam=0);
- const virtual double * Coords() const;
- SMDS_TypeOfPosition GetTypeOfPosition() const;
- void SetUParameter(double aUparam);
- void SetVParameter(double aVparam);
- double GetUParameter() const;
- double GetVParameter() const;
-
- private:
- double myUParameter;
- double myVParameter;
-};
-#endif
+++ /dev/null
-// SMESH SMDS : implementaion of Salome mesh data structure
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-#ifndef _SMDS_Iterator_HeaderFile
-#define _SMDS_Iterator_HeaderFile
-
-///////////////////////////////////////////////////////////////////////////////
-///Abstract class for iterators
-///@author Jerome Robert
-///////////////////////////////////////////////////////////////////////////////
-template<typename VALUE> class SMDS_Iterator
-{
- public:
- /// Return true if and only if there are other object in this iterator
- virtual bool more()=0;
-
- /// Return the current object and step to the next one
- virtual VALUE next()=0;
-
- /// Delete the current element and step to the next one
- virtual void remove(){}
-
- /// Provide virtual destructor just for case if some derived iterator
- /// must have a destructor
- virtual ~SMDS_Iterator(){}
-};
-
-#endif
+++ /dev/null
-// SMESH SMDS : implementaion of Salome mesh data structure
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-#ifdef _MSC_VER
-#pragma warning(disable:4786)
-#endif
-
-#include "SMDS_IteratorOfElements.hxx"
-
-bool SMDS_IteratorOfElements::subMore()
-{
- if((t2Iterator.get()==NULL)||(!t2Iterator->more()))
- {
- if(t1Iterator->more())
- {
- t2Iterator=t1Iterator->next()->elementsIterator(myType);
- return subMore();
- }
- else return false;
- }
- else return true;
-}
-
-const SMDS_MeshElement * SMDS_IteratorOfElements::subNext()
-{
- if((t2Iterator.get()==NULL)||(!t2Iterator->more()))
- if(t1Iterator->more())
- t2Iterator=t1Iterator->next()->elementsIterator(myType);
- return t2Iterator->next();
-}
-
-/////////////////////////////////////////////////////////////////////////////
-/// Create an iterator which look for elements of type type which are linked
-/// to the element element. it is the iterator to get connectivity of element
-//////////////////////////////////////////////////////////////////////////////
-SMDS_IteratorOfElements::SMDS_IteratorOfElements(const SMDS_MeshElement * element,
- SMDSAbs_ElementType type,
- const SMDS_ElemIteratorPtr& it)
- : t1Iterator(it),
- t2Iterator(SMDS_ElemIteratorPtr((SMDS_ElemIterator*)NULL)),
- myType(type), myElement(element),
- myProxyElement(NULL)
-{
- while(subMore())
- alreadyReturnedElements.insert(subNext());
- itAlreadyReturned= alreadyReturnedElements.begin();
- switch(myElement->GetType())
- {
- case SMDSAbs_Node:
- case SMDSAbs_Edge: myReverseIteration=true; break;
- case SMDSAbs_Face: myReverseIteration=(type==SMDSAbs_Volume); break;
- default: myReverseIteration=false;
- }
-}
-
-bool SMDS_IteratorOfElements::more()
-{
- if(myProxyElement==NULL)
- {
- while(itAlreadyReturned!=alreadyReturnedElements.end())
- {
- myProxyElement=*itAlreadyReturned;
- itAlreadyReturned++;
-
- if(myReverseIteration)
- {
- SMDS_ElemIteratorPtr it=
- myProxyElement->elementsIterator(myElement->GetType());
- while(it->more())
- {
- if(it->next()==myElement) return true;
- }
- }
- else return true;
- }
- myProxyElement=NULL;
- return false;
- }
- else return true;
-}
-
-const SMDS_MeshElement * SMDS_IteratorOfElements::next()
-{
- more();
- const SMDS_MeshElement *e=myProxyElement;
- myProxyElement=NULL;
- return e;
-}
+++ /dev/null
-// SMESH SMDS : implementaion of Salome mesh data structure
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-#include "SMDS_Iterator.hxx"
-#include "SMDS_MeshElement.hxx"
-#include <set>
-
-
-class SMDS_IteratorOfElements:public SMDS_ElemIterator
-{
- public:
-/////////////////////////////////////////////////////////////////////////////
-/// Create an iterator which look for elements of type type which are linked
-/// to the element element. it is the iterator to get connectivity of element
-//////////////////////////////////////////////////////////////////////////////
- SMDS_IteratorOfElements(const SMDS_MeshElement * element,
- SMDSAbs_ElementType type,
- const SMDS_ElemIteratorPtr& it);
- bool more();
- const SMDS_MeshElement * next();
-
- private:
- SMDS_ElemIteratorPtr t2Iterator;
- SMDS_ElemIteratorPtr t1Iterator;
- SMDSAbs_ElementType myType;
- const SMDS_MeshElement * myProxyElement;
- const SMDS_MeshElement * myElement;
- bool myReverseIteration;
-
- std::set<const SMDS_MeshElement*> alreadyReturnedElements;
- std::set<const SMDS_MeshElement*>::iterator itAlreadyReturned;
- bool subMore();
- const SMDS_MeshElement * subNext();
-};
+++ /dev/null
-// SMESH SMDS : implementaion of Salome mesh data structure
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-#ifdef _MSC_VER
-#pragma warning(disable:4786)
-#endif
-
-#include "utilities.h"
-#include "SMDS_Mesh.hxx"
-#include "SMDS_VolumeOfNodes.hxx"
-#include "SMDS_VolumeOfFaces.hxx"
-#include "SMDS_FaceOfNodes.hxx"
-#include "SMDS_FaceOfEdges.hxx"
-#include "SMDS_PolyhedralVolumeOfNodes.hxx"
-#include "SMDS_PolygonalFaceOfNodes.hxx"
-
-#include <algorithm>
-#include <map>
-using namespace std;
-
-///////////////////////////////////////////////////////////////////////////////
-/// Create a new mesh object
-///////////////////////////////////////////////////////////////////////////////
-SMDS_Mesh::SMDS_Mesh()
- :myParent(NULL),
- myNodeIDFactory(new SMDS_MeshElementIDFactory()),
- myElementIDFactory(new SMDS_MeshElementIDFactory()),
- myHasConstructionEdges(false), myHasConstructionFaces(false),
- myHasInverseElements(true)
-{
-}
-
-///////////////////////////////////////////////////////////////////////////////
-/// Create a new child mesh
-/// Note that the tree structure of SMDS_Mesh seems to be unused in this version
-/// (2003-09-08) of SMESH
-///////////////////////////////////////////////////////////////////////////////
-SMDS_Mesh::SMDS_Mesh(SMDS_Mesh * parent)
- :myParent(parent), myNodeIDFactory(parent->myNodeIDFactory),
- myElementIDFactory(parent->myElementIDFactory),
- myHasConstructionEdges(false), myHasConstructionFaces(false),
- myHasInverseElements(true)
-{
-}
-
-///////////////////////////////////////////////////////////////////////////////
-///Create a submesh and add it to the current mesh
-///////////////////////////////////////////////////////////////////////////////
-
-SMDS_Mesh *SMDS_Mesh::AddSubMesh()
-{
- SMDS_Mesh *submesh = new SMDS_Mesh(this);
- myChildren.insert(myChildren.end(), submesh);
- return submesh;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-///create a MeshNode and add it to the current Mesh
-///An ID is automatically assigned to the node.
-///@return : The created node
-///////////////////////////////////////////////////////////////////////////////
-
-SMDS_MeshNode * SMDS_Mesh::AddNode(double x, double y, double z)
-{
- return SMDS_Mesh::AddNodeWithID(x,y,z,myNodeIDFactory->GetFreeID());
-}
-
-///////////////////////////////////////////////////////////////////////////////
-///create a MeshNode and add it to the current Mesh
-///@param ID : The ID of the MeshNode to create
-///@return : The created node or NULL if a node with this ID already exists
-///////////////////////////////////////////////////////////////////////////////
-SMDS_MeshNode * SMDS_Mesh::AddNodeWithID(double x, double y, double z, int ID)
-{
- // find the MeshNode corresponding to ID
- const SMDS_MeshElement *node = myNodeIDFactory->MeshElement(ID);
- if(!node){
- SMDS_MeshNode * node=new SMDS_MeshNode(x, y, z);
- myNodes.Add(node);
- myNodeIDFactory->BindID(ID,node);
- return node;
- }else
- return NULL;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-/// create a MeshEdge and add it to the current Mesh
-/// @return : The created MeshEdge
-///////////////////////////////////////////////////////////////////////////////
-
-SMDS_MeshEdge* SMDS_Mesh::AddEdgeWithID(int idnode1, int idnode2, int ID)
-{
- SMDS_MeshNode * node1 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode1);
- SMDS_MeshNode * node2 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode2);
- if(!node1 || !node2) return NULL;
- return SMDS_Mesh::AddEdgeWithID(node1, node2, ID);
-}
-
-///////////////////////////////////////////////////////////////////////////////
-/// create a MeshEdge and add it to the current Mesh
-/// @return : The created MeshEdge
-///////////////////////////////////////////////////////////////////////////////
-
-SMDS_MeshEdge* SMDS_Mesh::AddEdge(const SMDS_MeshNode * node1,
- const SMDS_MeshNode * node2)
-{
- return SMDS_Mesh::AddEdgeWithID(node1, node2, myElementIDFactory->GetFreeID());
-}
-
-///////////////////////////////////////////////////////////////////////////////
-/// Create a new edge and at it to the mesh
-/// @param idnode1 ID of the first node
-/// @param idnode2 ID of the second node
-/// @param ID ID of the edge to create
-/// @return The created edge or NULL if an element with this ID already exists or
-/// if input nodes are not found.
-///////////////////////////////////////////////////////////////////////////////
-
-SMDS_MeshEdge* SMDS_Mesh::AddEdgeWithID(const SMDS_MeshNode * n1,
- const SMDS_MeshNode * n2,
- int ID)
-{
- SMDS_MeshEdge * edge=new SMDS_MeshEdge(n1,n2);
- if(myElementIDFactory->BindID(ID, edge)) {
- SMDS_MeshNode *node1,*node2;
- node1=const_cast<SMDS_MeshNode*>(n1);
- node2=const_cast<SMDS_MeshNode*>(n2);
- node1->AddInverseElement(edge);
- node2->AddInverseElement(edge);
- myEdges.Add(edge);
- return edge;
- }
- else {
- delete edge;
- return NULL;
- }
-}
-
-///////////////////////////////////////////////////////////////////////////////
-/// Add a triangle defined by its nodes. An ID is automatically affected to the
-/// Created face
-///////////////////////////////////////////////////////////////////////////////
-
-SMDS_MeshFace* SMDS_Mesh::AddFace(const SMDS_MeshNode * n1,
- const SMDS_MeshNode * n2,
- const SMDS_MeshNode * n3)
-{
- return SMDS_Mesh::AddFaceWithID(n1,n2,n3, myElementIDFactory->GetFreeID());
-}
-
-///////////////////////////////////////////////////////////////////////////////
-/// Add a triangle defined by its nodes IDs
-///////////////////////////////////////////////////////////////////////////////
-
-SMDS_MeshFace* SMDS_Mesh::AddFaceWithID(int idnode1, int idnode2, int idnode3, int ID)
-{
- SMDS_MeshNode * node1 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode1);
- SMDS_MeshNode * node2 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode2);
- SMDS_MeshNode * node3 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode3);
- if(!node1 || !node2 || !node3) return NULL;
- return SMDS_Mesh::AddFaceWithID(node1, node2, node3, ID);
-}
-
-///////////////////////////////////////////////////////////////////////////////
-/// Add a triangle defined by its nodes
-///////////////////////////////////////////////////////////////////////////////
-
-SMDS_MeshFace* SMDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1,
- const SMDS_MeshNode * n2,
- const SMDS_MeshNode * n3,
- int ID)
-{
- SMDS_MeshFace * face=createTriangle(n1, n2, n3);
-
- if (!registerElement(ID, face)) {
- RemoveElement(face, false);
- face = NULL;
- }
- return face;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-/// Add a quadrangle defined by its nodes. An ID is automatically affected to the
-/// created face
-///////////////////////////////////////////////////////////////////////////////
-
-SMDS_MeshFace* SMDS_Mesh::AddFace(const SMDS_MeshNode * n1,
- const SMDS_MeshNode * n2,
- const SMDS_MeshNode * n3,
- const SMDS_MeshNode * n4)
-{
- return SMDS_Mesh::AddFaceWithID(n1,n2,n3, n4, myElementIDFactory->GetFreeID());
-}
-
-///////////////////////////////////////////////////////////////////////////////
-/// Add a quadrangle defined by its nodes IDs
-///////////////////////////////////////////////////////////////////////////////
-
-SMDS_MeshFace* SMDS_Mesh::AddFaceWithID(int idnode1,
- int idnode2,
- int idnode3,
- int idnode4,
- int ID)
-{
- SMDS_MeshNode *node1, *node2, *node3, *node4;
- node1 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode1);
- node2 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode2);
- node3 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode3);
- node4 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode4);
- if(!node1 || !node2 || !node3 || !node4) return NULL;
- return SMDS_Mesh::AddFaceWithID(node1, node2, node3, node4, ID);
-}
-
-///////////////////////////////////////////////////////////////////////////////
-/// Add a quadrangle defined by its nodes
-///////////////////////////////////////////////////////////////////////////////
-
-SMDS_MeshFace* SMDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1,
- const SMDS_MeshNode * n2,
- const SMDS_MeshNode * n3,
- const SMDS_MeshNode * n4,
- int ID)
-{
- SMDS_MeshFace * face=createQuadrangle(n1, n2, n3, n4);
-
- if (!registerElement(ID, face)) {
- RemoveElement(face, false);
- face = NULL;
- }
- return face;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-/// Add a triangle defined by its edges. An ID is automatically assigned to the
-/// Created face
-///////////////////////////////////////////////////////////////////////////////
-
-SMDS_MeshFace* SMDS_Mesh::AddFace(const SMDS_MeshEdge * e1,
- const SMDS_MeshEdge * e2,
- const SMDS_MeshEdge * e3)
-{
- if (!hasConstructionEdges())
- return NULL;
- return AddFaceWithID(e1,e2,e3, myElementIDFactory->GetFreeID());
-}
-
-///////////////////////////////////////////////////////////////////////////////
-/// Add a triangle defined by its edges
-///////////////////////////////////////////////////////////////////////////////
-
-SMDS_MeshFace* SMDS_Mesh::AddFaceWithID(const SMDS_MeshEdge * e1,
- const SMDS_MeshEdge * e2,
- const SMDS_MeshEdge * e3,
- int ID)
-{
- if (!hasConstructionEdges())
- return NULL;
- SMDS_MeshFace * face = new SMDS_FaceOfEdges(e1,e2,e3);
- myFaces.Add(face);
-
- if (!registerElement(ID, face)) {
- RemoveElement(face, false);
- face = NULL;
- }
- return face;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-/// Add a quadrangle defined by its edges. An ID is automatically assigned to the
-/// Created face
-///////////////////////////////////////////////////////////////////////////////
-
-SMDS_MeshFace* SMDS_Mesh::AddFace(const SMDS_MeshEdge * e1,
- const SMDS_MeshEdge * e2,
- const SMDS_MeshEdge * e3,
- const SMDS_MeshEdge * e4)
-{
- if (!hasConstructionEdges())
- return NULL;
- return AddFaceWithID(e1,e2,e3,e4, myElementIDFactory->GetFreeID());
-}
-
-///////////////////////////////////////////////////////////////////////////////
-/// Add a quadrangle defined by its edges
-///////////////////////////////////////////////////////////////////////////////
-
-SMDS_MeshFace* SMDS_Mesh::AddFaceWithID(const SMDS_MeshEdge * e1,
- const SMDS_MeshEdge * e2,
- const SMDS_MeshEdge * e3,
- const SMDS_MeshEdge * e4,
- int ID)
-{
- if (!hasConstructionEdges())
- return NULL;
- SMDS_MeshFace * face = new SMDS_FaceOfEdges(e1,e2,e3,e4);
- myFaces.Add(face);
-
- if (!registerElement(ID, face))
- {
- RemoveElement(face, false);
- face = NULL;
- }
- return face;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-///Create a new tetrahedron and add it to the mesh.
-///@return The created tetrahedron
-///////////////////////////////////////////////////////////////////////////////
-
-SMDS_MeshVolume* SMDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
- const SMDS_MeshNode * n2,
- const SMDS_MeshNode * n3,
- const SMDS_MeshNode * n4)
-{
- int ID = myElementIDFactory->GetFreeID();
- SMDS_MeshVolume * v = SMDS_Mesh::AddVolumeWithID(n1, n2, n3, n4, ID);
- if(v==NULL) myElementIDFactory->ReleaseID(ID);
- return v;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-///Create a new tetrahedron and add it to the mesh.
-///@param ID The ID of the new volume
-///@return The created tetrahedron or NULL if an element with this ID already exists
-///or if input nodes are not found.
-///////////////////////////////////////////////////////////////////////////////
-
-SMDS_MeshVolume * SMDS_Mesh::AddVolumeWithID(int idnode1,
- int idnode2,
- int idnode3,
- int idnode4,
- int ID)
-{
- SMDS_MeshNode *node1, *node2, *node3, *node4;
- node1 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode1);
- node2 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode2);
- node3 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode3);
- node4 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode4);
- if(!node1 || !node2 || !node3 || !node4) return NULL;
- return SMDS_Mesh::AddVolumeWithID(node1, node2, node3, node4, ID);
-}
-
-///////////////////////////////////////////////////////////////////////////////
-///Create a new tetrahedron and add it to the mesh.
-///@param ID The ID of the new volume
-///@return The created tetrahedron
-///////////////////////////////////////////////////////////////////////////////
-
-SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
- const SMDS_MeshNode * n2,
- const SMDS_MeshNode * n3,
- const SMDS_MeshNode * n4,
- int ID)
-{
- SMDS_MeshVolume* volume;
- if(hasConstructionFaces()) {
- SMDS_MeshFace * f1=FindFaceOrCreate(n1,n2,n3);
- SMDS_MeshFace * f2=FindFaceOrCreate(n1,n2,n4);
- SMDS_MeshFace * f3=FindFaceOrCreate(n1,n3,n4);
- SMDS_MeshFace * f4=FindFaceOrCreate(n2,n3,n4);
- volume=new SMDS_VolumeOfFaces(f1,f2,f3,f4);
- myVolumes.Add(volume);
- }
- else if(hasConstructionEdges()) {
- MESSAGE("Error : Not implemented");
- return NULL;
- }
- else {
- volume=new SMDS_VolumeOfNodes(n1,n2,n3,n4);
- myVolumes.Add(volume);
- }
-
- if (!registerElement(ID, volume)) {
- RemoveElement(volume, false);
- volume = NULL;
- }
- return volume;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-///Create a new pyramid and add it to the mesh.
-///Nodes 1,2,3 and 4 define the base of the pyramid
-///@return The created pyramid
-///////////////////////////////////////////////////////////////////////////////
-
-SMDS_MeshVolume* SMDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
- const SMDS_MeshNode * n2,
- const SMDS_MeshNode * n3,
- const SMDS_MeshNode * n4,
- const SMDS_MeshNode * n5)
-{
- int ID = myElementIDFactory->GetFreeID();
- SMDS_MeshVolume * v = SMDS_Mesh::AddVolumeWithID(n1, n2, n3, n4, n5, ID);
- if(v==NULL) myElementIDFactory->ReleaseID(ID);
- return v;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-///Create a new pyramid and add it to the mesh.
-///Nodes 1,2,3 and 4 define the base of the pyramid
-///@param ID The ID of the new volume
-///@return The created pyramid or NULL if an element with this ID already exists
-///or if input nodes are not found.
-///////////////////////////////////////////////////////////////////////////////
-
-SMDS_MeshVolume * SMDS_Mesh::AddVolumeWithID(int idnode1,
- int idnode2,
- int idnode3,
- int idnode4,
- int idnode5,
- int ID)
-{
- SMDS_MeshNode *node1, *node2, *node3, *node4, *node5;
- node1 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode1);
- node2 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode2);
- node3 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode3);
- node4 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode4);
- node5 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode5);
- if(!node1 || !node2 || !node3 || !node4 || !node5) return NULL;
- return SMDS_Mesh::AddVolumeWithID(node1, node2, node3, node4, node5, ID);
-}
-
-///////////////////////////////////////////////////////////////////////////////
-///Create a new pyramid and add it to the mesh.
-///Nodes 1,2,3 and 4 define the base of the pyramid
-///@param ID The ID of the new volume
-///@return The created pyramid
-///////////////////////////////////////////////////////////////////////////////
-
-SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
- const SMDS_MeshNode * n2,
- const SMDS_MeshNode * n3,
- const SMDS_MeshNode * n4,
- const SMDS_MeshNode * n5,
- int ID)
-{
- SMDS_MeshVolume* volume;
- if(hasConstructionFaces()) {
- SMDS_MeshFace * f1=FindFaceOrCreate(n1,n2,n3,n4);
- SMDS_MeshFace * f2=FindFaceOrCreate(n1,n2,n5);
- SMDS_MeshFace * f3=FindFaceOrCreate(n2,n3,n5);
- SMDS_MeshFace * f4=FindFaceOrCreate(n3,n4,n5);
- volume=new SMDS_VolumeOfFaces(f1,f2,f3,f4);
- myVolumes.Add(volume);
- }
- else if(hasConstructionEdges()) {
- MESSAGE("Error : Not implemented");
- return NULL;
- }
- else {
- volume=new SMDS_VolumeOfNodes(n1,n2,n3,n4,n5);
- myVolumes.Add(volume);
- }
-
- if (!registerElement(ID, volume)) {
- RemoveElement(volume, false);
- volume = NULL;
- }
- return volume;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-///Create a new prism and add it to the mesh.
-///Nodes 1,2,3 is a triangle and 1,2,5,4 a quadrangle.
-///@return The created prism
-///////////////////////////////////////////////////////////////////////////////
-
-SMDS_MeshVolume* SMDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
- const SMDS_MeshNode * n2,
- const SMDS_MeshNode * n3,
- const SMDS_MeshNode * n4,
- const SMDS_MeshNode * n5,
- const SMDS_MeshNode * n6)
-{
- int ID = myElementIDFactory->GetFreeID();
- SMDS_MeshVolume * v = SMDS_Mesh::AddVolumeWithID(n1, n2, n3, n4, n5, n6, ID);
- if(v==NULL) myElementIDFactory->ReleaseID(ID);
- return v;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-///Create a new prism and add it to the mesh.
-///Nodes 1,2,3 is a triangle and 1,2,5,4 a quadrangle.
-///@param ID The ID of the new volume
-///@return The created prism or NULL if an element with this ID already exists
-///or if input nodes are not found.
-///////////////////////////////////////////////////////////////////////////////
-
-SMDS_MeshVolume * SMDS_Mesh::AddVolumeWithID(int idnode1,
- int idnode2,
- int idnode3,
- int idnode4,
- int idnode5,
- int idnode6,
- int ID)
-{
- SMDS_MeshNode *node1, *node2, *node3, *node4, *node5, *node6;
- node1 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode1);
- node2 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode2);
- node3 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode3);
- node4 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode4);
- node5 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode5);
- node6 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode6);
- if(!node1 || !node2 || !node3 || !node4 || !node5 || !node6) return NULL;
- return SMDS_Mesh::AddVolumeWithID(node1, node2, node3, node4, node5, node6, ID);
-}
-
-///////////////////////////////////////////////////////////////////////////////
-///Create a new prism and add it to the mesh.
-///Nodes 1,2,3 is a triangle and 1,2,5,4 a quadrangle.
-///@param ID The ID of the new volume
-///@return The created prism
-///////////////////////////////////////////////////////////////////////////////
-
-SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
- const SMDS_MeshNode * n2,
- const SMDS_MeshNode * n3,
- const SMDS_MeshNode * n4,
- const SMDS_MeshNode * n5,
- const SMDS_MeshNode * n6,
- int ID)
-{
- SMDS_MeshVolume* volume;
- if(hasConstructionFaces()) {
- SMDS_MeshFace * f1=FindFaceOrCreate(n1,n2,n3);
- SMDS_MeshFace * f2=FindFaceOrCreate(n4,n5,n6);
- SMDS_MeshFace * f3=FindFaceOrCreate(n1,n4,n5,n2);
- SMDS_MeshFace * f4=FindFaceOrCreate(n2,n5,n6,n3);
- SMDS_MeshFace * f5=FindFaceOrCreate(n3,n6,n4,n1);
- volume=new SMDS_VolumeOfFaces(f1,f2,f3,f4,f5);
- myVolumes.Add(volume);
- }
- else if(hasConstructionEdges()) {
- MESSAGE("Error : Not implemented");
- return NULL;
- }
- else {
- volume=new SMDS_VolumeOfNodes(n1,n2,n3,n4,n5,n6);
- myVolumes.Add(volume);
- }
-
- if (!registerElement(ID, volume)) {
- RemoveElement(volume, false);
- volume = NULL;
- }
- return volume;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-///Create a new hexahedron and add it to the mesh.
-///Nodes 1,2,3,4 and 5,6,7,8 are quadrangle and 5,1 and 7,3 are an edges.
-///@return The created hexahedron
-///////////////////////////////////////////////////////////////////////////////
-
-SMDS_MeshVolume* SMDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
- const SMDS_MeshNode * n2,
- const SMDS_MeshNode * n3,
- const SMDS_MeshNode * n4,
- const SMDS_MeshNode * n5,
- const SMDS_MeshNode * n6,
- const SMDS_MeshNode * n7,
- const SMDS_MeshNode * n8)
-{
- int ID = myElementIDFactory->GetFreeID();
- SMDS_MeshVolume * v = SMDS_Mesh::AddVolumeWithID(n1, n2, n3, n4, n5, n6, n7, n8, ID);
- if(v==NULL) myElementIDFactory->ReleaseID(ID);
- return v;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-///Create a new hexahedron and add it to the mesh.
-///Nodes 1,2,3,4 and 5,6,7,8 are quadrangle and 5,1 and 7,3 are an edges.
-///@param ID The ID of the new volume
-///@return The created hexahedron or NULL if an element with this ID already
-///exists or if input nodes are not found.
-///////////////////////////////////////////////////////////////////////////////
-
-SMDS_MeshVolume * SMDS_Mesh::AddVolumeWithID(int idnode1,
- int idnode2,
- int idnode3,
- int idnode4,
- int idnode5,
- int idnode6,
- int idnode7,
- int idnode8,
- int ID)
-{
- SMDS_MeshNode *node1, *node2, *node3, *node4, *node5, *node6, *node7, *node8;
- node1 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode1);
- node2 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode2);
- node3 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode3);
- node4 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode4);
- node5 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode5);
- node6 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode6);
- node7 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode7);
- node8 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode8);
- if(!node1 || !node2 || !node3 || !node4 || !node5 || !node6 || !node7 || !node8)
- return NULL;
- return SMDS_Mesh::AddVolumeWithID(node1, node2, node3, node4, node5, node6,
- node7, node8, ID);
-}
-
-///////////////////////////////////////////////////////////////////////////////
-///Create a new hexahedron and add it to the mesh.
-///Nodes 1,2,3,4 and 5,6,7,8 are quadrangle and 5,1 and 7,3 are an edges.
-///@param ID The ID of the new volume
-///@return The created prism or NULL if an element with this ID already exists
-///or if input nodes are not found.
-///////////////////////////////////////////////////////////////////////////////
-
-SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
- const SMDS_MeshNode * n2,
- const SMDS_MeshNode * n3,
- const SMDS_MeshNode * n4,
- const SMDS_MeshNode * n5,
- const SMDS_MeshNode * n6,
- const SMDS_MeshNode * n7,
- const SMDS_MeshNode * n8,
- int ID)
-{
- SMDS_MeshVolume* volume;
- if(hasConstructionFaces()) {
- SMDS_MeshFace * f1=FindFaceOrCreate(n1,n2,n3,n4);
- SMDS_MeshFace * f2=FindFaceOrCreate(n5,n6,n7,n8);
- SMDS_MeshFace * f3=FindFaceOrCreate(n1,n4,n8,n5);
- SMDS_MeshFace * f4=FindFaceOrCreate(n1,n2,n6,n5);
- SMDS_MeshFace * f5=FindFaceOrCreate(n2,n3,n7,n6);
- SMDS_MeshFace * f6=FindFaceOrCreate(n3,n4,n8,n7);
- volume=new SMDS_VolumeOfFaces(f1,f2,f3,f4,f5,f6);
- myVolumes.Add(volume);
- }
- else if(hasConstructionEdges()) {
- MESSAGE("Error : Not implemented");
- return NULL;
- }
- else {
-// volume=new SMDS_HexahedronOfNodes(n1,n2,n3,n4,n5,n6,n7,n8);
- volume=new SMDS_VolumeOfNodes(n1,n2,n3,n4,n5,n6,n7,n8);
- myVolumes.Add(volume);
- }
-
- if (!registerElement(ID, volume)) {
- RemoveElement(volume, false);
- volume = NULL;
- }
- return volume;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-///Create a new tetrahedron defined by its faces and add it to the mesh.
-///@return The created tetrahedron
-///////////////////////////////////////////////////////////////////////////////
-
-SMDS_MeshVolume* SMDS_Mesh::AddVolume(const SMDS_MeshFace * f1,
- const SMDS_MeshFace * f2,
- const SMDS_MeshFace * f3,
- const SMDS_MeshFace * f4)
-{
- if (!hasConstructionFaces())
- return NULL;
- return AddVolumeWithID(f1,f2,f3,f4, myElementIDFactory->GetFreeID());
-}
-
-///////////////////////////////////////////////////////////////////////////////
-///Create a new tetrahedron defined by its faces and add it to the mesh.
-///@param ID The ID of the new volume
-///@return The created tetrahedron
-///////////////////////////////////////////////////////////////////////////////
-
-SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshFace * f1,
- const SMDS_MeshFace * f2,
- const SMDS_MeshFace * f3,
- const SMDS_MeshFace * f4,
- int ID)
-{
- if (!hasConstructionFaces())
- return NULL;
- SMDS_MeshVolume * volume = new SMDS_VolumeOfFaces(f1,f2,f3,f4);
- myVolumes.Add(volume);
-
- if (!registerElement(ID, volume)) {
- RemoveElement(volume, false);
- volume = NULL;
- }
- return volume;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-///Create a new pyramid defined by its faces and add it to the mesh.
-///@return The created pyramid
-///////////////////////////////////////////////////////////////////////////////
-
-SMDS_MeshVolume* SMDS_Mesh::AddVolume(const SMDS_MeshFace * f1,
- const SMDS_MeshFace * f2,
- const SMDS_MeshFace * f3,
- const SMDS_MeshFace * f4,
- const SMDS_MeshFace * f5)
-{
- if (!hasConstructionFaces())
- return NULL;
- return AddVolumeWithID(f1,f2,f3,f4,f5, myElementIDFactory->GetFreeID());
-}
-
-///////////////////////////////////////////////////////////////////////////////
-///Create a new pyramid defined by its faces and add it to the mesh.
-///@param ID The ID of the new volume
-///@return The created pyramid
-///////////////////////////////////////////////////////////////////////////////
-
-SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshFace * f1,
- const SMDS_MeshFace * f2,
- const SMDS_MeshFace * f3,
- const SMDS_MeshFace * f4,
- const SMDS_MeshFace * f5,
- int ID)
-{
- if (!hasConstructionFaces())
- return NULL;
- SMDS_MeshVolume * volume = new SMDS_VolumeOfFaces(f1,f2,f3,f4,f5);
- myVolumes.Add(volume);
-
- if (!registerElement(ID, volume)) {
- RemoveElement(volume, false);
- volume = NULL;
- }
- return volume;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-///Create a new prism defined by its faces and add it to the mesh.
-///@return The created prism
-///////////////////////////////////////////////////////////////////////////////
-
-SMDS_MeshVolume* SMDS_Mesh::AddVolume(const SMDS_MeshFace * f1,
- const SMDS_MeshFace * f2,
- const SMDS_MeshFace * f3,
- const SMDS_MeshFace * f4,
- const SMDS_MeshFace * f5,
- const SMDS_MeshFace * f6)
-{
- if (!hasConstructionFaces())
- return NULL;
- return AddVolumeWithID(f1,f2,f3,f4,f5,f6, myElementIDFactory->GetFreeID());
-}
-
-///////////////////////////////////////////////////////////////////////////////
-///Create a new prism defined by its faces and add it to the mesh.
-///@param ID The ID of the new volume
-///@return The created prism
-///////////////////////////////////////////////////////////////////////////////
-
-SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshFace * f1,
- const SMDS_MeshFace * f2,
- const SMDS_MeshFace * f3,
- const SMDS_MeshFace * f4,
- const SMDS_MeshFace * f5,
- const SMDS_MeshFace * f6,
- int ID)
-{
- if (!hasConstructionFaces())
- return NULL;
- SMDS_MeshVolume * volume = new SMDS_VolumeOfFaces(f1,f2,f3,f4,f5,f6);
- myVolumes.Add(volume);
-
- if (!registerElement(ID, volume)) {
- RemoveElement(volume, false);
- volume = NULL;
- }
- return volume;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-/// Add a polygon defined by its nodes IDs
-///////////////////////////////////////////////////////////////////////////////
-
-SMDS_MeshFace* SMDS_Mesh::AddPolygonalFaceWithID (std::vector<int> nodes_ids,
- const int ID)
-{
- int nbNodes = nodes_ids.size();
- std::vector<const SMDS_MeshNode*> nodes (nbNodes);
- for (int i = 0; i < nbNodes; i++) {
- nodes[i] = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(nodes_ids[i]);
- if (!nodes[i]) return NULL;
- }
- return SMDS_Mesh::AddPolygonalFaceWithID(nodes, ID);
-}
-
-///////////////////////////////////////////////////////////////////////////////
-/// Add a polygon defined by its nodes
-///////////////////////////////////////////////////////////////////////////////
-
-SMDS_MeshFace* SMDS_Mesh::AddPolygonalFaceWithID
- (std::vector<const SMDS_MeshNode*> nodes,
- const int ID)
-{
- SMDS_MeshFace * face;
-
- if (hasConstructionEdges())
- {
- MESSAGE("Error : Not implemented");
- return NULL;
- }
- else
- {
- face = new SMDS_PolygonalFaceOfNodes(nodes);
- myFaces.Add(face);
- }
-
- if (!registerElement(ID, face)) {
- RemoveElement(face, false);
- face = NULL;
- }
- return face;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-/// Add a polygon defined by its nodes.
-/// An ID is automatically affected to the created face.
-///////////////////////////////////////////////////////////////////////////////
-
-SMDS_MeshFace* SMDS_Mesh::AddPolygonalFace (std::vector<const SMDS_MeshNode*> nodes)
-{
- return SMDS_Mesh::AddPolygonalFaceWithID(nodes, myElementIDFactory->GetFreeID());
-}
-
-///////////////////////////////////////////////////////////////////////////////
-/// Create a new polyhedral volume and add it to the mesh.
-/// @param ID The ID of the new volume
-/// @return The created volume or NULL if an element with this ID already exists
-/// or if input nodes are not found.
-///////////////////////////////////////////////////////////////////////////////
-
-SMDS_MeshVolume * SMDS_Mesh::AddPolyhedralVolumeWithID
- (std::vector<int> nodes_ids,
- std::vector<int> quantities,
- const int ID)
-{
- int nbNodes = nodes_ids.size();
- std::vector<const SMDS_MeshNode*> nodes (nbNodes);
- for (int i = 0; i < nbNodes; i++) {
- nodes[i] = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(nodes_ids[i]);
- if (!nodes[i]) return NULL;
- }
- return SMDS_Mesh::AddPolyhedralVolumeWithID(nodes, quantities, ID);
-}
-
-///////////////////////////////////////////////////////////////////////////////
-/// Create a new polyhedral volume and add it to the mesh.
-/// @param ID The ID of the new volume
-/// @return The created volume
-///////////////////////////////////////////////////////////////////////////////
-
-SMDS_MeshVolume* SMDS_Mesh::AddPolyhedralVolumeWithID
- (std::vector<const SMDS_MeshNode*> nodes,
- std::vector<int> quantities,
- const int ID)
-{
- SMDS_MeshVolume* volume;
- if (hasConstructionFaces()) {
- MESSAGE("Error : Not implemented");
- return NULL;
- } else if (hasConstructionEdges()) {
- MESSAGE("Error : Not implemented");
- return NULL;
- } else {
- volume = new SMDS_PolyhedralVolumeOfNodes(nodes, quantities);
- myVolumes.Add(volume);
- }
-
- if (!registerElement(ID, volume)) {
- RemoveElement(volume, false);
- volume = NULL;
- }
- return volume;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-/// Create a new polyhedral volume and add it to the mesh.
-/// @return The created volume
-///////////////////////////////////////////////////////////////////////////////
-
-SMDS_MeshVolume* SMDS_Mesh::AddPolyhedralVolume
- (std::vector<const SMDS_MeshNode*> nodes,
- std::vector<int> quantities)
-{
- int ID = myElementIDFactory->GetFreeID();
- SMDS_MeshVolume * v = SMDS_Mesh::AddPolyhedralVolumeWithID(nodes, quantities, ID);
- if (v == NULL) myElementIDFactory->ReleaseID(ID);
- return v;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-/// Registers element with the given ID, maintains inverse connections
-///////////////////////////////////////////////////////////////////////////////
-bool SMDS_Mesh::registerElement(int ID, SMDS_MeshElement * element)
-{
- if (myElementIDFactory->BindID(ID, element)) {
- SMDS_ElemIteratorPtr it = element->nodesIterator();
- while (it->more()) {
- SMDS_MeshNode *node = static_cast<SMDS_MeshNode*>
- (const_cast<SMDS_MeshElement*>(it->next()));
- node->AddInverseElement(element);
- }
- return true;
- }
- return false;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-/// Return the node whose ID is 'ID'.
-///////////////////////////////////////////////////////////////////////////////
-const SMDS_MeshNode * SMDS_Mesh::FindNode(int ID) const
-{
- return (const SMDS_MeshNode *)myNodeIDFactory->MeshElement(ID);
-}
-
-///////////////////////////////////////////////////////////////////////////////
-///Create a triangle and add it to the current mesh. This methode do not bind a
-///ID to the create triangle.
-///////////////////////////////////////////////////////////////////////////////
-SMDS_MeshFace * SMDS_Mesh::createTriangle(const SMDS_MeshNode * node1,
- const SMDS_MeshNode * node2,
- const SMDS_MeshNode * node3)
-{
- if(hasConstructionEdges())
- {
- SMDS_MeshEdge *edge1, *edge2, *edge3;
- edge1=FindEdgeOrCreate(node1,node2);
- edge2=FindEdgeOrCreate(node2,node3);
- edge3=FindEdgeOrCreate(node3,node1);
-
- SMDS_MeshFace * face = new SMDS_FaceOfEdges(edge1,edge2,edge3);
- myFaces.Add(face);
- return face;
- }
- else
- {
- SMDS_MeshFace * face = new SMDS_FaceOfNodes(node1,node2,node3);
- myFaces.Add(face);
- return face;
- }
-}
-
-///////////////////////////////////////////////////////////////////////////////
-///Create a quadrangle and add it to the current mesh. This methode do not bind
-///a ID to the create triangle.
-///////////////////////////////////////////////////////////////////////////////
-SMDS_MeshFace * SMDS_Mesh::createQuadrangle(const SMDS_MeshNode * node1,
- const SMDS_MeshNode * node2,
- const SMDS_MeshNode * node3,
- const SMDS_MeshNode * node4)
-{
- if(hasConstructionEdges())
- {
- SMDS_MeshEdge *edge1, *edge2, *edge3, *edge4;
- edge1=FindEdgeOrCreate(node1,node2);
- edge2=FindEdgeOrCreate(node2,node3);
- edge3=FindEdgeOrCreate(node3,node4);
- edge4=FindEdgeOrCreate(node4,node1);
-
- SMDS_MeshFace * face = new SMDS_FaceOfEdges(edge1,edge2,edge3,edge4);
- myFaces.Add(face);
- return face;
- }
- else
- {
- SMDS_MeshFace * face = new SMDS_FaceOfNodes(node1,node2,node3,node4);
- myFaces.Add(face);
- return face;
- }
-}
-
-///////////////////////////////////////////////////////////////////////////////
-/// Remove a node and all the elements which own this node
-///////////////////////////////////////////////////////////////////////////////
-
-void SMDS_Mesh::RemoveNode(const SMDS_MeshNode * node)
-{
- RemoveElement(node, true);
-}
-
-///////////////////////////////////////////////////////////////////////////////
-/// Remove an edge and all the elements which own this edge
-///////////////////////////////////////////////////////////////////////////////
-
-void SMDS_Mesh::RemoveEdge(const SMDS_MeshEdge * edge)
-{
- RemoveElement(edge,true);
-}
-
-///////////////////////////////////////////////////////////////////////////////
-/// Remove an face and all the elements which own this face
-///////////////////////////////////////////////////////////////////////////////
-
-void SMDS_Mesh::RemoveFace(const SMDS_MeshFace * face)
-{
- RemoveElement(face, true);
-}
-
-///////////////////////////////////////////////////////////////////////////////
-/// Remove a volume
-///////////////////////////////////////////////////////////////////////////////
-
-void SMDS_Mesh::RemoveVolume(const SMDS_MeshVolume * volume)
-{
- RemoveElement(volume, true);
-}
-
-//=======================================================================
-//function : RemoveFromParent
-//purpose :
-//=======================================================================
-
-bool SMDS_Mesh::RemoveFromParent()
-{
- if (myParent==NULL) return false;
- else return (myParent->RemoveSubMesh(this));
-}
-
-//=======================================================================
-//function : RemoveSubMesh
-//purpose :
-//=======================================================================
-
-bool SMDS_Mesh::RemoveSubMesh(const SMDS_Mesh * aMesh)
-{
- bool found = false;
-
- list<SMDS_Mesh *>::iterator itmsh=myChildren.begin();
- for (; itmsh!=myChildren.end() && !found; itmsh++)
- {
- SMDS_Mesh * submesh = *itmsh;
- if (submesh == aMesh)
- {
- found = true;
- myChildren.erase(itmsh);
- }
- }
-
- return found;
-}
-
-//=======================================================================
-//function : ChangeElementNodes
-//purpose :
-//=======================================================================
-
-bool SMDS_Mesh::ChangeElementNodes(const SMDS_MeshElement * elem,
- const SMDS_MeshNode * nodes[],
- const int nbnodes)
-{
- // keep current nodes of elem
- set<const SMDS_MeshElement*> oldNodes;
- SMDS_ElemIteratorPtr itn = elem->nodesIterator();
- while(itn->more())
- oldNodes.insert( itn->next() );
-
- // change nodes
- bool Ok = false;
- switch ( elem->GetType() )
- {
- case SMDSAbs_Edge: {
- if ( nbnodes == 2 ) {
- const SMDS_MeshEdge* edge = dynamic_cast<const SMDS_MeshEdge*>( elem );
- if ( edge )
- Ok = const_cast<SMDS_MeshEdge*>( edge )->ChangeNodes( nodes[0], nodes[1] );
- }
- break;
- }
- case SMDSAbs_Face: {
- const SMDS_FaceOfNodes* face = dynamic_cast<const SMDS_FaceOfNodes*>( elem );
- if ( face ) {
- Ok = const_cast<SMDS_FaceOfNodes*>( face )->ChangeNodes( nodes, nbnodes );
- } else {
- /// ??? begin
- const SMDS_PolygonalFaceOfNodes* face = dynamic_cast<const SMDS_PolygonalFaceOfNodes*>(elem);
- if (face) {
- Ok = const_cast<SMDS_PolygonalFaceOfNodes*>(face)->ChangeNodes(nodes, nbnodes);
- }
- /// ??? end
- }
- break;
- }
- //case SMDSAbs_PolygonalFace: {
- // const SMDS_PolygonalFaceOfNodes* face = dynamic_cast<const SMDS_PolygonalFaceOfNodes*>(elem);
- // if (face) {
- // Ok = const_cast<SMDS_PolygonalFaceOfNodes*>(face)->ChangeNodes(nodes, nbnodes);
- // }
- // break;
- //}
- case SMDSAbs_Volume: {
- const SMDS_VolumeOfNodes* vol = dynamic_cast<const SMDS_VolumeOfNodes*>( elem );
- if ( vol )
- Ok = const_cast<SMDS_VolumeOfNodes*>( vol )->ChangeNodes( nodes, nbnodes );
- break;
- }
- default:
- MESSAGE ( "WRONG ELEM TYPE");
- }
-
- if ( Ok ) { // update InverseElements
-
- // AddInverseElement to new nodes
- for ( int i = 0; i < nbnodes; i++ )
- if ( oldNodes.find( nodes[i] ) == oldNodes.end() )
- // new node
- const_cast<SMDS_MeshNode*>( nodes[i] )->AddInverseElement( elem );
- else
- // remove from oldNodes a node that remains in elem
- oldNodes.erase( nodes[i] );
-
-
- // RemoveInverseElement from the nodes removed from elem
- set<const SMDS_MeshElement*>::iterator it;
- for ( it = oldNodes.begin(); it != oldNodes.end(); it++ )
- {
- SMDS_MeshNode * n = static_cast<SMDS_MeshNode *>
- (const_cast<SMDS_MeshElement *>( *it ));
- n->RemoveInverseElement( elem );
- }
- }
-
- //MESSAGE ( "::ChangeNodes() Ok = " << Ok);
-
- return Ok;
-}
-
-//=======================================================================
-//function : ChangePolyhedronNodes
-//purpose : to change nodes of polyhedral volume
-//=======================================================================
-bool SMDS_Mesh::ChangePolyhedronNodes (const SMDS_MeshElement * elem,
- std::vector<const SMDS_MeshNode*> nodes,
- std::vector<int> quantities)
-{
- if (elem->GetType() != SMDSAbs_Volume) {
- MESSAGE("WRONG ELEM TYPE");
- return false;
- }
-
- const SMDS_PolyhedralVolumeOfNodes* vol = dynamic_cast<const SMDS_PolyhedralVolumeOfNodes*>(elem);
- if (!vol) {
- return false;
- }
-
- // keep current nodes of elem
- set<const SMDS_MeshElement*> oldNodes;
- SMDS_ElemIteratorPtr itn = elem->nodesIterator();
- while (itn->more()) {
- oldNodes.insert(itn->next());
- }
-
- // change nodes
- bool Ok = const_cast<SMDS_PolyhedralVolumeOfNodes*>(vol)->ChangeNodes(nodes, quantities);
- if (!Ok) {
- return false;
- }
-
- // update InverseElements
-
- // AddInverseElement to new nodes
- int nbnodes = nodes.size();
- for (int i = 0; i < nbnodes; i++) {
- if (oldNodes.find(nodes[i]) == oldNodes.end()) {
- // new node
- const_cast<SMDS_MeshNode*>(nodes[i])->AddInverseElement(elem);
- } else {
- // remove from oldNodes a node that remains in elem
- oldNodes.erase(nodes[i]);
- }
- }
-
- // RemoveInverseElement from the nodes removed from elem
- set<const SMDS_MeshElement*>::iterator it;
- for (it = oldNodes.begin(); it != oldNodes.end(); it++) {
- SMDS_MeshNode * n = static_cast<SMDS_MeshNode *>
- (const_cast<SMDS_MeshElement *>( *it ));
- n->RemoveInverseElement(elem);
- }
-
- return Ok;
-}
-
-//=======================================================================
-//function : FindEdge
-//purpose :
-//=======================================================================
-
-const SMDS_MeshEdge* SMDS_Mesh::FindEdge(int idnode1, int idnode2) const
-{
- const SMDS_MeshNode * node1=FindNode(idnode1);
- const SMDS_MeshNode * node2=FindNode(idnode2);
- if((node1==NULL)||(node2==NULL)) return NULL;
- return FindEdge(node1,node2);
-}
-
-//#include "Profiler.h"
-const SMDS_MeshEdge* SMDS_Mesh::FindEdge(const SMDS_MeshNode * node1,
- const SMDS_MeshNode * node2)
-{
- const SMDS_MeshEdge * toReturn=NULL;
- //PROFILER_Init();
- //PROFILER_Set();
- SMDS_ElemIteratorPtr it1=node1->edgesIterator();
- //PROFILER_Get(0);
- //PROFILER_Set();
- while(it1->more())
- {
- const SMDS_MeshEdge * e=static_cast<const SMDS_MeshEdge *>
- (it1->next());
- SMDS_ElemIteratorPtr it2=e->nodesIterator();
- while(it2->more())
- {
- if(it2->next()->GetID()==node2->GetID())
- {
- toReturn=e;
- break;
- }
- }
- }
- //PROFILER_Get(1);
- return toReturn;
-}
-
-
-SMDS_MeshEdge* SMDS_Mesh::FindEdgeOrCreate(const SMDS_MeshNode * node1,
- const SMDS_MeshNode * node2)
-{
- SMDS_MeshEdge * toReturn=NULL;
- toReturn=const_cast<SMDS_MeshEdge*>(FindEdge(node1,node2));
- if(toReturn==NULL)
- {
- toReturn=new SMDS_MeshEdge(node1,node2);
- myEdges.Add(toReturn);
- }
- return toReturn;
-}
-
-//=======================================================================
-//function : FindFace
-//purpose :
-//=======================================================================
-
-const SMDS_MeshFace* SMDS_Mesh::FindFace(int idnode1, int idnode2,
- int idnode3) const
-{
- const SMDS_MeshNode * node1=FindNode(idnode1);
- const SMDS_MeshNode * node2=FindNode(idnode2);
- const SMDS_MeshNode * node3=FindNode(idnode3);
- if((node1==NULL)||(node2==NULL)||(node3==NULL)) return NULL;
- return FindFace(node1, node2, node3);
-}
-
-const SMDS_MeshFace* SMDS_Mesh::FindFace(
- const SMDS_MeshNode *node1,
- const SMDS_MeshNode *node2,
- const SMDS_MeshNode *node3)
-{
- const SMDS_MeshFace * face;
- const SMDS_MeshElement * node;
- bool node2found, node3found;
-
- SMDS_ElemIteratorPtr it1=node1->facesIterator();
- while(it1->more())
- {
- face=static_cast<const SMDS_MeshFace*>(it1->next());
- if(face->NbNodes()!=3) continue;
- SMDS_ElemIteratorPtr it2=face->nodesIterator();
- node2found=false;
- node3found=false;
- while(it2->more())
- {
- node=it2->next();
- if(node->GetID()==node2->GetID()) node2found=true;
- if(node->GetID()==node3->GetID()) node3found=true;
- }
- if(node2found&&node3found)
- return face;
- }
- return NULL;
-}
-
-SMDS_MeshFace* SMDS_Mesh::FindFaceOrCreate(
- const SMDS_MeshNode *node1,
- const SMDS_MeshNode *node2,
- const SMDS_MeshNode *node3)
-{
- SMDS_MeshFace * toReturn=NULL;
- toReturn=const_cast<SMDS_MeshFace*>(FindFace(node1,node2,node3));
- if(toReturn==NULL)
- {
- toReturn=createTriangle(node1,node2,node3);
- }
- return toReturn;
-}
-
-//=======================================================================
-//function : FindFace
-//purpose :
-//=======================================================================
-
-const SMDS_MeshFace* SMDS_Mesh::FindFace(int idnode1, int idnode2, int idnode3,
- int idnode4) const
-{
- const SMDS_MeshNode * node1=FindNode(idnode1);
- const SMDS_MeshNode * node2=FindNode(idnode2);
- const SMDS_MeshNode * node3=FindNode(idnode3);
- const SMDS_MeshNode * node4=FindNode(idnode4);
- if((node1==NULL)||(node2==NULL)||(node3==NULL)||(node4==NULL)) return NULL;
- return FindFace(node1, node2, node3, node4);
-}
-
-const SMDS_MeshFace* SMDS_Mesh::FindFace(
- const SMDS_MeshNode *node1,
- const SMDS_MeshNode *node2,
- const SMDS_MeshNode *node3,
- const SMDS_MeshNode *node4)
-{
- const SMDS_MeshFace * face;
- const SMDS_MeshElement * node;
- bool node2found, node3found, node4found;
- SMDS_ElemIteratorPtr it1=node1->facesIterator();
- while(it1->more())
- {
- face=static_cast<const SMDS_MeshFace *>(it1->next());
- if(face->NbNodes()!=4) continue;
- SMDS_ElemIteratorPtr it2=face->nodesIterator();
- node2found=false;
- node3found=false;
- node4found=false;
- while(it2->more())
- {
- node=it2->next();
- if(node->GetID()==node2->GetID()) node2found=true;
- if(node->GetID()==node3->GetID()) node3found=true;
- if(node->GetID()==node4->GetID()) node4found=true;
- }
- if(node2found&&node3found&&node4found)
- return face;
- }
- return NULL;
-}
-
-SMDS_MeshFace* SMDS_Mesh::FindFaceOrCreate(
- const SMDS_MeshNode *node1,
- const SMDS_MeshNode *node2,
- const SMDS_MeshNode *node3,
- const SMDS_MeshNode *node4)
-{
- SMDS_MeshFace * toReturn=NULL;
- toReturn=const_cast<SMDS_MeshFace*>(FindFace(node1,node2,node3,node4));
- if(toReturn==NULL)
- {
- toReturn=createQuadrangle(node1,node2,node3,node4);
- }
- return toReturn;
-}
-
-//=======================================================================
-//function : FindElement
-//purpose :
-//=======================================================================
-
-const SMDS_MeshElement* SMDS_Mesh::FindElement(int IDelem) const
-{
- return myElementIDFactory->MeshElement(IDelem);
-}
-
-//=======================================================================
-//function : FindFace
-//purpose : find polygon
-//=======================================================================
-
-const SMDS_MeshFace* SMDS_Mesh::FindFace (std::vector<int> nodes_ids) const
-{
- int nbnodes = nodes_ids.size();
- std::vector<const SMDS_MeshNode *> poly_nodes (nbnodes);
- for (int inode = 0; inode < nbnodes; inode++) {
- const SMDS_MeshNode * node = FindNode(nodes_ids[inode]);
- if (node == NULL) return NULL;
- }
- return FindFace(poly_nodes);
-}
-
-const SMDS_MeshFace* SMDS_Mesh::FindFace (std::vector<const SMDS_MeshNode *> nodes)
-{
- int nbNodes = nodes.size();
- if (nbNodes < 1) return NULL;
-
- bool isFound = true;
- const SMDS_MeshFace * face;
- set<const SMDS_MeshFace *> faces;
-
- for (int inode = 0; inode < nbNodes && isFound; inode++) {
- set<const SMDS_MeshFace *> new_faces;
-
- SMDS_ElemIteratorPtr itF = nodes[inode]->facesIterator();
- while (itF->more()) {
- face = static_cast<const SMDS_MeshFace *>(itF->next());
- if (face->NbNodes() == nbNodes) {
- if (inode == 0 || faces.find(face) != faces.end()) {
- new_faces.insert(face);
- }
- }
- }
- faces = new_faces;
- if (new_faces.size() == 0) {
- isFound = false;
- }
- }
-
- if (isFound)
- return face;
-
- return NULL;
-}
-
-//=======================================================================
-//function : DumpNodes
-//purpose :
-//=======================================================================
-
-void SMDS_Mesh::DumpNodes() const
-{
- MESSAGE("dump nodes of mesh : ");
- SMDS_NodeIteratorPtr itnode=nodesIterator();
- while(itnode->more()) MESSAGE(itnode->next());
-}
-
-//=======================================================================
-//function : DumpEdges
-//purpose :
-//=======================================================================
-
-void SMDS_Mesh::DumpEdges() const
-{
- MESSAGE("dump edges of mesh : ");
- SMDS_EdgeIteratorPtr itedge=edgesIterator();
- while(itedge->more()) MESSAGE(itedge->next());
-}
-
-//=======================================================================
-//function : DumpFaces
-//purpose :
-//=======================================================================
-
-void SMDS_Mesh::DumpFaces() const
-{
- MESSAGE("dump faces of mesh : ");
- SMDS_FaceIteratorPtr itface=facesIterator();
- while(itface->more()) MESSAGE(itface->next());
-}
-
-//=======================================================================
-//function : DumpVolumes
-//purpose :
-//=======================================================================
-
-void SMDS_Mesh::DumpVolumes() const
-{
- MESSAGE("dump volumes of mesh : ");
- SMDS_VolumeIteratorPtr itvol=volumesIterator();
- while(itvol->more()) MESSAGE(itvol->next());
-}
-
-//=======================================================================
-//function : DebugStats
-//purpose :
-//=======================================================================
-
-void SMDS_Mesh::DebugStats() const
-{
- MESSAGE("Debug stats of mesh : ");
-
- MESSAGE("===== NODES ====="<<NbNodes());
- MESSAGE("===== EDGES ====="<<NbEdges());
- MESSAGE("===== FACES ====="<<NbFaces());
- MESSAGE("===== VOLUMES ====="<<NbVolumes());
-
- MESSAGE("End Debug stats of mesh ");
-
- //#ifdef DEB
-
- SMDS_NodeIteratorPtr itnode=nodesIterator();
- int sizeofnodes = 0;
- int sizeoffaces = 0;
-
- while(itnode->more())
- {
- const SMDS_MeshNode *node = itnode->next();
-
- sizeofnodes += sizeof(*node);
-
- SMDS_ElemIteratorPtr it = node->GetInverseElementIterator();
- while(it->more())
- {
- const SMDS_MeshElement *me = it->next();
- sizeofnodes += sizeof(me);
- }
-
- }
-
- SMDS_FaceIteratorPtr itface=facesIterator();
- while(itface->more())
- {
- const SMDS_MeshElement *face = itface->next();
- sizeoffaces += sizeof(*face);
-
- }
- MESSAGE("total size of node elements = " << sizeofnodes);;
- MESSAGE("total size of face elements = " << sizeoffaces);;
-
- //#endif
-}
-
-///////////////////////////////////////////////////////////////////////////////
-/// Return the number of nodes
-///////////////////////////////////////////////////////////////////////////////
-int SMDS_Mesh::NbNodes() const
-{
- return myNodes.Size();
-}
-
-///////////////////////////////////////////////////////////////////////////////
-/// Return the number of edges (including construction edges)
-///////////////////////////////////////////////////////////////////////////////
-int SMDS_Mesh::NbEdges() const
-{
- return myEdges.Size();
-}
-
-///////////////////////////////////////////////////////////////////////////////
-/// Return the number of faces (including construction faces)
-///////////////////////////////////////////////////////////////////////////////
-int SMDS_Mesh::NbFaces() const
-{
- return myFaces.Size();
-}
-
-///////////////////////////////////////////////////////////////////////////////
-/// Return the number of volumes
-///////////////////////////////////////////////////////////////////////////////
-int SMDS_Mesh::NbVolumes() const
-{
- return myVolumes.Size();
-}
-
-///////////////////////////////////////////////////////////////////////////////
-/// Return the number of child mesh of this mesh.
-/// Note that the tree structure of SMDS_Mesh seems to be unused in this version
-/// (2003-09-08) of SMESH
-///////////////////////////////////////////////////////////////////////////////
-int SMDS_Mesh::NbSubMesh() const
-{
- return myChildren.size();
-}
-
-///////////////////////////////////////////////////////////////////////////////
-/// Destroy the mesh and all its elements
-/// All pointer on elements owned by this mesh become illegals.
-///////////////////////////////////////////////////////////////////////////////
-SMDS_Mesh::~SMDS_Mesh()
-{
- list<SMDS_Mesh*>::iterator itc=myChildren.begin();
- while(itc!=myChildren.end())
- {
- delete *itc;
- itc++;
- }
-
- SetOfNodes::Iterator itn(myNodes);
- for (; itn.More(); itn.Next())
- delete itn.Value();
-
- SetOfEdges::Iterator ite(myEdges);
- for (; ite.More(); ite.Next())
- {
- SMDS_MeshElement* elem = ite.Value();
- if(myParent!=NULL)
- myElementIDFactory->ReleaseID(elem->GetID());
- delete elem;
- }
-
- SetOfFaces::Iterator itf(myFaces);
- for (; itf.More(); itf.Next())
- {
- SMDS_MeshElement* elem = itf.Value();
- if(myParent!=NULL)
- myElementIDFactory->ReleaseID(elem->GetID());
- delete elem;
- }
-
- SetOfVolumes::Iterator itv(myVolumes);
- for (; itv.More(); itv.Next())
- {
- SMDS_MeshElement* elem = itv.Value();
- if(myParent!=NULL)
- myElementIDFactory->ReleaseID(elem->GetID());
- delete elem;
- }
-
- if(myParent==NULL)
- {
- delete myNodeIDFactory;
- delete myElementIDFactory;
- }
-}
-
-///////////////////////////////////////////////////////////////////////////////
-/// Return true if this mesh create faces with edges.
-/// A false returned value mean that faces are created with nodes. A concequence
-/// is, iteration on edges (SMDS_Element::edgesIterator) will be unavailable.
-///////////////////////////////////////////////////////////////////////////////
-bool SMDS_Mesh::hasConstructionEdges()
-{
- return myHasConstructionEdges;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-/// Return true if this mesh create volumes with faces
-/// A false returned value mean that volumes are created with nodes or edges.
-/// (see hasConstructionEdges)
-/// A concequence is, iteration on faces (SMDS_Element::facesIterator) will be
-/// unavailable.
-///////////////////////////////////////////////////////////////////////////////
-bool SMDS_Mesh::hasConstructionFaces()
-{
- return myHasConstructionFaces;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-/// Return true if nodes are linked to the finit elements, they are belonging to.
-/// Currently, It always return true.
-///////////////////////////////////////////////////////////////////////////////
-bool SMDS_Mesh::hasInverseElements()
-{
- return myHasInverseElements;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-/// Make this mesh creating construction edges (see hasConstructionEdges)
-/// @param b true to have construction edges, else false.
-///////////////////////////////////////////////////////////////////////////////
-void SMDS_Mesh::setConstructionEdges(bool b)
-{
- myHasConstructionEdges=b;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-/// Make this mesh creating construction faces (see hasConstructionFaces)
-/// @param b true to have construction faces, else false.
-///////////////////////////////////////////////////////////////////////////////
-void SMDS_Mesh::setConstructionFaces(bool b)
-{
- myHasConstructionFaces=b;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-/// Make this mesh creating link from nodes to elements (see hasInverseElements)
-/// @param b true to link nodes to elements, else false.
-///////////////////////////////////////////////////////////////////////////////
-void SMDS_Mesh::setInverseElements(bool b)
-{
- if(!b) MESSAGE("Error : inverseElement=false not implemented");
- myHasInverseElements=b;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-/// Return an iterator on nodes of the current mesh factory
-///////////////////////////////////////////////////////////////////////////////
-class SMDS_Mesh_MyNodeIterator:public SMDS_NodeIterator
-{
- SMDS_ElemIteratorPtr myIterator;
- public:
- SMDS_Mesh_MyNodeIterator(const SMDS_ElemIteratorPtr& it):myIterator(it)
- {}
-
- bool more()
- {
- return myIterator->more();
- }
-
- const SMDS_MeshNode* next()
- {
- return static_cast<const SMDS_MeshNode*>(myIterator->next());
- }
-};
-
-SMDS_NodeIteratorPtr SMDS_Mesh::nodesIterator() const
-{
- return SMDS_NodeIteratorPtr
- (new SMDS_Mesh_MyNodeIterator(myNodeIDFactory->elementsIterator()));
-}
-
-///////////////////////////////////////////////////////////////////////////////
-/// Return an iterator on elements of the current mesh factory
-///////////////////////////////////////////////////////////////////////////////
-SMDS_ElemIteratorPtr SMDS_Mesh::elementsIterator() const
-{
- return myElementIDFactory->elementsIterator();
-}
-
-///////////////////////////////////////////////////////////////////////////////
-///Return an iterator on edges of the current mesh.
-///////////////////////////////////////////////////////////////////////////////
-class SMDS_Mesh_MyEdgeIterator:public SMDS_EdgeIterator
-{
- typedef SMDS_Mesh::SetOfEdges SetOfEdges;
- SetOfEdges::Iterator myIterator;
- public:
- SMDS_Mesh_MyEdgeIterator(const SetOfEdges& s):myIterator(s)
- {}
-
- bool more()
- {
- while(myIterator.More())
- {
- if(myIterator.Value()->GetID()!=-1)
- return true;
- myIterator.Next();
- }
- return false;
- }
-
- const SMDS_MeshEdge* next()
- {
- const SMDS_MeshEdge* current = myIterator.Value();
- myIterator.Next();
- return current;
- }
-};
-
-SMDS_EdgeIteratorPtr SMDS_Mesh::edgesIterator() const
-{
- return SMDS_EdgeIteratorPtr(new SMDS_Mesh_MyEdgeIterator(myEdges));
-}
-
-///////////////////////////////////////////////////////////////////////////////
-///Return an iterator on faces of the current mesh.
-///////////////////////////////////////////////////////////////////////////////
-class SMDS_Mesh_MyFaceIterator:public SMDS_FaceIterator
-{
- typedef SMDS_Mesh::SetOfFaces SetOfFaces;
- SetOfFaces::Iterator myIterator;
- public:
- SMDS_Mesh_MyFaceIterator(const SetOfFaces& s):myIterator(s)
- {}
-
- bool more()
- {
- while(myIterator.More())
- {
- if(myIterator.Value()->GetID()!=-1)
- return true;
- myIterator.Next();
- }
- return false;
- }
-
- const SMDS_MeshFace* next()
- {
- const SMDS_MeshFace* current = myIterator.Value();
- myIterator.Next();
- return current;
- }
-};
-
-SMDS_FaceIteratorPtr SMDS_Mesh::facesIterator() const
-{
- return SMDS_FaceIteratorPtr(new SMDS_Mesh_MyFaceIterator(myFaces));
-}
-
-///////////////////////////////////////////////////////////////////////////////
-///Return an iterator on volumes of the current mesh.
-///////////////////////////////////////////////////////////////////////////////
-class SMDS_Mesh_MyVolumeIterator:public SMDS_VolumeIterator
-{
- typedef SMDS_Mesh::SetOfVolumes SetOfVolumes;
- SetOfVolumes::Iterator myIterator;
- public:
- SMDS_Mesh_MyVolumeIterator(const SetOfVolumes& s):myIterator(s)
- {}
-
- bool more()
- {
- return myIterator.More() != Standard_False;
- }
-
- const SMDS_MeshVolume* next()
- {
- const SMDS_MeshVolume* current = myIterator.Value();
- myIterator.Next();
- return current;
- }
-};
-
-SMDS_VolumeIteratorPtr SMDS_Mesh::volumesIterator() const
-{
- return SMDS_VolumeIteratorPtr(new SMDS_Mesh_MyVolumeIterator(myVolumes));
-}
-
-///////////////////////////////////////////////////////////////////////////////
-/// Do intersection of sets (more than 2)
-///////////////////////////////////////////////////////////////////////////////
-static set<const SMDS_MeshElement*> * intersectionOfSets(
- set<const SMDS_MeshElement*> vs[], int numberOfSets)
-{
- set<const SMDS_MeshElement*>* rsetA=new set<const SMDS_MeshElement*>(vs[0]);
- set<const SMDS_MeshElement*>* rsetB;
-
- for(int i=0; i<numberOfSets-1; i++)
- {
- rsetB=new set<const SMDS_MeshElement*>();
- set_intersection(
- rsetA->begin(), rsetA->end(),
- vs[i+1].begin(), vs[i+1].end(),
- inserter(*rsetB, rsetB->begin()));
- delete rsetA;
- rsetA=rsetB;
- }
- return rsetA;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-/// Return the list of finit elements owning the given element
-///////////////////////////////////////////////////////////////////////////////
-static set<const SMDS_MeshElement*> * getFinitElements(const SMDS_MeshElement * element)
-{
- int numberOfSets=element->NbNodes();
- set<const SMDS_MeshElement*> *initSet = new set<const SMDS_MeshElement*>[numberOfSets];
-
- SMDS_ElemIteratorPtr itNodes=element->nodesIterator();
-
- int i=0;
- while(itNodes->more())
- {
- const SMDS_MeshNode * n=static_cast<const SMDS_MeshNode*>(itNodes->next());
- SMDS_ElemIteratorPtr itFe = n->GetInverseElementIterator();
-
- //initSet[i]=set<const SMDS_MeshElement*>();
- while(itFe->more())
- initSet[i].insert(itFe->next());
-
- i++;
- }
- set<const SMDS_MeshElement*> *retSet=intersectionOfSets(initSet, numberOfSets);
- delete [] initSet;
- return retSet;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-/// Return the list of nodes used only by the given elements
-///////////////////////////////////////////////////////////////////////////////
-static set<const SMDS_MeshElement*> * getExclusiveNodes(
- set<const SMDS_MeshElement*>& elements)
-{
- set<const SMDS_MeshElement*> * toReturn=new set<const SMDS_MeshElement*>();
- set<const SMDS_MeshElement*>::iterator itElements=elements.begin();
-
- while(itElements!=elements.end())
- {
- SMDS_ElemIteratorPtr itNodes = (*itElements)->nodesIterator();
- itElements++;
-
- while(itNodes->more())
- {
- const SMDS_MeshNode * n=static_cast<const SMDS_MeshNode*>(itNodes->next());
- SMDS_ElemIteratorPtr itFe = n->GetInverseElementIterator();
- set<const SMDS_MeshElement*> s;
- while(itFe->more())
- s.insert(itFe->next());
- if(s==elements) toReturn->insert(n);
- }
- }
- return toReturn;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-///Find the children of an element that are made of given nodes
-///@param setOfChildren The set in which matching children will be inserted
-///@param element The element were to search matching children
-///@param nodes The nodes that the children must have to be selected
-///////////////////////////////////////////////////////////////////////////////
-void SMDS_Mesh::addChildrenWithNodes(set<const SMDS_MeshElement*>& setOfChildren,
- const SMDS_MeshElement * element, set<const SMDS_MeshElement*>& nodes)
-{
-
- switch(element->GetType())
- {
- case SMDSAbs_Node:
- MESSAGE("Internal Error: This should not append");
- break;
- case SMDSAbs_Edge:
- {
- SMDS_ElemIteratorPtr itn=element->nodesIterator();
- while(itn->more())
- {
- const SMDS_MeshElement * e=itn->next();
- if(nodes.find(e)!=nodes.end())
- {
- setOfChildren.insert(element);
- break;
- }
- }
- } break;
- case SMDSAbs_Face:
- {
- SMDS_ElemIteratorPtr itn=element->nodesIterator();
- while(itn->more())
- {
- const SMDS_MeshElement * e=itn->next();
- if(nodes.find(e)!=nodes.end())
- {
- setOfChildren.insert(element);
- break;
- }
- }
- if(hasConstructionEdges())
- {
- SMDS_ElemIteratorPtr ite=element->edgesIterator();
- while(ite->more())
- addChildrenWithNodes(setOfChildren, ite->next(), nodes);
- }
- } break;
- case SMDSAbs_Volume:
- {
- if(hasConstructionFaces())
- {
- SMDS_ElemIteratorPtr ite=element->facesIterator();
- while(ite->more())
- addChildrenWithNodes(setOfChildren, ite->next(), nodes);
- }
- else if(hasConstructionEdges())
- {
- SMDS_ElemIteratorPtr ite=element->edgesIterator();
- while(ite->more())
- addChildrenWithNodes(setOfChildren, ite->next(), nodes);
- }
- }
- }
-}
-
-///////////////////////////////////////////////////////////////////////////////
-///@param elem The element to delete
-///@param removenodes if true remaining nodes will be removed
-///////////////////////////////////////////////////////////////////////////////
-void SMDS_Mesh::RemoveElement(const SMDS_MeshElement * elem,
- const bool removenodes)
-{
- list<const SMDS_MeshElement *> removedElems;
- list<const SMDS_MeshElement *> removedNodes;
- RemoveElement( elem, removedElems, removedNodes, removenodes );
-}
-
-///////////////////////////////////////////////////////////////////////////////
-///@param elem The element to delete
-///@param removedElems contains all removed elements
-///@param removedNodes contains all removed nodes
-///@param removenodes if true remaining nodes will be removed
-///////////////////////////////////////////////////////////////////////////////
-void SMDS_Mesh::RemoveElement(const SMDS_MeshElement * elem,
- list<const SMDS_MeshElement *>& removedElems,
- list<const SMDS_MeshElement *>& removedNodes,
- bool removenodes)
-{
- // get finite elements built on elem
- set<const SMDS_MeshElement*> * s1;
- if (!hasConstructionEdges() && elem->GetType() == SMDSAbs_Edge ||
- !hasConstructionFaces() && elem->GetType() == SMDSAbs_Face ||
- elem->GetType() == SMDSAbs_Volume)
- {
- s1 = new set<const SMDS_MeshElement*>();
- s1->insert(elem);
- }
- else
- s1 = getFinitElements(elem);
-
- // get exclusive nodes (which would become free afterwards)
- set<const SMDS_MeshElement*> * s2;
- if (elem->GetType() == SMDSAbs_Node) // a node is removed
- {
- // do not remove nodes except elem
- s2 = new set<const SMDS_MeshElement*>();
- s2->insert(elem);
- removenodes = true;
- }
- else
- s2 = getExclusiveNodes(*s1);
-
- // form the set of finite and construction elements to remove
- set<const SMDS_MeshElement*> s3;
- set<const SMDS_MeshElement*>::iterator it=s1->begin();
- while(it!=s1->end())
- {
- addChildrenWithNodes(s3, *it ,*s2);
- s3.insert(*it);
- it++;
- }
- if(elem->GetType()!=SMDSAbs_Node) s3.insert(elem);
-
- // remove finite and construction elements
- it=s3.begin();
- while(it!=s3.end())
- {
- // Remove element from <InverseElements> of its nodes
- SMDS_ElemIteratorPtr itn=(*it)->nodesIterator();
- while(itn->more())
- {
- SMDS_MeshNode * n = static_cast<SMDS_MeshNode *>
- (const_cast<SMDS_MeshElement *>(itn->next()));
- n->RemoveInverseElement( (*it) );
- }
-
- switch((*it)->GetType())
- {
- case SMDSAbs_Node:
- MESSAGE("Internal Error: This should not happen");
- break;
- case SMDSAbs_Edge:
- myEdges.Remove(static_cast<SMDS_MeshEdge*>
- (const_cast<SMDS_MeshElement*>(*it)));
- break;
- case SMDSAbs_Face:
- myFaces.Remove(static_cast<SMDS_MeshFace*>
- (const_cast<SMDS_MeshElement*>(*it)));
- break;
- case SMDSAbs_Volume:
- myVolumes.Remove(static_cast<SMDS_MeshVolume*>
- (const_cast<SMDS_MeshElement*>(*it)));
- break;
- }
- //MESSAGE( "SMDS: RM elem " << (*it)->GetID() );
- removedElems.push_back( (*it) );
- myElementIDFactory->ReleaseID((*it)->GetID());
- delete (*it);
- it++;
- }
-
- // remove exclusive (free) nodes
- if(removenodes)
- {
- it=s2->begin();
- while(it!=s2->end())
- {
- //MESSAGE( "SMDS: RM node " << (*it)->GetID() );
- myNodes.Remove(static_cast<SMDS_MeshNode*>
- (const_cast<SMDS_MeshElement*>(*it)));
- myNodeIDFactory->ReleaseID((*it)->GetID());
- removedNodes.push_back( (*it) );
- delete *it;
- it++;
- }
- }
-
- delete s2;
- delete s1;
-}
-
-/*!
- * Checks if the element is present in mesh.
- * Useful to determine dead pointers.
- */
-bool SMDS_Mesh::Contains (const SMDS_MeshElement* elem) const
-{
- // we should not imply on validity of *elem, so iterate on containers
- // of all types in the hope of finding <elem> somewhere there
- SMDS_NodeIteratorPtr itn = nodesIterator();
- while (itn->more())
- if (elem == itn->next())
- return true;
- SMDS_EdgeIteratorPtr ite = edgesIterator();
- while (ite->more())
- if (elem == ite->next())
- return true;
- SMDS_FaceIteratorPtr itf = facesIterator();
- while (itf->more())
- if (elem == itf->next())
- return true;
- SMDS_VolumeIteratorPtr itv = volumesIterator();
- while (itv->more())
- if (elem == itv->next())
- return true;
- return false;
-}
-
-//=======================================================================
-//function : MaxNodeID
-//purpose :
-//=======================================================================
-
-int SMDS_Mesh::MaxNodeID() const
-{
- return myNodeIDFactory->GetMaxID();
-}
-
-//=======================================================================
-//function : MinNodeID
-//purpose :
-//=======================================================================
-
-int SMDS_Mesh::MinNodeID() const
-{
- return myNodeIDFactory->GetMinID();
-}
-
-//=======================================================================
-//function : MaxElementID
-//purpose :
-//=======================================================================
-
-int SMDS_Mesh::MaxElementID() const
-{
- return myElementIDFactory->GetMaxID();
-}
-
-//=======================================================================
-//function : MinElementID
-//purpose :
-//=======================================================================
-
-int SMDS_Mesh::MinElementID() const
-{
- return myElementIDFactory->GetMinID();
-}
-
-//=======================================================================
-//function : Renumber
-//purpose : Renumber all nodes or elements.
-//=======================================================================
-
-void SMDS_Mesh::Renumber (const bool isNodes, const int startID, const int deltaID)
-{
- if ( deltaID == 0 )
- return;
-
- SMDS_MeshElementIDFactory * idFactory =
- isNodes ? myNodeIDFactory : myElementIDFactory;
-
- // get existing elements in the order of ID increasing
- map<int,SMDS_MeshElement*> elemMap;
- SMDS_ElemIteratorPtr idElemIt = idFactory->elementsIterator();
- while ( idElemIt->more() ) {
- SMDS_MeshElement* elem = const_cast<SMDS_MeshElement*>(idElemIt->next());
- int id = elem->GetID();
- elemMap.insert(map<int,SMDS_MeshElement*>::value_type(id, elem));
- }
- // release their ids
- map<int,SMDS_MeshElement*>::iterator elemIt = elemMap.begin();
- for ( ; elemIt != elemMap.end(); elemIt++ )
- {
- int id = (*elemIt).first;
- idFactory->ReleaseID( id );
- }
- // set new IDs
- int ID = startID;
- elemIt = elemMap.begin();
- for ( ; elemIt != elemMap.end(); elemIt++ )
- {
- idFactory->BindID( ID, (*elemIt).second );
- ID += deltaID;
- }
-}
-
-//=======================================================================
-//function : GetElementType
-//purpose : Return type of element or node with id
-//=======================================================================
-
-SMDSAbs_ElementType SMDS_Mesh::GetElementType( const int id, const bool iselem ) const
-{
- SMDS_MeshElement* elem = 0;
- if( iselem )
- elem = myElementIDFactory->MeshElement( id );
- else
- elem = myNodeIDFactory->MeshElement( id );
-
- if( !elem )
- {
- //throw SALOME_Exception(LOCALIZED ("this element isn't exist"));
- return SMDSAbs_All;
- }
- else
- return elem->GetType();
-}
\ No newline at end of file
+++ /dev/null
-// SMESH SMDS : implementaion of Salome mesh data structure
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMDS_Mesh.hxx
-// Module : SMESH
-
-#ifndef _SMDS_Mesh_HeaderFile
-#define _SMDS_Mesh_HeaderFile
-
-#include "SMDS_MeshNode.hxx"
-#include "SMDS_MeshEdge.hxx"
-#include "SMDS_MeshFace.hxx"
-#include "SMDS_MeshVolume.hxx"
-#include "SMDS_MeshElementIDFactory.hxx"
-#include "SMDS_ElemIterator.hxx"
-#include <NCollection_Map.hxx>
-
-//#ifdef WNT
-//#include <SALOME_WNT.hxx>
-//#else
-//#define SALOME_WNT_EXPORT
-//#endif
-#if defined WNT && defined WIN32 && defined SMDS_EXPORTS
-#define SMDS_WNT_EXPORT __declspec( dllexport )
-#else
-#define SMDS_WNT_EXPORT
-#endif
-
-#include <boost/shared_ptr.hpp>
-#include <set>
-#include <list>
-
-typedef SMDS_Iterator<const SMDS_MeshNode *> SMDS_NodeIterator;
-typedef boost::shared_ptr<SMDS_Iterator<const SMDS_MeshNode *> > SMDS_NodeIteratorPtr;
-typedef SMDS_Iterator<const SMDS_MeshEdge *> SMDS_EdgeIterator;
-typedef boost::shared_ptr<SMDS_Iterator<const SMDS_MeshEdge *> > SMDS_EdgeIteratorPtr;
-typedef SMDS_Iterator<const SMDS_MeshFace *> SMDS_FaceIterator;
-typedef boost::shared_ptr<SMDS_Iterator<const SMDS_MeshFace *> > SMDS_FaceIteratorPtr;
-typedef SMDS_Iterator<const SMDS_MeshVolume *> SMDS_VolumeIterator;
-typedef boost::shared_ptr<SMDS_Iterator<const SMDS_MeshVolume *> > SMDS_VolumeIteratorPtr;
-
-class SMDS_WNT_EXPORT SMDS_Mesh:public SMDS_MeshObject{
-public:
-
- SMDS_Mesh();
-
- SMDS_NodeIteratorPtr nodesIterator() const;
- SMDS_EdgeIteratorPtr edgesIterator() const;
- SMDS_FaceIteratorPtr facesIterator() const;
- SMDS_VolumeIteratorPtr volumesIterator() const;
- SMDS_ElemIteratorPtr elementsIterator() const;
-
- SMDSAbs_ElementType GetElementType( const int id, const bool iselem ) const;
-
- SMDS_Mesh *AddSubMesh();
-
- virtual SMDS_MeshNode* AddNodeWithID(double x, double y, double z, int ID);
- virtual SMDS_MeshNode* AddNode(double x, double y, double z);
-
- virtual SMDS_MeshEdge* AddEdgeWithID(int n1, int n2, int ID);
- virtual SMDS_MeshEdge* AddEdgeWithID(const SMDS_MeshNode * n1,
- const SMDS_MeshNode * n2,
- int ID);
- virtual SMDS_MeshEdge* AddEdge(const SMDS_MeshNode * n1,
- const SMDS_MeshNode * n2);
-
- virtual SMDS_MeshFace* AddFaceWithID(int n1, int n2, int n3, int ID);
- virtual SMDS_MeshFace* AddFaceWithID(const SMDS_MeshNode * n1,
- const SMDS_MeshNode * n2,
- const SMDS_MeshNode * n3,
- int ID);
- virtual SMDS_MeshFace* AddFace(const SMDS_MeshNode * n1,
- const SMDS_MeshNode * n2,
- const SMDS_MeshNode * n3);
-
- virtual SMDS_MeshFace* AddFaceWithID(int n1, int n2, int n3, int n4, int ID);
- virtual SMDS_MeshFace* AddFaceWithID(const SMDS_MeshNode * n1,
- const SMDS_MeshNode * n2,
- const SMDS_MeshNode * n3,
- const SMDS_MeshNode * n4,
- int ID);
- virtual SMDS_MeshFace* AddFace(const SMDS_MeshNode * n1,
- const SMDS_MeshNode * n2,
- const SMDS_MeshNode * n3,
- const SMDS_MeshNode * n4);
-
- virtual SMDS_MeshFace* AddFaceWithID(const SMDS_MeshEdge * e1,
- const SMDS_MeshEdge * e2,
- const SMDS_MeshEdge * e3, int ID);
- virtual SMDS_MeshFace* AddFace(const SMDS_MeshEdge * e1,
- const SMDS_MeshEdge * e2,
- const SMDS_MeshEdge * e3);
-
- virtual SMDS_MeshFace* AddFaceWithID(const SMDS_MeshEdge * e1,
- const SMDS_MeshEdge * e2,
- const SMDS_MeshEdge * e3,
- const SMDS_MeshEdge * e4, int ID);
- virtual SMDS_MeshFace* AddFace(const SMDS_MeshEdge * e1,
- const SMDS_MeshEdge * e2,
- const SMDS_MeshEdge * e3,
- const SMDS_MeshEdge * e4);
-
- virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4, int ID);
- virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1,
- const SMDS_MeshNode * n2,
- const SMDS_MeshNode * n3,
- const SMDS_MeshNode * n4,
- int ID);
- virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1,
- const SMDS_MeshNode * n2,
- const SMDS_MeshNode * n3,
- const SMDS_MeshNode * n4);
-
- virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4,
- int n5, int ID);
- virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1,
- const SMDS_MeshNode * n2,
- const SMDS_MeshNode * n3,
- const SMDS_MeshNode * n4,
- const SMDS_MeshNode * n5,
- int ID);
- virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1,
- const SMDS_MeshNode * n2,
- const SMDS_MeshNode * n3,
- const SMDS_MeshNode * n4,
- const SMDS_MeshNode * n5);
-
- virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4,
- int n5, int n6, int ID);
- virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1,
- const SMDS_MeshNode * n2,
- const SMDS_MeshNode * n3,
- const SMDS_MeshNode * n4,
- const SMDS_MeshNode * n5,
- const SMDS_MeshNode * n6,
- int ID);
- virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1,
- const SMDS_MeshNode * n2,
- const SMDS_MeshNode * n3,
- const SMDS_MeshNode * n4,
- const SMDS_MeshNode * n5,
- const SMDS_MeshNode * n6);
-
- virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4,
- int n5, int n6, int n7, int n8, int ID);
- virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1,
- const SMDS_MeshNode * n2,
- const SMDS_MeshNode * n3,
- const SMDS_MeshNode * n4,
- const SMDS_MeshNode * n5,
- const SMDS_MeshNode * n6,
- const SMDS_MeshNode * n7,
- const SMDS_MeshNode * n8,
- int ID);
- virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1,
- const SMDS_MeshNode * n2,
- const SMDS_MeshNode * n3,
- const SMDS_MeshNode * n4,
- const SMDS_MeshNode * n5,
- const SMDS_MeshNode * n6,
- const SMDS_MeshNode * n7,
- const SMDS_MeshNode * n8);
-
- virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshFace * f1,
- const SMDS_MeshFace * f2,
- const SMDS_MeshFace * f3,
- const SMDS_MeshFace * f4, int ID);
- virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshFace * f1,
- const SMDS_MeshFace * f2,
- const SMDS_MeshFace * f3,
- const SMDS_MeshFace * f4);
-
- virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshFace * f1,
- const SMDS_MeshFace * f2,
- const SMDS_MeshFace * f3,
- const SMDS_MeshFace * f4,
- const SMDS_MeshFace * f5, int ID);
- virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshFace * f1,
- const SMDS_MeshFace * f2,
- const SMDS_MeshFace * f3,
- const SMDS_MeshFace * f4,
- const SMDS_MeshFace * f5);
-
- virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshFace * f1,
- const SMDS_MeshFace * f2,
- const SMDS_MeshFace * f3,
- const SMDS_MeshFace * f4,
- const SMDS_MeshFace * f5,
- const SMDS_MeshFace * f6, int ID);
- virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshFace * f1,
- const SMDS_MeshFace * f2,
- const SMDS_MeshFace * f3,
- const SMDS_MeshFace * f4,
- const SMDS_MeshFace * f5,
- const SMDS_MeshFace * f6);
-
- virtual SMDS_MeshFace* AddPolygonalFaceWithID (std::vector<int> nodes_ids,
- const int ID);
-
- virtual SMDS_MeshFace* AddPolygonalFaceWithID (std::vector<const SMDS_MeshNode*> nodes,
- const int ID);
-
- virtual SMDS_MeshFace* AddPolygonalFace (std::vector<const SMDS_MeshNode*> nodes);
-
- virtual SMDS_MeshVolume* AddPolyhedralVolumeWithID
- (std::vector<int> nodes_ids,
- std::vector<int> quantities,
- const int ID);
-
- virtual SMDS_MeshVolume* AddPolyhedralVolumeWithID
- (std::vector<const SMDS_MeshNode*> nodes,
- std::vector<int> quantities,
- const int ID);
-
- virtual SMDS_MeshVolume* AddPolyhedralVolume
- (std::vector<const SMDS_MeshNode*> nodes,
- std::vector<int> quantities);
-
- virtual void RemoveElement(const SMDS_MeshElement * elem,
- std::list<const SMDS_MeshElement *>& removedElems,
- std::list<const SMDS_MeshElement *>& removedNodes,
- const bool removenodes = false);
- virtual void RemoveElement(const SMDS_MeshElement * elem, bool removenodes = false);
- virtual void RemoveNode(const SMDS_MeshNode * node);
- virtual void RemoveEdge(const SMDS_MeshEdge * edge);
- virtual void RemoveFace(const SMDS_MeshFace * face);
- virtual void RemoveVolume(const SMDS_MeshVolume * volume);
-
- virtual bool RemoveFromParent();
- virtual bool RemoveSubMesh(const SMDS_Mesh * aMesh);
-
- static bool ChangeElementNodes(const SMDS_MeshElement * elem,
- const SMDS_MeshNode * nodes[],
- const int nbnodes);
- static bool ChangePolyhedronNodes(const SMDS_MeshElement * elem,
- std::vector<const SMDS_MeshNode*> nodes,
- std::vector<int> quantities);
-
- virtual void Renumber (const bool isNodes, const int startID = 1, const int deltaID = 1);
- // Renumber all nodes or elements.
-
- const SMDS_MeshNode *FindNode(int idnode) const;
- const SMDS_MeshEdge *FindEdge(int idnode1, int idnode2) const;
- const SMDS_MeshFace *FindFace(int idnode1, int idnode2, int idnode3) const;
- const SMDS_MeshFace *FindFace(int idnode1, int idnode2, int idnode3, int idnode4) const;
- const SMDS_MeshElement *FindElement(int IDelem) const;
- static const SMDS_MeshEdge* FindEdge(const SMDS_MeshNode * n1,
- const SMDS_MeshNode * n2);
- static const SMDS_MeshFace* FindFace(const SMDS_MeshNode *n1,
- const SMDS_MeshNode *n2,
- const SMDS_MeshNode *n3);
- static const SMDS_MeshFace* FindFace(const SMDS_MeshNode *n1,
- const SMDS_MeshNode *n2,
- const SMDS_MeshNode *n3,
- const SMDS_MeshNode *n4);
-
- const SMDS_MeshFace *FindFace(std::vector<int> nodes_ids) const;
- static const SMDS_MeshFace* FindFace(std::vector<const SMDS_MeshNode *> nodes);
-
- int MaxNodeID() const;
- int MinNodeID() const;
- int MaxElementID() const;
- int MinElementID() const;
-
-
- int NbNodes() const;
- int NbEdges() const;
- int NbFaces() const;
- int NbVolumes() const;
- int NbSubMesh() const;
- void DumpNodes() const;
- void DumpEdges() const;
- void DumpFaces() const;
- void DumpVolumes() const;
- void DebugStats() const;
- SMDS_Mesh *boundaryFaces();
- SMDS_Mesh *boundaryEdges();
- virtual ~SMDS_Mesh();
- bool hasConstructionEdges();
- bool hasConstructionFaces();
- bool hasInverseElements();
- void setConstructionEdges(bool);
- void setConstructionFaces(bool);
- void setInverseElements(bool);
-
- /*!
- * Checks if the element is present in mesh.
- * Useful to determine dead pointers.
- * Use this function for debug purpose only! Do not check in the code
- * using it even in _DEBUG_ mode
- */
- bool Contains (const SMDS_MeshElement* elem) const;
-
- typedef NCollection_Map<SMDS_MeshNode *> SetOfNodes;
- typedef NCollection_Map<SMDS_MeshEdge *> SetOfEdges;
- typedef NCollection_Map<SMDS_MeshFace *> SetOfFaces;
- typedef NCollection_Map<SMDS_MeshVolume *> SetOfVolumes;
-
-private:
- SMDS_Mesh(SMDS_Mesh * parent);
-
- SMDS_MeshFace * createTriangle(const SMDS_MeshNode * node1,
- const SMDS_MeshNode * node2,
- const SMDS_MeshNode * node3);
- SMDS_MeshFace * createQuadrangle(const SMDS_MeshNode * node1,
- const SMDS_MeshNode * node2,
- const SMDS_MeshNode * node3,
- const SMDS_MeshNode * node4);
- SMDS_MeshEdge* FindEdgeOrCreate(const SMDS_MeshNode * n1,
- const SMDS_MeshNode * n2);
- SMDS_MeshFace* FindFaceOrCreate(const SMDS_MeshNode *n1,
- const SMDS_MeshNode *n2,
- const SMDS_MeshNode *n3);
- SMDS_MeshFace* FindFaceOrCreate(const SMDS_MeshNode *n1,
- const SMDS_MeshNode *n2,
- const SMDS_MeshNode *n3,
- const SMDS_MeshNode *n4);
-
- bool registerElement(int ID, SMDS_MeshElement * element);
-
- void addChildrenWithNodes(std::set<const SMDS_MeshElement*>& setOfChildren,
- const SMDS_MeshElement * element,
- std::set<const SMDS_MeshElement*>& nodes);
-
- // Fields PRIVATE
-
- SetOfNodes myNodes;
- SetOfEdges myEdges;
- SetOfFaces myFaces;
- SetOfVolumes myVolumes;
- SMDS_Mesh *myParent;
- std::list<SMDS_Mesh *> myChildren;
- SMDS_MeshElementIDFactory *myNodeIDFactory;
- SMDS_MeshElementIDFactory *myElementIDFactory;
-
- bool myHasConstructionEdges;
- bool myHasConstructionFaces;
- bool myHasInverseElements;
-};
-
-
-#endif
+++ /dev/null
-// SMESH SMDS : implementaion of Salome mesh data structure
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMDS_MeshEdge.cxx
-// Author : Jean-Michel BOULCOURT
-// Module : SMESH
-
-#ifdef _MSC_VER
-#pragma warning(disable:4786)
-#endif
-
-#include "SMDS_MeshEdge.hxx"
-#include "SMDS_IteratorOfElements.hxx"
-#include "SMDS_MeshNode.hxx"
-
-using namespace std;
-
-//=======================================================================
-//function : SMDS_MeshEdge
-//purpose :
-//=======================================================================
-
-SMDS_MeshEdge::SMDS_MeshEdge(const SMDS_MeshNode * node1,
- const SMDS_MeshNode * node2)
-{
- myNodes[0]=node1;
- myNodes[1]=node2;
-}
-
-//=======================================================================
-//function : Print
-//purpose :
-//=======================================================================
-
-void SMDS_MeshEdge::Print(ostream & OS) const
-{
- OS << "edge <" << GetID() << "> : (" << myNodes[0] << " , " << myNodes[1] <<
- ") " << endl;
-}
-
-int SMDS_MeshEdge::NbNodes() const
-{
- return 2;
-}
-
-int SMDS_MeshEdge::NbEdges() const
-{
- return 1;
-}
-
-SMDSAbs_ElementType SMDS_MeshEdge::GetType() const
-{
- return SMDSAbs_Edge;
-}
-
-class SMDS_MeshEdge_MyNodeIterator:public SMDS_ElemIterator
-{
- const SMDS_MeshNode *const* myNodes;
- int myIndex;
- public:
- SMDS_MeshEdge_MyNodeIterator(const SMDS_MeshNode * const* nodes):
- myNodes(nodes),myIndex(0) {}
-
- bool more()
- {
- return myIndex<2;
- }
-
- const SMDS_MeshElement* next()
- {
- myIndex++;
- return myNodes[myIndex-1];
- }
-};
-
-SMDS_ElemIteratorPtr SMDS_MeshEdge::
- elementsIterator(SMDSAbs_ElementType type) const
-{
- switch(type)
- {
- case SMDSAbs_Edge:
- return SMDS_MeshElement::elementsIterator(SMDSAbs_Edge);
- case SMDSAbs_Node:
- return SMDS_ElemIteratorPtr(new SMDS_MeshEdge_MyNodeIterator(myNodes));
- default:
- return SMDS_ElemIteratorPtr
- (new SMDS_IteratorOfElements
- (this,type, SMDS_ElemIteratorPtr(new SMDS_MeshEdge_MyNodeIterator(myNodes))));
- }
-}
-
-bool operator<(const SMDS_MeshEdge & e1, const SMDS_MeshEdge & e2)
-{
- int id11=e1.myNodes[0]->GetID();
- int id21=e2.myNodes[0]->GetID();
- int id12=e1.myNodes[1]->GetID();
- int id22=e2.myNodes[1]->GetID();
- int tmp;
-
- if(id11>=id12)
- {
- tmp=id11;
- id11=id12;
- id12=tmp;
- }
- if(id21>=id22)
- {
- tmp=id21;
- id21=id22;
- id22=tmp;
- }
-
- if(id11<id21) return true;
- else if(id11==id21) return (id21<id22);
- else return false;
-}
-
-//=======================================================================
-//function : ChangeNodes
-//purpose :
-//=======================================================================
-
-bool SMDS_MeshEdge::ChangeNodes(const SMDS_MeshNode * node1,
- const SMDS_MeshNode * node2)
-{
- myNodes[0]=node1;
- myNodes[1]=node2;
- return true;
-}
-
+++ /dev/null
-// SMESH SMDS : implementaion of Salome mesh data structure
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMDS_MeshEdge.hxx
-// Module : SMESH
-
-#ifndef _SMDS_MeshEdge_HeaderFile
-#define _SMDS_MeshEdge_HeaderFile
-
-#include "SMDS_MeshElement.hxx"
-#include <iostream>
-
-class SMDS_MeshEdge:public SMDS_MeshElement
-{
-
- public:
- SMDS_MeshEdge(const SMDS_MeshNode * node1,
- const SMDS_MeshNode * node2);
- bool ChangeNodes(const SMDS_MeshNode * node1,
- const SMDS_MeshNode * node2);
- void Print(std::ostream & OS) const;
-
- SMDSAbs_ElementType GetType() const;
- int NbNodes() const;
- int NbEdges() const;
- friend bool operator<(const SMDS_MeshEdge& e1, const SMDS_MeshEdge& e2);
- protected:
- SMDS_ElemIteratorPtr
- elementsIterator(SMDSAbs_ElementType type) const;
-
- private:
- const SMDS_MeshNode* myNodes[2];
-
-};
-#endif
+++ /dev/null
-// SMESH SMDS : implementaion of Salome mesh data structure
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-#ifdef _MSC_VER
-#pragma warning(disable:4786)
-#endif
-
-#include "SMDS_MeshElement.hxx"
-#include "SMDS_MeshNode.hxx"
-#include "SMDS_MeshEdge.hxx"
-#include "SMDS_MeshFace.hxx"
-#include "SMDS_MeshVolume.hxx"
-#include "utilities.h"
-
-using namespace std;
-
-SMDS_MeshElement::SMDS_MeshElement(int ID):myID(ID)
-{
-}
-
-void SMDS_MeshElement::Print(ostream & OS) const
-{
- OS << "dump of mesh element" << endl;
-}
-
-ostream & operator <<(ostream & OS, const SMDS_MeshElement * ME)
-{
- ME->Print(OS);
- return OS;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-/// Create an iterator which iterate on nodes owned by the element.
-/// This method call elementsIterator().
-///////////////////////////////////////////////////////////////////////////////
-SMDS_ElemIteratorPtr SMDS_MeshElement::nodesIterator() const
-{
- return elementsIterator(SMDSAbs_Node);
-}
-
-///////////////////////////////////////////////////////////////////////////////
-/// Create an iterator which iterate on edges linked with or owned by the element.
-/// This method call elementsIterator().
-///////////////////////////////////////////////////////////////////////////////
-SMDS_ElemIteratorPtr SMDS_MeshElement::edgesIterator() const
-{
- return elementsIterator(SMDSAbs_Edge);
-}
-
-///////////////////////////////////////////////////////////////////////////////
-/// Create an iterator which iterate on faces linked with or owned by the element.
-/// This method call elementsIterator().
-///////////////////////////////////////////////////////////////////////////////
-SMDS_ElemIteratorPtr SMDS_MeshElement::facesIterator() const
-{
- return elementsIterator(SMDSAbs_Face);
-}
-
-///////////////////////////////////////////////////////////////////////////////
-///Return The number of nodes owned by the current element
-///////////////////////////////////////////////////////////////////////////////
-int SMDS_MeshElement::NbNodes() const
-{
- int nbnodes=0;
- SMDS_ElemIteratorPtr it=nodesIterator();
- while(it->more())
- {
- it->next();
- nbnodes++;
- }
- return nbnodes;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-///Return the number of edges owned by or linked with the current element
-///////////////////////////////////////////////////////////////////////////////
-int SMDS_MeshElement::NbEdges() const
-{
- int nbedges=0;
- SMDS_ElemIteratorPtr it=edgesIterator();
- while(it->more())
- {
- it->next();
- nbedges++;
- }
- return nbedges;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-///Return the number of faces owned by or linked with the current element
-///////////////////////////////////////////////////////////////////////////////
-int SMDS_MeshElement::NbFaces() const
-{
- int nbfaces=0;
- SMDS_ElemIteratorPtr it=facesIterator();
- while(it->more())
- {
- it->next();
- nbfaces++;
- }
- return nbfaces;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-///Create an iterator which iterate on elements linked with the current element.
-///@param type The of elements on which you want to iterate
-///@return A smart pointer to iterator, you are not to take care of freeing memory
-///////////////////////////////////////////////////////////////////////////////
-class SMDS_MeshElement_MyIterator:public SMDS_ElemIterator
-{
- const SMDS_MeshElement * myElement;
- bool myMore;
- public:
- SMDS_MeshElement_MyIterator(const SMDS_MeshElement * element):
- myElement(element),myMore(true) {}
-
- bool more()
- {
- return myMore;
- }
-
- const SMDS_MeshElement* next()
- {
- myMore=false;
- return myElement;
- }
-};
-SMDS_ElemIteratorPtr SMDS_MeshElement::
- elementsIterator(SMDSAbs_ElementType type) const
-{
- /** @todo Check that iterator in the child classes return elements
- in the same order for each different implementation (i.e: SMDS_VolumeOfNodes
- and SMDS_VolumeOfFaces */
-
- if(type==GetType())
- return SMDS_ElemIteratorPtr(new SMDS_MeshElement_MyIterator(this));
- else
- {
- MESSAGE("Iterator not implemented");
- return SMDS_ElemIteratorPtr((SMDS_ElemIterator*)NULL);
- }
-}
-
-///////////////////////////////////////////////////////////////////////////////
-///Return the ID of the element
-///////////////////////////////////////////////////////////////////////////////
-int SMDS_MeshElement::GetID() const
-{
- return myID;
-}
-
-bool operator<(const SMDS_MeshElement& e1, const SMDS_MeshElement& e2)
-{
- if(e1.GetType()!=e2.GetType()) return false;
- switch(e1.GetType())
- {
- case SMDSAbs_Node:
- return static_cast<const SMDS_MeshNode &>(e1) <
- static_cast<const SMDS_MeshNode &>(e2);
-
- case SMDSAbs_Edge:
- return static_cast<const SMDS_MeshEdge &>(e1) <
- static_cast<const SMDS_MeshEdge &>(e2);
-
- case SMDSAbs_Face:
- return static_cast<const SMDS_MeshFace &>(e1) <
- static_cast<const SMDS_MeshFace &>(e2);
-
- case SMDSAbs_Volume:
- return static_cast<const SMDS_MeshVolume &>(e1) <
- static_cast<const SMDS_MeshVolume &>(e2);
-
- default : MESSAGE("Internal Error");
- }
- return false;
-}
+++ /dev/null
-// SMESH SMDS : implementaion of Salome mesh data structure
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMDS_MeshElement.hxx
-// Module : SMESH
-
-#ifndef _SMDS_MeshElement_HeaderFile
-#define _SMDS_MeshElement_HeaderFile
-
-#include "SMDSAbs_ElementType.hxx"
-#include "SMDS_MeshObject.hxx"
-#include "SMDS_ElemIterator.hxx"
-#include "SMDS_MeshElementIDFactory.hxx"
-
-//#ifdef WNT
-//#include <SALOME_WNT.hxx>
-//#else
-//#define SALOME_WNT_EXPORT
-//#endif
-
-#if defined WNT && defined WIN32 && defined SMDS_EXPORTS
-#define SMDS_WNT_EXPORT __declspec( dllexport )
-#else
-#define SMDS_WNT_EXPORT
-#endif
-
-#include <vector>
-#include <iostream>
-
-class SMDS_MeshNode;
-class SMDS_MeshEdge;
-class SMDS_MeshFace;
-
-///////////////////////////////////////////////////////////////////////////////
-/// Base class for elements
-///////////////////////////////////////////////////////////////////////////////
-class SMDS_WNT_EXPORT SMDS_MeshElement:public SMDS_MeshObject
-{
-
- public:
- SMDS_ElemIteratorPtr nodesIterator() const;
- SMDS_ElemIteratorPtr edgesIterator() const;
- SMDS_ElemIteratorPtr facesIterator() const;
- virtual SMDS_ElemIteratorPtr
- elementsIterator(SMDSAbs_ElementType type) const;
-
- virtual int NbNodes() const;
- virtual int NbEdges() const;
- virtual int NbFaces() const;
- int GetID() const;
-
- ///Return the type of the current element
- virtual SMDSAbs_ElementType GetType() const = 0;
- virtual bool IsPoly() const { return false; };
-
- friend std::ostream & operator <<(std::ostream & OS, const SMDS_MeshElement *);
- friend bool SMDS_MeshElementIDFactory::BindID(int ID,SMDS_MeshElement*elem);
-
- protected:
- SMDS_MeshElement(int ID=-1);
- virtual void Print(std::ostream & OS) const;
-
- private:
- int myID;
-};
-
-#endif
+++ /dev/null
-// SMESH SMDS : implementaion of Salome mesh data structure
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMDS_MeshElementIDFactory.cxx
-// Author : Jean-Michel BOULCOURT
-// Module : SMESH
-
-#ifdef _MSC_VER
-#pragma warning(disable:4786)
-#endif
-
-#include "SMDS_MeshElementIDFactory.hxx"
-#include "SMDS_MeshElement.hxx"
-
-using namespace std;
-
-//=======================================================================
-//function : SMDS_MeshElementIDFactory
-//purpose :
-//=======================================================================
-SMDS_MeshElementIDFactory::SMDS_MeshElementIDFactory():
- SMDS_MeshIDFactory(),
- myMin(0), myMax(0)
-{
-}
-
-//=======================================================================
-//function : BindID
-//purpose :
-//=======================================================================
-bool SMDS_MeshElementIDFactory::BindID(int ID, SMDS_MeshElement * elem)
-{
- if (myIDElements.IsBound(ID))
- return false;
- myIDElements.Bind(ID,elem);
- elem->myID=ID;
- updateMinMax (ID);
- return true;
-}
-
-//=======================================================================
-//function : MeshElement
-//purpose :
-//=======================================================================
-SMDS_MeshElement* SMDS_MeshElementIDFactory::MeshElement(int ID)
-{
- if (!myIDElements.IsBound(ID))
- return NULL;
- return myIDElements.Find(ID);
-}
-
-
-//=======================================================================
-//function : GetFreeID
-//purpose :
-//=======================================================================
-int SMDS_MeshElementIDFactory::GetFreeID()
-{
- int ID;
- do {
- ID = SMDS_MeshIDFactory::GetFreeID();
- } while (myIDElements.IsBound(ID));
- return ID;
-}
-
-//=======================================================================
-//function : ReleaseID
-//purpose :
-//=======================================================================
-void SMDS_MeshElementIDFactory::ReleaseID(const int ID)
-{
- myIDElements.UnBind(ID);
- SMDS_MeshIDFactory::ReleaseID(ID);
- if (ID == myMax)
- myMax = 0;
- if (ID == myMin)
- myMin = 0;
-}
-
-//=======================================================================
-//function : GetMaxID
-//purpose :
-//=======================================================================
-
-int SMDS_MeshElementIDFactory::GetMaxID() const
-{
- if (myMax == 0)
- updateMinMax();
- return myMax;
-}
-
-//=======================================================================
-//function : GetMinID
-//purpose :
-//=======================================================================
-
-int SMDS_MeshElementIDFactory::GetMinID() const
-{
- if (myMin == 0)
- updateMinMax();
- return myMin;
-}
-
-//=======================================================================
-//function : updateMinMax
-//purpose :
-//=======================================================================
-
-void SMDS_MeshElementIDFactory::updateMinMax() const
-{
- myMin = IntegerLast();
- myMax = 0;
- SMDS_IdElementMap::Iterator it(myIDElements);
- for (; it.More(); it.Next())
- updateMinMax (it.Key());
- if (myMin == IntegerLast())
- myMin = 0;
-}
-
-//=======================================================================
-//function : elementsIterator
-//purpose : Return an iterator on elements of the factory
-//=======================================================================
-
-class SMDS_Fact_MyElemIterator:public SMDS_ElemIterator
-{
- SMDS_IdElementMap::Iterator myIterator;
- public:
- SMDS_Fact_MyElemIterator(const SMDS_IdElementMap& s):myIterator(s)
- {}
-
- bool more()
- {
- return myIterator.More() != Standard_False;
- }
-
- const SMDS_MeshElement* next()
- {
- const SMDS_MeshElement* current = myIterator.Value();
- myIterator.Next();
- return current;
- }
-};
-
-SMDS_ElemIteratorPtr SMDS_MeshElementIDFactory::elementsIterator() const
-{
- return SMDS_ElemIteratorPtr
- (new SMDS_Fact_MyElemIterator(myIDElements));
-}
+++ /dev/null
-// SMESH SMDS : implementaion of Salome mesh data structure
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMDS_MeshElementIDFactory.hxx
-// Module : SMESH
-
-#ifndef _SMDS_MeshElementIDFactory_HeaderFile
-#define _SMDS_MeshElementIDFactory_HeaderFile
-
-#include "SMDS_MeshIDFactory.hxx"
-#include "SMDS_ElemIterator.hxx"
-
-#include <NCollection_DataMap.hxx>
-
-class SMDS_MeshElement;
-
-typedef NCollection_DataMap<int, SMDS_MeshElement *> SMDS_IdElementMap;
-
-class SMDS_MeshElementIDFactory:public SMDS_MeshIDFactory
-{
-public:
- SMDS_MeshElementIDFactory();
- bool BindID(int ID, SMDS_MeshElement * elem);
- SMDS_MeshElement * MeshElement(int ID);
- virtual int GetFreeID();
- virtual void ReleaseID(int ID);
- int GetMaxID() const;
- int GetMinID() const;
- SMDS_ElemIteratorPtr elementsIterator() const;
-private:
- void updateMinMax() const;
- void updateMinMax(int id) const
- {
- if (id > myMax) myMax = id;
- if (id < myMin) myMin = id;
- }
-
- SMDS_IdElementMap myIDElements;
- mutable int myMin, myMax;
-
-};
-
-#endif
+++ /dev/null
-// SMESH SMDS : implementaion of Salome mesh data structure
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-#include "SMDS_MeshFace.hxx"
-
-SMDSAbs_ElementType SMDS_MeshFace::GetType() const
-{
- return SMDSAbs_Face;
-}
+++ /dev/null
-// SMESH SMDS : implementaion of Salome mesh data structure
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMDS_MeshFace.hxx
-// Module : SMESH
-
-#ifndef _SMDS_MeshFace_HeaderFile
-#define _SMDS_MeshFace_HeaderFile
-
-#include "SMDS_MeshElement.hxx"
-
-class SMDS_MeshFace:public SMDS_MeshElement
-{
- public:
- SMDSAbs_ElementType GetType() const;
-};
-
-#endif
+++ /dev/null
-// SMESH SMDS : implementaion of Salome mesh data structure
-//
-// Copyright (C) 2003 OPEN CASCADE
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org or email : webmaster@opencascade.org
-//
-//
-//
-// File : SMDS_MeshGroup.cxx
-// Author : Jean-Michel BOULCOURT
-// Module : SMESH
-
-#ifdef _MSC_VER
-#pragma warning(disable:4786)
-#endif
-
-#include "SMDS_MeshGroup.hxx"
-#include "utilities.h"
-
-using namespace std;
-
-//=======================================================================
-//function : SMDS_MeshGroup
-//purpose :
-//=======================================================================
-
-SMDS_MeshGroup::SMDS_MeshGroup(const SMDS_Mesh * theMesh,
- const SMDSAbs_ElementType theType)
- :myMesh(theMesh),myType(theType), myParent(NULL)
-{
-}
-
-//=======================================================================
-//function : SMDS_MeshGroup
-//purpose :
-//=======================================================================
-
-SMDS_MeshGroup::SMDS_MeshGroup(SMDS_MeshGroup * theParent,
- const SMDSAbs_ElementType theType)
- :myMesh(theParent->myMesh),myType(theType), myParent(theParent)
-{
-}
-
-//=======================================================================
-//function : AddSubGroup
-//purpose :
-//=======================================================================
-
-const SMDS_MeshGroup *SMDS_MeshGroup::AddSubGroup
- (const SMDSAbs_ElementType theType)
-{
- const SMDS_MeshGroup * subgroup = new SMDS_MeshGroup(this,theType);
- myChildren.insert(myChildren.end(),subgroup);
- return subgroup;
-}
-
-//=======================================================================
-//function : RemoveSubGroup
-//purpose :
-//=======================================================================
-
-bool SMDS_MeshGroup::RemoveSubGroup(const SMDS_MeshGroup * theGroup)
-{
- bool found = false;
- list<const SMDS_MeshGroup*>::iterator itgroup;
- for(itgroup=myChildren.begin(); itgroup!=myChildren.end(); itgroup++)
- {
- const SMDS_MeshGroup* subgroup=*itgroup;
- if (subgroup == theGroup)
- {
- found = true;
- myChildren.erase(itgroup);
- }
- }
-
- return found;
-}
-
-//=======================================================================
-//function : RemoveFromParent
-//purpose :
-//=======================================================================
-
-bool SMDS_MeshGroup::RemoveFromParent()
-{
-
- if (myParent==NULL) return false;
- else
- {
- return (myParent->RemoveSubGroup(this));
- }
-}
-//=======================================================================
-//function : Clear
-//purpose :
-//=======================================================================
-
-void SMDS_MeshGroup::Clear()
-{
- myElements.clear();
- myType = SMDSAbs_All;
-}
-
-//=======================================================================
-//function : Add
-//purpose :
-//=======================================================================
-
-void SMDS_MeshGroup::Add(const SMDS_MeshElement * theElem)
-{
- // the type of the group is determined by the first element added
- if (myElements.empty()) myType = theElem->GetType();
- else if (theElem->GetType() != myType)
- MESSAGE("SMDS_MeshGroup::Add : Type Mismatch "<<theElem->GetType()<<"!="<<myType);
-
- myElements.insert(theElem);
-}
-
-//=======================================================================
-//function : Remove
-//purpose :
-//=======================================================================
-
-void SMDS_MeshGroup::Remove(const SMDS_MeshElement * theElem)
-{
- myElements.erase(theElem);
- if (myElements.empty()) myType = SMDSAbs_All;
-}
-
-//=======================================================================
-//function : Contains
-//purpose :
-//=======================================================================
-
-bool SMDS_MeshGroup::Contains(const SMDS_MeshElement * theElem) const
-{
- return myElements.find(theElem)!=myElements.end();
-}
-
-//=======================================================================
-//function : SetType
-//purpose :
-//=======================================================================
-
-void SMDS_MeshGroup::SetType(const SMDSAbs_ElementType theType)
-{
- if (IsEmpty())
- myType = theType;
-}
+++ /dev/null
-// SMESH SMDS : implementaion of Salome mesh data structure
-//
-// Copyright (C) 2003 OPEN CASCADE
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org or email : webmaster@opencascade.org
-//
-//
-//
-// File : SMDS_MeshGroup.hxx
-// Module : SMESH
-
-#ifndef _SMDS_MeshGroup_HeaderFile
-#define _SMDS_MeshGroup_HeaderFile
-
-#include "SMDS_Mesh.hxx"
-#include <set>
-
-//#ifdef WNT
-//#include <SALOME_WNT.hxx>
-//#else
-//#define SALOME_WNT_EXPORT
-//#endif
-
-#if defined WNT && defined WIN32 && defined SMDS_EXPORTS
-#define SMDS_WNT_EXPORT __declspec( dllexport )
-#else
-#define SMDS_WNT_EXPORT
-#endif
-
-class SMDS_WNT_EXPORT SMDS_MeshGroup:public SMDS_MeshObject
-{
- public:
- SMDS_MeshGroup(const SMDS_Mesh * theMesh,
- const SMDSAbs_ElementType theType = SMDSAbs_All);
- const SMDS_MeshGroup * AddSubGroup
- (const SMDSAbs_ElementType theType = SMDSAbs_All);
- virtual bool RemoveSubGroup(const SMDS_MeshGroup* theGroup);
- virtual bool RemoveFromParent();
-
- const SMDS_Mesh* GetMesh() const { return myMesh; }
-
- void SetType (const SMDSAbs_ElementType theType);
- void Clear();
- void Add(const SMDS_MeshElement * theElem);
- void Remove(const SMDS_MeshElement * theElem);
- bool IsEmpty() const { return myElements.empty(); }
- int Extent() const { return myElements.size(); }
-
- SMDSAbs_ElementType GetType() const { return myType; }
-
- bool Contains(const SMDS_MeshElement * theElem) const;
-
- void InitIterator() const
- { const_cast<TIterator&>(myIterator) = myElements.begin(); }
-
- bool More() const { return myIterator != myElements.end(); }
-
- const SMDS_MeshElement* Next() const
- { return *(const_cast<TIterator&>(myIterator))++; }
-
- private:
- SMDS_MeshGroup(SMDS_MeshGroup* theParent,
- const SMDSAbs_ElementType theType = SMDSAbs_All);
-
- typedef std::set<const SMDS_MeshElement *>::const_iterator TIterator;
- const SMDS_Mesh * myMesh;
- SMDSAbs_ElementType myType;
- std::set<const SMDS_MeshElement *> myElements;
- SMDS_MeshGroup * myParent;
- std::list<const SMDS_MeshGroup*> myChildren;
- TIterator myIterator;
-};
-#endif
+++ /dev/null
-// SMESH SMDS : implementaion of Salome mesh data structure
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMDS_MeshIDFactory.cxx
-// Author : Jean-Michel BOULCOURT
-// Module : SMESH
-
-
-#include "SMDS_MeshIDFactory.hxx"
-
-using namespace std;
-
-//=======================================================================
-//function : SMDS_MeshIDFactory
-//purpose :
-//=======================================================================
-
-SMDS_MeshIDFactory::SMDS_MeshIDFactory():myMaxID(0)
-{
-}
-
-int SMDS_MeshIDFactory::GetFreeID()
-{
- if (myPoolOfID.empty()) return ++myMaxID;
- else
- {
- set<int>::iterator i = myPoolOfID.begin();
- int ID = *i;//myPoolOfID.top();
- myPoolOfID.erase( i );//myPoolOfID.pop();
- return ID;
- }
-}
-
-//=======================================================================
-//function : ReleaseID
-//purpose :
-//=======================================================================
-void SMDS_MeshIDFactory::ReleaseID(const int ID)
-{
- if ( ID > 0 )
- {
- if ( ID < myMaxID )
- {
- myPoolOfID.insert(ID);
- }
- else if ( ID == myMaxID )
- {
- --myMaxID;
- if ( !myPoolOfID.empty() ) // assure that myMaxID is not in myPoolOfID
- {
- set<int>::iterator i = --myPoolOfID.end();
- while ( i != myPoolOfID.begin() && myMaxID == *i ) {
- --myMaxID; --i;
- }
- if ( myMaxID == *i )
- --myMaxID; // begin of myPoolOfID reached
- else
- ++i;
- myPoolOfID.erase( i, myPoolOfID.end() );
- }
- }
- }
-}
+++ /dev/null
-// SMESH SMDS : implementaion of Salome mesh data structure
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMDS_MeshIDFactory.hxx
-// Module : SMESH
-
-#ifndef _SMDS_MeshIDFactory_HeaderFile
-#define _SMDS_MeshIDFactory_HeaderFile
-
-#include "SMDS_MeshObject.hxx"
-#include <set>
-
-
-class SMDS_MeshIDFactory:public SMDS_MeshObject
-{
- public:
- virtual int GetFreeID();
- virtual void ReleaseID(int ID);
-
- protected:
- SMDS_MeshIDFactory();
- int myMaxID;
- std::set<int> myPoolOfID;
-};
-
-#endif
+++ /dev/null
-// SMESH SMDS : implementaion of Salome mesh data structure
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-#ifdef _MSC_VER
-#pragma warning(disable:4786)
-#endif
-
-#include "SMDS_MeshNode.hxx"
-#include "SMDS_SpacePosition.hxx"
-#include "SMDS_IteratorOfElements.hxx"
-
-using namespace std;
-
-//=======================================================================
-//function : SMDS_MeshNode
-//purpose :
-//=======================================================================
-
-SMDS_MeshNode::SMDS_MeshNode(double x, double y, double z):
- myX(x), myY(y), myZ(z),
- myPosition(SMDS_SpacePosition::originSpacePosition())
-{
-}
-
-//=======================================================================
-//function : RemoveInverseElement
-//purpose :
-//=======================================================================
-
-void SMDS_MeshNode::RemoveInverseElement(const SMDS_MeshElement * parent)
-{
- NCollection_List<const SMDS_MeshElement*>::Iterator it(myInverseElements);
- while (it.More()) {
- const SMDS_MeshElement* elem = it.Value();
- if (elem == parent)
- myInverseElements.Remove(it);
- else
- it.Next();
- }
-}
-
-//=======================================================================
-//function : Print
-//purpose :
-//=======================================================================
-
-void SMDS_MeshNode::Print(ostream & OS) const
-{
- OS << "Node <" << GetID() << "> : X = " << myX << " Y = "
- << myY << " Z = " << myZ << endl;
-}
-
-//=======================================================================
-//function : SetPosition
-//purpose :
-//=======================================================================
-
-void SMDS_MeshNode::SetPosition(const SMDS_PositionPtr& aPos)
-{
- myPosition = aPos;
-}
-
-//=======================================================================
-//function : GetPosition
-//purpose :
-//=======================================================================
-
-const SMDS_PositionPtr& SMDS_MeshNode::GetPosition() const
-{
- return myPosition;
-}
-
-class SMDS_MeshNode_MyInvIterator:public SMDS_ElemIterator
-{
- NCollection_List<const SMDS_MeshElement*>::Iterator myIterator;
- public:
- SMDS_MeshNode_MyInvIterator(const NCollection_List<const SMDS_MeshElement*>& s):
- myIterator(s)
- {}
-
- bool more()
- {
- return myIterator.More() != Standard_False;
- }
-
- const SMDS_MeshElement* next()
- {
- const SMDS_MeshElement* current=myIterator.Value();
- myIterator.Next();
- return current;
- }
-};
-
-SMDS_ElemIteratorPtr SMDS_MeshNode::
- GetInverseElementIterator() const
-{
- return SMDS_ElemIteratorPtr(new SMDS_MeshNode_MyInvIterator(myInverseElements));
-}
-
-// Same as GetInverseElementIterator but the create iterator only return
-// wanted type elements.
-class SMDS_MeshNode_MyIterator:public SMDS_ElemIterator
-{
- NCollection_List<const SMDS_MeshElement*> mySet;
- NCollection_List<const SMDS_MeshElement*>::Iterator myIterator;
- public:
- SMDS_MeshNode_MyIterator(SMDSAbs_ElementType type,
- const NCollection_List<const SMDS_MeshElement*>& s)
- {
- const SMDS_MeshElement * e;
- bool toInsert;
- NCollection_List<const SMDS_MeshElement*>::Iterator it(s);
- for(; it.More(); it.Next())
- {
- e=it.Value();
- switch(type)
- {
- case SMDSAbs_Edge: toInsert=true; break;
- case SMDSAbs_Face: toInsert=(e->GetType()!=SMDSAbs_Edge); break;
- case SMDSAbs_Volume: toInsert=(e->GetType()==SMDSAbs_Volume); break;
- }
- if(toInsert) mySet.Append(e);
- }
- myIterator.Init(mySet);
- }
-
- bool more()
- {
- return myIterator.More() != Standard_False;
- }
-
- const SMDS_MeshElement* next()
- {
- const SMDS_MeshElement* current=myIterator.Value();
- myIterator.Next();
- return current;
- }
-};
-
-SMDS_ElemIteratorPtr SMDS_MeshNode::
- elementsIterator(SMDSAbs_ElementType type) const
-{
- if(type==SMDSAbs_Node)
- return SMDS_MeshElement::elementsIterator(SMDSAbs_Node);
- else
- return SMDS_ElemIteratorPtr
- (new SMDS_IteratorOfElements
- (this,type,
- SMDS_ElemIteratorPtr(new SMDS_MeshNode_MyIterator(type, myInverseElements))));
-}
-
-int SMDS_MeshNode::NbNodes() const
-{
- return 1;
-}
-
-double SMDS_MeshNode::X() const
-{
- return myX;
-}
-
-double SMDS_MeshNode::Y() const
-{
- return myY;
-}
-
-double SMDS_MeshNode::Z() const
-{
- return myZ;
-}
-
-void SMDS_MeshNode::setXYZ(double x, double y, double z)
-{
- myX=x;
- myY=y;
- myZ=z;
-}
-
-SMDSAbs_ElementType SMDS_MeshNode::GetType() const
-{
- return SMDSAbs_Node;
-}
-
-//=======================================================================
-//function : AddInverseElement
-//purpose :
-//=======================================================================
-void SMDS_MeshNode::AddInverseElement(const SMDS_MeshElement* ME)
-{
- NCollection_List<const SMDS_MeshElement*>::Iterator it(myInverseElements);
- for (; it.More(); it.Next()) {
- const SMDS_MeshElement* elem = it.Value();
- if (elem == ME)
- return;
- }
- myInverseElements.Append(ME);
-}
-
-//=======================================================================
-//function : ClearInverseElements
-//purpose :
-//=======================================================================
-void SMDS_MeshNode::ClearInverseElements()
-{
- myInverseElements.Clear();
-}
-
-bool SMDS_MeshNode::emptyInverseElements()
-{
- return myInverseElements.IsEmpty() != Standard_False;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-/// To be used with STL set
-///////////////////////////////////////////////////////////////////////////////
-bool operator<(const SMDS_MeshNode& e1, const SMDS_MeshNode& e2)
-{
- return e1.GetID()<e2.GetID();
- /*if(e1.myX<e2.myX) return true;
- else if(e1.myX==e2.myX)
- {
- if(e1.myY<e2.myY) return true;
- else if(e1.myY==e2.myY) return (e1.myZ<e2.myZ);
- else return false;
- }
- else return false;*/
-}
-
+++ /dev/null
-// SMESH SMDS : implementaion of Salome mesh data structure
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMDS_MeshNode.hxx
-// Module : SMESH
-
-#ifndef _SMDS_MeshNode_HeaderFile
-#define _SMDS_MeshNode_HeaderFile
-
-#include "SMDS_MeshElement.hxx"
-#include "SMDS_Position.hxx"
-#include <NCollection_List.hxx>
-
-//#ifdef WNT
-//#include <SALOME_WNT.hxx>
-//#else
-//#define SALOME_WNT_EXPORT
-//#endif
-
-#if defined WNT && defined WIN32 && defined SMDS_EXPORTS
-#define SMDS_WNT_EXPORT __declspec( dllexport )
-#else
-#define SMDS_WNT_EXPORT
-#endif
-
-class SMDS_WNT_EXPORT SMDS_MeshNode:public SMDS_MeshElement
-{
-
- public:
- SMDS_MeshNode(double x, double y, double z);
- void Print(std::ostream & OS) const;
- double X() const;
- double Y() const;
- double Z() const;
- void AddInverseElement(const SMDS_MeshElement * ME);
- void RemoveInverseElement(const SMDS_MeshElement * parent);
- void ClearInverseElements();
- bool emptyInverseElements();
- SMDS_ElemIteratorPtr GetInverseElementIterator() const;
- void SetPosition(const SMDS_PositionPtr& aPos);
- const SMDS_PositionPtr& GetPosition() const;
- SMDSAbs_ElementType GetType() const;
- int NbNodes() const;
- void setXYZ(double x, double y, double z);
- friend bool operator<(const SMDS_MeshNode& e1, const SMDS_MeshNode& e2);
-
- protected:
- SMDS_ElemIteratorPtr
- elementsIterator(SMDSAbs_ElementType type) const;
-
- private:
- double myX, myY, myZ;
- SMDS_PositionPtr myPosition;
- NCollection_List<const SMDS_MeshElement*> myInverseElements;
-};
-
-#endif
+++ /dev/null
-// SMESH SMDS : implementaion of Salome mesh data structure
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMDS_MeshObject.cxx
-// Author : Jean-Michel BOULCOURT
-// Module : SMESH
-
-#include "SMDS_MeshObject.hxx"
+++ /dev/null
-// SMESH SMDS : implementaion of Salome mesh data structure
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMDS_MeshObject.hxx
-// Module : SMESH
-
-#ifndef _SMDS_MeshObject_HeaderFile
-#define _SMDS_MeshObject_HeaderFile
-
-
-//#ifdef WNT
-//#include <SALOME_WNT.hxx>
-//#else
-//#define SALOME_WNT_EXPORT
-//#endif
-
-#if defined WNT && defined WIN32 && defined SMDS_EXPORTS
-#define SMDS_WNT_EXPORT __declspec( dllexport )
-#else
-#define SMDS_WNT_EXPORT
-#endif
-
-class SMDS_WNT_EXPORT SMDS_MeshObject
-{
- public:
- virtual ~SMDS_MeshObject() {}
-};
-#endif
+++ /dev/null
-// SMESH SMDS : implementaion of Salome mesh data structure
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMDS_MeshVolume.cxx
-// Author : Jean-Michel BOULCOURT
-// Module : SMESH
-
-#include "SMDS_MeshVolume.hxx"
-//=======================================================================
-//function : Print
-//purpose :
-//=======================================================================
-
-SMDSAbs_ElementType SMDS_MeshVolume::GetType() const
-{
- return SMDSAbs_Volume;
-}
-
+++ /dev/null
-// SMESH SMDS : implementaion of Salome mesh data structure
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMDS_MeshVolume.hxx
-// Module : SMESH
-
-#ifndef _SMDS_MeshVolume_HeaderFile
-#define _SMDS_MeshVolume_HeaderFile
-
-#include "SMDS_MeshElement.hxx"
-
-class SMDS_MeshVolume:public SMDS_MeshElement
-{
-
- public:
- SMDSAbs_ElementType GetType() const;
-};
-#endif
+++ /dev/null
-// SMESH SMDS : implementaion of Salome mesh data structure
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-#ifdef _MSC_VER
-#pragma warning(disable:4786)
-#endif
-
-#include "SMDS_PolygonalFaceOfNodes.hxx"
-
-#include "SMDS_IteratorOfElements.hxx"
-//#include "SMDS_MeshNode.hxx"
-#include "utilities.h"
-
-using namespace std;
-
-//=======================================================================
-//function : Constructor
-//purpose :
-//=======================================================================
-SMDS_PolygonalFaceOfNodes::SMDS_PolygonalFaceOfNodes
- (std::vector<const SMDS_MeshNode *> nodes)
-{
- myNodes = nodes;
-}
-
-//=======================================================================
-//function : GetType
-//purpose :
-//=======================================================================
-SMDSAbs_ElementType SMDS_PolygonalFaceOfNodes::GetType() const
-{
- return SMDSAbs_Face;
- //return SMDSAbs_PolygonalFace;
-}
-
-//=======================================================================
-//function : ChangeNodes
-//purpose :
-//=======================================================================
-bool SMDS_PolygonalFaceOfNodes::ChangeNodes (std::vector<const SMDS_MeshNode *> nodes)
-{
- if (nodes.size() < 3)
- return false;
-
- myNodes = nodes;
-
- return true;
-}
-
-//=======================================================================
-//function : ChangeNodes
-//purpose : to support the same interface, as SMDS_FaceOfNodes
-//=======================================================================
-bool SMDS_PolygonalFaceOfNodes::ChangeNodes (const SMDS_MeshNode* nodes[],
- const int nbNodes)
-{
- if (nbNodes < 3)
- return false;
-
- myNodes.resize(nbNodes);
- int i = 0;
- for (; i < nbNodes; i++) {
- myNodes[i] = nodes[i];
- }
-
- return true;
-}
-
-//=======================================================================
-//function : NbNodes
-//purpose :
-//=======================================================================
-int SMDS_PolygonalFaceOfNodes::NbNodes() const
-{
- return myNodes.size();
-}
-
-//=======================================================================
-//function : NbEdges
-//purpose :
-//=======================================================================
-int SMDS_PolygonalFaceOfNodes::NbEdges() const
-{
- return NbNodes();
-}
-
-//=======================================================================
-//function : NbFaces
-//purpose :
-//=======================================================================
-int SMDS_PolygonalFaceOfNodes::NbFaces() const
-{
- return 1;
-}
-
-//=======================================================================
-//function : Print
-//purpose :
-//=======================================================================
-void SMDS_PolygonalFaceOfNodes::Print(ostream & OS) const
-{
- OS << "polygonal face <" << GetID() << " > : ";
- int i, nbNodes = myNodes.size();
- for (i = 0; i < nbNodes - 1; i++)
- OS << myNodes[i] << ",";
- OS << myNodes[i] << ") " << endl;
-}
-
-//=======================================================================
-//function : elementsIterator
-//purpose :
-//=======================================================================
-class SMDS_PolygonalFaceOfNodes_MyIterator:public SMDS_ElemIterator
-{
- //const SMDS_MeshNode* const *mySet;
- const std::vector<const SMDS_MeshNode *> mySet;
- //int myLength;
- int index;
- public:
- //SMDS_PolygonalFaceOfNodes_MyIterator(const SMDS_MeshNode* const *s, int l):
- // mySet(s),myLength(l),index(0) {}
- SMDS_PolygonalFaceOfNodes_MyIterator(const std::vector<const SMDS_MeshNode *> s):
- mySet(s),index(0) {}
-
- bool more()
- {
- return index < mySet.size();
- }
-
- const SMDS_MeshElement* next()
- {
- index++;
- return mySet[index-1];
- }
-};
-
-SMDS_ElemIteratorPtr SMDS_PolygonalFaceOfNodes::elementsIterator
- (SMDSAbs_ElementType type) const
-{
- switch(type)
- {
- case SMDSAbs_Face:
- return SMDS_MeshElement::elementsIterator(SMDSAbs_Face);
- case SMDSAbs_Node:
- return SMDS_ElemIteratorPtr(new SMDS_PolygonalFaceOfNodes_MyIterator(myNodes));
- case SMDSAbs_Edge:
- MESSAGE("Error : edge iterator for SMDS_PolygonalFaceOfNodes not implemented");
- break;
- default:
- return SMDS_ElemIteratorPtr
- (new SMDS_IteratorOfElements
- (this,type,SMDS_ElemIteratorPtr
- (new SMDS_PolygonalFaceOfNodes_MyIterator(myNodes))));
- }
- return SMDS_ElemIteratorPtr();
-}
+++ /dev/null
-// SMESH SMDS : implementaion of Salome mesh data structure
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-#ifndef _SMDS_PolygonalFaceOfNodes_HeaderFile
-#define _SMDS_PolygonalFaceOfNodes_HeaderFile
-
-#include "SMDS_MeshFace.hxx"
-//#include "SMDS_FaceOfNodes.hxx"
-#include "SMDS_MeshNode.hxx"
-#include "SMDS_Iterator.hxx"
-
-#include <iostream>
-
-//class SMDS_PolygonalFaceOfNodes:public SMDS_FaceOfNodes
-class SMDS_PolygonalFaceOfNodes:public SMDS_MeshFace
-{
- public:
- SMDS_PolygonalFaceOfNodes (std::vector<const SMDS_MeshNode *> nodes);
-
- virtual SMDSAbs_ElementType GetType() const;
- virtual bool IsPoly() const { return true; };
-
- bool ChangeNodes (std::vector<const SMDS_MeshNode *> nodes);
-
- bool ChangeNodes (const SMDS_MeshNode* nodes[],
- const int nbNodes);
- // to support the same interface, as SMDS_FaceOfNodes
-
- virtual int NbNodes() const;
- virtual int NbEdges() const;
- virtual int NbFaces() const;
-
- virtual void Print (std::ostream & OS) const;
-
- protected:
- virtual SMDS_ElemIteratorPtr elementsIterator (SMDSAbs_ElementType type) const;
-
- private:
- std::vector<const SMDS_MeshNode *> myNodes;
-};
-
-#endif
+++ /dev/null
-// SMESH SMDS : implementaion of Salome mesh data structure
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-#ifdef _MSC_VER
-#pragma warning(disable:4786)
-#endif
-
-#include "SMDS_PolyhedralVolumeOfNodes.hxx"
-#include "SMDS_MeshNode.hxx"
-#include "utilities.h"
-
-#include <set>
-
-using namespace std;
-
-//=======================================================================
-//function : Constructor
-//purpose : Create a volume of many faces
-//=======================================================================
-SMDS_PolyhedralVolumeOfNodes::SMDS_PolyhedralVolumeOfNodes
- (std::vector<const SMDS_MeshNode *> nodes,
- std::vector<int> quantities)
-: SMDS_VolumeOfNodes(NULL, NULL, NULL, NULL)
-{
- ChangeNodes(nodes, quantities);
-}
-
-//=======================================================================
-//function : GetType
-//purpose :
-//=======================================================================
-SMDSAbs_ElementType SMDS_PolyhedralVolumeOfNodes::GetType() const
-{
-// return SMDSAbs_PolyhedralVolume;
- return SMDSAbs_Volume;
-}
-
-//=======================================================================
-//function : ChangeNodes
-//purpose :
-//=======================================================================
-bool SMDS_PolyhedralVolumeOfNodes::ChangeNodes (std::vector<const SMDS_MeshNode *> nodes,
- std::vector<int> quantities)
-{
- myNodesByFaces = nodes;
- myQuantities = quantities;
-
- // Init fields of parent class
- int aNbNodes = 0;
- std::set<const SMDS_MeshNode *> aSet;
- int nodes_len = nodes.size();
- for (int j = 0; j < nodes_len; j++) {
- if (aSet.find(nodes[j]) == aSet.end()) {
- aSet.insert(nodes[j]);
- aNbNodes++;
- }
- }
-
- int k = 0;
-#ifndef WNT
- const SMDS_MeshNode* aNodes [aNbNodes];
-#else
- const SMDS_MeshNode** aNodes = (const SMDS_MeshNode **)new SMDS_MeshNode*[aNbNodes];
-#endif
- std::set<const SMDS_MeshNode *>::iterator anIter = aSet.begin();
- for (; anIter != aSet.end(); anIter++, k++) {
- aNodes[k] = *anIter;
- }
-
- //SMDS_VolumeOfNodes::ChangeNodes(aNodes, aNbNodes);
- delete [] myNodes;
- //myNbNodes = nodes.size();
- myNbNodes = aNbNodes;
- myNodes = new const SMDS_MeshNode* [myNbNodes];
- for (int i = 0; i < myNbNodes; i++) {
- //myNodes[i] = nodes[i];
- myNodes[i] = aNodes[i];
- }
-
-#ifdef WNT
- delete [] aNodes;
-#endif
-
- return true;
-}
-
-//=======================================================================
-//function : NbEdges
-//purpose :
-//=======================================================================
-int SMDS_PolyhedralVolumeOfNodes::NbEdges() const
-{
- int nbEdges = 0;
-
- for (int ifa = 0; ifa < myQuantities.size(); ifa++) {
- nbEdges += myQuantities[ifa];
- }
- nbEdges /= 2;
-
- return nbEdges;
-}
-
-//=======================================================================
-//function : NbFaces
-//purpose :
-//=======================================================================
-int SMDS_PolyhedralVolumeOfNodes::NbFaces() const
-{
- return myQuantities.size();
-}
-
-//=======================================================================
-//function : NbFaceNodes
-//purpose :
-//=======================================================================
-int SMDS_PolyhedralVolumeOfNodes::NbFaceNodes (const int face_ind) const
-{
- if (face_ind < 1 || myQuantities.size() < face_ind)
- return 0;
- return myQuantities[face_ind - 1];
-}
-
-//=======================================================================
-//function : GetFaceNode
-//purpose :
-//=======================================================================
-const SMDS_MeshNode* SMDS_PolyhedralVolumeOfNodes::GetFaceNode (const int face_ind,
- const int node_ind) const
-{
- if (node_ind < 1 || NbFaceNodes(face_ind) < node_ind)
- return NULL;
-
- int i, first_node = 0;
- for (i = 0; i < face_ind - 1; i++) {
- first_node += myQuantities[i];
- }
-
- return myNodesByFaces[first_node + node_ind - 1];
-}
-
-//=======================================================================
-//function : Print
-//purpose :
-//=======================================================================
-void SMDS_PolyhedralVolumeOfNodes::Print (ostream & OS) const
-{
- OS << "polyhedral volume <" << GetID() << "> : ";
-
- int faces_len = myQuantities.size();
- //int nodes_len = myNodesByFaces.size();
- int cur_first_node = 0;
-
- int i, j;
- for (i = 0; i < faces_len; i++) {
- OS << "face_" << i << " (";
- for (j = 0; j < myQuantities[i] - 1; j++) {
- OS << myNodesByFaces[cur_first_node + j] << ",";
- }
- OS << myNodesByFaces[cur_first_node + j] << ") ";
- cur_first_node += myQuantities[i];
- }
-}
-
-//=======================================================================
-//function : ChangeNodes
-//purpose : usage disabled
-//=======================================================================
-bool SMDS_PolyhedralVolumeOfNodes::ChangeNodes (const SMDS_MeshNode* nodes[],
- const int nbNodes)
-{
- return false;
-}
+++ /dev/null
-// SMESH SMDS : implementaion of Salome mesh data structure
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMDS_PolyhedralVolumeOfNodes.hxx
-// Module : SMESH
-
-#ifndef _SMDS_PolyhedralVolumeOfNodes_HeaderFile
-#define _SMDS_PolyhedralVolumeOfNodes_HeaderFile
-
-#include "SMDS_VolumeOfNodes.hxx"
-
-#if defined WNT && defined WIN32 && defined SMDS_EXPORTS
-#define SMDS_WNT_EXPORT __declspec( dllexport )
-#else
-#define SMDS_WNT_EXPORT
-#endif
-class SMDS_WNT_EXPORT SMDS_PolyhedralVolumeOfNodes:public SMDS_VolumeOfNodes
-{
- public:
- SMDS_PolyhedralVolumeOfNodes (std::vector<const SMDS_MeshNode *> nodes,
- std::vector<int> quantities);
-
- //virtual ~SMDS_PolyhedralVolumeOfNodes();
-
- virtual SMDSAbs_ElementType GetType() const;
- virtual bool IsPoly() const { return true; };
-
- bool ChangeNodes (std::vector<const SMDS_MeshNode *> nodes,
- std::vector<int> quantities);
-
- //virtual int NbNodes() const;
- virtual int NbEdges() const;
- virtual int NbFaces() const;
-
- int NbFaceNodes (const int face_ind) const;
- // 1 <= face_ind <= NbFaces()
-
- const SMDS_MeshNode* GetFaceNode (const int face_ind, const int node_ind) const;
- // 1 <= face_ind <= NbFaces()
- // 1 <= node_ind <= NbFaceNodes()
-
- virtual void Print (std::ostream & OS) const;
-
- protected:
- //virtual SMDS_ElemIteratorPtr elementsIterator (SMDSAbs_ElementType type) const;
-
- private:
- // usage disabled
- bool ChangeNodes (const SMDS_MeshNode* nodes[],
- const int nbNodes);
-
- private:
- std::vector<const SMDS_MeshNode *> myNodesByFaces;
- std::vector<int> myQuantities;
-};
-
-#endif
+++ /dev/null
-// SMESH SMDS : implementaion of Salome mesh data structure
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMDS_Position.cxx
-// Author : Jean-Michel BOULCOURT
-// Module : SMESH
-
-#include "SMDS_Position.hxx"
-
-//=======================================================================
-//function : SMDS_Position
-//purpose :
-//=======================================================================
-
-SMDS_Position::SMDS_Position(int aShapeId) :myShapeId(aShapeId)
-{
-}
-
-//=======================================================================
-//function : SetShapeId
-//purpose :
-//=======================================================================
-
-void SMDS_Position::SetShapeId(int aShapeId)
-{
- myShapeId = aShapeId;
-}
-
-//=======================================================================
-//function : GetShapeId
-//purpose :
-//=======================================================================
-
-int SMDS_Position::GetShapeId() const
-{
- return myShapeId;
-}
-
-//=======================================================================
-//function : GetDim
-//purpose :
-//=======================================================================
-
-int SMDS_Position::GetDim() const
-{
-// switch ( GetTypeOfPosition() ) {
-// case SMDS_TOP_UNSPEC: return -1;
-// case SMDS_TOP_VERTEX: return 0;
-// case SMDS_TOP_EDGE: return 1;
-// case SMDS_TOP_FACE: return 2;
-// case SMDS_TOP_3DSPACE: return 3;
-// }
- return GetTypeOfPosition();
-}
-
-
+++ /dev/null
-// SMESH SMDS : implementaion of Salome mesh data structure
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMDS_Position.hxx
-// Module : SMESH
-
-#ifndef _SMDS_Position_HeaderFile
-#define _SMDS_Position_HeaderFile
-
-#include "SMDS_TypeOfPosition.hxx"
-#include <boost/shared_ptr.hpp>
-
-//#ifdef WNT
-//#include <SALOME_WNT.hxx>
-//#else
-//#define SALOME_WNT_EXPORT
-//#endif
-
-#if defined WNT && defined WIN32 && defined SMDS_EXPORTS
-#define SMDS_WNT_EXPORT __declspec( dllexport )
-#else
-#define SMDS_WNT_EXPORT
-#endif
-
-class SMDS_Position;
-typedef boost::shared_ptr<SMDS_Position> SMDS_PositionPtr;
-
-
-class SMDS_WNT_EXPORT SMDS_Position
-{
-
- public:
- const virtual double * Coords() const = 0;
- virtual SMDS_TypeOfPosition GetTypeOfPosition() const = 0;
- virtual int GetDim() const;
- void SetShapeId(int aShapeId);
- int GetShapeId() const;
- virtual ~SMDS_Position() {}
-
- protected:
- SMDS_Position(int aShapeId);
-
- private:
- int myShapeId;
-};
-
-
-#endif
+++ /dev/null
-// SMESH SMDS : implementaion of Salome mesh data structure
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMDS_SpacePosition.cxx
-// Author : Jean-Michel BOULCOURT
-// Module : SMESH
-
-#include "SMDS_SpacePosition.hxx"
-
-//=======================================================================
-//function : SMDS_SpacePosition
-//purpose :
-//=======================================================================
-
-SMDS_SpacePosition::SMDS_SpacePosition(double x, double y, double z):
- SMDS_Position(0)
-{
- myCoords[0]=x;
- myCoords[1]=y;
- myCoords[2]=z;
-}
-
-/**
-*/
-SMDS_TypeOfPosition SMDS_SpacePosition::GetTypeOfPosition() const
-{
- return SMDS_TOP_3DSPACE;
-}
-
-const double * SMDS_SpacePosition::Coords() const
-{
- return myCoords;
-}
-
-SMDS_PositionPtr SMDS_SpacePosition::originSpacePosition()
-{
- static SMDS_PositionPtr staticpos (new SMDS_SpacePosition());
- return staticpos;
-}
+++ /dev/null
-// SMESH SMDS : implementaion of Salome mesh data structure
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMDS_SpacePosition.hxx
-// Module : SMESH
-
-#ifndef _SMDS_SpacePosition_HeaderFile
-#define _SMDS_SpacePosition_HeaderFile
-
-#include "SMDS_Position.hxx"
-
-//#ifdef WNT
-//#include <SALOME_WNT.hxx>
-//#else
-//#define SALOME_WNT_EXPORT
-//#endif
-
-#if defined WNT && defined WIN32 && defined SMDS_EXPORTS
-#define SMDS_WNT_EXPORT __declspec( dllexport )
-#else
-#define SMDS_WNT_EXPORT
-#endif
-
-class SMDS_WNT_EXPORT SMDS_SpacePosition:public SMDS_Position
-{
-
- public:
- SMDS_SpacePosition(double x=0, double y=0, double z=0);
- const virtual double * Coords() const;
- virtual inline SMDS_TypeOfPosition GetTypeOfPosition() const;
- inline void SetCoords(const double x, const double y, const double z);
- static SMDS_PositionPtr originSpacePosition();
- private:
- double myCoords[3];
-};
-
-#endif
+++ /dev/null
-// SMESH SMDS : implementaion of Salome mesh data structure
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMDS_TypeOfPosition.hxx
-// Module : SMESH
-
-#ifndef _SMDS_TypeOfPosition_HeaderFile
-#define _SMDS_TypeOfPosition_HeaderFile
-
-enum SMDS_TypeOfPosition // Value is equal to shape dimention
-{
- SMDS_TOP_UNSPEC = -1,
- SMDS_TOP_VERTEX = 0,
- SMDS_TOP_EDGE = 1,
- SMDS_TOP_FACE = 2,
- SMDS_TOP_3DSPACE = 3
-};
-
-#endif
+++ /dev/null
-// SMESH SMDS : implementaion of Salome mesh data structure
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMDS_VertexPosition.cxx
-// Author : Jean-Michel BOULCOURT
-// Module : SMESH
-
-#include "SMDS_VertexPosition.hxx"
-
-#include "utilities.h"
-
-using namespace std;
-
-//=======================================================================
-//function : SMDS_VertexPosition
-//purpose :
-//=======================================================================
-
-SMDS_VertexPosition:: SMDS_VertexPosition(const int aVertexId)
- :SMDS_Position(aVertexId)
-{
-}
-
-//=======================================================================
-//function : Coords
-//purpose :
-//=======================================================================
-
-const double *SMDS_VertexPosition::Coords() const
-{
- const static double origin[]={0,0,0};
- MESSAGE("SMDS_VertexPosition::Coords not implemented");
- return origin;
-}
-
-
-SMDS_TypeOfPosition SMDS_VertexPosition::GetTypeOfPosition() const
-{
- return SMDS_TOP_VERTEX;
-}
+++ /dev/null
-// SMESH SMDS : implementaion of Salome mesh data structure
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMDS_VertexPosition.hxx
-// Module : SMESH
-
-#ifndef _SMDS_VertexPosition_HeaderFile
-#define _SMDS_VertexPosition_HeaderFile
-
-#include "SMDS_Position.hxx"
-
-//#ifdef WNT
-//#include <SALOME_WNT.hxx>
-//#else
-//#define SALOME_WNT_EXPORT
-//#endif
-
-#if defined WNT && defined WIN32 && defined SMDS_EXPORTS
-#define SMDS_WNT_EXPORT __declspec( dllexport )
-#else
-#define SMDS_WNT_EXPORT
-#endif
-
-class SMDS_WNT_EXPORT SMDS_VertexPosition:public SMDS_Position
-{
-
- public:
- SMDS_TypeOfPosition GetTypeOfPosition() const;
- SMDS_VertexPosition(int aVertexId=0);
- const double *Coords() const;
-};
-
-#endif
+++ /dev/null
-// SMESH SMDS : implementaion of Salome mesh data structure
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMDS_VolumeOfFaces.cxx
-// Author : Jean-Michel BOULCOURT
-// Module : SMESH
-
-#ifdef _MSC_VER
-#pragma warning(disable:4786)
-#endif
-
-#include "SMDS_VolumeOfFaces.hxx"
-#include "SMDS_IteratorOfElements.hxx"
-
-using namespace std;
-
-//=======================================================================
-//function : Print
-//purpose :
-//=======================================================================
-
-void SMDS_VolumeOfFaces::Print(ostream & OS) const
-{
- OS << "volume <" << GetID() << "> : ";
- int i;
- for (i = 0; i < NbFaces()-1; ++i) OS << myFaces[i] << ",";
- OS << myFaces[i]<< ") " << endl;
-}
-
-
-int SMDS_VolumeOfFaces::NbFaces() const
-{
- return myNbFaces;
-}
-
-class SMDS_VolumeOfFaces_MyIterator:public SMDS_ElemIterator
-{
- const SMDS_MeshFace* const *mySet;
- int myLength;
- int index;
- public:
- SMDS_VolumeOfFaces_MyIterator(const SMDS_MeshFace* const *s, int l):
- mySet(s),myLength(l),index(0) {}
-
- bool more()
- {
- return index<myLength;
- }
-
- const SMDS_MeshElement* next()
- {
- index++;
- return mySet[index-1];
- }
-};
-
-SMDS_ElemIteratorPtr SMDS_VolumeOfFaces::
- elementsIterator(SMDSAbs_ElementType type) const
-{
- switch(type)
- {
- case SMDSAbs_Volume:
- return SMDS_MeshElement::elementsIterator(SMDSAbs_Volume);
- case SMDSAbs_Face:
- return SMDS_ElemIteratorPtr(new SMDS_VolumeOfFaces_MyIterator(myFaces,myNbFaces));
- default:
- return SMDS_ElemIteratorPtr
- (new SMDS_IteratorOfElements
- (this,type,SMDS_ElemIteratorPtr
- (new SMDS_VolumeOfFaces_MyIterator(myFaces,myNbFaces))));
- }
-}
-
-SMDS_VolumeOfFaces::SMDS_VolumeOfFaces(const SMDS_MeshFace * face1,
- const SMDS_MeshFace * face2,
- const SMDS_MeshFace * face3,
- const SMDS_MeshFace * face4)
-{
- myNbFaces = 4;
- myFaces[0]=face1;
- myFaces[1]=face2;
- myFaces[2]=face3;
- myFaces[3]=face4;
- myFaces[4]=0;
- myFaces[5]=0;
-}
-
-SMDS_VolumeOfFaces::SMDS_VolumeOfFaces(const SMDS_MeshFace * face1,
- const SMDS_MeshFace * face2,
- const SMDS_MeshFace * face3,
- const SMDS_MeshFace * face4,
- const SMDS_MeshFace * face5)
-{
- myNbFaces = 5;
- myFaces[0]=face1;
- myFaces[1]=face2;
- myFaces[2]=face3;
- myFaces[3]=face4;
- myFaces[4]=face5;
- myFaces[5]=0;
-}
-
-SMDS_VolumeOfFaces::SMDS_VolumeOfFaces(const SMDS_MeshFace * face1,
- const SMDS_MeshFace * face2,
- const SMDS_MeshFace * face3,
- const SMDS_MeshFace * face4,
- const SMDS_MeshFace * face5,
- const SMDS_MeshFace * face6)
-{
- myNbFaces = 6;
- myFaces[0]=face1;
- myFaces[1]=face2;
- myFaces[2]=face3;
- myFaces[3]=face4;
- myFaces[4]=face5;
- myFaces[5]=face6;
-}
-
+++ /dev/null
-// SMESH SMDS : implementaion of Salome mesh data structure
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMDS_VolumeOfFaces.hxx
-// Module : SMESH
-
-#ifndef _SMDS_VolumeOfFaces_HeaderFile
-#define _SMDS_VolumeOfFaces_HeaderFile
-
-#include "SMDS_MeshVolume.hxx"
-#include "SMDS_MeshFace.hxx"
-#include "SMDS_Iterator.hxx"
-#include <iostream>
-
-
-class SMDS_VolumeOfFaces:public SMDS_MeshVolume
-{
-
- public:
- SMDS_VolumeOfFaces(const SMDS_MeshFace * face1,
- const SMDS_MeshFace * face2,
- const SMDS_MeshFace * face3,
- const SMDS_MeshFace * face4);
- SMDS_VolumeOfFaces(const SMDS_MeshFace * face1,
- const SMDS_MeshFace * face2,
- const SMDS_MeshFace * face3,
- const SMDS_MeshFace * face4,
- const SMDS_MeshFace * face5);
- SMDS_VolumeOfFaces(const SMDS_MeshFace * face1,
- const SMDS_MeshFace * face2,
- const SMDS_MeshFace * face3,
- const SMDS_MeshFace * face4,
- const SMDS_MeshFace * face5,
- const SMDS_MeshFace * face6);
-
- void Print(std::ostream & OS) const;
-
- int NbFaces() const;
-
- protected:
- SMDS_ElemIteratorPtr
- elementsIterator(SMDSAbs_ElementType type) const;
- const SMDS_MeshFace * myFaces[6];
- int myNbFaces;
-};
-#endif
+++ /dev/null
-// SMESH SMDS : implementaion of Salome mesh data structure
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-#ifdef _MSC_VER
-#pragma warning(disable:4786)
-#endif
-
-#include "SMDS_VolumeOfNodes.hxx"
-#include "SMDS_MeshNode.hxx"
-#include "utilities.h"
-
-using namespace std;
-
-///////////////////////////////////////////////////////////////////////////////
-/// Create an hexahedron. node 1,2,3,4 and 5,6,7,8 are quadrangle and
-/// 5,1 and 7,3 are an edges.
-///////////////////////////////////////////////////////////////////////////////
-SMDS_VolumeOfNodes::SMDS_VolumeOfNodes(
- const SMDS_MeshNode * node1,
- const SMDS_MeshNode * node2,
- const SMDS_MeshNode * node3,
- const SMDS_MeshNode * node4,
- const SMDS_MeshNode * node5,
- const SMDS_MeshNode * node6,
- const SMDS_MeshNode * node7,
- const SMDS_MeshNode * node8)
-{
- myNbNodes = 8;
- myNodes = new const SMDS_MeshNode* [myNbNodes];
- myNodes[0]=node1;
- myNodes[1]=node2;
- myNodes[2]=node3;
- myNodes[3]=node4;
- myNodes[4]=node5;
- myNodes[5]=node6;
- myNodes[6]=node7;
- myNodes[7]=node8;
-}
-
-SMDS_VolumeOfNodes::SMDS_VolumeOfNodes(
- const SMDS_MeshNode * node1,
- const SMDS_MeshNode * node2,
- const SMDS_MeshNode * node3,
- const SMDS_MeshNode * node4)
-{
- myNbNodes = 4;
- myNodes = new const SMDS_MeshNode* [myNbNodes];
- myNodes[0]=node1;
- myNodes[1]=node2;
- myNodes[2]=node3;
- myNodes[3]=node4;
-}
-
-SMDS_VolumeOfNodes::SMDS_VolumeOfNodes(
- const SMDS_MeshNode * node1,
- const SMDS_MeshNode * node2,
- const SMDS_MeshNode * node3,
- const SMDS_MeshNode * node4,
- const SMDS_MeshNode * node5)
-{
- myNbNodes = 5;
- myNodes = new const SMDS_MeshNode* [myNbNodes];
- myNodes[0]=node1;
- myNodes[1]=node2;
- myNodes[2]=node3;
- myNodes[3]=node4;
- myNodes[4]=node5;
-}
-
-SMDS_VolumeOfNodes::SMDS_VolumeOfNodes(
- const SMDS_MeshNode * node1,
- const SMDS_MeshNode * node2,
- const SMDS_MeshNode * node3,
- const SMDS_MeshNode * node4,
- const SMDS_MeshNode * node5,
- const SMDS_MeshNode * node6)
-{
- myNbNodes = 6;
- myNodes = new const SMDS_MeshNode* [myNbNodes];
- myNodes[0]=node1;
- myNodes[1]=node2;
- myNodes[2]=node3;
- myNodes[3]=node4;
- myNodes[4]=node5;
- myNodes[5]=node6;
-}
-
-bool SMDS_VolumeOfNodes::ChangeNodes(const SMDS_MeshNode* nodes[],
- const int nbNodes)
-{
- if (nbNodes < 4 || nbNodes > 8 || nbNodes == 7)
- return false;
-
- delete [] myNodes;
- myNbNodes = nbNodes;
- myNodes = new const SMDS_MeshNode* [myNbNodes];
- for ( int i = 0; i < nbNodes; i++ )
- myNodes[ i ] = nodes [ i ];
-
- return true;
-}
-
-SMDS_VolumeOfNodes::~SMDS_VolumeOfNodes()
-{
- if (myNodes != NULL) {
- delete [] myNodes;
- myNodes = NULL;
- }
-}
-
-//=======================================================================
-//function : Print
-//purpose :
-//=======================================================================
-
-void SMDS_VolumeOfNodes::Print(ostream & OS) const
-{
- OS << "volume <" << GetID() << "> : ";
- int i;
- for (i = 0; i < NbNodes(); ++i) OS << myNodes[i] << ",";
- OS << myNodes[NbNodes()-1]<< ") " << endl;
-}
-
-int SMDS_VolumeOfNodes::NbFaces() const
-{
- switch(NbNodes())
- {
- case 4: return 4;
- case 5: return 5;
- case 6: return 5;
- case 8: return 6;
- default: MESSAGE("invalid number of nodes");
- }
- return 0;
-}
-
-int SMDS_VolumeOfNodes::NbNodes() const
-{
- return myNbNodes;
-}
-
-int SMDS_VolumeOfNodes::NbEdges() const
-{
- switch(NbNodes())
- {
- case 4: return 6;
- case 5: return 8;
- case 6: return 9;
- case 8: return 12;
- default: MESSAGE("invalid number of nodes");
- }
- return 0;
-}
-
-class SMDS_VolumeOfNodes_MyIterator:public SMDS_ElemIterator
-{
- const SMDS_MeshNode* const* mySet;
- int myLength;
- int index;
- public:
- SMDS_VolumeOfNodes_MyIterator(const SMDS_MeshNode* const* s, int l):
- mySet(s),myLength(l),index(0) {}
-
- bool more()
- {
- return index<myLength;
- }
-
- const SMDS_MeshElement* next()
- {
- index++;
- return mySet[index-1];
- }
-};
-
-SMDS_ElemIteratorPtr SMDS_VolumeOfNodes::
- elementsIterator(SMDSAbs_ElementType type) const
-{
- switch(type)
- {
- case SMDSAbs_Volume:
- return SMDS_MeshElement::elementsIterator(SMDSAbs_Volume);
- case SMDSAbs_Node:
- return SMDS_ElemIteratorPtr(new SMDS_VolumeOfNodes_MyIterator(myNodes,myNbNodes));
- default:
- MESSAGE("ERROR : Iterator not implemented");
- return SMDS_ElemIteratorPtr((SMDS_ElemIterator*)NULL);
- }
-}
-
-SMDSAbs_ElementType SMDS_VolumeOfNodes::GetType() const
-{
- return SMDSAbs_Volume;
-}
+++ /dev/null
-// SMESH SMDS : implementaion of Salome mesh data structure
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMDS_MeshVolume.hxx
-// Module : SMESH
-
-#ifndef _SMDS_VolumeOfNodes_HeaderFile
-#define _SMDS_VolumeOfNodes_HeaderFile
-
-#include "SMDS_MeshVolume.hxx"
-
-
-class SMDS_VolumeOfNodes:public SMDS_MeshVolume
-{
-
- public:
- SMDS_VolumeOfNodes(
- const SMDS_MeshNode * node1,
- const SMDS_MeshNode * node2,
- const SMDS_MeshNode * node3,
- const SMDS_MeshNode * node4);
- SMDS_VolumeOfNodes(
- const SMDS_MeshNode * node1,
- const SMDS_MeshNode * node2,
- const SMDS_MeshNode * node3,
- const SMDS_MeshNode * node4,
- const SMDS_MeshNode * node5);
- SMDS_VolumeOfNodes(
- const SMDS_MeshNode * node1,
- const SMDS_MeshNode * node2,
- const SMDS_MeshNode * node3,
- const SMDS_MeshNode * node4,
- const SMDS_MeshNode * node5,
- const SMDS_MeshNode * node6);
- SMDS_VolumeOfNodes(
- const SMDS_MeshNode * node1,
- const SMDS_MeshNode * node2,
- const SMDS_MeshNode * node3,
- const SMDS_MeshNode * node4,
- const SMDS_MeshNode * node5,
- const SMDS_MeshNode * node6,
- const SMDS_MeshNode * node7,
- const SMDS_MeshNode * node8);
- bool ChangeNodes(const SMDS_MeshNode* nodes[],
- const int nbNodes);
- ~SMDS_VolumeOfNodes();
-
- void Print(std::ostream & OS) const;
- int NbFaces() const;
- int NbNodes() const;
- int NbEdges() const;
- SMDSAbs_ElementType GetType() const;
- protected:
- SMDS_ElemIteratorPtr
- elementsIterator(SMDSAbs_ElementType type) const;
- const SMDS_MeshNode** myNodes;
- int myNbNodes;
-};
-#endif
+++ /dev/null
-// SMESH SMDS : implementaion of Salome mesh data structure
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMDS_VolumeTool.hxx
-// Module : SMESH
-// Created : Tue Jul 13 11:27:17 2004
-// Author : Edward AGAPOV (eap)
-
-
-#ifndef SMDS_VolumeTool_HeaderFile
-#define SMDS_VolumeTool_HeaderFile
-
-class SMDS_MeshElement;
-class SMDS_MeshNode;
-class SMDS_PolyhedralVolumeOfNodes;
-
-#include <vector>
-#include <set>
-
-//#ifdef WNT
-//#include <SALOME_WNT.hxx>
-//#else
-//#define SALOME_WNT_EXPORT
-//#endif
-
-#if defined WNT && defined WIN32 && defined SMDS_EXPORTS
-#define SMDS_WNT_EXPORT __declspec( dllexport )
-#else
-#define SMDS_WNT_EXPORT
-#endif
-
-// =========================================================================
-//
-// Class providing topological and other information about SMDS_MeshVolume:
-// allows iteration on faces or, to be precise, on nodes of volume sides;
-// provides info on nodes connection etc.
-//
-// =========================================================================
-
-class SMDS_WNT_EXPORT SMDS_VolumeTool
-{
- public:
-
- enum VolumeType { UNKNOWN = -1, TETRA = 0, PYRAM, PENTA, HEXA, POLYHEDA };
-
- SMDS_VolumeTool ();
- ~SMDS_VolumeTool ();
- SMDS_VolumeTool (const SMDS_MeshElement* theVolume);
-
- bool Set (const SMDS_MeshElement* theVolume);
- // Set volume.
- // Return false if theVolume is not of type SMDSAbs_Volume
-
- // -----------------------
- // general info
- // -----------------------
-
- VolumeType GetVolumeType() const;
-
- bool IsForward() const { return myVolForward; }
- // Check volume orientation. can be changed by Inverse().
- // See node order of forward volumes at the file bottom
-
- void Inverse();
- // Change nodes order as if the volume changes its orientation:
- // top and bottom faces are reversed.
- // Result of IsForward() and methods returning nodes change
-
- const SMDS_MeshNode** GetNodes() { return myVolumeNodes; }
- // Return array of volume nodes
-
- int NbNodes() { return myVolumeNbNodes; }
- // Return array of volume nodes
-
- double GetSize() const;
- // Return element volume
-
- bool GetBaryCenter (double & X, double & Y, double & Z) const;
-
-
- // -----------------------
- // info on node connection
- // -----------------------
-
- bool IsLinked (const SMDS_MeshNode* theNode1,
- const SMDS_MeshNode* theNode2) const;
- // Return true if theNode1 is linked with theNode2.
-
- bool IsLinked (const int theNode1Index,
- const int theNode2Index) const;
- // Return true if the node with theNode1Index is linked
- // with the node with theNode2Index
-
- int GetNodeIndex(const SMDS_MeshNode* theNode) const;
- // Return an index of theNode
-
- // -------------
- // info on faces
- // -------------
-
- void SetExternalNormal ();
- // Node order in faces will be so that faces normals are external.
-
- int NbFaces() const { return myNbFaces; }
- // Return number of faces of the volume. In the following
- // methods 0 <= faceIndex < NbFaces()
-
- int NbFaceNodes( int faceIndex );
- // Return number of nodes in the array of face nodes
-
- const int* GetFaceNodesIndices( int faceIndex );
- // Return the array of face nodes indices
- // To comfort link iteration, the array
- // length == NbFaceNodes( faceIndex ) + 1 and
- // the last node index == the first one.
-
- const SMDS_MeshNode** GetFaceNodes( int faceIndex );
- // Return the array of face nodes.
- // To comfort link iteration, the array
- // length == NbFaceNodes( faceIndex ) + 1 and
- // the last node == the first one.
- // WARNING: do not modify the array, some methods
- // work basing on its contents
-
- bool GetFaceNodes (int faceIndex,
- std::set<const SMDS_MeshNode*>& theFaceNodes );
- // Return a set of face nodes.
-
- bool IsFaceExternal( int faceIndex );
- // Check normal orientation of a face.
- // SetExternalNormal() is taken into account.
-
- bool IsFreeFace( int faceIndex );
- // Check that all volumes built on the face nodes lays on one side
-
- bool GetFaceNormal (int faceIndex, double & X, double & Y, double & Z);
- // Return a normal to a face
-
- double GetFaceArea( int faceIndex );
- // Return face area
-
- int GetOppFaceIndex( int faceIndex ) const;
- // Return index of the opposite face if it exists, else -1.
-
- int GetFaceIndex( const std::set<const SMDS_MeshNode*>& theFaceNodes );
- // Return index of a face formed by theFaceNodes.
- // Return -1 if a face not found
-
- //int GetFaceIndex( const std::set<int>& theFaceNodesIndices );
- // Return index of a face formed by theFaceNodesIndices
- // Return -1 if a face not found
-
- // ------------------------
- // static methods for faces
- // ------------------------
-
- static VolumeType GetType(int nbNodes);
- // return VolumeType by nb of nodes in a volume
-
- static int NbFaces( VolumeType type );
- // return nb of faces by volume type
-
- static const int* GetFaceNodesIndices(VolumeType type,
- int faceIndex,
- bool external);
- // Return the array of face nodes indices
- // To comfort link iteration, the array
- // length == NbFaceNodes( faceIndex ) + 1 and
- // the last node index == the first one.
-
- static int NbFaceNodes(VolumeType type,
- int faceIndex );
- // Return number of nodes in the array of face nodes
-
- private:
-
- bool setFace( int faceIndex );
-
- const SMDS_MeshElement* myVolume;
- const SMDS_PolyhedralVolumeOfNodes* myPolyedre;
-
- bool myVolForward;
- int myNbFaces;
- int myVolumeNbNodes;
- const SMDS_MeshNode** myVolumeNodes;
-
- bool myExternalFaces;
-
- int myCurFace;
- int myFaceNbNodes;
- int* myFaceNodeIndices;
- const SMDS_MeshNode** myFaceNodes;
-
-};
-#endif
-
-
-///////////////////////////////////////////////////////////////////////////
-//
-// ORDER OF NODES OF FORWARD ELEMENT
-//
-///////////////////////////////////////////////////////////////////////////
-/*
-// N3
-// +
-// /|\
-// / | \
-// / | \
-// N0 +---|---+ N1 TETRAHEDRON
-// \ | /
-// \ | /
-// \ | /
-// \|/
-// +
-// N2
-
-// + N4
-// /|\
-// / | \
-// / | \
-// / | \
-// N3 +---------+ N5
-// | | |
-// | + N1 |
-// | / \ | PENTAHEDRON
-// | / \ |
-// | / \ |
-// |/ \|
-// N0 +---------+ N2
-
-// N5+----------+N6
-// /| /|
-// / | / |
-// / | / |
-// N4+----------+N7 |
-// | | | | HEXAHEDRON
-// | | | |
-// | | | |
-// | N1+------|---+N2
-// | / | /
-// | / | /
-// |/ |/
-// N0+----------+N3
-//
-*/
+++ /dev/null
-// SMESH SMESH : implementaion of SMESH idl descriptions
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESH_1D_Algo.cxx
-// Author : Paul RASCLE, EDF
-// Module : SMESH
-// $Header$
-
-using namespace std;
-#include "SMESH_1D_Algo.hxx"
-#include "SMESH_Gen.hxx"
-#include "SMESH_subMesh.hxx"
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-SMESH_1D_Algo::SMESH_1D_Algo(int hypId, int studyId, SMESH_Gen* gen)
- : SMESH_Algo(hypId, studyId, gen)
-{
-// _compatibleHypothesis.push_back("hypothese_1D_bidon");
- _type = ALGO_1D;
- gen->_map1D_Algo[hypId] = this;
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-SMESH_1D_Algo::~SMESH_1D_Algo()
-{
-}
-
+++ /dev/null
-// SMESH SMESH : implementaion of SMESH idl descriptions
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESH_1D_Algo.hxx
-// Author : Paul RASCLE, EDF
-// Module : SMESH
-// $Header$
-
-#ifndef _SMESH_1D_ALGO_HXX_
-#define _SMESH_1D_ALGO_HXX_
-
-#include "SMESH_Algo.hxx"
-
-class SMESH_1D_Algo:
- public SMESH_Algo
-{
-public:
- SMESH_1D_Algo(int hypId, int studyId, SMESH_Gen* gen);
- virtual ~SMESH_1D_Algo();
-};
-
-#endif
+++ /dev/null
-// SMESH SMESH : implementaion of SMESH idl descriptions
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESH_2D_Algo.cxx
-// Author : Paul RASCLE, EDF
-// Module : SMESH
-// $Header$
-
-using namespace std;
-#include "SMESH_2D_Algo.hxx"
-#include "SMESH_Gen.hxx"
-#include "SMESH_subMesh.hxx"
-
-#include "utilities.h"
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-SMESH_2D_Algo::SMESH_2D_Algo(int hypId, int studyId, SMESH_Gen* gen)
- : SMESH_Algo(hypId, studyId, gen)
-{
-// _compatibleHypothesis.push_back("hypothese_2D_bidon");
- _type = ALGO_2D;
- gen->_map2D_Algo[hypId] = this;
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-SMESH_2D_Algo::~SMESH_2D_Algo()
-{
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-int SMESH_2D_Algo::NumberOfWires(const TopoDS_Shape& S)
-{
- int i = 0;
- for (TopExp_Explorer exp(S,TopAbs_WIRE); exp.More(); exp.Next())
- i++;
- return i;
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-int SMESH_2D_Algo::NumberOfPoints(SMESH_Mesh& aMesh, const TopoDS_Wire& W)
-{
- int nbPoints = 0;
- for (TopExp_Explorer exp(W,TopAbs_EDGE); exp.More(); exp.Next())
- {
- const TopoDS_Edge& E = TopoDS::Edge(exp.Current());
- int nb = aMesh.GetSubMesh(E)->GetSubMeshDS()->NbNodes();
- //SCRUTE(nb);
- nbPoints += nb +1; // internal points plus 1 vertex of 2 (last point ?)
- }
- //SCRUTE(nbPoints);
- return nbPoints;
-}
+++ /dev/null
-// SMESH SMESH : implementaion of SMESH idl descriptions
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESH_2D_Algo.hxx
-// Author : Paul RASCLE, EDF
-// Module : SMESH
-// $Header$
-
-#ifndef _SMESH_2D_ALGO_HXX_
-#define _SMESH_2D_ALGO_HXX_
-
-#include "SMESH_Algo.hxx"
-#include <TopoDS_Wire.hxx>
-
-class SMESH_2D_Algo:
- public SMESH_Algo
-{
-public:
- SMESH_2D_Algo(int hypId, int studyId, SMESH_Gen* gen);
- virtual ~SMESH_2D_Algo();
-
- int NumberOfWires(const TopoDS_Shape& S);
- int NumberOfPoints(SMESH_Mesh& aMesh,const TopoDS_Wire& W);
-};
-
-#endif
+++ /dev/null
-// SMESH SMESH : implementaion of SMESH idl descriptions
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESH_3D_Algo.cxx
-// Author : Paul RASCLE, EDF
-// Module : SMESH
-// $Header$
-
-using namespace std;
-#include "SMESH_3D_Algo.hxx"
-#include "SMESH_Gen.hxx"
-#include "SMESH_subMesh.hxx"
-
-#include "utilities.h"
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-SMESH_3D_Algo::SMESH_3D_Algo(int hypId, int studyId, SMESH_Gen* gen)
- : SMESH_Algo(hypId, studyId, gen)
-{
-// _compatibleHypothesis.push_back("hypothese_3D_bidon");
- _type = ALGO_3D;
- gen->_map3D_Algo[hypId] = this;
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-SMESH_3D_Algo::~SMESH_3D_Algo()
-{
-}
+++ /dev/null
-// SMESH SMESH : implementaion of SMESH idl descriptions
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESH_3D_Algo.hxx
-// Author : Paul RASCLE, EDF
-// Module : SMESH
-// $Header$
-
-#ifndef _SMESH_3D_ALGO_HXX_
-#define _SMESH_3D_ALGO_HXX_
-
-#include "SMESH_Algo.hxx"
-
-class SMESH_3D_Algo:
- public SMESH_Algo
-{
-public:
- SMESH_3D_Algo(int hypId, int studyId, SMESH_Gen* gen);
- virtual ~SMESH_3D_Algo();
-};
-
-#endif
+++ /dev/null
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-// File : SMESH_Pattern.hxx
-// Created : Mon Aug 2 10:30:00 2004
-// Author : Edward AGAPOV (eap)
-
-#include "SMESH_Block.hxx"
-
-#include <BRepTools.hxx>
-#include <BRepTools_WireExplorer.hxx>
-#include <BRep_Tool.hxx>
-#include <Extrema_ExtPC.hxx>
-#include <Extrema_POnCurv.hxx>
-#include <GeomAdaptor_Curve.hxx>
-#include <TopAbs_ShapeEnum.hxx>
-#include <TopExp_Explorer.hxx>
-#include <TopLoc_Location.hxx>
-#include <TopTools_IndexedDataMapOfShapeListOfShape.hxx>
-#include <TopTools_ListIteratorOfListOfShape.hxx>
-#include <TopTools_ListOfShape.hxx>
-#include <TopoDS.hxx>
-#include <TopoDS_Face.hxx>
-#include <TopoDS_Iterator.hxx>
-#include <TopoDS_Wire.hxx>
-#include <gp_Trsf.hxx>
-#include <gp_Vec.hxx>
-#include <math_FunctionSetRoot.hxx>
-
-#include "SMDS_MeshNode.hxx"
-#include "SMDS_MeshVolume.hxx"
-#include "SMDS_VolumeTool.hxx"
-#include "utilities.h"
-
-#include <list>
-
-using namespace std;
-
-#define SQRT_FUNC 1
-
-//=======================================================================
-//function : SMESH_Block::TEdge::GetU
-//purpose :
-//=======================================================================
-
-double SMESH_Block::TEdge::GetU( const gp_XYZ& theParams ) const
-{
- double u = theParams.Coord( myCoordInd );
- if ( myC3d.IsNull() ) // if mesh block
- return u;
- return ( 1 - u ) * myFirst + u * myLast;
-}
-
-//=======================================================================
-//function : SMESH_Block::TEdge::Point
-//purpose :
-//=======================================================================
-
-gp_XYZ SMESH_Block::TEdge::Point( const gp_XYZ& theParams ) const
-{
- double u = GetU( theParams );
-
- if ( myC3d.IsNull() ) // if mesh block
- return myNodes[0] * ( 1 - u ) + myNodes[1] * u;
-
- gp_XYZ p = myC3d->Value( u ).XYZ();
- if ( myTrsf.Form() != gp_Identity )
- myTrsf.Transforms( p );
- return p;
-}
-
-//=======================================================================
-//function : SMESH_Block::TFace::GetCoefs
-//purpose : return coefficients for addition of [0-3]-th edge and vertex
-//=======================================================================
-
-void SMESH_Block::TFace::GetCoefs(int iE,
- const gp_XYZ& theParams,
- double& Ecoef,
- double& Vcoef ) const
-{
- double dU = theParams.Coord( GetUInd() );
- double dV = theParams.Coord( GetVInd() );
- switch ( iE ) {
- case 0:
- Ecoef = ( 1 - dV ); // u0
- Vcoef = ( 1 - dU ) * ( 1 - dV ); break; // 00
- case 1:
- Ecoef = dV; // u1
- Vcoef = dU * ( 1 - dV ); break; // 10
- case 2:
- Ecoef = ( 1 - dU ); // 0v
- Vcoef = dU * dV ; break; // 11
- case 3:
- Ecoef = dU ; // 1v
- Vcoef = ( 1 - dU ) * dV ; break; // 01
- default: ASSERT(0);
- }
-}
-
-//=======================================================================
-//function : SMESH_Block::TFace::GetUV
-//purpose :
-//=======================================================================
-
-gp_XY SMESH_Block::TFace::GetUV( const gp_XYZ& theParams ) const
-{
- gp_XY uv(0.,0.);
- for ( int iE = 0; iE < 4; iE++ ) // loop on 4 edges
- {
- double Ecoef = 0, Vcoef = 0;
- GetCoefs( iE, theParams, Ecoef, Vcoef );
- // edge addition
- double u = theParams.Coord( myCoordInd[ iE ] );
- u = ( 1 - u ) * myFirst[ iE ] + u * myLast[ iE ];
- uv += Ecoef * myC2d[ iE ]->Value( u ).XY();
- // corner addition
- uv -= Vcoef * myCorner[ iE ];
- }
- return uv;
-}
-
-//=======================================================================
-//function : SMESH_Block::TFace::Point
-//purpose :
-//=======================================================================
-
-gp_XYZ SMESH_Block::TFace::Point( const gp_XYZ& theParams ) const
-{
- gp_XYZ p(0.,0.,0.);
- if ( myS.IsNull() ) // if mesh block
- {
- for ( int iE = 0; iE < 4; iE++ ) // loop on 4 edges
- {
- double Ecoef = 0, Vcoef = 0;
- GetCoefs( iE, theParams, Ecoef, Vcoef );
- // edge addition
- double u = theParams.Coord( myCoordInd[ iE ] );
- int i1 = 0, i2 = 1;
- switch ( iE ) {
- case 1: i1 = 3; i2 = 2; break;
- case 2: i1 = 1; i2 = 2; break;
- case 3: i1 = 0; i2 = 3; break;
- }
- p += Ecoef * ( myNodes[ i1 ] * ( 1 - u ) + myNodes[ i2 ] * u );
- // corner addition
- p -= Vcoef * myNodes[ iE ];
- }
-
- }
- else // shape block
- {
- gp_XY uv = GetUV( theParams );
- p = myS->Value( uv.X(), uv.Y() ).XYZ();
- if ( myTrsf.Form() != gp_Identity )
- myTrsf.Transforms( p );
- }
- return p;
-}
-
-//=======================================================================
-//function : GetShapeCoef
-//purpose :
-//=======================================================================
-
-double* SMESH_Block::GetShapeCoef (const int theShapeID)
-{
- static double shapeCoef[][3] = {
- // V000, V100, V010, V110
- { -1,-1,-1 }, { 1,-1,-1 }, { -1, 1,-1 }, { 1, 1,-1 },
- // V001, V101, V011, V111,
- { -1,-1, 1 }, { 1,-1, 1 }, { -1, 1, 1 }, { 1, 1, 1 },
- // Ex00, Ex10, Ex01, Ex11,
- { 0,-1,-1 }, { 0, 1,-1 }, { 0,-1, 1 }, { 0, 1, 1 },
- // E0y0, E1y0, E0y1, E1y1,
- { -1, 0,-1 }, { 1, 0,-1 }, { -1, 0, 1 }, { 1, 0, 1 },
- // E00z, E10z, E01z, E11z,
- { -1,-1, 0 }, { 1,-1, 0 }, { -1, 1, 0 }, { 1, 1, 0 },
- // Fxy0, Fxy1, Fx0z, Fx1z, F0yz, F1yz,
- { 0, 0,-1 }, { 0, 0, 1 }, { 0,-1, 0 }, { 0, 1, 0 }, { -1, 0, 0 }, { 1, 0, 0 },
- // ID_Shell
- { 0, 0, 0 }
- };
- if ( theShapeID < ID_V000 || theShapeID > ID_F1yz )
- return shapeCoef[ ID_Shell - 1 ];
-
- return shapeCoef[ theShapeID - 1 ];
-}
-
-//=======================================================================
-//function : ShellPoint
-//purpose : return coordinates of a point in shell
-//=======================================================================
-
-bool SMESH_Block::ShellPoint( const gp_XYZ& theParams, gp_XYZ& thePoint ) const
-{
- thePoint.SetCoord( 0., 0., 0. );
- for ( int shapeID = ID_V000; shapeID < ID_Shell; shapeID++ )
- {
- // coef
- double* coefs = GetShapeCoef( shapeID );
- double k = 1;
- for ( int iCoef = 0; iCoef < 3; iCoef++ ) {
- if ( coefs[ iCoef ] != 0 ) {
- if ( coefs[ iCoef ] < 0 )
- k *= ( 1. - theParams.Coord( iCoef + 1 ));
- else
- k *= theParams.Coord( iCoef + 1 );
- }
- }
- // point on a shape
- gp_XYZ Ps;
- if ( shapeID < ID_Ex00 ) // vertex
- VertexPoint( shapeID, Ps );
- else if ( shapeID < ID_Fxy0 ) { // edge
- EdgePoint( shapeID, theParams, Ps );
- k = -k;
- } else // face
- FacePoint( shapeID, theParams, Ps );
-
- thePoint += k * Ps;
- }
- return true;
-}
-
-//=======================================================================
-//function : ShellPoint
-//purpose : computes coordinates of a point in shell by points on sub-shapes;
-// thePointOnShape[ subShapeID ] must be a point on a subShape
-//=======================================================================
-
-bool SMESH_Block::ShellPoint(const gp_XYZ& theParams,
- const vector<gp_XYZ>& thePointOnShape,
- gp_XYZ& thePoint )
-{
- if ( thePointOnShape.size() < ID_F1yz )
- return false;
-
- double x = theParams.X(), y = theParams.Y(), z = theParams.Z();
- double x1 = 1. - x, y1 = 1. - y, z1 = 1. - z;
- const vector<gp_XYZ>& p = thePointOnShape;
-
- thePoint =
- x1 * p[ID_F0yz] + x * p[ID_F1yz]
- + y1 * p[ID_Fx0z] + y * p[ID_Fx1z]
- + z1 * p[ID_Fxy0] + z * p[ID_Fxy1]
- + x1 * (y1 * (z1 * p[ID_V000] + z * p[ID_V001])
- + y * (z1 * p[ID_V010] + z * p[ID_V011]))
- + x * (y1 * (z1 * p[ID_V100] + z * p[ID_V101])
- + y * (z1 * p[ID_V110] + z * p[ID_V111]));
- thePoint -=
- x1 * (y1 * p[ID_E00z] + y * p[ID_E01z])
- + x * (y1 * p[ID_E10z] + y * p[ID_E11z])
- + y1 * (z1 * p[ID_Ex00] + z * p[ID_Ex01])
- + y * (z1 * p[ID_Ex10] + z * p[ID_Ex11])
- + z1 * (x1 * p[ID_E0y0] + x * p[ID_E1y0])
- + z * (x1 * p[ID_E0y1] + x * p[ID_E1y1]);
-
- return true;
-}
-
-//=======================================================================
-//function : NbVariables
-//purpose :
-//=======================================================================
-
-Standard_Integer SMESH_Block::NbVariables() const
-{
- return 3;
-}
-
-//=======================================================================
-//function : NbEquations
-//purpose :
-//=======================================================================
-
-Standard_Integer SMESH_Block::NbEquations() const
-{
- return 1;
-}
-
-//=======================================================================
-//function : Value
-//purpose :
-//=======================================================================
-
-Standard_Boolean SMESH_Block::Value(const math_Vector& theXYZ, math_Vector& theFxyz)
-{
- gp_XYZ P, params( theXYZ(1), theXYZ(2), theXYZ(3) );
- if ( params.IsEqual( myParam, DBL_MIN )) { // same param
- theFxyz( 1 ) = myValues[ 0 ];
- }
- else {
- ShellPoint( params, P );
- gp_Vec dP( P - myPoint );
- theFxyz(1) = SQRT_FUNC ? dP.SquareMagnitude() : dP.Magnitude();
- }
- return true;
-}
-
-//=======================================================================
-//function : Derivatives
-//purpose :
-//=======================================================================
-
-Standard_Boolean SMESH_Block::Derivatives(const math_Vector& XYZ,math_Matrix& Df)
-{
- MESSAGE( "SMESH_Block::Derivatives()");
- math_Vector F(1,3);
- return Values(XYZ,F,Df);
-}
-
-//=======================================================================
-//function : Values
-//purpose :
-//=======================================================================
-
-Standard_Boolean SMESH_Block::Values(const math_Vector& theXYZ,
- math_Vector& theFxyz,
- math_Matrix& theDf)
-{
-// MESSAGE( endl<<"SMESH_Block::Values( "<<theXYZ(1)<<", "<<theXYZ(2)<<", "<<theXYZ(3)<<")");
-
- gp_XYZ P, params( theXYZ(1), theXYZ(2), theXYZ(3) );
- if ( params.IsEqual( myParam, DBL_MIN )) { // same param
- theFxyz( 1 ) = myValues[ 0 ];
- theDf( 1,1 ) = myValues[ 1 ];
- theDf( 1,2 ) = myValues[ 2 ];
- theDf( 1,3 ) = myValues[ 3 ];
- return true;
- }
-
- ShellPoint( params, P );
- //myNbIterations++; // how many time call ShellPoint()
-
- gp_Vec dP( P - myPoint );
- theFxyz(1) = SQRT_FUNC ? dP.SquareMagnitude() : dP.Magnitude();
- if ( theFxyz(1) < 1e-6 ) {
- myParam = params;
- myValues[ 0 ]= 0;
- theDf( 1,1 ) = 0;
- theDf( 1,2 ) = 0;
- theDf( 1,3 ) = 0;
- return true;
- }
-
- if ( theFxyz(1) < myValues[0] ) // a better guess
- {
- // 3 partial derivatives
- gp_Vec drv[ 3 ];
- for ( int iP = 1; iP <= 3; iP++ ) {
- gp_XYZ Pi;
- params.SetCoord( iP, theXYZ( iP ) + 0.001 );
- ShellPoint( params, Pi );
- params.SetCoord( iP, theXYZ( iP ) ); // restore params
- gp_Vec dPi ( P, Pi );
- double mag = dPi.Magnitude();
- if ( mag > DBL_MIN )
- dPi /= mag;
- drv[ iP - 1 ] = dPi;
- }
- for ( int iP = 0; iP < 3; iP++ ) {
- if ( iP == myFaceIndex )
- theDf( 1, iP + 1 ) = myFaceParam;
- else {
- // like IntAna_IntConicQuad::Perform (const gp_Lin& L, const gp_Pln& P)
- // where L is (P -> myPoint), P is defined by the 2 other derivative direction
- int iPrev = ( iP ? iP - 1 : 2 );
- int iNext = ( iP == 2 ? 0 : iP + 1 );
- gp_Vec plnNorm = drv[ iPrev ].Crossed( drv [ iNext ] );
- double Direc = plnNorm * drv[ iP ];
- if ( Abs(Direc) <= DBL_MIN )
- theDf( 1, iP + 1 ) = dP * drv[ iP ];
- else {
- double Dis = plnNorm * P - plnNorm * myPoint;
- theDf( 1, iP + 1 ) = Dis/Direc;
- }
- }
- }
- //myNbIterations +=3; // how many time call ShellPoint()
-
- // store better values
- myParam = params;
- myValues[0]= theFxyz(1);
- myValues[1]= theDf(1,1);
- myValues[2]= theDf(1,2);
- myValues[3]= theDf(1,3);
-
-// SCRUTE( theFxyz(1) );
-// SCRUTE( theDf( 1,1 ));
-// SCRUTE( theDf( 1,2 ));
-// SCRUTE( theDf( 1,3 ));
- }
-
- return true;
-}
-
-//=======================================================================
-//function : ComputeParameters
-//purpose : compute point parameters in the block
-//=======================================================================
-
-bool SMESH_Block::ComputeParameters(const gp_Pnt& thePoint,
- gp_XYZ& theParams,
- const int theShapeID)
-{
- if ( VertexParameters( theShapeID, theParams ))
- return true;
-
- if ( IsEdgeID( theShapeID )) {
- TEdge& e = myEdge[ theShapeID - ID_Ex00 ];
- GeomAdaptor_Curve curve( e.myC3d );
- double f = Min( e.myFirst, e.myLast ), l = Max( e.myFirst, e.myLast );
- Extrema_ExtPC anExtPC( thePoint, curve, f, l );
- int i, nb = anExtPC.IsDone() ? anExtPC.NbExt() : 0;
- for ( i = 1; i <= nb; i++ ) {
- if ( anExtPC.IsMin( i ))
- return EdgeParameters( theShapeID, anExtPC.Point( i ).Parameter(), theParams );
- }
- return false;
- }
-
-// MESSAGE( endl<<"SMESH_Block::ComputeParameters( "
-// <<thePoint.X()<<", "<<thePoint.Y()<<", "<<thePoint.Z()<<")");
- myPoint = thePoint.XYZ();
-
- myParam.SetCoord( -1,-1,-1 );
- myValues[0] = 1e100;
-
- const bool isOnFace = IsFaceID( theShapeID );
- double * coef = GetShapeCoef( theShapeID );
-
- // the first guess
- math_Vector start( 1, 3, 0.0 );
- if ( !myGridComputed )
- {
- // define the first guess by thePoint projection on lines
- // connecting vertices
- bool needGrid = false;
- gp_XYZ par000( 0, 0, 0 ), par111( 1, 1, 1 );
- double zero = DBL_MIN * DBL_MIN;
- for ( int iEdge = 0, iParam = 1; iParam <= 3 && !needGrid; iParam++ )
- {
- if ( isOnFace && coef[ iParam - 1 ] != 0 ) {
- iEdge += 4;
- continue;
- }
- for ( int iE = 0; iE < 4; iE++, iEdge++ ) { // loop on 4 parallel edges
- gp_Pnt p0 = myEdge[ iEdge ].Point( par000 );
- gp_Pnt p1 = myEdge[ iEdge ].Point( par111 );
- gp_Vec v01( p0, p1 ), v0P( p0, thePoint );
- double len2 = v01.SquareMagnitude();
- double par = 0;
- if ( len2 > zero ) {
- par = v0P.Dot( v01 ) / len2;
- if ( par < 0 || par > 1 ) {
- needGrid = true;
- break;
- }
- }
- start( iParam ) += par;
- }
- start( iParam ) /= 4.;
- }
- if ( needGrid ) {
- // compute nodes of 3 x 3 x 3 grid
- int iNode = 0;
- for ( double x = 0.25; x < 0.9; x += 0.25 )
- for ( double y = 0.25; y < 0.9; y += 0.25 )
- for ( double z = 0.25; z < 0.9; z += 0.25 ) {
- TxyzPair & prmPtn = my3x3x3GridNodes[ iNode++ ];
- prmPtn.first.SetCoord( x, y, z );
- ShellPoint( prmPtn.first, prmPtn.second );
- }
- myGridComputed = true;
- }
- }
- if ( myGridComputed ) {
- double minDist = DBL_MAX;
- gp_XYZ* bestParam = 0;
- for ( int iNode = 0; iNode < 27; iNode++ ) {
- TxyzPair & prmPtn = my3x3x3GridNodes[ iNode ];
- double dist = ( thePoint.XYZ() - prmPtn.second ).SquareModulus();
- if ( dist < minDist ) {
- minDist = dist;
- bestParam = & prmPtn.first;
- }
- }
- start( 1 ) = bestParam->X();
- start( 2 ) = bestParam->Y();
- start( 3 ) = bestParam->Z();
- }
-
- int myFaceIndex = -1;
- if ( isOnFace ) {
- // put a point on the face
- for ( int iCoord = 0; iCoord < 3; iCoord++ )
- if ( coef[ iCoord ] ) {
- myFaceIndex = iCoord;
- myFaceParam = ( coef[ myFaceIndex ] < 0.5 ) ? 0.0 : 1.0;
- start( iCoord + 1 ) = myFaceParam;
- }
- }
- math_Vector low ( 1, 3, 0.0 );
- math_Vector up ( 1, 3, 1.0 );
- math_Vector tol ( 1, 3, 1e-4 );
- math_FunctionSetRoot paramSearch( *this, tol );
-
- int nbLoops = 0;
- while ( myValues[0] > 1e-1 && nbLoops++ < 10 ) {
- paramSearch.Perform ( *this, start, low, up );
- if ( !paramSearch.IsDone() ) {
- //MESSAGE( " !paramSearch.IsDone() " );
- }
- else {
- //MESSAGE( " NB ITERATIONS: " << paramSearch.NbIterations() );
- }
- start( 1 ) = myParam.X();
- start( 2 ) = myParam.Y();
- start( 3 ) = myParam.Z();
- //MESSAGE( "Distance: " << ( SQRT_FUNC ? sqrt(myValues[0]) : myValues[0] ));
- }
-// MESSAGE( endl << myParam.X() << " " << myParam.Y() << " " << myParam.Z() << endl);
-// mySumDist += myValues[0];
-// MESSAGE( " TOTAL NB ITERATIONS: " << myNbIterations <<
-// " DIST: " << ( SQRT_FUNC ? sqrt(mySumDist) : mySumDist ));
-
-
- theParams = myParam;
-
- return true;
-}
-
-//=======================================================================
-//function : VertexParameters
-//purpose : return parameters of a vertex given by TShapeID
-//=======================================================================
-
-bool SMESH_Block::VertexParameters(const int theVertexID, gp_XYZ& theParams)
-{
- switch ( theVertexID ) {
- case ID_V000: theParams.SetCoord(0., 0., 0.); return true;
- case ID_V100: theParams.SetCoord(1., 0., 0.); return true;
- case ID_V110: theParams.SetCoord(1., 1., 0.); return true;
- case ID_V010: theParams.SetCoord(0., 1., 0.); return true;
- default:;
- }
- return false;
-}
-
-//=======================================================================
-//function : EdgeParameters
-//purpose : return parameters of a point given by theU on edge
-//=======================================================================
-
-bool SMESH_Block::EdgeParameters(const int theEdgeID, const double theU, gp_XYZ& theParams)
-{
- if ( IsEdgeID( theEdgeID )) {
- vector< int > vertexVec;
- GetEdgeVertexIDs( theEdgeID, vertexVec );
- VertexParameters( vertexVec[0], theParams );
- TEdge& e = myEdge[ theEdgeID - ID_Ex00 ];
- double param = ( theU - e.myFirst ) / ( e.myLast - e.myFirst );
- theParams.SetCoord( e.myCoordInd, param );
- return true;
- }
- return false;
-}
-
-//=======================================================================
-//function : GetStateNumber
-//purpose :
-//=======================================================================
-
-Standard_Integer SMESH_Block::GetStateNumber ()
-{
-// MESSAGE( endl<<"SMESH_Block::GetStateNumber( "<<myParam.X()<<", "<<
-// myParam.Y()<<", "<<myParam.Z()<<") DISTANCE: " << myValues[0]);
- return myValues[0] < 1e-1;
-}
-
-//=======================================================================
-//function : DumpShapeID
-//purpose : debug an id of a block sub-shape
-//=======================================================================
-
-#define CASEDUMP(id,strm) case id: strm << #id; break;
-
-ostream& SMESH_Block::DumpShapeID (const int id, ostream& stream)
-{
- switch ( id ) {
- CASEDUMP( ID_V000, stream );
- CASEDUMP( ID_V100, stream );
- CASEDUMP( ID_V010, stream );
- CASEDUMP( ID_V110, stream );
- CASEDUMP( ID_V001, stream );
- CASEDUMP( ID_V101, stream );
- CASEDUMP( ID_V011, stream );
- CASEDUMP( ID_V111, stream );
- CASEDUMP( ID_Ex00, stream );
- CASEDUMP( ID_Ex10, stream );
- CASEDUMP( ID_Ex01, stream );
- CASEDUMP( ID_Ex11, stream );
- CASEDUMP( ID_E0y0, stream );
- CASEDUMP( ID_E1y0, stream );
- CASEDUMP( ID_E0y1, stream );
- CASEDUMP( ID_E1y1, stream );
- CASEDUMP( ID_E00z, stream );
- CASEDUMP( ID_E10z, stream );
- CASEDUMP( ID_E01z, stream );
- CASEDUMP( ID_E11z, stream );
- CASEDUMP( ID_Fxy0, stream );
- CASEDUMP( ID_Fxy1, stream );
- CASEDUMP( ID_Fx0z, stream );
- CASEDUMP( ID_Fx1z, stream );
- CASEDUMP( ID_F0yz, stream );
- CASEDUMP( ID_F1yz, stream );
- CASEDUMP( ID_Shell, stream );
- default: stream << "ID_INVALID";
- }
- return stream;
-}
-
-//=======================================================================
-//function : GetShapeIDByParams
-//purpose : define an id of the block sub-shape by normlized point coord
-//=======================================================================
-
-int SMESH_Block::GetShapeIDByParams ( const gp_XYZ& theCoord )
-{
- // id ( 0 - 26 ) computation:
-
- // vertex ( 0 - 7 ) : id = 1*x + 2*y + 4*z
-
- // edge || X ( 8 - 11 ) : id = 8 + 1*y + 2*z
- // edge || Y ( 12 - 15 ): id = 1*x + 12 + 2*z
- // edge || Z ( 16 - 19 ): id = 1*x + 2*y + 16
-
- // face || XY ( 20 - 21 ): id = 8 + 12 + 1*z - 0
- // face || XZ ( 22 - 23 ): id = 8 + 1*y + 16 - 2
- // face || YZ ( 24 - 25 ): id = 1*x + 12 + 16 - 4
-
- static int iAddBnd[] = { 1, 2, 4 };
- static int iAddNotBnd[] = { 8, 12, 16 };
- static int iFaceSubst[] = { 0, 2, 4 };
-
- int id = 0;
- int iOnBoundary = 0;
- for ( int iCoord = 0; iCoord < 3; iCoord++ )
- {
- double val = theCoord.Coord( iCoord + 1 );
- if ( val == 0.0 )
- iOnBoundary++;
- else if ( val == 1.0 )
- id += iAddBnd[ iOnBoundary++ ];
- else
- id += iAddNotBnd[ iCoord ];
- }
- if ( iOnBoundary == 1 ) // face
- id -= iFaceSubst[ (id - 20) / 4 ];
- else if ( iOnBoundary == 0 ) // shell
- id = 26;
-
- if ( id > 26 || id < 0 ) {
- MESSAGE( "GetShapeIDByParams() = " << id
- <<" "<< theCoord.X() <<" "<< theCoord.Y() <<" "<< theCoord.Z() );
- }
-
- return id + 1; // shape ids start at 1
-}
-
-
-//=======================================================================
-//function : getOrderedEdges
-//purpose : return nb wires and a list of oredered edges
-//=======================================================================
-
-static int getOrderedEdges (const TopoDS_Face& theFace,
- const TopoDS_Vertex& theFirstVertex,
- list< TopoDS_Edge >& theEdges,
- list< int > & theNbVertexInWires)
-{
- // put wires in a list, so that an outer wire comes first
- list<TopoDS_Wire> aWireList;
- TopoDS_Wire anOuterWire = BRepTools::OuterWire( theFace );
- aWireList.push_back( anOuterWire );
- for ( TopoDS_Iterator wIt (theFace); wIt.More(); wIt.Next() )
- if ( !anOuterWire.IsSame( wIt.Value() ))
- aWireList.push_back( TopoDS::Wire( wIt.Value() ));
-
- // loop on edges of wires
- theNbVertexInWires.clear();
- list<TopoDS_Wire>::iterator wlIt = aWireList.begin();
- for ( ; wlIt != aWireList.end(); wlIt++ )
- {
- int iE;
- BRepTools_WireExplorer wExp( *wlIt, theFace );
- for ( iE = 0; wExp.More(); wExp.Next(), iE++ )
- {
- TopoDS_Edge edge = wExp.Current();
- edge = TopoDS::Edge( edge.Oriented( wExp.Orientation() ));
- theEdges.push_back( edge );
- }
- theNbVertexInWires.push_back( iE );
- iE = 0;
- if ( wlIt == aWireList.begin() && theEdges.size() > 1 ) { // the outer wire
- // orient closed edges
- list< TopoDS_Edge >::iterator eIt, eIt2;
- for ( eIt = theEdges.begin(); eIt != theEdges.end(); eIt++ )
- {
- TopoDS_Edge& edge = *eIt;
- if ( TopExp::FirstVertex( edge ).IsSame( TopExp::LastVertex( edge ) ))
- {
- eIt2 = eIt;
- bool isNext = ( eIt2 == theEdges.begin() );
- TopoDS_Edge edge2 = isNext ? *(++eIt2) : *(--eIt2);
- double f1,l1,f2,l2;
- Handle(Geom2d_Curve) c1 = BRep_Tool::CurveOnSurface( edge, theFace, f1,l1 );
- Handle(Geom2d_Curve) c2 = BRep_Tool::CurveOnSurface( edge2, theFace, f2,l2 );
- gp_Pnt2d pf = c1->Value( edge.Orientation() == TopAbs_FORWARD ? f1 : l1 );
- gp_Pnt2d pl = c1->Value( edge.Orientation() == TopAbs_FORWARD ? l1 : f1 );
- bool isFirst = ( edge2.Orientation() == TopAbs_FORWARD ? isNext : !isNext );
- gp_Pnt2d p2 = c2->Value( isFirst ? f2 : l2 );
- isFirst = ( p2.SquareDistance( pf ) < p2.SquareDistance( pl ));
- if ( isNext ? isFirst : !isFirst )
- edge.Reverse();
- }
- }
- // rotate theEdges until it begins from theFirstVertex
- if ( ! theFirstVertex.IsNull() )
- while ( !theFirstVertex.IsSame( TopExp::FirstVertex( theEdges.front(), true )))
- {
- theEdges.splice(theEdges.end(), theEdges,
- theEdges.begin(), ++ theEdges.begin());
- if ( iE++ > theNbVertexInWires.back() )
- break; // break infinite loop
- }
- }
- }
-
- return aWireList.size();
-}
-
-//=======================================================================
-//function : LoadMeshBlock
-//purpose : prepare to work with theVolume
-//=======================================================================
-
-#define gpXYZ(n) gp_XYZ(n->X(),n->Y(),n->Z())
-
-bool SMESH_Block::LoadMeshBlock(const SMDS_MeshVolume* theVolume,
- const int theNode000Index,
- const int theNode001Index,
- vector<const SMDS_MeshNode*>& theOrderedNodes)
-{
- MESSAGE(" ::LoadMeshBlock()");
-
- myNbIterations = 0;
- mySumDist = 0;
- myGridComputed = false;
-
- SMDS_VolumeTool vTool;
- if (!vTool.Set( theVolume ) || vTool.NbNodes() != 8 ||
- !vTool.IsLinked( theNode000Index, theNode001Index )) {
- MESSAGE(" Bad arguments ");
- return false;
- }
- vTool.SetExternalNormal();
- // In terms of indices used for access to nodes and faces in SMDS_VolumeTool:
- int V000, V100, V010, V110, V001, V101, V011, V111; // 8 vertices
- int Fxy0, Fxy1; // bottom and top faces
- // vertices of faces
- vector<int> vFxy0, vFxy1;
-
- V000 = theNode000Index;
- V001 = theNode001Index;
-
- // get faces sharing V000 and V001
- list<int> fV000, fV001;
- int i, iF, iE, iN;
- for ( iF = 0; iF < vTool.NbFaces(); ++iF ) {
- const int* nid = vTool.GetFaceNodesIndices( iF );
- for ( iN = 0; iN < 4; ++iN )
- if ( nid[ iN ] == V000 ) {
- fV000.push_back( iF );
- } else if ( nid[ iN ] == V001 ) {
- fV001.push_back( iF );
- }
- }
-
- // find the bottom (Fxy0), the top (Fxy1) faces
- list<int>::iterator fIt1, fIt2, Fxy0Pos;
- for ( fIt1 = fV000.begin(); fIt1 != fV000.end(); fIt1++) {
- fIt2 = std::find( fV001.begin(), fV001.end(), *fIt1 );
- if ( fIt2 != fV001.end() ) { // *fIt1 is in the both lists
- fV001.erase( fIt2 ); // erase Fx0z or F0yz from fV001
- } else { // *fIt1 is in fV000 only
- Fxy0Pos = fIt1; // points to Fxy0
- }
- }
- Fxy0 = *Fxy0Pos;
- Fxy1 = fV001.front();
- const SMDS_MeshNode** nn = vTool.GetNodes();
-
- // find bottom veritices, their order is that a face normal is external
- vFxy0.resize(4);
- const int* nid = vTool.GetFaceNodesIndices( Fxy0 );
- for ( i = 0; i < 4; ++i )
- if ( nid[ i ] == V000 )
- break;
- for ( iN = 0; iN < 4; ++iN, ++i ) {
- if ( i == 4 ) i = 0;
- vFxy0[ iN ] = nid[ i ];
- }
- // find top veritices, their order is that a face normal is external
- vFxy1.resize(4);
- nid = vTool.GetFaceNodesIndices( Fxy1 );
- for ( i = 0; i < 4; ++i )
- if ( nid[ i ] == V001 )
- break;
- for ( iN = 0; iN < 4; ++iN, ++i ) {
- if ( i == 4 ) i = 0;
- vFxy1[ iN ] = nid[ i ];
- }
- // find indices of the rest veritices
- V100 = vFxy0[3];
- V010 = vFxy0[1];
- V110 = vFxy0[2];
- V101 = vFxy1[1];
- V011 = vFxy1[3];
- V111 = vFxy1[2];
-
- // set points coordinates
- myPnt[ ID_V000 - 1 ] = gpXYZ( nn[ V000 ] );
- myPnt[ ID_V100 - 1 ] = gpXYZ( nn[ V100 ] );
- myPnt[ ID_V010 - 1 ] = gpXYZ( nn[ V010 ] );
- myPnt[ ID_V110 - 1 ] = gpXYZ( nn[ V110 ] );
- myPnt[ ID_V001 - 1 ] = gpXYZ( nn[ V001 ] );
- myPnt[ ID_V101 - 1 ] = gpXYZ( nn[ V101 ] );
- myPnt[ ID_V011 - 1 ] = gpXYZ( nn[ V011 ] );
- myPnt[ ID_V111 - 1 ] = gpXYZ( nn[ V111 ] );
-
- // fill theOrderedNodes
- theOrderedNodes.resize( 8 );
- theOrderedNodes[ 0 ] = nn[ V000 ];
- theOrderedNodes[ 1 ] = nn[ V100 ];
- theOrderedNodes[ 2 ] = nn[ V010 ];
- theOrderedNodes[ 3 ] = nn[ V110 ];
- theOrderedNodes[ 4 ] = nn[ V001 ];
- theOrderedNodes[ 5 ] = nn[ V101 ];
- theOrderedNodes[ 6 ] = nn[ V011 ];
- theOrderedNodes[ 7 ] = nn[ V111 ];
-
- // fill edges
- myEdge[ ID_Ex00 - ID_Ex00 ].myNodes[ 0 ] = myPnt[ ID_V000 - 1 ];
- myEdge[ ID_Ex00 - ID_Ex00 ].myNodes[ 1 ] = myPnt[ ID_V100 - 1 ];
-
- myEdge[ ID_Ex10 - ID_Ex00 ].myNodes[ 0 ] = myPnt[ ID_V010 - 1 ];
- myEdge[ ID_Ex10 - ID_Ex00 ].myNodes[ 1 ] = myPnt[ ID_V110 - 1 ];
-
- myEdge[ ID_Ex01 - ID_Ex00 ].myNodes[ 0 ] = myPnt[ ID_V001 - 1 ];
- myEdge[ ID_Ex01 - ID_Ex00 ].myNodes[ 1 ] = myPnt[ ID_V101 - 1 ];
-
- myEdge[ ID_Ex11 - ID_Ex00 ].myNodes[ 0 ] = myPnt[ ID_V011 - 1 ];
- myEdge[ ID_Ex11 - ID_Ex00 ].myNodes[ 1 ] = myPnt[ ID_V111 - 1 ];
-
- myEdge[ ID_E0y0 - ID_Ex00 ].myNodes[ 0 ] = myPnt[ ID_V000 - 1 ];
- myEdge[ ID_E0y0 - ID_Ex00 ].myNodes[ 1 ] = myPnt[ ID_V010 - 1 ];
-
- myEdge[ ID_E1y0 - ID_Ex00 ].myNodes[ 0 ] = myPnt[ ID_V100 - 1 ];
- myEdge[ ID_E1y0 - ID_Ex00 ].myNodes[ 1 ] = myPnt[ ID_V110 - 1 ];
-
- myEdge[ ID_E0y1 - ID_Ex00 ].myNodes[ 0 ] = myPnt[ ID_V001 - 1 ];
- myEdge[ ID_E0y1 - ID_Ex00 ].myNodes[ 1 ] = myPnt[ ID_V011 - 1 ];
-
- myEdge[ ID_E1y1 - ID_Ex00 ].myNodes[ 0 ] = myPnt[ ID_V101 - 1 ];
- myEdge[ ID_E1y1 - ID_Ex00 ].myNodes[ 1 ] = myPnt[ ID_V111 - 1 ];
-
- myEdge[ ID_E00z - ID_Ex00 ].myNodes[ 0 ] = myPnt[ ID_V000 - 1 ];
- myEdge[ ID_E00z - ID_Ex00 ].myNodes[ 1 ] = myPnt[ ID_V001 - 1 ];
-
- myEdge[ ID_E10z - ID_Ex00 ].myNodes[ 0 ] = myPnt[ ID_V100 - 1 ];
- myEdge[ ID_E10z - ID_Ex00 ].myNodes[ 1 ] = myPnt[ ID_V101 - 1 ];
-
- myEdge[ ID_E01z - ID_Ex00 ].myNodes[ 0 ] = myPnt[ ID_V010 - 1 ];
- myEdge[ ID_E01z - ID_Ex00 ].myNodes[ 1 ] = myPnt[ ID_V011 - 1 ];
-
- myEdge[ ID_E11z - ID_Ex00 ].myNodes[ 0 ] = myPnt[ ID_V110 - 1 ];
- myEdge[ ID_E11z - ID_Ex00 ].myNodes[ 1 ] = myPnt[ ID_V111 - 1 ];
-
- for ( iE = ID_Ex00; iE <= ID_E11z; ++iE )
- myEdge[ iE - ID_Ex00 ].myCoordInd = GetCoordIndOnEdge( iE );
-
- // fill faces corners
- for ( iF = ID_Fxy0; iF < ID_Shell; ++iF )
- {
- TFace& tFace = myFace[ iF - ID_Fxy0 ];
- vector< int > edgeIdVec(4, -1);
- GetFaceEdgesIDs( iF, edgeIdVec );
- tFace.myNodes[ 0 ] = myEdge[ edgeIdVec [ 0 ] - ID_Ex00 ].myNodes[ 1 ];
- tFace.myNodes[ 1 ] = myEdge[ edgeIdVec [ 0 ] - ID_Ex00 ].myNodes[ 0 ];
- tFace.myNodes[ 2 ] = myEdge[ edgeIdVec [ 1 ] - ID_Ex00 ].myNodes[ 0 ];
- tFace.myNodes[ 3 ] = myEdge[ edgeIdVec [ 1 ] - ID_Ex00 ].myNodes[ 1 ];
- tFace.myCoordInd[ 0 ] = GetCoordIndOnEdge( edgeIdVec[ 0 ] );
- tFace.myCoordInd[ 1 ] = GetCoordIndOnEdge( edgeIdVec[ 1 ] );
- tFace.myCoordInd[ 2 ] = GetCoordIndOnEdge( edgeIdVec[ 2 ] );
- tFace.myCoordInd[ 3 ] = GetCoordIndOnEdge( edgeIdVec[ 3 ] );
- }
-
- return true;
-}
-
-//=======================================================================
-//function : LoadBlockShapes
-//purpose : add sub-shapes of theBlock to theShapeIDMap so that they get
-// IDs acoording to enum TShapeID
-//=======================================================================
-
-bool SMESH_Block::LoadBlockShapes(const TopoDS_Shell& theShell,
- const TopoDS_Vertex& theVertex000,
- const TopoDS_Vertex& theVertex001,
- TopTools_IndexedMapOfOrientedShape& theShapeIDMap )
-{
- MESSAGE(" ::LoadBlockShapes()");
-
- myShell = theShell;
- myNbIterations = 0;
- mySumDist = 0;
- myGridComputed = false;
-
- // 8 vertices
- TopoDS_Shape V000, V100, V010, V110, V001, V101, V011, V111;
- // 12 edges
- TopoDS_Shape Ex00, Ex10, Ex01, Ex11;
- TopoDS_Shape E0y0, E1y0, E0y1, E1y1;
- TopoDS_Shape E00z, E10z, E01z, E11z;
- // 6 faces
- TopoDS_Shape Fxy0, Fx0z, F0yz, Fxy1, Fx1z, F1yz;
-
- // nb of faces bound to a vertex in TopTools_IndexedDataMapOfShapeListOfShape
- // filled by TopExp::MapShapesAndAncestors()
- const int NB_FACES_BY_VERTEX = 6;
-
- TopTools_IndexedDataMapOfShapeListOfShape vfMap;
- TopExp::MapShapesAndAncestors( myShell, TopAbs_VERTEX, TopAbs_FACE, vfMap );
- if ( vfMap.Extent() != 8 ) {
- MESSAGE(" Wrong nb of vertices in the block: " << vfMap.Extent() );
- return false;
- }
-
- V000 = theVertex000;
- V001 = theVertex001;
-
- if ( V000.IsNull() ) {
- // find vertex 000 - the one with smallest coordinates
- double minVal = DBL_MAX, minX, val;
- for ( int i = 1; i <= 8; i++ ) {
- const TopoDS_Vertex& v = TopoDS::Vertex( vfMap.FindKey( i ));
- gp_Pnt P = BRep_Tool::Pnt( v );
- val = P.X() + P.Y() + P.Z();
- if ( val < minVal || ( val == minVal && P.X() < minX )) {
- V000 = v;
- minVal = val;
- minX = P.X();
- }
- }
- // find vertex 001 - the one on the most vertical edge passing through V000
- TopTools_IndexedDataMapOfShapeListOfShape veMap;
- TopExp::MapShapesAndAncestors( myShell, TopAbs_VERTEX, TopAbs_EDGE, veMap );
- gp_Vec dir001 = gp::DZ();
- gp_Pnt p000 = BRep_Tool::Pnt( TopoDS::Vertex( V000 ));
- double maxVal = -DBL_MAX;
- TopTools_ListIteratorOfListOfShape eIt ( veMap.FindFromKey( V000 ));
- for ( ; eIt.More(); eIt.Next() ) {
- const TopoDS_Edge& e = TopoDS::Edge( eIt.Value() );
- TopoDS_Vertex v = TopExp::FirstVertex( e );
- if ( v.IsSame( V000 ))
- v = TopExp::LastVertex( e );
- val = dir001 * gp_Vec( p000, BRep_Tool::Pnt( v )).Normalized();
- if ( val > maxVal ) {
- V001 = v;
- maxVal = val;
- }
- }
- }
-
- // find the bottom (Fxy0), Fx0z and F0yz faces
-
- const TopTools_ListOfShape& f000List = vfMap.FindFromKey( V000 );
- const TopTools_ListOfShape& f001List = vfMap.FindFromKey( V001 );
- if (f000List.Extent() != NB_FACES_BY_VERTEX ||
- f001List.Extent() != NB_FACES_BY_VERTEX ) {
- MESSAGE(" LoadBlockShapes() " << f000List.Extent() << " " << f001List.Extent());
- return false;
- }
- TopTools_ListIteratorOfListOfShape f001It, f000It ( f000List );
- int i, j, iFound1, iFound2;
- for ( j = 0; f000It.More(); f000It.Next(), j++ )
- {
- if ( NB_FACES_BY_VERTEX == 6 && j % 2 ) continue; // each face encounters twice
- const TopoDS_Shape& F = f000It.Value();
- for ( i = 0, f001It.Initialize( f001List ); f001It.More(); f001It.Next(), i++ ) {
- if ( NB_FACES_BY_VERTEX == 6 && i % 2 ) continue; // each face encounters twice
- if ( F.IsSame( f001It.Value() ))
- break;
- }
- if ( f001It.More() ) // Fx0z or F0yz found
- if ( Fx0z.IsNull() ) {
- Fx0z = F;
- iFound1 = i;
- } else {
- F0yz = F;
- iFound2 = i;
- }
- else // F is the bottom face
- Fxy0 = F;
- }
- if ( Fxy0.IsNull() || Fx0z.IsNull() || F0yz.IsNull() ) {
- MESSAGE( Fxy0.IsNull() <<" "<< Fx0z.IsNull() <<" "<< F0yz.IsNull() );
- return false;
- }
-
- // choose the top face (Fxy1)
- for ( i = 0, f001It.Initialize( f001List ); f001It.More(); f001It.Next(), i++ ) {
- if ( NB_FACES_BY_VERTEX == 6 && i % 2 ) continue; // each face encounters twice
- if ( i != iFound1 && i != iFound2 )
- break;
- }
- Fxy1 = f001It.Value();
- if ( Fxy1.IsNull() ) {
- MESSAGE(" LoadBlockShapes() error ");
- return false;
- }
-
- // find bottom edges and veritices
- list< TopoDS_Edge > eList;
- list< int > nbVertexInWires;
- getOrderedEdges( TopoDS::Face( Fxy0 ), TopoDS::Vertex( V000 ), eList, nbVertexInWires );
- if ( nbVertexInWires.size() != 1 || nbVertexInWires.front() != 4 ) {
- MESSAGE(" LoadBlockShapes() error ");
- return false;
- }
- list< TopoDS_Edge >::iterator elIt = eList.begin();
- for ( i = 0; elIt != eList.end(); elIt++, i++ )
- switch ( i ) {
- case 0: E0y0 = *elIt; V010 = TopExp::LastVertex( *elIt, true ); break;
- case 1: Ex10 = *elIt; V110 = TopExp::LastVertex( *elIt, true ); break;
- case 2: E1y0 = *elIt; V100 = TopExp::LastVertex( *elIt, true ); break;
- case 3: Ex00 = *elIt; break;
- default:;
- }
- if ( i != 4 || E0y0.IsNull() || Ex10.IsNull() || E1y0.IsNull() || Ex00.IsNull() ) {
- MESSAGE(" LoadBlockShapes() error, eList.size()=" << eList.size());
- return false;
- }
-
-
- // find top edges and veritices
- eList.clear();
- getOrderedEdges( TopoDS::Face( Fxy1 ), TopoDS::Vertex( V001 ), eList, nbVertexInWires );
- if ( nbVertexInWires.size() != 1 || nbVertexInWires.front() != 4 ) {
- MESSAGE(" LoadBlockShapes() error ");
- return false;
- }
- for ( i = 0, elIt = eList.begin(); elIt != eList.end(); elIt++, i++ )
- switch ( i ) {
- case 0: Ex01 = *elIt; V101 = TopExp::LastVertex( *elIt, true ); break;
- case 1: E1y1 = *elIt; V111 = TopExp::LastVertex( *elIt, true ); break;
- case 2: Ex11 = *elIt; V011 = TopExp::LastVertex( *elIt, true ); break;
- case 3: E0y1 = *elIt; break;
- default:;
- }
- if ( i != 4 || Ex01.IsNull() || E1y1.IsNull() || Ex11.IsNull() || E0y1.IsNull() ) {
- MESSAGE(" LoadBlockShapes() error, eList.size()=" << eList.size());
- return false;
- }
-
- // swap Fx0z and F0yz if necessary
- TopExp_Explorer exp( Fx0z, TopAbs_VERTEX );
- for ( ; exp.More(); exp.Next() ) // Fx0z shares V101 and V100
- if ( V101.IsSame( exp.Current() ) || V100.IsSame( exp.Current() ))
- break; // V101 or V100 found
- if ( !exp.More() ) { // not found
- TopoDS_Shape f = Fx0z; Fx0z = F0yz; F0yz = f;
- }
-
- // find Fx1z and F1yz faces
- const TopTools_ListOfShape& f111List = vfMap.FindFromKey( V111 );
- const TopTools_ListOfShape& f110List = vfMap.FindFromKey( V110 );
- if (f111List.Extent() != NB_FACES_BY_VERTEX ||
- f110List.Extent() != NB_FACES_BY_VERTEX ) {
- MESSAGE(" LoadBlockShapes() " << f111List.Extent() << " " << f110List.Extent());
- return false;
- }
- TopTools_ListIteratorOfListOfShape f111It, f110It ( f110List);
- for ( j = 0 ; f110It.More(); f110It.Next(), j++ ) {
- if ( NB_FACES_BY_VERTEX == 6 && j % 2 ) continue; // each face encounters twice
- const TopoDS_Shape& F = f110It.Value();
- for ( i = 0, f111It.Initialize( f111List ); f111It.More(); f111It.Next(), i++ ) {
- if ( NB_FACES_BY_VERTEX == 6 && i % 2 ) continue; // each face encounters twice
- if ( F.IsSame( f111It.Value() )) { // Fx1z or F1yz found
- if ( Fx1z.IsNull() )
- Fx1z = F;
- else
- F1yz = F;
- }
- }
- }
- if ( Fx1z.IsNull() || F1yz.IsNull() ) {
- MESSAGE(" LoadBlockShapes() error ");
- return false;
- }
-
- // swap Fx1z and F1yz if necessary
- for ( exp.Init( Fx1z, TopAbs_VERTEX ); exp.More(); exp.Next() )
- if ( V010.IsSame( exp.Current() ) || V011.IsSame( exp.Current() ))
- break;
- if ( !exp.More() ) {
- TopoDS_Shape f = Fx1z; Fx1z = F1yz; F1yz = f;
- }
-
- // find vertical edges
- for ( exp.Init( Fx0z, TopAbs_EDGE ); exp.More(); exp.Next() ) {
- const TopoDS_Edge& edge = TopoDS::Edge( exp.Current() );
- const TopoDS_Shape& vFirst = TopExp::FirstVertex( edge, true );
- if ( vFirst.IsSame( V001 ))
- E00z = edge;
- else if ( vFirst.IsSame( V100 ))
- E10z = edge;
- }
- if ( E00z.IsNull() || E10z.IsNull() ) {
- MESSAGE(" LoadBlockShapes() error ");
- return false;
- }
- for ( exp.Init( Fx1z, TopAbs_EDGE ); exp.More(); exp.Next() ) {
- const TopoDS_Edge& edge = TopoDS::Edge( exp.Current() );
- const TopoDS_Shape& vFirst = TopExp::FirstVertex( edge, true );
- if ( vFirst.IsSame( V111 ))
- E11z = edge;
- else if ( vFirst.IsSame( V010 ))
- E01z = edge;
- }
- if ( E01z.IsNull() || E11z.IsNull() ) {
- MESSAGE(" LoadBlockShapes() error ");
- return false;
- }
-
- // load shapes in theShapeIDMap
-
- theShapeIDMap.Clear();
-
- theShapeIDMap.Add(V000.Oriented( TopAbs_FORWARD ));
- theShapeIDMap.Add(V100.Oriented( TopAbs_FORWARD ));
- theShapeIDMap.Add(V010.Oriented( TopAbs_FORWARD ));
- theShapeIDMap.Add(V110.Oriented( TopAbs_FORWARD ));
- theShapeIDMap.Add(V001.Oriented( TopAbs_FORWARD ));
- theShapeIDMap.Add(V101.Oriented( TopAbs_FORWARD ));
- theShapeIDMap.Add(V011.Oriented( TopAbs_FORWARD ));
- theShapeIDMap.Add(V111.Oriented( TopAbs_FORWARD ));
-
- theShapeIDMap.Add(Ex00);
- theShapeIDMap.Add(Ex10);
- theShapeIDMap.Add(Ex01);
- theShapeIDMap.Add(Ex11);
-
- theShapeIDMap.Add(E0y0);
- theShapeIDMap.Add(E1y0);
- theShapeIDMap.Add(E0y1);
- theShapeIDMap.Add(E1y1);
-
- theShapeIDMap.Add(E00z);
- theShapeIDMap.Add(E10z);
- theShapeIDMap.Add(E01z);
- theShapeIDMap.Add(E11z);
-
- theShapeIDMap.Add(Fxy0);
- theShapeIDMap.Add(Fxy1);
- theShapeIDMap.Add(Fx0z);
- theShapeIDMap.Add(Fx1z);
- theShapeIDMap.Add(F0yz);
- theShapeIDMap.Add(F1yz);
-
- theShapeIDMap.Add(myShell);
-
- if ( theShapeIDMap.Extent() != 27 ) {
- MESSAGE("LoadBlockShapes() " << theShapeIDMap.Extent() );
- return false;
- }
-
- // store shapes geometry
- for ( int shapeID = 1; shapeID < theShapeIDMap.Extent(); shapeID++ )
- {
- const TopoDS_Shape& S = theShapeIDMap( shapeID );
- switch ( S.ShapeType() )
- {
- case TopAbs_VERTEX: {
-
- if ( shapeID > ID_V111 ) {
- MESSAGE(" shapeID =" << shapeID );
- return false;
- }
- myPnt[ shapeID - ID_V000 ] =
- BRep_Tool::Pnt( TopoDS::Vertex( S )).XYZ();
- break;
- }
- case TopAbs_EDGE: {
-
- const TopoDS_Edge& edge = TopoDS::Edge( S );
- if ( shapeID < ID_Ex00 || shapeID > ID_E11z || edge.IsNull() ) {
- MESSAGE(" shapeID =" << shapeID );
- return false;
- }
- TEdge& tEdge = myEdge[ shapeID - ID_Ex00 ];
- tEdge.myCoordInd = GetCoordIndOnEdge( shapeID );
- TopLoc_Location loc;
- tEdge.myC3d = BRep_Tool::Curve( edge, loc, tEdge.myFirst, tEdge.myLast );
- if ( !IsForwardEdge( edge, theShapeIDMap ))
- Swap( tEdge.myFirst, tEdge.myLast );
- tEdge.myTrsf = loc;
- break;
- }
- case TopAbs_FACE: {
-
- const TopoDS_Face& face = TopoDS::Face( S );
- if ( shapeID < ID_Fxy0 || shapeID > ID_F1yz || face.IsNull() ) {
- MESSAGE(" shapeID =" << shapeID );
- return false;
- }
- TFace& tFace = myFace[ shapeID - ID_Fxy0 ];
- // pcurves
- vector< int > edgeIdVec(4, -1);
- GetFaceEdgesIDs( shapeID, edgeIdVec );
- for ( int iE = 0; iE < 4; iE++ ) // loop on 4 edges
- {
- const TopoDS_Edge& edge = TopoDS::Edge( theShapeIDMap( edgeIdVec[ iE ]));
- tFace.myCoordInd[ iE ] = GetCoordIndOnEdge( edgeIdVec[ iE ] );
- tFace.myC2d[ iE ] =
- BRep_Tool::CurveOnSurface( edge, face, tFace.myFirst[iE], tFace.myLast[iE] );
- if ( !IsForwardEdge( edge, theShapeIDMap ))
- Swap( tFace.myFirst[ iE ], tFace.myLast[ iE ] );
- }
- // 2d corners
- tFace.myCorner[ 0 ] = tFace.myC2d[ 0 ]->Value( tFace.myFirst[0] ).XY();
- tFace.myCorner[ 1 ] = tFace.myC2d[ 0 ]->Value( tFace.myLast[0] ).XY();
- tFace.myCorner[ 2 ] = tFace.myC2d[ 1 ]->Value( tFace.myLast[1] ).XY();
- tFace.myCorner[ 3 ] = tFace.myC2d[ 1 ]->Value( tFace.myFirst[1] ).XY();
- // sufrace
- TopLoc_Location loc;
- tFace.myS = BRep_Tool::Surface( face, loc );
- tFace.myTrsf = loc;
- break;
- }
- default: break;
- }
- } // loop on shapes in theShapeIDMap
-
- return true;
-}
-
-//=======================================================================
-//function : GetFaceEdgesIDs
-//purpose : return edges IDs in the order u0, u1, 0v, 1v
-// u0 means "|| u, v == 0"
-//=======================================================================
-
-void SMESH_Block::GetFaceEdgesIDs (const int faceID, vector< int >& edgeVec )
-{
- edgeVec.resize( 4 );
- switch ( faceID ) {
- case ID_Fxy0:
- edgeVec[ 0 ] = ID_Ex00;
- edgeVec[ 1 ] = ID_Ex10;
- edgeVec[ 2 ] = ID_E0y0;
- edgeVec[ 3 ] = ID_E1y0;
- break;
- case ID_Fxy1:
- edgeVec[ 0 ] = ID_Ex01;
- edgeVec[ 1 ] = ID_Ex11;
- edgeVec[ 2 ] = ID_E0y1;
- edgeVec[ 3 ] = ID_E1y1;
- break;
- case ID_Fx0z:
- edgeVec[ 0 ] = ID_Ex00;
- edgeVec[ 1 ] = ID_Ex01;
- edgeVec[ 2 ] = ID_E00z;
- edgeVec[ 3 ] = ID_E10z;
- break;
- case ID_Fx1z:
- edgeVec[ 0 ] = ID_Ex10;
- edgeVec[ 1 ] = ID_Ex11;
- edgeVec[ 2 ] = ID_E01z;
- edgeVec[ 3 ] = ID_E11z;
- break;
- case ID_F0yz:
- edgeVec[ 0 ] = ID_E0y0;
- edgeVec[ 1 ] = ID_E0y1;
- edgeVec[ 2 ] = ID_E00z;
- edgeVec[ 3 ] = ID_E01z;
- break;
- case ID_F1yz:
- edgeVec[ 0 ] = ID_E1y0;
- edgeVec[ 1 ] = ID_E1y1;
- edgeVec[ 2 ] = ID_E10z;
- edgeVec[ 3 ] = ID_E11z;
- break;
- default:
- MESSAGE(" GetFaceEdgesIDs(), wrong face ID: " << faceID );
- }
-}
-
-//=======================================================================
-//function : GetEdgeVertexIDs
-//purpose : return vertex IDs of an edge
-//=======================================================================
-
-void SMESH_Block::GetEdgeVertexIDs (const int edgeID, vector< int >& vertexVec )
-{
- vertexVec.resize( 2 );
- switch ( edgeID ) {
-
- case ID_Ex00:
- vertexVec[ 0 ] = ID_V000;
- vertexVec[ 1 ] = ID_V100;
- break;
- case ID_Ex10:
- vertexVec[ 0 ] = ID_V010;
- vertexVec[ 1 ] = ID_V110;
- break;
- case ID_Ex01:
- vertexVec[ 0 ] = ID_V001;
- vertexVec[ 1 ] = ID_V101;
- break;
- case ID_Ex11:
- vertexVec[ 0 ] = ID_V011;
- vertexVec[ 1 ] = ID_V111;
- break;
-
- case ID_E0y0:
- vertexVec[ 0 ] = ID_V000;
- vertexVec[ 1 ] = ID_V010;
- break;
- case ID_E1y0:
- vertexVec[ 0 ] = ID_V100;
- vertexVec[ 1 ] = ID_V110;
- break;
- case ID_E0y1:
- vertexVec[ 0 ] = ID_V001;
- vertexVec[ 1 ] = ID_V011;
- break;
- case ID_E1y1:
- vertexVec[ 0 ] = ID_V101;
- vertexVec[ 1 ] = ID_V111;
- break;
-
- case ID_E00z:
- vertexVec[ 0 ] = ID_V000;
- vertexVec[ 1 ] = ID_V001;
- break;
- case ID_E10z:
- vertexVec[ 0 ] = ID_V100;
- vertexVec[ 1 ] = ID_V101;
- break;
- case ID_E01z:
- vertexVec[ 0 ] = ID_V010;
- vertexVec[ 1 ] = ID_V011;
- break;
- case ID_E11z:
- vertexVec[ 0 ] = ID_V110;
- vertexVec[ 1 ] = ID_V111;
- break;
- default:
- MESSAGE(" GetEdgeVertexIDs(), wrong edge ID: " << edgeID );
- }
-}
-
+++ /dev/null
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-// File : SMESH_Block.hxx
-// Created : Tue Nov 30 12:42:18 2004
-// Author : Edward AGAPOV (eap)
-
-
-#ifndef SMESH_Block_HeaderFile
-#define SMESH_Block_HeaderFile
-
-#include <Geom2d_Curve.hxx>
-#include <Geom_Curve.hxx>
-#include <Geom_Surface.hxx>
-#include <TopExp.hxx>
-#include <TopTools_IndexedMapOfOrientedShape.hxx>
-#include <TopoDS_Edge.hxx>
-#include <TopoDS_Shell.hxx>
-#include <TopoDS_Vertex.hxx>
-#include <gp_Pnt.hxx>
-#include <gp_Trsf.hxx>
-#include <gp_XY.hxx>
-#include <gp_XYZ.hxx>
-#include <math_FunctionSetWithDerivatives.hxx>
-#include <math_Matrix.hxx>
-#include <math_Vector.hxx>
-
-#include <ostream>
-#include <vector>
-
-class SMDS_MeshVolume;
-class SMDS_MeshNode;
-
-// =========================================================
-// class calculating coordinates of 3D points by normalized
-// parameters inside the block and vice versa
-// =========================================================
-
-class SMESH_Block: public math_FunctionSetWithDerivatives
-{
- public:
- enum TShapeID { // ids of the block sub-shapes
- ID_NONE = 0,
-
- ID_V000 = 1, ID_V100, ID_V010, ID_V110, ID_V001, ID_V101, ID_V011, ID_V111,
-
- ID_Ex00, ID_Ex10, ID_Ex01, ID_Ex11,
- ID_E0y0, ID_E1y0, ID_E0y1, ID_E1y1,
- ID_E00z, ID_E10z, ID_E01z, ID_E11z,
-
- ID_Fxy0, ID_Fxy1, ID_Fx0z, ID_Fx1z, ID_F0yz, ID_F1yz,
-
- ID_Shell
- };
-
-
- public: // methods about ids of the block sub-shapes
-
- static int NbVertices() { return 8; }
- static int NbEdges() { return 12; }
- static int NbFaces() { return 6; }
- static int NbSubShapes() { return ID_Shell; }
- // to avoid magic numbers when allocating memory for subshapes
-
- static inline bool IsVertexID( int theShapeID )
- { return ( theShapeID >= ID_V000 && theShapeID <= ID_V111 ); }
-
- static inline bool IsEdgeID( int theShapeID )
- { return ( theShapeID >= ID_Ex00 && theShapeID <= ID_E11z ); }
-
- static inline bool IsFaceID( int theShapeID )
- { return ( theShapeID >= ID_Fxy0 && theShapeID <= ID_F1yz ); }
-
- static int ShapeIndex( int theShapeID )
- {
- if ( IsVertexID( theShapeID )) return theShapeID - ID_V000;
- if ( IsEdgeID( theShapeID )) return theShapeID - ID_Ex00;
- if ( IsFaceID( theShapeID )) return theShapeID - ID_Fxy0;
- return 0;
- }
- // return index [0-...] for each type of sub-shapes,
- // for example :
- // ShapeIndex( ID_Ex00 ) == 0
- // ShapeIndex( ID_Ex10 ) == 1
-
- static void GetFaceEdgesIDs (const int faceID, vector< int >& edgeVec );
- // return edges IDs of a face in the order u0, u1, 0v, 1v
-
- static void GetEdgeVertexIDs (const int edgeID, vector< int >& vertexVec );
- // return vertex IDs of an edge
-
- static int GetCoordIndOnEdge (const int theEdgeID)
- { return (theEdgeID < ID_E0y0) ? 1 : (theEdgeID < ID_E00z) ? 2 : 3; }
- // return an index of a coordinate which varies along the edge
-
- static double* GetShapeCoef (const int theShapeID);
- // for theShapeID( TShapeID ), returns 3 coefficients used
- // to compute an addition of an on-theShape point to coordinates
- // of an in-shell point. If an in-shell point has parameters (Px,Py,Pz),
- // then the addition of a point P is computed as P*kx*ky*kz and ki is
- // defined by the returned coef like this:
- // ki = (coef[i] == 0) ? 1 : (coef[i] < 0) ? 1 - Pi : Pi
-
- static int GetShapeIDByParams ( const gp_XYZ& theParams );
- // define an id of the block sub-shape by point parameters
-
- static ostream& DumpShapeID (const int theBlockShapeID, ostream& stream);
- // DEBUG: dump an id of a block sub-shape
-
-
- public: // initialization
-
- SMESH_Block (): myNbIterations(0), mySumDist(0.) {}
-
- bool LoadBlockShapes(const TopoDS_Shell& theShell,
- const TopoDS_Vertex& theVertex000,
- const TopoDS_Vertex& theVertex001,
- TopTools_IndexedMapOfOrientedShape& theShapeIDMap );
- // add sub-shapes of theBlock to theShapeIDMap so that they get
- // IDs acoording to enum TShapeID
-
- bool LoadMeshBlock(const SMDS_MeshVolume* theVolume,
- const int theNode000Index,
- const int theNode001Index,
- vector<const SMDS_MeshNode*>& theOrderedNodes);
- // prepare to work with theVolume and
- // return nodes in the order of TShapeID enum
-
-
- public: // define coordinates by parameters
-
- bool VertexPoint( const int theVertexID, gp_XYZ& thePoint ) const {
- if ( !IsVertexID( theVertexID )) return false;
- thePoint = myPnt[ theVertexID - ID_V000 ]; return true;
- }
- // return vertex coordinates, parameters are defined by theVertexID
-
- bool EdgePoint( const int theEdgeID, const gp_XYZ& theParams, gp_XYZ& thePoint ) const {
- if ( !IsEdgeID( theEdgeID )) return false;
- thePoint = myEdge[ theEdgeID - ID_Ex00 ].Point( theParams ); return true;
- }
- // return coordinates of a point on edge
-
- bool FacePoint( const int theFaceID, const gp_XYZ& theParams, gp_XYZ& thePoint ) const {
- if ( !IsFaceID ( theFaceID )) return false;
- thePoint = myFace[ theFaceID - ID_Fxy0 ].Point( theParams ); return true;
- }
- // return coordinates of a point on face
-
- bool ShellPoint( const gp_XYZ& theParams, gp_XYZ& thePoint ) const;
- // return coordinates of a point in shell
-
- static bool ShellPoint(const gp_XYZ& theParams,
- const vector<gp_XYZ>& thePointOnShape,
- gp_XYZ& thePoint );
- // computes coordinates of a point in shell by points on sub-shapes;
- // thePointOnShape[ subShapeID ] must be a point on a subShape;
- // thePointOnShape.size() == ID_Shell, thePointOnShape[0] not used
-
-
- public: // define parameters by coordinates
-
- bool ComputeParameters (const gp_Pnt& thePoint,
- gp_XYZ& theParams,
- const int theShapeID = ID_Shell);
- // compute point parameters in the block.
- // Note: for edges, it is better to use EdgeParameters()
-
- bool VertexParameters(const int theVertexID, gp_XYZ& theParams);
- // return parameters of a vertex given by TShapeID
-
- bool EdgeParameters(const int theEdgeID, const double theU, gp_XYZ& theParams);
- // return parameters of a point given by theU on edge
-
-
- public: // services
-
- static bool IsForwardEdge (const TopoDS_Edge & theEdge,
- TopTools_IndexedMapOfOrientedShape& theShapeIDMap) {
- int v1ID = theShapeIDMap.FindIndex( TopExp::FirstVertex( theEdge ).Oriented( TopAbs_FORWARD ));
- int v2ID = theShapeIDMap.FindIndex( TopExp::LastVertex( theEdge ).Oriented( TopAbs_FORWARD ));
- return ( v1ID < v2ID );
- }
- // Return true if an in-block parameter increases along theEdge curve
-
- static void Swap(double& a, double& b) { double tmp = a; a = b; b = tmp; }
-
-
- public:
- // methods of math_FunctionSetWithDerivatives used internally
- // to define parameters by coordinates
- Standard_Integer NbVariables() const;
- Standard_Integer NbEquations() const;
- Standard_Boolean Value(const math_Vector& X,math_Vector& F) ;
- Standard_Boolean Derivatives(const math_Vector& X,math_Matrix& D) ;
- Standard_Boolean Values(const math_Vector& X,math_Vector& F,math_Matrix& D) ;
- Standard_Integer GetStateNumber ();
-
- private:
-
- struct TEdge {
- int myCoordInd;
- double myFirst;
- double myLast;
- Handle(Geom_Curve) myC3d;
- gp_Trsf myTrsf;
- double GetU( const gp_XYZ& theParams ) const;
- gp_XYZ Point( const gp_XYZ& theParams ) const;
- // if mesh volume
- gp_XYZ myNodes[2];
- };
-
- struct TFace {
- // 4 edges in the order u0, u1, 0v, 1v
- int myCoordInd[ 4 ];
- double myFirst [ 4 ];
- double myLast [ 4 ];
- Handle(Geom2d_Curve) myC2d [ 4 ];
- // 4 corner points in the order 00, 10, 11, 01
- gp_XY myCorner [ 4 ];
- // surface
- Handle(Geom_Surface) myS;
- gp_Trsf myTrsf;
- gp_XY GetUV( const gp_XYZ& theParams ) const;
- gp_XYZ Point( const gp_XYZ& theParams ) const;
- int GetUInd() const { return myCoordInd[ 0 ]; }
- int GetVInd() const { return myCoordInd[ 2 ]; }
- void GetCoefs( int i, const gp_XYZ& theParams, double& eCoef, double& vCoef ) const;
- // if mesh volume
- gp_XYZ myNodes[4];
- };
-
- TopoDS_Shell myShell;
- // geometry in the order as in TShapeID:
- // 8 vertices
- gp_XYZ myPnt[ 8 ];
- // 12 edges
- TEdge myEdge[ 12 ];
- // 6 faces
- TFace myFace[ 6 ];
-
- // for param computation
-
- int myFaceIndex;
- double myFaceParam;
- int myNbIterations;
- double mySumDist;
-
- gp_XYZ myPoint; // the given point
- gp_XYZ myParam; // the best parameters guess
- double myValues[ 4 ]; // values computed at myParam
-
- typedef pair<gp_XYZ,gp_XYZ> TxyzPair;
- TxyzPair my3x3x3GridNodes[ 27 ];
- bool myGridComputed;
-};
-
-
-#endif
+++ /dev/null
-// SMESH SMESH : implementaion of SMESH idl descriptions
-//
-// Copyright (C) 2004 CEA
-//
-// 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.org
-//
-//
-//
-// File : SMESH_Group.cxx
-// Author : Michael Sazonov (OCC)
-// Module : SMESH
-// $Header$
-
-#include "SMESH_Group.hxx"
-#include "SMESH_Mesh.hxx"
-#include "SMESHDS_Group.hxx"
-#include "SMESHDS_GroupOnGeom.hxx"
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-SMESH_Group::SMESH_Group (int theID,
- const SMESH_Mesh* theMesh,
- const SMDSAbs_ElementType theType,
- const char* theName,
- const TopoDS_Shape& theShape)
- : myName(theName)
-{
- if ( theShape.IsNull() )
- myGroupDS = new SMESHDS_Group (theID,
- const_cast<SMESH_Mesh*>(theMesh)->GetMeshDS(),
- theType);
- else
- myGroupDS = new SMESHDS_GroupOnGeom (theID,
- const_cast<SMESH_Mesh*>(theMesh)->GetMeshDS(),
- theType,
- theShape);
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-SMESH_Group::~SMESH_Group ()
-{
- delete myGroupDS;
-}
+++ /dev/null
-// SMESH SMESH : implementaion of SMESH idl descriptions
-//
-// Copyright (C) 2004 CEA
-//
-// 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.org
-//
-//
-//
-// File : SMESH_Group.hxx
-// Author : Michael Sazonov (OCC)
-// Module : SMESH
-// $Header$
-
-#ifndef _SMESH_Group_HeaderFile
-#define _SMESH_Group_HeaderFile
-
-#include <SMDSAbs_ElementType.hxx>
-#include <string>
-#include <TopoDS_Shape.hxx>
-
-
-class SMESHDS_GroupBase;
-class SMESH_Mesh;
-
-class SMESH_Group
-{
- public:
-
- SMESH_Group (int theID,
- const SMESH_Mesh* theMesh,
- const SMDSAbs_ElementType theType,
- const char* theName,
- const TopoDS_Shape& theShape = TopoDS_Shape());
- ~SMESH_Group ();
-
- void SetName (const char* theName) { myName = theName; }
-
- const char* GetName () const { return myName.c_str(); }
-
- SMESHDS_GroupBase * GetGroupDS () { return myGroupDS; }
-
- private:
- SMESH_Group (const SMESH_Group& theOther);
- // prohibited copy constructor
- SMESH_Group& operator = (const SMESH_Group& theOther);
- // prohibited assign operator
-
- SMESHDS_GroupBase * myGroupDS;
- std::string myName;
-
-};
-
-#endif
+++ /dev/null
-// SMESH SMESH : implementaion of SMESH idl descriptions
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESH_HypoFilter.cxx
-// Module : SMESH
-// $Header$
-
-#include "SMESH_HypoFilter.hxx"
-
-#include "SMESH_Hypothesis.hxx"
-#include "SMESH_subMesh.hxx"
-
-using namespace std;
-
-
-//=======================================================================
-//function : NamePredicate::Value
-//purpose :
-//=======================================================================
-
-bool SMESH_HypoFilter::NamePredicate::IsOk (const SMESH_Hypothesis* aHyp,
- const TopoDS_Shape& /*aShape*/ ) const
-{
- return ( _name == aHyp->GetName() );
-}
-
-//=======================================================================
-//function : TypePredicate::Value
-//purpose :
-//=======================================================================
-
-int SMESH_HypoFilter::TypePredicate::Value( const SMESH_Hypothesis* aHyp ) const
-{
- return aHyp->GetType();
-};
-
-//=======================================================================
-//function : DimPredicate::Value
-//purpose :
-//=======================================================================
-
-int SMESH_HypoFilter::DimPredicate::Value( const SMESH_Hypothesis* aHyp ) const
-{
- return aHyp->GetDim();
-}
-
-//=======================================================================
-//function : ApplicablePredicate::IsOk
-//purpose :
-//=======================================================================
-
-bool SMESH_HypoFilter::ApplicablePredicate::IsOk(const SMESH_Hypothesis* aHyp,
- const TopoDS_Shape& /*aShape*/) const
-{
- return SMESH_subMesh::IsApplicableHypotesis( aHyp, (TopAbs_ShapeEnum)_shapeType );
-};
-
-//=======================================================================
-//function : ApplicablePredicate::ApplicablePredicate
-//purpose :
-//=======================================================================
-
-SMESH_HypoFilter::ApplicablePredicate::ApplicablePredicate( const TopoDS_Shape& theShape )
-{
- _shapeType = ( theShape.IsNull() ? TopAbs_SHAPE : theShape.ShapeType());
-}
-
-//=======================================================================
-//function : InstancePredicate::IsOk
-//purpose :
-//=======================================================================
-
-bool SMESH_HypoFilter::InstancePredicate::IsOk(const SMESH_Hypothesis* aHyp,
- const TopoDS_Shape& /*aShape*/) const
-{
- return _hypo == aHyp;
-}
-
-//=======================================================================
-//function : IsAssignedToPredicate::IsOk
-//purpose :
-//=======================================================================
-
-bool SMESH_HypoFilter::IsAssignedToPredicate::IsOk(const SMESH_Hypothesis* aHyp,
- const TopoDS_Shape& aShape) const
-{
- return ( !_mainShape.IsNull() && !aShape.IsNull() && _mainShape.IsSame( aShape ));
-}
-
-//=======================================================================
-//function : SMESH_HypoFilter
-//purpose :
-//=======================================================================
-
-SMESH_HypoFilter::SMESH_HypoFilter()
-{
-}
-
-//=======================================================================
-//function : SMESH_HypoFilter
-//purpose :
-//=======================================================================
-
-SMESH_HypoFilter::SMESH_HypoFilter( SMESH_HypoPredicate* aPredicate, bool notNagate )
-{
- add( notNagate ? AND : AND_NOT, aPredicate );
-}
-
-//=======================================================================
-//function : And
-//purpose :
-//=======================================================================
-
-SMESH_HypoFilter & SMESH_HypoFilter::And( SMESH_HypoPredicate* aPredicate )
-{
- add( AND, aPredicate );
- return *this;
-}
-
-//=======================================================================
-//function : AndNot
-//purpose :
-//=======================================================================
-
-SMESH_HypoFilter & SMESH_HypoFilter::AndNot( SMESH_HypoPredicate* aPredicate )
-{
- add( AND_NOT, aPredicate );
- return *this;
-}
-
-//=======================================================================
-//function : Or
-//purpose :
-//=======================================================================
-
-SMESH_HypoFilter & SMESH_HypoFilter::Or( SMESH_HypoPredicate* aPredicate )
-{
- add( OR, aPredicate );
- return *this;
-}
-
-//=======================================================================
-//function : OrNot
-//purpose : Return predicates
-//=======================================================================
-
-SMESH_HypoFilter & SMESH_HypoFilter::OrNot( SMESH_HypoPredicate* aPredicate )
-{
- add( OR_NOT, aPredicate );
- return *this;
-}
-
-//=======================================================================
-//function : Is
-//purpose :
-//=======================================================================
-
-SMESH_HypoPredicate* SMESH_HypoFilter::Is(const SMESH_Hypothesis* theHypo)
-{
- return new InstancePredicate( theHypo );
-}
-
-//=======================================================================
-//function : IsAlgo
-//purpose :
-//=======================================================================
-
-SMESH_HypoPredicate* SMESH_HypoFilter::IsAlgo()
-{
- return new TypePredicate( MORE, SMESHDS_Hypothesis::PARAM_ALGO );
-}
-
-//=======================================================================
-//function : IsGlobal
-//purpose :
-//=======================================================================
-
- SMESH_HypoPredicate* SMESH_HypoFilter::IsGlobal(const TopoDS_Shape& theMainShape)
-{
- return new IsAssignedToPredicate( theMainShape );
-}
-
-//=======================================================================
-//function : IsAssignedTo
-//purpose :
-//=======================================================================
-
- SMESH_HypoPredicate* SMESH_HypoFilter::IsAssignedTo(const TopoDS_Shape& theShape)
-{
- return new IsAssignedToPredicate( theShape );
-}
-
-//=======================================================================
-//function : HasName
-//purpose :
-//=======================================================================
-
-SMESH_HypoPredicate* SMESH_HypoFilter::HasName(const string & theName)
-{
- return new NamePredicate( theName );
-}
-
-//=======================================================================
-//function : HasDim
-//purpose :
-//=======================================================================
-
-SMESH_HypoPredicate* SMESH_HypoFilter::HasDim(const int theDim)
-{
- return new DimPredicate( EQUAL, theDim );
-}
-
-//=======================================================================
-//function : IsApplicableTo
-//purpose :
-//=======================================================================
-
-SMESH_HypoPredicate* SMESH_HypoFilter::IsApplicableTo(const TopoDS_Shape& theShape)
-{
- return new ApplicablePredicate( theShape );
-}
-
-//=======================================================================
-//function : HasType
-//purpose :
-//=======================================================================
-
-SMESH_HypoPredicate* SMESH_HypoFilter::HasType(const int theHypType)
-{
- return new TypePredicate( EQUAL, theHypType );
-}
-
-//=======================================================================
-//function : IsOk
-//purpose :
-//=======================================================================
-
-bool SMESH_HypoFilter::IsOk (const SMESH_Hypothesis* aHyp,
- const TopoDS_Shape& aShape) const
-{
- if ( myPredicates.empty() )
- return true;
-
- bool ok = ( myPredicates.front()->_logical_op <= AND_NOT );
- list<SMESH_HypoPredicate*>::const_iterator pred = myPredicates.begin();
- for ( ; pred != myPredicates.end(); ++pred )
- {
- bool ok2 = (*pred)->IsOk( aHyp, aShape );
- switch ( (*pred)->_logical_op ) {
- case AND: ok = ok && ok2; break;
- case AND_NOT: ok = ok && !ok2; break;
- case OR: ok = ok || ok2; break;
- case OR_NOT: ok = ok || !ok2; break;
- default:;
- }
- }
- return ok;
-}
-
-//=======================================================================
-//function : Init
-//purpose :
-//=======================================================================
-
-SMESH_HypoFilter & SMESH_HypoFilter::Init ( SMESH_HypoPredicate* aPredicate, bool notNagate )
-{
- list<SMESH_HypoPredicate*>::const_iterator pred = myPredicates.begin();
- for ( ; pred != myPredicates.end(); ++pred )
- delete *pred;
-
- add( notNagate ? AND : AND_NOT, aPredicate );
- return *this;
-}
-
-
-//=======================================================================
-//function : IsOk
-//purpose :
-//=======================================================================
-
-SMESH_HypoFilter::~SMESH_HypoFilter()
-{
- Init(0);
-}
-
+++ /dev/null
-// SMESH SMESH : implementaion of SMESH idl descriptions
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESH_HypoFilter.hxx
-// Module : SMESH
-// $Header$
-
-
-#ifndef SMESH_HypoFilter_HeaderFile
-#define SMESH_HypoFilter_HeaderFile
-
-// ===========================
-// Filter of SMESH_Hypothesis
-// ===========================
-
-#include <list>
-#include <string>
-#include <TopoDS_Shape.hxx>
-
-class SMESH_HypoFilter;
-class SMESH_Hypothesis;
-
-class SMESH_HypoPredicate {
- public:
- virtual bool IsOk(const SMESH_Hypothesis* aHyp,
- const TopoDS_Shape& aShape) const = 0;
- // check aHyp or/and aShape it is assigned to
- virtual ~SMESH_HypoPredicate() {}
- private:
- int _logical_op;
- friend class SMESH_HypoFilter;
-};
-
-class SMESH_HypoFilter: public SMESH_HypoPredicate
-{
- public:
- // Create and add predicates.
- // Added predicates will be destroyed by filter when it dies
- SMESH_HypoFilter();
- SMESH_HypoFilter( SMESH_HypoPredicate* aPredicate, bool notNagate = true );
- // notNagate==false means !aPredicate->IsOk()
- SMESH_HypoFilter & Init ( SMESH_HypoPredicate* aPredicate, bool notNagate = true );
- SMESH_HypoFilter & And ( SMESH_HypoPredicate* aPredicate );
- SMESH_HypoFilter & AndNot( SMESH_HypoPredicate* aPredicate );
- SMESH_HypoFilter & Or ( SMESH_HypoPredicate* aPredicate );
- SMESH_HypoFilter & OrNot ( SMESH_HypoPredicate* aPredicate );
-
- // Create predicates
- static SMESH_HypoPredicate* IsAlgo();
- static SMESH_HypoPredicate* IsApplicableTo(const TopoDS_Shape& theShape);
- static SMESH_HypoPredicate* IsAssignedTo(const TopoDS_Shape& theShape);
- static SMESH_HypoPredicate* Is(const SMESH_Hypothesis* theHypo);
- static SMESH_HypoPredicate* IsGlobal(const TopoDS_Shape& theMainShape);
- static SMESH_HypoPredicate* HasName(const std::string & theName);
- static SMESH_HypoPredicate* HasDim(const int theDim);
- static SMESH_HypoPredicate* HasType(const int theHypType);
-
- bool IsOk (const SMESH_Hypothesis* aHyp,
- const TopoDS_Shape& aShape) const;
- // check aHyp or/and aShape it is assigned to
-
- ~SMESH_HypoFilter();
-
-
- protected:
- // fields
-
- std::list<SMESH_HypoPredicate*> myPredicates;
-
- // private methods
-
- enum Logical { AND, AND_NOT, OR, OR_NOT };
- enum Comparison { EQUAL, NOT_EQUAL, MORE, LESS };
-
- SMESH_HypoFilter(const SMESH_HypoFilter& other){}
-
- void add( Logical bool_op, SMESH_HypoPredicate* pred )
- {
- if ( pred ) {
- pred->_logical_op = bool_op;
- myPredicates.push_back( pred );
- }
- }
-
- // predicates implementation
-
- template <typename TValue>
- struct templPredicate: public SMESH_HypoPredicate {
- Comparison _comp;
- TValue _val;
- virtual TValue Value(const SMESH_Hypothesis* aHyp) const = 0;
- virtual bool IsOk(const SMESH_Hypothesis* aHyp, const TopoDS_Shape& ) const
- {
- if ( _comp == EQUAL ) return _val == Value( aHyp );
- else if ( _comp == NOT_EQUAL ) return _val != Value( aHyp );
- else if ( _comp == MORE ) return _val < Value( aHyp );
- else return _val > Value( aHyp );
- }
- };
-
- struct NamePredicate : public SMESH_HypoPredicate {
- std::string _name;
- NamePredicate( std::string name ): _name(name){}
- bool IsOk(const SMESH_Hypothesis* aHyp,
- const TopoDS_Shape& aShape) const;
- };
-
- struct TypePredicate : public templPredicate< int > {
- TypePredicate( Comparison comp, int hypType )
- { _comp = comp; _val = hypType; }
- int Value( const SMESH_Hypothesis* aHyp ) const;
- };
-
- struct DimPredicate : public templPredicate< int > {
- DimPredicate( Comparison comp, int dim )
- { _comp = comp; _val = dim; }
- int Value( const SMESH_Hypothesis* aHyp ) const;
- };
-
- struct ApplicablePredicate : public SMESH_HypoPredicate {
- int _shapeType;
- ApplicablePredicate( const TopoDS_Shape& theShape );
- bool IsOk(const SMESH_Hypothesis* aHyp,
- const TopoDS_Shape& aShape) const;
- };
-
- struct InstancePredicate : public SMESH_HypoPredicate {
- const SMESH_Hypothesis* _hypo;
- InstancePredicate( const SMESH_Hypothesis* hypo ):_hypo(hypo){}
- bool IsOk(const SMESH_Hypothesis* aHyp,
- const TopoDS_Shape& aShape) const;
- };
-
- struct IsAssignedToPredicate : public SMESH_HypoPredicate {
- TopoDS_Shape _mainShape;
- IsAssignedToPredicate( const TopoDS_Shape& mainShape ):_mainShape(mainShape){}
- bool IsOk(const SMESH_Hypothesis* aHyp,
- const TopoDS_Shape& aShape) const;
- };
-
-};
-
-
-#endif
+++ /dev/null
-// SMESH SMESH : implementaion of SMESH idl descriptions
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESH_Hypothesis.cxx
-// Author : Paul RASCLE, EDF
-// Module : SMESH
-// $Header$
-
-using namespace std;
-using namespace std;
-#include "SMESH_Hypothesis.hxx"
-#include "SMESH_Gen.hxx"
-#include "SMESH_subMesh.hxx"
-#include "utilities.h"
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-SMESH_Hypothesis::SMESH_Hypothesis(int hypId,
- int studyId,
- SMESH_Gen* gen) : SMESHDS_Hypothesis(hypId)
-{
- //MESSAGE("SMESH_Hypothesis::SMESH_Hypothesis");
- _gen = gen;
- _studyId = studyId;
- StudyContextStruct* myStudyContext = _gen->GetStudyContext(_studyId);
- myStudyContext->mapHypothesis[_hypId] = this;
- _type = PARAM_ALGO;
- _shapeType = 0; // to be set by algo with TopAbs_Enum
- _param_algo_dim = -1; // to be set by algo parameter
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-SMESH_Hypothesis::~SMESH_Hypothesis()
-{
- MESSAGE("SMESH_Hypothesis::~SMESH_Hypothesis");
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-int SMESH_Hypothesis::GetDim() const
-{
- int dim = -1;
- switch (_type)
- {
- case ALGO_1D: dim = 1; break;
- case ALGO_2D: dim = 2; break;
- case ALGO_3D: dim = 3; break;
- case PARAM_ALGO: dim = _param_algo_dim; break;
- }
- return dim;
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-int SMESH_Hypothesis::GetShapeType() const
-{
- return _shapeType;
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-int SMESH_Hypothesis::GetStudyId() const
-{
- return _studyId;
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-void SMESH_Hypothesis::NotifySubMeshesHypothesisModification()
-{
- MESSAGE("SMESH_Hypothesis::NotifySubMeshesHypothesisModification");
-
- // for all meshes in study
-
- StudyContextStruct* myStudyContext = _gen->GetStudyContext(_studyId);
- map<int, SMESH_Mesh*>::iterator itm;
- for (itm = myStudyContext->mapMesh.begin();
- itm != myStudyContext->mapMesh.end();
- itm++)
- {
- SMESH_Mesh* mesh = (*itm).second;
- const list<SMESH_subMesh*>& subMeshes =
- mesh->GetSubMeshUsingHypothesis(this);
-
- //for all subMeshes using hypothesis
-
- list<SMESH_subMesh*>::const_iterator its;
- for (its = subMeshes.begin(); its != subMeshes.end(); its++)
- (*its)->ComputeStateEngine(SMESH_subMesh::MODIF_HYP);
- }
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-const char* SMESH_Hypothesis::GetLibName() const
-{
-// MESSAGE("SMESHDS_Hypothesis::GetLibName");
-// SCRUTE(_LibName);
-// SCRUTE(&_LibName);
- return _libName.c_str();
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-void SMESH_Hypothesis::SetLibName(const char* theLibName)
-{
-// MESSAGE("SMESHDS_Hypothesis::SetLibName");
- _libName = string(theLibName);
-}
+++ /dev/null
-// SMESH SMESH : implementaion of SMESH idl descriptions
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESH_Hypothesis.hxx
-// Author : Paul RASCLE, EDF
-// Module : SMESH
-// $Header$
-
-#ifndef _SMESH_HYPOTHESIS_HXX_
-#define _SMESH_HYPOTHESIS_HXX_
-
-#include "SMESHDS_Hypothesis.hxx"
-
-class SMESH_Gen;
-
-class SMESH_Hypothesis: public SMESHDS_Hypothesis
-{
-public:
- enum Hypothesis_Status // in the order of severity
- {
- HYP_OK,
- HYP_MISSING, // algo misses a hypothesis
- HYP_CONCURENT, // several applicable hypotheses
- HYP_BAD_PARAMETER,// hypothesis has a bad parameter value
- HYP_UNKNOWN_FATAL,// --- all statuses below should be considered as fatal
- // for Add/RemoveHypothesis operations
- HYP_INCOMPATIBLE, // hypothesis does not fit algo
- HYP_NOTCONFORM, // not conform mesh is produced appling a hypothesis
- HYP_ALREADY_EXIST,// such hypothesis already exist
- HYP_BAD_DIM // bad dimension
- };
- static bool IsStatusFatal(Hypothesis_Status theStatus)
- { return theStatus >= HYP_UNKNOWN_FATAL; }
-
- SMESH_Hypothesis(int hypId, int studyId, SMESH_Gen* gen);
- virtual ~SMESH_Hypothesis();
- int GetDim() const;
- int GetStudyId() const;
- void NotifySubMeshesHypothesisModification();
- int GetShapeType() const;
- const char* GetLibName() const;
- void SetLibName(const char* theLibName);
-
-protected:
- SMESH_Gen* _gen;
- int _studyId;
- int _shapeType;
- int _param_algo_dim;
-
-private:
- std::string _libName;
-};
-
-#endif
+++ /dev/null
-// SMESH SMESH : implementaion of SMESH idl descriptions
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESH_Mesh.cxx
-// Author : Paul RASCLE, EDF
-// Module : SMESH
-// $Header$
-
-#include "SMESH_Mesh.hxx"
-#include "SMESH_subMesh.hxx"
-#include "SMESH_Gen.hxx"
-#include "SMESH_Hypothesis.hxx"
-#include "SMESH_Group.hxx"
-#include "SMESH_HypoFilter.hxx"
-#include "SMESHDS_Group.hxx"
-#include "SMESHDS_Script.hxx"
-#include "SMESHDS_GroupOnGeom.hxx"
-#include "SMDS_MeshVolume.hxx"
-
-#include "utilities.h"
-
-#include "DriverMED_W_SMESHDS_Mesh.h"
-#include "DriverDAT_W_SMDS_Mesh.h"
-#include "DriverUNV_W_SMDS_Mesh.h"
-#include "DriverSTL_W_SMDS_Mesh.h"
-
-#include "DriverMED_R_SMESHDS_Mesh.h"
-#include "DriverUNV_R_SMDS_Mesh.h"
-#include "DriverSTL_R_SMDS_Mesh.h"
-
-#include <BRepTools_WireExplorer.hxx>
-#include <BRep_Builder.hxx>
-#include <gp_Pnt.hxx>
-
-#include <TCollection_AsciiString.hxx>
-#include <TopExp.hxx>
-#include <TopTools_ListOfShape.hxx>
-#include <TopTools_Array1OfShape.hxx>
-#include <TopTools_ListIteratorOfListOfShape.hxx>
-#include <TopTools_MapOfShape.hxx>
-
-#include <memory>
-
-#include "Utils_ExceptHandlers.hxx"
-
-#ifdef _DEBUG_
-static int MYDEBUG = 0;
-#else
-static int MYDEBUG = 0;
-#endif
-
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-SMESH_Mesh::SMESH_Mesh(int localId, int studyId, SMESH_Gen * gen, SMESHDS_Document * myDocument)
-: _groupId( 0 )
-{
- INFOS("SMESH_Mesh::SMESH_Mesh(int localId)");
- _id = localId;
- _studyId = studyId;
- _gen = gen;
- _myDocument = myDocument;
- _idDoc = _myDocument->NewMesh();
- _myMeshDS = _myDocument->GetMesh(_idDoc);
- _isShapeToMesh = false;
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-SMESH_Mesh::~SMESH_Mesh()
-{
- INFOS("SMESH_Mesh::~SMESH_Mesh");
-
- // delete groups
- map < int, SMESH_Group * >::iterator itg;
- for (itg = _mapGroup.begin(); itg != _mapGroup.end(); itg++) {
- SMESH_Group *aGroup = (*itg).second;
- delete aGroup;
- }
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-void SMESH_Mesh::ShapeToMesh(const TopoDS_Shape & aShape)
-{
- if(MYDEBUG) MESSAGE("SMESH_Mesh::ShapeToMesh");
-
- if ( !_myMeshDS->ShapeToMesh().IsNull() && aShape.IsNull() )
- {
- // removal of a shape to mesh, delete objects referring to sub-shapes:
- // - sub-meshes
- map <int, SMESH_subMesh *>::iterator i_sm = _mapSubMesh.begin();
- for ( ; i_sm != _mapSubMesh.end(); ++i_sm )
- delete i_sm->second;
- _mapSubMesh.clear();
- // - groups on geometry
- map <int, SMESH_Group *>::iterator i_gr = _mapGroup.begin();
- while ( i_gr != _mapGroup.end() ) {
- if ( dynamic_cast<SMESHDS_GroupOnGeom*>( i_gr->second->GetGroupDS() )) {
- _myMeshDS->RemoveGroup( i_gr->second->GetGroupDS() );
- delete i_gr->second;
- _mapGroup.erase( i_gr++ );
- }
- else
- i_gr++;
- }
- _mapPropagationChains.Clear();
- }
- else
- {
- if (_isShapeToMesh)
- throw SALOME_Exception(LOCALIZED ("a shape to mesh has already been defined"));
- }
- _isShapeToMesh = true;
- _myMeshDS->ShapeToMesh(aShape);
-
- // fill _mapAncestors
- _mapAncestors.Clear();
- int desType, ancType;
- for ( desType = TopAbs_EDGE; desType > TopAbs_COMPOUND; desType-- )
- for ( ancType = desType - 1; ancType >= TopAbs_COMPOUND; ancType-- )
- TopExp::MapShapesAndAncestors ( aShape,
- (TopAbs_ShapeEnum) desType,
- (TopAbs_ShapeEnum) ancType,
- _mapAncestors );
-
- // NRI : 24/02/03
- //EAP: 1/9/04 TopExp::MapShapes(aShape, _subShapes); USE the same map of _myMeshDS
-}
-
-//=======================================================================
-//function : UNVToMesh
-//purpose :
-//=======================================================================
-
-int SMESH_Mesh::UNVToMesh(const char* theFileName)
-{
- if(MYDEBUG) MESSAGE("UNVToMesh - theFileName = "<<theFileName);
- if(_isShapeToMesh)
- throw SALOME_Exception(LOCALIZED("a shape to mesh has already been defined"));
- _isShapeToMesh = true;
- DriverUNV_R_SMDS_Mesh myReader;
- myReader.SetMesh(_myMeshDS);
- myReader.SetFile(theFileName);
- myReader.SetMeshId(-1);
- myReader.Perform();
- if(MYDEBUG){
- MESSAGE("MEDToMesh - _myMeshDS->NbNodes() = "<<_myMeshDS->NbNodes());
- MESSAGE("MEDToMesh - _myMeshDS->NbEdges() = "<<_myMeshDS->NbEdges());
- MESSAGE("MEDToMesh - _myMeshDS->NbFaces() = "<<_myMeshDS->NbFaces());
- MESSAGE("MEDToMesh - _myMeshDS->NbVolumes() = "<<_myMeshDS->NbVolumes());
- }
- return 1;
-}
-
-//=======================================================================
-//function : MEDToMesh
-//purpose :
-//=======================================================================
-
-int SMESH_Mesh::MEDToMesh(const char* theFileName, const char* theMeshName)
-{
- if(MYDEBUG) MESSAGE("MEDToMesh - theFileName = "<<theFileName<<", mesh name = "<<theMeshName);
- if(_isShapeToMesh)
- throw SALOME_Exception(LOCALIZED("a shape to mesh has already been defined"));
- _isShapeToMesh = true;
- DriverMED_R_SMESHDS_Mesh myReader;
- myReader.SetMesh(_myMeshDS);
- myReader.SetMeshId(-1);
- myReader.SetFile(theFileName);
- myReader.SetMeshName(theMeshName);
- Driver_Mesh::Status status = myReader.Perform();
- if(MYDEBUG){
- MESSAGE("MEDToMesh - _myMeshDS->NbNodes() = "<<_myMeshDS->NbNodes());
- MESSAGE("MEDToMesh - _myMeshDS->NbEdges() = "<<_myMeshDS->NbEdges());
- MESSAGE("MEDToMesh - _myMeshDS->NbFaces() = "<<_myMeshDS->NbFaces());
- MESSAGE("MEDToMesh - _myMeshDS->NbVolumes() = "<<_myMeshDS->NbVolumes());
- }
-
- // Reading groups (sub-meshes are out of scope of MED import functionality)
- list<TNameAndType> aGroupNames = myReader.GetGroupNamesAndTypes();
- if(MYDEBUG) MESSAGE("MEDToMesh - Nb groups = "<<aGroupNames.size());
- int anId;
- list<TNameAndType>::iterator name_type = aGroupNames.begin();
- for ( ; name_type != aGroupNames.end(); name_type++ ) {
- SMESH_Group* aGroup = AddGroup( name_type->second, name_type->first.c_str(), anId );
- if ( aGroup ) {
- if(MYDEBUG) MESSAGE("MEDToMesh - group added: "<<name_type->first.c_str());
- SMESHDS_Group* aGroupDS = dynamic_cast<SMESHDS_Group*>( aGroup->GetGroupDS() );
- if ( aGroupDS ) {
- aGroupDS->SetStoreName( name_type->first.c_str() );
- myReader.GetGroup( aGroupDS );
- }
- }
- }
- return (int) status;
-}
-
-//=======================================================================
-//function : STLToMesh
-//purpose :
-//=======================================================================
-
-int SMESH_Mesh::STLToMesh(const char* theFileName)
-{
- if(MYDEBUG) MESSAGE("UNVToMesh - theFileName = "<<theFileName);
- if(_isShapeToMesh)
- throw SALOME_Exception(LOCALIZED("a shape to mesh has already been defined"));
- _isShapeToMesh = true;
- DriverSTL_R_SMDS_Mesh myReader;
- myReader.SetMesh(_myMeshDS);
- myReader.SetFile(theFileName);
- myReader.SetMeshId(-1);
- myReader.Perform();
- if(MYDEBUG){
- MESSAGE("MEDToMesh - _myMeshDS->NbNodes() = "<<_myMeshDS->NbNodes());
- MESSAGE("MEDToMesh - _myMeshDS->NbEdges() = "<<_myMeshDS->NbEdges());
- MESSAGE("MEDToMesh - _myMeshDS->NbFaces() = "<<_myMeshDS->NbFaces());
- MESSAGE("MEDToMesh - _myMeshDS->NbVolumes() = "<<_myMeshDS->NbVolumes());
- }
- return 1;
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-SMESH_Hypothesis::Hypothesis_Status
- SMESH_Mesh::AddHypothesis(const TopoDS_Shape & aSubShape,
- int anHypId ) throw(SALOME_Exception)
-{
- Unexpect aCatch(SalomeException);
- if(MYDEBUG) MESSAGE("SMESH_Mesh::AddHypothesis");
-
- SMESH_subMesh *subMesh = GetSubMesh(aSubShape);
- SMESHDS_SubMesh *subMeshDS = subMesh->GetSubMeshDS();
- if ( subMeshDS && subMeshDS->IsComplexSubmesh() ) // group of sub-shapes and maybe of not sub-
- {
- MESSAGE("AddHypothesis() to complex submesh");
- // return the worst but not fatal state of all group memebers
- SMESH_Hypothesis::Hypothesis_Status aBestRet, aWorstNotFatal, ret;
- aBestRet = SMESH_Hypothesis::HYP_BAD_DIM;
- aWorstNotFatal = SMESH_Hypothesis::HYP_OK;
- for ( TopoDS_Iterator itS ( aSubShape ); itS.More(); itS.Next())
- {
- if ( !GetMeshDS()->ShapeToIndex( itS.Value() ))
- continue; // not sub-shape
- ret = AddHypothesis( itS.Value(), anHypId );
- if ( !SMESH_Hypothesis::IsStatusFatal( ret ) && ret > aWorstNotFatal )
- aWorstNotFatal = ret;
- if ( ret < aBestRet )
- aBestRet = ret;
- }
- if ( SMESH_Hypothesis::IsStatusFatal( aBestRet ))
- return aBestRet;
- return aWorstNotFatal;
- }
-
- StudyContextStruct *sc = _gen->GetStudyContext(_studyId);
- if (sc->mapHypothesis.find(anHypId) == sc->mapHypothesis.end())
- {
- if(MYDEBUG) MESSAGE("Hypothesis ID does not give an hypothesis");
- if(MYDEBUG) {
- SCRUTE(_studyId);
- SCRUTE(anHypId);
- }
- throw SALOME_Exception(LOCALIZED("hypothesis does not exist"));
- }
-
- SMESH_Hypothesis *anHyp = sc->mapHypothesis[anHypId];
- MESSAGE( "SMESH_Mesh::AddHypothesis " << anHyp->GetName() );
-
- bool isGlobalHyp = IsMainShape( aSubShape );
-
- // NotConformAllowed can be only global
- if ( !isGlobalHyp )
- {
- string hypName = anHyp->GetName();
- if ( hypName == "NotConformAllowed" )
- {
- if(MYDEBUG) MESSAGE( "Hypotesis <NotConformAllowed> can be only global" );
- return SMESH_Hypothesis::HYP_INCOMPATIBLE;
- }
- }
-
- // shape
-
- int event;
- if (anHyp->GetType() == SMESHDS_Hypothesis::PARAM_ALGO)
- event = SMESH_subMesh::ADD_HYP;
- else
- event = SMESH_subMesh::ADD_ALGO;
- SMESH_Hypothesis::Hypothesis_Status ret = subMesh->AlgoStateEngine(event, anHyp);
-
- // subShapes
- if (!SMESH_Hypothesis::IsStatusFatal(ret) &&
- !subMesh->IsApplicableHypotesis( anHyp )) // is added on father
- {
- if (anHyp->GetType() == SMESHDS_Hypothesis::PARAM_ALGO)
- event = SMESH_subMesh::ADD_FATHER_HYP;
- else
- event = SMESH_subMesh::ADD_FATHER_ALGO;
- SMESH_Hypothesis::Hypothesis_Status ret2 =
- subMesh->SubMeshesAlgoStateEngine(event, anHyp);
- if (ret2 > ret)
- ret = ret2;
-
- // check concurent hypotheses on ansestors
- if (ret < SMESH_Hypothesis::HYP_CONCURENT && !isGlobalHyp )
- {
- const map < int, SMESH_subMesh * >& smMap = subMesh->DependsOn();
- map < int, SMESH_subMesh * >::const_iterator smIt = smMap.begin();
- for ( ; smIt != smMap.end(); smIt++ ) {
- if ( smIt->second->IsApplicableHypotesis( anHyp )) {
- ret2 = smIt->second->CheckConcurentHypothesis( anHyp->GetType() );
- if (ret2 > ret) {
- ret = ret2;
- break;
- }
- }
- }
- }
- }
-
- if(MYDEBUG) subMesh->DumpAlgoState(true);
- SCRUTE(ret);
- return ret;
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-SMESH_Hypothesis::Hypothesis_Status
- SMESH_Mesh::RemoveHypothesis(const TopoDS_Shape & aSubShape,
- int anHypId)throw(SALOME_Exception)
-{
- Unexpect aCatch(SalomeException);
- if(MYDEBUG) MESSAGE("SMESH_Mesh::RemoveHypothesis");
-
- SMESH_subMesh *subMesh = GetSubMesh(aSubShape);
- SMESHDS_SubMesh *subMeshDS = subMesh->GetSubMeshDS();
- if ( subMeshDS && subMeshDS->IsComplexSubmesh() )
- {
- // return the worst but not fatal state of all group memebers
- SMESH_Hypothesis::Hypothesis_Status aBestRet, aWorstNotFatal, ret;
- aBestRet = SMESH_Hypothesis::HYP_BAD_DIM;
- aWorstNotFatal = SMESH_Hypothesis::HYP_OK;
- for ( TopoDS_Iterator itS ( aSubShape ); itS.More(); itS.Next())
- {
- if ( !GetMeshDS()->ShapeToIndex( itS.Value() ))
- continue; // not sub-shape
- ret = RemoveHypothesis( itS.Value(), anHypId );
- if ( !SMESH_Hypothesis::IsStatusFatal( ret ) && ret > aWorstNotFatal )
- aWorstNotFatal = ret;
- if ( ret < aBestRet )
- aBestRet = ret;
- }
- if ( SMESH_Hypothesis::IsStatusFatal( aBestRet ))
- return aBestRet;
- return aWorstNotFatal;
- }
-
- StudyContextStruct *sc = _gen->GetStudyContext(_studyId);
- if (sc->mapHypothesis.find(anHypId) == sc->mapHypothesis.end())
- throw SALOME_Exception(LOCALIZED("hypothesis does not exist"));
-
- SMESH_Hypothesis *anHyp = sc->mapHypothesis[anHypId];
- int hypType = anHyp->GetType();
- if(MYDEBUG) SCRUTE(hypType);
- int event;
-
- // shape
-
- if (anHyp->GetType() == SMESHDS_Hypothesis::PARAM_ALGO)
- event = SMESH_subMesh::REMOVE_HYP;
- else
- event = SMESH_subMesh::REMOVE_ALGO;
- SMESH_Hypothesis::Hypothesis_Status ret = subMesh->AlgoStateEngine(event, anHyp);
-
- // there may appear concurrent hyps that were covered by the removed hyp
- if (ret < SMESH_Hypothesis::HYP_CONCURENT &&
- subMesh->IsApplicableHypotesis( anHyp ) &&
- subMesh->CheckConcurentHypothesis( anHyp->GetType() ) != SMESH_Hypothesis::HYP_OK)
- ret = SMESH_Hypothesis::HYP_CONCURENT;
-
- // subShapes
- if (!SMESH_Hypothesis::IsStatusFatal(ret) &&
- !subMesh->IsApplicableHypotesis( anHyp )) // is removed from father
- {
- if (anHyp->GetType() == SMESHDS_Hypothesis::PARAM_ALGO)
- event = SMESH_subMesh::REMOVE_FATHER_HYP;
- else
- event = SMESH_subMesh::REMOVE_FATHER_ALGO;
- SMESH_Hypothesis::Hypothesis_Status ret2 =
- subMesh->SubMeshesAlgoStateEngine(event, anHyp);
- if (ret2 > ret) // more severe
- ret = ret2;
-
- // check concurent hypotheses on ansestors
- if (ret < SMESH_Hypothesis::HYP_CONCURENT && !IsMainShape( aSubShape ) )
- {
- const map < int, SMESH_subMesh * >& smMap = subMesh->DependsOn();
- map < int, SMESH_subMesh * >::const_iterator smIt = smMap.begin();
- for ( ; smIt != smMap.end(); smIt++ ) {
- if ( smIt->second->IsApplicableHypotesis( anHyp )) {
- ret2 = smIt->second->CheckConcurentHypothesis( anHyp->GetType() );
- if (ret2 > ret) {
- ret = ret2;
- break;
- }
- }
- }
- }
- }
-
- if(MYDEBUG) subMesh->DumpAlgoState(true);
- if(MYDEBUG) SCRUTE(ret);
- return ret;
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-SMESHDS_Mesh * SMESH_Mesh::GetMeshDS()
-{
- return _myMeshDS;
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-const list<const SMESHDS_Hypothesis*>&
-SMESH_Mesh::GetHypothesisList(const TopoDS_Shape & aSubShape) const
- throw(SALOME_Exception)
-{
- Unexpect aCatch(SalomeException);
- return _myMeshDS->GetHypothesis(aSubShape);
-}
-
-//=======================================================================
-//function : GetHypothesis
-//purpose :
-//=======================================================================
-
-const SMESH_Hypothesis * SMESH_Mesh::GetHypothesis(const TopoDS_Shape & aSubShape,
- const SMESH_HypoFilter& aFilter,
- const bool andAncestors) const
-{
- {
- const list<const SMESHDS_Hypothesis*>& hypList = _myMeshDS->GetHypothesis(aSubShape);
- list<const SMESHDS_Hypothesis*>::const_iterator hyp = hypList.begin();
- for ( ; hyp != hypList.end(); hyp++ ) {
- const SMESH_Hypothesis * h = static_cast<const SMESH_Hypothesis*>( *hyp );
- if ( aFilter.IsOk( h, aSubShape))
- return h;
- }
- }
- if ( andAncestors )
- {
- TopTools_ListIteratorOfListOfShape it( GetAncestors( aSubShape ));
- for (; it.More(); it.Next() )
- {
- const list<const SMESHDS_Hypothesis*>& hypList = _myMeshDS->GetHypothesis(it.Value());
- list<const SMESHDS_Hypothesis*>::const_iterator hyp = hypList.begin();
- for ( ; hyp != hypList.end(); hyp++ ) {
- const SMESH_Hypothesis * h = static_cast<const SMESH_Hypothesis*>( *hyp );
- if (aFilter.IsOk( h, it.Value() ))
- return h;
- }
- }
- }
- return 0;
-}
-
-//=======================================================================
-//function : GetHypotheses
-//purpose :
-//=======================================================================
-
-bool SMESH_Mesh::GetHypotheses(const TopoDS_Shape & aSubShape,
- const SMESH_HypoFilter& aFilter,
- list <const SMESHDS_Hypothesis * >& aHypList,
- const bool andAncestors) const
-{
- int nbHyp = 0;
- {
- const list<const SMESHDS_Hypothesis*>& hypList = _myMeshDS->GetHypothesis(aSubShape);
- list<const SMESHDS_Hypothesis*>::const_iterator hyp = hypList.begin();
- for ( ; hyp != hypList.end(); hyp++ )
- if ( aFilter.IsOk (static_cast<const SMESH_Hypothesis*>( *hyp ), aSubShape)) {
- aHypList.push_back( *hyp );
- nbHyp++;
- }
- }
- // get hypos from shape of one type only: if any hypo is found on edge, do
- // not look up on faces
- if ( !nbHyp && andAncestors )
- {
- TopTools_MapOfShape map;
- TopTools_ListIteratorOfListOfShape it( GetAncestors( aSubShape ));
- int shapeType = it.More() ? it.Value().ShapeType() : TopAbs_SHAPE;
- for (; it.More(); it.Next() )
- {
- if ( nbHyp && shapeType != it.Value().ShapeType() )
- break;
- shapeType = it.Value().ShapeType();
- if ( !map.Add( it.Value() ))
- continue;
- const list<const SMESHDS_Hypothesis*>& hypList = _myMeshDS->GetHypothesis(it.Value());
- list<const SMESHDS_Hypothesis*>::const_iterator hyp = hypList.begin();
- for ( ; hyp != hypList.end(); hyp++ )
- if (aFilter.IsOk( static_cast<const SMESH_Hypothesis*>( *hyp ), it.Value() )) {
- aHypList.push_back( *hyp );
- nbHyp++;
- }
- }
- }
- return nbHyp;
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-const list<SMESHDS_Command*> & SMESH_Mesh::GetLog() throw(SALOME_Exception)
-{
- Unexpect aCatch(SalomeException);
- if(MYDEBUG) MESSAGE("SMESH_Mesh::GetLog");
- return _myMeshDS->GetScript()->GetCommands();
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-void SMESH_Mesh::ClearLog() throw(SALOME_Exception)
-{
- Unexpect aCatch(SalomeException);
- if(MYDEBUG) MESSAGE("SMESH_Mesh::ClearLog");
- _myMeshDS->GetScript()->Clear();
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-int SMESH_Mesh::GetId()
-{
- if(MYDEBUG) MESSAGE("SMESH_Mesh::GetId");
- return _id;
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-SMESH_Gen *SMESH_Mesh::GetGen()
-{
- return _gen;
-}
-
-//=============================================================================
-/*!
- * Get or Create the SMESH_subMesh object implementation
- */
-//=============================================================================
-
-SMESH_subMesh *SMESH_Mesh::GetSubMesh(const TopoDS_Shape & aSubShape)
-throw(SALOME_Exception)
-{
- Unexpect aCatch(SalomeException);
- SMESH_subMesh *aSubMesh;
- int index = _myMeshDS->ShapeToIndex(aSubShape);
-
- // for submeshes on GEOM Group
- if ( !index && aSubShape.ShapeType() == TopAbs_COMPOUND ) {
- TopoDS_Iterator it( aSubShape );
- if ( it.More() )
- index = _myMeshDS->AddCompoundSubmesh( aSubShape, it.Value().ShapeType() );
- }
-
- if (_mapSubMesh.find(index) != _mapSubMesh.end())
- {
- aSubMesh = _mapSubMesh[index];
- }
- else
- {
- aSubMesh = new SMESH_subMesh(index, this, _myMeshDS, aSubShape);
- _mapSubMesh[index] = aSubMesh;
- }
- return aSubMesh;
-}
-
-//=============================================================================
-/*!
- * Get the SMESH_subMesh object implementation. Dont create it, return null
- * if it does not exist.
- */
-//=============================================================================
-
-SMESH_subMesh *SMESH_Mesh::GetSubMeshContaining(const TopoDS_Shape & aSubShape)
-throw(SALOME_Exception)
-{
- Unexpect aCatch(SalomeException);
- bool isFound = false;
- SMESH_subMesh *aSubMesh = NULL;
-
- int index = _myMeshDS->ShapeToIndex(aSubShape);
- if (_mapSubMesh.find(index) != _mapSubMesh.end())
- {
- aSubMesh = _mapSubMesh[index];
- isFound = true;
- }
- if (!isFound)
- aSubMesh = NULL;
- return aSubMesh;
-}
-
-//=============================================================================
-/*!
- * Get the SMESH_subMesh object implementation. Dont create it, return null
- * if it does not exist.
- */
-//=============================================================================
-
-SMESH_subMesh *SMESH_Mesh::GetSubMeshContaining(const int aShapeID)
-throw(SALOME_Exception)
-{
- Unexpect aCatch(SalomeException);
-
- map <int, SMESH_subMesh *>::iterator i_sm = _mapSubMesh.find(aShapeID);
- if (i_sm == _mapSubMesh.end())
- return NULL;
- return i_sm->second;
-}
-
-//=======================================================================
-//function : IsUsedHypothesis
-//purpose : Return True if anHyp is used to mesh aSubShape
-//=======================================================================
-
-bool SMESH_Mesh::IsUsedHypothesis(SMESHDS_Hypothesis * anHyp,
- const TopoDS_Shape & aSubShape)
-{
- SMESH_Hypothesis* hyp = static_cast<SMESH_Hypothesis*>(anHyp);
- // check if anHyp is applicable to aSubShape
- SMESH_subMesh * subMesh = GetSubMeshContaining( aSubShape );
- if ( !subMesh || !subMesh->IsApplicableHypotesis( hyp ))
- return false;
-
- SMESH_Algo *algo = _gen->GetAlgo(*this, aSubShape);
-
- // algorithm
- if (anHyp->GetType() > SMESHDS_Hypothesis::PARAM_ALGO)
- return ( anHyp == algo );
-
- // algorithm parameter
- if (algo)
- {
- // look trough hypotheses used by algo
- const list <const SMESHDS_Hypothesis * >&usedHyps =
- algo->GetUsedHypothesis(*this, aSubShape);
- return ( find( usedHyps.begin(), usedHyps.end(), anHyp ) != usedHyps.end() );
- }
-
- // look through all assigned hypotheses
- SMESH_HypoFilter filter( SMESH_HypoFilter::Is( hyp ));
- return GetHypothesis( aSubShape, filter, true );
-}
-
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-const list < SMESH_subMesh * >&
- SMESH_Mesh::GetSubMeshUsingHypothesis(SMESHDS_Hypothesis * anHyp)
-throw(SALOME_Exception)
-{
- Unexpect aCatch(SalomeException);
- if(MYDEBUG) MESSAGE("SMESH_Mesh::GetSubMeshUsingHypothesis");
- map < int, SMESH_subMesh * >::iterator itsm;
- _subMeshesUsingHypothesisList.clear();
- for (itsm = _mapSubMesh.begin(); itsm != _mapSubMesh.end(); itsm++)
- {
- SMESH_subMesh *aSubMesh = (*itsm).second;
- if ( IsUsedHypothesis ( anHyp, aSubMesh->GetSubShape() ))
- _subMeshesUsingHypothesisList.push_back(aSubMesh);
- }
- return _subMeshesUsingHypothesisList;
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-void SMESH_Mesh::ExportMED(const char *file,
- const char* theMeshName,
- bool theAutoGroups,
- int theVersion)
- throw(SALOME_Exception)
-{
- Unexpect aCatch(SalomeException);
- DriverMED_W_SMESHDS_Mesh myWriter;
- myWriter.SetFile ( file, MED::EVersion(theVersion) );
- myWriter.SetMesh ( _myMeshDS );
- if ( !theMeshName )
- myWriter.SetMeshId ( _idDoc );
- else {
- myWriter.SetMeshId ( -1 );
- myWriter.SetMeshName( theMeshName );
- }
-
- if ( theAutoGroups ) {
- myWriter.AddGroupOfNodes();
- myWriter.AddGroupOfEdges();
- myWriter.AddGroupOfFaces();
- myWriter.AddGroupOfVolumes();
- }
-
- for ( map<int, SMESH_Group*>::iterator it = _mapGroup.begin(); it != _mapGroup.end(); it++ ) {
- SMESH_Group* aGroup = it->second;
- SMESHDS_GroupBase* aGroupDS = aGroup->GetGroupDS();
- if ( aGroupDS ) {
- aGroupDS->SetStoreName( aGroup->GetName() );
- myWriter.AddGroup( aGroupDS );
- }
- }
-
- myWriter.Perform();
-}
-
-void SMESH_Mesh::ExportDAT(const char *file) throw(SALOME_Exception)
-{
- Unexpect aCatch(SalomeException);
- DriverDAT_W_SMDS_Mesh myWriter;
- myWriter.SetFile(string(file));
- myWriter.SetMesh(_myMeshDS);
- myWriter.SetMeshId(_idDoc);
- myWriter.Perform();
-}
-
-void SMESH_Mesh::ExportUNV(const char *file) throw(SALOME_Exception)
-{
- Unexpect aCatch(SalomeException);
- DriverUNV_W_SMDS_Mesh myWriter;
- myWriter.SetFile(string(file));
- myWriter.SetMesh(_myMeshDS);
- myWriter.SetMeshId(_idDoc);
- myWriter.Perform();
-}
-
-void SMESH_Mesh::ExportSTL(const char *file, const bool isascii) throw(SALOME_Exception)
-{
- Unexpect aCatch(SalomeException);
- DriverSTL_W_SMDS_Mesh myWriter;
- myWriter.SetFile(string(file));
- myWriter.SetIsAscii( isascii );
- myWriter.SetMesh(_myMeshDS);
- myWriter.SetMeshId(_idDoc);
- myWriter.Perform();
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-int SMESH_Mesh::NbNodes() throw(SALOME_Exception)
-{
- Unexpect aCatch(SalomeException);
- return _myMeshDS->NbNodes();
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-int SMESH_Mesh::NbEdges() throw(SALOME_Exception)
-{
- Unexpect aCatch(SalomeException);
- return _myMeshDS->NbEdges();
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-int SMESH_Mesh::NbFaces() throw(SALOME_Exception)
-{
- Unexpect aCatch(SalomeException);
- return _myMeshDS->NbFaces();
-}
-
-///////////////////////////////////////////////////////////////////////////////
-/// Return the number of 3 nodes faces in the mesh. This method run in O(n)
-///////////////////////////////////////////////////////////////////////////////
-int SMESH_Mesh::NbTriangles() throw(SALOME_Exception)
-{
- Unexpect aCatch(SalomeException);
- int Nb = 0;
-
- SMDS_FaceIteratorPtr itFaces=_myMeshDS->facesIterator();
- //while(itFaces->more()) if(itFaces->next()->NbNodes()==3) Nb++;
- const SMDS_MeshFace * curFace;
- while (itFaces->more()) {
- curFace = itFaces->next();
- if (!curFace->IsPoly() && curFace->NbNodes() == 3) Nb++;
- }
- return Nb;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-/// Return the number of 4 nodes faces in the mesh. This method run in O(n)
-///////////////////////////////////////////////////////////////////////////////
-int SMESH_Mesh::NbQuadrangles() throw(SALOME_Exception)
-{
- Unexpect aCatch(SalomeException);
- int Nb = 0;
-
- SMDS_FaceIteratorPtr itFaces=_myMeshDS->facesIterator();
- //while(itFaces->more()) if(itFaces->next()->NbNodes()==4) Nb++;
- const SMDS_MeshFace * curFace;
- while (itFaces->more()) {
- curFace = itFaces->next();
- if (!curFace->IsPoly() && curFace->NbNodes() == 4) Nb++;
- }
- return Nb;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-/// Return the number of polygonal faces in the mesh. This method run in O(n)
-///////////////////////////////////////////////////////////////////////////////
-int SMESH_Mesh::NbPolygons() throw(SALOME_Exception)
-{
- Unexpect aCatch(SalomeException);
- int Nb = 0;
- SMDS_FaceIteratorPtr itFaces = _myMeshDS->facesIterator();
- while (itFaces->more())
- if (itFaces->next()->IsPoly()) Nb++;
- return Nb;
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-int SMESH_Mesh::NbVolumes() throw(SALOME_Exception)
-{
- Unexpect aCatch(SalomeException);
- return _myMeshDS->NbVolumes();
-}
-
-int SMESH_Mesh::NbTetras() throw(SALOME_Exception)
-{
- Unexpect aCatch(SalomeException);
- int Nb = 0;
- SMDS_VolumeIteratorPtr itVolumes=_myMeshDS->volumesIterator();
- //while(itVolumes->more()) if(itVolumes->next()->NbNodes()==4) Nb++;
- const SMDS_MeshVolume * curVolume;
- while (itVolumes->more()) {
- curVolume = itVolumes->next();
- if (!curVolume->IsPoly() && curVolume->NbNodes() == 4) Nb++;
- }
- return Nb;
-}
-
-int SMESH_Mesh::NbHexas() throw(SALOME_Exception)
-{
- Unexpect aCatch(SalomeException);
- int Nb = 0;
- SMDS_VolumeIteratorPtr itVolumes=_myMeshDS->volumesIterator();
- //while(itVolumes->more()) if(itVolumes->next()->NbNodes()==8) Nb++;
- const SMDS_MeshVolume * curVolume;
- while (itVolumes->more()) {
- curVolume = itVolumes->next();
- if (!curVolume->IsPoly() && curVolume->NbNodes() == 8) Nb++;
- }
- return Nb;
-}
-
-int SMESH_Mesh::NbPyramids() throw(SALOME_Exception)
-{
- Unexpect aCatch(SalomeException);
- int Nb = 0;
- SMDS_VolumeIteratorPtr itVolumes=_myMeshDS->volumesIterator();
- //while(itVolumes->more()) if(itVolumes->next()->NbNodes()==5) Nb++;
- const SMDS_MeshVolume * curVolume;
- while (itVolumes->more()) {
- curVolume = itVolumes->next();
- if (!curVolume->IsPoly() && curVolume->NbNodes() == 5) Nb++;
- }
- return Nb;
-}
-
-int SMESH_Mesh::NbPrisms() throw(SALOME_Exception)
-{
- Unexpect aCatch(SalomeException);
- int Nb = 0;
- SMDS_VolumeIteratorPtr itVolumes=_myMeshDS->volumesIterator();
- //while(itVolumes->more()) if(itVolumes->next()->NbNodes()==6) Nb++;
- const SMDS_MeshVolume * curVolume;
- while (itVolumes->more()) {
- curVolume = itVolumes->next();
- if (!curVolume->IsPoly() && curVolume->NbNodes() == 6) Nb++;
- }
- return Nb;
-}
-
-int SMESH_Mesh::NbPolyhedrons() throw(SALOME_Exception)
-{
- Unexpect aCatch(SalomeException);
- int Nb = 0;
- SMDS_VolumeIteratorPtr itVolumes = _myMeshDS->volumesIterator();
- while (itVolumes->more())
- if (itVolumes->next()->IsPoly()) Nb++;
- return Nb;
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-int SMESH_Mesh::NbSubMesh() throw(SALOME_Exception)
-{
- Unexpect aCatch(SalomeException);
- return _myMeshDS->NbSubMesh();
-}
-
-//=======================================================================
-//function : IsNotConformAllowed
-//purpose : check if a hypothesis alowing notconform mesh is present
-//=======================================================================
-
-bool SMESH_Mesh::IsNotConformAllowed() const
-{
- if(MYDEBUG) MESSAGE("SMESH_Mesh::IsNotConformAllowed");
-
- SMESH_HypoFilter filter( SMESH_HypoFilter::HasName( "NotConformAllowed" ));
- return GetHypothesis( _myMeshDS->ShapeToMesh(), filter, false );
-}
-
-//=======================================================================
-//function : IsMainShape
-//purpose :
-//=======================================================================
-
-bool SMESH_Mesh::IsMainShape(const TopoDS_Shape& theShape) const
-{
- return theShape.IsSame(_myMeshDS->ShapeToMesh() );
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-SMESH_Group* SMESH_Mesh::AddGroup (const SMDSAbs_ElementType theType,
- const char* theName,
- int& theId,
- const TopoDS_Shape& theShape)
-{
- if (_mapGroup.find(_groupId) != _mapGroup.end())
- return NULL;
- theId = _groupId;
- SMESH_Group* aGroup = new SMESH_Group (theId, this, theType, theName, theShape);
- GetMeshDS()->AddGroup( aGroup->GetGroupDS() );
- _mapGroup[_groupId++] = aGroup;
- return aGroup;
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-SMESH_Group* SMESH_Mesh::GetGroup (const int theGroupID)
-{
- if (_mapGroup.find(theGroupID) == _mapGroup.end())
- return NULL;
- return _mapGroup[theGroupID];
-}
-
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-list<int> SMESH_Mesh::GetGroupIds()
-{
- list<int> anIds;
- for ( map<int, SMESH_Group*>::const_iterator it = _mapGroup.begin(); it != _mapGroup.end(); it++ )
- anIds.push_back( it->first );
-
- return anIds;
-}
-
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-void SMESH_Mesh::RemoveGroup (const int theGroupID)
-{
- if (_mapGroup.find(theGroupID) == _mapGroup.end())
- return;
- GetMeshDS()->RemoveGroup( _mapGroup[theGroupID]->GetGroupDS() );
- _mapGroup.erase (theGroupID);
- delete _mapGroup[theGroupID];
-}
-
-//=============================================================================
-/*!
- * IsLocal1DHypothesis
- * Returns a local 1D hypothesis used for theEdge
- */
-//=============================================================================
-const SMESH_Hypothesis* SMESH_Mesh::IsLocal1DHypothesis (const TopoDS_Shape& theEdge)
-{
- SMESH_HypoFilter hypo ( SMESH_HypoFilter::HasDim( 1 ));
- hypo.AndNot( hypo.IsAlgo() ).AndNot( hypo.IsAssignedTo( GetMeshDS()->ShapeToMesh() ));
-
- return GetHypothesis( theEdge, hypo, true );
-}
-
-//=============================================================================
-/*!
- * IsPropagationHypothesis
- */
-//=============================================================================
-bool SMESH_Mesh::IsPropagationHypothesis (const TopoDS_Shape& theEdge)
-{
- return _mapPropagationChains.Contains(theEdge);
-}
-
-//=============================================================================
-/*!
- * IsPropagatedHypothesis
- */
-//=============================================================================
-bool SMESH_Mesh::IsPropagatedHypothesis (const TopoDS_Shape& theEdge,
- TopoDS_Shape& theMainEdge)
-{
- int nbChains = _mapPropagationChains.Extent();
- for (int i = 1; i <= nbChains; i++) {
- //const TopTools_IndexedMapOfShape& aChain = _mapPropagationChains.FindFromIndex(i);
- const SMESH_IndexedMapOfShape& aChain = _mapPropagationChains.FindFromIndex(i);
- if (aChain.Contains(theEdge)) {
- theMainEdge = _mapPropagationChains.FindKey(i);
- return true;
- }
- }
-
- return false;
-}
-//=============================================================================
-/*!
- * IsReversedInChain
- */
-//=============================================================================
-
-bool SMESH_Mesh::IsReversedInChain (const TopoDS_Shape& theEdge,
- const TopoDS_Shape& theMainEdge)
-{
- if ( !theMainEdge.IsNull() && !theEdge.IsNull() &&
- _mapPropagationChains.Contains( theMainEdge ))
- {
- const SMESH_IndexedMapOfShape& aChain =
- _mapPropagationChains.FindFromKey( theMainEdge );
- int index = aChain.FindIndex( theEdge );
- if ( index )
- return aChain(index).Orientation() == TopAbs_REVERSED;
- }
- return false;
-}
-
-//=============================================================================
-/*!
- * CleanMeshOnPropagationChain
- */
-//=============================================================================
-void SMESH_Mesh::CleanMeshOnPropagationChain (const TopoDS_Shape& theMainEdge)
-{
- const SMESH_IndexedMapOfShape& aChain = _mapPropagationChains.FindFromKey(theMainEdge);
- int i, nbEdges = aChain.Extent();
- for (i = 1; i <= nbEdges; i++) {
- TopoDS_Shape anEdge = aChain.FindKey(i);
- SMESH_subMesh *subMesh = GetSubMesh(anEdge);
- SMESHDS_SubMesh *subMeshDS = subMesh->GetSubMeshDS();
- if (subMeshDS && subMeshDS->NbElements() > 0) {
- subMesh->ComputeStateEngine(SMESH_subMesh::CLEANDEP);
- }
- }
-}
-
-//=============================================================================
-/*!
- * RebuildPropagationChains
- * Rebuild all existing propagation chains.
- * Have to be used, if 1D hypothesis have been assigned/removed to/from any edge
- */
-//=============================================================================
-bool SMESH_Mesh::RebuildPropagationChains()
-{
- bool ret = true;
-
- // Clean all chains, because they can be not up-to-date
- int i, nbChains = _mapPropagationChains.Extent();
- for (i = 1; i <= nbChains; i++) {
- TopoDS_Shape aMainEdge = _mapPropagationChains.FindKey(i);
- CleanMeshOnPropagationChain(aMainEdge);
- _mapPropagationChains.ChangeFromIndex(i).Clear();
- }
-
- // Build all chains
- for (i = 1; i <= nbChains; i++) {
- TopoDS_Shape aMainEdge = _mapPropagationChains.FindKey(i);
- if (!BuildPropagationChain(aMainEdge))
- ret = false;
- CleanMeshOnPropagationChain(aMainEdge);
- }
-
- return ret;
-}
-
-//=============================================================================
-/*!
- * RemovePropagationChain
- * Have to be used, if Propagation hypothesis is removed from <theMainEdge>
- */
-//=============================================================================
-bool SMESH_Mesh::RemovePropagationChain (const TopoDS_Shape& theMainEdge)
-{
- if (!_mapPropagationChains.Contains(theMainEdge))
- return false;
-
- // Clean mesh elements and nodes, built on the chain
- CleanMeshOnPropagationChain(theMainEdge);
-
- // Clean the chain
- _mapPropagationChains.ChangeFromKey(theMainEdge).Clear();
-
- // Remove the chain from the map
- int i = _mapPropagationChains.FindIndex(theMainEdge);
- if ( i == _mapPropagationChains.Extent() )
- _mapPropagationChains.RemoveLast();
- else {
- TopoDS_Vertex anEmptyShape;
- BRep_Builder BB;
- BB.MakeVertex(anEmptyShape, gp_Pnt(0,0,0), 0.1);
- SMESH_IndexedMapOfShape anEmptyMap;
- _mapPropagationChains.Substitute(i, anEmptyShape, anEmptyMap);
- }
-
- return true;
-}
-
-//=============================================================================
-/*!
- * BuildPropagationChain
- */
-//=============================================================================
-bool SMESH_Mesh::BuildPropagationChain (const TopoDS_Shape& theMainEdge)
-{
- if (theMainEdge.ShapeType() != TopAbs_EDGE) return true;
-
- // Add new chain, if there is no
- if (!_mapPropagationChains.Contains(theMainEdge)) {
- SMESH_IndexedMapOfShape aNewChain;
- _mapPropagationChains.Add(theMainEdge, aNewChain);
- }
-
- // Check presence of 1D hypothesis to be propagated
- const SMESH_Hypothesis* aMainHyp = IsLocal1DHypothesis(theMainEdge);
- if (!aMainHyp) {
- MESSAGE("Warning: There is no 1D hypothesis to propagate. Please, assign.");
- return true;
- }
-
- // Edges, on which the 1D hypothesis will be propagated from <theMainEdge>
- SMESH_IndexedMapOfShape& aChain = _mapPropagationChains.ChangeFromKey(theMainEdge);
- if (aChain.Extent() > 0) {
- CleanMeshOnPropagationChain(theMainEdge);
- aChain.Clear();
- }
-
- // At first put <theMainEdge> in the chain
- aChain.Add(theMainEdge);
-
- // List of edges, added to chain on the previous cycle pass
- TopTools_ListOfShape listPrevEdges;
- listPrevEdges.Append(theMainEdge.Oriented( TopAbs_FORWARD ));
-
-// 5____4____3____4____5____6
-// | | | | | |
-// | | | | | |
-// 4____3____2____3____4____5
-// | | | | | | Number in the each knot of
-// | | | | | | grid indicates cycle pass,
-// 3____2____1____2____3____4 on which corresponding edge
-// | | | | | | (perpendicular to the plane
-// | | | | | | of view) will be found.
-// 2____1____0____1____2____3
-// | | | | | |
-// | | | | | |
-// 3____2____1____2____3____4
-
- // Collect all edges pass by pass
- while (listPrevEdges.Extent() > 0) {
- // List of edges, added to chain on this cycle pass
- TopTools_ListOfShape listCurEdges;
-
- // Find the next portion of edges
- TopTools_ListIteratorOfListOfShape itE (listPrevEdges);
- for (; itE.More(); itE.Next()) {
- TopoDS_Shape anE = itE.Value();
-
- // Iterate on faces, having edge <anE>
- TopTools_ListIteratorOfListOfShape itA (GetAncestors(anE));
- for (; itA.More(); itA.Next()) {
- TopoDS_Shape aW = itA.Value();
-
- // There are objects of different type among the ancestors of edge
- if (aW.ShapeType() == TopAbs_WIRE) {
- TopoDS_Shape anOppE;
-
- BRepTools_WireExplorer aWE (TopoDS::Wire(aW));
- Standard_Integer nb = 1, found = 0;
- TopTools_Array1OfShape anEdges (1,4);
- for (; aWE.More(); aWE.Next(), nb++) {
- if (nb > 4) {
- found = 0;
- break;
- }
- anEdges(nb) = aWE.Current();
- if (!_mapAncestors.Contains(anEdges(nb))) {
- MESSAGE("WIRE EXPLORER HAVE GIVEN AN INVALID EDGE !!!");
- break;
- }
- if (anEdges(nb).IsSame(anE)) found = nb;
- }
-
- if (nb == 5 && found > 0) {
- // Quadrangle face found, get an opposite edge
- Standard_Integer opp = found + 2;
- if (opp > 4) opp -= 4;
- anOppE = anEdges(opp);
-
- // add anOppE to aChain if ...
- if (!aChain.Contains(anOppE)) { // ... anOppE is not in aChain
- if (!IsLocal1DHypothesis(anOppE)) { // ... no other 1d hyp on anOppE
- TopoDS_Shape aMainEdgeForOppEdge; // ... no other hyp is propagated to anOppE
- if (!IsPropagatedHypothesis(anOppE, aMainEdgeForOppEdge))
- {
- // Add found edge to the chain oriented so that to
- // have it co-directed with a forward MainEdge
- TopAbs_Orientation ori = anE.Orientation();
- if ( anEdges(opp).Orientation() == anEdges(found).Orientation() )
- ori = TopAbs::Reverse( ori );
- anOppE.Orientation( ori );
- aChain.Add(anOppE);
- listCurEdges.Append(anOppE);
- }
- else {
- // Collision!
- MESSAGE("Error: Collision between propagated hypotheses");
- CleanMeshOnPropagationChain(theMainEdge);
- aChain.Clear();
- return ( aMainHyp == IsLocal1DHypothesis(aMainEdgeForOppEdge) );
- }
- }
- }
- } // if (nb == 5 && found > 0)
- } // if (aF.ShapeType() == TopAbs_WIRE)
- } // for (; itF.More(); itF.Next())
- } // for (; itE.More(); itE.Next())
-
- listPrevEdges = listCurEdges;
- } // while (listPrevEdges.Extent() > 0)
-
- CleanMeshOnPropagationChain(theMainEdge);
- return true;
-}
-
-//=======================================================================
-//function : GetAncestors
-//purpose : return list of ancestors of theSubShape in the order
-// that lower dimention shapes come first.
-//=======================================================================
-
-const TopTools_ListOfShape& SMESH_Mesh::GetAncestors(const TopoDS_Shape& theS) const
-{
- if ( _mapAncestors.Contains( theS ) )
- return _mapAncestors.FindFromKey( theS );
-
- static TopTools_ListOfShape emptyList;
- return emptyList;
-}
-
-//=======================================================================
-//function : Dump
-//purpose : dumps contents of mesh to stream [ debug purposes ]
-//=======================================================================
-ostream& SMESH_Mesh::Dump(ostream& save)
-{
- save << "========================== Dump contents of mesh ==========================" << endl;
- save << "1) Total number of nodes: " << NbNodes() << endl;
- save << "2) Total number of edges: " << NbEdges() << endl;
- save << "3) Total number of faces: " << NbFaces() << endl;
- if ( NbFaces() > 0 ) {
- int nb3 = NbTriangles();
- int nb4 = NbQuadrangles();
- save << "3.1.) Number of triangles: " << nb3 << endl;
- save << "3.2.) Number of quadrangles: " << nb4 << endl;
- if ( nb3 + nb4 != NbFaces() ) {
- map<int,int> myFaceMap;
- SMDS_FaceIteratorPtr itFaces=_myMeshDS->facesIterator();
- while( itFaces->more( ) ) {
- int nbNodes = itFaces->next()->NbNodes();
- if ( myFaceMap.find( nbNodes ) == myFaceMap.end() )
- myFaceMap[ nbNodes ] = 0;
- myFaceMap[ nbNodes ] = myFaceMap[ nbNodes ] + 1;
- }
- save << "3.3.) Faces in detail: " << endl;
- map <int,int>::iterator itF;
- for (itF = myFaceMap.begin(); itF != myFaceMap.end(); itF++)
- save << "--> nb nodes: " << itF->first << " - nb elemens: " << itF->second << endl;
- }
- }
- save << "4) Total number of volumes: " << NbVolumes() << endl;
- if ( NbVolumes() > 0 ) {
- int nb8 = NbHexas();
- int nb4 = NbTetras();
- int nb5 = NbPyramids();
- int nb6 = NbPrisms();
- save << "4.1.) Number of hexahedrons: " << nb8 << endl;
- save << "4.2.) Number of tetrahedrons: " << nb4 << endl;
- save << "4.3.) Number of prisms: " << nb6 << endl;
- save << "4.4.) Number of pyramides: " << nb5 << endl;
- if ( nb8 + nb4 + nb5 + nb6 != NbVolumes() ) {
- map<int,int> myVolumesMap;
- SMDS_VolumeIteratorPtr itVolumes=_myMeshDS->volumesIterator();
- while( itVolumes->more( ) ) {
- int nbNodes = itVolumes->next()->NbNodes();
- if ( myVolumesMap.find( nbNodes ) == myVolumesMap.end() )
- myVolumesMap[ nbNodes ] = 0;
- myVolumesMap[ nbNodes ] = myVolumesMap[ nbNodes ] + 1;
- }
- save << "4.5.) Volumes in detail: " << endl;
- map <int,int>::iterator itV;
- for (itV = myVolumesMap.begin(); itV != myVolumesMap.end(); itV++)
- save << "--> nb nodes: " << itV->first << " - nb elemens: " << itV->second << endl;
- }
- }
- save << "===========================================================================" << endl;
- return save;
-}
-
-//=======================================================================
-//function : GetElementType
-//purpose : Returns type of mesh element with certain id
-//=======================================================================
-SMDSAbs_ElementType SMESH_Mesh::GetElementType( const int id, const bool iselem )
-{
- return _myMeshDS->GetElementType( id, iselem );
-}
+++ /dev/null
-// SMESH SMESH : implementaion of SMESH idl descriptions
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESH_Mesh.hxx
-// Author : Paul RASCLE, EDF
-// Module : SMESH
-// $Header$
-
-#ifndef _SMESH_MESH_HXX_
-#define _SMESH_MESH_HXX_
-
-#include "SMESH_Hypothesis.hxx"
-//#include "SMESH_subMesh.hxx"
-
-#include "SMESHDS_Document.hxx"
-#include "SMESHDS_Mesh.hxx"
-#include "SMESHDS_Command.hxx"
-#include "SMDSAbs_ElementType.hxx"
-
-//#include "NMTTools_IndexedDataMapOfShapeIndexedMapOfShape.hxx"
-#include "SMESH_IndexedDataMapOfShapeIndexedMapOfShape.hxx"
-
-#include "Utils_SALOME_Exception.hxx"
-
-#include <TopExp.hxx>
-#include <TopExp_Explorer.hxx>
-#include <TopoDS.hxx>
-#include <TopoDS_Iterator.hxx>
-#include <TopoDS_Compound.hxx>
-#include <TopoDS_CompSolid.hxx>
-#include <TopoDS_Solid.hxx>
-#include <TopoDS_Shell.hxx>
-#include <TopoDS_Face.hxx>
-#include <TopoDS_Wire.hxx>
-#include <TopoDS_Edge.hxx>
-#include <TopoDS_Vertex.hxx>
-#include <TopoDS_Shape.hxx>
-#include <TopTools_IndexedMapOfShape.hxx>
-#include <TopTools_IndexedDataMapOfShapeListOfShape.hxx>
-
-#include <vector>
-#include <list>
-#include <map>
-
-#include <string>
-#include <iostream>
-
-class SMESH_Gen;
-class SMESH_Group;
-class TopTools_ListOfShape;
-class SMESH_subMesh;
-class SMESH_HypoFilter;
-
-//typedef NMTTools_IndexedDataMapOfShapeIndexedMapOfShape IndexedMapOfChain;
-typedef SMESH_IndexedDataMapOfShapeIndexedMapOfShape IndexedMapOfChain;
-
-class SMESH_Mesh
-{
- SMESH_Mesh();
- SMESH_Mesh(const SMESH_Mesh&);
-public:
- SMESH_Mesh(int localId, int studyId, SMESH_Gen * gen,
- SMESHDS_Document * myDocument);
-
- virtual ~SMESH_Mesh();
-
- void ShapeToMesh(const TopoDS_Shape & aShape);
-
- int UNVToMesh(const char* theFileName);
- /*!
- * consult DriverMED_R_SMESHDS_Mesh::ReadStatus for returned value
- */
- int MEDToMesh(const char* theFileName, const char* theMeshName);
-
- int STLToMesh(const char* theFileName);
-
- SMESH_Hypothesis::Hypothesis_Status
- AddHypothesis(const TopoDS_Shape & aSubShape, int anHypId)
- throw(SALOME_Exception);
-
- SMESH_Hypothesis::Hypothesis_Status
- RemoveHypothesis(const TopoDS_Shape & aSubShape, int anHypId)
- throw(SALOME_Exception);
-
- const list <const SMESHDS_Hypothesis * >&
- GetHypothesisList(const TopoDS_Shape & aSubShape) const
- throw(SALOME_Exception);
-
- const SMESH_Hypothesis * GetHypothesis(const TopoDS_Shape & aSubShape,
- const SMESH_HypoFilter& aFilter,
- const bool andAncestors) const;
-
- bool GetHypotheses(const TopoDS_Shape & aSubShape,
- const SMESH_HypoFilter& aFilter,
- list <const SMESHDS_Hypothesis * >& aHypList,
- const bool andAncestors) const;
-
- const list<SMESHDS_Command*> & GetLog() throw(SALOME_Exception);
-
- void ClearLog() throw(SALOME_Exception);
-
- int GetId();
-
- SMESHDS_Mesh * GetMeshDS();
-
- SMESH_Gen *GetGen();
-
- SMESH_subMesh *GetSubMesh(const TopoDS_Shape & aSubShape)
- throw(SALOME_Exception);
-
- SMESH_subMesh *GetSubMeshContaining(const TopoDS_Shape & aSubShape)
- throw(SALOME_Exception);
-
- SMESH_subMesh *GetSubMeshContaining(const int aShapeID)
- throw(SALOME_Exception);
-
- const list < SMESH_subMesh * >&
- GetSubMeshUsingHypothesis(SMESHDS_Hypothesis * anHyp)
- throw(SALOME_Exception);
-
- bool IsUsedHypothesis(SMESHDS_Hypothesis * anHyp,
- const TopoDS_Shape & aSubShape);
- // Return True if anHyp is used to mesh aSubShape
-
- bool IsNotConformAllowed() const;
- // check if a hypothesis alowing notconform mesh is present
-
- bool IsMainShape(const TopoDS_Shape& theShape) const;
-
- const TopTools_ListOfShape& GetAncestors(const TopoDS_Shape& theSubShape) const;
- // return list of ancestors of theSubShape in the order
- // that lower dimention shapes come first.
-
- void ExportMED(const char *file,
- const char* theMeshName = NULL,
- bool theAutoGroups = true,
- int theVersion = 0)
- throw(SALOME_Exception);
-
- void ExportDAT(const char *file) throw(SALOME_Exception);
- void ExportUNV(const char *file) throw(SALOME_Exception);
- void ExportSTL(const char *file, const bool isascii) throw(SALOME_Exception);
-
- int NbNodes() throw(SALOME_Exception);
-
- int NbEdges() throw(SALOME_Exception);
-
- int NbFaces() throw(SALOME_Exception);
-
- int NbTriangles() throw(SALOME_Exception);
-
- int NbQuadrangles() throw(SALOME_Exception);
-
- int NbPolygons() throw(SALOME_Exception);
-
- int NbVolumes() throw(SALOME_Exception);
-
- int NbTetras() throw(SALOME_Exception);
-
- int NbHexas() throw(SALOME_Exception);
-
- int NbPyramids() throw(SALOME_Exception);
-
- int NbPrisms() throw(SALOME_Exception);
-
- int NbPolyhedrons() throw(SALOME_Exception);
-
- int NbSubMesh() throw(SALOME_Exception);
-
- int NbGroup() const { return _mapGroup.size(); }
-
- SMESH_Group* AddGroup (const SMDSAbs_ElementType theType,
- const char* theName,
- int& theId,
- const TopoDS_Shape& theShape=TopoDS_Shape());
-
- SMESH_Group* GetGroup (const int theGroupID);
-
- list<int> GetGroupIds();
-
- void RemoveGroup (const int theGroupID);
-
- // Propagation hypothesis management
-
- const SMESH_Hypothesis* IsLocal1DHypothesis (const TopoDS_Shape& theEdge);
- // Returns a local 1D hypothesis used for theEdge.
-
- bool IsPropagationHypothesis (const TopoDS_Shape& theEdge);
- // Returns true, if a local Propagation hypothesis is set directly on <theEdge>
-
- bool IsPropagatedHypothesis (const TopoDS_Shape& theEdge,
- TopoDS_Shape& theMainEdge);
- // Returns true, if a local 1D hypothesis is
- // propagated on <theEdge> from some other edge.
- // Returns through <theMainEdge> the edge, from
- // which the 1D hypothesis is propagated on <theEdge>
-
- bool IsReversedInChain (const TopoDS_Shape& theEdge,
- const TopoDS_Shape& theMainEdge);
- // Returns true if theEdge should be reversed to be
- // co-directed with theMainEdge
-
- bool RebuildPropagationChains();
- bool RemovePropagationChain (const TopoDS_Shape& theMainEdge);
- bool BuildPropagationChain (const TopoDS_Shape& theMainEdge);
-
- SMDSAbs_ElementType GetElementType( const int id, const bool iselem );
-
- //
-
- ostream& Dump(ostream & save);
-
-private:
- // Propagation hypothesis management
- void CleanMeshOnPropagationChain(const TopoDS_Shape& theMainEdge);
- //
-
-private:
- int _id; // id given by creator (unique within the creator instance)
- int _studyId;
- int _idDoc; // id given by SMESHDS_Document
- int _groupId; // id generator for group objects
- bool _isShapeToMesh;// set to true when a shape is given (only once)
- list <SMESH_subMesh *> _subMeshesUsingHypothesisList;
- SMESHDS_Document * _myDocument;
- SMESHDS_Mesh * _myMeshDS;
- map <int, SMESH_subMesh *> _mapSubMesh;
- map <int, SMESH_Group *> _mapGroup;
- SMESH_Gen * _gen;
-
- TopTools_IndexedDataMapOfShapeListOfShape _mapAncestors;
-
- IndexedMapOfChain _mapPropagationChains; // Propagation hypothesis management
-};
-
-#endif
+++ /dev/null
-// SMESH SMESH : implementaion of SMESH idl descriptions
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESH_subMesh.hxx
-// Author : Paul RASCLE, EDF
-// Module : SMESH
-// $Header$
-
-#ifndef _SMESH_SUBMESH_HXX_
-#define _SMESH_SUBMESH_HXX_
-
-#include "SMESHDS_Mesh.hxx"
-#include "SMESHDS_SubMesh.hxx"
-#include "SMESH_Hypothesis.hxx"
-#include "Utils_SALOME_Exception.hxx"
-#include <TopoDS_Shape.hxx>
-#include <TColStd_IndexedMapOfTransient.hxx>
-#include <TopTools_IndexedDataMapOfShapeListOfShape.hxx>
-
-#include <set>
-#include <list>
-#include <map>
-
-class SMESH_Mesh;
-class SMESH_Hypothesis;
-class SMESH_Algo;
-class SMESH_Gen;
-
-class SMESH_subMesh
-{
- public:
- SMESH_subMesh(int Id, SMESH_Mesh * father, SMESHDS_Mesh * meshDS,
- const TopoDS_Shape & aSubShape);
- virtual ~ SMESH_subMesh();
-
- int GetId() const;
-
- // bool Contains(const TopoDS_Shape & aSubShape)
- // throw (SALOME_Exception);
-
- SMESH_Mesh* GetFather() { return _father; }
-
- SMESHDS_SubMesh * GetSubMeshDS();
-
- SMESHDS_SubMesh* CreateSubMeshDS();
- // Explicit SMESHDS_SubMesh creation method, required for persistence mechanism
-
- SMESH_subMesh *GetFirstToCompute();
-
- const map < int, SMESH_subMesh * >&DependsOn();
- //const map < int, SMESH_subMesh * >&Dependants();
-
- const TopoDS_Shape & GetSubShape();
-
-// bool _vertexSet; // only for vertex subMesh, set to false for dim > 0
-
- enum compute_state
- {
- NOT_READY, READY_TO_COMPUTE,
- COMPUTE_OK, FAILED_TO_COMPUTE
- };
- enum algo_state
- {
- NO_ALGO, MISSING_HYP, HYP_OK
- };
- enum algo_event
- {
- ADD_HYP, ADD_ALGO,
- REMOVE_HYP, REMOVE_ALGO,
- ADD_FATHER_HYP, ADD_FATHER_ALGO,
- REMOVE_FATHER_HYP, REMOVE_FATHER_ALGO
- };
- enum compute_event
- {
- MODIF_HYP, MODIF_ALGO_STATE, COMPUTE,
- CLEAN, CLEANDEP, SUBMESH_COMPUTED, SUBMESH_RESTORED,
- MESH_ENTITY_REMOVED, CHECK_COMPUTE_STATE
- };
-
- SMESH_Hypothesis::Hypothesis_Status
- AlgoStateEngine(int event, SMESH_Hypothesis * anHyp);
-
- SMESH_Hypothesis::Hypothesis_Status
- SubMeshesAlgoStateEngine(int event, SMESH_Hypothesis * anHyp);
-
- int GetAlgoState() { return _algoState; }
-
- void DumpAlgoState(bool isMain);
-
- bool ComputeStateEngine(int event);
-
- int GetComputeState()
- {
- return _computeState;
- };
-
- bool IsConform(const SMESH_Algo* theAlgo);
- // check if a conform mesh will be produced by the Algo
-
- bool CanAddHypothesis(const SMESH_Hypothesis* theHypothesis) const;
- // return true if theHypothesis can be attached to me:
- // its dimention is checked
-
- static bool IsApplicableHypotesis(const SMESH_Hypothesis* theHypothesis,
- const TopAbs_ShapeEnum theShapeType);
-
- bool IsApplicableHypotesis(const SMESH_Hypothesis* theHypothesis) const
- { return IsApplicableHypotesis( theHypothesis, _subShape.ShapeType() ); }
- // return true if theHypothesis can be used to mesh me:
- // its shape type is checked
-
- SMESH_Hypothesis::Hypothesis_Status CheckConcurentHypothesis (const int theHypType);
- // check if there are several applicable hypothesis on fathers
-
- protected:
- void InsertDependence(const TopoDS_Shape aSubShape);
-
- bool SubMeshesComputed();
-
- bool SubMeshesReady();
-
- void RemoveSubMeshElementsAndNodes();
- void UpdateDependantsState(const compute_event theEvent);
- void UpdateSubMeshState(const compute_state theState);
- void ComputeSubMeshStateEngine(int event);
- void CleanDependants();
- void CleanDependsOn();
- void SetAlgoState(int state);
-
- bool IsMeshComputed() const;
- // check if _subMeshDS contains mesh elements
-
- TopoDS_Shape GetCollection(SMESH_Gen * theGen, SMESH_Algo* theAlgo);
- // return a shape containing all sub-shapes of the MainShape that can be
- // meshed at once along with _subShape
-
- bool ApplyToCollection (SMESH_Algo* theAlgo,
- const TopoDS_Shape& theCollection);
- // Apply theAlgo to all subshapes in theCollection
-
- const SMESH_Hypothesis* GetSimilarAttached(const TopoDS_Shape& theShape,
- const SMESH_Hypothesis * theHyp,
- const int theHypType = 0);
- // return a hypothesis attached to theShape.
- // If theHyp is provided, similar but not same hypotheses
- // is returned; else an applicable ones having theHypType
- // is returned
-
- TopoDS_Shape _subShape;
- SMESHDS_Mesh * _meshDS;
- SMESHDS_SubMesh * _subMeshDS;
- int _Id;
- SMESH_Mesh *_father;
- map < int, SMESH_subMesh * >_mapDepend;
- bool _dependenceAnalysed;
-
- int _algoState;
- int _computeState;
-
-};
-
-#endif
+++ /dev/null
-# SMESH SMESHDS : management of mesh data and SMESH document
-#
-# Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-#
-# See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-#
-#
-#
-# File : Makefile.in
-# Author : Patrick GOLDBRONN (CEA)
-# Module : SMESH
-
-top_srcdir=@top_srcdir@
-top_builddir=../..
-srcdir=@srcdir@
-VPATH=.:@srcdir@:@top_srcdir@/idl
-
-
-@COMMENCE@
-
-# Libraries targets
-
-LIB = libSMESHDS.la
-LIB_SRC = \
- SMESHDS_Document.cxx \
- SMESHDS_Hypothesis.cxx \
- SMESHDS_Script.cxx \
- SMESHDS_Command.cxx \
- SMESHDS_SubMesh.cxx \
- SMESHDS_Mesh.cxx \
- SMESHDS_GroupBase.cxx \
- SMESHDS_Group.cxx \
- SMESHDS_GroupOnGeom.cxx
-
-LIB_CLIENT_IDL =
-LIB_SERVER_IDL =
-
-# Executables targets
-BIN =
-BIN_SRC =
-BIN_CLIENT_IDL =
-BIN_SERVER_IDL =
-
-# header files
-EXPORT_HEADERS= \
- SMESHDS_Document.hxx \
- SMESHDS_Hypothesis.hxx \
- SMESHDS_Mesh.hxx \
- SMESHDS_Script.hxx \
- SMESHDS_Command.hxx \
- SMESHDS_CommandType.hxx \
- SMESHDS_SubMesh.hxx \
- SMESHDS_GroupBase.hxx \
- SMESHDS_Group.hxx \
- SMESHDS_GroupOnGeom.hxx
-
-# additionnal information to compil and link file
-CPPFLAGS += $(OCC_INCLUDES) -I${KERNEL_ROOT_DIR}/include/salome $(BOOST_CPPFLAGS)
-CXXFLAGS += $(OCC_CXXFLAGS) -I${KERNEL_ROOT_DIR}/include/salome
-LDFLAGS += $(OCC_KERNEL_LIBS) -lSMDS
-
-
-# additional file to be cleaned
-MOSTLYCLEAN =
-CLEAN =
-DISTCLEAN =
-
-@CONCLUDE@
+++ /dev/null
-// SMESH SMESHDS : management of mesh data and SMESH document
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESH_Command.cxx
-// Author : Yves FRICAUD, OCC
-// Module : SMESH
-// $Header:
-
-#include "SMESHDS_Command.hxx"
-
-#include "utilities.h"
-
-using namespace std;
-
-//=======================================================================
-//function :
-//purpose :
-//=======================================================================
-SMESHDS_Command::SMESHDS_Command(const SMESHDS_CommandType aType):myType(aType),
-myNumber(0)
-{
-}
-
-//=======================================================================
-//function :
-//purpose :
-//=======================================================================
-void SMESHDS_Command::AddNode(int NewNodeID, double x, double y, double z)
-{
- if (!myType == SMESHDS_AddNode)
- {
- MESSAGE("SMESHDS_Command::AddNode : Bad Type");
- return;
- }
- myIntegers.push_back(NewNodeID);
- myReals.push_back(x);
- myReals.push_back(y);
- myReals.push_back(z);
- myNumber++;
-}
-
-//=======================================================================
-//function :
-//purpose :
-//=======================================================================
-void SMESHDS_Command::MoveNode(int NodeID, double x, double y, double z)
-{
- if (!myType == SMESHDS_MoveNode)
- {
- MESSAGE("SMESHDS_Command::MoveNode : Bad Type");
- return;
- }
- myIntegers.push_back(NodeID);
- myReals.push_back(x);
- myReals.push_back(y);
- myReals.push_back(z);
- myNumber++;
-}
-
-//=======================================================================
-//function :
-//purpose :
-//=======================================================================
-void SMESHDS_Command::AddEdge(int NewEdgeID, int idnode1, int idnode2)
-{
- if (!myType == SMESHDS_AddEdge)
- {
- MESSAGE("SMESHDS_Command::AddEdge : Bad Type");
- return;
- }
- myIntegers.push_back(NewEdgeID);
- myIntegers.push_back(idnode1);
- myIntegers.push_back(idnode2);
- myNumber++;
-}
-
-//=======================================================================
-//function :
-//purpose :
-//=======================================================================
-void SMESHDS_Command::AddFace(int NewFaceID,
- int idnode1, int idnode2, int idnode3)
-{
- if (!myType == SMESHDS_AddTriangle)
- {
- MESSAGE("SMESHDS_Command::AddFace : Bad Type");
- return;
- }
- myIntegers.push_back(NewFaceID);
- myIntegers.push_back(idnode1);
- myIntegers.push_back(idnode2);
- myIntegers.push_back(idnode3);
- myNumber++;
-}
-
-//=======================================================================
-//function :
-//purpose :
-//=======================================================================
-void SMESHDS_Command::AddFace(int NewFaceID,
- int idnode1, int idnode2, int idnode3, int idnode4)
-{
- if (!myType == SMESHDS_AddQuadrangle)
- {
- MESSAGE("SMESHDS_Command::AddFace : Bad Type");
- return;
- }
- myIntegers.push_back(NewFaceID);
- myIntegers.push_back(idnode1);
- myIntegers.push_back(idnode2);
- myIntegers.push_back(idnode3);
- myIntegers.push_back(idnode4);
- myNumber++;
-}
-
-//=======================================================================
-//function :
-//purpose :
-//=======================================================================
-void SMESHDS_Command::AddVolume(int NewVolID,
- int idnode1, int idnode2, int idnode3, int idnode4)
-{
- if (!myType == SMESHDS_AddTetrahedron)
- {
- MESSAGE("SMESHDS_Command::AddVolume : Bad Type");
- return;
- }
- myIntegers.push_back(NewVolID);
- myIntegers.push_back(idnode1);
- myIntegers.push_back(idnode2);
- myIntegers.push_back(idnode3);
- myIntegers.push_back(idnode4);
- myNumber++;
-}
-
-//=======================================================================
-//function :
-//purpose :
-//=======================================================================
-void SMESHDS_Command::AddVolume(int NewVolID,
- int idnode1, int idnode2, int idnode3, int idnode4, int idnode5)
-{
- if (!myType == SMESHDS_AddPyramid)
- {
- MESSAGE("SMESHDS_Command::AddVolume : Bad Type");
- return;
- }
- myIntegers.push_back(NewVolID);
- myIntegers.push_back(idnode1);
- myIntegers.push_back(idnode2);
- myIntegers.push_back(idnode3);
- myIntegers.push_back(idnode4);
- myIntegers.push_back(idnode5);
- myNumber++;
-}
-
-//=======================================================================
-//function :
-//purpose :
-//=======================================================================
-void SMESHDS_Command::AddVolume(int NewVolID,
- int idnode1,
- int idnode2, int idnode3, int idnode4, int idnode5, int idnode6)
-{
- if (!myType == SMESHDS_AddPrism)
- {
- MESSAGE("SMESHDS_Command::AddVolume : Bad Type");
- return;
- }
- myIntegers.push_back(NewVolID);
- myIntegers.push_back(idnode1);
- myIntegers.push_back(idnode2);
- myIntegers.push_back(idnode3);
- myIntegers.push_back(idnode4);
- myIntegers.push_back(idnode5);
- myIntegers.push_back(idnode6);
- myNumber++;
-}
-
-//=======================================================================
-//function :
-//purpose :
-//=======================================================================
-void SMESHDS_Command::AddVolume(int NewVolID,
- int idnode1,
- int idnode2,
- int idnode3,
- int idnode4, int idnode5, int idnode6, int idnode7, int idnode8)
-{
- if (!myType == SMESHDS_AddHexahedron)
- {
- MESSAGE("SMESHDS_Command::AddVolume : Bad Type");
- return;
- }
- myIntegers.push_back(NewVolID);
- myIntegers.push_back(idnode1);
- myIntegers.push_back(idnode2);
- myIntegers.push_back(idnode3);
- myIntegers.push_back(idnode4);
- myIntegers.push_back(idnode5);
- myIntegers.push_back(idnode6);
- myIntegers.push_back(idnode7);
- myIntegers.push_back(idnode8);
- myNumber++;
-}
-
-//=======================================================================
-//function : AddPolygonalFace
-//purpose :
-//=======================================================================
-void SMESHDS_Command::AddPolygonalFace (const int ElementID,
- std::vector<int> nodes_ids)
-{
- if (!myType == SMESHDS_AddPolygon) {
- MESSAGE("SMESHDS_Command::AddPolygonalFace : Bad Type");
- return;
- }
- myIntegers.push_back(ElementID);
-
- int i, nbNodes = nodes_ids.size();
- myIntegers.push_back(nbNodes);
- for (i = 0; i < nbNodes; i++) {
- myIntegers.push_back(nodes_ids[i]);
- }
-
- myNumber++;
-}
-
-//=======================================================================
-//function : AddPolyhedralVolume
-//purpose :
-//=======================================================================
-void SMESHDS_Command::AddPolyhedralVolume (const int ElementID,
- std::vector<int> nodes_ids,
- std::vector<int> quantities)
-{
- if (!myType == SMESHDS_AddPolyhedron) {
- MESSAGE("SMESHDS_Command::AddPolyhedralVolume : Bad Type");
- return;
- }
- myIntegers.push_back(ElementID);
-
- int i, nbNodes = nodes_ids.size();
- myIntegers.push_back(nbNodes);
- for (i = 0; i < nbNodes; i++) {
- myIntegers.push_back(nodes_ids[i]);
- }
-
- int nbFaces = quantities.size();
- myIntegers.push_back(nbFaces);
- for (i = 0; i < nbFaces; i++) {
- myIntegers.push_back(quantities[i]);
- }
-
- myNumber++;
-}
-
-//=======================================================================
-//function :
-//purpose :
-//=======================================================================
-void SMESHDS_Command::RemoveNode(int NodeID)
-{
- if (!myType == SMESHDS_RemoveNode)
- {
- MESSAGE("SMESHDS_Command::RemoveNode : Bad Type");
- return;
- }
- myIntegers.push_back(NodeID);
- myNumber++;
-}
-
-//=======================================================================
-//function :
-//purpose :
-//=======================================================================
-void SMESHDS_Command::RemoveElement(int ElementID)
-{
- if (!myType == SMESHDS_RemoveElement)
- {
- MESSAGE("SMESHDS_Command::RemoveElement : Bad Type");
- return;
- }
- myIntegers.push_back(ElementID);
- myNumber++;
-}
-
-//=======================================================================
-//function : ChangeElementNodes
-//purpose :
-//=======================================================================
-
-void SMESHDS_Command::ChangeElementNodes(int ElementID, int nodes[], int nbnodes)
-{
- if (!myType == SMESHDS_ChangeElementNodes)
- {
- MESSAGE("SMESHDS_Command::ChangeElementNodes : Bad Type");
- return;
- }
- myIntegers.push_back(ElementID);
- myIntegers.push_back(nbnodes);
- for ( int i = 0; i < nbnodes; i++ )
- myIntegers.push_back( nodes[ i ] );
-
- myNumber++;
-}
-
-//=======================================================================
-//function : ChangePolyhedronNodes
-//purpose :
-//=======================================================================
-void SMESHDS_Command::ChangePolyhedronNodes (const int ElementID,
- std::vector<int> nodes_ids,
- std::vector<int> quantities)
-{
- if (myType != SMESHDS_ChangePolyhedronNodes)
- {
- MESSAGE("SMESHDS_Command::ChangePolyhedronNodes : Bad Type");
- return;
- }
- myIntegers.push_back(ElementID);
-
- int i, nbNodes = nodes_ids.size();
- myIntegers.push_back(nbNodes);
- for (i = 0; i < nbNodes; i++) {
- myIntegers.push_back(nodes_ids[i]);
- }
-
- int nbFaces = quantities.size();
- myIntegers.push_back(nbFaces);
- for (i = 0; i < nbFaces; i++) {
- myIntegers.push_back(quantities[i]);
- }
-
- myNumber++;
-}
-
-//=======================================================================
-//function : Renumber
-//purpose :
-//=======================================================================
-
-void SMESHDS_Command::Renumber (const bool isNodes, const int startID, const int deltaID)
-{
- if (!myType == SMESHDS_Renumber)
- {
- MESSAGE("SMESHDS_Command::Renumber : Bad Type");
- return;
- }
- myIntegers.push_back(isNodes);
- myIntegers.push_back(startID);
- myIntegers.push_back(deltaID);
- myNumber++;
-}
-
-//=======================================================================
-//function :
-//purpose :
-//=======================================================================
-SMESHDS_CommandType SMESHDS_Command::GetType()
-{
- return myType;
-}
-
-//=======================================================================
-//function :
-//purpose :
-//=======================================================================
-int SMESHDS_Command::GetNumber()
-{
- return myNumber;
-}
-
-//=======================================================================
-//function :
-//purpose :
-//=======================================================================
-const list < int >&SMESHDS_Command::GetIndexes()
-{
- return myIntegers;
-}
-
-//=======================================================================
-//function :
-//purpose :
-//=======================================================================
-const list < double >&SMESHDS_Command::GetCoords()
-{
- return myReals;
-}
+++ /dev/null
-// SMESH SMESHDS : management of mesh data and SMESH document
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESHDS_Command.hxx
-// Module : SMESH
-
-#ifndef _SMESHDS_Command_HeaderFile
-#define _SMESHDS_Command_HeaderFile
-
-#include "SMESHDS_CommandType.hxx"
-#include <list>
-#include <vector>
-
-class SMESHDS_Command
-{
-
- public:
- SMESHDS_Command(const SMESHDS_CommandType aType);
- void AddNode(int NewNodeID, double x, double y, double z);
- void AddEdge(int NewEdgeID, int idnode1, int idnode2);
- void AddFace(int NewFaceID, int idnode1, int idnode2, int idnode3);
- void AddFace(int NewFaceID, int idnode1, int idnode2, int idnode3,
- int idnode4);
- void AddVolume(int NewVolID, int idnode1, int idnode2, int idnode3,
- int idnode4);
- void AddVolume(int NewVolID, int idnode1, int idnode2, int idnode3,
- int idnode4, int idnode5);
- void AddVolume(int NewVolID, int idnode1, int idnode2, int idnode3,
- int idnode4, int idnode5, int idnode6);
- void AddVolume(int NewVolID, int idnode1, int idnode2, int idnode3,
- int idnode4, int idnode5, int idnode6, int idnode7, int idnode8);
- void AddPolygonalFace (const int ElementID,
- std::vector<int> nodes_ids);
- void AddPolyhedralVolume (const int ElementID,
- std::vector<int> nodes_ids,
- std::vector<int> quantities);
- void MoveNode(int NewNodeID, double x, double y, double z);
- void RemoveNode(int NodeID);
- void RemoveElement(int ElementID);
- void ChangeElementNodes(int ElementID, int nodes[], int nbnodes);
- void ChangePolyhedronNodes(const int ElementID,
- std::vector<int> nodes_ids,
- std::vector<int> quantities);
- void Renumber (const bool isNodes, const int startID, const int deltaID);
- SMESHDS_CommandType GetType();
- int GetNumber();
- const std::list<int> & GetIndexes();
- const std::list<double> & GetCoords();
- ~SMESHDS_Command();
- private:
- SMESHDS_CommandType myType;
- int myNumber;
- std::list<double> myReals;
- std::list<int> myIntegers;
-};
-#endif
+++ /dev/null
-// SMESH SMESHDS : management of mesh data and SMESH document
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESHDS_CommandType.hxx
-// Module : SMESH
-
-#ifndef _SMESHDS_CommandType_HeaderFile
-#define _SMESHDS_CommandType_HeaderFile
-
-//#include <Standard_PrimitiveTypes.hxx>
-
-enum SMESHDS_CommandType {
- SMESHDS_AddNode,
- SMESHDS_AddEdge,
- SMESHDS_AddTriangle,
- SMESHDS_AddQuadrangle,
- SMESHDS_AddPolygon,
- SMESHDS_AddTetrahedron,
- SMESHDS_AddPyramid,
- SMESHDS_AddPrism,
- SMESHDS_AddHexahedron,
- SMESHDS_AddPolyhedron,
- SMESHDS_RemoveNode,
- SMESHDS_RemoveElement,
- SMESHDS_MoveNode,
- SMESHDS_ChangeElementNodes,
- SMESHDS_ChangePolyhedronNodes,
- SMESHDS_Renumber
-};
-
-
-#endif
+++ /dev/null
-// SMESH SMESHDS : management of mesh data and SMESH document
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESHDS_Document.cxx
-// Author : Yves FRICAUD, OCC
-// Module : SMESH
-// $Header:
-
-#include "SMESHDS_Document.hxx"
-#include "utilities.h"
-
-using namespace std;
-
-//=======================================================================
-//function : Create
-//purpose :
-//=======================================================================
-SMESHDS_Document::SMESHDS_Document(int UserID):myUserID(UserID)
-{
-}
-
-//=======================================================================
-//function : NewMesh
-//purpose :
-//=======================================================================
-int SMESHDS_Document::NewMesh()
-{
- static int NewMeshID = 0;
- NewMeshID++;
- SMESHDS_Mesh *aNewMesh = new SMESHDS_Mesh(NewMeshID);
- myMeshes[NewMeshID] = aNewMesh;
- return NewMeshID;
-}
-
-//=======================================================================
-//function : GetMesh
-//purpose :
-//=======================================================================
-SMESHDS_Mesh *SMESHDS_Document::GetMesh(int MeshID)
-{
- map<int,SMESHDS_Mesh*>::iterator it=myMeshes.find(MeshID);
- if (it==myMeshes.end())
- {
- MESSAGE("SMESHDS_Document::GetMesh : ID not found");
- return NULL;
- }
- else return (*it).second;
-}
-
-//=======================================================================
-//function : RemoveMesh
-//purpose :
-//=======================================================================
-void SMESHDS_Document::RemoveMesh(int MeshID)
-{
- map<int,SMESHDS_Mesh*>::iterator it=myMeshes.find(MeshID);
- if (it==myMeshes.end())
- MESSAGE("SMESHDS_Document::RemoveMesh : ID not found");
- myMeshes.erase(it);
-}
-
-//=======================================================================
-//function : AddHypothesis
-//purpose :
-//=======================================================================
-void SMESHDS_Document::AddHypothesis(SMESHDS_Hypothesis * H)
-{
- myHypothesis[H->GetID()]=H;
-}
-
-//=======================================================================
-//function : GetHypothesis
-//purpose :
-//=======================================================================
-SMESHDS_Hypothesis * SMESHDS_Document::GetHypothesis(int HypID)
-{
- map<int,SMESHDS_Hypothesis*>::iterator it=myHypothesis.find(HypID);
- if (it==myHypothesis.end())
- {
- MESSAGE("SMESHDS_Document::GetHypothesis : ID not found");
- return NULL;
- }
- else return (*it).second;
-}
-
-//=======================================================================
-//function : RemoveHypothesis
-//purpose :
-//=======================================================================
-void SMESHDS_Document::RemoveHypothesis(int HypID)
-{
- map<int,SMESHDS_Hypothesis*>::iterator it=myHypothesis.find(HypID);
- if (it==myHypothesis.end())
- MESSAGE("SMESHDS_Document::RemoveHypothesis : ID not found");
- myHypothesis.erase(it);
-}
-
-//=======================================================================
-//function : NbMeshes
-//purpose :
-//=======================================================================
-int SMESHDS_Document::NbMeshes()
-{
- return myMeshes.size();
-}
-
-//=======================================================================
-//function : NbHypothesis
-//purpose :
-//=======================================================================
-int SMESHDS_Document::NbHypothesis()
-{
- return myHypothesis.size();
-}
-
-//=======================================================================
-//function : InitMeshesIterator
-//purpose :
-//=======================================================================
-void SMESHDS_Document::InitMeshesIterator()
-{
- myMeshesIt=myMeshes.begin();
-}
-
-//=======================================================================
-//function : NextMesh
-//purpose :
-//=======================================================================
-SMESHDS_Mesh * SMESHDS_Document::NextMesh()
-{
- SMESHDS_Mesh * toReturn=(*myMeshesIt).second;
- myMeshesIt++;
- return toReturn;
-}
-
-//=======================================================================
-//function : MoreMesh
-//purpose :
-//=======================================================================
-bool SMESHDS_Document::MoreMesh()
-{
- return myMeshesIt!=myMeshes.end();
-}
-
-//=======================================================================
-//function : InitHypothesisIterator
-//purpose :
-//=======================================================================
-void SMESHDS_Document::InitHypothesisIterator()
-{
- myHypothesisIt=myHypothesis.begin();
-}
-
-//=======================================================================
-//function : NextMesh
-//purpose :
-//=======================================================================
-SMESHDS_Hypothesis * SMESHDS_Document::NextHypothesis()
-{
- SMESHDS_Hypothesis * toReturn=(*myHypothesisIt).second;
- myHypothesisIt++;
- return toReturn;
-}
-
-//=======================================================================
-//function : MoreMesh
-//purpose :
-//=======================================================================
-bool SMESHDS_Document::MoreHypothesis()
-{
- return myHypothesisIt!=myHypothesis.end();
-}
+++ /dev/null
-// SMESH SMESHDS : management of mesh data and SMESH document
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESHDS_Document.hxx
-// Module : SMESH
-
-#ifndef _SMESHDS_Document_HeaderFile
-#define _SMESHDS_Document_HeaderFile
-
-#include "SMESHDS_Mesh.hxx"
-#include "SMESHDS_Hypothesis.hxx"
-#include <map>
-
-
-class SMESHDS_Document
-{
- public:
- SMESHDS_Document(int UserID);
- int NewMesh();
- void RemoveMesh(int MeshID);
- SMESHDS_Mesh * GetMesh(int MeshID);
- void AddHypothesis(SMESHDS_Hypothesis * H);
- void RemoveHypothesis(int HypID);
- SMESHDS_Hypothesis * GetHypothesis(int HypID);
- int NbMeshes();
- int NbHypothesis();
- void InitMeshesIterator();
- SMESHDS_Mesh * NextMesh();
- bool MoreMesh();
- void InitHypothesisIterator();
- SMESHDS_Hypothesis * NextHypothesis();
- bool MoreHypothesis();
- ~SMESHDS_Document();
-
- private:
- int myUserID;
- std::map<int,SMESHDS_Mesh*> myMeshes;
- std::map<int,SMESHDS_Hypothesis*> myHypothesis;
- std::map<int,SMESHDS_Mesh*>::iterator myMeshesIt;
- std::map<int,SMESHDS_Hypothesis*>::iterator myHypothesisIt;
-};
-
-#endif
+++ /dev/null
-// SMESH SMESHDS : idl implementation based on 'SMESH' unit's classes
-//
-// Copyright (C) 2004 CEA
-//
-// 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.org
-//
-//
-//
-// File : SMESHDS_Group.cxx
-// Module : SMESH
-// $Header$
-
-#include "SMESHDS_Group.hxx"
-#include "SMESHDS_Mesh.hxx"
-
-using namespace std;
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-SMESHDS_Group::SMESHDS_Group (const int theID,
- const SMESHDS_Mesh* theMesh,
- const SMDSAbs_ElementType theType)
- : SMESHDS_GroupBase(theID,theMesh,theType),
- myGroup(theMesh,theType)
-{
-}
-
-//=======================================================================
-//function : Extent
-//purpose :
-//=======================================================================
-
-int SMESHDS_Group::Extent()
-{
- return myGroup.Extent();
-}
-
-//=======================================================================
-//function : IsEmpty
-//purpose :
-//=======================================================================
-
-bool SMESHDS_Group::IsEmpty()
-{
- return myGroup.IsEmpty();
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-bool SMESHDS_Group::Contains (const int theID)
-{
- const SMDS_MeshElement* aElem = findInMesh (theID);
- if (aElem)
- return myGroup.Contains(aElem);
- return false;
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-bool SMESHDS_Group::Add (const int theID)
-{
- const SMDS_MeshElement* aElem = findInMesh (theID);
- if (!aElem || myGroup.Contains(aElem))
- return false;
-
- if (myGroup.IsEmpty())
- SetType( aElem->GetType() );
-
- myGroup.Add (aElem);
- resetIterator();
- return true;
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-bool SMESHDS_Group::Remove (const int theID)
-{
- const SMDS_MeshElement* aElem = findInMesh (theID);
- if (!aElem || !myGroup.Contains(aElem))
- return false;
- myGroup.Remove (aElem);
- resetIterator();
- return true;
-}
-
-//=======================================================================
-//function : Clear
-//purpose :
-//=======================================================================
-
-void SMESHDS_Group::Clear()
-{
- myGroup.Clear();
- resetIterator();
-}
-
-// =====================
-// class MyGroupIterator
-// =====================
-
-class MyGroupIterator: public SMDS_ElemIterator
-{
- const SMDS_MeshGroup& myGroup;
- public:
- MyGroupIterator(const SMDS_MeshGroup& group): myGroup(group) { myGroup.InitIterator(); }
- bool more() { return myGroup.More(); }
- const SMDS_MeshElement* next() { return myGroup.Next(); }
-};
-
-//=======================================================================
-//function : GetElements
-//purpose :
-//=======================================================================
-
-SMDS_ElemIteratorPtr SMESHDS_Group::GetElements()
-{
- return SMDS_ElemIteratorPtr( new MyGroupIterator ( myGroup ));
-}
-
-//=======================================================================
-//function : SetType
-//purpose :
-//=======================================================================
-
-void SMESHDS_Group::SetType(SMDSAbs_ElementType theType)
-{
- if ( myGroup.IsEmpty() || GetType() == SMDSAbs_All ) {
- SMESHDS_GroupBase::SetType( theType );
- myGroup.SetType ( theType );
- }
- else
- SMESHDS_GroupBase::SetType( myGroup.GetType() );
-}
-
+++ /dev/null
-// SMESH SMESHDS : management of mesh data and SMESH document
-//
-// Copyright (C) 2004 CEA
-//
-// 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.org
-//
-//
-//
-// File : SMESHDS_Group.hxx
-// Module : SMESH
-// $Header$
-
-#ifndef _SMESHDS_Group_HeaderFile
-#define _SMESHDS_Group_HeaderFile
-
-#include <string>
-#include "SMESHDS_GroupBase.hxx"
-#include "SMDS_MeshGroup.hxx"
-
-class SMESHDS_Mesh;
-
-class SMESHDS_Group : public SMESHDS_GroupBase
-{
- public:
-
- SMESHDS_Group (const int theID,
- const SMESHDS_Mesh* theMesh,
- const SMDSAbs_ElementType theType);
-
- virtual void SetType(SMDSAbs_ElementType theType);
-
- virtual int Extent();
-
- virtual bool IsEmpty();
-
- virtual bool Contains (const int theID);
-
- virtual SMDS_ElemIteratorPtr GetElements();
-
- bool SMESHDS_Group::Add (const int theID);
-
- bool SMESHDS_Group::Remove (const int theID);
-
- void Clear();
-
- SMDS_MeshGroup& SMDSGroup() { return myGroup; }
-
- private:
-
- SMDS_MeshGroup myGroup;
-
-};
-
-#endif
+++ /dev/null
-// SMESH SMESHDS : idl implementation based on 'SMESH' unit's classes
-//
-// Copyright (C) 2004 CEA
-//
-// 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.org
-//
-//
-//
-// File : SMESHDS_Group.cxx
-// Module : SMESH
-// $Header$
-
-#include "SMESHDS_GroupBase.hxx"
-#include "SMESHDS_Mesh.hxx"
-
-#include "utilities.h"
-
-using namespace std;
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-SMESHDS_GroupBase::SMESHDS_GroupBase (const int theID,
- const SMESHDS_Mesh* theMesh,
- const SMDSAbs_ElementType theType):
- myID(theID), myMesh(theMesh), myType(theType), myStoreName(""),
- myCurIndex(0), myCurID(-1)
-{
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-int SMESHDS_GroupBase::GetID (const int theIndex)
-{
- if (myCurIndex < 1 || myCurIndex > theIndex) {
- myIterator = GetElements();
- myCurIndex = 0;
- myCurID = -1;
- }
- while (myCurIndex < theIndex && myIterator->more()) {
- myCurIndex++;
- myCurID = myIterator->next()->GetID();
- }
- return myCurIndex == theIndex ? myCurID : -1;
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-const SMDS_MeshElement* SMESHDS_GroupBase::findInMesh (const int theID) const
-{
- SMDSAbs_ElementType aType = GetType();
- const SMDS_MeshElement* aElem = NULL;
- if (aType == SMDSAbs_Node) {
- aElem = GetMesh()->FindNode(theID);
- }
- else if (aType != SMDSAbs_All) {
- aElem = GetMesh()->FindElement(theID);
- if (aElem && aType != aElem->GetType())
- aElem = NULL;
- }
- return aElem;
-}
-
-//=============================================================================
-/*!
- * Internal method: resets cached iterator, should be called by ancestors
- * when they are modified (ex: Add() or Remove() )
- */
-//=============================================================================
-void SMESHDS_GroupBase::resetIterator()
-{
- myCurIndex = 0;
- myCurID = -1;
-}
-
-//=======================================================================
-//function : Extent
-//purpose :
-//=======================================================================
-
-int SMESHDS_GroupBase::Extent()
-{
- SMDS_ElemIteratorPtr it = GetElements();
- int nb = 0;
- if ( it )
- for ( ; it->more(); it->next() )
- nb++;
- return nb;
-}
-
-//=======================================================================
-//function : IsEmpty
-//purpose :
-//=======================================================================
-
-bool SMESHDS_GroupBase::IsEmpty()
-{
- SMDS_ElemIteratorPtr it = GetElements();
- return ( !it || !it->more() );
-}
-
-//=======================================================================
-//function : Contains
-//purpose :
-//=======================================================================
-
-bool SMESHDS_GroupBase::Contains (const int theID)
-{
- SMDS_ElemIteratorPtr it = GetElements();
- bool contains = false;
- if ( it )
- while ( !contains && it->more() )
- contains = ( it->next()->GetID() == theID );
- return contains;
-}
-
-//=======================================================================
-//function : SetType
-//purpose :
-//=======================================================================
-
-void SMESHDS_GroupBase::SetType(SMDSAbs_ElementType theType)
-{
- myType = theType;
-}
+++ /dev/null
-// SMESH SMESHDS : management of mesh data and SMESH document
-//
-// Copyright (C) 2004 CEA
-//
-// 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.org
-//
-//
-//
-// File : SMESHDS_Group.hxx
-// Module : SMESH
-// $Header$
-
-#ifndef _SMESHDS_GroupBase_HeaderFile
-#define _SMESHDS_GroupBase_HeaderFile
-
-#include <string>
-#include "SMDSAbs_ElementType.hxx"
-#include "SMDS_MeshElement.hxx"
-
-class SMESHDS_Mesh;
-
-class SMESHDS_GroupBase
-{
- public:
-
- SMESHDS_GroupBase (const int theID,
- const SMESHDS_Mesh* theMesh,
- const SMDSAbs_ElementType theType);
-
- int GetID() const { return myID; }
-
- const SMESHDS_Mesh* GetMesh() const { return myMesh; }
-
- virtual void SetType(SMDSAbs_ElementType theType);
-
- SMDSAbs_ElementType GetType() const { return myType; }
-
- void SetStoreName (const char* theName) { myStoreName = theName; }
-
- const char* GetStoreName () const { return myStoreName.c_str(); }
-
- virtual int Extent();
-
- virtual bool IsEmpty();
-
- virtual bool Contains (const int theID);
-
- virtual SMDS_ElemIteratorPtr GetElements() = 0;
-
- int GetID (const int theIndex);
- // use it for iterations 1..Extent()
-
- virtual ~SMESHDS_GroupBase() {}
-
- protected:
- const SMDS_MeshElement* findInMesh (const int theID) const;
- void resetIterator();
-
- private:
- SMESHDS_GroupBase (const SMESHDS_GroupBase& theOther);
- // prohibited copy constructor
- SMESHDS_GroupBase& operator = (const SMESHDS_GroupBase& theOther);
- // prohibited assign operator
-
- int myID;
- const SMESHDS_Mesh* myMesh;
- SMDSAbs_ElementType myType;
- std::string myStoreName;
- // for GetID()
- int myCurIndex;
- int myCurID;
- SMDS_ElemIteratorPtr myIterator;
-
-};
-
-#endif
+++ /dev/null
-// SMESH SMESHDS : idl implementation based on 'SMESH' unit's classes
-//
-// Copyright (C) 2004 CEA
-//
-// 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.org
-//
-//
-//
-// File : SMESHDS_GroupOnGeom.cxx
-// Module : SMESH
-// $Header$
-
-#include "SMESHDS_GroupOnGeom.hxx"
-#include "SMESHDS_Mesh.hxx"
-#include "utilities.h"
-
-using namespace std;
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-SMESHDS_GroupOnGeom::SMESHDS_GroupOnGeom (const int theID,
- const SMESHDS_Mesh* theMesh,
- const SMDSAbs_ElementType theType,
- const TopoDS_Shape& theShape)
- : SMESHDS_GroupBase(theID,theMesh,theType), myShape(theShape)
-{
- SMESHDS_Mesh* aMesh = const_cast<SMESHDS_Mesh*>(theMesh);
- mySubMesh = aMesh->MeshElements( aMesh->AddCompoundSubmesh( theShape ));
-}
-
-// =====================
-// class MyGroupIterator
-// =====================
-
-class MyIterator: public SMDS_ElemIterator
-{
- SMDSAbs_ElementType myType;
- SMDS_ElemIteratorPtr myElemIt;
- SMDS_NodeIteratorPtr myNodeIt;
- const SMDS_MeshElement* myElem;
- public:
- MyIterator(SMDSAbs_ElementType type, const SMESHDS_SubMesh* subMesh)
- : myType(type), myElem(0)
- {
- if ( subMesh )
- if ( myType == SMDSAbs_Node )
- myNodeIt = subMesh->GetNodes();
- else {
- myElemIt = subMesh->GetElements();
- next();
- }
- }
- bool more()
- {
- if ( myType == SMDSAbs_Node && myNodeIt )
- return myNodeIt->more();
- return ( myElem != 0 );
- }
- const SMDS_MeshElement* next()
- {
- if ( myType == SMDSAbs_Node && myNodeIt )
- return myNodeIt->next();
- const SMDS_MeshElement* res = myElem;
- myElem = 0;
- while ( myElemIt && myElemIt->more() ) {
- myElem = myElemIt->next();
- if ( myElem && myElem->GetType() == myType )
- break;
- else
- myElem = 0;
- }
- return res;
- }
-};
-
-//=======================================================================
-//function : GetElements
-//purpose :
-//=======================================================================
-
-SMDS_ElemIteratorPtr SMESHDS_GroupOnGeom::GetElements()
-{
- return SMDS_ElemIteratorPtr( new MyIterator ( GetType(), mySubMesh ));
-}
-
-//=======================================================================
-//function : Contains
-//purpose :
-//=======================================================================
-
-bool SMESHDS_GroupOnGeom::Contains (const int theID)
-{
- return mySubMesh->Contains( findInMesh( theID ));
-}
+++ /dev/null
-// SMESH SMESHDS : management of mesh data and SMESH document
-//
-// Copyright (C) 2004 CEA
-//
-// 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.org
-//
-//
-//
-// File : SMESHDS_GroupOnGeom.hxx
-// Module : SMESH
-// $Header$
-
-#ifndef _SMESHDS_GroupOnGeom_HeaderFile
-#define _SMESHDS_GroupOnGeom_HeaderFile
-
-#include "SMESHDS_GroupBase.hxx"
-#include <TopoDS_Shape.hxx>
-
-class SMESHDS_SubMesh;
-
-class SMESHDS_GroupOnGeom: public SMESHDS_GroupBase
-{
- public:
-
- SMESHDS_GroupOnGeom (const int theID,
- const SMESHDS_Mesh* theMesh,
- const SMDSAbs_ElementType theType,
- const TopoDS_Shape& theShape);
-
- TopoDS_Shape GetShape() const { return myShape; }
-
- virtual bool Contains (const int theID);
-
- virtual SMDS_ElemIteratorPtr GetElements();
-
- private:
-
- TopoDS_Shape myShape;
- const SMESHDS_SubMesh* mySubMesh;
-};
-
-#endif
+++ /dev/null
-// SMESH SMESHDS : management of mesh data and SMESH document
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESHDS_Hypothesis.cxx
-// Author : Paul RASCLE, EDF
-// Module : SMESH
-// $Header$
-
-#include "SMESHDS_Hypothesis.hxx"
-
-using namespace std;
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-SMESHDS_Hypothesis::SMESHDS_Hypothesis(int hypId)
-{
-// MESSAGE("SMESHDS_Hypothesis::SMESHDS_Hypothesis");
- _hypId = hypId;
- _name = "generic";
-// SCRUTE(_name);
-// SCRUTE(_hypId);
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-SMESHDS_Hypothesis::~SMESHDS_Hypothesis()
-{
-// MESSAGE("SMESHDS_Hypothesis::~SMESHDS_Hypothesis");
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-const char* SMESHDS_Hypothesis::GetName() const
-{
-// MESSAGE("SMESHDS_Hypothesis::GetName");
-// SCRUTE(_name);
-// SCRUTE(&_name);
- return _name.c_str();
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-int SMESHDS_Hypothesis::GetID() const
-{
-// MESSAGE("SMESHDS_Hypothesis::GetId");
-// SCRUTE(_hypId);
- return _hypId;
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-int SMESHDS_Hypothesis::GetType() const
-{
-// MESSAGE("SMESHDS_Hypothesis::GetType");
-// SCRUTE(_type);
- return _type;
-}
-
+++ /dev/null
-// SMESH SMESHDS : management of mesh data and SMESH document
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESHDS_Hypothesis.hxx
-// Author : Paul RASCLE, EDF
-// Module : SMESH
-// $Header$
-
-#ifndef _SMESHDS_HYPOTHESIS_HXX_
-#define _SMESHDS_HYPOTHESIS_HXX_
-
-#include <string>
-#include <iostream>
-
-class SMESHDS_Hypothesis
-{
-public:
- SMESHDS_Hypothesis(int hypId);
- virtual ~SMESHDS_Hypothesis();
-
- const char* GetName() const;
- int GetID() const;
- int GetType() const;
-
- virtual std::ostream & SaveTo(std::ostream & save)=0;
- virtual std::istream & LoadFrom(std::istream & load)=0;
-
-enum hypothesis_type {PARAM_ALGO, ALGO, ALGO_1D, ALGO_2D, ALGO_3D};
-
-protected:
- std::string _name;
- int _hypId;
- int _type;
-};
-
-#endif
+++ /dev/null
-// SMESH SMESHDS : management of mesh data and SMESH document
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESH_Mesh.cxx
-// Author : Yves FRICAUD, OCC
-// Module : SMESH
-// $Header:
-
-#include "SMESHDS_Mesh.hxx"
-
-#include "SMESHDS_Group.hxx"
-#include "SMDS_VertexPosition.hxx"
-#include "SMDS_EdgePosition.hxx"
-#include "SMDS_FacePosition.hxx"
-#include "SMESHDS_GroupOnGeom.hxx"
-#include <TopExp_Explorer.hxx>
-#include <TopExp.hxx>
-#include <TopoDS_Iterator.hxx>
-
-#include "utilities.h"
-
-using namespace std;
-
-//=======================================================================
-//function : Create
-//purpose :
-//=======================================================================
-SMESHDS_Mesh::SMESHDS_Mesh(int MeshID):myMeshID(MeshID)
-{
- myScript = new SMESHDS_Script();
-}
-
-//=======================================================================
-//function : ShapeToMesh
-//purpose :
-//=======================================================================
-void SMESHDS_Mesh::ShapeToMesh(const TopoDS_Shape & S)
-{
- if ( !myShape.IsNull() && S.IsNull() )
- {
- // removal of a shape to mesh, delete ...
- // - hypotheses
- myShapeToHypothesis.clear();
- // - shape indices in SMDS_Position of nodes
- map<int,SMESHDS_SubMesh*>::iterator i_sub = myShapeIndexToSubMesh.begin();
- for ( ; i_sub != myShapeIndexToSubMesh.end(); i_sub++ ) {
- if ( !i_sub->second->IsComplexSubmesh() ) {
- SMDS_NodeIteratorPtr nIt = i_sub->second->GetNodes();
- while ( nIt->more() )
- nIt->next()->GetPosition()->SetShapeId( 0 );
- }
- }
- // - sub-meshes
- myIndexToShape.Clear();
- myShapeIndexToSubMesh.clear();
- // - groups on geometry
- set<SMESHDS_GroupBase*>::iterator gr = myGroups.begin();
- while ( gr != myGroups.end() ) {
- if ( dynamic_cast<SMESHDS_GroupOnGeom*>( *gr ))
- myGroups.erase( gr++ );
- else
- gr++;
- }
- }
- else {
- myShape = S;
- if ( !S.IsNull() )
- TopExp::MapShapes(myShape, myIndexToShape);
- }
-}
-
-//=======================================================================
-//function : AddHypothesis
-//purpose :
-//=======================================================================
-
-bool SMESHDS_Mesh::AddHypothesis(const TopoDS_Shape & SS,
- const SMESHDS_Hypothesis * H)
-{
- list<const SMESHDS_Hypothesis *>& alist=myShapeToHypothesis[SS];
-
- //Check if the Hypothesis is still present
- list<const SMESHDS_Hypothesis*>::iterator ith=alist.begin();
-
- for (; ith!=alist.end(); ith++)
- if (H == *ith) return false;
-
- alist.push_back(H);
- return true;
-}
-
-//=======================================================================
-//function : RemoveHypothesis
-//purpose :
-//=======================================================================
-
-bool SMESHDS_Mesh::RemoveHypothesis(const TopoDS_Shape & S,
- const SMESHDS_Hypothesis * H)
-{
- ShapeToHypothesis::iterator its=myShapeToHypothesis.find(S);
- if(its!=myShapeToHypothesis.end())
- {
- list<const SMESHDS_Hypothesis*>::iterator ith=(*its).second.begin();
-
- for (; ith!=(*its).second.end(); ith++)
- if (H == *ith)
- {
- (*its).second.erase(ith);
- return true;
- }
- }
- return false;
-}
-
-//=======================================================================
-//function : AddNode
-//purpose :
-//=======================================================================
-SMDS_MeshNode* SMESHDS_Mesh::AddNode(double x, double y, double z){
- SMDS_MeshNode* node = SMDS_Mesh::AddNode(x, y, z);
- if(node!=NULL) myScript->AddNode(node->GetID(), x, y, z);
- return node;
-}
-
-SMDS_MeshNode* SMESHDS_Mesh::AddNodeWithID(double x, double y, double z, int ID){
- SMDS_MeshNode* node = SMDS_Mesh::AddNodeWithID(x,y,z,ID);
- if(node!=NULL) myScript->AddNode(node->GetID(), x, y, z);
- return node;
-}
-
-//=======================================================================
-//function : MoveNode
-//purpose :
-//=======================================================================
-void SMESHDS_Mesh::MoveNode(const SMDS_MeshNode *n, double x, double y, double z)
-{
- SMDS_MeshNode * node=const_cast<SMDS_MeshNode*>(n);
- node->setXYZ(x,y,z);
- myScript->MoveNode(n->GetID(), x, y, z);
-}
-
-//=======================================================================
-//function : ChangeElementNodes
-//purpose :
-//=======================================================================
-
-bool SMESHDS_Mesh::ChangeElementNodes(const SMDS_MeshElement * elem,
- const SMDS_MeshNode * nodes[],
- const int nbnodes)
-{
- if ( ! SMDS_Mesh::ChangeElementNodes( elem, nodes, nbnodes ))
- return false;
-
- vector<int> IDs( nbnodes );
- for ( int i = 0; i < nbnodes; i++ )
- IDs [ i ] = nodes[ i ]->GetID();
- myScript->ChangeElementNodes( elem->GetID(), &IDs[0], nbnodes);
-
- return true;
-}
-
-//=======================================================================
-//function : ChangePolygonNodes
-//purpose :
-//=======================================================================
-bool SMESHDS_Mesh::ChangePolygonNodes
- (const SMDS_MeshElement * elem,
- vector<const SMDS_MeshNode*> nodes)
-{
- ASSERT(nodes.size() > 3);
-
- return ChangeElementNodes(elem, &nodes[0], nodes.size());
-}
-
-//=======================================================================
-//function : ChangePolyhedronNodes
-//purpose :
-//=======================================================================
-bool SMESHDS_Mesh::ChangePolyhedronNodes
- (const SMDS_MeshElement * elem,
- std::vector<const SMDS_MeshNode*> nodes,
- std::vector<int> quantities)
-{
- ASSERT(nodes.size() > 3);
-
- if (!SMDS_Mesh::ChangePolyhedronNodes(elem, nodes, quantities))
- return false;
-
- int i, len = nodes.size();
- std::vector<int> nodes_ids (len);
- for (i = 0; i < len; i++) {
- nodes_ids[i] = nodes[i]->GetID();
- }
- myScript->ChangePolyhedronNodes(elem->GetID(), nodes_ids, quantities);
-
- return true;
-}
-
-//=======================================================================
-//function : Renumber
-//purpose :
-//=======================================================================
-
-void SMESHDS_Mesh::Renumber (const bool isNodes, const int startID, const int deltaID)
-{
- SMDS_Mesh::Renumber( isNodes, startID, deltaID );
- myScript->Renumber( isNodes, startID, deltaID );
-}
-
-//=======================================================================
-//function :AddEdgeWithID
-//purpose :
-//=======================================================================
-SMDS_MeshEdge* SMESHDS_Mesh::AddEdgeWithID(int n1, int n2, int ID)
-{
- SMDS_MeshEdge* anElem = SMDS_Mesh::AddEdgeWithID(n1,n2,ID);
- if(anElem) myScript->AddEdge(ID,n1,n2);
- return anElem;
-}
-
-SMDS_MeshEdge* SMESHDS_Mesh::AddEdgeWithID(const SMDS_MeshNode * n1,
- const SMDS_MeshNode * n2,
- int ID)
-{
- return AddEdgeWithID(n1->GetID(),
- n2->GetID(),
- ID);
-}
-
-SMDS_MeshEdge* SMESHDS_Mesh::AddEdge(const SMDS_MeshNode * n1,
- const SMDS_MeshNode * n2)
-{
- SMDS_MeshEdge* anElem = SMDS_Mesh::AddEdge(n1,n2);
- if(anElem) myScript->AddEdge(anElem->GetID(),
- n1->GetID(),
- n2->GetID());
- return anElem;
-}
-
-//=======================================================================
-//function :AddFace
-//purpose :
-//=======================================================================
-SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(int n1, int n2, int n3, int ID)
-{
- SMDS_MeshFace *anElem = SMDS_Mesh::AddFaceWithID(n1, n2, n3, ID);
- if(anElem) myScript->AddFace(ID,n1,n2,n3);
- return anElem;
-}
-
-SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1,
- const SMDS_MeshNode * n2,
- const SMDS_MeshNode * n3,
- int ID)
-{
- return AddFaceWithID(n1->GetID(),
- n2->GetID(),
- n3->GetID(),
- ID);
-}
-
-SMDS_MeshFace* SMESHDS_Mesh::AddFace( const SMDS_MeshNode * n1,
- const SMDS_MeshNode * n2,
- const SMDS_MeshNode * n3)
-{
- SMDS_MeshFace *anElem = SMDS_Mesh::AddFace(n1, n2, n3);
- if(anElem) myScript->AddFace(anElem->GetID(),
- n1->GetID(),
- n2->GetID(),
- n3->GetID());
- return anElem;
-}
-
-//=======================================================================
-//function :AddFace
-//purpose :
-//=======================================================================
-SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(int n1, int n2, int n3, int n4, int ID)
-{
- SMDS_MeshFace *anElem = SMDS_Mesh::AddFaceWithID(n1, n2, n3, n4, ID);
- if(anElem) myScript->AddFace(ID, n1, n2, n3, n4);
- return anElem;
-}
-
-SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1,
- const SMDS_MeshNode * n2,
- const SMDS_MeshNode * n3,
- const SMDS_MeshNode * n4,
- int ID)
-{
- return AddFaceWithID(n1->GetID(),
- n2->GetID(),
- n3->GetID(),
- n4->GetID(),
- ID);
-}
-
-SMDS_MeshFace* SMESHDS_Mesh::AddFace(const SMDS_MeshNode * n1,
- const SMDS_MeshNode * n2,
- const SMDS_MeshNode * n3,
- const SMDS_MeshNode * n4)
-{
- SMDS_MeshFace *anElem = SMDS_Mesh::AddFace(n1, n2, n3, n4);
- if(anElem) myScript->AddFace(anElem->GetID(),
- n1->GetID(),
- n2->GetID(),
- n3->GetID(),
- n4->GetID());
- return anElem;
-}
-
-//=======================================================================
-//function :AddVolume
-//purpose :
-//=======================================================================
-SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(int n1, int n2, int n3, int n4, int ID)
-{
- SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolumeWithID(n1, n2, n3, n4, ID);
- if(anElem) myScript->AddVolume(ID, n1, n2, n3, n4);
- return anElem;
-}
-
-SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
- const SMDS_MeshNode * n2,
- const SMDS_MeshNode * n3,
- const SMDS_MeshNode * n4,
- int ID)
-{
- return AddVolumeWithID(n1->GetID(),
- n2->GetID(),
- n3->GetID(),
- n4->GetID(),
- ID);
-}
-
-SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
- const SMDS_MeshNode * n2,
- const SMDS_MeshNode * n3,
- const SMDS_MeshNode * n4)
-{
- SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1, n2, n3, n4);
- if(anElem) myScript->AddVolume(anElem->GetID(),
- n1->GetID(),
- n2->GetID(),
- n3->GetID(),
- n4->GetID());
- return anElem;
-}
-
-//=======================================================================
-//function :AddVolume
-//purpose :
-//=======================================================================
-SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(int n1, int n2, int n3, int n4, int n5, int ID)
-{
- SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolumeWithID(n1, n2, n3, n4, n5, ID);
- if(anElem) myScript->AddVolume(ID, n1, n2, n3, n4, n5);
- return anElem;
-}
-
-SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
- const SMDS_MeshNode * n2,
- const SMDS_MeshNode * n3,
- const SMDS_MeshNode * n4,
- const SMDS_MeshNode * n5,
- int ID)
-{
- return AddVolumeWithID(n1->GetID(),
- n2->GetID(),
- n3->GetID(),
- n4->GetID(),
- n5->GetID(),
- ID);
-}
-
-SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
- const SMDS_MeshNode * n2,
- const SMDS_MeshNode * n3,
- const SMDS_MeshNode * n4,
- const SMDS_MeshNode * n5)
-{
- SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1, n2, n3, n4, n5);
- if(anElem) myScript->AddVolume(anElem->GetID(),
- n1->GetID(),
- n2->GetID(),
- n3->GetID(),
- n4->GetID(),
- n5->GetID());
- return anElem;
-}
-
-//=======================================================================
-//function :AddVolume
-//purpose :
-//=======================================================================
-SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(int n1, int n2, int n3, int n4, int n5, int n6, int ID)
-{
- SMDS_MeshVolume *anElem= SMDS_Mesh::AddVolumeWithID(n1, n2, n3, n4, n5, n6, ID);
- if(anElem) myScript->AddVolume(ID, n1, n2, n3, n4, n5, n6);
- return anElem;
-}
-
-SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
- const SMDS_MeshNode * n2,
- const SMDS_MeshNode * n3,
- const SMDS_MeshNode * n4,
- const SMDS_MeshNode * n5,
- const SMDS_MeshNode * n6,
- int ID)
-{
- return AddVolumeWithID(n1->GetID(),
- n2->GetID(),
- n3->GetID(),
- n4->GetID(),
- n5->GetID(),
- n6->GetID(),
- ID);
-}
-
-SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
- const SMDS_MeshNode * n2,
- const SMDS_MeshNode * n3,
- const SMDS_MeshNode * n4,
- const SMDS_MeshNode * n5,
- const SMDS_MeshNode * n6)
-{
- SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1, n2, n3, n4, n5, n6);
- if(anElem) myScript->AddVolume(anElem->GetID(),
- n1->GetID(),
- n2->GetID(),
- n3->GetID(),
- n4->GetID(),
- n5->GetID(),
- n6->GetID());
- return anElem;
-}
-
-//=======================================================================
-//function :AddVolume
-//purpose :
-//=======================================================================
-SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(int n1, int n2, int n3, int n4, int n5, int n6, int n7, int n8, int ID)
-{
- SMDS_MeshVolume *anElem= SMDS_Mesh::AddVolumeWithID(n1, n2, n3, n4, n5, n6, n7, n8, ID);
- if(anElem) myScript->AddVolume(ID, n1, n2, n3, n4, n5, n6, n7, n8);
- return anElem;
-}
-
-SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1,
- const SMDS_MeshNode * n2,
- const SMDS_MeshNode * n3,
- const SMDS_MeshNode * n4,
- const SMDS_MeshNode * n5,
- const SMDS_MeshNode * n6,
- const SMDS_MeshNode * n7,
- const SMDS_MeshNode * n8,
- int ID)
-{
- return AddVolumeWithID(n1->GetID(),
- n2->GetID(),
- n3->GetID(),
- n4->GetID(),
- n5->GetID(),
- n6->GetID(),
- n7->GetID(),
- n8->GetID(),
- ID);
-}
-
-SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1,
- const SMDS_MeshNode * n2,
- const SMDS_MeshNode * n3,
- const SMDS_MeshNode * n4,
- const SMDS_MeshNode * n5,
- const SMDS_MeshNode * n6,
- const SMDS_MeshNode * n7,
- const SMDS_MeshNode * n8)
-{
- SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1, n2, n3, n4, n5, n6, n7, n8);
- if(anElem) myScript->AddVolume(anElem->GetID(),
- n1->GetID(),
- n2->GetID(),
- n3->GetID(),
- n4->GetID(),
- n5->GetID(),
- n6->GetID(),
- n7->GetID(),
- n8->GetID());
- return anElem;
-}
-
-//=======================================================================
-//function : AddPolygonalFace
-//purpose :
-//=======================================================================
-SMDS_MeshFace* SMESHDS_Mesh::AddPolygonalFaceWithID (std::vector<int> nodes_ids,
- const int ID)
-{
- SMDS_MeshFace *anElem = SMDS_Mesh::AddPolygonalFaceWithID(nodes_ids, ID);
- if (anElem) {
- myScript->AddPolygonalFace(ID, nodes_ids);
- }
- return anElem;
-}
-
-SMDS_MeshFace* SMESHDS_Mesh::AddPolygonalFaceWithID
- (std::vector<const SMDS_MeshNode*> nodes,
- const int ID)
-{
- SMDS_MeshFace *anElem = SMDS_Mesh::AddPolygonalFaceWithID(nodes, ID);
- if (anElem) {
- int i, len = nodes.size();
- std::vector<int> nodes_ids (len);
- for (i = 0; i < len; i++) {
- nodes_ids[i] = nodes[i]->GetID();
- }
- myScript->AddPolygonalFace(ID, nodes_ids);
- }
- return anElem;
-}
-
-SMDS_MeshFace* SMESHDS_Mesh::AddPolygonalFace
- (std::vector<const SMDS_MeshNode*> nodes)
-{
- SMDS_MeshFace *anElem = SMDS_Mesh::AddPolygonalFace(nodes);
- if (anElem) {
- int i, len = nodes.size();
- std::vector<int> nodes_ids (len);
- for (i = 0; i < len; i++) {
- nodes_ids[i] = nodes[i]->GetID();
- }
- myScript->AddPolygonalFace(anElem->GetID(), nodes_ids);
- }
- return anElem;
-}
-
-//=======================================================================
-//function : AddPolyhedralVolume
-//purpose :
-//=======================================================================
-SMDS_MeshVolume* SMESHDS_Mesh::AddPolyhedralVolumeWithID (std::vector<int> nodes_ids,
- std::vector<int> quantities,
- const int ID)
-{
- SMDS_MeshVolume *anElem = SMDS_Mesh::AddPolyhedralVolumeWithID(nodes_ids, quantities, ID);
- if (anElem) {
- myScript->AddPolyhedralVolume(ID, nodes_ids, quantities);
- }
- return anElem;
-}
-
-SMDS_MeshVolume* SMESHDS_Mesh::AddPolyhedralVolumeWithID
- (std::vector<const SMDS_MeshNode*> nodes,
- std::vector<int> quantities,
- const int ID)
-{
- SMDS_MeshVolume *anElem = SMDS_Mesh::AddPolyhedralVolumeWithID(nodes, quantities, ID);
- if (anElem) {
- int i, len = nodes.size();
- std::vector<int> nodes_ids (len);
- for (i = 0; i < len; i++) {
- nodes_ids[i] = nodes[i]->GetID();
- }
- myScript->AddPolyhedralVolume(ID, nodes_ids, quantities);
- }
- return anElem;
-}
-
-SMDS_MeshVolume* SMESHDS_Mesh::AddPolyhedralVolume
- (std::vector<const SMDS_MeshNode*> nodes,
- std::vector<int> quantities)
-{
- SMDS_MeshVolume *anElem = SMDS_Mesh::AddPolyhedralVolume(nodes, quantities);
- if (anElem) {
- int i, len = nodes.size();
- std::vector<int> nodes_ids (len);
- for (i = 0; i < len; i++) {
- nodes_ids[i] = nodes[i]->GetID();
- }
- myScript->AddPolyhedralVolume(anElem->GetID(), nodes_ids, quantities);
- }
- return anElem;
-}
-
-//=======================================================================
-//function : removeFromContainers
-//purpose :
-//=======================================================================
-
-static void removeFromContainers (map<int,SMESHDS_SubMesh*> & theSubMeshes,
- set<SMESHDS_GroupBase*>& theGroups,
- list<const SMDS_MeshElement *> & theElems,
- const bool isNode)
-{
- if ( theElems.empty() )
- return;
-
- // Rm from group
- // Element can belong to several groups
- if ( !theGroups.empty() )
- {
- set<SMESHDS_GroupBase*>::iterator GrIt = theGroups.begin();
- for ( ; GrIt != theGroups.end(); GrIt++ )
- {
- SMESHDS_Group* group = dynamic_cast<SMESHDS_Group*>( *GrIt );
- if ( !group || group->IsEmpty() ) continue;
-
- list<const SMDS_MeshElement *>::iterator elIt = theElems.begin();
- for ( ; elIt != theElems.end(); elIt++ )
- {
- group->SMDSGroup().Remove( *elIt );
- if ( group->IsEmpty() ) break;
- }
- }
- }
-
- // Rm from sub-meshes
- // Element should belong to only one sub-mesh
- map<int,SMESHDS_SubMesh*>::iterator SubIt = theSubMeshes.begin();
- for ( ; SubIt != theSubMeshes.end(); SubIt++ )
- {
- int size = isNode ? (*SubIt).second->NbNodes() : (*SubIt).second->NbElements();
- if ( size == 0 ) continue;
-
- list<const SMDS_MeshElement *>::iterator elIt = theElems.begin();
- while ( elIt != theElems.end() )
- {
- bool removed = false;
- if ( isNode )
- removed = (*SubIt).second->RemoveNode( static_cast<const SMDS_MeshNode*> (*elIt) );
- else
- removed = (*SubIt).second->RemoveElement( *elIt );
-
- if (removed)
- {
- elIt = theElems.erase( elIt );
- if ( theElems.empty() )
- return; // all elements are found and removed
- }
- else
- {
- elIt++ ;
- }
- }
- }
-}
-
-//=======================================================================
-//function : RemoveNode
-//purpose :
-//=======================================================================
-void SMESHDS_Mesh::RemoveNode(const SMDS_MeshNode * n)
-{
- myScript->RemoveNode(n->GetID());
-
- list<const SMDS_MeshElement *> removedElems;
- list<const SMDS_MeshElement *> removedNodes;
-
- SMDS_Mesh::RemoveElement( n, removedElems, removedNodes, true );
-
- removeFromContainers( myShapeIndexToSubMesh, myGroups, removedElems, false );
- removeFromContainers( myShapeIndexToSubMesh, myGroups, removedNodes, true );
-}
-
-//=======================================================================
-//function : RemoveElement
-//purpose :
-//========================================================================
-void SMESHDS_Mesh::RemoveElement(const SMDS_MeshElement * elt)
-{
- if (elt->GetType() == SMDSAbs_Node)
- {
- RemoveNode( static_cast<const SMDS_MeshNode*>( elt ));
- return;
- }
-
- myScript->RemoveElement(elt->GetID());
-
- list<const SMDS_MeshElement *> removedElems;
- list<const SMDS_MeshElement *> removedNodes;
-
- SMDS_Mesh::RemoveElement(elt, removedElems, removedNodes, false);
-
- removeFromContainers( myShapeIndexToSubMesh, myGroups, removedElems, false );
-}
-
-//=======================================================================
-//function : SetNodeOnVolume
-//purpose :
-//=======================================================================
-void SMESHDS_Mesh::SetNodeInVolume(SMDS_MeshNode * aNode,
- const TopoDS_Shell & S)
-{
- SetNodeInVolume( aNode, myIndexToShape.FindIndex(S) );
-}
-//=======================================================================
-//function : SetNodeOnVolume
-//purpose :
-//=======================================================================
-void SMESHDS_Mesh::SetNodeInVolume(SMDS_MeshNode * aNode,
- const TopoDS_Solid & S)
-{
- SetNodeInVolume( aNode, myIndexToShape.FindIndex(S) );
-}
-
-//=======================================================================
-//function : SetNodeOnFace
-//purpose :
-//=======================================================================
-void SMESHDS_Mesh::SetNodeOnFace(SMDS_MeshNode * aNode,
- const TopoDS_Face & S,
- double u,
- double v)
-{
- SetNodeOnFace( aNode, myIndexToShape.FindIndex(S), u, v );
-}
-
-//=======================================================================
-//function : SetNodeOnEdge
-//purpose :
-//=======================================================================
-void SMESHDS_Mesh::SetNodeOnEdge(SMDS_MeshNode * aNode,
- const TopoDS_Edge & S,
- double u)
-{
- SetNodeOnEdge( aNode, myIndexToShape.FindIndex(S), u );
-}
-
-//=======================================================================
-//function : SetNodeOnVertex
-//purpose :
-//=======================================================================
-void SMESHDS_Mesh::SetNodeOnVertex(SMDS_MeshNode * aNode,
- const TopoDS_Vertex & S)
-{
- SetNodeOnVertex( aNode, myIndexToShape.FindIndex(S));
-}
-
-//=======================================================================
-//function : UnSetNodeOnShape
-//purpose :
-//=======================================================================
-void SMESHDS_Mesh::UnSetNodeOnShape(const SMDS_MeshNode* aNode)
-{
- MESSAGE("not implemented");
-}
-
-//=======================================================================
-//function : SetMeshElementOnShape
-//purpose :
-//=======================================================================
-void SMESHDS_Mesh::SetMeshElementOnShape(const SMDS_MeshElement * anElement,
- const TopoDS_Shape & S)
-{
- if (myShape.IsNull()) MESSAGE("myShape is NULL");
-
- int Index = myIndexToShape.FindIndex(S);
-
- if (myShapeIndexToSubMesh.find(Index)==myShapeIndexToSubMesh.end())
- myShapeIndexToSubMesh[Index]=new SMESHDS_SubMesh();
-
- myShapeIndexToSubMesh[Index]->AddElement(anElement);
-}
-
-//=======================================================================
-//function : UnSetMeshElementOnShape
-//purpose :
-//=======================================================================
-void SMESHDS_Mesh::
-UnSetMeshElementOnShape(const SMDS_MeshElement * anElement,
- const TopoDS_Shape & S)
-{
- if (myShape.IsNull()) MESSAGE("myShape is NULL");
-
- int Index = myIndexToShape.FindIndex(S);
-
- if (myShapeIndexToSubMesh.find(Index)!=myShapeIndexToSubMesh.end())
- myShapeIndexToSubMesh[Index]->RemoveElement(anElement);
-}
-
-//=======================================================================
-//function : ShapeToMesh
-//purpose :
-//=======================================================================
-TopoDS_Shape SMESHDS_Mesh::ShapeToMesh() const
-{
- return myShape;
-}
-
-//=======================================================================
-//function : IsGroupOfSubShapes
-//purpose : return true if at least one subshape of theShape is a subshape
-// of myShape or theShape == myShape
-//=======================================================================
-
-bool SMESHDS_Mesh::IsGroupOfSubShapes (const TopoDS_Shape& theShape) const
-{
- if ( myShape.IsSame( theShape ))
- return true;
-
- for ( TopoDS_Iterator it( theShape ); it.More(); it.Next() ) {
- if (myIndexToShape.Contains( it.Value() ) ||
- IsGroupOfSubShapes( it.Value() ))
- return true;
- }
-
- return false;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-/// Return the sub mesh linked to the a given TopoDS_Shape or NULL if the given
-/// TopoDS_Shape is unknown
-///////////////////////////////////////////////////////////////////////////////
-SMESHDS_SubMesh * SMESHDS_Mesh::MeshElements(const TopoDS_Shape & S) const
-{
- if (myShape.IsNull()) MESSAGE("myShape is NULL");
-
- int Index = ShapeToIndex(S);
- TShapeIndexToSubMesh::const_iterator anIter = myShapeIndexToSubMesh.find(Index);
- if (anIter != myShapeIndexToSubMesh.end())
- return anIter->second;
- else
- return NULL;
-}
-
-///////////////////////////////////////////////////////////////////////////////
-/// Return the sub mesh by Id of shape it is linked to
-///////////////////////////////////////////////////////////////////////////////
-SMESHDS_SubMesh * SMESHDS_Mesh::MeshElements(const int Index)
-{
- if (myShape.IsNull()) MESSAGE("myShape is NULL");
-
- if (myShapeIndexToSubMesh.find(Index)!=myShapeIndexToSubMesh.end())
- return myShapeIndexToSubMesh[Index];
- else
- return NULL;
-}
-
-//=======================================================================
-//function : SubMeshIndices
-//purpose :
-//=======================================================================
-list<int> SMESHDS_Mesh::SubMeshIndices()
-{
- list<int> anIndices;
- std::map<int,SMESHDS_SubMesh*>::iterator anIter = myShapeIndexToSubMesh.begin();
- for (; anIter != myShapeIndexToSubMesh.end(); anIter++) {
- anIndices.push_back((*anIter).first);
- }
- return anIndices;
-}
-
-//=======================================================================
-//function : GetHypothesis
-//purpose :
-//=======================================================================
-
-const list<const SMESHDS_Hypothesis*>& SMESHDS_Mesh::GetHypothesis(
- const TopoDS_Shape & S) const
-{
- if (myShapeToHypothesis.find(S)!=myShapeToHypothesis.end())
- return myShapeToHypothesis.find(S)->second;
-
- static list<const SMESHDS_Hypothesis*> empty;
- return empty;
-}
-
-//=======================================================================
-//function : GetScript
-//purpose :
-//=======================================================================
-SMESHDS_Script* SMESHDS_Mesh::GetScript()
-{
- return myScript;
-}
-
-//=======================================================================
-//function : ClearScript
-//purpose :
-//=======================================================================
-void SMESHDS_Mesh::ClearScript()
-{
- myScript->Clear();
-}
-
-//=======================================================================
-//function : HasMeshElements
-//purpose :
-//=======================================================================
-bool SMESHDS_Mesh::HasMeshElements(const TopoDS_Shape & S)
-{
- if (myShape.IsNull()) MESSAGE("myShape is NULL");
- int Index = myIndexToShape.FindIndex(S);
- return myShapeIndexToSubMesh.find(Index)!=myShapeIndexToSubMesh.end();
-}
-
-//=======================================================================
-//function : HasHypothesis
-//purpose :
-//=======================================================================
-bool SMESHDS_Mesh::HasHypothesis(const TopoDS_Shape & S)
-{
- return myShapeToHypothesis.find(S)!=myShapeToHypothesis.end();
-}
-
-//=======================================================================
-//function : NewSubMesh
-//purpose :
-//=======================================================================
-SMESHDS_SubMesh * SMESHDS_Mesh::NewSubMesh(int Index)
-{
- SMESHDS_SubMesh* SM = 0;
- TShapeIndexToSubMesh::iterator anIter = myShapeIndexToSubMesh.find(Index);
- if (anIter == myShapeIndexToSubMesh.end())
- {
- SM = new SMESHDS_SubMesh();
- myShapeIndexToSubMesh[Index]=SM;
- }
- else
- SM = anIter->second;
- return SM;
-}
-
-//=======================================================================
-//function : AddCompoundSubmesh
-//purpose :
-//=======================================================================
-
-int SMESHDS_Mesh::AddCompoundSubmesh(const TopoDS_Shape& S,
- TopAbs_ShapeEnum type)
-{
- int aMainIndex = 0;
- if ( IsGroupOfSubShapes( S ) || (S.ShapeType() == TopAbs_VERTEX && myIndexToShape.Contains(S)) )
- {
- aMainIndex = myIndexToShape.Add( S );
- bool all = ( type == TopAbs_SHAPE );
- if ( all ) // corresponding simple submesh may exist
- aMainIndex = -aMainIndex;
- //MESSAGE("AddCompoundSubmesh index = " << aMainIndex );
- SMESHDS_SubMesh * aNewSub = NewSubMesh( aMainIndex );
- if ( !aNewSub->IsComplexSubmesh() ) // is empty
- {
- int shapeType = all ? myShape.ShapeType() : type;
- int typeLimit = all ? TopAbs_VERTEX : type;
- for ( ; shapeType <= typeLimit; shapeType++ )
- {
- TopExp_Explorer exp( S, TopAbs_ShapeEnum( shapeType ));
- for ( ; exp.More(); exp.Next() )
- {
- int index = myIndexToShape.FindIndex( exp.Current() );
- if ( index )
- aNewSub->AddSubMesh( NewSubMesh( index ));
- }
- }
- }
- }
- return aMainIndex;
-}
-
-//=======================================================================
-//function : IndexToShape
-//purpose :
-//=======================================================================
-TopoDS_Shape SMESHDS_Mesh::IndexToShape(int ShapeIndex)
-{
- return myIndexToShape.FindKey(ShapeIndex);
-}
-
-//=======================================================================
-//function : ShapeToIndex
-//purpose :
-//=======================================================================
-int SMESHDS_Mesh::ShapeToIndex(const TopoDS_Shape & S) const
-{
- if (myShape.IsNull())
- MESSAGE("myShape is NULL");
-
- int index = myIndexToShape.FindIndex(S);
-
- return index;
-}
-
-//=======================================================================
-//function : SetNodeOnVolume
-//purpose :
-//=======================================================================
-void SMESHDS_Mesh::SetNodeInVolume(const SMDS_MeshNode* aNode, int Index)
-{
- addNodeToSubmesh( aNode, Index );
-}
-
-//=======================================================================
-//function : SetNodeOnFace
-//purpose :
-//=======================================================================
-void SMESHDS_Mesh::SetNodeOnFace(SMDS_MeshNode* aNode, int Index, double u, double v)
-{
- //Set Position on Node
- aNode->SetPosition(SMDS_PositionPtr(new SMDS_FacePosition(Index, u, v)));
-
- addNodeToSubmesh( aNode, Index );
-}
-
-//=======================================================================
-//function : SetNodeOnEdge
-//purpose :
-//=======================================================================
-void SMESHDS_Mesh::SetNodeOnEdge(SMDS_MeshNode* aNode,
- int Index,
- double u)
-{
- //Set Position on Node
- aNode->SetPosition(SMDS_PositionPtr(new SMDS_EdgePosition(Index, u)));
-
- addNodeToSubmesh( aNode, Index );
-}
-
-//=======================================================================
-//function : SetNodeOnVertex
-//purpose :
-//=======================================================================
-void SMESHDS_Mesh::SetNodeOnVertex(SMDS_MeshNode* aNode, int Index)
-{
- //Set Position on Node
- aNode->SetPosition(SMDS_PositionPtr(new SMDS_VertexPosition(Index)));
-
- addNodeToSubmesh( aNode, Index );
-}
-
-//=======================================================================
-//function : SetMeshElementOnShape
-//purpose :
-//=======================================================================
-void SMESHDS_Mesh::SetMeshElementOnShape(const SMDS_MeshElement* anElement,
- int Index)
-{
- if (myShapeIndexToSubMesh.find(Index)==myShapeIndexToSubMesh.end())
- myShapeIndexToSubMesh[Index]=new SMESHDS_SubMesh();
-
- myShapeIndexToSubMesh[Index]->AddElement(anElement);
-}
-
-SMESHDS_Mesh::~SMESHDS_Mesh()
-{
-}
+++ /dev/null
-// SMESH SMESHDS : management of mesh data and SMESH document
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESH_Script.cxx
-// Author : Yves FRICAUD, OCC
-// Module : SMESH
-// $Header:
-
-#include "SMESHDS_Script.hxx"
-
-using namespace std;
-
-//=======================================================================
-//function : getCommand
-//purpose :
-//=======================================================================
-SMESHDS_Command* SMESHDS_Script::getCommand(const SMESHDS_CommandType aType)
-{
- SMESHDS_Command* com;
- if (myCommands.empty())
- {
- com = new SMESHDS_Command(aType);
- myCommands.insert(myCommands.end(),com);
- }
- else
- {
- com = myCommands.back();
- if (com->GetType() != aType)
- {
- com = new SMESHDS_Command(aType);
- myCommands.insert(myCommands.end(),com);
- }
- }
- return com;
-}
-
-//=======================================================================
-//function :
-//purpose :
-//=======================================================================
-void SMESHDS_Script::AddNode(int NewNodeID, double x, double y, double z)
-{
- getCommand(SMESHDS_AddNode)->AddNode(NewNodeID, x, y, z);
-}
-
-//=======================================================================
-//function :
-//purpose :
-//=======================================================================
-void SMESHDS_Script::AddEdge(int NewEdgeID, int idnode1, int idnode2)
-{
- getCommand(SMESHDS_AddEdge)->AddEdge(NewEdgeID, idnode1, idnode2);
-}
-
-//=======================================================================
-//function :
-//purpose :
-//=======================================================================
-void SMESHDS_Script::AddFace(int NewFaceID,
- int idnode1, int idnode2, int idnode3)
-{
- getCommand(SMESHDS_AddTriangle)->AddFace(NewFaceID,
- idnode1, idnode2, idnode3);
-}
-
-//=======================================================================
-//function :
-//purpose :
-//=======================================================================
-void SMESHDS_Script::AddFace(int NewFaceID,
- int idnode1, int idnode2,
- int idnode3, int idnode4)
-{
- getCommand(SMESHDS_AddQuadrangle)->AddFace(NewFaceID,
- idnode1, idnode2,
- idnode3, idnode4);
-}
-
-//=======================================================================
-//function :
-//purpose :
-//=======================================================================
-void SMESHDS_Script::AddVolume(int NewID,
- int idnode1, int idnode2,
- int idnode3, int idnode4)
-{
- getCommand(SMESHDS_AddTetrahedron)->AddVolume(NewID,
- idnode1, idnode2,
- idnode3, idnode4);
-}
-
-//=======================================================================
-//function :
-//purpose :
-//=======================================================================
-void SMESHDS_Script::AddVolume(int NewID,
- int idnode1, int idnode2,
- int idnode3, int idnode4, int idnode5)
-{
- getCommand(SMESHDS_AddPyramid)->AddVolume(NewID,
- idnode1, idnode2,
- idnode3, idnode4, idnode5);
-}
-
-//=======================================================================
-//function :
-//purpose :
-//=======================================================================
-void SMESHDS_Script::AddVolume(int NewID,
- int idnode1, int idnode2, int idnode3,
- int idnode4, int idnode5, int idnode6)
-{
- getCommand(SMESHDS_AddPrism)->AddVolume(NewID,
- idnode1, idnode2, idnode3,
- idnode4, idnode5, idnode6);
-}
-
-//=======================================================================
-//function :
-//purpose :
-//=======================================================================
-void SMESHDS_Script::AddVolume(int NewID,
- int idnode1, int idnode2, int idnode3, int idnode4,
- int idnode5, int idnode6, int idnode7, int idnode8)
-{
- getCommand(SMESHDS_AddHexahedron)->AddVolume(NewID,
- idnode1, idnode2, idnode3, idnode4,
- idnode5, idnode6, idnode7, idnode8);
-}
-
-//=======================================================================
-//function : AddPolygonalFace
-//purpose :
-//=======================================================================
-void SMESHDS_Script::AddPolygonalFace (int NewFaceID, std::vector<int> nodes_ids)
-{
- getCommand(SMESHDS_AddPolygon)->AddPolygonalFace(NewFaceID, nodes_ids);
-}
-
-//=======================================================================
-//function : AddPolyhedralVolume
-//purpose :
-//=======================================================================
-void SMESHDS_Script::AddPolyhedralVolume (int NewID,
- std::vector<int> nodes_ids,
- std::vector<int> quantities)
-{
- getCommand(SMESHDS_AddPolyhedron)->AddPolyhedralVolume
- (NewID, nodes_ids, quantities);
-}
-
-//=======================================================================
-//function :
-//purpose :
-//=======================================================================
-void SMESHDS_Script::MoveNode(int NewNodeID, double x, double y, double z)
-{
- getCommand(SMESHDS_MoveNode)->MoveNode(NewNodeID, x, y, z);
-}
-
-//=======================================================================
-//function :
-//purpose :
-//=======================================================================
-void SMESHDS_Script::RemoveNode(int ID)
-{
- getCommand(SMESHDS_RemoveNode)->RemoveNode(ID);
-}
-
-//=======================================================================
-//function :
-//purpose :
-//=======================================================================
-void SMESHDS_Script::RemoveElement(int ElementID)
-{
- getCommand(SMESHDS_RemoveElement)->RemoveElement(ElementID);
-}
-
-//=======================================================================
-//function : ChangeElementNodes
-//purpose :
-//=======================================================================
-
-void SMESHDS_Script::ChangeElementNodes(int ElementID, int nodes[], int nbnodes)
-{
- getCommand(SMESHDS_ChangeElementNodes)->ChangeElementNodes( ElementID, nodes, nbnodes );
-}
-
-//=======================================================================
-//function : ChangePolyhedronNodes
-//purpose :
-//=======================================================================
-void SMESHDS_Script::ChangePolyhedronNodes (const int ElementID,
- std::vector<int> nodes_ids,
- std::vector<int> quantities)
-{
- getCommand(SMESHDS_ChangePolyhedronNodes)->ChangePolyhedronNodes
- (ElementID, nodes_ids, quantities);
-}
-
-//=======================================================================
-//function : Renumber
-//purpose :
-//=======================================================================
-
-void SMESHDS_Script::Renumber (const bool isNodes, const int startID, const int deltaID)
-{
- getCommand(SMESHDS_Renumber)->Renumber( isNodes, startID, deltaID );
-}
-
-//=======================================================================
-//function :
-//purpose :
-//=======================================================================
-void SMESHDS_Script::Clear()
-{
- myCommands.clear();
-}
-
-//=======================================================================
-//function :
-//purpose :
-//=======================================================================
-const list<SMESHDS_Command*>& SMESHDS_Script::GetCommands()
-{
- return myCommands;
-}
+++ /dev/null
-// SMESH SMESHDS : management of mesh data and SMESH document
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESHDS_Script.hxx
-// Module : SMESH
-
-#ifndef _SMESHDS_Script_HeaderFile
-#define _SMESHDS_Script_HeaderFile
-
-#include "SMESHDS_Command.hxx"
-
-#include <list>
-#include <vector>
-
-
-class SMESHDS_Script
-{
- public:
- void AddNode(int NewNodeID, double x, double y, double z);
- void AddEdge(int NewEdgeID, int idnode1, int idnode2);
- void AddFace(int NewFaceID, int idnode1, int idnode2, int idnode3);
- void AddFace(int NewFaceID, int idnode1, int idnode2, int idnode3,
- int idnode4);
- void AddVolume(int NewVolID, int idnode1, int idnode2, int idnode3,
- int idnode4);
- void AddVolume(int NewVolID, int idnode1, int idnode2, int idnode3,
- int idnode4, int idnode5);
- void AddVolume(int NewVolID, int idnode1, int idnode2, int idnode3,
- int idnode4, int idnode5, int idnode6);
- void AddVolume(int NewVolID, int idnode1, int idnode2, int idnode3,
- int idnode4, int idnode5, int idnode6, int idnode7, int idnode8);
-
- void AddPolygonalFace (const int NewFaceID,
- std::vector<int> nodes_ids);
- void AddPolyhedralVolume (const int NewVolID,
- std::vector<int> nodes_ids,
- std::vector<int> quantities);
-
- void MoveNode(int NewNodeID, double x, double y, double z);
- void RemoveNode(int NodeID);
- void RemoveElement(int ElementID);
- void ChangeElementNodes(int ElementID, int nodes[], int nbnodes);
- void ChangePolyhedronNodes(const int ElementID,
- std::vector<int> nodes_ids,
- std::vector<int> quantities);
- void Renumber (const bool isNodes, const int startID, const int deltaID);
- void Clear();
- const std::list<SMESHDS_Command*> & GetCommands();
- ~SMESHDS_Script();
-
- private:
- SMESHDS_Command* getCommand(const SMESHDS_CommandType aType);
-
- std::list<SMESHDS_Command*> myCommands;
-};
-
-#endif
+++ /dev/null
-// SMESH SMESHDS : management of mesh data and SMESH document
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESH_SubMesh.cxx
-// Author : Yves FRICAUD, OCC
-// Module : SMESH
-// $Header:
-
-#include "SMESHDS_SubMesh.hxx"
-
-#include "utilities.h"
-
-using namespace std;
-
-//=======================================================================
-//function : AddElement
-//purpose :
-//=======================================================================
-void SMESHDS_SubMesh::AddElement(const SMDS_MeshElement * ME)
-{
- if ( !IsComplexSubmesh() )
- myElements.insert(ME);
-}
-
-//=======================================================================
-//function : RemoveElement
-//purpose :
-//=======================================================================
-bool SMESHDS_SubMesh::RemoveElement(const SMDS_MeshElement * ME)
-{
- if ( !IsComplexSubmesh() && NbElements() )
- return myElements.erase(ME);
-
- return false;
-}
-
-//=======================================================================
-//function : AddNode
-//purpose :
-//=======================================================================
-void SMESHDS_SubMesh::AddNode(const SMDS_MeshNode * N)
-{
- if ( !IsComplexSubmesh() )
- myNodes.insert(N);
-}
-
-//=======================================================================
-//function : RemoveNode
-//purpose :
-//=======================================================================
-
-bool SMESHDS_SubMesh::RemoveNode(const SMDS_MeshNode * N)
-{
- if ( !IsComplexSubmesh() && NbNodes() )
- return myNodes.erase(N);
-
- return false;
-}
-
-//=======================================================================
-//function : NbElements
-//purpose :
-//=======================================================================
-int SMESHDS_SubMesh::NbElements() const
-{
- if ( !IsComplexSubmesh() )
- return myElements.size();
-
- int nbElems = 0;
-#ifndef WNT
- set<const SMESHDS_SubMesh*>::iterator it = mySubMeshes.begin();
-#else
- set<const SMESHDS_SubMesh*>::const_iterator it = mySubMeshes.begin();
-#endif
- for ( ; it != mySubMeshes.end(); it++ )
- nbElems += (*it)->NbElements();
-
- return nbElems;
-}
-
-//=======================================================================
-//function : NbNodes
-//purpose :
-//=======================================================================
-
-int SMESHDS_SubMesh::NbNodes() const
-{
- if ( !IsComplexSubmesh() )
- return myNodes.size();
-
- int nbElems = 0;
-#ifndef WNT
- set<const SMESHDS_SubMesh*>::iterator it = mySubMeshes.begin();
-#else
- set<const SMESHDS_SubMesh*>::const_iterator it = mySubMeshes.begin();
-#endif
- for ( ; it != mySubMeshes.end(); it++ )
- nbElems += (*it)->NbNodes();
-
- return nbElems;
-}
-
-// =====================
-// class MySetIterator
-// =====================
-
-template<typename T> class MySetIterator:public SMDS_Iterator<const T*>
-{
- typedef const set<const T*> TSet;
- typename TSet::const_iterator myIt;
- TSet& mySet;
-
- public:
- MySetIterator(const set<const T*>& s):mySet(s), myIt(s.begin())
- {
- }
-
- bool more()
- {
- return myIt!=mySet.end();
- }
- const T* next()
- {
- const T* t=*myIt;
- myIt++;
- return t;
- }
-};
-
-// =====================
-// class MyIterator
-// =====================
-
-template<typename VALUE> class MyIterator : public SMDS_Iterator<VALUE>
-{
- public:
- MyIterator (const set<const SMESHDS_SubMesh*>& theSubMeshes)
- : mySubMeshes( theSubMeshes ), mySubIt( theSubMeshes.begin() ), myMore(false)
- {}
- bool more()
- {
- while (( !myElemIt.get() || !myElemIt->more() ) &&
- mySubIt != mySubMeshes.end())
- {
- myElemIt = getElements(*mySubIt);
- mySubIt++;
- }
- myMore = myElemIt.get() && myElemIt->more();
- return myMore;
- }
- VALUE next()
- {
- VALUE elem = 0;
- if ( myMore )
- elem = myElemIt->next();
- return elem;
- }
- protected:
- virtual boost::shared_ptr< SMDS_Iterator<VALUE> >
- getElements(const SMESHDS_SubMesh*) const = 0;
-
- private:
- bool myMore;
- const set<const SMESHDS_SubMesh*>& mySubMeshes;
- set<const SMESHDS_SubMesh*>::const_iterator mySubIt;
- boost::shared_ptr< SMDS_Iterator<VALUE> > myElemIt;
-};
-
-// =====================
-// class MyElemIterator
-// =====================
-
-class MyElemIterator: public MyIterator<const SMDS_MeshElement*>
-{
- public:
- MyElemIterator (const set<const SMESHDS_SubMesh*>& theSubMeshes)
- :MyIterator<const SMDS_MeshElement*>( theSubMeshes ) {}
- SMDS_ElemIteratorPtr getElements(const SMESHDS_SubMesh* theSubMesh) const
- { return theSubMesh->GetElements(); }
-};
-
-// =====================
-// class MyNodeIterator
-// =====================
-
-class MyNodeIterator: public MyIterator<const SMDS_MeshNode*>
-{
- public:
- MyNodeIterator (const set<const SMESHDS_SubMesh*>& theSubMeshes)
- :MyIterator<const SMDS_MeshNode*>( theSubMeshes ) {}
- SMDS_NodeIteratorPtr getElements(const SMESHDS_SubMesh* theSubMesh) const
- { return theSubMesh->GetNodes(); }
-};
-
-//=======================================================================
-//function : GetElements
-//purpose :
-//=======================================================================
-
-SMDS_ElemIteratorPtr SMESHDS_SubMesh::GetElements() const
-{
- if ( IsComplexSubmesh() )
- return SMDS_ElemIteratorPtr( new MyElemIterator( mySubMeshes ));
-
- return SMDS_ElemIteratorPtr(new MySetIterator<SMDS_MeshElement>(myElements));
-}
-
-//=======================================================================
-//function : GetNodes
-//purpose :
-//=======================================================================
-
-SMDS_NodeIteratorPtr SMESHDS_SubMesh::GetNodes() const
-{
- if ( IsComplexSubmesh() )
- return SMDS_NodeIteratorPtr( new MyNodeIterator( mySubMeshes ));
-
- return SMDS_NodeIteratorPtr(new MySetIterator<SMDS_MeshNode>(myNodes));
-}
-
-//=======================================================================
-//function : Contains
-//purpose : check if elem or node is in
-//=======================================================================
-
-bool SMESHDS_SubMesh::Contains(const SMDS_MeshElement * ME) const
-{
- // DO NOT TRY TO FIND A REMOVED ELEMENT !!
- if ( !ME )
- return false;
-
- if ( IsComplexSubmesh() )
- {
- set<const SMESHDS_SubMesh*>::const_iterator aSubIt = mySubMeshes.begin();
- for ( ; aSubIt != mySubMeshes.end(); aSubIt++ )
- if ( (*aSubIt)->Contains( ME ))
- return true;
- return false;
- }
-
- if ( ME->GetType() == SMDSAbs_Node )
- {
- const SMDS_MeshNode* n = static_cast<const SMDS_MeshNode*>( ME );
- return ( myNodes.find( n ) != myNodes.end() );
- }
-
- return ( myElements.find( ME ) != myElements.end() );
-}
-
-//=======================================================================
-//function : AddSubMesh
-//purpose :
-//=======================================================================
-
-void SMESHDS_SubMesh::AddSubMesh( const SMESHDS_SubMesh* theSubMesh )
-{
- ASSERT( theSubMesh );
- mySubMeshes.insert( theSubMesh );
-}
-
-//=======================================================================
-//function : RemoveSubMesh
-//purpose :
-//=======================================================================
-
-bool SMESHDS_SubMesh::RemoveSubMesh( const SMESHDS_SubMesh* theSubMesh )
-{
- return mySubMeshes.erase( theSubMesh );
-}
-
-//=======================================================================
-//function : ContainsSubMesh
-//purpose :
-//=======================================================================
-
-bool SMESHDS_SubMesh::ContainsSubMesh( const SMESHDS_SubMesh* theSubMesh ) const
-{
- return mySubMeshes.find( theSubMesh ) != mySubMeshes.end();
-}
+++ /dev/null
-// SMESH SMESHDS : management of mesh data and SMESH document
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESHDS_SubMesh.hxx
-// Module : SMESH
-
-#ifndef _SMESHDS_SubMesh_HeaderFile
-#define _SMESHDS_SubMesh_HeaderFile
-
-#include "SMDS_Mesh.hxx"
-#include <set>
-
-#if defined WNT && defined WIN32 && defined SMESHDS_EXPORTS
-#define SMESHDS_WNT_EXPORT __declspec( dllexport )
-#else
-#define SMESHDS_WNT_EXPORT
-#endif
-
-class SMESHDS_WNT_EXPORT SMESHDS_SubMesh
-{
- public:
-
- bool IsComplexSubmesh() const { return !mySubMeshes.empty(); }
-
- // if !IsComplexSubmesh()
- void AddElement(const SMDS_MeshElement * ME);
- bool RemoveElement(const SMDS_MeshElement * ME); // ret true if ME was in
- void AddNode(const SMDS_MeshNode * ME);
- bool RemoveNode(const SMDS_MeshNode * ME); // ret true if ME was in
-
- // if IsComplexSubmesh()
- void AddSubMesh( const SMESHDS_SubMesh* theSubMesh );
- bool RemoveSubMesh( const SMESHDS_SubMesh* theSubMesh );
- bool ContainsSubMesh( const SMESHDS_SubMesh* theSubMesh ) const;
-
- // for both types
- int NbElements() const;
- SMDS_ElemIteratorPtr GetElements() const;
- int NbNodes() const;
- SMDS_NodeIteratorPtr GetNodes() const;
- bool Contains(const SMDS_MeshElement * ME) const; // check if elem or node is in
-
- private:
- //const SMDS_Mesh * myMesh;
- std::set<const SMDS_MeshElement*> myElements;
- std::set<const SMDS_MeshNode*> myNodes;
- std::set<const SMESHDS_SubMesh*> mySubMeshes;
-};
-#endif
+++ /dev/null
-// File generated by CPPExt (Transient)
-//
-// Copyright (C) 1991,1995 by
-//
-// MATRA DATAVISION, FRANCE
-//
-// This software is furnished in accordance with the terms and conditions
-// of the contract and with the inclusion of the above copyright notice.
-// This software or any other copy thereof may not be provided or otherwise
-// be made available to any other person. No title to an ownership of the
-// software is hereby transferred.
-//
-// At the termination of the contract, the software and all copies of this
-// software must be deleted.
-
-#ifndef _Handle_SMESH_TypeFilter_HeaderFile
-#define _Handle_SMESH_TypeFilter_HeaderFile
-
-#ifndef _Standard_Macro_HeaderFile
-#include <Standard_Macro.hxx>
-#endif
-#ifndef _Standard_HeaderFile
-#include <Standard.hxx>
-#endif
-
-#ifndef _Handle_SALOME_Filter_HeaderFile
-#include "Handle_SALOME_Filter.hxx"
-#endif
-
-class Standard_Transient;
-class Handle_Standard_Type;
-class Handle(SALOME_Filter);
-class SMESH_TypeFilter;
-Standard_EXPORT Handle_Standard_Type& STANDARD_TYPE(SMESH_TypeFilter);
-
-class Handle(SMESH_TypeFilter) : public Handle(SALOME_Filter) {
- public:
- inline void* operator new(size_t,void* anAddress)
- {
- return anAddress;
- }
- inline void* operator new(size_t size)
- {
- return Standard::Allocate(size);
- }
- inline void operator delete(void *anAddress)
- {
- if (anAddress) Standard::Free((Standard_Address&)anAddress);
- }
-// inline void operator delete(void *anAddress, size_t size)
-// {
-// if (anAddress) Standard::Free((Standard_Address&)anAddress,size);
-// }
- Handle(SMESH_TypeFilter)():Handle(SALOME_Filter)() {}
- Handle(SMESH_TypeFilter)(const Handle(SMESH_TypeFilter)& aHandle) : Handle(SALOME_Filter)(aHandle)
- {
- }
-
- Handle(SMESH_TypeFilter)(const SMESH_TypeFilter* anItem) : Handle(SALOME_Filter)((SALOME_Filter *)anItem)
- {
- }
-
- Handle(SMESH_TypeFilter)& operator=(const Handle(SMESH_TypeFilter)& aHandle)
- {
- Assign(aHandle.Access());
- return *this;
- }
-
- Handle(SMESH_TypeFilter)& operator=(const SMESH_TypeFilter* anItem)
- {
- Assign((Standard_Transient *)anItem);
- return *this;
- }
-
- SMESH_TypeFilter* operator->()
- {
- return (SMESH_TypeFilter *)ControlAccess();
- }
-
- SMESH_TypeFilter* operator->() const
- {
- return (SMESH_TypeFilter *)ControlAccess();
- }
-
- Standard_EXPORT ~Handle(SMESH_TypeFilter)();
-
- Standard_EXPORT static const Handle(SMESH_TypeFilter) DownCast(const Handle(Standard_Transient)& AnObject);
-};
-#endif
+++ /dev/null
-// File generated by CPPExt (Transient)
-// Copyright (C) 1991,1995 by
-//
-// MATRA DATAVISION, FRANCE
-//
-// This software is furnished in accordance with the terms and conditions
-// of the contract and with the inclusion of the above copyright notice.
-// This software or any other copy thereof may not be provided or otherwise
-// be made available to any other person. No title to an ownership of the
-// software is hereby transferred.
-//
-// At the termination of the contract, the software and all copies of this
-// software must be deleted.
-//
-#include "SMESH_TypeFilter.jxx"
-
-#ifndef _Standard_TypeMismatch_HeaderFile
-#include <Standard_TypeMismatch.hxx>
-#endif
-
-SMESH_TypeFilter::~SMESH_TypeFilter() {}
-
-
-
-Standard_EXPORT Handle_Standard_Type& SMESH_TypeFilter_Type_()
-{
-
- static Handle_Standard_Type aType1 = STANDARD_TYPE(SALOME_Filter);
- if ( aType1.IsNull()) aType1 = STANDARD_TYPE(SALOME_Filter);
- static Handle_Standard_Type aType2 = STANDARD_TYPE(MMgt_TShared);
- if ( aType2.IsNull()) aType2 = STANDARD_TYPE(MMgt_TShared);
- static Handle_Standard_Type aType3 = STANDARD_TYPE(Standard_Transient);
- if ( aType3.IsNull()) aType3 = STANDARD_TYPE(Standard_Transient);
-
-
- static Handle_Standard_Transient _Ancestors[]= {aType1,aType2,aType3,NULL};
- static Handle_Standard_Type _aType = new Standard_Type("SMESH_TypeFilter",
- sizeof(SMESH_TypeFilter),
- 1,
- (Standard_Address)_Ancestors,
- (Standard_Address)NULL);
-
- return _aType;
-}
-
-
-// DownCast method
-// allow safe downcasting
-//
-const Handle(SMESH_TypeFilter) Handle(SMESH_TypeFilter)::DownCast(const Handle(Standard_Transient)& AnObject)
-{
- Handle(SMESH_TypeFilter) _anOtherObject;
-
- if (!AnObject.IsNull()) {
- if (AnObject->IsKind(STANDARD_TYPE(SMESH_TypeFilter))) {
- _anOtherObject = Handle(SMESH_TypeFilter)((Handle(SMESH_TypeFilter)&)AnObject);
- }
- }
-
- return _anOtherObject ;
-}
-const Handle(Standard_Type)& SMESH_TypeFilter::DynamicType() const
-{
- return STANDARD_TYPE(SMESH_TypeFilter) ;
-}
-Standard_Boolean SMESH_TypeFilter::IsKind(const Handle(Standard_Type)& AType) const
-{
- return (STANDARD_TYPE(SMESH_TypeFilter) == AType || SALOME_Filter::IsKind(AType));
-}
-Handle_SMESH_TypeFilter::~Handle_SMESH_TypeFilter() {}
-
+++ /dev/null
-// SMESH SMESHGUI : GUI for SMESH component
-//
-// Copyright (C) 2003 CEA
-//
-// 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.org
-//
-//
-//
-// File : SMESHGUI_CreateHypothesesDlg.h
-// Author : Julia DOROVSKIKH
-// Module : SMESH
-// $Header$
-
-#ifndef DIALOGBOX_CREATE_HYPOTHESES_H
-#define DIALOGBOX_CREATE_HYPOTHESES_H
-
-// QT Includes
-#include <qvariant.h>
-#include <qdialog.h>
-#include <qstringlist.h>
-
-// IDL Headers
-#include <SALOMEconfig.h>
-#include CORBA_SERVER_HEADER(GEOM_Gen)
-#include CORBA_SERVER_HEADER(SMESH_Mesh)
-
-#include <map>
-#include <string>
-
-class QButtonGroup;
-class QGroupBox;
-class QPushButton;
-class QListView;
-class QListViewItem;
-class SMESHGUI;
-
-//=================================================================================
-// class : SMESHGUI_CreateHypothesesDlg
-// purpose :
-//=================================================================================
-class SMESHGUI_CreateHypothesesDlg : public QDialog
-{
- Q_OBJECT
-
-public:
- SMESHGUI_CreateHypothesesDlg (SMESHGUI*,
- const char* name = 0,
- bool modal = FALSE,
- bool isAlgo = FALSE);
- ~SMESHGUI_CreateHypothesesDlg ();
-
-private:
-
- void Init() ;
- void closeEvent( QCloseEvent* e ) ;
- void enterEvent ( QEvent * ) ;
-
- void InitAlgoDefinition();
-
- SMESHGUI* mySMESHGUI;
- bool myIsAlgo;
-
- QGroupBox* GroupButtons;
- QPushButton* buttonCancel;
- QPushButton* buttonApply;
-
- QGroupBox* GroupAlgorithms;
- QListView* ListAlgoDefinition;
-
-private slots:
-
- void ClickOnCancel();
- void ClickOnApply();
- void ActivateThisDialog() ;
-
- void onSelectionChanged();
- void onDoubleClicked(QListViewItem*);
-};
-
-#endif // DIALOGBOX_CREATE_HYPOTHESES_H
+++ /dev/null
-// SMESH SMESHGUI : GUI for SMESH component
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESHGUI_EditHypothesesDlg.cxx
-// Author : Nicolas REJNERI
-// Module : SMESH
-// $Header$
-
-#include "SMESHGUI_EditHypothesesDlg.h"
-
-#include "SMESHGUI.h"
-#include "SMESHGUI_Utils.h"
-#include "SMESHGUI_GEOMGenUtils.h"
-#include "SMESHGUI_HypothesesUtils.h"
-
-#include "SMESH_TypeFilter.hxx"
-#include "SMESH_NumberFilter.hxx"
-
-#include "SALOME_ListIO.hxx"
-#include "SALOME_ListIteratorOfListIO.hxx"
-
-#include "SALOMEDSClient_Study.hxx"
-#include "SALOMEDSClient_AttributeIOR.hxx"
-#include "SALOMEDSClient_AttributeName.hxx"
-
-#include "SUIT_Session.h"
-#include "SUIT_OverrideCursor.h"
-#include "SUIT_Operation.h"
-#include "SUIT_Desktop.h"
-
-#include "utilities.h"
-
-#include "SVTK_ViewModel.h"
-
-// QT Includes
-#include <qgroupbox.h>
-#include <qlabel.h>
-#include <qlineedit.h>
-#include <qpushbutton.h>
-#include <qlayout.h>
-#include <qpixmap.h>
-
-using namespace std;
-
-//VRV: porting on Qt 3.0.5
-#if QT_VERSION >= 0x030005
-#include <qlistbox.h>
-#endif
-//VRV: porting on Qt 3.0.5
-
-class ListBoxIOR : public QListBoxText
-{
-public:
- enum { RTTI_IOR = 1000 };
-
-public:
- ListBoxIOR (QListBox* listbox,
- const char* ior,
- const QString& text = QString::null)
- : QListBoxText(listbox, text), myIOR(ior) {}
- virtual ~ListBoxIOR() {};
- virtual int rtti() const { return RTTI_IOR; }
- const char* GetIOR() { return myIOR.c_str(); }
-
-private:
- string myIOR;
-};
-
-#define ALLOW_CHANGE_SHAPE 0
-
-int findItem (QListBox* listBox, const string& ior)
-{
- for (int i = 0; i < listBox->count(); i++) {
- if (listBox->item(i)->rtti() == ListBoxIOR::RTTI_IOR) {
- ListBoxIOR* anItem = (ListBoxIOR*)(listBox->item(i));
- if (anItem && ior == string(anItem->GetIOR()))
- return i;
- }
- }
- return -1;
-}
-
-//=================================================================================
-// function : SMESHGUI_EditHypothesesDlg()
-// purpose : Constructs a SMESHGUI_EditHypothesesDlg 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.
-//=================================================================================
-SMESHGUI_EditHypothesesDlg::SMESHGUI_EditHypothesesDlg (SMESHGUI* theModule, const char* name,
- bool modal, WFlags fl)
- : QDialog( SMESH::GetDesktop( theModule ), name, modal, WStyle_Customize | WStyle_NormalBorder |
- WStyle_Title | WStyle_SysMenu | WDestructiveClose),
- myImportedMesh(false),
- mySMESHGUI( theModule ),
- mySelectionMgr( SMESH::GetSelectionMgr( theModule ) )
-{
- QPixmap image0 (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_SELECT")));
- if (!name)
- setName("SMESHGUI_EditHypothesesDlg");
- setCaption(tr("SMESH_EDIT_HYPOTHESES"));
- setSizeGripEnabled(TRUE);
- QGridLayout* SMESHGUI_EditHypothesesDlgLayout = new QGridLayout(this);
- SMESHGUI_EditHypothesesDlgLayout->setSpacing(6);
- SMESHGUI_EditHypothesesDlgLayout->setMargin(11);
-
- /***************************************************************/
- GroupC1 = new QGroupBox(tr("SMESH_ARGUMENTS"), this, "GroupC1");
- GroupC1->setColumnLayout(0, Qt::Vertical);
- GroupC1->layout()->setSpacing(0);
- GroupC1->layout()->setMargin(0);
- QGridLayout* GroupC1Layout = new QGridLayout(GroupC1->layout());
- GroupC1Layout->setAlignment(Qt::AlignTop);
- GroupC1Layout->setSpacing(6);
- GroupC1Layout->setMargin(11);
-
- TextLabelC1A1 = new QLabel(tr("SMESH_OBJECT_MESHorSUBMESH"), GroupC1, "TextLabelC1A1");
- GroupC1Layout->addWidget(TextLabelC1A1, 0, 0);
- SelectButtonC1A1 = new QPushButton(GroupC1, "SelectButtonC1A1");
- SelectButtonC1A1->setPixmap(image0);
- GroupC1Layout->addWidget(SelectButtonC1A1, 0, 1);
- LineEditC1A1 = new QLineEdit(GroupC1, "LineEditC1A1");
- LineEditC1A1->setReadOnly(true);
- GroupC1Layout->addWidget(LineEditC1A1, 0, 2);
-
- TextLabelC1A2 = new QLabel(tr("SMESH_OBJECT_GEOM"), GroupC1, "TextLabelC1A2");
- GroupC1Layout->addWidget(TextLabelC1A2, 1, 0);
- SelectButtonC1A2 = new QPushButton(GroupC1, "SelectButtonC1A2");
- SelectButtonC1A2->setPixmap(image0);
- SelectButtonC1A2->setToggleButton(FALSE);
- GroupC1Layout->addWidget(SelectButtonC1A2, 1, 1);
- LineEditC1A2 = new QLineEdit(GroupC1, "LineEditC1A2");
- LineEditC1A2->setReadOnly(true);
- GroupC1Layout->addWidget(LineEditC1A2, 1, 2);
-
- SMESHGUI_EditHypothesesDlgLayout->addWidget(GroupC1, 0, 0);
-
- /***************************************************************/
- GroupHypotheses = new QGroupBox(tr("SMESH_HYPOTHESES"), this, "GroupHypotheses");
- GroupHypotheses->setColumnLayout(0, Qt::Vertical);
- GroupHypotheses->layout()->setSpacing(0);
- GroupHypotheses->layout()->setMargin(0);
- QGridLayout* grid_3 = new QGridLayout(GroupHypotheses->layout());
- grid_3->setAlignment(Qt::AlignTop);
- grid_3->setSpacing(6);
- grid_3->setMargin(11);
-
- TextHypDefinition = new QLabel(tr("SMESH_AVAILABLE"), GroupHypotheses, "TextHypDefinition");
- grid_3->addWidget(TextHypDefinition, 0, 0);
-
- ListHypDefinition = new QListBox(GroupHypotheses, "ListHypDefinition");
- ListHypDefinition->setMinimumSize(100, 100);
- grid_3->addWidget(ListHypDefinition, 1, 0);
-
- TextHypAssignation = new QLabel(tr("SMESH_EDIT_USED"), GroupHypotheses, "TextHypAssignation");
- grid_3->addWidget(TextHypAssignation, 0, 1);
-
- ListHypAssignation = new QListBox(GroupHypotheses, "ListHypAssignation");
- ListHypAssignation->setMinimumSize(100, 100);
- grid_3->addWidget(ListHypAssignation, 1, 1);
-
- SMESHGUI_EditHypothesesDlgLayout->addWidget(GroupHypotheses, 1, 0);
-
- /***************************************************************/
- GroupAlgorithms = new QGroupBox(tr("SMESH_ADD_ALGORITHM"), this, "GroupAlgorithms");
- GroupAlgorithms->setColumnLayout(0, Qt::Vertical);
- GroupAlgorithms->layout()->setSpacing(0);
- GroupAlgorithms->layout()->setMargin(0);
- QGridLayout* grid_4 = new QGridLayout(GroupAlgorithms->layout());
- grid_4->setAlignment(Qt::AlignTop);
- grid_4->setSpacing(6);
- grid_4->setMargin(11);
-
- TextAlgoDefinition = new QLabel(tr("SMESH_AVAILABLE"), GroupAlgorithms, "TextAlgoDefinition");
- grid_4->addWidget(TextAlgoDefinition, 0, 0);
-
- ListAlgoDefinition = new QListBox(GroupAlgorithms, "ListAlgoDefinition");
- ListAlgoDefinition->setMinimumSize(100, 100);
- grid_4->addWidget(ListAlgoDefinition, 1, 0);
-
- TextAlgoAssignation = new QLabel(tr("SMESH_EDIT_USED"), GroupAlgorithms, "TextAlgoAssignation");
- grid_4->addWidget(TextAlgoAssignation, 0, 1);
-
- ListAlgoAssignation = new QListBox(GroupAlgorithms, "ListAlgoAssignation");
- ListAlgoAssignation ->setMinimumSize(100, 100);
- grid_4->addWidget(ListAlgoAssignation, 1, 1);
-
- SMESHGUI_EditHypothesesDlgLayout->addWidget(GroupAlgorithms, 2, 0);
-
- /***************************************************************/
- GroupButtons = new QGroupBox(this, "GroupButtons");
- GroupButtons->setColumnLayout(0, Qt::Vertical);
- GroupButtons->layout()->setSpacing(0);
- GroupButtons->layout()->setMargin(0);
- QGridLayout* GroupButtonsLayout = new QGridLayout(GroupButtons->layout());
- GroupButtonsLayout->setAlignment(Qt::AlignTop);
- GroupButtonsLayout->setSpacing(6);
- GroupButtonsLayout->setMargin(11);
-
- buttonOk = new QPushButton(tr("SMESH_BUT_OK"), GroupButtons, "buttonOk");
- buttonOk->setAutoDefault(TRUE);
- buttonOk->setDefault(FALSE);
- GroupButtonsLayout->addWidget(buttonOk, 0, 0);
-
- buttonApply = new QPushButton(tr("SMESH_BUT_APPLY"), GroupButtons, "buttonApply");
- buttonApply->setAutoDefault(TRUE);
- buttonApply->setDefault(FALSE);
- GroupButtonsLayout->addWidget(buttonApply, 0, 1);
-
- GroupButtonsLayout->addItem(new QSpacerItem(20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum), 0, 2);
-
- buttonCancel = new QPushButton(tr("SMESH_BUT_CLOSE"), GroupButtons, "buttonCancel");
- buttonCancel->setAutoDefault(TRUE);
- buttonCancel->setDefault(TRUE);
- buttonCancel->setEnabled(TRUE);
- GroupButtonsLayout->addWidget(buttonCancel, 0, 3);
-
- SMESHGUI_EditHypothesesDlgLayout->addWidget(GroupButtons, 4, 0);
-
- /***************************************************************/
- Init();
-}
-
-//=================================================================================
-// function : ~SMESHGUI_EditHypothesesDlg()
-// purpose : Destroys the object and frees any allocated resources
-//=================================================================================
-SMESHGUI_EditHypothesesDlg::~SMESHGUI_EditHypothesesDlg()
-{
- // no need to delete child widgets, Qt does it all for us
-}
-
-//=================================================================================
-// function : Init()
-// purpose :
-//=================================================================================
-void SMESHGUI_EditHypothesesDlg::Init()
-{
- mySMESHGUI->SetActiveDialogBox((QDialog*)this);
-
- InitHypDefinition();
- InitAlgoDefinition();
-
- //myGeomFilter = new SALOME_TypeFilter ("GEOM");
- TColStd_MapOfInteger allTypesMap;
- for (int i = 0; i < 10; i++)
- allTypesMap.Add(i);
- myGeomFilter = new SMESH_NumberFilter ("GEOM", TopAbs_SHAPE, 0, allTypesMap);
- myMeshOrSubMeshFilter = new SMESH_TypeFilter (MESHorSUBMESH);
-
- myGeomShape = GEOM::GEOM_Object::_nil();
- myMesh = SMESH::SMESH_Mesh::_nil();
- mySubMesh = SMESH::SMESH_subMesh::_nil();
-
- /* signals and slots connections */
- connect(buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk()));
- connect(buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply()));
- connect(buttonCancel, SIGNAL(clicked()), this, SLOT(ClickOnCancel()));
-
- connect(SelectButtonC1A1, SIGNAL (clicked()), this, SLOT(SetEditCurrentArgument()));
- connect(SelectButtonC1A2, SIGNAL (clicked()), this, SLOT(SetEditCurrentArgument()));
-
- connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()));
- connect(mySMESHGUI, SIGNAL(SignalDeactivateActiveDialog()), this, SLOT(DeactivateActiveDialog()));
- connect(mySMESHGUI, SIGNAL(SignalCloseAllDialogs()), this, SLOT(ClickOnCancel()));
-
- connect(ListHypAssignation, SIGNAL(doubleClicked(QListBoxItem*)), this, SLOT(removeItem(QListBoxItem*)));
- connect(ListAlgoAssignation, SIGNAL(doubleClicked(QListBoxItem*)), this, SLOT(removeItem(QListBoxItem*)));
-
- connect(ListHypDefinition, SIGNAL(doubleClicked(QListBoxItem*)), this, SLOT(addItem(QListBoxItem*)));
- connect(ListAlgoDefinition, SIGNAL(doubleClicked(QListBoxItem*)), this, SLOT(addItem(QListBoxItem*)));
-
- int x, y;
- mySMESHGUI->DefineDlgPosition(this, x, y);
- this->move(x, y);
- this->show();
-
- LineEditC1A1->setFocus();
- myEditCurrentArgument = LineEditC1A1;
- mySelectionMgr->clearFilters();
- mySelectionMgr->installFilter(myMeshOrSubMeshFilter);
-
- SelectionIntoArgument();
-
- UpdateControlState();
-}
-
-//=================================================================================
-// function : ClickOnOk()
-// purpose :
-//=================================================================================
-void SMESHGUI_EditHypothesesDlg::ClickOnOk()
-{
- if (ClickOnApply())
- ClickOnCancel();
-}
-
-//=================================================================================
-// function : ClickOnApply()
-// purpose :
-//=================================================================================
-bool SMESHGUI_EditHypothesesDlg::ClickOnApply()
-{
- if (mySMESHGUI->isActiveStudyLocked())
- return false;
-
- bool aRes = false;
-
- SUIT_OverrideCursor wc;
-
- SUIT_Operation* op = new SUIT_Operation
- (SUIT_Session::session()->activeApplication());
-
- // start transaction
- op->start();
-
- if (!myMesh->_is_nil())
- aRes = StoreMesh();
- else if (!mySubMesh->_is_nil())
- aRes = StoreSubMesh();
-
- if (true/*aRes*/) { // abort desynchronizes contents of a Study and a mesh on server
- // commit transaction
- op->commit();
- InitHypAssignation();
- InitAlgoAssignation();
- } else {
- // abort transaction
- op->abort();
- }
-
- UpdateControlState();
- mySMESHGUI->updateObjBrowser();
-
- return aRes;
-}
-
-//=================================================================================
-// function : ClickOnCancel()
-// purpose :
-//=================================================================================
-void SMESHGUI_EditHypothesesDlg::ClickOnCancel()
-{
- close();
-}
-
-//=================================================================================
-// function : SelectionIntoArgument()
-// purpose : Called when selection as changed or other case
-//=================================================================================
-void SMESHGUI_EditHypothesesDlg::SelectionIntoArgument()
-{
- QString aString = "";
-
- SALOME_ListIO aList;
- mySelectionMgr->selectedObjects(aList,SVTK_Viewer::Type());
-
- int nbSel = SMESH::GetNameOfSelectedIObjects(mySelectionMgr, aString);
-
- if (myEditCurrentArgument == LineEditC1A1) {
- if (nbSel != 1) {
- myMesh = SMESH::SMESH_Mesh::_nil();
- mySubMesh = SMESH::SMESH_subMesh::_nil();
- aString = "";
- } else {
- Handle(SALOME_InteractiveObject) IO = aList.First();
- myMesh = SMESH::IObjectToInterface<SMESH::SMESH_Mesh>(IO);
- if (myMesh->_is_nil()) {
- mySubMesh = SMESH::IObjectToInterface<SMESH::SMESH_subMesh>(IO);
- if (mySubMesh->_is_nil()) {
- aString = "";
- }
- }
- }
- myEditCurrentArgument->setText(aString);
-
- // InitGeom() will try to retrieve a shape from myMesh or mySubMesh
- myGeomShape = GEOM::GEOM_Object::_nil();
- InitGeom();
-
- myImportedMesh = myGeomShape->_is_nil();
-
- InitHypAssignation();
- InitAlgoAssignation();
-
- } else if (myEditCurrentArgument == LineEditC1A2) {
- if (nbSel != 1) {
- myGeomShape = GEOM::GEOM_Object::_nil();
- } else {
- Handle(SALOME_InteractiveObject) IO = aList.First();
- myGeomShape = SMESH::IObjectToInterface<GEOM::GEOM_Object>(IO);
- }
- InitGeom();
- }
-
- UpdateControlState();
-}
-
-//=================================================================================
-// function : SetEditCurrentArgument()
-// purpose :
-//=================================================================================
-void SMESHGUI_EditHypothesesDlg::SetEditCurrentArgument()
-{
- QPushButton* send = (QPushButton*)sender();
- if(send == SelectButtonC1A1) {
- LineEditC1A1->setFocus();
- myEditCurrentArgument = LineEditC1A1;
- mySelectionMgr->clearFilters();
- mySelectionMgr->installFilter(myMeshOrSubMeshFilter);
- } else if (send == SelectButtonC1A2) {
- LineEditC1A2->setFocus();
- myEditCurrentArgument = LineEditC1A2;
- mySelectionMgr->clearFilters();
- mySelectionMgr->installFilter(myGeomFilter);
- }
- SelectionIntoArgument();
-}
-
-//=================================================================================
-// function : DeactivateActiveDialog()
-// purpose :
-//=================================================================================
-void SMESHGUI_EditHypothesesDlg::DeactivateActiveDialog()
-{
- if (GroupC1->isEnabled()) {
- disconnect(mySelectionMgr, 0, this, 0);
- GroupC1->setEnabled(false);
- GroupButtons->setEnabled(false);
- }
-}
-
-//=================================================================================
-// function : ActivateThisDialog()
-// purpose :
-//=================================================================================
-void SMESHGUI_EditHypothesesDlg::ActivateThisDialog()
-{
- mySMESHGUI->EmitSignalDeactivateDialog();
- GroupC1->setEnabled(true);
- GroupButtons->setEnabled(true);
- connect (mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()));
-}
-
-//=================================================================================
-// function : enterEvent()
-// purpose :
-//=================================================================================
-void SMESHGUI_EditHypothesesDlg::enterEvent (QEvent*)
-{
- if (!GroupC1->isEnabled())
- ActivateThisDialog();
-}
-
-//=================================================================================
-// function : closeEvent()
-// purpose :
-//=================================================================================
-void SMESHGUI_EditHypothesesDlg::closeEvent (QCloseEvent* e)
-{
- disconnect(mySelectionMgr, 0, this, 0);
- mySMESHGUI->ResetState();
- mySelectionMgr->clearFilters();
- QDialog::closeEvent(e);
-}
-
-//=======================================================================
-// function : IsOld()
-// purpose :
-//=======================================================================
-bool SMESHGUI_EditHypothesesDlg::IsOld (QListBoxItem* hypItem)
-{
- if (hypItem->rtti() == ListBoxIOR::RTTI_IOR) {
- ListBoxIOR* hyp = (ListBoxIOR*) hypItem;
- return (myMapOldHypos.find(hyp->GetIOR()) != myMapOldHypos.end() ||
- myMapOldAlgos.find(hyp->GetIOR()) != myMapOldAlgos.end());
- }
-
- return false;
-}
-
-//=================================================================================
-// function : removeItem()
-// purpose :
-//=================================================================================
-void SMESHGUI_EditHypothesesDlg::removeItem (QListBoxItem* item)
-{
- const QObject* aSender = sender();
-
- if (!item) return;
-
- if (aSender == ListHypAssignation) {
- myNbModification += IsOld(item) ? 1 : -1;
- ListHypAssignation->removeItem(ListHypAssignation->index(item));
- }
- else if (aSender == ListAlgoAssignation) {
- myNbModification += IsOld(item) ? 1 : -1;
- ListAlgoAssignation->removeItem(ListAlgoAssignation->index(item));
- }
-
- UpdateControlState();
-}
-
-//=================================================================================
-// function : addItem()
-// purpose :
-//=================================================================================
-void SMESHGUI_EditHypothesesDlg::addItem (QListBoxItem* item)
-{
- const QObject* aSender = sender();
-
- if (!item) return;
-
- ListBoxIOR* i = 0;
- if (item->rtti() == ListBoxIOR::RTTI_IOR)
- i = (ListBoxIOR*)item;
- if (!i) return;
-
- bool isFound = false;
-
- ListBoxIOR* anItem;
- if (aSender == ListHypDefinition) {
- for (int j = 0, n = ListHypAssignation->count(); !isFound && j < n; j++) {
- if (ListHypAssignation->item(j)->rtti() == ListBoxIOR::RTTI_IOR) {
- anItem = (ListBoxIOR*)ListHypAssignation->item(j);
- isFound = !strcmp(anItem->GetIOR(), i->GetIOR());
- }
- }
- if (!isFound)
- anItem = new ListBoxIOR (ListHypAssignation,
- CORBA::string_dup(i->GetIOR()),
- CORBA::string_dup(i->text().latin1()));
-
- } else if (aSender == ListAlgoDefinition) {
- for (int j = 0, n = ListAlgoAssignation->count(); !isFound && j < n; j++) {
- if (ListAlgoAssignation->item(j)->rtti() == ListBoxIOR::RTTI_IOR) {
- anItem = (ListBoxIOR*)ListAlgoAssignation->item(j);
- isFound = !strcmp(anItem->GetIOR(), i->GetIOR());
- }
- }
- if (!isFound)
- anItem = new ListBoxIOR (ListAlgoAssignation,
- CORBA::string_dup(i->GetIOR()),
- CORBA::string_dup(i->text().latin1()));
- } else {
- }
-
- if (!isFound)
- myNbModification += IsOld(item) ? -1 : 1;
-
- UpdateControlState();
-}
-
-//=================================================================================
-// function : InitHypDefinition()
-// purpose :
-//=================================================================================
-void SMESHGUI_EditHypothesesDlg::InitHypDefinition()
-{
- ListHypDefinition->clear();
-
- _PTR(SComponent) father = SMESH::GetActiveStudyDocument()->FindComponent("SMESH");
- if (!father)
- return;
-
- _PTR(SObject) HypothesisRoot;
- _PTR(GenericAttribute) anAttr;
- _PTR(AttributeName) aName;
- _PTR(AttributeIOR) anIOR;
-
- //int Tag_HypothesisRoot = 1;
- if (father->FindSubObject(1, HypothesisRoot)) {
- _PTR(ChildIterator) it =
- SMESH::GetActiveStudyDocument()->NewChildIterator(HypothesisRoot);
- ListBoxIOR* anItem;
- for (; it->More();it->Next()) {
- _PTR(SObject) Obj = it->Value();
- if (Obj->FindAttribute(anAttr, "AttributeName")) {
- aName = anAttr;
- if (Obj->FindAttribute(anAttr, "AttributeIOR")) {
- anIOR = anAttr;
- anItem = new ListBoxIOR (ListHypDefinition,
- anIOR->Value().c_str(),
- aName->Value().c_str());
- }
- }
- }
- }
-}
-
-//=================================================================================
-// function : InitHypAssignation()
-// purpose :
-//=================================================================================
-void SMESHGUI_EditHypothesesDlg::InitHypAssignation()
-{
- myNbModification = 0;
-
- myMapOldHypos.clear();
- ListHypAssignation->clear();
- if (myImportedMesh)
- return;
-
- _PTR(SObject) aMorSM, AHR, aRef;
- _PTR(GenericAttribute) anAttr;
- _PTR(AttributeName) aName;
- _PTR(AttributeIOR) anIOR;
-
- if (!myMesh->_is_nil())
- aMorSM = SMESH::FindSObject(myMesh);
- else if (!mySubMesh->_is_nil())
- aMorSM = SMESH::FindSObject(mySubMesh);
-
- if (aMorSM && aMorSM->FindSubObject(2, AHR)) {
- _PTR(ChildIterator) it =
- SMESH::GetActiveStudyDocument()->NewChildIterator(AHR);
- for (; it->More();it->Next()) {
- _PTR(SObject) Obj = it->Value();
- if (Obj->ReferencedObject(aRef)) {
- if (aRef->FindAttribute(anAttr, "AttributeName")) {
- aName = anAttr;
- if (aRef->FindAttribute(anAttr, "AttributeIOR")) {
- anIOR = anAttr;
- ListBoxIOR* anItem = new ListBoxIOR (ListHypAssignation,
- anIOR->Value().c_str(),
- aName->Value().c_str());
- myMapOldHypos[ anIOR->Value() ] = ListHypAssignation->index(anItem);
- }
- }
- }
- }
- }
-}
-
-//=================================================================================
-// function : InitAlgoDefinition()
-// purpose :
-//=================================================================================
-void SMESHGUI_EditHypothesesDlg::InitAlgoDefinition()
-{
- ListAlgoDefinition->clear();
-
- _PTR(SComponent) father = SMESH::GetActiveStudyDocument()->FindComponent("SMESH");
- if (!father)
- return;
-
- _PTR(SObject) AlgorithmsRoot;
- _PTR(GenericAttribute) anAttr;
- _PTR(AttributeName) aName;
- _PTR(AttributeIOR) anIOR;
-
- if (father->FindSubObject (2, AlgorithmsRoot)) {
- _PTR(ChildIterator) it =
- SMESH::GetActiveStudyDocument()->NewChildIterator(AlgorithmsRoot);
- ListBoxIOR* anItem;
- for (; it->More();it->Next()) {
- _PTR(SObject) Obj = it->Value();
- if (Obj->FindAttribute(anAttr, "AttributeName")) {
- aName = anAttr;
- if (Obj->FindAttribute(anAttr, "AttributeIOR")) {
- anIOR = anAttr;
- anItem = new ListBoxIOR (ListAlgoDefinition,
- anIOR->Value().c_str(),
- aName->Value().c_str());
- }
- }
- }
- }
-}
-
-//=================================================================================
-// function : InitAlgoAssignation()
-// purpose :
-//=================================================================================
-void SMESHGUI_EditHypothesesDlg::InitAlgoAssignation()
-{
- myMapOldAlgos.clear();
- ListAlgoAssignation->clear();
- if (myImportedMesh)
- return;
-
- _PTR(SObject) aMorSM, AHR, aRef;
- _PTR(GenericAttribute) anAttr;
- _PTR(AttributeName) aName;
- _PTR(AttributeIOR) anIOR;
-
- if (!myMesh->_is_nil())
- aMorSM = SMESH::FindSObject(myMesh);
- else if (!mySubMesh->_is_nil())
- aMorSM = SMESH::FindSObject(mySubMesh);
-
- if (aMorSM && aMorSM->FindSubObject(3, AHR)) {
- _PTR(ChildIterator) it =
- SMESH::GetActiveStudyDocument()->NewChildIterator(AHR);
- for (; it->More();it->Next()) {
- _PTR(SObject) Obj = it->Value();
- if (Obj->ReferencedObject(aRef)) {
- if (aRef->FindAttribute(anAttr, "AttributeName")) {
- aName = anAttr;
- if (aRef->FindAttribute(anAttr, "AttributeIOR")) {
- anIOR = anAttr;
- ListBoxIOR* anItem = new ListBoxIOR (ListAlgoAssignation,
- anIOR->Value().c_str(),
- aName->Value().c_str());
- myMapOldAlgos[ anIOR->Value() ] = ListAlgoAssignation->index(anItem);
- }
- }
- }
- }
- }
-}
-
-//=================================================================================
-// function : InitGeom()
-// purpose :
-//=================================================================================
-void SMESHGUI_EditHypothesesDlg::InitGeom()
-{
- LineEditC1A2->setText("");
-
- if (myGeomShape->_is_nil() && !myMesh->_is_nil()) {
- _PTR(SObject) aMesh = SMESH::FindSObject(myMesh);
- if (aMesh)
- myGeomShape = SMESH::GetShapeOnMeshOrSubMesh(aMesh);
- }
- if (myGeomShape->_is_nil() && !mySubMesh->_is_nil()) {
- _PTR(SObject) aSubMesh = SMESH::FindSObject(mySubMesh);
- if (aSubMesh)
- myGeomShape = SMESH::GetShapeOnMeshOrSubMesh(aSubMesh);
- }
-
- _PTR(GenericAttribute) anAttr;
- _PTR(AttributeName) aName;
- if (!myGeomShape->_is_nil() && (!myMesh->_is_nil() || !mySubMesh->_is_nil())) {
- _PTR(Study) aStudy = SMESH::GetActiveStudyDocument();
- //_PTR(SObject) aSO = aStudy->FindObjectIOR(aStudy->ConvertObjectToIOR(myGeomShape));
- _PTR(SObject) aSO = aStudy->FindObjectID(myGeomShape->GetStudyEntry());
- if (aSO) {
- if (aSO->FindAttribute(anAttr, "AttributeName")) {
- aName = anAttr;
- LineEditC1A2->setText(QString(aName->Value().c_str()));
- }
- }
- }
-}
-
-//=================================================================================
-// function : UpdateControlState()
-// purpose :
-//=================================================================================
-void SMESHGUI_EditHypothesesDlg::UpdateControlState()
-{
- // asl the check of "count" is commented because of PAL9787
- bool isEnabled = (!myMesh->_is_nil() && !myGeomShape->_is_nil() /*&&
- ListHypAssignation->count() && ListAlgoAssignation->count()*/ )
- ||
- (!mySubMesh->_is_nil() && !myGeomShape->_is_nil() /*&&
- (ListHypAssignation->count() || ListAlgoAssignation->count())*/);
-
- buttonOk ->setEnabled(myNbModification && isEnabled && !myImportedMesh);
- buttonApply->setEnabled(myNbModification && isEnabled && !myImportedMesh);
-
- SelectButtonC1A2 ->setEnabled(ALLOW_CHANGE_SHAPE && !myImportedMesh);
- LineEditC1A2 ->setEnabled(ALLOW_CHANGE_SHAPE && !myImportedMesh);
- ListHypDefinition ->setEnabled(!myImportedMesh);
- ListHypAssignation ->setEnabled(!myImportedMesh);
- ListAlgoDefinition ->setEnabled(!myImportedMesh);
- ListAlgoAssignation->setEnabled(!myImportedMesh);
-}
-
-//=================================================================================
-// function : StoreMesh()
-// purpose :
-//=================================================================================
-bool SMESHGUI_EditHypothesesDlg::StoreMesh()
-{
- MapIOR anOldHypos, aNewHypos;
- if (myGeomShape->_is_nil())
- return false;
-
- // 1. Check whether the geometric shape has changed
- _PTR(SObject) aMeshSO = SMESH::FindSObject(myMesh);
- GEOM::GEOM_Object_var aIniGeomShape = SMESH::GetShapeOnMeshOrSubMesh(aMeshSO);
- bool bShapeChanged = aIniGeomShape->_is_nil() ||
- !aIniGeomShape->_is_equivalent(myGeomShape);
- if (bShapeChanged) {
- // VSR : TODO : Set new shape - not supported yet by SMESH engine
- // 1. remove all old hypotheses and algorithms and also submeshes
- // 2. set new shape
- }
-
- int nbFail = 0;
- MapIOR::iterator it;
-
- // 2. remove not used hypotheses from the mesh
- for (it = myMapOldHypos.begin(); it != myMapOldHypos.end(); ++it) {
- string ior = it->first;
- int index = findItem(ListHypAssignation, ior);
- if (index < 0) {
- SMESH::SMESH_Hypothesis_var aHyp =
- SMESH::IORToInterface<SMESH::SMESH_Hypothesis>(ior.c_str());
- if (!aHyp->_is_nil()) {
- if (!SMESH::RemoveHypothesisOrAlgorithmOnMesh(aMeshSO, aHyp))
- nbFail++;
- }
- }
- }
-
- // 3. remove not used algorithms from the mesh
- for (it = myMapOldAlgos.begin(); it != myMapOldAlgos.end(); ++it) {
- string ior = it->first;
- int index = findItem(ListAlgoAssignation, ior);
- if (index < 0) {
- SMESH::SMESH_Hypothesis_var aHyp =
- SMESH::IORToInterface<SMESH::SMESH_Hypothesis>(ior.c_str());
- if (!aHyp->_is_nil()) {
- if (!SMESH::RemoveHypothesisOrAlgorithmOnMesh(aMeshSO, aHyp))
- nbFail++;
- }
- }
- }
-
- // 4. Add new algorithms
- for (int i = 0; i < ListAlgoAssignation->count(); i++) {
- if (ListAlgoAssignation->item(i)->rtti() == ListBoxIOR::RTTI_IOR) {
- ListBoxIOR* anItem = (ListBoxIOR*)(ListAlgoAssignation->item(i));
- if (anItem) {
- string ior = anItem->GetIOR();
- if (myMapOldAlgos.find(ior) == myMapOldAlgos.end()) {
- SMESH::SMESH_Hypothesis_var aHyp =
- SMESH::IORToInterface<SMESH::SMESH_Hypothesis>(ior.c_str());
- if (!aHyp->_is_nil()) {
- if (!SMESH::AddHypothesisOnMesh(myMesh, aHyp))
- nbFail++;
- }
- }
- }
- }
- }
-
- // 5. Add new hypotheses
- for (int i = 0; i < ListHypAssignation->count(); i++) {
- if (ListHypAssignation->item(i)->rtti() == ListBoxIOR::RTTI_IOR) {
- ListBoxIOR* anItem = (ListBoxIOR*)(ListHypAssignation->item(i));
- if (anItem) {
- string ior = anItem->GetIOR();
- if (myMapOldHypos.find(ior) == myMapOldHypos.end()) {
- SMESH::SMESH_Hypothesis_var aHyp =
- SMESH::IORToInterface<SMESH::SMESH_Hypothesis>(ior.c_str());
- if (!aHyp->_is_nil()) {
- if (!SMESH::AddHypothesisOnMesh(myMesh, aHyp))
- nbFail++;
- }
- }
- }
- }
- }
- return (nbFail == 0);
-}
-
-//=================================================================================
-// function : StoreSubMesh()
-// purpose :
-//=================================================================================
-bool SMESHGUI_EditHypothesesDlg::StoreSubMesh()
-{
- MapIOR anOldHypos, aNewHypos;
- if (myGeomShape->_is_nil())
- return false;
-
- // 1. Check whether the geometric shape has changed
- _PTR(SObject) aSubMeshSO = SMESH::FindSObject(mySubMesh);
- GEOM::GEOM_Object_var aIniGeomShape = SMESH::GetShapeOnMeshOrSubMesh(aSubMeshSO);
- bool bShapeChanged = aIniGeomShape->_is_nil() || !aIniGeomShape->_is_equivalent(myGeomShape);
- if (bShapeChanged) {
- // VSR : TODO : Set new shape - not supported yet by engine
- // 1. remove all old hypotheses and algorithms
- // 2. set new shape
- }
- int nbFail = 0;
- MapIOR::iterator it;
-
- // 2. remove not used hypotheses from the submesh
- for (it = myMapOldHypos.begin(); it != myMapOldHypos.end(); ++it) {
- string ior = it->first;
- int index = findItem(ListHypAssignation, ior);
- if (index < 0) {
- SMESH::SMESH_Hypothesis_var aHyp = SMESH::IORToInterface<SMESH::SMESH_Hypothesis>(ior.c_str());
- if (!aHyp->_is_nil()) {
- if (!SMESH::RemoveHypothesisOrAlgorithmOnMesh(aSubMeshSO, aHyp))
- nbFail++;
- }
- }
- }
-
- // 3. remove not used algorithms from the submesh
- for (it = myMapOldAlgos.begin(); it != myMapOldAlgos.end(); ++it) {
- string ior = it->first;
- int index = findItem(ListAlgoAssignation, ior);
- if (index < 0) {
- SMESH::SMESH_Hypothesis_var aHyp = SMESH::IORToInterface<SMESH::SMESH_Hypothesis>(ior.c_str());
- if (!aHyp->_is_nil()){
- if (!SMESH::RemoveHypothesisOrAlgorithmOnMesh(aSubMeshSO, aHyp))
- nbFail++;
- }
- }
- }
-
- // 4. Add new algorithms
- for (int i = 0; i < ListAlgoAssignation->count(); i++) {
- if (ListAlgoAssignation->item(i)->rtti() == ListBoxIOR::RTTI_IOR) {
- ListBoxIOR* anItem = (ListBoxIOR*)(ListAlgoAssignation->item(i));
- if (anItem) {
- string ior = anItem->GetIOR();
- if (myMapOldAlgos.find(ior) == myMapOldAlgos.end()) {
- SMESH::SMESH_Hypothesis_var aHyp = SMESH::IORToInterface<SMESH::SMESH_Hypothesis>(ior.c_str());
- if (!aHyp->_is_nil()){
- if (!SMESH::AddHypothesisOnSubMesh(mySubMesh, aHyp))
- nbFail++;
- }
- }
- }
- }
- }
-
- // 5. Add new hypotheses
- for (int i = 0; i < ListHypAssignation->count(); i++) {
- if (ListHypAssignation->item(i)->rtti() == ListBoxIOR::RTTI_IOR) {
- ListBoxIOR* anItem = (ListBoxIOR*)(ListHypAssignation->item(i));
- if (anItem) {
- string ior = anItem->GetIOR();
- if (myMapOldHypos.find(ior) == myMapOldHypos.end()) {
- SMESH::SMESH_Hypothesis_var aHyp = SMESH::IORToInterface<SMESH::SMESH_Hypothesis>(ior.c_str());
- if (!aHyp->_is_nil()){
- if (!SMESH::AddHypothesisOnSubMesh(mySubMesh, aHyp))
- nbFail++;
- }
- }
- }
- }
- }
- return (nbFail == 0);
-}
+++ /dev/null
-// SMESHGUI_PredicateFilter : Filters for VTK viewer
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESHGUI_Filter.cxx
-// Author : Sergey LITONIN
-// Module : SMESH
-
-#include "SMESHGUI_Filter.h"
-
-#include "SMESHGUI.h"
-#include "SMESHGUI_Utils.h"
-
-#include "SMESH_Actor.h"
-#include "SMDS_Mesh.hxx"
-#include "SMDS_MeshElement.hxx"
-#include "SMDSAbs_ElementType.hxx"
-
-// OCCT Includes
-#include <gp_Vec.hxx>
-#include <Precision.hxx>
-
-// VTK Includes
-#include <vtkCell.h>
-
-IMPLEMENT_STANDARD_HANDLE(SMESHGUI_Filter, VTKViewer_Filter)
-IMPLEMENT_STANDARD_RTTIEXT(SMESHGUI_Filter, VTKViewer_Filter)
-
-IMPLEMENT_STANDARD_HANDLE(SMESHGUI_PredicateFilter, SMESHGUI_Filter)
-IMPLEMENT_STANDARD_RTTIEXT(SMESHGUI_PredicateFilter, SMESHGUI_Filter)
-
-IMPLEMENT_STANDARD_HANDLE(SMESHGUI_QuadrangleFilter, SMESHGUI_Filter)
-IMPLEMENT_STANDARD_RTTIEXT(SMESHGUI_QuadrangleFilter, SMESHGUI_Filter)
-
-IMPLEMENT_STANDARD_HANDLE(SMESHGUI_TriangleFilter, SMESHGUI_Filter)
-IMPLEMENT_STANDARD_RTTIEXT(SMESHGUI_TriangleFilter, SMESHGUI_Filter)
-
-IMPLEMENT_STANDARD_HANDLE(SMESHGUI_FacesFilter, SMESHGUI_Filter)
-IMPLEMENT_STANDARD_RTTIEXT(SMESHGUI_FacesFilter, SMESHGUI_Filter)
-
-IMPLEMENT_STANDARD_HANDLE(SMESHGUI_VolumesFilter, SMESHGUI_Filter)
-IMPLEMENT_STANDARD_RTTIEXT(SMESHGUI_VolumesFilter, SMESHGUI_Filter)
-
-/*
- Class : SMESHGUI_PredicateFilter
- Description : Selection filter for VTK viewer. This class aggregate object
- of SMESH_Predicate class and uses it for verification of criterion
-*/
-
-//=======================================================================
-// name : SMESHGUI_PredicateFilter::SMESHGUI_PredicateFilter
-// Purpose : Constructor
-//=======================================================================
-SMESHGUI_PredicateFilter::SMESHGUI_PredicateFilter()
-{
-}
-
-SMESHGUI_PredicateFilter::~SMESHGUI_PredicateFilter()
-{
-}
-
-//=======================================================================
-// name : SMESHGUI_PredicateFilter::IsValid
-// Purpose : Verify whether entry id satisfies to criterion of the filter
-//=======================================================================
-bool SMESHGUI_PredicateFilter::IsValid( const int theCellId ) const
-{
- if ( myActor == 0 || myPred->_is_nil() )
- return false;
-
- SMESH_Actor* anActor = dynamic_cast<SMESH_Actor*>( myActor );
- if ( !anActor || anActor->GetObject() == 0 )
- return false;
-
- SMDS_Mesh* aMesh = anActor->GetObject()->GetMesh();
- SMESH::ElementType anElemType = myPred->GetElementType();
- int aMeshId = anElemType == SMESH::NODE ? anActor->GetNodeObjId( theCellId )
- : anActor->GetElemObjId( theCellId );
-
- // if type of element != type of predicate return true because
- // this predicate is not intended for filtering sush elements
- const SMDS_MeshElement* anElem = anElemType == SMESH::NODE ? aMesh->FindNode( aMeshId )
- : aMesh->FindElement( aMeshId );
- if ( anElem != 0 && anElem->GetType() != (SMDSAbs_ElementType)myPred->GetElementType() )
- return true;
-
- return myPred->IsSatisfy( aMeshId );
-}
-
-//=======================================================================
-// name : SMESHGUI_PredicateFilter::IsValid
-// Purpose : Verify whether entry id satisfies to criterion of the filter
-//=======================================================================
-bool SMESHGUI_PredicateFilter::IsObjValid( const int theObjId ) const
-{
- if ( myActor == 0 || myPred->_is_nil() )
- return false;
-
- SMESH_Actor* anActor = ( SMESH_Actor* )myActor;
- if ( anActor->GetObject() == 0 )
- return false;
-
- SMDS_Mesh* aMesh = anActor->GetObject()->GetMesh();
- SMESH::ElementType anElemType = myPred->GetElementType();
-
- // if type of element != type of predicate return true because
- // this predicate is not intended for filtering sush elements
- const SMDS_MeshElement* anElem = anElemType == SMESH::NODE ? aMesh->FindNode( theObjId )
- : aMesh->FindElement( theObjId );
- if ( anElem != 0 && anElem->GetType() != (SMDSAbs_ElementType)myPred->GetElementType() )
- return true;
-
- return myPred->IsSatisfy( theObjId );
-}
-
-//=======================================================================
-// name : SMESHGUI_PredicateFilter::IsNodeFilter
-// Purpose : Returns true if filter is intended for nodes
-//=======================================================================
-bool SMESHGUI_PredicateFilter::IsNodeFilter() const
-{
- return GetId() == SMESHGUI_NodeFilter;
-}
-
-//=======================================================================
-// name : SMESHGUI_PredicateFilter::SetPredicate
-// Purpose : Set new pridicate to the filter
-//=======================================================================
-void SMESHGUI_PredicateFilter::SetPredicate( SMESH::Predicate_ptr thePred )
-{
- myPred = SMESH::Predicate::_duplicate( thePred );
-}
-
-//=======================================================================
-// name : SMESHGUI_PredicateFilter::SetActor
-// Purpose : Set new actor
-//=======================================================================
-void SMESHGUI_PredicateFilter::SetActor( SALOME_Actor* theActor )
-{
- if ( myActor == theActor )
- return;
- SMESHGUI_Filter::SetActor( theActor );
-
- if ( myActor != 0 && !myPred->_is_nil() )
- {
- SALOME_Actor* sActor = dynamic_cast<SALOME_Actor*>( myActor );
- Handle(SALOME_InteractiveObject) anIO;
- if( sActor )
- anIO = sActor->getIO();
- if ( !anIO.IsNull() )
- {
- SMESH::SMESH_Mesh_var aMesh = SMESH::IObjectToInterface<SMESH::SMESH_Mesh>(anIO);
- if(!aMesh->_is_nil())
- myPred->SetMesh(aMesh);
- }
- }
-}
-
-//=======================================================================
-// name : SMESHGUI_PredicateFilter::SetActor
-// Purpose : Get ID of the filter. Must return value from SMESHGUI_FilterType
-// enumeration. All filters must have different ids
-//=======================================================================
-int SMESHGUI_PredicateFilter::GetId() const
-{
- if ( myPred->GetElementType() == SMESH::NODE ) return SMESHGUI_NodeFilter;
- else if ( myPred->GetElementType() == SMESH::EDGE ) return SMESHGUI_EdgeFilter;
- else if ( myPred->GetElementType() == SMESH::FACE ) return SMESHGUI_FaceFilter;
- else if ( myPred->GetElementType() == SMESH::VOLUME ) return SMESHGUI_VolumeFilter;
- else if ( myPred->GetElementType() == SMESH::ALL ) return SMESHGUI_AllElementsFilter;
- else return SMESHGUI_UnknownFilter;
-}
-
-
-/*
- Class : SMESHGUI_QuadrangleFilter
- Description : Verify whether selected cell is quadranle
-*/
-
-//=======================================================================
-// name : SMESHGUI_QuadrangleFilter::SMESHGUI_QuadrangleFilter
-// Purpose : Constructor
-//=======================================================================
-SMESHGUI_QuadrangleFilter::SMESHGUI_QuadrangleFilter()
-: SMESHGUI_Filter()
-{
-}
-
-SMESHGUI_QuadrangleFilter::~SMESHGUI_QuadrangleFilter()
-{
-}
-
-//=======================================================================
-// name : SMESHGUI_QuadrangleFilter::IsValid
-// Purpose : Verify whether selected cell is quadranle
-//=======================================================================
-bool SMESHGUI_QuadrangleFilter::IsValid( const int theCellId ) const
-{
- if ( myActor == 0 )
- return false;
-
- SMESH_Actor* anActor = ( SMESH_Actor* )myActor;
- if ( anActor->GetObject() == 0 )
- return false;
-
- SMDS_Mesh* aMesh = anActor->GetObject()->GetMesh();
- const SMDS_MeshElement* anElem = aMesh->FindElement( anActor->GetElemObjId( theCellId ) );
-
- return anElem && anElem->GetType() == SMDSAbs_Face && anElem->NbNodes() == 4;
-}
-
-//=======================================================================
-// name : SMESHGUI_QuadrangleFilter::IsValid
-// Purpose : Verify whether selected cell is quadranle
-//=======================================================================
-bool SMESHGUI_QuadrangleFilter::IsObjValid( const int theObjId ) const
-{
- if ( myActor == 0 )
- return false;
-
- SMESH_Actor* anActor = ( SMESH_Actor* )myActor;
- if ( anActor->GetObject() == 0 )
- return false;
-
- SMDS_Mesh* aMesh = anActor->GetObject()->GetMesh();
- const SMDS_MeshElement* anElem = aMesh->FindElement( theObjId );
-
- return anElem && anElem->GetType() == SMDSAbs_Face && anElem->NbNodes() == 4;
-}
-
-//=======================================================================
-// name : SMESHGUI_QuadrangleFilter::SetActor
-// Purpose : Get ID of the filter. Must return value from SMESHGUI_FilterType
-// enumeration. All filters must have different ids
-//=======================================================================
-int SMESHGUI_QuadrangleFilter::GetId() const
-{
- return SMESHGUI_QuadFilter;
-}
-
-//=======================================================================
-// name : SMESHGUI_QuadrangleFilter::IsNodeFilter
-// Purpose : Returns true if filter is intended for nodes
-//=======================================================================
-bool SMESHGUI_QuadrangleFilter::IsNodeFilter() const
-{
- return false;
-}
-
-
-/*
- Class : SMESHGUI_TriangleFilter
- Description : Verify whether selected cell is triangle
-*/
-
-
-//=======================================================================
-// name : SMESHGUI_TriangleFilter::SMESHGUI_TriangleFilter
-// Purpose : Constructor
-//=======================================================================
-SMESHGUI_TriangleFilter::SMESHGUI_TriangleFilter()
-: SMESHGUI_Filter()
-{
-}
-
-SMESHGUI_TriangleFilter::~SMESHGUI_TriangleFilter()
-{
-}
-
-//=======================================================================
-// name : SMESHGUI_TriangleFilter::IsValid
-// Purpose : Verify whether selected cell is triangle
-//=======================================================================
-bool SMESHGUI_TriangleFilter::IsValid( const int theCellId ) const
-{
- if ( myActor == 0 )
- return false;
-
- SMESH_Actor* anActor = ( SMESH_Actor* )myActor;
- if ( anActor->GetObject() == 0 )
- return false;
-
- SMDS_Mesh* aMesh = anActor->GetObject()->GetMesh();
- const SMDS_MeshElement* anElem = aMesh->FindElement( anActor->GetElemObjId( theCellId ) );
-
- return anElem && anElem->GetType() == SMDSAbs_Face && anElem->NbNodes() == 3;
-}
-
-//=======================================================================
-// name : SMESHGUI_TriangleFilter::IsValid
-// Purpose : Verify whether selected cell is triangle
-//=======================================================================
-bool SMESHGUI_TriangleFilter::IsObjValid( const int theObjId ) const
-{
- if ( myActor == 0 )
- return false;
-
- SMESH_Actor* anActor = ( SMESH_Actor* )myActor;
- if ( anActor->GetObject() == 0 )
- return false;
-
- SMDS_Mesh* aMesh = anActor->GetObject()->GetMesh();
- const SMDS_MeshElement* anElem = aMesh->FindElement( theObjId );
-
- return anElem && anElem->GetType() == SMDSAbs_Face && anElem->NbNodes() == 3;
-}
-
-//=======================================================================
-// name : SMESHGUI_TriangleFilter::SetActor
-// Purpose : Get ID of the filter. Must return value from SMESHGUI_FilterType
-// enumeration. All filters must have different ids
-//=======================================================================
-int SMESHGUI_TriangleFilter::GetId() const
-{
- return SMESHGUI_TriaFilter;
-}
-
-//=======================================================================
-// name : SMESHGUI_TriangleFilter::IsNodeFilter
-// Purpose : Returns true if filter is intended for nodes
-//=======================================================================
-bool SMESHGUI_TriangleFilter::IsNodeFilter() const
-{
- return false;
-}
-
-/*
- Class : SMESHGUI_FacesFilter
- Description : Verify whether selected cell is any face
-*/
-
-
-//=======================================================================
-// name : SMESHGUI_FacesFilter::SMESHGUI_FacesFilter
-// Purpose : Constructor
-//=======================================================================
-SMESHGUI_FacesFilter::SMESHGUI_FacesFilter()
-: SMESHGUI_Filter()
-{
-}
-
-SMESHGUI_FacesFilter::~SMESHGUI_FacesFilter()
-{
-}
-
-//=======================================================================
-// name : SMESHGUI_FacesFilter::IsValid
-// Purpose : Verify whether selected cell is face
-//=======================================================================
-bool SMESHGUI_FacesFilter::IsValid( const int theCellId ) const
-{
- if ( myActor == 0 )
- return false;
-
- SMESH_Actor* anActor = ( SMESH_Actor* )myActor;
- if ( anActor->GetObject() == 0 )
- return false;
-
- SMDS_Mesh* aMesh = anActor->GetObject()->GetMesh();
- const SMDS_MeshElement* anElem = aMesh->FindElement( anActor->GetElemObjId( theCellId ) );
-
- return anElem && anElem->GetType() == SMDSAbs_Face;
-}
-
-//=======================================================================
-// name : SMESHGUI_FacesFilter::IsValid
-// Purpose : Verify whether selected cell is face
-//=======================================================================
-bool SMESHGUI_FacesFilter::IsObjValid( const int theObjId ) const
-{
- if ( myActor == 0 )
- return false;
-
- SMESH_Actor* anActor = ( SMESH_Actor* )myActor;
- if ( anActor->GetObject() == 0 )
- return false;
-
- SMDS_Mesh* aMesh = anActor->GetObject()->GetMesh();
- const SMDS_MeshElement* anElem = aMesh->FindElement( theObjId );
-
- return anElem && anElem->GetType() == SMDSAbs_Face;
-}
-
-//=======================================================================
-// name : SMESHGUI_FacesFilter::GetId
-// Purpose : Get ID of the filter. Must return value from SMESHGUI_FilterType
-// enumeration. All filters must have different ids
-//=======================================================================
-int SMESHGUI_FacesFilter::GetId() const
-{
- return SMESHGUI_FaceFilter;
-}
-
-//=======================================================================
-// name : SMESHGUI_FacesFilter::IsNodeFilter
-// Purpose : Returns true if filter is intended for nodes
-//=======================================================================
-bool SMESHGUI_FacesFilter::IsNodeFilter() const
-{
- return false;
-}
-
-
-/*
- Class : SMESHGUI_VolumesFilter
- Description : Verify whether selected cell is any volume
-*/
-
-
-//=======================================================================
-// name : SMESHGUI_VolumesFilter::SMESHGUI_VolumesFilter
-// Purpose : Constructor
-//=======================================================================
-SMESHGUI_VolumesFilter::SMESHGUI_VolumesFilter()
-: SMESHGUI_Filter()
-{
-}
-
-SMESHGUI_VolumesFilter::~SMESHGUI_VolumesFilter()
-{
-}
-
-//=======================================================================
-// name : SMESHGUI_VolumesFilter::IsValid
-// Purpose : Verify whether selected cell is volume
-//=======================================================================
-bool SMESHGUI_VolumesFilter::IsValid( const int theCellId ) const
-{
- if ( myActor == 0 )
- return false;
-
- SMESH_Actor* anActor = ( SMESH_Actor* )myActor;
- if ( anActor->GetObject() == 0 )
- return false;
-
- SMDS_Mesh* aMesh = anActor->GetObject()->GetMesh();
- const SMDS_MeshElement* anElem = aMesh->FindElement( anActor->GetElemObjId( theCellId ) );
-
- return anElem && anElem->GetType() == SMDSAbs_Volume;
-}
-
-//=======================================================================
-// name : SMESHGUI_VolumesFilter::IsValid
-// Purpose : Verify whether selected cell is volume
-//=======================================================================
-bool SMESHGUI_VolumesFilter::IsObjValid( const int theObjId ) const
-{
- if ( myActor == 0 )
- return false;
-
- SMESH_Actor* anActor = ( SMESH_Actor* )myActor;
- if ( anActor->GetObject() == 0 )
- return false;
-
- SMDS_Mesh* aMesh = anActor->GetObject()->GetMesh();
- const SMDS_MeshElement* anElem = aMesh->FindElement( theObjId );
-
- return anElem && anElem->GetType() == SMDSAbs_Volume;
-}
-
-//=======================================================================
-// name : SMESHGUI_VolumesFilter::GetId
-// Purpose : Get ID of the filter. Must return value from SMESHGUI_FilterType
-// enumeration. All filters must have different ids
-//=======================================================================
-int SMESHGUI_VolumesFilter::GetId() const
-{
- return SMESHGUI_VolumeFilter;
-}
-
-//=======================================================================
-// name : SMESHGUI_VolumesFilter::IsNodeFilter
-// Purpose : Returns true if filter is intended for nodes
-//=======================================================================
-bool SMESHGUI_VolumesFilter::IsNodeFilter() const
-{
- return false;
-}
+++ /dev/null
-// SMESHGUI_Filter : Filters for VTK viewer
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESHGUI_Filter.h
-// Author : Sergey LITONIN
-// Module : SMESH
-
-#ifndef SMESHGUI_Filter_HeaderFile
-#define SMESHGUI_Filter_HeaderFile
-
-#include "VTKViewer_Filter.h"
-
-#include <SALOMEconfig.h>
-#include CORBA_SERVER_HEADER(SMESH_Filter)
-
-class SALOME_Actor;
-
-enum SMESHGUI_FilterType
-{
- SMESHGUI_UnknownFilter = -1,
- SMESHGUI_NodeFilter = 0,
- SMESHGUI_EdgeFilter = 1,
- SMESHGUI_FaceFilter = 2,
- SMESHGUI_VolumeFilter = 3,
- SMESHGUI_AllElementsFilter = 4,
- SMESHGUI_QuadFilter = 5,
- SMESHGUI_TriaFilter = 6,
- SMESHGUI_LastFilter
-};
-
-/*
- Class : SMESHGUI_Filter
- Description : Base class for SMESH selection filters for VTK viewer.
-*/
-
-DEFINE_STANDARD_HANDLE(SMESHGUI_Filter, VTKViewer_Filter)
-
-class SMESHGUI_Filter : public VTKViewer_Filter
-{
-
-public:
-
- virtual bool IsObjValid( const int theObjId ) const = 0;
-public:
- DEFINE_STANDARD_RTTI(SMESHGUI_Filter)
-};
-
-/*
- Class : SMESHGUI_PredicateFilter
- Description : Selection filter for VTK viewer. This class aggregate object
- of SMESH_Predicate class and uses it for verification of criterion
-*/
-
-DEFINE_STANDARD_HANDLE(SMESHGUI_PredicateFilter, SMESHGUI_Filter)
-
-class SMESHGUI_PredicateFilter : public SMESHGUI_Filter
-{
-
-public:
- SMESHGUI_PredicateFilter();
- virtual ~SMESHGUI_PredicateFilter();
-
- virtual bool IsValid( const int theCellId ) const;
- virtual bool IsObjValid( const int theObjId ) const;
- virtual int GetId() const;
- virtual bool IsNodeFilter() const;
- void SetPredicate( SMESH::Predicate_ptr );
-
- void SetActor( SALOME_Actor* );
-
-private:
-
- SMESH::Predicate_var myPred;
-
-public:
- DEFINE_STANDARD_RTTI(SMESHGUI_PredicateFilter)
-};
-
-/*
- Class : SMESHGUI_QuadrangleFilter
- Description : Verify whether selected cell is quadranle
-*/
-
-DEFINE_STANDARD_HANDLE(SMESHGUI_QuadrangleFilter, SMESHGUI_Filter)
-
-class SMESHGUI_QuadrangleFilter : public SMESHGUI_Filter
-{
-
-public:
- SMESHGUI_QuadrangleFilter();
- virtual ~SMESHGUI_QuadrangleFilter();
-
- virtual bool IsValid( const int theCellId ) const;
- virtual bool IsObjValid( const int theObjId ) const;
- virtual int GetId() const;
- virtual bool IsNodeFilter() const;
-
-public:
- DEFINE_STANDARD_RTTI(SMESHGUI_QuadrangleFilter)
-};
-
-/*
- Class : SMESHGUI_TriangleFilter
- Description : Verify whether selected cell is triangle
-*/
-
-DEFINE_STANDARD_HANDLE(SMESHGUI_TriangleFilter, SMESHGUI_Filter)
-
-class SMESHGUI_TriangleFilter : public SMESHGUI_Filter
-{
-
-public:
- SMESHGUI_TriangleFilter();
- virtual ~SMESHGUI_TriangleFilter();
-
- virtual bool IsValid( const int theCellId ) const;
- virtual bool IsObjValid( const int theObjId ) const;
- virtual int GetId() const;
- virtual bool IsNodeFilter() const;
-
-public:
- DEFINE_STANDARD_RTTI(SMESHGUI_TriangleFilter)
-};
-
-/*
- Class : SMESHGUI_FacesFilter
- Description : Verify whether selected cell is any face
-*/
-
-DEFINE_STANDARD_HANDLE(SMESHGUI_FacesFilter, SMESHGUI_Filter)
-
-class SMESHGUI_FacesFilter : public SMESHGUI_Filter
-{
-
-public:
- SMESHGUI_FacesFilter();
- virtual ~SMESHGUI_FacesFilter();
-
- virtual bool IsValid( const int theCellId ) const;
- virtual bool IsObjValid( const int theObjId ) const;
- virtual int GetId() const;
- virtual bool IsNodeFilter() const;
-
-public:
- DEFINE_STANDARD_RTTI(SMESHGUI_FacesFilter)
-};
-
-/*
- Class : SMESHGUI_VolumesFilter
- Description : Verify whether selected cell is any volume
-*/
-
-DEFINE_STANDARD_HANDLE(SMESHGUI_VolumesFilter, SMESHGUI_Filter)
-
-class SMESHGUI_VolumesFilter : public SMESHGUI_Filter
-{
-
-public:
- SMESHGUI_VolumesFilter();
- virtual ~SMESHGUI_VolumesFilter();
-
- virtual bool IsValid( const int theCellId ) const;
- virtual bool IsObjValid( const int theObjId ) const;
- virtual int GetId() const;
- virtual bool IsNodeFilter() const;
-
-public:
- DEFINE_STANDARD_RTTI(SMESHGUI_VolumesFilter)
-};
-
-#endif
+++ /dev/null
-// SMESH SMESHGUI : GUI for SMESH component
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESHGUI_FilterLibraryDlg.cxx
-// Author : Sergey LITONIN
-// Module : SMESH
-
-#include "SMESHGUI_FilterLibraryDlg.h"
-
-#include "SMESHGUI.h"
-#include "SMESHGUI_Utils.h"
-#include "SMESHGUI_FilterUtils.h"
-
-#include "SUIT_Session.h"
-#include "SUIT_Desktop.h"
-#include "SUIT_FileDlg.h"
-
-// QT Includes
-#include <qapplication.h>
-#include <qmessagebox.h>
-#include <qframe.h>
-#include <qlayout.h>
-#include <qlineedit.h>
-#include <qpushbutton.h>
-#include <qgroupbox.h>
-#include <qlabel.h>
-#include <qlistbox.h>
-#include <qfile.h>
-#include <qfileinfo.h>
-#include <qdir.h>
-
-#define SPACING 5
-#define MARGIN 10
-
-/*!
- * Class : SMESHGUI_FilterLibraryDlg::Dialog
- * Description : Dialog for opening filter library
- */
-
-class SMESHGUI_FilterLibraryDlg::Dialog : public SUIT_FileDlg
-{
- public:
- Dialog(QWidget* theParent, const bool theToOpen);
- virtual ~Dialog();
-
- protected:
- virtual bool acceptData();
-};
-
-SMESHGUI_FilterLibraryDlg::Dialog::Dialog (QWidget* theParent,
- const bool theToOpen)
- : SUIT_FileDlg(theParent, theToOpen)
-{
-}
-
-SMESHGUI_FilterLibraryDlg::Dialog::~Dialog()
-{
-}
-
-bool SMESHGUI_FilterLibraryDlg::Dialog::acceptData()
-{
-// if (mode() != QFileDialogP::AnyFile)
-// return SUIT_FileDlg::acceptData();
-
- return true;
-}
-
-/*!
- * Class : SMESHGUI_FilterLibraryDlg
- * Description : Dialog to specify filters for VTK viewer
- */
-
-//=======================================================================
-// name : SMESHGUI_FilterLibraryDlg::SMESHGUI_FilterLibraryDlg
-// Purpose : Constructor
-//=======================================================================
-SMESHGUI_FilterLibraryDlg::SMESHGUI_FilterLibraryDlg (SMESHGUI* theModule,
- QWidget* parent,
- const QValueList<int>& theTypes,
- const int theMode,
- const char* theName)
- : QDialog( parent, theName, true, WStyle_Customize |
- WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu ),
- mySMESHGUI( theModule )
-{
- construct(theTypes, theMode);
-}
-
-//=======================================================================
-// name : SMESHGUI_FilterLibraryDlg::SMESHGUI_FilterLibraryDlg
-// Purpose : Constructor
-//=======================================================================
-SMESHGUI_FilterLibraryDlg::SMESHGUI_FilterLibraryDlg (SMESHGUI* theModule,
- QWidget* parent,
- const int theType,
- const int theMode,
- const char* theName)
- : QDialog( parent, theName, true, WStyle_Customize |
- WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu ),
- mySMESHGUI( theModule )
-{
- QValueList<int> aTypes;
- aTypes.append(theType);
- construct(aTypes, theMode);
-}
-
-//=======================================================================
-// name : SMESHGUI_FilterLibraryDlg::construct
-// Purpose : Construct dialog (called by constructor)
-//=======================================================================
-void SMESHGUI_FilterLibraryDlg::construct (const QValueList<int>& theTypes,
- const int theMode)
-{
- myTypes = theTypes;
- myMode = theMode;
-
- QVBoxLayout* aDlgLay = new QVBoxLayout(this, MARGIN, SPACING);
-
- myMainFrame = createMainFrame (this);
- QFrame* aBtnFrame = createButtonFrame(this);
-
- aDlgLay->addWidget(myMainFrame);
- aDlgLay->addWidget(aBtnFrame);
-
- aDlgLay->setStretchFactor(myMainFrame, 1);
-
- Init(myTypes, myMode);
-}
-
-//=======================================================================
-// name : SMESHGUI_FilterLibraryDlg::createMainFrame
-// Purpose : Create frame containing dialog's input fields
-//=======================================================================
-QFrame* SMESHGUI_FilterLibraryDlg::createMainFrame (QWidget* theParent)
-{
- QGroupBox* aMainFrame = new QGroupBox(1, Qt::Horizontal, theParent);
- aMainFrame->setFrameStyle(QFrame::NoFrame);
- aMainFrame->setInsideMargin(0);
-
- // library name
-
- QGroupBox* aGrp = new QGroupBox(1, Qt::Vertical, aMainFrame);
- aGrp->setFrameStyle(QFrame::NoFrame);
- aGrp->setInsideMargin(0);
-
- new QLabel(tr("LIBRARY_FILE"), aGrp);
- myFileName = new QLineEdit(aGrp);
- myOpenBtn = new QPushButton(aGrp);
- myOpenBtn->setPixmap(SUIT_Session::session()->resourceMgr()->loadPixmap(
- "SUIT", tr("ICON_FILE_OPEN")));
-
- // filters list box
-
- aGrp = new QGroupBox(1, Qt::Vertical, tr("FILTER_NAMES"), aMainFrame);
- QFrame* aFrame = new QFrame(aGrp);
- myListBox = new QListBox(aFrame);
- myAddBtn = new QPushButton(tr("ADD"), aFrame);
- myDeleteBtn = new QPushButton(tr("DELETE"), aFrame);
-
- QGridLayout* aLay = new QGridLayout(aFrame, 3, 2, 0, 5);
- aLay->addMultiCellWidget(myListBox, 0, 2, 0, 0);
- aLay->addWidget(myAddBtn, 0, 1);
- aLay->addWidget(myDeleteBtn, 1, 1);
- QSpacerItem* aVSpacer = new QSpacerItem(0, 0, QSizePolicy::Minimum, QSizePolicy::Expanding);
- aLay->addItem(aVSpacer, 2, 1);
-
- // filter name
-
- myNameGrp = new QGroupBox(1, Qt::Vertical, aMainFrame);
- myNameGrp->setFrameStyle(QFrame::NoFrame);
- myNameGrp->setInsideMargin(0);
- new QLabel(tr("FILTER_NAME"), myNameGrp);
- myName = new QLineEdit(myNameGrp);
-
- // table
-
- myTable = new SMESHGUI_FilterTable( mySMESHGUI, aMainFrame, myTypes);
- myTable->SetEditable(myMode == EDIT);
- myTable->SetLibsEnabled(false);
-
- myListBox->setMinimumHeight((int)(myTable->sizeHint().height() * 0.5));
- myListBox->setRowMode(QListBox::FitToWidth);
- myListBox->setSelectionMode(QListBox::Single);
-
- myOpenBtn->setAutoDefault(false);
- myAddBtn->setAutoDefault(false);
- myDeleteBtn->setAutoDefault(false);
-
- // connect signals and slots
-
- connect(myFileName, SIGNAL(returnPressed()), this, SLOT(onReturnPressed()));
- connect(myOpenBtn , SIGNAL(clicked()), this, SLOT(onBrowse()));
-
- connect(myListBox, SIGNAL(highlighted(const QString&)),
- this, SLOT(onFilterChanged(const QString&)));
-
- connect(myAddBtn, SIGNAL(clicked()), this, SLOT(onAddBtnPressed()));
- connect(myDeleteBtn, SIGNAL(clicked()), this, SLOT(onDeleteBtnPressed()));
-
- connect(myName, SIGNAL(textChanged(const QString&)),
- this, SLOT(onFilterNameChanged(const QString&)));
-
- connect(myTable, SIGNAL(EntityTypeChanged(const int)),
- this, SLOT(onEntityTypeChanged(const int)));
-
- connect(myTable, SIGNAL(NeedValidation()), this, SLOT(onNeedValidation()));
-
- return aMainFrame;
-}
-
-//=======================================================================
-// name : SMESHGUI_FilterLibraryDlg::createButtonFrame
-// Purpose : Create frame containing buttons
-//=======================================================================
-QFrame* SMESHGUI_FilterLibraryDlg::createButtonFrame (QWidget* theParent)
-{
- QGroupBox* aGrp = new QGroupBox(1, Qt::Vertical, theParent);
-
- myButtons[ BTN_OK ] = new QPushButton(tr("SMESH_BUT_OK" ), aGrp);
- myButtons[ BTN_Apply ] = new QPushButton(tr("SMESH_BUT_APPLY"), aGrp);
-
- QLabel* aLbl = new QLabel(aGrp);
- aLbl->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed));
-
- myButtons[ BTN_Cancel ] = new QPushButton(tr("SMESH_BUT_CANCEL"), aGrp);
- myButtons[ BTN_Close ] = new QPushButton(tr("SMESH_BUT_CLOSE"), aGrp);
-
- connect(myButtons[ BTN_OK ], SIGNAL(clicked()), SLOT(onOk()));
- connect(myButtons[ BTN_Cancel ], SIGNAL(clicked()), SLOT(onClose()));
- connect(myButtons[ BTN_Close ], SIGNAL(clicked()), SLOT(onClose()));
- connect(myButtons[ BTN_Apply ], SIGNAL(clicked()), SLOT(onApply()));
-
- QMap<int, QPushButton*>::iterator anIter;
- for (anIter = myButtons.begin(); anIter != myButtons.end(); ++anIter)
- anIter.data()->setAutoDefault(false);
-
- updateMainButtons();
-
- return aGrp;
-}
-
-//=======================================================================
-// name : SMESHGUI_FilterLibraryDlg::updateMainButtons
-// Purpose : Update visibility of main buttons (OK, Cancel, Close ...)
-//=======================================================================
-void SMESHGUI_FilterLibraryDlg::updateMainButtons()
-{
- if (myTypes.count() == 1) {
- myButtons[ BTN_Cancel ]->show();
- myButtons[ BTN_Apply ]->hide();
- myButtons[ BTN_Close ]->hide();
- } else {
- myButtons[ BTN_Cancel ]->hide();
- myButtons[ BTN_Apply ]->show();
- myButtons[ BTN_Close ]->show();
- }
-}
-
-//=======================================================================
-// name : SMESHGUI_FilterLibraryDlg::~SMESHGUI_FilterLibraryDlg
-// Purpose : Destructor
-//=======================================================================
-SMESHGUI_FilterLibraryDlg::~SMESHGUI_FilterLibraryDlg()
-{
-}
-
-//=======================================================================
-// name : SMESHGUI_FilterLibraryDlg::Init
-// Purpose : Init dialog fields, connect signals and slots, show dialog
-//=======================================================================
-void SMESHGUI_FilterLibraryDlg::Init (const int type, const int theMode)
-{
- QValueList<int> aTypes;
- aTypes.append(type);
- Init(aTypes, theMode);
-}
-
-//=======================================================================
-// name : SMESHGUI_FilterLibraryDlg::Init
-// Purpose : Init dialog fields, connect signals and slots, show dialog
-//=======================================================================
-void SMESHGUI_FilterLibraryDlg::Init (const QValueList<int>& theTypes,
- const int theMode)
-{
- myMode = theMode;
- myTypes = theTypes;
- myTable->Init(theTypes);
- myCurrFilterName = "";
- myCurrFilter = -1;
- myListBox->clear();
- myName->clear();
- myTable->Clear();
-
- updateControlsVisibility();
- setEnabled(true);
-
- connect( mySMESHGUI, SIGNAL(SignalDeactivateActiveDialog()), SLOT(onDeactivate()));
- connect( mySMESHGUI, SIGNAL(SignalCloseAllDialogs()), SLOT(onClose()));
-
- if (myMode == ADD_TO)
- {
- setCaption(tr("ADD_TO_TLT"));
- if (myFileName->text().isEmpty())
- myFileName->setText(getDefaultLibraryName());
- processNewLibrary();
- }
- else if (myMode == COPY_FROM)
- {
- setCaption(tr("COPY_FROM_TLT"));
- if (myFileName->text().isEmpty())
- myFileName->setText(getDefaultLibraryName());
- processNewLibrary();
- if (myListBox->count() > 0)
- myListBox->setCurrentItem(0);
- }
- else
- {
- setCaption(tr("EDIT_LIB_TLT"));
- if (myFileName->text().isEmpty())
- myFileName->setText(getDefaultLibraryName());
- processNewLibrary();
- if (myListBox->count() > 0)
- myListBox->setCurrentItem(0);
- }
-
- int x, y;
- mySMESHGUI->DefineDlgPosition(this, x, y);
- this->move(x, y);
-
- this->show();
-
- updateMainButtons();
- isPermissionValid(false);
-}
-
-//=======================================================================
-// name : SMESHGUI_FilterLibraryDlg::updateControlsVisibility
-// Purpose : Update visibility of controls in accordance with myMode
-//=======================================================================
-void SMESHGUI_FilterLibraryDlg::updateControlsVisibility()
-{
- if (myMode == ADD_TO)
- {
- myNameGrp->show();
- myNameGrp->setEnabled(true);
- myAddBtn->hide();
- myDeleteBtn->hide();
- myTable->SetEditable(false);
- }
- else if (myMode == COPY_FROM)
- {
- myNameGrp->hide();
- myNameGrp->setEnabled(false);
- myAddBtn->hide();
- myDeleteBtn->hide();
- myTable->SetEditable(false);
- }
- else if (myMode == EDIT)
- {
- myNameGrp->show();
- myNameGrp->setEnabled(true);
- myAddBtn->show();
- myDeleteBtn->show();
- myTable->SetEditable(true);
- }
-
- qApp->processEvents();
- updateGeometry();
- adjustSize();
-}
-
-//=======================================================================
-// name : SMESHGUI_FilterLibraryDlg::onApply
-// Purpose : SLOT called when "Apply" button pressed.
-//=======================================================================
-bool SMESHGUI_FilterLibraryDlg::onApply()
-{
- if (!isValid(true) || !isPermissionValid(false))
- return false;
-
- if (myLibrary->_is_nil()) {
- QMessageBox::information(SMESHGUI::desktop(), tr("SMESH_WRN_WARNING"),
- tr("LIBRARY_IS_NOT_LOADED"), QMessageBox::Ok);
- return false;
- }
-
- const char* aName = myFileName->text().latin1();
- if (strcmp(myLibrary->GetFileName(), aName) != 0)
- myLibrary->SetFileName(aName);
-
- bool aResult = false;
-
- if (myMode == COPY_FROM || myListBox->count() == 0) {
- aResult = true;
- } else if (myMode == EDIT || myMode == ADD_TO) {
- SMESH::Filter_var aFilter = createFilter();
- if (!myLibrary->Replace(myCurrFilterName, myName->text(), aFilter.in())) {
- QMessageBox::information(SMESHGUI::desktop(), tr("SMESH_ERROR"),
- tr("ERROR_OF_EDITING"), QMessageBox::Ok);
- aResult = false;
- }
- else
- aResult = true;
- }
-
- if (aResult && myMode != COPY_FROM)
- aResult = myLibrary->Save();
-
- if (aResult) {
- char* aFileName = myLibrary->GetFileName();
- getDefaultLibraryName() = QString(aFileName);
- delete aFileName;
- } else if (myMode != COPY_FROM) {
- QMessageBox::information(SMESHGUI::desktop(), tr("SMESH_ERROR"),
- tr("ERROR_OF_SAVING"), QMessageBox::Ok);
- } else {
- }
-
- return aResult;
-}
-
-//=======================================================================
-// name : SMESHGUI_FilterLibraryDlg::onOk
-// Purpose : SLOT called when "Ok" button pressed.
-// Assign filters VTK viewer and close dialog
-//=======================================================================
-void SMESHGUI_FilterLibraryDlg::onOk()
-{
- if (onApply())
- {
- disconnect( mySMESHGUI, 0, this, 0);
- mySMESHGUI->ResetState();
- accept();
- }
-}
-
-//=======================================================================
-// name : SMESHGUI_FilterLibraryDlg::onClose
-// Purpose : SLOT called when "Close" button pressed. Close dialog
-//=======================================================================
-void SMESHGUI_FilterLibraryDlg::onClose()
-{
- disconnect( mySMESHGUI, 0, this, 0);
- mySMESHGUI->ResetState();
- reject();
-}
-
-//=======================================================================
-// name : SMESHGUI_FilterLibraryDlg::onDeactivate
-// Purpose : SLOT called when dialog must be deativated
-//=======================================================================
-void SMESHGUI_FilterLibraryDlg::onDeactivate()
-{
- setEnabled(false);
-}
-
-//=======================================================================
-// name : SMESHGUI_FilterLibraryDlg::enterEvent
-// Purpose : Event filter
-//=======================================================================
-void SMESHGUI_FilterLibraryDlg::enterEvent(QEvent*)
-{
- setEnabled(true);
-}
-
-//=================================================================================
-// function : closeEvent()
-// purpose : Close dialog
-//=================================================================================
-void SMESHGUI_FilterLibraryDlg::closeEvent(QCloseEvent* e)
-{
- onClose();
-}
-
-//=======================================================================
-// name : SMESHGUI_FilterLibraryDlg::getFileName
-// Purpose : Get file name
-//=======================================================================
-QString SMESHGUI_FilterLibraryDlg::getFileName() const
-{
- return myFileName != 0 ? myFileName->text() : QString("");
-}
-
-//================================================================
-// Function : setFileName
-// Purpose : Set file name to line edit
-//================================================================
-void SMESHGUI_FilterLibraryDlg::setFileName(const QString& txt, const bool autoExt)
-{
- if (myFileName == 0)
- return;
- myFileName->setText(autoExt ? autoExtension(txt) : txt);
-}
-
-//================================================================
-// Function : autoExtension
-// Purpose : Append extension to the file name
-//================================================================
-QString SMESHGUI_FilterLibraryDlg::autoExtension(const QString& theFileName) const
-{
- QString anExt = theFileName.section('.', -1);
- return anExt != "xml" && anExt != "XML" ? theFileName + ".xml" : theFileName;
-}
-
-//================================================================
-// Function : filterWildCards
-// Purpose :
-//================================================================
-QStringList SMESHGUI_FilterLibraryDlg::filterWildCards(const QString& theFilter) const
-{
- QStringList res;
-
- int b = theFilter.findRev("(");
- int e = theFilter.findRev(")");
- if (b != -1 && e != -1)
- {
- QString content = theFilter.mid(b + 1, e - b - 1).stripWhiteSpace();
- QStringList lst = QStringList::split(" ", content);
- for (QStringList::const_iterator it = lst.begin(); it != lst.end(); ++it)
- if ((*it).find(".") != -1)
- res.append((*it).stripWhiteSpace());
- }
- return res;
-}
-
-//=======================================================================
-// name : SMESHGUI_FilterLibraryDlg::prepareFilters
-// Purpose : Prepare filters for dialog
-//=======================================================================
-QStringList SMESHGUI_FilterLibraryDlg::prepareFilters() const
-{
- static QStringList aList;
- if (aList.isEmpty())
- {
- aList.append(tr("XML_FILT"));
- //aList.append(tr("ALL_FILES_FILTER"));
- }
-
- return aList;
-}
-
-//================================================================
-// Function : onBrowse
-// Purpose : SLOT. Display "Open file" dialog for chosing library name
-//================================================================
-void SMESHGUI_FilterLibraryDlg::onBrowse()
-{
- Dialog* aDlg = new Dialog(this, true);
- aDlg->setCaption(tr("OPEN_LIBRARY"));
-
- //aDlg->setMode(myMode == COPY_FROM ? QFileDialogP::ExistingFile : QFileDialogP::AnyFile);
- aDlg->setMode(myMode == COPY_FROM ? QFileDialog::ExistingFile : QFileDialog::AnyFile);
- aDlg->setFilters(prepareFilters());
- aDlg->setSelection(getFileName());
-
- QPushButton* anOkBtn = (QPushButton*)aDlg->child("OK", "QPushButton");
- if (anOkBtn != 0)
- anOkBtn->setText(tr("SMESH_BUT_OK"));
-
- if (aDlg->exec() != Accepted)
- return;
-
- QString fName = aDlg->selectedFile();
-
- if (fName.isEmpty())
- return;
-
- if (QFileInfo(fName).extension().isEmpty())
- fName = autoExtension(fName);
-
- fName = QDir::convertSeparators(fName);
- QString prev = QDir::convertSeparators(getFileName());
-
- if (prev == fName)
- return;
-
- setFileName(fName);
-
- QString aName = myListBox->text(myListBox->count() - 1);
- processNewLibrary();
-
- if (myMode == ADD_TO)
- {
- myTable->Copy((SMESHGUI_FilterTable*)parentWidget());
- myCurrFilterName = "";
- myCurrFilter = -1;
- addFilterToLib(aName);
- }
-
- isPermissionValid(false);
-}
-
-//=======================================================================
-// name : SMESHGUI_FilterLibraryDlg::processNewLibrary
-// Purpose : SLOT. Calleds when file name changed
-//=======================================================================
-void SMESHGUI_FilterLibraryDlg::processNewLibrary()
-{
- SMESH::FilterManager_var aFilterMgr = SMESH::GetFilterManager();
- if (aFilterMgr->_is_nil())
- return;
-
- myLibrary = aFilterMgr->LoadLibrary(autoExtension(getFileName()));
- if (myLibrary->_is_nil()) {
- if (myMode == COPY_FROM) {
- QMessageBox::information(SMESHGUI::desktop(), tr("SMESH_ERROR"),
- tr("ERROR_LOAD"), QMessageBox::Ok);
- return;
- } else {
- myLibrary = aFilterMgr->CreateLibrary();
- myLibrary->SetFileName(getFileName().latin1());
- }
- }
-
- updateList();
-}
-
-//=======================================================================
-// name : SMESHGUI_FilterLibraryDlg::updateList
-// Purpose : Fill list box with filter names
-//=======================================================================
-void SMESHGUI_FilterLibraryDlg::updateList()
-{
- QStringList aList;
- SMESH::string_array_var aNames = myLibrary->GetNames((SMESH::ElementType)myTable->GetType());
- for (int i = 0, n = aNames->length(); i < n; i++)
- aList.append(QString(aNames[ i ]));
- myListBox->clear();
- myListBox->insertStringList(aList);
- if (myListBox->count() == 0)
- {
- myTable->Clear(myTable->GetType());
- myName->clear();
- myName->setEnabled(false);
- myTable->SetEnabled(false);
- }
- else
- {
- myName->setEnabled(true);
- myTable->SetEnabled(true);
- if (myListBox->count())
- {
- myCurrFilterName = "";
- myListBox->setCurrentItem(0);
- }
- }
-}
-
-//=======================================================================
-// name : SMESHGUI_FilterLibraryDlg::isNameValid
-// Purpose : Verify validity if entered data
-//=======================================================================
-bool SMESHGUI_FilterLibraryDlg::isNameValid(const bool theMess) const
-{
- // verify validity of filter name
- if (myName->isEnabled() && !myCurrFilterName.isEmpty()) {
- QString aCurrName = myName->text();
- if (aCurrName.isEmpty()) {
- if (theMess)
- QMessageBox::information(SMESHGUI::desktop(), tr("SMESH_INSUFFICIENT_DATA"),
- tr("EMPTY_FILTER_NAME"), QMessageBox::Ok);
- return false;
- }
-
- SMESH::string_array_var aNames = myLibrary->GetAllNames();
- for (int f = 0, n = aNames->length(); f < n; f++) {
- if (aNames[ f ] == aCurrName && aNames[ f ] != myCurrFilterName) {
- if (theMess)
- QMessageBox::information(SMESHGUI::desktop(), tr("SMESH_INSUFFICIENT_DATA"),
- tr("ERROR_FILTER_NAME"), QMessageBox::Ok);
- return false;
- }
- }
- }
-
- return true;
-}
-
-//=======================================================================
-// name : SMESHGUI_FilterLibraryDlg::isPermissionValid
-// Purpose : Verify write permission on file
-//=======================================================================
-bool SMESHGUI_FilterLibraryDlg::isPermissionValid(const bool theIsExistingOnly)
-{
- if (myMode == COPY_FROM)
- return true;
-
- // Verify write permission
- bool isWritable = false;
-
- QString fName(myFileName->text());
- if (QFileInfo(fName).extension().isEmpty())
- fName = autoExtension(fName);
-
- fName = QDir::convertSeparators(fName);
-
- if (QFileInfo(fName).exists()) {
- isWritable = QFileInfo(fName).isWritable();
- } else if (!theIsExistingOnly) {
- QFileInfo aDirInfo(QFileInfo(fName).dirPath(true));
- isWritable = aDirInfo.isWritable();
- /*if (QDir(QFileInfo(fName).dirPath(true)).exists() ||
- QDir().mkdir(QFileInfo(fName).dirPath(true)))
- {
- QFile aFile(fName);
- if (aFile.open(IO_WriteOnly))
- isWritable = true;
- else
- aFile.close();
- }
- */
- } else {
- isWritable = true;
- }
-
- if (!isWritable) {
- QMessageBox::information(SMESHGUI::desktop(), tr("SMESH_WRN_WARNING"),
- tr("NO_PERMISSION"), QMessageBox::Ok);
- return false;
- }
-
- return true;
-}
-
-//=======================================================================
-// name : SMESHGUI_FilterLibraryDlg::isValid
-// Purpose : Verify validity if entered data
-//=======================================================================
-bool SMESHGUI_FilterLibraryDlg::isValid(const bool theMess) const
-{
- // verify validity of table
- if (!myTable->IsValid(theMess) || !isNameValid(theMess))
- return false;
- else
- return true;
-}
-
-//=======================================================================
-// name : SMESHGUI_FilterLibraryDlg::onFilterChanged
-// Purpose : SLOT. Called when selected filter of library changed
-//=======================================================================
-void SMESHGUI_FilterLibraryDlg::onFilterChanged(const QString& theName)
-{
- if (myLibrary->_is_nil())
- return;
-
- // Save parameters of filter if it was changed
-
- if (!myCurrFilterName.isEmpty() && myTable->IsEditable())
- {
- if (!isValid(true))
- {
- myListBox->blockSignals(true);
- myListBox->setCurrentItem(myCurrFilter);
- myListBox->blockSignals(false);
- return;
- }
-
- SMESH::Filter_var aFilter = createFilter();
- myLibrary->Replace(myCurrFilterName.latin1(), myName->text().latin1(), aFilter);
- }
-
- // Fill table with filter parameters
-
- SMESH::Filter_var aFilter = myLibrary->Copy(theName);
- myCurrFilterName = theName;
- myCurrFilter = myListBox->currentItem();
- myName->setText(theName);
-
-
- SMESH::Filter::Criteria_var aCriteria;
-
- myTable->Clear(myTable->GetType());
-
- if (!aFilter->GetCriteria(aCriteria))
- return;
-
- for (int i = 0, n = aCriteria->length(); i < n; i++)
- myTable->AddCriterion(aCriteria[ i ], myTable->GetType());
-
- myTable->Update();
-}
-
-//=======================================================================
-// name : SMESHGUI_FilterLibraryDlg::onReturnPressed
-// Purpose : SLOT. Called when enter button is pressed in library name field
-// Reload library
-//=======================================================================
-void SMESHGUI_FilterLibraryDlg::onReturnPressed()
-{
- QString aName = myListBox->text(myListBox->count() - 1);
-
- processNewLibrary();
-
- if (myMode == ADD_TO)
- {
- myTable->Copy((SMESHGUI_FilterTable*)parentWidget());
- myCurrFilterName = "";
- myCurrFilter = -1;
- addFilterToLib(aName);
- }
-
- isPermissionValid(false);
-}
-
-//=======================================================================
-// name : SMESHGUI_FilterLibraryDlg::enableMainButtons
-// Purpose : Update state of "OK", "Cancel" buttons
-//=======================================================================
-void SMESHGUI_FilterLibraryDlg::enableMainButtons()
-{
- /*bool isEnabled = isValid(false);
- if (myButtons.contains(BTN_OK))
- myButtons[ BTN_OK ]->setEnabled(isEnabled);
- else if (myButtons.contains(BTN_Apply))
- myButtons[ BTN_OK ]->setEnabled(isEnabled);
- if (myButtons.contains(BTN_Cancel))
- myButtons[ BTN_Cancel ]->setEnabled(isEnabled);
- else if (myButtons.contains(BTN_Close))
- myButtons[ BTN_Cancel ]->setEnabled(isEnabled);
- */
-}
-
-//=======================================================================
-// name : SMESHGUI_FilterLibraryDlg::createFilter
-// Purpose : Cerate filter in accordance with library
-//=======================================================================
-SMESH::Filter_ptr SMESHGUI_FilterLibraryDlg::createFilter(const int theType)
-{
- int n = myTable->NumRows(theType);
-
- SMESH::Filter::Criteria_var aCriteria = new SMESH::Filter::Criteria;
- aCriteria->length(n);
-
- for (int i = 0; i < n; i++)
- {
- SMESH::Filter::Criterion aCriterion = SMESHGUI_FilterDlg::createCriterion();
- myTable->GetCriterion(i, aCriterion);
- aCriteria[ i ] = aCriterion;
- }
-
- SMESH::FilterManager_var aFilterMgr = SMESH::GetFilterManager();
- SMESH::Filter_var aFilter = aFilterMgr->CreateFilter();
- aFilter->SetCriteria(aCriteria.in());
-
- return aFilter._retn();
-}
-
-//=======================================================================
-// name : SMESHGUI_FilterLibraryDlg::onAddBtnPressed
-// Purpose : SLOT. Called when "Add" button pressed
-// Add new filter to the end of library
-//=======================================================================
-void SMESHGUI_FilterLibraryDlg::onAddBtnPressed()
-{
- // Save parameters of filter if it was changed
- if (!myCurrFilterName.isEmpty() && myTable->IsEditable())
- {
- if (!isValid(true))
- return;
-
- SMESH::Filter_var aFilter = createFilter();
- myLibrary->Replace(myCurrFilterName.latin1(), myName->text().latin1(), aFilter);
- }
-
- addFilterToLib(getDefaultFilterName());
-}
-
-//=======================================================================
-// name : onAddBtnPressed()
-// Purpose : SLOT. Called when "Add" button pressed
-// Add new filter to the end of library
-//=======================================================================
-void SMESHGUI_FilterLibraryDlg::addFilterToLib (const QString& theName)
-{
- if (myLibrary->_is_nil()) {
- QMessageBox::information(SMESHGUI::desktop(), tr("SMESH_WRN_WARNING"),
- tr("LIBRARY_IS_NOT_LOADED"), QMessageBox::Ok);
- return;
- }
-
- // create filter
- SMESH::Filter_var aFilter = createFilter();
-
- // if name of filter already exist in the library assign default name for the filter
- QString aName(theName);
- SMESH::string_array_var aNames = myLibrary->GetAllNames();
- for (int i = 0, n = aNames->length(); i < n; i++)
- if (aName == QString(aNames[ i ]))
- {
- aName = getDefaultFilterName();
- break;
- }
-
- // add new filter in library
- bool aResult = !aFilter->GetPredicate()->_is_nil()
- ? myLibrary->Add(aName.latin1(), aFilter)
- : myLibrary->AddEmpty(aName.latin1(), (SMESH::ElementType)myTable->GetType());
-
- if (!aResult) {
- QMessageBox::information(SMESHGUI::desktop(), tr("SMESH_ERROR"),
- tr("ERROR_OF_ADDING"), QMessageBox::Ok);
- }
-
- updateList();
- myCurrFilterName = "";
- myCurrFilter = -1;
- setSelected(aName);
-
- if (theName != aName)
- QMessageBox::information(SMESHGUI::desktop(), tr("SMESH_WARNING"),
- tr("ASSIGN_NEW_NAME").arg(theName).arg(aName), QMessageBox::Ok);
-}
-
-//=======================================================================
-// name : SMESHGUI_FilterLibraryDlg::getDefaultLibraryName
-// Purpose : Get default library name
-//=======================================================================
-QString& SMESHGUI_FilterLibraryDlg::getDefaultLibraryName() const
-{
- static QString aName;
- if (aName.isEmpty())
- {
- QString aHomeDir = QDir(QDir::home()).absPath();
- aName = aHomeDir + "/" + tr ("LIB_NAME");
- }
- return aName;
-}
-
-//=======================================================================
-// name : SMESHGUI_FilterLibraryDlg::getDefaultFilterName
-// Purpose : Create default filter name
-//=======================================================================
-QString SMESHGUI_FilterLibraryDlg::getDefaultFilterName() const
-{
- QString aName;
-
- if (myTable->GetType() == SMESH::NODE)
- aName = tr("NODE");
- else if (myTable->GetType() == SMESH::EDGE)
- aName = tr("EDGE");
- else if (myTable->GetType() == SMESH::FACE)
- aName = tr("FACE");
- else if (myTable->GetType() == SMESH::VOLUME)
- aName = tr("VOLUME");
- else if (myTable->GetType() == SMESH::ALL)
- aName = tr("ELEMENT");
- else
- aName = tr("SELECTION");
-
- aName += tr("FILTER");
-
-
- QMap< QString, int > anAllNames;
- SMESH::string_array_var aNames = myLibrary->GetAllNames();
- for(int i = 0, n = aNames->length(); i < n; i++)
- anAllNames[ QString(aNames[ i ]) ] = -1;
-
- bool isNotValid = true;
- int k = 1;
- QString aNewName;
- while (isNotValid)
- {
- isNotValid = false;
- aNewName = aName + "_" + QString("%1").arg(k);
- if (anAllNames.contains(aNewName))
- {
- isNotValid = true;
- k++;
- }
- }
-
- return aNewName;
-}
-
-//=======================================================================
-// name : SMESHGUI_FilterLibraryDlg::setSelected
-// Purpose : set selected item in list box containing filters
-//=======================================================================
-bool SMESHGUI_FilterLibraryDlg::setSelected(const QString& theName)
-{
- int anIndex = getIndex(theName);
- if (anIndex != -1)
- {
- myListBox->setCurrentItem(anIndex);
- myCurrFilterName = theName;
- myCurrFilter = anIndex;
- }
- return anIndex != -1;
-}
-
-//=======================================================================
-// name : SMESHGUI_FilterLibraryDlg::getIndex
-// Purpose : Get index of the filter in list box
-//=======================================================================
-int SMESHGUI_FilterLibraryDlg::getIndex(const QString& theName) const
-{
- for (int i = 0, n = myListBox->count(); i < n; i++)
- if (myListBox->text(i) == theName)
- return i;
- return -1;
-}
-
-//=======================================================================
-// name : SMESHGUI_FilterLibraryDlg::onDeleteBtnPressed
-// Purpose : SLOT. Called when "Delete" button pressed
-//=======================================================================
-void SMESHGUI_FilterLibraryDlg::onDeleteBtnPressed()
-{
- if (myLibrary->_is_nil()) {
- QMessageBox::information(SMESHGUI::desktop(), tr("SMESH_WRN_WARNING"),
- tr("LIBRARY_IS_NOT_LOADED"), QMessageBox::Ok);
- return;
- }
-
- int anIndex = getIndex(myCurrFilterName);
-
- if (anIndex == -1 || !myLibrary->Delete(myCurrFilterName.latin1())) {
- QMessageBox::information(SMESHGUI::desktop(), tr("SMESH_ERROR"),
- tr("ERROR_OF_DELETING"), QMessageBox::Ok);
- } else {
- myCurrFilterName = "";
- myCurrFilter = -1;
- myListBox->removeItem(anIndex);
-
- if (anIndex >= 1)
- myListBox->setSelected(anIndex - 1, true);
- else if (anIndex == 0 && myListBox->count() > 0)
- myListBox->setSelected(0, true);
- else
- myTable->Clear();
- }
-
- myTable->SetEnabled(myListBox->count() > 0);
- if (myListBox->count() == 0) {
- myName->setText("");
- myName->setEnabled(false);
- }
-}
-
-//=======================================================================
-// name : onFilterNameChanged()
-// Purpose : SLOT. Called when name of filter changed
-// Change filter name in list box
-//=======================================================================
-void SMESHGUI_FilterLibraryDlg::onFilterNameChanged (const QString& theName)
-{
- int aCurrItem = myListBox->currentItem();
- if (aCurrItem == -1)
- return;
-
- myListBox->blockSignals(true);
- myListBox->changeItem(theName, aCurrItem);
- myListBox->blockSignals(false);
-}
-
-//=======================================================================
-// name : SMESHGUI_FilterLibraryDlg::SetTable
-// Purpose : Set table
-//=======================================================================
-void SMESHGUI_FilterLibraryDlg::SetTable(const SMESHGUI_FilterTable* theTable)
-{
- myTable->Copy(theTable);
- myName->setText(getDefaultFilterName());
- addFilterToLib(myName->text());
- myTable->Update();
-}
-
-//=======================================================================
-// name : SMESHGUI_FilterLibraryDlg::GetTable
-// Purpose : Get table
-//=======================================================================
-const SMESHGUI_FilterTable* SMESHGUI_FilterLibraryDlg::GetTable() const
-{
- return myTable;
-}
-
-
-//=======================================================================
-// name : SMESHGUI_FilterLibraryDlg::onEntityTypeChanged
-// Purpose : SLOT. Called when entiyt type changed
-//=======================================================================
-void SMESHGUI_FilterLibraryDlg::onEntityTypeChanged(const int theType)
-{
- if (myLibrary->_is_nil())
- return;
-
- myName->clear();
- myCurrFilterName = "";
- myCurrFilter = -1;
- updateList();
- if (myListBox->count())
- myListBox->setCurrentItem(0);
-}
-
-//=======================================================================
-// name : SMESHGUI_FilterLibraryDlg::onNeedValidation
-// Purpose :
-//=======================================================================
-void SMESHGUI_FilterLibraryDlg::onNeedValidation()
-{
- if (!myCurrFilterName.isEmpty())
- {
- bool valid = isValid(true);
- myTable->SetValidity(valid);
-
- if (valid)
- {
- SMESH::Filter_var aFilter = createFilter(myTable->GetType());
- myLibrary->Replace(myCurrFilterName.latin1(), myName->text().latin1(), aFilter);
- }
- }
-}
+++ /dev/null
-// SMESH SMESHGUI : GUI for SMESH component
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESHGUI_FilterLibraryDlg.h
-// Author : Sergey LITONIN
-// Module : SMESH
-
-
-#ifndef SMESHGUI_FilterLibraryDlg_H
-#define SMESHGUI_FilterLibraryDlg_H
-
-#include <qdialog.h>
-#include <SMESHGUI_FilterDlg.h>
-
-#include <SALOMEconfig.h>
-#include CORBA_SERVER_HEADER(SMESH_Filter)
-
-class QCloseEvent;
-class QListBox;
-class QFrame;
-class QEvent;
-class QLineEdit;
-class QPushButton;
-class QGroupBox;
-
-/*
- Class : SMESHGUI_FilterLibraryDlg
- Description : Dialog to specify filters for VTK viewer
-*/
-
-class SMESHGUI_FilterLibraryDlg : public QDialog
-{
- Q_OBJECT
-
- // Buttons
- enum { BTN_OK, BTN_Cancel, BTN_Apply, BTN_Close };
-
- class Dialog;
-
-public:
-
- // Mode
- enum { ADD_TO, COPY_FROM, EDIT };
-
-public:
-
- SMESHGUI_FilterLibraryDlg( SMESHGUI*,
- QWidget*,
- const QValueList<int>& types,
- const int mode,
- const char* name = 0 );
-
- SMESHGUI_FilterLibraryDlg( SMESHGUI*,
- QWidget*,
- const int type,
- const int mode,
- const char* name = 0 );
-
- virtual ~SMESHGUI_FilterLibraryDlg();
-
- void Init( const QValueList<int>& types, const int theMode );
- void Init( const int type, const int theMode );
-
- const SMESHGUI_FilterTable* GetTable() const;
- void SetTable( const SMESHGUI_FilterTable* );
-
-private:
-
- void closeEvent( QCloseEvent* e ) ;
- void enterEvent ( QEvent * ) ;
-
-private slots:
-
- void onOk();
- bool onApply();
- void onClose();
-
- void onDeactivate();
-
- void onBrowse();
- void onReturnPressed();
- void onFilterChanged( const QString& );
- void onAddBtnPressed();
- void onDeleteBtnPressed();
- void onFilterNameChanged( const QString& );
- void onEntityTypeChanged( const int );
- void onNeedValidation();
-
-private:
-
- void construct( const QValueList<int>& types, const int mode );
- QFrame* createButtonFrame( QWidget* );
- QFrame* createMainFrame ( QWidget* );
- bool isValid( const bool theMess = true ) const;
- bool isNameValid( const bool theMess = true ) const;
- SMESH::Filter_ptr createFilter( const int theType = -1 );
- QStringList prepareFilters() const;
- QString autoExtension( const QString& ) const;
- bool setSelected( const QString& );
- int getIndex( const QString& ) const;
- void updateControlsVisibility();
- void updateMainButtons();
- void enableMainButtons();
- void processNewLibrary();
- QString getFileName() const;
- void setFileName( const QString& txt, const bool autoExtension = true );
- QStringList filterWildCards( const QString& theFilter ) const;
- QString& getDefaultLibraryName() const;
- QString getDefaultFilterName() const;
- void addFilterToLib( const QString& name );
- void updateList();
- bool isPermissionValid( const bool theIsExistingOnly );
-
-private:
-
- QFrame* myMainFrame;
- QMap<int, QPushButton*> myButtons;
- SMESHGUI_FilterTable* myTable;
- QLineEdit* myFileName;
- QPushButton* myOpenBtn;
- QListBox* myListBox;
- QPushButton* myAddBtn;
- QPushButton* myDeleteBtn;
- QGroupBox* myNameGrp;
- QLineEdit* myName;
- SMESHGUI* mySMESHGUI;
-
- QValueList<int> myTypes;
- int myMode;
-
- SMESH::FilterLibrary_var myLibrary;
- QString myCurrFilterName;
- int myCurrFilter;
-
-};
-
-#endif
+++ /dev/null
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-
-#include "SMESHGUI_FilterUtils.h"
-
-#include "SMESHGUI.h"
-
-#include "utilities.h"
-
-namespace SMESH
-{
- SMESH::FilterManager_var& GetFilterManager()
- {
- static SMESH::FilterManager_var aFilterManager;
- if (CORBA::is_nil(aFilterManager)) {
- aFilterManager = SMESHGUI::GetSMESHGen()->CreateFilterManager();
- }
- return aFilterManager;
- }
-}
+++ /dev/null
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-#ifndef SMESHGUI_FilterUtils_HeaderFile
-#define SMESHGUI_FilterUtils_HeaderFile
-
-#include "SALOMEconfig.h"
-#include CORBA_SERVER_HEADER(SMESH_Filter)
-
-
-namespace SMESH{
-
- SMESH::FilterManager_var& GetFilterManager();
-
-}
-
-
-#endif
+++ /dev/null
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-#include <boost/shared_ptr.hpp>
-
-#include "SMESHGUI_GEOMGenUtils.h"
-#include "SMESHGUI_Utils.h"
-
-#include <GeometryGUI.h>
-
-#include <SALOMEDSClient_SObject.hxx>
-#include <SALOMEDSClient_ChildIterator.hxx>
-#include <SALOMEDS_SObject.hxx>
-
-#include CORBA_CLIENT_HEADER(SMESH_Mesh)
-
-
-namespace SMESH {
-
- GEOM::GEOM_Gen_var GetGEOMGen()
- {
- static GEOM::GEOM_Gen_var aGEOMGen;
-
- if(CORBA::is_nil(aGEOMGen))
- aGEOMGen = GeometryGUI::GetGeomGen();
- return aGEOMGen;
- }
-
- GEOM::GEOM_Object_var GetShapeOnMeshOrSubMesh(_PTR(SObject) theMeshOrSubmesh)
- {
- SALOMEDS_SObject* aMeshOrSubmesh = _CAST(SObject,theMeshOrSubmesh);
- if(aMeshOrSubmesh) {
- CORBA::Object_var Obj = aMeshOrSubmesh->GetObject();
- if ( !CORBA::is_nil( Obj ) ) {
- SMESH::SMESH_Mesh_var aMesh =
- SObjectToInterface<SMESH::SMESH_Mesh>( theMeshOrSubmesh );
- if ( !aMesh->_is_nil() )
- return aMesh->GetShapeToMesh();
- SMESH::SMESH_subMesh_var aSubmesh =
- SObjectToInterface<SMESH::SMESH_subMesh>( theMeshOrSubmesh );
- if ( !aSubmesh->_is_nil() )
- return aSubmesh->GetSubShape();
- }
- }
- return GEOM::GEOM_Object::_nil();
- }
-
- GEOM::GEOM_Object_ptr GetGeom (_PTR(SObject) theSO)
- {
- if (!theSO)
- return GEOM::GEOM_Object::_nil();
-
- _PTR(Study) aStudy = SMESH::GetActiveStudyDocument();
- if (!aStudy)
- return GEOM::GEOM_Object::_nil();
-
- _PTR(ChildIterator) anIter (aStudy->NewChildIterator(theSO));
- for (; anIter->More(); anIter->Next()) {
- _PTR(SObject) aSObject = anIter->Value();
- _PTR(SObject) aRefSOClient;
- GEOM::GEOM_Object_var aMeshShape;
-
- if (aSObject->ReferencedObject(aRefSOClient)) {
- SALOMEDS_SObject* aRefSO = _CAST(SObject,aRefSOClient);
- aMeshShape = GEOM::GEOM_Object::_narrow(aRefSO->GetObject());
- } else {
- SALOMEDS_SObject* aSO = _CAST(SObject,aSObject);
- aMeshShape = GEOM::GEOM_Object::_narrow(aSO->GetObject());
- }
-
- if (!aMeshShape->_is_nil())
- return aMeshShape._retn();
- }
- return GEOM::GEOM_Object::_nil();
- }
-}
+++ /dev/null
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-#ifndef SMESHGUI_GEOMGenUtils_HeaderFile
-#define SMESHGUI_GEOMGenUtils_HeaderFile
-
-#include "SALOMEconfig.h"
-#include CORBA_SERVER_HEADER(GEOM_Gen)
-
-#include "SALOMEDSClient_definitions.hxx"
-
-class SALOMEDSClient_SObject;
-
-namespace SMESH
-{
- GEOM::GEOM_Gen_var GetGEOMGen();
-
- GEOM::GEOM_Object_var GetShapeOnMeshOrSubMesh (_PTR(SObject) theSObject);
-
- GEOM::GEOM_Object_ptr GetGeom (_PTR(SObject) theSO);
-}
-
-#endif
+++ /dev/null
-// SMESH SMESHGUI : GUI for SMESH component
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.salome-platform.org or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESHGUI_GroupDlg.cxx
-// Author : Natalia KOPNOVA
-// Module : SMESH
-// $Header$
-
-#include "SMESHGUI_GroupDlg.h"
-#include "SMESHGUI_FilterDlg.h"
-
-#include "SMESHGUI.h"
-#include "SMESHGUI_Utils.h"
-#include "SMESHGUI_VTKUtils.h"
-#include "SMESHGUI_MeshUtils.h"
-#include "SMESHGUI_GroupUtils.h"
-#include "SMESHGUI_FilterUtils.h"
-#include "SMESHGUI_GEOMGenUtils.h"
-
-#include "SMESH_TypeFilter.hxx"
-#include "SMESH_Actor.h"
-#include "GEOMBase.h"
-
-#include "SUIT_Desktop.h"
-#include "SUIT_ResourceMgr.h"
-
-#include "SalomeApp_Tools.h"
-#include "SALOMEDSClient_Study.hxx"
-#include "SALOME_ListIO.hxx"
-#include "SALOME_ListIteratorOfListIO.hxx"
-
-#include "SVTK_ViewWindow.h"
-#include "SVTK_Selector.h"
-
-#include "utilities.h"
-
-// OCCT Includes
-#include <TColStd_MapOfInteger.hxx>
-
-// QT Includes
-#include <qbuttongroup.h>
-#include <qgroupbox.h>
-#include <qhbox.h>
-#include <qlabel.h>
-#include <qlineedit.h>
-#include <qpushbutton.h>
-#include <qradiobutton.h>
-#include <qcheckbox.h>
-#include <qlayout.h>
-#include <qlistbox.h>
-#include <qimage.h>
-#include <qpixmap.h>
-#include <qmemarray.h>
-#include <qwidgetstack.h>
-
-// STL includes
-#include <vector>
-#include <algorithm>
-
-using namespace std;
-
-//=================================================================================
-// function : SMESHGUI_GroupDlg()
-// purpose :
-//=================================================================================
-SMESHGUI_GroupDlg::SMESHGUI_GroupDlg( SMESHGUI* theModule, const char* name,
- SMESH::SMESH_Mesh_ptr theMesh, bool modal, WFlags fl)
- : QDialog( SMESH::GetDesktop( theModule ), name, modal, WStyle_Customize | WStyle_NormalBorder |
- WStyle_Title | WStyle_SysMenu | WDestructiveClose),
- mySMESHGUI( theModule ),
- mySelectionMgr( SMESH::GetSelectionMgr( theModule ) ),
- myIsBusy( false ),
- myActor( 0 )
-{
- if (!name) setName("SMESHGUI_GroupDlg");
- initDialog(true);
- if (!theMesh->_is_nil())
- init(theMesh);
- else {
- mySelectSubMesh->setEnabled(false);
- mySelectGroup->setEnabled(false);
- myGeomGroupBtn->setEnabled(false);
- myGeomGroupLine->setEnabled(false);
- }
-
- mySelector = (SMESH::GetViewWindow( mySMESHGUI ))->GetSelector();
-
- /* Move widget on the botton right corner of main widget */
- int x, y ;
- mySMESHGUI->DefineDlgPosition(this, x, y);
- this->move(x, y);
-}
-
-//=================================================================================
-// function : SMESHGUI_GroupDlg()
-// purpose :
-//=================================================================================
-SMESHGUI_GroupDlg::SMESHGUI_GroupDlg( SMESHGUI* theModule, const char* name,
- SMESH::SMESH_Group_ptr theGroup, bool modal, WFlags fl)
- : QDialog( SMESH::GetDesktop( theModule ), name, modal, WStyle_Customize | WStyle_NormalBorder |
- WStyle_Title | WStyle_SysMenu | WDestructiveClose),
- mySMESHGUI( theModule ),
- mySelectionMgr( SMESH::GetSelectionMgr( theModule ) ),
- myIsBusy( false )
-{
- if (!name) setName("SMESHGUI_GroupDlg");
-
- mySelector = (SMESH::GetViewWindow( mySMESHGUI ))->GetSelector();
-
- initDialog(false);
- if (!theGroup->_is_nil())
- init(theGroup);
- else {
- mySelectSubMesh->setEnabled(false);
- mySelectGroup->setEnabled(false);
-
- myCurrentLineEdit = myMeshGroupLine;
- setSelectionMode(5);
- }
-
- /* Move widget on the botton right corner of main widget */
- int x, y ;
- mySMESHGUI->DefineDlgPosition(this, x, y);
- this->move(x, y);
-}
-
-//=================================================================================
-// function : SMESHGUI_GroupDlg()
-// purpose :
-//=================================================================================
-void SMESHGUI_GroupDlg::initDialog(bool create)
-{
- myFilterDlg = 0;
- myCreate = create;
- myCurrentLineEdit = 0;
-
- QPixmap image0 (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_SELECT")));
-
- if (create)
- setCaption(tr("SMESH_CREATE_GROUP_TITLE"));
- else
- setCaption(tr("SMESH_EDIT_GROUP_TITLE"));
-
- setSizeGripEnabled(TRUE);
-
- QGridLayout* aMainLayout = new QGridLayout(this, 7, 3, 11, 6);
-
- /***************************************************************/
- QLabel* meshGroupLab = new QLabel(this, "mesh/group label");
- if (create)
- meshGroupLab->setText(tr("SMESH_MESH"));
- else
- meshGroupLab->setText(tr("SMESH_GROUP"));
- myMeshGroupBtn = new QPushButton(this, "mesh/group button");
- myMeshGroupBtn->setPixmap(image0);
- myMeshGroupLine = new QLineEdit(this, "mesh/group line");
- myMeshGroupLine->setReadOnly(true);
-
- /***************************************************************/
- myTypeGroup = new QButtonGroup(1, Qt::Vertical, this, "Group types");
- myTypeGroup->setTitle(tr("SMESH_ELEMENTS_TYPE"));
- myTypeGroup->setExclusive(true);
-
- QStringList types;
- types.append(tr("MESH_NODE"));
- types.append(tr("SMESH_EDGE"));
- types.append(tr("SMESH_FACE"));
- types.append(tr("SMESH_VOLUME"));
- QRadioButton* rb;
- for (int i = 0; i < types.count(); i++) {
- rb = new QRadioButton(types[i], myTypeGroup);
- }
- myTypeGroup->setEnabled(create);
- myTypeId = -1;
-
- /***************************************************************/
- QLabel* aName = new QLabel(this, "name label");
- aName->setText(tr("SMESH_NAME"));
- aName->setMinimumSize(50,0);
- myName = new QLineEdit(this, "name");
-
- /***************************************************************/
- myGrpTypeGroup = new QButtonGroup(1, Qt::Vertical, this, "Type of group");
- myGrpTypeGroup->setTitle(tr("SMESH_GROUP_TYPE"));
- myGrpTypeGroup->setExclusive(true);
- QRadioButton* rb1 = new QRadioButton( tr("SMESH_GROUP_STANDALONE"), myGrpTypeGroup);
- QRadioButton* rb2 = new QRadioButton( tr("SMESH_GROUP_GEOMETRY"), myGrpTypeGroup);
- myGrpTypeGroup->setEnabled(create);
- myGrpTypeId = -1;
-
- /***************************************************************/
- myWGStack = new QWidgetStack( this, "widget stack");
- QWidget* wg1 = new QFrame( myWGStack, "first widget" );
- QWidget* wg2 = new QFrame( myWGStack, "second widget" );
-
- /***************************************************************/
- QGroupBox* aContentBox = new QGroupBox(1, Qt::Horizontal, wg1, "content box");
- aContentBox->setTitle(tr("SMESH_CONTENT"));
- QFrame* aContent = new QFrame(aContentBox, "content");
- QGridLayout* aLayout = new QGridLayout(aContent, 7, 4);
- aLayout->setSpacing(6);
- aLayout->setAutoAdd(false);
-
- QLabel* aLabel = new QLabel(aContent, "elements label");
- aLabel->setText(tr("SMESH_ID_ELEMENTS"));
- myElements = new QListBox(aContent, "elements list");
- myElements->setSelectionMode(QListBox::Extended);
-
- myFilter = new QPushButton(aContent, "filter");
- myFilter->setText(tr("SMESH_BUT_FILTER"));
- QPushButton* aAddBtn = new QPushButton(aContent, "add");
- aAddBtn->setText(tr("SMESH_BUT_ADD"));
- QPushButton* aRemoveBtn = new QPushButton(aContent, "remove");
- aRemoveBtn->setText(tr("SMESH_BUT_REMOVE"));
- QPushButton* aSortBtn = new QPushButton(aContent, "sort");
- aSortBtn->setText(tr("SMESH_BUT_SORT"));
-
- aLayout->addWidget(aLabel, 0, 0);
- aLayout->addMultiCellWidget(myElements, 1, 6, 0, 0);
- aLayout->addWidget(myFilter, 1, 2);
- aLayout->addWidget(aAddBtn, 3, 2);
- aLayout->addWidget(aRemoveBtn, 4, 2);
- aLayout->addWidget(aSortBtn, 6, 2);
-
- aLayout->setColStretch(0, 1);
- aLayout->addColSpacing(1, 20);
- aLayout->addColSpacing(3, 20);
- aLayout->setRowStretch(2, 1);
- aLayout->setRowStretch(5, 1);
-
- /***************************************************************/
- QGroupBox* aSelectBox = new QGroupBox(3, Qt::Horizontal, wg1, "select box");
- aSelectBox->setTitle(tr("SMESH_SELECT_FROM"));
-
- mySelectSubMesh = new QCheckBox(aSelectBox, "submesh checkbox");
- mySelectSubMesh->setText(tr("SMESH_SUBMESH"));
- mySelectSubMesh->setMinimumSize(50, 0);
- mySubMeshBtn = new QPushButton(aSelectBox, "submesh button");
- mySubMeshBtn->setText("");
- mySubMeshBtn->setPixmap(image0);
- mySubMeshLine = new QLineEdit(aSelectBox, "submesh line");
- mySubMeshLine->setReadOnly(true);
- onSelectSubMesh(false);
-
- mySelectGroup = new QCheckBox(aSelectBox, "group checkbox");
- mySelectGroup->setText(tr("SMESH_GROUP"));
- mySelectGroup->setMinimumSize(50, 0);
- myGroupBtn = new QPushButton(aSelectBox, "group button");
- myGroupBtn->setText("");
- myGroupBtn->setPixmap(image0);
- myGroupLine = new QLineEdit(aSelectBox, "group line");
- myGroupLine->setReadOnly(true);
- onSelectGroup(false);
-
- /***************************************************************/
- QGridLayout* wg1Layout = new QGridLayout( wg1, 3, 1, 0, 6 );
- wg1Layout->addWidget(aContentBox, 0, 0);
- wg1Layout->addWidget(aSelectBox, 1, 0);
- wg1Layout->setRowStretch(2, 5);
-
- /***************************************************************/
- QLabel* geomObject = new QLabel(wg2, "geometry object label");
- geomObject->setText(tr("SMESH_OBJECT_GEOM"));
- myGeomGroupBtn = new QPushButton(wg2, "geometry group button");
- myGeomGroupBtn->setText("");
- myGeomGroupBtn->setPixmap(image0);
- myGeomGroupLine = new QLineEdit(wg2, "geometry group line");
- myGeomGroupLine->setReadOnly(true); //VSR ???
- onSelectGeomGroup(false);
-
- /***************************************************************/
- QGridLayout* wg2Layout = new QGridLayout( wg2, 2, 3, 0, 6 );
- wg2Layout->addWidget(geomObject, 0, 0);
- wg2Layout->addWidget(myGeomGroupBtn, 0, 1);
- wg2Layout->addWidget(myGeomGroupLine,0, 2);
- wg2Layout->setRowStretch(1, 5);
-
- /***************************************************************/
- QVBoxLayout* dumb = new QVBoxLayout(myWGStack);
- dumb->addWidget(wg1);
- dumb->addWidget(wg2);
- myWGStack->addWidget( wg1, myGrpTypeGroup->id(rb1) );
- myWGStack->addWidget( wg2, myGrpTypeGroup->id(rb2) );
-
- /***************************************************************/
- QFrame* aButtons = new QFrame(this, "button box");
- aButtons->setFrameStyle(QFrame::Box | QFrame::Sunken);
- QHBoxLayout* aBtnLayout = new QHBoxLayout(aButtons, 11, 6);
- aBtnLayout->setAutoAdd(false);
-
- QPushButton* aOKBtn = new QPushButton(aButtons, "ok");
- aOKBtn->setText(tr("SMESH_BUT_OK"));
- aOKBtn->setAutoDefault(true);
- aOKBtn->setDefault(true);
- QPushButton* aApplyBtn = new QPushButton(aButtons, "apply");
- aApplyBtn->setText(tr("SMESH_BUT_APPLY"));
- aApplyBtn->setAutoDefault(true);
- QPushButton* aCloseBtn = new QPushButton(aButtons, "close");
- aCloseBtn->setText(tr("SMESH_BUT_CLOSE"));
- aCloseBtn->setAutoDefault(true);
-
- aBtnLayout->addWidget(aOKBtn);
- aBtnLayout->addWidget(aApplyBtn);
- aBtnLayout->addStretch();
- aBtnLayout->addWidget(aCloseBtn);
-
- /***************************************************************/
- aMainLayout->addWidget(meshGroupLab, 0, 0);
- aMainLayout->addWidget(myMeshGroupBtn, 0, 1);
- aMainLayout->addWidget(myMeshGroupLine, 0, 2);
- aMainLayout->addMultiCellWidget(myTypeGroup, 1, 1, 0, 2);
- aMainLayout->addWidget(aName, 2, 0);
- aMainLayout->addWidget(myName, 2, 2);
- aMainLayout->addMultiCellWidget(myGrpTypeGroup, 3, 3, 0, 2);
- aMainLayout->addMultiCellWidget(myWGStack, 4, 4, 0, 2);
- aMainLayout->setRowStretch( 5, 5 );
- aMainLayout->addMultiCellWidget(aButtons, 6, 6, 0, 2);
-
- /* signals and slots connections */
- connect(myMeshGroupBtn, SIGNAL(clicked()), this, SLOT(setCurrentSelection()));
-
- connect(myGrpTypeGroup, SIGNAL(clicked(int)), this, SLOT(onGrpTypeChanged(int)));
-
- connect(myTypeGroup, SIGNAL(clicked(int)), this, SLOT(onTypeChanged(int)));
-
- connect(myName, SIGNAL(textChanged(const QString&)), this, SLOT(onNameChanged(const QString&)));
- connect(myElements, SIGNAL(selectionChanged()), this, SLOT(onListSelectionChanged()));
-
- connect(myFilter, SIGNAL(clicked()), this, SLOT(setFilters()));
- connect(aAddBtn, SIGNAL(clicked()), this, SLOT(onAdd()));
- connect(aRemoveBtn, SIGNAL(clicked()), this, SLOT(onRemove()));
- connect(aSortBtn, SIGNAL(clicked()), this, SLOT(onSort()));
-
- connect(mySelectSubMesh, SIGNAL(toggled(bool)), this, SLOT(onSelectSubMesh(bool)));
- connect(mySelectGroup, SIGNAL(toggled(bool)), this, SLOT(onSelectGroup(bool)));
- connect(mySubMeshBtn, SIGNAL(clicked()), this, SLOT(setCurrentSelection()));
- connect(myGroupBtn, SIGNAL(clicked()), this, SLOT(setCurrentSelection()));
- connect(myGeomGroupBtn, SIGNAL(clicked()), this, SLOT(setCurrentSelection()));
-
- connect(aOKBtn, SIGNAL(clicked()), this, SLOT(onOK()));
- connect(aApplyBtn, SIGNAL(clicked()), this, SLOT(onApply()));
- connect(aCloseBtn, SIGNAL(clicked()), this, SLOT(onClose()));
-
- /* Init selection */
- mySMESHGUI->SetActiveDialogBox(this);
- mySMESHGUI->SetState(800);
-
- mySelectionMode = -1;
- myMeshFilter = new SMESH_TypeFilter(MESH);
- mySubMeshFilter = new SMESH_TypeFilter(SUBMESH);
- myGroupFilter = new SMESH_TypeFilter(GROUP);
-
- connect(mySMESHGUI, SIGNAL(SignalDeactivateActiveDialog()), this, SLOT(onDeactivate()));
- connect(mySMESHGUI, SIGNAL(SignalCloseAllDialogs()), this, SLOT(onClose()));
- connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(onObjectSelectionChanged()));
-
- myGrpTypeGroup->setButton(myGrpTypeGroup->id(rb1)); // VSR !!!
- onGrpTypeChanged(myGrpTypeGroup->id(rb1)); // VSR!!!
-
- if (myMesh->_is_nil() )
- myTypeGroup->setButton(0);
-
- updateButtons();
-}
-
-//=================================================================================
-// function : ~SMESHGUI_GroupDlg()
-// purpose : Destroys the object and frees any allocated resources
-//=================================================================================
-SMESHGUI_GroupDlg::~SMESHGUI_GroupDlg()
-{
- // no need to delete child widgets, Qt does it all for us
- if ( myFilterDlg != 0 )
- {
- myFilterDlg->reparent( 0, QPoint() );
- delete myFilterDlg;
- }
-}
-
-//=================================================================================
-// function : Init()
-// purpose :
-//=================================================================================
-void SMESHGUI_GroupDlg::init (SMESH::SMESH_Mesh_ptr theMesh)
-{
- mySelectionMgr->installFilter(myMeshFilter);
-
- /* init data from current selection */
- myMesh = SMESH::SMESH_Mesh::_duplicate(theMesh);
- myGroup = SMESH::SMESH_Group::_nil();
-
- myActor = SMESH::FindActorByObject(myMesh);
- SMESH::SetPickable(myActor);
-
- SALOME_ListIO aList;
- mySelectionMgr->selectedObjects( aList );
- if( !aList.IsEmpty() )
- {
- QString aName = aList.First()->getName();
- myMeshGroupLine->setText(aName) ;
- myMeshGroupLine->home( false );
- }
-
- myCurrentLineEdit = 0;
-
- myTypeGroup->setButton(0);
- onTypeChanged(0);
-}
-
-//=================================================================================
-// function : Init()
-// purpose :
-//=================================================================================
-void SMESHGUI_GroupDlg::init (SMESH::SMESH_Group_ptr theGroup)
-{
- myMesh = theGroup->GetMesh();
- myGroup = SMESH::SMESH_Group::_duplicate(theGroup);
-
- myActor = SMESH::FindActorByObject(myMesh);
- if ( !myActor )
- myActor = SMESH::FindActorByObject(myGroup);
- SMESH::SetPickable(myActor);
-
- int aType = 0;
- switch(theGroup->GetType()) {
- case SMESH::NODE: aType= 0; break;
- case SMESH::EDGE: aType = 1; break;
- case SMESH::FACE: aType = 2; break;
- case SMESH::VOLUME: aType = 3; break;
- }
-
- myName->setText(myGroup->GetName());
- myName->home(false);
- myMeshGroupLine->setText(myGroup->GetName());
-
- myCurrentLineEdit = 0;
- myTypeGroup->setButton(aType);
- myElements->clear();
- setSelectionMode(aType);
- myTypeId = aType;
-
- myIdList.clear();
- if (!theGroup->IsEmpty()) {
- SMESH::long_array_var anElements = myGroup->GetListOfID();
- int k = anElements->length();
- for (int i = 0; i < k; i++) {
- myIdList.append(anElements[i]);
- myElements->insertItem(QString::number(anElements[i]));
- }
- myElements->selectAll(true);
- }
-}
-
-//=================================================================================
-// function : updateButtons()
-// purpose :
-//=================================================================================
-void SMESHGUI_GroupDlg::updateButtons()
-{
- bool enable;
-
- if (myGrpTypeId == 0)
- enable = !myName->text().stripWhiteSpace().isEmpty() && myElements->count() > 0;
- else if (myGrpTypeId == 1)
- enable = !myName->text().stripWhiteSpace().isEmpty() && !CORBA::is_nil( myGeomGroup );
- QPushButton* aBtn;
- aBtn = (QPushButton*) child("ok", "QPushButton");
- if (aBtn) aBtn->setEnabled(enable);
- aBtn = (QPushButton*) child("apply", "QPushButton");
- if (aBtn) aBtn->setEnabled(enable);
-}
-
-//=================================================================================
-// function : onNameChanged()
-// purpose :
-//=================================================================================
-void SMESHGUI_GroupDlg::onNameChanged (const QString& text)
-{
- updateButtons();
-}
-
-//=================================================================================
-// function : onTypeChanged()
-// purpose : Group elements type radio button management
-//=================================================================================
-void SMESHGUI_GroupDlg::onTypeChanged (int id)
-{
- if (myTypeId != id) {
- myElements->clear();
- if (myCurrentLineEdit == 0)
- setSelectionMode(id);
- }
- myTypeId = id;
-}
-
-//=================================================================================
-// function : onGrpTypeChanged()
-// purpose : Group type radio button management
-//=================================================================================
-void SMESHGUI_GroupDlg::onGrpTypeChanged (int id)
-{
- if (myGrpTypeId != id) {
- myWGStack->raiseWidget( id );
- onSelectGeomGroup(id == 1);
- }
- myGrpTypeId = id;
-}
-
-//=================================================================================
-// function : setSelectionMode()
-// purpose : Radio button management
-//=================================================================================
-void SMESHGUI_GroupDlg::setSelectionMode (int theMode)
-{
- // PAL7314
- if (myMesh->_is_nil())
- return;
-
- if (mySelectionMode != theMode) {
- mySelectionMgr->clearSelected();
- mySelectionMgr->clearFilters();
- SMESH::SetPointRepresentation(false);
- if (theMode < 4) {
- switch (theMode) {
- case 0:
- if (myActor)
- myActor->SetPointRepresentation(true);
- else
- SMESH::SetPointRepresentation(true);
- if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
- aViewWindow->SetSelectionMode(NodeSelection);
- break;
- case 1:
- if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
- aViewWindow->SetSelectionMode(EdgeSelection);
- break;
- case 2:
- if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
- aViewWindow->SetSelectionMode(FaceSelection);
- break;
- default:
- if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
- aViewWindow->SetSelectionMode(VolumeSelection);
- }
- } else {
- if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
- aViewWindow->SetSelectionMode(ActorSelection);
- if (theMode == 4)
- mySelectionMgr->installFilter(mySubMeshFilter);
- else if (theMode == 5)
- mySelectionMgr->installFilter(myGroupFilter);
- else if (theMode == 6)
- mySelectionMgr->installFilter(myMeshFilter);
- }
- mySelectionMode = theMode;
- }
-}
-
-//=================================================================================
-// function : onApply()
-// purpose :
-//=================================================================================
-bool SMESHGUI_GroupDlg::onApply()
-{
- if (mySMESHGUI->isActiveStudyLocked())
- return false;
-
- if (myGrpTypeId == 0 &&
- !myName->text().stripWhiteSpace().isEmpty() &&
- myElements->count() > 0) {
- mySelectionMgr->clearSelected();
- if (myGroup->_is_nil()) {
- SMESH::ElementType aType = SMESH::ALL;
- switch(myTypeId) {
- case 0: aType = SMESH::NODE; break;
- case 1: aType = SMESH::EDGE; break;
- case 2: aType = SMESH::FACE; break;
- case 3: aType = SMESH::VOLUME; break;
- }
- SMESH::long_array_var anIdList = new SMESH::long_array;
- int i, k = myElements->count();
- anIdList->length(k);
- QListBoxItem* anItem;
- for (i = 0, anItem = myElements->firstItem(); anItem != 0; i++, anItem = anItem->next()) {
- anIdList[i] = anItem->text().toInt();
- }
-
- myGroup = SMESH::AddGroup(myMesh, aType, myName->text());
- myGroup->Add(anIdList.inout());
-
- /* init for next operation */
- myName->setText("");
- myElements->clear();
- myGroup = SMESH::SMESH_Group::_nil();
-
- } else {
- myGroup->SetName(myName->text());
-
- QValueList<int> aAddList;
- QValueList<int>::iterator anIt;
- QListBoxItem* anItem;
-
- for (anItem = myElements->firstItem(); anItem != 0; anItem = anItem->next()) {
- int anId = anItem->text().toInt();
- if ((anIt = myIdList.find(anId)) == myIdList.end())
- aAddList.append(anId);
- else
- myIdList.remove(anIt);
- }
- if (!aAddList.empty()) {
- SMESH::long_array_var anIdList = new SMESH::long_array;
- anIdList->length(aAddList.count());
- int i;
- for (i = 0, anIt = aAddList.begin(); anIt != aAddList.end(); anIt++, i++)
- anIdList[i] = *anIt;
- myGroup->Add(anIdList.inout());
- }
- if (!myIdList.empty()) {
- SMESH::long_array_var anIdList = new SMESH::long_array;
- anIdList->length(myIdList.count());
- int i;
- for (i = 0, anIt = myIdList.begin(); anIt != myIdList.end(); anIt++, i++)
- anIdList[i] = *anIt;
- myGroup->Remove(anIdList.inout());
- }
- /* init for next operation */
- myIdList.clear();
- for (anItem = myElements->firstItem(); anItem != 0; anItem = anItem->next())
- myIdList.append(anItem->text().toInt());
- }
-
- mySMESHGUI->updateObjBrowser(true);
- SMESH::UpdateView(); // asv: fix of BUG PAL5515
- mySelectionMgr->clearSelected();
- return true;
- } else if (myGrpTypeId == 1 &&
- !myName->text().stripWhiteSpace().isEmpty() &&
- !CORBA::is_nil(myGeomGroup))
- {
- SMESH::ElementType aType = SMESH::ALL;
- switch (myTypeId) {
- case 0: aType = SMESH::NODE; break;
- case 1: aType = SMESH::EDGE; break;
- case 2: aType = SMESH::FACE; break;
- case 3: aType = SMESH::VOLUME; break;
- }
-
- _PTR(Study) aStudy = SMESH::GetActiveStudyDocument();
- GEOM::GEOM_IGroupOperations_var aGroupOp =
- SMESH::GetGEOMGen()->GetIGroupOperations(aStudy->StudyId());
-
- SMESH::SMESH_GroupOnGeom_var aGroupOnGeom =
- myMesh->CreateGroupFromGEOM(aType, myName->text(),myGeomGroup);
-
- mySMESHGUI->updateObjBrowser(true);
- mySelectionMgr->clearSelected();
- /* init for next operation */
- myName->setText("");
- return true;
- }
-
- return false;
-}
-
-//=================================================================================
-// function : onOK()
-// purpose :
-//=================================================================================
-void SMESHGUI_GroupDlg::onOK()
-{
- if ( onApply() )
- onClose();
-}
-
-//=================================================================================
-// function : onListSelectionChanged()
-// purpose : Called when selection in element list is changed
-//=================================================================================
-void SMESHGUI_GroupDlg::onListSelectionChanged()
-{
- // MESSAGE("SMESHGUI_GroupDlg::onListSelectionChanged(); myActor = " << myActor);
- if( myIsBusy || !myActor) return;
- myIsBusy = true;
-
- if (myCurrentLineEdit == 0) {
- mySelectionMgr->clearSelected();
- TColStd_MapOfInteger aIndexes;
- QListBoxItem* anItem;
- for (anItem = myElements->firstItem(); anItem != 0; anItem = anItem->next()) {
- if (anItem->isSelected()) {
- int anId = anItem->text().toInt();
- aIndexes.Add(anId);
- }
- }
- mySelector->AddOrRemoveIndex(myActor->getIO(), aIndexes, false);
- SALOME_ListIO aList;
- aList.Append(myActor->getIO());
- mySelectionMgr->setSelectedObjects(aList,false);
- if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
- aViewWindow->highlight( myActor->getIO(), true, true );
- }
- myIsBusy = false;
-}
-
-//=================================================================================
-// function : onObjectSelectionChanged()
-// purpose : Called when selection in 3D view or ObjectBrowser is changed
-//=================================================================================
-void SMESHGUI_GroupDlg::onObjectSelectionChanged()
-{
- if ( myIsBusy || !isEnabled()) return;
- myIsBusy = true;
-
- SALOME_ListIO aList;
- mySelectionMgr->selectedObjects( aList );
-
- int aNbSel = aList.Extent();
- myElements->clearSelection();
-
- if (myCurrentLineEdit) {
- myCurrentLineEdit->setText("");
- QString aString = "";
-
- if (myCurrentLineEdit == myMeshGroupLine) {
- mySelectSubMesh->setEnabled(false);
- mySelectGroup->setEnabled(false);
- myGroupLine->setText("");
- mySubMeshLine->setText("");
-
- myGeomGroupBtn->setEnabled(false);
- myGeomGroupLine->setEnabled(false);
- myGeomGroupLine->setText("");
- if (!myCreate)
- myName->setText("");
-
- myElements->clear();
-
- if (aNbSel != 1 ) {
- myGroup = SMESH::SMESH_Group::_nil();
- myMesh = SMESH::SMESH_Mesh::_nil();
- myIsBusy = false;
- return;
- }
- Handle(SALOME_InteractiveObject) IO = aList.First();
-
- if (myCreate) {
- myMesh = SMESH::IObjectToInterface<SMESH::SMESH_Mesh>(IO);
- if (myMesh->_is_nil())
- {
- myIsBusy = false;
- return;
- }
- myGroup = SMESH::SMESH_Group::_nil();
-
- myActor = SMESH::FindActorByObject(myMesh);
- SMESH::SetPickable(myActor);
-
- aString = aList.First()->getName();
- myMeshGroupLine->setText(aString) ;
- myMeshGroupLine->home( false );
-
- mySelectSubMesh->setEnabled(true);
- mySelectGroup->setEnabled(true);
- myGeomGroupBtn->setEnabled(true);
- myGeomGroupLine->setEnabled(true);
- updateButtons();
- } else {
- SMESH::SMESH_Group_var aGroup = SMESH::IObjectToInterface<SMESH::SMESH_Group>(IO);
- if (aGroup->_is_nil())
- {
- myIsBusy = false;
- return;
- }
- myIsBusy = false;
- myCurrentLineEdit = 0;
- init(aGroup);
- myIsBusy = true;
- mySelectSubMesh->setEnabled(true);
- mySelectGroup->setEnabled(true);
- myGeomGroupBtn->setEnabled(true);
- myGeomGroupLine->setEnabled(true);
- }
- myCurrentLineEdit = 0;
- myIsBusy = false;
- if (!myCreate)
- return;
-
- if (myTypeId == -1)
- onTypeChanged(0);
- else {
- myElements->clear();
- setSelectionMode(myTypeId);
- }
-
- myIsBusy = false;
- return;
-
- } else if (myCurrentLineEdit == myGeomGroupLine) {
- if (aNbSel != 1) {
- myGeomGroup = GEOM::GEOM_Object::_nil();
- myIsBusy = false;
- return;
- }
-
- Standard_Boolean testResult = Standard_False;
- myGeomGroup = GEOMBase::ConvertIOinGEOMObject(aList.First(), testResult);
-
- // Check if the object is a geometry group
- if (!testResult || CORBA::is_nil(myGeomGroup)) {
- myGeomGroup = GEOM::GEOM_Object::_nil();
- myIsBusy = false;
- return;
- }
- // Check if group constructed on the same shape as a mesh or on its child
- _PTR(Study) aStudy = SMESH::GetActiveStudyDocument();
- GEOM::GEOM_IGroupOperations_var anOp =
- SMESH::GetGEOMGen()->GetIGroupOperations(aStudy->StudyId());
-
- // The main shape of the group
- GEOM::GEOM_Object_var aGroupMainShape;
- if (myGeomGroup->GetType() == 37)
- aGroupMainShape = anOp->GetMainShape(myGeomGroup);
- else
- aGroupMainShape = GEOM::GEOM_Object::_duplicate(myGeomGroup);
- _PTR(SObject) aGroupMainShapeSO =
- //aStudy->FindObjectIOR(aStudy->ConvertObjectToIOR(aGroupMainShape));
- aStudy->FindObjectIOR(aGroupMainShape->GetStudyEntry());
-
- // The mesh SObject
- _PTR(SObject) aMeshSO = SMESH::FindSObject(myMesh);
- if (!aMeshSO) {
- myGeomGroup = GEOM::GEOM_Object::_nil();
- myIsBusy = false;
- return;
- }
- _PTR(SObject) anObj, aRef;
- bool isRefOrSubShape = false;
- if (aMeshSO->FindSubObject(1, anObj) && anObj->ReferencedObject(aRef)) {
- //if (strcmp(aRef->GetID(), aGroupMainShapeSO->GetID()) == 0) {
- if (aRef->GetID() == aGroupMainShapeSO->GetID()) {
- isRefOrSubShape = true;
- } else {
- _PTR(SObject) aFather = aGroupMainShapeSO->GetFather();
- _PTR(SComponent) aComponent = aGroupMainShapeSO->GetFatherComponent();
- //while (!isRefOrSubShape && strcmp(aFather->GetID(), aComponent->GetID()) != 0) {
- while (!isRefOrSubShape && aFather->GetID() != aComponent->GetID()) {
- //if (strcmp(aRef->GetID(), aFather->GetID()) == 0)
- if (aRef->GetID() == aFather->GetID())
- isRefOrSubShape = true;
- else
- aFather = aFather->GetFather();
- }
- }
- }
- if (!isRefOrSubShape) {
- myGeomGroup = GEOM::GEOM_Object::_nil();
- myIsBusy = false;
- return;
- }
- }
-
- if(aNbSel >= 1) {
- if(aNbSel > 1) {
- if(myCurrentLineEdit == mySubMeshLine)
- aString = tr("SMESH_SUBMESH_SELECTED").arg(aNbSel);
- else if(myCurrentLineEdit == myGroupLine || myCurrentLineEdit == myGeomGroupLine)
- aString = tr("SMESH_GROUP_SELECTED").arg(aNbSel);
- } else {
- aString = aList.First()->getName();
- }
- }
-
- myCurrentLineEdit->setText(aString);
- myCurrentLineEdit->home(false);
-
- updateButtons();
-
- } else {
- if (aNbSel == 1 && myActor ) {
- QString aListStr = "";
- int aNbItems = 0;
- if (myTypeId == 0) {
- aNbItems = SMESH::GetNameOfSelectedNodes(mySelector, myActor->getIO(), aListStr);
- } else {
- aNbItems = SMESH::GetNameOfSelectedElements(mySelector, myActor->getIO(), aListStr);
- }
- if (aNbItems > 0) {
- QStringList anElements = QStringList::split(" ", aListStr);
- QListBoxItem* anItem = 0;
- for (QStringList::iterator it = anElements.begin(); it != anElements.end(); ++it) {
- anItem = myElements->findItem(*it, Qt::ExactMatch);
- if (anItem) myElements->setSelected(anItem, true);
- }
- }
- }
- }
-
- if (!myActor) {
- if (!myGroup->_is_nil())
- myActor = SMESH::FindActorByObject(myGroup);
- else
- myActor = SMESH::FindActorByObject(myMesh);
- }
-
- myIsBusy = false;
-}
-
-//=================================================================================
-// function : onSelectSubMesh()
-// purpose : Called when selection in 3D view or ObjectBrowser is changed
-//=================================================================================
-void SMESHGUI_GroupDlg::onSelectSubMesh(bool on)
-{
- if (on) {
- if (mySelectGroup->isChecked()) {
- mySelectGroup->setChecked(false);
- }
- //VSR: else if (mySelectGeomGroup->isChecked()) {
- //VSR: mySelectGeomGroup->setChecked(false);
- //VSR: }
- myCurrentLineEdit = mySubMeshLine;
- setSelectionMode(4);
- }
- else {
- mySubMeshLine->setText("");
- myCurrentLineEdit = 0;
- if (myTypeId != -1)
- setSelectionMode(myTypeId);
- }
- mySubMeshBtn->setEnabled(on);
- mySubMeshLine->setEnabled(on);
-}
-
-
-//=================================================================================
-// function : (onSelectGroup)
-// purpose : Called when selection in 3D view or ObjectBrowser is changed
-//=================================================================================
-void SMESHGUI_GroupDlg::onSelectGroup(bool on)
-{
- if (on) {
- if (mySelectSubMesh->isChecked()) {
- mySelectSubMesh->setChecked(false);
- }
- myCurrentLineEdit = myGroupLine;
- setSelectionMode(5);
- }
- else {
- myGroupLine->setText("");
- myCurrentLineEdit = 0;
- if (myTypeId != -1)
- setSelectionMode(myTypeId);
- }
- myGroupBtn->setEnabled(on);
- myGroupLine->setEnabled(on);
-}
-
-
-//=================================================================================
-// function : (onSelectGeomGroup)
-// purpose : Called when selection in 3D view or ObjectBrowser is changed
-//=================================================================================
-void SMESHGUI_GroupDlg::onSelectGeomGroup(bool on)
-{
- if (on) {
- if (mySelectSubMesh->isChecked()) {
- mySelectSubMesh->setChecked(false);
- }
- else if (mySelectGroup->isChecked()) {
- mySelectGroup->setChecked(false);
- }
- myCurrentLineEdit = myGeomGroupLine;
- setSelectionMode(7);
- }
- else {
- myGeomGroupLine->setText("");
- myCurrentLineEdit = 0;
- if (myTypeId != -1)
- setSelectionMode(myTypeId);
- }
-}
-
-
-//=================================================================================
-// function : setCurrentSelection()
-// purpose :
-//=================================================================================
-void SMESHGUI_GroupDlg::setCurrentSelection()
-{
- QPushButton* send = (QPushButton*)sender();
- myCurrentLineEdit = 0;
- if (send == myMeshGroupBtn) {
- myCurrentLineEdit = myMeshGroupLine;
- if (myCreate)
- setSelectionMode(6);
- else
- setSelectionMode(5);
- onObjectSelectionChanged();
- }
- else if (send == mySubMeshBtn) {
- myCurrentLineEdit = mySubMeshLine;
- onObjectSelectionChanged();
- }
- else if (send == myGroupBtn) {
- myCurrentLineEdit = myGroupLine;
- onObjectSelectionChanged();
- }
- else if (send == myGeomGroupBtn) {
- myCurrentLineEdit = myGeomGroupLine;
- setSelectionMode(7);
- onObjectSelectionChanged();
- }
-}
-
-
-//=================================================================================
-// function : setFilters()
-// purpose : SLOT. Called when "Filter" button pressed.
-//=================================================================================
-void SMESHGUI_GroupDlg::setFilters()
-{
- SMESH::ElementType aType = SMESH::ALL;
- switch ( myTypeId )
- {
- case 0 : aType = SMESH::NODE; break;
- case 1 : aType = SMESH::EDGE; break;
- case 2 : aType = SMESH::FACE; break;
- case 3 : aType = SMESH::VOLUME; break;
- default: return;
- }
-
- if ( myFilterDlg == 0 )
- {
- myFilterDlg = new SMESHGUI_FilterDlg( mySMESHGUI, aType );
- connect( myFilterDlg, SIGNAL( Accepted() ), SLOT( onFilterAccepted() ) );
- }
- else
- myFilterDlg->Init( aType );
-
- myFilterDlg->SetSelection();
- myFilterDlg->SetMesh( myMesh );
- myFilterDlg->SetSourceWg( myElements );
-
- myFilterDlg->show();
-}
-
-//=================================================================================
-// function : onFilterAccepted()
-// purpose : SLOT. Called when Filter dlg closed with OK button.
-// Uncheck "Select submesh" and "Select group" checkboxes
-//=================================================================================
-void SMESHGUI_GroupDlg::onFilterAccepted()
-{
- if ( mySelectSubMesh->isChecked() || mySelectGroup->isChecked() )
- {
- mySelectionMode = myTypeId;
- mySelectSubMesh->setChecked( false );
- mySelectGroup->setChecked( false );
- }
-}
-
-//=================================================================================
-// function : onAdd()
-// purpose :
-//=================================================================================
-void SMESHGUI_GroupDlg::onAdd()
-{
- SALOME_ListIO aList;
- mySelectionMgr->selectedObjects( aList );
-
- int aNbSel = aList.Extent();
-
- if (aNbSel == 0 || !myActor || myMesh->_is_nil()) return;
-
- myIsBusy = true;
-
- SMESH::ElementType aType = SMESH::ALL;
- switch(myTypeId) {
- case 0: aType = SMESH::NODE; break;
- case 1: aType = SMESH::EDGE; break;
- case 2: aType = SMESH::FACE; break;
- case 3: aType = SMESH::VOLUME; break;
- }
-
- if (myCurrentLineEdit == 0) {
- //if (aNbSel != 1) { myIsBusy = false; return; }
- QString aListStr = "";
- int aNbItems = 0;
- if (myTypeId == 0) {
- aNbItems = SMESH::GetNameOfSelectedNodes(mySelector, myActor->getIO(), aListStr);
- }
- else {
- aNbItems = SMESH::GetNameOfSelectedElements(mySelector, myActor->getIO(), aListStr);
- }
- if (aNbItems > 0) {
- QStringList anElements = QStringList::split(" ", aListStr);
- QListBoxItem* anItem = 0;
- for (QStringList::iterator it = anElements.begin(); it != anElements.end(); ++it) {
- anItem = myElements->findItem(*it, Qt::ExactMatch);
- if (!anItem) {
- anItem = new QListBoxText(*it);
- myElements->insertItem(anItem);
- }
- myElements->setSelected(anItem, true);
- }
- }
- } else if (myCurrentLineEdit == mySubMeshLine) {
- //SALOME_ListIteratorOfListIO anIt (mySelectionMgr->StoredIObjects());
-
- SALOME_ListIO aList;
- mySelectionMgr->selectedObjects( aList );
-
- SALOME_ListIteratorOfListIO anIt (aList);
- for (; anIt.More(); anIt.Next()) {
- SMESH::SMESH_subMesh_var aSubMesh =
- SMESH::IObjectToInterface<SMESH::SMESH_subMesh>(anIt.Value());
- if (!aSubMesh->_is_nil()) {
- // check if mesh is the same
- if (aSubMesh->GetFather()->GetId() == myMesh->GetId()) {
- try {
- SMESH::long_array_var anElements = aSubMesh->GetElementsByType(aType);
- int k = anElements->length();
- QListBoxItem* anItem = 0;
- for (int i = 0; i < k; i++) {
- QString aText = QString::number(anElements[i]);
- anItem = myElements->findItem(aText, Qt::ExactMatch);
- if (!anItem) {
- anItem = new QListBoxText(aText);
- myElements->insertItem(anItem);
- }
- myElements->setSelected(anItem, true);
- }
- }
- catch (const SALOME::SALOME_Exception& ex) {
- SalomeApp_Tools::QtCatchCorbaException(ex);
- }
- }
- }
- }
- mySelectSubMesh->setChecked(false);
- myIsBusy = false;
- onListSelectionChanged();
-
- } else if (myCurrentLineEdit == myGroupLine) {
- //SALOME_ListIteratorOfListIO anIt (mySelectionMgr->StoredIObjects());
- SALOME_ListIO aList;
- mySelectionMgr->selectedObjects( aList );
-
- SALOME_ListIteratorOfListIO anIt (aList);
- for (; anIt.More(); anIt.Next()) {
- SMESH::SMESH_Group_var aGroup =
- SMESH::IObjectToInterface<SMESH::SMESH_Group>(anIt.Value());
- if (!aGroup->_is_nil()) {
- // check if mesh is the same
- if (aGroup->GetType() == aType && aGroup->GetMesh()->GetId() == myMesh->GetId()) {
- SMESH::long_array_var anElements = aGroup->GetListOfID();
- int k = anElements->length();
- QListBoxItem* anItem = 0;
- for (int i = 0; i < k; i++) {
- QString aText = QString::number(anElements[i]);
- anItem = myElements->findItem(aText, Qt::ExactMatch);
- if (!anItem) {
- anItem = new QListBoxText(aText);
- myElements->insertItem(anItem);
- }
- myElements->setSelected(anItem, true);
- }
- }
- }
- }
- mySelectGroup->setChecked(false);
- myIsBusy = false;
- onListSelectionChanged();
-
- } else if (myCurrentLineEdit == myGeomGroupLine && !CORBA::is_nil(myGeomGroup)) {
- _PTR(Study) aStudy = SMESH::GetActiveStudyDocument();
- GEOM::GEOM_IGroupOperations_var aGroupOp =
- SMESH::GetGEOMGen()->GetIGroupOperations(aStudy->StudyId());
-
- SMESH::ElementType aGroupType = SMESH::ALL;
- switch(aGroupOp->GetType(myGeomGroup)) {
- case 7: aGroupType = SMESH::NODE; break;
- case 6: aGroupType = SMESH::EDGE; break;
- case 4: aGroupType = SMESH::FACE; break;
- case 2: aGroupType = SMESH::VOLUME; break;
- default: myIsBusy = false; return;
- }
-
- if (aGroupType == aType) {
- _PTR(SObject) aGroupSO =
- //aStudy->FindObjectIOR(aStudy->ConvertObjectToIOR(myGeomGroup));
- aStudy->FindObjectIOR(myGeomGroup->GetStudyEntry());
- // Construct filter
- SMESH::FilterManager_var aFilterMgr = SMESH::GetFilterManager();
- SMESH::Filter_var aFilter = aFilterMgr->CreateFilter();
- SMESH::BelongToGeom_var aBelongToGeom = aFilterMgr->CreateBelongToGeom();;
- aBelongToGeom->SetGeom(myGeomGroup);
- aBelongToGeom->SetShapeName(aGroupSO->GetName().c_str());
- aBelongToGeom->SetElementType(aType);
- aFilter->SetPredicate(aBelongToGeom);
-
- SMESH::long_array_var anElements = aFilter->GetElementsId(myMesh);
-
- int k = anElements->length();
- QListBoxItem* anItem = 0;
- for (int i = 0; i < k; i++) {
- QString aText = QString::number(anElements[i]);
- anItem = myElements->findItem(aText, Qt::ExactMatch);
- if (!anItem) {
- anItem = new QListBoxText(aText);
- myElements->insertItem(anItem);
- }
- myElements->setSelected(anItem, true);
- }
- }
-
- //VSR: mySelectGeomGroup->setChecked(false);
- myIsBusy = false;
- onListSelectionChanged();
- }
- myIsBusy = false;
- // mySelectionMgr->clearSelected();
- updateButtons();
-}
-
-//=================================================================================
-// function : onRemove()
-// purpose :
-//=================================================================================
-void SMESHGUI_GroupDlg::onRemove()
-{
- myIsBusy = true;
- if (myCurrentLineEdit == 0) {
- for (int i = myElements->count(); i > 0; i--) {
- if (myElements->isSelected(i-1)) {
- myElements->removeItem(i-1);
- }
- }
- } else {
- SALOME_ListIO aList;
- mySelectionMgr->selectedObjects( aList );
-
- int aNbSel = aList.Extent();
-
- if (aNbSel == 0) { myIsBusy = false; return; }
-
- SMESH::ElementType aType = SMESH::ALL;
- switch(myTypeId) {
- case 0: aType = SMESH::NODE; break;
- case 1: aType = SMESH::EDGE; break;
- case 2: aType = SMESH::FACE; break;
- case 3: aType = SMESH::VOLUME; break;
- }
-
- if (myCurrentLineEdit == mySubMeshLine) {
- //SALOME_ListIteratorOfListIO anIt (mySelectionMgr->StoredIObjects());
- SALOME_ListIO aList;
- mySelectionMgr->selectedObjects( aList );
-
- SALOME_ListIteratorOfListIO anIt (aList);
- for (; anIt.More(); anIt.Next()) {
- SMESH::SMESH_subMesh_var aSubMesh = SMESH::IObjectToInterface<SMESH::SMESH_subMesh>(anIt.Value());
- if (!aSubMesh->_is_nil()) {
- // check if mesh is the same
- if (aSubMesh->GetFather()->GetId() == myMesh->GetId()) {
- if (aType == SMESH::NODE) {
- try {
- SMESH::long_array_var anElements = aSubMesh->GetNodesId();
- int k = anElements->length();
- QListBoxItem* anItem = 0;
- for (int i = 0; i < k; i++) {
- anItem = myElements->findItem(QString::number(anElements[i]), Qt::ExactMatch);
- if (anItem) delete anItem;
- }
- }
- catch (const SALOME::SALOME_Exception& ex) {
- SalomeApp_Tools::QtCatchCorbaException(ex);
- }
- }
- else {
- try {
- SMESH::long_array_var anElements = aSubMesh->GetElementsId();
- int k = anElements->length();
- QListBoxItem* anItem = 0;
- for (int i = 0; i < k; i++) {
- anItem = myElements->findItem(QString::number(anElements[i]), Qt::ExactMatch);
- if (anItem) delete anItem;
- }
- }
- catch (const SALOME::SALOME_Exception& ex) {
- SalomeApp_Tools::QtCatchCorbaException(ex);
- }
- }
- }
- }
- }
- }
- else if (myCurrentLineEdit == myGroupLine) {
- Standard_Boolean aRes;
- //SALOME_ListIteratorOfListIO anIt (mySelectionMgr->StoredIObjects());
- SALOME_ListIO aList;
- mySelectionMgr->selectedObjects( aList );
-
- SALOME_ListIteratorOfListIO anIt (aList);
- for (; anIt.More(); anIt.Next()) {
- SMESH::SMESH_Group_var aGroup = SMESH::IObjectToInterface<SMESH::SMESH_Group>(anIt.Value());
- if (aRes && !aGroup->_is_nil()) {
- // check if mesh is the same
- if (aGroup->GetType() == aType && aGroup->GetMesh()->GetId() == myMesh->GetId()) {
- SMESH::long_array_var anElements = aGroup->GetListOfID();
- int k = anElements->length();
- QListBoxItem* anItem = 0;
- for (int i = 0; i < k; i++) {
- anItem = myElements->findItem(QString::number(anElements[i]), Qt::ExactMatch);
- if (anItem) delete anItem;
- }
- }
- }
- }
- }
- }
- myIsBusy = false;
- updateButtons();
-}
-
-//=================================================================================
-// function : onSort()
-// purpose :
-//=================================================================================
-void SMESHGUI_GroupDlg::onSort()
-{
- // PAL5412: sorts items in ascending by "string" value
- // myElements->sort(true);
- // myElements->update();
- int i, k = myElements->count();
- if (k > 0) {
- myIsBusy = true;
- QStringList aSelected;
- std::vector<int> anArray(k);
- // QMemArray<int> anArray(k);
- QListBoxItem* anItem;
- // fill the array
- for (anItem = myElements->firstItem(), i = 0; anItem != 0; anItem = anItem->next(), i++) {
- anArray[i] = anItem->text().toInt();
- if (anItem->isSelected())
- aSelected.append(anItem->text());
- }
- // sort & update list
- std::sort(anArray.begin(), anArray.end());
- // anArray.sort();
- myElements->clear();
- for (i = 0; i < k; i++) {
- myElements->insertItem(QString::number(anArray[i]));
- }
- for (QStringList::iterator it = aSelected.begin(); it != aSelected.end(); ++it) {
- anItem = myElements->findItem(*it, Qt::ExactMatch);
- if (anItem) myElements->setSelected(anItem, true);
- }
- myIsBusy = false;
- }
-}
-
-//=================================================================================
-// function : closeEvent()
-// purpose :
-//=================================================================================
-void SMESHGUI_GroupDlg::closeEvent (QCloseEvent*)
-{
- onClose();
-}
-
-//=================================================================================
-// function : SMESHGUI_GroupDlg::onClose
-// purpose : SLOT called when "Close" button pressed. Close dialog
-//=================================================================================
-void SMESHGUI_GroupDlg::onClose()
-{
- if (SMESH::GetCurrentVtkView()) {
- SMESH::RemoveFilters(); // PAL6938 -- clean all mesh entity filters
- SMESH::SetPointRepresentation(false);
- SMESH::SetPickable();
- }
-
- mySelectionMgr->clearSelected();
- if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
- aViewWindow->SetSelectionMode(ActorSelection);
- mySelectionMgr->clearFilters();
- mySMESHGUI->ResetState();
-
- reject();
-}
-
-//=================================================================================
-// function : SMESHGUI_GroupDlg::onDeactivate
-// purpose : SLOT called when dialog must be deativated
-//=================================================================================
-void SMESHGUI_GroupDlg::onDeactivate()
-{
- mySMESHGUI->ResetState();
- setEnabled(false);
-}
-
-//=================================================================================
-// function : SMESHGUI_GroupDlg::enterEvent
-// purpose : Event filter
-//=================================================================================
-void SMESHGUI_GroupDlg::enterEvent (QEvent*)
-{
- if (!isEnabled()) {
- mySMESHGUI->EmitSignalDeactivateDialog();
- setEnabled(true);
- mySelectionMode = -1;
- setSelectionMode(myTypeId);
- //mySMESHGUI->SetActiveDialogBox((QDialog*)this);
- mySMESHGUI->SetActiveDialogBox(this);
- mySMESHGUI->SetState(800);
- }
-}
-
-//=================================================================================
-// function : hideEvent
-// purpose : caused by ESC key
-//=================================================================================
-void SMESHGUI_GroupDlg::hideEvent (QHideEvent*)
-{
- if (!isMinimized())
- onClose();
-}
+++ /dev/null
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-
-#include "SMESHGUI_GroupUtils.h"
-
-#include "SMESHGUI.h"
-#include "SMESHGUI_Utils.h"
-
-#include "SUIT_Session.h"
-#include "SalomeApp_Application.h"
-#include "SalomeApp_Tools.h"
-
-#include "OB_Browser.h"
-
-namespace SMESH
-{
-
- SMESH::SMESH_Group_var AddGroup( SMESH::SMESH_Mesh_ptr theMesh,
- SMESH::ElementType theType,
- const char* theGroupName )
- {
- SMESH::SMESH_Group_var aGroup;
- try {
- if ( !theMesh->_is_nil() )
- aGroup = theMesh->CreateGroup( theType, theGroupName );
- }
- catch( const SALOME::SALOME_Exception& S_ex ) {
- SalomeApp_Tools::QtCatchCorbaException( S_ex );
- }
- //SalomeApp_Application* app =
- // dynamic_cast<SalomeApp_Application*>(SUIT_Session::session()->activeApplication());
- //if (app) app->objectBrowser()->updateTree();
- SMESHGUI::GetSMESHGUI()->updateObjBrowser();
- return aGroup._retn();
- }
-}
+++ /dev/null
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-#ifndef SMESHGUI_GroupUtils_HeaderFile
-#define SMESHGUI_GroupUtils_HeaderFile
-
-#include "SALOMEconfig.h"
-#include CORBA_SERVER_HEADER(SMESH_Mesh)
-#include CORBA_SERVER_HEADER(SMESH_Group)
-
-
-namespace SMESH{
-
- SMESH::SMESH_Group_var AddGroup(SMESH::SMESH_Mesh_ptr theMesh,
- SMESH::ElementType theType,
- const char* theGroupName);
-}
-
-
-#endif
+++ /dev/null
-// SMESH SMESHGUI : GUI for SMESH component
-//
-// Copyright (C) 2003 CEA
-//
-// 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.org
-//
-//
-//
-// File : SMESHGUI_IdValidator.h
-// Author : Edward AGAPOV
-// Module : SMESH
-// $Header: /dn05/salome/PAL/SMESH/SMESH_SRC/src/SMESHGUI/SMESHGUI_IdValidator.h
-
-#ifndef SMESHGUI_IdValidator_HeaderFile
-#define SMESHGUI_IdValidator_HeaderFile
-
-#include <qvalidator.h>
-
-// validator for manual input of Ids
-
-class SMESHGUI_IdValidator: public QValidator
-{
- public:
-
- SMESHGUI_IdValidator(QWidget * parent, const char * name = 0, const int maxNbId = 0):
- QValidator(parent,name), myMaxNbId(maxNbId) {}
-
- State validate ( QString & text, int & pos) const
- {
- text.replace( QRegExp(" *[^0-9]+ *"), " " );
- if ( myMaxNbId && text.length() > myMaxNbId) { // truncate extra ids
- int ind = 0, nbId = 0;
- while ( ind < text.length() ) {
- if ( text.at( ind ) != ' ' ) {
- if ( ++nbId > myMaxNbId ) {
- text.truncate( ind );
- break;
- }
- ind = text.find( ' ', ind );
- if ( ind < 0 ) break;
- }
- ind++;
- }
- }
- if ( pos > text.length() )
- pos = text.length();
- return Acceptable;
- }
-
- private:
- int myMaxNbId;
-};
-
-#endif
+++ /dev/null
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-
-#include "SMESHGUI_MeshUtils.h"
-#include "SMESHGUI_Utils.h"
-
-#include "SALOMEconfig.h"
-#include CORBA_SERVER_HEADER(SMESH_Group)
-
-namespace SMESH
-{
-
- SMESH_Mesh_var GetMeshByIO(const Handle(SALOME_InteractiveObject)& theIO)
- {
- CORBA::Object_var anObj = IObjectToObject(theIO);
- if(!CORBA::is_nil(anObj)){
- SMESH_Mesh_var aMesh = SMESH_Mesh::_narrow(anObj);
- if(!CORBA::is_nil(aMesh))
- return aMesh;
- SMESH_GroupBase_var aGroup = SMESH_GroupBase::_narrow(anObj);
- if(!CORBA::is_nil(aGroup))
- return aGroup->GetMesh();
- SMESH_subMesh_var aSubMesh = SMESH_subMesh::_narrow(anObj);
- if(!CORBA::is_nil(aSubMesh))
- return aSubMesh->GetFather();
- }
- return SMESH_Mesh::_nil();
- }
-
-}
+++ /dev/null
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-#ifndef SMESHGUI_MeshUtils_HeaderFile
-#define SMESHGUI_MeshUtils_HeaderFile
-
-#include "SALOME_InteractiveObject.hxx"
-
-#include "SALOMEconfig.h"
-#include CORBA_SERVER_HEADER(SMESH_Mesh)
-
-
-namespace SMESH{
-
- SMESH_Mesh_var GetMeshByIO(const Handle(SALOME_InteractiveObject)& theIO);
-
-}
-
-
-#endif
+++ /dev/null
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-
-#include "SMESHGUI_PatternUtils.h"
-
-#include "SMESHGUI.h"
-
-namespace SMESH {
-
- SMESH::SMESH_Pattern_var GetPattern()
- {
- return SMESHGUI::GetSMESHGen()->GetPattern();
- }
-}
+++ /dev/null
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-#ifndef SMESHGUI_PatternUtils_HeaderFile
-#define SMESHGUI_PatternUtils_HeaderFile
-
-#include "SALOMEconfig.h"
-#include CORBA_SERVER_HEADER(SMESH_Pattern)
-
-
-namespace SMESH{
-
- SMESH::SMESH_Pattern_var GetPattern();
-
-}
-
-
-#endif
+++ /dev/null
-// SMESH SMESHGUI : GUI for SMESH component
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESHGUI_PatternWidget.cxx
-// Author : Michael ZORIN
-// Module : SMESH
-// $Header:
-
-#include "SMESHGUI_PatternWidget.h"
-
-//Qt includes
-#include <qpainter.h>
-#include <qpoint.h>
-
-
-//=================================================================================
-// class : SMESHGUI_PatternWidget()
-// purpose :
-//=================================================================================
-SMESHGUI_PatternWidget::SMESHGUI_PatternWidget (QWidget* parent, const char* name, WFlags fl)
- : QFrame(parent, name, WStyle_Customize)
-{
- myMinU = myMinV = myMaxU = myMaxV = 0;
- setMinimumHeight(150);
- repaint();
-}
-
-//=================================================================================
-// function : ~SMESHGUI_PatternWidget()
-// purpose :
-//=================================================================================
-SMESHGUI_PatternWidget::~SMESHGUI_PatternWidget()
-{
-}
-
-//=================================================================================
-// function : SetPoints()
-// purpose :
-//=================================================================================
-void SMESHGUI_PatternWidget::SetPoints (PointVector thePoints,
- QValueVector<int> theKeys,
- ConnectivityVector theConnections)
-{
- myPoints = thePoints;
- myKeys = theKeys;
- myConnections = theConnections;
-
- if (!thePoints.size())
- return;
-
- myMinU = myMaxU = (thePoints[0]).x;
- myMinV = myMaxV = (thePoints[0]).y;
- double x, y;
-
- for (int i = 1; i < thePoints.size(); i++) {
- x = (thePoints[i]).x;
- y = (thePoints[i]).y;
-
- if (myMinU > x)
- myMinU = x;
- if (myMaxU < x)
- myMaxU = x;
- if (myMinV > y)
- myMinV = y;
- if (myMaxV < y)
- myMaxV = y;
- }
-
- repaint();
-}
-
-static const int Shift = 4; // shift of the point number from point
-static const int Border = 20;
-
-//=================================================================================
-// function : paintEvent()
-// purpose :
-//=================================================================================
-void SMESHGUI_PatternWidget::paintEvent (QPaintEvent*)
-{
- QPainter paint (this);
- paint.setBrush(Qt::SolidPattern);
-
- //Draw points
- const int aRadius = 3; // radius of a point
-
- for (int i = 0; i < myKeys.size() && i < myPoints.size(); i++) {
- SMESH::PointStruct aPoint = myPoints[ myKeys[i] ];
- QPoint aQPnt = MapCoords(aPoint.x, aPoint.y);
-
- paint.drawPie(aQPnt.x() - aRadius, aQPnt.y() - aRadius, aRadius*2, aRadius*2, 5760, 5760);
- paint.drawText(aQPnt.x() + Shift, aQPnt.y() - Shift, QString::number(i+1));
- }
-
- //Draw lines
- for (int i = 0; i < myConnections.size(); i++) {
- QValueVector<int> aCVector = myConnections[i];
-
- if (aCVector.size() == 0)
- continue;
-
- SMESH::PointStruct aPoint = myPoints[ aCVector[0] ];
- const QPoint aBeginPnt = MapCoords(aPoint.x, aPoint.y);
- QPoint aFirstPnt = aBeginPnt, aSecondPnt;
-
- for (int j = 1; j < aCVector.size(); j++) {
- aPoint = myPoints[ aCVector[j] ];
- aSecondPnt = MapCoords(aPoint.x, aPoint.y);
- paint.drawLine(aFirstPnt, aSecondPnt);
- aFirstPnt = aSecondPnt;
- }
-
- paint.drawLine(aBeginPnt, aSecondPnt);
- }
-}
-
-//=================================================================================
-// function : MapCoords()
-// purpose :
-//=================================================================================
-QPoint SMESHGUI_PatternWidget::MapCoords (const double u, const double v)
-{
- int aWidth = width() - 2*Border;
- int aHeight = height() - 2*Border;
-
- double aUBound = myMaxU - myMinU;
- double aVBound = myMaxV - myMinV;
-
- double aUScale = aWidth/aUBound;
- double aVScale = aHeight/aVBound;
-
- double aScale;
- aUScale <= aVScale ? aScale = aUScale : aScale = aVScale;
-
- double aUMiddle = (myMaxU + myMinU)/2;
- double aVMiddle = (myMaxV + myMinV)/2;
-
- int x = int(aWidth/2 + (u - aUMiddle)*aScale + Border - Shift);
-
- int y = int(aHeight/2 + (aVMiddle - v)*aScale + Border + Shift);
-
- QPoint aPoint = QPoint(x, y);
-
- return aPoint;
-}
+++ /dev/null
-// SMESH SMESHGUI : GUI for SMESH component
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESHGUI_PatternWidget.h
-// Author : Michael ZORIN
-// Module : SMESH
-// $Header:
-
-#ifndef WIDGET_PATTERN_H
-#define WIDGET_PATTERN_H
-
-#include <qframe.h>
-#include <qvaluevector.h>
-
-// IDL Headers
-#include <SALOMEconfig.h>
-#include CORBA_SERVER_HEADER(SMESH_Mesh)
-
-typedef QValueVector<SMESH::PointStruct> PointVector;
-typedef QValueVector< QValueVector<int> > ConnectivityVector;
-
-class QPoint;
-
-//=================================================================================
-// class : SMESHGUI_PatternWidget
-// purpose :
-//=================================================================================
-class SMESHGUI_PatternWidget : public QFrame
-{
- Q_OBJECT
-
-public:
- SMESHGUI_PatternWidget( QWidget* parent = 0, const char* name = 0, WFlags fl = 0 );
-
- ~SMESHGUI_PatternWidget();
-
- void SetPoints( PointVector thePoints, QValueVector<int> theKeys, ConnectivityVector theConnections );
-
-private :
- PointVector myPoints;
- QValueVector<int> myKeys;
- ConnectivityVector myConnections;
-
- double myMinU, myMaxU, myMinV, myMaxV;
-
-private slots:
-
-protected:
- void paintEvent( QPaintEvent * );
- QPoint MapCoords( const double u, const double v );
-};
-
-#endif // WIDGET_PATTERN_H
-
+++ /dev/null
-// SMESH SMESHGUI : GUI for SMESH component
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESHGUI_PrecisionDlg.cxx
-// Author : Sergey LITONIN
-// Module : SMESH
-
-#include "SMESHGUI_PrecisionDlg.h"
-
-#include "SMESHGUI.h"
-#include "SMESHGUI_VTKUtils.h"
-#include "SMESHGUI_Utils.h"
-
-#include "SUIT_Desktop.h"
-#include "SUIT_ResourceMgr.h"
-
-#include <qgroupbox.h>
-#include <qpushbutton.h>
-#include <qcheckbox.h>
-#include <qspinbox.h>
-#include <qlayout.h>
-#include <qlabel.h>
-
-#define SPACING 5
-#define MARGIN 10
-#define DEFAULT_VAL 10
-#define RANGE 128
-
-/*!
- * Class : SMESHGUI_PrecisionDlg
- * Description : Dialog to specify precision of mesh quality controls
- */
-
-//=======================================================================
-// name : SMESHGUI_PrecisionDlg::SMESHGUI_PrecisionDlg
-// Purpose : Constructor
-//=======================================================================
-SMESHGUI_PrecisionDlg::SMESHGUI_PrecisionDlg ( SMESHGUI* theModule )
- : QDialog( SMESH::GetDesktop( theModule ), "SMESHGUI_PrecisionDlg", true,
- WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu ),
- mySMESHGUI( theModule )
-{
- setCaption(tr("CAPTION"));
-
- QVBoxLayout* aDlgLay = new QVBoxLayout (this, MARGIN, SPACING);
-
- QFrame* aMainFrame = createMainFrame (this);
- QFrame* aBtnFrame = createButtonFrame(this);
-
- aDlgLay->addWidget(aMainFrame);
- aDlgLay->addWidget(aBtnFrame);
-
- aDlgLay->setStretchFactor(aMainFrame, 1);
-
- setMinimumWidth((int)(QFontMetrics(font()).width(tr("CAPTION")) * 1.5));
-
- Init();
-}
-
-//=======================================================================
-// name : SMESHGUI_PrecisionDlg::~SMESHGUI_PrecisionDlg
-// Purpose : Destructor
-//=======================================================================
-SMESHGUI_PrecisionDlg::~SMESHGUI_PrecisionDlg()
-{
-}
-
-//=======================================================================
-// name : SMESHGUI_PrecisionDlg::createButtonFrame
-// Purpose : Create frame containing buttons
-//=======================================================================
-QFrame* SMESHGUI_PrecisionDlg::createButtonFrame (QWidget* theParent)
-{
- QGroupBox* aGrp = new QGroupBox (1, Qt::Vertical, theParent);
- aGrp->setFrameStyle(QFrame::NoFrame);
- aGrp->setInsideMargin(0);
-
- myOKBtn = new QPushButton (tr("SMESH_BUT_OK"), aGrp);
-
- QLabel* aLbl = new QLabel (aGrp);
- aLbl->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed));
-
- myCancelBtn = new QPushButton (tr("SMESH_BUT_CANCEL"), aGrp);
-
- connect(myOKBtn, SIGNAL(clicked()), SLOT(onOk()));
- connect(myCancelBtn, SIGNAL(clicked()), SLOT(onClose()));
-
- return aGrp;
-}
-
-//=======================================================================
-// name : SMESHGUI_PrecisionDlg:: createMainFrame
-// Purpose : Create frame containing dialog's input fields
-//=======================================================================
-QFrame* SMESHGUI_PrecisionDlg::createMainFrame (QWidget* theParent)
-{
- QGroupBox* aGrp = new QGroupBox(2, Qt::Horizontal, theParent);
- new QLabel (tr("PRECISION"), aGrp);
- mySpinBox = new QSpinBox (0, RANGE, 1, aGrp);
- myNotUseChk = new QCheckBox (tr("NOT_USE"), aGrp);
-
- connect(myNotUseChk, SIGNAL(toggled(bool)), SLOT(onNotUse()));
-
- return aGrp;
-}
-
-//=======================================================================
-// name : SMESHGUI_PrecisionDlg::Init
-// Purpose : Initialize dialog fields
-//=======================================================================
-void SMESHGUI_PrecisionDlg::Init()
-{
- bool isOk = false;
- int aVal = DEFAULT_VAL;
- SUIT_ResourceMgr* mgr = SMESH::GetResourceMgr( mySMESHGUI );
- if (mgr && mgr->hasValue("SMESH", "controls_precision")) {
- QString aStr = mgr->stringValue("SMESH", "controls_precision");
- aVal = aStr.toInt(&isOk);
- }
-
- mySpinBox->setValue(isOk ? aVal : DEFAULT_VAL);
- myNotUseChk->setChecked(!isOk);
-
- onNotUse();
-
- mySMESHGUI->SetActiveDialogBox((QDialog*)this);
- connect(mySMESHGUI, SIGNAL(SignalCloseAllDialogs()), SLOT(onClose()));
-}
-
-//=======================================================================
-// name : SMESHGUI_PrecisionDlg::onOk
-// Purpose : SLOT. Called when OK button pressed
-//=======================================================================
-void SMESHGUI_PrecisionDlg::onOk()
-{
- SUIT_ResourceMgr* mgr = SMESH::GetResourceMgr( mySMESHGUI );
- if (myNotUseChk->isChecked()) {
- if (mgr) {
- mgr->remove("SMESH", "controls_precision");
- }
- SMESH::SetControlsPrecision(-1);
- } else {
- mySpinBox->clearFocus();
- int aVal = mySpinBox->value();
- if (mgr) {
- mgr->setValue("SMESH", "controls_precision", QString("%1").arg(aVal));
- }
- SMESH::SetControlsPrecision(aVal);
- }
-
- disconnect(mySMESHGUI, 0, this, 0);
- mySMESHGUI->ResetState() ;
- accept();
-}
-
-//=======================================================================
-// name : SMESHGUI_PrecisionDlg::onClose
-// Purpose : SLOT. Called when "Cancel" button pressed
-//=======================================================================
-void SMESHGUI_PrecisionDlg::onClose()
-{
- disconnect( mySMESHGUI, 0, this, 0);
- reject();
-}
-
-//=======================================================================
-// name : SMESHGUI_PrecisionDlg::closeEvent
-// Purpose :
-//=======================================================================
-void SMESHGUI_PrecisionDlg::closeEvent (QCloseEvent*)
-{
- onClose();
-}
-
-//=======================================================================
-// name : SMESHGUI_PrecisionDlg::onNotUse
-// Purpose : SLOT. Called when state of "Do not use" check box changed
-//=======================================================================
-void SMESHGUI_PrecisionDlg::onNotUse()
-{
- mySpinBox->setEnabled(!myNotUseChk->isChecked());
-}
+++ /dev/null
-// SMESH SMESHGUI : GUI for SMESH component
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESHGUI_PrecisionDlg.h
-// Author : Sergey LITONIN
-// Module : SMESH
-
-
-#ifndef SMESHGUI_PrecisionDlg_H
-#define SMESHGUI_PrecisionDlg_H
-
-#include <qdialog.h>
-
-class QSpinBox;
-class QPushButton;
-class QCheckBox;
-class QFrame;
-class SMESHGUI;
-
-/*
- Class : SMESHGUI_PrecisionDlg
- Description : Dialog to specify precision of mesh quality controls
-*/
-
-class SMESHGUI_PrecisionDlg : public QDialog
-{
- Q_OBJECT
-
-public:
- SMESHGUI_PrecisionDlg( SMESHGUI* );
-
- virtual ~SMESHGUI_PrecisionDlg();
-
- void Init();
-
-private slots:
-
- void onOk();
- void onClose();
- void onNotUse();
-
-private:
-
- QFrame* createButtonFrame( QWidget* );
- QFrame* createMainFrame( QWidget* );
- void closeEvent( QCloseEvent* );
-
-private:
- SMESHGUI* mySMESHGUI;
- QSpinBox* mySpinBox;
- QPushButton* myOKBtn;
- QPushButton* myCancelBtn;
- QCheckBox* myNotUseChk;
-
-};
-
-#endif
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+++ /dev/null
-// SMESH SMESHGUI : GUI for SMESH component
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESHGUI_Preferences_ColorDlg.cxx
-// Author : Nicolas REJNERI
-// Module : SMESH
-// $Header$
-
-#include "SMESHGUI_Preferences_ColorDlg.h"
-#include "SMESHGUI.h"
-#include "SMESHGUI_Utils.h"
-
-#include "utilities.h"
-
-// QT Includes
-#include <qbuttongroup.h>
-#include <qcheckbox.h>
-#include <qcombobox.h>
-#include <qframe.h>
-#include <qlabel.h>
-#include <qpixmap.h>
-#include <qpushbutton.h>
-#include <qlayout.h>
-#include <qcolordialog.h>
-#include <qspinbox.h>
-#include <qcolor.h>
-
-#include "SUIT_Desktop.h"
-
-using namespace std;
-
-//=================================================================================
-// function : SMESHGUI_Preferences_ColorDlg()
-// purpose : Constructs a SMESHGUI_Preferences_ColorDlg 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.
-//=================================================================================
-SMESHGUI_Preferences_ColorDlg::SMESHGUI_Preferences_ColorDlg( SMESHGUI* theModule, const char* name)
- : QDialog( SMESH::GetDesktop( theModule ), name, true, WStyle_Customize |
- WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu ),
- mySMESHGUI( theModule )
-{
- if (!name)
- setName("SMESHGUI_Preferences_ColorDlg");
- setCaption(tr("Preferences - Set Color"));
- setSizeGripEnabled(TRUE);
- QGridLayout* SMESHGUI_Preferences_ColorDlgLayout = new QGridLayout(this);
- SMESHGUI_Preferences_ColorDlgLayout->setSpacing(6);
- SMESHGUI_Preferences_ColorDlgLayout->setMargin(11);
-
- ButtonGroup1 = new QButtonGroup(tr("Elements"), this, "ButtonGroup1");
- ButtonGroup1->setColumnLayout(0, Qt::Vertical);
- ButtonGroup1->layout()->setSpacing(0);
- ButtonGroup1->layout()->setMargin(0);
- QGridLayout* ButtonGroup1Layout = new QGridLayout(ButtonGroup1->layout());
- ButtonGroup1Layout->setAlignment(Qt::AlignTop);
- ButtonGroup1Layout->setSpacing(6);
- ButtonGroup1Layout->setMargin(11);
-
- TextLabel_Fill = new QLabel(tr("Fill"), ButtonGroup1, "TextLabel_2D_Fill");
- ButtonGroup1Layout->addWidget(TextLabel_Fill, 0, 0);
-
- btnFillColor = new QPushButton(ButtonGroup1, "btnFillColor");
- btnFillColor->setFixedSize(QSize(25, 25));
- ButtonGroup1Layout->addWidget(btnFillColor, 0, 1);
-
- TextLabel_Outine = new QLabel(tr("Outline"), ButtonGroup1, "TextLabel_2D_Outine");
- ButtonGroup1Layout->addWidget(TextLabel_Outine, 0, 2);
-
- btnOutlineColor = new QPushButton(ButtonGroup1, "btnOutlineColor");
- btnOutlineColor->setFixedSize(QSize(25, 25));
- ButtonGroup1Layout->addWidget(btnOutlineColor, 0, 3);
-
- TextLabel_Width = new QLabel(tr("Width"), ButtonGroup1, "TextLabel_2D_Width");
- ButtonGroup1Layout->addWidget(TextLabel_Width, 0, 4);
-
- SpinBox_Width = new QSpinBox(0, 5, 1, ButtonGroup1, "SpinBox_Width");
- SpinBox_Width->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed));
- SpinBox_Width->setWrapping(FALSE);
- SpinBox_Width->setButtonSymbols(QSpinBox::PlusMinus);
- ButtonGroup1Layout->addWidget(SpinBox_Width, 0, 5);
-
- TextLabel_BackFace = new QLabel(tr("Back Face"), ButtonGroup1, "TextLabel_BackFace");
- ButtonGroup1Layout->addWidget(TextLabel_BackFace, 1, 0);
-
- btnBackFaceColor = new QPushButton(ButtonGroup1, "btnBackFaceColor");
- btnBackFaceColor->setFixedSize(QSize(25, 25));
- ButtonGroup1Layout->addWidget(btnBackFaceColor, 1, 1);
-
- TextLabel_ShrinkCoeff = new QLabel(tr("Shrink coef."), ButtonGroup1, "TextLabel_ShrinkCoeff");
- ButtonGroup1Layout->addWidget(TextLabel_ShrinkCoeff, 2, 0);
-
- SpinBox_Shrink = new QSpinBox(20, 100, 1, ButtonGroup1, "SpinBox_Shrink");
- SpinBox_Shrink->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed));
- SpinBox_Shrink->setButtonSymbols(QSpinBox::PlusMinus);
- ButtonGroup1Layout->addMultiCellWidget(SpinBox_Shrink, 2, 2, 1, 5);
-
- SMESHGUI_Preferences_ColorDlgLayout->addWidget(ButtonGroup1, 0, 0);
-
- ButtonGroup2 = new QButtonGroup(tr("Nodes"), this, "ButtonGroup2");
- ButtonGroup2->setColumnLayout(0, Qt::Vertical);
- ButtonGroup2->layout()->setSpacing(0);
- ButtonGroup2->layout()->setMargin(0);
- QGridLayout* ButtonGroup2Layout = new QGridLayout(ButtonGroup2->layout());
- ButtonGroup2Layout->setAlignment(Qt::AlignTop);
- ButtonGroup2Layout->setSpacing(6);
- ButtonGroup2Layout->setMargin(11);
-
- TextLabel_Nodes_Color = new QLabel(tr("Color"), ButtonGroup2, "TextLabel_Nodes_Color");
- ButtonGroup2Layout->addWidget(TextLabel_Nodes_Color, 0, 0);
-
- btnNodeColor = new QPushButton(ButtonGroup2, "btnNodeColor");
- btnNodeColor->setFixedSize(QSize(25, 25));
- ButtonGroup2Layout->addWidget(btnNodeColor, 0, 1);
-
- TextLabel_Nodes_Size = new QLabel(tr("Size"), ButtonGroup2, "TextLabel_Nodes_Size");
- ButtonGroup2Layout->addWidget(TextLabel_Nodes_Size, 0, 2);
-
- SpinBox_Nodes_Size = new QSpinBox(0, 5, 1, ButtonGroup2, "SpinBox_Nodes_Size");
- SpinBox_Nodes_Size->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed));
- SpinBox_Nodes_Size->setWrapping(FALSE);
- SpinBox_Nodes_Size->setButtonSymbols(QSpinBox::PlusMinus);
- ButtonGroup2Layout->addWidget(SpinBox_Nodes_Size, 0, 3);
-
- SMESHGUI_Preferences_ColorDlgLayout->addWidget(ButtonGroup2, 1, 0);
-
- GroupButtons = new QButtonGroup(this, "GroupButtons");
- GroupButtons->setColumnLayout(0, Qt::Vertical);
- GroupButtons->layout()->setSpacing(0);
- GroupButtons->layout()->setMargin(0);
- QGridLayout* GroupButtonsLayout = new QGridLayout(GroupButtons->layout());
- GroupButtonsLayout->setAlignment(Qt::AlignTop);
- GroupButtonsLayout->setSpacing(6);
- GroupButtonsLayout->setMargin(11);
-
- buttonOk = new QPushButton(tr("&OK"), GroupButtons, "buttonOk");
- buttonOk->setAutoDefault(TRUE);
- buttonOk->setDefault(TRUE);
- GroupButtonsLayout->addWidget(buttonOk, 0, 0);
-
- GroupButtonsLayout->addItem(new QSpacerItem(20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum), 0, 1);
-
- buttonCancel = new QPushButton(tr("&Cancel"), GroupButtons, "buttonCancel");
- buttonCancel->setAutoDefault(TRUE);
- GroupButtonsLayout->addWidget(buttonCancel, 0, 2);
-
- SMESHGUI_Preferences_ColorDlgLayout->addWidget(GroupButtons, 2, 0);
-
- Init();
-}
-
-//=================================================================================
-// function : ~SMESHGUI_Preferences_ColorDlg()
-// purpose : Destructor
-//=================================================================================
-SMESHGUI_Preferences_ColorDlg::~SMESHGUI_Preferences_ColorDlg()
-{
- // no need to delete child widgets, Qt does it all for us
-}
-
-//=================================================================================
-// function : Init()
-// purpose :
-//=================================================================================
-void SMESHGUI_Preferences_ColorDlg::Init()
-{
- mySMESHGUI->SetActiveDialogBox((QDialog*)this);
-
- /* signals and slots connections */
- connect(buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk()));
- connect(buttonCancel, SIGNAL(clicked()), this, SLOT(ClickOnCancel()));
-
- connect(btnFillColor, SIGNAL(clicked()), this, SLOT(SelectFillColor()));
- connect(btnOutlineColor, SIGNAL(clicked()), this, SLOT(SelectOutlineColor()));
- connect(btnNodeColor, SIGNAL(clicked()), this, SLOT(SelectNodeColor()));
- connect(btnBackFaceColor, SIGNAL(clicked()), this, SLOT(SelectBackFaceColor()));
-
- connect(mySMESHGUI, SIGNAL (SignalDeactivateActiveDialog()), this, SLOT(DeactivateActiveDialog()));
- /* to close dialog if study change */
- connect(mySMESHGUI, SIGNAL (SignalCloseAllDialogs()), this, SLOT(ClickOnCancel()));
-
- /* Move widget on the botton right corner of main widget */
- int x, y;
- mySMESHGUI->DefineDlgPosition(this, x, y);
- this->move(x, y);
-}
-
-//=================================================================================
-// function : SelectFillColor()
-// purpose :
-//=================================================================================
-void SMESHGUI_Preferences_ColorDlg::SelectFillColor()
-{
- QColor color = btnFillColor->palette().active().button();
- color = QColorDialog::getColor(color);
- if (color.isValid()) {
- QPalette pal = btnFillColor->palette();
- pal.setColor(QColorGroup::Button, color);
- btnFillColor->setPalette(pal);
- }
-}
-
-//=================================================================================
-// function : SelectBackFaceColor()
-// purpose :
-//=================================================================================
-void SMESHGUI_Preferences_ColorDlg::SelectBackFaceColor()
-{
- QColor color = btnBackFaceColor->palette().active().button();
- color = QColorDialog::getColor(color);
- if (color.isValid()) {
- QPalette pal = btnBackFaceColor->palette();
- pal.setColor(QColorGroup::Button, color);
- btnBackFaceColor->setPalette(pal);
- }
-}
-
-//=================================================================================
-// function : SelectOutlineColor()
-// purpose :
-//=================================================================================
-void SMESHGUI_Preferences_ColorDlg::SelectOutlineColor()
-{
- QColor color = btnOutlineColor->palette().active().button();
- color = QColorDialog::getColor(color);
- if (color.isValid()) {
- QPalette pal = btnOutlineColor->palette();
- pal.setColor(QColorGroup::Button, color);
- btnOutlineColor->setPalette(pal);
- }
-}
-
-//=================================================================================
-// function : SelectNodeColor()
-// purpose :
-//=================================================================================
-void SMESHGUI_Preferences_ColorDlg::SelectNodeColor()
-{
- QColor color = btnNodeColor->palette().active().button();
- color = QColorDialog::getColor(color);
- if (color.isValid()) {
- QPalette pal = btnNodeColor->palette();
- pal.setColor(QColorGroup::Button, color);
- btnNodeColor->setPalette(pal);
- }
-}
-
-//=================================================================================
-// function : ClickOnOk()
-// purpose :
-//=================================================================================
-void SMESHGUI_Preferences_ColorDlg::ClickOnOk()
-{
- mySMESHGUI->ResetState();
- accept();
-}
-
-//=================================================================================
-// function : ClickOnCancel()
-// purpose :
-//=================================================================================
-void SMESHGUI_Preferences_ColorDlg::ClickOnCancel()
-{
- mySMESHGUI->ResetState();
- reject();
-}
-
-//=================================================================================
-// function : DeactivateActiveDialog()
-// purpose :
-//=================================================================================
-void SMESHGUI_Preferences_ColorDlg::DeactivateActiveDialog()
-{
-}
-
-//=================================================================================
-// function : closeEvent()
-// purpose :
-//=================================================================================
-void SMESHGUI_Preferences_ColorDlg::closeEvent (QCloseEvent*)
-{
- this->ClickOnCancel(); /* same than click on cancel button */
-}
-
-//=================================================================================
-// function : ActivateThisDialog()
-// purpose :
-//=================================================================================
-void SMESHGUI_Preferences_ColorDlg::ActivateThisDialog()
-{
- /* Emit a signal to deactivate any active dialog */
- mySMESHGUI->EmitSignalDeactivateDialog();
-}
-
-//=================================================================================
-// function : SetColor()
-// purpose :
-//=================================================================================
-void SMESHGUI_Preferences_ColorDlg::SetColor (int type, QColor color)
-{
- switch (type) {
- case 1 : // fill
- {
- QPalette pal = btnFillColor->palette();
- pal.setColor(QColorGroup::Button, color);
- btnFillColor->setPalette(pal);
- break;
- }
- case 2 : // outline
- {
- QPalette pal = btnOutlineColor->palette();
- pal.setColor(QColorGroup::Button, color);
- btnOutlineColor->setPalette(pal);
- break;
- }
- case 3 : // node
- {
- QPalette pal = btnNodeColor->palette();
- pal.setColor(QColorGroup::Button, color);
- btnNodeColor->setPalette(pal);
- break;
- }
- case 4 : // back face
- {
- QPalette pal = btnBackFaceColor->palette();
- pal.setColor(QColorGroup::Button, color);
- btnBackFaceColor->setPalette(pal);
- break;
- }
- }
-}
-
-//=================================================================================
-// function : GetColor()
-// purpose :
-//=================================================================================
-QColor SMESHGUI_Preferences_ColorDlg::GetColor (int type)
-{
- QColor color;
- switch (type) {
- case 1 : color = btnFillColor->palette().active().button(); break; // fill
- case 2 : color = btnOutlineColor->palette().active().button(); break; // outline
- case 3 : color = btnNodeColor->palette().active().button(); break; // node
- case 4 : color = btnBackFaceColor->palette().active().button(); break; // back face
- }
- return color;
-}
-
-//=================================================================================
-// function : SetIntValue()
-// purpose :
-//=================================================================================
-void SMESHGUI_Preferences_ColorDlg::SetIntValue (int type, int value)
-{
- switch (type) {
- case 1 : SpinBox_Width->setValue(value); break; // width
- case 2 : SpinBox_Nodes_Size->setValue(value); break; // nodes size = value; break;
- case 3 : SpinBox_Shrink->setValue(value); break; // shrink coeff
- }
-}
-
-//=================================================================================
-// function : GetIntValue()
-// purpose :
-//=================================================================================
-int SMESHGUI_Preferences_ColorDlg::GetIntValue (int type)
-{
- int res = 0;
- switch (type) {
- case 1 : res = SpinBox_Width->value(); break; // width
- case 2 : res = SpinBox_Nodes_Size->value(); break; // nodes size
- case 3 : res = SpinBox_Shrink->value(); break; // shrink coeff
- }
- return res;
-}
+++ /dev/null
-// SMESH SMESHGUI : GUI for SMESH component
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESHGUI_Preferences_ColorDlg.h
-// Author : Nicolas REJNERI
-// Module : SMESH
-// $Header$
-
-#ifndef SMESHGUI_PREFERENCES_COLORDLG_H
-#define SMESHGUI_PREFERENCES_COLORDLG_H
-
-// SALOME Includes
-//#include "SUIT_Config.h"
-//#include "SUIT_Settings.h"
-
-// IDL Headers
-#include <SALOMEconfig.h>
-#include CORBA_SERVER_HEADER(SMESH_Gen)
-
-// QT Includes
-#include <qdialog.h>
-
-class QButtonGroup;
-class QFrame;
-class QLabel;
-class QPushButton;
-class QSpinBox;
-class QColor;
-class SMESHGUI;
-
-class SMESHGUI_Preferences_ColorDlg : public QDialog
-{
- Q_OBJECT
-
-public:
- SMESHGUI_Preferences_ColorDlg( SMESHGUI*, const char* name = 0 );
- ~SMESHGUI_Preferences_ColorDlg();
-
- void SetColor(int type, QColor color);
- QColor GetColor(int type);
- void SetIntValue(int type, int value);
- int GetIntValue(int type);
-
-private:
- void closeEvent( QCloseEvent* e ) ;
- void Init();
-
-private slots:
-// void RadioButtonClicked(int radioButtonId);
- void ClickOnOk();
- void ClickOnCancel();
- void DeactivateActiveDialog() ;
- void ActivateThisDialog() ;
-
- void SelectFillColor();
- void SelectBackFaceColor();
- void SelectOutlineColor();
- void SelectNodeColor();
-
-private:
- SMESH::SMESH_Gen_var myCompMesh ;
- SMESHGUI* mySMESHGUI ;
-
- QButtonGroup* ButtonGroup1;
- QLabel* TextLabel_Fill;
- QPushButton* btnFillColor;
- QLabel* TextLabel_Outine;
- QPushButton* btnOutlineColor;
- QLabel* TextLabel_Width;
- QSpinBox* SpinBox_Width;
- QLabel* TextLabel_BackFace;
- QPushButton* btnBackFaceColor;
- QLabel* TextLabel_ShrinkCoeff;
- QSpinBox* SpinBox_Shrink;
- QButtonGroup* ButtonGroup2;
- QLabel* TextLabel_Nodes_Color;
- QPushButton* btnNodeColor;
- QLabel* TextLabel_Nodes_Size;
- QSpinBox* SpinBox_Nodes_Size;
- QButtonGroup* GroupButtons;
- QPushButton* buttonOk;
- QPushButton* buttonCancel;
-};
-
-#endif // SMESHGUI_PREFERENCES_COLORDLG_H
+++ /dev/null
-// SMESH SMESHGUI : GUI for SMESH component
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.salome-platform.org or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESHGUI_Preferences_SelectionDlg.cxx
-// Author : Natalia KOPNOVA
-// Module : SMESH
-// $Header$
-
-#include "SMESHGUI_Preferences_SelectionDlg.h"
-#include "SMESHGUI.h"
-
-#include "SMESHGUI_Utils.h"
-
-#include "SUIT_Desktop.h"
-
-#include <qgroupbox.h>
-#include <qlayout.h>
-#include <qlabel.h>
-#include <qlineedit.h>
-#include <qvalidator.h>
-#include <qspinbox.h>
-#include <qpushbutton.h>
-#include <qpalette.h>
-#include <qcolordialog.h>
-
-using namespace std;
-
-//=================================================================================
-// class : SMESHGUI_LineEdit
-// purpose :
-//=================================================================================
-SMESHGUI_LineEdit::SMESHGUI_LineEdit(QWidget* parent, const char *name)
- : QLineEdit(parent, name)
-{
-}
-
-SMESHGUI_LineEdit::SMESHGUI_LineEdit(const QString& text, QWidget* parent, const char *name)
- : QLineEdit(text, parent, name)
-{
-}
-
-void SMESHGUI_LineEdit::focusOutEvent(QFocusEvent* e)
-{
- const QValidator* aVal = validator();
- QString aText = text();
- int aCurPos = cursorPosition();
- if (aVal && aVal->validate(aText, aCurPos) != QValidator::Acceptable) {
- QString aValid = aText;
- aVal->fixup(aValid);
- if (aText != aValid) {
- setText(aValid);
- update();
- return;
- }
- }
- QLineEdit::focusOutEvent(e);
-}
-
-
-//=================================================================================
-// class : SMESHGUI_DoubleValidator
-// purpose :
-//=================================================================================
-SMESHGUI_DoubleValidator::SMESHGUI_DoubleValidator(QObject * parent, const char *name)
- : QDoubleValidator(parent, name)
-{
-}
-
-SMESHGUI_DoubleValidator::SMESHGUI_DoubleValidator(double bottom, double top, int decimals,
- QObject * parent, const char *name)
- : QDoubleValidator(bottom, top, decimals, parent, name)
-{
-}
-
-void SMESHGUI_DoubleValidator::fixup(QString& theText) const
-{
- bool ok;
- double aValue = theText.toDouble(&ok);
- if (ok) {
- if (aValue < bottom())
- theText = QString::number(bottom(), 'g', decimals());
- if (aValue > top())
- theText = QString::number(top(), 'g', decimals());
- }
-}
-
-
-//=================================================================================
-// class : SMESHGUI_Preferences_SelectionDlg()
-// purpose :
-//=================================================================================
-SMESHGUI_Preferences_SelectionDlg::SMESHGUI_Preferences_SelectionDlg( SMESHGUI* theModule, const char* name )
- : QDialog( SMESH::GetDesktop( theModule ), name, true, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu ),
- mySMESHGUI( theModule )
-{
- if ( !name ) setName( "SMESHGUI_Preferences_SelectionDlg" );
- setCaption( tr( "SMESH_PREF_SELECTION" ) );
-
- QVBoxLayout* aMainLayout = new QVBoxLayout(this, 11, 6);
- QLabel* aLabel;
-
- /***************************************************************/
- QGroupBox* aSelectBox = new QGroupBox(4, Qt::Horizontal, this, "selection");
- aSelectBox->setTitle(tr("SMESH_SELECTION"));
-
- aLabel = new QLabel(aSelectBox, "selection color label");
- aLabel->setText(tr("SMESH_OUTLINE_COLOR"));
- myColor[2] = new QPushButton(aSelectBox, "outline color");
- myColor[2]->setFixedSize(QSize(25, 25));
-
- aSelectBox->addSpace(0);
- aSelectBox->addSpace(0);
-
- aLabel = new QLabel(aSelectBox, "selection color label");
- aLabel->setText(tr("SMESH_ELEMENTS_COLOR"));
- myColor[1] = new QPushButton(aSelectBox, "elements color");
- myColor[1]->setFixedSize(QSize(25, 25));
-
- aLabel = new QLabel(aSelectBox, "selection width label");
- aLabel->setText(tr("SMESH_WIDTH"));
- myWidth[1] = new QSpinBox(0, 5, 1, aSelectBox, "selection width");
- myWidth[1]->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed));
- myWidth[1]->setButtonSymbols(QSpinBox::PlusMinus);
- myWidth[1]->setMinimumWidth(50);
-
- /***************************************************************/
- QGroupBox* aPreSelectBox = new QGroupBox(1, Qt::Vertical, this, "preselection");
- aPreSelectBox->setTitle(tr("SMESH_PRESELECTION"));
-
- aLabel = new QLabel(aPreSelectBox, "preselection color label");
- aLabel->setText(tr("SMESH_HILIGHT_COLOR"));
- myColor[0] = new QPushButton(aPreSelectBox, "preselection color");
- myColor[0]->setFixedSize(QSize(25, 25));
-
- aLabel = new QLabel(aPreSelectBox, "preselection width label");
- aLabel->setText(tr("SMESH_WIDTH"));
- myWidth[0] = new QSpinBox(0, 5, 1, aPreSelectBox, "preselection width");
- myWidth[0]->setSizePolicy(QSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed));
- myWidth[0]->setButtonSymbols(QSpinBox::PlusMinus);
- myWidth[0]->setMinimumWidth(50);
-
- /***************************************************************/
- QGroupBox* aPrecisionBox = new QGroupBox(1, Qt::Vertical, this, "preselection");
- aPrecisionBox->setTitle(tr("SMESH_PRECISION"));
- QDoubleValidator* aValidator = new SMESHGUI_DoubleValidator(aPrecisionBox);
- aValidator->setBottom(0.001);
- aValidator->setDecimals(6);
-
- aLabel = new QLabel(aPrecisionBox, "node tol label");
- aLabel->setText(tr("SMESH_NODES"));
- myPrecision[0] = new SMESHGUI_LineEdit(aPrecisionBox, "node precision");
- myPrecision[0]->setValidator(aValidator);
-
- aLabel = new QLabel(aPrecisionBox, "item tol label");
- aLabel->setText(tr("SMESH_ELEMENTS"));
- myPrecision[1] = new SMESHGUI_LineEdit(aPrecisionBox, "item precision");
- myPrecision[1]->setValidator(aValidator);
-
- /***************************************************************/
- QFrame* aButtons = new QFrame(this, "button box");
- aButtons->setFrameStyle(QFrame::Box | QFrame::Sunken);
- QHBoxLayout* aBtnLayout = new QHBoxLayout(aButtons, 11, 6);
- aBtnLayout->setAutoAdd(false);
-
- QPushButton* aOKBtn = new QPushButton(aButtons, "ok");
- aOKBtn->setText(tr("SMESH_BUT_OK"));
- aOKBtn->setAutoDefault(true);
- aOKBtn->setDefault(true);
- QPushButton* aCloseBtn = new QPushButton(aButtons, "close");
- aCloseBtn->setText(tr("SMESH_BUT_CLOSE"));
- aCloseBtn->setAutoDefault(true);
-
- aBtnLayout->addWidget(aOKBtn);
- aBtnLayout->addStretch();
- aBtnLayout->addWidget(aCloseBtn);
-
- /***************************************************************/
- aMainLayout->addWidget(aSelectBox);
- aMainLayout->addWidget(aPreSelectBox);
- aMainLayout->addWidget(aPrecisionBox);
- aMainLayout->addWidget(aButtons);
-
- for (int i = 0; i < 3; i++)
- connect(myColor[i], SIGNAL(clicked()), this, SLOT(onSelectColor()));
-
- connect(aOKBtn, SIGNAL(clicked()), this, SLOT(accept()));
- connect(aCloseBtn, SIGNAL(clicked()), this, SLOT(reject()));
-
- /* Move widget on the botton right corner of main widget */
- int x, y ;
- mySMESHGUI->DefineDlgPosition(this, x, y);
- this->move(x, y);
-}
-
-//=================================================================================
-// function : ~SMESHGUI_Preferences_SelectionDlg()
-// purpose : Destroys the object and frees any allocated resources
-//=================================================================================
-SMESHGUI_Preferences_SelectionDlg::~SMESHGUI_Preferences_SelectionDlg()
-{
- // no need to delete child widgets, Qt does it all for us
-}
-
-//=================================================================================
-// function : closeEvent()
-// purpose :
-//=================================================================================
-void SMESHGUI_Preferences_SelectionDlg::closeEvent( QCloseEvent* e )
-{
- reject();
-}
-
-//=================================================================================
-// function : onSelectColor()
-// purpose :
-//=================================================================================
-void SMESHGUI_Preferences_SelectionDlg::onSelectColor()
-{
- QPushButton* aSender = (QPushButton*)sender();
- QColor aColor = aSender->palette().active().button();
- aColor = QColorDialog::getColor(aColor, this);
- if (aColor.isValid()) {
- QPalette aPal = aSender->palette();
- aPal.setColor(QColorGroup::Button, aColor);
- aSender->setPalette(aPal);
- }
-}
-
-//=================================================================================
-// function : SetColor()
-// purpose :
-//=================================================================================
-void SMESHGUI_Preferences_SelectionDlg::SetColor(int type, QColor color)
-{
- if (type > 0 && type <= 3) {
- QPalette aPal = myColor[type-1]->palette();
- aPal.setColor(QColorGroup::Button, color);
- myColor[type-1]->setPalette(aPal);
- }
-}
-
-//=================================================================================
-// function : GetColor()
-// purpose :
-//=================================================================================
-QColor SMESHGUI_Preferences_SelectionDlg::GetColor(int type)
-{
- QColor aColor;
- if (type > 0 && type <= 3)
- aColor = myColor[type-1]->palette().active().button();
- return aColor;
-}
-
-//=================================================================================
-// function : SetWidth()
-// purpose :
-//=================================================================================
-void SMESHGUI_Preferences_SelectionDlg::SetWidth(int type, int value)
-{
- if (type > 0 && type <= 2)
- myWidth[type-1]->setValue(value);
-}
-
-//=================================================================================
-// function : GetWidth()
-// purpose :
-//=================================================================================
-int SMESHGUI_Preferences_SelectionDlg::GetWidth(int type)
-{
- if (type > 0 && type <= 2)
- return myWidth[type-1]->value();
- return 0;
-}
-
-//=================================================================================
-// function : SetPrecision()
-// purpose :
-//=================================================================================
-void SMESHGUI_Preferences_SelectionDlg::SetPrecision(int type, double value)
-{
- if (type > 0 && type <= 2)
- myPrecision[type-1]->setText(QString::number(value));
-}
-
-//=================================================================================
-// function : GetPrecision()
-// purpose :
-//=================================================================================
-double SMESHGUI_Preferences_SelectionDlg::GetPrecision(int type)
-{
- if (type > 0 && type <= 2)
- return myPrecision[type-1]->text().toDouble();
- return 0;
-}
+++ /dev/null
-// SMESH SMESHGUI : GUI for SMESH component
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.salome-platorm.org or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESHGUI_Preferences_SelectionDlg.h
-// Author : Natalia KOPNOVA
-// Module : SMESH
-// $Header$
-
-#ifndef SMESHGUI_PREFERENCES_SELECTIONDLG_H
-#define SMESHGUI_PREFERENCES_SELECTIONDLG_H
-
-
-// QT Includes
-#include <qdialog.h>
-#include <qlineedit.h>
-#include <qvalidator.h>
-
-class QPushButton;
-class QSpinBox;
-class QColor;
-class SMESHGUI;
-
-class SMESHGUI_LineEdit : public QLineEdit
-{
- Q_OBJECT
-
- public:
- SMESHGUI_LineEdit(QWidget* parent, const char* name = 0);
- SMESHGUI_LineEdit(const QString& text, QWidget* parent, const char* name = 0);
-
- ~SMESHGUI_LineEdit() {};
-
- protected:
- void focusOutEvent(QFocusEvent* e);
-};
-
-class SMESHGUI_DoubleValidator : public QDoubleValidator
-{
- Q_OBJECT
-
- public:
- SMESHGUI_DoubleValidator(QObject* parent, const char* name = 0);
- SMESHGUI_DoubleValidator(double bottom, double top, int decimals,
- QObject* parent, const char* name = 0);
-
- ~SMESHGUI_DoubleValidator() {};
-
- void fixup(QString& text) const;
-};
-
-class SMESHGUI_Preferences_SelectionDlg : public QDialog
-{
- Q_OBJECT
-
-public:
- SMESHGUI_Preferences_SelectionDlg( SMESHGUI*, const char* name = 0 );
- ~SMESHGUI_Preferences_SelectionDlg();
-
- void SetColor(int type, QColor color);
- QColor GetColor(int type);
- void SetWidth(int type, int value);
- int GetWidth(int type);
- void SetPrecision(int type, double value);
- double GetPrecision(int type);
-
-private:
- void closeEvent( QCloseEvent* e ) ;
-
-private slots:
- void onSelectColor();
-
-private:
- SMESHGUI* mySMESHGUI;
- QPushButton* myColor[3];
- QSpinBox* myWidth[2];
- QLineEdit* myPrecision[2];
-};
-
-#endif // SMESHGUI_PREFERENCES_SELECTIONDLG_H
+++ /dev/null
-// SMESH SMESHGUI : GUI for SMESH component
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESHGUI_RemoveElementsDlg.cxx
-// Author : Nicolas REJNERI
-// Module : SMESH
-// $Header$
-
-#include "SMESHGUI_RemoveElementsDlg.h"
-
-#include "SMESHGUI.h"
-#include "SMESHGUI_Utils.h"
-#include "SMESHGUI_VTKUtils.h"
-#include "SMESHGUI_MeshUtils.h"
-#include "SMESHGUI_IdValidator.h"
-
-#include "SMESH_Actor.h"
-#include "SMDS_Mesh.hxx"
-
-#include "SUIT_ResourceMgr.h"
-#include "SUIT_Desktop.h"
-
-#include "SVTK_Selector.h"
-#include "SVTK_ViewModel.h"
-#include "SVTK_ViewWindow.h"
-#include "SALOME_ListIO.hxx"
-
-#include "utilities.h"
-
-// OCCT Includes
-#include <TColStd_MapOfInteger.hxx>
-#include <TColStd_IndexedMapOfInteger.hxx>
-
-// QT Includes
-#include <qbuttongroup.h>
-#include <qgroupbox.h>
-#include <qlabel.h>
-#include <qlineedit.h>
-#include <qpushbutton.h>
-#include <qradiobutton.h>
-#include <qlayout.h>
-#include <qvariant.h>
-#include <qtooltip.h>
-#include <qwhatsthis.h>
-#include <qimage.h>
-#include <qpixmap.h>
-
-using namespace std;
-
-//=================================================================================
-// class : SMESHGUI_RemoveElementsDlg()
-// purpose :
-//=================================================================================
-SMESHGUI_RemoveElementsDlg
-::SMESHGUI_RemoveElementsDlg (SMESHGUI* theModule,
- const char* name,
- bool modal,
- WFlags fl)
- : QDialog(SMESH::GetDesktop(theModule),
- name,
- modal,
- WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu | Qt::WDestructiveClose),
- mySelector(SMESH::GetViewWindow(theModule)->GetSelector()),
- mySelectionMgr(SMESH::GetSelectionMgr(theModule)),
- mySMESHGUI(theModule),
- myBusy(false)
-{
- QPixmap image0 (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_DLG_REM_ELEMENT")));
- QPixmap image1 (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_SELECT")));
-
- if (!name)
- setName("SMESHGUI_RemoveElementsDlg");
- resize(303, 185);
- setCaption(tr("SMESH_REMOVE_ELEMENTS_TITLE"));
- setSizeGripEnabled(TRUE);
- SMESHGUI_RemoveElementsDlgLayout = new QGridLayout(this);
- SMESHGUI_RemoveElementsDlgLayout->setSpacing(6);
- SMESHGUI_RemoveElementsDlgLayout->setMargin(11);
-
- /***************************************************************/
- GroupConstructors = new QButtonGroup(this, "GroupConstructors");
- GroupConstructors->setTitle(tr("SMESH_ELEMENTS" ));
- GroupConstructors->setExclusive(TRUE);
- GroupConstructors->setColumnLayout(0, Qt::Vertical);
- GroupConstructors->layout()->setSpacing(0);
- GroupConstructors->layout()->setMargin(0);
- GroupConstructorsLayout = new QGridLayout(GroupConstructors->layout());
- GroupConstructorsLayout->setAlignment(Qt::AlignTop);
- GroupConstructorsLayout->setSpacing(6);
- GroupConstructorsLayout->setMargin(11);
- Constructor1 = new QRadioButton(GroupConstructors, "Constructor1");
- Constructor1->setText(tr("" ));
- Constructor1->setPixmap(image0);
- Constructor1->setChecked(TRUE);
- Constructor1->setSizePolicy(QSizePolicy((QSizePolicy::SizeType)1, (QSizePolicy::SizeType)0, Constructor1->sizePolicy().hasHeightForWidth()));
- Constructor1->setMinimumSize(QSize(50, 0));
- GroupConstructorsLayout->addWidget(Constructor1, 0, 0);
- QSpacerItem* spacer = new QSpacerItem(20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
- GroupConstructorsLayout->addItem(spacer, 0, 1);
- SMESHGUI_RemoveElementsDlgLayout->addWidget(GroupConstructors, 0, 0);
-
- /***************************************************************/
- GroupButtons = new QGroupBox(this, "GroupButtons");
- GroupButtons->setGeometry(QRect(10, 10, 281, 48));
- GroupButtons->setTitle(tr("" ));
- GroupButtons->setColumnLayout(0, Qt::Vertical);
- GroupButtons->layout()->setSpacing(0);
- GroupButtons->layout()->setMargin(0);
- GroupButtonsLayout = new QGridLayout(GroupButtons->layout());
- GroupButtonsLayout->setAlignment(Qt::AlignTop);
- GroupButtonsLayout->setSpacing(6);
- GroupButtonsLayout->setMargin(11);
- buttonCancel = new QPushButton(GroupButtons, "buttonCancel");
- buttonCancel->setText(tr("SMESH_BUT_CLOSE" ));
- buttonCancel->setAutoDefault(TRUE);
- GroupButtonsLayout->addWidget(buttonCancel, 0, 3);
- buttonApply = new QPushButton(GroupButtons, "buttonApply");
- buttonApply->setText(tr("SMESH_BUT_APPLY" ));
- buttonApply->setAutoDefault(TRUE);
- GroupButtonsLayout->addWidget(buttonApply, 0, 1);
- QSpacerItem* spacer_9 = new QSpacerItem(20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
- GroupButtonsLayout->addItem(spacer_9, 0, 2);
- buttonOk = new QPushButton(GroupButtons, "buttonOk");
- buttonOk->setText(tr("SMESH_BUT_OK" ));
- buttonOk->setAutoDefault(TRUE);
- buttonOk->setDefault(TRUE);
- GroupButtonsLayout->addWidget(buttonOk, 0, 0);
- SMESHGUI_RemoveElementsDlgLayout->addWidget(GroupButtons, 2, 0);
-
- /***************************************************************/
- GroupC1 = new QGroupBox(this, "GroupC1");
- GroupC1->setTitle(tr("SMESH_REMOVE" ));
- GroupC1->setMinimumSize(QSize(0, 0));
- GroupC1->setFrameShape(QGroupBox::Box);
- GroupC1->setFrameShadow(QGroupBox::Sunken);
- GroupC1->setColumnLayout(0, Qt::Vertical);
- GroupC1->layout()->setSpacing(0);
- GroupC1->layout()->setMargin(0);
- GroupC1Layout = new QGridLayout(GroupC1->layout());
- GroupC1Layout->setAlignment(Qt::AlignTop);
- GroupC1Layout->setSpacing(6);
- GroupC1Layout->setMargin(11);
- TextLabelC1A1 = new QLabel(GroupC1, "TextLabelC1A1");
- TextLabelC1A1->setText(tr("SMESH_ID_ELEMENTS" ));
- TextLabelC1A1->setMinimumSize(QSize(50, 0));
- TextLabelC1A1->setFrameShape(QLabel::NoFrame);
- TextLabelC1A1->setFrameShadow(QLabel::Plain);
- GroupC1Layout->addWidget(TextLabelC1A1, 0, 0);
- SelectButtonC1A1 = new QPushButton(GroupC1, "SelectButtonC1A1");
- SelectButtonC1A1->setText(tr("" ));
- SelectButtonC1A1->setPixmap(image1);
- SelectButtonC1A1->setToggleButton(FALSE);
- GroupC1Layout->addWidget(SelectButtonC1A1, 0, 1);
- LineEditC1A1 = new QLineEdit(GroupC1, "LineEditC1A1");
- LineEditC1A1->setValidator(new SMESHGUI_IdValidator(this, "validator"));
- GroupC1Layout->addWidget(LineEditC1A1, 0, 2);
- SMESHGUI_RemoveElementsDlgLayout->addWidget(GroupC1, 1, 0);
-
- Init(); /* Initialisations */
-}
-
-//=================================================================================
-// function : ~SMESHGUI_RemoveElementsDlg()
-// purpose : Destroys the object and frees any allocated resources
-//=================================================================================
-SMESHGUI_RemoveElementsDlg::~SMESHGUI_RemoveElementsDlg()
-{
- // no need to delete child widgets, Qt does it all for us
-}
-
-//=================================================================================
-// function : Init()
-// purpose :
-//=================================================================================
-void SMESHGUI_RemoveElementsDlg::Init()
-{
- GroupC1->show();
- myConstructorId = 0;
- Constructor1->setChecked(TRUE);
- myEditCurrentArgument = LineEditC1A1;
-
- myNbOkElements = false;
- mySMESHGUI->SetActiveDialogBox((QDialog*)this);
- myActor = 0;
- myBusy = false;
-
- /* signals and slots connections */
- connect(buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk()));
- connect(buttonCancel, SIGNAL(clicked()), this, SLOT(ClickOnCancel()));
- connect(buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply()));
- connect(GroupConstructors, SIGNAL(clicked(int)), SLOT(ConstructorsClicked(int)));
-
- connect(SelectButtonC1A1, SIGNAL (clicked()), this, SLOT(SetEditCurrentArgument()));
- connect(mySMESHGUI, SIGNAL (SignalDeactivateActiveDialog()), this, SLOT(DeactivateActiveDialog()));
- connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()));
- /* to close dialog if study change */
- connect(mySMESHGUI, SIGNAL (SignalCloseAllDialogs()), this, SLOT(ClickOnCancel()));
- connect(myEditCurrentArgument, SIGNAL(textChanged(const QString&)),
- SLOT(onTextChange(const QString&)));
-
- /* Move widget on the botton right corner of main widget */
- int x, y;
- mySMESHGUI->DefineDlgPosition(this, x, y);
- this->move(x, y);
- this->show(); /* displays Dialog */
-
- if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
- aViewWindow->SetSelectionMode(CellSelection);
-
- SelectionIntoArgument();
-}
-
-//=================================================================================
-// function : ConstructorsClicked()
-// purpose : Radio button management
-//=================================================================================
-void SMESHGUI_RemoveElementsDlg::ConstructorsClicked (int)
-{
-}
-
-//=================================================================================
-// function : ClickOnApply()
-// purpose :
-//=================================================================================
-void SMESHGUI_RemoveElementsDlg::ClickOnApply()
-{
- if (mySMESHGUI->isActiveStudyLocked())
- return;
- if (myNbOkElements) {
- QStringList aListId = QStringList::split(" ", myEditCurrentArgument->text(), false);
- SMESH::long_array_var anArrayOfIdeces = new SMESH::long_array;
- anArrayOfIdeces->length(aListId.count());
- for (int i = 0; i < aListId.count(); i++)
- anArrayOfIdeces[i] = aListId[ i ].toInt();
-
- bool aResult = false;
- try {
- SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditor();
- aResult = aMeshEditor->RemoveElements(anArrayOfIdeces.inout());
- } catch (...) {
- }
-
- if (aResult) {
- myEditCurrentArgument->clear();
- SMESH::UpdateView();
- }
- }
-}
-
-//=================================================================================
-// function : ClickOnOk()
-// purpose :
-//=================================================================================
-void SMESHGUI_RemoveElementsDlg::ClickOnOk()
-{
- this->ClickOnApply();
- this->ClickOnCancel();
-
- return;
-}
-
-//=================================================================================
-// function : ClickOnCancel()
-// purpose :
-//=================================================================================
-void SMESHGUI_RemoveElementsDlg::ClickOnCancel()
-{
- mySelectionMgr->clearSelected();
- if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
- aViewWindow->SetSelectionMode(ActorSelection);
- disconnect(mySelectionMgr, 0, this, 0);
- mySMESHGUI->ResetState();
- reject();
- return;
-}
-
-//=======================================================================
-//function : onTextChange
-//purpose :
-//=======================================================================
-void SMESHGUI_RemoveElementsDlg::onTextChange (const QString& theNewText)
-{
- if (myBusy)
- return;
- myBusy = true;
-
- myNbOkElements = 0;
-
- buttonOk->setEnabled(false);
- buttonApply->setEnabled(false);
-
- // hilight entered elements
- if(myActor){
- if(SMDS_Mesh* aMesh = myActor->GetObject()->GetMesh()){
- Handle(SALOME_InteractiveObject) anIO = myActor->getIO();
-
- TColStd_MapOfInteger newIndices;
-
- QStringList aListId = QStringList::split(" ", theNewText, false);
- for (int i = 0; i < aListId.count(); i++) {
- if(const SMDS_MeshElement *anElem = aMesh->FindElement(aListId[i].toInt())) {
- newIndices.Add(anElem->GetID());
- myNbOkElements++;
- }
- }
-
- mySelector->AddOrRemoveIndex(anIO,newIndices,false);
- if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
- aViewWindow->highlight(anIO,true,true);
- }
- }
-
- if (myNbOkElements) {
- buttonOk->setEnabled(true);
- buttonApply->setEnabled(true);
- }
-
- myBusy = false;
-}
-
-//=================================================================================
-// function : SelectionIntoArgument()
-// purpose : Called when selection as changed or other case
-//=================================================================================
-void SMESHGUI_RemoveElementsDlg::SelectionIntoArgument()
-{
- if (myBusy) return;
-
- // clear
-
- myNbOkElements = false;
- myActor = 0;
-
- myBusy = true;
- myEditCurrentArgument->setText("");
- myBusy = false;
-
- if (!GroupButtons->isEnabled()) // inactive
- return;
-
- buttonOk->setEnabled(false);
- buttonApply->setEnabled(false);
-
- // get selected mesh
-
- SALOME_ListIO aList;
- mySelectionMgr->selectedObjects(aList,SVTK_Viewer::Type());
-
- int nbSel = aList.Extent();
- if (nbSel != 1)
- return;
-
- Handle(SALOME_InteractiveObject) anIO = aList.First();
- myMesh = SMESH::GetMeshByIO(anIO);
- if (myMesh->_is_nil())
- return;
-
- myActor = SMESH::FindActorByEntry(anIO->getEntry());
- if (!myActor)
- return;
-
- // get selected nodes
- QString aString = "";
- int nbElems = SMESH::GetNameOfSelectedElements(mySelector,anIO,aString);
- if(nbElems < 1)
- return;
- myBusy = true;
- myEditCurrentArgument->setText(aString);
- myBusy = false;
-
- // OK
-
- myNbOkElements = nbElems;
-
- buttonOk->setEnabled(true);
- buttonApply->setEnabled(true);
-}
-
-//=================================================================================
-// function : SetEditCurrentArgument()
-// purpose :
-//=================================================================================
-void SMESHGUI_RemoveElementsDlg::SetEditCurrentArgument()
-{
- QPushButton* send = (QPushButton*)sender();
- switch (myConstructorId)
- {
- case 0: /* default constructor */
- {
- if(send == SelectButtonC1A1) {
- LineEditC1A1->setFocus();
- myEditCurrentArgument = LineEditC1A1;
- }
- SelectionIntoArgument();
- break;
- }
- }
- return;
-}
-
-//=================================================================================
-// function : DeactivateActiveDialog()
-// purpose :
-//=================================================================================
-void SMESHGUI_RemoveElementsDlg::DeactivateActiveDialog()
-{
- if (GroupConstructors->isEnabled()) {
- GroupConstructors->setEnabled(false);
- GroupC1->setEnabled(false);
- GroupButtons->setEnabled(false);
- mySMESHGUI->ResetState(); // ??
- mySMESHGUI->SetActiveDialogBox(0); // ??
- }
-}
-
-//=================================================================================
-// function : ActivateThisDialog()
-// purpose :
-//=================================================================================
-void SMESHGUI_RemoveElementsDlg::ActivateThisDialog()
-{
- /* Emit a signal to deactivate the active dialog */
- mySMESHGUI->EmitSignalDeactivateDialog();
-
- GroupConstructors->setEnabled(true);
- GroupC1->setEnabled(true);
- GroupButtons->setEnabled(true);
-
- mySMESHGUI->SetActiveDialogBox((QDialog*)this); // ??
-
- if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
- aViewWindow->SetSelectionMode(NodeSelection);
-
- SelectionIntoArgument(); // ??
-}
-
-//=================================================================================
-// function : enterEvent()
-// purpose :
-//=================================================================================
-void SMESHGUI_RemoveElementsDlg::enterEvent (QEvent*)
-{
- if (!GroupConstructors->isEnabled())
- ActivateThisDialog();
-}
-
-//=================================================================================
-// function : closeEvent()
-// purpose :
-//=================================================================================
-void SMESHGUI_RemoveElementsDlg::closeEvent (QCloseEvent*)
-{
- /* same than click on cancel button */
- this->ClickOnCancel();
- return;
-}
-
-//=======================================================================
-//function : hideEvent
-//purpose : caused by ESC key
-//=======================================================================
-void SMESHGUI_RemoveElementsDlg::hideEvent (QHideEvent * e)
-{
- if (!isMinimized())
- ClickOnCancel();
-}
+++ /dev/null
-// SMESH SMESHGUI : GUI for SMESH component
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESHGUI_RemoveNodesDlg.cxx
-// Author : Nicolas REJNERI
-// Module : SMESH
-// $Header$
-
-#include "SMESHGUI_RemoveNodesDlg.h"
-
-#include "SMESHGUI.h"
-#include "SMESHGUI_Utils.h"
-#include "SMESHGUI_VTKUtils.h"
-#include "SMESHGUI_MeshUtils.h"
-#include "SMESHGUI_IdValidator.h"
-
-#include "SMESH_Actor.h"
-#include "SMDS_Mesh.hxx"
-
-#include "SUIT_ResourceMgr.h"
-#include "SUIT_Desktop.h"
-
-#include "SVTK_Selector.h"
-#include "SVTK_ViewModel.h"
-#include "SVTK_ViewWindow.h"
-#include "SALOME_ListIO.hxx"
-
-#include "utilities.h"
-
-// OCCT Includes
-#include <TColStd_MapOfInteger.hxx>
-#include <TColStd_IndexedMapOfInteger.hxx>
-
-// QT Includes
-#include <qbuttongroup.h>
-#include <qgroupbox.h>
-#include <qlabel.h>
-#include <qlineedit.h>
-#include <qpushbutton.h>
-#include <qradiobutton.h>
-#include <qlayout.h>
-#include <qvariant.h>
-#include <qtooltip.h>
-#include <qwhatsthis.h>
-#include <qimage.h>
-#include <qpixmap.h>
-
-using namespace std;
-
-//=================================================================================
-// class : SMESHGUI_RemoveNodesDlg()
-// purpose :
-//=================================================================================
-SMESHGUI_RemoveNodesDlg
-::SMESHGUI_RemoveNodesDlg(SMESHGUI* theModule,
- const char* name,
- bool modal,
- WFlags fl)
- : QDialog(SMESH::GetDesktop(theModule),
- name,
- modal,
- WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu | Qt::WDestructiveClose),
- mySelector(SMESH::GetViewWindow(theModule)->GetSelector()),
- mySelectionMgr(SMESH::GetSelectionMgr(theModule)),
- mySMESHGUI(theModule),
- myBusy(false)
-{
- QPixmap image0 (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_DLG_REM_NODE")));
- QPixmap image1 (SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap("SMESH", tr("ICON_SELECT")));
-
- if (!name)
- setName("SMESHGUI_RemoveNodesDlg");
- resize(303, 185);
- setCaption(tr("SMESH_REMOVE_NODES_TITLE" ));
- setSizeGripEnabled(TRUE);
- SMESHGUI_RemoveNodesDlgLayout = new QGridLayout(this);
- SMESHGUI_RemoveNodesDlgLayout->setSpacing(6);
- SMESHGUI_RemoveNodesDlgLayout->setMargin(11);
-
- /***************************************************************/
- GroupConstructors = new QButtonGroup(this, "GroupConstructors");
- GroupConstructors->setTitle(tr("SMESH_NODES" ));
- GroupConstructors->setExclusive(TRUE);
- GroupConstructors->setColumnLayout(0, Qt::Vertical);
- GroupConstructors->layout()->setSpacing(0);
- GroupConstructors->layout()->setMargin(0);
- GroupConstructorsLayout = new QGridLayout(GroupConstructors->layout());
- GroupConstructorsLayout->setAlignment(Qt::AlignTop);
- GroupConstructorsLayout->setSpacing(6);
- GroupConstructorsLayout->setMargin(11);
- Constructor1 = new QRadioButton(GroupConstructors, "Constructor1");
- Constructor1->setText(tr("" ));
- Constructor1->setPixmap(image0);
- Constructor1->setChecked(TRUE);
- Constructor1->setSizePolicy(QSizePolicy((QSizePolicy::SizeType)1, (QSizePolicy::SizeType)0, Constructor1->sizePolicy().hasHeightForWidth()));
- Constructor1->setMinimumSize(QSize(50, 0));
- GroupConstructorsLayout->addWidget(Constructor1, 0, 0);
- QSpacerItem* spacer = new QSpacerItem(20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
- GroupConstructorsLayout->addItem(spacer, 0, 1);
- SMESHGUI_RemoveNodesDlgLayout->addWidget(GroupConstructors, 0, 0);
-
- /***************************************************************/
- GroupButtons = new QGroupBox(this, "GroupButtons");
- GroupButtons->setGeometry(QRect(10, 10, 281, 48));
- GroupButtons->setTitle(tr("" ));
- GroupButtons->setColumnLayout(0, Qt::Vertical);
- GroupButtons->layout()->setSpacing(0);
- GroupButtons->layout()->setMargin(0);
- GroupButtonsLayout = new QGridLayout(GroupButtons->layout());
- GroupButtonsLayout->setAlignment(Qt::AlignTop);
- GroupButtonsLayout->setSpacing(6);
- GroupButtonsLayout->setMargin(11);
- buttonCancel = new QPushButton(GroupButtons, "buttonCancel");
- buttonCancel->setText(tr("SMESH_BUT_CLOSE" ));
- buttonCancel->setAutoDefault(TRUE);
- GroupButtonsLayout->addWidget(buttonCancel, 0, 3);
- buttonApply = new QPushButton(GroupButtons, "buttonApply");
- buttonApply->setText(tr("SMESH_BUT_APPLY" ));
- buttonApply->setAutoDefault(TRUE);
- GroupButtonsLayout->addWidget(buttonApply, 0, 1);
- QSpacerItem* spacer_9 = new QSpacerItem(20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum);
- GroupButtonsLayout->addItem(spacer_9, 0, 2);
- buttonOk = new QPushButton(GroupButtons, "buttonOk");
- buttonOk->setText(tr("SMESH_BUT_OK" ));
- buttonOk->setAutoDefault(TRUE);
- buttonOk->setDefault(TRUE);
- GroupButtonsLayout->addWidget(buttonOk, 0, 0);
- SMESHGUI_RemoveNodesDlgLayout->addWidget(GroupButtons, 2, 0);
-
- /***************************************************************/
- GroupC1 = new QGroupBox(this, "GroupC1");
- GroupC1->setTitle(tr("SMESH_REMOVE" ));
- GroupC1->setMinimumSize(QSize(0, 0));
- GroupC1->setFrameShape(QGroupBox::Box);
- GroupC1->setFrameShadow(QGroupBox::Sunken);
- GroupC1->setColumnLayout(0, Qt::Vertical);
- GroupC1->layout()->setSpacing(0);
- GroupC1->layout()->setMargin(0);
- GroupC1Layout = new QGridLayout(GroupC1->layout());
- GroupC1Layout->setAlignment(Qt::AlignTop);
- GroupC1Layout->setSpacing(6);
- GroupC1Layout->setMargin(11);
- TextLabelC1A1 = new QLabel(GroupC1, "TextLabelC1A1");
- TextLabelC1A1->setText(tr("SMESH_ID_NODES" ));
- TextLabelC1A1->setMinimumSize(QSize(50, 0));
- TextLabelC1A1->setFrameShape(QLabel::NoFrame);
- TextLabelC1A1->setFrameShadow(QLabel::Plain);
- GroupC1Layout->addWidget(TextLabelC1A1, 0, 0);
- SelectButtonC1A1 = new QPushButton(GroupC1, "SelectButtonC1A1");
- SelectButtonC1A1->setText(tr("" ));
- SelectButtonC1A1->setPixmap(image1);
- SelectButtonC1A1->setToggleButton(FALSE);
- GroupC1Layout->addWidget(SelectButtonC1A1, 0, 1);
- LineEditC1A1 = new QLineEdit(GroupC1, "LineEditC1A1");
- LineEditC1A1->setValidator(new SMESHGUI_IdValidator(this, "validator"));
- GroupC1Layout->addWidget(LineEditC1A1, 0, 2);
- SMESHGUI_RemoveNodesDlgLayout->addWidget(GroupC1, 1, 0);
-
- Init(); /* Initialisations */
-}
-
-//=================================================================================
-// function : ~SMESHGUI_RemoveNodesDlg()
-// purpose : Destroys the object and frees any allocated resources
-//=================================================================================
-SMESHGUI_RemoveNodesDlg::~SMESHGUI_RemoveNodesDlg()
-{
- // no need to delete child widgets, Qt does it all for us
-}
-
-//=================================================================================
-// function : Init()
-// purpose :
-//=================================================================================
-void SMESHGUI_RemoveNodesDlg::Init()
-{
- GroupC1->show();
- myConstructorId = 0;
- Constructor1->setChecked(TRUE);
- myEditCurrentArgument = LineEditC1A1;
-
- myNbOkNodes = 0;
- mySMESHGUI->SetActiveDialogBox((QDialog*)this);
- myActor = 0;
- myBusy = false;
-
- /* signals and slots connections */
- connect(buttonOk, SIGNAL(clicked()), this, SLOT(ClickOnOk()));
- connect(buttonCancel, SIGNAL(clicked()), this, SLOT(ClickOnCancel()));
- connect(buttonApply, SIGNAL(clicked()), this, SLOT(ClickOnApply()));
- connect(GroupConstructors, SIGNAL(clicked(int)), SLOT(ConstructorsClicked(int)));
-
- connect(SelectButtonC1A1, SIGNAL (clicked()), this, SLOT(SetEditCurrentArgument()));
- connect(mySMESHGUI, SIGNAL (SignalDeactivateActiveDialog()), this, SLOT(DeactivateActiveDialog()));
- connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument()));
- /* to close dialog if study change */
- connect(mySMESHGUI, SIGNAL (SignalCloseAllDialogs()), this, SLOT(ClickOnCancel()));
- connect(myEditCurrentArgument, SIGNAL(textChanged(const QString&)),
- SLOT(onTextChange(const QString&)));
-
- /* Move widget on the botton right corner of main widget */
- int x, y;
- mySMESHGUI->DefineDlgPosition(this, x, y);
- this->move(x, y);
- this->show(); /* displays Dialog */
-
- SMESH::SetPointRepresentation(true);
-
- if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
- aViewWindow->SetSelectionMode(NodeSelection);
-
- SelectionIntoArgument();
-}
-
-//=================================================================================
-// function : ConstructorsClicked()
-// purpose : Radio button management
-//=================================================================================
-void SMESHGUI_RemoveNodesDlg::ConstructorsClicked (int)
-{
-}
-
-//=================================================================================
-// function : ClickOnApply()
-// purpose :
-//=================================================================================
-void SMESHGUI_RemoveNodesDlg::ClickOnApply()
-{
- if (mySMESHGUI->isActiveStudyLocked())
- return;
-
- if (myNbOkNodes) {
- QStringList aListId = QStringList::split(" ", myEditCurrentArgument->text(), false);
- SMESH::long_array_var anArrayOfIdeces = new SMESH::long_array;
- anArrayOfIdeces->length(aListId.count());
- for (int i = 0; i < aListId.count(); i++)
- anArrayOfIdeces[i] = aListId[ i ].toInt();
-
- bool aResult = false;
- try {
- SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditor();
- aResult = aMeshEditor->RemoveNodes(anArrayOfIdeces.inout());
- } catch(...) {
- }
-
- if (aResult) {
- myEditCurrentArgument->clear();
- SMESH::UpdateView();
- }
-
- SMESH::SetPointRepresentation(true);
- }
-}
-
-//=================================================================================
-// function : ClickOnOk()
-// purpose :
-//=================================================================================
-void SMESHGUI_RemoveNodesDlg::ClickOnOk()
-{
- ClickOnApply();
- ClickOnCancel();
-}
-
-//=================================================================================
-// function : ClickOnCancel()
-// purpose :
-//=================================================================================
-void SMESHGUI_RemoveNodesDlg::ClickOnCancel()
-{
- mySelectionMgr->clearSelected();
- SMESH::SetPointRepresentation(false);
- if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
- aViewWindow->SetSelectionMode(ActorSelection);
- disconnect(mySelectionMgr, 0, this, 0);
- mySMESHGUI->ResetState();
- reject();
-}
-
-//=======================================================================
-//function : onTextChange
-//purpose :
-//=======================================================================
-void SMESHGUI_RemoveNodesDlg::onTextChange (const QString& theNewText)
-{
- if (myBusy) return;
- myBusy = true;
-
- myNbOkNodes = 0;
-
- buttonOk->setEnabled(false);
- buttonApply->setEnabled(false);
-
- // hilight entered nodes
- if(myActor){
- if(SMDS_Mesh* aMesh = myActor->GetObject()->GetMesh()){
- Handle(SALOME_InteractiveObject) anIO = myActor->getIO();
-
- TColStd_MapOfInteger newIndices;
-
- QStringList aListId = QStringList::split(" ", theNewText, false);
- for (int i = 0; i < aListId.count(); i++) {
- if (const SMDS_MeshNode *aNode = aMesh->FindNode(aListId[i].toInt())) {
- newIndices.Add(aNode->GetID());
- myNbOkNodes++;
- }
- }
-
- mySelector->AddOrRemoveIndex(anIO,newIndices,false);
- if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
- aViewWindow->highlight(anIO,true,true);
- }
- }
-
- if (myNbOkNodes) {
- buttonOk->setEnabled(true);
- buttonApply->setEnabled(true);
- }
-
- myBusy = false;
-}
-
-//=================================================================================
-// function : SelectionIntoArgument()
-// purpose : Called when selection as changed or other case
-//=================================================================================
-void SMESHGUI_RemoveNodesDlg::SelectionIntoArgument()
-{
- if (myBusy) return;
-
- // clear
-
- myNbOkNodes = false;
- myActor = 0;
-
- myBusy = true;
- myEditCurrentArgument->setText("");
- myBusy = false;
-
- if (!GroupButtons->isEnabled()) // inactive
- return;
-
- buttonOk->setEnabled(false);
- buttonApply->setEnabled(false);
-
- // get selected mesh
- SALOME_ListIO aList;
- mySelectionMgr->selectedObjects(aList,SVTK_Viewer::Type());
-
- int nbSel = aList.Extent();
- if (nbSel != 1)
- return;
-
- Handle(SALOME_InteractiveObject) anIO = aList.First();
- myMesh = SMESH::GetMeshByIO(anIO);
- if (myMesh->_is_nil())
- return;
-
- myActor = SMESH::FindActorByEntry(anIO->getEntry());
- if (!myActor)
- return;
-
- // get selected nodes
-
- QString aString = "";
- int nbNodes = SMESH::GetNameOfSelectedNodes(mySelector,anIO,aString);
- if(nbNodes < 1)
- return;
- myBusy = true;
- myEditCurrentArgument->setText(aString);
- myBusy = false;
-
- // OK
-
- myNbOkNodes = true;
-
- buttonOk->setEnabled(true);
- buttonApply->setEnabled(true);
-}
-
-//=================================================================================
-// function : SetEditCurrentArgument()
-// purpose :
-//=================================================================================
-void SMESHGUI_RemoveNodesDlg::SetEditCurrentArgument()
-{
- QPushButton* send = (QPushButton*)sender();
- switch (myConstructorId)
- {
- case 0: /* default constructor */
- {
- if(send == SelectButtonC1A1) {
- LineEditC1A1->setFocus();
- myEditCurrentArgument = LineEditC1A1;
- }
- SelectionIntoArgument();
- break;
- }
- }
- return;
-}
-
-//=================================================================================
-// function : DeactivateActiveDialog()
-// purpose :
-//=================================================================================
-void SMESHGUI_RemoveNodesDlg::DeactivateActiveDialog()
-{
- if (GroupConstructors->isEnabled()) {
- GroupConstructors->setEnabled(false);
- GroupC1->setEnabled(false);
- GroupButtons->setEnabled(false);
- mySMESHGUI->ResetState(); // ??
- mySMESHGUI->SetActiveDialogBox(0); // ??
- }
-}
-
-//=================================================================================
-// function : ActivateThisDialog()
-// purpose :
-//=================================================================================
-void SMESHGUI_RemoveNodesDlg::ActivateThisDialog()
-{
- /* Emit a signal to deactivate the active dialog */
- mySMESHGUI->EmitSignalDeactivateDialog();
-
- GroupConstructors->setEnabled(true);
- GroupC1->setEnabled(true);
- GroupButtons->setEnabled(true);
-
- mySMESHGUI->SetActiveDialogBox((QDialog*)this); // ??
-
- SMESH::SetPointRepresentation(true);
- if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ))
- aViewWindow->SetSelectionMode(NodeSelection);
-
- SelectionIntoArgument(); // ??
-}
-
-//=================================================================================
-// function : enterEvent()
-// purpose :
-//=================================================================================
-void SMESHGUI_RemoveNodesDlg::enterEvent (QEvent*)
-{
- if (!GroupConstructors->isEnabled())
- ActivateThisDialog();
-}
-
-//=================================================================================
-// function : closeEvent()
-// purpose :
-//=================================================================================
-void SMESHGUI_RemoveNodesDlg::closeEvent (QCloseEvent*)
-{
- /* same than click on cancel button */
- this->ClickOnCancel();
- return;
-}
-
-//=======================================================================
-//function : hideEvent
-//purpose : caused by ESC key
-//=======================================================================
-void SMESHGUI_RemoveNodesDlg::hideEvent (QHideEvent * e)
-{
- if (!isMinimized())
- ClickOnCancel();
-}
+++ /dev/null
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-
-#include "QAD_Desktop.h"
-
-#include "SMESHGUI_SMESHGenUtils.h"
-
-#include "SALOMEconfig.h"
-#include CORBA_CLIENT_HEADER(SALOMEDS)
-
-namespace SMESH
-{
-
- SMESH::SMESH_Gen_var GetSMESHGen()
- {
- static SMESH::SMESH_Gen_var aSMESHGen;
- if(CORBA::is_nil(aSMESHGen)){
- if(QAD_Desktop* aDesktop = QAD_Application::getDesktop()){
- Engines::Component_var aComponent = aDesktop->getEngine("FactoryServer","SMESH");
- aSMESHGen = SMESH::SMESH_Gen::_narrow(aComponent);
- }
- }
- return aSMESHGen;
- }
-
-}
+++ /dev/null
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-#ifndef SMESHGUI_SMESHGenUtils_HeaderFile
-#define SMESHGUI_SMESHGenUtils_HeaderFile
-
-#include "SALOMEconfig.h"
-#include CORBA_SERVER_HEADER(SMESH_Gen)
-
-
-namespace SMESH
-{
-
- SMESH::SMESH_Gen_var GetSMESHGen();
-
-}
-
-
-#endif
+++ /dev/null
-// SMESH SMESHGUI : GUI for SMESH component
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESHGUI_SpinBox.cxx
-// Author : Lucien PIGNOLONI
-// Module : SMESH
-// $Header$
-
-#include "SMESHGUI_SpinBox.h"
-#include "SMESHGUI.h"
-
-#include <qvalidator.h>
-#include <qlineedit.h>
-
-using namespace std;
-
-//=================================================================================
-// class : SMESHGUI_SpinBox()
-// purpose : constructor of specific widget accepting floats in double precision.
-//=================================================================================
-SMESHGUI_SpinBox::SMESHGUI_SpinBox (QWidget* parent, const char* name)
- : QtxDblSpinBox(parent, name)
-{
-}
-
-//=================================================================================
-// function : SetStep() [SLOT]
-// purpose :
-//=================================================================================
-void SMESHGUI_SpinBox::SetStep (double newStep)
-{
- setLineStep(newStep);
-}
-
-//=================================================================================
-// function : ~SMESHGUI_SpinBox()
-// purpose : destructor
-//=================================================================================
-SMESHGUI_SpinBox::~SMESHGUI_SpinBox()
-{
-}
-
-//=================================================================================
-// function : SetValue()
-// purpose :
-//=================================================================================
-void SMESHGUI_SpinBox::SetValue (double v)
-{
- setValue(v);
- editor()->setCursorPosition( 0 );
-}
-
-//=================================================================================
-// function : GetValue()
-// purpose : returns a double
-//=================================================================================
-double SMESHGUI_SpinBox::GetValue()
-{
- return value();
-}
-
-//=================================================================================
-// function : GetString()
-// purpose : returns a QString
-//=================================================================================
-QString SMESHGUI_SpinBox::GetString()
-{
- return cleanText();
-}
-
-//=================================================================================
-// function : RangeStepAndValidator()
-// purpose :
-//=================================================================================
-void SMESHGUI_SpinBox::RangeStepAndValidator
- (double min, double max, double step, unsigned short decimals)
-{
- setRange(min, max);
- setLineStep(step);
- ((QDoubleValidator*)validator())->setRange(min, max, decimals);
-}
+++ /dev/null
-// SMESH SMESHGUI : GUI for SMESH component
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESHGUI_SpinBox.h
-// Author : Lucien PIGNOLONI
-// Module : SMESH
-// $Header$
-
-#ifndef SMESH_SPINBOX_H
-#define SMESH_SPINBOX_H
-
-#include <QtxDblSpinBox.h>
-
-//=================================================================================
-// class : SMESHGUI_SpinBox
-// purpose : Derivated from QtxDblSpinBox class
-//=================================================================================
-class SMESHGUI_SpinBox : public QtxDblSpinBox
-{
- Q_OBJECT
-
-public:
- SMESHGUI_SpinBox (QWidget* parent, const char* name = 0);
- ~SMESHGUI_SpinBox();
-
- void RangeStepAndValidator (double min = -1000000.0,
- double max = +1000000.0,
- double step = 100.0,
- unsigned short decimals = 3);
- void SetValue (double v);
- double GetValue();
- QString GetString();
- QLineEdit* editor() { return QtxDblSpinBox::editor(); }
-
-public slots:
- void SetStep (double newStep);
-};
-#endif // SMESH_SPINBOX_H
+++ /dev/null
-// SMESH SMESHGUI : GUI for SMESH component
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESH_Swig.cxx
-// Author : Nicolas REJNERI
-// Module : SMESH
-// $Header$
-
-using namespace std;
-#include "SMESHGUI_Swig.hxx"
-
-#include "Utils_ORB_INIT.hxx"
-#include "Utils_SINGLETON.hxx"
-
-#include "SMESHGUI.h"
-#include "SMESHGUI_Utils.h"
-#include "SMESHGUI_GEOMGenUtils.h"
-
-// SALOME Includes
-#include "SUIT_ResourceMgr.h"
-#include "SUIT_Session.h"
-
-#include "SALOMEDS_SObject.hxx"
-
-#include "SalomeApp_Application.h"
-
-#include "utilities.h"
-
-// Open CASCADE Includes
-#include <TopoDS.hxx>
-
-// IDL Headers
-#include <SALOMEconfig.h>
-#include CORBA_SERVER_HEADER(SMESH_Gen)
-#include CORBA_SERVER_HEADER(SMESH_Mesh)
-#include CORBA_SERVER_HEADER(SMESH_Hypothesis)
-
-static CORBA::ORB_var _orb;
-
-static CORBA::Object_ptr StringToObject (const char* ior)
-{
- return _orb->string_to_object(ior);
-}
-
-SMESH_Swig::SMESH_Swig()
-{
- MESSAGE("Constructeur");
- setOrb();
-}
-
-void SMESH_Swig::Init(int studyID)
-{
- MESSAGE("Init");
- SMESH::SMESH_Gen_var CompMesh = SMESHGUI::GetSMESHGen();
- GEOM::GEOM_Gen_var CompGeom = SMESH::GetGEOMGen();
-
- SUIT_ResourceMgr* resMgr = SMESHGUI::resourceMgr();
- if ( resMgr ) {
- resMgr->loadLanguage( QString::null, "en" );
- /*QString msg;
- if (!resMgr->loadResources( "SMESH", msg ))
- MESSAGE ( msg )*/
- }
-
- SalomeApp_Application* app = dynamic_cast<SalomeApp_Application*>( SUIT_Session::session()->activeApplication() );
- if( !app )
- return;
-
- CORBA::Object_var obj = app->namingService()->Resolve("/myStudyManager");
- SALOMEDS::StudyManager_var myStudyMgr = SALOMEDS::StudyManager::_narrow(obj);
- myStudy = myStudyMgr->GetStudyByID(studyID);
-
- CompMesh->SetCurrentStudy( myStudy.in() );
-
- myStudyBuilder = myStudy->NewBuilder();
- SALOMEDS::GenericAttribute_var anAttr;
- SALOMEDS::AttributeName_var aName;
- SALOMEDS::AttributePixMap_var aPixmap;
-
- // See return value of SMESH::SMESH_Gen::ComponentDataType()
- SALOMEDS::SComponent_var father = myStudy->FindComponent("SMESH");
-
- if (father->_is_nil()) {
- bool aLocked = myStudy->GetProperties()->IsLocked();
- if (aLocked) myStudy->GetProperties()->SetLocked(false);
- father = myStudyBuilder->NewComponent("SMESH");
- anAttr = myStudyBuilder->FindOrCreateAttribute(father, "AttributeName");
- aName = SALOMEDS::AttributeName::_narrow(anAttr);
- //NRI aName->SetValue(QObject::tr("SMESH_MEN_COMPONENT"));
- SMESHGUI* gui = SMESHGUI::GetSMESHGUI(); //SRN: BugID IPAL9186, load a SMESH gui if it hasn't been loaded
- if(!gui) {
- SalomeApp_Application* app = dynamic_cast<SalomeApp_Application*>(SUIT_Session::session()->activeApplication());
- if(app) {
- CAM_Module* module = app->module( "Mesh" );
- if(!module) module = app->loadModule("Mesh");
- gui = dynamic_cast<SMESHGUI*>( module );
- }
- else {
- MESSAGE("Can't find the application");
- }
- } //SRN: BugID IPAL9186: end of a fix
- aName->SetValue( gui->moduleName() );
- anAttr = myStudyBuilder->FindOrCreateAttribute(father, "AttributePixMap");
- aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr);
- aPixmap->SetPixMap( "ICON_OBJBROWSER_SMESH" );
- myStudyBuilder->DefineComponentInstance(father, CompMesh );
- if (aLocked) myStudy->GetProperties()->SetLocked(true);
- }
- mySComponentMesh = SALOMEDS::SComponent::_narrow( father );
-
- // Tags definition
- Tag_HypothesisRoot = 1;
- Tag_AlgorithmsRoot = 2;
-
- Tag_RefOnShape = 1;
- Tag_RefOnAppliedHypothesis = 2;
- Tag_RefOnAppliedAlgorithms = 3;
-
- Tag_SubMeshOnVertex = 4;
- Tag_SubMeshOnEdge = 5;
- Tag_SubMeshOnFace = 6;
- Tag_SubMeshOnSolid = 7;
- Tag_SubMeshOnCompound = 8;
-}
-
-SMESH_Swig::~SMESH_Swig()
-{
- MESSAGE("Destructeur");
-}
-
-const char* SMESH_Swig::AddNewMesh(const char* IOR)
-{
- MESSAGE("AddNewMesh");
-
- // VSR: added temporarily - to be removed - objects are published automatically by engine
- SALOMEDS::SObject_var SO = myStudy->FindObjectIOR( IOR );
- if ( !SO->_is_nil() )
- return SO->GetID();
-
- //Find or Create Hypothesis root
- SALOMEDS::GenericAttribute_var anAttr;
- SALOMEDS::AttributeName_var aName;
- SALOMEDS::AttributeIOR_var anIOR;
- SALOMEDS::AttributeSelectable_var aSelAttr;
- SALOMEDS::AttributePixMap_var aPixmap;
-
- SALOMEDS::SObject_var HypothesisRoot;
- if (!mySComponentMesh->FindSubObject (Tag_HypothesisRoot, HypothesisRoot)) {
- HypothesisRoot = myStudyBuilder->NewObjectToTag (mySComponentMesh, Tag_HypothesisRoot);
- anAttr = myStudyBuilder->FindOrCreateAttribute(HypothesisRoot, "AttributeName");
- aName = SALOMEDS::AttributeName::_narrow(anAttr);
- aName->SetValue(QObject::tr("SMESH_MEN_HYPOTHESIS"));
- anAttr = myStudyBuilder->FindOrCreateAttribute(HypothesisRoot, "AttributePixMap");
- aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr);
- aPixmap->SetPixMap( "ICON_SMESH_TREE_HYPO" );
- anAttr = myStudyBuilder->FindOrCreateAttribute(HypothesisRoot, "AttributeSelectable");
- aSelAttr = SALOMEDS::AttributeSelectable::_narrow(anAttr);
- aSelAttr->SetSelectable(false);
- }
-
- SALOMEDS::SObject_var AlgorithmsRoot;
- if (!mySComponentMesh->FindSubObject (Tag_AlgorithmsRoot, AlgorithmsRoot)) {
- AlgorithmsRoot = myStudyBuilder->NewObjectToTag (mySComponentMesh, Tag_AlgorithmsRoot);
- anAttr = myStudyBuilder->FindOrCreateAttribute(AlgorithmsRoot, "AttributeName");
- aName = SALOMEDS::AttributeName::_narrow(anAttr);
- aName->SetValue(QObject::tr("SMESH_MEN_ALGORITHMS"));
- anAttr = myStudyBuilder->FindOrCreateAttribute(AlgorithmsRoot, "AttributePixMap");
- aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr);
- aPixmap->SetPixMap( "ICON_SMESH_TREE_ALGO" );
- anAttr = myStudyBuilder->FindOrCreateAttribute(AlgorithmsRoot, "AttributeSelectable");
- aSelAttr = SALOMEDS::AttributeSelectable::_narrow(anAttr);
- aSelAttr->SetSelectable(false);
- }
-
- // Add New Mesh
- SALOMEDS::SObject_var newMesh = myStudyBuilder->NewObject(mySComponentMesh);
- anAttr = myStudyBuilder->FindOrCreateAttribute(newMesh, "AttributePixMap");
- aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr);
- aPixmap->SetPixMap( "ICON_SMESH_TREE_MESH" );
- anAttr = myStudyBuilder->FindOrCreateAttribute(newMesh, "AttributeIOR");
- anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
- anIOR->SetValue(IOR);
- return SALOMEDS::SObject::_narrow( newMesh )->GetID();
-}
-
-const char* SMESH_Swig::AddNewHypothesis(const char* IOR)
-{
- MESSAGE("AddNewHypothesis");
-
- // VSR: added temporarily - to be removed - objects are published automatically by engine
- SALOMEDS::SObject_var SO = myStudy->FindObjectIOR( IOR );
- if ( !SO->_is_nil() )
- return SO->GetID();
-
- //Find or Create Hypothesis root
- SALOMEDS::SObject_var HypothesisRoot;
- SALOMEDS::GenericAttribute_var anAttr;
- SALOMEDS::AttributeName_var aName;
- SALOMEDS::AttributeIOR_var anIOR;
- SALOMEDS::AttributeSelectable_var aSelAttr;
- SALOMEDS::AttributePixMap_var aPixmap;
-
- if (!mySComponentMesh->FindSubObject (Tag_HypothesisRoot, HypothesisRoot)) {
- HypothesisRoot = myStudyBuilder->NewObjectToTag (mySComponentMesh, Tag_HypothesisRoot);
- anAttr = myStudyBuilder->FindOrCreateAttribute(HypothesisRoot, "AttributeName");
- aName = SALOMEDS::AttributeName::_narrow(anAttr);
- aName->SetValue(QObject::tr("SMESH_MEN_HYPOTHESIS"));
- anAttr = myStudyBuilder->FindOrCreateAttribute(HypothesisRoot, "AttributeSelectable");
- aSelAttr = SALOMEDS::AttributeSelectable::_narrow(anAttr);
- aSelAttr->SetSelectable(false);
- anAttr = myStudyBuilder->FindOrCreateAttribute(HypothesisRoot, "AttributePixMap");
- aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr);
- aPixmap->SetPixMap( "ICON_SMESH_TREE_HYPO" );
- }
- // Add New Hypothesis
- SALOMEDS::SObject_var newHypo = myStudyBuilder->NewObject(HypothesisRoot);
- anAttr = myStudyBuilder->FindOrCreateAttribute(newHypo, "AttributePixMap");
- aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr);
- SMESH::SMESH_Hypothesis_var H = SMESH::SMESH_Hypothesis::_narrow( StringToObject(IOR) );
- QString aType = H->GetName();
- aPixmap->SetPixMap( "ICON_SMESH_TREE_HYPO_" + aType );
-// if ( aType.compare("LocalLength") == 0 )
-// aPixmap->SetPixMap( "ICON_SMESH_TREE_HYPO_LENGTH" );
-// else if ( aType.compare("NumberOfSegments") == 0 )
-// aPixmap->SetPixMap( "ICON_SMESH_TREE_HYPO_SEGMENT" );
-// else if ( aType.compare("MaxElementArea") == 0 )
-// aPixmap->SetPixMap( "ICON_SMESH_TREE_HYPO_AREA" );
-// else if ( aType.compare("MaxElementVolume") == 0 )
-// aPixmap->SetPixMap( "ICON_SMESH_TREE_HYPO_VOLUME" );
- anAttr = myStudyBuilder->FindOrCreateAttribute(newHypo, "AttributeIOR");
- anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
- anIOR->SetValue(IOR);
- return SALOMEDS::SObject::_narrow(newHypo)->GetID();
-}
-
-const char* SMESH_Swig::AddNewAlgorithms(const char* IOR)
-{
- MESSAGE("AddNewAlgorithms");
-
- // VSR: added temporarily - to be removed - objects are published automatically by engine
- SALOMEDS::SObject_var SO = myStudy->FindObjectIOR( IOR );
- if ( !SO->_is_nil() )
- return SO->GetID();
-
- //Find or Create Algorithms root
- SALOMEDS::SObject_var AlgorithmsRoot;
- SALOMEDS::GenericAttribute_var anAttr;
- SALOMEDS::AttributeName_var aName;
- SALOMEDS::AttributeIOR_var anIOR;
- SALOMEDS::AttributeSelectable_var aSelAttr;
- SALOMEDS::AttributePixMap_var aPixmap;
-
- if (!mySComponentMesh->FindSubObject (Tag_AlgorithmsRoot, AlgorithmsRoot)) {
- AlgorithmsRoot = myStudyBuilder->NewObjectToTag (mySComponentMesh, Tag_AlgorithmsRoot);
- anAttr = myStudyBuilder->FindOrCreateAttribute(AlgorithmsRoot, "AttributeName");
- aName = SALOMEDS::AttributeName::_narrow(anAttr);
- aName->SetValue(QObject::tr("SMESH_MEN_ALGORITHMS"));
- anAttr = myStudyBuilder->FindOrCreateAttribute(AlgorithmsRoot, "AttributeSelectable");
- aSelAttr = SALOMEDS::AttributeSelectable::_narrow(anAttr);
- aSelAttr->SetSelectable(false);
- anAttr = myStudyBuilder->FindOrCreateAttribute(AlgorithmsRoot, "AttributePixMap");
- aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr);
- aPixmap->SetPixMap( "ICON_SMESH_TREE_ALGO" );
- }
- // Add New Algorithms
- SALOMEDS::SObject_var newHypo = myStudyBuilder->NewObject(AlgorithmsRoot);
- anAttr = myStudyBuilder->FindOrCreateAttribute(newHypo, "AttributePixMap");
- aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr);
- SMESH::SMESH_Hypothesis_var H = SMESH::SMESH_Hypothesis::_narrow( StringToObject(IOR) );
- QString aType = H->GetName();
- aPixmap->SetPixMap( "ICON_SMESH_TREE_ALGO_" + aType );
-// if ( aType.compare("Regular_1D") == 0 )
-// aPixmap->SetPixMap( "ICON_SMESH_TREE_ALGO_REGULAR" );
-// else if ( aType.compare("MEFISTO_2D") == 0 )
-// aPixmap->SetPixMap( "ICON_SMESH_TREE_ALGO_MEFISTO" );
-// else if ( aType.compare("Quadrangle_2D") == 0 )
-// aPixmap->SetPixMap( "ICON_SMESH_TREE_ALGO_QUAD" );
-// else if ( aType.compare("Hexa_3D") == 0 )
-// aPixmap->SetPixMap( "ICON_SMESH_TREE_ALGO_HEXA" );
- anAttr = myStudyBuilder->FindOrCreateAttribute(newHypo, "AttributeIOR");
- anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
- anIOR->SetValue(IOR);
- return SALOMEDS::SObject::_narrow(newHypo)->GetID();
-}
-
-void SMESH_Swig::SetShape(const char* ShapeEntry, const char* MeshEntry)
-{
- SALOMEDS::SObject_var SO_MorSM = myStudy->FindObjectID( MeshEntry );
- SALOMEDS::SObject_var SO_GeomShape = myStudy->FindObjectID( ShapeEntry );
-
- if ( !SO_MorSM->_is_nil() && !SO_GeomShape->_is_nil() ) {
- SALOMEDS::SObject_var SO = myStudyBuilder->NewObjectToTag (SO_MorSM, Tag_RefOnShape);
- myStudyBuilder->Addreference (SO,SO_GeomShape);
- }
-}
-
-void SMESH_Swig::SetHypothesis(const char* Mesh_Or_SubMesh_Entry, const char* Hypothesis_Entry)
-{
- SALOMEDS::SObject_var SO_MorSM = myStudy->FindObjectID( Mesh_Or_SubMesh_Entry );
- SALOMEDS::SObject_var SO_Hypothesis = myStudy->FindObjectID( Hypothesis_Entry );
- SALOMEDS::GenericAttribute_var anAttr;
- SALOMEDS::AttributeName_var aName;
- SALOMEDS::AttributeSelectable_var aSelAttr;
- SALOMEDS::AttributePixMap_var aPixmap;
-
- if ( !SO_MorSM->_is_nil() && !SO_Hypothesis->_is_nil() ) {
-
- //Find or Create Applied Hypothesis root
- SALOMEDS::SObject_var AHR;
- if (!SO_MorSM->FindSubObject (Tag_RefOnAppliedHypothesis, AHR)) {
- AHR = myStudyBuilder->NewObjectToTag (SO_MorSM, Tag_RefOnAppliedHypothesis);
- anAttr = myStudyBuilder->FindOrCreateAttribute(AHR, "AttributeName");
- aName = SALOMEDS::AttributeName::_narrow(anAttr);
- aName->SetValue(QObject::tr("SMESH_MEN_APPLIED_HYPOTHESIS"));
- anAttr = myStudyBuilder->FindOrCreateAttribute(AHR, "AttributeSelectable");
- aSelAttr = SALOMEDS::AttributeSelectable::_narrow(anAttr);
- aSelAttr->SetSelectable(false);
- anAttr = myStudyBuilder->FindOrCreateAttribute(AHR, "AttributePixMap");
- aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr);
- aPixmap->SetPixMap( "ICON_SMESH_TREE_HYPO" );
- }
- SALOMEDS::SObject_var SO = myStudyBuilder->NewObject(AHR);
- myStudyBuilder->Addreference (SO,SO_Hypothesis);
- }
-}
-
-void SMESH_Swig::SetAlgorithms(const char* Mesh_Or_SubMesh_Entry, const char* Algorithms_Entry)
-{
- SALOMEDS::SObject_var SO_MorSM = myStudy->FindObjectID( Mesh_Or_SubMesh_Entry );
- SALOMEDS::SObject_var SO_Algorithms = myStudy->FindObjectID( Algorithms_Entry );
- SALOMEDS::GenericAttribute_var anAttr;
- SALOMEDS::AttributeName_var aName;
- SALOMEDS::AttributeSelectable_var aSelAttr;
- SALOMEDS::AttributePixMap_var aPixmap;
-
- if ( !SO_MorSM->_is_nil() && !SO_Algorithms->_is_nil() ) {
- //Find or Create Applied Algorithms root
- SALOMEDS::SObject_var AHR;
- if (!SO_MorSM->FindSubObject (Tag_RefOnAppliedAlgorithms, AHR)) {
- AHR = myStudyBuilder->NewObjectToTag (SO_MorSM, Tag_RefOnAppliedAlgorithms);
- anAttr = myStudyBuilder->FindOrCreateAttribute(AHR, "AttributeName");
- aName = SALOMEDS::AttributeName::_narrow(anAttr);
- aName->SetValue(QObject::tr("SMESH_MEN_APPLIED_ALGORIHTMS"));
- anAttr = myStudyBuilder->FindOrCreateAttribute(AHR, "AttributeSelectable");
- aSelAttr = SALOMEDS::AttributeSelectable::_narrow(anAttr);
- aSelAttr->SetSelectable(false);
- anAttr = myStudyBuilder->FindOrCreateAttribute(AHR, "AttributePixMap");
- aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr);
- aPixmap->SetPixMap( "ICON_SMESH_TREE_ALGO" );
- }
- SALOMEDS::SObject_var SO = myStudyBuilder->NewObject(AHR);
- myStudyBuilder->Addreference (SO,SO_Algorithms);
- }
-}
-
-void SMESH_Swig::UnSetHypothesis(const char* Applied_Hypothesis_Entry )
-{
- SALOMEDS::SObject_var SO_Applied_Hypothesis = myStudy->FindObjectID( Applied_Hypothesis_Entry );
- if ( !SO_Applied_Hypothesis->_is_nil() )
- myStudyBuilder->RemoveObject(SO_Applied_Hypothesis);
-}
-
-const char* SMESH_Swig::AddSubMesh(const char* SO_Mesh_Entry, const char* SM_IOR, int ST)
-{
- SALOMEDS::SObject_var SO_Mesh = myStudy->FindObjectID( SO_Mesh_Entry );
- if ( !SO_Mesh->_is_nil() ) {
-
- long Tag_Shape ;
- Standard_CString Name;
-
- if (ST == TopAbs_SOLID) {Tag_Shape = Tag_SubMeshOnSolid; Name = strdup(QObject::tr("SMESH_MEN_SubMeshesOnSolid"));}
- else if (ST == TopAbs_FACE) {Tag_Shape = Tag_SubMeshOnFace; Name = strdup(QObject::tr("SMESH_MEN_SubMeshesOnFace"));}
- else if (ST == TopAbs_EDGE) {Tag_Shape = Tag_SubMeshOnEdge; Name = strdup(QObject::tr("SMESH_MEN_SubMeshesOnEdge"));}
- else if (ST == TopAbs_VERTEX){Tag_Shape = Tag_SubMeshOnVertex; Name = strdup(QObject::tr("SMESH_MEN_SubMeshesOnVertex"));}
- else {
- Tag_Shape = Tag_SubMeshOnCompound; Name = strdup(QObject::tr("SMESH_MEN_SubMeshesOnCompound"));
- }
- SALOMEDS::SObject_var SubmeshesRoot;
- SALOMEDS::GenericAttribute_var anAttr;
- SALOMEDS::AttributeName_var aName;
- SALOMEDS::AttributeIOR_var anIOR;
- SALOMEDS::AttributeSelectable_var aSelAttr;
- if (!SO_Mesh->FindSubObject (Tag_Shape,SubmeshesRoot )) {
- SubmeshesRoot = myStudyBuilder->NewObjectToTag (SO_Mesh, Tag_Shape);
- anAttr = myStudyBuilder->FindOrCreateAttribute(SubmeshesRoot, "AttributeName");
- aName = SALOMEDS::AttributeName::_narrow(anAttr);
- aName->SetValue(Name);
- anAttr = myStudyBuilder->FindOrCreateAttribute(SubmeshesRoot, "AttributeSelectable");
- aSelAttr = SALOMEDS::AttributeSelectable::_narrow(anAttr);
- aSelAttr->SetSelectable(false);
- }
-
- free(Name);
-
- SALOMEDS::SObject_var SO = myStudyBuilder->NewObject (SubmeshesRoot);
- anAttr = myStudyBuilder->FindOrCreateAttribute(SO, "AttributeIOR");
- anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr);
- anIOR->SetValue(SM_IOR);
- return SALOMEDS::SObject::_narrow( SO )->GetID();
- }
- return "";
-}
-
-const char* SMESH_Swig::AddSubMeshOnShape(const char* Mesh_Entry, const char* GeomShape_Entry,
- const char* SM_IOR, int ST)
-{
- SALOMEDS::SObject_var SO_GeomShape = myStudy->FindObjectID( GeomShape_Entry );
- if ( !SO_GeomShape->_is_nil() ) {
- const char * SM_Entry = AddSubMesh (Mesh_Entry,SM_IOR,ST);
- SALOMEDS::SObject_var SO_SM = myStudy->FindObjectID( SM_Entry );
- if ( !SO_SM->_is_nil() ) {
- SetShape (GeomShape_Entry, SM_Entry);
- return SALOMEDS::SObject::_narrow( SO_SM )->GetID();
- }
- }
- return "";
-}
-
-void SMESH_Swig::CreateAndDisplayActor( const char* Mesh_Entry )
-{
- // SMESH_Actor* Mesh = smeshGUI->ReadScript(aM);
-}
-
-void SMESH_Swig::SetName(const char* Entry, const char* Name)
-{
- SALOMEDS::SObject_var SO = myStudy->FindObjectID( Entry );
- SALOMEDS::GenericAttribute_var anAttr;
- SALOMEDS::AttributeName_var aName;
- if ( !SO->_is_nil() ) {
- anAttr = myStudyBuilder->FindOrCreateAttribute(SO, "AttributeName");
- aName = SALOMEDS::AttributeName::_narrow(anAttr);
- aName->SetValue(Name);
- }
-}
-
-void SMESH_Swig::setOrb()
-{
- try {
- ORB_INIT &init = *SINGLETON_<ORB_INIT>::Instance();
- ASSERT(SINGLETON_<ORB_INIT>::IsAlreadyExisting());
- _orb = init( 0 , 0 );
- } catch (...) {
- INFOS("internal error : orb not found");
- _orb = 0;
- }
- ASSERT(! CORBA::is_nil(_orb));
-}
-
-//================================================================================
-/*!
- * \brief Set mesh icon according to compute status
- * \param Mesh_Entry - entry of a mesh
- * \param isComputed - is mesh computed or not
- */
-//================================================================================
-
-void SMESH_Swig::SetMeshIcon(const char* Mesh_Entry, const bool isComputed)
-{
- SALOMEDS::SObject_var mesh_var = myStudy->FindObjectID( Mesh_Entry );
- if ( !mesh_var->_is_nil() ) {
- _PTR(SObject) mesh = _PTR(SObject)(new SALOMEDS_SObject( mesh_var ));
- if ( mesh )
- SMESH::ModifiedMesh( mesh, isComputed );
- }
-}
+++ /dev/null
-// SMESH SMESH : GUI for SMESH component
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESHGUI_Swig.hxx
-// Author : Nicolas REJNERI
-// Module : SMESH
-// $Header$
-
-#ifndef _SMESHGUI_SWIG_HXX_
-#define _SMESHGUI_SWIG_HXX_
-
-// IDL Headers
-#include <SALOMEconfig.h>
-#include CORBA_SERVER_HEADER(SALOMEDS)
-#include CORBA_SERVER_HEADER(SALOMEDS_Attributes)
-
-class SMESH_Swig
-{
-public:
- SMESH_Swig();
- ~SMESH_Swig();
-
- static void setOrb();
-
- void Init(int studyID);
-
- const char* AddNewMesh(const char* IOR);
-
- const char* AddNewHypothesis(const char* IOR);
- const char* AddNewAlgorithms(const char* IOR);
-
- void SetShape(const char* ShapeEntry, const char* MeshEntry);
-
- void SetHypothesis(const char* Mesh_Or_SubMesh_Entry, const char* Hypothesis_Entry);
- void SetAlgorithms(const char* Mesh_Or_SubMesh_Entry, const char* Algorithms_Entry);
-
- void UnSetHypothesis(const char* Applied_Hypothesis_Entry );
-
- const char* AddSubMesh (const char* Mesh_Entry, const char* SM_IOR, int ST);
- const char* AddSubMeshOnShape (const char* Mesh_Entry, const char* GeomShape_Entry, const char* SM_IOR, int ST);
-
- void CreateAndDisplayActor( const char* Mesh_Entry );
-
- void SetName(const char* Entry, const char* Name);
-
- /*!
- * \brief Set mesh icon according to compute status
- * \param Mesh_Entry - entry of a mesh
- * \param isComputed - is mesh computed or not
- */
- void SetMeshIcon(const char* Mesh_Entry, const bool isComputed);
-
-private:
- SALOMEDS::Study_var myStudy;
- SALOMEDS::StudyBuilder_var myStudyBuilder;
- SALOMEDS::SComponent_var mySComponentMesh;
-
- // Tags definition
- long Tag_HypothesisRoot;
- long Tag_AlgorithmsRoot;
-
- long Tag_RefOnShape;
- long Tag_RefOnAppliedHypothesis;
- long Tag_RefOnAppliedAlgorithms;
-
- long Tag_SubMeshOnVertex;
- long Tag_SubMeshOnEdge;
- long Tag_SubMeshOnFace;
- long Tag_SubMeshOnSolid;
- long Tag_SubMeshOnCompound;
-};
-
-
-#endif
+++ /dev/null
-// SMESH SMESHGUI : GUI for SMESH component
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESHGUI_Swig.i
-// Author : Nicolas REJNERI
-// Module : SMESH
-// $Header$
-
-%{
-#include "SMESHGUI_Swig.hxx"
-%}
-
-%include "typemaps.i"
-
-class SMESH_Swig
-{
- public:
- SMESH_Swig();
- ~SMESH_Swig();
-
- void Init(int studyID);
-
- const char* AddNewMesh(const char* IOR);
- const char* AddNewHypothesis(const char* IOR);
- const char* AddNewAlgorithms(const char* IOR);
-
- void SetShape(const char* ShapeEntry, const char* MeshEntry);
-
- void SetHypothesis(const char* Mesh_Or_SubMesh_Entry, const char* Hypothesis_Entry);
- void SetAlgorithms(const char* Mesh_Or_SubMesh_Entry, const char* Algorithms_Entry);
-
- void UnSetHypothesis(const char* Applied_Hypothesis_Entry );
-
- const char* AddSubMesh (const char* Mesh_Entry, const char* SM_IOR, int ST);
- const char* AddSubMeshOnShape (const char* Mesh_Entry, const char* GeomShape_Entry, const char* SM_IOR, int ST);
-
- void SetName(const char* Entry, const char* Name);
-
- void SetMeshIcon(const char* Mesh_Entry, const bool isComputed);
-};
+++ /dev/null
-# This is a Qt message file in .po format. Each msgid starts with
-# a scope. This scope should *NOT* be translated - eg. "Foo::Bar"
-# would be translated to "Pub", not "Foo::Pub".
-msgid ""
-msgstr ""
-"Project-Id-Version: PROJECT VERSION\n"
-"POT-Creation-Date: 2002-05-28 10:57:43 AM CEST\n"
-"PO-Revision-Date: YYYY-MM-DD\n"
-"Last-Translator: FULLNAME <EMAIL@ADDRESS>\n"
-"Content-Type: text/plain; charset=iso-8859-1\n"
-
-
-#-----------------------------------------------------------
-# Divers Mesh
-#-----------------------------------------------------------
-
-#ObjectBrowser Icon
-msgid "ICON_OBJBROWSER_SMESH"
-msgstr "mesh.png"
-
-#Select Icon
-msgid "ICON_SELECT"
-msgstr "select1.png"
-
-#Mesh Init
-msgid "ICON_DLG_INIT_MESH"
-msgstr "mesh_init.png"
-
-#
-msgid "ICON_DLG_ADD_SUBMESH"
-msgstr "mesh_add_sub.png"
-
-#Move Node
-msgid "ICON_DLG_MOVE_NODE"
-msgstr "mesh_move_node.png"
-
-#Remove Node
-msgid "ICON_DLG_REM_NODE"
-msgstr "mesh_rem_node.png"
-
-#Remove Element
-msgid "ICON_DLG_REM_ELEMENT"
-msgstr "mesh_rem_element.png"
-
-#Orientation
-msgid "ICON_DLG_MESH_ORIENTATION"
-msgstr "mesh_orientation.png"
-
-#
-msgid "ICON_DLG_MESH_DIAGONAL"
-msgstr "mesh_diagonal.png"
-
-#Connectivity
-msgid "ICON_DLG_CONNECTIVITY"
-msgstr "mesh_connectivity.png"
-
-#Smoothing
-msgid "ICON_DLG_SMOOTHING"
-msgstr "mesh_smoothing.png"
-
-#Renumbering nodes
-msgid "ICON_DLG_RENUMBERING_NODES"
-msgstr "mesh_renumbering_nodes.png"
-
-#Renumbering elements
-msgid "ICON_DLG_RENUMBERING_ELEMENTS"
-msgstr "mesh_renumbering_elements.png"
-
-#Rotation
-msgid "ICON_DLG_ROTATION"
-msgstr "mesh_rotation.png"
-
-#Translation by vector
-msgid "ICON_SMESH_TRANSLATION_VECTOR"
-msgstr "mesh_translation_vector.png"
-
-#Translation by two points
-msgid "ICON_SMESH_TRANSLATION_POINTS"
-msgstr "mesh_translation_points.png"
-
-#Symmetry by point
-msgid "ICON_SMESH_SYMMETRY_POINT"
-msgstr "mesh_symmetry_point.png"
-
-#Symmetry by axis
-msgid "ICON_SMESH_SYMMETRY_AXIS"
-msgstr "mesh_symmetry_axis.png"
-
-#Symmetry by plane
-msgid "ICON_SMESH_SYMMETRY_PLANE"
-msgstr "mesh_symmetry_plane.png"
-
-#Sew free borders
-msgid "ICON_SMESH_SEWING_FREEBORDERS"
-msgstr "mesh_sew_freeborders.png"
-
-#Sew conform free borders
-msgid "ICON_SMESH_SEWING_CONFORM_FREEBORDERS"
-msgstr "mesh_sew_conform_freeborders.png"
-
-#Sew border to side
-msgid "ICON_SMESH_SEWING_BORDERTOSIDE"
-msgstr "mesh_sew_bordertoside.png"
-
-#Sew side elements
-msgid "ICON_SMESH_SEWING_SIDEELEMENTS"
-msgstr "mesh_sew_sideelements.png"
-
-#Merge nodes
-msgid "ICON_SMESH_MERGE_NODES"
-msgstr "mesh_merge_nodes.png"
-
-#-----------------------------------------------------------
-# Hypothesis
-#-----------------------------------------------------------
-
-#Set Algo
-msgid "ICON_DLG_ADD_ALGORITHM"
-msgstr "mesh_set_algo.png"
-
-#Set Hypo
-msgid "ICON_DLG_ADD_HYPOTHESIS"
-msgstr "mesh_set_hypo.png"
-
-#Edit Hypo.
-msgid "ICON_DLG_EDIT_MESH"
-msgstr "mesh_edit.png"
-
-
-#-----------------------------------------------------------
-# Elements
-#-----------------------------------------------------------
-
-#Vertex
-msgid "ICON_DLG_NODE"
-msgstr "mesh_vertex.png"
-
-#Line
-msgid "ICON_DLG_EDGE"
-msgstr "mesh_line.png"
-
-#triangle
-msgid "ICON_DLG_TRIANGLE"
-msgstr "mesh_triangle.png"
-
-#Quadrangle
-msgid "ICON_DLG_QUADRANGLE"
-msgstr "mesh_quad.png"
-
-#triangle
-msgid "ICON_DLG_TETRAS"
-msgstr "mesh_tetra.png"
-
-#Quadrangle
-msgid "ICON_DLG_HEXAS"
-msgstr "mesh_hexa.png"
-
-
-#-----------------------------------------------------------
-# ObjectBrowser
-#-----------------------------------------------------------
-
-#mesh_tree_mesh
-msgid "ICON_SMESH_TREE_MESH"
-msgstr "mesh_tree_mesh.png"
-
-#mesh_tree_group
-msgid "ICON_SMESH_TREE_GROUP"
-msgstr "mesh_tree_group.png"
-
-#mesh_tree_algo
-msgid "ICON_SMESH_TREE_ALGO"
-msgstr "mesh_tree_algo.png"
-
-#mesh_tree_hypo
-msgid "ICON_SMESH_TREE_HYPO"
-msgstr "mesh_tree_hypo.png"
-
-#mesh_tree_mesh_warn
-msgid "ICON_SMESH_TREE_MESH_WARN"
-msgstr "mesh_tree_mesh_warn.png"
-
-#mesh_tree_mesh
-msgid "ICON_SMESH_TREE_MESH_IMPORTED"
-msgstr "mesh_tree_importedmesh.png"
-
-
-#-----------------------------------------------------------
-# Group
-#-----------------------------------------------------------
-
-msgid "ICON_EDIT_GROUP"
-msgstr "mesh_edit_group.png"
-
-msgid "ICON_CONSTRUCT_GROUP"
-msgstr "mesh_make_group.png"
-
-#-----------------------------------------------------------
-# Mesh pattern
-#-----------------------------------------------------------
-
-msgid "ICON_PATTERN_2d"
-msgstr "mesh_algo_mefisto.png"
-
-msgid "ICON_PATTERN_3d"
-msgstr "mesh_algo_hexa.png"
-
-msgid "ICON_PATTERN_SAMPLE_2D"
-msgstr "pattern_sample_2d.png"
-
-msgid "ICON_PATTERN_SAMPLE_3D"
-msgstr "pattern_sample_3D.png"
-
-#-----------------------------------------------------------
-# Add/Remove buttons
-#-----------------------------------------------------------
-
-msgid "ICON_APPEND"
-msgstr "mesh_add.png"
-
-msgid "ICON_REMOVE"
-msgstr "mesh_remove.png"
\ No newline at end of file
+++ /dev/null
-// SMESH SMESH_I :
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESH.hxx
-// Author : Michael ZORIN
-// Module : SMESH
-// $Header:
-
-#ifndef _SMESH_SMESH_HXX_
-#define _SMESH_SMESH_HXX_
-
-// Tags definition
-enum {
- // Top level
- Tag_HypothesisRoot = 1, // hypotheses root
- Tag_AlgorithmsRoot = 2, // algorithms root
- // Mesh/Submesh
- Tag_RefOnShape = 1, // references to shape
- Tag_RefOnAppliedHypothesis = 2, // applied hypotheses root
- Tag_RefOnAppliedAlgorithms = 3, // applied algorithms root
- // Mesh only
- Tag_SubMeshOnVertex = 4, // sub-meshes roots by type
- Tag_SubMeshOnEdge = 5, // ...
- Tag_SubMeshOnWire = 6, // ...
- Tag_SubMeshOnFace = 7, // ...
- Tag_SubMeshOnShell = 8, // ...
- Tag_SubMeshOnSolid = 9, // ...
- Tag_SubMeshOnCompound = 10, // ...
- Tag_NodeGroups = 11, // Group roots by type
- Tag_EdgeGroups = 12, // ...
- Tag_FaceGroups = 13, // ...
- Tag_VolumeGroups = 14 // ...
-};
-
-#endif
-
+++ /dev/null
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-
-int main(int argc, char** argv)
-{
- return 1;
-}
+++ /dev/null
-// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESH_1D_Algo_i.cxx
-// Author : Paul RASCLE, EDF
-// Module : SMESH
-// $Header$
-
-using namespace std;
-#include "SMESH_1D_Algo_i.hxx"
-
-#include "utilities.h"
-
-//=============================================================================
-/*!
- * SMESH_1D_Algo_i::SMESH_1D_Algo_i
- *
- * Constructor
- */
-//=============================================================================
-
-SMESH_1D_Algo_i::SMESH_1D_Algo_i( PortableServer::POA_ptr thePOA )
- : SALOME::GenericObj_i( thePOA ),
- SMESH_Hypothesis_i( thePOA ),
- SMESH_Algo_i( thePOA )
-{
- MESSAGE( "SMESH_1D_Algo_i::SMESH_1D_Algo_i" );
-}
-
-//=============================================================================
-/*!
- * SMESH_1D_Algo_i::~SMESH_1D_Algo_i
- *
- * Destructor
- */
-//=============================================================================
-
-SMESH_1D_Algo_i::~SMESH_1D_Algo_i()
-{
- MESSAGE( "SMESH_1D_Algo_i::~SMESH_1D_Algo_i" );
-}
-
-//================================================================================
-/*!
- * \brief Verify whether algorithm supports given entity type
- * \param type - dimension (see SMESH::Dimension enumeration)
- * \retval CORBA::Boolean - TRUE if dimension is supported, FALSE otherwise
- *
- * Verify whether algorithm supports given entity type (see SMESH::Dimension enumeration)
- */
-//================================================================================
-CORBA::Boolean SMESH_1D_Algo_i::IsDimSupported( SMESH::Dimension type )
-{
- return type == SMESH::DIM_1D;
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+++ /dev/null
-// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESH_1D_Algo_i.hxx
-// Author : Paul RASCLE, EDF
-// Module : SMESH
-// $Header$
-
-#ifndef _SMESH_1D_ALGO_I_HXX_
-#define _SMESH_1D_ALGO_I_HXX_
-
-#include <SALOMEconfig.h>
-#include CORBA_SERVER_HEADER(SMESH_Hypothesis)
-
-#include "SMESH_Algo_i.hxx"
-
-// ======================================================
-// Generic 1D algorithm
-// ======================================================
-class SMESH_1D_Algo_i:
- public virtual POA_SMESH::SMESH_1D_Algo,
- public virtual SMESH_Algo_i
-{
-protected:
- // Constructor : placed in protected section to prohibit creation of generic class instance
- SMESH_1D_Algo_i( PortableServer::POA_ptr thePOA );
-
-public:
- // Destructor
- virtual ~SMESH_1D_Algo_i();
-
- // Verify whether algorithm supports given entity type
- CORBA::Boolean IsDimSupported( SMESH::Dimension type );
-};
-
-#endif
+++ /dev/null
-// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESH_2D_Algo_i.cxx
-// Author : Paul RASCLE, EDF
-// Module : SMESH
-// $Header$
-
-using namespace std;
-#include "SMESH_2D_Algo_i.hxx"
-
-#include "utilities.h"
-
-//=============================================================================
-/*!
- * SMESH_2D_Algo_i::SMESH_2D_Algo_i
- *
- * Constructor
- */
-//=============================================================================
-
-SMESH_2D_Algo_i::SMESH_2D_Algo_i( PortableServer::POA_ptr thePOA )
- : SALOME::GenericObj_i( thePOA ),
- SMESH_Hypothesis_i( thePOA ),
- SMESH_Algo_i( thePOA )
-{
- MESSAGE( "SMESH_2D_Algo_i::SMESH_2D_Algo_i" );
-}
-
-//=============================================================================
-/*!
- * SMESH_2D_Algo_i::~SMESH_2D_Algo_i
- *
- * Destructor
- */
-//=============================================================================
-
-SMESH_2D_Algo_i::~SMESH_2D_Algo_i()
-{
- MESSAGE( "SMESH_2D_Algo_i::~SMESH_2D_Algo_i" );
-}
-
-//================================================================================
-/*!
- * \brief Verify whether algorithm supports given entity type
- * \param type - dimension (see SMESH::Dimension enumeration)
- * \retval CORBA::Boolean - TRUE if dimension is supported, FALSE otherwise
- *
- * Verify whether algorithm supports given entity type (see SMESH::Dimension enumeration)
- */
-//================================================================================
-CORBA::Boolean SMESH_2D_Algo_i::IsDimSupported( SMESH::Dimension type )
-{
- return type == SMESH::DIM_2D;
-}
+++ /dev/null
-// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESH_2D_Algo_i.hxx
-// Author : Paul RASCLE, EDF
-// Module : SMESH
-// $Header$
-
-#ifndef _SMESH_2D_ALGO_I_HXX_
-#define _SMESH_2D_ALGO_I_HXX_
-
-#include <SALOMEconfig.h>
-#include CORBA_SERVER_HEADER(SMESH_Hypothesis)
-
-#include "SMESH_Algo_i.hxx"
-
-// ======================================================
-// Generic 2D algorithm
-// ======================================================
-class SMESH_2D_Algo_i:
- public virtual POA_SMESH::SMESH_2D_Algo,
- public virtual SMESH_Algo_i
-{
-protected:
- // Constructor : placed in protected section to prohibit creation of generic class instance
- SMESH_2D_Algo_i( PortableServer::POA_ptr thePOA );
-
-public:
- // Destructor
- virtual ~SMESH_2D_Algo_i();
-
- // Verify whether algorithm supports given entity type
- CORBA::Boolean IsDimSupported( SMESH::Dimension type );
-};
-
-#endif
+++ /dev/null
-// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESH_3D_Algo_i.cxx
-// Author : Paul RASCLE, EDF
-// Module : SMESH
-// $Header$
-
-using namespace std;
-#include "SMESH_3D_Algo_i.hxx"
-
-#include "utilities.h"
-
-//=============================================================================
-/*!
- * SMESH_3D_Algo_i::SMESH_3D_Algo_i
- *
- * Constructor
- */
-//=============================================================================
-
-SMESH_3D_Algo_i::SMESH_3D_Algo_i( PortableServer::POA_ptr thePOA )
- : SALOME::GenericObj_i( thePOA ),
- SMESH_Hypothesis_i( thePOA ),
- SMESH_Algo_i( thePOA )
-{
- MESSAGE( "SMESH_3D_Algo_i::SMESH_3D_Algo_i" );
-}
-
-//=============================================================================
-/*!
- * SMESH_3D_Algo_i::~SMESH_3D_Algo_i
- *
- * Destructor
- */
-//=============================================================================
-
-SMESH_3D_Algo_i::~SMESH_3D_Algo_i()
-{
- MESSAGE( "SMESH_3D_Algo_i::~SMESH_3D_Algo_i" );
-}
-
-//================================================================================
-/*!
- * \brief Verify whether algorithm supports given entity type
- * \param type - dimension (see SMESH::Dimension enumeration)
- * \retval CORBA::Boolean - TRUE if dimension is supported, FALSE otherwise
- *
- * Verify whether algorithm supports given entity type (see SMESH::Dimension enumeration)
- */
-//================================================================================
-CORBA::Boolean SMESH_3D_Algo_i::IsDimSupported( SMESH::Dimension type )
-{
- return type == SMESH::DIM_3D;
-}
-
+++ /dev/null
-// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESH_3D_Algo_i.hxx
-// Author : Paul RASCLE, EDF
-// Module : SMESH
-// $Header$
-
-#ifndef _SMESH_3D_ALGO_I_HXX_
-#define _SMESH_3D_ALGO_I_HXX_
-
-#include <SALOMEconfig.h>
-#include CORBA_SERVER_HEADER(SMESH_Hypothesis)
-
-#include "SMESH_Algo_i.hxx"
-
-// ======================================================
-// Generic 3D algorithm
-// ======================================================
-class SMESH_3D_Algo_i:
- public virtual POA_SMESH::SMESH_3D_Algo,
- public virtual SMESH_Algo_i
-{
-protected:
- // Constructor : placed in protected section to prohibit creation of generic class instance
- SMESH_3D_Algo_i( PortableServer::POA_ptr thePOA );
-
-public:
- // Destructor
- virtual ~SMESH_3D_Algo_i();
-
- // Verify whether algorithm supports given entity type
- CORBA::Boolean IsDimSupported( SMESH::Dimension type );
-};
-
-#endif
+++ /dev/null
-// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESH_Algo_i.cxx
-// Author : Paul RASCLE, EDF
-// Module : SMESH
-// $Header$
-
-using namespace std;
-#include "SMESH_Algo_i.hxx"
-#include "SMESH_Algo.hxx"
-
-#include "utilities.h"
-
-#include <string>
-#include <vector>
-
-//=============================================================================
-/*!
- * SMESH_Algo_i::SMESH_Algo_i
- *
- * Constructor
- */
-//=============================================================================
-
-SMESH_Algo_i::SMESH_Algo_i( PortableServer::POA_ptr thePOA )
- : SALOME::GenericObj_i( thePOA ),
- SMESH_Hypothesis_i( thePOA )
-{
- MESSAGE( "SMESH_Algo_i::SMESH_Algo_i" );
-}
-
-//=============================================================================
-/*!
- * SMESH_Algo_i::~SMESH_Algo_i
- *
- * Destructor
- */
-//=============================================================================
-
-SMESH_Algo_i::~SMESH_Algo_i()
-{
- MESSAGE( "SMESH_Algo_i::~SMESH_Algo_i" );
-}
-
-//=============================================================================
-/*!
- * SMESH_Algo_i::GetCompatibleHypothesis
- *
- * Gets list of compatible hypotheses
- */
-//=============================================================================
-
-SMESH::ListOfHypothesisName* SMESH_Algo_i::GetCompatibleHypothesis()
-{
- MESSAGE( "SMESH_Algo_i::GetCompatibleHypothesis" );
- SMESH::ListOfHypothesisName_var listOfHypothesis = new SMESH::ListOfHypothesisName;
- const vector<string>& hypList = ( ( ::SMESH_Algo* )myBaseImpl )->GetCompatibleHypothesis();
- int nbHyp = hypList.size();
- listOfHypothesis->length( nbHyp );
- for ( int i = 0; i < nbHyp; i++ ) {
- listOfHypothesis[ i ] = CORBA::string_dup( hypList[ i ].c_str() );
- }
- return listOfHypothesis._retn();
-}
+++ /dev/null
-// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESH_Algo_i.hxx
-// Author : Paul RASCLE, EDF
-// Module : SMESH
-// $Header$
-
-#ifndef _SMESH_ALGO_I_HXX_
-#define _SMESH_ALGO_I_HXX_
-
-#include <SALOMEconfig.h>
-#include CORBA_SERVER_HEADER(SMESH_Hypothesis)
-
-#include "SMESH_Hypothesis_i.hxx"
-
-// ======================================================
-// Generic algorithm
-// ======================================================
-class SMESH_Algo_i:
- public virtual POA_SMESH::SMESH_Algo,
- public virtual SMESH_Hypothesis_i
-{
-public:
- // Constructor : placed in protected section to prohibit creation of generic class instance
- SMESH_Algo_i( PortableServer::POA_ptr thePOA );
-
-public:
- // Destructor
- virtual ~SMESH_Algo_i();
-
- // Gets list of compatible hypotheses
- SMESH::ListOfHypothesisName* GetCompatibleHypothesis();
-};
-
-#endif
+++ /dev/null
-// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-// File : SMESH_Gen_i_1.cxx
-// Created : Thu Oct 21 17:24:06 2004
-// Author : Edward AGAPOV (eap)
-// Module : SMESH
-// $Header:
-
-#include "SMESH_Gen_i.hxx"
-
-#include "SMESH_Mesh_i.hxx"
-#include "SMESH_Hypothesis_i.hxx"
-#include "SMESH_Algo_i.hxx"
-#include "SMESH_Group_i.hxx"
-
-#include "SMESH.hxx"
-
-#include CORBA_CLIENT_HEADER(SALOME_ModuleCatalog)
-
-#include "utilities.h"
-#include "Utils_ExceptHandlers.hxx"
-
-#include <TCollection_AsciiString.hxx>
-
-#ifdef _DEBUG_
-static int MYDEBUG = 0;
-#else
-static int MYDEBUG = 0;
-#endif
-
-//=============================================================================
-/*!
- * Get...Tag [ static ]
- *
- * Methods which determine SMESH data model structure
- */
-//=============================================================================
-
-long SMESH_Gen_i::GetHypothesisRootTag()
-{
- return Tag_HypothesisRoot;
-}
-
-long SMESH_Gen_i::GetAlgorithmsRootTag()
-{
- return Tag_AlgorithmsRoot;
-}
-
-long SMESH_Gen_i::GetRefOnShapeTag()
-{
- return Tag_RefOnShape;
-}
-
-long SMESH_Gen_i::GetRefOnAppliedHypothesisTag()
-{
- return Tag_RefOnAppliedHypothesis;
-}
-
-long SMESH_Gen_i::GetRefOnAppliedAlgorithmsTag()
-{
- return Tag_RefOnAppliedAlgorithms;
-}
-
-long SMESH_Gen_i::GetSubMeshOnVertexTag()
-{
- return Tag_SubMeshOnVertex;
-}
-
-long SMESH_Gen_i::GetSubMeshOnEdgeTag()
-{
- return Tag_SubMeshOnEdge;
-}
-
-long SMESH_Gen_i::GetSubMeshOnFaceTag()
-{
- return Tag_SubMeshOnFace;
-}
-
-long SMESH_Gen_i::GetSubMeshOnSolidTag()
-{
- return Tag_SubMeshOnSolid;
-}
-
-long SMESH_Gen_i::GetSubMeshOnCompoundTag()
-{
- return Tag_SubMeshOnCompound;
-}
-
-long SMESH_Gen_i::GetSubMeshOnWireTag()
-{
- return Tag_SubMeshOnWire;
-}
-
-long SMESH_Gen_i::GetSubMeshOnShellTag()
-{
- return Tag_SubMeshOnShell;
-}
-
-long SMESH_Gen_i::GetNodeGroupsTag()
-{
- return Tag_NodeGroups;
-}
-
-long SMESH_Gen_i::GetEdgeGroupsTag()
-{
- return Tag_EdgeGroups;
-}
-
-long SMESH_Gen_i::GetFaceGroupsTag()
-{
- return Tag_FaceGroups;
-}
-
-long SMESH_Gen_i::GetVolumeGroupsTag()
-{
- return Tag_VolumeGroups;
-}
-
-//=============================================================================
-/*!
- * SMESH_Gen_i::CanPublishInStudy
- *
- * Returns true if object can be published in the study
- */
-//=============================================================================
-
-bool SMESH_Gen_i::CanPublishInStudy(CORBA::Object_ptr theIOR)
-{
- if(MYDEBUG) MESSAGE("CanPublishInStudy - "<<!CORBA::is_nil(myCurrentStudy));
- if(CORBA::is_nil(myCurrentStudy))
- return false;
-
- SMESH::SMESH_Mesh_var aMesh = SMESH::SMESH_Mesh::_narrow(theIOR);
- if( !aMesh->_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 SMESH_Gen_i::ObjectToSObject(SALOMEDS::Study_ptr theStudy,
- CORBA::Object_ptr theObject)
-{
- SALOMEDS::SObject_var aSO;
- if ( !CORBA::is_nil( theStudy ) && !CORBA::is_nil( theObject ))
- aSO = theStudy->FindObjectIOR( SMESH_Gen_i::GetORB()->object_to_string( theObject ) );
- return aSO._retn();
-}
-
-//=======================================================================
-//function : objectToServant
-//purpose :
-//=======================================================================
-
-template<typename T> static inline T* objectToServant( CORBA::Object_ptr theIOR )
-{
- return dynamic_cast<T*>( 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 ))
- aShapeObj = GEOM::GEOM_Object::_narrow
- ( GetORB()->string_to_object( IOR.ToCString() ) );
- }
- 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_var 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 = SMESH_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" );
- SALOMEDS::AttributeIOR::_narrow(anAttr)->SetValue
- ( SMESH_Gen_i::GetORB()->object_to_string( theIOR ) );
- }
- if ( thePixMap ) {
- anAttr = aStudyBuilder->FindOrCreateAttribute( SO, "AttributePixMap" );
- SALOMEDS::AttributePixMap::_narrow( anAttr )->SetPixMap( thePixMap );
- }
- if ( !theSelectable ) {
- anAttr = aStudyBuilder->FindOrCreateAttribute( SO, "AttributeSelectable" );
- SALOMEDS::AttributeSelectable::_narrow( anAttr )->SetSelectable( false );
- }
- return SO._retn();
-}
-
-//=======================================================================
-//function : setName
-//purpose :
-//=======================================================================
-
-void SMESH_Gen_i::SetName(SALOMEDS::SObject_ptr theSObject,
- const char* theName,
- const char* theDefaultName)
-{
- 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 );
- 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() );
- aNameAttr->SetValue( aName.ToCString() );
- }
- }
- }
-}
-
-//=======================================================================
-//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 ) {
- bool isReferred = false;
- SALOMEDS::ChildIterator_var anIter = theStudy->NewChildIterator( theSObject );
- for ( ; !isReferred && anIter->More(); anIter->Next() ) {
- if ( anIter->Value()->ReferencedObject( aReferenceSO ) &&
- strcmp( aReferenceSO->GetID(), aToObjSO->GetID() ) == 0 )
- isReferred = true;
- }
- if ( !isReferred ) {
- aReferenceSO = aStudyBuilder->NewObject( theSObject );
- aStudyBuilder->Addreference( aReferenceSO, aToObjSO );
- }
- }
- else {
- 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 SMESH_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 );
- if( !aMesh->_is_nil() )
- aSO = PublishMesh( theStudy, aMesh, 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 SMESH_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();
-
- SALOME_ModuleCatalog::ModuleCatalog_var aCat =
- SALOME_ModuleCatalog::ModuleCatalog::_narrow( GetNS()->Resolve("/Kernel/ModulCatalog") );
- if ( CORBA::is_nil( aCat ) )
- return father._retn();
-
- SALOME_ModuleCatalog::Acomponent_var aComp = aCat->GetComponent( ComponentDataType() );
- if ( CORBA::is_nil( aComp ) )
- return father._retn();
-
- SALOMEDS::StudyBuilder_var aStudyBuilder = theStudy->NewBuilder();
- SALOMEDS::GenericAttribute_var anAttr;
- SALOMEDS::AttributePixMap_var aPixmap;
-
- father = aStudyBuilder->NewComponent( ComponentDataType() );
- aStudyBuilder->DefineComponentInstance( father, SMESH_Gen::_this() );
- anAttr = aStudyBuilder->FindOrCreateAttribute( father, "AttributePixMap" );
- aPixmap = SALOMEDS::AttributePixMap::_narrow( anAttr );
- aPixmap ->SetPixMap( "ICON_OBJBROWSER_SMESH" );
- SetName( father, aComp->componentusername(), "MESH" );
- if(MYDEBUG) MESSAGE("PublishComponent--END");
-
- return father._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 SMESH_Gen_i::PublishMesh (SALOMEDS::Study_ptr theStudy,
- SMESH::SMESH_Mesh_ptr theMesh,
- const char* theName)
-{
- if ( CORBA::is_nil( theStudy ) ||
- CORBA::is_nil( theMesh ))
- return SALOMEDS::SComponent::_nil();
- if(MYDEBUG) MESSAGE("PublishMesh--IN");
-
- // find or publish a mesh
-
- SALOMEDS::SObject_var aMeshSO = ObjectToSObject( theStudy, theMesh );
- if ( aMeshSO->_is_nil() )
- {
- SALOMEDS::SComponent_var father = PublishComponent( theStudy );
- if ( father->_is_nil() )
- return aMeshSO._retn();
-
- // Find correct free tag
- long aTag = findMaxChildTag( father.in() );
- if ( aTag <= GetAlgorithmsRootTag() )
- aTag = GetAlgorithmsRootTag() + 1;
- else
- aTag++;
-
- aMeshSO = publish (theStudy, theMesh, father, aTag, "ICON_SMESH_TREE_MESH_WARN" );
- if ( aMeshSO->_is_nil() )
- return aMeshSO._retn();
- }
- SetName( aMeshSO, theName, "Mesh" );
-
- // 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 * hypList = theMesh->GetHypothesisList( aShapeObject );
- 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, aShapeObject, aHyp );
- }
- }
-
- // Publish submeshes
-
- SMESH_Mesh_i* mesh_i = objectToServant<SMESH_Mesh_i>( theMesh );
- if ( !mesh_i )
- return aMeshSO._retn();
- map<int, SMESH_subMesh_i*>& subMap = mesh_i->_mapSubMesh_i;
- map<int, SMESH_subMesh_i*>::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<int, SMESH::SMESH_GroupBase_ptr>& grMap = mesh_i->getGroups();
- map<int, SMESH::SMESH_GroupBase_ptr>::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("PublishMesh_END");
- return aMeshSO._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;
- 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" };
-
- // 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 < 5 )
- 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();
- 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 ( theShape->_is_nil() || theMesh->_is_nil() )
- return aMeshOrSubMesh._retn();
-
- TopoDS_Shape aShape = GeomObjectToShape( theShape );
- SMESH_Mesh_i* mesh_i = objectToServant<SMESH_Mesh_i>( 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() )
- 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<SMESH_Mesh_i>( 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() )
- 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;
-}
-
+++ /dev/null
-// SMESH SMESH_I : idl implementation based on 'SMESH' unit's classes
-//
-// Copyright (C) 2004 CEA
-//
-// 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.org
-//
-//
-//
-// File : SMESH_Group_i.hxx
-// Author : Sergey ANIKIN, OCC
-// Module : SMESH
-// $Header$
-
-
-#ifndef SMESH_Group_i_HeaderFile
-#define SMESH_Group_i_HeaderFile
-
-#include <SALOMEconfig.h>
-#include CORBA_SERVER_HEADER(SMESH_Group)
-#include CORBA_SERVER_HEADER(SMESH_Mesh)
-#include CORBA_CLIENT_HEADER(GEOM_Gen)
-
-#include "SALOME_GenericObj_i.hh"
-
-class SMESH_Mesh_i;
-class SMESH_Group;
-class SMESHDS_GroupBase;
-
-// ===========
-// Group Base
-// ===========
-class SMESH_GroupBase_i:
- public virtual POA_SMESH::SMESH_GroupBase,
- public virtual SALOME::GenericObj_i
-{
- public:
- SMESH_GroupBase_i(PortableServer::POA_ptr thePOA,
- SMESH_Mesh_i* theMeshServant,
- const int theLocalID );
- virtual ~SMESH_GroupBase_i();
-
- // CORBA interface implementation
- void SetName(const char* name);
- char* GetName();
- SMESH::ElementType GetType();
- CORBA::Long Size();
- CORBA::Boolean IsEmpty();
- CORBA::Boolean Contains(CORBA::Long elem_id);
- CORBA::Long GetID(CORBA::Long elem_index);
- SMESH::long_array* GetListOfID();
- SMESH::SMESH_Mesh_ptr GetMesh();
-
- // Inherited from SMESH_IDSource interface
- virtual SMESH::long_array* GetIDs();
-
- // Internal C++ interface
- int GetLocalID() const { return myLocalID; }
- SMESH_Mesh_i* GetMeshServant() const { return myMeshServant; }
- SMESH_Group* GetSmeshGroup() const;
- SMESHDS_GroupBase* GetGroupDS() const;
-
-private:
- SMESH_Mesh_i* myMeshServant;
- int myLocalID;
-};
-
-// ======
-// Group
-// ======
-
-class SMESH_Group_i:
- public virtual POA_SMESH::SMESH_Group,
- public SMESH_GroupBase_i
-{
- public:
- SMESH_Group_i( PortableServer::POA_ptr thePOA, SMESH_Mesh_i* theMeshServant, const int theLocalID );
-
- // CORBA interface implementation
- void Clear();
- CORBA::Long Add( const SMESH::long_array& theIDs );
- CORBA::Long Remove( const SMESH::long_array& theIDs );
-
- CORBA::Long AddByPredicate( SMESH::Predicate_ptr thePredicate );
- CORBA::Long RemoveByPredicate( SMESH::Predicate_ptr thePredicate );
-};
-
-// =========================
-// Group linked to geometry
-// =========================
-
-class SMESH_GroupOnGeom_i:
- public virtual POA_SMESH::SMESH_GroupOnGeom,
- public SMESH_GroupBase_i
-{
- public:
- SMESH_GroupOnGeom_i( PortableServer::POA_ptr thePOA, SMESH_Mesh_i* theMeshServant, const int theLocalID );
-
- // CORBA interface implementation
- GEOM::GEOM_Object_ptr GetShape();
-};
-#endif
+++ /dev/null
-// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESH_Hypothesis_i.cxx
-// Author : Paul RASCLE, EDF
-// Module : SMESH
-// $Header$
-
-using namespace std;
-#include <iostream>
-#include <sstream>
-#include "SMESH_Hypothesis_i.hxx"
-#include "utilities.h"
-
-//=============================================================================
-/*!
- * SMESH_Hypothesis_i::SMESH_Hypothesis_i
- *
- * Constructor
- */
-//=============================================================================
-
-SMESH_Hypothesis_i::SMESH_Hypothesis_i( PortableServer::POA_ptr thePOA )
- : SALOME::GenericObj_i( thePOA )
-{
- MESSAGE( "SMESH_Hypothesis_i::SMESH_Hypothesis_i / Début" );
- myBaseImpl = 0;
- // _CS_gbo This instruction fails
- // thePOA->activate_object( this );
- // _CS_gbo I keep the POA reference to activate the object in the future.
- myPOA = thePOA;
-
- MESSAGE( "SMESH_Hypothesis_i::SMESH_Hypothesis_i / Fin" );
-};
-
-//=============================================================================
-/*!
- * SMESH_Hypothesis_i::Activate()
- *
- * Activation of the object
- */
-//=============================================================================
-void SMESH_Hypothesis_i::Activate() {
- myPOA->activate_object( this );
-}
-
-//=============================================================================
-/*!
- * SMESH_Hypothesis_i::~SMESH_Hypothesis_i
- *
- * Destructor
- */
-//=============================================================================
-
-SMESH_Hypothesis_i::~SMESH_Hypothesis_i()
-{
- MESSAGE( "SMESH_Hypothesis_i::~SMESH_Hypothesis_i" );
- if ( myBaseImpl )
- delete myBaseImpl;
-};
-
-//=============================================================================
-/*!
- * SMESH_Hypothesis_i::GetName
- *
- * Get type name of hypothesis
- */
-//=============================================================================
-
-char* SMESH_Hypothesis_i::GetName()
-{
- MESSAGE( "SMESH_Hypothesis_i::GetName" );
- return CORBA::string_dup( myBaseImpl->GetName() );
-};
-
-//=============================================================================
-/*!
- * SMESH_Hypothesis_i::GetLibName
- *
- * Get plugin library name of hypothesis (required by persistency mechanism)
- */
-//=============================================================================
-
-char* SMESH_Hypothesis_i::GetLibName()
-{
- MESSAGE( "SMESH_Hypothesis_i::GetLibName" );
- return CORBA::string_dup( myBaseImpl->GetLibName() );
-};
-
-//=============================================================================
-/*!
- * SMESH_Hypothesis_i::SetLibName
- *
- * Set plugin library name of hypothesis (required by persistency mechanism)
- */
-//=============================================================================
-
-void SMESH_Hypothesis_i::SetLibName(const char* theLibName)
-{
- MESSAGE( "SMESH_Hypothesis_i::SetLibName" );
- myBaseImpl->SetLibName( theLibName );
-};
-
-//=============================================================================
-/*!
- * SMESH_Hypothesis_i::GetId
- *
- * Get unique id of hypothesis
- */
-//=============================================================================
-
-CORBA::Long SMESH_Hypothesis_i::GetId()
-{
- MESSAGE( "SMESH_Hypothesis_i::GetId" );
- return myBaseImpl->GetID();
-}
-
-//=============================================================================
-/*!
- * SMESH_Hypothesis_i::GetImpl
- *
- * Get implementation
- */
-//=============================================================================
-
-::SMESH_Hypothesis* SMESH_Hypothesis_i::GetImpl()
-{
- MESSAGE( "SMESH_Hypothesis_i::GetImpl" );
- return myBaseImpl;
-}
-
-//=============================================================================
-/*!
- * SMESH_Hypothesis_i::SaveTo
- *
- * Persistence: Dumps parameters to the string stream
- */
-//=============================================================================
-
-char* SMESH_Hypothesis_i::SaveTo()
-{
- MESSAGE( "SMESH_Hypothesis_i::SaveTo" );
- std::ostringstream os;
- myBaseImpl->SaveTo( os );
- return CORBA::string_dup( os.str().c_str() );
-}
-
-//=============================================================================
-/*!
-* SMESH_Hypothesis_i::LoadFrom
-*
-* Persistence: Restores parameters from string
-*/
-//=============================================================================
-
-void SMESH_Hypothesis_i::LoadFrom( const char* theStream )
-{
- MESSAGE( "SMESH_Hypothesis_i::LoadFrom" );
- std::istringstream is( theStream );
- myBaseImpl->LoadFrom( is );
-}
+++ /dev/null
-// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESH_Hypothesis_i.hxx
-// Author : Paul RASCLE, EDF
-// Module : SMESH
-// $Header$
-
-#ifndef _SMESH_HYPOTHESIS_I_HXX_
-#define _SMESH_HYPOTHESIS_I_HXX_
-
-#include <SALOMEconfig.h>
-#include CORBA_SERVER_HEADER(SMESH_Hypothesis)
-
-#include "SMESH_Hypothesis.hxx"
-#include "SALOME_GenericObj_i.hh"
-
-#include "SMESH_Gen.hxx"
-
-// ======================================================
-// Generic hypothesis
-// ======================================================
-class SMESH_Hypothesis_i:
- public virtual POA_SMESH::SMESH_Hypothesis,
- public virtual SALOME::GenericObj_i
-{
-public:
- // Constructor : placed in protected section to prohibit creation of generic class instance
- SMESH_Hypothesis_i( PortableServer::POA_ptr thePOA );
-
-public:
- // Destructor
- virtual ~SMESH_Hypothesis_i();
-
- // Get type name of hypothesis
- char* GetName();
-
- // Get plugin library name of hypothesis
- char* GetLibName();
-
- // Set plugin library name of hypothesis
- void SetLibName( const char* theLibName );
-
- // Get unique id of hypothesis
- CORBA::Long GetId();
-
- // Get implementation
- ::SMESH_Hypothesis* GetImpl();
-
- // _CS_gbo_ Activate the object using the POA
- void Activate();
-
- // Persistence
- virtual char* SaveTo();
- virtual void LoadFrom( const char* theStream );
-
-protected:
- ::SMESH_Hypothesis* myBaseImpl; // base hypothesis implementation
-
- // _CS_gbo_070505 To keep the reference and delayed the activation
- // in the methode Activate().
- PortableServer::POA_ptr myPOA;
-};
-
-// ======================================================
-// Generic hypothesis creator
-// ======================================================
-class GenericHypothesisCreator_i
-{
-public:
- // Create a hypothesis
- virtual SMESH_Hypothesis_i* Create(PortableServer::POA_ptr thePOA,
- int theStudyId,
- ::SMESH_Gen* theGenImpl) = 0;
-};
-
-//=============================================================================
-//
-// Specific Hypothesis Creators are generated with a template which inherits a
-// generic hypothesis creator. Each creator returns an hypothesis of the type
-// given in the template.
-//
-//=============================================================================
-template <class T> class HypothesisCreator_i: public GenericHypothesisCreator_i
-{
-public:
- virtual SMESH_Hypothesis_i* Create (PortableServer::POA_ptr thePOA,
- int theStudyId,
- ::SMESH_Gen* theGenImpl)
- {
- return new T (thePOA, theStudyId, theGenImpl);
- };
-};
-
-#endif
+++ /dev/null
-// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESH_MEDFamily_i.cxx
-// Module : SMESH
-
-using namespace std;
-#include "SMESH_MEDFamily_i.hxx"
-#include "utilities.h"
-#include "Utils_CorbaException.hxx"
-
-//=============================================================================
-/*!
- * Default constructor
- */
-//=============================================================================
-SMESH_MEDFamily_i::SMESH_MEDFamily_i()
-{
- BEGIN_OF("Default Constructor SMESH_MEDFamily_i");
- END_OF("Default Constructor SMESH_MEDFamily_i");
-}
-//=============================================================================
-/*!
- * constructor par recopie
- */
-//=============================================================================
-SMESH_MEDFamily_i::SMESH_MEDFamily_i(const SMESH_MEDFamily_i & f):
- SMESH_MEDSupport_i(f._subMesh_i,f._name,f._description,f._entity),
- _subMesh_i(f._subMesh_i),
- _identifier(f._identifier),
- _numberOfAttribute(f._numberOfAttribute),
- _numberOfGroup(f._numberOfGroup),
- _attributeValue(f._attributeValue)
-{
- BEGIN_OF("Copy Constructor SMESH_MEDFamily_i");
- _attributeDescription=new string[_numberOfAttribute];
- for (int i=0;i<_numberOfAttribute;i++) {
- _attributeDescription[i]=f._attributeDescription[i];
- };
- _groupName=new string[_numberOfGroup];
- for (int i=0;i<_numberOfAttribute;i++) {
- _groupName[i]=f._groupName[i];
- };
- END_OF("Copy Constructor SMESH_MEDFamily_i");
-}
-//=============================================================================
-/*!
- * Destructor
- */
-//=============================================================================
-SMESH_MEDFamily_i::~SMESH_MEDFamily_i()
-{
-}
-//=============================================================================
-/*!
- * Constructor
- */
-//=============================================================================
-SMESH_MEDFamily_i::SMESH_MEDFamily_i(int identifier, SMESH_subMesh_i* sm,
- string name, string description, SALOME_MED::medEntityMesh entity):
- SMESH_MEDSupport_i( sm, name, description, entity ),
-
- _subMesh_i(sm),
- _identifier(identifier),
- _numberOfAttribute(0),
- _attributeIdentifier((int*)NULL),
- _attributeValue((int*)NULL),
- _attributeDescription((string*)NULL),
- _numberOfGroup(0),
- _groupName((string*)NULL)
-{
- BEGIN_OF("Constructor SMESH_MEDFamily_i");
- END_OF("Constructor SMESH_MEDFamily_i");
-}
-//=============================================================================
-/*!
- * CORBA: Accessor for Family's Identifier
- */
-//=============================================================================
-
-CORBA::Long SMESH_MEDFamily_i::getIdentifier()
-throw (SALOME::SALOME_Exception)
-{
- if (_subMeshDS==NULL)
- THROW_SALOME_CORBA_EXCEPTION("No associated Family",\
- SALOME::INTERNAL_ERROR);
- return _identifier;
-
-}
-//=============================================================================
-/*!
- * CORBA: Accessor for number of attributes
- */
-//=============================================================================
-CORBA::Long SMESH_MEDFamily_i::getNumberOfAttributes()
-throw (SALOME::SALOME_Exception)
-{
- if (_subMeshDS==NULL)
- THROW_SALOME_CORBA_EXCEPTION("No associated Family",\
- SALOME::INTERNAL_ERROR);
- return _numberOfAttribute;
-}
-//=============================================================================
-/*!
- * CORBA: Accessor for attributes identifiers
- */
-//=============================================================================
-SALOME_MED::long_array* SMESH_MEDFamily_i::getAttributesIdentifiers()
-throw (SALOME::SALOME_Exception)
-{
- if (_subMeshDS==NULL)
- THROW_SALOME_CORBA_EXCEPTION("No associated Family",\
- SALOME::INTERNAL_ERROR);
- if (_numberOfAttribute == 0)
- {
- MESSAGE("Les familles SMESH n ont pas d attribut");
- THROW_SALOME_CORBA_EXCEPTION("No attributes"\
- ,SALOME::BAD_PARAM);
- };
-
- SALOME_MED::long_array_var myseq= new SALOME_MED::long_array;
- myseq->length(_numberOfAttribute);
- for (int i=0;i<_numberOfAttribute;i++)
- {
- myseq[i]=_attributeIdentifier[i];
- };
- return myseq._retn();
-
-}
-//=============================================================================
-/*!
- * CORBA: Accessor for attribute identifier I
- */
-//=============================================================================
-CORBA::Long SMESH_MEDFamily_i::getAttributeIdentifier(CORBA::Long i)
- throw (SALOME::SALOME_Exception)
-{
- if (_subMeshDS==NULL)
- THROW_SALOME_CORBA_EXCEPTION("No associated Family",\
- SALOME::INTERNAL_ERROR);
- MESSAGE("Les familles SMESH n ont pas d attribut");
- THROW_SALOME_CORBA_EXCEPTION("No attributes"\
- ,SALOME::BAD_PARAM);
- if (_numberOfAttribute == 0)
- {
- MESSAGE("Les familles SMESH n ont pas d attribut");
- THROW_SALOME_CORBA_EXCEPTION("No attributes"\
- ,SALOME::BAD_PARAM);
- };
- ASSERT (i <= _numberOfAttribute);
- return _attributeIdentifier[i];
-}
-//=============================================================================
-/*!
- * CORBA: Accessor for attributes values
- */
-//=============================================================================
-SALOME_MED::long_array* SMESH_MEDFamily_i::getAttributesValues()
- throw (SALOME::SALOME_Exception)
-{
- if (_subMeshDS==NULL)
- THROW_SALOME_CORBA_EXCEPTION("No associated Family",\
- SALOME::INTERNAL_ERROR);
-
- if (_numberOfAttribute == 0)
- {
- MESSAGE("Les familles SMESH n ont pas d attribut");
- THROW_SALOME_CORBA_EXCEPTION("No attributes"\
- ,SALOME::BAD_PARAM);
- };
-
- SALOME_MED::long_array_var myseq= new SALOME_MED::long_array;
- myseq->length(_numberOfAttribute);
- for (int i=0;i<_numberOfAttribute;i++)
- {
- myseq[i]=_attributeValue[i];
- };
- return myseq._retn();
-}
-//=============================================================================
-/*!
- * CORBA: Accessor for attribute value I
- */
-//=============================================================================
-CORBA::Long SMESH_MEDFamily_i::getAttributeValue(CORBA::Long i)
- throw (SALOME::SALOME_Exception)
-{
- if (_subMeshDS==NULL)
- THROW_SALOME_CORBA_EXCEPTION("No associated Family",\
- SALOME::INTERNAL_ERROR);
- if (_numberOfAttribute == 0)
- {
- MESSAGE("Les familles SMESH n ont pas d attribut");
- THROW_SALOME_CORBA_EXCEPTION("No attributes"\
- ,SALOME::BAD_PARAM);
- }
-
- ASSERT (i <= _numberOfAttribute);
- return _attributeValue[i];
-}
-//=============================================================================
-/*!
- * CORBA: Accessor for attributes desriptions
- */
-//=============================================================================
-SALOME_MED::string_array * SMESH_MEDFamily_i::getAttributesDescriptions()
- throw (SALOME::SALOME_Exception)
-{
- if (_subMeshDS==NULL)
- THROW_SALOME_CORBA_EXCEPTION("No associated Family",\
- SALOME::INTERNAL_ERROR);
- if (_numberOfAttribute == 0)
- {
- MESSAGE("Les familles SMESH n ont pas d attribut");
- THROW_SALOME_CORBA_EXCEPTION("No attributes"\
- ,SALOME::BAD_PARAM);
- }
- SALOME_MED::string_array_var myseq = new SALOME_MED::string_array;
- for (int i=0;i<_numberOfAttribute;i++)
- {
- myseq[i]=CORBA::string_dup(_attributeDescription[i].c_str());
- }
- return myseq._retn();
-}
-//=============================================================================
-/*!
- * CORBA: Accessor for attribute description i
- */
-//=============================================================================
-char * SMESH_MEDFamily_i::getAttributeDescription( CORBA::Long i)
- throw (SALOME::SALOME_Exception)
-{
- if (_subMeshDS==NULL)
- THROW_SALOME_CORBA_EXCEPTION("No associated Family",\
- SALOME::INTERNAL_ERROR);
- if (_numberOfAttribute == 0)
- {
- MESSAGE("Les familles SMESH n ont pas d attribut");
- THROW_SALOME_CORBA_EXCEPTION("No attributes"\
- ,SALOME::BAD_PARAM);
- }
- ASSERT (i <= _numberOfAttribute);
- return CORBA::string_dup(_attributeDescription[i].c_str());
-}
-//=============================================================================
-/*!
- * CORBA: Accessor for the number of groups
- */
-//=============================================================================
-CORBA::Long SMESH_MEDFamily_i::getNumberOfGroups()
- throw (SALOME::SALOME_Exception)
-{
- MESSAGE("!!! NOT YET IMPLEMENTED !!!!");
- THROW_SALOME_CORBA_EXCEPTION("Not Implemented", SALOME::BAD_PARAM);
- return 0;
-}
-//=============================================================================
-/*!
- * CORBA: Accessor for the name of the group i
- */
-//=============================================================================
-char * SMESH_MEDFamily_i::getGroupName( CORBA::Long i)
- throw (SALOME::SALOME_Exception)
-{
- MESSAGE("!!! NOT YET IMPLEMENTED !!!!");
- THROW_SALOME_CORBA_EXCEPTION("Not Implemented", SALOME::BAD_PARAM);
- return NULL;
-}
-//=============================================================================
-/*!
- * CORBA: Accessor for all the groups name
- */
-//=============================================================================
-SALOME_MED::string_array* SMESH_MEDFamily_i::getGroupsNames()
- throw (SALOME::SALOME_Exception)
-{
- MESSAGE("!!! NOT YET IMPLEMENTED !!!!");
- THROW_SALOME_CORBA_EXCEPTION("Not Implemented", SALOME::BAD_PARAM);
- return NULL;
-}
+++ /dev/null
-// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESH_MEDFamily_i.hxx
-// Module : SMESH
-
-#ifndef SMESH_MED_FAMILY_I_HXX_
-#define SMESH_MED_FAMILY_I_HXX_
-
-#include "SMESH_MEDSupport_i.hxx"
-
-#include<string>
-
-class SMESH_MEDFamily_i:
- public virtual POA_SALOME_MED::FAMILY,
- public virtual SMESH_MEDSupport_i
-{
-protected :
- SMESH_MEDFamily_i();
- ~SMESH_MEDFamily_i();
-
- ::SMESH_subMesh_i* _subMesh_i;
-
- // Values
- int _identifier;
- int _numberOfAttribute;
- int * _attributeIdentifier;
- int * _attributeValue;
- string * _attributeDescription;
- int _numberOfGroup ;
- string * _groupName ;
-
-
-public :
-
- // Constructors and associated internal methods
- SMESH_MEDFamily_i(int identifier, SMESH_subMesh_i* sm,
- string name, string description, SALOME_MED::medEntityMesh entity );
- SMESH_MEDFamily_i(const SMESH_MEDFamily_i & f);
-
- // IDL Methods
- void setProtocol(SALOME::TypeOfCommunication typ) {}
- void release() {}
- SALOME::SenderInt_ptr getSenderForNumber(long int) {return SALOME::SenderInt::_nil();}
- SALOME::SenderInt_ptr getSenderForNumberIndex() {return SALOME::SenderInt::_nil();}
-
- CORBA::Long getIdentifier()
- throw (SALOME::SALOME_Exception);
- CORBA::Long getNumberOfAttributes()
- throw (SALOME::SALOME_Exception);
- SALOME_MED::long_array* getAttributesIdentifiers()
- throw (SALOME::SALOME_Exception);
- CORBA::Long getAttributeIdentifier(CORBA::Long i)
- throw (SALOME::SALOME_Exception);
- SALOME_MED::long_array* getAttributesValues()
- throw (SALOME::SALOME_Exception);
- CORBA::Long getAttributeValue(CORBA::Long i)
- throw (SALOME::SALOME_Exception);
- SALOME_MED::string_array* getAttributesDescriptions()
- throw (SALOME::SALOME_Exception);
- char* getAttributeDescription( CORBA::Long i)
- throw (SALOME::SALOME_Exception);
- CORBA::Long getNumberOfGroups()
- throw (SALOME::SALOME_Exception);
- char * getGroupName( CORBA::Long i)
- throw (SALOME::SALOME_Exception);
- SALOME_MED::string_array* getGroupsNames()
- throw (SALOME::SALOME_Exception);
-};
-#endif /* MED_FAMILY_I_HXX_ */
+++ /dev/null
-// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESH_MEDMesh_i.cxx
-// Module : SMESH
-
-#include "SMESH_MEDMesh_i.hxx"
-#include "SMESH_Mesh_i.hxx"
-
-#include "SMESHDS_Mesh.hxx"
-#include "SMESHDS_SubMesh.hxx"
-
-#include <TopExp.hxx>
-#include <TopExp_Explorer.hxx>
-#include <TopoDS.hxx>
-#include <TopoDS_Iterator.hxx>
-#include <TopoDS_Compound.hxx>
-#include <TopoDS_CompSolid.hxx>
-#include <TopoDS_Solid.hxx>
-#include <TopoDS_Shell.hxx>
-#include <TopoDS_Face.hxx>
-#include <TopoDS_Wire.hxx>
-#include <TopoDS_Edge.hxx>
-#include <TopoDS_Vertex.hxx>
-#include <TopoDS_Shape.hxx>
-#include <TopTools_MapOfShape.hxx>
-
-#include "utilities.h"
-#include "Utils_CorbaException.hxx"
-
-#include "SMESH_MEDSupport_i.hxx"
-#include "SMESH_MEDFamily_i.hxx"
-
-# include "Utils_ORB_INIT.hxx"
-# include "Utils_SINGLETON.hxx"
-# include "Utils_ExceptHandlers.hxx"
-
-extern "C"
-{
-#include <stdio.h>
-}
-
-using namespace std;
-
-//=============================================================================
-/*!
- * Default constructor
- */
-//=============================================================================
-// PN Est-ce un const ?
-SMESH_MEDMesh_i::SMESH_MEDMesh_i()
-{
- BEGIN_OF("Default Constructor SMESH_MEDMesh_i");
- END_OF("Default Constructor SMESH_MEDMesh_i");
-}
-
-//=============================================================================
-/*!
- * Destructor
- */
-//=============================================================================
-SMESH_MEDMesh_i::~SMESH_MEDMesh_i()
-{
-}
-
-//=============================================================================
-/*!
- * Constructor
- */
-//=============================================================================
-SMESH_MEDMesh_i::SMESH_MEDMesh_i(::SMESH_Mesh_i * m_i):_meshId(""),
- _compte(false),
- _creeFamily(false),
- _famIdent(0),
- _indexElts(0),
- _indexEnts(0)
-{
- BEGIN_OF("Constructor SMESH_MEDMesh_i");
-
- _mesh_i = m_i;
- _meshDS = _mesh_i->GetImpl().GetMeshDS();
-
- END_OF("Constructor SMESH_MEDMesh_i");
-}
-
-//=============================================================================
-/*!
- * CORBA: Accessor for Name
- */
-//=============================================================================
-char *SMESH_MEDMesh_i::getName() throw(SALOME::SALOME_Exception)
-{
- if (_meshDS == NULL)
- THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
- SALOME::INTERNAL_ERROR);
-
- try
- {
- // A COMPLETER PAR LE NOM DU MAILLAGE
- //return CORBA::string_dup(_mesh_i->getName().c_str());
- return CORBA::string_dup("toto");
- }
- catch(...)
- {
- MESSAGE("Exception en accedant au nom");
- THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object",
- SALOME::INTERNAL_ERROR);
- }
-}
-
-//=============================================================================
-/*!
- * CORBA: Accessor for corbaindex cuisine interne
- */
-//=============================================================================
-CORBA::Long SMESH_MEDMesh_i::getCorbaIndex()throw(SALOME::SALOME_Exception)
-{
- MESSAGE("Non Implemente");
- THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
-}
-
-//=============================================================================
-/*!
- * CORBA: Accessor for Space Dimension
- */
-//=============================================================================
-CORBA::Long SMESH_MEDMesh_i::getSpaceDimension()throw(SALOME::SALOME_Exception)
-{
- // PN : Il semblerait que la dimension soit fixee a 3
- if (_mesh_i == 0)
- THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
- SALOME::INTERNAL_ERROR);
- return 3;
-}
-
-//=============================================================================
-/*!
- * CORBA: Accessor for Mesh Dimension
- */
-//=============================================================================
-CORBA::Long SMESH_MEDMesh_i::getMeshDimension()throw(SALOME::SALOME_Exception)
-{
- if (_mesh_i == 0)
- THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
- SALOME::INTERNAL_ERROR);
- // PN : Il semblerait que la dimension soit fixee a 3
- if (_mesh_i == 0)
- THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
- SALOME::INTERNAL_ERROR);
- return 3;
-}
-//=============================================================================
-/*!
- * CORBA: Accessor for the boolean _isAGrid
- */
-//=============================================================================
-CORBA::Boolean SMESH_MEDMesh_i::getIsAGrid() throw (SALOME::SALOME_Exception)
-{
- MESSAGE("!!!!!! NOT YET IMPLEMENTED !!!!!!");
-
- THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
-
- return false;
-}
-//=============================================================================
-/*!
- * CORBA: Accessor for the connectivities, to see if they exist
- */
-//=============================================================================
-CORBA::Boolean
-SMESH_MEDMesh_i::existConnectivity(SALOME_MED::medConnectivity connectivityType,
- SALOME_MED::medEntityMesh entity)
- throw (SALOME::SALOME_Exception)
-{
- MESSAGE("!!!!!! IMPLEMENTED BUT ONLY PARTIALLY !!!!!!");
-
-
- return false;
-
-}
-//=============================================================================
-/*!
- * CORBA: Accessor for Coordinate
- */
-//=============================================================================
-CORBA::Double SMESH_MEDMesh_i::getCoordinate(CORBA::Long Number, CORBA::Long Axis)
- throw (SALOME::SALOME_Exception)
-{
- MESSAGE("!!!!!! NOT YET IMPLEMENTED !!!!");
-
- THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
-
- return 0.0;
-}
-//=============================================================================
-/*!
- * CORBA: Accessor for Coordinates System
- */
-//=============================================================================
-char *SMESH_MEDMesh_i::getCoordinatesSystem() throw(SALOME::SALOME_Exception)
-{
- if (_mesh_i == 0)
- THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
- SALOME::INTERNAL_ERROR);
- // PN : En dur. Non encore prevu
- try
- {
- string systcoo = "CARTESIEN";
- return CORBA::string_dup(systcoo.c_str());
- }
- catch(...)
- {
- MESSAGE("Exception en accedant au maillage");
- THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object",
- SALOME::INTERNAL_ERROR);
- }
-}
-
-//=============================================================================
-/*!
- * CORBA: Accessor for Coordinates
- */
-//=============================================================================
-SALOME_MED::double_array * SMESH_MEDMesh_i::getCoordinates(
- SALOME_MED::medModeSwitch typeSwitch) throw(SALOME::SALOME_Exception)
-{
- if (_mesh_i == 0)
- THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
- SALOME::INTERNAL_ERROR);
- SALOME_MED::double_array_var myseq = new SALOME_MED::double_array;
- try
- {
- // PN : En dur
- int spaceDimension = 3;
- int nbNodes = _meshDS->NbNodes();
- SCRUTE(nbNodes);
- myseq->length(nbNodes * spaceDimension);
- int i = 0;
-
- SMDS_NodeIteratorPtr itNodes=_meshDS->nodesIterator();
- while(itNodes->more())
- {
- const SMDS_MeshNode* node = itNodes->next();
-
- if (typeSwitch == SALOME_MED::MED_FULL_INTERLACE)
- {
- myseq[i * 3] = node->X();
- myseq[i * 3 + 1] = node->Y();
- myseq[i * 3 + 2] = node->Z();
- SCRUTE(myseq[i * 3]);
- SCRUTE(myseq[i * 3 + 1]);
- SCRUTE(myseq[i * 3 + 2]);
- }
- else
- {
- ASSERT(typeSwitch == SALOME_MED::MED_NO_INTERLACE);
- myseq[i] = node->X();
- myseq[i + nbNodes] = node->Y();
- myseq[i + (nbNodes * 2)] = node->Z();
- SCRUTE(myseq[i]);
- SCRUTE(myseq[i + nbNodes]);
- SCRUTE(myseq[i + (nbNodes * 2)]);
- }
- i++;
- }
- }
- catch(...)
- {
- MESSAGE("Exception en accedant aux coordonnees");
- THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object",
- SALOME::INTERNAL_ERROR);
- }
- return myseq._retn();
-}
-
-//=============================================================================
-/*!
- * CORBA: Accessor for Coordinates Names
- */
-//=============================================================================
-SALOME_MED::string_array *
- SMESH_MEDMesh_i::getCoordinatesNames()throw(SALOME::SALOME_Exception)
-{
- if (_mesh_i == 0)
- THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
- SALOME::INTERNAL_ERROR);
- SALOME_MED::string_array_var myseq = new SALOME_MED::string_array;
- try
- {
- // PN : en dur
- int spaceDimension = 3;
- myseq->length(spaceDimension);
- myseq[0] = CORBA::string_dup("x");
- myseq[1] = CORBA::string_dup("y");
- myseq[2] = CORBA::string_dup("z");
- }
- catch(...)
- {
- MESSAGE("Exception en accedant aux noms des coordonnees");
- THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object",
- SALOME::INTERNAL_ERROR);
- }
- return myseq._retn();
-
-}
-
-//=============================================================================
-/*!
- * CORBA: Accessor for Coordinates Units
- */
-//=============================================================================
-SALOME_MED::string_array *
- SMESH_MEDMesh_i::getCoordinatesUnits()throw(SALOME::SALOME_Exception)
-{
- if (_mesh_i == 0)
- THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
- SALOME::INTERNAL_ERROR);
- SALOME_MED::string_array_var myseq = new SALOME_MED::string_array;
- try
- {
- // PN : en dur
- int spaceDimension = 3;
- myseq->length(spaceDimension);
- myseq[0] = CORBA::string_dup("m");
- myseq[1] = CORBA::string_dup("m");
- myseq[2] = CORBA::string_dup("m");
- }
- catch(...)
- {
- MESSAGE("Exception en accedant aux unites des coordonnees");
- THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object",
- SALOME::INTERNAL_ERROR);
- }
- return myseq._retn();
-}
-
-//=============================================================================
-/*!
- * CORBA: Accessor for Number of Nodes
- */
-//=============================================================================
-CORBA::Long SMESH_MEDMesh_i::getNumberOfNodes()throw(SALOME::SALOME_Exception)
-{
- if (_mesh_i == 0)
- THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
- SALOME::INTERNAL_ERROR);
- try
- {
- return _meshDS->NbNodes();
- }
- catch(...)
- {
- MESSAGE("Exception en accedant au nombre de noeuds");
- THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object",
- SALOME::INTERNAL_ERROR);
- }
-}
-
-//=============================================================================
-/*!
- * CORBA: Accessor for number of Types
- */
-//=============================================================================
-CORBA::Long SMESH_MEDMesh_i::getNumberOfTypes(SALOME_MED::medEntityMesh entity)
-throw(SALOME::SALOME_Exception)
-{
- if (_mesh_i == 0)
- THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
- SALOME::INTERNAL_ERROR);
- try
- {
- if (!_compte)
- calculeNbElts();
- int retour = 0;
- if (_mapNbTypes.find(entity) != _mapNbTypes.end())
- retour = _mapNbTypes[entity];
- return retour;
- }
- catch(...)
- {
- MESSAGE("Exception en accedant au nombre de Types");
- THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object",
- SALOME::INTERNAL_ERROR);
- }
-}
-
-//=============================================================================
-/*!
- * CORBA: Accessor for existing geometry element types
- * Not implemented for MED_ALL_ENTITIES
- */
-//=============================================================================
-SALOME_MED::medGeometryElement_array *
- SMESH_MEDMesh_i::getTypes(SALOME_MED::medEntityMesh entity) throw(SALOME::
- SALOME_Exception)
-{
- if (_mesh_i == 0)
- THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
- SALOME::INTERNAL_ERROR);
- if (entity == SALOME_MED::MED_ALL_ENTITIES)
- THROW_SALOME_CORBA_EXCEPTION("Not implemented for MED_ALL_ENTITIES",
- SALOME::BAD_PARAM);
- if (!_compte)
- calculeNbElts();
- SALOME_MED::medGeometryElement_array_var myseq =
- new SALOME_MED::medGeometryElement_array;
- try
- {
- if (_mapNbTypes.find(entity) == _mapNbTypes.end())
- THROW_SALOME_CORBA_EXCEPTION("No Such Entity in the mesh",
- SALOME::BAD_PARAM);
- int nbTypes = _mapNbTypes[entity];
-
- myseq->length(nbTypes);
-
- if (_mapIndToVectTypes.find(entity) == _mapIndToVectTypes.end())
- THROW_SALOME_CORBA_EXCEPTION("No Such Entity in the mesh",
- SALOME::INTERNAL_ERROR);
-
- int index = _mapIndToVectTypes[entity];
- ASSERT(_TypesId[index].size() != 0);
- int i = 0;
- vector < SALOME_MED::medGeometryElement >::iterator it;
- for (it = _TypesId[index].begin(); it != _TypesId[index].end(); it++)
- {
- myseq[i++] = *it;
- };
- }
- catch(...)
- {
- MESSAGE("Exception en accedant aux differents types");
- THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object",
- SALOME::INTERNAL_ERROR);
- }
- return myseq._retn();
-}
-
-//=============================================================================
-/*!
- * CORBA: Returns number of elements of type medGeometryElement
- * Not implemented for MED_ALL_ELEMENTS
- * implemented for MED_ALL_ENTITIES
- *
- * Dans cette implementation, il n est pas prevu de tenir compte du entity
- * qui ne doit pas pouvoir avoir deux valeurs differentes pour un geomElement
- */
-//=============================================================================
-CORBA::Long SMESH_MEDMesh_i::getNumberOfElements(SALOME_MED::
- medEntityMesh entity,
- SALOME_MED::medGeometryElement geomElement) throw(SALOME::SALOME_Exception)
-{
- if (_mesh_i == 0)
- THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
- SALOME::INTERNAL_ERROR);
- if (geomElement == SALOME_MED::MED_ALL_ELEMENTS)
- THROW_SALOME_CORBA_EXCEPTION("Not implemented for MED_ALL_ELEMENTS",
- SALOME::BAD_PARAM);
- if (!_compte)
- calculeNbElts();
-
- try
- {
- int retour = 0;
- if (_mapIndToSeqElts.find(geomElement) != _mapIndToSeqElts.end())
- {
- int index = _mapIndToSeqElts[geomElement];
-
- retour = _seq_elemId[index]->length();
- }
- return retour;
- }
- catch(...)
- {
- MESSAGE("Exception en accedant au nombre d élements");
- THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object",
- SALOME::INTERNAL_ERROR);
- }
-}
-
-//=============================================================================
-/*!
- * CORBA: Accessor for connectivities
- */
-//=============================================================================
-SALOME_MED::long_array *
-SMESH_MEDMesh_i::getConnectivity(SALOME_MED::medModeSwitch typeSwitch,
- SALOME_MED::medConnectivity mode,
- SALOME_MED::medEntityMesh entity,
- SALOME_MED::medGeometryElement geomElement)
- throw(SALOME::SALOME_Exception)
-{
- if (_mesh_i == 0)
- THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
- SALOME::INTERNAL_ERROR);
- if (mode != SALOME_MED::MED_NODAL)
- THROW_SALOME_CORBA_EXCEPTION("Not Implemented", SALOME::BAD_PARAM);
- if (typeSwitch == SALOME_MED::MED_NO_INTERLACE)
- THROW_SALOME_CORBA_EXCEPTION("Not Yet Implemented", SALOME::BAD_PARAM);
- if (!_compte)
- calculeNbElts();
-
- // Faut-il renvoyer un pointeur vide ???
- if (_mapIndToSeqElts.find(geomElement) != _mapIndToSeqElts.end())
- THROW_SALOME_CORBA_EXCEPTION("No Such Element in the mesh",
- SALOME::BAD_PARAM);
-
- int index = _mapIndToSeqElts[geomElement];
-
- return _seq_elemId[index]._retn();
-}
-
-//=============================================================================
-/*!
- * CORBA: Accessor for connectivities
- */
-//=============================================================================
-SALOME_MED::long_array *
-SMESH_MEDMesh_i::getConnectivityIndex(SALOME_MED::medConnectivity mode,
- SALOME_MED::medEntityMesh entity)
- throw(SALOME::SALOME_Exception)
-{
- MESSAGE("Pas Implemente dans SMESH");
- THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
- return 0;
-}
-
-//=============================================================================
-/*!
- * CORBA: Find an element corresponding to the given connectivity
- */
-//=============================================================================
-CORBA::Long
-SMESH_MEDMesh_i::getElementNumber(SALOME_MED::medConnectivity mode,
- SALOME_MED::medEntityMesh entity,
- SALOME_MED::medGeometryElement type,
- const SALOME_MED::long_array & connectivity)
- throw(SALOME::SALOME_Exception)
-{
- const char *LOC = "getElementNumber ";
- MESSAGE(LOC << "Pas Implemente dans SMESH");
- THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
- return -1;
-}
-
-//=============================================================================
-/*!
- * CORBA: Accessor for Ascendant connectivities
- * not implemented for MED_ALL_ENTITIES and MED_MAILLE
- */
-//=============================================================================
-SALOME_MED::long_array *
- SMESH_MEDMesh_i::getReverseConnectivity(SALOME_MED::
- medConnectivity mode) throw(SALOME::SALOME_Exception)
-{
- MESSAGE("Pas Implemente dans SMESH");
- THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
- return 0;
-}
-
-//=============================================================================
-/*!
- * CORBA: Accessor for connectivities
- */
-//=============================================================================
-SALOME_MED::long_array *
- SMESH_MEDMesh_i::getReverseConnectivityIndex(SALOME_MED::
- medConnectivity mode) throw(SALOME::SALOME_Exception)
-{
- MESSAGE("Pas Implemente dans SMESH");
- THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
- return 0;
-}
-
-//=============================================================================
-/*!
- * CORBA: Returns number of families within the mesh
- */
-//=============================================================================
-CORBA::Long SMESH_MEDMesh_i::getNumberOfFamilies(SALOME_MED::
- medEntityMesh entity) throw(SALOME::SALOME_Exception)
-{
- if (_creeFamily == false)
- createFamilies();
- if (_mesh_i == 0)
- THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
- SALOME::INTERNAL_ERROR);
- return _families.size();
-}
-
-//=============================================================================
-/*!
- * CORBA: Returns number of groups within the mesh
- */
-//=============================================================================
-CORBA::Long SMESH_MEDMesh_i::getNumberOfGroups(SALOME_MED::medEntityMesh entity)
-throw(SALOME::SALOME_Exception)
-{
- if (_mesh_i == 0)
- THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
- SALOME::INTERNAL_ERROR);
- MESSAGE(" Pas d implementation des groupes dans SMESH");
- return 0;
-}
-
-//=============================================================================
-/*!
- * CORBA: Returns references for families within the mesh
- */
-//=============================================================================
-SALOME_MED::Family_array *
- SMESH_MEDMesh_i::getFamilies(SALOME_MED::
- medEntityMesh entity) throw(SALOME::SALOME_Exception)
-{
- if (_creeFamily == false)
- createFamilies();
- if (_mesh_i == 0)
- THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
- SALOME::INTERNAL_ERROR);
- SALOME_MED::Family_array_var myseq = new SALOME_MED::Family_array;
- int nbfam = _families.size();
- myseq->length(nbfam);
- int i = 0;
- vector < SALOME_MED::FAMILY_ptr >::iterator it;
- for (it = _families.begin(); it != _families.end(); it++)
- {
- myseq[i++] = *it;
- };
- return myseq._retn();
-}
-
-//=============================================================================
-/*!
- * CORBA: Returns references for family i within the mesh
- */
-//=============================================================================
-SALOME_MED::FAMILY_ptr SMESH_MEDMesh_i::getFamily(SALOME_MED::
- medEntityMesh entity, CORBA::Long i) throw(SALOME::SALOME_Exception)
-{
- if (_creeFamily == false)
- createFamilies();
- if (_mesh_i == 0)
- THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
- SALOME::INTERNAL_ERROR);
-
- SCRUTE(_families[i]->getName());
- MESSAGE(" SMESH_MEDMesh_i::getFamily " << i) return _families[i];
-}
-
-//=============================================================================
-/*!
- * CORBA: Returns references for groups within the mesh
- */
-//=============================================================================
-SALOME_MED::Group_array *
- SMESH_MEDMesh_i::getGroups(SALOME_MED::medEntityMesh entity) throw(SALOME::
- SALOME_Exception)
-{
- if (_mesh_i == 0)
- THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
- SALOME::INTERNAL_ERROR);
- MESSAGE(" Pas d implementation des groupes dans SMESH");
- THROW_SALOME_CORBA_EXCEPTION("No group implementation", SALOME::BAD_PARAM);
-}
-
-//=============================================================================
-/*!
- * CORBA: Returns references for group i within the mesh
- */
-//=============================================================================
-SALOME_MED::GROUP_ptr SMESH_MEDMesh_i::getGroup(SALOME_MED::
- medEntityMesh entity, CORBA::Long i) throw(SALOME::SALOME_Exception)
-{
- if (_mesh_i == 0)
- THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
- SALOME::INTERNAL_ERROR);
- MESSAGE(" Pas d implementation des groupes dans SMESH");
- THROW_SALOME_CORBA_EXCEPTION("No group implementation", SALOME::BAD_PARAM);
-}
-//=============================================================================
-/*!
- * CORBA: Returns references for the global numbering index
- */
-//=============================================================================
-SALOME_MED::long_array*
-SMESH_MEDMesh_i::getGlobalNumberingIndex(SALOME_MED::medEntityMesh entity)
- throw (SALOME::SALOME_Exception)
-{
- MESSAGE("!!!! NOT YET IMPLEMENTED !!!!!");
-
- THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
-
- return NULL;
-}
-//=============================================================================
-/*!
- * CORBA: Returns references for the support of boundary elements of type
- * entity
- */
-//=============================================================================
-SALOME_MED::SUPPORT_ptr
-SMESH_MEDMesh_i::getBoundaryElements(SALOME_MED::medEntityMesh entity)
- throw (SALOME::SALOME_Exception)
-{
- MESSAGE("!!!! NOT YET IMPLEMENTED !!!!!");
-
- THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
-
- return NULL;
-}
-//=============================================================================
-/*!
- * CORBA: Returns references for the support of the skin of the support
- * mySupport3D
- */
-//=============================================================================
-SALOME_MED::SUPPORT_ptr
-SMESH_MEDMesh_i::getSkin(SALOME_MED::SUPPORT_ptr mySupport3D)
- throw (SALOME::SALOME_Exception)
-{
- MESSAGE("!!!! NOT YET IMPLEMENTED !!!!!");
-
- THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
-
- return NULL;
-}
-//=============================================================================
-/*!
- * CORBA:
- */
-//=============================================================================
-SALOME_MED::FIELD_ptr SMESH_MEDMesh_i::getVolume(SALOME_MED::
- SUPPORT_ptr mySupport) throw(SALOME::SALOME_Exception)
-{
- MESSAGE("Pas Implemente dans SMESH");
- THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
- return 0;
-}
-
-//=============================================================================
-/*!
- * CORBA:
- */
-//=============================================================================
-SALOME_MED::FIELD_ptr SMESH_MEDMesh_i::getArea(SALOME_MED::
- SUPPORT_ptr mySupport) throw(SALOME::SALOME_Exception)
-{
- MESSAGE("Pas Implemente dans SMESH");
- THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
- return 0;
-}
-
-//=============================================================================
-/*!
- * CORBA:
- */
-//=============================================================================
-SALOME_MED::FIELD_ptr SMESH_MEDMesh_i::getLength(SALOME_MED::
- SUPPORT_ptr mySupport) throw(SALOME::SALOME_Exception)
-{
- MESSAGE("Pas Implemente dans SMESH");
- THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
- return 0;
-}
-
-//=============================================================================
-/*!
- * CORBA:
- */
-//=============================================================================
-SALOME_MED::FIELD_ptr SMESH_MEDMesh_i::getNormal(SALOME_MED::
- SUPPORT_ptr mySupport) throw(SALOME::SALOME_Exception)
-{
- MESSAGE("Pas Implemente dans SMESH");
- THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
- return 0;
-}
-
-//=============================================================================
-/*!
- * CORBA:
- */
-//=============================================================================
-SALOME_MED::FIELD_ptr SMESH_MEDMesh_i::getBarycenter(SALOME_MED::
- SUPPORT_ptr mySupport) throw(SALOME::SALOME_Exception)
-{
- MESSAGE("Pas Implemente dans SMESH");
- THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
- return 0;
-}
-
-//=============================================================================
-/*!
- * CORBA:
- */
-//=============================================================================
-SALOME_MED::FIELD_ptr SMESH_MEDMesh_i::getNeighbourhood(SALOME_MED::
- SUPPORT_ptr mySupport) throw(SALOME::SALOME_Exception)
-{
- MESSAGE("Non Implemente");
- THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
- return 0;
-}
-
-//=============================================================================
-/*!
- * CORBA: add the Mesh in the StudyManager
- * PN Pas Implemente
- */
-//=============================================================================
-void SMESH_MEDMesh_i::addInStudy(SALOMEDS::Study_ptr myStudy,
- SALOME_MED::MESH_ptr myIor) throw(SALOME::SALOME_Exception)
-{
- BEGIN_OF("MED_Mesh_i::addInStudy");
- if (_meshId != "")
- {
- MESSAGE("Mesh already in Study");
- THROW_SALOME_CORBA_EXCEPTION("Mesh already in Study",
- SALOME::BAD_PARAM);
- };
-
- /*
- * SALOMEDS::StudyBuilder_var myBuilder = myStudy->NewBuilder();
- *
- * // Create SComponent labelled 'MED' if it doesn't already exit
- * SALOMEDS::SComponent_var medfather = myStudy->FindComponent("MED");
- * if ( CORBA::is_nil(medfather) )
- * {
- * MESSAGE("Add Component MED");
- * medfather = myBuilder->NewComponent("MED");
- * //myBuilder->AddAttribute (medfather,SALOMEDS::Name,"MED");
- * SALOMEDS::AttributeName_var aName = SALOMEDS::AttributeName::_narrow(
- * myBuilder->FindOrCreateAttribute(medfather, "AttributeName"));
- * aName->SetValue("MED");
- *
- * myBuilder->DefineComponentInstance(medfather,myIor);
- *
- * } ;
- *
- * MESSAGE("Add a mesh Object under MED");
- * myBuilder->NewCommand();
- * SALOMEDS::SObject_var newObj = myBuilder->NewObject(medfather);
- *
- * ORB_INIT &init = *SINGLETON_<ORB_INIT>::Instance() ;
- * ASSERT(SINGLETON_<ORB_INIT>::IsAlreadyExisting()) ;
- * CORBA::ORB_var &orb = init(0,0);
- * string iorStr = orb->object_to_string(myIor);
- * //myBuilder->AddAttribute(newObj,SALOMEDS::IOR,iorStr.c_str());
- * SALOMEDS::AttributeIOR_var aIOR = SALOMEDS::AttributeIOR::_narrow(
- * myBuilder->FindOrCreateAttribute(newObj, "AttributeIOR"));
- * aIOR->SetValue(iorStr.c_str());
- *
- * //myBuilder->AddAttribute(newObj,SALOMEDS::Name,_mesh_i->getName().c_str());
- * SALOMEDS::AttributeName_var aName = SALOMEDS::AttributeName::_narrow(
- * myBuilder->FindOrCreateAttribute(newObj, "AttributeName"));
- * aName->SetValue(_mesh_i->getName().c_str());
- *
- * _meshId = newObj->GetID();
- * myBuilder->CommitCommand();
- *
- */
- END_OF("Mesh_i::addInStudy(SALOMEDS::Study_ptr myStudy)");
-}
-
-//=============================================================================
-/*!
- * CORBA: write mesh in a med file
- */
-//=============================================================================
-void SMESH_MEDMesh_i::write(CORBA::Long i, const char *driverMeshName)
-throw(SALOME::SALOME_Exception)
-{
- MESSAGE("Non Implemente");
- THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
-}
-
-//=============================================================================
-/*!
- * CORBA: read mesh in a med file
- */
-//=============================================================================
-void SMESH_MEDMesh_i::read(CORBA::Long i) throw(SALOME::SALOME_Exception)
-{
- MESSAGE("Non Implemente");
- THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
-}
-
-//=============================================================================
-/*!
- * CORBA : release driver
- */
-//=============================================================================
-void SMESH_MEDMesh_i::rmDriver(CORBA::Long i) throw(SALOME::SALOME_Exception)
-{
- MESSAGE("Non Implemente");
- THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
-}
-
-//=============================================================================
-/*!
- * CORBA : attach driver
- */
-//=============================================================================
-CORBA::Long SMESH_MEDMesh_i::addDriver(SALOME_MED::medDriverTypes driverType,
- const char *fileName, const char *meshName) throw(SALOME::SALOME_Exception)
-{
- MESSAGE("Non Implemente");
- THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
- return 0;
-}
-
-//=============================================================================
-/*!
- * Calcule le Nb d'elements par entite geometrique
- */
-//=============================================================================
-void SMESH_MEDMesh_i::calculeNbElts() throw(SALOME::SALOME_Exception)
-{
- if (!_compte)
- {
- _compte = true;
-
- _mapNbTypes[SALOME_MED::MED_NODE] = 1;
- // On compte les aretes MED_SEG2 ou MED_SEG3
- // On range les elements dans les vecteurs correspondants
-
- _mapIndToSeqElts[SALOME_MED::MED_SEG2] = _indexElts++;
- _mapIndToSeqElts[SALOME_MED::MED_SEG3] = _indexElts++;
- _mapIndToVectTypes[SALOME_MED::MED_EDGE] = _indexEnts++;
-
- int trouveSeg2 = 0;
- int trouveSeg3 = 0;
- SALOME_MED::medGeometryElement medElement;
-
- SMDS_EdgeIteratorPtr itEdges=_meshDS->edgesIterator();
- while(itEdges->more())
- {
- const SMDS_MeshEdge* elem = itEdges->next();
- int nb_of_nodes = elem->NbNodes();
-
- switch (nb_of_nodes)
- {
- case 2:
- {
- medElement = SALOME_MED::MED_SEG2;
- if (trouveSeg2 == 0)
- {
- trouveSeg2 = 1;
- _TypesId[SALOME_MED::MED_EDGE].
- push_back(SALOME_MED::MED_SEG2);
- }
- break;
- }
- case 3:
- {
- medElement = SALOME_MED::MED_SEG3;
- if (trouveSeg3 == 0)
- {
- trouveSeg3 = 1;
- _TypesId[SALOME_MED::MED_EDGE].
- push_back(SALOME_MED::MED_SEG3);
- }
- break;
- }
- }
- int index = _mapIndToSeqElts[medElement];
- SCRUTE(index);
- // Traitement de l arete
-
- int longueur = _seq_elemId[index]->length();
- _seq_elemId[index]->length(longueur + nb_of_nodes);
-
- SMDS_NodeIteratorPtr itn=_meshDS->nodesIterator();
-
- for(int k=0; itn->more(); k++)
- _seq_elemId[index][longueur + k] = itn->next()->GetID()+1;
- }
-
- _mapNbTypes[SALOME_MED::MED_EDGE] = trouveSeg2 + trouveSeg3;
-
- // On compte les faces MED_TRIA3, MED_HEXA8, MED_TRIA6
- // On range les elements dans les vecteurs correspondants
- int trouveTria3 = 0;
- int trouveTria6 = 0;
- int trouveQuad4 = 0;
-
- _mapIndToSeqElts[SALOME_MED::MED_TRIA3] = _indexElts++;
- _mapIndToSeqElts[SALOME_MED::MED_TRIA6] = _indexElts++;
- _mapIndToSeqElts[SALOME_MED::MED_QUAD4] = _indexElts++;
- _mapIndToVectTypes[SALOME_MED::MED_FACE] = _indexEnts++;
-
- SMDS_FaceIteratorPtr itFaces=_meshDS->facesIterator();
- while(itFaces->more())
- {
- const SMDS_MeshFace * elem = itFaces->next();
- int nb_of_nodes = elem->NbNodes();
-
- switch (nb_of_nodes)
- {
- case 3:
- {
- medElement = SALOME_MED::MED_TRIA3;
- if (trouveTria3 == 0)
- {
- trouveTria3 = 1;
- _TypesId[SALOME_MED::MED_FACE].
- push_back(SALOME_MED::MED_TRIA3);
- }
- break;
- }
- case 4:
- {
- medElement = SALOME_MED::MED_QUAD4;
- if (trouveQuad4 == 0)
- {
- trouveQuad4 = 1;
- _TypesId[SALOME_MED::MED_FACE].
- push_back(SALOME_MED::MED_QUAD4);
- }
- break;
- }
- case 6:
- {
- medElement = SALOME_MED::MED_TRIA6;
- if (trouveTria6 == 0)
- {
- trouveTria6 = 1;
- _TypesId[SALOME_MED::MED_FACE].
- push_back(SALOME_MED::MED_TRIA6);
- }
- break;
- }
- }
- int index = _mapIndToSeqElts[medElement];
- SCRUTE(index);
-
- // Traitement de la face
- // Attention La numérotation des noeuds Med commence a 1
-
- int longueur = _seq_elemId[index]->length();
- _seq_elemId[index]->length(longueur + nb_of_nodes);
-
- SMDS_NodeIteratorPtr itn=_meshDS->nodesIterator();
-
- for(int k=0; itn->more(); k++)
- _seq_elemId[index][longueur + k] = itn->next()->GetID()+1;
- } //itFaces
-
- _mapNbTypes[SALOME_MED::MED_FACE] =
- trouveTria3 + trouveTria6 + trouveQuad4;
-
- _mapIndToSeqElts[SALOME_MED::MED_HEXA8] = _indexElts++;
- _mapIndToVectTypes[SALOME_MED::MED_CELL] = _indexEnts++;
- int index = _mapIndToSeqElts[medElement];
-
- int trouveHexa8 = 0;
-
- SMDS_VolumeIteratorPtr itVolumes=_meshDS->volumesIterator();
- while(itVolumes->more())
- {
- const SMDS_MeshVolume * elem = itVolumes->next();
-
- int nb_of_nodes = elem->NbNodes();
- medElement = SALOME_MED::MED_HEXA8;
- ASSERT(nb_of_nodes = 8);
-
- if (trouveHexa8 == 0)
- {
- trouveHexa8 = 1;
- _TypesId[SALOME_MED::MED_CELL].push_back(SALOME_MED::MED_HEXA8);
- };
- // Traitement de la maille
- int longueur = _seq_elemId[index]->length();
- _seq_elemId[index]->length(longueur + nb_of_nodes);
-
- SMDS_NodeIteratorPtr itn=_meshDS->nodesIterator();
- for(int k=0; itn->more(); k++)
- _seq_elemId[index][longueur + k] = itn->next()->GetID()+1;
- }
-
- _mapNbTypes[SALOME_MED::MED_CELL] = trouveHexa8;
- _mapNbTypes[SALOME_MED::MED_ALL_ENTITIES]
- =
- trouveHexa8 + trouveTria3 + trouveTria6 + trouveQuad4 + trouveSeg2 +
- trouveSeg3;
- }// fin du _compte
-};
-
-//=============================================================================
-/*!
- * Creation des familles
- */
-//=============================================================================
-void SMESH_MEDMesh_i::createFamilies() throw(SALOME::SALOME_Exception)
-{
- Unexpect aCatch(SALOME_SalomeException);
- string famDes = ("Je ne sais pas");
- string famName0 = "Famille_";
- string famName;
- char numero[10];
-
- if (_creeFamily == false)
- {
- _creeFamily = true;
- SMESH_subMesh_i *subMeshServant;
-
- map < int, SMESH_subMesh_i * >::iterator it;
- for (it = _mesh_i->_mapSubMesh_i.begin();
- it != _mesh_i->_mapSubMesh_i.end(); it++)
- {
- SMESH_subMesh_i *submesh_i = (*it).second;
- int famIdent = (*it).first;
-
- ASSERT(famIdent < 999999999);
- sprintf(numero, "%d\n", famIdent);
- famName = famName0 + numero;
-
- SMESH_MEDFamily_i *famservant =
- new SMESH_MEDFamily_i(famIdent, submesh_i,
- famName, famDes, SALOME_MED::MED_NODE);
- SALOME_MED::FAMILY_ptr famille =
- SALOME_MED::FAMILY::_narrow(famservant->
- POA_SALOME_MED::FAMILY::_this());
- _families.push_back(famille);
- }
- }
-};
-//=============================================================================
-/*!
- * Gives informations of the considered mesh.
- */
-//=============================================================================
-SALOME_MED::MESH::meshInfos * SMESH_MEDMesh_i::getMeshGlobal()
- throw (SALOME::SALOME_Exception)
-{
- MESSAGE("!!!! NOT YET IMPLEMENTED !!!!!");
-
- THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
-
- return NULL;
-}
-//=============================================================================
-/*!
- * Gives informations on coordinates of the considered mesh.
- */
-//=============================================================================
-SALOME_MED::MESH::coordinateInfos * SMESH_MEDMesh_i::getCoordGlobal()
- throw (SALOME::SALOME_Exception)
-{
- MESSAGE("!!!! NOT YET IMPLEMENTED !!!!!");
-
- THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
-
- return NULL;
-}
-//=============================================================================
-/*!
- * Gives informations on connectivities of the considered mesh for the entity
- * entity.
- */
-//=============================================================================
-SALOME_MED::MESH::connectivityInfos *
-SMESH_MEDMesh_i::getConnectGlobal(SALOME_MED::medEntityMesh entity)
- throw (SALOME::SALOME_Exception)
-{
- MESSAGE("!!!! NOT YET IMPLEMENTED !!!!!");
-
- THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
-
- return NULL;
-}
-//=============================================================================
-/*!
- * Gives the type of the element number of entity entity
- */
-//=============================================================================
-SALOME_MED::medGeometryElement
-SMESH_MEDMesh_i::getElementType(SALOME_MED::medEntityMesh entity,
- CORBA::Long number)
- throw (SALOME::SALOME_Exception)
-{
- MESSAGE("!!!! NOT YET IMPLEMENTED !!!!!");
-
- THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM);
-
- return (SALOME_MED::medGeometryElement) 0;
-}
+++ /dev/null
-// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESH_MEDSupport_i.cxx
-// Module : SMESH
-
-using namespace std;
-#include "SMESH_MEDSupport_i.hxx"
-#include "utilities.h"
-#include "Utils_CorbaException.hxx"
-#include "Utils_ExceptHandlers.hxx"
-
-#include <TopoDS_Iterator.hxx>
-#include "SMESHDS_Mesh.hxx"
-
-#include "SMESH_subMesh.hxx"
-#include "SMESH_Mesh_i.hxx"
-#include "SMESH_subMesh_i.hxx"
-
-
-//=============================================================================
-/*!
- * Default constructor
- */
-//=============================================================================
-SMESH_MEDSupport_i::SMESH_MEDSupport_i()
-{
- BEGIN_OF("Default Constructor SMESH_MEDSupport_i");
- END_OF("Default Constructor SMESH_MEDSupport_i");
-}
-
-//=============================================================================
-/*!
- * Constructor
- */
-//=============================================================================
-SMESH_MEDSupport_i::SMESH_MEDSupport_i(SMESH_subMesh_i * sm, string name,
- string description, SALOME_MED::medEntityMesh entity)
- :_subMesh_i(sm), _name(name), _description(description), _entity(entity),
- _seqNumber(false), _seqLength(0)
-{
- BEGIN_OF("Constructor SMESH_MEDSupport_i");
-
- _meshDS = _subMesh_i->_mesh_i->GetImpl().GetMeshDS();
-
- int subMeshId = _subMesh_i->GetId();
-
- MESSAGE(" subMeshId " << subMeshId)
-
- if (_subMesh_i->_mesh_i->_mapSubMesh.find(subMeshId) !=
- _subMesh_i->_mesh_i->_mapSubMesh.end())
- {
- ::SMESH_subMesh * subMesh = _subMesh_i->_mesh_i->_mapSubMesh[subMeshId];
- _subMeshDS = subMesh->GetSubMeshDS();
- }
-
- if (_entity == SALOME_MED::MED_NODE)
- {
- _numberOfGeometricType = 1;
- _geometricType = new SALOME_MED::medGeometryElement[1];
- _geometricType[0] = SALOME_MED::MED_NONE;
- }
- else
- {
- MESSAGE("Pas implemente dans cette version");
- THROW_SALOME_CORBA_EXCEPTION
- ("Seules les familles de noeuds sont implementees ",
- SALOME::BAD_PARAM);
- }
-
- END_OF("Constructor SMESH_MEDSupport_i");
-}
-
-//=============================================================================
-/*!
- * Constructor
- */
-//=============================================================================
-SMESH_MEDSupport_i::
-SMESH_MEDSupport_i(const SMESH_MEDSupport_i & s):_subMesh_i(s._subMesh_i),
-_name(s._name), _description(s._description), _entity(s._entity),
-_seqNumber(false), _seqLength(0)
-{
- BEGIN_OF("Constructor SMESH_MEDSupport_i");
-
- _meshDS = _subMesh_i->_mesh_i->GetImpl().GetMeshDS();
-
- int subMeshId = _subMesh_i->GetId();
- if (_subMesh_i->_mesh_i->_mapSubMesh.find(subMeshId) !=
- _subMesh_i->_mesh_i->_mapSubMesh.end())
- {
- ::SMESH_subMesh * subMesh = _subMesh_i->_mesh_i->_mapSubMesh[subMeshId];
- _subMeshDS = subMesh->GetSubMeshDS();
- }
-
- END_OF("Constructor SMESH_MEDSupport_i");
-}
-
-//=============================================================================
-/*!
- * Destructor
- */
-//=============================================================================
-
-SMESH_MEDSupport_i::~SMESH_MEDSupport_i()
-{
-}
-
-//=============================================================================
-/*!
- * CORBA: Accessor for Corba Index
- */
-//=============================================================================
-
-CORBA::Long SMESH_MEDSupport_i::getCorbaIndex()throw(SALOME::SALOME_Exception)
-{
- if (_subMeshDS == NULL)
- THROW_SALOME_CORBA_EXCEPTION("No associated Support",
- SALOME::INTERNAL_ERROR);
- MESSAGE("Not implemented for SMESH_i");
- THROW_SALOME_CORBA_EXCEPTION("Not Implemented ", SALOME::BAD_PARAM);
-
-}
-
-//=============================================================================
-/*!
- * CORBA: Accessor for Name
- */
-//=============================================================================
-
-char *SMESH_MEDSupport_i::getName() throw(SALOME::SALOME_Exception)
-{
- if (_subMeshDS==NULL)
- THROW_SALOME_CORBA_EXCEPTION("No associated Support",
- SALOME::INTERNAL_ERROR);
- return CORBA::string_dup(_name.c_str());
-
-}
-
-//=============================================================================
-/*!
- * CORBA: Accessor for Description
- */
-//=============================================================================
-
-char *SMESH_MEDSupport_i::getDescription() throw(SALOME::SALOME_Exception)
-{
- if (_subMeshDS==NULL)
- THROW_SALOME_CORBA_EXCEPTION("No associated Support",
- SALOME::INTERNAL_ERROR);
- return CORBA::string_dup(_description.c_str());
-}
-
-//=============================================================================
-/*!
- * CORBA: Accessor for Mesh
- */
-//=============================================================================
-
-SALOME_MED::MESH_ptr SMESH_MEDSupport_i::getMesh()throw(SALOME::
- SALOME_Exception)
-{
- if (_subMeshDS==NULL)
- THROW_SALOME_CORBA_EXCEPTION("No associated Support",
- SALOME::INTERNAL_ERROR);
-
- return _subMesh_i->_mesh_i->GetMEDMesh();
-}
-
-//=============================================================================
-/*!
- * CORBA: boolean indicating if support concerns all elements
- */
-//=============================================================================
-
-CORBA::Boolean SMESH_MEDSupport_i::isOnAllElements()throw(SALOME::
- SALOME_Exception)
-{
- if (_subMeshDS==NULL)
- THROW_SALOME_CORBA_EXCEPTION("No associated Support",
- SALOME::INTERNAL_ERROR);
- if (_seqNumber == false)
- {
- if (_entity != SALOME_MED::MED_NONE)
- {
- _seqLength = _subMeshDS->NbNodes();
- _seqNumber = true;
- }
- else
- {
- MESSAGE("Only Node Families are implemented ");
- THROW_SALOME_CORBA_EXCEPTION("Not implemented Yet ",
- SALOME::BAD_PARAM);
- }
- }
- try
- {
- _isOnAllElements = (_seqLength == _meshDS->NbNodes());
- }
- catch(...)
- {
- MESSAGE("unable to acces related Mesh");
- THROW_SALOME_CORBA_EXCEPTION("No associated Mesh",
- SALOME::INTERNAL_ERROR);
- };
- return _isOnAllElements;
-}
-
-//=============================================================================
-/*!
- * CORBA: Accessor for type of support's entity
- */
-//=============================================================================
-
-SALOME_MED::medEntityMesh SMESH_MEDSupport_i::getEntity()throw(SALOME::
- SALOME_Exception)
-{
- if (_subMeshDS==NULL)
- THROW_SALOME_CORBA_EXCEPTION("No associated Support",
- SALOME::INTERNAL_ERROR);
- return _entity;
-}
-
-//=============================================================================
-/*!
- * CORBA: Accessor for types of geometry elements
- */
-//=============================================================================
-
-SALOME_MED::medGeometryElement_array *
- SMESH_MEDSupport_i::getTypes()throw(SALOME::SALOME_Exception)
-{
- if (_subMeshDS==NULL)
- THROW_SALOME_CORBA_EXCEPTION("No associated Support",
- SALOME::INTERNAL_ERROR);
- SALOME_MED::medGeometryElement_array_var myseq =
- new SALOME_MED::medGeometryElement_array;
- try
- {
- int mySeqLength = _numberOfGeometricType;
- myseq->length(mySeqLength);
- for (int i = 0; i < mySeqLength; i++)
- {
- myseq[i] = _geometricType[i];
- }
- }
- catch(...)
- {
- MESSAGE("Exception lors de la recherche des differents types");
- THROW_SALOME_CORBA_EXCEPTION("Unable to acces Support Types",
- SALOME::INTERNAL_ERROR);
- }
- return myseq._retn();
-}
-
-//=============================================================================
-/*!
- * CORBA: Number of different types of geometry elements
- * existing in the support
- */
-//=============================================================================
-CORBA::Long SMESH_MEDSupport_i::getNumberOfElements(SALOME_MED::
- medGeometryElement geomElement) throw(SALOME::SALOME_Exception)
-{
- if (_subMeshDS==NULL)
- THROW_SALOME_CORBA_EXCEPTION("No associated Support",
- SALOME::INTERNAL_ERROR);
- return _numberOfGeometricType;
-
-}
-
-//=============================================================================
-/*!
- * CORBA: get Nodes
- */
-//=============================================================================
-
-SALOME_MED::long_array * SMESH_MEDSupport_i::getNumber(
- SALOME_MED::medGeometryElement geomElement) throw(SALOME::SALOME_Exception)
-{
- Unexpect aCatch(SALOME_SalomeException);
- if (_subMeshDS==NULL)
- THROW_SALOME_CORBA_EXCEPTION("No associated Support",
- SALOME::INTERNAL_ERROR);
-
- // A changer s'il ne s agit plus seulement de famille de noeuds
- if (geomElement != SALOME_MED::MED_NONE)
- THROW_SALOME_CORBA_EXCEPTION("Not implemented", SALOME::BAD_PARAM);
-
- SALOME_MED::long_array_var myseq = new SALOME_MED::long_array;
-
- int i = 0;
- myseq->length(_subMeshDS->NbNodes());
-
- SMDS_NodeIteratorPtr it = _subMeshDS->GetNodes();
- while(it->more())
- {
- myseq[i] = it->next()->GetID();
- i++;
- };
-
- SCRUTE(myseq->length());
- MESSAGE("End of SMESH_MEDSupport_i::getNumber");
- return myseq._retn();
-
-}
-
-//=============================================================================
-/*!
- * CORBA: Global Nodes Index (optionnaly designed by the user)
- * CORBA: ??????????????????????????????
- */
-//=============================================================================
-
-SALOME_MED::long_array *
- SMESH_MEDSupport_i::getNumberIndex()throw(SALOME::SALOME_Exception)
-{
- MESSAGE("Not implemented for SMESH_i");
- THROW_SALOME_CORBA_EXCEPTION("Not Implemented", SALOME::BAD_PARAM);
- return NULL;
-}
-//=============================================================================
-/*!
- * CORBA: Array containing indexes for elements included in the support
- */
-//=============================================================================
-
-CORBA::Long SMESH_MEDSupport_i::getNumberOfGaussPoint(SALOME_MED::
- medGeometryElement geomElement) throw(SALOME::SALOME_Exception)
-{
- MESSAGE("Not implemented for SMESH_i");
- return 0;
-}
-//=============================================================================
-/*!
- * Gives the number of types of elements included in the support
- */
-//=============================================================================
-CORBA::Long SMESH_MEDSupport_i::getNumberOfTypes()
- throw (SALOME::SALOME_Exception)
-{
- MESSAGE("!!! NOT YET IMPLEMENTED !!!!");
- THROW_SALOME_CORBA_EXCEPTION("Not Implemented", SALOME::BAD_PARAM);
- return 0;
-}
-//=============================================================================
-/*!
- * Gives CORBA: Array containing the numbers of Gauss point of elements
- * included in the support
- */
-//=============================================================================
-SALOME_MED::long_array* SMESH_MEDSupport_i::getNumbersOfGaussPoint()
- throw (SALOME::SALOME_Exception)
-{
- MESSAGE("!!! NOT YET IMPLEMENTED !!!!");
- THROW_SALOME_CORBA_EXCEPTION("Not Implemented", SALOME::BAD_PARAM);
- return NULL;
-}
-//=============================================================================
-/*!
- * build the object which will contain all the boundary elements of the mesh.
- */
-//=============================================================================
-void SMESH_MEDSupport_i::getBoundaryElements()
- throw (SALOME::SALOME_Exception)
-{
- MESSAGE("!!! NOT YET IMPLEMENTED !!!!");
- THROW_SALOME_CORBA_EXCEPTION("Not Implemented", SALOME::BAD_PARAM);
-}
-//=============================================================================
-/*!
- * Gives information on the support
- */
-//=============================================================================
-SALOME_MED::SUPPORT::supportInfos * SMESH_MEDSupport_i::getSupportGlobal()
- throw (SALOME::SALOME_Exception)
-{
- MESSAGE("!!! NOT YET IMPLEMENTED !!!!");
- THROW_SALOME_CORBA_EXCEPTION("Not Implemented", SALOME::BAD_PARAM);
- return NULL;
-}
+++ /dev/null
-// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESH_MEDSupport_i.hxx
-// Module : SMESH
-
-#ifndef _MED_SMESH_MEDSUPPORT_I_HXX_
-#define _MED_SMESH_MEDSUPPORT_I_HXX_
-
-#include <SALOMEconfig.h>
-#include CORBA_SERVER_HEADER(MED)
-#include <string>
-
-#include "SMESHDS_Mesh.hxx"
-#include "SMESHDS_SubMesh.hxx"
-#include "SMDS_MeshElement.hxx"
-#include "SMDS_MeshNode.hxx"
-
-#include "SMESH_MEDSupport_i.hxx"
-#include "SALOME_GenericObj_i.hh"
-class SMESH_subMesh_i;
-
-class SMESH_MEDSupport_i:
- public virtual POA_SALOME_MED::SUPPORT, public virtual SALOME::GenericObj_i
-{
- public:
-
-// Constructors and associated internal methods
- SMESH_MEDSupport_i(SMESH_subMesh_i * sm,
- string name, string description, SALOME_MED::medEntityMesh entity);
- SMESH_MEDSupport_i(const SMESH_MEDSupport_i & s);
-
-// IDL Methods
- char *getName() throw(SALOME::SALOME_Exception);
- char *getDescription() throw(SALOME::SALOME_Exception);
- SALOME_MED::MESH_ptr getMesh() throw(SALOME::SALOME_Exception);
- CORBA::Boolean isOnAllElements() throw(SALOME::SALOME_Exception);
- SALOME_MED::medEntityMesh getEntity() throw(SALOME::SALOME_Exception);
- CORBA::Long
- getNumberOfElements(SALOME_MED::medGeometryElement geomElement)
- throw(SALOME::SALOME_Exception);
-
- CORBA::Long getNumberOfTypes() throw (SALOME::SALOME_Exception);
-
- SALOME_MED::long_array *
- getNumber(SALOME_MED::medGeometryElement geomElement)
- throw(SALOME::SALOME_Exception);
-
- SALOME_MED::long_array * getNumberIndex()
- throw(SALOME::SALOME_Exception);
-
- CORBA::Long
- getNumberOfGaussPoint(SALOME_MED::medGeometryElement geomElement)
- throw(SALOME::SALOME_Exception);
-
- SALOME_MED::long_array* getNumbersOfGaussPoint()
- throw (SALOME::SALOME_Exception);
-
- SALOME_MED::medGeometryElement_array *getTypes()
- throw(SALOME::SALOME_Exception);
-
- void getBoundaryElements() throw (SALOME::SALOME_Exception);
-
- CORBA::Long getCorbaIndex() throw(SALOME::SALOME_Exception);
-
- SALOME_MED::SUPPORT::supportInfos * getSupportGlobal()
- throw (SALOME::SALOME_Exception);
-
- void createSeq() throw(SALOME::SALOME_Exception);
-
- public: //public field
- const SMESHDS_SubMesh * _subMeshDS;
- ::SMESH_subMesh_i * _subMesh_i;
-
- SMESHDS_Mesh * _meshDS;
- string _name;
- string _description;
- bool _isOnAllElements;
- bool _seqNumber;
- int _seqLength;
-
- SALOME_MED::medEntityMesh _entity;
- SALOME_MED::medGeometryElement * _geometricType;
- int _numberOfGeometricType;
-
- protected:
- SMESH_MEDSupport_i();
- ~SMESH_MEDSupport_i();
-};
-
-#endif /* _MED_MEDSUPPORT_I_HXX_ */
+++ /dev/null
-// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESH_Mesh_i.hxx
-// Author : Paul RASCLE, EDF
-// Module : SMESH
-// $Header$
-
-#ifndef _SMESH_MESH_I_HXX_
-#define _SMESH_MESH_I_HXX_
-
-#include <SALOMEconfig.h>
-#include CORBA_SERVER_HEADER(SMESH_Mesh)
-#include CORBA_SERVER_HEADER(SMESH_Group)
-#include CORBA_SERVER_HEADER(SMESH_Hypothesis)
-#include CORBA_CLIENT_HEADER(GEOM_Gen)
-#include CORBA_CLIENT_HEADER(MED)
-
-#include "SMESH_Hypothesis.hxx"
-#include "SMESH_Mesh.hxx"
-#include "SMESH_subMesh_i.hxx"
-#include "SMESH_subMesh.hxx"
-
-#include "SALOME_GenericObj_i.hh"
-
-class SMESH_Gen_i;
-class SMESH_GroupBase_i;
-
-#include <map>
-
-class SMESH_Mesh_i:
- public virtual POA_SMESH::SMESH_Mesh,
- public virtual SALOME::GenericObj_i
-{
- SMESH_Mesh_i();
- SMESH_Mesh_i(const SMESH_Mesh_i&);
-public:
- SMESH_Mesh_i( PortableServer::POA_ptr thePOA,
- SMESH_Gen_i* myGen_i,
- CORBA::Long studyId );
-
- virtual ~SMESH_Mesh_i();
-
- // --- CORBA
- void SetShape( GEOM::GEOM_Object_ptr theShapeObject )
- throw (SALOME::SALOME_Exception);
-
- GEOM::GEOM_Object_ptr GetShapeToMesh()
- throw (SALOME::SALOME_Exception);
-
- SMESH::Hypothesis_Status AddHypothesis(GEOM::GEOM_Object_ptr aSubShapeObject,
- SMESH::SMESH_Hypothesis_ptr anHyp)
- throw (SALOME::SALOME_Exception);
-
- SMESH::Hypothesis_Status RemoveHypothesis(GEOM::GEOM_Object_ptr aSubShapeObject,
- SMESH::SMESH_Hypothesis_ptr anHyp)
- throw (SALOME::SALOME_Exception);
-
- SMESH::ListOfHypothesis* GetHypothesisList(GEOM::GEOM_Object_ptr aSubShapeObject)
- throw (SALOME::SALOME_Exception);
-
- SMESH::SMESH_subMesh_ptr GetSubMesh(GEOM::GEOM_Object_ptr aSubShapeObject, const char* theName)
- throw (SALOME::SALOME_Exception);
-
- void RemoveSubMesh( SMESH::SMESH_subMesh_ptr theSubMesh )
- throw (SALOME::SALOME_Exception);
-
- SMESH::SMESH_Group_ptr CreateGroup( SMESH::ElementType theElemType, const char* theName )
- throw (SALOME::SALOME_Exception);
-
- SMESH::SMESH_GroupOnGeom_ptr CreateGroupFromGEOM(SMESH::ElementType theElemType,
- const char* theName,
- GEOM::GEOM_Object_ptr theGeomObj )
- throw (SALOME::SALOME_Exception);
-
- void RemoveGroup( SMESH::SMESH_GroupBase_ptr theGroup )
- throw (SALOME::SALOME_Exception);
-
- void RemoveGroupWithContents( SMESH::SMESH_GroupBase_ptr theGroup )
- throw (SALOME::SALOME_Exception);
-
- SMESH::SMESH_Group_ptr UnionGroups( SMESH::SMESH_GroupBase_ptr theGroup1,
- SMESH::SMESH_GroupBase_ptr theGroup2,
- const char* theName )
- throw (SALOME::SALOME_Exception);
-
- SMESH::SMESH_Group_ptr IntersectGroups( SMESH::SMESH_GroupBase_ptr theGroup1,
- SMESH::SMESH_GroupBase_ptr theGroup2,
- const char* theName )
- throw (SALOME::SALOME_Exception);
-
- SMESH::SMESH_Group_ptr CutGroups( SMESH::SMESH_GroupBase_ptr theGroup1,
- SMESH::SMESH_GroupBase_ptr theGroup2,
- const char* theName )
- throw (SALOME::SALOME_Exception);
-
-// SMESH::string_array* GetLog(CORBA::Boolean clearAfterGet)
-// throw (SALOME::SALOME_Exception);
-
- SMESH::log_array* GetLog(CORBA::Boolean clearAfterGet)
- throw (SALOME::SALOME_Exception);
-
- SMESH::SMESH_MeshEditor_ptr GetMeshEditor();
-
- void ClearLog()
- throw (SALOME::SALOME_Exception);
-
- CORBA::Long GetId()
- throw (SALOME::SALOME_Exception);
-
- CORBA::Long GetStudyId()
- throw (SALOME::SALOME_Exception);
-
- // --- C++ interface
-
- void SetImpl(::SMESH_Mesh* impl);
- ::SMESH_Mesh& GetImpl(); // :: force no namespace here
-
- SMESH_Gen_i* GetGen() { return _gen_i; }
-
- int ImportUNVFile( const char* theFileName )
- throw (SALOME::SALOME_Exception);
-
- int ImportSTLFile( const char* theFileName )
- throw (SALOME::SALOME_Exception);
-
- /*!
- * consult DriverMED_R_SMESHDS_Mesh::ReadStatus for returned value
- */
- SMESH::DriverMED_ReadStatus ImportMEDFile( const char* theFileName, const char* theMeshName )
- throw (SALOME::SALOME_Exception);
-
- void ExportToMED( const char* file, CORBA::Boolean auto_groups, SMESH::MED_VERSION theVersion )
- throw (SALOME::SALOME_Exception);
- void ExportMED( const char* file, CORBA::Boolean auto_groups )
- throw (SALOME::SALOME_Exception);
-
- void ExportDAT( const char* file )
- throw (SALOME::SALOME_Exception);
- void ExportUNV( const char* file )
- throw (SALOME::SALOME_Exception);
- void ExportSTL( const char* file, const bool isascii )
- throw (SALOME::SALOME_Exception);
-
- SALOME_MED::MESH_ptr GetMEDMesh()
- throw (SALOME::SALOME_Exception);
-
- CORBA::Long NbNodes()
- throw (SALOME::SALOME_Exception);
-
- CORBA::Long NbElements()
- throw (SALOME::SALOME_Exception);
-
- CORBA::Long NbEdges()
- throw (SALOME::SALOME_Exception);
-
- CORBA::Long NbFaces()
- throw (SALOME::SALOME_Exception);
-
- CORBA::Long NbTriangles()
- throw (SALOME::SALOME_Exception);
-
- CORBA::Long NbQuadrangles()
- throw (SALOME::SALOME_Exception);
-
- CORBA::Long NbPolygons()
- throw (SALOME::SALOME_Exception);
-
- CORBA::Long NbVolumes()
- throw (SALOME::SALOME_Exception);
-
- CORBA::Long NbTetras()
- throw (SALOME::SALOME_Exception);
-
- CORBA::Long NbHexas()
- throw (SALOME::SALOME_Exception);
-
- CORBA::Long NbPyramids()
- throw (SALOME::SALOME_Exception);
-
- CORBA::Long NbPrisms()
- throw (SALOME::SALOME_Exception);
-
- CORBA::Long NbPolyhedrons()
- throw (SALOME::SALOME_Exception);
-
- CORBA::Long NbSubMesh()
- throw (SALOME::SALOME_Exception);
-
- SMESH::long_array* GetElementsId()
- throw (SALOME::SALOME_Exception);
-
- SMESH::long_array* GetElementsByType( SMESH::ElementType theElemType )
- throw (SALOME::SALOME_Exception);
-
- SMESH::long_array* GetNodesId()
- throw (SALOME::SALOME_Exception);
-
- SMESH::ElementType GetElementType( const CORBA::Long id, const bool iselem )
- throw (SALOME::SALOME_Exception);
-
- char* Dump();
-
- // Internal methods not available through CORBA
- // They are called by corresponding interface methods
- SMESH_Hypothesis::Hypothesis_Status addHypothesis(GEOM::GEOM_Object_ptr aSubShapeObject,
- SMESH::SMESH_Hypothesis_ptr anHyp);
-
- SMESH_Hypothesis::Hypothesis_Status removeHypothesis(GEOM::GEOM_Object_ptr aSubShapeObject,
- SMESH::SMESH_Hypothesis_ptr anHyp);
-
- int importMEDFile( const char* theFileName, const char* theMeshName );
-
- SMESH::SMESH_subMesh_ptr createSubMesh( GEOM::GEOM_Object_ptr theSubShapeObject );
-
- void removeSubMesh(SMESH::SMESH_subMesh_ptr theSubMesh,
- GEOM::GEOM_Object_ptr theSubShapeObject );
-
- SMESH::SMESH_GroupBase_ptr createGroup(SMESH::ElementType theElemType,
- const char* theName,
- const TopoDS_Shape& theShape = TopoDS_Shape());
-
- void removeGroup( const int theId );
-
- SMESH::SMESH_subMesh_ptr getSubMesh(int shapeID);
- // return an existing subMesh object for the shapeID. shapeID == submeshID.
-
- const map<int, SMESH::SMESH_GroupBase_ptr>& getGroups() { return _mapGroups; }
- // return an existing group object.
-
- virtual SMESH::long_array* GetIDs();
-
- map<int, SMESH_subMesh_i*> _mapSubMesh_i; //NRI
- map<int, ::SMESH_subMesh*> _mapSubMesh; //NRI
-
-private:
- static int myIdGenerator;
- ::SMESH_Mesh* _impl; // :: force no namespace here
- SMESH_Gen_i* _gen_i;
- int _id; // id given by creator (unique within the creator instance)
- int _studyId;
- map<int, SMESH::SMESH_subMesh_ptr> _mapSubMeshIor;
- map<int, SMESH::SMESH_GroupBase_ptr> _mapGroups;
- map<int, SMESH::SMESH_Hypothesis_ptr> _mapHypo;
-};
-
-#endif
-
+++ /dev/null
-// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESH_Pattern_i.hxx
-// Created : Fri Aug 20 16:03:15 2004
-// Author : Edward AGAPOV (eap)
-
-// $Header:
-
-#ifndef SMESH_Pattern_I_HeaderFile
-#define SMESH_Pattern_I_HeaderFile
-
-#include "SALOMEconfig.h"
-#include CORBA_SERVER_HEADER(SMESH_Pattern)
-#include CORBA_SERVER_HEADER(SMESH_Mesh)
-#include CORBA_CLIENT_HEADER(GEOM_Gen)
-
-#include <TopoDS_Shape.hxx>
-#include "SMESH_Pattern.hxx"
-
-class SMESH_Gen_i;
-class SMESH_Mesh;
-
-class SMESH_Pattern_i:
- public virtual POA_SMESH::SMESH_Pattern
-{
- public:
-
- SMESH_Pattern_i (SMESH_Gen_i* theGen_i);
-
- CORBA::Boolean LoadFromFile(const char* theFileContents);
-
- CORBA::Boolean LoadFromFace(SMESH::SMESH_Mesh_ptr theMesh,
- GEOM::GEOM_Object_ptr theFace,
- CORBA::Boolean theProject);
-
- CORBA::Boolean LoadFrom3DBlock(SMESH::SMESH_Mesh_ptr theMesh,
- GEOM::GEOM_Object_ptr theBlock);
-
- SMESH::point_array* ApplyToFace(GEOM::GEOM_Object_ptr theFace,
- GEOM::GEOM_Object_ptr theVertexOnKeyPoint1,
- CORBA::Boolean theReverse);
-
- SMESH::point_array* ApplyTo3DBlock(GEOM::GEOM_Object_ptr theBlock,
- GEOM::GEOM_Object_ptr theVertex000,
- GEOM::GEOM_Object_ptr theVertex001);
-
- SMESH::point_array* ApplyToMeshFaces(SMESH::SMESH_Mesh_ptr theMesh,
- const SMESH::long_array& theFacesIDs,
- CORBA::Long theNodeIndexOnKeyPoint1,
- CORBA::Boolean theReverse);
-
- SMESH::point_array* ApplyToHexahedrons(SMESH::SMESH_Mesh_ptr theMesh,
- const SMESH::long_array& theVolumesIDs,
- CORBA::Long theNode000Index,
- CORBA::Long theNode001Index);
-
- CORBA::Boolean MakeMesh (SMESH::SMESH_Mesh_ptr theMesh,
- const CORBA::Boolean CreatePolygons,
- const CORBA::Boolean CreatePolyedrs);
-
- SMESH::SMESH_Pattern::ErrorCode GetErrorCode();
-
- char* GetString();
-
- CORBA::Boolean Is2D();
-
- SMESH::point_array* GetPoints();
-
- SMESH::long_array* GetKeyPoints();
-
- SMESH::array_of_long_array* GetElementPoints(CORBA::Boolean applied);
-
-
- private:
-
- ::SMESH_Mesh* getMesh( SMESH::SMESH_Mesh_ptr & theMesh );
-
- ::SMESH_Pattern myPattern;
-
- SMESH_Gen_i* myGen;
-};
-#endif
+++ /dev/null
-// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESH_subMesh_i.cxx
-// Author : Paul RASCLE, EDF
-// Module : SMESH
-// $Header$
-
-using namespace std;
-#include "SMESH_subMesh_i.hxx"
-#include "SMESH_Gen_i.hxx"
-#include "SMESH_Mesh_i.hxx"
-
-#include "Utils_CorbaException.hxx"
-#include "utilities.h"
-#include "OpUtil.hxx"
-#include "Utils_ExceptHandlers.hxx"
-
-#include <BRepTools.hxx>
-#include <TopoDS.hxx>
-#include <TopoDS_Iterator.hxx>
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-SMESH_subMesh_i::SMESH_subMesh_i()
- : SALOME::GenericObj_i( PortableServer::POA::_nil() )
-{
- MESSAGE("SMESH_subMesh_i::SMESH_subMesh_i default, not for use");
- ASSERT(0);
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-SMESH_subMesh_i::SMESH_subMesh_i( PortableServer::POA_ptr thePOA,
- SMESH_Gen_i* gen_i,
- SMESH_Mesh_i* mesh_i,
- int localId )
- : SALOME::GenericObj_i( thePOA )
-{
- MESSAGE("SMESH_subMesh_i::SMESH_subMesh_i");
- _gen_i = gen_i;
- _mesh_i = mesh_i;
- _localId = localId;
- thePOA->activate_object( this );
- // ****
-}
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-SMESH_subMesh_i::~SMESH_subMesh_i()
-{
- MESSAGE("SMESH_subMesh_i::~SMESH_subMesh_i");
- // ****
-}
-
-//=======================================================================
-//function : getSubMeshes
-//purpose : for a submesh on shape to which elements are not bound directly,
-// return submeshes containing elements
-//=======================================================================
-
-typedef list<SMESHDS_SubMesh*> TListOfSubMeshes;
-
-bool getSubMeshes(::SMESH_subMesh* theSubMesh,
- TListOfSubMeshes& theSubMeshList)
-{
- int size = theSubMeshList.size();
-
- SMESH_Mesh* aMesh = theSubMesh->GetFather();
- SMESHDS_Mesh* aMeshDS = aMesh->GetMeshDS();
- SMESHDS_SubMesh* aSubMeshDS = theSubMesh->GetSubMeshDS();
-
- // nodes can be bound to either vertex, edge, face or solid_or_shell
- TopoDS_Shape aShape = theSubMesh->GetSubShape();
- switch ( aShape.ShapeType() )
- {
- case TopAbs_SOLID: {
- // add submesh of solid itself
- aSubMeshDS = aMeshDS->MeshElements( aShape );
- if ( aSubMeshDS )
- theSubMeshList.push_back( aSubMeshDS );
- // and of the first shell
- TopExp_Explorer exp( aShape, TopAbs_SHELL );
- if ( exp.More() ) {
- aSubMeshDS = aMeshDS->MeshElements( exp.Current() );
- if ( aSubMeshDS )
- theSubMeshList.push_back( aSubMeshDS );
- }
- break;
- }
- case TopAbs_WIRE:
- case TopAbs_COMPOUND:
- case TopAbs_COMPSOLID: {
- // call getSubMeshes() for sub-shapes
- list<TopoDS_Shape> shapeList;
- shapeList.push_back( aShape );
- list<TopoDS_Shape>::iterator sh = shapeList.begin();
- for ( ; sh != shapeList.end(); ++sh ) {
- for ( TopoDS_Iterator it( *sh ); it.More(); it.Next() ) {
- ::SMESH_subMesh* aSubMesh = aMesh->GetSubMeshContaining( it.Value() );
- if ( aSubMesh )
- getSubMeshes( aSubMesh, theSubMeshList );
- else
- // no submesh for a compound inside compound
- shapeList.push_back( it.Value() );
- }
- }
- // return only unique submeshes
- set<SMESHDS_SubMesh*> smSet;
- TListOfSubMeshes::iterator sm = theSubMeshList.begin();
- while ( sm != theSubMeshList.end() ) {
- if ( !smSet.insert( *sm ).second )
- sm = theSubMeshList.erase( sm );
- else
- ++sm;
- }
- break;
- }
- }
- return size < theSubMeshList.size();
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-CORBA::Long SMESH_subMesh_i::GetNumberOfElements()
- throw (SALOME::SALOME_Exception)
-{
- Unexpect aCatch(SALOME_SalomeException);
- MESSAGE("SMESH_subMesh_i::GetNumberOfElements");
- if ( _mesh_i->_mapSubMesh.find( _localId ) == _mesh_i->_mapSubMesh.end() )
- return 0;
-
- ::SMESH_subMesh* aSubMesh = _mesh_i->_mapSubMesh[_localId];
- SMESHDS_SubMesh* aSubMeshDS = aSubMesh->GetSubMeshDS();
-
- int nbElems = aSubMeshDS ? aSubMeshDS->NbElements() : 0;
-
- // volumes are bound to shell
- TListOfSubMeshes smList;
- if ( nbElems == 0 && getSubMeshes( aSubMesh, smList ))
- {
- TListOfSubMeshes::iterator sm = smList.begin();
- for ( ; sm != smList.end(); ++sm )
- nbElems += (*sm)->NbElements();
- }
- return nbElems;
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-CORBA::Long SMESH_subMesh_i::GetNumberOfNodes(CORBA::Boolean all)
- throw (SALOME::SALOME_Exception)
-{
- Unexpect aCatch(SALOME_SalomeException);
- MESSAGE("SMESH_subMesh_i::GetNumberOfNodes");
- if ( _mesh_i->_mapSubMesh.find( _localId ) == _mesh_i->_mapSubMesh.end() )
- return 0;
-
- ::SMESH_subMesh* aSubMesh = _mesh_i->_mapSubMesh[_localId];
- SMESHDS_SubMesh* aSubMeshDS = aSubMesh->GetSubMeshDS();
-
- set<int> nodeIds;
-
- // nodes are bound to shell instead of solid
- TListOfSubMeshes smList;
- if ( all && getSubMeshes( aSubMesh, smList ))
- {
- TListOfSubMeshes::iterator sm = smList.begin();
- for ( ; sm != smList.end(); ++sm )
- {
- SMDS_ElemIteratorPtr eIt = (*sm)->GetElements();
- while ( eIt->more() ) {
- const SMDS_MeshElement* anElem = eIt->next();
- SMDS_ElemIteratorPtr nIt = anElem->nodesIterator();
- while ( nIt->more() )
- nodeIds.insert( nIt->next()->GetID() );
- }
- }
- return nodeIds.size();
- }
-
- if ( aSubMeshDS == NULL )
- return 0;
-
- if ( all ) { // all nodes of submesh elements
- SMDS_ElemIteratorPtr eIt = aSubMeshDS->GetElements();
- while ( eIt->more() ) {
- const SMDS_MeshElement* anElem = eIt->next();
- SMDS_ElemIteratorPtr nIt = anElem->nodesIterator();
- while ( nIt->more() )
- nodeIds.insert( nIt->next()->GetID() );
- }
- return nodeIds.size();
- }
-
- return aSubMeshDS->NbNodes();
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-SMESH::long_array* SMESH_subMesh_i::GetElementsId()
- throw (SALOME::SALOME_Exception)
-{
- Unexpect aCatch(SALOME_SalomeException);
- MESSAGE("SMESH_subMesh_i::GetElementsId");
- SMESH::long_array_var aResult = new SMESH::long_array();
-
- if ( _mesh_i->_mapSubMesh.find( _localId ) == _mesh_i->_mapSubMesh.end() )
- return aResult._retn();
-
- ::SMESH_subMesh* aSubMesh = _mesh_i->_mapSubMesh[_localId];
- SMESHDS_SubMesh* aSubMeshDS = aSubMesh->GetSubMeshDS();
-
- int nbElems = aSubMeshDS ? aSubMeshDS->NbElements() : 0;
- TListOfSubMeshes smList;
- if ( nbElems )
- smList.push_back( aSubMeshDS );
-
- // volumes are bound to shell
- if ( nbElems == 0 && getSubMeshes( aSubMesh, smList ))
- {
- TListOfSubMeshes::iterator sm = smList.begin();
- for ( ; sm != smList.end(); ++sm )
- nbElems += (*sm)->NbElements();
- }
-
- aResult->length( nbElems );
- if ( nbElems )
- {
- TListOfSubMeshes::iterator sm = smList.begin();
- for ( int i = 0; sm != smList.end(); sm++ )
- {
- SMDS_ElemIteratorPtr anIt = (*sm)->GetElements();
- for ( int n = aSubMeshDS->NbElements(); i < n && anIt->more(); i++ )
- aResult[i] = anIt->next()->GetID();
- }
- }
- return aResult._retn();
-}
-
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-SMESH::long_array* SMESH_subMesh_i::GetElementsByType( SMESH::ElementType theElemType )
- throw (SALOME::SALOME_Exception)
-{
- Unexpect aCatch(SALOME_SalomeException);
- MESSAGE("SMESH_subMesh_i::GetElementsByType");
- SMESH::long_array_var aResult = new SMESH::long_array();
-
- if ( _mesh_i->_mapSubMesh.find( _localId ) == _mesh_i->_mapSubMesh.end() )
- return aResult._retn();
-
- ::SMESH_subMesh* aSubMesh = _mesh_i->_mapSubMesh[_localId];
- SMESHDS_SubMesh* aSubMeshDS = aSubMesh->GetSubMeshDS();
-
- // PAL5440, return all nodes belonging to elements of submesh
- set<int> nodeIds;
- int nbElems = aSubMeshDS ? aSubMeshDS->NbElements() : 0;
-
- // volumes may be bound to shell instead of solid
- TListOfSubMeshes smList;
- if ( nbElems == 0 && getSubMeshes( aSubMesh, smList ))
- {
- TListOfSubMeshes::iterator sm = smList.begin();
- for ( ; sm != smList.end(); ++sm )
- {
- if ( theElemType == SMESH::NODE )
- {
- SMDS_ElemIteratorPtr eIt = (*sm)->GetElements();
- while ( eIt->more() ) {
- const SMDS_MeshElement* anElem = eIt->next();
- SMDS_ElemIteratorPtr nIt = anElem->nodesIterator();
- while ( nIt->more() )
- nodeIds.insert( nIt->next()->GetID() );
- }
- }
- else
- {
- nbElems += (*sm)->NbElements();
- }
- }
- aSubMeshDS = 0;
- }
- else
- {
- if ( nbElems )
- smList.push_back( aSubMeshDS );
- }
-
- if ( theElemType == SMESH::NODE && aSubMeshDS )
- {
- SMDS_ElemIteratorPtr eIt = aSubMeshDS->GetElements();
- while ( eIt->more() ) {
- const SMDS_MeshElement* anElem = eIt->next();
- SMDS_ElemIteratorPtr nIt = anElem->nodesIterator();
- while ( nIt->more() )
- nodeIds.insert( nIt->next()->GetID() );
- }
- }
-
- if ( theElemType == SMESH::NODE )
- aResult->length( nodeIds.size() );
- else
- aResult->length( nbElems );
-
- int i = 0, n = aResult->length();
-
- if ( theElemType == SMESH::NODE && !nodeIds.empty() ) {
- set<int>::iterator idIt = nodeIds.begin();
- for ( ; i < n && idIt != nodeIds.end() ; i++, idIt++ )
- aResult[i] = *idIt;
- }
-
- if ( theElemType != SMESH::NODE ) {
- TListOfSubMeshes::iterator sm = smList.begin();
- for ( i = 0; sm != smList.end(); sm++ )
- {
- aSubMeshDS = *sm;
- SMDS_ElemIteratorPtr anIt = aSubMeshDS->GetElements();
- while ( i < n && anIt->more() ) {
- const SMDS_MeshElement* anElem = anIt->next();
- if ( theElemType == SMESH::ALL || anElem->GetType() == (SMDSAbs_ElementType)theElemType )
- aResult[i++] = anElem->GetID();
- }
- }
- }
-
- aResult->length( i );
-
- return aResult._retn();
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-SMESH::long_array* SMESH_subMesh_i::GetNodesId()
- throw (SALOME::SALOME_Exception)
-{
- Unexpect aCatch(SALOME_SalomeException);
- MESSAGE("SMESH_subMesh_i::GetNodesId");
- SMESH::long_array_var aResult = GetElementsByType( SMESH::NODE );
- return aResult._retn();
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-SMESH::SMESH_Mesh_ptr SMESH_subMesh_i::GetFather()
- throw (SALOME::SALOME_Exception)
-{
- Unexpect aCatch(SALOME_SalomeException);
- MESSAGE("SMESH_subMesh_i::GetFather");
- return _mesh_i->_this();
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-CORBA::Long SMESH_subMesh_i::GetId()
-{
- MESSAGE("SMESH_subMesh_i::GetId");
- return _localId;
-}
-
-//=======================================================================
-//function : GetSubShape
-//purpose :
-//=======================================================================
-
-GEOM::GEOM_Object_ptr SMESH_subMesh_i::GetSubShape()
- throw (SALOME::SALOME_Exception)
-{
- Unexpect aCatch(SALOME_SalomeException);
- GEOM::GEOM_Object_var aShapeObj;
- try {
- if ( _mesh_i->_mapSubMesh.find( _localId ) != _mesh_i->_mapSubMesh.end()) {
- TopoDS_Shape S = _mesh_i->_mapSubMesh[ _localId ]->GetSubShape();
- if ( !S.IsNull() )
- aShapeObj = _gen_i->ShapeToGeomObject( S );
- }
- }
- catch(SALOME_Exception & S_ex) {
- THROW_SALOME_CORBA_EXCEPTION(S_ex.what(), SALOME::BAD_PARAM);
- }
- return aShapeObj._retn();
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-SALOME_MED::FAMILY_ptr SMESH_subMesh_i::GetFamily()
- throw (SALOME::SALOME_Exception)
-{
- Unexpect aCatch(SALOME_SalomeException);
- SALOME_MED::MESH_var MEDMesh = GetFather()->GetMEDMesh();
-
- SALOME_MED::Family_array_var families =
- MEDMesh->getFamilies(SALOME_MED::MED_NODE);
-
- for ( int i = 0; i < families->length(); i++ ) {
- if ( families[i]->getIdentifier() == ( _localId ) )
- return families[i];
- }
-
- return SALOME_MED::FAMILY::_nil();
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-SMESH::long_array* SMESH_subMesh_i::GetIDs()
-{
- SMESH::long_array_var aResult = GetElementsId();
- return aResult._retn();
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-SMESH::ElementType SMESH_subMesh_i::GetElementType( const CORBA::Long id, const bool iselem )
- throw (SALOME::SALOME_Exception)
-{
- return GetFather()->GetElementType( id, iselem );
-}
+++ /dev/null
-// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : SMESH_subMesh_i.hxx
-// Author : Paul RASCLE, EDF
-// Module : SMESH
-// $Header$
-
-#ifndef _SMESH_SUBMESH_I_HXX_
-#define _SMESH_SUBMESH_I_HXX_
-
-#include <SALOMEconfig.h>
-#include CORBA_SERVER_HEADER(SMESH_Mesh)
-#include CORBA_SERVER_HEADER(SMESH_Hypothesis)
-#include CORBA_CLIENT_HEADER(GEOM_Gen)
-#include CORBA_CLIENT_HEADER(MED)
-
-#include "SALOME_GenericObj_i.hh"
-
-class SMESH_Gen_i;
-class SMESH_Mesh_i;
-
-class SMESH_subMesh_i:
- public virtual POA_SMESH::SMESH_subMesh,
- public virtual SALOME::GenericObj_i
-{
-public:
- SMESH_subMesh_i();
- SMESH_subMesh_i( PortableServer::POA_ptr thePOA,
- SMESH_Gen_i* gen_i,
- SMESH_Mesh_i* mesh_i,
- int localId );
- ~SMESH_subMesh_i();
-
- CORBA::Long GetNumberOfElements()
- throw (SALOME::SALOME_Exception);
-
- CORBA::Long GetNumberOfNodes( CORBA::Boolean all )
- throw (SALOME::SALOME_Exception);
-
- SMESH::long_array* GetElementsId()
- throw (SALOME::SALOME_Exception);
-
- SMESH::long_array* GetElementsByType( SMESH::ElementType theElemType )
- throw (SALOME::SALOME_Exception);
-
- SMESH::ElementType GetElementType( const CORBA::Long id, const bool iselem )
- throw (SALOME::SALOME_Exception);
-
- SMESH::long_array* GetNodesId()
- throw (SALOME::SALOME_Exception);
-
- SMESH::SMESH_Mesh_ptr GetFather()
- throw (SALOME::SALOME_Exception);
-
- GEOM::GEOM_Object_ptr GetSubShape()
- throw (SALOME::SALOME_Exception);
-
- CORBA::Long GetId();
-
- SALOME_MED::FAMILY_ptr GetFamily()
- throw (SALOME::SALOME_Exception);
-
- virtual SMESH::long_array* GetIDs();
-
- SMESH_Mesh_i* _mesh_i; //NRI
-
-protected:
- SMESH_Gen_i* _gen_i;
- int _localId;
-};
-
-#endif
+++ /dev/null
-# SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses
-#
-# Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-#
-# See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-#
-#
-#
-# File : smeshpy.py
-# Module : SMESH
-
-import salome
-import SMESH
-
-from SALOME_utilities import *
-
-#=============================================================================
-
-class smeshpy:
- _geom = None
- _smesh = None
- _studyId = None
-
- #--------------------------------------------------------------------------
-
- def __init__(self):
- try:
- self._geom = salome.lcc.FindOrLoadComponent("FactoryServer","GEOM")
- self._smesh = salome.lcc.FindOrLoadComponent("FactoryServer","SMESH")
- except:
- MESSAGE( "exception in smeshpy:__init__" )
- self._study = salome.myStudy
- self._smesh.SetCurrentStudy(self._study)
-
- #--------------------------------------------------------------------------
-
- def CreateMesh(self, shapeId):
- try:
- shape = salome.IDToObject(shapeId)
- aMesh = self._smesh.CreateMesh(shape)
- return aMesh
- except:
- MESSAGE( "exception in smeshpy:Init" )
- return None
-
- #--------------------------------------------------------------------------
-
- def CreateHypothesis(self, name, libname):
- try:
- hyp = self._smesh.CreateHypothesis(name, libname)
- return hyp
- except:
- MESSAGE( "exception in smeshpy:CreateHypothesis" )
- return None
-
- #--------------------------------------------------------------------------
-
- def Compute(self, mesh, shapeId):
- try:
- shape = salome.IDToObject(shapeId)
- ret=self._smesh.Compute(mesh, shape)
- return ret
- except:
- MESSAGE( "exception in smeshpy:Compute" )
- return 0
-
-#=============================================================================
-## #--------------------------------------------------------------------------
-
-##def SmeshInit(shapeId):
-## import salome
-## import SMESH
-## geom = salome.lcc.FindOrLoadComponent("FactoryServer", "GEOM")
-## smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH")
-## shape = salome.IDToObject(shapeId)
-## studyId = salome.myStudyId
-## MESSAGE( str(studyId) )
-## aMesh = smesh.Init(geom, studyId, shape)
-## return aMesh
-
-## #--------------------------------------------------------------------------
+++ /dev/null
-# Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-#
-# See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-#
-#
-#
-# File : Makefile.in
-# Author : Nicolas REJNERI, Paul RASCLE
-# Module : SMESH
-# $Header$
-
-top_srcdir=@top_srcdir@
-top_builddir=../..
-srcdir=@srcdir@
-VPATH=.:@srcdir@:@top_srcdir@/idl
-
-
-@COMMENCE@
-
-# Libraries targets
-
-LIB = libSMESH_Swigcmodule.la
-LIB_SRC =
-
-SWIG_DEF = libSMESH_Swig.i
-EXPORT_PYSCRIPTS = libSMESH_Swig.py \
- smesh.py \
- batchmode_smesh.py \
- batchmode_mefisto.py \
- ex00_all.py \
- ex01_cube2build.py \
- ex02_cube2primitive.py \
- ex03_cube2partition.py \
- ex04_cube5tetraHexa.py \
- ex05_hole1build.py \
- ex06_hole1boolean.py \
- ex07_hole1partition.py \
- ex08_hole2build.py \
- ex09_grid4build.py \
- ex10_grid4geometry.py \
- ex11_grid3partition.py \
- ex12_grid17partition.py \
- ex13_hole1partial.py \
- ex14_cyl1holed.py \
- ex15_cyl2geometry.py \
- ex16_cyl2complementary.py \
- ex17_dome1.py \
- ex18_dome2.py \
- ex19_sphereINcube.py \
- SMESH_test.py\
- SMESH_test0.py\
- SMESH_test1.py \
- SMESH_test2.py \
- SMESH_test3.py \
- SMESH_test4.py \
- SMESH_test5.py \
- SMESH_mechanic.py \
- SMESH_mechanic_tetra.py \
- SMESH_mechanic_editor.py \
- SMESH_fixation.py \
- SMESH_fixation_hexa.py \
- SMESH_fixation_tetra.py \
- SMESH_box_tetra.py \
- SMESH_box2_tetra.py \
- SMESH_box3_tetra.py \
- SMESH_flight_skin.py \
- SMESH_Partition1_tetra.py\
- SMESH_controls.py \
- SMESH_freebord.py \
- SMESH_blocks.py \
- SMESH_BelongToGeom.py \
- SMESH_GroupFromGeom2.py \
- SMESH_box.py \
- SMESH_demo_hexa2_upd.py \
- SMESH_hexaedre.py \
- SMESH_Sphere.py \
- SMESH_GroupFromGeom.py \
- SMESH_Nut.py \
- SMESH_GroupLyingOnGeom.py \
- PAL_MESH_041_mesh.py \
- PAL_MESH_043_2D.py \
- PAL_MESH_043_3D.py \
- SMESH_reg.py
-
-LIB_CLIENT_IDL = SALOMEDS.idl \
- SALOME_Exception.idl \
- GEOM_Gen.idl \
- SMESH_Gen.idl \
- SMESH_Mesh.idl \
- SMESH_Hypothesis.idl \
- SMESH_BasicHypothesis.idl \
- SMESH_Group.idl \
- SALOME_ModuleCatalog.idl \
- SALOME_Component.idl \
- SALOME_GenericObj.idl \
- MED.idl \
- SALOME_Comm.idl
-
-EXPORT_SHAREDPYSCRIPTS=SMESH_shared_modules.py
-
-CPPFLAGS+=$(QT_INCLUDES) $(PYTHON_INCLUDES) $(OCC_INCLUDES) $(VTK_INCLUDES) $(OGL_INCLUDES) -I${KERNEL_ROOT_DIR}/include/salome -DHAVE_CONFIG_H
-LIBS+= $(PYTHON_LIBS)
-LDFLAGS+= -lSMESH -L${KERNEL_ROOT_DIR}/lib/salome -lSalomeGenericObj
-
-@CONCLUDE@
+++ /dev/null
-import geompy
-import salome
-
-import StdMeshers
-
-#-----------------------------GEOM----------------------------------------
-
-#----------Vertexes------------
-p1 = geompy.MakeVertex(20.0,30.0,40.0)
-p2 = geompy.MakeVertex(90.0,80.0,0.0)
-p3 = geompy.MakeVertex(30.0,80.0,200.0)
-
-#----------Edges---------------
-e1 = geompy.MakeEdge(p1,p2)
-e2 = geompy.MakeEdge(p2,p3)
-e3 = geompy.MakeEdge(p3,p1)
-
-#----------Wire----------------
-ListOfEdges = []
-ListOfEdges.append(e3)
-ListOfEdges.append(e2)
-ListOfEdges.append(e1)
-wire1 = geompy.MakeWire(ListOfEdges)
-
-
-#----------Face----------------
-WantPlanarFace = 1
-face1 = geompy.MakeFace(wire1,WantPlanarFace)
-
-Id_face1 = geompy.addToStudy(face1,"Face1")
-
-
-
-#-----------------------------SMESH-------------------------------------------
-smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH")
-
-# -- Init --
-plane_mesh = salome.IDToObject( Id_face1)
-smesh.SetCurrentStudy(salome.myStudy)
-
-mesh = smesh.CreateMesh(plane_mesh)
-
-smeshgui = salome.ImportComponentGUI("SMESH")
-smeshgui.Init(salome.myStudyId)
-
-id_mesh = salome.ObjectToID(mesh)
-smeshgui.SetName( id_mesh, "Mesh_1")
-
-
-print"---------------------Hypothesis"
-
-
-#---------------- NumberOfSegments
-numberOfSegment = 9
-
-hypNbSeg = smesh.CreateHypothesis( "NumberOfSegments", "libStdMeshersEngine.so" )
-hypNbSeg.SetNumberOfSegments( numberOfSegment )
-
-print hypNbSeg.GetName()
-print hypNbSeg.GetNumberOfSegments()
-smeshgui.SetName(salome.ObjectToID(hypNbSeg), "Nb. Segments")
-
-
-#--------------------------Max. Element Area
-maxElementArea = 200
-
-hypArea200 = smesh.CreateHypothesis("MaxElementArea","libStdMeshersEngine.so")
-hypArea200.SetMaxElementArea( maxElementArea )
-print hypArea200.GetName()
-print hypArea200.GetMaxElementArea()
-
-smeshgui.SetName(salome.ObjectToID(hypArea200), "Max. Element Area")
-
-print"---------------------Algorithms"
-
-#----------------------------Wire discretisation
-algoWireDes = smesh.CreateHypothesis( "Regular_1D", "libStdMeshersEngine.so" )
-listHyp = algoWireDes.GetCompatibleHypothesis()
-
-print algoWireDes.GetName()
-smeshgui.SetName(salome.ObjectToID(algoWireDes), "Ware descritisation")
-
-#----------------------------Triangle (Mefisto)
-algoMef = smesh.CreateHypothesis( "MEFISTO_2D", "libStdMeshersEngine.so" )
-listHyp = algoMef.GetCompatibleHypothesis()
-
-print algoMef.GetName()
-
-#----------------------------Add hipothesis to the plane
-mesh.AddHypothesis( plane_mesh, hypNbSeg ) # nb segments
-mesh.AddHypothesis( plane_mesh, hypArea200 ) # max area
-
-mesh.AddHypothesis( plane_mesh, algoWireDes ) # Regular 1D/wire discretisation
-mesh.AddHypothesis( plane_mesh, algoMef ) # MEFISTO 2D
-
-smeshgui.SetName(salome.ObjectToID(algoMef), "Triangle (Mefisto)")
-
-print "---------------------Compute the mesh"
-
-smesh.Compute(mesh, plane_mesh)
-
-salome.sg.updateObjBrowser(1)
-
+++ /dev/null
-# Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-#
-# See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-#
-#
-#
-# File : SMESH_testExtrusion2D.py
-# Module : SMESH
-# Description : Create meshes to test extrusion of mesh elements along path
-
-import salome
-import geompy
-import SMESH
-import StdMeshers
-
-#----------------------------------GEOM
-
-# create points
-p1 = geompy.MakeVertex(100, 0, 0)
-p2 = geompy.MakeVertex(100, 0, 100)
-p3 = geompy.MakeVertex(0, 0, 0)
-p4 = geompy.MakeVertex(0, 100, 0)
-
-
-# create two vectors
-vector1 = geompy.MakeVector(p1,p2)
-vector2 = geompy.MakeVector(p3,p4)
-
-# make two ellipses
-ellipse1 = geompy.MakeEllipse(p1,vector1,50,25)
-ellipse2 = geompy.MakeEllipse(p3,vector2,300,50)
-
-# publish circular face and second circle
-id_ellipse1 = geompy.addToStudy(ellipse1, "Ellips 1")
-id_ellipse2 = geompy.addToStudy(ellipse2, "Ellips 2")
-
-
-#---------------------------------SMESH
-# get smesh engine
-smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH")
-smesh.SetCurrentStudy(salome.myStudy)
-
-# get SMESH GUI
-smeshgui = salome.ImportComponentGUI("SMESH")
-smeshgui.Init(salome.myStudyId)
-
-# create hypoteses
-hypNbSeg1 = smesh.CreateHypothesis("NumberOfSegments", "libStdMeshersEngine.so")
-hypNbSeg1.SetNumberOfSegments(18)
-id_hypNbSeg1 = salome.ObjectToID(hypNbSeg1)
-smeshgui.SetName(id_hypNbSeg1, "NumberOfSegments 1");
-
-hypNbSeg2 = smesh.CreateHypothesis("NumberOfSegments", "libStdMeshersEngine.so")
-hypNbSeg2.SetNumberOfSegments(34)
-id_hypNbSeg2 = salome.ObjectToID(hypNbSeg2)
-smeshgui.SetName(id_hypNbSeg2, "NumberOfSegments 2");
-
-# create algorithmes
-algoReg = smesh.CreateHypothesis("Regular_1D", "libStdMeshersEngine.so")
-id_algoReg = salome.ObjectToID(algoReg)
-smeshgui.SetName(id_algoReg, "Regular_1D");
-
-# create the path mesh
-mesh1 = smesh.CreateMesh(ellipse1)
-id_mesh1 = salome.ObjectToID(mesh1)
-smeshgui.SetName(id_mesh1, "Path Mesh");
-
-# set hypotheses and algos
-mesh1.AddHypothesis(ellipse1,algoReg)
-mesh1.AddHypothesis(ellipse1,hypNbSeg1)
-
-# create the tool mesh
-mesh2 = smesh.CreateMesh(ellipse2)
-id_mesh2 = salome.ObjectToID(mesh2)
-smeshgui.SetName(id_mesh2, "Tool Mesh");
-
-# set hypotheses and algos
-mesh2.AddHypothesis(ellipse2,algoReg)
-mesh2.AddHypothesis(ellipse2,hypNbSeg2)
-
-# compute meshes
-smesh.Compute(mesh1,ellipse1)
-smesh.Compute(mesh2,ellipse2)
-
-
-# ---- udate object browser
-salome.sg.updateObjBrowser(1);
+++ /dev/null
-# Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-#
-# See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-#
-#
-#
-# File : SMESH_testExtrusion3D.py
-# Module : SMESH
-# Description : Create meshes to test extrusion of mesh elements along path
-
-import salome
-import geompy
-import SMESH
-import StdMeshers
-
-# get smesh engine
-smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH")
-smesh.SetCurrentStudy(salome.myStudy)
-
-# create points to build two circles
-p1 = geompy.MakeVertex(0, 100, 0)
-p2 = geompy.MakeVertex(100, 0, 0)
-p3 = geompy.MakeVertex(0, -100, 0)
-p4 = geompy.MakeVertex(0, 70, 0)
-p5 = geompy.MakeVertex(0, 100, 30)
-p6 = geompy.MakeVertex(0, 130, 0)
-
-# create two circles
-circle = geompy.MakeCircleThreePnt(p1, p2, p3)
-cf = geompy.MakeCircleThreePnt(p4, p5, p6)
-
-# make circular face
-wire = geompy.MakeWire([cf])
-face = geompy.MakeFace(wire, 1)
-
-# publish circular face and second circle
-idcircle = geompy.addToStudy(circle, "Circle")
-idface = geompy.addToStudy(face, "Circular face")
-
-# get SMESH GUI
-smeshgui = salome.ImportComponentGUI("SMESH")
-smeshgui.Init(salome.myStudyId)
-
-# create hypoteses
-hypNbSeg = smesh.CreateHypothesis("NumberOfSegments", "libStdMeshersEngine.so")
-hypNbSeg.SetNumberOfSegments(12)
-idseg = salome.ObjectToID(hypNbSeg)
-smeshgui.SetName(idseg, "NumberOfSegments_10");
-
-hypArea = smesh.CreateHypothesis("MaxElementArea", "libStdMeshersEngine.so")
-hypArea.SetMaxElementArea(30)
-idarea = salome.ObjectToID(hypArea)
-smeshgui.SetName(idarea, "MaxElementArea_20");
-
-# create algorithmes
-algoReg = smesh.CreateHypothesis("Regular_1D", "libStdMeshersEngine.so")
-idreg = salome.ObjectToID(algoReg)
-smeshgui.SetName(idreg, "Regular_1D");
-
-algoMef = smesh.CreateHypothesis("MEFISTO_2D", "libStdMeshersEngine.so")
-idmef = salome.ObjectToID(algoMef)
-smeshgui.SetName(idmef, "MEFISTO_2D");
-
-# init a Mesh with the circular face
-mesh1 = smesh.CreateMesh(face)
-idmesh1 = salome.ObjectToID(mesh1)
-smeshgui.SetName(idmesh1, "Mesh on circular face");
-
-# set hypotheses and algos
-mesh1.AddHypothesis(face,algoReg)
-mesh1.AddHypothesis(face,hypNbSeg)
-mesh1.AddHypothesis(face,algoMef)
-mesh1.AddHypothesis(face,hypArea)
-
-# init a Mesh with the second circle
-mesh2 = smesh.CreateMesh(circle)
-idmesh2 = salome.ObjectToID(mesh2)
-smeshgui.SetName(idmesh2, "Mesh on circular edge");
-
-# set hypotheses and algos
-mesh2.AddHypothesis(circle,algoReg)
-mesh2.AddHypothesis(circle,hypNbSeg)
-
-# compute meshes
-smesh.Compute(mesh1,face)
-smesh.Compute(mesh2,circle)
-
-# ---- udate object browser
-salome.sg.updateObjBrowser(1);
+++ /dev/null
-import SMESH
-from SMESH_test1 import *
-
-def CheckBelongToGeomFilter(theMeshGen, theMesh, theShape, theSubShape, theElemType):
- import geompy
- if theShape != theSubShape:
- aName = str(theSubShape)
- geompy.addToStudyInFather(theShape,theSubShape,aName)
-
- theMeshGen.Compute(theMesh,theShape)
-
- aFilterMgr = theMeshGen.CreateFilterManager()
- aFilter = aFilterMgr.CreateFilter()
-
- aBelongToGeom = aFilterMgr.CreateBelongToGeom()
- aBelongToGeom.SetGeom(theSubShape)
- aBelongToGeom.SetElementType(theElemType)
-
- aFilter.SetPredicate(aBelongToGeom)
- return aFilter.GetElementsId(theMesh)
-
-anElemType = SMESH.ALL;
-print "anElemType =", anElemType
-#anIds = CheckBelongToGeomFilter(smesh,mesh,box,subShapeList[1],SMESH.FACE)
-anIds = CheckBelongToGeomFilter(smesh,mesh,box,box,SMESH.FACE)
-print "anIds = ", anIds
-
-salome.sg.updateObjBrowser(1);
+++ /dev/null
-# Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-#
-# See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-#
-#
-#
-# File : SMESH_GroupFromGeom.py
-# Module : SMESH
-
-from SMESH_test1 import *
-import SMESH
-
-# Compute the mesh created in SMESH_test1
-
-smesh.Compute(mesh, box)
-
-# Create geometry groups on plane:
-aGeomGroup1 = geompy.CreateGroup(face , geompy.ShapeType["FACE"])
-geompy.AddObject(aGeomGroup1, 1)
-
-aGeomGroup2 = geompy.CreateGroup(face , geompy.ShapeType["EDGE"])
-
-geompy.AddObject(aGeomGroup2, 3)
-geompy.AddObject(aGeomGroup2, 6)
-geompy.AddObject(aGeomGroup2, 8)
-geompy.AddObject(aGeomGroup2, 10)
-
-geompy.addToStudy(aGeomGroup1, "Group on Faces")
-geompy.addToStudy(aGeomGroup2, "Group on Edges")
-
-aSmeshGroup1 = mesh.CreateGroupFromGEOM(SMESH.FACE, "SMESHGroup1", aGeomGroup1)
-aSmeshGroup2 = mesh.CreateGroupFromGEOM(SMESH.EDGE, "SMESHGroup2", aGeomGroup2)
-
-salome.sg.updateObjBrowser(1);
+++ /dev/null
-#==============================================================================
-# Info.
-# Bug (from script, bug) : SMESH_GroupFromGeom.py, PAL6945
-# Modified : 25/11/2004
-# Author : Kovaltchuk Alexey
-# Project : PAL/SALOME
-#==============================================================================
-from SMESH_test1 import *
-import SMESH
-
-# Compute the mesh created in SMESH_test1
-
-smesh.Compute(mesh, box)
-
-# Create geometry groups on plane:
-aGeomGroup1 = geompy.CreateGroup(face , geompy.ShapeType["FACE"])
-geompy.AddObject(aGeomGroup1, 1)
-
-aGeomGroup2 = geompy.CreateGroup(face , geompy.ShapeType["EDGE"])
-
-geompy.AddObject(aGeomGroup2, 3)
-geompy.AddObject(aGeomGroup2, 6)
-geompy.AddObject(aGeomGroup2, 8)
-geompy.AddObject(aGeomGroup2, 10)
-
-geompy.addToStudy(aGeomGroup1, "Group on Faces")
-geompy.addToStudy(aGeomGroup2, "Group on Edges")
-
-aSmeshGroup1 = mesh.CreateGroupFromGEOM(SMESH.FACE, "SMESHGroup1", aGeomGroup1)
-aSmeshGroup2 = mesh.CreateGroupFromGEOM(SMESH.EDGE, "SMESHGroup2", aGeomGroup2)
-
-print "Create aGroupOnShell - a group linked to a shell"
-aGroupOnShell = mesh.CreateGroupFromGEOM(SMESH.EDGE, "GroupOnShell", shell)
-print "aGroupOnShell type =", aGroupOnShell.GetType()
-print "aGroupOnShell size =", aGroupOnShell.Size()
-print "aGroupOnShell ids :", aGroupOnShell.GetListOfID()
-
-print " "
-
-print "Modify <LocalLength> hypothesis: 100 -> 50"
-hypLen1.SetLength(50)
-print "Contents of aGroupOnShell changes:"
-print "aGroupOnShell size =", aGroupOnShell.Size()
-print "aGroupOnShell ids :", aGroupOnShell.GetListOfID()
-
-print " "
-
-print "Re-compute mesh, contents of aGroupOnShell changes again:"
-smesh.Compute(mesh, box)
-print "aGroupOnShell size =", aGroupOnShell.Size()
-print "aGroupOnShell ids :", aGroupOnShell.GetListOfID()
-
-salome.sg.updateObjBrowser(1);
+++ /dev/null
-from smesh import *
-
-def BuildGroupLyingOn(theMesh, theElemType, theName, theShape):
- aFilterMgr = smesh.CreateFilterManager()
- aFilter = aFilterMgr.CreateFilter()
-
- aLyingOnGeom = aFilterMgr.CreateLyingOnGeom()
- aLyingOnGeom.SetGeom(theShape)
- aLyingOnGeom.SetElementType(theElemType)
-
- aFilter.SetPredicate(aLyingOnGeom)
- anIds = aFilter.GetElementsId(theMesh)
-
- aGroup = theMesh.CreateGroup(theElemType, theName)
- aGroup.Add(anIds)
-
-#Example
-## from SMESH_test1 import *
-
-## smesh.Compute(mesh, box)
-## BuildGroupLyingOn(mesh, SMESH.FACE, "Group of faces lying on edge", edge )
-
-## salome.sg.updateObjBrowser(1);
+++ /dev/null
-#
-# Tetrahedrization of the geometry generated by the Python script GEOM_Partition1.py
-# Hypothesis and algorithms for the mesh generation are global
-#
-#%Make geometry (like CEA script (A1)) using Partition algorithm% from OCC
-# -- Rayon de la bariere
-
-import salome
-import geompy
-from math import sqrt
-
-import StdMeshers
-import NETGENPlugin
-
-smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH")
-smesh.SetCurrentStudy(salome.myStudy)
-
-smeshgui = salome.ImportComponentGUI("SMESH")
-smeshgui.Init(salome.myStudyId)
-
-#---------------------------------------------------------------
-
-barier_height = 7.0
-barier_radius = 5.6 / 2 # Rayon de la bariere
-colis_radius = 1.0 / 2 # Rayon du colis
-colis_step = 2.0 # Distance s\89parant deux colis
-cc_width = 0.11 # Epaisseur du complement de colisage
-
-# --
-
-cc_radius = colis_radius + cc_width
-colis_center = sqrt(2.0)*colis_step/2
-
-# --
-
-boolean_common = 1
-boolean_cut = 2
-boolean_fuse = 3
-boolean_section = 4
-
-# --
-
-p0 = geompy.MakeVertex(0.,0.,0.)
-vz = geompy.MakeVectorDXDYDZ(0.,0.,1.)
-
-# --
-
-barier = geompy.MakeCylinder(p0, vz, barier_radius, barier_height)
-
-# --
-
-colis = geompy.MakeCylinder(p0, vz, colis_radius, barier_height)
-cc = geompy.MakeCylinder(p0, vz, cc_radius, barier_height)
-
-colis_cc = geompy.MakeCompound([colis, cc])
-colis_cc = geompy.MakeTranslation(colis_cc, colis_center, 0.0, 0.0)
-
-colis_cc_multi = geompy.MultiRotate1D(colis_cc, vz, 4)
-
-# --
-
-alveole = geompy.MakePartition([colis_cc_multi, barier])
-
-print "Analysis of the geometry to mesh (right after the Partition) :"
-
-subShellList = geompy.SubShapeAll(alveole, geompy.ShapeType["SHELL"])
-subFaceList = geompy.SubShapeAll(alveole, geompy.ShapeType["FACE"])
-subEdgeList = geompy.SubShapeAll(alveole, geompy.ShapeType["EDGE"])
-
-print "number of Shells in alveole : ", len(subShellList)
-print "number of Faces in alveole : ", len(subFaceList)
-print "number of Edges in alveole : ", len(subEdgeList)
-
-subshapes = geompy.SubShapeAll(alveole, geompy.ShapeType["SHAPE"])
-
-## there are 9 subshapes
-
-comp1 = geompy.MakeCompound( [ subshapes[0], subshapes[1] ] )
-comp2 = geompy.MakeCompound( [ subshapes[2], subshapes[3] ] )
-comp3 = geompy.MakeCompound( [ subshapes[4], subshapes[5] ] )
-comp4 = geompy.MakeCompound( [ subshapes[6], subshapes[7] ] )
-
-compGOs = []
-compGOs.append( comp1 )
-compGOs.append( comp2 )
-compGOs.append( comp3 )
-compGOs.append( comp4 )
-comp = geompy.MakeCompound( compGOs )
-
-alveole = geompy.MakeCompound( [ comp, subshapes[8] ])
-
-idalveole = geompy.addToStudy(alveole, "alveole")
-
-print "Analysis of the geometry to mesh (right after the MakeCompound) :"
-
-subShellList = geompy.SubShapeAll(alveole, geompy.ShapeType["SHELL"])
-subFaceList = geompy.SubShapeAll(alveole, geompy.ShapeType["FACE"])
-subEdgeList = geompy.SubShapeAll(alveole, geompy.ShapeType["EDGE"])
-
-print "number of Shells in alveole : ", len(subShellList)
-print "number of Faces in alveole : ", len(subFaceList)
-print "number of Edges in alveole : ", len(subEdgeList)
-
-status = geompy.CheckShape(alveole)
-print " check status ", status
-
-# ---- launch SMESH
-
-print "-------------------------- create Hypothesis (In this case global hypothesis are used)"
-
-print "-------------------------- NumberOfSegments"
-
-numberOfSegments = 10
-
-hypNbSeg = smesh.CreateHypothesis("NumberOfSegments", "libStdMeshersEngine.so")
-hypNbSeg.SetNumberOfSegments(numberOfSegments)
-print hypNbSeg.GetName()
-print hypNbSeg.GetId()
-print hypNbSeg.GetNumberOfSegments()
-
-smeshgui.SetName(salome.ObjectToID(hypNbSeg), "NumberOfSegments_10")
-
-print "-------------------------- MaxElementArea"
-
-maxElementArea = 0.1
-
-hypArea = smesh.CreateHypothesis("MaxElementArea", "libStdMeshersEngine.so")
-hypArea.SetMaxElementArea(maxElementArea)
-print hypArea.GetName()
-print hypArea.GetId()
-print hypArea.GetMaxElementArea()
-
-smeshgui.SetName(salome.ObjectToID(hypArea), "MaxElementArea_0.1")
-
-print "-------------------------- MaxElementVolume"
-
-maxElementVolume = 0.5
-
-hypVolume = smesh.CreateHypothesis("MaxElementVolume", "libStdMeshersEngine.so")
-hypVolume.SetMaxElementVolume(maxElementVolume)
-print hypVolume.GetName()
-print hypVolume.GetId()
-print hypVolume.GetMaxElementVolume()
-
-smeshgui.SetName(salome.ObjectToID(hypVolume), "MaxElementVolume_0.5")
-
-print "-------------------------- create Algorithms"
-
-print "-------------------------- Regular_1D"
-
-regular1D = smesh.CreateHypothesis("Regular_1D", "libStdMeshersEngine.so")
-smeshgui.SetName(salome.ObjectToID(regular1D), "Wire Discretisation")
-
-print "-------------------------- MEFISTO_2D"
-
-mefisto2D = smesh.CreateHypothesis("MEFISTO_2D", "libStdMeshersEngine.so")
-smeshgui.SetName(salome.ObjectToID(mefisto2D), "MEFISTO_2D")
-
-print "-------------------------- NETGEN_3D"
-
-netgen3D = smesh.CreateHypothesis("NETGEN_3D", "libNETGENEngine.so")
-smeshgui.SetName(salome.ObjectToID(netgen3D), "NETGEN_3D")
-
-# ---- init a Mesh with the alveole
-shape_mesh = salome.IDToObject( idalveole )
-
-mesh = smesh.CreateMesh(shape_mesh)
-smeshgui.SetName(salome.ObjectToID(mesh), "MeshAlveole")
-
-# ---- add hypothesis to alveole
-
-print "-------------------------- add hypothesis to alveole"
-
-mesh.AddHypothesis(shape_mesh,regular1D)
-mesh.AddHypothesis(shape_mesh,hypNbSeg)
-
-mesh.AddHypothesis(shape_mesh,mefisto2D)
-mesh.AddHypothesis(shape_mesh,hypArea)
-
-mesh.AddHypothesis(shape_mesh,netgen3D)
-mesh.AddHypothesis(shape_mesh,hypVolume)
-
-print "-------------------------- compute the mesh of alveole "
-ret = smesh.Compute(mesh,shape_mesh)
-
-if ret != 0:
- log=mesh.GetLog(0) # no erase trace
- for linelog in log:
- print linelog
- print "Information about the Mesh_mechanic:"
- print "Number of nodes : ", mesh.NbNodes()
- print "Number of edges : ", mesh.NbEdges()
- print "Number of faces : ", mesh.NbFaces()
- print "Number of triangles : ", mesh.NbTriangles()
- print "Number of volumes : ", mesh.NbVolumes()
- print "Number of tetrahedrons: ", mesh.NbTetras()
-else:
- print "problem when computing the mesh"
-
-salome.sg.updateObjBrowser(1)
+++ /dev/null
-# GEOM GEOM_SWIG : binding of C++ omplementaion with Python
-#
-# Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-#
-# See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-#
-#
-#
-# File : GEOM_Sphere.py
-# Author : Damien COQUERET, Open CASCADE
-# Module : GEOM
-# $Header:
-
-from geompy import *
-from math import *
-
-import smesh
-
-# It is an example of creating a hexahedrical mesh on a sphere.
-#
-# Used approach allows to avoid problems with degenerated and
-# seam edges without special processing of geometrical shapes
-
-#-----------------------------------------------------------------------
-#Variables
-Radius = 100.
-Dist = Radius / 2.
-Factor = 2.5
-Angle90 = pi / 2.
-NbSeg = 10
-
-PointsList = []
-ShapesList = []
-
-#Basic Elements
-P0 = MakeVertex(0., 0., 0.)
-P1 = MakeVertex(-Dist, -Dist, -Dist)
-P2 = MakeVertex(-Dist, -Dist, Dist)
-P3 = MakeVertex(-Dist, Dist, Dist)
-P4 = MakeVertex(-Dist, Dist, -Dist)
-
-VZ = MakeVectorDXDYDZ(0., 0., 1.)
-
-#Construction Elements
-PointsList.append(P1)
-PointsList.append(P2)
-PointsList.append(P3)
-PointsList.append(P4)
-PointsList.append(P1)
-
-PolyLine = MakePolyline(PointsList)
-
-Face1 = MakeFace(PolyLine, 1)
-Face2 = MakeScaleTransform(Face1, P0, Factor)
-Face3 = MakeScaleTransform(Face1, P0, -1.)
-
-#Models
-Sphere = MakeSphereR(Radius)
-
-Block = MakeHexa2Faces(Face1, Face2)
-Cube = MakeHexa2Faces(Face1, Face3)
-
-Common1 = MakeBoolean(Sphere, Block, 1)
-Common2 = MakeRotation(Common1, VZ, Angle90)
-
-MultiBlock1 = MakeMultiTransformation1D(Common1, 21, -1, 3)
-MultiBlock2 = MakeMultiTransformation1D(Common2, 31, -1, 3)
-
-#Reconstruct sphere from several blocks
-ShapesList.append(Cube)
-ShapesList.append(MultiBlock1)
-ShapesList.append(MultiBlock2)
-Compound = MakeCompound(ShapesList)
-
-Result = MakeGlueFaces(Compound, 0.1)
-
-#addToStudy
-Id_Sphere = addToStudy(Sphere, "Sphere")
-Id_Cube = addToStudy(Cube, "Cube")
-
-Id_Common1 = addToStudy(Common1, "Common1")
-Id_Common2 = addToStudy(Common2, "Common2")
-
-Id_MultiBlock1 = addToStudy(MultiBlock1, "MultiBlock1")
-Id_MultiBlock2 = addToStudy(MultiBlock2, "MultiBlock2")
-
-Id_Result = addToStudy(Result, "Result")
-
-#-----------------------------------------------------------------------
-#Meshing
-my_hexa = smesh.Mesh(Result, "Sphere_Mesh")
-algo = my_hexa.Segment()
-algo.NumberOfSegments(NbSeg)
-my_hexa.Quadrangle()
-my_hexa.Hexahedron()
-my_hexa.Compute()
+++ /dev/null
-# SMESH SMESH_SWIG : binding of C++ implementaion with Python
-#
-# Copyright (C) 2003 CEA
-#
-# 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.org
-#
-#
-#
-# File : SMESH_blocks.py
-# Author : Julia DOROVSKIKH
-# Module : SMESH
-# $Header$
-
-import salome
-import geompy
-import math
-
-import GEOM_Spanner
-
-isBlocksTest = 0 # False
-isMeshTest = 1 # True
-hasGUI = 1 # True
-
-smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH")
-smesh.SetCurrentStudy(salome.myStudy)
-
-GEOM_Spanner.MakeSpanner(salome, geompy, math, isBlocksTest, isMeshTest, smesh, hasGUI)
-
-salome.sg.updateObjBrowser(1);
+++ /dev/null
-#==============================================================================
-# Info.
-# Bug (from script, bug) : box.py, PAL5223
-# Modified : 25/11/2004
-# Author : Kovaltchuk Alexey
-# Project : PAL/SALOME
-#==============================================================================
-#
-# Salome geometry and meshing for a box
-#
-import salome
-from salome import sg
-import geompy
-
-import StdMeshers
-
-# ---- launch GEOM
-
-geom = salome.lcc.FindOrLoadComponent("FactoryServer", "GEOM")
-meshgenerator = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH")
-
-###geom.GetCurrentStudy(salome.myStudy._get_StudyId())
-meshgenerator.SetCurrentStudy(salome.myStudy)
-
-# Plate
-
-box = geompy.MakeBox(0.,0.,0.,1.,1.,1.)
-boxId = geompy.addToStudy(box,"box")
-
-# ---- launch SMESH
-
-smeshgui = salome.ImportComponentGUI("SMESH")
-smeshgui.Init(salome.myStudyId)
-# meshgenerator=smeshpy.smeshpy()
-
-
-# Hypothesis
-
-hypL1=meshgenerator.CreateHypothesis("LocalLength","libStdMeshersEngine.so")
-hypL1.SetLength(0.25)
-hypL1Id = salome.ObjectToID(hypL1)
-smeshgui.SetName(hypL1Id, "LocalLength")
-
-# Algorithm
-
-alg1D=meshgenerator.CreateHypothesis("Regular_1D", "libStdMeshersEngine.so")
-alg1DId = salome.ObjectToID(alg1D)
-smeshgui.SetName(alg1DId, "algo1D")
-
-alg2D=meshgenerator.CreateHypothesis("Quadrangle_2D", "libStdMeshersEngine.so")
-alg2DId = salome.ObjectToID(alg2D)
-smeshgui.SetName(alg2DId, "algo2D")
-
-alg3D=meshgenerator.CreateHypothesis("Hexa_3D", "libStdMeshersEngine.so")
-alg3DId = salome.ObjectToID(alg3D)
-smeshgui.SetName(alg3DId, "algo3D")
-
-# ---- init a Mesh
-
-box_mesh=meshgenerator.CreateMesh(box)
-box_meshId = salome.ObjectToID(box_mesh)
-smeshgui.SetName(box_meshId, "box_mesh")
-
-# ---- set Hypothesis & Algorithm
-
-box_mesh.AddHypothesis(box,alg1D)
-box_mesh.AddHypothesis(box,alg2D)
-box_mesh.AddHypothesis(box,alg3D)
-box_mesh.AddHypothesis(box,hypL1)
-
-meshgenerator.Compute(box_mesh,box)
-
-sg.updateObjBrowser(1)
+++ /dev/null
-#
-# Tetrahedrization of the geometry union of 2 boxes having a face in common
-# Hypothesis and algorithms for the mesh generation are global
-#
-
-import salome
-import geompy
-
-import StdMeshers
-import NETGENPlugin
-
-smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH")
-
-smeshgui = salome.ImportComponentGUI("SMESH")
-smeshgui.Init(salome.myStudyId);
-
-# ---- define 2 boxes box1 and box2
-
-box1 = geompy.MakeBox(0., 0., 0., 100., 200., 300.)
-
-idbox1 = geompy.addToStudy(box1, "box1")
-
-print "Analysis of the geometry box1 :"
-subShellList = geompy.SubShapeAll(box1, geompy.ShapeType["SHELL"])
-subFaceList = geompy.SubShapeAll(box1, geompy.ShapeType["FACE"])
-subEdgeList = geompy.SubShapeAll(box1, geompy.ShapeType["EDGE"])
-
-print "number of Shells in box1 : ", len(subShellList)
-print "number of Faces in box1 : ", len(subFaceList)
-print "number of Edges in box1 : ", len(subEdgeList)
-
-box2 = geompy.MakeBox(100., 0., 0., 200., 200., 300.)
-
-idbox2 = geompy.addToStudy(box2, "box2")
-
-print "Analysis of the geometry box2 :"
-subShellList = geompy.SubShapeAll(box2, geompy.ShapeType["SHELL"])
-subFaceList = geompy.SubShapeAll(box2, geompy.ShapeType["FACE"])
-subEdgeList = geompy.SubShapeAll(box2, geompy.ShapeType["EDGE"])
-
-print "number of Shells in box2 : ", len(subShellList)
-print "number of Faces in box2 : ", len(subFaceList)
-print "number of Edges in box2 : ", len(subEdgeList)
-
-# append the tow boxes to make ine shel, referrencing only once
-# the internal interface
-
-shell = geompy.MakePartition([box1, box2])
-idshell = geompy.addToStudy(shell, "shell")
-
-print "Analysis of the geometry shell (union of box1 and box2) :"
-subShellList = geompy.SubShapeAll(shell, geompy.ShapeType["SHELL"])
-subFaceList = geompy.SubShapeAll(shell, geompy.ShapeType["FACE"])
-subEdgeList = geompy.SubShapeAll(shell, geompy.ShapeType["EDGE"])
-
-print "number of Shells in shell : ", len(subShellList)
-print "number of Faces in shell : ", len(subFaceList)
-print "number of Edges in shell : ", len(subEdgeList)
-
-
-### ---------------------------- SMESH --------------------------------------
-
-# ---- create Hypothesis
-
-print "-------------------------- create Hypothesis"
-
-print "-------------------------- NumberOfSegments"
-
-numberOfSegments = 10
-
-hypNbSeg = smesh.CreateHypothesis("NumberOfSegments", "libStdMeshersEngine.so")
-hypNbSeg.SetNumberOfSegments(numberOfSegments)
-
-print hypNbSeg.GetName()
-print hypNbSeg.GetId()
-print hypNbSeg.GetNumberOfSegments()
-
-smeshgui.SetName(salome.ObjectToID(hypNbSeg), "NumberOfSegments_10")
-
-print "-------------------------- MaxElementArea"
-
-maxElementArea = 500
-
-hypArea = smesh.CreateHypothesis("MaxElementArea", "libStdMeshersEngine.so")
-hypArea.SetMaxElementArea(maxElementArea)
-
-print hypArea.GetName()
-print hypArea.GetId()
-print hypArea.GetMaxElementArea()
-
-smeshgui.SetName(salome.ObjectToID(hypArea), "MaxElementArea_500")
-
-print "-------------------------- MaxElementVolume"
-
-maxElementVolume = 500
-
-hypVolume = smesh.CreateHypothesis("MaxElementVolume", "libStdMeshersEngine.so")
-hypVolume.SetMaxElementVolume(maxElementVolume)
-
-print hypVolume.GetName()
-print hypVolume.GetId()
-print hypVolume.GetMaxElementVolume()
-
-smeshgui.SetName(salome.ObjectToID(hypVolume), "MaxElementVolume_500")
-
-# ---- create Algorithms
-
-print "-------------------------- create Algorithms"
-
-print "-------------------------- Regular_1D"
-
-regular1D = smesh.CreateHypothesis("Regular_1D", "libStdMeshersEngine.so")
-smeshgui.SetName(salome.ObjectToID(regular1D), "Wire Discretisation")
-
-print "-------------------------- MEFISTO_2D"
-
-mefisto2D = smesh.CreateHypothesis("MEFISTO_2D", "libStdMeshersEngine.so")
-smeshgui.SetName(salome.ObjectToID(mefisto2D), "MEFISTO_2D")
-
-print "-------------------------- NETGEN_3D"
-
-netgen3D = smesh.CreateHypothesis("NETGEN_3D", "libNETGENEngine.so")
-smeshgui.SetName(salome.ObjectToID(netgen3D), "NETGEN_3D")
-
-# ---- init a Mesh with the shell
-
-mesh = smesh.CreateMesh(shell)
-smeshgui.SetName(salome.ObjectToID(mesh), "MeshBox2")
-
-# ---- add hypothesis to shell
-
-print "-------------------------- add hypothesis to shell"
-
-mesh.AddHypothesis(shell,regular1D)
-mesh.AddHypothesis(shell,hypNbSeg)
-
-mesh.AddHypothesis(shell,mefisto2D)
-mesh.AddHypothesis(shell,hypArea)
-
-mesh.AddHypothesis(shell,netgen3D)
-mesh.AddHypothesis(shell,hypVolume)
-
-salome.sg.updateObjBrowser(1)
-
-print "-------------------------- compute shell"
-ret = smesh.Compute(mesh,shell)
-print ret
-if ret != 0:
- log = mesh.GetLog(0) # no erase trace
- for linelog in log:
- print linelog
- print "Information about the MeshBox2:"
- print "Number of nodes : ", mesh.NbNodes()
- print "Number of edges : ", mesh.NbEdges()
- print "Number of faces : ", mesh.NbFaces()
- print "Number of triangles : ", mesh.NbTriangles()
- print "Number of volumes : ", mesh.NbVolumes()
- print "Number of tetrahedrons: ", mesh.NbTetras()
-else:
- print "probleme when computing the mesh"
+++ /dev/null
-#
-# Tetrahedrization of the geometry union of 3 boxes aligned where the middle
-# one has a race in common with the two others.
-# Hypothesis and algorithms for the mesh generation are global
-#
-
-import salome
-import geompy
-
-import StdMeshers
-import NETGENPlugin
-
-smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH")
-
-smeshgui = salome.ImportComponentGUI("SMESH")
-smeshgui.Init(salome.myStudyId);
-
-# ---- define 3 boxes box1, box2 and box3
-
-box1 = geompy.MakeBox(0., 0., 0., 100., 200., 300.)
-
-idbox1 = geompy.addToStudy(box1, "box1")
-
-print "Analysis of the geometry box1 :"
-subShellList = geompy.SubShapeAll(box1, geompy.ShapeType["SHELL"])
-subFaceList = geompy.SubShapeAll(box1, geompy.ShapeType["FACE"])
-subEdgeList = geompy.SubShapeAll(box1, geompy.ShapeType["EDGE"])
-
-print "number of Shells in box1 : ", len(subShellList)
-print "number of Faces in box1 : ", len(subFaceList)
-print "number of Edges in box1 : ", len(subEdgeList)
-
-box2 = geompy.MakeBox(100., 0., 0., 200., 200., 300.)
-
-idbox2 = geompy.addToStudy(box2, "box2")
-
-print "Analysis of the geometry box2 :"
-subShellList = geompy.SubShapeAll(box2, geompy.ShapeType["SHELL"])
-subFaceList = geompy.SubShapeAll(box2, geompy.ShapeType["FACE"])
-subEdgeList = geompy.SubShapeAll(box2, geompy.ShapeType["EDGE"])
-
-print "number of Shells in box2 : ", len(subShellList)
-print "number of Faces in box2 : ", len(subFaceList)
-print "number of Edges in box2 : ", len(subEdgeList)
-
-box3 = geompy.MakeBox(0., 0., 300., 200., 200., 500.)
-
-idbox3 = geompy.addToStudy(box3, "box3")
-
-print "Analysis of the geometry box3 :"
-subShellList = geompy.SubShapeAll(box3, geompy.ShapeType["SHELL"])
-subFaceList = geompy.SubShapeAll(box3, geompy.ShapeType["FACE"])
-subEdgeList = geompy.SubShapeAll(box3, geompy.ShapeType["EDGE"])
-
-print "number of Shells in box3 : ", len(subShellList)
-print "number of Faces in box3 : ", len(subFaceList)
-print "number of Edges in box3 : ", len(subEdgeList)
-
-shell = geompy.MakePartition([box1, box2, box3])
-idshell = geompy.addToStudy(shell,"shell")
-
-print "Analysis of the geometry shell (union of box1, box2 and box3) :"
-subShellList = geompy.SubShapeAll(shell, geompy.ShapeType["SHELL"])
-subFaceList = geompy.SubShapeAll(shell, geompy.ShapeType["FACE"])
-subEdgeList = geompy.SubShapeAll(shell, geompy.ShapeType["EDGE"])
-
-print "number of Shells in shell : ", len(subShellList)
-print "number of Faces in shell : ", len(subFaceList)
-print "number of Edges in shell : ", len(subEdgeList)
-
-
-### ---------------------------- SMESH --------------------------------------
-
-# ---- create Hypothesis
-
-print "-------------------------- create Hypothesis"
-
-print "-------------------------- NumberOfSegments"
-
-numberOfSegments = 10
-
-hypNbSeg = smesh.CreateHypothesis("NumberOfSegments", "libStdMeshersEngine.so")
-hypNbSeg.SetNumberOfSegments(numberOfSegments)
-
-print hypNbSeg.GetName()
-print hypNbSeg.GetId()
-print hypNbSeg.GetNumberOfSegments()
-
-smeshgui.SetName(salome.ObjectToID(hypNbSeg), "NumberOfSegments_10")
-
-print "-------------------------- MaxElementArea"
-
-maxElementArea = 500
-
-hypArea = smesh.CreateHypothesis("MaxElementArea", "libStdMeshersEngine.so")
-hypArea.SetMaxElementArea(maxElementArea)
-
-print hypArea.GetName()
-print hypArea.GetId()
-print hypArea.GetMaxElementArea()
-
-smeshgui.SetName(salome.ObjectToID(hypArea), "MaxElementArea_500")
-
-print "-------------------------- MaxElementVolume"
-
-maxElementVolume = 500
-
-hypVolume = smesh.CreateHypothesis("MaxElementVolume", "libStdMeshersEngine.so")
-hypVolume.SetMaxElementVolume(maxElementVolume)
-
-print hypVolume.GetName()
-print hypVolume.GetId()
-print hypVolume.GetMaxElementVolume()
-
-smeshgui.SetName(salome.ObjectToID(hypVolume), "MaxElementVolume_500")
-
-# ---- create Algorithms
-
-print "-------------------------- create Algorithms"
-
-print "-------------------------- Regular_1D"
-
-regular1D = smesh.CreateHypothesis("Regular_1D", "libStdMeshersEngine.so")
-smeshgui.SetName(salome.ObjectToID(regular1D), "Wire Discretisation")
-
-print "-------------------------- MEFISTO_2D"
-
-mefisto2D = smesh.CreateHypothesis("MEFISTO_2D", "libStdMeshersEngine.so")
-smeshgui.SetName(salome.ObjectToID(mefisto2D), "MEFISTO_2D")
-
-print "-------------------------- NETGEN_3D"
-
-netgen3D = smesh.CreateHypothesis("NETGEN_3D", "libNETGENEngine.so")
-smeshgui.SetName(salome.ObjectToID(netgen3D), "NETGEN_3D")
-
-# ---- init a Mesh with the shell
-
-mesh = smesh.CreateMesh(shell)
-smeshgui.SetName(salome.ObjectToID(mesh), "MeshBox3")
-
-# ---- add hypothesis to shell
-
-print "-------------------------- add hypothesis to shell"
-
-mesh.AddHypothesis(shell,regular1D)
-mesh.AddHypothesis(shell,hypNbSeg)
-
-mesh.AddHypothesis(shell,mefisto2D)
-mesh.AddHypothesis(shell,hypArea)
-
-mesh.AddHypothesis(shell,netgen3D)
-mesh.AddHypothesis(shell,hypVolume)
-
-salome.sg.updateObjBrowser(1)
-
-print "-------------------------- compute shell"
-ret = smesh.Compute(mesh,shell)
-print ret
-if ret != 0:
- log = mesh.GetLog(0) # no erase trace
- for linelog in log:
- print linelog
- print "Information about the MeshBox3:"
- print "Number of nodes : ", mesh.NbNodes()
- print "Number of edges : ", mesh.NbEdges()
- print "Number of faces : ", mesh.NbFaces()
- print "Number of triangles : ", mesh.NbTriangles()
- print "Number of volumes : ", mesh.NbVolumes()
- print "Number of tetrahedrons: ", mesh.NbTetras()
-else:
- print "probleme when computing the mesh"
+++ /dev/null
-#
-# Tetrahedrization of a simple box. Hypothesis and algorithms for
-# the mesh generation are global
-#
-
-import salome
-import geompy
-
-import StdMeshers
-import NETGENPlugin
-
-smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH")
-
-smeshgui = salome.ImportComponentGUI("SMESH")
-smeshgui.Init(salome.myStudyId);
-
-# ---- define a boxe
-
-box = geompy.MakeBox(0., 0., 0., 100., 200., 300.)
-
-idbox = geompy.addToStudy(box, "box")
-
-print "Analysis of the geometry box :"
-subShellList = geompy.SubShapeAll(box, geompy.ShapeType["SHELL"])
-subFaceList = geompy.SubShapeAll(box, geompy.ShapeType["FACE"])
-subEdgeList = geompy.SubShapeAll(box, geompy.ShapeType["EDGE"])
-
-print "number of Shells in box : ", len(subShellList)
-print "number of Faces in box : ", len(subFaceList)
-print "number of Edges in box : ", len(subEdgeList)
-
-
-### ---------------------------- SMESH --------------------------------------
-
-# ---- create Hypothesis
-
-print "-------------------------- create Hypothesis"
-
-print "-------------------------- NumberOfSegments"
-
-numberOfSegments = 10
-
-hypNbSeg = smesh.CreateHypothesis("NumberOfSegments", "libStdMeshersEngine.so")
-hypNbSeg.SetNumberOfSegments(numberOfSegments)
-
-print hypNbSeg.GetName()
-print hypNbSeg.GetId()
-print hypNbSeg.GetNumberOfSegments()
-
-smeshgui.SetName(salome.ObjectToID(hypNbSeg), "NumberOfSegments_10")
-
-print "-------------------------- MaxElementArea"
-
-maxElementArea = 500
-
-hypArea = smesh.CreateHypothesis("MaxElementArea", "libStdMeshersEngine.so")
-hypArea.SetMaxElementArea(maxElementArea)
-
-print hypArea.GetName()
-print hypArea.GetId()
-print hypArea.GetMaxElementArea()
-
-smeshgui.SetName(salome.ObjectToID(hypArea), "MaxElementArea_500")
-
-print "-------------------------- MaxElementVolume"
-
-maxElementVolume = 500
-
-hypVolume = smesh.CreateHypothesis("MaxElementVolume", "libStdMeshersEngine.so")
-hypVolume.SetMaxElementVolume(maxElementVolume)
-
-print hypVolume.GetName()
-print hypVolume.GetId()
-print hypVolume.GetMaxElementVolume()
-
-smeshgui.SetName(salome.ObjectToID(hypVolume), "MaxElementVolume_500")
-
-# ---- create Algorithms
-
-print "-------------------------- create Algorithms"
-
-print "-------------------------- Regular_1D"
-
-regular1D = smesh.CreateHypothesis("Regular_1D", "libStdMeshersEngine.so")
-smeshgui.SetName(salome.ObjectToID(regular1D), "Wire Discretisation")
-
-print "-------------------------- MEFISTO_2D"
-
-mefisto2D = smesh.CreateHypothesis("MEFISTO_2D", "libStdMeshersEngine.so")
-smeshgui.SetName(salome.ObjectToID(mefisto2D), "MEFISTO_2D")
-
-print "-------------------------- NETGEN_3D"
-
-netgen3D = smesh.CreateHypothesis("NETGEN_3D", "libNETGENEngine.so")
-smeshgui.SetName(salome.ObjectToID(netgen3D), "NETGEN_3D")
-
-# ---- init a Mesh with the boxe
-
-mesh = smesh.CreateMesh(box)
-smeshgui.SetName(salome.ObjectToID(mesh), "MeshBox")
-
-# ---- add hypothesis to the boxe
-
-print "-------------------------- add hypothesis to the box"
-
-mesh.AddHypothesis(box,regular1D)
-mesh.AddHypothesis(box,hypNbSeg)
-
-mesh.AddHypothesis(box,mefisto2D)
-mesh.AddHypothesis(box,hypArea)
-
-mesh.AddHypothesis(box,netgen3D)
-mesh.AddHypothesis(box,hypVolume)
-
-salome.sg.updateObjBrowser(1)
-
-print "-------------------------- compute the mesh of the boxe"
-ret = smesh.Compute(mesh,box)
-print ret
-if ret != 0:
- log = mesh.GetLog(0) # no erase trace
- for linelog in log:
- print linelog
- print "Information about the MeshBox:"
- print "Number of nodes : ", mesh.NbNodes()
- print "Number of edges : ", mesh.NbEdges()
- print "Number of faces : ", mesh.NbFaces()
- print "Number of triangles : ", mesh.NbTriangles()
- print "Number of volumes : ", mesh.NbVolumes()
- print "Number of tetrahedrons: ", mesh.NbTetras()
-else:
- print "probleme when computing the mesh"
+++ /dev/null
-# Copyright (C) 2004 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.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-#
-#
-#
-# File : SMESH_control.py
-# Author : Sergey LITONIN
-# Module : SMESH
-
-
-import SMESH
-import SMESH_mechanic
-
-smesh = SMESH_mechanic.smesh
-mesh = SMESH_mechanic.mesh
-salome = SMESH_mechanic.salome
-
-
-aFilterMgr = smesh.CreateFilterManager()
-
-# Criterion : AREA > 100
-
-aFunctor = aFilterMgr.CreateArea()
-aPredicate = aFilterMgr.CreateMoreThan()
-aPredicate.SetNumFunctor( aFunctor )
-aPredicate.SetMargin( 100 )
-
-aFilter = aFilterMgr.CreateFilter()
-aFilter.SetPredicate( aPredicate )
-
-anIds = aFilter.GetElementsId( mesh )
-
-# print result
-print "Criterion: Area > 100 Nb = ", len( anIds )
-#for i in range( len( anIds ) ):
- #print anIds[ i ]
-
-# create group
-aGroup = mesh.CreateGroup( SMESH.FACE, "Area > 100" )
-aGroup.Add( anIds )
-
-
-# Criterion : Taper > 3e-15
-
-aFunctor = aFilterMgr.CreateTaper()
-aPredicate = aFilterMgr.CreateMoreThan()
-aPredicate.SetNumFunctor( aFunctor )
-aPredicate.SetMargin( 3e-15 )
-
-aFilter = aFilterMgr.CreateFilter()
-aFilter.SetPredicate( aPredicate )
-
-anIds = aFilter.GetElementsId( mesh )
-
-# print result
-print "Criterion: Taper > 3e-15 Nb = ", len( anIds )
-#for i in range( len( anIds ) ):
- #print anIds[ i ]
-
-# create group
-aGroup = mesh.CreateGroup( SMESH.FACE, "Taper > 3e-15" )
-aGroup.Add( anIds )
-
-
-# Criterion : ASPECT RATIO > 1.3
-
-aFunctor = aFilterMgr.CreateAspectRatio()
-aPredicate = aFilterMgr.CreateMoreThan()
-aPredicate.SetNumFunctor( aFunctor )
-aPredicate.SetMargin( 1.3 )
-
-aFilter = aFilterMgr.CreateFilter()
-aFilter.SetPredicate( aPredicate )
-
-anIds = aFilter.GetElementsId( mesh )
-
-# print result
-print "Criterion: Aspect Ratio > 1.3 Nb = ", len( anIds )
-#for i in range( len( anIds ) ):
- #print anIds[ i ]
-
-# create group
-aGroup = mesh.CreateGroup( SMESH.FACE, "Aspect Ratio > 1.3" )
-aGroup.Add( anIds )
-
-
-# Criterion : MINIMUM ANGLE < 30
-
-aFunctor = aFilterMgr.CreateMinimumAngle()
-aPredicate = aFilterMgr.CreateLessThan()
-aPredicate.SetNumFunctor( aFunctor )
-aPredicate.SetMargin( 30 )
-
-aFilter = aFilterMgr.CreateFilter()
-aFilter.SetPredicate( aPredicate )
-
-anIds = aFilter.GetElementsId( mesh )
-
-# print result
-print "Criterion: Minimum Angle < 30 Nb = ", len( anIds )
-#for i in range( len( anIds ) ):
- #print anIds[ i ]
-
-# create group
-aGroup = mesh.CreateGroup( SMESH.FACE, "Minimum Angle < 30" )
-aGroup.Add( anIds )
-
-# Criterion : Warp > 2e-13
-
-aFunctor = aFilterMgr.CreateWarping()
-aPredicate = aFilterMgr.CreateMoreThan()
-aPredicate.SetNumFunctor( aFunctor )
-aPredicate.SetMargin( 2e-13 )
-
-aFilter = aFilterMgr.CreateFilter()
-aFilter.SetPredicate( aPredicate )
-
-anIds = aFilter.GetElementsId( mesh )
-
-# print result
-print "Criterion: Warp > 2e-13 Nb = ", len( anIds )
-#for i in range( len( anIds ) ):
- #print anIds[ i ]
-
-# create group
-aGroup = mesh.CreateGroup( SMESH.FACE, "Warp > 2e-13" )
-aGroup.Add( anIds )
-
-# Criterion : Skew > 18
-
-aFunctor = aFilterMgr.CreateSkew()
-aPredicate = aFilterMgr.CreateMoreThan()
-aPredicate.SetNumFunctor( aFunctor )
-aPredicate.SetMargin( 18 )
-
-aFilter = aFilterMgr.CreateFilter()
-aFilter.SetPredicate( aPredicate )
-
-anIds = aFilter.GetElementsId( mesh )
-
-# print result
-print "Criterion: Skew > 18 Nb = ", len( anIds )
-#for i in range( len( anIds ) ):
- #print anIds[ i ]
-
-# create group
-aGroup = mesh.CreateGroup( SMESH.FACE, "Skew > 18" )
-aGroup.Add( anIds )
-
-# Criterion : Length > 10
-
-aFunctor = aFilterMgr.CreateLength()
-aPredicate = aFilterMgr.CreateMoreThan()
-aPredicate.SetNumFunctor( aFunctor )
-aPredicate.SetMargin( 10 )
-
-aFilter = aFilterMgr.CreateFilter()
-aFilter.SetPredicate( aPredicate )
-
-anIds = aFilter.GetElementsId( mesh )
-
-# print result
-print "Criterion: Length > 10 Nb = ", len( anIds )
-#for i in range( len( anIds ) ):
- #print anIds[ i ]
-
-# create group
-aGroup = mesh.CreateGroup( SMESH.EDGE, "Length > 10" )
-aGroup.Add( anIds )
-
-# Criterion : Borders at multi-connections = 2
-
-aFunctor = aFilterMgr.CreateMultiConnection()
-aPredicate = aFilterMgr.CreateEqualTo()
-aPredicate.SetNumFunctor( aFunctor )
-aPredicate.SetMargin( 2 )
-
-aFilter = aFilterMgr.CreateFilter()
-aFilter.SetPredicate( aPredicate )
-
-anIds = aFilter.GetElementsId( mesh )
-
-# print result
-print "Criterion: Borders at multi-connections = 2 Nb = ", len( anIds )
-#for i in range( len( anIds ) ):
- #print anIds[ i ]
-
-# create group
-aGroup = mesh.CreateGroup( SMESH.EDGE, "Borders at multi-connections = 2" )
-aGroup.Add( anIds )
-
-
-salome.sg.updateObjBrowser(1)
+++ /dev/null
-#==============================================================================
-# Info.
-# Bug (from script, bug) : SMESH_demo_hexa2_upd.py, PAL6781
-# Modified : 25/11/2004
-# Author : Kovaltchuk Alexey
-# Project : PAL/SALOME
-#==============================================================================
-# Tetrahedrization of a geometry (box minus a inner cylinder).
-# Hypothesis and algorithms for the mesh generation are not global:
-# the mesh of some edges is thinner
-#
-
-import salome
-import geompy
-
-import StdMeshers
-import NETGENPlugin
-
-geom = salome.lcc.FindOrLoadComponent("FactoryServer", "GEOM")
-smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH")
-
-smeshgui = salome.ImportComponentGUI("SMESH")
-smeshgui.Init(salome.myStudyId);
-
-import math
-
-# -----------------------------------------------------------------------------
-
-ShapeTypeShell = 3
-ShapeTypeFace = 4
-ShapeTypeEdge = 6
-
-a = math.sqrt(2.)/4.
-ma = - a
-zero = 0.
-un = 1.
-mun= - un
-demi = 1./2.
-
-Orig = geompy.MakeVertex(zero,zero,zero)
-P0 = geompy.MakeVertex(a,a,zero)
-P1 = geompy.MakeVertex(zero,demi,zero)
-P2 = geompy.MakeVertex(ma,a,zero)
-P3 = geompy.MakeVertex(mun,un,zero)
-P4 = geompy.MakeVertex(un,un,zero)
-P5 = geompy.MakeVertex(zero,zero,un)
-
-arc = geompy.MakeArc(P0,P1,P2)
-e1 = geompy.MakeEdge(P2,P3)
-e2 = geompy.MakeEdge(P3,P4)
-e3 = geompy.MakeEdge(P4,P0)
-
-list = []
-list.append(arc)
-list.append(e1)
-list.append(e2)
-list.append(e3)
-
-wire = geompy.MakeWire(list)
-face = geompy.MakeFace(wire,1)
-
-dir = geompy.MakeVector(Orig,P5)
-vol1 = geompy.MakePipe(face,dir)
-
-angle = math.pi/2.
-#dir = geom.MakeVector(Orig,P5)
-vol2 = geompy.MakeRotation(vol1,dir,angle)
-
-vol3 = geompy.MakeRotation(vol2,dir,angle)
-
-vol4 = geompy.MakeRotation(vol3,dir,angle)
-
-list = []
-list.append(vol1)
-list.append(vol2)
-list.append(vol3)
-list.append(vol4)
-
-volComp = geompy.MakeCompound(list)
-
-tol3d = 1.e-3
-vol = geompy.MakeGlueFaces(volComp,tol3d)
-idVol = geompy.addToStudy(vol,"volume")
-
-print "Analysis of the final volume:"
-subShellList = geompy.SubShapeAllSorted(vol,ShapeTypeShell)
-subFaceList = geompy.SubShapeAllSorted(vol,ShapeTypeFace)
-subEdgeList = geompy.SubShapeAllSorted(vol,ShapeTypeEdge)
-
-print "number of Shells in the volume : ",len(subShellList)
-print "number of Faces in the volume : ",len(subFaceList)
-print "number of Edges in the volume : ",len(subEdgeList)
-
-idSubEdge = []
-for k in range(len(subEdgeList)):
- idSubEdge.append(geompy.addToStudyInFather(vol,subEdgeList[k],"SubEdge"+str(k)))
-
-edgeZ = []
-edgeZ.append(subEdgeList[0])
-edgeZ.append(subEdgeList[3])
-edgeZ.append(subEdgeList[10])
-edgeZ.append(subEdgeList[11])
-edgeZ.append(subEdgeList[20])
-edgeZ.append(subEdgeList[21])
-edgeZ.append(subEdgeList[28])
-edgeZ.append(subEdgeList[31])
-
-idEdgeZ = []
-for i in range(8):
- idEdgeZ.append(geompy.addToStudyInFather(vol,edgeZ[i],"EdgeZ"+str(i+1)))
-
-### ---------------------------- SMESH --------------------------------------
-
-# ---- create Hypothesis
-
-print "-------------------------- create Hypothesis"
-
-print "-------------------------- NumberOfSegments the global one"
-
-numberOfSegments = 10
-
-hypNbSeg=smesh.CreateHypothesis("NumberOfSegments","libStdMeshersEngine.so")
-hypNbSeg.SetNumberOfSegments(numberOfSegments)
-hypNbSegID = hypNbSeg.GetId()
-print hypNbSeg.GetName()
-print hypNbSegID
-print hypNbSeg.GetNumberOfSegments()
-
-smeshgui.SetName(salome.ObjectToID(hypNbSeg), "NumberOfSegments")
-
-print "-------------------------- NumberOfSegments in the Z direction"
-
-numberOfSegmentsZ = 40
-
-hypNbSegZ=smesh.CreateHypothesis("NumberOfSegments","libStdMeshersEngine.so")
-hypNbSegZ.SetNumberOfSegments(numberOfSegmentsZ)
-hypNbSegZID = hypNbSegZ.GetId()
-print hypNbSegZ.GetName()
-print hypNbSegZID
-print hypNbSegZ.GetNumberOfSegments()
-
-smeshgui.SetName(salome.ObjectToID(hypNbSegZ), "NumberOfSegmentsZ")
-
-# ---- create Algorithms
-
-print "-------------------------- create Algorithms"
-
-print "-------------------------- Regular_1D"
-
-regular1D=smesh.CreateHypothesis("Regular_1D", "libStdMeshersEngine.so")
-smeshgui.SetName(salome.ObjectToID(regular1D), "Wire Discretisation")
-
-print "-------------------------- Quadrangle_2D"
-
-quad2D=smesh.CreateHypothesis("Quadrangle_2D", "libStdMeshersEngine.so")
-smeshgui.SetName(salome.ObjectToID(quad2D), "Quadrangle_2D")
-
-print "-------------------------- Hexa_3D"
-
-hexa3D=smesh.CreateHypothesis("Hexa_3D", "libStdMeshersEngine.so")
-smeshgui.SetName(salome.ObjectToID(hexa3D), "Hexa_3D")
-
-# ---- init a Mesh with the volume
-
-mesh = smesh.CreateMesh(vol)
-smeshgui.SetName(salome.ObjectToID(mesh), "meshVolume")
-
-# ---- add hypothesis to the volume
-
-print "-------------------------- add hypothesis to the volume"
-
-ret=mesh.AddHypothesis(vol,regular1D)
-print ret
-ret=mesh.AddHypothesis(vol,hypNbSeg)
-print ret
-ret=mesh.AddHypothesis(vol,quad2D)
-print ret
-ret=mesh.AddHypothesis(vol,hexa3D)
-print ret
-
-for i in range(8):
- print "-------------------------- add hypothesis to edge in the Z directions", (i+1)
-
- subMeshEdgeZ = mesh.GetSubMesh(edgeZ[i],"SubMeshEdgeZ_"+str(i+1))
-
- retZ = mesh.AddHypothesis(edgeZ[i],hypNbSegZ)
- print " add hyp Z ", retZ
-
-salome.sg.updateObjBrowser(1)
-
-print "-------------------------- compute the mesh of the volume"
-
-ret=smesh.Compute(mesh,vol)
-
-print ret
-if ret != 0:
-## log=mesh.GetLog(0) # no erase trace
-## for linelog in log:
-## print linelog
- print "Information about the MeshBox :"
- print "Number of nodes : ", mesh.NbNodes()
- print "Number of edges : ", mesh.NbEdges()
- print "Number of faces : ", mesh.NbFaces()
- print "Number of triangles : ", mesh.NbTriangles()
- print "Number of volumes : ", mesh.NbVolumes()
- print "Number of tetrahedrons: ", mesh.NbTetras()
-else:
- print "problem when Computing the mesh"
-
-salome.sg.updateObjBrowser(1)
+++ /dev/null
-# Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-#
-# See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-#
-#
-#
-# File : SMESH_fix_volute.py
-# Author : Paul RASCLE, EDF
-# Module : SMESH
-# $Header$
-
-import salome
-import geompy
-import math
-
-# -----------------------------------------------------------------------------
-
-def MakeFace(lstEdges) :
- """
- Creates a planar face from 4 edges
- """
- wire = geompy.MakeWire(lstEdges)
- face = geompy.MakeFace(wire, 1)
- return face
-
-# -----------------------------------------------------------------------------
-
-# ---- dimensions
-
-##longueurPlq = 0.686
-##largeurPlq = 0.573
-##epaisseurPlq = 0.150
-
-##hauteurFlanc = 0.380
-##epaisseurFlanc = 0.112
-##rayonConge = 0.150 - epaisseurFlanc
-
-##epaisseurFond = 0.162
-##rayonTrou = 0.075
-##posAxeTrou = hauteurFlanc -(0.180 + rayonTrou)
-##marge = 0.01
-##tol3d = 1.e-5
-
-longueurPlq = 686
-largeurPlq = 573
-epaisseurPlq = 150
-
-hauteurFlanc = 380
-epaisseurFlanc = 112
-rayonConge = 150 - epaisseurFlanc
-
-epaisseurFond = 162
-rayonTrou = 75
-posAxeTrou = hauteurFlanc - (180 + rayonTrou)
-marge = 10
-tol3d = 1.e-3
-
-# ---- points, directions de base
-
-p0 = geompy.MakeVertex(0., 0., 0.)
-
-vx = geompy.MakeVectorDXDYDZ(100., 0., 0.)
-vy = geompy.MakeVectorDXDYDZ(0., 100., 0.)
-vz = geompy.MakeVectorDXDYDZ(0., 0., 100.)
-
-# ---- ellipse du flanc
-
-he = hauteurFlanc - 2*rayonConge
-re = 0.5*(largeurPlq - epaisseurFond) - rayonConge
-sine = re/he
-cose = math.sqrt(1. - sine*sine)
-
-ve = geompy.MakeVectorDXDYDZ(sine, 0., cose)
-cyl0 = geompy.MakeCylinder(p0, ve, re, 2*he)
-cyl1 = geompy.MakeRotation(cyl0, ve, 0.5)
-cyle = geompy.MakeTranslation(cyl1, -marge*sine, 0., -marge*cose)
-
-pbe = geompy.MakeVertex(3*he, -2*re, 3*he)
-boxe = geompy.MakeBoxTwoPnt(p0, pbe)
-
-cylcoup = geompy.MakeBoolean(cyle, boxe, 2)
-
-aretes = []
-aretes = geompy.SubShapeAllSorted(cylcoup, geompy.ShapeType["EDGE"])
-
-shape = geompy.MakeCopy(aretes[0])
-aShape = geompy.MakeTranslation(shape, 0., rayonConge + re, epaisseurPlq + 2*rayonConge)
-
-
-# -----------------------------------------------------------------------------
-# ---- decoupage de la piece en volumes a 6 faces de 4 cotes
-# -----------------------------------------------------------------------------
-
-# ---- cotes x
-
-x0 = 0.
-x0h = rayonConge
-x1 = rayonConge + epaisseurFlanc
-xc = longueurPlq/2
-x2 = longueurPlq - rayonConge - epaisseurFlanc
-x3h = longueurPlq - rayonConge
-x3 = longueurPlq
-
-# ---- cotes y
-
-y0 = 0.
-y0h = rayonConge
-y1 = largeurPlq - epaisseurFond
-y1m = y1 - marge
-y2 = largeurPlq
-y2p = largeurPlq + marge
-
-# ---- cotes z
-
-z0 = 0.
-z1m = epaisseurPlq - marge
-z1 = epaisseurPlq
-z2 = epaisseurPlq + rayonConge
-z3 = epaisseurPlq + 2*rayonConge
-z4 = epaisseurPlq + hauteurFlanc
-z4p = epaisseurPlq + hauteurFlanc + marge
-
-zc = epaisseurPlq + posAxeTrou
-zc2 = epaisseurPlq + (posAxeTrou - rayonTrou)/3
-zc3 = epaisseurPlq + 2*(posAxeTrou - rayonTrou)/3
-
-# ---- decoupe du fond
-
-p11 = geompy.MakeVertex(x1, y1m, z1)
-p12 = geompy.MakeVertex(x1, y1m, z2)
-p13 = geompy.MakeVertex(x1, y1m, z3)
-p14 = geompy.MakeVertex(x1, y1m, z4)
-pc1 = geompy.MakeVertex(xc, y1m, z1)
-pc2 = geompy.MakeVertex(xc, y1m, zc2)
-pc3 = geompy.MakeVertex(xc, y1m, zc3)
-pcc = geompy.MakeVertex(xc, y1m, zc)
-pc4 = geompy.MakeVertex(xc, y1m, z4)
-p21 = geompy.MakeVertex(x2, y1m, z1)
-p22 = geompy.MakeVertex(x2, y1m, z2)
-p23 = geompy.MakeVertex(x2, y1m, z3)
-p24 = geompy.MakeVertex(x2, y1m, z4)
-pcf = geompy.MakeVertex(xc, y2p, zc)
-
-arc2 = geompy.MakeArc(p12,pc2,p22)
-arc3 = geompy.MakeArc(p13,pc3,p23)
-
-segz1 = geompy.MakeVector(p11,p21)
-segz41 = geompy.MakeVector(p14,pc4)
-segz42 = geompy.MakeVector(pc4,p24)
-segx11 = geompy.MakeVector(p11,p12)
-segx12 = geompy.MakeVector(p12,p13)
-segx13 = geompy.MakeVector(p13,p14)
-segxc2 = geompy.MakeVector(pc1,pc2)
-segxc3 = geompy.MakeVector(pc2,pc3)
-segxc4 = geompy.MakeVector(pcc,pc4)
-segx21 = geompy.MakeVector(p21,p22)
-segx22 = geompy.MakeVector(p22,p23)
-segx23 = geompy.MakeVector(p23,p24)
-segx1c1 = geompy.MakeVector(p13,pcc)
-segx1c2 = geompy.MakeVector(p14,pcc)
-segx2c1 = geompy.MakeVector(p23,pcc)
-segx2c2 = geompy.MakeVector(p24,pcc)
-
-facef = []
-facef.append(MakeFace([segx13,segx1c2,segx1c1]))
-facef.append(MakeFace([segx23,segx2c2,segx2c1]))
-facef.append(MakeFace([segx2c2,segxc4,segz42]))
-facef.append(MakeFace([segx1c2,segz41,segxc4]))
-facef.append(MakeFace([segx1c1,arc3,segx2c1]))
-facef.append(MakeFace([segx12,arc2,segx22,arc3]))
-facef.append(MakeFace([segx11,segz1,segx21,arc2]))
-
-vcccf = geompy.MakeVector(pcc, pcf)
-hcccf = y2p - y1m
-decf = []
-for face in facef:
- decf.append(geompy.MakePrismVecH(face,vcccf,hcccf))
-
-pc = geompy.MakeVertex(xc, 0., zc)
-py2 = geompy.MakeVertex(xc, y2, zc)
-axeCyl = geompy.MakeVector(pc, py2)
-
-cylFond = geompy.MakeCylinder(pc, vy, rayonTrou, 1.1*largeurPlq)
-cylFond2 = geompy.MakeRotation(cylFond, axeCyl, math.pi)
-
-fondec = []
-for id in (0,1,2,3):
- fondec.append(geompy.MakeBoolean(decf[id], cylFond2, 2))
-fondec.append(geompy.MakeBoolean(decf[4], cylFond, 2))
-for id in (5,6):
- fondec.append(decf[id])
-
-p_xcy2pz4p = geompy.MakeVertex(xc,y2p,z4p)
-p_x3y2pz4p = geompy.MakeVertex(x3,y2p,z4p)
-pxc = geompy.MakeVertex(xc,y0,z0)
-bcut1 = geompy.MakeBoxTwoPnt(p0, p_xcy2pz4p)
-bcut2 = geompy.MakeBoxTwoPnt(pxc, p_x3y2pz4p)
-
-fondec2 = []
-for id in (0,1,2,3):
- fondec2.append(fondec[id])
-for id in (4,5,6):
- fondec2.append(geompy.MakeBoolean(fondec[id], bcut1, 1))
- fondec2.append(geompy.MakeBoolean(fondec[id], bcut2, 1))
-
-# ----- autres blocs de decoupe
-
-bcong1 = geompy.MakeBox(x0,y0,z1, x1,y1,z2)
-bcong2 = geompy.MakeBox(x0,y1,z1, x1,y2,z2)
-bcong3 = geompy.MakeBox(x2,y0,z1, x3,y1,z2)
-bcong4 = geompy.MakeBox(x2,y1,z1, x3,y2,z2)
-
-pcylx0 = geompy.MakeVertex(0., -marge, z2)
-pcylx3 = geompy.MakeVertex(longueurPlq, -marge, z2)
-pcyly0 = geompy.MakeVertex(-marge, 0., z2)
-
-cylcongx0 = geompy.MakeCylinder(pcylx0, vy, rayonConge, largeurPlq + 2*marge)
-cylcongx3 = geompy.MakeCylinder(pcylx3, vy, rayonConge, largeurPlq + 2*marge)
-cylcongy0 = geompy.MakeCylinder(pcyly0, vx, rayonConge, longueurPlq + 2*marge)
-
-bcong1 = geompy.MakeBoolean(bcong1,cylcongx0,2)
-bcong2 = geompy.MakeBoolean(bcong2,cylcongx0,2)
-bcong1 = geompy.MakeBoolean(bcong1,cylcongy0,2)
-#NRI : inverse order of BOP
-bcong3 = geompy.MakeBoolean(bcong3,cylcongy0,2)
-bcong3 = geompy.MakeBoolean(bcong3,cylcongx3,2)
-bcong4 = geompy.MakeBoolean(bcong4,cylcongx3,2)
-
-pf1 = geompy.MakeVertex(0., y0h, z3)
-pf2 = geompy.MakeVertex(0., y1, z3)
-pf3 = geompy.MakeVertex(0., y1, z4)
-pf4 = geompy.MakeVertex(0., 0.5*(largeurPlq - epaisseurFond) , z4)
-
-vf1 = geompy.MakeEdge(pf1, pf2)
-vf2 = geompy.MakeEdge(pf2, pf3)
-vf3 = geompy.MakeEdge(pf3, pf4)
-
-faceFlanc = MakeFace([vf1,vf2,vf3,aShape])
-
-flanc1 = geompy.MakePrismVecH(faceFlanc, vx, epaisseurFlanc)
-flanc2 = geompy.MakeCopy(flanc1)
-flanc1 = geompy.MakeTranslation(flanc1, rayonConge, 0., 0.)
-flanc2 = geompy.MakeTranslation(flanc2, longueurPlq - rayonConge - epaisseurFlanc, 0., 0.)
-
-# ---- constitution et decoupe des blocs
-boxfond2 = geompy.MakeBox(x0, y1, z0, x3, y2, z4p)
-
-blocs = []
-for dec in fondec2:
- blocs.append(geompy.MakeBoolean(boxfond2, dec, 1))
-
-blocs.append(geompy.MakeBox(x0,y1,z0, x1,y2,z1))
-blocs.append(geompy.MakeBox(x1,y1,z0, xc,y2,z1))
-blocs.append(geompy.MakeBox(xc,y1,z0, x2,y2,z1))
-blocs.append(geompy.MakeBox(x2,y1,z0, x3,y2,z1))
-blocs.append(geompy.MakeBox(x0,y0,z0, x1,y1,z1))
-blocs.append(geompy.MakeBox(x1,y0,z0, xc,y1,z1))
-blocs.append(geompy.MakeBox(xc,y0,z0, x2,y1,z1))
-blocs.append(geompy.MakeBox(x2,y0,z0, x3,y1,z1))
-blocs.append(bcong2)
-blocs.append(bcong4)
-blocs.append(bcong1)
-blocs.append(bcong3)
-blocs.append(geompy.MakeBox(x0h,y1, z2, x1, y2, z3))
-blocs.append(geompy.MakeBox(x2, y1, z2, x3h,y2, z3))
-blocs.append(geompy.MakeBox(x0h,y0h,z2, x1, y1, z3))
-blocs.append(geompy.MakeBox(x2, y0h,z2, x3h,y1, z3))
-blocs.append(geompy.MakeBox(x0h,y1, z3, x1, y2, z4))
-blocs.append(geompy.MakeBox(x2, y1, z3, x3h,y2, z4))
-blocs.append(flanc1)
-blocs.append(flanc2)
-
-compbloc = geompy.MakeCompound(blocs)
-idcomp = geompy.addToStudy(compbloc, "compbloc")
-
-# ---- eliminer les faces en double, solid-->shell
-
-compshell = geompy.MakeGlueFaces(compbloc,tol3d)
-idcomp = geompy.addToStudy(compshell, "compshell")
+++ /dev/null
-#
-# Hexahedrization of the geometry generated by the Python script
-# SMESH_fixation.py
-# Hypothesis and algorithms for the mesh generation are global
-#
-
-import SMESH_fixation
-
-import StdMeshers
-
-compshell = SMESH_fixation.compshell
-idcomp = SMESH_fixation.idcomp
-geompy = SMESH_fixation.geompy
-salome = SMESH_fixation.salome
-
-print "Analysis of the geometry to be meshed :"
-subShellList = geompy.SubShapeAll(compshell, geompy.ShapeType["SHELL"])
-subFaceList = geompy.SubShapeAll(compshell, geompy.ShapeType["FACE"])
-subEdgeList = geompy.SubShapeAll(compshell, geompy.ShapeType["EDGE"])
-
-print "number of Shells in compshell : ", len(subShellList)
-print "number of Faces in compshell : ", len(subFaceList)
-print "number of Edges in compshell : ", len(subEdgeList)
-
-status = geompy.CheckShape(compshell)
-print " check status ", status
-
-### ---------------------------- SMESH --------------------------------------
-smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH")
-
-smeshgui = salome.ImportComponentGUI("SMESH")
-smeshgui.Init(salome.myStudyId)
-
-print "-------------------------- create Hypothesis"
-
-print "-------------------------- NumberOfSegments"
-
-numberOfSegments = 5
-
-hypNbSeg = smesh.CreateHypothesis("NumberOfSegments", "libStdMeshersEngine.so")
-hypNbSeg.SetNumberOfSegments(numberOfSegments)
-
-print hypNbSeg.GetName()
-print hypNbSeg.GetId()
-print hypNbSeg.GetNumberOfSegments()
-
-smeshgui.SetName(salome.ObjectToID(hypNbSeg), "NumberOfSegments_5")
-
-print "-------------------------- create Algorithms"
-
-print "-------------------------- Regular_1D"
-
-regular1D = smesh.CreateHypothesis("Regular_1D", "libStdMeshersEngine.so")
-
-smeshgui.SetName(salome.ObjectToID(regular1D), "Wire Discretisation")
-
-print "-------------------------- Quadrangle_2D"
-
-quad2D = smesh.CreateHypothesis("Quadrangle_2D", "libStdMeshersEngine.so")
-
-smeshgui.SetName(salome.ObjectToID(quad2D), "Quadrangle_2D")
-
-print "-------------------------- Hexa_3D"
-
-hexa3D = smesh.CreateHypothesis("Hexa_3D", "libStdMeshersEngine.so")
-
-smeshgui.SetName(salome.ObjectToID(hexa3D), "Hexa_3D")
-
-# ---- init a Mesh with the compshell
-shape_mesh = salome.IDToObject( idcomp )
-
-mesh = smesh.CreateMesh(shape_mesh)
-smeshgui.SetName(salome.ObjectToID(mesh), "MeshCompShell")
-
-
-print "-------------------------- add hypothesis to compshell"
-
-mesh.AddHypothesis(shape_mesh,regular1D)
-mesh.AddHypothesis(shape_mesh,hypNbSeg)
-
-mesh.AddHypothesis(shape_mesh,quad2D)
-mesh.AddHypothesis(shape_mesh,hexa3D)
-
-salome.sg.updateObjBrowser(1)
-
-print "-------------------------- compute compshell"
-ret = smesh.Compute(mesh, shape_mesh)
-print ret
-if ret != 0:
- log = mesh.GetLog(0) # no erase trace
- for linelog in log:
- print linelog
- print "Information about the MeshcompShel:"
- print "Number of nodes : ", mesh.NbNodes()
- print "Number of edges : ", mesh.NbEdges()
- print "Number of faces : ", mesh.NbFaces()
- print "Number of quadrangles : ", mesh.NbQuadrangles()
- print "Number of volumes : ", mesh.NbVolumes()
- print "Number of hexahedrons : ", mesh.NbHexas()
-else:
- print "problem when Computing the mesh"
+++ /dev/null
-#
-# Tetrahedrization of the geometry generated by the Python script
-# SMESH_fixation.py
-# Hypothesis and algorithms for the mesh generation are global
-#
-
-import StdMeshers
-import NETGENPlugin
-import SMESH_fixation
-
-compshell = SMESH_fixation.compshell
-idcomp = SMESH_fixation.idcomp
-geompy = SMESH_fixation.geompy
-salome = SMESH_fixation.salome
-
-print "Analysis of the geometry to be meshed :"
-subShellList = geompy.SubShapeAll(compshell, geompy.ShapeType["SHELL"])
-subFaceList = geompy.SubShapeAll(compshell, geompy.ShapeType["FACE"])
-subEdgeList = geompy.SubShapeAll(compshell, geompy.ShapeType["EDGE"])
-
-print "number of Shells in compshell : ", len(subShellList)
-print "number of Faces in compshell : ", len(subFaceList)
-print "number of Edges in compshell : ", len(subEdgeList)
-
-status = geompy.CheckShape(compshell)
-print " check status ", status
-
-### ---------------------------- SMESH --------------------------------------
-smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH")
-
-smeshgui = salome.ImportComponentGUI("SMESH")
-smeshgui.Init(salome.myStudyId)
-
-print "-------------------------- create Hypothesis"
-
-print "-------------------------- NumberOfSegments"
-
-numberOfSegments = 5
-
-hypNbSeg = smesh.CreateHypothesis("NumberOfSegments", "libStdMeshersEngine.so")
-hypNbSeg.SetNumberOfSegments(numberOfSegments)
-
-print hypNbSeg.GetName()
-print hypNbSeg.GetId()
-print hypNbSeg.GetNumberOfSegments()
-
-smeshgui.SetName(salome.ObjectToID(hypNbSeg), "NumberOfSegments_5")
-
-print "-------------------------- MaxElementArea"
-
-## maxElementArea = 80
-
-## hypArea=smesh.CreateHypothesis("MaxElementArea")
-## hypArea.SetMaxElementArea(maxElementArea)
-## print hypArea.GetName()
-## print hypArea.GetId()
-## print hypArea.GetMaxElementArea()
-## smeshgui.SetName(salome.ObjectToID(hypArea), "MaxElementArea_160")
-
-hypLengthFromEdges = smesh.CreateHypothesis("LengthFromEdges", "libStdMeshersEngine.so")
-smeshgui.SetName(salome.ObjectToID(hypLengthFromEdges), "LengthFromEdges")
-
-
-print "-------------------------- MaxElementVolume"
-
-maxElementVolume = 1000
-
-hypVolume = smesh.CreateHypothesis("MaxElementVolume", "libStdMeshersEngine.so")
-hypVolume.SetMaxElementVolume(maxElementVolume)
-
-print hypVolume.GetName()
-print hypVolume.GetId()
-print hypVolume.GetMaxElementVolume()
-
-smeshgui.SetName(salome.ObjectToID(hypVolume), "MaxElementVolume_1000")
-
-print "-------------------------- create Algorithms"
-
-print "-------------------------- Regular_1D"
-
-regular1D = smesh.CreateHypothesis("Regular_1D", "libStdMeshersEngine.so")
-
-smeshgui.SetName(salome.ObjectToID(regular1D), "Wire Discretisation")
-
-print "-------------------------- MEFISTO_2D"
-
-mefisto2D = smesh.CreateHypothesis("MEFISTO_2D", "libStdMeshersEngine.so")
-
-smeshgui.SetName(salome.ObjectToID(mefisto2D), "MEFISTO_2D")
-
-print "-------------------------- NETGEN_3D"
-
-netgen3D = smesh.CreateHypothesis("NETGEN_3D", "libNETGENEngine.so")
-
-smeshgui.SetName(salome.ObjectToID(netgen3D), "NETGEN_3D")
-
-# ---- init a Mesh with the compshell
-
-mesh = smesh.CreateMesh(compshell)
-smeshgui.SetName(salome.ObjectToID(mesh), "MeshcompShel")
-
-print "-------------------------- add hypothesis to compshell"
-
-mesh.AddHypothesis(compshell,regular1D)
-mesh.AddHypothesis(compshell,hypNbSeg)
-
-mesh.AddHypothesis(compshell,mefisto2D)
-mesh.AddHypothesis(compshell,hypLengthFromEdges)
-
-mesh.AddHypothesis(compshell,netgen3D)
-mesh.AddHypothesis(compshell,hypVolume)
-
-salome.sg.updateObjBrowser(1)
-
-print "-------------------------- compute compshell"
-ret = smesh.Compute(mesh,compshell)
-print ret
-if ret != 0:
- log = mesh.GetLog(0) # no erase trace
- for linelog in log:
- print linelog
- print "Information about the MeshcompShel:"
- print "Number of nodes : ", mesh.NbNodes()
- print "Number of edges : ", mesh.NbEdges()
- print "Number of faces : ", mesh.NbFaces()
- print "Number of triangles : ", mesh.NbTriangles()
- print "Number of volumes : ", mesh.NbVolumes()
- print "Number of tetrahedrons : ", mesh.NbTetras()
-
-else:
- print "problem when computing the mesh"
+++ /dev/null
-import salome\r
-import geompy\r
-import SMESH\r
-import StdMeshers\r
-\r
-smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH")\r
-smesh.SetCurrentStudy(salome.myStudy)\r
-\r
-# Create box without one plane\r
-\r
-box = geompy.MakeBox(0., 0., 0., 10., 20., 30.)\r
-subShapeList = geompy.SubShapeAll(box, geompy.ShapeType["FACE"])\r
-\r
-FaceList = []\r
-for i in range( 5 ):\r
- FaceList.append( subShapeList[ i ] )\r
-\r
-aComp = geompy.MakeCompound( FaceList )\r
-aBox = geompy.Sew( aComp, 1. )\r
-idbox = geompy.addToStudy( aBox, "box" )\r
- \r
-aBox = salome.IDToObject( idbox )\r
-\r
-# Create mesh\r
-\r
-hyp1 = smesh.CreateHypothesis("NumberOfSegments", "libStdMeshersEngine.so")\r
-hyp1.SetNumberOfSegments(5)\r
-hyp2 = smesh.CreateHypothesis("MaxElementArea", "libStdMeshersEngine.so")\r
-hyp2.SetMaxElementArea(20)\r
-hyp3 = smesh.CreateHypothesis("MaxElementArea", "libStdMeshersEngine.so")\r
-hyp3.SetMaxElementArea(50)\r
-\r
-algo1 = smesh.CreateHypothesis("Regular_1D", "libStdMeshersEngine.so")\r
-algo2 = smesh.CreateHypothesis("MEFISTO_2D", "libStdMeshersEngine.so")\r
-\r
-mesh = smesh.CreateMesh(aBox)\r
-mesh.AddHypothesis(aBox,hyp1)\r
-mesh.AddHypothesis(aBox,hyp2)\r
-mesh.AddHypothesis(aBox,algo1)\r
-mesh.AddHypothesis(aBox,algo2)\r
-\r
-smesh.Compute(mesh,aBox)\r
-\r
-smeshgui = salome.ImportComponentGUI("SMESH")\r
-smeshgui.Init(salome.myStudyId);\r
-smeshgui.SetName( salome.ObjectToID( mesh ), "Mesh_freebord" );\r
-\r
-# Criterion : Free edges\r
-aFilterMgr = smesh.CreateFilterManager()\r
-aPredicate = aFilterMgr.CreateFreeBorders()\r
-aFilter = aFilterMgr.CreateFilter()\r
-aFilter.SetPredicate( aPredicate )\r
-\r
-anIds = aFilter.GetElementsId( mesh )\r
-\r
-# print result\r
-print "Criterion: Free edges Nb = ", len( anIds )\r
-for i in range( len( anIds ) ):\r
- print anIds[ i ]\r
-\r
-# create group\r
-aGroup = mesh.CreateGroup( SMESH.EDGE, "Free edges" )\r
-aGroup.Add( anIds )\r
-\r
-\r
-salome.sg.updateObjBrowser(1)\r
+++ /dev/null
-#==============================================================================
-# Info.
-# Bug (from script, bug) : hexaedre_modified.py, PAL6194, PAL7153
-# Modified : 25/11/2004
-# Author : Kovaltchuk Alexey
-# Project : PAL/SALOME
-#==============================================================================
-
-import salome
-from salome import sg
-
-import geompy
-
-import math
-
-# -----------------------------------------------------------------------------
-
-geom = salome.lcc.FindOrLoadComponent("FactoryServer", "GEOM")
-myBuilder = salome.myStudy.NewBuilder()
-gg = salome.ImportComponentGUI("GEOM")
-from salome import sg
-
-ShapeTypeCompSolid = 1
-ShapeTypeSolid = 2
-ShapeTypeShell = 3
-ShapeTypeFace = 4
-ShapeTypeWire = 5
-ShapeTypeEdge = 6
-ShapeTypeVertex = 7
-
-Boolop_common = 1
-Boolop_cut = 2
-Boolop_fuse = 3
-Boolop_section = 4
-
-p0 = geompy.MakeVertex(0., 0., 0.)
-px = geompy.MakeVertex(100., 0., 0.)
-py = geompy.MakeVertex(0., 100., 0.)
-pz = geompy.MakeVertex(0., 0., 100.)
-vx = geompy.MakeVector(p0, px)
-vy = geompy.MakeVector(p0, py)
-vz = geompy.MakeVector(p0, pz)
-
-sphereExt = geompy.MakeSphere( 0., 0., 0., 400.)
-sphereInt = geompy.MakeSphere( 0.,-50., 0., 350.)
-sphereA = geompy.MakeSphere( -400., 50., 50., 400.)
-sphereB = geompy.MakeSphere( 350.,-50.,-50., 350.)
-ptcyle = geompy.MakeVertex(0., -300., -450.)
-cylindre = geompy.MakeCylinder(ptcyle,vz,500.,900.)
-
-vol1=geompy.MakeCut(sphereExt,sphereA)
-vol2=geompy.MakeCut(vol1,sphereB)
-vol3=geompy.MakeCut(vol2,cylindre)
-blob=geompy.MakeCut(vol3,sphereInt)
-
-idblob = geompy.addToStudy(blob,"blob")
-
-aretes = []
-aretes = geompy.SubShapeAllSorted(blob, ShapeTypeEdge)
-eid=0
-
-# -------------------------------
-# --- numerotation des aretes
-##for edge in aretes:
-## edname="arete%d"%eid
-## idedge=geompy.addToStudy(edge,edname)
-## eid=eid+1
-
-salome.sg.updateObjBrowser(1)
-
-# --- epaisseur 0 2 8 10
-# --- hauteur 1 3 9 11
-# --- largeur 4 5 6 7
-
-# -----------------------------------------------------------------------------
-
-print "-------------------------- mesh"
-
-import SMESH
-import StdMeshers
-smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH")
-smesh.SetCurrentStudy(salome.myStudy)
-
-# ---- create Hypothesis
-print "-------------------------- create Hypothesis"
-numberOfSegments = 4
-hypNbSegA=smesh.CreateHypothesis("NumberOfSegments", "libStdMeshersEngine.so")
-hypNbSegA.SetNumberOfSegments(numberOfSegments)
-numberOfSegments = 10
-hypNbSegB=smesh.CreateHypothesis("NumberOfSegments", "libStdMeshersEngine.so")
-hypNbSegB.SetNumberOfSegments(numberOfSegments)
-numberOfSegments = 15
-hypNbSegC=smesh.CreateHypothesis("NumberOfSegments", "libStdMeshersEngine.so")
-hypNbSegC.SetNumberOfSegments(numberOfSegments)
-
-# ---- create Algorithms
-print "-------------------------- create Algorithms"
-regular1D=smesh.CreateHypothesis("Regular_1D", "libStdMeshersEngine.so")
-quad2D=smesh.CreateHypothesis("Quadrangle_2D", "libStdMeshersEngine.so")
-hexa3D=smesh.CreateHypothesis("Hexa_3D", "libStdMeshersEngine.so")
-
-# ---- init a Mesh with the geom shape
-shape_mesh = blob
-myMesh=smesh.CreateMesh(shape_mesh)
-
-# ---- add hypothesis and algorithms to mesh
-print "-------------------------- add hypothesis to mesh"
-myMesh.AddHypothesis(shape_mesh,regular1D)
-myMesh.AddHypothesis(shape_mesh,quad2D)
-myMesh.AddHypothesis(shape_mesh,hexa3D)
-
-#myMesh.AddHypothesis(shape_mesh,hypNbSeg)
-
-myMesh.AddHypothesis(aretes[0],hypNbSegA)
-myMesh.AddHypothesis(aretes[2],hypNbSegA)
-myMesh.AddHypothesis(aretes[8],hypNbSegA)
-myMesh.AddHypothesis(aretes[10],hypNbSegA)
-
-myMesh.AddHypothesis(aretes[1],hypNbSegC)
-myMesh.AddHypothesis(aretes[3],hypNbSegC)
-myMesh.AddHypothesis(aretes[9],hypNbSegC)
-myMesh.AddHypothesis(aretes[11],hypNbSegC)
-
-myMesh.AddHypothesis(aretes[4],hypNbSegB)
-myMesh.AddHypothesis(aretes[5],hypNbSegB)
-myMesh.AddHypothesis(aretes[6],hypNbSegB)
-myMesh.AddHypothesis(aretes[7],hypNbSegB)
-
-# ---- compute mesh
-
-print "-------------------------- compute mesh"
-ret=smesh.Compute(myMesh, shape_mesh)
-print ret
-if ret != 0:
- #log=myMesh.GetLog(0) # no erase trace
- #for linelog in log:
- # print linelog
- print "Information about the Mesh:"
- print "Number of nodes : ", myMesh.NbNodes()
- print "Number of edges : ", myMesh.NbEdges()
- print "Number of faces : ", myMesh.NbFaces()
- print "Number of quadrangles : ", myMesh.NbQuadrangles()
- print "Number of volumes : ", myMesh.NbVolumes()
- print "Number of hexahedrons : ", myMesh.NbHexas()
-else:
- print "problem when Computing the mesh"
-
-salome.sg.updateObjBrowser(1)
+++ /dev/null
-# Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-#
-# See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-#
-#
-#
-# File : SMESH_withHole.py
-# Author : Lucien PIGNOLONI
-# Module : SMESH
-# $Header$
-
-#-------------------------------------------------------------------------
-
-import salome
-import geompy
-
-import StdMeshers
-
-# ---------------------------- GEOM --------------------------------------
-
-# ---- define contigous arcs and segment to define a closed wire
-p1 = geompy.MakeVertex( 100.0, 0.0, 0.0 )
-p2 = geompy.MakeVertex( 50.0, 50.0, 0.0 )
-p3 = geompy.MakeVertex( 100.0, 100.0, 0.0 )
-arc1 = geompy.MakeArc( p1, p2, p3 )
-
-p4 = geompy.MakeVertex( 170.0, 100.0, 0.0 )
-seg1 = geompy.MakeVector( p3, p4 )
-
-p5 = geompy.MakeVertex( 200.0, 70.0, 0.0 )
-p6 = geompy.MakeVertex( 170.0, 40.0, 0.0 )
-arc2 = geompy.MakeArc( p4, p5, p6 )
-
-p7 = geompy.MakeVertex( 120.0, 30.0, 0.0 )
-arc3 = geompy.MakeArc( p6, p7, p1 )
-
-# ---- define a closed wire with arcs and segment
-List1 = []
-List1.append( arc1 )
-List1.append( seg1 )
-List1.append( arc2 )
-List1.append( arc3 )
-
-wire1 = geompy.MakeWire( List1 )
-Id_wire1 = geompy.addToStudy( wire1, "wire1" )
-
-# ---- define a planar face with wire
-WantPlanarFace = 1 #True
-face1 = geompy.MakeFace( wire1, WantPlanarFace )
-Id_face1 = geompy.addToStudy( face1, "face1" )
-
-# ---- create a shape by extrusion
-pO = geompy.MakeVertex( 0.0, 0.0, 0.0 )
-pz = geompy.MakeVertex( 0.0, 0.0, 100.0 )
-vz = geompy.MakeVector( pO, pz )
-
-prism1 = geompy.MakePrismVecH( face1, vz, 100.0 )
-Id_prism1 = geompy.addToStudy( prism1, "prism1" )
-
-# ---- create two cylinders
-pc1 = geompy.MakeVertex( 90.0, 50.0, -40.0 )
-pc2 = geompy.MakeVertex( 170.0, 70.0, -40.0 )
-
-radius = 20.0
-height = 180.0
-cyl1 = geompy.MakeCylinder( pc1, vz, radius, height )
-cyl2 = geompy.MakeCylinder( pc2, vz, radius, height )
-
-Id_Cyl1 = geompy.addToStudy( cyl1, "cyl1" )
-Id_Cyl2 = geompy.addToStudy( cyl2, "cyl2" )
-
-# ---- cut with cyl1
-shape = geompy.MakeBoolean( prism1, cyl1, 2 )
-
-# ---- fuse with cyl2 to obtain the final mechanic piece :)
-mechanic = geompy.MakeBoolean( shape, cyl2, 3 )
-Id_mechanic = geompy.addToStudy( mechanic, "mechanic" )
-
-# ---- explode on faces
-SubFaceL = geompy.SubShapeAllSorted(mechanic, geompy.ShapeType["FACE"])
-
-# ---- add a face sub shape in study to be meshed different
-sub_face1 = SubFaceL[0]
-name = geompy.SubShapeName( sub_face1, mechanic )
-
-Id_SubFace1 = geompy.addToStudyInFather( mechanic, sub_face1, name )
-
-# ---- add a face sub shape in study to be meshed different
-sub_face2 = SubFaceL[4]
-name = geompy.SubShapeName( sub_face2, mechanic )
-
-Id_SubFace2 = geompy.addToStudyInFather( mechanic, sub_face2, name )
-
-# ---- add a face sub shape in study to be meshed different
-sub_face3 = SubFaceL[5]
-name = geompy.SubShapeName( sub_face3, mechanic )
-
-Id_SubFace3 = geompy.addToStudyInFather( mechanic, sub_face3, name )
-
-# ---- add a face sub shape in study to be meshed different
-sub_face4 = SubFaceL[10]
-name = geompy.SubShapeName( sub_face4, mechanic )
-
-Id_SubFace4 = geompy.addToStudyInFather( mechanic, sub_face4, name )
-
-# ---------------------------- SMESH --------------------------------------
-
-# ---- launch SMESH, init a Mesh with shape 'mechanic'
-
-smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH")
-
-# -- Init --
-shape_mesh = salome.IDToObject( Id_mechanic )
-smesh.SetCurrentStudy(salome.myStudy)
-
-mesh = smesh.CreateMesh(shape_mesh)
-
-smeshgui = salome.ImportComponentGUI("SMESH")
-smeshgui.Init(salome.myStudyId)
-
-idmesh = salome.ObjectToID(mesh)
-smeshgui.SetName( idmesh, "Mesh_mechanic" )
-
-print "-------------------------- NumberOfSegments"
-
-numberOfSegment = 10
-
-hypNbSeg = smesh.CreateHypothesis( "NumberOfSegments", "libStdMeshersEngine.so" )
-hypNbSeg.SetNumberOfSegments( numberOfSegment )
-print hypNbSeg.GetName()
-print hypNbSeg.GetId()
-print hypNbSeg.GetNumberOfSegments()
-
-smeshgui.SetName(salome.ObjectToID(hypNbSeg), "NumberOfSegments_10")
-
-print "-------------------------- MaxElementArea"
-
-maxElementArea = 25
-
-hypArea25 = smesh.CreateHypothesis( "MaxElementArea", "libStdMeshersEngine.so" )
-hypArea25.SetMaxElementArea( maxElementArea )
-print hypArea25.GetName()
-print hypArea25.GetId()
-print hypArea25.GetMaxElementArea()
-
-smeshgui.SetName(salome.ObjectToID(hypArea25), "MaxElementArea_25")
-
-print "-------------------------- MaxElementArea"
-
-maxElementArea = 35
-
-hypArea35 = smesh.CreateHypothesis( "MaxElementArea", "libStdMeshersEngine.so" )
-hypArea35.SetMaxElementArea( maxElementArea )
-print hypArea35.GetName()
-print hypArea35.GetId()
-print hypArea35.GetMaxElementArea()
-
-smeshgui.SetName(salome.ObjectToID(hypArea35), "MaxElementArea_35")
-
-print "-------------------------- Regular_1D"
-
-algoReg1D = smesh.CreateHypothesis( "Regular_1D", "libStdMeshersEngine.so" )
-listHyp = algoReg1D.GetCompatibleHypothesis()
-for hyp in listHyp:
- print hyp
-print algoReg1D.GetName()
-print algoReg1D.GetId()
-
-smeshgui.SetName(salome.ObjectToID(algoReg1D), "Regular_1D")
-
-print "-------------------------- MEFISTO_2D"
-
-algoMef = smesh.CreateHypothesis( "MEFISTO_2D", "libStdMeshersEngine.so" )
-listHyp = algoMef.GetCompatibleHypothesis()
-for hyp in listHyp:
- print hyp
-print algoMef.GetName()
-print algoMef.GetId()
-
-smeshgui.SetName(salome.ObjectToID(algoMef), "MEFISTO_2D")
-
-print "-------------------------- SMESH_Quadrangle_2D"
-
-algoQuad = smesh.CreateHypothesis( "Quadrangle_2D", "libStdMeshersEngine.so" )
-listHyp = algoQuad.GetCompatibleHypothesis()
-for hyp in listHyp:
- print hyp
-print algoQuad.GetName()
-print algoQuad.GetId()
-
-smeshgui.SetName(salome.ObjectToID(algoQuad), "SMESH_Quadrangle_2D")
-
-print "-------------------------- add hypothesis to main shape"
-
-mesh.AddHypothesis( shape_mesh, hypNbSeg ) # nb segments
-mesh.AddHypothesis( shape_mesh, hypArea25 ) # max area
-
-mesh.AddHypothesis( shape_mesh, algoReg1D ) # Regular 1D/wire discretisation
-mesh.AddHypothesis( shape_mesh, algoMef ) # MEFISTO 2D
-
-print "-------------------------- add hypothesis and algorithm to sub face 1"
-
-submesh = mesh.GetSubMesh(sub_face1, "SubMeshFace1")
-
-mesh.AddHypothesis( sub_face1, algoQuad ) # Quadrangle 2D
-mesh.AddHypothesis( sub_face1, hypArea35 ) # max area
-
-print "-------------------------- add hypothesis and algorithm to sub face 2"
-
-submesh = mesh.GetSubMesh(sub_face2, "SubMeshFace2")
-
-mesh.AddHypothesis( sub_face2, algoQuad ) # Quadrangle 2D
-mesh.AddHypothesis( sub_face2, hypArea35 ) # max area
-
-print "-------------------------- add hypothesis and algorith to sub face 3"
-
-submesh = mesh.GetSubMesh(sub_face3, "SubMeshFace3")
-
-mesh.AddHypothesis( sub_face3, algoQuad ) # Quadrangle 2D
-mesh.AddHypothesis( sub_face3, hypArea35 ) # max area
-
-print "-------------------------- add hypothesis and algorith to sub face 4"
-
-submesh = mesh.GetSubMesh(sub_face4, "SubMeshFace4")
-
-mesh.AddHypothesis( sub_face4, algoQuad ) # Quadrangle 2D
-mesh.AddHypothesis( sub_face4, hypArea35 ) # max area
-
-print "-------------------------- compute the mesh of the mechanic piece"
-
-smesh.Compute(mesh, shape_mesh)
-
-print "Information about the Mesh_mechanic:"
-print "Number of nodes : ", mesh.NbNodes()
-print "Number of edges : ", mesh.NbEdges()
-print "Number of faces : ", mesh.NbFaces()
-print "Number of triangles : ", mesh.NbTriangles()
-print "Number of quadrangles : ", mesh.NbQuadrangles()
-print "Number of volumes : ", mesh.NbVolumes()
-print "Number of tetrahedrons: ", mesh.NbTetras()
-
-salome.sg.updateObjBrowser(1)
+++ /dev/null
-# Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-#
-# See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-#
-#
-#
-# File : SMESH_withHole.py
-# Author : Lucien PIGNOLONI
-# Module : SMESH
-# $Header$
-
-#-------------------------------------------------------------------------
-
-import salome
-import geompy
-
-import StdMeshers
-
-import SMESH
-
-# ---------------------------- GEOM --------------------------------------
-
-# ---- define contigous arcs and segment to define a closed wire
-p1 = geompy.MakeVertex( 100.0, 0.0, 0.0 )
-p2 = geompy.MakeVertex( 50.0, 50.0, 0.0 )
-p3 = geompy.MakeVertex( 100.0, 100.0, 0.0 )
-arc1 = geompy.MakeArc( p1, p2, p3 )
-
-p4 = geompy.MakeVertex( 170.0, 100.0, 0.0 )
-seg1 = geompy.MakeVector( p3, p4 )
-
-p5 = geompy.MakeVertex( 200.0, 70.0, 0.0 )
-p6 = geompy.MakeVertex( 170.0, 40.0, 0.0 )
-arc2 = geompy.MakeArc( p4, p5, p6 )
-
-p7 = geompy.MakeVertex( 120.0, 30.0, 0.0 )
-arc3 = geompy.MakeArc( p6, p7, p1 )
-
-# ---- define a closed wire with arcs and segment
-List1 = []
-List1.append( arc1 )
-List1.append( seg1 )
-List1.append( arc2 )
-List1.append( arc3 )
-
-wire1 = geompy.MakeWire( List1 )
-Id_wire1 = geompy.addToStudy( wire1, "wire1" )
-
-# ---- define a planar face with wire
-WantPlanarFace = 1 #True
-face1 = geompy.MakeFace( wire1, WantPlanarFace )
-Id_face1 = geompy.addToStudy( face1, "face1" )
-
-# ---- create a shape by extrusion
-pO = geompy.MakeVertex( 0.0, 0.0, 0.0 )
-pz = geompy.MakeVertex( 0.0, 0.0, 100.0 )
-vz = geompy.MakeVector( pO, pz )
-
-prism1 = geompy.MakePrismVecH( face1, vz, 100.0 )
-Id_prism1 = geompy.addToStudy( prism1, "prism1" )
-
-# ---- create two cylinders
-pc1 = geompy.MakeVertex( 90.0, 50.0, -40.0 )
-pc2 = geompy.MakeVertex( 170.0, 70.0, -40.0 )
-
-radius = 20.0
-height = 180.0
-cyl1 = geompy.MakeCylinder( pc1, vz, radius, height )
-cyl2 = geompy.MakeCylinder( pc2, vz, radius, height )
-
-Id_Cyl1 = geompy.addToStudy( cyl1, "cyl1" )
-Id_Cyl2 = geompy.addToStudy( cyl2, "cyl2" )
-
-# ---- cut with cyl1
-shape = geompy.MakeBoolean( prism1, cyl1, 2 )
-
-# ---- fuse with cyl2 to obtain the final mechanic piece :)
-mechanic = geompy.MakeBoolean( shape, cyl2, 3 )
-Id_mechanic = geompy.addToStudy( mechanic, "mechanic" )
-
-# ---- explode on faces
-SubFaceL = geompy.SubShapeAllSorted(mechanic, geompy.ShapeType["FACE"])
-
-# ---- add a face sub shape in study to be meshed different
-sub_face1 = SubFaceL[0]
-name = geompy.SubShapeName( sub_face1, mechanic )
-
-Id_SubFace1 = geompy.addToStudyInFather( mechanic, sub_face1, name )
-
-# ---- add a face sub shape in study to be meshed different
-sub_face2 = SubFaceL[4]
-name = geompy.SubShapeName( sub_face2, mechanic )
-
-Id_SubFace2 = geompy.addToStudyInFather( mechanic, sub_face2, name )
-
-# ---- add a face sub shape in study to be meshed different
-sub_face3 = SubFaceL[5]
-name = geompy.SubShapeName( sub_face3, mechanic )
-
-Id_SubFace3 = geompy.addToStudyInFather( mechanic, sub_face3, name )
-
-# ---- add a face sub shape in study to be meshed different
-sub_face4 = SubFaceL[10]
-name = geompy.SubShapeName( sub_face4, mechanic )
-
-Id_SubFace4 = geompy.addToStudyInFather( mechanic, sub_face4, name )
-
-# ---------------------------- SMESH --------------------------------------
-
-# ---- launch SMESH, init a Mesh with shape 'mechanic'
-
-smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH")
-
-# -- Init --
-shape_mesh = salome.IDToObject( Id_mechanic )
-smesh.SetCurrentStudy(salome.myStudy)
-
-mesh = smesh.CreateMesh(shape_mesh)
-
-smeshgui = salome.ImportComponentGUI("SMESH")
-smeshgui.Init(salome.myStudyId)
-
-idmesh = salome.ObjectToID(mesh)
-smeshgui.SetName( idmesh, "Mesh_mechanic" )
-
-print "-------------------------- NumberOfSegments"
-
-numberOfSegment = 10
-
-hypNbSeg = smesh.CreateHypothesis( "NumberOfSegments", "libStdMeshersEngine.so" )
-hypNbSeg.SetNumberOfSegments( numberOfSegment )
-print hypNbSeg.GetName()
-print hypNbSeg.GetId()
-print hypNbSeg.GetNumberOfSegments()
-
-smeshgui.SetName(salome.ObjectToID(hypNbSeg), "NumberOfSegments_10")
-
-print "-------------------------- MaxElementArea"
-
-maxElementArea = 25
-
-hypArea25 = smesh.CreateHypothesis( "MaxElementArea", "libStdMeshersEngine.so" )
-hypArea25.SetMaxElementArea( maxElementArea )
-print hypArea25.GetName()
-print hypArea25.GetId()
-print hypArea25.GetMaxElementArea()
-
-smeshgui.SetName(salome.ObjectToID(hypArea25), "MaxElementArea_25")
-
-print "-------------------------- MaxElementArea"
-
-maxElementArea = 35
-
-hypArea35 = smesh.CreateHypothesis( "MaxElementArea", "libStdMeshersEngine.so" )
-hypArea35.SetMaxElementArea( maxElementArea )
-print hypArea35.GetName()
-print hypArea35.GetId()
-print hypArea35.GetMaxElementArea()
-
-smeshgui.SetName(salome.ObjectToID(hypArea35), "MaxElementArea_35")
-
-print "-------------------------- Regular_1D"
-
-algoReg1D = smesh.CreateHypothesis( "Regular_1D", "libStdMeshersEngine.so" )
-listHyp = algoReg1D.GetCompatibleHypothesis()
-for hyp in listHyp:
- print hyp
-print algoReg1D.GetName()
-print algoReg1D.GetId()
-
-smeshgui.SetName(salome.ObjectToID(algoReg1D), "Regular_1D")
-
-print "-------------------------- MEFISTO_2D"
-
-algoMef = smesh.CreateHypothesis( "MEFISTO_2D", "libStdMeshersEngine.so" )
-listHyp = algoMef.GetCompatibleHypothesis()
-for hyp in listHyp:
- print hyp
-print algoMef.GetName()
-print algoMef.GetId()
-
-smeshgui.SetName(salome.ObjectToID(algoMef), "MEFISTO_2D")
-
-print "-------------------------- SMESH_Quadrangle_2D"
-
-algoQuad = smesh.CreateHypothesis( "Quadrangle_2D", "libStdMeshersEngine.so" )
-listHyp = algoQuad.GetCompatibleHypothesis()
-for hyp in listHyp:
- print hyp
-print algoQuad.GetName()
-print algoQuad.GetId()
-
-smeshgui.SetName(salome.ObjectToID(algoQuad), "SMESH_Quadrangle_2D")
-
-print "-------------------------- add hypothesis to main shape"
-
-mesh.AddHypothesis( shape_mesh, hypNbSeg ) # nb segments
-mesh.AddHypothesis( shape_mesh, hypArea25 ) # max area
-
-mesh.AddHypothesis( shape_mesh, algoReg1D ) # Regular 1D/wire discretisation
-mesh.AddHypothesis( shape_mesh, algoMef ) # MEFISTO 2D
-
-print "-------------------------- add hypothesis and algorithm to sub face 1"
-
-submesh = mesh.GetSubMesh(sub_face1, "SubMeshFace1")
-
-mesh.AddHypothesis( sub_face1, algoQuad ) # Quadrangle 2D
-mesh.AddHypothesis( sub_face1, hypArea35 ) # max area
-
-print "-------------------------- add hypothesis and algorithm to sub face 2"
-
-submesh = mesh.GetSubMesh(sub_face2, "SubMeshFace2")
-
-mesh.AddHypothesis( sub_face2, algoQuad ) # Quadrangle 2D
-mesh.AddHypothesis( sub_face2, hypArea35 ) # max area
-
-print "-------------------------- add hypothesis and algorith to sub face 3"
-
-submesh = mesh.GetSubMesh(sub_face3, "SubMeshFace3")
-
-mesh.AddHypothesis( sub_face3, algoQuad ) # Quadrangle 2D
-mesh.AddHypothesis( sub_face3, hypArea35 ) # max area
-
-print "-------------------------- add hypothesis and algorith to sub face 4"
-
-submesh = mesh.GetSubMesh(sub_face4, "SubMeshFace4")
-
-mesh.AddHypothesis( sub_face4, algoQuad ) # Quadrangle 2D
-mesh.AddHypothesis( sub_face4, hypArea35 ) # max area
-
-print "-------------------------- compute the mesh of the mechanic piece"
-
-smesh.Compute(mesh, shape_mesh)
-
-print "Information about the Mesh_mechanic:"
-print "Number of nodes : ", mesh.NbNodes()
-print "Number of edges : ", mesh.NbEdges()
-print "Number of faces : ", mesh.NbFaces()
-print "Number of triangles : ", mesh.NbTriangles()
-print "Number of quadrangles : ", mesh.NbQuadrangles()
-print "Number of volumes : ", mesh.NbVolumes()
-print "Number of tetrahedrons: ", mesh.NbTetras()
-
-
-MeshEditor = mesh.GetMeshEditor()
-
-#1 cutting of quadrangles of the 'SubMeshFace2' submesh
-submesh = mesh.GetSubMesh(sub_face2, "SubMeshFace2")
-MeshEditor.SplitQuadObject(submesh, 1)
-
-#2 cutting of triangles of the group
-FacesTriToQuad = [2381, 2382, 2383, 2384, 2385, 2386, 2387, 2388, 2389, 2390, 2391, 2392, 2393, 2394, 2395, 2396, 2397, 2398, 2399, 2400, 2401, 2402, 2403, 2404, 2405, 2406, 2407, 2408, 2409, 2410, 2411, 2412, 2413, 2414, 2415, 2416, 2417, 2418, 2419, 2420, 2421, 2422]
-GroupTriToQuad = mesh.CreateGroup(SMESH.FACE,"Group of faces (quad)")
-GroupTriToQuad.Add(FacesTriToQuad)
-MeshEditor.TriToQuadObject(GroupTriToQuad, None , 1.57)
-
-#3 extrusion of the group
-point = SMESH.PointStruct(0, 0, 5)
-vector = SMESH.DirStruct(point)
-MeshEditor.ExtrusionSweepObject(GroupTriToQuad, vector, 5)
-
-#4 mirror object
-MeshEditor.MirrorObject(mesh, SMESH.AxisStruct(0, 0, 0, 0, 0, 0), SMESH.SMESH_MeshEditor.POINT, 0)
-
-#5 mesh translation
-point = SMESH.PointStruct(10, 10, 10)
-vector = SMESH.DirStruct(point)
-MeshEditor.TranslateObject(mesh, vector, 0)
-
-#6 mesh rotation
-axisXYZ = SMESH.AxisStruct(0, 0, 0, 10, 10, 10)
-angle180 = 180*3.141/180
-MeshEditor.RotateObject(mesh, axisXYZ, angle180, 0)
-
-#7 group smoothing
-FacesSmooth = [864, 933, 941, 950, 1005, 1013]
-GroupSmooth = mesh.CreateGroup(SMESH.FACE,"Group of faces (smooth)")
-GroupSmooth.Add(FacesSmooth)
-MeshEditor.SmoothObject(GroupSmooth, [], 20, 2, SMESH.SMESH_MeshEditor.CENTROIDAL_SMOOTH)
-
-#8 rotation sweep object
-FacesRotate = [492, 493, 502, 503]
-GroupRotate = mesh.CreateGroup(SMESH.FACE,"Group of faces (rotate)")
-GroupRotate.Add(FacesRotate)
-angle45 = 45*3.141/180
-axisXYZ = SMESH.AxisStruct(-38.3128, -73.3658, -133.321, -13.3402, -13.3265, 6.66632)
-MeshEditor.RotationSweepObject(GroupRotate, axisXYZ, angle45, 4, 1e-5)
-
-#9 reorientation of the whole mesh
-submesh = mesh.GetSubMesh(sub_face1, "SubMeshFace1")
-MeshEditor.ReorientObject(submesh)
-
-salome.sg.updateObjBrowser(1)
+++ /dev/null
-# Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-#
-# See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-#
-#
-#
-# File : SMESH_withHole.py
-# Author : Lucien PIGNOLONI
-# Module : SMESH
-# $Header$
-
-import salome
-import geompy
-
-geom = geompy.geom
-smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH")
-smesh.SetCurrentStudy(salome.myStudy)
-
-smeshgui = salome.ImportComponentGUI("SMESH")
-smeshgui.Init(salome.myStudyId)
-
-import StdMeshers
-import NETGENPlugin
-
-# ---------------------------- GEOM --------------------------------------
-
-# ---- define contigous arcs and segment to define a closed wire
-p1 = geompy.MakeVertex( 100.0, 0.0, 0.0 )
-p2 = geompy.MakeVertex( 50.0, 50.0, 0.0 )
-p3 = geompy.MakeVertex( 100.0, 100.0, 0.0 )
-arc1 = geompy.MakeArc( p1, p2, p3 )
-
-p4 = geompy.MakeVertex( 170.0, 100.0, 0.0 )
-seg1 = geompy.MakeVector( p3, p4 )
-
-p5 = geompy.MakeVertex( 200.0, 70.0, 0.0 )
-p6 = geompy.MakeVertex( 170.0, 40.0, 0.0 )
-arc2 = geompy.MakeArc( p4, p5, p6 )
-
-p7 = geompy.MakeVertex( 120.0, 30.0, 0.0 )
-arc3 = geompy.MakeArc( p6, p7, p1 )
-
-# ---- define a closed wire with arcs and segment
-List1 = []
-List1.append( arc1 )
-List1.append( seg1 )
-List1.append( arc2 )
-List1.append( arc3 )
-
-wire1 = geompy.MakeWire( List1 )
-Id_wire1 = geompy.addToStudy( wire1, "wire1" )
-
-# ---- define a planar face with wire
-WantPlanarFace = 1 #True
-face1 = geompy.MakeFace( wire1, WantPlanarFace )
-Id_face1 = geompy.addToStudy( face1, "face1" )
-
-# ---- create a shape by extrusion
-pO = geompy.MakeVertex( 0.0, 0.0, 0.0 )
-pz = geompy.MakeVertex( 0.0, 0.0, 100.0 )
-vz = geompy.MakeVector( pO, pz )
-
-prism1 = geompy.MakePrismVecH( face1, vz, 100.0 )
-Id_prism1 = geompy.addToStudy( prism1, "prism1")
-
-# ---- create two cylinders
-
-pc1 = geompy.MakeVertex( 90.0, 50.0, -40.0 )
-pc2 = geompy.MakeVertex( 170.0, 70.0, -40.0 )
-radius = 20.0
-height = 180.0
-cyl1 = geompy.MakeCylinder( pc1, vz, radius, height )
-cyl2 = geompy.MakeCylinder( pc2, vz, radius, height )
-
-Id_Cyl1 = geompy.addToStudy( cyl1, "cyl1" )
-Id_Cyl2 = geompy.addToStudy( cyl2, "cyl2" )
-
-# ---- cut with cyl1
-shape = geompy.MakeBoolean( prism1, cyl1, 2 )
-
-# ---- fuse with cyl2 to obtain the final mechanic piece :)
-mechanic = geompy.MakeBoolean( shape, cyl2, 3 )
-Id_mechanic = geompy.addToStudy( mechanic, "mechanic" )
-
-# ---- Analysis of the geometry
-
-print "Analysis of the geometry mechanic :"
-
-subShellList = geompy.SubShapeAll(mechanic,geompy.ShapeType["SHELL"])
-subFaceList = geompy.SubShapeAll(mechanic,geompy.ShapeType["FACE"])
-subEdgeList = geompy.SubShapeAll(mechanic,geompy.ShapeType["EDGE"])
-
-print "number of Shells in mechanic : ",len(subShellList)
-print "number of Faces in mechanic : ",len(subFaceList)
-print "number of Edges in mechanic : ",len(subEdgeList)
-
-### ---------------------------- SMESH --------------------------------------
-
-print "-------------------------- NumberOfSegments"
-
-numberOfSegment = 10
-
-hypNbSeg = smesh.CreateHypothesis( "NumberOfSegments", "libStdMeshersEngine.so" )
-hypNbSeg.SetNumberOfSegments( numberOfSegment )
-print hypNbSeg.GetName()
-print hypNbSeg.GetId()
-print hypNbSeg.GetNumberOfSegments()
-
-smeshgui.SetName(salome.ObjectToID(hypNbSeg), "NumberOfSegments_10")
-
-print "-------------------------- MaxElementArea"
-
-maxElementArea = 20
-
-hypArea = smesh.CreateHypothesis( "MaxElementArea", "libStdMeshersEngine.so" )
-hypArea.SetMaxElementArea( maxElementArea )
-print hypArea.GetName()
-print hypArea.GetId()
-print hypArea.GetMaxElementArea()
-
-smeshgui.SetName(salome.ObjectToID(hypArea), "MaxElementArea_20")
-
-print "-------------------------- MaxElementVolume"
-
-maxElementVolume = 20
-
-hypVolume = smesh.CreateHypothesis( "MaxElementVolume", "libStdMeshersEngine.so" )
-hypVolume.SetMaxElementVolume( maxElementVolume )
-print hypVolume.GetName()
-print hypVolume.GetId()
-print hypVolume.GetMaxElementVolume()
-
-smeshgui.SetName(salome.ObjectToID(hypVolume), "MaxElementVolume_20")
-
-print "-------------------------- Regular_1D"
-
-algoReg1D = smesh.CreateHypothesis( "Regular_1D", "libStdMeshersEngine.so" )
-listHyp =algoReg1D.GetCompatibleHypothesis()
-for hyp in listHyp:
- print hyp
-print algoReg1D.GetName()
-print algoReg1D.GetId()
-
-smeshgui.SetName(salome.ObjectToID(algoReg1D), "Regular_1D")
-
-print "-------------------------- MEFISTO_2D"
-
-algoMef = smesh.CreateHypothesis( "MEFISTO_2D", "libStdMeshersEngine.so" )
-listHyp = algoMef.GetCompatibleHypothesis()
-for hyp in listHyp:
- print hyp
-print algoMef.GetName()
-print algoMef.GetId()
-
-smeshgui.SetName(salome.ObjectToID(algoMef), "MEFISTO_2D")
-
-print "-------------------------- NETGEN_3D"
-
-algoNg = smesh.CreateHypothesis( "NETGEN_3D", "libNETGENEngine.so" )
-listHyp = algoNg.GetCompatibleHypothesis()
-for hyp in listHyp:
- print hyp
-print algoNg.GetName()
-print algoNg.GetId()
-
-smeshgui.SetName(salome.ObjectToID(algoNg), "NETGEN_3D")
-
-print "-------------------------- add hypothesis to main mechanic"
-
-shape_mesh = salome.IDToObject( Id_mechanic )
-
-mesh = smesh.CreateMesh(shape_mesh)
-
-idmesh = salome.ObjectToID(mesh)
-smeshgui.SetName( idmesh, "Mesh_mechanic_tetra" )
-
-mesh.AddHypothesis( shape_mesh, hypNbSeg ) # nb segments
-mesh.AddHypothesis( shape_mesh, hypArea ) # max area
-mesh.AddHypothesis( shape_mesh, hypVolume ) # max volume
-
-mesh.AddHypothesis( shape_mesh, algoReg1D ) # Regular 1D/wire discretisation
-mesh.AddHypothesis( shape_mesh, algoMef ) # MEFISTO 2D
-mesh.AddHypothesis( shape_mesh, algoNg ) # NETGEN 3D
-
-print "-------------------------- compute the mesh of the mechanic piece"
-smesh.Compute(mesh,shape_mesh)
-
-print "Information about the Mesh_mechanic_tetra:"
-print "Number of nodes : ", mesh.NbNodes()
-print "Number of edges : ", mesh.NbEdges()
-print "Number of faces : ", mesh.NbFaces()
-print "Number of triangles : ", mesh.NbTriangles()
-print "Number of quadrangles: ", mesh.NbQuadrangles()
-print "Number of volumes : ", mesh.NbVolumes()
-print "Number of tetrahedrons: ", mesh.NbTetras()
-
-salome.sg.updateObjBrowser(1)
+++ /dev/null
-"""
-
-"""
-
-# force SMESH importation at interpretor initialization
-# see salome_shared_modules.py
-# (avoids incomplete import at run time)
-
-print "============== import SMESH ======================="
-
-import SMESH
-
-# this function is required
-
-def init_shared_modules():
- """
- This function initializes shared modules that need to be
- """
- pass
+++ /dev/null
-# SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses
-#
-# Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-#
-# See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-#
-#
-#
-# File : SMESH_test.py
-# Module : SMESH
-
-import salome
-import geompy
-import smeshpy
-
-import SMESH
-import StdMeshers
-
-# ---- define a box
-
-box = geompy.MakeBox(0., 0., 0., 100., 200., 300.)
-idb = geompy.addToStudy(box, "box")
-
-# ---- add first face of box in study
-
-subShapeList = geompy.SubShapeAll(box, geompy.ShapeType["FACE"])
-face = subShapeList[0]
-name = geompy.SubShapeName(face, box)
-idf = geompy.addToStudyInFather(box, face, name)
-
-# ---- add shell from box in study
-
-subShellList = geompy.SubShapeAll(box, geompy.ShapeType["SHELL"])
-shell = subShellList[0]
-name = geompy.SubShapeName(shell, box)
-ids = geompy.addToStudyInFather(box, shell, name)
-
-# ---- add first edge of face in study
-
-edgeList = geompy.SubShapeAll(face, geompy.ShapeType["EDGE"])
-edge = edgeList[0];
-name = geompy.SubShapeName(edge, face)
-ide = geompy.addToStudyInFather(face, edge, name)
-
-# ---- launch SMESH, init a Mesh with the box
-
-gen = smeshpy.smeshpy()
-mesh = gen.CreateMesh(idb)
-
-print "-------------------------- create Hypothesis"
-
-print "-------------------------- LocalLength"
-
-hypo1 = gen.CreateHypothesis("LocalLength", "libStdMeshersEngine.so")
-print hypo1.GetName()
-print hypo1.GetId()
-print hypo1.GetLength()
-hypo1.SetLength(100)
-print hypo1.GetLength()
-
-print "-------------------------- bidon"
-
-hyp3 = gen.CreateHypothesis("bidon", "")
-
-print "-------------------------- NumberOfSegments"
-
-hypo3 = gen.CreateHypothesis("NumberOfSegments", "libStdMeshersEngine.so")
-hypo3.SetNumberOfSegments(7)
-print hypo3.GetName()
-print hypo3.GetNumberOfSegments()
-print hypo3.GetId()
-
-print "-------------------------- MaxElementArea"
-
-hypo4 = gen.CreateHypothesis("MaxElementArea", "libStdMeshersEngine.so")
-hypo4.SetMaxElementArea(5000)
-print hypo4.GetName()
-print hypo4.GetMaxElementArea()
-print hypo4.GetId()
-
-print "-------------------------- Regular_1D"
-
-algo_1 = gen.CreateHypothesis("Regular_1D", "libStdMeshersEngine.so")
-print algo_1.GetName()
-print algo_1.GetId()
-listHyp = algo_1.GetCompatibleHypothesis()
-for hyp in listHyp:
- print hyp
-print algo_1.GetId()
-
-print "-------------------------- MEFISTO_2D"
-
-algo_2 = gen.CreateHypothesis("MEFISTO_2D", "libStdMeshersEngine.so")
-print algo_2.GetName()
-print algo_2.GetId()
-listHyp = algo_2.GetCompatibleHypothesis()
-for hyp in listHyp:
- print hyp
-print algo_2.GetId()
-
-print "-------------------------- add hypothesis to edge"
-
-edge = salome.IDToObject(ide)
-submesh = mesh.GetSubMesh(edge, "SubMeshEdge")
-ret = mesh.AddHypothesis(edge,algo_1)
-print ret
-ret = mesh.AddHypothesis(edge,hypo1)
-print ret
-
-##print "-------------------------- compute edge"
-##ret=gen.Compute(mesh,ide)
-##print ret
-##log=mesh.GetLog(1);
-##for a in log:
-## print a
-
-print "-------------------------- add hypothesis to box"
-
-box = salome.IDToObject(idb)
-submesh = mesh.GetSubMesh(box, "SubMeshBox")
-ret = mesh.AddHypothesis(box,algo_1)
-print ret
-ret = mesh.AddHypothesis(box,hypo1)
-print ret
-ret = mesh.AddHypothesis(box,algo_2)
-print ret
-ret = mesh.AddHypothesis(box,hypo4)
-print ret
-
-print "-------------------------- compute face"
-
-ret = gen.Compute(mesh,idf)
-print ret
-log = mesh.GetLog(0) # 0 - GetLog without ClearLog after, else if 1 - ClearLog after
-for a in log:
- print "-------"
- ii = 0
- ir = 0
- comType = a.commandType
- if comType == 0:
- for i in range(a.number):
- ind = a.indexes[ii]
- ii = ii+1
- r1 = a.coords[ir]
- ir = ir+1
- r2 = a.coords[ir]
- ir = ir+1
- r3 = a.coords[ir]
- ir = ir+1
- print "AddNode %i - %g %g %g" % (ind, r1, r2, r3)
- elif comType == 1:
- for i in range(a.number):
- ind = a.indexes[ii]
- ii = ii+1
- i1 = a.indexes[ii]
- ii = ii+1
- i2 = a.indexes[ii]
- ii = ii+1
- print "AddEdge %i - %i %i" % (ind, i1, i2)
- elif comType == 2:
- for i in range(a.number):
- ind = a.indexes[ii]
- ii = ii+1
- i1 = a.indexes[ii]
- ii = ii+1
- i2 = a.indexes[ii]
- ii = ii+1
- i3 = a.indexes[ii]
- ii = ii+1
- print "AddTriangle %i - %i %i %i" % (ind, i1, i2, i3)
-
-##print "-------------------------- compute box"
-##ret=gen.Compute(mesh,idb)
-##print ret
-##log=mesh.GetLog(1);
-##print log
-
-##shell=salome.IDToObject(ids)
-##submesh=mesh.GetElementsOnShape(shell)
-##ret=mesh.AddHypothesis(shell,algo_1)
-##print ret
-##ret=mesh.AddHypothesis(shell,hypo1)
-##print ret
-##ret=gen.Compute(mesh,ids)
-##print ret
+++ /dev/null
-# Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-#
-# See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-#
-#
-#
-# File : SMESH_test0.py
-# Module : SMESH
-
-import salome
-import geompy
-from geompy import geom
-from geompy import gg
-
-import SMESH
-
-myBuilder = salome.myStudy.NewBuilder()
-
-# ---- define a box
-
-box = geompy.MakeBox(0., 0., 0., 100., 200., 300.)
-idbox = geompy.addToStudy(box, "box")
-
-# ---- add first face of box in study
-
-subShapeList = geompy.SubShapeAll(box, geompy.ShapeType["FACE"])
-face = subShapeList[0]
-name = geompy.SubShapeName(face, box)
-print name
-idface = geompy.addToStudyInFather(box, face, name)
-
-# ---- add shell from box in study
-
-subShellList = geompy.SubShapeAll(box, geompy.ShapeType["SHELL"])
-shell = subShellList[0]
-name = geompy.SubShapeName(shell, box)
-print name
-idshell = geompy.addToStudyInFather(box, shell, name)
-
-# ---- add first edge of face in study
-
-edgeList = geompy.SubShapeAll(face, geompy.ShapeType["EDGE"])
-edge = edgeList[0]
-name = geompy.SubShapeName(edge, face)
-print name
-idedge = geompy.addToStudyInFather(face, edge, name)
-
-salome.sg.updateObjBrowser(1)
+++ /dev/null
-# Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-#
-# See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-#
-#
-#
-# File : SMESH_test1.py
-# Module : SMESH
-
-import salome
-import geompy
-
-import StdMeshers
-
-smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH")
-smesh.SetCurrentStudy(salome.myStudy)
-
-# ---- define a box
-
-box = geompy.MakeBox(0., 0., 0., 100., 200., 300.)
-idbox = geompy.addToStudy(box, "box")
-
-# ---- add first face of box in study
-
-subShapeList = geompy.SubShapeAll(box, geompy.ShapeType["FACE"])
-face = subShapeList[0]
-name = geompy.SubShapeName(face, box)
-print name
-idface = geompy.addToStudyInFather(box, face, name)
-
-# ---- add shell from box in study
-
-subShellList = geompy.SubShapeAll(box, geompy.ShapeType["SHELL"])
-shell = subShellList[0]
-name = geompy.SubShapeName(shell, box)
-print name
-idshell = geompy.addToStudyInFather(box, shell, name)
-
-# ---- add first edge of face in study
-
-edgeList = geompy.SubShapeAll(face, geompy.ShapeType["EDGE"])
-edge = edgeList[0]
-name = geompy.SubShapeName(edge, face)
-print name
-idedge = geompy.addToStudyInFather(face, edge, name)
-
-# ---- launch SMESH
-
-smeshgui = salome.ImportComponentGUI("SMESH")
-smeshgui.Init(salome.myStudyId)
-
-print "-------------------------- create Hypothesis"
-
-print "-------------------------- LocalLength"
-hypLen1 = smesh.CreateHypothesis("LocalLength", "libStdMeshersEngine.so")
-hypLen1.SetLength(100)
-print hypLen1.GetName()
-print hypLen1.GetId()
-print hypLen1.GetLength()
-
-idlength = salome.ObjectToID(hypLen1)
-smeshgui.SetName(idlength, "Local_Length_100");
-
-print "-------------------------- NumberOfSegments"
-hypNbSeg1 = smesh.CreateHypothesis("NumberOfSegments", "libStdMeshersEngine.so")
-hypNbSeg1.SetNumberOfSegments(7)
-print hypNbSeg1.GetName()
-print hypNbSeg1.GetId()
-print hypNbSeg1.GetNumberOfSegments()
-
-idseg = salome.ObjectToID(hypNbSeg1)
-smeshgui.SetName(idseg, "NumberOfSegments_7");
-
-print "-------------------------- MaxElementArea"
-hypArea1 = smesh.CreateHypothesis("MaxElementArea", "libStdMeshersEngine.so")
-hypArea1.SetMaxElementArea(2500)
-print hypArea1.GetName()
-print hypArea1.GetId()
-print hypArea1.GetMaxElementArea()
-
-idarea1 = salome.ObjectToID(hypArea1)
-smeshgui.SetName(idarea1, "MaxElementArea_2500");
-
-print "-------------------------- MaxElementArea"
-hypArea2 = smesh.CreateHypothesis("MaxElementArea", "libStdMeshersEngine.so")
-hypArea2.SetMaxElementArea(500)
-print hypArea2.GetName()
-print hypArea2.GetId()
-print hypArea2.GetMaxElementArea()
-
-idarea2 = salome.ObjectToID(hypArea2)
-smeshgui.SetName(idarea2, "MaxElementArea_500");
-
-print "-------------------------- Regular_1D"
-algoReg = smesh.CreateHypothesis("Regular_1D", "libStdMeshersEngine.so")
-listHyp = algoReg.GetCompatibleHypothesis()
-for hyp in listHyp:
- print hyp
-print algoReg.GetName()
-print algoReg.GetId()
-
-idreg = salome.ObjectToID(algoReg)
-smeshgui.SetName(idreg, "Regular_1D");
-
-print "-------------------------- MEFISTO_2D"
-algoMef = smesh.CreateHypothesis("MEFISTO_2D", "libStdMeshersEngine.so")
-listHyp = algoMef.GetCompatibleHypothesis()
-for hyp in listHyp:
- print hyp
-print algoMef.GetName()
-print algoMef.GetId()
-
-idmef = salome.ObjectToID(algoMef)
-smeshgui.SetName(idmef, "MEFISTO_2D");
-
-# ---- Init a Mesh with the box
-
-box = salome.IDToObject(idbox)
-mesh = smesh.CreateMesh(box)
-idmesh = salome.ObjectToID(mesh)
-smeshgui.SetName(idmesh, "Meshbox");
-
-print "-------------------------- add hypothesis to box"
-mesh.AddHypothesis(box,algoReg)
-mesh.AddHypothesis(box,hypNbSeg1)
-mesh.AddHypothesis(box,algoMef)
-mesh.AddHypothesis(box,hypArea1)
-
-# ---- add hypothesis to edge
-
-print "-------------------------- add hypothesis to edge"
-edge = salome.IDToObject(idedge)
-submesh = mesh.GetSubMesh(edge, "SubMeshEdge")
-mesh.AddHypothesis(edge, algoReg)
-mesh.AddHypothesis(edge, hypLen1)
-
-print "-------------------------- add hypothesis to face"
-face = salome.IDToObject(idface)
-submesh = mesh.GetSubMesh(face, "SubMeshFace")
-mesh.AddHypothesis(face, hypArea2)
-
-salome.sg.updateObjBrowser(1);
+++ /dev/null
-# Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-#
-# See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-#
-#
-#
-# File : SMESH_test2.py
-# Module : SMESH
-
-from SMESH_test1 import *
-
-# ---- compute box
-
-print "-------------------------- compute box"
-ret = smesh.Compute(mesh,box)
-print ret
-log = mesh.GetLog(0); # no erase trace
-for linelog in log:
- print linelog
-
-salome.sg.updateObjBrowser(1);
-
-# ---- compute edge
-
-##print "-------------------------- compute edge"
-##ret=gen.Compute(mesh,idedge)
-##print ret
-##log=mesh.GetLog(1);
-##for a in log:
-## print a
-
-# ---- add hypothesis to face
-
-# ---- compute face
-
-#print "-------------------------- compute face"
-#ret=gen.Compute(mesh,idface)
-#print ret
-#log=mesh.GetLog(1);
-#for a in log:
-# print a
-
-##shell=salome.IDToObject(ids)
-##submesh=mesh.GetElementsOnShape(shell)
-##ret=mesh.AddHypothesis(shell,algoReg)
-##print ret
-##ret=mesh.AddHypothesis(shell,hypLen1)
-##print ret
-##ret=gen.Compute(mesh,ids)
-##print ret
+++ /dev/null
-# Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-# CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2.1 of the License.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-#
-# See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-#
-#
-#
-# File : SMESH_test3.py
-# Module : SMESH
-
-#import salome
-import math
-import geompy
-
-pi = math.pi
-
-# ---------------------------------------------
-xa = math.sin(pi/12)
-ya = 0
-za = math.cos(pi/12)
-
-xb = 0
-yb = math.sin(pi/18)
-zb = math.cos(pi/18)
-
-xc = math.cos(-pi/18)
-yc = 0
-zc = math.sin(-pi/18)
-
-rc1 = 150
-rc2 = 150
-rc3 = 150
-rc4 = 300
-
-hc1 = 300
-hc2 = 2*hc1
-hc3 = 2*hc1
-hc4 = 2*hc1
-
-# ---------------------------------------------
-point_0 = geompy.MakeVertex(0, 0, 0)
-point_z = geompy.MakeVertex(0, 0, 1)
-
-point_a = geompy.MakeVertex(xa, ya, za)
-point_b = geompy.MakeVertex(xb, yb, zb)
-point_c = geompy.MakeVertex(xc, yc, zc)
-
-dir_z = geompy.MakeVector(point_0, point_z)
-dir_a = geompy.MakeVector(point_0, point_a)
-dir_b = geompy.MakeVector(point_0, point_b)
-dir_c = geompy.MakeVector(point_0, point_c)
-
-axe_z = dir_z
-axe_a = dir_a
-axe_b = dir_b
-axe_c = dir_c
-
-cyl_1 = geompy.MakeCylinder(point_0, dir_z, rc1, hc1)
-
-cyl_t = geompy.MakeCylinder(point_0, dir_a, rc2, hc2)
-cyl_a = geompy.MakeTranslation(cyl_t, 1.2*rc1, 0.1*rc1, -0.5*hc1)
-
-cyl_t = geompy.MakeCylinder(point_0, dir_b, rc3, hc3)
-cyl_b = geompy.MakeTranslation(cyl_t, -1.2*rc1, -0.1*rc1, -0.5*hc1)
-
-cyl_t = geompy.MakeCylinder(point_0, dir_c, rc4, hc4)
-cyl_t = geompy.MakeRotation(cyl_t, axe_c, pi/2)
-cyl_c = geompy.MakeTranslation(cyl_t, -hc1, 0, 0)
-cyl_d = geompy.MakeTranslation(cyl_t, -hc1, 0, 1.3*rc4)
-
-inter_t = geompy.MakeBoolean(cyl_c,cyl_d, 1) # common
-
-blob_t = geompy.MakeBoolean(cyl_1, cyl_a, 2) # cut
-blob_t = geompy.MakeBoolean(blob_t, cyl_b, 2)
-
-blob = geompy.MakeBoolean(blob_t, inter_t, 1) # common
-
-idblob = geompy.addToStudy(blob,"blob")
-#idc = geompy.addToStudy(cyl_c,"cyl_c")
-#idd = geompy.addToStudy(cyl_d,"cyl_d")
+++ /dev/null
-import salome
-import geompy
-import SMESH
-import StdMeshers
-
-smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH")
-smesh.SetCurrentStudy(salome.myStudy)
-
-box = geompy.MakeBox(0., 0., 0., 100., 200., 300.)
-idbox = geompy.addToStudy(box, "box")
-
-subShapeList = geompy.SubShapeAll(box, geompy.ShapeType["FACE"])
-face = subShapeList[0]
-name = geompy.SubShapeName(face, box)
-idface = geompy.addToStudyInFather(box, face, name)
-
-box = salome.IDToObject(idbox)
-face = salome.IDToObject(idface)
-
-hyp1 = smesh.CreateHypothesis("NumberOfSegments", "libStdMeshersEngine.so")
-hyp1.SetNumberOfSegments(10)
-hyp2 = smesh.CreateHypothesis("MaxElementArea", "libStdMeshersEngine.so")
-hyp2.SetMaxElementArea(10)
-hyp3 = smesh.CreateHypothesis("MaxElementArea", "libStdMeshersEngine.so")
-hyp3.SetMaxElementArea(100)
-
-algo1 = smesh.CreateHypothesis("Regular_1D", "libStdMeshersEngine.so")
-algo2 = smesh.CreateHypothesis("MEFISTO_2D", "libStdMeshersEngine.so")
-
-mesh = smesh.CreateMesh(box)
-mesh.AddHypothesis(box,hyp1)
-mesh.AddHypothesis(box,hyp2)
-mesh.AddHypothesis(box,algo1)
-mesh.AddHypothesis(box,algo2)
-
-submesh = mesh.GetSubMesh(face, "SubMeshFace")
-mesh.AddHypothesis(face,hyp1)
-mesh.AddHypothesis(face,hyp3)
-mesh.AddHypothesis(face,algo1)
-mesh.AddHypothesis(face,algo2)
-
-smesh.Compute(mesh,box)
-
-faces = submesh.GetElementsByType(SMESH.FACE)
-if len(faces) > 1:
- print len(faces), len(faces)/2
- group1 = mesh.CreateGroup(SMESH.FACE,"Group of faces")
- group2 = mesh.CreateGroup(SMESH.FACE,"Another group of faces")
- group1.Add(faces[:int(len(faces)/2)])
- group2.Add(faces[int(len(faces)/2):])
-
-salome.sg.updateObjBrowser(1)
+++ /dev/null
-import os
-import re
-
-import batchmode_salome
-import batchmode_geompy
-import batchmode_smesh
-import StdMeshers
-
-smesh = batchmode_smesh.smesh
-smesh.SetCurrentStudy(batchmode_salome.myStudy)
-
-def CreateMesh (theFileName, area, len = None, nbseg = None):
-
- if not(os.path.isfile(theFileName)) or re.search("\.brep$", theFileName) is None :
- print "Incorrect file name !"
- return
-
- if (len is None) and (nbseg is None):
- print "Define length or number of segments !"
- return
-
- if (len is not None) and (nbseg is not None):
- print "Only one Hypothesis (from length and number of segments) can be defined !"
- return
-
-
- # ---- Import shape from BREP file and add it to the study
- shape_mesh = batchmode_geompy.Import(theFileName, "BREP")
- Id_shape = batchmode_geompy.addToStudy(shape_mesh, "shape_mesh")
-
-
- # ---- SMESH
-
- print "-------------------------- create Hypothesis"
- if (len is not None):
- print "-------------------------- LocalLength"
- hypLength1 = smesh.CreateHypothesis("LocalLength", "libStdMeshersEngine.so")
- hypLength1.SetLength(len)
- print "Hypothesis type : ", hypLength1.GetName()
- print "Hypothesis ID : ", hypLength1.GetId()
- print "Hypothesis Value: ", hypLength1.GetLength()
-
- if (nbseg is not None):
- print "-------------------------- NumberOfSegments"
- hypNbSeg1 = smesh.CreateHypothesis("NumberOfSegments", "libStdMeshersEngine.so")
- hypNbSeg1.SetNumberOfSegments(nbseg)
- print "Hypothesis type : ", hypNbSeg1.GetName()
- print "Hypothesis ID : ", hypNbSeg1.GetId()
- print "Hypothesis Value: ", hypNbSeg1.GetNumberOfSegments()
-
- if (area == "LengthFromEdges"):
- print "-------------------------- LengthFromEdges"
- hypLengthFromEdges = smesh.CreateHypothesis("LengthFromEdges", "libStdMeshersEngine.so")
- hypLengthFromEdges.SetMode(1)
- print "Hypothesis type : ", hypLengthFromEdges.GetName()
- print "Hypothesis ID : ", hypLengthFromEdges.GetId()
- print "LengthFromEdges Mode: ", hypLengthFromEdges.GetMode()
-
- else:
- print "-------------------------- MaxElementArea"
- hypArea1 = smesh.CreateHypothesis("MaxElementArea", "libStdMeshersEngine.so")
- hypArea1.SetMaxElementArea(area)
- print "Hypothesis type : ", hypArea1.GetName()
- print "Hypothesis ID : ", hypArea1.GetId()
- print "Hypothesis Value: ", hypArea1.GetMaxElementArea()
-
-
- print "-------------------------- Regular_1D"
- algoReg = smesh.CreateHypothesis("Regular_1D", "libStdMeshersEngine.so")
-
- listHyp = algoReg.GetCompatibleHypothesis()
- for hyp in listHyp:
- print hyp
-
- print "Algo name: ", algoReg.GetName()
- print "Algo ID : ", algoReg.GetId()
-
- print "-------------------------- MEFISTO_2D"
- algoMef = smesh.CreateHypothesis("MEFISTO_2D", "libStdMeshersEngine.so")
-
- listHyp = algoMef.GetCompatibleHypothesis()
- for hyp in listHyp:
- print hyp
-
- print "Algo name: ", algoMef.GetName()
- print "Algo ID : ", algoMef.GetId()
-
-
- # ---- add hypothesis to shape
-
- print "-------------------------- add hypothesis to shape"
- mesh = smesh.CreateMesh(shape_mesh)
-
- ret = mesh.AddHypothesis(shape_mesh, algoReg)
- print "Add Regular_1D algo .... ",
- print ret
-
- if (nbseg is not None):
- ret = mesh.AddHypothesis(shape_mesh, hypNbSeg1)
- print "Add Number Of Segements algo .... ",
- print ret
-
- if (len is not None):
- ret = mesh.AddHypothesis(shape_mesh,hypLength1)
- print "Add Local Length algo .... ",
- print ret
-
- ret = mesh.AddHypothesis(shape_mesh, algoMef)
- print "Add MEFISTO_2D algo....",
- print ret
-
- if (area == "LengthFromEdges"):
- ret = mesh.AddHypothesis( shape_mesh, hypLengthFromEdges) # length from edge
- print "Add Length From Edges algo .... ",
- print ret
- else:
- ret = mesh.AddHypothesis(shape_mesh, hypArea1)
- print "Add Max Triangle Area algo .... ",
- print ret
-
- print "-------------------------- compute mesh"
- ret = smesh.Compute(mesh,shape_mesh)
- print "Compute Mesh .... ",
- print ret
- log = mesh.GetLog(0); # no erase trace
- #for linelog in log:
- # print linelog
-
- print "------------ INFORMATION ABOUT MESH ------------"
-
- print "Number of nodes : ", mesh.NbNodes()
- print "Number of edges : ", mesh.NbEdges()
- print "Number of faces : ", mesh.NbFaces()
- print "Number of triangles: ", mesh.NbTriangles()
-
- return mesh
+++ /dev/null
-# Copyright (C) 2003 CEA/DEN, EDF R&D
-#
-#
-#
-# File : batchmode_smesh.py
-# Author : Oksana TCHEBANOVA
-# Module : SMESH
-# $Header$
-
-from batchmode_salome import *
-from batchmode_geompy import ShapeType
-import SMESH
-
-#--------------------------------------------------------------------------
-modulecatalog = naming_service.Resolve("/Kernel/ModulCatalog")
-
-smesh = lcc.FindOrLoadComponent("FactoryServer", "SMESH")
-myStudyBuilder = myStudy.NewBuilder()
-
-if myStudyBuilder is None:
- raise RuntimeError, " Null myStudyBuilder"
-
-father = myStudy.FindComponent("SMESH")
-if father is None:
- father = myStudyBuilder.NewComponent("SMESH")
- FName = myStudyBuilder.FindOrCreateAttribute(father, "AttributeName")
- Comp = modulecatalog.GetComponent("SMESH")
- FName.SetValue(Comp._get_componentusername())
- aPixmap = myStudyBuilder.FindOrCreateAttribute(father, "AttributePixMap")
- aPixmap.SetPixMap("ICON_OBJBROWSER_Mesh")
-
-myStudyBuilder.DefineComponentInstance(father,smesh)
-
-mySComponentMesh = father._narrow(SALOMEDS.SComponent)
-
-Tag_HypothesisRoot = 1
-Tag_AlgorithmsRoot = 2
-
-Tag_RefOnShape = 1
-Tag_RefOnAppliedHypothesis = 2
-Tag_RefOnAppliedAlgorithms = 3
-
-Tag_SubMeshOnVertex = 4
-Tag_SubMeshOnEdge = 5
-Tag_SubMeshOnFace = 6
-Tag_SubMeshOnSolid = 7
-Tag_SubMeshOnCompound = 8
-
-Tag = {"HypothesisRoot":1,"AlgorithmsRoot":2,"RefOnShape":1,"RefOnAppliedHypothesis":2,"RefOnAppliedAlgorithms":3,"SubMeshOnVertex":4,"SubMeshOnEdge":5,"SubMeshOnFace":6,"SubMeshOnSolid":7,"SubMeshOnCompound":8}
-
-#------------------------------------------------------------
-def Init():
- pass
-#------------------------------------------------------------
-def AddNewMesh(IOR):
- # VSR: added temporarily - objects are published automatically by the engine
- aSO = myStudy.FindObjectIOR( IOR )
- if aSO is not None:
- return aSO.GetID()
- # VSR ######################################################################
-
- res,HypothesisRoot = mySComponentMesh.FindSubObject ( Tag_HypothesisRoot )
- if HypothesisRoot is None or res == 0:
- HypothesisRoot = myStudyBuilder.NewObjectToTag(mySComponentMesh, Tag_HypothesisRoot)
- aName = myStudyBuilder.FindOrCreateAttribute(HypothesisRoot, "AttributeName")
- aName.SetValue("Hypotheses")
- aPixmap = myStudyBuilder.FindOrCreateAttribute(HypothesisRoot, "AttributePixMap")
- aPixmap.SetPixMap( "mesh_tree_hypo.png" )
- aSelAttr = myStudyBuilder.FindOrCreateAttribute(HypothesisRoot, "AttributeSelectable")
- aSelAttr.SetSelectable(0)
-
- res, AlgorithmsRoot = mySComponentMesh.FindSubObject (Tag_AlgorithmsRoot)
- if AlgorithmsRoot is None or res == 0:
- AlgorithmsRoot = myStudyBuilder.NewObjectToTag (mySComponentMesh, Tag_AlgorithmsRoot)
- aName = myStudyBuilder.FindOrCreateAttribute(AlgorithmsRoot, "AttributeName")
- aName.SetValue("Algorithms")
- aPixmap = myStudyBuilder.FindOrCreateAttribute(AlgorithmsRoot, "AttributePixMap")
- aPixmap.SetPixMap( "mesh_tree_algo.png" )
- aSelAttr = myStudyBuilder.FindOrCreateAttribute(AlgorithmsRoot, "AttributeSelectable")
- aSelAttr.SetSelectable(0)
-
- HypothesisRoot = HypothesisRoot._narrow(SALOMEDS.SObject)
- newMesh = myStudyBuilder.NewObject(mySComponentMesh)
- aPixmap = myStudyBuilder.FindOrCreateAttribute(newMesh, "AttributePixMap")
- aPixmap.SetPixMap( "mesh_tree_mesh.png" )
- anIOR = myStudyBuilder.FindOrCreateAttribute(newMesh, "AttributeIOR")
- anIOR.SetValue(IOR)
- return newMesh.GetID()
-
-#------------------------------------------------------------
-def AddNewHypothesis(IOR):
- # VSR: added temporarily - objects are published automatically by the engine
- aSO = myStudy.FindObjectIOR( IOR )
- if aSO is not None:
- return aSO.GetID()
- # VSR ######################################################################
-
- res, HypothesisRoot = mySComponentMesh.FindSubObject (Tag_HypothesisRoot)
- if HypothesisRoot is None or res == 0:
- HypothesisRoot = myStudyBuilder.NewObjectToTag (mySComponentMesh, Tag_HypothesisRoot)
- aName = myStudyBuilder.FindOrCreateAttribute(HypothesisRoot, "AttributeName")
- aName.SetValue("Hypotheses")
- aSelAttr = myStudyBuilder.FindOrCreateAttribute(HypothesisRoot, "AttributeSelectable")
- aSelAttr.SetSelectable(0)
- aPixmap = myStudyBuilder.FindOrCreateAttribute(HypothesisRoot, "AttributePixMap")
- aPixmap.SetPixMap( "mesh_tree_hypo.png" )
-
- # Add New Hypothesis
- newHypo = myStudyBuilder.NewObject(HypothesisRoot)
- aPixmap = myStudyBuilder.FindOrCreateAttribute(newHypo, "AttributePixMap")
- H = orb.string_to_object(IOR)
- aType = H.GetName()
- aPixmap.SetPixMap( "mesh_tree_hypo.png_" + aType )
- anIOR = myStudyBuilder.FindOrCreateAttribute(newHypo, "AttributeIOR")
- anIOR.SetValue(IOR)
- return newHypo.GetID()
-
-#------------------------------------------------------------
-def AddNewAlgorithms(IOR):
- # VSR: added temporarily - objects are published automatically by the engine
- aSO = myStudy.FindObjectIOR( IOR )
- if aSO is not None:
- return aSO.GetID()
- # VSR ######################################################################
-
- res, AlgorithmsRoot = mySComponentMesh.FindSubObject (Tag_AlgorithmsRoot)
- if AlgorithmsRoot is None or res == 0:
- AlgorithmsRoot = myStudyBuilde.NewObjectToTag (mySComponentMesh, Tag_AlgorithmsRoot)
- aName = myStudyBuilder.FindOrCreateAttribute(AlgorithmsRoot, "AttributeName")
- aName.SetValue("Algorithms")
- aSelAttr = myStudyBuilder.FindOrCreateAttribute(AlgorithmsRoot, "AttributeSelectable")
- aSelAttr.SetSelectable(0)
- aPixmap = myStudyBuilder.FindOrCreateAttribute(AlgorithmsRoot, "AttributePixMap")
- aPixmap.SetPixMap( "mesh_tree_algo.png" )
-
- # Add New Algorithms
- newHypo = myStudyBuilder.NewObject(AlgorithmsRoot)
- aPixmap = myStudyBuilder.FindOrCreateAttribute(newHypo, "AttributePixMap")
- aPixmap = anAttr._narrow(SALOMEDS.AttributePixMap)
- H = orb.string_to_object(IOR)
- aType = H.GetName(); #QString in fact
- aPixmap.SetPixMap( "mesh_tree_algo.png_" + aType )
- anIOR = myStudyBuilder.FindOrCreateAttribute(newHypo, "AttributeIOR")
- anIOR.SetValue(IOR)
- return newHypo.GetID()
-
-
-#------------------------------------------------------------
-def SetShape(ShapeEntry, MeshEntry):
- SO_MorSM = myStudy.FindObjectID( MeshEntry )
- SO_GeomShape = myStudy.FindObjectID( ShapeEntry )
-
- if SO_MorSM is not None and SO_GeomShape is not None :
- # VSR: added temporarily - shape reference is published automatically by the engine
- res, Ref = SO_MorSM.FindSubObject( Tag_RefOnShape )
- if res == 1 :
- return
- # VSR ######################################################################
-
- SO = myStudyBuilder.NewObjectToTag (SO_MorSM, Tag_RefOnShape)
- myStudyBuilder.Addreference (SO,SO_GeomShape)
-
-
-#------------------------------------------------------------
-def SetHypothesis(Mesh_Or_SubMesh_Entry, Hypothesis_Entry):
- SO_MorSM = myStudy.FindObjectID( Mesh_Or_SubMesh_Entry )
- SO_Hypothesis = myStudy.FindObjectID( Hypothesis_Entry )
-
- if SO_MorSM is not None and SO_Hypothesis is not None :
-
- #Find or Create Applied Hypothesis root
- res, AHR = SO_MorSM.FindSubObject (Tag_RefOnAppliedHypothesis)
- if AHR is None or res == 0:
- AHR = myStudyBuilder.NewObjectToTag (SO_MorSM, Tag_RefOnAppliedHypothesis)
- aName = myStudyBuilder.FindOrCreateAttribute(AHR, "AttributeName")
-
- # The same name as in SMESH_Mesh_i::AddHypothesis() ##################
- aName.SetValue("Applied hypotheses")
-
- aSelAttr = myStudyBuilder.FindOrCreateAttribute(AHR, "AttributeSelectable")
- aSelAttr.SetSelectable(0)
- aPixmap = myStudyBuilder.FindOrCreateAttribute(AHR, "AttributePixMap")
- aPixmap.SetPixMap( "mesh_tree_hypo.png" )
-
- # VSR: added temporarily - reference to applied hypothesis is published automatically by the engine
- else :
- it = myStudy.NewChildIterator(AHR)
- while it.More() :
- res, Ref = it.Value().ReferencedObject()
- if res and Ref is not None and Ref.GetID() == Hypothesis_Entry :
- return
- it.Next()
- # VSR ######################################################################
-
- SO = myStudyBuilder.NewObject(AHR)
- myStudyBuilder.Addreference (SO,SO_Hypothesis)
-
-#------------------------------------------------------------
-def SetAlgorithms(Mesh_Or_SubMesh_Entry, Algorithms_Entry):
- SO_MorSM = myStudy.FindObjectID( Mesh_Or_SubMesh_Entry )
- SO_Algorithms = myStudy.FindObjectID( Algorithms_Entry )
- if SO_MorSM != None and SO_Algorithms != None :
- #Find or Create Applied Algorithms root
- res, AHR = SO_MorSM.FindSubObject (Tag_RefOnAppliedAlgorithms)
- if AHR is None or res == 0:
- AHR = myStudyBuilder.NewObjectToTag (SO_MorSM, Tag_RefOnAppliedAlgorithms)
- aName = myStudyBuilder.FindOrCreateAttribute(AHR, "AttributeName")
-
- # The same name as in SMESH_Mesh_i::AddHypothesis() ##################
- aName.SetValue("Applied algorithms")
-
- aSelAttr = myStudyBuilder.FindOrCreateAttribute(AHR, "AttributeSelectable")
- aSelAttr.SetSelectable(0)
- aPixmap = myStudyBuilder.FindOrCreateAttribute(AHR, "AttributePixMap")
- aPixmap.SetPixMap( "mesh_tree_algo.png" )
-
- # VSR: added temporarily - reference to applied hypothesis is published automatically by the engine
- else :
- it = myStudy.NewChildIterator(AHR)
- while it.More() :
- res, Ref = it.Value().ReferencedObject()
- if res and Ref is not None and Ref.GetID() == Algorithms_Entry :
- return
- it.Next()
- # VSR ######################################################################
-
- SO = myStudyBuilder.NewObject(AHR)
- myStudyBuilder.Addreference (SO,SO_Algorithms)
-
-
-#------------------------------------------------------------
-def UnSetHypothesis( Applied_Hypothesis_Entry ):
- SO_Applied_Hypothesis = myStudy.FindObjectID( Applied_Hypothesis_Entry )
- if SO_Applied_Hypothesis :
- myStudyBuilder.RemoveObject(SO_Applied_Hypothesis)
-
-
-#------------------------------------------------------------
-def AddSubMesh ( SO_Mesh_Entry, SM_IOR, ST):
- # VSR: added temporarily - objects are published automatically by the engine
- aSO = myStudy.FindObjectIOR( SM_IOR )
- if aSO is not None:
- return aSO.GetID()
- # VSR ######################################################################
-
- SO_Mesh = myStudy.FindObjectID( SO_Mesh_Entry )
- if ( SO_Mesh ) :
-
- if ST == ShapeType["COMPSOLID"] :
- Tag_Shape = Tag_SubMeshOnSolid
- Name = "SubMeshes on Solid"
- elif ST == ShapeType["FACE"] :
- Tag_Shape = Tag_SubMeshOnFace
- Name = "SubMeshes on Face"
- elif ST == ShapeType["EDGE"] :
- Tag_Shape = Tag_SubMeshOnEdge
- Name = "SubMeshes on Edge"
- elif ST == ShapeType["VERTEX"] :
- Tag_Shape = Tag_SubMeshOnVertex
- Name = "SubMeshes on Vertex"
- else :
- Tag_Shape = Tag_SubMeshOnCompound
- Name = "SubMeshes on Compound"
-
- res, SubmeshesRoot = SO_Mesh.FindSubObject (Tag_Shape)
- if SubmeshesRoot is None or res == 0:
- SubmeshesRoot = myStudyBuilder.NewObjectToTag (SO_Mesh, Tag_Shape)
- aName = myStudyBuilder.FindOrCreateAttribute(SubmeshesRoot, "AttributeName")
- aName.SetValue(Name)
- aSelAttr = myStudyBuilder.FindOrCreateAttribute(SubmeshesRoot, "AttributeSelectable")
- aSelAttr.SetSelectable(0)
-
- SO = myStudyBuilder.NewObject (SubmeshesRoot)
- anIOR = myStudyBuilder.FindOrCreateAttribute(SO, "AttributeIOR")
- anIOR.SetValue(SM_IOR)
- return SO.GetID()
-
- return None
-
-#------------------------------------------------------------
-def AddSubMeshOnShape (Mesh_Entry, GeomShape_Entry, SM_IOR, ST) :
- # VSR: added temporarily - objects are published automatically by the engine
- aSO = myStudy.FindObjectIOR( SM_IOR )
- if aSO is not None:
- return aSO.GetID()
- # VSR ######################################################################
- SO_GeomShape = myStudy.FindObjectID( GeomShape_Entry )
- if SO_GeomShape != None :
- SM_Entry = AddSubMesh (Mesh_Entry,SM_IOR,ST)
- SO_SM = myStudy.FindObjectID( SM_Entry )
-
- if SO_SM != None :
- SetShape (GeomShape_Entry, SM_Entry)
- return SM_Entry
-
- return None
-
-
-#------------------------------------------------------------
-def SetName(Entry, Name):
- SO = myStudy.FindObjectID( Entry )
- if SO != None :
- aName = myStudyBuilder.FindOrCreateAttribute(SO, "AttributeName")
- aName.SetValue(Name)
+++ /dev/null
-# CEA/LGLS 2005, Francis KLOSS (OCC)
-# ==================================
-
-# Load all examples
-# -----------------
-
-import ex01_cube2build
-import ex02_cube2primitive
-import ex03_cube2partition
-import ex04_cube5tetraHexa
-import ex05_hole1build
-import ex06_hole1boolean
-import ex07_hole1partition
-import ex08_hole2build
-import ex09_grid4build
-import ex10_grid4geometry
-import ex11_grid3partition
-import ex12_grid17partition
-import ex13_hole1partial
-import ex14_cyl1holed
-import ex15_cyl2geometry
-import ex16_cyl2complementary
-import ex17_dome1
-import ex18_dome2
-import ex19_sphereINcube
+++ /dev/null
-# CEA/LGLS 2004-2005, Francis KLOSS (OCC)
-# =======================================
-
-from geompy import *
-
-import smesh
-
-# Geometry
-# ========
-
-# A small cube centered and put on a great cube build by points, edges, faces and solids
-
-# Points
-# ------
-
-greatPoint111 = MakeVertex( 0, 0, 0)
-greatPoint211 = MakeVertex(10, 0, 0)
-greatPoint311 = MakeVertex(20, 0, 0)
-greatPoint411 = MakeVertex(30, 0, 0)
-
-greatPoint121 = MakeVertex( 0, 10, 0)
-greatPoint221 = MakeVertex(10, 10, 0)
-greatPoint321 = MakeVertex(20, 10, 0)
-greatPoint421 = MakeVertex(30, 10, 0)
-
-greatPoint112 = MakeVertex( 0, 0, 10)
-greatPoint212 = MakeVertex(10, 0, 10)
-greatPoint312 = MakeVertex(20, 0, 10)
-greatPoint412 = MakeVertex(30, 0, 10)
-
-greatPoint122 = MakeVertex( 0, 10, 10)
-greatPoint222 = MakeVertex(10, 10, 10)
-greatPoint322 = MakeVertex(20, 10, 10)
-greatPoint422 = MakeVertex(30, 10, 10)
-
-greatPoint113 = MakeVertex( 0, 0, 20)
-greatPoint213 = MakeVertex(10, 0, 20)
-greatPoint313 = MakeVertex(20, 0, 20)
-greatPoint413 = MakeVertex(30, 0, 20)
-
-greatPoint123 = MakeVertex( 0, 10, 20)
-greatPoint223 = MakeVertex(10, 10, 20)
-greatPoint323 = MakeVertex(20, 10, 20)
-greatPoint423 = MakeVertex(30, 10, 20)
-
-greatPoint114 = MakeVertex( 0, 0, 30)
-greatPoint214 = MakeVertex(10, 0, 30)
-greatPoint314 = MakeVertex(20, 0, 30)
-greatPoint414 = MakeVertex(30, 0, 30)
-
-greatPoint124 = MakeVertex( 0, 10, 30)
-greatPoint224 = MakeVertex(10, 10, 30)
-greatPoint324 = MakeVertex(20, 10, 30)
-greatPoint424 = MakeVertex(30, 10, 30)
-
-
-smallPoint111 = greatPoint222
-smallPoint211 = greatPoint322
-smallPoint121 = MakeVertex(10, 20, 10)
-smallPoint221 = MakeVertex(20, 20, 10)
-
-smallPoint112 = greatPoint223
-smallPoint212 = greatPoint323
-smallPoint122 = MakeVertex(10, 20, 20)
-smallPoint222 = MakeVertex(20, 20, 20)
-
-# Edges
-# -----
-
-smallEdgeX11 = MakeEdge(smallPoint111, smallPoint211)
-smallEdgeX21 = MakeEdge(smallPoint121, smallPoint221)
-smallEdgeX12 = MakeEdge(smallPoint112, smallPoint212)
-smallEdgeX22 = MakeEdge(smallPoint122, smallPoint222)
-
-smallEdgeY11 = MakeEdge(smallPoint111, smallPoint121)
-smallEdgeY21 = MakeEdge(smallPoint211, smallPoint221)
-smallEdgeY12 = MakeEdge(smallPoint112, smallPoint122)
-smallEdgeY22 = MakeEdge(smallPoint212, smallPoint222)
-
-smallEdgeZ11 = MakeEdge(smallPoint111, smallPoint112)
-smallEdgeZ21 = MakeEdge(smallPoint211, smallPoint212)
-smallEdgeZ12 = MakeEdge(smallPoint121, smallPoint122)
-smallEdgeZ22 = MakeEdge(smallPoint221, smallPoint222)
-
-
-greatEdgeX111 = MakeEdge(greatPoint111, greatPoint211)
-greatEdgeX211 = MakeEdge(greatPoint211, greatPoint311)
-greatEdgeX311 = MakeEdge(greatPoint311, greatPoint411)
-greatEdgeX121 = MakeEdge(greatPoint121, greatPoint221)
-greatEdgeX221 = MakeEdge(greatPoint221, greatPoint321)
-greatEdgeX321 = MakeEdge(greatPoint321, greatPoint421)
-
-greatEdgeX112 = MakeEdge(greatPoint112, greatPoint212)
-greatEdgeX212 = MakeEdge(greatPoint212, greatPoint312)
-greatEdgeX312 = MakeEdge(greatPoint312, greatPoint412)
-greatEdgeX122 = MakeEdge(greatPoint122, greatPoint222)
-greatEdgeX222 = smallEdgeX11
-greatEdgeX322 = MakeEdge(greatPoint322, greatPoint422)
-
-greatEdgeX113 = MakeEdge(greatPoint113, greatPoint213)
-greatEdgeX213 = MakeEdge(greatPoint213, greatPoint313)
-greatEdgeX313 = MakeEdge(greatPoint313, greatPoint413)
-greatEdgeX123 = MakeEdge(greatPoint123, greatPoint223)
-greatEdgeX223 = smallEdgeX12
-greatEdgeX323 = MakeEdge(greatPoint323, greatPoint423)
-
-greatEdgeX114 = MakeEdge(greatPoint114, greatPoint214)
-greatEdgeX214 = MakeEdge(greatPoint214, greatPoint314)
-greatEdgeX314 = MakeEdge(greatPoint314, greatPoint414)
-greatEdgeX124 = MakeEdge(greatPoint124, greatPoint224)
-greatEdgeX224 = MakeEdge(greatPoint224, greatPoint324)
-greatEdgeX324 = MakeEdge(greatPoint324, greatPoint424)
-
-greatEdgeY11 = MakeEdge(greatPoint111, greatPoint121)
-greatEdgeY21 = MakeEdge(greatPoint211, greatPoint221)
-greatEdgeY31 = MakeEdge(greatPoint311, greatPoint321)
-greatEdgeY41 = MakeEdge(greatPoint411, greatPoint421)
-
-greatEdgeY12 = MakeEdge(greatPoint112, greatPoint122)
-greatEdgeY22 = MakeEdge(greatPoint212, greatPoint222)
-greatEdgeY32 = MakeEdge(greatPoint312, greatPoint322)
-greatEdgeY42 = MakeEdge(greatPoint412, greatPoint422)
-
-greatEdgeY13 = MakeEdge(greatPoint113, greatPoint123)
-greatEdgeY23 = MakeEdge(greatPoint213, greatPoint223)
-greatEdgeY33 = MakeEdge(greatPoint313, greatPoint323)
-greatEdgeY43 = MakeEdge(greatPoint413, greatPoint423)
-
-greatEdgeY14 = MakeEdge(greatPoint114, greatPoint124)
-greatEdgeY24 = MakeEdge(greatPoint214, greatPoint224)
-greatEdgeY34 = MakeEdge(greatPoint314, greatPoint324)
-greatEdgeY44 = MakeEdge(greatPoint414, greatPoint424)
-
-greatEdgeZ111 = MakeEdge(greatPoint111, greatPoint112)
-greatEdgeZ211 = MakeEdge(greatPoint211, greatPoint212)
-greatEdgeZ311 = MakeEdge(greatPoint311, greatPoint312)
-greatEdgeZ411 = MakeEdge(greatPoint411, greatPoint412)
-
-greatEdgeZ121 = MakeEdge(greatPoint121, greatPoint122)
-greatEdgeZ221 = MakeEdge(greatPoint221, greatPoint222)
-greatEdgeZ321 = MakeEdge(greatPoint321, greatPoint322)
-greatEdgeZ421 = MakeEdge(greatPoint421, greatPoint422)
-
-greatEdgeZ112 = MakeEdge(greatPoint112, greatPoint113)
-greatEdgeZ212 = MakeEdge(greatPoint212, greatPoint213)
-greatEdgeZ312 = MakeEdge(greatPoint312, greatPoint313)
-greatEdgeZ412 = MakeEdge(greatPoint412, greatPoint413)
-
-greatEdgeZ122 = MakeEdge(greatPoint122, greatPoint123)
-greatEdgeZ222 = smallEdgeZ11
-greatEdgeZ322 = smallEdgeZ21
-greatEdgeZ422 = MakeEdge(greatPoint422, greatPoint423)
-
-greatEdgeZ113 = MakeEdge(greatPoint113, greatPoint114)
-greatEdgeZ213 = MakeEdge(greatPoint213, greatPoint214)
-greatEdgeZ313 = MakeEdge(greatPoint313, greatPoint314)
-greatEdgeZ413 = MakeEdge(greatPoint413, greatPoint414)
-
-greatEdgeZ123 = MakeEdge(greatPoint123, greatPoint124)
-greatEdgeZ223 = MakeEdge(greatPoint223, greatPoint224)
-greatEdgeZ323 = MakeEdge(greatPoint323, greatPoint324)
-greatEdgeZ423 = MakeEdge(greatPoint423, greatPoint424)
-
-# Faces
-# -----
-
-smallFaceX1 = MakeQuad(smallEdgeY11, smallEdgeZ11, smallEdgeY12, smallEdgeZ12)
-smallFaceX2 = MakeQuad(smallEdgeY21, smallEdgeZ21, smallEdgeY22, smallEdgeZ22)
-smallFaceY1 = MakeQuad(smallEdgeX11, smallEdgeZ11, smallEdgeX12, smallEdgeZ21)
-smallFaceY2 = MakeQuad(smallEdgeX21, smallEdgeZ12, smallEdgeX22, smallEdgeZ22)
-smallFaceZ1 = MakeQuad(smallEdgeX11, smallEdgeY11, smallEdgeX21, smallEdgeY21)
-smallFaceZ2 = MakeQuad(smallEdgeX12, smallEdgeY12, smallEdgeX22, smallEdgeY22)
-
-
-greatFaceX11 = MakeQuad(greatEdgeY11, greatEdgeZ111, greatEdgeY12, greatEdgeZ121)
-greatFaceX21 = MakeQuad(greatEdgeY21, greatEdgeZ211, greatEdgeY22, greatEdgeZ221)
-greatFaceX31 = MakeQuad(greatEdgeY31, greatEdgeZ311, greatEdgeY32, greatEdgeZ321)
-greatFaceX41 = MakeQuad(greatEdgeY41, greatEdgeZ411, greatEdgeY42, greatEdgeZ421)
-
-greatFaceX12 = MakeQuad(greatEdgeY12, greatEdgeZ112, greatEdgeY13, greatEdgeZ122)
-greatFaceX22 = MakeQuad(greatEdgeY22, greatEdgeZ212, greatEdgeY23, greatEdgeZ222)
-greatFaceX32 = MakeQuad(greatEdgeY32, greatEdgeZ312, greatEdgeY33, greatEdgeZ322)
-greatFaceX42 = MakeQuad(greatEdgeY42, greatEdgeZ412, greatEdgeY43, greatEdgeZ422)
-
-greatFaceX13 = MakeQuad(greatEdgeY13, greatEdgeZ113, greatEdgeY14, greatEdgeZ123)
-greatFaceX23 = MakeQuad(greatEdgeY23, greatEdgeZ213, greatEdgeY24, greatEdgeZ223)
-greatFaceX33 = MakeQuad(greatEdgeY33, greatEdgeZ313, greatEdgeY34, greatEdgeZ323)
-greatFaceX43 = MakeQuad(greatEdgeY43, greatEdgeZ413, greatEdgeY44, greatEdgeZ423)
-
-greatFaceY111 = MakeQuad(greatEdgeX111, greatEdgeZ111, greatEdgeX112, greatEdgeZ211)
-greatFaceY211 = MakeQuad(greatEdgeX211, greatEdgeZ211, greatEdgeX212, greatEdgeZ311)
-greatFaceY311 = MakeQuad(greatEdgeX311, greatEdgeZ311, greatEdgeX312, greatEdgeZ411)
-greatFaceY121 = MakeQuad(greatEdgeX121, greatEdgeZ121, greatEdgeX122, greatEdgeZ221)
-greatFaceY221 = MakeQuad(greatEdgeX221, greatEdgeZ221, greatEdgeX222, greatEdgeZ321)
-greatFaceY321 = MakeQuad(greatEdgeX321, greatEdgeZ321, greatEdgeX322, greatEdgeZ421)
-
-greatFaceY112 = MakeQuad(greatEdgeX112, greatEdgeZ112, greatEdgeX113, greatEdgeZ212)
-greatFaceY212 = MakeQuad(greatEdgeX212, greatEdgeZ212, greatEdgeX213, greatEdgeZ312)
-greatFaceY312 = MakeQuad(greatEdgeX312, greatEdgeZ312, greatEdgeX313, greatEdgeZ412)
-greatFaceY122 = MakeQuad(greatEdgeX122, greatEdgeZ122, greatEdgeX123, greatEdgeZ222)
-greatFaceY222 = smallFaceY1
-greatFaceY322 = MakeQuad(greatEdgeX322, greatEdgeZ322, greatEdgeX323, greatEdgeZ422)
-
-greatFaceY113 = MakeQuad(greatEdgeX113, greatEdgeZ113, greatEdgeX114, greatEdgeZ213)
-greatFaceY213 = MakeQuad(greatEdgeX213, greatEdgeZ213, greatEdgeX214, greatEdgeZ313)
-greatFaceY313 = MakeQuad(greatEdgeX313, greatEdgeZ313, greatEdgeX314, greatEdgeZ413)
-greatFaceY123 = MakeQuad(greatEdgeX123, greatEdgeZ123, greatEdgeX124, greatEdgeZ223)
-greatFaceY223 = MakeQuad(greatEdgeX223, greatEdgeZ223, greatEdgeX224, greatEdgeZ323)
-greatFaceY323 = MakeQuad(greatEdgeX323, greatEdgeZ323, greatEdgeX324, greatEdgeZ423)
-
-greatFaceZ11 = MakeQuad(greatEdgeX111, greatEdgeY11, greatEdgeX121, greatEdgeY21)
-greatFaceZ21 = MakeQuad(greatEdgeX211, greatEdgeY21, greatEdgeX221, greatEdgeY31)
-greatFaceZ31 = MakeQuad(greatEdgeX311, greatEdgeY31, greatEdgeX321, greatEdgeY41)
-
-greatFaceZ12 = MakeQuad(greatEdgeX112, greatEdgeY12, greatEdgeX122, greatEdgeY22)
-greatFaceZ22 = MakeQuad(greatEdgeX212, greatEdgeY22, greatEdgeX222, greatEdgeY32)
-greatFaceZ32 = MakeQuad(greatEdgeX312, greatEdgeY32, greatEdgeX322, greatEdgeY42)
-
-greatFaceZ13 = MakeQuad(greatEdgeX113, greatEdgeY13, greatEdgeX123, greatEdgeY23)
-greatFaceZ23 = MakeQuad(greatEdgeX213, greatEdgeY23, greatEdgeX223, greatEdgeY33)
-greatFaceZ33 = MakeQuad(greatEdgeX313, greatEdgeY33, greatEdgeX323, greatEdgeY43)
-
-greatFaceZ14 = MakeQuad(greatEdgeX114, greatEdgeY14, greatEdgeX124, greatEdgeY24)
-greatFaceZ24 = MakeQuad(greatEdgeX214, greatEdgeY24, greatEdgeX224, greatEdgeY34)
-greatFaceZ34 = MakeQuad(greatEdgeX314, greatEdgeY34, greatEdgeX324, greatEdgeY44)
-
-# Solids
-# ------
-
-smallBlock = MakeHexa(smallFaceX1, smallFaceX2, smallFaceY1, smallFaceY2, smallFaceZ1, smallFaceZ2)
-
-greatBlock11 = MakeHexa(greatFaceX11, greatFaceX21, greatFaceY111, greatFaceY121, greatFaceZ11, greatFaceZ12)
-greatBlock21 = MakeHexa(greatFaceX21, greatFaceX31, greatFaceY211, greatFaceY221, greatFaceZ21, greatFaceZ22)
-greatBlock31 = MakeHexa(greatFaceX31, greatFaceX41, greatFaceY311, greatFaceY321, greatFaceZ31, greatFaceZ32)
-
-greatBlock12 = MakeHexa(greatFaceX12, greatFaceX22, greatFaceY112, greatFaceY122, greatFaceZ12, greatFaceZ13)
-greatBlock22 = MakeHexa(greatFaceX22, greatFaceX32, greatFaceY212, greatFaceY222, greatFaceZ22, greatFaceZ23)
-greatBlock32 = MakeHexa(greatFaceX32, greatFaceX42, greatFaceY312, greatFaceY322, greatFaceZ32, greatFaceZ33)
-
-greatBlock13 = MakeHexa(greatFaceX13, greatFaceX23, greatFaceY113, greatFaceY123, greatFaceZ13, greatFaceZ14)
-greatBlock23 = MakeHexa(greatFaceX23, greatFaceX33, greatFaceY213, greatFaceY223, greatFaceZ23, greatFaceZ24)
-greatBlock33 = MakeHexa(greatFaceX33, greatFaceX43, greatFaceY313, greatFaceY323, greatFaceZ33, greatFaceZ34)
-
-# Compound
-# --------
-
-c_l = []
-c_l.append(smallBlock)
-c_l.append(greatBlock11)
-c_l.append(greatBlock21)
-c_l.append(greatBlock31)
-c_l.append(greatBlock12)
-c_l.append(greatBlock22)
-c_l.append(greatBlock32)
-c_l.append(greatBlock13)
-c_l.append(greatBlock23)
-c_l.append(greatBlock33)
-
-piece = MakeCompound(c_l)
-
-# Add in study
-# ------------
-
-piece_id = addToStudy(piece, "ex01_cube2build")
-
-# Meshing
-# =======
-
-# Create hexahedrical mesh on piece
-# ---------------------------------
-
-hexa = smesh.Mesh(piece, "ex01_cube2build:hexa")
-
-algo = hexa.Segment()
-algo.NumberOfSegments(4)
-
-hexa.Quadrangle()
-
-hexa.Hexahedron()
-
-# Create local hypothesis
-# -----------------------
-
-algo = hexa.Segment(greatEdgeX111)
-
-algo.Arithmetic1D(1, 4)
-
-algo.Propagation()
-
-# Compute the mesh
-# ----------------
-
-hexa.Compute()
+++ /dev/null
-# CEA/LGLS 2004-2005, Francis KLOSS (OCC)
-# =======================================
-
-from geompy import *
-
-import smesh
-
-# Geometry
-# ========
-
-# A small cube centered and put on a great cube build by primitive geometric functionalities
-
-# Values
-# ------
-
-ox = 0
-oy = 0
-oz = 0
-
-arete = 10
-
-# Points
-# ------
-
-blockPoint111 = MakeVertex(ox , oy, oz)
-blockPoint211 = MakeVertex(ox+arete, oy, oz)
-blockPoint112 = MakeVertex(ox , oy, oz+arete)
-blockPoint212 = MakeVertex(ox+arete, oy, oz+arete)
-
-# Face and solid
-# --------------
-
-blockFace1 = MakeQuad4Vertices(blockPoint111, blockPoint211, blockPoint212, blockPoint112)
-
-blockSolid11 = MakePrismVecH(blockFace1, MakeVectorDXDYDZ(0, 1, 0), arete)
-
-# Translations
-# ------------
-
-blockSolid21 = MakeTranslation(blockSolid11, arete, 0, 0)
-blockSolid31 = MakeTranslation(blockSolid21, arete, 0, 0)
-
-blockSolid12 = MakeTranslation(blockSolid11, 0, 0, arete)
-blockSolid22 = MakeTranslation(blockSolid12, arete, 0, 0)
-blockSolid32 = MakeTranslation(blockSolid22, arete, 0, 0)
-
-blockSolid13 = MakeTranslation(blockSolid12, 0, 0, arete)
-blockSolid23 = MakeTranslation(blockSolid13, arete, 0, 0)
-blockSolid33 = MakeTranslation(blockSolid23, arete, 0, 0)
-
-blockSolid111 = MakeTranslation(blockSolid22, 0, arete, 0)
-
-# Compound and glue
-# -----------------
-
-c_l = []
-c_l.append(blockSolid11)
-c_l.append(blockSolid21)
-c_l.append(blockSolid31)
-c_l.append(blockSolid12)
-c_l.append(blockSolid22)
-c_l.append(blockSolid32)
-c_l.append(blockSolid13)
-c_l.append(blockSolid23)
-c_l.append(blockSolid33)
-c_l.append(blockSolid111)
-
-c_cpd = MakeCompound(c_l)
-
-piece = MakeGlueFaces(c_cpd, 1.e-5)
-
-# Add in study
-# ------------
-
-piece_id = addToStudy(piece, "ex02_cube2primitive")
-
-# Meshing
-# =======
-
-# Create hexahedrical mesh on piece
-# ---------------------------------
-
-hexa = smesh.Mesh(piece, "ex02_cube2primitive:hexa")
-
-algo = hexa.Segment()
-algo.LocalLength(1)
-
-hexa.Quadrangle()
-
-hexa.Hexahedron()
-
-# Compute the mesh
-# ----------------
-
-hexa.Compute()
+++ /dev/null
-# CEA/LGLS 2004-2005, Francis KLOSS (OCC)
-# =======================================
-
-from geompy import *
-
-import smesh
-
-# Geometry
-# ========
-
-# A small cube centered and put on a great cube build with partition
-
-# Values
-# ------
-
-g_ox = 0
-g_oy = 0
-g_oz = 0
-
-g_arete = 10
-
-g_trim = 1000
-
-# Points
-# ------
-
-v_arete2 = g_arete*2
-v_arete3 = g_arete*3
-
-v_1 = MakeVertex(g_ox , g_oy , g_oz )
-v_2 = MakeVertex(g_ox+v_arete3, g_oy+g_arete , g_oz+v_arete3)
-
-v_3 = MakeVertex(g_ox+g_arete , g_oy+g_arete , g_oz+g_arete )
-v_4 = MakeVertex(g_ox+v_arete2, g_oy+v_arete2, g_oz+v_arete2)
-
-# Solids
-# ------
-
-s_base = MakeBoxTwoPnt(v_1, v_2)
-s_haut = MakeBoxTwoPnt(v_3, v_4)
-
-# Partition
-# ---------
-
-p_dir1 = MakeVectorDXDYDZ(1, 0, 0)
-p_dir2 = MakeVectorDXDYDZ(0, 0, 1)
-p_dir3 = MakeVectorDXDYDZ(0, 1, 0)
-
-p_tools = []
-
-p_tools.append(MakePlane(v_3, p_dir1, g_trim))
-p_tools.append(MakePlane(v_4, p_dir1, g_trim))
-p_tools.append(MakePlane(v_3, p_dir2, g_trim))
-p_tools.append(MakePlane(v_4, p_dir2, g_trim))
-p_tools.append(MakePlane(v_3, p_dir3, g_trim))
-
-piece = MakePartition([s_base, s_haut], p_tools, [], [], ShapeType["SOLID"])
-
-# Study
-# -----
-
-piece_id = addToStudy(piece, "ex03_cube2partition")
-
-# Meshing
-# =======
-
-# Create hexahedrical mesh on piece
-# ---------------------------------
-
-hexa = smesh.Mesh(piece, "ex03_cube2partition:hexa")
-
-algo = hexa.Segment()
-algo.NumberOfSegments(5)
-
-hexa.Quadrangle()
-
-hexa.Hexahedron()
-
-# Compute the mesh
-# ----------------
-
-hexa.Compute()
+++ /dev/null
-# CEA/LGLS 2004-2005, Francis KLOSS (OCC)
-# =======================================
-
-from geompy import *
-
-import smesh
-
-# Geometry
-# ========
-
-# 5 box with a hexahedral mesh and with 2 box in tetrahedral mesh
-
-# Values
-# ------
-
-arete = 100
-
-arete0 = 0
-arete1 = arete
-arete2 = arete*2
-arete3 = arete*3
-
-# Solids
-# ------
-
-box_tetra1 = MakeBox(arete0, arete0, 0, arete1, arete1, arete)
-
-box_ijk1 = MakeBox(arete1, arete0, 0, arete2, arete1, arete)
-
-box_hexa = MakeBox(arete1, arete1, 0, arete2, arete2, arete)
-
-box_ijk2 = MakeBox(arete2, arete1, 0, arete3, arete2, arete)
-
-box_tetra2 = MakeBox(arete2, arete2, 0, arete3 ,arete3, arete)
-
-# Piece
-# -----
-
-piece_cpd = MakeCompound([box_tetra1, box_ijk1, box_hexa, box_ijk2, box_tetra2])
-
-piece = MakeGlueFaces(piece_cpd, 1e-4)
-
-piece_id = addToStudy(piece, "ex04_cube5tetraHexa")
-
-# Meshing
-# =======
-
-# Create a hexahedral mesh
-# ------------------------
-
-mixed = smesh.Mesh(piece, "ex04_cube5tetraHexa:mixed")
-
-algo = mixed.Segment()
-
-algo.StartEndLength(3, 25)
-
-mixed.Quadrangle()
-
-mixed.Hexahedron()
-
-# Tetrahedral local mesh
-# ----------------------
-
-def localMesh(b, hyp):
- box = GetInPlace(piece, b)
- faces = SubShapeAll(box, ShapeType["FACE"])
-
- i = 0
- n = len(faces)
- while i<n:
- algo = mixed.Triangle(faces[i])
- if hyp:
- algo.MaxElementArea(80)
- else:
- algo.LengthFromEdges()
- i = i + 1
-
- algo = mixed.Tetrahedron(smesh.NETGEN, box)
- algo.MaxElementVolume(400)
-
-localMesh(box_tetra1, 1)
-localMesh(box_tetra2, 0)
-
-# Mesh calculus
-# -------------
-
-mixed.Compute()
+++ /dev/null
-# CEA/LGLS 2004-2005, Francis KLOSS (OCC)
-# =======================================
-
-from geompy import *
-
-import smesh
-
-import math
-
-# Geometry
-# ========
-
-# A centered holed cube build by build by points, edges, faces and solids
-
-# Values
-# ------
-
-ox = 0
-oy = 0
-oz = 0
-
-longueur = 100
-largeur = 80
-hauteur = 50
-
-rayon = 10
-
-# Points
-# ------
-
-basePoint111 = MakeVertex(ox , oy, oz)
-basePoint211 = MakeVertex(ox+longueur, oy, oz)
-basePoint112 = MakeVertex(ox , oy, oz+largeur)
-basePoint212 = MakeVertex(ox+longueur, oy, oz+largeur)
-
-cx = ox+longueur/2
-cy = oy
-cz = oz+largeur/2
-
-ll = longueur/largeur
-ll = ll*ll
-dx = rayon/math.sqrt(1+ll)
-dz = rayon/math.sqrt(1+1/ll)
-
-circlePoint1 = MakeVertex(cx-dx, cy, cz-dz)
-circlePoint2 = MakeVertex(cx+dx, cy, cz-dz)
-circlePoint3 = MakeVertex(cx+dx, cy, cz+dz)
-circlePoint4 = MakeVertex(cx-dx, cy, cz+dz)
-
-# Edges
-# -----
-
-squareEdge1 = MakeEdge(basePoint111, basePoint211)
-squareEdge2 = MakeEdge(basePoint211, basePoint212)
-squareEdge3 = MakeEdge(basePoint212, basePoint112)
-squareEdge4 = MakeEdge(basePoint112, basePoint111)
-
-diagEdge1 = MakeEdge(basePoint111, circlePoint1)
-diagEdge2 = MakeEdge(basePoint211, circlePoint2)
-diagEdge3 = MakeEdge(basePoint212, circlePoint3)
-diagEdge4 = MakeEdge(basePoint112, circlePoint4)
-
-arcEdge1 = MakeArc(circlePoint1, MakeVertex(cx , cy, cz-rayon), circlePoint2)
-arcEdge2 = MakeArc(circlePoint2, MakeVertex(cx+rayon, cy, cz ), circlePoint3)
-arcEdge3 = MakeArc(circlePoint3, MakeVertex(cx , cy, cz+rayon), circlePoint4)
-arcEdge4 = MakeArc(circlePoint4, MakeVertex(cx-rayon, cy, cz ), circlePoint1)
-
-# Faces
-# -----
-
-baseFace1 = MakeQuad(squareEdge1, diagEdge2, arcEdge1, diagEdge1)
-baseFace2 = MakeQuad(squareEdge2, diagEdge3, arcEdge2, diagEdge2)
-baseFace3 = MakeQuad(squareEdge3, diagEdge4, arcEdge3, diagEdge3)
-baseFace4 = MakeQuad(squareEdge4, diagEdge1, arcEdge4, diagEdge4)
-
-# Solids
-# ------
-
-baseVector = MakeVectorDXDYDZ(0, 1, 0)
-
-baseSolid1 = MakePrismVecH(baseFace1, baseVector, hauteur)
-baseSolid2 = MakePrismVecH(baseFace2, baseVector, hauteur)
-baseSolid3 = MakePrismVecH(baseFace3, baseVector, hauteur)
-baseSolid4 = MakePrismVecH(baseFace4, baseVector, hauteur)
-
-# Compound
-# --------
-
-c_l = []
-c_l.append(baseSolid1)
-c_l.append(baseSolid2)
-c_l.append(baseSolid3)
-c_l.append(baseSolid4)
-
-c_cpd = MakeCompound(c_l)
-piece = MakeGlueFaces(c_cpd, 1.e-5)
-
-# Add in study
-# ------------
-
-piece_id = addToStudy(piece, "ex05_hole1build")
-
-# Meshing
-# =======
-
-# Create a hexahedral mesh
-# ------------------------
-
-hexa = smesh.Mesh(piece, "ex05_hole1build:hexa")
-
-algo = hexa.Segment()
-
-algo.NumberOfSegments(6, 3)
-
-hexa.Quadrangle()
-
-hexa.Hexahedron()
-
-# Mesh calculus
-# -------------
-
-hexa.Compute()
+++ /dev/null
-# CEA/LGLS 2004-2005, Francis KLOSS (OCC)
-# =======================================
-
-from geompy import *
-
-import smesh
-
-# Geometry
-# ========
-
-# A not centered holed cube build by boolean geometric operations
-
-# Values
-# ------
-
-ox = 0
-oy = 0
-oz = 0
-
-longueur1 = 30
-longueur2 = 70
-
-largeur1 = 30
-largeur2 = 50
-
-hauteur = 50
-
-rayon = 10
-
-# Triangular face
-# ---------------
-
-def triangle(p1, p2, p3):
- l = []
- l.append(MakeEdge(p1, p2))
- l.append(MakeEdge(p2, p3))
- l.append(MakeEdge(p3, p1))
- w = MakeWire(l)
- return MakeFace(w, 1)
-
-# Points
-# ------
-
-basePoint111 = MakeVertex(ox-longueur1, oy, oz-largeur1)
-basePoint211 = MakeVertex(ox+longueur2, oy, oz-largeur1)
-basePoint112 = MakeVertex(ox-longueur1, oy, oz+largeur2)
-basePoint212 = MakeVertex(ox+longueur2, oy, oz+largeur2)
-
-holePoint = MakeVertex(ox, oy, oz)
-
-# Faces
-# -----
-
-baseFace1 = triangle(basePoint111, basePoint211, holePoint)
-baseFace2 = triangle(basePoint211, basePoint212, holePoint)
-baseFace3 = triangle(basePoint212, basePoint112, holePoint)
-baseFace4 = triangle(basePoint112, basePoint111, holePoint)
-
-# Solids
-# ------
-
-baseVector = MakeVectorDXDYDZ(0, 1, 0)
-
-baseSolid1 = MakePrismVecH(baseFace1, baseVector, hauteur)
-baseSolid2 = MakePrismVecH(baseFace2, baseVector, hauteur)
-baseSolid3 = MakePrismVecH(baseFace3, baseVector, hauteur)
-baseSolid4 = MakePrismVecH(baseFace4, baseVector, hauteur)
-
-holeSolid = MakeCylinder(holePoint, baseVector, rayon, hauteur)
-
-# Boolean operations
-# ------------------
-
-baseHexa1 = MakeCut(baseSolid1, holeSolid)
-baseHexa2 = MakeCut(baseSolid2, holeSolid)
-baseHexa3 = MakeCut(baseSolid3, holeSolid)
-baseHexa4 = MakeCut(baseSolid4, holeSolid)
-
-# Compound, glue and repair
-# -------------------------
-
-c_l = []
-c_l.append(baseHexa1)
-c_l.append(baseHexa2)
-c_l.append(baseHexa3)
-c_l.append(baseHexa4)
-
-c_cpd = MakeCompound(c_l)
-c_glu = MakeGlueFaces(c_cpd, 1.e-5)
-piece = RemoveExtraEdges(c_glu)
-
-# Add in study
-# ------------
-
-piece_id = addToStudy(piece, "ex06_hole1boolean")
-
-# Meshing
-# =======
-
-# Create a hexahedral mesh
-# ------------------------
-
-hexa = smesh.Mesh(piece, "ex06_hole1boolean:hexa")
-
-algo = hexa.Segment()
-
-algo.NumberOfSegments(11)
-
-hexa.Quadrangle()
-
-hexa.Hexahedron()
-
-# Create local hypothesis
-# -----------------------
-
-edge1 = GetEdgeNearPoint(piece, MakeVertex(ox, oy, oz-largeur1))
-algo1 = hexa.Segment(edge1)
-algo1.NumberOfSegments(3)
-algo1.Propagation()
-
-edge2 = GetEdgeNearPoint(piece, MakeVertex(ox-longueur1, oy, oz))
-algo2 = hexa.Segment(edge2)
-algo2.NumberOfSegments(5)
-algo2.Propagation()
-
-edge3 = GetEdgeNearPoint(piece, MakeVertex(ox, oy, oz+largeur2))
-algo3 = hexa.Segment(edge3)
-algo3.NumberOfSegments(7)
-algo3.Propagation()
-
-edge4 = GetEdgeNearPoint(piece, MakeVertex(ox+longueur2, oy, oz))
-algo4 = hexa.Segment(edge4)
-algo4.NumberOfSegments(9)
-algo4.Propagation()
-
-# Mesh calculus
-# -------------
-
-hexa.Compute()
+++ /dev/null
-# CEA/LGLS 2004-2005, Francis KLOSS (OCC)
-# =======================================
-
-from geompy import *
-
-import smesh
-
-# Geometry
-# ========
-
-# A holed cube build by partitioning geometric operations
-
-# Values
-# ------
-
-g_x = 0
-g_y = 0
-g_z = 0
-
-g_longueur = 50.0
-g_largeur = 40.0
-g_hauteur = 25.0
-
-g_rayon = 10
-
-g_trim = 1000
-
-# Box
-# ---
-
-b_boite = MakeBox(g_x-g_longueur, g_y-g_hauteur, g_z-g_largeur, g_x+g_longueur, g_y+g_hauteur, g_z+g_largeur)
-
-# Cylinder
-# --------
-
-c_axe = MakeVectorDXDYDZ(0, 1, 0)
-
-c_cyl = MakeCylinder(MakeVertex(g_x, g_y-g_hauteur, g_z), c_axe, g_rayon, g_hauteur*2)
-
-c_piece = MakeCut(b_boite, c_cyl)
-
-# Partition and reperation
-# ------------------------
-
-p_centre = MakeVertex(g_x, g_y, g_z)
-
-p_tools = []
-p_tools.append(MakePlane(p_centre, MakeVectorDXDYDZ( g_largeur, 0, g_longueur), g_trim))
-p_tools.append(MakePlane(p_centre, MakeVectorDXDYDZ(-g_largeur, 0, g_longueur), g_trim))
-
-p_part = MakePartition([c_piece], p_tools, [], [], ShapeType["SOLID"])
-
-p_blocs = RemoveExtraEdges(p_part)
-piece = MakeGlueFaces(p_blocs, 1.e-5)
-
-# Add in study
-# ------------
-
-piece_id = addToStudy(piece, "ex07_hole1partition")
-
-# Meshing
-# =======
-
-# Create a hexahedral mesh
-# ------------------------
-
-hexa = smesh.Mesh(piece, "ex07_hole1partition:hexa")
-
-algo = hexa.Segment()
-algo.NumberOfSegments(20)
-
-hexa.Quadrangle()
-
-hexa.Hexahedron()
-
-# Mesh calculus
-# -------------
-
-hexa.Compute()
+++ /dev/null
-# CEA/LGLS 2004-2005, Francis KLOSS (OCC)
-# =======================================
-
-from geompy import *
-
-import smesh
-
-# Geometry
-# ========
-
-# A twice holed cube build by points, edges, faces and solids
-
-# Values
-# ------
-
-ox = 0
-oy = 0
-oz = 0
-
-longueur = 200
-largeur = 100
-hauteur = 80
-
-cylindre = 50
-
-rayon = 20
-
-# Points
-# ------
-
-piecePoint1 = MakeVertex(ox , oy, oz)
-piecePoint2 = MakeVertex(ox+longueur, oy, oz)
-piecePoint3 = MakeVertex(ox+longueur, oy, oz+largeur)
-piecePoint4 = MakeVertex(ox , oy, oz+largeur)
-
-cz = oz+largeur/2
-
-cylPoint1 = MakeVertex(ox+cylindre , oy, cz-rayon)
-cylPoint2 = MakeVertex(ox+longueur-cylindre, oy, cz-rayon)
-cylPoint3 = MakeVertex(ox+longueur-cylindre, oy, cz+rayon)
-cylPoint4 = MakeVertex(ox+cylindre , oy, cz+rayon)
-
-# Edges
-# -----
-
-pieceEdge1 = MakeEdge(piecePoint1, piecePoint4)
-pieceEdge2 = MakeEdge(piecePoint1, cylPoint1)
-pieceEdge3 = MakeEdge(piecePoint4, cylPoint4)
-
-pieceEdge4 = MakeEdge(piecePoint2, piecePoint3)
-pieceEdge5 = MakeEdge(piecePoint2, cylPoint2)
-pieceEdge6 = MakeEdge(piecePoint3, cylPoint3)
-
-pieceEdge7 = MakeEdge(cylPoint1, cylPoint2)
-pieceEdge8 = MakeEdge(cylPoint3, cylPoint4)
-
-cylEdge1 = MakeArc(cylPoint1, MakeVertex(ox+cylindre-rayon , oy, cz), cylPoint4)
-cylEdge2 = MakeArc(cylPoint1, MakeVertex(ox+cylindre+rayon , oy, cz), cylPoint4)
-cylEdge3 = MakeArc(cylPoint2, MakeVertex(ox+longueur-cylindre-rayon, oy, cz), cylPoint3)
-cylEdge4 = MakeArc(cylPoint2, MakeVertex(ox+longueur-cylindre+rayon, oy, cz), cylPoint3)
-
-# Faces
-# -----
-
-pieceFace1 = MakeQuad4Vertices(piecePoint1, piecePoint2, cylPoint2 , cylPoint1 )
-pieceFace2 = MakeQuad (pieceEdge1 , pieceEdge2 , cylEdge1 , pieceEdge3)
-pieceFace3 = MakeQuad4Vertices(piecePoint3, piecePoint4, cylPoint4 , cylPoint3 )
-pieceFace4 = MakeQuad (pieceEdge4 , pieceEdge5 , cylEdge4 , pieceEdge6)
-pieceFace5 = MakeQuad (pieceEdge7 , cylEdge3 , pieceEdge8, cylEdge2 )
-
-# Solids
-# ------
-
-pieceVector = MakeVectorDXDYDZ(0, 1, 0)
-
-pieceSolid1 = MakePrismVecH(pieceFace1, pieceVector, hauteur)
-pieceSolid2 = MakePrismVecH(pieceFace2, pieceVector, hauteur)
-pieceSolid3 = MakePrismVecH(pieceFace3, pieceVector, hauteur)
-pieceSolid4 = MakePrismVecH(pieceFace4, pieceVector, hauteur)
-pieceSolid5 = MakePrismVecH(pieceFace5, pieceVector, hauteur)
-
-# Compound and glue
-# -----------------
-
-c_cpd = MakeCompound([pieceSolid1, pieceSolid2, pieceSolid3, pieceSolid4, pieceSolid5])
-
-piece = MakeGlueFaces(c_cpd, 1.e-5)
-
-# Add in study
-# ------------
-
-piece_id = addToStudy(piece, "ex08_hole2build")
-
-# Meshing
-# =======
-
-# Create a hexahedral mesh
-# ------------------------
-
-hexa = smesh.Mesh(piece, "ex08_hole2build:hexa")
-
-algo = hexa.Segment()
-algo.NumberOfSegments(7)
-
-hexa.Quadrangle()
-
-hexa.Hexahedron()
-
-# Mesh calculus
-# -------------
-
-hexa.Compute()
+++ /dev/null
-# CEA/LGLS 2004-2005, Francis KLOSS (OCC)
-# =======================================
-
-from geompy import *
-
-import smesh
-
-import math
-
-# Geometry
-# ========
-
-# Element of a grid compound by a square with a cylinder on each vertex build by points, edges, faces and solids
-
-# Values
-# ------
-
-ox = 0
-oy = 0
-oz = 0
-
-arete = 50
-hauteur = 100
-
-rayon = 10
-
-demi = rayon/2
-r3 = demi*math.sqrt(3)
-
-# Points
-# ------
-
-piecePoint111 = MakeVertex(ox+rayon , oy, oz)
-piecePoint211 = MakeVertex(ox+arete-rayon, oy, oz)
-piecePoint112 = MakeVertex(ox , oy, oz+rayon)
-piecePoint212 = MakeVertex(ox+arete , oy, oz+rayon)
-piecePoint113 = MakeVertex(ox , oy, oz+arete-rayon)
-piecePoint213 = MakeVertex(ox+arete , oy, oz+arete-rayon)
-piecePoint114 = MakeVertex(ox+rayon , oy, oz+arete)
-piecePoint214 = MakeVertex(ox+arete-rayon, oy, oz+arete)
-
-pieceCenter1 = MakeVertex(ox , oy, oz)
-pieceCenter2 = MakeVertex(ox+arete , oy, oz)
-pieceCenter3 = MakeVertex(ox , oy, oz+arete)
-pieceCenter4 = MakeVertex(ox+arete , oy, oz+arete)
-
-piecePass1 = MakeVertex(ox+demi , oy, oz+r3)
-piecePass2 = MakeVertex(ox+arete-demi , oy, oz+r3)
-piecePass3 = MakeVertex(ox+arete-demi , oy, oz+arete-r3)
-piecePass4 = MakeVertex(ox+demi , oy, oz+arete-r3)
-
-# Edges
-# -----
-
-pieceEdgeSquare1 = MakeEdge(piecePoint111, piecePoint211)
-pieceEdgeSquare2 = MakeEdge(piecePoint114, piecePoint214)
-pieceEdgeSquare3 = MakeEdge(piecePoint112, piecePoint113)
-pieceEdgeSquare4 = MakeEdge(piecePoint212, piecePoint213)
-
-pieceEdgeDiagonal1 = MakeEdge(piecePoint111, piecePoint213)
-pieceEdgeDiagonal2 = MakeEdge(piecePoint112, piecePoint214)
-
-pieceEdgeArc1 = MakeArc(piecePoint111, piecePass1, piecePoint112)
-pieceEdgeArc2 = MakeArc(piecePoint211, piecePass2, piecePoint212)
-pieceEdgeArc3 = MakeArc(piecePoint213, piecePass3, piecePoint214)
-pieceEdgeArc4 = MakeArc(piecePoint113, piecePass4, piecePoint114)
-
-# Faces
-# -----
-
-pieceFace1 = MakeQuad(pieceEdgeSquare1, pieceEdgeArc2, pieceEdgeSquare4, pieceEdgeDiagonal1)
-pieceFace2 = MakeQuad(pieceEdgeSquare2, pieceEdgeArc4, pieceEdgeSquare3, pieceEdgeDiagonal2)
-
-pieceFace3 = MakeQuad(pieceEdgeArc1, pieceEdgeDiagonal1, pieceEdgeArc3, pieceEdgeDiagonal2)
-
-# Solids
-# ------
-
-pieceVector = MakeVectorDXDYDZ(0, 1, 0)
-
-pieceSolid1 = MakePrismVecH(pieceFace1, pieceVector, hauteur)
-pieceSolid2 = MakePrismVecH(pieceFace2, pieceVector, hauteur)
-pieceSolid3 = MakePrismVecH(pieceFace3, pieceVector, hauteur)
-
-# Compound and glue
-# -----------------
-
-c_cpd = MakeCompound([pieceSolid1, pieceSolid2, pieceSolid3])
-
-piece = MakeGlueFaces(c_cpd, 1.e-5)
-
-# Add in study
-# ------------
-
-piece_id = addToStudy(piece, "ex09_grid4build")
-
-# Meshing
-# =======
-
-# Create a hexahedral mesh
-# ------------------------
-
-hexa = smesh.Mesh(piece, "ex09_grid4build:hexa")
-
-algo = hexa.Segment()
-algo.NumberOfSegments(6)
-
-hexa.Quadrangle()
-
-hexa.Hexahedron()
-
-# Mesh calculus
-# -------------
-
-hexa.Compute()
+++ /dev/null
-# CEA/LGLS 2004-2005, Francis KLOSS (OCC)
-# =======================================
-
-from geompy import *
-
-import smesh
-
-# Geometry
-# ========
-
-# Element of a grid compound by a square with a cylinder on each vertex build by using partition
-
-# Values
-# ------
-
-ox = 0
-oy = 0
-oz = 0
-
-arete = 50
-hauteur = 100
-rayon = 10
-
-g_trim = 1000
-
-# Box
-# ---
-
-piecePoint = MakeVertex(ox, oy, oz)
-
-pieceBox = MakeBoxTwoPnt(piecePoint, MakeVertex(ox+arete, oy+hauteur, oz+arete))
-
-# Cut by cylinders
-# ----------------
-
-dirUp = MakeVectorDXDYDZ(0, 1, 0)
-
-pieceCut1 = MakeCut(pieceBox , MakeCylinder(piecePoint , dirUp, rayon, hauteur))
-pieceCut2 = MakeCut(pieceCut1, MakeCylinder(MakeVertex(ox+arete, oy, oz ), dirUp, rayon, hauteur))
-pieceCut3 = MakeCut(pieceCut2, MakeCylinder(MakeVertex(ox , oy, oz+arete), dirUp, rayon, hauteur))
-pieceCut4 = MakeCut(pieceCut3, MakeCylinder(MakeVertex(ox+arete, oy, oz+arete), dirUp, rayon, hauteur))
-
-# Compound by make a partition of a solid
-# ---------------------------------------
-
-dir = MakeVectorDXDYDZ(-1, 0, 1)
-
-tools = []
-tools.append(MakePlane(MakeVertex(ox+rayon, oy, oz ), dir, g_trim))
-tools.append(MakePlane(MakeVertex(ox , oy, oz+rayon), dir, g_trim))
-
-piece = MakePartition([pieceCut4], tools, [], [], ShapeType["SOLID"])
-
-# Add in study
-# ------------
-
-piece_id = addToStudy(piece, "ex10_grid4geometry")
-
-# Meshing
-# =======
-
-# Create a hexahedral mesh
-# ------------------------
-
-hexa = smesh.Mesh(piece, "ex10_grid4geometry:hexa")
-
-algo = hexa.Segment()
-algo.NumberOfSegments(10)
-
-hexa.Quadrangle()
-
-hexa.Hexahedron()
-
-# Mesh calculus
-# -------------
-
-hexa.Compute()
+++ /dev/null
-# CEA/LGLS 2004-2005, Francis KLOSS (OCC)
-# =======================================
-
-from geompy import *
-
-import smesh
-
-# Geometry
-# ========
-
-# grid compound of 3 x 3 elements
-# an element is compound of 3 cylinders concentriques
-# an element is centered in a square of the grid
-# the smaller cylinder is a hole
-
-# prism the grid, and mesh it in hexahedral way
-
-# Values
-# ------
-
-g_x = 0
-g_y = 0
-g_z = 0
-
-g_arete = 50
-g_hauteur = 30
-
-g_rayon1 = 20
-g_rayon2 = 30
-g_rayon3 = 40
-
-g_grid = 3
-
-g_trim = 1000
-
-# Element
-# -------
-
-e_boite = MakeBox(g_x-g_arete, g_y-g_hauteur, g_z-g_arete, g_x+g_arete, g_y+g_hauteur, g_z+g_arete)
-
-e_hauteur = 2*g_hauteur
-e_centre = MakeVertex(g_x, g_y-g_hauteur, g_z)
-e_dir = MakeVectorDXDYDZ(0, 1, 0)
-
-e_cyl1 = MakeCylinder(e_centre, e_dir, g_rayon3, e_hauteur)
-
-e_blo1 = MakeCut(e_boite, e_cyl1)
-
-e_cyl2 = MakeCylinder(e_centre, e_dir, g_rayon2, e_hauteur)
-
-e_blo2 = MakeCut(e_cyl1, e_cyl2)
-
-e_cyl3 = MakeCylinder(e_centre, e_dir, g_rayon1, e_hauteur)
-
-e_blo3 = MakeCut(e_cyl2, e_cyl3)
-
-# Partition and repair
-# --------------------
-
-p_tools = []
-p_tools.append(MakePlane(e_centre, MakeVectorDXDYDZ( 1, 0, 1), g_trim))
-p_tools.append(MakePlane(e_centre, MakeVectorDXDYDZ(-1, 0, 1), g_trim))
-
-p_part = MakePartition([e_blo1, e_blo2, e_blo3], p_tools, [], [], ShapeType["SOLID"])
-
-p_element = RemoveExtraEdges(p_part)
-
-# Grid and glue
-# -------------
-
-grid = MakeMultiTranslation2D(p_element, MakeVectorDXDYDZ(1, 0, 0), 2*g_arete, g_grid, MakeVectorDXDYDZ(0, 0, 1), 2*g_arete, g_grid)
-
-piece = MakeGlueFaces(grid, 1e-5)
-
-# Add in study
-# ------------
-
-piece_id = addToStudy(piece, "ex11_grid3partition")
-
-# Meshing
-# =======
-
-# Create a hexahedral mesh
-# ------------------------
-
-hexa = smesh.Mesh(piece, "ex11_grid3partition:hexa")
-
-algo = hexa.Segment()
-algo.NumberOfSegments(3)
-
-hexa.Quadrangle()
-
-hexa.Hexahedron()
-
-# Mesh calculus
-# -------------
-
-hexa.Compute()
+++ /dev/null
-# CEA/LGLS 2004-2005, Francis KLOSS (OCC)
-# =======================================
-
-from geompy import *
-
-import smesh
-
-# Geometry
-# ========
-
-# grid compound of 17 x 17 elements
-# an element is compound of 3 concentric cylinders
-# an element is centered in a square of the grid
-
-# prism the grid, and mesh it in hexahedral way
-
-# Values
-# ------
-
-g_x = 0
-g_y = 0
-g_z = 0
-
-g_arete = 50
-g_hauteur = 30
-
-g_rayon1 = 20
-g_rayon2 = 30
-g_rayon3 = 40
-
-g_grid = 17
-
-g_trim = 1000
-
-# Solids and rotation to prevent repair
-# -------------------------------------
-
-s_boite = MakeBox(g_x-g_arete, g_y-g_hauteur, g_z-g_arete, g_x+g_arete, g_y+g_hauteur, g_z+g_arete)
-
-s_pi4 = 3.141592653/4
-s_hauteur = 2*g_hauteur
-s_centre = MakeVertex(g_x, g_y-g_hauteur, g_z)
-s_dir = MakeVectorDXDYDZ(0, 1, 0)
-
-s_cyl0 = MakeCylinder(s_centre, s_dir, g_rayon3, s_hauteur)
-s_cyl1 = MakeRotation(s_cyl0, s_dir, s_pi4)
-
-s_blo1 = MakeCut(s_boite, s_cyl1)
-
-s_cyl0 = MakeCylinder(s_centre, s_dir, g_rayon2, s_hauteur)
-s_cyl2 = MakeRotation(s_cyl0, s_dir, s_pi4)
-
-s_blo2 = MakeCut(s_cyl1, s_cyl2)
-
-s_cyl0 = MakeCylinder(s_centre, s_dir, g_rayon1, s_hauteur)
-s_cyl3 = MakeRotation(s_cyl0, s_dir, s_pi4)
-
-s_blo3 = MakeCut(s_cyl2, s_cyl3)
-
-s_arete = g_rayon1/2
-
-s_blo4 = MakeBox(g_x-s_arete, g_y-g_hauteur, g_z-s_arete, g_x+s_arete, g_y+g_hauteur, g_z+s_arete)
-
-s_blo5 = MakeCut(s_cyl3, s_blo4)
-
-# Partition
-# ---------
-
-p_tools = []
-p_tools.append(MakePlane(s_centre, MakeVectorDXDYDZ( 1, 0, 1), g_trim))
-p_tools.append(MakePlane(s_centre, MakeVectorDXDYDZ(-1, 0, 1), g_trim))
-
-p_partie = MakePartition([s_blo1, s_blo2, s_blo3, s_blo5], p_tools, [], [], ShapeType["SOLID"])
-
-# Compound and glue
-# -----------------
-
-c_blocs = SubShapeAll(p_partie, ShapeType["SOLID"])
-c_blocs.append(s_blo4)
-
-c_cpd = MakeCompound(c_blocs)
-
-c_element = MakeGlueFaces(c_cpd, 1e-4)
-
-# Grid
-# ----
-
-piece = MakeMultiTranslation2D(c_element, MakeVectorDXDYDZ(1, 0, 0), 2*g_arete, g_grid, MakeVectorDXDYDZ(0, 0, 1), 2*g_arete, g_grid)
-
-# Add in study
-# ------------
-
-piece_id = addToStudy(piece, "ex12_grid17partition")
-
-# Meshing
-# =======
-
-# Create a hexahedral mesh
-# ------------------------
-
-hexa = smesh.Mesh(piece, "ex12_grid17partition:hexa")
-
-algo = hexa.Segment()
-algo.NumberOfSegments(2)
-
-hexa.Quadrangle()
-
-hexa.Hexahedron()
-
-# Mesh calculus
-# -------------
-
-hexa.Compute()
+++ /dev/null
-# CEA/LGLS 2005, Francis KLOSS (OCC)
-# ==================================
-
-from geompy import *
-
-import smesh
-
-# Geometry
-# ========
-
-# With hexahedral, build a box partially holed by a not centered cylinder with a thickness
-
-# Values
-# ------
-
-box_dx = 1000
-box_dy = 900
-box_dz = 800
-
-cyl_x = 500
-cyl_y = 300
-cyl_dz = 600
-cyl_radius = 150
-cyl_thick = 30
-
-# Triangular face
-# ---------------
-
-def triangle(p1, p2, p3):
- l = []
- l.append(MakeEdge(p1, p2))
- l.append(MakeEdge(p2, p3))
- l.append(MakeEdge(p3, p1))
- w = MakeWire(l)
- return MakeFace(w, 1)
-
-# The holed part
-# ==============
-
-# Vertex of the holed part
-# ------------------------
-
-hole_point_11 = MakeVertex(0 , 0 , 0)
-hole_point_21 = MakeVertex(box_dx, 0 , 0)
-hole_point_12 = MakeVertex(0 , box_dy, 0)
-hole_point_22 = MakeVertex(box_dx, box_dy, 0)
-
-hole_center = MakeVertex(cyl_x, cyl_y, 0)
-
-# Faces of the holed part
-# -----------------------
-
-hole_face_1 = triangle(hole_point_11, hole_point_21, hole_center)
-hole_face_2 = triangle(hole_point_21, hole_point_22, hole_center)
-hole_face_3 = triangle(hole_point_12, hole_point_22, hole_center)
-hole_face_4 = triangle(hole_point_11, hole_point_12, hole_center)
-
-# Solids of the holed part
-# ------------------------
-
-cyl_dir = MakeVectorDXDYDZ(0, 0, 1)
-
-hole_solid_1 = MakePrismVecH(hole_face_1, cyl_dir, cyl_dz)
-hole_solid_2 = MakePrismVecH(hole_face_2, cyl_dir, cyl_dz)
-hole_solid_3 = MakePrismVecH(hole_face_3, cyl_dir, cyl_dz)
-hole_solid_4 = MakePrismVecH(hole_face_4, cyl_dir, cyl_dz)
-
-hole_internal = MakeCylinder(hole_center, cyl_dir, cyl_radius , cyl_dz)
-hole_external = MakeCylinder(hole_center, cyl_dir, cyl_radius+cyl_thick, cyl_dz)
-hole_median = MakeCut(hole_external, hole_internal)
-
-# Boolean operations
-# ------------------
-
-blocks = []
-
-blocks.append( MakeCut(hole_solid_1, hole_external))
-blocks.append(MakeCommon(hole_solid_1, hole_median ))
-
-blocks.append( MakeCut(hole_solid_2, hole_external))
-blocks.append(MakeCommon(hole_solid_2, hole_median ))
-
-blocks.append( MakeCut(hole_solid_3, hole_external))
-blocks.append(MakeCommon(hole_solid_3, hole_median ))
-
-blocks.append( MakeCut(hole_solid_4, hole_external))
-blocks.append(MakeCommon(hole_solid_4, hole_median ))
-
-# The full part
-# =============
-
-# Vertex of the full part
-# -----------------------
-
-full_point_11 = MakeVertex(0 , 0 , cyl_dz)
-full_point_21 = MakeVertex(box_dx, 0 , cyl_dz)
-full_point_12 = MakeVertex(0 , box_dy, cyl_dz)
-full_point_22 = MakeVertex(box_dx, box_dy, cyl_dz)
-
-full_center = MakeVertex(cyl_x, cyl_y, cyl_dz)
-
-# Faces of the full part
-# ----------------------
-
-full_face_1 = triangle(full_point_11, full_point_21, full_center)
-full_face_2 = triangle(full_point_21, full_point_22, full_center)
-full_face_3 = triangle(full_point_12, full_point_22, full_center)
-full_face_4 = triangle(full_point_11, full_point_12, full_center)
-
-# Solids of the full part
-# ------------------------
-
-full_dz = box_dz - cyl_dz
-
-full_solid_1 = MakePrismVecH(full_face_1, cyl_dir, full_dz)
-full_solid_2 = MakePrismVecH(full_face_2, cyl_dir, full_dz)
-full_solid_3 = MakePrismVecH(full_face_3, cyl_dir, full_dz)
-full_solid_4 = MakePrismVecH(full_face_4, cyl_dir, full_dz)
-
-full_internal = MakeCylinder(full_center, cyl_dir, cyl_radius , full_dz)
-full_external = MakeCylinder(full_center, cyl_dir, cyl_radius+cyl_thick, full_dz)
-full_median = MakeCut(full_external, full_internal)
-
-# Boolean operations
-# ------------------
-
-full = []
-
-full.append( MakeCut(full_solid_1, full_external))
-full.append(MakeCommon(full_solid_1, full_median))
-
-full.append( MakeCut(full_solid_2, full_external))
-full.append(MakeCommon(full_solid_2, full_median ))
-
-full.append( MakeCut(full_solid_3, full_external))
-full.append(MakeCommon(full_solid_3, full_median))
-
-full.append( MakeCut(full_solid_4, full_external))
-full.append(MakeCommon(full_solid_4, full_median))
-
-# Filling the hole
-# ----------------
-
-box_d = cyl_radius/3
-
-x = cyl_x-box_d
-y = x * cyl_y / cyl_x
-box_point_11 = MakeVertex(x, y, cyl_dz)
-
-x = cyl_x+box_d
-y = (box_dx - x) * cyl_y / (box_dx - cyl_x)
-box_point_12 = MakeVertex(x, y, cyl_dz)
-
-x = cyl_x-box_d
-y = box_dy - x * (box_dy - cyl_y) / cyl_x
-box_point_21 = MakeVertex(x, y, cyl_dz)
-
-x = cyl_x+box_d
-y = box_dy - (box_dx - x) * (box_dy - cyl_y) / (box_dx - cyl_x)
-box_point_22 = MakeVertex(x, y, cyl_dz)
-
-box_face = MakeQuad4Vertices(box_point_11, box_point_12, box_point_21, box_point_22)
-
-box = MakePrismVecH(box_face, cyl_dir, full_dz)
-
-full.append(box)
-
-full.append(MakeCut(MakeCommon(full_solid_1, full_internal), box))
-full.append(MakeCut(MakeCommon(full_solid_2, full_internal), box))
-full.append(MakeCut(MakeCommon(full_solid_3, full_internal), box))
-full.append(MakeCut(MakeCommon(full_solid_4, full_internal), box))
-
-# Cut the cylinder thikness
-# -------------------------
-
-full_plan = MakePlane(MakeVertex(0, 0, cyl_dz+cyl_thick), cyl_dir, 5000)
-
-full_parts = MakePartition(full, [full_plan], [], [], ShapeType["SOLID"])
-
-# Geometry result
-# ---------------
-
-blocks.append(full_parts)
-
-piece_cpd = MakeCompound(blocks)
-
-piece_ok = RemoveExtraEdges(piece_cpd)
-
-piece = MakeGlueFaces(piece_ok, 1.e-3)
-
-piece_id = addToStudy(piece, "ex13_hole1partial")
-
-# Meshing
-# =======
-
-# Create a mesh
-# -------------
-
-hexa = smesh.Mesh(piece, "ex13_hole1partial:hexa")
-
-algo = hexa.Segment()
-algo.NumberOfSegments(2)
-
-hexa.Quadrangle()
-
-hexa.Hexahedron()
-
-# Local hypothesis
-# ----------------
-
-def local(x, y, z, d):
- edge = GetEdgeNearPoint(piece, MakeVertex(x, y, z))
- algo = hexa.Segment(edge)
- algo.NumberOfSegments(d)
- algo.Propagation()
-
-local(0, 0, 100, 40)
-local(0, 0, 700, 15)
-
-local(100, 0, 0, 20)
-local(0, 100, 0, 20)
-
-local(100, 100, 0, 25)
-
-d = cyl_radius-3*cyl_thick
-local(cyl_x+d, cyl_y+d, box_dz, 10)
-
-# Compute the mesh
-# ----------------
-
-hexa.Compute()
+++ /dev/null
-# CEA/LGLS 2004-2005, Francis KLOSS (OCC)
-# =======================================
-
-from geompy import *
-
-import smesh
-
-# Geometrie
-# =========
-
-# Creer un cylindre avec un trou cylindrique excentre, decoupage en hexahedre et mailler.
-
-# Donnees
-# -------
-
-# unite: millimetre
-
-g_ox = 0
-g_oy = 0
-g_oz = 0
-
-g_cyl_rayon = 1000
-g_cyl_demiHauteur = 3000
-
-g_trou_rayon = 5
-g_trou_centre = 300
-
-g_trim = 15000
-
-# Construire le cylindre
-# ----------------------
-
-c_point = MakeVertex(g_ox, g_oy, g_oz-g_cyl_demiHauteur)
-c_dir = MakeVectorDXDYDZ(0, 0, 1)
-c_hauteur = 2*g_cyl_demiHauteur
-c_cylindre = MakeCylinder(c_point, c_dir, g_cyl_rayon, c_hauteur)
-
-# Trouer le cylindre par un minuscule cylindre excentre
-# -----------------------------------------------------
-
-t_hauteur = g_cyl_demiHauteur
-t_point = MakeVertex(g_ox-g_trou_centre, g_oy, g_oz-t_hauteur)
-t_trou = MakeCylinder(t_point, c_dir, g_trou_rayon, 2*t_hauteur)
-
-t_piece = MakeCut(c_cylindre, t_trou)
-
-# Geometrie hexahedrique
-# ======================
-
-# Decouper
-# --------
-
-h_outils = []
-h_outils.append(MakePlane(t_point, MakeVectorDXDYDZ(1, 0, 0), g_trim))
-h_outils.append(MakePlane(t_point, MakeVectorDXDYDZ(0, 1, 0), g_trim))
-
-h_piece = MakePartition([t_piece], h_outils, [], [], ShapeType["SOLID"])
-
-# Decouper pour les conditions locales
-# ------------------------------------
-
-l_outils = []
-l_i = 1
-l_n = 12
-l_hauteur = c_hauteur/l_n
-
-while l_i<l_n:
- l_outils.append(MakePlane(MakeVertex(g_ox, g_oy, g_oz-g_cyl_demiHauteur+l_i*l_hauteur), c_dir, g_trim))
- l_i = l_i+1
-
-piece = MakePartition([h_piece], l_outils, [], [], ShapeType["SOLID"])
-
-# Ajouter la piece dans l'etude
-# -----------------------------
-
-piece_id = addToStudy(piece, "ex14_cyl1holed")
-
-# Maillage
-# ========
-
-# Creer un maillage hexahedrique
-# ------------------------------
-
-hexa = smesh.Mesh(piece, "ex14_cyl1holed:hexa")
-
-algo = hexa.Segment()
-algo.NumberOfSegments(4)
-
-hexa.Quadrangle()
-
-hexa.Hexahedron()
-
-# Poser les hypotheses locales
-# ----------------------------
-
-m_i = 0
-m_n = 12
-m_h = c_hauteur/m_n
-m_d = [4, 6, 8, 10, 10, 9, 8, 7, 6, 5, 4, 3]
-
-m_x = g_ox+g_cyl_rayon
-m_y = g_oy
-m_z = g_oz-g_cyl_demiHauteur+m_h/2
-
-while m_i<m_n:
- m_p = MakeVertex(m_x, m_y, m_z + m_i*m_h)
- m_e = GetEdgeNearPoint(piece, m_p)
- m_a = hexa.Segment(m_e)
- m_a.NumberOfSegments(m_d[m_i])
- m_a.Propagation()
- m_i = m_i + 1
-
-# Calculer le maillage
-# --------------------
-
-hexa.Compute()
+++ /dev/null
-# CEA/LGLS 2004-2005, Francis KLOSS (OCC)
-# =======================================
-
-from geompy import *
-
-import smesh
-
-# Geometrie
-# =========
-
-# Construire avec des hexahedres une piece faite de 2 cylindres de diametre different
-# et dont les axes se coupent orthogonalement, puis mailler.
-
-# Valeurs
-# -------
-
-cx = 0
-cy = 0
-cz = 0
-
-g_rayon = 100.0
-g_hauteur = 500
-
-p_rayon = 50.0
-p_hauteur = 500
-
-g_trim = 1000
-
-# Gros cylindre
-# -------------
-
-cpd = []
-
-g_base = MakeVertex(cx, cy, cz)
-g_dir = MakeVectorDXDYDZ(0, 0, 1)
-t_hauteur = p_rayon+10.0
-
-g_cyl = MakeCylinder(g_base, g_dir, g_rayon, g_hauteur)
-
-g_coupe = MakeVectorDXDYDZ(1, 0, 0)
-
-g_tools = []
-g_tools.append(MakePlane(MakeVertex(cx+t_hauteur, cy, cz), g_coupe, g_trim))
-g_tools.append(MakePlane(MakeVertex(cx-t_hauteur, cy, cz), g_coupe, g_trim))
-
-g_partie = MakePartition([g_cyl], g_tools, [], [], ShapeType["SOLID"])
-g_bas, g_centre, g_haut = SubShapeAllSorted(g_partie, ShapeType["SOLID"])
-
-# Partie basse du gros cylindre
-# -----------------------------
-
-b_hauteur = 10
-b_base = 20
-
-b_boite = MakeBox(cx-t_hauteur, cy-b_base, cz, cx-t_hauteur-b_hauteur, cy+b_base, cz+g_hauteur)
-cpd.append(b_boite)
-
-b_cyl = MakeCut(g_bas, b_boite)
-
-b_tools = []
-b_tools.append(MakePlane(MakeVertex(cx-t_hauteur-b_hauteur, cy+b_base, cz), MakeVectorDXDYDZ( 1, 1, 0), g_trim))
-b_tools.append(MakePlane(MakeVertex(cx-t_hauteur-b_hauteur, cy-b_base, cz), MakeVectorDXDYDZ(-1, 1, 0), g_trim))
-
-b_partie = MakePartition([b_cyl], b_tools, [], [], ShapeType["SOLID"])
-b_element = SubShapeAll(b_partie, ShapeType["SOLID"])
-cpd = cpd + b_element
-
-# Partie haute du gros cylindre
-# -----------------------------
-
-h_plan = MakePlane(g_base, g_coupe, g_trim)
-
-cpd.append(MakeMirrorByPlane(b_boite, h_plan))
-
-for h in b_element:
- h_symetrie = MakeMirrorByPlane(h, h_plan)
- cpd.append(h_symetrie)
-
-# Petit cylindre
-# --------------
-
-z_arete = p_rayon/2
-x_arete = z_arete*t_hauteur*2/g_hauteur
-
-px = cx-x_arete
-py = cy-1.5*g_rayon
-pz = cz+g_hauteur/2
-
-p_base = MakeVertex(cx, py, pz)
-p_dir = MakeVectorDXDYDZ(0, 1, 0)
-p_cyl = MakeCylinder(p_base, p_dir, p_rayon, p_hauteur)
-
-p_boite = MakeBox(px, py, pz-z_arete, cx+x_arete, py+p_hauteur, pz+z_arete)
-
-# Partie interieure du petit cylindre
-# -----------------------------------
-
-i_cyl = MakeCommon(p_cyl, g_cyl)
-i_tuyau = MakeCut(i_cyl, p_boite)
-i_boite = MakeCommon(p_boite, g_cyl)
-
-# Partie exterieure du petit cylindre
-# -----------------------------------
-
-e_cyl0 = MakeCut(p_cyl, g_cyl)
-e_cyl = SubShapeAllSorted(e_cyl0, ShapeType["SOLID"])
-
-e_tuyau = MakeCut(e_cyl[1], p_boite)
-
-e_boite0 = MakeCut(p_boite, g_cyl)
-e_boite = SubShapeAllSorted(e_boite0, ShapeType["SOLID"])
-
-cpd.append(e_boite[1])
-
-# Partie centrale du gros cylindre
-# --------------------------------
-
-c_cyl = MakeCut(g_centre, p_cyl)
-
-# Partitionner
-# ------------
-
-p_tools = []
-p_tools.append(MakePlane(MakeVertex(px, py, pz-z_arete), MakeVectorDXDYDZ(-z_arete, 0, x_arete), g_trim))
-p_tools.append(MakePlane(MakeVertex(px, py, pz+z_arete), MakeVectorDXDYDZ( z_arete, 0, x_arete), g_trim))
-
-p_partie = MakePartition([e_tuyau], p_tools, [], [], ShapeType["SOLID"])
-p_element = SubShapeAll(p_partie, ShapeType["SOLID"])
-cpd = cpd + p_element
-
-q_partie = MakePartition([i_tuyau, c_cyl], p_tools, [], [], ShapeType["SOLID"])
-q_element = SubShapeAll(q_partie, ShapeType["SOLID"])
-
-q_element = q_element + [i_boite]
-
-q_tools = []
-q_tools.append(MakePlane(MakeVertex(cx, cy-b_base, cz), MakeVectorDXDYDZ(0, 1, 0), g_trim))
-q_tools.append(MakePlane(MakeVertex(cx, cy+b_base, cz), MakeVectorDXDYDZ(0, 1, 0), g_trim))
-
-r_element = []
-for e in q_element:
- r_partie = MakePartition([e], q_tools, [], [], ShapeType["SOLID"])
- r_element = r_element + SubShapeAll(r_partie, ShapeType["SOLID"])
-
-cpd = cpd + r_element
-
-# Compound
-# --------
-
-piece = RemoveExtraEdges(MakeCompound(cpd))
-
-# Ajouter la piece dans l'etude
-# -----------------------------
-
-piece_id = addToStudy(piece, "ex15_cyl2geometry")
-
-# Meshing
-# =======
-
-# Create a hexahedral mesh
-# ------------------------
-
-hexa = smesh.Mesh(piece, "ex15_cyl2geometry:hexa")
-
-algo = hexa.Segment()
-algo.NumberOfSegments(12)
-
-hexa.Quadrangle()
-
-hexa.Hexahedron()
-
-# Mesh calculus
-# -------------
-
-hexa.Compute()
+++ /dev/null
-# CEA/LGLS 2004-2005, Francis KLOSS (OCC)
-# =======================================
-
-from geompy import *
-
-import smesh
-
-# Geometry
-# ========
-
-# Create the hexahedrical block geometry of a holed parallelepipede.
-# The hole has a T form composed by 2 cylinders with different radius, and their axis are normal.
-# This piece is meshed in hexahedrical.
-
-# Values
-# ------
-
-gx = 0
-gy = 0
-gz = 0
-
-g_dx = 250
-g_dy = 200
-g_dz = 150
-
-g_rayonGrand = 70
-g_rayonPetit = 50
-
-g_trim = 1000
-
-# The parallelepipede
-# -------------------
-
-p_boite = MakeBox(gx-g_dx, gy-g_dy, gz-g_dz, gx+g_dx, gy+g_dy, gz+g_dz)
-
-# The great cylinder
-# ------------------
-
-g_base = MakeVertex(gx-g_dx, gy, gz)
-g_dir = MakeVectorDXDYDZ(1, 0, 0)
-g_cyl = MakeCylinder(g_base, g_dir, g_rayonGrand, g_dx*2)
-
-# The first hole
-# --------------
-
-b_boite = MakeCut(p_boite , g_cyl)
-
-# Partitioning
-# ------------
-
-p_base = MakeVertex(gx, gy, gz)
-
-p_tools = []
-
-p_tools.append(MakePlane(p_base, MakeVectorDXDYDZ(0, 1 , 0 ), g_trim))
-p_tools.append(MakePlane(p_base, MakeVectorDXDYDZ(0, g_dz, g_dy), g_trim))
-p_tools.append(MakePlane(p_base, MakeVectorDXDYDZ(0, -g_dz, g_dy), g_trim))
-
-p_tools.append(MakePlane(MakeVertex(gx-g_rayonPetit, gy, gz), g_dir, g_trim))
-p_tools.append(MakePlane(MakeVertex(gx+g_rayonPetit, gy, gz), g_dir, g_trim))
-
-p_piece = MakePartition([b_boite], p_tools, [], [], ShapeType["SOLID"])
-
-# The small cylinder
-# ------------------
-
-c_cyl = MakeCylinder(p_base, MakeVectorDXDYDZ(0, 0, 1), g_rayonPetit, g_dz)
-
-# The second hole
-# ---------------
-
-d_element = SubShapeAllSorted(p_piece, ShapeType["SOLID"])
-
-d_element[ 8] = MakeCut(d_element[ 8], c_cyl)
-d_element[10] = MakeCut(d_element[10], c_cyl)
-
-# Compound
-# --------
-
-piece = RemoveExtraEdges(MakeCompound(d_element))
-
-# Add piece in study
-# ------------------
-
-piece_id = addToStudy(piece, "ex16_cyl2complementary")
-
-# Meshing
-# =======
-
-# Create a hexahedral mesh
-# ------------------------
-
-hexa = smesh.Mesh(piece, "ex16_cyl2complementary:hexa")
-
-algo = hexa.Segment()
-algo.NumberOfSegments(12)
-
-hexa.Quadrangle()
-
-hexa.Hexahedron()
-
-# Define local hypothesis
-# -----------------------
-
-def local(x, y, z, d):
- edge = GetEdgeNearPoint(piece, MakeVertex(x, y, z))
- algo = hexa.Segment(edge)
- algo.NumberOfSegments(d)
- algo.Propagation()
-
-local(gx , gy+g_dy, gz+g_dz, 7)
-local(gx+g_dx, gy+g_dy, gz , 21)
-local(gx+g_dx, gy-g_dy, gz , 21)
-
-# Mesh calculus
-# -------------
-
-hexa.Compute()
+++ /dev/null
-# CEA/LGLS 2004-2005, Francis KLOSS (OCC)
-# =======================================
-
-from geompy import *
-
-import smesh
-
-# Geometrie
-# =========
-
-# Creer un cylindre surplombe d'une demi-sphere le tout troue par un petit cylindre.
-# Decouper en hexahedre et mailler.
-
-# Donnees
-# -------
-
-cylindre_rayon = 100
-cylindre_hauteur = 400
-
-trou_rayon = 20
-trou_z = cylindre_rayon/2
-
-plan_trim = 2000
-
-# Cylindre
-# --------
-
-cylindre_base = MakeVertex(0, 0, 0)
-cylindre_dir = MakeVectorDXDYDZ(1, 0, 0)
-cylindre = MakeCylinder(cylindre_base, cylindre_dir, cylindre_rayon, cylindre_hauteur)
-
-# Dome
-# ----
-
-dome_sphere = MakeSpherePntR(cylindre_base, cylindre_rayon)
-dome = MakeFuse(dome_sphere, cylindre)
-
-# Cheminee
-# --------
-
-cheminee_base = MakeVertex(-cylindre_hauteur/2, 0, trou_z)
-cheminee_trou = MakeCylinder(cheminee_base, cylindre_dir, trou_rayon, 2*cylindre_hauteur)
-cheminee = MakeCut(dome, cheminee_trou)
-
-# Decoupage et reparation
-# -----------------------
-
-blocs_plan1 = MakePlane(cheminee_base, MakeVectorDXDYDZ(0, 1, 0), plan_trim)
-blocs_plan2 = MakePlane(cheminee_base, MakeVectorDXDYDZ(0, 0, 1), plan_trim)
-
-blocs_part = MakePartition([cheminee], [blocs_plan1, blocs_plan2], [], [], ShapeType["SOLID"])
-
-piece = RemoveExtraEdges(blocs_part)
-
-# Etude
-# -----
-
-piece_id = addToStudy(piece, "ex17_dome1")
-
-# Maillage
-# ========
-
-# Maillage hexahedrique
-# ---------------------
-
-hexa = smesh.Mesh(piece, "ex17_dome1:hexa")
-
-algo = hexa.Segment()
-algo.NumberOfSegments(20)
-
-hexa.Quadrangle()
-
-hexa.Hexahedron()
-
-# Calcul du maillage
-# ------------------
-
-hexa.Compute()
+++ /dev/null
-# CEA/LGLS 2004-2005, Francis KLOSS (OCC)
-# =======================================
-
-from geompy import *
-
-import smesh
-
-import math
-
-# Geometrie
-# =========
-
-# Creer un cylindre ayant a chaque bout un morceau de sphere et le tout troue par un petit cylindrique excentre.
-# Decouper en hexahedre et mailler.
-
-# Donnees
-# -------
-
-# unite: millimetre
-
-g_ox = 0
-g_oy = 0
-g_oz = 0
-
-g_cyl_rayon = 1000
-g_cyl_demiHauteur = 3000
-
-g_trou_rayon = 5
-g_trou_centre = 300
-
-g_sphere_rayon = 3500
-
-g_trim = 15000
-
-# Cylindre
-# --------
-
-c_point = MakeVertex(g_ox, g_oy, g_oz-g_cyl_demiHauteur)
-c_dir = MakeVectorDXDYDZ(0, 0, 1)
-c_hauteur = 2*g_cyl_demiHauteur
-
-c_cylindre = MakeCylinder(c_point, c_dir, g_cyl_rayon, c_hauteur)
-
-# Sphere
-# ------
-
-s_hauteur = math.sqrt(g_sphere_rayon*g_sphere_rayon - g_cyl_rayon*g_cyl_rayon) - g_cyl_demiHauteur
-
-s_sphere = MakeSphere(g_ox, g_oy, g_oz-s_hauteur, g_sphere_rayon)
-
-# Calottes
-# --------
-
-c_outils = []
-c_outils.append(MakePlane(MakeVertex(g_ox, g_oy, g_oz+g_cyl_demiHauteur), MakeVectorDXDYDZ(0, 0, 1), g_trim))
-
-c_cpd = MakePartition([s_sphere], c_outils, [], [], ShapeType["SOLID"])
-c_calotte_haut, c_reste = SubShapeAllSorted(c_cpd, ShapeType["SOLID"])
-
-c_plan = MakePlane(MakeVertex(g_ox, g_oy, g_oz), MakeVectorDXDYDZ(0, 0, 1), g_trim)
-c_calotte_bas = MakeMirrorByPlane(c_calotte_haut, c_plan)
-
-# Fusionner
-# ---------
-
-f_piece1 = MakeFuse(c_cylindre, c_calotte_haut)
-f_piece = MakeFuse(f_piece1, c_calotte_bas)
-
-# Trouer
-# ------
-
-t_hauteur = g_sphere_rayon
-t_point = MakeVertex(g_ox-g_trou_centre, g_oy, g_oz-t_hauteur)
-t_trou = MakeCylinder(t_point, c_dir, g_trou_rayon, 2*t_hauteur)
-
-t_piece = MakeCut(f_piece, t_trou)
-
-# Decouper
-# --------
-
-h_outils = []
-h_outils.append(MakePlane(t_point, MakeVectorDXDYDZ(1, 0, 0), g_trim))
-h_outils.append(MakePlane(t_point, MakeVectorDXDYDZ(0, 1, 0), g_trim))
-
-h_piece = MakePartition([t_piece], h_outils, [], [], ShapeType["SOLID"])
-
-# Reparer
-# -------
-
-piece = RemoveExtraEdges(h_piece)
-
-# Ajouter la piece dans l'etude
-# -----------------------------
-
-piece_id = addToStudy(piece, "ex18_dome2")
-
-# Maillage
-# ========
-
-# Maillage hexahedrique
-# ---------------------
-
-hexa = smesh.Mesh(piece, "ex18_dome2:hexa")
-
-algo = hexa.Segment()
-algo.NumberOfSegments(2)
-
-hexa.Quadrangle()
-
-hexa.Hexahedron()
-
-# Calcul du maillage
-# ------------------
-
-hexa.Compute()
+++ /dev/null
-# CEA/LGLS 2005, Francis KLOSS (OCC)
-# ==================================
-
-from geompy import *
-
-import smesh
-
-# Geometrie
-# =========
-
-# Mailler en hexahedre une sphere dans un cube.
-
-# Donnees
-# -------
-
-sphere_rayon = 100
-
-cube_cote = 200
-
-plan_trim = 1000
-
-# Sphere
-# ------
-
-sphere_centre = MakeVertex(0, 0, 0)
-
-sphere_pleine = MakeSpherePntR(sphere_centre, sphere_rayon)
-
-# Cube interieur
-# --------------
-
-boite_cote = sphere_rayon / 2
-
-boite = MakeBox(-boite_cote, -boite_cote, -boite_cote, +boite_cote, +boite_cote, +boite_cote)
-
-blocs = [boite]
-
-# Decoupage sphere
-# ----------------
-
-sphere_troue = MakeCut(sphere_pleine, boite)
-
-sphere_outils = []
-sphere_outils.append(MakePlane(sphere_centre, MakeVectorDXDYDZ( 1, 0, 1), plan_trim))
-sphere_outils.append(MakePlane(sphere_centre, MakeVectorDXDYDZ( 1, 0, -1), plan_trim))
-sphere_outils.append(MakePlane(sphere_centre, MakeVectorDXDYDZ( 1, 1, 0), plan_trim))
-sphere_outils.append(MakePlane(sphere_centre, MakeVectorDXDYDZ(-1, 1, 0), plan_trim))
-
-sphere_decoupee = MakePartition([sphere_troue], sphere_outils, [], [], ShapeType["SOLID"])
-
-sphere_partie = GetBlockNearPoint(sphere_decoupee, MakeVertex(-sphere_rayon, 0, 0))
-sphere_bloc = RemoveExtraEdges(sphere_partie)
-
-blocs.append(sphere_bloc)
-
-pi2 = 3.141592653/2
-
-sphere_dir1 = MakeVectorDXDYDZ(0, 1, 0)
-sphere_dir2 = MakeVectorDXDYDZ(0, 0, 1)
-
-blocs.append(MakeRotation(sphere_bloc, sphere_dir1, +pi2))
-blocs.append(MakeRotation(sphere_bloc, sphere_dir1, -pi2))
-
-blocs.append(MakeRotation(sphere_bloc, sphere_dir2, +pi2))
-blocs.append(MakeRotation(sphere_bloc, sphere_dir2, -pi2))
-
-blocs.append(MakeMirrorByPoint(sphere_bloc, sphere_centre))
-
-# Cube exterieur
-# --------------
-
-cube_plein = MakeBox(-cube_cote, -cube_cote, -cube_cote, +cube_cote, +cube_cote, +cube_cote)
-cube_trou = MakeCut(cube_plein, sphere_pleine)
-cube_decoupe = MakePartition([cube_trou], sphere_outils, [], [], ShapeType["SOLID"])
-cube_partie = GetBlockNearPoint(cube_decoupe, MakeVertex(-cube_cote, 0, 0))
-cube_bloc = RemoveExtraEdges(cube_partie)
-
-blocs.append(cube_bloc)
-
-blocs.append(MakeRotation(cube_bloc, sphere_dir1, +pi2))
-blocs.append(MakeRotation(cube_bloc, sphere_dir1, -pi2))
-
-blocs.append(MakeRotation(cube_bloc, sphere_dir2, +pi2))
-blocs.append(MakeRotation(cube_bloc, sphere_dir2, -pi2))
-
-blocs.append(MakeMirrorByPoint(cube_bloc, sphere_centre))
-
-# Piece
-# -----
-
-piece_cpd = MakeCompound(blocs)
-piece = MakeGlueFaces(piece_cpd, 1.e-3)
-
-piece_id = addToStudy(piece, "ex19_sphereINcube")
-
-# Groupe geometrique
-# ==================
-
-# Definition du groupe
-# --------------------
-
-groupe = CreateGroup(piece, ShapeType["SOLID"])
-
-groupe_nom = "ex19_sphereINcube_interieur"
-addToStudy(groupe, groupe_nom)
-groupe.SetName(groupe_nom)
-
-# Contenu du groupe
-# -----------------
-
-groupe_sphere = GetShapesOnSphere(piece, ShapeType["SOLID"], sphere_centre, sphere_rayon, GEOM.ST_ONIN)
-
-UnionList(groupe, groupe_sphere)
-
-# Meshing
-# =======
-
-# Create a hexahedral mesh
-# ------------------------
-
-hexa = smesh.Mesh(piece, "ex19_sphereINcube:hexa")
-
-algo = hexa.Segment()
-algo.NumberOfSegments(10)
-
-hexa.Quadrangle()
-
-hexa.Hexahedron()
-
-# Mesh calculus
-# -------------
-
-hexa.Compute()
-
-# Le groupe de mailles
-# --------------------
-
-hexa_groupe = hexa.Group(groupe)
+++ /dev/null
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : libGeometry_Swig.i
-// Author : Nicolas REJNERI, Paul RASCLE
-// Module : SMESH
-// $Header$
-
-%module libSMESH_Swig
-
-%include "SMESHGUI_Swig.i"
-
+++ /dev/null
-// SMESH SMESH : implementaion of SMESH idl descriptions
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : StdMeshers_Arithmetic1D.cxx
-// Author : Damien COQUERET, OCC
-// Module : SMESH
-// $Header$
-
-using namespace std;
-#include "StdMeshers_Arithmetic1D.hxx"
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-StdMeshers_Arithmetic1D::StdMeshers_Arithmetic1D(int hypId, int studyId,
- SMESH_Gen * gen):SMESH_Hypothesis(hypId, studyId, gen)
-{
- _begLength = 1.;
- _endLength = 1.;
- _name = "Arithmetic1D";
- _param_algo_dim = 1;
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-StdMeshers_Arithmetic1D::~StdMeshers_Arithmetic1D()
-{
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-void StdMeshers_Arithmetic1D::SetLength(double length, bool isStartLength)
- throw(SALOME_Exception)
-{
- if ( (isStartLength ? _begLength : _endLength) != length ) {
- if (length <= 0)
- throw SALOME_Exception(LOCALIZED("length must be positive"));
- if ( isStartLength )
- _begLength = length;
- else
- _endLength = length;
-
- NotifySubMeshesHypothesisModification();
- }
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-double StdMeshers_Arithmetic1D::GetLength(bool isStartLength) const
-{
- return isStartLength ? _begLength : _endLength;
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-ostream & StdMeshers_Arithmetic1D::SaveTo(ostream & save)
-{
- save << _begLength << " " << _endLength;
- return save;
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-istream & StdMeshers_Arithmetic1D::LoadFrom(istream & load)
-{
- bool isOK = true;
- isOK = (load >> _begLength);
- if (!isOK)
- load.clear(ios::badbit | load.rdstate());
- isOK = (load >> _endLength);
- if (!isOK)
- load.clear(ios::badbit | load.rdstate());
- return load;
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-ostream & operator <<(ostream & save, StdMeshers_Arithmetic1D & hyp)
-{
- return hyp.SaveTo( save );
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-istream & operator >>(istream & load, StdMeshers_Arithmetic1D & hyp)
-{
- return hyp.LoadFrom( load );
-}
+++ /dev/null
-// SMESH SMESH : implementaion of SMESH idl descriptions
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : StdMeshers_Arithmetic1D.hxx
-// Author : Damien COQUERET, OCC
-// Module : SMESH
-// $Header$
-
-#ifndef _SMESH_ARITHMETIC1D_HXX_
-#define _SMESH_ARITHMETIC1D_HXX_
-
-#include "SMESH_Hypothesis.hxx"
-#include "Utils_SALOME_Exception.hxx"
-
-class StdMeshers_Arithmetic1D:
- public SMESH_Hypothesis
-{
-public:
- StdMeshers_Arithmetic1D(int hypId, int studyId, SMESH_Gen* gen);
- virtual ~StdMeshers_Arithmetic1D();
-
- void SetLength(double length, bool isStartLength) throw(SALOME_Exception);
-
- double GetLength(bool isStartLength) const;
-
- virtual ostream & SaveTo(ostream & save);
- virtual istream & LoadFrom(istream & load);
- friend ostream& operator << (ostream & save, StdMeshers_Arithmetic1D & hyp);
- friend istream& operator >> (istream & load, StdMeshers_Arithmetic1D & hyp);
-
-protected:
- double _begLength, _endLength;
-};
-
-#endif
+++ /dev/null
-// SMESH StdMeshers_Deflection1D : implementaion of SMESH idl descriptions
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : StdMeshers_Deflection1D.cxx
-// Module : SMESH
-// $Header$
-
-using namespace std;
-
-#include "StdMeshers_Deflection1D.hxx"
-#include "utilities.h"
-
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-StdMeshers_Deflection1D::StdMeshers_Deflection1D(int hypId,
- int studyId,
- SMESH_Gen * gen)
- :SMESH_Hypothesis(hypId, studyId, gen)
-{
- _value = 1.;
- _name = "Deflection1D";
- _param_algo_dim = 1; // is used by SMESH_Regular_1D
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-StdMeshers_Deflection1D::~StdMeshers_Deflection1D()
-{
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-void StdMeshers_Deflection1D::SetDeflection(double value)
- throw(SALOME_Exception)
-{
- if (_value != value) {
- if (value <= 0.)
- throw SALOME_Exception(LOCALIZED("Value must be positive"));
-
- NotifySubMeshesHypothesisModification();
-
- _value = value;
- }
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-double StdMeshers_Deflection1D::GetDeflection() const
-{
- return _value;
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-ostream & StdMeshers_Deflection1D::SaveTo(ostream & save)
-{
- save << _value;
- return save;
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-istream & StdMeshers_Deflection1D::LoadFrom(istream & load)
-{
- bool isOK = (load >> _value);
- if (!isOK)
- load.clear(ios::badbit | load.rdstate());
- return load;
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-ostream & operator <<(ostream & save, StdMeshers_Deflection1D & hyp)
-{
- return hyp.SaveTo( save );
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-istream & operator >>(istream & load, StdMeshers_Deflection1D & hyp)
-{
- return hyp.LoadFrom( load );
-}
+++ /dev/null
-// SMESH StdMeshers : implementaion of SMESH idl descriptions
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : StdMeshers_Deflection1D.hxx
-// Module : SMESH
-// $Header$
-
-#ifndef _StdMeshers_Deflection1D_HXX_
-#define _StdMeshers_Deflection1D_HXX_
-
-#include "SMESH_Hypothesis.hxx"
-#include "Utils_SALOME_Exception.hxx"
-
-class StdMeshers_Deflection1D:public SMESH_Hypothesis
-{
- public:
- StdMeshers_Deflection1D(int hypId, int studyId, SMESH_Gen * gen);
- virtual ~ StdMeshers_Deflection1D();
-
- void SetDeflection(double value) throw(SALOME_Exception);
-
- double GetDeflection() const;
-
- virtual ostream & SaveTo(ostream & save);
- virtual istream & LoadFrom(istream & load);
- friend ostream & operator <<(ostream & save, StdMeshers_Deflection1D & hyp);
- friend istream & operator >>(istream & load, StdMeshers_Deflection1D & hyp);
-
- protected:
- double _value;
-};
-
-#endif
+++ /dev/null
-// SMESH SMESH : implementaion of SMESH idl descriptions
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : StdMeshers_Hexa_3D.cxx
-// Moved here from SMESH_Hexa_3D.cxx
-// Author : Paul RASCLE, EDF
-// Module : SMESH
-// $Header$
-
-using namespace std;
-#include "StdMeshers_Hexa_3D.hxx"
-#include "StdMeshers_Quadrangle_2D.hxx"
-#include "SMESH_Gen.hxx"
-#include "SMESH_Mesh.hxx"
-#include "SMESH_subMesh.hxx"
-
-#include "SMDS_MeshElement.hxx"
-#include "SMDS_MeshNode.hxx"
-#include "SMDS_FacePosition.hxx"
-#include "SMDS_VolumeTool.hxx"
-#include "SMDS_VolumeOfNodes.hxx"
-
-#include <TopExp.hxx>
-#include <TopTools_IndexedDataMapOfShapeListOfShape.hxx>
-#include <TopTools_ListOfShape.hxx>
-#include <TopTools_ListIteratorOfListOfShape.hxx>
-#include <TColStd_ListIteratorOfListOfInteger.hxx>
-
-#include <BRep_Tool.hxx>
-#include <Geom_Surface.hxx>
-#include <Geom_Curve.hxx>
-#include <Geom2d_Curve.hxx>
-#include <Handle_Geom2d_Curve.hxx>
-#include <Handle_Geom_Curve.hxx>
-#include <gp_Pnt2d.hxx>
-
-#include "utilities.h"
-#include "Utils_ExceptHandlers.hxx"
-
-//modified by NIZNHY-PKV Wed Nov 17 15:31:58 2004 f
-#include "StdMeshers_Penta_3D.hxx"
-
-static bool ComputePentahedralMesh(SMESH_Mesh & aMesh, const TopoDS_Shape & aShape);
-//modified by NIZNHY-PKV Wed Nov 17 15:32:00 2004 t
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-StdMeshers_Hexa_3D::StdMeshers_Hexa_3D(int hypId, int studyId,
- SMESH_Gen * gen):SMESH_3D_Algo(hypId, studyId, gen)
-{
- MESSAGE("StdMeshers_Hexa_3D::StdMeshers_Hexa_3D");
- _name = "Hexa_3D";
-// _shapeType = TopAbs_SOLID;
- _shapeType = (1 << TopAbs_SHELL) | (1 << TopAbs_SOLID); // 1 bit /shape type
-// MESSAGE("_shapeType octal " << oct << _shapeType);
- for (int i = 0; i < 6; i++)
- _quads[i] = 0;
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-StdMeshers_Hexa_3D::~StdMeshers_Hexa_3D()
-{
- MESSAGE("StdMeshers_Hexa_3D::~StdMeshers_Hexa_3D");
- for (int i = 0; i < 6; i++)
- StdMeshers_Quadrangle_2D::QuadDelete(_quads[i]);
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-bool StdMeshers_Hexa_3D::CheckHypothesis
- (SMESH_Mesh& aMesh,
- const TopoDS_Shape& aShape,
- SMESH_Hypothesis::Hypothesis_Status& aStatus)
-{
- //MESSAGE("StdMeshers_Hexa_3D::CheckHypothesis");
-
- bool isOk = true;
- aStatus = SMESH_Hypothesis::HYP_OK;
-
- // nothing to check
-
- return isOk;
-}
-
-//=======================================================================
-//function : findIJ
-//purpose : return i,j of the node
-//=======================================================================
-
-static bool findIJ (const SMDS_MeshNode* node, const FaceQuadStruct * quad, int& I, int& J)
-{
- I = J = 0;
- const SMDS_FacePosition* fpos =
- static_cast<const SMDS_FacePosition*>(node->GetPosition().get());
- if ( ! fpos ) return false;
- gp_Pnt2d uv( fpos->GetUParameter(), fpos->GetVParameter() );
-
- double minDist = DBL_MAX;
- int nbhoriz = Min(quad->nbPts[0], quad->nbPts[2]);
- int nbvertic = Min(quad->nbPts[1], quad->nbPts[3]);
- for (int i = 1; i < nbhoriz - 1; i++) {
- for (int j = 1; j < nbvertic - 1; j++) {
- int ij = j * nbhoriz + i;
- gp_Pnt2d uv2( quad->uv_grid[ij].u, quad->uv_grid[ij].v );
- double dist = uv.SquareDistance( uv2 );
- if ( dist < minDist ) {
- minDist = dist;
- I = i;
- J = j;
- }
- }
- }
- return true;
-}
-
-//=============================================================================
-/*!
- * Hexahedron mesh on hexaedron like form
- * -0. - shape and face mesh verification
- * -1. - identify faces and vertices of the "cube"
- * -2. - Algorithm from:
- * "Application de l'interpolation transfinie à la création de maillages
- * C0 ou G1 continus sur des triangles, quadrangles, tetraedres, pentaedres
- * et hexaedres déformés."
- * Alain PERONNET - 8 janvier 1999
- */
-//=============================================================================
-
-bool StdMeshers_Hexa_3D::Compute(SMESH_Mesh & aMesh,
- const TopoDS_Shape & aShape)throw(SALOME_Exception)
-{
- Unexpect aCatch(SalomeException);
- MESSAGE("StdMeshers_Hexa_3D::Compute");
- //bool isOk = false;
- SMESHDS_Mesh * meshDS = aMesh.GetMeshDS();
- //SMESH_subMesh *theSubMesh = aMesh.GetSubMesh(aShape);
- //const SMESHDS_SubMesh *& subMeshDS = theSubMesh->GetSubMeshDS();
-
- // 0. - shape and face mesh verification
- // 0.1 - shape must be a solid (or a shell) with 6 faces
- //MESSAGE("---");
-
- vector < SMESH_subMesh * >meshFaces;
- for (TopExp_Explorer exp(aShape, TopAbs_FACE); exp.More(); exp.Next())
- {
- SMESH_subMesh *aSubMesh = aMesh.GetSubMeshContaining(exp.Current());
- ASSERT(aSubMesh);
- meshFaces.push_back(aSubMesh);
- }
- if (meshFaces.size() != 6)
- {
- SCRUTE(meshFaces.size());
-// ASSERT(0);
- return false;
- }
-
- // 0.2 - is each face meshed with Quadrangle_2D? (so, with a wire of 4 edges)
- //MESSAGE("---");
-
- for (int i = 0; i < 6; i++)
- {
- TopoDS_Shape aFace = meshFaces[i]->GetSubShape();
- SMESH_Algo *algo = _gen->GetAlgo(aMesh, aFace);
- string algoName = algo->GetName();
- bool isAllQuad = false;
- if (algoName == "Quadrangle_2D") {
- SMESHDS_SubMesh * sm = meshDS->MeshElements( aFace );
- if ( sm ) {
- isAllQuad = true;
- SMDS_ElemIteratorPtr eIt = sm->GetElements();
- while ( isAllQuad && eIt->more() )
- isAllQuad = ( eIt->next()->NbNodes() == 4 );
- }
- }
- if ( ! isAllQuad ) {
- //modified by NIZNHY-PKV Wed Nov 17 15:31:37 2004 f
- bool bIsOk;
- //
- bIsOk=ComputePentahedralMesh(aMesh, aShape);
- if (bIsOk) {
- return true;
- }
- //modified by NIZNHY-PKV Wed Nov 17 15:31:42 2004 t
- SCRUTE(algoName);
- // ASSERT(0);
- return false;
- }
- StdMeshers_Quadrangle_2D *quadAlgo =
- dynamic_cast < StdMeshers_Quadrangle_2D * >(algo);
- ASSERT(quadAlgo);
- try
- {
- _quads[i] = quadAlgo->CheckAnd2Dcompute(aMesh, aFace);
- // *** to delete after usage
- }
- catch(SALOME_Exception & S_ex)
- {
- // *** delete _quads
- // *** throw exception
- // ASSERT(0);
- return false;
- }
-
- // 0.2.1 - number of points on the opposite edges must be the same
- if (_quads[i]->nbPts[0] != _quads[i]->nbPts[2] ||
- _quads[i]->nbPts[1] != _quads[i]->nbPts[3])
- {
- MESSAGE("different number of points on the opposite edges of face " << i);
- // ASSERT(0);
- return false;
- }
- }
-
- // 1. - identify faces and vertices of the "cube"
- // 1.1 - ancestor maps vertex->edges in the cube
- //MESSAGE("---");
-
- TopTools_IndexedDataMapOfShapeListOfShape MS;
- TopExp::MapShapesAndAncestors(aShape, TopAbs_VERTEX, TopAbs_EDGE, MS);
-
- // 1.2 - first face is choosen as face Y=0 of the unit cube
- //MESSAGE("---");
-
- const TopoDS_Shape & aFace = meshFaces[0]->GetSubShape();
- const TopoDS_Face & F = TopoDS::Face(aFace);
-
- // 1.3 - identify the 4 vertices of the face Y=0: V000, V100, V101, V001
- //MESSAGE("---");
-
- int i = 0;
- TopoDS_Edge E = _quads[0]->edge[i]; //edge will be Y=0,Z=0 on unit cube
- double f, l;
- Handle(Geom2d_Curve) C2d = BRep_Tool::CurveOnSurface(E, F, f, l);
- TopoDS_Vertex VFirst, VLast;
- TopExp::Vertices(E, VFirst, VLast); // corresponds to f and l
- bool isForward =
- (((l - f) * (_quads[0]->last[i] - _quads[0]->first[i])) > 0);
-
- if (isForward)
- {
- _cube.V000 = VFirst; // will be (0,0,0) on the unit cube
- _cube.V100 = VLast; // will be (1,0,0) on the unit cube
- }
- else
- {
- _cube.V000 = VLast;
- _cube.V100 = VFirst;
- }
-
- i = 1;
- E = _quads[0]->edge[i];
- C2d = BRep_Tool::CurveOnSurface(E, F, f, l);
- TopExp::Vertices(E, VFirst, VLast);
- isForward = (((l - f) * (_quads[0]->last[i] - _quads[0]->first[i])) > 0);
- if (isForward)
- _cube.V101 = VLast; // will be (1,0,1) on the unit cube
- else
- _cube.V101 = VFirst;
-
- i = 2;
- E = _quads[0]->edge[i];
- C2d = BRep_Tool::CurveOnSurface(E, F, f, l);
- TopExp::Vertices(E, VFirst, VLast);
- isForward = (((l - f) * (_quads[0]->last[i] - _quads[0]->first[i])) > 0);
- if (isForward)
- _cube.V001 = VLast; // will be (0,0,1) on the unit cube
- else
- _cube.V001 = VFirst;
-
- // 1.4 - find edge X=0, Z=0 (ancestor of V000 not in face Y=0)
- // - find edge X=1, Z=0 (ancestor of V100 not in face Y=0)
- // - find edge X=1, Z=1 (ancestor of V101 not in face Y=0)
- // - find edge X=0, Z=1 (ancestor of V001 not in face Y=0)
- //MESSAGE("---");
-
- TopoDS_Edge E_0Y0 = EdgeNotInFace(aMesh, aShape, F, _cube.V000, MS);
- ASSERT(!E_0Y0.IsNull());
-
- TopoDS_Edge E_1Y0 = EdgeNotInFace(aMesh, aShape, F, _cube.V100, MS);
- ASSERT(!E_1Y0.IsNull());
-
- TopoDS_Edge E_1Y1 = EdgeNotInFace(aMesh, aShape, F, _cube.V101, MS);
- ASSERT(!E_1Y1.IsNull());
-
- TopoDS_Edge E_0Y1 = EdgeNotInFace(aMesh, aShape, F, _cube.V001, MS);
- ASSERT(!E_0Y1.IsNull());
-
- // 1.5 - identify the 4 vertices in face Y=1: V010, V110, V111, V011
- //MESSAGE("---");
-
- TopExp::Vertices(E_0Y0, VFirst, VLast);
- if (VFirst.IsSame(_cube.V000))
- _cube.V010 = VLast;
- else
- _cube.V010 = VFirst;
-
- TopExp::Vertices(E_1Y0, VFirst, VLast);
- if (VFirst.IsSame(_cube.V100))
- _cube.V110 = VLast;
- else
- _cube.V110 = VFirst;
-
- TopExp::Vertices(E_1Y1, VFirst, VLast);
- if (VFirst.IsSame(_cube.V101))
- _cube.V111 = VLast;
- else
- _cube.V111 = VFirst;
-
- TopExp::Vertices(E_0Y1, VFirst, VLast);
- if (VFirst.IsSame(_cube.V001))
- _cube.V011 = VLast;
- else
- _cube.V011 = VFirst;
-
- // 1.6 - find remaining faces given 4 vertices
- //MESSAGE("---");
-
- _indY0 = 0;
- _cube.quad_Y0 = _quads[_indY0];
-
- _indY1 = GetFaceIndex(aMesh, aShape, meshFaces,
- _cube.V010, _cube.V011, _cube.V110, _cube.V111);
- _cube.quad_Y1 = _quads[_indY1];
-
- _indZ0 = GetFaceIndex(aMesh, aShape, meshFaces,
- _cube.V000, _cube.V010, _cube.V100, _cube.V110);
- _cube.quad_Z0 = _quads[_indZ0];
-
- _indZ1 = GetFaceIndex(aMesh, aShape, meshFaces,
- _cube.V001, _cube.V011, _cube.V101, _cube.V111);
- _cube.quad_Z1 = _quads[_indZ1];
-
- _indX0 = GetFaceIndex(aMesh, aShape, meshFaces,
- _cube.V000, _cube.V001, _cube.V010, _cube.V011);
- _cube.quad_X0 = _quads[_indX0];
-
- _indX1 = GetFaceIndex(aMesh, aShape, meshFaces,
- _cube.V100, _cube.V101, _cube.V110, _cube.V111);
- _cube.quad_X1 = _quads[_indX1];
-
- //MESSAGE("---");
-
- // 1.7 - get convertion coefs from face 2D normalized to 3D normalized
-
- Conv2DStruct cx0; // for face X=0
- Conv2DStruct cx1; // for face X=1
- Conv2DStruct cy0;
- Conv2DStruct cy1;
- Conv2DStruct cz0;
- Conv2DStruct cz1;
-
- GetConv2DCoefs(*_cube.quad_X0, meshFaces[_indX0]->GetSubShape(),
- _cube.V000, _cube.V010, _cube.V011, _cube.V001, cx0);
- GetConv2DCoefs(*_cube.quad_X1, meshFaces[_indX1]->GetSubShape(),
- _cube.V100, _cube.V110, _cube.V111, _cube.V101, cx1);
- GetConv2DCoefs(*_cube.quad_Y0, meshFaces[_indY0]->GetSubShape(),
- _cube.V000, _cube.V100, _cube.V101, _cube.V001, cy0);
- GetConv2DCoefs(*_cube.quad_Y1, meshFaces[_indY1]->GetSubShape(),
- _cube.V010, _cube.V110, _cube.V111, _cube.V011, cy1);
- GetConv2DCoefs(*_cube.quad_Z0, meshFaces[_indZ0]->GetSubShape(),
- _cube.V000, _cube.V100, _cube.V110, _cube.V010, cz0);
- GetConv2DCoefs(*_cube.quad_Z1, meshFaces[_indZ1]->GetSubShape(),
- _cube.V001, _cube.V101, _cube.V111, _cube.V011, cz1);
-
- // 1.8 - create a 3D structure for normalized values
-
- //MESSAGE("---");
- int nbx = _cube.quad_Z0->nbPts[0];
- if (cz0.a1 == 0.) nbx = _cube.quad_Z0->nbPts[1];
-
- int nby = _cube.quad_X0->nbPts[0];
- if (cx0.a1 == 0.) nby = _cube.quad_X0->nbPts[1];
-
- int nbz = _cube.quad_Y0->nbPts[0];
- if (cy0.a1 != 0.) nbz = _cube.quad_Y0->nbPts[1];
-
- int i1, j1, nbxyz = nbx * nby * nbz;
- Point3DStruct *np = new Point3DStruct[nbxyz];
-
- // 1.9 - store node indexes of faces
-
- {
- const TopoDS_Face & F = TopoDS::Face(meshFaces[_indX0]->GetSubShape());
-
- faceQuadStruct *quad = _cube.quad_X0;
- int i = 0; // j = x/face , k = y/face
- int nbdown = quad->nbPts[0];
- int nbright = quad->nbPts[1];
-
-
- SMDS_NodeIteratorPtr itf= aMesh.GetSubMesh(F)->GetSubMeshDS()->GetNodes();
-
- while(itf->more())
- {
- const SMDS_MeshNode * node = itf->next();
- findIJ( node, quad, i1, j1 );
- int ij1 = j1 * nbdown + i1;
- quad->uv_grid[ij1].node = node;
- }
-
- for (int i1 = 0; i1 < nbdown; i1++)
- for (int j1 = 0; j1 < nbright; j1++)
- {
- int ij1 = j1 * nbdown + i1;
- int j = cx0.ia * i1 + cx0.ib * j1 + cx0.ic; // j = x/face
- int k = cx0.ja * i1 + cx0.jb * j1 + cx0.jc; // k = y/face
- int ijk = k * nbx * nby + j * nbx + i;
- //MESSAGE(" "<<ij1<<" "<<i<<" "<<j<<" "<<ijk);
- np[ijk].node = quad->uv_grid[ij1].node;
- //SCRUTE(np[ijk].nodeId);
- }
- }
-
- {
- const TopoDS_Face & F = TopoDS::Face(meshFaces[_indX1]->GetSubShape());
-
- SMDS_NodeIteratorPtr itf= aMesh.GetSubMesh(F)->GetSubMeshDS()->GetNodes();
-
- faceQuadStruct *quad = _cube.quad_X1;
- int i = nbx - 1; // j = x/face , k = y/face
- int nbdown = quad->nbPts[0];
- int nbright = quad->nbPts[1];
-
- while(itf->more())
- {
- const SMDS_MeshNode * node = itf->next();
- findIJ( node, quad, i1, j1 );
- int ij1 = j1 * nbdown + i1;
- quad->uv_grid[ij1].node = node;
- }
-
- for (int i1 = 0; i1 < nbdown; i1++)
- for (int j1 = 0; j1 < nbright; j1++)
- {
- int ij1 = j1 * nbdown + i1;
- int j = cx1.ia * i1 + cx1.ib * j1 + cx1.ic; // j = x/face
- int k = cx1.ja * i1 + cx1.jb * j1 + cx1.jc; // k = y/face
- int ijk = k * nbx * nby + j * nbx + i;
- //MESSAGE(" "<<ij1<<" "<<i<<" "<<j<<" "<<ijk);
- np[ijk].node = quad->uv_grid[ij1].node;
- //SCRUTE(np[ijk].nodeId);
- }
- }
-
- {
- const TopoDS_Face & F = TopoDS::Face(meshFaces[_indY0]->GetSubShape());
-
- SMDS_NodeIteratorPtr itf= aMesh.GetSubMesh(F)->GetSubMeshDS()->GetNodes();
-
- faceQuadStruct *quad = _cube.quad_Y0;
- int j = 0; // i = x/face , k = y/face
- int nbdown = quad->nbPts[0];
- int nbright = quad->nbPts[1];
-
- while(itf->more())
- {
- const SMDS_MeshNode * node = itf->next();
- findIJ( node, quad, i1, j1 );
- int ij1 = j1 * nbdown + i1;
- quad->uv_grid[ij1].node = node;
- }
-
- for (int i1 = 0; i1 < nbdown; i1++)
- for (int j1 = 0; j1 < nbright; j1++)
- {
- int ij1 = j1 * nbdown + i1;
- int i = cy0.ia * i1 + cy0.ib * j1 + cy0.ic; // i = x/face
- int k = cy0.ja * i1 + cy0.jb * j1 + cy0.jc; // k = y/face
- int ijk = k * nbx * nby + j * nbx + i;
- //MESSAGE(" "<<ij1<<" "<<i<<" "<<j<<" "<<ijk);
- np[ijk].node = quad->uv_grid[ij1].node;
- //SCRUTE(np[ijk].nodeId);
- }
- }
-
- {
- const TopoDS_Face & F = TopoDS::Face(meshFaces[_indY1]->GetSubShape());
-
- SMDS_NodeIteratorPtr itf= aMesh.GetSubMesh(F)->GetSubMeshDS()->GetNodes();
-
- faceQuadStruct *quad = _cube.quad_Y1;
- int j = nby - 1; // i = x/face , k = y/face
- int nbdown = quad->nbPts[0];
- int nbright = quad->nbPts[1];
-
- while(itf->more())
- {
- const SMDS_MeshNode * node = itf->next();
- findIJ( node, quad, i1, j1 );
- int ij1 = j1 * nbdown + i1;
- quad->uv_grid[ij1].node = node;
- }
-
- for (int i1 = 0; i1 < nbdown; i1++)
- for (int j1 = 0; j1 < nbright; j1++)
- {
- int ij1 = j1 * nbdown + i1;
- int i = cy1.ia * i1 + cy1.ib * j1 + cy1.ic; // i = x/face
- int k = cy1.ja * i1 + cy1.jb * j1 + cy1.jc; // k = y/face
- int ijk = k * nbx * nby + j * nbx + i;
- //MESSAGE(" "<<ij1<<" "<<i<<" "<<j<<" "<<ijk);
- np[ijk].node = quad->uv_grid[ij1].node;
- //SCRUTE(np[ijk].nodeId);
- }
- }
-
- {
- const TopoDS_Face & F = TopoDS::Face(meshFaces[_indZ0]->GetSubShape());
-
- SMDS_NodeIteratorPtr itf= aMesh.GetSubMesh(F)->GetSubMeshDS()->GetNodes();
-
- faceQuadStruct *quad = _cube.quad_Z0;
- int k = 0; // i = x/face , j = y/face
- int nbdown = quad->nbPts[0];
- int nbright = quad->nbPts[1];
-
- while(itf->more())
- {
- const SMDS_MeshNode * node = itf->next();
- findIJ( node, quad, i1, j1 );
- int ij1 = j1 * nbdown + i1;
- quad->uv_grid[ij1].node = node;
- }
-
- for (int i1 = 0; i1 < nbdown; i1++)
- for (int j1 = 0; j1 < nbright; j1++)
- {
- int ij1 = j1 * nbdown + i1;
- int i = cz0.ia * i1 + cz0.ib * j1 + cz0.ic; // i = x/face
- int j = cz0.ja * i1 + cz0.jb * j1 + cz0.jc; // j = y/face
- int ijk = k * nbx * nby + j * nbx + i;
- //MESSAGE(" "<<ij1<<" "<<i<<" "<<j<<" "<<ijk);
- np[ijk].node = quad->uv_grid[ij1].node;
- //SCRUTE(np[ijk].nodeId);
- }
- }
-
- {
- const TopoDS_Face & F = TopoDS::Face(meshFaces[_indZ1]->GetSubShape());
-
- SMDS_NodeIteratorPtr itf= aMesh.GetSubMesh(F)->GetSubMeshDS()->GetNodes();
-
- faceQuadStruct *quad = _cube.quad_Z1;
- int k = nbz - 1; // i = x/face , j = y/face
- int nbdown = quad->nbPts[0];
- int nbright = quad->nbPts[1];
-
- while(itf->more())
- {
- const SMDS_MeshNode * node = itf->next();
- findIJ( node, quad, i1, j1 );
- int ij1 = j1 * nbdown + i1;
- quad->uv_grid[ij1].node = node;
- }
-
- for (int i1 = 0; i1 < nbdown; i1++)
- for (int j1 = 0; j1 < nbright; j1++)
- {
- int ij1 = j1 * nbdown + i1;
- int i = cz1.ia * i1 + cz1.ib * j1 + cz1.ic; // i = x/face
- int j = cz1.ja * i1 + cz1.jb * j1 + cz1.jc; // j = y/face
- int ijk = k * nbx * nby + j * nbx + i;
- //MESSAGE(" "<<ij1<<" "<<i<<" "<<j<<" "<<ijk);
- np[ijk].node = quad->uv_grid[ij1].node;
- //SCRUTE(np[ijk].nodeId);
- }
- }
-
- // 2.0 - for each node of the cube:
- // - get the 8 points 3D = 8 vertices of the cube
- // - get the 12 points 3D on the 12 edges of the cube
- // - get the 6 points 3D on the 6 faces with their ID
- // - compute the point 3D
- // - store the point 3D in SMESHDS, store its ID in 3D structure
-
- int shapeID = meshDS->ShapeToIndex( aShape );
-
- Pt3 p000, p001, p010, p011, p100, p101, p110, p111;
- Pt3 px00, px01, px10, px11;
- Pt3 p0y0, p0y1, p1y0, p1y1;
- Pt3 p00z, p01z, p10z, p11z;
- Pt3 pxy0, pxy1, px0z, px1z, p0yz, p1yz;
-
- GetPoint(p000, 0, 0, 0, nbx, nby, nbz, np, meshDS);
- GetPoint(p001, 0, 0, nbz - 1, nbx, nby, nbz, np, meshDS);
- GetPoint(p010, 0, nby - 1, 0, nbx, nby, nbz, np, meshDS);
- GetPoint(p011, 0, nby - 1, nbz - 1, nbx, nby, nbz, np, meshDS);
- GetPoint(p100, nbx - 1, 0, 0, nbx, nby, nbz, np, meshDS);
- GetPoint(p101, nbx - 1, 0, nbz - 1, nbx, nby, nbz, np, meshDS);
- GetPoint(p110, nbx - 1, nby - 1, 0, nbx, nby, nbz, np, meshDS);
- GetPoint(p111, nbx - 1, nby - 1, nbz - 1, nbx, nby, nbz, np, meshDS);
-
- for (int i = 1; i < nbx - 1; i++)
- {
- for (int j = 1; j < nby - 1; j++)
- {
- for (int k = 1; k < nbz - 1; k++)
- {
- // *** seulement maillage regulier
- // 12 points on edges
- GetPoint(px00, i, 0, 0, nbx, nby, nbz, np, meshDS);
- GetPoint(px01, i, 0, nbz - 1, nbx, nby, nbz, np, meshDS);
- GetPoint(px10, i, nby - 1, 0, nbx, nby, nbz, np, meshDS);
- GetPoint(px11, i, nby - 1, nbz - 1, nbx, nby, nbz, np, meshDS);
-
- GetPoint(p0y0, 0, j, 0, nbx, nby, nbz, np, meshDS);
- GetPoint(p0y1, 0, j, nbz - 1, nbx, nby, nbz, np, meshDS);
- GetPoint(p1y0, nbx - 1, j, 0, nbx, nby, nbz, np, meshDS);
- GetPoint(p1y1, nbx - 1, j, nbz - 1, nbx, nby, nbz, np, meshDS);
-
- GetPoint(p00z, 0, 0, k, nbx, nby, nbz, np, meshDS);
- GetPoint(p01z, 0, nby - 1, k, nbx, nby, nbz, np, meshDS);
- GetPoint(p10z, nbx - 1, 0, k, nbx, nby, nbz, np, meshDS);
- GetPoint(p11z, nbx - 1, nby - 1, k, nbx, nby, nbz, np, meshDS);
-
- // 12 points on faces
- GetPoint(pxy0, i, j, 0, nbx, nby, nbz, np, meshDS);
- GetPoint(pxy1, i, j, nbz - 1, nbx, nby, nbz, np, meshDS);
- GetPoint(px0z, i, 0, k, nbx, nby, nbz, np, meshDS);
- GetPoint(px1z, i, nby - 1, k, nbx, nby, nbz, np, meshDS);
- GetPoint(p0yz, 0, j, k, nbx, nby, nbz, np, meshDS);
- GetPoint(p1yz, nbx - 1, j, k, nbx, nby, nbz, np, meshDS);
-
- int ijk = k * nbx * nby + j * nbx + i;
- double x = double (i) / double (nbx - 1); // *** seulement
- double y = double (j) / double (nby - 1); // *** maillage
- double z = double (k) / double (nbz - 1); // *** regulier
-
- Pt3 X;
- for (int i = 0; i < 3; i++)
- {
- X[i] =
- (1 - x) * p0yz[i] + x * p1yz[i]
- + (1 - y) * px0z[i] + y * px1z[i]
- + (1 - z) * pxy0[i] + z * pxy1[i]
- - (1 - x) * ((1 - y) * p00z[i] + y * p01z[i])
- - x * ((1 - y) * p10z[i] + y * p11z[i])
- - (1 - y) * ((1 - z) * px00[i] + z * px01[i])
- - y * ((1 - z) * px10[i] + z * px11[i])
- - (1 - z) * ((1 - x) * p0y0[i] + x * p1y0[i])
- - z * ((1 - x) * p0y1[i] + x * p1y1[i])
- + (1 - x) * ((1 - y) * ((1 - z) * p000[i] + z * p001[i])
- + y * ((1 - z) * p010[i] + z * p011[i]))
- + x * ((1 - y) * ((1 - z) * p100[i] + z * p101[i])
- + y * ((1 - z) * p110[i] + z * p111[i]));
- }
-
- SMDS_MeshNode * node = meshDS->AddNode(X[0], X[1], X[2]);
- np[ijk].node = node;
- meshDS->SetNodeInVolume(node, shapeID);
- }
- }
- }
-
- // find orientation of furute volumes according to MED convention
- vector< bool > forward( nbx * nby );
- SMDS_VolumeTool vTool;
- for (int i = 0; i < nbx - 1; i++)
- for (int j = 0; j < nby - 1; j++)
- {
- int n1 = j * nbx + i;
- int n2 = j * nbx + i + 1;
- int n3 = (j + 1) * nbx + i + 1;
- int n4 = (j + 1) * nbx + i;
- int n5 = nbx * nby + j * nbx + i;
- int n6 = nbx * nby + j * nbx + i + 1;
- int n7 = nbx * nby + (j + 1) * nbx + i + 1;
- int n8 = nbx * nby + (j + 1) * nbx + i;
-
- SMDS_VolumeOfNodes tmpVol (np[n1].node,np[n2].node,np[n3].node,np[n4].node,
- np[n5].node,np[n6].node,np[n7].node,np[n8].node);
- vTool.Set( &tmpVol );
- forward[ n1 ] = vTool.IsForward();
- }
-
- //2.1 - for each node of the cube (less 3 *1 Faces):
- // - store hexahedron in SMESHDS
- MESSAGE("Storing hexahedron into the DS");
- for (int i = 0; i < nbx - 1; i++)
- for (int j = 0; j < nby - 1; j++)
- {
- bool isForw = forward.at( j * nbx + i );
- for (int k = 0; k < nbz - 1; k++)
- {
- int n1 = k * nbx * nby + j * nbx + i;
- int n2 = k * nbx * nby + j * nbx + i + 1;
- int n3 = k * nbx * nby + (j + 1) * nbx + i + 1;
- int n4 = k * nbx * nby + (j + 1) * nbx + i;
- int n5 = (k + 1) * nbx * nby + j * nbx + i;
- int n6 = (k + 1) * nbx * nby + j * nbx + i + 1;
- int n7 = (k + 1) * nbx * nby + (j + 1) * nbx + i + 1;
- int n8 = (k + 1) * nbx * nby + (j + 1) * nbx + i;
-
- SMDS_MeshVolume * elt;
- if ( isForw )
- elt = meshDS->AddVolume(np[n1].node,
- np[n2].node,
- np[n3].node,
- np[n4].node,
- np[n5].node,
- np[n6].node,
- np[n7].node,
- np[n8].node);
- else
- elt = meshDS->AddVolume(np[n1].node,
- np[n4].node,
- np[n3].node,
- np[n2].node,
- np[n5].node,
- np[n8].node,
- np[n7].node,
- np[n6].node);
-
- meshDS->SetMeshElementOnShape(elt, shapeID);
- }
- }
- if ( np ) delete [] np;
- //MESSAGE("End of StdMeshers_Hexa_3D::Compute()");
- return true;
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-void StdMeshers_Hexa_3D::GetPoint(Pt3 p, int i, int j, int k, int nbx, int nby,
- int nbz, Point3DStruct * np, const SMESHDS_Mesh * meshDS)
-{
- int ijk = k * nbx * nby + j * nbx + i;
- const SMDS_MeshNode * node = np[ijk].node;
- p[0] = node->X();
- p[1] = node->Y();
- p[2] = node->Z();
- //MESSAGE(" "<<i<<" "<<j<<" "<<k<<" "<<p[0]<<" "<<p[1]<<" "<<p[2]);
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-int StdMeshers_Hexa_3D::GetFaceIndex(SMESH_Mesh & aMesh,
- const TopoDS_Shape & aShape,
- const vector < SMESH_subMesh * >&meshFaces,
- const TopoDS_Vertex & V0,
- const TopoDS_Vertex & V1,
- const TopoDS_Vertex & V2, const TopoDS_Vertex & V3)
-{
- //MESSAGE("StdMeshers_Hexa_3D::GetFaceIndex");
- int faceIndex = -1;
- for (int i = 1; i < 6; i++)
- {
- const TopoDS_Shape & aFace = meshFaces[i]->GetSubShape();
- //const TopoDS_Face& F = TopoDS::Face(aFace);
- TopTools_IndexedMapOfShape M;
- TopExp::MapShapes(aFace, TopAbs_VERTEX, M);
- bool verticesInShape = false;
- if (M.Contains(V0))
- if (M.Contains(V1))
- if (M.Contains(V2))
- if (M.Contains(V3))
- verticesInShape = true;
- if (verticesInShape)
- {
- faceIndex = i;
- break;
- }
- }
- ASSERT(faceIndex > 0);
- //SCRUTE(faceIndex);
- return faceIndex;
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-TopoDS_Edge
- StdMeshers_Hexa_3D::EdgeNotInFace(SMESH_Mesh & aMesh,
- const TopoDS_Shape & aShape,
- const TopoDS_Face & aFace,
- const TopoDS_Vertex & aVertex,
- const TopTools_IndexedDataMapOfShapeListOfShape & MS)
-{
- //MESSAGE("StdMeshers_Hexa_3D::EdgeNotInFace");
- TopTools_IndexedDataMapOfShapeListOfShape MF;
- TopExp::MapShapesAndAncestors(aFace, TopAbs_VERTEX, TopAbs_EDGE, MF);
- const TopTools_ListOfShape & ancestorsInSolid = MS.FindFromKey(aVertex);
- const TopTools_ListOfShape & ancestorsInFace = MF.FindFromKey(aVertex);
-// SCRUTE(ancestorsInSolid.Extent());
-// SCRUTE(ancestorsInFace.Extent());
- ASSERT(ancestorsInSolid.Extent() == 6); // 6 (edges doublees)
- ASSERT(ancestorsInFace.Extent() == 2);
-
- TopoDS_Edge E;
- E.Nullify();
- TopTools_ListIteratorOfListOfShape its(ancestorsInSolid);
- for (; its.More(); its.Next())
- {
- TopoDS_Shape ancestor = its.Value();
- TopTools_ListIteratorOfListOfShape itf(ancestorsInFace);
- bool isInFace = false;
- for (; itf.More(); itf.Next())
- {
- TopoDS_Shape ancestorInFace = itf.Value();
- if (ancestorInFace.IsSame(ancestor))
- {
- isInFace = true;
- break;
- }
- }
- if (!isInFace)
- {
- E = TopoDS::Edge(ancestor);
- break;
- }
- }
- return E;
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-void StdMeshers_Hexa_3D::GetConv2DCoefs(const faceQuadStruct & quad,
- const TopoDS_Shape & aShape,
- const TopoDS_Vertex & V0,
- const TopoDS_Vertex & V1,
- const TopoDS_Vertex & V2, const TopoDS_Vertex & V3, Conv2DStruct & conv)
-{
-// MESSAGE("StdMeshers_Hexa_3D::GetConv2DCoefs");
- const TopoDS_Face & F = TopoDS::Face(aShape);
- TopoDS_Edge E = quad.edge[0];
- double f, l;
- Handle(Geom2d_Curve) C2d = BRep_Tool::CurveOnSurface(E, F, f, l);
- TopoDS_Vertex VFirst, VLast;
- TopExp::Vertices(E, VFirst, VLast); // corresponds to f and l
- bool isForward = (((l - f) * (quad.last[0] - quad.first[0])) > 0);
- TopoDS_Vertex VA, VB;
- if (isForward)
- {
- VA = VFirst;
- VB = VLast;
- }
- else
- {
- VA = VLast;
- VB = VFirst;
- }
- int a1, b1, c1, a2, b2, c2;
- if (VA.IsSame(V0))
- if (VB.IsSame(V1))
- {
- a1 = 1;
- b1 = 0;
- c1 = 0; // x
- a2 = 0;
- b2 = 1;
- c2 = 0; // y
- }
- else
- {
- ASSERT(VB.IsSame(V3));
- a1 = 0;
- b1 = 1;
- c1 = 0; // y
- a2 = 1;
- b2 = 0;
- c2 = 0; // x
- }
- if (VA.IsSame(V1))
- if (VB.IsSame(V2))
- {
- a1 = 0;
- b1 = -1;
- c1 = 1; // 1-y
- a2 = 1;
- b2 = 0;
- c2 = 0; // x
- }
- else
- {
- ASSERT(VB.IsSame(V0));
- a1 = -1;
- b1 = 0;
- c1 = 1; // 1-x
- a2 = 0;
- b2 = 1;
- c2 = 0; // y
- }
- if (VA.IsSame(V2))
- if (VB.IsSame(V3))
- {
- a1 = -1;
- b1 = 0;
- c1 = 1; // 1-x
- a2 = 0;
- b2 = -1;
- c2 = 1; // 1-y
- }
- else
- {
- ASSERT(VB.IsSame(V1));
- a1 = 0;
- b1 = -1;
- c1 = 1; // 1-y
- a2 = -1;
- b2 = 0;
- c2 = 1; // 1-x
- }
- if (VA.IsSame(V3))
- if (VB.IsSame(V0))
- {
- a1 = 0;
- b1 = 1;
- c1 = 0; // y
- a2 = -1;
- b2 = 0;
- c2 = 1; // 1-x
- }
- else
- {
- ASSERT(VB.IsSame(V2));
- a1 = 1;
- b1 = 0;
- c1 = 0; // x
- a2 = 0;
- b2 = -1;
- c2 = 1; // 1-y
- }
-// MESSAGE("X = " << c1 << "+ " << a1 << "*x + " << b1 << "*y");
-// MESSAGE("Y = " << c2 << "+ " << a2 << "*x + " << b2 << "*y");
- conv.a1 = a1;
- conv.b1 = b1;
- conv.c1 = c1;
- conv.a2 = a2;
- conv.b2 = b2;
- conv.c2 = c2;
-
- int nbdown = quad.nbPts[0];
- int nbright = quad.nbPts[1];
- conv.ia = int (a1);
- conv.ib = int (b1);
- conv.ic =
- int (c1 * a1 * a1) * (nbdown - 1) + int (c1 * b1 * b1) * (nbright - 1);
- conv.ja = int (a2);
- conv.jb = int (b2);
- conv.jc =
- int (c2 * a2 * a2) * (nbdown - 1) + int (c2 * b2 * b2) * (nbright - 1);
-// MESSAGE("I " << conv.ia << " " << conv.ib << " " << conv.ic);
-// MESSAGE("J " << conv.ja << " " << conv.jb << " " << conv.jc);
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-ostream & StdMeshers_Hexa_3D::SaveTo(ostream & save)
-{
- return save;
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-istream & StdMeshers_Hexa_3D::LoadFrom(istream & load)
-{
- return load;
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-ostream & operator <<(ostream & save, StdMeshers_Hexa_3D & hyp)
-{
- return hyp.SaveTo( save );
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-istream & operator >>(istream & load, StdMeshers_Hexa_3D & hyp)
-{
- return hyp.LoadFrom( load );
-}
-
-//modified by NIZNHY-PKV Wed Nov 17 15:34:13 2004 f
-///////////////////////////////////////////////////////////////////////////////
-//ZZ
-//#include <stdio.h>
-
-//=======================================================================
-//function : ComputePentahedralMesh
-//purpose :
-//=======================================================================
-bool ComputePentahedralMesh(SMESH_Mesh & aMesh, const TopoDS_Shape & aShape)
-{
- //printf(" ComputePentahedralMesh HERE\n");
- //
- bool bOK;
- //int iErr;
- StdMeshers_Penta_3D anAlgo;
- //
- bOK=anAlgo.Compute(aMesh, aShape);
- /*
- iErr=anAlgo.ErrorStatus();
-
- if (iErr) {
- printf(" *** Error# %d\n", iErr);
- }
- else {
- printf(" *** No errors# %d\n", iErr);
- }
- */
- return bOK;
-}
-
+++ /dev/null
-// SMESH SMESH : implementaion of SMESH idl descriptions
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : StdMeshers_Hexa_3D.hxx
-// Moved here from SMESH_Hexa_3D.hxx
-// Author : Paul RASCLE, EDF
-// Module : SMESH
-// $Header$
-
-#ifndef _SMESH_HEXA_3D_HXX_
-#define _SMESH_HEXA_3D_HXX_
-
-#include "SMESH_3D_Algo.hxx"
-#include "SMESH_Mesh.hxx"
-#include "StdMeshers_Quadrangle_2D.hxx"
-#include "Utils_SALOME_Exception.hxx"
-
-typedef struct point3Dstruct
-{
- const SMDS_MeshNode * node;
-} Point3DStruct;
-
-typedef double Pt3[3];
-
-typedef struct conv2dstruct
-{
- double a1; // X = a1*x + b1*y + c1
- double b1; // Y = a2*x + b2*y + c2
- double c1; // a1, b1 a2, b2 in {-1,0,1}
- double a2; // c1, c2 in {0,1}
- double b2;
- double c2;
- int ia; // I = ia*i + ib*j + ic
- int ib;
- int ic;
- int ja; // J = ja*i + jb*j + jc
- int jb;
- int jc;
-} Conv2DStruct;
-
-typedef struct cubeStruct
-{
- TopoDS_Vertex V000;
- TopoDS_Vertex V001;
- TopoDS_Vertex V010;
- TopoDS_Vertex V011;
- TopoDS_Vertex V100;
- TopoDS_Vertex V101;
- TopoDS_Vertex V110;
- TopoDS_Vertex V111;
- faceQuadStruct* quad_X0;
- faceQuadStruct* quad_X1;
- faceQuadStruct* quad_Y0;
- faceQuadStruct* quad_Y1;
- faceQuadStruct* quad_Z0;
- faceQuadStruct* quad_Z1;
- Point3DStruct* np; // normalised 3D coordinates
-} CubeStruct;
-
-class StdMeshers_Hexa_3D:
- public SMESH_3D_Algo
-{
-public:
- StdMeshers_Hexa_3D(int hypId, int studyId, SMESH_Gen* gen);
- virtual ~StdMeshers_Hexa_3D();
-
- virtual bool CheckHypothesis(SMESH_Mesh& aMesh,
- const TopoDS_Shape& aShape,
- SMESH_Hypothesis::Hypothesis_Status& aStatus);
-
- virtual bool Compute(SMESH_Mesh& aMesh,
- const TopoDS_Shape& aShape)
- throw (SALOME_Exception);
-
- ostream & SaveTo(ostream & save);
- istream & LoadFrom(istream & load);
- friend ostream & operator << (ostream & save, StdMeshers_Hexa_3D & hyp);
- friend istream & operator >> (istream & load, StdMeshers_Hexa_3D & hyp);
-
-protected:
- TopoDS_Edge
- EdgeNotInFace(SMESH_Mesh& aMesh,
- const TopoDS_Shape& aShape,
- const TopoDS_Face& aFace,
- const TopoDS_Vertex& aVertex,
- const TopTools_IndexedDataMapOfShapeListOfShape& MS);
-
- int GetFaceIndex(SMESH_Mesh& aMesh,
- const TopoDS_Shape& aShape,
- const vector<SMESH_subMesh*>& meshFaces,
- const TopoDS_Vertex& V0,
- const TopoDS_Vertex& V1,
- const TopoDS_Vertex& V2,
- const TopoDS_Vertex& V3);
-
- void GetConv2DCoefs(const faceQuadStruct& quad,
- const TopoDS_Shape& aShape,
- const TopoDS_Vertex& V0,
- const TopoDS_Vertex& V1,
- const TopoDS_Vertex& V2,
- const TopoDS_Vertex& V3,
- Conv2DStruct& conv);
-
- void GetPoint(Pt3 p,
- int i, int j, int k,
- int nbx, int nby, int nbz,
- Point3DStruct *np,
- const SMESHDS_Mesh* meshDS);
-
- CubeStruct _cube;
- FaceQuadStruct* _quads[6];
- int _indX0;
- int _indX1;
- int _indY0;
- int _indY1;
- int _indZ0;
- int _indZ1;
-};
-
-#endif
+++ /dev/null
-// SMESH SMESH : implementaion of SMESH idl descriptions
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : StdMeshers_LengthFromEdges.cxx
-// Moved here from SMESH_LengthFromEdges.cxx
-// Author : Paul RASCLE, EDF
-// Module : SMESH
-// $Header$
-
-using namespace std;
-#include "StdMeshers_LengthFromEdges.hxx"
-#include "utilities.h"
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-StdMeshers_LengthFromEdges::StdMeshers_LengthFromEdges(int hypId, int studyId, SMESH_Gen* gen)
- : SMESH_Hypothesis(hypId, studyId, gen)
-{
- _mode =1;
- _name = "LengthFromEdges";
-// SCRUTE(_name);
-// SCRUTE(&_name);
- _param_algo_dim = 2; // is used by SMESH_MEFISTO_2D
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-StdMeshers_LengthFromEdges::~StdMeshers_LengthFromEdges()
-{
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-void StdMeshers_LengthFromEdges::SetMode(int mode)
- throw (SALOME_Exception)
-{
- int oldMode = _mode;
- if (mode <= 0)
- throw SALOME_Exception(LOCALIZED("mode must be positive"));
- _mode = mode;
- if (oldMode != _mode)
- NotifySubMeshesHypothesisModification();
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-int StdMeshers_LengthFromEdges::GetMode()
-{
- return _mode;
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-ostream & StdMeshers_LengthFromEdges::SaveTo(ostream & save)
-{
- save << this->_mode;
- return save;
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-istream & StdMeshers_LengthFromEdges::LoadFrom(istream & load)
-{
- bool isOK = true;
- int a;
- isOK = (load >> a);
- if (isOK)
- this->_mode = a;
- else
- load.clear(ios::badbit | load.rdstate());
- return load;
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-ostream & operator << (ostream & save, StdMeshers_LengthFromEdges & hyp)
-{
- return hyp.SaveTo( save );
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-istream & operator >> (istream & load, StdMeshers_LengthFromEdges & hyp)
-{
- return hyp.LoadFrom( load );
-}
-
+++ /dev/null
-// SMESH SMESH : implementaion of SMESH idl descriptions
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : StdMeshers_LengthFromEdges.hxx
-// Moved here from SMESH_LengthFromEdges.hxx
-// Author : Paul RASCLE, EDF
-// Module : SMESH
-// $Header$
-
-#ifndef _SMESH_LENGTHFROMEDGES_HXX_
-#define _SMESH_LENGTHFROMEDGES_HXX_
-
-#include "SMESH_Hypothesis.hxx"
-#include "Utils_SALOME_Exception.hxx"
-
-class StdMeshers_LengthFromEdges:
- public SMESH_Hypothesis
-{
-public:
- StdMeshers_LengthFromEdges(int hypId, int studyId, SMESH_Gen* gen);
- virtual ~StdMeshers_LengthFromEdges();
-
- void SetMode(int mode)
- throw (SALOME_Exception);
-
- int GetMode();
-
- virtual ostream & SaveTo(ostream & save);
- virtual istream & LoadFrom(istream & load);
- friend ostream & operator << (ostream & save, StdMeshers_LengthFromEdges & hyp);
- friend istream & operator >> (istream & load, StdMeshers_LengthFromEdges & hyp);
-
-protected:
- int _mode;
-};
-
-#endif
+++ /dev/null
-// SMESH SMESH : implementaion of SMESH idl descriptions
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : StdMeshers_LocalLength.cxx
-// Moved here from SMESH_LocalLength.cxx
-// Author : Paul RASCLE, EDF
-// Module : SMESH
-// $Header$
-
-using namespace std;
-#include "StdMeshers_LocalLength.hxx"
-#include "utilities.h"
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-StdMeshers_LocalLength::StdMeshers_LocalLength(int hypId, int studyId,
- SMESH_Gen * gen):SMESH_Hypothesis(hypId, studyId, gen)
-{
- _length = 1.;
- _name = "LocalLength";
-// SCRUTE(_name);
-// SCRUTE(&_name);
- _param_algo_dim = 1; // is used by SMESH_Regular_1D
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-StdMeshers_LocalLength::~StdMeshers_LocalLength()
-{
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-void StdMeshers_LocalLength::SetLength(double length) throw(SALOME_Exception)
-{
- double oldLength = _length;
- if (length <= 0)
- throw SALOME_Exception(LOCALIZED("length must be positive"));
- _length = length;
- if (oldLength != _length)
- NotifySubMeshesHypothesisModification();
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-double StdMeshers_LocalLength::GetLength() const
-{
- return _length;
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-ostream & StdMeshers_LocalLength::SaveTo(ostream & save)
-{
- save << this->_length;
- return save;
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-istream & StdMeshers_LocalLength::LoadFrom(istream & load)
-{
- bool isOK = true;
- double a;
- isOK = (load >> a);
- if (isOK)
- this->_length = a;
- else
- load.clear(ios::badbit | load.rdstate());
- return load;
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-ostream & operator <<(ostream & save, StdMeshers_LocalLength & hyp)
-{
- return hyp.SaveTo( save );
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-istream & operator >>(istream & load, StdMeshers_LocalLength & hyp)
-{
- return hyp.LoadFrom( load );
-}
+++ /dev/null
-// SMESH SMESH : implementaion of SMESH idl descriptions
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : StdMeshers_LocalLength.hxx
-// Moved here from SMESH_LocalLength.hxx
-// Author : Paul RASCLE, EDF
-// Module : SMESH
-// $Header$
-
-#ifndef _SMESH_LOCALLENGTH_HXX_
-#define _SMESH_LOCALLENGTH_HXX_
-
-#include "SMESH_Hypothesis.hxx"
-#include "Utils_SALOME_Exception.hxx"
-
-class StdMeshers_LocalLength:public SMESH_Hypothesis
-{
- public:
- StdMeshers_LocalLength(int hypId, int studyId, SMESH_Gen * gen);
- virtual ~ StdMeshers_LocalLength();
-
- void SetLength(double length) throw(SALOME_Exception);
-
- double GetLength() const;
-
- virtual ostream & SaveTo(ostream & save);
- virtual istream & LoadFrom(istream & load);
- friend ostream & operator <<(ostream & save, StdMeshers_LocalLength & hyp);
- friend istream & operator >>(istream & load, StdMeshers_LocalLength & hyp);
-
- protected:
- double _length;
-};
-
-#endif
+++ /dev/null
-// SMESH SMESH : implementaion of SMESH idl descriptions
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : StdMeshers_MEFISTO_2D.cxx
-// Moved here from SMESH_MEFISTO_2D.cxx
-// Author : Paul RASCLE, EDF
-// Module : SMESH
-// $Header$
-
-using namespace std;
-#include "StdMeshers_MEFISTO_2D.hxx"
-#include "SMESH_Gen.hxx"
-#include "SMESH_Mesh.hxx"
-#include "SMESH_subMesh.hxx"
-
-#include "StdMeshers_MaxElementArea.hxx"
-#include "StdMeshers_LengthFromEdges.hxx"
-
-#include "Rn.h"
-#include "aptrte.h"
-
-#include "SMDS_MeshElement.hxx"
-#include "SMDS_MeshNode.hxx"
-#include "SMDS_EdgePosition.hxx"
-#include "SMDS_FacePosition.hxx"
-
-#include "utilities.h"
-
-#include <TopoDS_Face.hxx>
-#include <TopoDS_Edge.hxx>
-#include <TopoDS_Shape.hxx>
-#include <Geom_Surface.hxx>
-#include <GeomAdaptor_Curve.hxx>
-#include <Geom2d_Curve.hxx>
-#include <gp_Pnt2d.hxx>
-#include <BRep_Tool.hxx>
-#include <BRepTools.hxx>
-#include <BRepTools_WireExplorer.hxx>
-#include <GCPnts_AbscissaPoint.hxx>
-#include <GCPnts_UniformAbscissa.hxx>
-#include <TColStd_ListIteratorOfListOfInteger.hxx>
-#include <TopTools_ListIteratorOfListOfShape.hxx>
-#include <TopTools_ListOfShape.hxx>
-
-#include <string>
-//#include <algorithm>
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-StdMeshers_MEFISTO_2D::StdMeshers_MEFISTO_2D(int hypId, int studyId,
- SMESH_Gen * gen):SMESH_2D_Algo(hypId, studyId, gen)
-{
- MESSAGE("StdMeshers_MEFISTO_2D::StdMeshers_MEFISTO_2D");
- _name = "MEFISTO_2D";
-// _shapeType = TopAbs_FACE;
- _shapeType = (1 << TopAbs_FACE);
- _compatibleHypothesis.push_back("MaxElementArea");
- _compatibleHypothesis.push_back("LengthFromEdges");
-
- _edgeLength = 0;
- _maxElementArea = 0;
- _hypMaxElementArea = NULL;
- _hypLengthFromEdges = NULL;
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-StdMeshers_MEFISTO_2D::~StdMeshers_MEFISTO_2D()
-{
- MESSAGE("StdMeshers_MEFISTO_2D::~StdMeshers_MEFISTO_2D");
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-bool StdMeshers_MEFISTO_2D::CheckHypothesis
- (SMESH_Mesh& aMesh,
- const TopoDS_Shape& aShape,
- SMESH_Hypothesis::Hypothesis_Status& aStatus)
-{
- //MESSAGE("StdMeshers_MEFISTO_2D::CheckHypothesis");
-
- _hypMaxElementArea = NULL;
- _hypLengthFromEdges = NULL;
-
- list <const SMESHDS_Hypothesis * >::const_iterator itl;
- const SMESHDS_Hypothesis *theHyp;
-
- const list <const SMESHDS_Hypothesis * >&hyps = GetUsedHypothesis(aMesh, aShape);
- int nbHyp = hyps.size();
- if (!nbHyp)
- {
- aStatus = SMESH_Hypothesis::HYP_MISSING;
- return false; // can't work with no hypothesis
- }
-
- itl = hyps.begin();
- theHyp = (*itl); // use only the first hypothesis
-
- string hypName = theHyp->GetName();
- //int hypId = theHyp->GetID();
- //SCRUTE(hypName);
-
- bool isOk = false;
-
- if (hypName == "MaxElementArea")
- {
- _hypMaxElementArea = static_cast<const StdMeshers_MaxElementArea *>(theHyp);
- ASSERT(_hypMaxElementArea);
- _maxElementArea = _hypMaxElementArea->GetMaxArea();
- _edgeLength = 0;
- isOk = true;
- aStatus = SMESH_Hypothesis::HYP_OK;
- }
-
- else if (hypName == "LengthFromEdges")
- {
- _hypLengthFromEdges = static_cast<const StdMeshers_LengthFromEdges *>(theHyp);
- ASSERT(_hypLengthFromEdges);
- _edgeLength = 0;
- _maxElementArea = 0;
- isOk = true;
- aStatus = SMESH_Hypothesis::HYP_OK;
- }
- else
- aStatus = SMESH_Hypothesis::HYP_INCOMPATIBLE;
-
- if (isOk)
- {
- isOk = false;
- if (_maxElementArea > 0)
- {
-// _edgeLength = 2 * sqrt(_maxElementArea); // triangles : minorant
- _edgeLength = 2 * sqrt(_maxElementArea/sqrt(3.0));
- isOk = true;
- }
- else
- isOk = (_hypLengthFromEdges != NULL); // **** check mode
- if (!isOk)
- aStatus = SMESH_Hypothesis::HYP_BAD_PARAMETER;
- }
-
- //SCRUTE(_edgeLength);
- //SCRUTE(_maxElementArea);
- return isOk;
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-bool StdMeshers_MEFISTO_2D::Compute(SMESH_Mesh & aMesh, const TopoDS_Shape & aShape)
-{
- MESSAGE("StdMeshers_MEFISTO_2D::Compute");
-
- if (_hypLengthFromEdges)
- _edgeLength = ComputeEdgeElementLength(aMesh, aShape);
-
- bool isOk = false;
- //const SMESHDS_Mesh * meshDS = aMesh.GetMeshDS();
- //SMESH_subMesh *theSubMesh = aMesh.GetSubMesh(aShape);
-
- const TopoDS_Face & FF = TopoDS::Face(aShape);
- bool faceIsForward = (FF.Orientation() == TopAbs_FORWARD);
- TopoDS_Face F = TopoDS::Face(FF.Oriented(TopAbs_FORWARD));
-
- Z nblf; //nombre de lignes fermees (enveloppe en tete)
- Z *nudslf = NULL; //numero du dernier sommet de chaque ligne fermee
- R2 *uvslf = NULL;
- Z nbpti = 0; //nombre points internes futurs sommets de la triangulation
- R2 *uvpti = NULL;
-
- Z nbst;
- R2 *uvst = NULL;
- Z nbt;
- Z *nust = NULL;
- Z ierr = 0;
-
- Z nutysu = 1; // 1: il existe un fonction areteideale_()
- // Z nutysu=0; // 0: on utilise aretmx
- R aretmx = _edgeLength; // longueur max aretes future triangulation
-
- nblf = NumberOfWires(F);
-
- nudslf = new Z[1 + nblf];
- nudslf[0] = 0;
- int iw = 1;
- int nbpnt = 0;
-
- myOuterWire = BRepTools::OuterWire(F);
- nbpnt += NumberOfPoints(aMesh, myOuterWire);
- if ( nbpnt < 3 ) // ex: a circle with 2 segments
- return false;
- nudslf[iw++] = nbpnt;
-
- for (TopExp_Explorer exp(F, TopAbs_WIRE); exp.More(); exp.Next())
- {
- const TopoDS_Wire & W = TopoDS::Wire(exp.Current());
- if (!myOuterWire.IsSame(W))
- {
- nbpnt += NumberOfPoints(aMesh, W);
- nudslf[iw++] = nbpnt;
- }
- }
-
- // avoid passing same uv points for a vertex common to 2 wires
- TopTools_IndexedDataMapOfShapeListOfShape VWMap;
- if ( iw - 1 > 1 ) // nbofWires > 1
- TopExp::MapShapesAndAncestors( F , TopAbs_VERTEX, TopAbs_WIRE, VWMap );
-
- uvslf = new R2[nudslf[nblf]];
- int m = 0;
-
- double scalex, scaley;
- ComputeScaleOnFace(aMesh, F, scalex, scaley);
-
- map<int, const SMDS_MeshNode*> mefistoToDS; // correspondence mefisto index--> points IDNodes
- if ( !LoadPoints(aMesh, F, myOuterWire, uvslf, m,
- mefistoToDS, scalex, scaley, VWMap))
- return false;
-
- for (TopExp_Explorer exp(F, TopAbs_WIRE); exp.More(); exp.Next())
- {
- const TopoDS_Wire & W = TopoDS::Wire(exp.Current());
- if (!myOuterWire.IsSame(W))
- {
- if (! LoadPoints(aMesh, F, W, uvslf, m,
- mefistoToDS, scalex, scaley, VWMap ))
- return false;
- }
- }
-
- uvst = NULL;
- nust = NULL;
- aptrte(nutysu, aretmx,
- nblf, nudslf, uvslf, nbpti, uvpti, nbst, uvst, nbt, nust, ierr);
-
- if (ierr == 0)
- {
- MESSAGE("... End Triangulation Generated Triangle Number " << nbt);
- MESSAGE(" Node Number " << nbst);
- StoreResult(aMesh, nbst, uvst, nbt, nust, F,
- faceIsForward, mefistoToDS, scalex, scaley);
- isOk = true;
- }
- else
- {
- MESSAGE("Error in Triangulation");
- isOk = false;
- }
- if (nudslf != NULL)
- delete[]nudslf;
- if (uvslf != NULL)
- delete[]uvslf;
- if (uvst != NULL)
- delete[]uvst;
- if (nust != NULL)
- delete[]nust;
- return isOk;
-}
-
-//=======================================================================
-//function : fixOverlappedLinkUV
-//purpose : prevent failure due to overlapped adjacent links
-//=======================================================================
-
-static bool fixOverlappedLinkUV( R2& uv0, const R2& uv1, const R2& uv2 )
-{
- gp_XY v1( uv0.x - uv1.x, uv0.y - uv1.y );
- gp_XY v2( uv2.x - uv1.x, uv2.y - uv1.y );
-
- double tol2 = DBL_MIN * DBL_MIN;
- double sqMod1 = v1.SquareModulus();
- if ( sqMod1 <= tol2 ) return false;
- double sqMod2 = v2.SquareModulus();
- if ( sqMod2 <= tol2 ) return false;
-
- double dot = v1*v2;
-
- // check sinus >= 1.e-3
- const double minSin = 1.e-3;
- if ( dot > 0 && 1 - dot * dot / ( sqMod1 * sqMod2 ) < minSin * minSin ) {
- MESSAGE(" ___ FIX UV ____" << uv0.x << " " << uv0.y);
- v1.SetCoord( -v1.Y(), v1.X() );
- double delta = sqrt( sqMod1 ) * minSin;
- if ( v1.X() < 0 )
- uv0.x -= delta;
- else
- uv0.x += delta;
- if ( v1.Y() < 0 )
- uv0.y -= delta;
- else
- uv0.y += delta;
-// MESSAGE(" -> " << uv0.x << " " << uv0.y << " ");
-// MESSAGE("v1( " << v1.X() << " " << v1.Y() << " ) " <<
-// "v2( " << v2.X() << " " << v2.Y() << " ) ");
-// MESSAGE("SIN: " << sqrt(1 - dot * dot / (sqMod1 * sqMod2)));
-// v1.SetCoord( uv0.x - uv1.x, uv0.y - uv1.y );
-// v2.SetCoord( uv2.x - uv1.x, uv2.y - uv1.y );
-// gp_XY v3( uv2.x - uv0.x, uv2.y - uv0.y );
-// sqMod1 = v1.SquareModulus();
-// sqMod2 = v2.SquareModulus();
-// dot = v1*v2;
-// double sin = sqrt(1 - dot * dot / (sqMod1 * sqMod2));
-// MESSAGE("NEW SIN: " << sin);
- return true;
- }
- return false;
-}
-
-//=======================================================================
-//function : fixCommonVertexUV
-//purpose :
-//=======================================================================
-
-static bool fixCommonVertexUV (gp_Pnt2d & theUV,
- const TopoDS_Vertex& theV,
- const TopoDS_Wire& theW,
- const TopoDS_Wire& theOW,
- const TopoDS_Face& theF,
- const TopTools_IndexedDataMapOfShapeListOfShape & theVWMap,
- SMESH_Mesh & theMesh)
-{
- if( theW.IsSame( theOW ) ||
- !theVWMap.Contains( theV )) return false;
-
- // check if there is another wire sharing theV
- const TopTools_ListOfShape& WList = theVWMap.FindFromKey( theV );
- TopTools_ListIteratorOfListOfShape aWIt;
- for ( aWIt.Initialize( WList ); aWIt.More(); aWIt.Next() )
- if ( !theW.IsSame( aWIt.Value() ))
- break;
- if ( !aWIt.More() ) return false;
-
- TopTools_ListOfShape EList;
- list< double > UList;
-
- // find edges of theW sharing theV
- // and find 2d normal to them at theV
- gp_Vec2d N(0.,0.);
- TopoDS_Iterator itE( theW );
- for ( ; itE.More(); itE.Next() )
- {
- const TopoDS_Edge& E = TopoDS::Edge( itE.Value() );
- TopoDS_Iterator itV( E );
- for ( ; itV.More(); itV.Next() )
- {
- const TopoDS_Vertex & V = TopoDS::Vertex( itV.Value() );
- if ( !V.IsSame( theV ))
- continue;
- EList.Append( E );
- Standard_Real u = BRep_Tool::Parameter( V, E );
- UList.push_back( u );
- double f, l;
- Handle(Geom2d_Curve) C2d = BRep_Tool::CurveOnSurface(E, theF, f, l);
- gp_Vec2d d1;
- gp_Pnt2d p;
- C2d->D1( u, p, d1 );
- gp_Vec2d n( d1.Y(), -d1.X() );
- if ( E.Orientation() == TopAbs_REVERSED )
- n.Reverse();
- N += n.Normalized();
- }
- }
-
- // define step size by which to move theUV
-
- gp_Pnt2d nextUV; // uv of next node on edge, most distant of the four
- double maxDist = -DBL_MAX;
- TopTools_ListIteratorOfListOfShape aEIt (EList);
- list< double >::iterator aUIt = UList.begin();
- for ( ; aEIt.More(); aEIt.Next(), aUIt++ )
- {
- const TopoDS_Edge& E = TopoDS::Edge( aEIt.Value() );
- double f, l;
- Handle(Geom2d_Curve) C2d = BRep_Tool::CurveOnSurface(E, theF, f, l);
-
- double umin = DBL_MAX, umax = -DBL_MAX;
- SMDS_NodeIteratorPtr nIt = theMesh.GetSubMesh(E)->GetSubMeshDS()->GetNodes();
- if ( !nIt->more() ) // no nodes on edge, only on vertices
- {
- umin = l;
- umax = f;
- }
- else
- {
- while ( nIt->more() ) {
- const SMDS_MeshNode* node = nIt->next();
- const SMDS_EdgePosition* epos =
- static_cast<const SMDS_EdgePosition*>(node->GetPosition().get());
- double u = epos->GetUParameter();
- if ( u < umin )
- umin = u;
- if ( u > umax )
- umax = u;
- }
- }
- bool isFirstCommon = ( *aUIt == f );
- gp_Pnt2d uv = C2d->Value( isFirstCommon ? umin : umax );
- double dist = theUV.SquareDistance( uv );
- if ( dist > maxDist ) {
- maxDist = dist;
- nextUV = uv;
- }
- }
- R2 uv0, uv1, uv2;
- uv0.x = theUV.X(); uv0.y = theUV.Y();
- uv1.x = nextUV.X(); uv1.y = nextUV.Y();
- uv2.x = uv0.x; uv2.y = uv0.y;
- if ( fixOverlappedLinkUV( uv0, uv1, uv2 ))
- {
- double step = theUV.Distance( gp_Pnt2d( uv0.x, uv0.y ));
-
- // move theUV along the normal by the step
-
- N *= step;
-
- MESSAGE("--fixCommonVertexUV move(" << theUV.X() << " " << theUV.Y()
- << ") by (" << N.X() << " " << N.Y() << ")"
- << endl << "--- MAX DIST " << maxDist);
-
- theUV.SetXY( theUV.XY() + N.XY() );
-
- return true;
- }
- return false;
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-bool StdMeshers_MEFISTO_2D::LoadPoints(SMESH_Mesh & aMesh,
- const TopoDS_Face & FF,
- const TopoDS_Wire & WW,
- R2 * uvslf,
- int & m,
- map<int, const SMDS_MeshNode*>&mefistoToDS,
- double scalex,
- double scaley,
- const TopTools_IndexedDataMapOfShapeListOfShape& VWMap)
-{
-// MESSAGE("StdMeshers_MEFISTO_2D::LoadPoints");
-
- //SMDS_Mesh * meshDS = aMesh.GetMeshDS();
-
- TopoDS_Face F = TopoDS::Face(FF.Oriented(TopAbs_FORWARD));
-
- int mInit = m, mFirst, iEdge;
- gp_XY scale( scalex, scaley );
-
- TopoDS_Wire W = TopoDS::Wire(WW.Oriented(TopAbs_FORWARD));
- BRepTools_WireExplorer wexp(W, F);
- for (wexp.Init(W, F), iEdge = 0; wexp.More(); wexp.Next(), iEdge++)
- {
- const TopoDS_Edge & E = wexp.Current();
-
- // --- IDNodes of first and last Vertex
-
- TopoDS_Vertex VFirst, VLast;
- TopExp::Vertices(E, VFirst, VLast); // corresponds to f and l
-
- ASSERT(!VFirst.IsNull());
- SMDS_NodeIteratorPtr lid=
- aMesh.GetSubMesh(VFirst)->GetSubMeshDS()->GetNodes();
- if ( !lid->more() ) {
- MESSAGE (" NO NODE BUILT ON VERTEX ");
- return false;
- }
- const SMDS_MeshNode* idFirst = lid->next();
-
- ASSERT(!VLast.IsNull());
- lid=aMesh.GetSubMesh(VLast)->GetSubMeshDS()->GetNodes();
- if ( !lid->more() ) {
- MESSAGE (" NO NODE BUILT ON VERTEX ");
- return false;
- }
- const SMDS_MeshNode* idLast = lid->next();
-
- // --- edge internal IDNodes (relies on good order storage, not checked)
-
- int nbPoints = aMesh.GetSubMesh(E)->GetSubMeshDS()->NbNodes();
-
- double f, l;
- Handle(Geom2d_Curve) C2d = BRep_Tool::CurveOnSurface(E, F, f, l);
-
- SMDS_NodeIteratorPtr ite= aMesh.GetSubMesh(E)->GetSubMeshDS()->GetNodes();
-
- //bool isForward = (E.Orientation() == TopAbs_FORWARD);
- map<double, const SMDS_MeshNode*> params;
-
- while(ite->more())
- {
- const SMDS_MeshNode * node = ite->next();
- const SMDS_EdgePosition* epos =
- static_cast<const SMDS_EdgePosition*>(node->GetPosition().get());
- double param = epos->GetUParameter();
- params[param] = node;
- }
- if ( nbPoints != params.size())
- {
- MESSAGE( "BAD NODE ON EDGE POSITIONS" );
- return false;
- }
-
- mFirst = m;
-
- // --- load 2D values into MEFISTO structure,
- // add IDNodes in mefistoToDS map
- if (E.Orientation() == TopAbs_FORWARD)
- {
- gp_Pnt2d p = C2d->Value(f).XY().Multiplied( scale ); // first point = Vertex Forward
- if ( fixCommonVertexUV( p, VFirst, W, myOuterWire, F, VWMap, aMesh ))
- myNodesOnCommonV.push_back( idFirst );
- uvslf[m].x = p.X();
- uvslf[m].y = p.Y();
- mefistoToDS[m + 1] = idFirst;
- //MESSAGE(" "<<m<<" "<<mefistoToDS[m+1]);
- //MESSAGE("__ f "<<f<<" "<<uvslf[m].x <<" "<<uvslf[m].y);
- m++;
- map<double, const SMDS_MeshNode*>::iterator itp = params.begin();
- for (int i = 1; i <= nbPoints; i++) // nbPoints internal
- {
- double param = (*itp).first;
- gp_Pnt2d p = C2d->Value(param).XY().Multiplied( scale );
- uvslf[m].x = p.X();
- uvslf[m].y = p.Y();
- mefistoToDS[m + 1] = (*itp).second;
- //MESSAGE(" "<<m<<" "<<mefistoToDS[m+1]);
- //MESSAGE("__ "<<i<<" "<<param<<" "<<uvslf[m].x <<" "<<uvslf[m].y);
- m++;
- itp++;
- }
- }
- else
- {
- gp_Pnt2d p = C2d->Value(l).XY().Multiplied( scale ); // last point = Vertex Reversed
- if ( fixCommonVertexUV( p, VLast, W, myOuterWire, F, VWMap, aMesh ))
- myNodesOnCommonV.push_back( idLast );
- uvslf[m].x = p.X();
- uvslf[m].y = p.Y();
- mefistoToDS[m + 1] = idLast;
- //MESSAGE(" "<<m<<" "<<mefistoToDS[m+1]);
- //MESSAGE("__ l "<<l<<" "<<uvslf[m].x <<" "<<uvslf[m].y);
- m++;
- map<double, const SMDS_MeshNode*>::reverse_iterator itp = params.rbegin();
- for (int i = nbPoints; i >= 1; i--)
- {
- double param = (*itp).first;
- gp_Pnt2d p = C2d->Value(param).XY().Multiplied( scale );
- uvslf[m].x = p.X();
- uvslf[m].y = p.Y();
- mefistoToDS[m + 1] = (*itp).second;
- //MESSAGE(" "<<m<<" "<<mefistoToDS[m+1]);
- //MESSAGE("__ "<<i<<" "<<param<<" "<<uvslf[m].x <<" "<<uvslf[m].y);
- m++;
- itp++;
- }
- }
- // prevent failure on overlapped adjacent links
- if ( iEdge > 0 )
- fixOverlappedLinkUV (uvslf[ mFirst - 1],
- uvslf[ mFirst ],
- uvslf[ mFirst + 1 ]);
-
- } // for wexp
-
- fixOverlappedLinkUV (uvslf[ m - 1],
- uvslf[ mInit ],
- uvslf[ mInit + 1 ]);
-
- return true;
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-void StdMeshers_MEFISTO_2D::ComputeScaleOnFace(SMESH_Mesh & aMesh,
- const TopoDS_Face & aFace, double &scalex, double &scaley)
-{
- //MESSAGE("StdMeshers_MEFISTO_2D::ComputeScaleOnFace");
- TopoDS_Face F = TopoDS::Face(aFace.Oriented(TopAbs_FORWARD));
- TopoDS_Wire W = BRepTools::OuterWire(F);
-
- double xmin = 1.e300; // min & max of face 2D parametric coord.
- double xmax = -1.e300;
- double ymin = 1.e300;
- double ymax = -1.e300;
- int nbp = 23;
- scalex = 1;
- scaley = 1;
-
- TopExp_Explorer wexp(W, TopAbs_EDGE);
- for ( ; wexp.More(); wexp.Next())
- {
- const TopoDS_Edge & E = TopoDS::Edge( wexp.Current() );
- double f, l;
- Handle(Geom2d_Curve) C2d = BRep_Tool::CurveOnSurface(E, F, f, l);
- if ( C2d.IsNull() ) continue;
- double du = (l - f) / double (nbp);
- for (int i = 0; i <= nbp; i++)
- {
- double param = f + double (i) * du;
- gp_Pnt2d p = C2d->Value(param);
- if (p.X() < xmin)
- xmin = p.X();
- if (p.X() > xmax)
- xmax = p.X();
- if (p.Y() < ymin)
- ymin = p.Y();
- if (p.Y() > ymax)
- ymax = p.Y();
- // MESSAGE(" "<< f<<" "<<l<<" "<<param<<" "<<xmin<<" "<<xmax<<" "<<ymin<<" "<<ymax);
- }
- }
- // SCRUTE(xmin);
- // SCRUTE(xmax);
- // SCRUTE(ymin);
- // SCRUTE(ymax);
- double xmoy = (xmax + xmin) / 2.;
- double ymoy = (ymax + ymin) / 2.;
- double xsize = xmax - xmin;
- double ysize = ymax - ymin;
-
- Handle(Geom_Surface) S = BRep_Tool::Surface(F); // 3D surface
-
- double length_x = 0;
- double length_y = 0;
- gp_Pnt PX0 = S->Value(xmin, ymoy);
- gp_Pnt PY0 = S->Value(xmoy, ymin);
- double dx = xsize / double (nbp);
- double dy = ysize / double (nbp);
- for (int i = 1; i <= nbp; i++)
- {
- double x = xmin + double (i) * dx;
- gp_Pnt PX = S->Value(x, ymoy);
- double y = ymin + double (i) * dy;
- gp_Pnt PY = S->Value(xmoy, y);
- length_x += PX.Distance(PX0);
- length_y += PY.Distance(PY0);
- PX0 = PX;
- PY0 = PY;
- }
- scalex = length_x / xsize;
- scaley = length_y / ysize;
-// SCRUTE(xsize);
-// SCRUTE(ysize);
- double xyratio = xsize*scalex/(ysize*scaley);
- const double maxratio = 1.e2;
- //SCRUTE(xyratio);
- if (xyratio > maxratio) {
- SCRUTE( scaley );
- scaley *= xyratio / maxratio;
- SCRUTE( scaley );
- }
- else if (xyratio < 1./maxratio) {
- SCRUTE( scalex );
- scalex *= 1 / xyratio / maxratio;
- SCRUTE( scalex );
- }
- ASSERT(scalex);
- ASSERT(scaley);
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-void StdMeshers_MEFISTO_2D::StoreResult(SMESH_Mesh & aMesh,
- Z nbst, R2 * uvst, Z nbt, Z * nust,
- const TopoDS_Face & F, bool faceIsForward,
- map<int, const SMDS_MeshNode*>&mefistoToDS,
- double scalex, double scaley)
-{
- SMESHDS_Mesh * meshDS = aMesh.GetMeshDS();
- int faceID = meshDS->ShapeToIndex( F );
-
- Z n, m;
- Handle(Geom_Surface) S = BRep_Tool::Surface(F);
-
- for (n = 0; n < nbst; n++)
- {
- if (mefistoToDS.find(n + 1) == mefistoToDS.end())
- {
- double u = uvst[n][0] / scalex;
- double v = uvst[n][1] / scaley;
- gp_Pnt P = S->Value(u, v);
-
- SMDS_MeshNode * node = meshDS->AddNode(P.X(), P.Y(), P.Z());
- meshDS->SetNodeOnFace(node, faceID, u, v);
-
- //MESSAGE(P.X()<<" "<<P.Y()<<" "<<P.Z());
- mefistoToDS[n + 1] = node;
- //MESSAGE("NEW: "<<n<<" "<<mefistoToDS[n+1]);
- }
- }
-
- m = 0;
- //int mt = 0;
-
- //SCRUTE(faceIsForward);
- for (n = 1; n <= nbt; n++)
- {
- int inode1 = nust[m++];
- int inode2 = nust[m++];
- int inode3 = nust[m++];
-
- const SMDS_MeshNode *n1, *n2, *n3;
- n1 = mefistoToDS[inode1];
- n2 = mefistoToDS[inode2];
- n3 = mefistoToDS[inode3];
- //MESSAGE("-- "<<inode1<<" "<<inode2<<" "<<inode3);
-
- // triangle points must be in trigonometric order if face is Forward
- // else they must be put clockwise
-
- bool triangleIsWellOriented = faceIsForward;
-
- SMDS_MeshElement * elt;
- if (triangleIsWellOriented)
- elt = meshDS->AddFace(n1, n2, n3);
- else
- elt = meshDS->AddFace(n1, n3, n2);
-
- meshDS->SetMeshElementOnShape(elt, faceID);
- m++;
- }
-
- // remove bad elements build on vertices shared by wires
-
- list<const SMDS_MeshNode*>::iterator itN = myNodesOnCommonV.begin();
- for ( ; itN != myNodesOnCommonV.end(); itN++ )
- {
- const SMDS_MeshNode* node = *itN;
- SMDS_ElemIteratorPtr invElemIt = node->GetInverseElementIterator();
- while ( invElemIt->more() )
- {
- const SMDS_MeshElement* elem = invElemIt->next();
- SMDS_ElemIteratorPtr itN = elem->nodesIterator();
- int nbSame = 0;
- while ( itN->more() )
- if ( itN->next() == node)
- nbSame++;
- if (nbSame > 1) {
- MESSAGE( "RM bad element " << elem->GetID());
- meshDS->RemoveElement( elem );
- }
- }
- }
-
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-double StdMeshers_MEFISTO_2D::ComputeEdgeElementLength(SMESH_Mesh & aMesh,
- const TopoDS_Shape & aShape)
-{
- //MESSAGE("StdMeshers_MEFISTO_2D::ComputeEdgeElementLength");
- // **** a mettre dans SMESH_2D_Algo ?
-
- const TopoDS_Face & FF = TopoDS::Face(aShape);
- //bool faceIsForward = (FF.Orientation() == TopAbs_FORWARD);
- TopoDS_Face F = TopoDS::Face(FF.Oriented(TopAbs_FORWARD));
-
- double meanElementLength = 100;
- double wireLength = 0;
- int wireElementsNumber = 0;
- for (TopExp_Explorer exp(F, TopAbs_WIRE); exp.More(); exp.Next())
- {
- const TopoDS_Wire & W = TopoDS::Wire(exp.Current());
- for (TopExp_Explorer expe(W, TopAbs_EDGE); expe.More(); expe.Next())
- {
- const TopoDS_Edge & E = TopoDS::Edge(expe.Current());
- int nb = aMesh.GetSubMesh(E)->GetSubMeshDS()->NbNodes();
- double length = EdgeLength(E);
- wireLength += length;
- wireElementsNumber += nb;
- }
- }
- if (wireElementsNumber)
- meanElementLength = wireLength / wireElementsNumber;
- //SCRUTE(meanElementLength);
- return meanElementLength;
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-ostream & StdMeshers_MEFISTO_2D::SaveTo(ostream & save)
-{
- return save;
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-istream & StdMeshers_MEFISTO_2D::LoadFrom(istream & load)
-{
- return load;
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-ostream & operator <<(ostream & save, StdMeshers_MEFISTO_2D & hyp)
-{
- return hyp.SaveTo( save );
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-istream & operator >>(istream & load, StdMeshers_MEFISTO_2D & hyp)
-{
- return hyp.LoadFrom( load );
-}
+++ /dev/null
-// SMESH SMESH : implementaion of SMESH idl descriptions
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : StdMeshers_MEFISTO_2D.hxx
-// Moved here from SMESH_MEFISTO_2D.hxx
-// Author : Paul RASCLE, EDF
-// Module : SMESH
-// $Header$
-
-#ifndef _StdMeshers_MEFISTO_2D_HXX_
-#define _StdMeshers_MEFISTO_2D_HXX_
-
-#include "SMESH_2D_Algo.hxx"
-#include <TopoDS_Wire.hxx>
-
-class SMDS_MeshNode;
-class TopTools_IndexedDataMapOfShapeListOfShape;
-class TopoDS_Face;
-class TopoDS_WIre;
-class StdMeshers_MaxElementArea;
-class StdMeshers_LengthFromEdges;
-class SMDS_MeshNode;
-
-#include <list>
-#include <map>
-#include "Rn.h"
-
-class StdMeshers_MEFISTO_2D:
- public SMESH_2D_Algo
-{
-public:
- StdMeshers_MEFISTO_2D(int hypId, int studyId, SMESH_Gen* gen);
- virtual ~StdMeshers_MEFISTO_2D();
-
- virtual bool CheckHypothesis(SMESH_Mesh& aMesh,
- const TopoDS_Shape& aShape,
- SMESH_Hypothesis::Hypothesis_Status& aStatus);
-
- virtual bool Compute(SMESH_Mesh& aMesh,
- const TopoDS_Shape& aShape);
-
- double ComputeEdgeElementLength(SMESH_Mesh& aMesh,
- const TopoDS_Shape& aShape);
-
- bool LoadPoints(SMESH_Mesh& aMesh,
- const TopoDS_Face& F,
- const TopoDS_Wire& W,
- R2* uvslf,
- int& m,
- map<int,const SMDS_MeshNode*>& mefistoToDS,
- double scalex, double scaley,
- const TopTools_IndexedDataMapOfShapeListOfShape& VWMap);
-
- void ComputeScaleOnFace(SMESH_Mesh& aMesh,
- const TopoDS_Face& aFace,
- double& scalex,
- double& scaley);
-
- void StoreResult (SMESH_Mesh& aMesh,
- Z nbst, R2* uvst, Z nbt, Z* nust,
- const TopoDS_Face& F, bool faceIsForward,
- map<int,const SMDS_MeshNode*>& mefistoToDS,
- double scalex, double scaley);
-
- ostream & SaveTo(ostream & save);
- istream & LoadFrom(istream & load);
- friend ostream & operator << (ostream & save, StdMeshers_MEFISTO_2D & hyp);
- friend istream & operator >> (istream & load, StdMeshers_MEFISTO_2D & hyp);
-
-protected:
- double _edgeLength;
- double _maxElementArea;
- const StdMeshers_MaxElementArea* _hypMaxElementArea;
- const StdMeshers_LengthFromEdges* _hypLengthFromEdges;
-
- TopoDS_Wire myOuterWire;
- std::list<const SMDS_MeshNode*> myNodesOnCommonV;
-};
-
-#endif
+++ /dev/null
-// SMESH SMESH : implementaion of SMESH idl descriptions
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : StdMeshers_MaxElementArea.cxx
-// Moved here from SMESH_MaxElementArea.cxx
-// Author : Paul RASCLE, EDF
-// Module : SMESH
-// $Header$
-
-using namespace std;
-#include "StdMeshers_MaxElementArea.hxx"
-#include "utilities.h"
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-StdMeshers_MaxElementArea::StdMeshers_MaxElementArea(int hypId, int studyId, SMESH_Gen* gen)
- : SMESH_Hypothesis(hypId, studyId, gen)
-{
- _maxArea =1.;
- _name = "MaxElementArea";
-// SCRUTE(_name);
-// SCRUTE(&_name);
- _param_algo_dim = 2;
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-StdMeshers_MaxElementArea::~StdMeshers_MaxElementArea()
-{
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-void StdMeshers_MaxElementArea::SetMaxArea(double maxArea)
- throw (SALOME_Exception)
-{
- double oldArea = _maxArea;
- if (maxArea <= 0)
- throw SALOME_Exception(LOCALIZED("maxArea must be positive"));
- _maxArea = maxArea;
- if (_maxArea != oldArea)
- NotifySubMeshesHypothesisModification();
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-double StdMeshers_MaxElementArea::GetMaxArea() const
-{
- return _maxArea;
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-ostream & StdMeshers_MaxElementArea::SaveTo(ostream & save)
-{
- save << this->_maxArea;
- return save;
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-istream & StdMeshers_MaxElementArea::LoadFrom(istream & load)
-{
- bool isOK = true;
- double a;
- isOK = (load >> a);
- if (isOK)
- this->_maxArea = a;
- else
- load.clear(ios::badbit | load.rdstate());
- return load;
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-ostream & operator << (ostream & save, StdMeshers_MaxElementArea & hyp)
-{
- return hyp.SaveTo( save );
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-istream & operator >> (istream & load, StdMeshers_MaxElementArea & hyp)
-{
- return hyp.LoadFrom( load );
-}
-
+++ /dev/null
-// SMESH SMESH : implementaion of SMESH idl descriptions
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : StdMeshers_MaxElementArea.hxx
-// Moved here from SMESH_MaxElementArea.hxx
-// Author : Paul RASCLE, EDF
-// Module : SMESH
-// $Header$
-
-#ifndef _SMESH_MAXELEMENTAREA_HXX_
-#define _SMESH_MAXELEMENTAREA_HXX_
-
-#include "SMESH_Hypothesis.hxx"
-#include "Utils_SALOME_Exception.hxx"
-
-class StdMeshers_MaxElementArea:public SMESH_Hypothesis
-{
- public:
- StdMeshers_MaxElementArea(int hypId, int studyId, SMESH_Gen * gen);
- virtual ~ StdMeshers_MaxElementArea();
-
- void SetMaxArea(double maxArea) throw(SALOME_Exception);
-
- double GetMaxArea() const;
-
- virtual ostream & SaveTo(ostream & save);
- virtual istream & LoadFrom(istream & load);
- friend ostream & operator <<(ostream & save, StdMeshers_MaxElementArea & hyp);
- friend istream & operator >>(istream & load, StdMeshers_MaxElementArea & hyp);
-
- protected:
- double _maxArea;
-};
-
-#endif
+++ /dev/null
-// SMESH SMESH : implementaion of SMESH idl descriptions
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : StdMeshers_MaxElementVolume.cxx
-// Moved here from SMESH_MaxElementVolume.cxx
-// Author : Paul RASCLE, EDF
-// Module : SMESH
-// $Header$
-
-using namespace std;
-
-#include "StdMeshers_MaxElementVolume.hxx"
-#include "utilities.h"
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-StdMeshers_MaxElementVolume::StdMeshers_MaxElementVolume(int hypId, int studyId, SMESH_Gen* gen)
- : SMESH_Hypothesis(hypId, studyId, gen)
-{
- _maxVolume =1.;
- _name = "MaxElementVolume";
-// SCRUTE(_name);
- SCRUTE(&_name);
- _param_algo_dim = 3;
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-StdMeshers_MaxElementVolume::~StdMeshers_MaxElementVolume()
-{
- MESSAGE("StdMeshers_MaxElementVolume::~StdMeshers_MaxElementVolume");
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-void StdMeshers_MaxElementVolume::SetMaxVolume(double maxVolume)
- throw (SALOME_Exception)
-{
- double oldVolume = _maxVolume;
- if (maxVolume <= 0)
- throw SALOME_Exception(LOCALIZED("maxVolume must be positive"));
- _maxVolume = maxVolume;
- if (_maxVolume != oldVolume)
- NotifySubMeshesHypothesisModification();
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-double StdMeshers_MaxElementVolume::GetMaxVolume() const
-{
- return _maxVolume;
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-ostream & StdMeshers_MaxElementVolume::SaveTo(ostream & save)
-{
- save << this->_maxVolume;
- return save;
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-istream & StdMeshers_MaxElementVolume::LoadFrom(istream & load)
-{
- bool isOK = true;
- double a;
- isOK = (load >> a);
- if (isOK)
- this->_maxVolume = a;
- else
- load.clear(ios::badbit | load.rdstate());
- return load;
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-ostream & operator << (ostream & save, StdMeshers_MaxElementVolume & hyp)
-{
- return hyp.SaveTo( save );
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-istream & operator >> (istream & load, StdMeshers_MaxElementVolume & hyp)
-{
- return hyp.LoadFrom( load );
-}
-
+++ /dev/null
-// SMESH SMESH : implementaion of SMESH idl descriptions
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : StdMeshers_MaxElementVolume.hxx
-// Moved here from SMESH_MaxElementVolume.hxx
-// Author : Paul RASCLE, EDF
-// Module : SMESH
-// $Header$
-
-#ifndef _SMESH_MAXELEMENTVOLUME_HXX_
-#define _SMESH_MAXELEMENTVOLUME_HXX_
-
-#include "SMESH_Hypothesis.hxx"
-#include "Utils_SALOME_Exception.hxx"
-
-class StdMeshers_MaxElementVolume:
- public SMESH_Hypothesis
-{
-public:
- StdMeshers_MaxElementVolume(int hypId, int studyId, SMESH_Gen* gen);
- virtual ~StdMeshers_MaxElementVolume();
-
- void SetMaxVolume(double maxVolume)
- throw (SALOME_Exception);
-
- double GetMaxVolume() const;
-
- virtual ostream & SaveTo(ostream & save);
- virtual istream & LoadFrom(istream & load);
- friend ostream & operator << (ostream & save, StdMeshers_MaxElementVolume & hyp);
- friend istream & operator >> (istream & load, StdMeshers_MaxElementVolume & hyp);
-
-protected:
- double _maxVolume;
-};
-
-#endif
+++ /dev/null
-// SMESH StdMeshers : implementaion of SMESH idl descriptions
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : StdMeshers_NotConformAllowed.cxx
-// Author : Paul RASCLE, EDF
-// Module : SMESH
-// $Header$
-
-using namespace std;
-#include "StdMeshers_NotConformAllowed.hxx"
-#include "utilities.h"
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-StdMeshers_NotConformAllowed::StdMeshers_NotConformAllowed(int hypId, int studyId, SMESH_Gen* gen)
- : SMESH_Hypothesis(hypId, studyId, gen)
-{
- _name = "NotConformAllowed";
- _param_algo_dim = -1;
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-StdMeshers_NotConformAllowed::~StdMeshers_NotConformAllowed()
-{
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-ostream & StdMeshers_NotConformAllowed::SaveTo(ostream & save)
-{
- return save << this;
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-istream & StdMeshers_NotConformAllowed::LoadFrom(istream & load)
-{
- return load >> (*this);
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-ostream & operator << (ostream & save, StdMeshers_NotConformAllowed & hyp)
-{
- return save;
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-istream & operator >> (istream & load, StdMeshers_NotConformAllowed & hyp)
-{
- return load;
-}
+++ /dev/null
-// SMESH StdMeshers : implementaion of SMESH idl descriptions
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : StdMeshers_NotConformAllowed.hxx
-// Author : Paul RASCLE, EDF
-// Module : SMESH
-// $Header$
-
-#ifndef _StdMeshers_NotConformAllowed_HXX_
-#define _StdMeshers_NotConformAllowed_HXX_
-
-#include "SMESH_Hypothesis.hxx"
-#include "Utils_SALOME_Exception.hxx"
-
-class StdMeshers_NotConformAllowed:
- public SMESH_Hypothesis
-{
-public:
- StdMeshers_NotConformAllowed(int hypId, int studyId, SMESH_Gen* gen);
- virtual ~StdMeshers_NotConformAllowed();
-
- virtual ostream & SaveTo(ostream & save);
- virtual istream & LoadFrom(istream & load);
- friend ostream & operator << (ostream & save, StdMeshers_NotConformAllowed & hyp);
- friend istream & operator >> (istream & load, StdMeshers_NotConformAllowed & hyp);
-};
-
-#endif
+++ /dev/null
-// SMESH StdMeshers_Penta_3D implementaion of SMESH idl descriptions
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : StdMeshers_Penta_3D.cxx
-// Module : SMESH
-
-#include "StdMeshers_Penta_3D.hxx"
-
-#include "utilities.h"
-#include "Utils_ExceptHandlers.hxx"
-
-#include "SMDS_EdgePosition.hxx"
-#include "SMDS_MeshElement.hxx"
-#include "SMDS_VolumeOfNodes.hxx"
-#include "SMDS_VolumeTool.hxx"
-#include "SMESHDS_SubMesh.hxx"
-#include "SMESH_Mesh.hxx"
-#include "SMESH_subMesh.hxx"
-#include "SMESH_MeshEditor.hxx"
-
-#include <BRep_Tool.hxx>
-#include <TopAbs_ShapeEnum.hxx>
-#include <TopExp.hxx>
-#include <TopTools_IndexedDataMapOfShapeListOfShape.hxx>
-#include <TopTools_IndexedMapOfShape.hxx>
-#include <TopTools_IndexedMapOfShape.hxx>
-#include <TopTools_ListIteratorOfListOfShape.hxx>
-#include <TopTools_ListOfShape.hxx>
-#include <TopoDS.hxx>
-#include <TopoDS_Edge.hxx>
-#include <TopoDS_Shell.hxx>
-#include <TopoDS_Vertex.hxx>
-#include <gp_Pnt.hxx>
-
-#include <stdio.h>
-#include <algorithm>
-
-using namespace std;
-
-typedef map < int, int, less<int> >::iterator \
- StdMeshers_IteratorOfDataMapOfIntegerInteger;
-
-//=======================================================================
-//function : StdMeshers_Penta_3D
-//purpose :
-//=======================================================================
-StdMeshers_Penta_3D::StdMeshers_Penta_3D()
-: myErrorStatus(1)
-{
- myTol3D=0.1;
- myWallNodesMaps.resize( SMESH_Block::NbFaces() );
- myShapeXYZ.resize( SMESH_Block::NbSubShapes() );
-}
-//=======================================================================
-//function : Compute
-//purpose :
-//=======================================================================
-bool StdMeshers_Penta_3D::Compute(SMESH_Mesh& aMesh,
- const TopoDS_Shape& aShape)
-{
- MESSAGE("StdMeshers_Penta_3D::Compute()");
- //
- myErrorStatus=0;
- //
- bool bOK=false;
- //
- myShape=aShape;
- SetMesh(aMesh);
- //
- CheckData();
- if (myErrorStatus){
- return bOK;
- }
- //
- MakeBlock();
- if (myErrorStatus){
- return bOK;
- }
- //
- MakeNodes();
- if (myErrorStatus){
- return bOK;
- }
- //
- MakeConnectingMap();
- //
- ClearMeshOnFxy1();
- if (myErrorStatus) {
- return bOK;
- }
- //
- MakeMeshOnFxy1();
- if (myErrorStatus) {
- return bOK;
- }
- //
- MakeVolumeMesh();
- //
- return !bOK;
-}
-//=======================================================================
-//function : MakeNodes
-//purpose :
-//=======================================================================
-void StdMeshers_Penta_3D::MakeNodes()
-{
- myErrorStatus=0;
- //
- const int aNbSIDs=9;
- int i, j, k, ij, iNbN, aNodeID, aSize, iErr;
- double aX, aY, aZ;
- SMESH_Block::TShapeID aSID, aSIDs[aNbSIDs]={
- SMESH_Block::ID_V000, SMESH_Block::ID_V100,
- SMESH_Block::ID_V110, SMESH_Block::ID_V010,
- SMESH_Block::ID_Ex00, SMESH_Block::ID_E1y0,
- SMESH_Block::ID_Ex10, SMESH_Block::ID_E0y0,
- SMESH_Block::ID_Fxy0
- };
- //
- SMESH_Mesh* pMesh=GetMesh();
- //
- // 1. Define the sizes of mesh
- //
- // 1.1 Horizontal size
- myJSize=0;
- for (i=0; i<aNbSIDs; ++i) {
- const TopoDS_Shape& aS=myBlock.Shape(aSIDs[i]);
- SMESH_subMesh *aSubMesh = pMesh->GetSubMeshContaining(aS);
- ASSERT(aSubMesh);
- SMESHDS_SubMesh *aSM=aSubMesh->GetSubMeshDS();
- iNbN=aSM->NbNodes();
- myJSize+=iNbN;
- }
- //printf("*** Horizontal: number of nodes summary=%d\n", myJSize);
- //
- // 1.2 Vertical size
- myISize=2;
- {
- const TopoDS_Shape& aS=myBlock.Shape(SMESH_Block::ID_E00z);
- SMESH_subMesh *aSubMesh = pMesh->GetSubMeshContaining(aS);
- ASSERT(aSubMesh);
- SMESHDS_SubMesh *aSM=aSubMesh->GetSubMeshDS();
- iNbN=aSM->NbNodes();
- myISize+=iNbN;
- }
- //printf("*** Vertical: number of nodes on edges and vertices=%d\n", myISize);
- //
- aSize=myISize*myJSize;
- myTNodes.resize(aSize);
- //
- StdMeshers_TNode aTNode;
- gp_XYZ aCoords;
- gp_Pnt aP3D;
- //
- // 2. Fill the repers on base face (Z=0)
- i=0; j=0;
- // vertices
- for (k=0; k<aNbSIDs; ++k) {
- aSID=aSIDs[k];
- const TopoDS_Shape& aS=myBlock.Shape(aSID);
- SMDS_NodeIteratorPtr ite =pMesh->GetSubMeshContaining(aS)->GetSubMeshDS()->GetNodes();
- while(ite->more()) {
- const SMDS_MeshNode* aNode = ite->next();
- aNodeID=aNode->GetID();
- //
- aTNode.SetNode(aNode);
- aTNode.SetShapeSupportID(aSID);
- aTNode.SetBaseNodeID(aNodeID);
- //
- if ( SMESH_Block::IsEdgeID (aSID))
- {
- const SMDS_EdgePosition* epos =
- static_cast<const SMDS_EdgePosition*>(aNode->GetPosition().get());
- myBlock.ComputeParameters( epos->GetUParameter(), aS, aCoords );
- }
- else {
- aX=aNode->X();
- aY=aNode->Y();
- aZ=aNode->Z();
- aP3D.SetCoord(aX, aY, aZ);
- myBlock.ComputeParameters(aP3D, aS, aCoords);
- }
- iErr=myBlock.ErrorStatus();
- if (iErr) {
- MESSAGE("StdMeshers_Penta_3D::MakeNodes()," <<
- "SMESHBlock: ComputeParameters operation failed");
- myErrorStatus=101; // SMESHBlock: ComputeParameters operation failed
- return;
- }
- aTNode.SetNormCoord(aCoords);
- ij=i*myJSize+j;
- myTNodes[ij]=aTNode;
- ++j;
- }
- }
- /*
- //DEB
- {
- int iShapeSupportID, iBaseNodeID;
- //
- //printf("\n\n*** Base Face\n");
- i=0;
- for (j=0; j<myJSize; ++j) {
- ij=i*myJSize+j;
- const StdMeshers_TNode& aTNode=myTNodes[ij];
- iShapeSupportID=aTNode.ShapeSupportID();
- iBaseNodeID=aTNode.BaseNodeID();
- const gp_XYZ& aXYZ=aTNode.NormCoord();
- printf("*** j:%d bID#%d iSS:%d { %lf %lf %lf }\n",
- j, iBaseNodeID, iShapeSupportID, aXYZ.X(), aXYZ.Y(), aXYZ.Z());
- }
- }
- */
- //DEB
- //return; //zz
- //
- // 3. Finding of Z-layers
-// vector<double> aZL(myISize);
-// vector<double>::iterator aItZL1, aItZL2 ;
-// //
-// const TopoDS_Shape& aE00z=myBlock.Shape(SMESH_Block::ID_E00z);
-// SMDS_NodeIteratorPtr aItaE00z =
-// pMesh->GetSubMeshContaining(aE00z)->GetSubMeshDS()->GetNodes();
-// //
-// aZL[0]=0.;
-// i=1;
-// while (aItaE00z->more()) {
-// const SMDS_MeshNode* aNode=aItaE00z->next();
-// const SMDS_EdgePosition* epos =
-// static_cast<const SMDS_EdgePosition*>(aNode->GetPosition().get());
-// myBlock.ComputeParameters( epos->GetUParameter(), aE00z, aCoords );
-// iErr=myBlock.ErrorStatus();
-// if (iErr) {
-// MESSAGE("StdMeshers_Penta_3D::MakeNodes()," <<
-// "SMESHBlock: ComputeParameters operation failed");
-// myErrorStatus=101; // SMESHBlock: ComputeParameters operation failed
-// return;
-// }
-// aZL[i]=aCoords.Z();
-// ++i;
-// }
-// aZL[i]=1.;
-// //
-// aItZL1=aZL.begin();
-// aItZL2=aZL.end();
-// //
-// // Sorting the layers
-// sort(aItZL1, aItZL2);
- //DEB
- /*
- printf("** \n\n Layers begin\n");
- for(i=0, aItZL=aItZL1; aItZL!=aItZL2; ++aItZL, ++i) {
- printf(" #%d : %lf\n", i, *aItZL);
- }
- printf("** Layers end\n");
- */
- //DEB
- //
- //
-
- // 3.1 Fill maps of wall nodes
- SMESH_Block::TShapeID wallFaceID[4] = {
- SMESH_Block::ID_Fx0z, SMESH_Block::ID_Fx1z,
- SMESH_Block::ID_F0yz, SMESH_Block::ID_F1yz
- };
- SMESH_Block::TShapeID baseEdgeID[4] = {
- SMESH_Block::ID_Ex00, SMESH_Block::ID_Ex10,
- SMESH_Block::ID_E0y0, SMESH_Block::ID_E1y0
- };
- for ( i = 0; i < 4; ++i ) {
- int fIndex = SMESH_Block::ShapeIndex( wallFaceID[ i ]);
- bool ok = LoadIJNodes (myWallNodesMaps[ fIndex ],
- TopoDS::Face( myBlock.Shape( wallFaceID[ i ] )),
- TopoDS::Edge( myBlock.Shape( baseEdgeID[ i ] )),
- pMesh->GetMeshDS());
- if ( !ok ) {
- myErrorStatus = i + 1;
- MESSAGE(" Cant LoadIJNodes() from a wall face " << myErrorStatus );
- return;
- }
- }
-
- // 3.2 find node columns for vertical edges and edge IDs
- vector<const SMDS_MeshNode*> * verticEdgeNodes[ 4 ];
- SMESH_Block::TShapeID verticEdgeID [ 4 ];
- for ( i = 0; i < 4; ++i ) { // 4 first base nodes are nodes on vertices
- // edge ID
- SMESH_Block::TShapeID eID, vID = aSIDs[ i ];
- ShapeSupportID(false, vID, eID);
- verticEdgeID[ i ] = eID;
- // column nodes
- StdMeshers_TNode& aTNode = myTNodes[ i ];
- verticEdgeNodes[ i ] = 0;
- for ( j = 0; j < 4; ++j ) { // loop on 4 wall faces
- int fIndex = SMESH_Block::ShapeIndex( wallFaceID[ j ]);
- StdMeshers_IJNodeMap & ijNodes= myWallNodesMaps[ fIndex ];
- if ( ijNodes.begin()->second[0] == aTNode.Node() )
- verticEdgeNodes[ i ] = & ijNodes.begin()->second;
- else if ( ijNodes.rbegin()->second[0] == aTNode.Node() )
- verticEdgeNodes[ i ] = & ijNodes.rbegin()->second;
- if ( verticEdgeNodes[ i ] )
- break;
- }
- }
-
- // 3.3 set XYZ of vertices, and initialize of the rest
- SMESHDS_Mesh* aMesh = GetMesh()->GetMeshDS();
- for ( int id = SMESH_Block::ID_V000; id < SMESH_Block::ID_Shell; ++id )
- {
- if ( SMESH_Block::IsVertexID( id )) {
- TopoDS_Shape V = myBlock.Shape( id );
- SMESHDS_SubMesh* sm = aMesh->MeshElements( V );
- const SMDS_MeshNode* n = sm->GetNodes()->next();
- myShapeXYZ[ id ].SetCoord( n->X(), n->Y(), n->Z() );
- }
- else
- myShapeXYZ[ id ].SetCoord( 0., 0., 0. );
- }
-
-
- // 4. Fill the rest repers
- bool bIsUpperLayer;
- int iBNID;
- SMESH_Block::TShapeID aSSID, aBNSSID;
- StdMeshers_TNode aTN;
- //
- for (j=0; j<myJSize; ++j)
- {
- // base node info
- const StdMeshers_TNode& aBN=myTNodes[j];
- aBNSSID=(SMESH_Block::TShapeID)aBN.ShapeSupportID();
- iBNID=aBN.BaseNodeID();
- const gp_XYZ& aBNXYZ=aBN.NormCoord();
- bool createNode = ( aBNSSID == SMESH_Block::ID_Fxy0 );
- //
- // set XYZ on horizontal edges and get node columns of faces:
- // 2 columns for each face, between which a base node is located
- vector<const SMDS_MeshNode*>* nColumns[8];
- double ratio[4]; // base node position between columns [0.-1.]
- if ( createNode )
- for ( k = 0; k < 4; ++k )
- ratio[ k ] = SetHorizEdgeXYZ (aBNXYZ, wallFaceID[ k ],
- nColumns[k*2], nColumns[k*2+1]);
- //
- // XYZ on the bottom and top faces
- const SMDS_MeshNode* n = aBN.Node();
- myShapeXYZ[ SMESH_Block::ID_Fxy0 ].SetCoord( n->X(), n->Y(), n->Z() );
- myShapeXYZ[ SMESH_Block::ID_Fxy1 ].SetCoord( 0., 0., 0. );
- //
- // first create or find a top node, then the rest ones in a column
- for (i=myISize-1; i>0; --i)
- {
- if ( createNode ) {
- // set XYZ on vertical edges and faces
- for ( k = 0; k < 4; ++k ) {
- const SMDS_MeshNode* n = (*verticEdgeNodes[ k ]) [ i ];
- myShapeXYZ[ verticEdgeID[ k ] ].SetCoord( n->X(), n->Y(), n->Z() );
- //
- n = (*nColumns[k*2]) [ i ];
- gp_XYZ xyz( n->X(), n->Y(), n->Z() );
- myShapeXYZ[ wallFaceID[ k ]] = ( 1. - ratio[ k ]) * xyz;
- n = (*nColumns[k*2+1]) [ i ];
- xyz.SetCoord( n->X(), n->Y(), n->Z() );
- myShapeXYZ[ wallFaceID[ k ]] += ratio[ k ] * xyz;
- }
- }
- // fill current node info
- // -index in aTNodes
- ij=i*myJSize+j;
- // -normalized coordinates
- aX=aBNXYZ.X();
- aY=aBNXYZ.Y();
- //aZ=aZL[i];
- aZ=(double)i/(double)(myISize-1);
- aCoords.SetCoord(aX, aY, aZ);
- //
- // suporting shape ID
- bIsUpperLayer=(i==(myISize-1));
- ShapeSupportID(bIsUpperLayer, aBNSSID, aSSID);
- if (myErrorStatus) {
- MESSAGE("StdMeshers_Penta_3D::MakeNodes() ");
- return;
- }
- //
- aTN.SetShapeSupportID(aSSID);
- aTN.SetNormCoord(aCoords);
- aTN.SetBaseNodeID(iBNID);
- //
- if (aSSID!=SMESH_Block::ID_NONE){
- // try to find the node
- const TopoDS_Shape& aS=myBlock.Shape((int)aSSID);
- FindNodeOnShape(aS, aCoords, i, aTN);
- }
- else{
- // create node and get it id
- CreateNode (bIsUpperLayer, aCoords, aTN);
- //
- if ( bIsUpperLayer ) {
- const SMDS_MeshNode* n = aTN.Node();
- myShapeXYZ[ SMESH_Block::ID_Fxy1 ].SetCoord( n->X(), n->Y(), n->Z() );
- }
- }
- if (myErrorStatus) {
- MESSAGE("StdMeshers_Penta_3D::MakeNodes() ");
- return;
- }
- //
- myTNodes[ij]=aTN;
- }
- }
- //DEB
- /*
- {
- int iSSID, iBNID, aID;
- //
- for (i=0; i<myISize; ++i) {
- printf(" Layer# %d\n", i);
- for (j=0; j<myJSize; ++j) {
- ij=i*myJSize+j;
- const StdMeshers_TNode& aTN=myTNodes[ij];
- //const StdMeshers_TNode& aTN=aTNodes[ij];
- const gp_XYZ& aXYZ=aTN.NormCoord();
- iSSID=aTN.ShapeSupportID();
- iBNID=aTN.BaseNodeID();
- //
- const SMDS_MeshNode* aNode=aTN.Node();
- aID=aNode->GetID();
- aX=aNode->X();
- aY=aNode->Y();
- aZ=aNode->Z();
- printf("*** j:%d BNID#%d iSSID:%d ID:%d { %lf %lf %lf }, { %lf %lf %lf }\n",
- j, iBNID, iSSID, aID, aXYZ.X(), aXYZ.Y(), aXYZ.Z(), aX, aY, aZ);
- }
- }
- }
- */
- //DEB t
-}
-//=======================================================================
-//function : FindNodeOnShape
-//purpose :
-//=======================================================================
-void StdMeshers_Penta_3D::FindNodeOnShape(const TopoDS_Shape& aS,
- const gp_XYZ& aParams,
- const int z,
- StdMeshers_TNode& aTN)
-{
- myErrorStatus=0;
- //
- double aX, aY, aZ, aD, aTol2, minD;
- gp_Pnt aP1, aP2;
- //
- SMESH_Mesh* pMesh=GetMesh();
- aTol2=myTol3D*myTol3D;
- minD = 1.e100;
- SMDS_MeshNode* pNode=NULL;
- //
- if ( aS.ShapeType() == TopAbs_FACE ||
- aS.ShapeType() == TopAbs_EDGE )
- {
- // find a face ID to which aTN belongs to
- int faceID;
- if ( aS.ShapeType() == TopAbs_FACE )
- faceID = myBlock.ShapeID( aS );
- else { // edge maybe vertical or top horizontal
- gp_XYZ aCoord = aParams;
- if ( aCoord.Z() == 1. )
- aCoord.SetZ( 0.5 ); // move from top down
- else
- aCoord.SetX( 0.5 ); // move along X
- faceID = SMESH_Block::GetShapeIDByParams( aCoord );
- }
- ASSERT( SMESH_Block::IsFaceID( faceID ));
- int fIndex = SMESH_Block::ShapeIndex( faceID );
- StdMeshers_IJNodeMap & ijNodes= myWallNodesMaps[ fIndex ];
- // look for a base node in ijNodes
- const SMDS_MeshNode* baseNode = pMesh->GetMeshDS()->FindNode( aTN.BaseNodeID() );
- StdMeshers_IJNodeMap::const_iterator par_nVec = ijNodes.begin();
- for ( ; par_nVec != ijNodes.end(); par_nVec++ )
- if ( par_nVec->second[ 0 ] == baseNode ) {
- pNode=(SMDS_MeshNode*)par_nVec->second.at( z );
- aTN.SetNode(pNode);
- return;
- }
- }
- //
- myBlock.Point(aParams, aS, aP1);
- //
- SMDS_NodeIteratorPtr ite=
- pMesh->GetSubMeshContaining(aS)->GetSubMeshDS()->GetNodes();
- while(ite->more()) {
- const SMDS_MeshNode* aNode = ite->next();
- aX=aNode->X();
- aY=aNode->Y();
- aZ=aNode->Z();
- aP2.SetCoord(aX, aY, aZ);
- aD=(double)aP1.SquareDistance(aP2);
- //printf("** D=%lf ", aD, aTol2);
- if (aD < minD) {
- pNode=(SMDS_MeshNode*)aNode;
- aTN.SetNode(pNode);
- minD = aD;
- //printf(" Ok\n");
- if (aD<aTol2)
- return;
- }
- }
- //
- //printf(" KO\n");
- //aTN.SetNode(pNode);
- //MESSAGE("StdMeshers_Penta_3D::FindNodeOnShape(), can not find the node");
- //myErrorStatus=11; // can not find the node;
-}
-
-//=======================================================================
-//function : SetHorizEdgeXYZ
-//purpose :
-//=======================================================================
-
-double StdMeshers_Penta_3D::SetHorizEdgeXYZ(const gp_XYZ& aBaseNodeParams,
- const int aFaceID,
- vector<const SMDS_MeshNode*>*& aCol1,
- vector<const SMDS_MeshNode*>*& aCol2)
-{
- // find base and top edges of the face
- vector< int > edgeVec; // 0-base, 1-top
- SMESH_Block::GetFaceEdgesIDs( aFaceID, edgeVec );
- //
- int coord = SMESH_Block::GetCoordIndOnEdge( edgeVec[ 0 ] );
- double param = aBaseNodeParams.Coord( coord );
- if ( !myBlock.IsForwadEdge( edgeVec[ 0 ] ))
- param = 1. - param;
- //
- // look for columns around param
- StdMeshers_IJNodeMap & ijNodes =
- myWallNodesMaps[ SMESH_Block::ShapeIndex( aFaceID )];
- StdMeshers_IJNodeMap::iterator par_nVec_1 = ijNodes.begin();
- while ( par_nVec_1->first < param )
- par_nVec_1++;
- StdMeshers_IJNodeMap::iterator par_nVec_2 = par_nVec_1;
- //
- double r = 0;
- if ( par_nVec_1 != ijNodes.begin() ) {
- par_nVec_1--;
- r = ( param - par_nVec_1->first ) / ( par_nVec_2->first - par_nVec_1->first );
- }
- aCol1 = & par_nVec_1->second;
- aCol2 = & par_nVec_2->second;
-
- // base edge
- const SMDS_MeshNode* n1 = aCol1->front();
- const SMDS_MeshNode* n2 = aCol2->front();
- gp_XYZ xyz1( n1->X(), n1->Y(), n1->Z() ), xyz2( n2->X(), n2->Y(), n2->Z() );
- myShapeXYZ[ edgeVec[ 0 ] ] = ( 1. - r ) * xyz1 + r * xyz2;
-
- // top edge
- n1 = aCol1->back();
- n2 = aCol2->back();
- xyz1.SetCoord( n1->X(), n1->Y(), n1->Z() );
- xyz2.SetCoord( n2->X(), n2->Y(), n2->Z() );
- myShapeXYZ[ edgeVec[ 1 ] ] = ( 1. - r ) * xyz1 + r * xyz2;
-
- return r;
-}
-
-//=======================================================================
-//function : MakeVolumeMesh
-//purpose :
-//=======================================================================
-void StdMeshers_Penta_3D::MakeVolumeMesh()
-{
- myErrorStatus=0;
- //
- int i, j, ij, ik, i1, i2, aSSID;
- //
- SMESH_Mesh* pMesh =GetMesh();
- SMESHDS_Mesh* meshDS=pMesh->GetMeshDS();
- //
- int shapeID = meshDS->ShapeToIndex( myShape );
- //
- // 1. Set Node In Volume
- ik=myISize-1;
- for (i=1; i<ik; ++i){
- for (j=0; j<myJSize; ++j){
- ij=i*myJSize+j;
- const StdMeshers_TNode& aTN=myTNodes[ij];
- aSSID=aTN.ShapeSupportID();
- if (aSSID==SMESH_Block::ID_NONE) {
- SMDS_MeshNode* aNode=(SMDS_MeshNode*)aTN.Node();
- meshDS->SetNodeInVolume(aNode, shapeID);
- }
- }
- }
- //
- // 2. Make pentahedrons
- int aID0, k , aJ[3];
- vector<const SMDS_MeshNode*> aN;
- //
- SMDS_ElemIteratorPtr itf, aItNodes;
- //
- const TopoDS_Face& aFxy0=
- TopoDS::Face(myBlock.Shape(SMESH_Block::ID_Fxy0));
- SMESH_subMesh *aSubMesh0 = pMesh->GetSubMeshContaining(aFxy0);
- SMESHDS_SubMesh *aSM0=aSubMesh0->GetSubMeshDS();
- //
- itf=aSM0->GetElements();
- while(itf->more()) {
- const SMDS_MeshElement* pE0=itf->next();
- //
- int nbFaceNodes = pE0->NbNodes();
- if ( aN.size() < nbFaceNodes * 2 )
- aN.resize( nbFaceNodes * 2 );
- //
- k=0;
- aItNodes=pE0->nodesIterator();
- while (aItNodes->more()) {
- const SMDS_MeshElement* pNode=aItNodes->next();
- aID0=pNode->GetID();
- aJ[k]=GetIndexOnLayer(aID0);
- if (myErrorStatus) {
- MESSAGE("StdMeshers_Penta_3D::MakeVolumeMesh");
- return;
- }
- //
- ++k;
- }
- //
- bool forward = true;
- for (i=0; i<ik; ++i){
- i1=i;
- i2=i+1;
- for(j=0; j<nbFaceNodes; ++j) {
- ij=i1*myJSize+aJ[j];
- const StdMeshers_TNode& aTN1=myTNodes[ij];
- const SMDS_MeshNode* aN1=aTN1.Node();
- aN[j]=aN1;
- //
- ij=i2*myJSize+aJ[j];
- const StdMeshers_TNode& aTN2=myTNodes[ij];
- const SMDS_MeshNode* aN2=aTN2.Node();
- aN[j+nbFaceNodes]=aN2;
- }
- // check if volume orientation will be ok
- if ( i == 0 ) {
- SMDS_VolumeTool vTool;
- switch ( nbFaceNodes ) {
- case 3: {
- SMDS_VolumeOfNodes tmpVol (aN[0], aN[1], aN[2],
- aN[3], aN[4], aN[5]);
- vTool.Set( &tmpVol );
- break;
- }
- case 4: {
- SMDS_VolumeOfNodes tmpVol(aN[0], aN[1], aN[2], aN[3],
- aN[4], aN[5], aN[6], aN[7]);
- vTool.Set( &tmpVol );
- break;
- }
- default:
- continue;
- }
- forward = vTool.IsForward();
- }
- // add volume
- SMDS_MeshVolume* aV = 0;
- switch ( nbFaceNodes ) {
- case 3:
- if ( forward )
- aV = meshDS->AddVolume(aN[0], aN[1], aN[2],
- aN[3], aN[4], aN[5]);
- else
- aV = meshDS->AddVolume(aN[0], aN[2], aN[1],
- aN[3], aN[5], aN[4]);
- break;
- case 4:
- if ( forward )
- aV = meshDS->AddVolume(aN[0], aN[1], aN[2], aN[3],
- aN[4], aN[5], aN[6], aN[7]);
- else
- aV = meshDS->AddVolume(aN[0], aN[3], aN[2], aN[1],
- aN[4], aN[7], aN[6], aN[5]);
- break;
- default:
- continue;
- }
- meshDS->SetMeshElementOnShape(aV, shapeID);
- }
- }
-}
-
-//=======================================================================
-//function : MakeMeshOnFxy1
-//purpose :
-//=======================================================================
-void StdMeshers_Penta_3D::MakeMeshOnFxy1()
-{
- myErrorStatus=0;
- //
- int aID0, aJ, aLevel, ij, aNbNodes, k;
- //
- SMDS_NodeIteratorPtr itn;
- SMDS_ElemIteratorPtr itf, aItNodes;
- SMDSAbs_ElementType aElementType;
- //
- const TopoDS_Face& aFxy0=
- TopoDS::Face(myBlock.Shape(SMESH_Block::ID_Fxy0));
- const TopoDS_Face& aFxy1=
- TopoDS::Face(myBlock.Shape(SMESH_Block::ID_Fxy1));
- //
- SMESH_Mesh* pMesh=GetMesh();
- SMESHDS_Mesh * meshDS = pMesh->GetMeshDS();
- //
- SMESH_subMesh *aSubMesh0 = pMesh->GetSubMeshContaining(aFxy0);
- SMESHDS_SubMesh *aSM0=aSubMesh0->GetSubMeshDS();
- //
- // set nodes on aFxy1
- aLevel=myISize-1;
- itn=aSM0->GetNodes();
- aNbNodes=aSM0->NbNodes();
- //printf("** aNbNodes=%d\n", aNbNodes);
- while(itn->more()) {
- const SMDS_MeshNode* aN0=itn->next();
- aID0=aN0->GetID();
- aJ=GetIndexOnLayer(aID0);
- if (myErrorStatus) {
- MESSAGE("StdMeshers_Penta_3D::MakeMeshOnFxy1() ");
- return;
- }
- //
- ij=aLevel*myJSize+aJ;
- const StdMeshers_TNode& aTN1=myTNodes[ij];
- SMDS_MeshNode* aN1=(SMDS_MeshNode*)aTN1.Node();
- //
- meshDS->SetNodeOnFace(aN1, aFxy1);
- }
- //
- // set elements on aFxy1
- vector<const SMDS_MeshNode*> aNodes1;
- //
- itf=aSM0->GetElements();
- while(itf->more()) {
- const SMDS_MeshElement * pE0=itf->next();
- aElementType=pE0->GetType();
- if (!aElementType==SMDSAbs_Face) {
- continue;
- }
- aNbNodes=pE0->NbNodes();
-// if (aNbNodes!=3) {
-// continue;
-// }
- if ( aNodes1.size() < aNbNodes )
- aNodes1.resize( aNbNodes );
- //
- k=aNbNodes-1; // reverse a face
- aItNodes=pE0->nodesIterator();
- while (aItNodes->more()) {
- const SMDS_MeshElement* pNode=aItNodes->next();
- aID0=pNode->GetID();
- aJ=GetIndexOnLayer(aID0);
- if (myErrorStatus) {
- MESSAGE("StdMeshers_Penta_3D::MakeMeshOnFxy1() ");
- return;
- }
- //
- ij=aLevel*myJSize+aJ;
- const StdMeshers_TNode& aTN1=myTNodes[ij];
- const SMDS_MeshNode* aN1=aTN1.Node();
- aNodes1[k]=aN1;
- --k;
- }
- SMDS_MeshFace * face = 0;
- switch ( aNbNodes ) {
- case 3:
- face = meshDS->AddFace(aNodes1[0], aNodes1[1], aNodes1[2]);
- break;
- case 4:
- face = meshDS->AddFace(aNodes1[0], aNodes1[1], aNodes1[2], aNodes1[3]);
- break;
- default:
- continue;
- }
- meshDS->SetMeshElementOnShape(face, aFxy1);
- }
-}
-//=======================================================================
-//function : ClearMeshOnFxy1
-//purpose :
-//=======================================================================
-void StdMeshers_Penta_3D::ClearMeshOnFxy1()
-{
- myErrorStatus=0;
- //
- SMESH_subMesh* aSubMesh;
- SMESH_Mesh* pMesh=GetMesh();
- //
- const TopoDS_Shape& aFxy1=myBlock.Shape(SMESH_Block::ID_Fxy1);
- aSubMesh = pMesh->GetSubMeshContaining(aFxy1);
- if (aSubMesh)
- aSubMesh->ComputeStateEngine( SMESH_subMesh::CLEAN );
-}
-
-//=======================================================================
-//function : GetIndexOnLayer
-//purpose :
-//=======================================================================
-int StdMeshers_Penta_3D::GetIndexOnLayer(const int aID)
-{
- myErrorStatus=0;
- //
- int j=-1;
- StdMeshers_IteratorOfDataMapOfIntegerInteger aMapIt;
- //
- aMapIt=myConnectingMap.find(aID);
- if (aMapIt==myConnectingMap.end()) {
- myErrorStatus=200;
- return j;
- }
- j=(*aMapIt).second;
- return j;
-}
-//=======================================================================
-//function : MakeConnectingMap
-//purpose :
-//=======================================================================
-void StdMeshers_Penta_3D::MakeConnectingMap()
-{
- int j, aBNID;
- //
- for (j=0; j<myJSize; ++j) {
- const StdMeshers_TNode& aBN=myTNodes[j];
- aBNID=aBN.BaseNodeID();
- myConnectingMap[aBNID]=j;
- }
-}
-//=======================================================================
-//function : CreateNode
-//purpose :
-//=======================================================================
-void StdMeshers_Penta_3D::CreateNode(const bool bIsUpperLayer,
- const gp_XYZ& aParams,
- StdMeshers_TNode& aTN)
-{
- myErrorStatus=0;
- //
- // int iErr;
- double aX, aY, aZ;
- //
- gp_Pnt aP;
- //
- SMDS_MeshNode* pNode=NULL;
- aTN.SetNode(pNode);
- //
-// if (bIsUpperLayer) {
-// // point on face Fxy1
-// const TopoDS_Shape& aS=myBlock.Shape(SMESH_Block::ID_Fxy1);
-// myBlock.Point(aParams, aS, aP);
-// }
-// else {
-// // point inside solid
-// myBlock.Point(aParams, aP);
-// }
- if (bIsUpperLayer)
- {
- double u = aParams.X(), v = aParams.Y();
- double u1 = ( 1. - u ), v1 = ( 1. - v );
- aP.ChangeCoord() = myShapeXYZ[ SMESH_Block::ID_Ex01 ] * v1;
- aP.ChangeCoord() += myShapeXYZ[ SMESH_Block::ID_Ex11 ] * v;
- aP.ChangeCoord() += myShapeXYZ[ SMESH_Block::ID_E0y1 ] * u1;
- aP.ChangeCoord() += myShapeXYZ[ SMESH_Block::ID_E1y1 ] * u;
-
- aP.ChangeCoord() -= myShapeXYZ[ SMESH_Block::ID_V001 ] * u1 * v1;
- aP.ChangeCoord() -= myShapeXYZ[ SMESH_Block::ID_V101 ] * u * v1;
- aP.ChangeCoord() -= myShapeXYZ[ SMESH_Block::ID_V011 ] * u1 * v;
- aP.ChangeCoord() -= myShapeXYZ[ SMESH_Block::ID_V111 ] * u * v;
- }
- else
- {
- SMESH_Block::ShellPoint( aParams, myShapeXYZ, aP.ChangeCoord() );
- }
- //
-// iErr=myBlock.ErrorStatus();
-// if (iErr) {
-// myErrorStatus=12; // can not find the node point;
-// return;
-// }
- //
- aX=aP.X(); aY=aP.Y(); aZ=aP.Z();
- //
- SMESH_Mesh* pMesh=GetMesh();
- SMESHDS_Mesh* pMeshDS=pMesh->GetMeshDS();
- //
- pNode = pMeshDS->AddNode(aX, aY, aZ);
- aTN.SetNode(pNode);
-}
-//=======================================================================
-//function : ShapeSupportID
-//purpose :
-//=======================================================================
-void StdMeshers_Penta_3D::ShapeSupportID(const bool bIsUpperLayer,
- const SMESH_Block::TShapeID aBNSSID,
- SMESH_Block::TShapeID& aSSID)
-{
- myErrorStatus=0;
- //
- switch (aBNSSID) {
- case SMESH_Block::ID_V000:
- aSSID=(bIsUpperLayer) ? SMESH_Block::ID_V001 : SMESH_Block::ID_E00z;
- break;
- case SMESH_Block::ID_V100:
- aSSID=(bIsUpperLayer) ? SMESH_Block::ID_V101 : SMESH_Block::ID_E10z;
- break;
- case SMESH_Block::ID_V110:
- aSSID=(bIsUpperLayer) ? SMESH_Block::ID_V111 : SMESH_Block::ID_E11z;
- break;
- case SMESH_Block::ID_V010:
- aSSID=(bIsUpperLayer) ? SMESH_Block::ID_V011 : SMESH_Block::ID_E01z;
- break;
- case SMESH_Block::ID_Ex00:
- aSSID=(bIsUpperLayer) ? SMESH_Block::ID_Ex01 : SMESH_Block::ID_Fx0z;
- break;
- case SMESH_Block::ID_Ex10:
- aSSID=(bIsUpperLayer) ? SMESH_Block::ID_Ex11 : SMESH_Block::ID_Fx1z;
- break;
- case SMESH_Block::ID_E0y0:
- aSSID=(bIsUpperLayer) ? SMESH_Block::ID_E0y1 : SMESH_Block::ID_F0yz;
- break;
- case SMESH_Block::ID_E1y0:
- aSSID=(bIsUpperLayer) ? SMESH_Block::ID_E1y1 : SMESH_Block::ID_F1yz;
- break;
- case SMESH_Block::ID_Fxy0:
- aSSID=SMESH_Block::ID_NONE;//(bIsUpperLayer) ? Shape_ID_Fxy1 : Shape_ID_NONE;
- break;
- default:
- aSSID=SMESH_Block::ID_NONE;
- myErrorStatus=10; // Can not find supporting shape ID
- break;
- }
- return;
-}
-//=======================================================================
-//function : MakeBlock
-//purpose :
-//=======================================================================
-void StdMeshers_Penta_3D::MakeBlock()
-{
- myErrorStatus=0;
- //
- bool bFound;
- int i, j, iNbEV, iNbE, iErr, iCnt, iNbNodes, iNbF;
- //
- TopoDS_Vertex aV000, aV001;
- TopoDS_Shape aFTr;
- TopTools_IndexedDataMapOfShapeListOfShape aMVES;
- TopTools_IndexedMapOfShape aME ,aMEV, aM;
- TopTools_ListIteratorOfListOfShape aIt;
- //
- TopExp::MapShapes(myShape, TopAbs_FACE, aM);
- //
- // 0. Find triangulated face aFTr
- SMDSAbs_ElementType aElementType;
- SMESH_Mesh* pMesh=GetMesh();
- //
- iCnt=0;
- iNbF=aM.Extent();
- for (i=1; i<=iNbF; ++i) {
- const TopoDS_Shape& aF=aM(i);
- SMESH_subMesh *aSubMesh = pMesh->GetSubMeshContaining(aF);
- ASSERT(aSubMesh);
- SMESHDS_SubMesh *aSM=aSubMesh->GetSubMeshDS();
- SMDS_ElemIteratorPtr itf=aSM->GetElements();
- while(itf->more()) {
- const SMDS_MeshElement * pElement=itf->next();
- aElementType=pElement->GetType();
- if (aElementType==SMDSAbs_Face) {
- iNbNodes=pElement->NbNodes();
- if (iNbNodes==3) {
- aFTr=aF;
- ++iCnt;
- if (iCnt>1) {
- MESSAGE("StdMeshers_Penta_3D::MakeBlock() ");
- myErrorStatus=5; // more than one face has triangulation
- return;
- }
- break; // next face
- }
- }
- }
- }
- //
- // 1. Vetrices V00, V001;
- //
- TopExp::MapShapes(aFTr, TopAbs_EDGE, aME);
- TopExp::MapShapesAndAncestors(myShape, TopAbs_VERTEX, TopAbs_EDGE, aMVES);
- //
- // 1.1 Base vertex V000
- iNbE=aME.Extent();
- if (iNbE!=4){
- MESSAGE("StdMeshers_Penta_3D::MakeBlock() ");
- myErrorStatus=7; // too few edges are in base face aFTr
- return;
- }
- const TopoDS_Edge& aE1=TopoDS::Edge(aME(1));
- aV000=TopExp::FirstVertex(aE1);
- //
- const TopTools_ListOfShape& aLE=aMVES.FindFromKey(aV000);
- aIt.Initialize(aLE);
- for (; aIt.More(); aIt.Next()) {
- const TopoDS_Shape& aEx=aIt.Value();
- aMEV.Add(aEx);
- }
- iNbEV=aMEV.Extent();
- if (iNbEV!=3){
- MESSAGE("StdMeshers_Penta_3D::MakeBlock() ");
- myErrorStatus=7; // too few edges meet in base vertex
- return;
- }
- //
- // 1.2 Vertex V001
- bFound=false;
- for (j=1; j<=iNbEV; ++j) {
- const TopoDS_Shape& aEx=aMEV(j);
- if (!aME.Contains(aEx)) {
- TopoDS_Vertex aV[2];
- //
- const TopoDS_Edge& aE=TopoDS::Edge(aEx);
- TopExp::Vertices(aE, aV[0], aV[1]);
- for (i=0; i<2; ++i) {
- if (!aV[i].IsSame(aV000)) {
- aV001=aV[i];
- bFound=!bFound;
- break;
- }
- }
- }
- }
- //
- if (!bFound) {
- MESSAGE("StdMeshers_Penta_3D::MakeBlock() ");
- myErrorStatus=8; // can not find reper V001
- return;
- }
- //DEB
- //gp_Pnt aP000, aP001;
- //
- //aP000=BRep_Tool::Pnt(TopoDS::Vertex(aV000));
- //printf("*** aP000 { %lf, %lf, %lf }\n", aP000.X(), aP000.Y(), aP000.Z());
- //aP001=BRep_Tool::Pnt(TopoDS::Vertex(aV001));
- //printf("*** aP001 { %lf, %lf, %lf }\n", aP001.X(), aP001.Y(), aP001.Z());
- //DEB
- //
- aME.Clear();
- TopExp::MapShapes(myShape, TopAbs_SHELL, aME);
- iNbE=aME.Extent();
- if (iNbE!=1) {
- MESSAGE("StdMeshers_Penta_3D::MakeBlock() ");
- myErrorStatus=9; // number of shells in source shape !=1
- return;
- }
- //
- // 2. Load Block
- const TopoDS_Shell& aShell=TopoDS::Shell(aME(1));
- myBlock.Load(aShell, aV000, aV001);
- iErr=myBlock.ErrorStatus();
- if (iErr) {
- MESSAGE("StdMeshers_Penta_3D::MakeBlock() ");
- myErrorStatus=100; // SMESHBlock: Load operation failed
- return;
- }
-}
-//=======================================================================
-//function : CheckData
-//purpose :
-//=======================================================================
-void StdMeshers_Penta_3D::CheckData()
-{
- myErrorStatus=0;
- //
- int i, iNb;
- int iNbEx[]={8, 12, 6};
- //
- TopAbs_ShapeEnum aST;
- TopAbs_ShapeEnum aSTEx[]={
- TopAbs_VERTEX, TopAbs_EDGE, TopAbs_FACE
- };
- TopTools_IndexedMapOfShape aM;
- //
- if (myShape.IsNull()){
- MESSAGE("StdMeshers_Penta_3D::CheckData() ");
- myErrorStatus=2; // null shape
- return;
- }
- //
- aST=myShape.ShapeType();
- if (!(aST==TopAbs_SOLID || aST==TopAbs_SHELL)) {
- MESSAGE("StdMeshers_Penta_3D::CheckData() ");
- myErrorStatus=3; // not compatible type of shape
- return;
- }
- //
- for (i=0; i<3; ++i) {
- aM.Clear();
- TopExp::MapShapes(myShape, aSTEx[i], aM);
- iNb=aM.Extent();
- if (iNb!=iNbEx[i]){
- MESSAGE("StdMeshers_Penta_3D::CheckData() ");
- myErrorStatus=4; // number of subshape is not compatible
- return;
- }
- }
-}
-
-//=======================================================================
-//function : LoadIJNodes
-//purpose : Load nodes bound to theFace into column (vectors) and rows
-// of theIJNodes.
-// The value of theIJNodes map is a vector of ordered nodes so
-// that the 0-the one lies on theBaseEdge.
-// The key of theIJNodes map is a normalized parameter of each
-// 0-the node on theBaseEdge.
-//=======================================================================
-
-bool StdMeshers_Penta_3D::LoadIJNodes(StdMeshers_IJNodeMap & theIJNodes,
- const TopoDS_Face& theFace,
- const TopoDS_Edge& theBaseEdge,
- SMESHDS_Mesh* theMesh)
-{
- // get vertices of theBaseEdge
- TopoDS_Vertex vfb, vlb, vft; // first and last, bottom and top vertices
- TopoDS_Edge eFrw = TopoDS::Edge( theBaseEdge.Oriented( TopAbs_FORWARD ));
- TopExp::Vertices( eFrw, vfb, vlb );
-
- // find the other edges of theFace and orientation of e1
- TopoDS_Edge e1, e2, eTop;
- bool rev1, CumOri = false;
- TopExp_Explorer exp( theFace, TopAbs_EDGE );
- int nbEdges = 0;
- for ( ; exp.More(); exp.Next() )
- {
- if ( ++nbEdges > 4 )
- return false; // more than 4 edges in theFace
- TopoDS_Edge e = TopoDS::Edge( exp.Current() );
- if ( theBaseEdge.IsSame( e ))
- continue;
- TopoDS_Vertex vCommon;
- if ( !TopExp::CommonVertex( theBaseEdge, e, vCommon ))
- eTop = e;
- else if ( vCommon.IsSame( vfb )) {
- e1 = e;
- vft = TopExp::LastVertex( e1, CumOri );
- rev1 = vfb.IsSame( vft );
- if ( rev1 )
- vft = TopExp::FirstVertex( e1, CumOri );
- }
- else
- e2 = e;
- }
- if ( nbEdges < 4 )
- return false; // lass than 4 edges in theFace
-
- // submeshes corresponding to shapes
- SMESHDS_SubMesh* smFace = theMesh->MeshElements( theFace );
- SMESHDS_SubMesh* smb = theMesh->MeshElements( theBaseEdge );
- SMESHDS_SubMesh* smt = theMesh->MeshElements( eTop );
- SMESHDS_SubMesh* sm1 = theMesh->MeshElements( e1 );
- SMESHDS_SubMesh* sm2 = theMesh->MeshElements( e2 );
- SMESHDS_SubMesh* smVfb = theMesh->MeshElements( vfb );
- SMESHDS_SubMesh* smVlb = theMesh->MeshElements( vlb );
- SMESHDS_SubMesh* smVft = theMesh->MeshElements( vft );
- if (!smFace || !smb || !smt || !sm1 || !sm2 || !smVfb || !smVlb || !smVft ) {
- MESSAGE( "NULL submesh " <<smFace<<" "<<smb<<" "<<smt<<" "<<
- sm1<<" "<<sm2<<" "<<smVfb<<" "<<smVlb<<" "<<smVft);
- return false;
- }
- if ( smb->NbNodes() != smt->NbNodes() || sm1->NbNodes() != sm2->NbNodes() ) {
- MESSAGE(" Diff nb of nodes on opposite edges" );
- return false;
- }
- if (smVfb->NbNodes() != 1 || smVlb->NbNodes() != 1 || smVft->NbNodes() != 1) {
- MESSAGE("Empty submesh of vertex");
- return false;
- }
- if ( sm1->NbNodes() * smb->NbNodes() != smFace->NbNodes() ) {
- MESSAGE( "Wrong nb face nodes: " <<
- sm1->NbNodes()<<" "<<smb->NbNodes()<<" "<<smFace->NbNodes());
- return false;
- }
- // IJ size
- int vsize = sm1->NbNodes() + 2;
- int hsize = smb->NbNodes() + 2;
-
- // load nodes from theBaseEdge
-
- set<const SMDS_MeshNode*> loadedNodes;
- const SMDS_MeshNode* nullNode = 0;
-
- vector<const SMDS_MeshNode*> & nVecf = theIJNodes[ 0.];
- nVecf.resize( vsize, nullNode );
- loadedNodes.insert( nVecf[ 0 ] = smVfb->GetNodes()->next() );
-
- vector<const SMDS_MeshNode*> & nVecl = theIJNodes[ 1.];
- nVecl.resize( vsize, nullNode );
- loadedNodes.insert( nVecl[ 0 ] = smVlb->GetNodes()->next() );
-
- double f, l;
- BRep_Tool::Range( eFrw, f, l );
- double range = l - f;
- SMDS_NodeIteratorPtr nIt = smb->GetNodes();
- const SMDS_MeshNode* node;
- while ( nIt->more() )
- {
- node = nIt->next();
- const SMDS_EdgePosition* pos =
- dynamic_cast<const SMDS_EdgePosition*>( node->GetPosition().get() );
- if ( !pos ) return false;
- double u = ( pos->GetUParameter() - f ) / range;
- vector<const SMDS_MeshNode*> & nVec = theIJNodes[ u ];
- nVec.resize( vsize, nullNode );
- loadedNodes.insert( nVec[ 0 ] = node );
- }
- if ( theIJNodes.size() != hsize ) {
- MESSAGE( "Wrong node positions on theBaseEdge" );
- return false;
- }
-
- // load nodes from e1
-
- map< double, const SMDS_MeshNode*> sortedNodes; // sort by param on edge
- nIt = sm1->GetNodes();
- while ( nIt->more() )
- {
- node = nIt->next();
- const SMDS_EdgePosition* pos =
- dynamic_cast<const SMDS_EdgePosition*>( node->GetPosition().get() );
- if ( !pos ) return false;
- sortedNodes.insert( make_pair( pos->GetUParameter(), node ));
- }
- loadedNodes.insert( nVecf[ vsize - 1 ] = smVft->GetNodes()->next() );
- map< double, const SMDS_MeshNode*>::iterator u_n = sortedNodes.begin();
- int row = rev1 ? vsize - 1 : 0;
- for ( ; u_n != sortedNodes.end(); u_n++ )
- {
- if ( rev1 ) row--;
- else row++;
- loadedNodes.insert( nVecf[ row ] = u_n->second );
- }
-
- // try to load the rest nodes
-
- // get all faces from theFace
- set<const SMDS_MeshElement*> allFaces, foundFaces;
- SMDS_ElemIteratorPtr eIt = smFace->GetElements();
- while ( eIt->more() ) {
- const SMDS_MeshElement* e = eIt->next();
- if ( e->GetType() == SMDSAbs_Face )
- allFaces.insert( e );
- }
- // Starting from 2 neighbour nodes on theBaseEdge, look for a face
- // the nodes belong to, and between the nodes of the found face,
- // look for a not loaded node considering this node to be the next
- // in a column of the starting second node. Repeat, starting
- // from nodes next to the previous starting nodes in their columns,
- // and so on while a face can be found. Then go the the next pair
- // of nodes on theBaseEdge.
- StdMeshers_IJNodeMap::iterator par_nVec_1 = theIJNodes.begin();
- StdMeshers_IJNodeMap::iterator par_nVec_2 = par_nVec_1;
- // loop on columns
- int col = 0;
- for ( par_nVec_2++; par_nVec_2 != theIJNodes.end(); par_nVec_1++, par_nVec_2++ )
- {
- col++;
- row = 0;
- const SMDS_MeshNode* n1 = par_nVec_1->second[ row ];
- const SMDS_MeshNode* n2 = par_nVec_2->second[ row ];
- const SMDS_MeshElement* face = 0;
- do {
- // look for a face by 2 nodes
- face = SMESH_MeshEditor::FindFaceInSet( n1, n2, allFaces, foundFaces );
- if ( face )
- {
- int nbFaceNodes = face->NbNodes();
- if ( nbFaceNodes > 4 ) {
- MESSAGE(" Too many nodes in a face: " << nbFaceNodes );
- return false;
- }
- // look for a not loaded node of the <face>
- bool found = false;
- const SMDS_MeshNode* n3 = 0; // a node defferent from n1 and n2
- eIt = face->nodesIterator() ;
- while ( !found && eIt->more() ) {
- node = static_cast<const SMDS_MeshNode*>( eIt->next() );
- found = loadedNodes.insert( node ).second;
- if ( !found && node != n1 && node != n2 )
- n3 = node;
- }
- if ( found ) {
- if ( ++row > vsize - 1 ) {
- MESSAGE( "Too many nodes in column "<< col <<": "<< row+1);
- return false;
- }
- par_nVec_2->second[ row ] = node;
- foundFaces.insert( face );
- n2 = node;
- if ( nbFaceNodes == 4 )
- n1 = par_nVec_1->second[ row ];
- }
- else if (nbFaceNodes == 3 &&
- n3 == par_nVec_1->second[ row ] )
- n1 = n3;
- else {
- MESSAGE( "Not quad mesh, column "<< col );
- return false;
- }
- }
- } while ( face && n1 && n2 );
-
- if ( row < vsize - 1 ) {
- MESSAGE( "Too few nodes in column "<< col <<": "<< row+1);
- MESSAGE( "Base node 1: "<< par_nVec_1->second[0]);
- MESSAGE( "Base node 2: "<< par_nVec_2->second[0]);
- MESSAGE( "Current node 1: "<< n1);
- MESSAGE( "Current node 2: "<< n2);
- MESSAGE( "first base node: "<< theIJNodes.begin()->second[0]);
- MESSAGE( "last base node: "<< theIJNodes.rbegin()->second[0]);
- return false;
- }
- } // loop on columns
-
- return true;
-}
-
-//////////////////////////////////////////////////////////////////////////
-//
-// StdMeshers_SMESHBlock
-//
-//////////////////////////////////////////////////////////////////////////
-
-//=======================================================================
-//function : StdMeshers_SMESHBlock
-//purpose :
-//=======================================================================
-StdMeshers_SMESHBlock::StdMeshers_SMESHBlock()
-{
- myErrorStatus=1;
- myIsEdgeForward.resize( SMESH_Block::NbEdges(), -1 );
-}
-
-//=======================================================================
-//function : IsForwadEdge
-//purpose :
-//=======================================================================
-
-bool StdMeshers_SMESHBlock::IsForwadEdge(const int theEdgeID)
-{
- int index = myTBlock.ShapeIndex( theEdgeID );
- if ( !myTBlock.IsEdgeID( theEdgeID ))
- return false;
-
- if ( myIsEdgeForward[ index ] < 0 )
- myIsEdgeForward[ index ] =
- myTBlock.IsForwardEdge( TopoDS::Edge( Shape( theEdgeID )), myShapeIDMap );
-
- return myIsEdgeForward[ index ];
-}
-
-//=======================================================================
-//function : ErrorStatus
-//purpose :
-//=======================================================================
-int StdMeshers_SMESHBlock::ErrorStatus() const
-{
- return myErrorStatus;
-}
-//=======================================================================
-//function : Load
-//purpose :
-//=======================================================================
-void StdMeshers_SMESHBlock::Load(const TopoDS_Shell& theShell)
-{
-
- TopoDS_Vertex aV000, aV001;
- //
- Load(theShell, aV000, aV001);
-}
-//=======================================================================
-//function : Load
-//purpose :
-//=======================================================================
-void StdMeshers_SMESHBlock::Load(const TopoDS_Shell& theShell,
- const TopoDS_Vertex& theV000,
- const TopoDS_Vertex& theV001)
-{
- myErrorStatus=0;
- //
- myShell=theShell;
- //
- bool bOk;
- //
- myShapeIDMap.Clear();
- bOk=myTBlock.LoadBlockShapes(myShell, theV000, theV001, myShapeIDMap);
- if (!bOk) {
- myErrorStatus=2;
- return;
- }
-}
-//=======================================================================
-//function : ComputeParameters
-//purpose :
-//=======================================================================
-void StdMeshers_SMESHBlock::ComputeParameters(const gp_Pnt& thePnt,
- gp_XYZ& theXYZ)
-{
- ComputeParameters(thePnt, myShell, theXYZ);
-}
-//=======================================================================
-//function : ComputeParameters
-//purpose :
-//=======================================================================
-void StdMeshers_SMESHBlock::ComputeParameters(const gp_Pnt& thePnt,
- const TopoDS_Shape& theShape,
- gp_XYZ& theXYZ)
-{
- myErrorStatus=0;
- //
- int aID;
- bool bOk;
- //
- aID=ShapeID(theShape);
- if (myErrorStatus) {
- return;
- }
- bOk=myTBlock.ComputeParameters(thePnt, theXYZ, aID);
- if (!bOk) {
- myErrorStatus=4; // problems with computation Parameters
- return;
- }
-}
-
-//=======================================================================
-//function : ComputeParameters
-//purpose :
-//=======================================================================
-
-void StdMeshers_SMESHBlock::ComputeParameters(const double& theU,
- const TopoDS_Shape& theShape,
- gp_XYZ& theXYZ)
-{
- myErrorStatus=0;
- //
- int aID;
- bool bOk=false;
- //
- aID=ShapeID(theShape);
- if (myErrorStatus) {
- return;
- }
- if ( SMESH_Block::IsEdgeID( aID ))
- bOk=myTBlock.EdgeParameters( aID, theU, theXYZ );
- if (!bOk) {
- myErrorStatus=4; // problems with computation Parameters
- return;
- }
-}
-
-//=======================================================================
-//function : Point
-//purpose :
-//=======================================================================
- void StdMeshers_SMESHBlock::Point(const gp_XYZ& theParams,
- gp_Pnt& aP3D)
-{
- TopoDS_Shape aS;
- //
- Point(theParams, aS, aP3D);
-}
-//=======================================================================
-//function : Point
-//purpose :
-//=======================================================================
- void StdMeshers_SMESHBlock::Point(const gp_XYZ& theParams,
- const TopoDS_Shape& theShape,
- gp_Pnt& aP3D)
-{
- myErrorStatus=0;
- //
- int aID;
- bool bOk=false;
- gp_XYZ aXYZ(99.,99.,99.);
- aP3D.SetXYZ(aXYZ);
- //
- if (theShape.IsNull()) {
- bOk=myTBlock.ShellPoint(theParams, aXYZ);
- }
- //
- else {
- aID=ShapeID(theShape);
- if (myErrorStatus) {
- return;
- }
- //
- if (SMESH_Block::IsVertexID(aID)) {
- bOk=myTBlock.VertexPoint(aID, aXYZ);
- }
- else if (SMESH_Block::IsEdgeID(aID)) {
- bOk=myTBlock.EdgePoint(aID, theParams, aXYZ);
- }
- //
- else if (SMESH_Block::IsFaceID(aID)) {
- bOk=myTBlock.FacePoint(aID, theParams, aXYZ);
- }
- }
- if (!bOk) {
- myErrorStatus=4; // problems with point computation
- return;
- }
- aP3D.SetXYZ(aXYZ);
-}
-//=======================================================================
-//function : ShapeID
-//purpose :
-//=======================================================================
-int StdMeshers_SMESHBlock::ShapeID(const TopoDS_Shape& theShape)
-{
- myErrorStatus=0;
- //
- int aID=-1;
- TopoDS_Shape aSF, aSR;
- //
- aSF=theShape;
- aSF.Orientation(TopAbs_FORWARD);
- aSR=theShape;
- aSR.Orientation(TopAbs_REVERSED);
- //
- if (myShapeIDMap.Contains(aSF)) {
- aID=myShapeIDMap.FindIndex(aSF);
- return aID;
- }
- if (myShapeIDMap.Contains(aSR)) {
- aID=myShapeIDMap.FindIndex(aSR);
- return aID;
- }
- myErrorStatus=2; // unknown shape;
- return aID;
-}
-//=======================================================================
-//function : Shape
-//purpose :
-//=======================================================================
-const TopoDS_Shape& StdMeshers_SMESHBlock::Shape(const int theID)
-{
- myErrorStatus=0;
- //
- int aNb;
- //
- aNb=myShapeIDMap.Extent();
- if (theID<1 || theID>aNb) {
- myErrorStatus=3; // ID is out of range
- return myEmptyShape;
- }
- //
- const TopoDS_Shape& aS=myShapeIDMap.FindKey(theID);
- return aS;
-}
+++ /dev/null
-// SMESH StdMeshers : implementaion of SMESH idl descriptions
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : StdMeshers_Penta_3D.hxx
-// Module : SMESH
-
-#ifndef StdMeshers_Penta_3D_HeaderFile
-#define StdMeshers_Penta_3D_HeaderFile
-
-#include <map>
-
-////////////////////////////////////////////////////////////////////////
-//
-// class StdMeshers_SMESHBlock
-//
-////////////////////////////////////////////////////////////////////////
-#include <gp_Pnt.hxx>
-#include <gp_XYZ.hxx>
-#include <TopoDS_Vertex.hxx>
-#include <TopoDS_Shell.hxx>
-#include <TopTools_IndexedMapOfOrientedShape.hxx>
-
-#include "SMESH_Block.hxx"
-
-typedef std::map< double, std::vector<const SMDS_MeshNode*> > StdMeshers_IJNodeMap;
-
-class StdMeshers_SMESHBlock {
-
-public:
- //
- StdMeshers_SMESHBlock();
-
- void Load (const TopoDS_Shell& theShell);
-
- void Load (const TopoDS_Shell& theShell,
- const TopoDS_Vertex& theV000,
- const TopoDS_Vertex& theV001);
-
- void ComputeParameters(const gp_Pnt& thePnt,
- gp_XYZ& theXYZ);
-
- void ComputeParameters(const gp_Pnt& thePnt,
- const TopoDS_Shape& theShape,
- gp_XYZ& theXYZ);
-
- void ComputeParameters(const double& theU,
- const TopoDS_Shape& theShape,
- gp_XYZ& theXYZ);
-
- void Point(const gp_XYZ& theParams,
- gp_Pnt& thePnt);
-
- void Point(const gp_XYZ& theParams,
- const TopoDS_Shape& theShape,
- gp_Pnt& thePnt);
-
- int ShapeID(const TopoDS_Shape& theShape);
-
- const TopoDS_Shape& Shape(const int theID);
-
- SMESH_Block & Block() { return myTBlock; }
-
- bool IsForwadEdge(const int theEdgeID);
-
- int ErrorStatus() const;
-
-
-protected:
- TopoDS_Shell myShell;
- TopTools_IndexedMapOfOrientedShape myShapeIDMap;
- SMESH_Block myTBlock;
- TopoDS_Shape myEmptyShape;
- vector<int> myIsEdgeForward;
- //
- int myErrorStatus;
-};
-
-////////////////////////////////////////////////////////////////////////
-//
-// class StdMeshers_TNode
-//
-////////////////////////////////////////////////////////////////////////
-#include "SMDS_MeshNode.hxx"
-
-class StdMeshers_TNode {
-
-public:
-
- StdMeshers_TNode(){
- myNode=NULL;
- myXYZ.SetCoord(99., 99., 99.);
- myShapeSupportID=-1;
- myBaseNodeID=-1;
- }
-
- void SetNode(const SMDS_MeshNode* theNode) {
- myNode=(SMDS_MeshNode*) theNode;
- }
-
- const SMDS_MeshNode* Node()const {
- return myNode;
- }
-
- void SetShapeSupportID (const int theID) {
- myShapeSupportID=theID;
- }
-
- int ShapeSupportID()const {
- return myShapeSupportID;
- }
-
- void SetNormCoord (const gp_XYZ& theXYZ) {
- myXYZ=theXYZ;
- }
-
- const gp_XYZ& NormCoord ()const{
- return myXYZ;
- }
-
- void SetBaseNodeID (const int theID) {
- myBaseNodeID=theID;
- }
-
- int BaseNodeID ()const{
- return myBaseNodeID;
- }
-
-private:
- SMDS_MeshNode* myNode;
- int myShapeSupportID;
- gp_XYZ myXYZ;
- int myBaseNodeID;
-};
-
-////////////////////////////////////////////////////////////////////////
-//
-// class StdMeshers_Penta_3D
-//
-////////////////////////////////////////////////////////////////////////
-#include "SMESH_Mesh.hxx"
-#include <TopoDS_Shape.hxx>
-//
-class StdMeshers_Penta_3D {
-//
- public: // methods
- StdMeshers_Penta_3D();
-
- //~StdMeshers_Penta_3D();
-
- bool Compute(SMESH_Mesh& , const TopoDS_Shape& );
-
- int ErrorStatus() const {
- return myErrorStatus;
- }
-
- void SetTolerance(const double theTol3D) {
- myTol3D=theTol3D;
- }
-
- double Tolerance() const {
- return myTol3D;
- }
-
- static bool LoadIJNodes(StdMeshers_IJNodeMap & theIJNodes,
- const TopoDS_Face& theFace,
- const TopoDS_Edge& theBaseEdge,
- SMESHDS_Mesh* theMesh);
- // Load nodes bound to theFace into column (vectors) and rows
- // of theIJNodes.
- // The value of theIJNodes map is a vector of ordered nodes so
- // that the 0-the one lies on theBaseEdge.
- // The key of theIJNodes map is a normalized parameter of each
- // 0-the node on theBaseEdge.
-
-
- protected: // methods
-
- void CheckData();
-
- void MakeBlock();
-
- void MakeNodes();
-
- double SetHorizEdgeXYZ(const gp_XYZ& aBNXYZ,
- const int aFaceID,
- vector<const SMDS_MeshNode*>*& aCol1,
- vector<const SMDS_MeshNode*>*& aCol2);
-
- void ShapeSupportID(const bool theIsUpperLayer,
- const SMESH_Block::TShapeID theBNSSID,
- SMESH_Block::TShapeID& theSSID);
-
- void FindNodeOnShape(const TopoDS_Shape& aS,
- const gp_XYZ& aParams,
- const int z,
- StdMeshers_TNode& aTN);
-
- void CreateNode(const bool theIsUpperLayer,
- const gp_XYZ& aParams,
- StdMeshers_TNode& aTN);
-
- void ClearMeshOnFxy1();
-
- void MakeMeshOnFxy1();
-
- void MakeConnectingMap();
-
- int GetIndexOnLayer(const int aID);
-
- void MakeVolumeMesh();
-
- void SetMesh(SMESH_Mesh& theMesh) {
- myMesh=(void *)&theMesh;
- }
-
- SMESH_Mesh* GetMesh()const {
- return (SMESH_Mesh*)myMesh;
- }
-
- protected: // fields
- TopoDS_Shape myShape;
- StdMeshers_SMESHBlock myBlock;
- void * myMesh;
- int myErrorStatus;
- //
- vector <StdMeshers_TNode> myTNodes;
- int myISize;
- int myJSize;
- double myTol3D; // Tolerance value
- std::map < int, int > myConnectingMap;
- //
- vector<StdMeshers_IJNodeMap> myWallNodesMaps; // nodes on a face
- vector<gp_XYZ> myShapeXYZ; // point on each sub-shape
-};
-
-#endif
+++ /dev/null
-// SMESH SMESH : implementaion of SMESH idl descriptions
-//
-// Copyright (C) 2003 CEA
-//
-// 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.org
-//
-//
-//
-// File : StdMeshers_Propagation.cxx
-// Module : SMESH
-// $Header$
-
-using namespace std;
-#include "StdMeshers_Propagation.hxx"
-#include "utilities.h"
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-StdMeshers_Propagation::StdMeshers_Propagation (int hypId, int studyId,
- SMESH_Gen * gen)
- : SMESH_Hypothesis(hypId, studyId, gen)
-{
- _name = GetName();
- _param_algo_dim = -2;
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-StdMeshers_Propagation::~StdMeshers_Propagation()
-{
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-ostream & StdMeshers_Propagation::SaveTo (ostream & save)
-{
- return save;
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-istream & StdMeshers_Propagation::LoadFrom (istream & load)
-{
- return load;
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-ostream & operator << (ostream & save, StdMeshers_Propagation & hyp)
-{
- return hyp.SaveTo(save);
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-istream & operator >> (istream & load, StdMeshers_Propagation & hyp)
-{
- return hyp.LoadFrom(load);
-}
-
-//=============================================================================
-/*!
- * GetName
- */
-//=============================================================================
-std::string StdMeshers_Propagation::GetName ()
-{
- return "Propagation";
-}
+++ /dev/null
-// SMESH SMESH : implementaion of SMESH idl descriptions
-//
-// Copyright (C) 2003 CEA
-//
-// 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.org
-//
-//
-//
-// File : StdMeshers_Propagation.hxx
-// Module : SMESH
-// $Header$
-
-#ifndef _SMESH_PROPAGATION_HXX_
-#define _SMESH_PROPAGATION_HXX_
-
-#include "SMESH_Hypothesis.hxx"
-#include "Utils_SALOME_Exception.hxx"
-
-class StdMeshers_Propagation:public SMESH_Hypothesis
-{
- public:
- StdMeshers_Propagation(int hypId, int studyId, SMESH_Gen * gen);
- virtual ~ StdMeshers_Propagation();
-
- virtual ostream & SaveTo(ostream & save);
- virtual istream & LoadFrom(istream & load);
- friend ostream & operator <<(ostream & save, StdMeshers_Propagation & hyp);
- friend istream & operator >>(istream & load, StdMeshers_Propagation & hyp);
-
- static std::string GetName ();
-};
-
-#endif
+++ /dev/null
-// SMESH StdMeshers_StartEndLength : implementaion of SMESH idl descriptions
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : StdMeshers_StartEndLength.cxx
-// Module : SMESH
-// $Header$
-
-using namespace std;
-
-#include "StdMeshers_StartEndLength.hxx"
-#include "utilities.h"
-
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-StdMeshers_StartEndLength::StdMeshers_StartEndLength(int hypId,
- int studyId,
- SMESH_Gen * gen)
- :SMESH_Hypothesis(hypId, studyId, gen)
-{
- _begLength = 1.;
- _endLength = 1.;
- _name = "StartEndLength";
- _param_algo_dim = 1; // is used by SMESH_Regular_1D
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-StdMeshers_StartEndLength::~StdMeshers_StartEndLength()
-{
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-void StdMeshers_StartEndLength::SetLength(double length, bool isStartLength)
- throw(SALOME_Exception)
-{
- if ( (isStartLength ? _begLength : _endLength) != length ) {
- if (length <= 0)
- throw SALOME_Exception(LOCALIZED("length must be positive"));
- if ( isStartLength )
- _begLength = length;
- else
- _endLength = length;
-
- NotifySubMeshesHypothesisModification();
- }
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-double StdMeshers_StartEndLength::GetLength(bool isStartLength) const
-{
- return isStartLength ? _begLength : _endLength;
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-ostream & StdMeshers_StartEndLength::SaveTo(ostream & save)
-{
- save << _begLength << " " <<_endLength;
- return save;
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-istream & StdMeshers_StartEndLength::LoadFrom(istream & load)
-{
- bool isOK = true;
- isOK = (load >> _begLength);
- if (!isOK)
- load.clear(ios::badbit | load.rdstate());
- isOK = (load >> _endLength);
- if (!isOK)
- load.clear(ios::badbit | load.rdstate());
- return load;
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-ostream & operator <<(ostream & save, StdMeshers_StartEndLength & hyp)
-{
- return hyp.SaveTo( save );
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-istream & operator >>(istream & load, StdMeshers_StartEndLength & hyp)
-{
- return hyp.LoadFrom( load );
-}
+++ /dev/null
-// SMESH StdMeshers : implementaion of SMESH idl descriptions
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : StdMeshers_StartEndLength.hxx
-// Module : SMESH
-// $Header$
-
-#ifndef _STDMESHERS_STARTENDLENGTH_HXX_
-#define _STDMESHERS_STARTENDLENGTH_HXX_
-
-#include "SMESH_Hypothesis.hxx"
-#include "Utils_SALOME_Exception.hxx"
-
-class StdMeshers_StartEndLength:public SMESH_Hypothesis
-{
- public:
- StdMeshers_StartEndLength(int hypId, int studyId, SMESH_Gen * gen);
- virtual ~ StdMeshers_StartEndLength();
-
- void SetLength(double length, bool isStartLength) throw(SALOME_Exception);
-
- double GetLength(bool isStartLength) const;
-
- virtual ostream & SaveTo(ostream & save);
- virtual istream & LoadFrom(istream & load);
- friend ostream & operator <<(ostream & save, StdMeshers_StartEndLength & hyp);
- friend istream & operator >>(istream & load, StdMeshers_StartEndLength & hyp);
-
- protected:
- double _begLength, _endLength;
-};
-
-#endif
+++ /dev/null
-// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : StdMeshers_Arithmetic1D_i.hxx
-// Author : Damien COQUERET, OCC
-// Module : SMESH
-// $Header$
-
-#ifndef _SMESH_ARITHMETIC1D_I_HXX_
-#define _SMESH_ARITHMETIC1D_I_HXX_
-
-#include <SALOMEconfig.h>
-#include CORBA_SERVER_HEADER(SMESH_BasicHypothesis)
-
-#include "SMESH_Hypothesis_i.hxx"
-#include "StdMeshers_Arithmetic1D.hxx"
-
-// ======================================================
-// Arithmetic 1D hypothesis
-// ======================================================
-class StdMeshers_Arithmetic1D_i:
- public virtual POA_StdMeshers::StdMeshers_Arithmetic1D,
- public virtual SMESH_Hypothesis_i
-{
-public:
- // Constructor
- StdMeshers_Arithmetic1D_i( PortableServer::POA_ptr thePOA,
- int theStudyId,
- ::SMESH_Gen* theGenImpl );
- // Destructor
- virtual ~StdMeshers_Arithmetic1D_i();
-
- // Set length
- void SetLength( CORBA::Double theLength, CORBA::Boolean theIsStart )
- throw ( SALOME::SALOME_Exception );
- // Get length
- CORBA::Double GetLength(CORBA::Boolean theIsStart);
-
- // Get implementation
- ::StdMeshers_Arithmetic1D* GetImpl();
-
- // Verify whether hypothesis supports given entity type
- CORBA::Boolean IsDimSupported( SMESH::Dimension type );
-};
-
-#endif
+++ /dev/null
-// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : StdMeshers_Deflection1D_i.hxx
-// Moved here from SMESH_LocalLength_i.hxx
-// Author : Paul RASCLE, EDF
-// Module : SMESH
-// $Header$
-
-#ifndef _SMESH_Deflection1D_I_HXX_
-#define _SMESH_Deflection1D_I_HXX_
-
-#include <SALOMEconfig.h>
-#include CORBA_SERVER_HEADER(SMESH_BasicHypothesis)
-
-#include "SMESH_Hypothesis_i.hxx"
-#include "StdMeshers_Deflection1D.hxx"
-
-class SMESH_Gen;
-
-// ======================================================
-// Local Length hypothesis
-// ======================================================
-class StdMeshers_Deflection1D_i:
- public virtual POA_StdMeshers::StdMeshers_Deflection1D,
- public virtual SMESH_Hypothesis_i
-{
-public:
- // Constructor
- StdMeshers_Deflection1D_i( PortableServer::POA_ptr thePOA,
- int theStudyId,
- ::SMESH_Gen* theGenImpl );
- // Destructor
- virtual ~StdMeshers_Deflection1D_i();
-
- // Set deflection
- void SetDeflection( CORBA::Double theLength )
- throw ( SALOME::SALOME_Exception );
- // Get deflection
- CORBA::Double GetDeflection();
-
- // Get implementation
- ::StdMeshers_Deflection1D* GetImpl();
-
- // Verify whether hypothesis supports given entity type
- CORBA::Boolean IsDimSupported( SMESH::Dimension type );
-};
-
-#endif
-
+++ /dev/null
-// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : StdMeshers_Hexa_3D_i.cxx
-// Moved here from SMESH_Hexa_3D_i.cxx
-// Author : Paul RASCLE, EDF
-// Module : SMESH
-// $Header$
-
-using namespace std;
-#include "StdMeshers_Hexa_3D_i.hxx"
-#include "SMESH_Gen.hxx"
-
-#include "Utils_CorbaException.hxx"
-#include "utilities.h"
-
-//=============================================================================
-/*!
- * StdMeshers_Hexa_3D_i::StdMeshers_Hexa_3D_i
- *
- * Constructor
- */
-//=============================================================================
-
-StdMeshers_Hexa_3D_i::StdMeshers_Hexa_3D_i( PortableServer::POA_ptr thePOA,
- int theStudyId,
- ::SMESH_Gen* theGenImpl )
- : SALOME::GenericObj_i( thePOA ),
- SMESH_Hypothesis_i( thePOA ),
- SMESH_Algo_i( thePOA ),
- SMESH_3D_Algo_i( thePOA )
-{
- MESSAGE( "StdMeshers_Hexa_3D_i::StdMeshers_Hexa_3D_i" );
- myBaseImpl = new ::StdMeshers_Hexa_3D( theGenImpl->GetANewId(),
- theStudyId,
- theGenImpl );
-}
-
-//=============================================================================
-/*!
- * StdMeshers_Hexa_3D_i::~StdMeshers_Hexa_3D_i
- *
- * Destructor
- */
-//=============================================================================
-
-StdMeshers_Hexa_3D_i::~StdMeshers_Hexa_3D_i()
-{
- MESSAGE( "StdMeshers_Hexa_3D_i::~StdMeshers_Hexa_3D_i" );
-}
-
-//=============================================================================
-/*!
- * StdMeshers_Hexa_3D_i::GetImpl
- *
- * Get implementation
- */
-//=============================================================================
-
-::StdMeshers_Hexa_3D* StdMeshers_Hexa_3D_i::GetImpl()
-{
- MESSAGE( "StdMeshers_Hexa_3D_i::GetImpl" );
- return ( ::StdMeshers_Hexa_3D* )myBaseImpl;
-}
+++ /dev/null
-// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : StdMeshers_Hexa_3D_i.hxx
-// Moved here from SMESH_Hexa_3D_i.hxx
-// Author : Paul RASCLE, EDF
-// Module : SMESH
-// $Header$
-
-#ifndef _SMESH_HEXA_3D_I_HXX_
-#define _SMESH_HEXA_3D_I_HXX_
-
-#include <SALOMEconfig.h>
-#include CORBA_SERVER_HEADER(SMESH_BasicHypothesis)
-
-#include "SMESH_3D_Algo_i.hxx"
-#include "StdMeshers_Hexa_3D.hxx"
-
-class SMESH_Gen;
-
-// ======================================================
-// Hexaedron 3d algorithm
-// ======================================================
-class StdMeshers_Hexa_3D_i:
- public virtual POA_StdMeshers::StdMeshers_Hexa_3D,
- public virtual SMESH_3D_Algo_i
-{
-public:
- // Constructor
- StdMeshers_Hexa_3D_i( PortableServer::POA_ptr thePOA,
- int theStudyId,
- ::SMESH_Gen* theGenImpl );
-
- // Destructor
- virtual ~StdMeshers_Hexa_3D_i();
-
- // Get implementation
- ::StdMeshers_Hexa_3D* GetImpl();
-};
-
-#endif
+++ /dev/null
-// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : StdMeshers_LengthFromEdges_i.cxx
-// Moved here from SMESH_LengthFromEdges_i.cxx
-// Author : Nadir BOUHAMOU CEA/DEN, Paul RASCLE, EDF
-// Module : SMESH
-// $Header$
-
-using namespace std;
-#include "StdMeshers_LengthFromEdges_i.hxx"
-#include "SMESH_Gen.hxx"
-
-#include "Utils_CorbaException.hxx"
-#include "utilities.h"
-
-//=============================================================================
-/*!
- * StdMeshers_LengthFromEdges_i::StdMeshers_LengthFromEdges_i
- *
- * Constructor
- */
-//=============================================================================
-
-StdMeshers_LengthFromEdges_i::StdMeshers_LengthFromEdges_i( PortableServer::POA_ptr thePOA,
- int theStudyId,
- ::SMESH_Gen* theGenImpl )
- : SALOME::GenericObj_i( thePOA ),
- SMESH_Hypothesis_i( thePOA )
-{
- MESSAGE( "StdMeshers_LengthFromEdges_i::StdMeshers_LengthFromEdges_i" );
- myBaseImpl = new ::StdMeshers_LengthFromEdges( theGenImpl->GetANewId(),
- theStudyId,
- theGenImpl );
-}
-
-//=============================================================================
-/*!
- * StdMeshers_LengthFromEdges_i::~StdMeshers_LengthFromEdges_i
- *
- * Destructor
- */
-//=============================================================================
-
-StdMeshers_LengthFromEdges_i::~StdMeshers_LengthFromEdges_i()
-{
- MESSAGE( "StdMeshers_LengthFromEdges_i::~StdMeshers_LengthFromEdges_i" );
-}
-
-//=============================================================================
-/*!
- * StdMeshers_LengthFromEdges_i::SetMode
- *
- * Set mode
- */
-//=============================================================================
-
-void StdMeshers_LengthFromEdges_i::SetMode( CORBA::Long theMode )
- throw (SALOME::SALOME_Exception)
-{
- MESSAGE( "StdMeshers_LengthFromEdges_i::SetMode" );
- ASSERT( myBaseImpl );
- try {
- this->GetImpl()->SetMode( theMode );
- }
- catch ( SALOME_Exception& S_ex ) {
- THROW_SALOME_CORBA_EXCEPTION( S_ex.what(),
- SALOME::BAD_PARAM );
- }
-}
-
-//=============================================================================
-/*!
- * StdMeshers_LengthFromEdges_i::GetMode
- *
- * Get mode
- */
-//=============================================================================
-
-CORBA::Long StdMeshers_LengthFromEdges_i::GetMode()
-{
- MESSAGE( "StdMeshers_LengthFromEdges_i::GetMode" );
- ASSERT( myBaseImpl );
- return this->GetImpl()->GetMode();
-}
-
-
-//=============================================================================
-/*!
- * StdMeshers_LengthFromEdges_i::GetImpl
- *
- * Get implementation
- */
-//=============================================================================
-
-::StdMeshers_LengthFromEdges* StdMeshers_LengthFromEdges_i::GetImpl()
-{
- MESSAGE( "StdMeshers_LengthFromEdges_i::GetImpl" );
- return ( ::StdMeshers_LengthFromEdges* )myBaseImpl;
-}
-
-//================================================================================
-/*!
- * \brief Verify whether hypothesis supports given entity type
- * \param type - dimension (see SMESH::Dimension enumeration)
- * \retval CORBA::Boolean - TRUE if dimension is supported, FALSE otherwise
- *
- * Verify whether hypothesis supports given entity type (see SMESH::Dimension enumeration)
- */
-//================================================================================
-CORBA::Boolean StdMeshers_LengthFromEdges_i::IsDimSupported( SMESH::Dimension type )
-{
- return type == SMESH::DIM_2D;
-}
-
+++ /dev/null
-// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : StdMeshers_LengthFromEdges_i.hxx
-// Moved here from SMESH_LengthFromEdges_i.hxx
-// Author : Nadir BOUHAMOU CEA/DEN, Paul RASCLE, EDF
-// Module : SMESH
-// $Header$
-
-#ifndef _SMESH_LENGTHFROMEDGES_I_HXX_
-#define _SMESH_LENGTHFROMEDGES_I_HXX_
-
-#include <SALOMEconfig.h>
-#include CORBA_SERVER_HEADER(SMESH_BasicHypothesis)
-
-#include "SMESH_Hypothesis_i.hxx"
-#include "StdMeshers_LengthFromEdges.hxx"
-
-// ======================================================
-// Length from edges hypothesis
-// ======================================================
-class StdMeshers_LengthFromEdges_i:
- public virtual POA_StdMeshers::StdMeshers_LengthFromEdges,
- public virtual SMESH_Hypothesis_i
-{
-public:
- // Constructor
- StdMeshers_LengthFromEdges_i( PortableServer::POA_ptr thePOA,
- int theStudyId,
- ::SMESH_Gen* theGenImpl );
- // Destructor
- virtual ~StdMeshers_LengthFromEdges_i();
-
- // Set mode
- void SetMode( CORBA::Long theMode )
- throw ( SALOME::SALOME_Exception );
- // Get mode
- CORBA::Long GetMode();
-
- // Get implementation
- ::StdMeshers_LengthFromEdges* GetImpl();
-
- // Verify whether hypothesis supports given entity type
- CORBA::Boolean IsDimSupported( SMESH::Dimension type );
-};
-
-#endif
-
+++ /dev/null
-// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : StdMeshers_LocalLength_i.hxx
-// Moved here from SMESH_LocalLength_i.hxx
-// Author : Paul RASCLE, EDF
-// Module : SMESH
-// $Header$
-
-#ifndef _SMESH_LOCALLENGTH_I_HXX_
-#define _SMESH_LOCALLENGTH_I_HXX_
-
-#include <SALOMEconfig.h>
-#include CORBA_SERVER_HEADER(SMESH_BasicHypothesis)
-
-#include "SMESH_Hypothesis_i.hxx"
-#include "StdMeshers_LocalLength.hxx"
-
-class SMESH_Gen;
-
-// ======================================================
-// Local Length hypothesis
-// ======================================================
-class StdMeshers_LocalLength_i:
- public virtual POA_StdMeshers::StdMeshers_LocalLength,
- public virtual SMESH_Hypothesis_i
-{
-public:
- // Constructor
- StdMeshers_LocalLength_i( PortableServer::POA_ptr thePOA,
- int theStudyId,
- ::SMESH_Gen* theGenImpl );
- // Destructor
- virtual ~StdMeshers_LocalLength_i();
-
- // Set length
- void SetLength( CORBA::Double theLength )
- throw ( SALOME::SALOME_Exception );
- // Get length
- CORBA::Double GetLength();
-
- // Get implementation
- ::StdMeshers_LocalLength* GetImpl();
-
- // Verify whether hypothesis supports given entity type
- CORBA::Boolean IsDimSupported( SMESH::Dimension type );
-};
-
-#endif
-
+++ /dev/null
-// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : StdMeshers_MEFISTO_2D_i.cxx
-// Moved here from SMESH_MEFISTO_2D_i.cxx
-// Author : Paul RASCLE, EDF
-// Module : SMESH
-// $Header$
-
-using namespace std;
-#include "StdMeshers_MEFISTO_2D_i.hxx"
-#include "SMESH_Gen.hxx"
-
-#include "Utils_CorbaException.hxx"
-#include "utilities.h"
-
-//=============================================================================
-/*!
- * StdMeshers_MEFISTO_2D_i::StdMeshers_MEFISTO_2D_i
- *
- * Constructor
- */
-//=============================================================================
-
-StdMeshers_MEFISTO_2D_i::StdMeshers_MEFISTO_2D_i( PortableServer::POA_ptr thePOA,
- int theStudyId,
- ::SMESH_Gen* theGenImpl )
- : SALOME::GenericObj_i( thePOA ),
- SMESH_Hypothesis_i( thePOA ),
- SMESH_Algo_i( thePOA ),
- SMESH_2D_Algo_i( thePOA )
-{
- MESSAGE( "StdMeshers_MEFISTO_2D_i::StdMeshers_MEFISTO_2D_i" );
- myBaseImpl = new ::StdMeshers_MEFISTO_2D( theGenImpl->GetANewId(),
- theStudyId,
- theGenImpl );
-}
-
-//=============================================================================
-/*!
- * StdMeshers_MEFISTO_2D_i::~StdMeshers_MEFISTO_2D_i
- *
- * Destructor
- */
-//=============================================================================
-
-StdMeshers_MEFISTO_2D_i::~StdMeshers_MEFISTO_2D_i()
-{
- MESSAGE( "StdMeshers_MEFISTO_2D_i::~StdMeshers_MEFISTO_2D_i" );
-}
-
-//=============================================================================
-/*!
- * StdMeshers_MEFISTO_2D_i::GetImpl
- *
- * Get implementation
- */
-//=============================================================================
-
-::StdMeshers_MEFISTO_2D* StdMeshers_MEFISTO_2D_i::GetImpl()
-{
- MESSAGE( "StdMeshers_MEFISTO_2D_i::GetImpl" );
- return ( ::StdMeshers_MEFISTO_2D* )myBaseImpl;
-}
-
+++ /dev/null
-// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : StdMeshers_MEFISTO_2D_i.hxx
-// Moved here from SMESH_MEFISTO_2D_i.hxx
-// Author : Paul RASCLE, EDF
-// Module : SMESH
-// $Header$
-
-#ifndef _StdMeshers_MEFISTO_2D_I_HXX_
-#define _StdMeshers_MEFISTO_2D_I_HXX_
-
-#include <SALOMEconfig.h>
-#include CORBA_SERVER_HEADER(SMESH_BasicHypothesis)
-
-#include "SMESH_2D_Algo_i.hxx"
-#include "StdMeshers_MEFISTO_2D.hxx"
-
-class SMESH_Gen;
-
-// ======================================================
-// Triangle (MEFISTO) 2d algorithm
-// ======================================================
-class StdMeshers_MEFISTO_2D_i:
- public virtual POA_StdMeshers::StdMeshers_MEFISTO_2D,
- public virtual SMESH_2D_Algo_i
-{
-public:
- // Constructor
- StdMeshers_MEFISTO_2D_i( PortableServer::POA_ptr thePOA,
- int theStudyId,
- ::SMESH_Gen* theGenImpl );
-
- // Destructor
- virtual ~StdMeshers_MEFISTO_2D_i();
-
- // Get implementation
- ::StdMeshers_MEFISTO_2D* GetImpl();
-};
-
-#endif
+++ /dev/null
-// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : StdMeshers_MaxElementArea_i.hxx
-// Moved here from SMESH_MaxElementArea_i.hxx
-// Author : Paul RASCLE, EDF
-// Module : SMESH
-// $Header$
-
-#ifndef _SMESH_MAXELEMENTAREA_I_HXX_
-#define _SMESH_MAXELEMENTAREA_I_HXX_
-
-#include <SALOMEconfig.h>
-#include CORBA_SERVER_HEADER(SMESH_BasicHypothesis)
-
-#include "SMESH_Hypothesis_i.hxx"
-#include "StdMeshers_MaxElementArea.hxx"
-
-// ======================================================
-// Maximum Element Area hypothesis
-// ======================================================
-class StdMeshers_MaxElementArea_i:
- public virtual POA_StdMeshers::StdMeshers_MaxElementArea,
- public virtual SMESH_Hypothesis_i
-{
-public:
- // Constructor
- StdMeshers_MaxElementArea_i( PortableServer::POA_ptr thePOA,
- int theStudyId,
- ::SMESH_Gen* theGenImpl );
- // Destructor
- virtual ~StdMeshers_MaxElementArea_i();
-
- // Set maximum element area
- void SetMaxElementArea( CORBA::Double theArea )
- throw ( SALOME::SALOME_Exception );
- // Get maximum element area
- CORBA::Double GetMaxElementArea();
-
- // Get implementation
- ::StdMeshers_MaxElementArea* GetImpl();
-
- // Verify whether hypothesis supports given entity type
- CORBA::Boolean IsDimSupported( SMESH::Dimension type );
-};
-
-#endif
+++ /dev/null
-// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : StdMeshers_MaxElementVolume_i.hxx
-// Moved here from SMESH_MaxElementVolume_i.hxx
-// Author : Paul RASCLE, EDF
-// Module : SMESH
-// $Header$
-
-#ifndef _SMESH_MAXELEMENTVOLUME_I_HXX_
-#define _SMESH_MAXELEMENTVOLUME_I_HXX_
-
-#include <SALOMEconfig.h>
-#include CORBA_SERVER_HEADER(SMESH_BasicHypothesis)
-
-#include "SMESH_Hypothesis_i.hxx"
-#include "StdMeshers_MaxElementVolume.hxx"
-
-// ======================================================
-// Maximum Element Volume hypothesis
-// ======================================================
-class StdMeshers_MaxElementVolume_i:
- public virtual POA_StdMeshers::StdMeshers_MaxElementVolume,
- public virtual SMESH_Hypothesis_i
-{
-public:
- // Constructor
- StdMeshers_MaxElementVolume_i( PortableServer::POA_ptr thePOA,
- int theStudyId,
- ::SMESH_Gen* theGenImpl );
- // Destructor
- virtual ~StdMeshers_MaxElementVolume_i();
-
- // Set maximum element volume
- void SetMaxElementVolume( CORBA::Double theVolume )
- throw (SALOME::SALOME_Exception);
- // Get maximum element volume
- CORBA::Double GetMaxElementVolume();
-
- // Get implementation
- ::StdMeshers_MaxElementVolume* GetImpl();
-
- // Verify whether hypothesis supports given entity type
- CORBA::Boolean IsDimSupported( SMESH::Dimension type );
-};
-
-#endif
+++ /dev/null
-// SMESH StdMeshers_I : idl implementation based on 'SMESH' unit's classes
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : StdMeshers_NotConformAllowed_i.cxx
-// Author : Paul RASCLE, EDF
-// Module : SMESH
-// $Header$
-
-using namespace std;
-using namespace std;
-#include "StdMeshers_NotConformAllowed_i.hxx"
-#include "SMESH_Gen.hxx"
-
-#include "utilities.h"
-
-//=============================================================================
-/*!
- * Constructor:
- * _name is related to the class name: prefix = SMESH_ ; suffix = _i .
- */
-//=============================================================================
-
-StdMeshers_NotConformAllowed_i::StdMeshers_NotConformAllowed_i
- (PortableServer::POA_ptr thePOA,
- int studyId,
- ::SMESH_Gen* genImpl)
- : SALOME::GenericObj_i( thePOA ),
- SMESH_Hypothesis_i( thePOA )
-{
- MESSAGE("StdMeshers_NotConformAllowed_i::StdMeshers_NotConformAllowed_i");
- myBaseImpl = new ::StdMeshers_NotConformAllowed(genImpl->GetANewId(),
- studyId,
- genImpl);
-}
-
-//=============================================================================
-/*!
- *
- */
-//=============================================================================
-
-StdMeshers_NotConformAllowed_i::~StdMeshers_NotConformAllowed_i()
-{
-}
-
-//================================================================================
-/*!
- * \brief Verify whether hypothesis supports given entity type
- * \param type - dimension (see SMESH::Dimension enumeration)
- * \retval CORBA::Boolean - TRUE if dimension is supported, FALSE otherwise
- *
- * Verify whether hypothesis supports given entity type (see SMESH::Dimension enumeration)
- */
-//================================================================================
-CORBA::Boolean StdMeshers_NotConformAllowed_i::IsDimSupported( SMESH::Dimension /*type*/ )
-{
- return true;
-}
-
-
-
+++ /dev/null
-// SMESH StdMeshers_I : idl implementation based on 'SMESH' unit's classes
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : StdMeshers_NotConformAllowed_i.hxx
-// Author : Paul RASCLE, EDF
-// Module : SMESH
-// $Header$
-
-#ifndef _StdMeshers_NotConformAllowed_I_HXX_
-#define _StdMeshers_NotConformAllowed_I_HXX_
-
-#include <SALOMEconfig.h>
-#include CORBA_SERVER_HEADER(SMESH_BasicHypothesis)
-
-#include "SMESH_Hypothesis_i.hxx"
-
-#include "StdMeshers_NotConformAllowed.hxx"
-
-class StdMeshers_NotConformAllowed_i:
- public POA_StdMeshers::StdMeshers_NotConformAllowed,
- public SMESH_Hypothesis_i
-{
-public:
- StdMeshers_NotConformAllowed_i(PortableServer::POA_ptr thePOA,
- int studyId,
- ::SMESH_Gen* genImpl);
- virtual ~StdMeshers_NotConformAllowed_i();
-
- // Verify whether hypothesis supports given entity type
- CORBA::Boolean IsDimSupported( SMESH::Dimension type );
-
-protected:
- ::StdMeshers_NotConformAllowed* _impl;
-};
-
-#endif
-
+++ /dev/null
-// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses
-//
-// Copyright (C) 2003 CEA
-//
-// 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.org
-//
-//
-//
-// File : StdMeshers_Propagation_i.cxx
-// Module : SMESH
-// $Header$
-
-using namespace std;
-#include "StdMeshers_Propagation_i.hxx"
-#include "SMESH_Gen.hxx"
-
-#include "Utils_CorbaException.hxx"
-#include "utilities.h"
-
-//=============================================================================
-/*!
- * StdMeshers_Propagation_i::StdMeshers_Propagation_i
- *
- * Constructor
- */
-//=============================================================================
-StdMeshers_Propagation_i::StdMeshers_Propagation_i (PortableServer::POA_ptr thePOA,
- int theStudyId,
- ::SMESH_Gen* theGenImpl )
- : SALOME::GenericObj_i( thePOA ),
- SMESH_Hypothesis_i( thePOA )
-{
- MESSAGE( "StdMeshers_Propagation_i::StdMeshers_Propagation_i" );
- myBaseImpl = new ::StdMeshers_Propagation(theGenImpl->GetANewId(),
- theStudyId,
- theGenImpl);
-}
-
-//=============================================================================
-/*!
- * StdMeshers_Propagation_i::~StdMeshers_Propagation_i
- *
- * Destructor
- */
-//=============================================================================
-StdMeshers_Propagation_i::~StdMeshers_Propagation_i()
-{
- MESSAGE( "StdMeshers_Propagation_i::~StdMeshers_Propagation_i" );
-}
-
-//=============================================================================
-/*!
- * StdMeshers_Propagation_i::GetImpl
- *
- * Get implementation
- */
-//=============================================================================
-::StdMeshers_Propagation* StdMeshers_Propagation_i::GetImpl()
-{
- MESSAGE( "StdMeshers_Propagation_i::GetImpl" );
- return ( ::StdMeshers_Propagation* )myBaseImpl;
-}
-
-//================================================================================
-/*!
- * \brief Verify whether hypothesis supports given entity type
- * \param type - dimension (see SMESH::Dimension enumeration)
- * \retval CORBA::Boolean - TRUE if dimension is supported, FALSE otherwise
- *
- * Verify whether hypothesis supports given entity type (see SMESH::Dimension enumeration)
- */
-//================================================================================
-CORBA::Boolean StdMeshers_Propagation_i::IsDimSupported( SMESH::Dimension type )
-{
- return type == SMESH::DIM_1D;
-}
-
+++ /dev/null
-// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses
-//
-// Copyright (C) 2003 CEA
-//
-// 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.org
-//
-//
-//
-// File : StdMeshers_Propagation_i.hxx
-// Module : SMESH
-// $Header$
-
-#ifndef _SMESH_PROPAGATION_I_HXX_
-#define _SMESH_PROPAGATION_I_HXX_
-
-#include <SALOMEconfig.h>
-#include CORBA_SERVER_HEADER(SMESH_BasicHypothesis)
-
-#include "SMESH_Hypothesis_i.hxx"
-#include "StdMeshers_Propagation.hxx"
-
-class SMESH_Gen;
-
-// ======================================================
-// Propagation hypothesis
-// ======================================================
-class StdMeshers_Propagation_i:
- public virtual POA_StdMeshers::StdMeshers_Propagation,
- public virtual SMESH_Hypothesis_i
-{
-public:
- // Constructor
- StdMeshers_Propagation_i (PortableServer::POA_ptr thePOA,
- int theStudyId,
- ::SMESH_Gen* theGenImpl);
- // Destructor
- virtual ~StdMeshers_Propagation_i();
-
- // Get implementation
- ::StdMeshers_Propagation* GetImpl();
-
- // Verify whether hypothesis supports given entity type
- CORBA::Boolean IsDimSupported( SMESH::Dimension type );
-};
-
-#endif
+++ /dev/null
-// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : StdMeshers_Quadrangle_2D_i.cxx
-// Moved here from SMESH_Quadrangle_2D_i.cxx
-// Author : Paul RASCLE, EDF
-// Module : SMESH
-// $Header$
-
-using namespace std;
-#include "StdMeshers_Quadrangle_2D_i.hxx"
-#include "SMESH_Gen.hxx"
-
-#include "Utils_CorbaException.hxx"
-#include "utilities.h"
-
-//=============================================================================
-/*!
- * StdMeshers_Quadrangle_2D_i::StdMeshers_Quadrangle_2D_i
- *
- * Constructor
- */
-//=============================================================================
-
-StdMeshers_Quadrangle_2D_i::StdMeshers_Quadrangle_2D_i( PortableServer::POA_ptr thePOA,
- int theStudyId,
- ::SMESH_Gen* theGenImpl )
- : SALOME::GenericObj_i( thePOA ),
- SMESH_Hypothesis_i( thePOA ),
- SMESH_Algo_i( thePOA ),
- SMESH_2D_Algo_i( thePOA )
-{
- MESSAGE( "StdMeshers_Quadrangle_2D_i::StdMeshers_Quadrangle_2D_i" );
- myBaseImpl = new ::StdMeshers_Quadrangle_2D( theGenImpl->GetANewId(),
- theStudyId,
- theGenImpl );
-}
-
-//=============================================================================
-/*!
- * StdMeshers_Quadrangle_2D_i::~StdMeshers_Quadrangle_2D_i
- *
- * Destructor
- *
- */
-//=============================================================================
-
-StdMeshers_Quadrangle_2D_i::~StdMeshers_Quadrangle_2D_i()
-{
- MESSAGE( "StdMeshers_Quadrangle_2D_i::~StdMeshers_Quadrangle_2D_i" );
-}
-
-//=============================================================================
-/*!
- * StdMeshers_Quadrangle_2D_i::GetImpl
- *
- * Get implementation
- */
-//=============================================================================
-
-::StdMeshers_Quadrangle_2D* StdMeshers_Quadrangle_2D_i::GetImpl()
-{
- MESSAGE( "StdMeshers_Quadrangle_2D_i::GetImpl" );
- return ( ::StdMeshers_Quadrangle_2D* )myBaseImpl;
-}
-
+++ /dev/null
-// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : StdMeshers_Quadrangle_2D_i.hxx
-// Moved here from SMESH_Quadrangle_2D_i.hxx
-// Author : Paul RASCLE, EDF
-// Module : SMESH
-// $Header$
-
-#ifndef _SMESH_QUADRANGLE_2D_I_HXX_
-#define _SMESH_QUADRANGLE_2D_I_HXX_
-
-#include <SALOMEconfig.h>
-#include CORBA_SERVER_HEADER(SMESH_BasicHypothesis)
-
-#include "SMESH_2D_Algo_i.hxx"
-#include "StdMeshers_Quadrangle_2D.hxx"
-
-class SMESH_Gen;
-
-// ======================================================
-// Quadrangle (Mapping) 2d algorithm
-// ======================================================
-class StdMeshers_Quadrangle_2D_i:
- public virtual POA_StdMeshers::StdMeshers_Quadrangle_2D,
- public virtual SMESH_2D_Algo_i
-{
-public:
- // Constructor
- StdMeshers_Quadrangle_2D_i( PortableServer::POA_ptr thePOA,
- int theStudyId,
- ::SMESH_Gen* theGenImpl );
-
- // Destructor
- virtual ~StdMeshers_Quadrangle_2D_i();
-
- // Get implementation
- ::StdMeshers_Quadrangle_2D* GetImpl();
-};
-
-#endif
+++ /dev/null
-// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : StdMeshers_Regular_1D_i.cxx
-// Moved here from SMESH_Regular_1D_i.cxx
-// Author : Paul RASCLE, EDF
-// Module : SMESH
-// $Header$
-
-using namespace std;
-#include "StdMeshers_Regular_1D_i.hxx"
-#include "SMESH_Gen.hxx"
-
-#include "Utils_CorbaException.hxx"
-#include "utilities.h"
-
-//=============================================================================
-/*!
- * StdMeshers_Regular_1D_i::StdMeshers_Regular_1D_i
- *
- * Constructor
- */
-//=============================================================================
-
-StdMeshers_Regular_1D_i::StdMeshers_Regular_1D_i( PortableServer::POA_ptr thePOA,
- int theStudyId,
- ::SMESH_Gen* theGenImpl )
- : SALOME::GenericObj_i( thePOA ),
- SMESH_Hypothesis_i( thePOA ),
- SMESH_Algo_i( thePOA ),
- SMESH_1D_Algo_i( thePOA )
-{
- MESSAGE( "StdMeshers_Regular_1D_i::StdMeshers_Regular_1D_i" );
- myBaseImpl = new ::StdMeshers_Regular_1D( theGenImpl->GetANewId(),
- theStudyId,
- theGenImpl );
-}
-
-//=============================================================================
-/*!
- * StdMeshers_Regular_1D_i::~StdMeshers_Regular_1D_i
- *
- * Destructor
- */
-//=============================================================================
-
-StdMeshers_Regular_1D_i::~StdMeshers_Regular_1D_i()
-{
- MESSAGE( "StdMeshers_Regular_1D_i::~StdMeshers_Regular_1D_i" );
-}
-
-//=============================================================================
-/*!
- * StdMeshers_Regular_1D_i::GetImpl
- *
- * Get implementation
- */
-//=============================================================================
-
-::StdMeshers_Regular_1D* StdMeshers_Regular_1D_i::GetImpl()
-{
- MESSAGE( "StdMeshers_Regular_1D_i::GetImpl" );
- return ( ::StdMeshers_Regular_1D* )myBaseImpl;
-}
-
+++ /dev/null
-// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : StdMeshers_Regular_1D_i.hxx
-// Moved here from SMESH_Regular_1D_i.hxx
-// Author : Paul RASCLE, EDF
-// Module : SMESH
-// $Header$
-
-#ifndef _SMESH_REGULAR_1D_I_HXX_
-#define _SMESH_REGULAR_1D_I_HXX_
-
-#include <SALOMEconfig.h>
-#include CORBA_SERVER_HEADER(SMESH_BasicHypothesis)
-
-#include "SMESH_1D_Algo_i.hxx"
-#include "StdMeshers_Regular_1D.hxx"
-
-// ======================================================
-// Wire Discretization 1d algorithm
-// ======================================================
-class StdMeshers_Regular_1D_i:
- public virtual POA_StdMeshers::StdMeshers_Regular_1D,
- public virtual SMESH_1D_Algo_i
-{
-public:
- // Constructor
- StdMeshers_Regular_1D_i( PortableServer::POA_ptr thePOA,
- int theStudyId,
- ::SMESH_Gen* theGenImpl );
- // Destructor
- virtual ~StdMeshers_Regular_1D_i();
-
- // Get implementation
- ::StdMeshers_Regular_1D* GetImpl();
-};
-
-#endif
+++ /dev/null
-// SMESH SMESH_I : idl implementation based on 'SMESH' unit's calsses
-//
-// Copyright (C) 2003 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
-//
-// This library is free software; you can redistribute it and/or
-// modify it under the terms of the GNU Lesser General Public
-// License as published by the Free Software Foundation; either
-// version 2.1 of the License.
-//
-// This library is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-// Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public
-// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-//
-// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org
-//
-//
-//
-// File : StdMeshers_StartEndLength_i.hxx
-// Moved here from SMESH_LocalLength_i.hxx
-// Author : Paul RASCLE, EDF
-// Module : SMESH
-// $Header$
-
-#ifndef _SMESH_StartEndLength_I_HXX_
-#define _SMESH_StartEndLength_I_HXX_
-
-#include <SALOMEconfig.h>
-#include CORBA_SERVER_HEADER(SMESH_BasicHypothesis)
-
-#include "SMESH_Hypothesis_i.hxx"
-#include "StdMeshers_StartEndLength.hxx"
-
-class SMESH_Gen;
-
-// ======================================================
-// Local Length hypothesis
-// ======================================================
-class StdMeshers_StartEndLength_i:
- public virtual POA_StdMeshers::StdMeshers_StartEndLength,
- public virtual SMESH_Hypothesis_i
-{
-public:
- // Constructor
- StdMeshers_StartEndLength_i(PortableServer::POA_ptr thePOA,
- int theStudyId,
- ::SMESH_Gen* theGenImpl );
- // Destructor
- virtual ~StdMeshers_StartEndLength_i();
-
- // Set length
- void SetLength( CORBA::Double theLength, CORBA::Boolean theIsStart )
- throw ( SALOME::SALOME_Exception );
- // Get length
- CORBA::Double GetLength(CORBA::Boolean theIsStart);
-
- // Get implementation
- ::StdMeshers_StartEndLength* GetImpl();
-
- // Verify whether hypothesis supports given entity type
- CORBA::Boolean IsDimSupported( SMESH::Dimension type );
-};
-
-#endif
-