From 8bc3c946fbe59d2d3920e0b677e4270bcdc375cc Mon Sep 17 00:00:00 2001 From: prascle Date: Mon, 7 Dec 2009 16:20:46 +0000 Subject: [PATCH] merge from V5_1_3rc5 --- adm_local/unix/config_files/check_qwt.m4 | 32 +- bin/smesh_setenv.py | 1 + configure.ac | 4 +- .../gui/SMESH/images/2d_from_3d_menu.png | Bin 0 -> 20123 bytes .../gui/SMESH/images/blsurf_parameters.png | Bin 26693 -> 26311 bytes .../images/blsurf_parameters_advanced.png | Bin 19033 -> 19361 bytes .../blsurf_parameters_enforced_vertices.png | Bin 0 -> 18527 bytes .../images/blsurf_parameters_sizemap.png | Bin 19136 -> 19241 bytes .../SMESH/images/ghs3d_enforced_vertices.png | Bin 0 -> 17195 bytes .../ghs3d_enforced_vertices_screenshot.png | Bin 0 -> 397648 bytes .../images/ghs3d_parameters_advanced.png | Bin 30204 -> 22700 bytes .../SMESH/images/ghs3d_parameters_basic.png | Bin 19585 -> 14634 bytes .../gui/SMESH/images/hypo_quad_params_2.png | Bin 0 -> 2115 bytes .../SMESH/images/hypo_quad_params_res_2.png | Bin 0 -> 9391 bytes .../gui/SMESH/input/1d_meshing_hypo.doc | 38 +- .../gui/SMESH/input/2d_meshing_hypo.doc | 14 + doc/salome/gui/SMESH/input/about_hypo.doc | 1 + doc/salome/gui/SMESH/input/about_meshes.doc | 1 + .../gui/SMESH/input/basic_meshing_algos.doc | 5 +- doc/salome/gui/SMESH/input/blsurf_hypo.doc | 55 +- .../gui/SMESH/input/building_compounds.doc | 2 + .../gui/SMESH/input/constructing_meshes.doc | 2 +- .../input/convert_to_from_quadratic_mesh.doc | 4 +- doc/salome/gui/SMESH/input/editing_groups.doc | 12 +- doc/salome/gui/SMESH/input/free_faces.doc | 9 +- doc/salome/gui/SMESH/input/free_nodes.doc | 9 +- doc/salome/gui/SMESH/input/ghs3d_hypo.doc | 53 +- .../gui/SMESH/input/grouping_elements.doc | 8 +- .../gui/SMESH/input/make_2dmesh_from_3d.doc | 22 + doc/salome/gui/SMESH/input/mesh_infos.doc | 8 +- .../gui/SMESH/input/modifying_meshes.doc | 4 +- .../gui/SMESH/input/netgen_2d_3d_hypo.doc | 92 +- doc/salome/gui/SMESH/input/prism_3d_algo.doc | 12 +- .../input/radial_quadrangle_1D2D_algo.doc | 24 +- .../gui/SMESH/input/smeshpy_interface.doc | 207 +- doc/salome/gui/SMESH/input/translation.doc | 8 +- .../gui/SMESH/input/tui_creating_meshes.doc | 2 +- .../input/tui_defining_blsurf_hypotheses.doc | 38 + .../input/tui_defining_ghs3d_hypotheses.doc | 45 + .../SMESH/input/tui_defining_hypotheses.doc | 74 + .../gui/SMESH/input/tui_grouping_elements.doc | 8 +- .../gui/SMESH/input/tui_modifying_meshes.doc | 46 +- .../gui/SMESH/input/tui_viewing_meshes.doc | 43 +- .../SMESH/input/viewing_meshes_overview.doc | 2 +- idl/SMESH_Mesh.idl | 4 +- idl/SMESH_MeshEditor.idl | 94 +- resources/Makefile.am | 1 + resources/mesh_2d_from_3d.png | Bin 0 -> 406 bytes src/Controls/SMESH_Controls.cxx | 347 +-- src/Controls/SMESH_ControlsDef.hxx | 56 +- src/DriverDAT/DriverDAT_R_SMDS_Mesh.cxx | 3 + src/DriverDAT/DriverDAT_W_SMDS_Mesh.cxx | 3 + src/DriverDAT/Makefile.am | 1 + src/DriverMED/DriverMED_Family.cxx | 49 +- src/DriverMED/DriverMED_Family.h | 18 +- src/DriverMED/DriverMED_R_SMESHDS_Mesh.cxx | 463 ++-- src/DriverMED/DriverMED_R_SMESHDS_Mesh.h | 2 +- src/DriverMED/DriverMED_W_SMESHDS_Mesh.cxx | 98 +- src/DriverUNV/DriverUNV_R_SMDS_Mesh.cxx | 3 + src/DriverUNV/DriverUNV_W_SMDS_Mesh.cxx | 3 + src/DriverUNV/Makefile.am | 1 + src/MEFISTO2/aptrte.cxx | 12 + src/MEFISTO2/aptrte.h | 51 + src/OBJECT/Makefile.am | 2 +- src/OBJECT/SMESH_Actor.cxx | 129 +- src/OBJECT/SMESH_Actor.h | 8 +- src/OBJECT/SMESH_ActorDef.h | 6 +- src/OBJECT/SMESH_ActorUtils.cxx | 34 +- src/OBJECT/SMESH_ActorUtils.h | 32 +- src/OBJECT/SMESH_DeviceActor.cxx | 99 +- src/OBJECT/SMESH_DeviceActor.h | 12 +- src/OBJECT/SMESH_ExtractGeometry.cxx | 6 +- src/OBJECT/SMESH_FaceOrientationFilter.cxx | 6 +- src/OBJECT/SMESH_Object.cxx | 125 +- src/OBJECT/SMESH_Object.h | 7 +- src/OBJECT/SMESH_ObjectDef.h | 2 + src/OBJECT/SMESH_PreviewActorsCollection.cxx | 38 +- src/SMDS/SMDS_EdgePosition.cxx | 14 +- src/SMDS/SMDS_Mesh.hxx | 348 +-- src/SMDS/SMDS_VolumeOfNodes.cxx | 152 +- src/SMDS/SMDS_VolumeTool.cxx | 45 +- src/SMDS/SMDS_VolumeTool.hxx | 2 + src/SMESH/SMESH_Block.cxx | 3 +- src/SMESH/SMESH_Gen.cxx | 224 +- src/SMESH/SMESH_Gen.hxx | 26 +- src/SMESH/SMESH_Hypothesis.cxx | 4 +- src/SMESH/SMESH_Mesh.cxx | 52 +- src/SMESH/SMESH_Mesh.hxx | 20 +- src/SMESH/SMESH_MeshEditor.cxx | 660 +++++- src/SMESH/SMESH_MeshEditor.hxx | 89 +- src/SMESH/SMESH_MesherHelper.cxx | 185 +- src/SMESH/SMESH_MesherHelper.hxx | 31 +- src/SMESH/SMESH_Octree.cxx | 166 +- src/SMESH/SMESH_Octree.hxx | 94 +- src/SMESH/SMESH_OctreeNode.cxx | 187 +- src/SMESH/SMESH_OctreeNode.hxx | 41 +- src/SMESH/SMESH_subMesh.cxx | 128 +- src/SMESH/SMESH_subMesh.hxx | 2 +- src/SMESHDS/SMESHDS_CommandType.hxx | 5 +- src/SMESHDS/SMESHDS_Mesh.cxx | 284 +-- src/SMESHDS/SMESHDS_Mesh.hxx | 326 +-- src/SMESHGUI/Makefile.am | 7 +- src/SMESHGUI/SMESHGUI.cxx | 1422 ++++++------ src/SMESHGUI/SMESHGUI.h | 3 +- src/SMESHGUI/SMESHGUI_AddMeshElementDlg.cxx | 44 +- .../SMESHGUI_AddQuadraticElementDlg.cxx | 38 +- src/SMESHGUI/SMESHGUI_BuildCompoundDlg.cxx | 43 +- src/SMESHGUI/SMESHGUI_ClippingDlg.cxx | 107 +- src/SMESHGUI/SMESHGUI_ClippingDlg.h | 16 +- src/SMESHGUI/SMESHGUI_ComputeDlg.cxx | 111 +- src/SMESHGUI/SMESHGUI_ComputeDlg.h | 18 +- src/SMESHGUI/SMESHGUI_ConvToQuadOp.cxx | 12 +- src/SMESHGUI/SMESHGUI_CreatePatternDlg.cxx | 50 +- .../SMESHGUI_CreatePolyhedralVolumeDlg.cxx | 464 ++-- src/SMESHGUI/SMESHGUI_DeleteGroupDlg.cxx | 10 +- src/SMESHGUI/SMESHGUI_Dialog.h | 4 +- src/SMESHGUI/SMESHGUI_Displayer.cxx | 8 +- src/SMESHGUI/SMESHGUI_EditMeshDlg.cxx | 84 +- src/SMESHGUI/SMESHGUI_EditMeshDlg.h | 2 +- .../SMESHGUI_ExtrusionAlongPathDlg.cxx | 256 +-- src/SMESHGUI/SMESHGUI_ExtrusionDlg.cxx | 108 +- src/SMESHGUI/SMESHGUI_FilterDlg.cxx | 94 +- src/SMESHGUI/SMESHGUI_FilterDlg.h | 8 +- src/SMESHGUI/SMESHGUI_FilterLibraryDlg.cxx | 52 +- src/SMESHGUI/SMESHGUI_GEOMGenUtils.cxx | 4 +- src/SMESHGUI/SMESHGUI_GroupDlg.cxx | 750 ++++--- src/SMESHGUI/SMESHGUI_GroupDlg.h | 9 +- src/SMESHGUI/SMESHGUI_GroupOpDlg.cxx | 24 +- src/SMESHGUI/SMESHGUI_GroupUtils.cxx | 6 +- src/SMESHGUI/SMESHGUI_GroupUtils.h | 4 +- src/SMESHGUI/SMESHGUI_Hypotheses.cxx | 84 +- src/SMESHGUI/SMESHGUI_Hypotheses.h | 10 +- src/SMESHGUI/SMESHGUI_HypothesesUtils.cxx | 404 ++-- src/SMESHGUI/SMESHGUI_HypothesesUtils.h | 10 +- src/SMESHGUI/SMESHGUI_IdValidator.h | 18 +- src/SMESHGUI/SMESHGUI_Make2DFrom3DOp.cxx | 251 +++ src/SMESHGUI/SMESHGUI_Make2DFrom3DOp.h | 87 + src/SMESHGUI/SMESHGUI_MakeNodeAtPointDlg.cxx | 32 +- src/SMESHGUI/SMESHGUI_MeshDlg.cxx | 8 +- src/SMESHGUI/SMESHGUI_MeshInfosBox.cxx | 78 +- src/SMESHGUI/SMESHGUI_MeshInfosDlg.cxx | 26 +- src/SMESHGUI/SMESHGUI_MeshOp.cxx | 113 +- src/SMESHGUI/SMESHGUI_MeshOp.h | 2 +- src/SMESHGUI/SMESHGUI_MeshPatternDlg.cxx | 98 +- src/SMESHGUI/SMESHGUI_MeshUtils.cxx | 28 +- src/SMESHGUI/SMESHGUI_MoveNodesDlg.cxx | 36 +- src/SMESHGUI/SMESHGUI_MultiEditDlg.cxx | 82 +- src/SMESHGUI/SMESHGUI_MultiEditDlg.h | 2 +- src/SMESHGUI/SMESHGUI_NodesDlg.cxx | 38 +- src/SMESHGUI/SMESHGUI_Operation.cxx | 14 +- src/SMESHGUI/SMESHGUI_PatternWidget.cxx | 4 +- src/SMESHGUI/SMESHGUI_PatternWidget.h | 4 +- .../SMESHGUI_Preferences_ColorDlg.cxx | 4 +- .../SMESHGUI_Preferences_ScalarBarDlg.cxx | 134 +- .../SMESHGUI_Preferences_ScalarBarDlg.h | 6 +- src/SMESHGUI/SMESHGUI_RemoveElementsDlg.cxx | 28 +- src/SMESHGUI/SMESHGUI_RemoveNodesDlg.cxx | 28 +- src/SMESHGUI/SMESHGUI_RenumberingDlg.cxx | 52 +- src/SMESHGUI/SMESHGUI_RevolutionDlg.cxx | 136 +- src/SMESHGUI/SMESHGUI_RotationDlg.cxx | 56 +- src/SMESHGUI/SMESHGUI_Selection.cxx | 4 +- src/SMESHGUI/SMESHGUI_SelectionOp.cxx | 6 +- src/SMESHGUI/SMESHGUI_SelectionOp.h | 6 +- src/SMESHGUI/SMESHGUI_SewingDlg.cxx | 42 +- src/SMESHGUI/SMESHGUI_ShapeByMeshDlg.cxx | 258 +-- src/SMESHGUI/SMESHGUI_SingleEditDlg.cxx | 64 +- src/SMESHGUI/SMESHGUI_SmoothingDlg.cxx | 76 +- src/SMESHGUI/SMESHGUI_SpinBox.cxx | 6 +- src/SMESHGUI/SMESHGUI_SpinBox.h | 6 +- .../SMESHGUI_StandardMeshInfosDlg.cxx | 62 +- src/SMESHGUI/SMESHGUI_SymmetryDlg.cxx | 42 +- src/SMESHGUI/SMESHGUI_TranslationDlg.cxx | 38 +- src/SMESHGUI/SMESHGUI_TransparencyDlg.cxx | 46 +- src/SMESHGUI/SMESHGUI_Utils.cxx | 48 +- src/SMESHGUI/SMESHGUI_Utils.h | 10 +- src/SMESHGUI/SMESHGUI_VTKUtils.cxx | 459 ++-- src/SMESHGUI/SMESHGUI_VTKUtils.h | 22 +- src/SMESHGUI/SMESHGUI_WhatIsDlg.cxx | 98 +- src/SMESHGUI/SMESHGUI_XmlHandler.cxx | 4 +- src/SMESHGUI/SMESHGUI_XmlHandler.h | 2 +- src/SMESHGUI/SMESH_images.ts | 4 + src/SMESHGUI/SMESH_msg_en.ts | 43 + src/SMESH_I/SMESH_2smeshpy.cxx | 62 +- src/SMESH_I/SMESH_2smeshpy.hxx | 2 +- src/SMESH_I/SMESH_DumpPython.cxx | 18 +- src/SMESH_I/SMESH_Filter_i.cxx | 12 +- src/SMESH_I/SMESH_Filter_i.hxx | 98 +- src/SMESH_I/SMESH_Gen_i.cxx | 1971 +++++++++-------- src/SMESH_I/SMESH_Gen_i.hxx | 81 +- src/SMESH_I/SMESH_Gen_i_1.cxx | 106 +- src/SMESH_I/SMESH_Group_i.cxx | 6 +- src/SMESH_I/SMESH_MEDFamily_i.cxx | 32 +- src/SMESH_I/SMESH_MEDFamily_i.hxx | 2 +- src/SMESH_I/SMESH_MEDMesh_i.cxx | 1265 +++++------ src/SMESH_I/SMESH_MEDMesh_i.hxx | 36 +- src/SMESH_I/SMESH_MEDSupport_i.cxx | 302 +-- src/SMESH_I/SMESH_MEDSupport_i.hxx | 78 +- src/SMESH_I/SMESH_MeshEditor_i.cxx | 1114 ++++++---- src/SMESH_I/SMESH_MeshEditor_i.hxx | 318 +-- src/SMESH_I/SMESH_Mesh_i.cxx | 154 +- src/SMESH_I/SMESH_Mesh_i.hxx | 2 +- src/SMESH_I/SMESH_NoteBook.cxx | 382 ++-- src/SMESH_I/SMESH_Pattern_i.cxx | 10 +- src/SMESH_I/SMESH_PythonDump.hxx | 2 +- src/SMESH_I/SMESH_subMesh_i.cxx | 16 +- src/SMESH_I/SMESH_subMesh_i.hxx | 4 +- src/SMESH_I/smeshpy.py | 1 + src/SMESH_SWIG/PAL_MESH_041_mesh.py | 1 + src/SMESH_SWIG/PAL_MESH_043_2D.py | 1 + src/SMESH_SWIG/PAL_MESH_043_3D.py | 1 + src/SMESH_SWIG/SMESH_AdvancedEditor.py | 1 + src/SMESH_SWIG/SMESH_BelongToGeom.py | 1 + src/SMESH_SWIG/SMESH_BuildCompound.py | 1 + src/SMESH_SWIG/SMESH_GroupFromGeom.py | 1 + src/SMESH_SWIG/SMESH_GroupFromGeom2.py | 1 + src/SMESH_SWIG/SMESH_GroupLyingOnGeom.py | 1 + src/SMESH_SWIG/SMESH_Nut.py | 1 + src/SMESH_SWIG/SMESH_Partition1_tetra.py | 1 + src/SMESH_SWIG/SMESH_Sphere.py | 1 + src/SMESH_SWIG/SMESH_blocks.py | 1 + src/SMESH_SWIG/SMESH_box.py | 1 + src/SMESH_SWIG/SMESH_box2_tetra.py | 1 + src/SMESH_SWIG/SMESH_box3_tetra.py | 1 + src/SMESH_SWIG/SMESH_box_tetra.py | 1 + src/SMESH_SWIG/SMESH_controls.py | 1 + src/SMESH_SWIG/SMESH_demo_hexa2_upd.py | 1 + src/SMESH_SWIG/SMESH_fixation.py | 1 + src/SMESH_SWIG/SMESH_fixation_hexa.py | 1 + src/SMESH_SWIG/SMESH_fixation_netgen.py | 1 + src/SMESH_SWIG/SMESH_fixation_tetra.py | 1 + src/SMESH_SWIG/SMESH_flight_skin.py | 1 + src/SMESH_SWIG/SMESH_freebord.py | 1 + src/SMESH_SWIG/SMESH_hexaedre.py | 1 + src/SMESH_SWIG/SMESH_mechanic.py | 1 + src/SMESH_SWIG/SMESH_mechanic_editor.py | 1 + src/SMESH_SWIG/SMESH_mechanic_netgen.py | 1 + src/SMESH_SWIG/SMESH_mechanic_tetra.py | 1 + src/SMESH_SWIG/SMESH_reg.py | 1 + src/SMESH_SWIG/SMESH_shared_modules.py | 1 + src/SMESH_SWIG/SMESH_test.py | 3 +- src/SMESH_SWIG/SMESH_test0.py | 1 + src/SMESH_SWIG/SMESH_test1.py | 1 + src/SMESH_SWIG/SMESH_test1_AndDisplay.py | 1 + src/SMESH_SWIG/SMESH_test2.py | 1 + src/SMESH_SWIG/SMESH_test3.py | 1 + src/SMESH_SWIG/SMESH_test4.py | 1 + src/SMESH_SWIG/SMESH_test5.py | 1 + src/SMESH_SWIG/batchmode_mefisto.py | 1 + src/SMESH_SWIG/batchmode_smesh.py | 1 + src/SMESH_SWIG/ex00_all.py | 1 + src/SMESH_SWIG/ex01_cube2build.py | 1 + src/SMESH_SWIG/ex02_cube2primitive.py | 1 + src/SMESH_SWIG/ex03_cube2partition.py | 1 + src/SMESH_SWIG/ex04_cube5tetraHexa.py | 1 + src/SMESH_SWIG/ex05_hole1build.py | 1 + src/SMESH_SWIG/ex06_hole1boolean.py | 1 + src/SMESH_SWIG/ex07_hole1partition.py | 1 + src/SMESH_SWIG/ex08_hole2build.py | 1 + src/SMESH_SWIG/ex09_grid4build.py | 1 + src/SMESH_SWIG/ex10_grid4geometry.py | 1 + src/SMESH_SWIG/ex11_grid3partition.py | 1 + src/SMESH_SWIG/ex12_grid17partition.py | 1 + src/SMESH_SWIG/ex13_hole1partial.py | 1 + src/SMESH_SWIG/ex14_cyl1holed.py | 1 + src/SMESH_SWIG/ex15_cyl2geometry.py | 1 + src/SMESH_SWIG/ex16_cyl2complementary.py | 1 + src/SMESH_SWIG/ex17_dome1.py | 1 + src/SMESH_SWIG/ex18_dome2.py | 1 + src/SMESH_SWIG/ex19_sphereINcube.py | 1 + src/SMESH_SWIG/ex21_lamp.py | 1 + src/SMESH_SWIG/ex24_cylinder.py | 1 + src/SMESH_SWIG/ex29_refine.py | 1 + src/SMESH_SWIG/ex30_groupsOp.py | 147 +- src/SMESH_SWIG/ex30_tepal.py | 1 + src/SMESH_SWIG/ex31_dimGroup.py | 96 +- src/SMESH_SWIG/smesh.py | 1 + src/SMESH_SWIG/smeshDC.py | 460 ++-- .../StdMeshers_CompositeHexa_3D.cxx | 30 +- src/StdMeshers/StdMeshers_FaceSide.cxx | 14 +- src/StdMeshers/StdMeshers_FaceSide.hxx | 2 +- src/StdMeshers/StdMeshers_Hexa_3D.cxx | 470 ++-- src/StdMeshers/StdMeshers_MEFISTO_2D.cxx | 18 +- .../StdMeshers_NumberOfSegments.cxx | 33 +- src/StdMeshers/StdMeshers_Quadrangle_2D.cxx | 236 +- .../StdMeshers_RadialQuadrangle_1D2D.cxx | 882 ++++---- .../StdMeshers_RadialQuadrangle_1D2D.hxx | 9 +- src/StdMeshers/StdMeshers_Regular_1D.cxx | 5 +- src/StdMeshersGUI/Makefile.am | 3 +- .../StdMeshersGUI_DistrPreview.cxx | 5 + .../StdMeshersGUI_FixedPointsParamWdg.cxx | 56 +- .../StdMeshersGUI_FixedPointsParamWdg.h | 5 +- .../StdMeshersGUI_NbSegmentsCreator.cxx | 14 +- .../StdMeshersGUI_StdHypothesisCreator.cxx | 78 +- .../StdMeshersGUI_SubShapeSelectorWdg.cxx | 88 +- .../StdMeshersGUI_SubShapeSelectorWdg.h | 13 +- src/StdMeshersGUI/StdMeshers_images.ts | 4 + src/StdMeshersGUI/StdMeshers_msg_en.ts | 8 + 297 files changed, 12150 insertions(+), 9334 deletions(-) create mode 100644 doc/salome/gui/SMESH/images/2d_from_3d_menu.png create mode 100644 doc/salome/gui/SMESH/images/blsurf_parameters_enforced_vertices.png create mode 100644 doc/salome/gui/SMESH/images/ghs3d_enforced_vertices.png create mode 100644 doc/salome/gui/SMESH/images/ghs3d_enforced_vertices_screenshot.png create mode 100644 doc/salome/gui/SMESH/images/hypo_quad_params_2.png create mode 100644 doc/salome/gui/SMESH/images/hypo_quad_params_res_2.png create mode 100644 doc/salome/gui/SMESH/input/make_2dmesh_from_3d.doc create mode 100644 doc/salome/gui/SMESH/input/tui_defining_ghs3d_hypotheses.doc create mode 100644 resources/mesh_2d_from_3d.png create mode 100644 src/SMESHGUI/SMESHGUI_Make2DFrom3DOp.cxx create mode 100644 src/SMESHGUI/SMESHGUI_Make2DFrom3DOp.h diff --git a/adm_local/unix/config_files/check_qwt.m4 b/adm_local/unix/config_files/check_qwt.m4 index 7fde4754c..736c5b5c8 100644 --- a/adm_local/unix/config_files/check_qwt.m4 +++ b/adm_local/unix/config_files/check_qwt.m4 @@ -44,15 +44,25 @@ AC_ARG_WITH(qwt_inc, AC_MSG_RESULT("select $withval as path to QWT includes") ]) +libqwt_name=qwt if test -z $QWTHOME; then AC_MSG_RESULT(QWTHOME not defined) + AC_MSG_NOTICE(Trying native Qwt...) exist_ok=no if test "x$exist_ok" = "xno"; then - for d in /usr/local /usr ; do - AC_CHECK_FILE(${d}/lib${LIB_LOCATION_SUFFIX}/libqwt.so,exist_ok=yes,exist_ok=no) + for d in /usr /usr/local ; do + for extension in qwt-qt4 qwt; do + AC_CHECK_FILE(${d}/lib${LIB_LOCATION_SUFFIX}/lib${extension}.so,exist_ok=yes,exist_ok=no) + if test "x$exist_ok" = "xyes"; then + QWTHOME=$d + AC_MSG_RESULT(lib${extension}.so detected in $d/lib) + libqwt_name=${extension} + dnl break, libqwt-qt4.so is choosen before libqwt.so since it is surely the Qt4 version. + break + fi + done if test "x$exist_ok" = "xyes"; then - QWTHOME=$d - AC_MSG_RESULT(libqwt.so detected in $d/lib) + break fi done fi @@ -69,7 +79,10 @@ if test -z $QWTHOME; then fi if test "x$exist_ok" = "xyes"; then if test -z $QWT_INCDIR; then - QWT_INCDIR=$QWTHOME"/include/qwt" + QWT_INCDIR=$QWTHOME"/include/qwt-qt4" + if test ! -f $QWT_INCDIR/qwt.h ; then + QWT_INCDIR=/usr/include/qwt + fi if test ! -f $QWT_INCDIR/qwt.h ; then QWT_INCDIR=$QWTHOME"/include" fi @@ -84,6 +97,7 @@ if test -z $QWTHOME; then qwt_ok=no fi else + AC_MSG_NOTICE(Trying Qwt from $QWTHOME ...) if test -z $QWT_INCDIR; then QWT_INCDIR="$QWTHOME/include" fi @@ -119,9 +133,9 @@ else LIBS_old=$LIBS LIBS="$LIBS $QT_LIBS" if test "x$QWTHOME" = "x/usr" ; then - LIBS="$LIBS -lqwt" + LIBS="$LIBS -l${libqwt_name}" else - LIBS="$LIBS -L$QWTHOME/lib -lqwt" + LIBS="$LIBS -L$QWTHOME/lib -l${libqwt_name}" fi CXXFLAGS_old=$CXXFLAGS @@ -148,9 +162,9 @@ else else AC_MSG_RESULT(yes) if test "x$QWTHOME" = "x/usr" ; then - QWT_LIBS=" -lqwt" + QWT_LIBS=" -l${libqwt_name}" else - QWT_LIBS="-L$QWTHOME/lib -lqwt" + QWT_LIBS="-L$QWTHOME/lib -l${libqwt_name}" fi fi diff --git a/bin/smesh_setenv.py b/bin/smesh_setenv.py index b3240bfa2..a25e5180b 100644 --- a/bin/smesh_setenv.py +++ b/bin/smesh_setenv.py @@ -1,4 +1,5 @@ #!/usr/bin/env python +# -*- coding: iso-8859-1 -*- # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, diff --git a/configure.ac b/configure.ac index 59e035781..7f5e389b6 100644 --- a/configure.ac +++ b/configure.ac @@ -26,7 +26,7 @@ # Modified by : Alexander BORODIN (OCN) - autotools usage # Created from configure.in.base # -AC_INIT([Salome2 Project SMESH module], [5.1.2], [webmaster.salome@opencascade.com], [SalomeSMESH]) +AC_INIT([Salome2 Project SMESH module], [5.1.3], [webmaster.salome@opencascade.com], [SalomeSMESH]) AC_CONFIG_AUX_DIR(adm_local/unix/config_files) AC_CANONICAL_HOST AC_CANONICAL_TARGET @@ -87,7 +87,7 @@ dnl libtool macro check for CC, LD, NM, LN_S, RANLIB, STRIP + pour les librairie echo echo --------------------------------------------- -echo Coniguring production +echo Configuring production echo --------------------------------------------- echo AC_ENABLE_DEBUG(yes) diff --git a/doc/salome/gui/SMESH/images/2d_from_3d_menu.png b/doc/salome/gui/SMESH/images/2d_from_3d_menu.png new file mode 100644 index 0000000000000000000000000000000000000000..ec5117214dacaa84c2c4ef4bfba338d141a7f344 GIT binary patch literal 20123 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 literal 0 HcmV?d00001 diff --git a/doc/salome/gui/SMESH/images/blsurf_parameters.png b/doc/salome/gui/SMESH/images/blsurf_parameters.png index cfafbc481785660cbda0a73d90770160a318896d..7988a9c85317916bf9b82054ac2793b7708fff22 100644 GIT binary patch literal 26311 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 NOI;V6e&))Z{{Sis%mn}d literal 26693 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 literal 19033 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 diff --git a/doc/salome/gui/SMESH/images/blsurf_parameters_enforced_vertices.png b/doc/salome/gui/SMESH/images/blsurf_parameters_enforced_vertices.png new file mode 100644 index 0000000000000000000000000000000000000000..e55dec36b53dd5861ff2d87835854d6dda9891b9 GIT binary patch literal 18527 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 R;2#HpBt_*!s)Y0c{tx)#3OWD) literal 0 HcmV?d00001 diff --git a/doc/salome/gui/SMESH/images/blsurf_parameters_sizemap.png b/doc/salome/gui/SMESH/images/blsurf_parameters_sizemap.png index 0d87e66089ccb6775838a1d640762fda1da21ffc..2b38197590c86d043083e5449add00cd839f55d0 100644 GIT binary patch literal 19241 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 -*/ \ No newline at end of file +
See Also a sample TUI Script of a \ref tui_quadratic "Convert to/from quadratic" operation. + +*/ diff --git a/doc/salome/gui/SMESH/input/editing_groups.doc b/doc/salome/gui/SMESH/input/editing_groups.doc index b5031468a..6cbe5ceb4 100644 --- a/doc/salome/gui/SMESH/input/editing_groups.doc +++ b/doc/salome/gui/SMESH/input/editing_groups.doc @@ -2,7 +2,7 @@ \page editing_groups_page Editing groups -\n To edit an existing group of elements: +To edit an existing group of elements:
  1. Select your group in the Object Browser and in the \b Mesh menu click the Edit Group item or "Edit Group" button in the toolbar.
  2. @@ -17,11 +17,12 @@ The following dialog box will appear: In this dialog box you can modify the name of your group and add or remove the elements forming it. For more information see \ref creating_groups_page "Creating Groups" page. +
  3. Click the \b Apply or Apply and Close button to confirm modification of the group.
-\n To convert an existing group on geometry into standalone group +To convert an existing group on geometry into standalone group of elements and modify:
  1. Select your group on geometry in the Object Browser and in the \b Mesh menu click @@ -31,11 +32,12 @@ the Edit Group as Standalone item.
  2. "Edit Group as Standalone" button
    The group on geometry will be converted into standalone group and can -be modified as group of elements +be modified as group of elements. +
  3. Click the \b Apply or Apply and Close button to confirm modification of the group.
  4. +
-
See Also a sample TUI Script of an -\ref tui_edit_group "Edit Group" operation. +\sa A sample TUI Script of an \ref tui_edit_group "Edit Group" operation. */ diff --git a/doc/salome/gui/SMESH/input/free_faces.doc b/doc/salome/gui/SMESH/input/free_faces.doc index 0c852f32c..d35caa9ac 100644 --- a/doc/salome/gui/SMESH/input/free_faces.doc +++ b/doc/salome/gui/SMESH/input/free_faces.doc @@ -2,16 +2,17 @@ \page free_faces_page Free faces -\n This mesh quality control highlights the faces connected to +This mesh quality control highlights the faces connected to less than two mesh volume elements. The free faces are shown with a color different from the color of shared faces. \image html free_faces.png -
In this picture some volume mesh elements have been removed, as + +In this picture some volume mesh elements have been removed, as a result some faces became connected only to one volume. i.e. became free. -
See Also a sample TUI Script of a -\ref tui_free_faces "Free Faces quality control" operation. +\sa A sample TUI Script of a \ref tui_free_faces "Free Faces quality control" +operation. */ diff --git a/doc/salome/gui/SMESH/input/free_nodes.doc b/doc/salome/gui/SMESH/input/free_nodes.doc index 1caaf9e4b..8a06fe3de 100644 --- a/doc/salome/gui/SMESH/input/free_nodes.doc +++ b/doc/salome/gui/SMESH/input/free_nodes.doc @@ -2,14 +2,15 @@ \page free_nodes_page Free nodes -\n This mesh quality control highlights the nodes which are not connected +This mesh quality control highlights the nodes which are not connected to any mesh element. \image html free_nodes.png -
In this picture some nodes are not connected to any mesh + +In this picture some nodes are not connected to any mesh element after deleting some elements and adding several isolated nodes. -
See Also a sample TUI Script of a -\ref tui_free_nodes "Free Nodes quality control" operation. +\sa A sample TUI Script of a \ref tui_free_nodes "Free Nodes quality control" +operation. */ diff --git a/doc/salome/gui/SMESH/input/ghs3d_hypo.doc b/doc/salome/gui/SMESH/input/ghs3d_hypo.doc index 414e342fa..eb4b981b6 100644 --- a/doc/salome/gui/SMESH/input/ghs3d_hypo.doc +++ b/doc/salome/gui/SMESH/input/ghs3d_hypo.doc @@ -5,6 +5,8 @@ \n GHS3D Parameters hypothesis works only with Tetrahedron (GHS3D) algorithm. This algorithm is a commercial software. +

General parameters

+ \image html ghs3d_parameters_basic.png
    @@ -21,6 +23,8 @@ optimization level: none, light, medium or strong. Higher level of optimisation provides better mesh, but can be time-consuming. +

    Advanced parameters

    + \image html ghs3d_parameters_advanced.png
  • Maximum memory size - launches ghs3d software with @@ -52,6 +56,20 @@ together with the characteristics of the final mesh.
  • To create new nodes - if this option is checked off, ghs3d tries to create tetrahedrons using only the nodes of the 2D mesh.
  • +
  • To remove the initial central point TetMesh-GHS3D adds an internal point +at the gravity centre of the bounding box to speed up and to simplify +the meshing process. However, it is possible to refrain from creating +this point by using the command line option -no initial central point. This can be +particularly useful to generate a volume mesh without internal points at all and in some rare cases +at the boundary regeneration phase when it is impossible to proceed +with the standard options +(for example, when one dimension of the domain is more than 20 times greater than the other two). +Use this option if the boundary regeneration has failed with the standard parameters and before using +the recovery version (command line option -C). +Note: when using this option, the speed of the meshing process may +decrease, and the quality may change. +Note: the boundary regeneration may fail with this option, in some rare cases.
  • +
  • To use boundary recovery version - enables using a boundary recovery module which tries to create volume meshes starting from very poor quality surface meshes @@ -61,9 +79,38 @@ resulting volume mesh will however most likely have a very poor quality (poor aspect ratio of elements, tetrahedra with a very small positive volume).
  • -
  • Option as text - allows input of any text as command line -for ghs3d. This allows the input of advanced options in a free from.
  • +
  • To use FEM correction - Applies finite-element correction by +replacing overconstrained elements where it is possible. At first the process +slices the overconstrained edges and at second the overconstrained +facets. This ensures that there are no edges with two boundary +vertices and that there are no facets with three boundary vertices. TetMesh-GHS3D gives the initial +and final overconstrained edges and facets. It also gives the facets +which have three edges on the boundary. +Note: when using this option, the speed of the meshing process may +decrease, quality may change, and the smallest volume may be smaller. +By default, the FEM correction is not used.
  • + +
  • Option as text - allows to input in the command line any text +for ghs3d, for example, advanced options.
  • + +
+ +

Enforced vertices

+ +\image html ghs3d_enforced_vertices.png + +GHS3D algorithm can locally make the mesh finer. It is possible to define enforced vertices in the volume where the mesh will be detailed. + +A node will be created at the enforced vertex coordinates. There is no need to create a vertex in CAD. + +An enforced vertex is defined by: +
    +
  • The (x,y,z) cartesian coordinates
  • +
  • A constant physical size
-*/ \ No newline at end of file +
See Also a sample TUI Script of the \ref tui_ghs3d "creation of a Ghs3D hypothesis", including enforced vertices. + + +*/ diff --git a/doc/salome/gui/SMESH/input/grouping_elements.doc b/doc/salome/gui/SMESH/input/grouping_elements.doc index f5c7fed67..638d70112 100644 --- a/doc/salome/gui/SMESH/input/grouping_elements.doc +++ b/doc/salome/gui/SMESH/input/grouping_elements.doc @@ -12,19 +12,15 @@ dialog.
  • by creating a group of elements of the selected type from all such elements of the chosen geometrical object - Group on geometry tab of \ref creating_groups_page "Create group" dialog.
  • -
  • by creating a group including all types of elements from an existing geometrical object - using \subpage create_groups_from_geometry_page "Create Groups from Geometry" dialog.
  • -
  • by creating several groups of elements (nodes, edges, faces and volumes) from the chosen submesh - using Mesh -> Construct Group Menu item. In this case groups of elements are created automatically.
  • -
  • by creating groups of entities from existing groups of superior dimensions - using \subpage group_of_underlying_elements_page "Create Group of Underlying Elements" dialog.
  • - @@ -32,12 +28,12 @@ The created groups can be later:
    • \subpage editing_groups_page "Edited"
    • -
    • \subpage using_operations_on_groups_page "Subjected to Boolean operations", or
    • +
    • \subpage using_operations_on_groups_page "Subjected to Boolean operations"
    • \subpage deleting_groups_page "Deleted"
    An important tool, providing filters for creation of \b Standalone -groups is \subpage selection_filter_library_page. +groups is \subpage selection_filter_library_page. */ diff --git a/doc/salome/gui/SMESH/input/make_2dmesh_from_3d.doc b/doc/salome/gui/SMESH/input/make_2dmesh_from_3d.doc new file mode 100644 index 000000000..f4b5b2ba5 --- /dev/null +++ b/doc/salome/gui/SMESH/input/make_2dmesh_from_3d.doc @@ -0,0 +1,22 @@ +/*! + +\page make_2dmesh_from_3d_page Generate the skin elements (2D) of a mesh having 3D elements + +\n This functionality allows to generate 2D mesh elements as a skin +on the existing 3D mesh elements. + +To generate 2D mesh: +
      +
    1. From the Modification menu choose "Create 2D mesh from 3D" +item, or choose from the popup menu. + +\image html 2d_from_3d_menu.png + +The algorithm detects boundary volume faces without connections to +other volumes and creates 2D mesh elements on face nodes. If the mesh +already contains 2D elements on the detected nodes, new elements are not +created. The the resulting dialog shows mesh information statistics +about the newly created 2D mesh elements. +
    + +*/ diff --git a/doc/salome/gui/SMESH/input/mesh_infos.doc b/doc/salome/gui/SMESH/input/mesh_infos.doc index 75b934c2e..7b855c42c 100644 --- a/doc/salome/gui/SMESH/input/mesh_infos.doc +++ b/doc/salome/gui/SMESH/input/mesh_infos.doc @@ -44,11 +44,6 @@ The following information will be displayed: \image html advanced_mesh_infos.png -In case you get Mesh Infos via a \ref tui_viewing_mesh_infos "TUI script", -the information is displayed in Python Console. - -\image html b-mesh_infos.png -
    \anchor mesh_element_info_anchor

    Mesh Element Info

    @@ -61,4 +56,7 @@ the Viewer. \image html eleminfo2.png +In case you get Mesh Infos via a TUI script the information is displayed in Python Console. +See the \ref tui_viewing_mesh_infos "TUI Example", + */ \ No newline at end of file diff --git a/doc/salome/gui/SMESH/input/modifying_meshes.doc b/doc/salome/gui/SMESH/input/modifying_meshes.doc index f7a882524..cf63ff5f4 100644 --- a/doc/salome/gui/SMESH/input/modifying_meshes.doc +++ b/doc/salome/gui/SMESH/input/modifying_meshes.doc @@ -45,9 +45,11 @@ of the selected node or edge.
  • Apply \subpage pattern_mapping_page "pattern mapping".
  • \subpage convert_to_from_quadratic_mesh_page "Convert regular mesh to quadratic", or vice versa.
  • +
  • \subpage make_2dmesh_from_3d_page "Create 2D mesh from 3D".
  • + \note It is possible to use the variables defined in the SALOME \b NoteBook to specify the numerical parameters used for modification of any object. -*/ \ No newline at end of file +*/ diff --git a/doc/salome/gui/SMESH/input/netgen_2d_3d_hypo.doc b/doc/salome/gui/SMESH/input/netgen_2d_3d_hypo.doc index 0c872d32b..bbb7c59ff 100644 --- a/doc/salome/gui/SMESH/input/netgen_2d_3d_hypo.doc +++ b/doc/salome/gui/SMESH/input/netgen_2d_3d_hypo.doc @@ -2,7 +2,7 @@ \page netgen_2d_3d_hypo_page Netgen 2D and 3D hypotheses -\n Netgen 2D and Netgen 3D hypotheses work only with Netgen 1D-2D and +Netgen 2D and Netgen 3D hypotheses work only with Netgen 1D-2D and Netgen 1D-2D-3D algorithms. These algorithms do not require definition of lower-level hypotheses and algorithms (2D and 1D for meshing 3D objects and 1D for meshing 2D objects). They prove to be @@ -11,68 +11,64 @@ of the meshed object. \image html netgen2d.png -
      -
    • Name - allows to define the name for the algorithm (Netgen -2D (or 3D) Parameters by default).
    • -
    • Max Size - maximum linear dimensions for mesh cells.
    • -
    • Second Order - if this box is checked in, the algorithm will +- Name - allows to define the name for the algorithm (Netgen +2D (or 3D) Parameters by default). +- Max Size - maximum linear dimensions for mesh cells. +- Second Order - if this box is checked in, the algorithm will create second order nodes on the mesh, which actually will become -\ref adding_quadratic_elements_page "Quadratic".
    • -
    • Fineness - ranging from Very Coarse to Very Fine allows to set the +\ref adding_quadratic_elements_page "Quadratic". +- Fineness - ranging from Very Coarse to Very Fine allows to set the level of meshing detalization using the three parameters below. You -can select Custom to define them manually.
    • -
    • Growth rate - allows to define how much the linear dimensions of -two adjacent cells can differ (i.e. 0.3 means 30%).
    • -
    • Nb. Segs per Edge and Nb Segs per Radius - allows to define the +can select Custom to define them manually. +- Growth rate - allows to define how much the linear dimensions of +two adjacent cells can differ (i.e. 0.3 means 30%). +- Nb. Segs per Edge and Nb Segs per Radius - allows to define the minimum number of mesh segments in which edges and radiuses will be -split.
    • -
    • Allow Quadrangles - allows to use quadrangle elements in a +split. +- Allow Quadrangles - allows to use quadrangle elements in a triangle 2D mesh. This checkbox is not present in Netgen 3D parameters because currently building a tetrahedral mesh with quadrangle faces is -not possible.
    • -
    • Optimize - if this box is checked in, the algorithm will try to -create regular (possessing even sides) elements.
    • -
    +not possible. +- Optimize - if this box is checked in, the algorithm will try to +create regular (possessing even sides) elements. \image html netgen3d_simple.png -Netgen 2D simple parameters and Netgen 3D simple parameters allow defining the size of elements for each dimension.
    +Netgen 2D simple parameters and Netgen 3D simple +parameters allow defining the size of elements for each +dimension. \b 1D group allows defining the size of 1D elements in either of two ways: -
      -
    • Number of Segments has the same sense as \ref +- Number of Segments has the same sense as \ref number_of_segments_anchor "Number of segments" hypothesis with -equidistant distribution.
    • -
    • Average Length has the same sense as \ref -average_length_anchor "Average Length" hypothesis.
    • -
    +equidistant distribution. +- Average Length has the same sense as \ref +average_length_anchor "Average Length" hypothesis. \b 2D group allows defining the size of 2D elements -
      -
    • Length from edges if checked in, acts like \ref -length_from_edges_anchor "Length from Edges" hypothesis, else
    • -
    • Max. Element Area defines the maximum element area like \ref -max_element_area_anchor "Max Element Area" hypothesis.
    • -
    +- Length from edges if checked in, acts like \ref +length_from_edges_anchor "Length from Edges" hypothesis, else +- Max. Element Area defines the maximum element area like \ref +max_element_area_anchor "Max Element Area" hypothesis. \b 3D groups allows defining the size of 3D elements. -
      -
    • Length from faces if checked in, the area of sides of -volumic elements will be equal to an average area of 2D elements, else
    • -
    • Max. Element Volume defines the maximum element volume like +- Length from faces if checked in, the area of sides of +volumic elements will be equal to an average area of 2D elements, else +- Max. Element Volume defines the maximum element volume like \ref max_element_volume_hypo_page "Max Element Volume" -hypothesis.
    • -
      -
    • Click \b Apply or Apply and Close button to confirm the -operation.
    • - +
    • Click \b Apply or Apply and Close button to confirm the operation.
    • - -
      See Also a sample TUI Script of a -\ref tui_translation "Translation" operation. +
      See Also a sample TUI Script of a \ref tui_translation "Translation" operation. */ diff --git a/doc/salome/gui/SMESH/input/tui_creating_meshes.doc b/doc/salome/gui/SMESH/input/tui_creating_meshes.doc index 9048afef1..87f740e98 100644 --- a/doc/salome/gui/SMESH/input/tui_creating_meshes.doc +++ b/doc/salome/gui/SMESH/input/tui_creating_meshes.doc @@ -2,7 +2,7 @@ \page tui_creating_meshes_page Creating Meshes -\n First of all see \ref introduction_to_mesh_python_page "Example of 3d mesh generation", +\n First of all see \ref example_3d_mesh "Example of 3d mesh generation", which is an example of good python script style for Mesh module.
      diff --git a/doc/salome/gui/SMESH/input/tui_defining_blsurf_hypotheses.doc b/doc/salome/gui/SMESH/input/tui_defining_blsurf_hypotheses.doc index 346e6781c..3faba3da5 100644 --- a/doc/salome/gui/SMESH/input/tui_defining_blsurf_hypotheses.doc +++ b/doc/salome/gui/SMESH/input/tui_defining_blsurf_hypotheses.doc @@ -19,6 +19,11 @@ Face_1 = geompy.SubShapeAllSorted(box, geompy.ShapeType["FACE"])[0] Edge_1 = geompy.SubShapeAllSorted(box, geompy.ShapeType["EDGE"])[0] Vertex_1 = geompy.SubShapeAllSorted(box, geompy.ShapeType["VERTEX"])[0] +# /!\ Geom object with sizemaps on them must be published in study +geompy.addToStudyInFather(box,Face_1, "Face_1") +geompy.addToStudyInFather(box,Edge_1, "Edge_1") +geompy.addToStudyInFather(box,Vertex_1, "Vertex_1") + # create a mesh on the box blsurfMesh = smesh.Mesh(box,"box: BLSurf mesh") @@ -43,6 +48,39 @@ BLSURF_Parameters.SetSizeMap(Vertex_1, 'def f(): return 2' ) # compute the mesh blsurfMesh.Compute() + +# Add enforced vertex for Face_1 on (50, 50, 50) +# The projection coordinates will be (50, 50, 0) +BLSURF_Parameters.SetEnforcedVertex(Face_1, 50, 50, 50) + +# Add another enforced vertex on (150, 150, 150) +BLSURF_Parameters.SetEnforcedVertex(Face_1, 150, 150, 150) + +# Retrieve and print the list of enforced vertices defines on Face_1 +enfList = BLSURF_Parameters.GetEnforcedVertices(Face_1) +print "List of enforced vertices for Face_1: " +print enfList + +# compute the mesh +blsurfMesh.Compute() + +# Remove an enforced vertex and print the list +BLSURF_Parameters.UnsetEnforcedVertex(Face_1, 50, 50, 50) +enfList = BLSURF_Parameters.GetEnforcedVertices(Face_1) +print "List of enforced vertices for Face_1: " +print enfList + +# compute the mesh +blsurfMesh.Compute() + +# Remove all enforced vertices defined on Face_1 +BLSURF_Parameters.UnsetEnforcedVertices(Face_1) + +# compute the mesh +blsurfMesh.Compute() + +# End of script + \endcode */ \ No newline at end of file diff --git a/doc/salome/gui/SMESH/input/tui_defining_ghs3d_hypotheses.doc b/doc/salome/gui/SMESH/input/tui_defining_ghs3d_hypotheses.doc new file mode 100644 index 000000000..57a6aaf88 --- /dev/null +++ b/doc/salome/gui/SMESH/input/tui_defining_ghs3d_hypotheses.doc @@ -0,0 +1,45 @@ +/*! + +\page tui_defining_ghs3d_hypotheses_page Defining Hypotheses for Ghs3D Algorithm + +\anchor tui_ghs3d +

      Construction of Mesh using Ghs3D algorithm

      + +\code +import geompy +import smesh +import BLSURFPlugin +import GHS3DPlugin + +# create a box +box = geompy.MakeBoxDXDYDZ(200., 200., 200.) +geompy.addToStudy(box, "box") + +# create a mesh on the box +ghs3dMesh = smesh.Mesh(box,"box: Ghs3D and BLSurf mesh") + +# create a BLSurf algorithm for faces +BLSURF = ghs3dMesh.Triangle(algo=smesh.BLSURF) + +# create a Ghs3D algorithm for volume +GHS3D = ghs3dMesh.Tetrahedron(algo=smesh.GHS3D) + +# get Ghs3D algorithm hypothesis +GHS3D_Parameters = GHS3D.Parameters() + +# define an enforced vertex at (50,50,100) with a physical size of 2 +GHS3D_Parameters.SetEnforcedVertex( 50, 50, 100, 2 ) + +# define an enforced vertex at (150,150,100) with a physical size of 5 +GHS3D_Parameters.SetEnforcedVertex( 150, 150, 100, 5 ) + +# compute the mesh +ghs3dMesh.Compute() + +# End of script + +\endcode + +\image html ghs3d_enforced_vertices_screenshot.png + +*/ \ No newline at end of file diff --git a/doc/salome/gui/SMESH/input/tui_defining_hypotheses.doc b/doc/salome/gui/SMESH/input/tui_defining_hypotheses.doc index 8c93ca2e3..04725fdc6 100644 --- a/doc/salome/gui/SMESH/input/tui_defining_hypotheses.doc +++ b/doc/salome/gui/SMESH/input/tui_defining_hypotheses.doc @@ -468,9 +468,83 @@ src_mesh.TranslateObject( src_mesh, MakeDirStruct( 210, 0, 0 ), Copy=False) \endcode +
      + +\anchor tui_fixed_points + +

      1D Mesh with Fixed Points example

      + +\code +import salome +import geompy +import smesh +import StdMeshers + +# Create face and explode it on edges +face = geompy.MakeFaceHW(100, 100, 1) +edges = geompy.SubShapeAllSorted(face, geompy.ShapeType["EDGE"]) +geompy.addToStudy( face, "Face" ) + +# get the first edge from exploded result +edge1 = geompy.GetSubShapeID(face, edges[0]) + +# Define Mesh on previously created face +Mesh_1 = smesh.Mesh(face) + +# Create Fixed Point 1D hypothesis and define parameters. +# Note: values greater than 1.0 and less than 0.0 are not taken into account; +# duplicated values are removed. Also, if not specified explicitly, values 0.0 and 1.0 +# add added automatically. +# The number of segments should correspond to the number of points (NbSeg = NbPnt-1); +# extra values of segments splitting parameter are not taken into account, +# while missing values are considered to be equal to 1. +Fixed_points_1D_1 = smesh.CreateHypothesis('FixedPoints1D') +Fixed_points_1D_1.SetPoints( [ 1.1, 0.9, 0.5, 0.0, 0.5, -0.3 ] ) +Fixed_points_1D_1.SetNbSegments( [ 3, 1, 2 ] ) +Fixed_points_1D_1.SetReversedEdges( [edge1] ) + +# Add hypothesis to mesh and define 2D parameters +Mesh_1.AddHypothesis(Fixed_points_1D_1) +Regular_1D = Mesh_1.Segment() +Quadrangle_2D = Mesh_1.Quadrangle() +# Compute mesh +Mesh_1.Compute() +\endcode + +\anchor tui_radial_quadrangle +

      Radial Quadrangle 1D2D example

      +\code +import salome +import geompy +import smesh +import StdMeshers + +# Create face from the wire and add to study +WirePath = geompy.MakeSketcher("Sketcher:F 0 0:TT 20 0:R 90:C 20 90:WW", [0, 0, 0, 1, 0, 0, 0, 0, 1]) +Face = geompy.MakeFace(WirePath,1) +geompy.addToStudy(Face,"Face") + +# Define geometry for mesh, and 1D parameters +mesh = smesh.Mesh(Face) +Wire_discretisation = mesh.Segment() +Nb_Segments = Wire_discretisation.NumberOfSegments(5) +Nb_Segments.SetDistrType( 0 ) + +# Define 2D parameters and Radial Quadrange hypothesis +Number_of_Layers = smesh.CreateHypothesis('NumberOfLayers2D') +Number_of_Layers.SetNumberOfLayers( 4 ) +mesh.AddHypothesis(Number_of_Layers) +RadialQuadrangle_1D2D = smesh.CreateHypothesis('RadialQuadrangle_1D2D') +mesh.AddHypothesis(RadialQuadrangle_1D2D) + +mesh.Compute() +\endcode + + \n Other meshing algorithms:
      • \subpage tui_defining_blsurf_hypotheses_page
      • +
      • \subpage tui_defining_ghs3d_hypotheses_page
      */ diff --git a/doc/salome/gui/SMESH/input/tui_grouping_elements.doc b/doc/salome/gui/SMESH/input/tui_grouping_elements.doc index e03433f1c..b77edd21e 100644 --- a/doc/salome/gui/SMESH/input/tui_grouping_elements.doc +++ b/doc/salome/gui/SMESH/input/tui_grouping_elements.doc @@ -1,4 +1,4 @@ -/*! + /*! \page tui_grouping_elements_page Grouping Elements @@ -318,13 +318,13 @@ salome.sg.updateObjBrowser(1) \endcode \image html dimgroup_tui1.png -
      Source groups of faces<\center> +
      Source groups of faces
      \image html dimgroup_tui2.png -
      Result groups of edges and nodes<\center> +
      Result groups of edges and nodes
      -*/ \ No newline at end of file +*/ diff --git a/doc/salome/gui/SMESH/input/tui_modifying_meshes.doc b/doc/salome/gui/SMESH/input/tui_modifying_meshes.doc index bc7b78c89..66b6361fa 100644 --- a/doc/salome/gui/SMESH/input/tui_modifying_meshes.doc +++ b/doc/salome/gui/SMESH/input/tui_modifying_meshes.doc @@ -815,4 +815,48 @@ isDone = pattern.MakeMesh(Mesh_1.GetMesh(), 0, 0) if (isDone != 1): print 'MakeMesh :', pattern.GetErrorCode() \endcode -*/ \ No newline at end of file +
      +\anchor tui_quadratic +

      Convert mesh to/from quadratic

      + +\code +import geompy +import smesh + +# create sphere of radius 100 + +Sphere = geompy.MakeSphereR( 100 ) +geompy.addToStudy( Sphere, "Sphere" ) + +# create simple trihedral mesh + +Mesh = smesh.Mesh(Sphere) +Regular_1D = Mesh.Segment() +Nb_Segments = Regular_1D.NumberOfSegments(5) +MEFISTO_2D = Mesh.Triangle() +Tetrahedron_Netgen = Mesh.Tetrahedron(algo=smesh.NETGEN) + +# compute mesh + +isDone = Mesh.Compute() + +# convert to quadratic +# theForce3d = 1; this results in the medium node lying at the +# middle of the line segments connecting start and end node of a mesh +# element + +Mesh.ConvertToQuadratic( theForce3d=1 ) + +# revert back to the non-quadratic mesh + +Mesh.ConvertFromQuadratic() + +# convert to quadratic +# theForce3d = 0; this results in the medium node lying at the +# geometrical edge from which the mesh element is built + +Mesh.ConvertToQuadratic( theForce3d=0 ) + +\endcode + +*/ diff --git a/doc/salome/gui/SMESH/input/tui_viewing_meshes.doc b/doc/salome/gui/SMESH/input/tui_viewing_meshes.doc index 59681c16b..862cb302e 100644 --- a/doc/salome/gui/SMESH/input/tui_viewing_meshes.doc +++ b/doc/salome/gui/SMESH/input/tui_viewing_meshes.doc @@ -9,10 +9,12 @@ \code import geompy import smesh +import SMESH # create a box box = geompy.MakeBox(0., 0., 0., 20., 20., 20.) geompy.addToStudy(box, "box") +[Face_1,Face_2,Face_3,Face_4,Face_5,Face_5] = geompy.SubShapeAll(box, geompy.ShapeType["FACE"]) # create a mesh tetra = smesh.Mesh(box, "MeshBox") @@ -26,10 +28,22 @@ algo2D.MaxElementArea(10.) algo3D = tetra.Tetrahedron(smesh.NETGEN) algo3D.MaxElementVolume(900.) +# Creation of SubMesh +Regular_1D_1_1 = tetra.Segment(geom=Face_1) +Nb_Segments_1 = Regular_1D_1_1.NumberOfSegments(5) +Nb_Segments_1.SetDistrType( 0 ) +Quadrangle_2D = tetra.Quadrangle(geom=Face_1) +isDone = tetra.Compute() +submesh = Regular_1D_1_1.GetSubMesh() + # compute the mesh tetra.Compute() -# print information about the mesh +# Creation of group +group = tetra.CreateEmptyGroup( SMESH.FACE, 'Group' ) +nbAdd = group.Add( [ 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76 ] ) + +# Print information about the mesh print "Information about mesh:" print "Number of nodes : ", tetra.NbNodes() print "Number of edges : ", tetra.NbEdges() @@ -43,5 +57,30 @@ print " hexahedrons : ", tetra.NbHexas() print " prisms : ", tetra.NbPrisms() print " pyramids : ", tetra.NbPyramids() print " polyhedrons : ", tetra.NbPolyhedrons() + +# Get Information About Mesh by GetMeshInfo +print "\nInformation about mesh by GetMeshInfo:" +info = smesh.GetMeshInfo(tetra) +keys = info.keys(); keys.sort() +for i in keys: + print " %s : %d" % ( i, info[i] ) + pass + +# Get Information About Group by GetMeshInfo +print "\nInformation about group by GetMeshInfo:" +info = smesh.GetMeshInfo(group) +keys = info.keys(); keys.sort() +for i in keys: + print " %s : %d" % ( i, info[i] ) + pass + +# Get Information About SubMesh by GetMeshInfo +print "\nInformation about Submesh by GetMeshInfo:" +info = smesh.GetMeshInfo(submesh) +keys = info.keys(); keys.sort() +for i in keys: + print " %s : %d" % ( i, info[i] ) + pass \endcode -*/ \ No newline at end of file + +*/ diff --git a/doc/salome/gui/SMESH/input/viewing_meshes_overview.doc b/doc/salome/gui/SMESH/input/viewing_meshes_overview.doc index 01a272de2..ee4c6dd4a 100644 --- a/doc/salome/gui/SMESH/input/viewing_meshes_overview.doc +++ b/doc/salome/gui/SMESH/input/viewing_meshes_overview.doc @@ -38,7 +38,7 @@ meshes.
    • \subpage transparency_page "Transparency" - allows to change the transparency of mesh elements.
    • \subpage clipping_page "Clipping" - allows to create cross-sections of the selected objects.
    • -
    • \ref about_quality_controls_page "Controls" - graphically +
    • \ref quality_page "Controls" - graphically presents various information about meshes.
    • Hide - allows to hide the selected mesh from the viewer.
    • Show Only -allows to display only the selected mesh, hiding all other from the viewer.
    • diff --git a/idl/SMESH_Mesh.idl b/idl/SMESH_Mesh.idl index fff0c5120..8a5c37daa 100644 --- a/idl/SMESH_Mesh.idl +++ b/idl/SMESH_Mesh.idl @@ -46,7 +46,6 @@ module SMESH enum log_command { ADD_NODE, - ADD_ELEM0D, ADD_EDGE, ADD_TRIANGLE, ADD_QUADRANGLE, @@ -69,7 +68,8 @@ module SMESH ADD_QUADTETRAHEDRON, ADD_QUADPYRAMID, ADD_QUADPENTAHEDRON, - ADD_QUADHEXAHEDRON + ADD_QUADHEXAHEDRON, + ADD_ELEM0D }; struct log_block diff --git a/idl/SMESH_MeshEditor.idl b/idl/SMESH_MeshEditor.idl index 198275ed8..62623567a 100644 --- a/idl/SMESH_MeshEditor.idl +++ b/idl/SMESH_MeshEditor.idl @@ -614,6 +614,18 @@ module SMESH */ long MoveClosestNodeToPoint(in double x, in double y, in double z, in long nodeID); + /*! + * Return ID of node closest to a given point + */ + long FindNodeClosestTo(in double x, in double y, in double z); + + /*! + * Return elements of given type where the given point is IN or ON. + * + * 'ALL' type means elements of any type excluding nodes and 0D elements + */ + long_array FindElementsByPoint(in double x, in double y, in double z, in ElementType type); + enum Sew_Error { SEW_OK, SEW_BORDER1_NOT_FOUND, @@ -684,6 +696,49 @@ module SMESH * not creared - returns empty list */ long_array GetLastCreatedElems(); + + /*! + * \brief Creates a hole in a mesh by doubling the nodes of some particular elements + * \param theNodes - identifiers of nodes to be doubled + * \param theModifiedElems - identifiers of elements to be updated by the new (doubled) + * nodes. If list of element identifiers is empty then nodes are doubled but + * they not assigned to elements + * \return TRUE if operation has been completed successfully, FALSE otherwise + * \sa DoubleNode(), DoubleNodeGroup(), DoubleNodeGroups() + */ + boolean DoubleNodes( in long_array theNodes, in long_array theModifiedElems ); + + /*! + * \brief Creates a hole in a mesh by doubling the nodes of some particular elements + * This method provided for convenience works as DoubleNodes() described above. + * \param theNodeId - identifier of node to be doubled. + * \param theModifiedElems - identifiers of elements to be updated. + * \return TRUE if operation has been completed successfully, FALSE otherwise + * \sa DoubleNodes(), DoubleNodeGroup(), DoubleNodeGroups() + */ + boolean DoubleNode( in long theNodeId, in long_array theModifiedElems ); + + /*! + * \brief Creates a hole in a mesh by doubling the nodes of some particular elements + * This method provided for convenience works as DoubleNodes() described above. + * \param theNodes - group of nodes to be doubled. + * \param theModifiedElems - group of elements to be updated. + * \return TRUE if operation has been completed successfully, FALSE otherwise + * \sa DoubleNode(), DoubleNodes(), DoubleNodeGroups() + */ + boolean DoubleNodeGroup( in SMESH_GroupBase theNodes, + in SMESH_GroupBase theModifiedElems ); + + /*! + \brief Creates a hole in a mesh by doubling the nodes of some particular elements + This method provided for convenience works as DoubleNodes() described above. + \param theNodes - list of groups of nodes to be doubled + \param theModifiedElems - list of groups of elements to be updated. + \return TRUE if operation has been completed successfully, FALSE otherwise + \sa DoubleNode(), DoubleNodeGroup(), DoubleNodes() + */ + boolean DoubleNodeGroups( in ListOfGroups theNodes, + in ListOfGroups theModifiedElems ); /*! * \brief Creates a hole in a mesh by doubling the nodes of some particular elements @@ -695,9 +750,9 @@ module SMESH * \return TRUE if operation has been completed successfully, FALSE otherwise * \sa DoubleNodeGroup(), DoubleNodeGroups() */ - boolean DoubleNodes( in long_array theElems, - in long_array theNodesNot, - in long_array theAffectedElems ); + boolean DoubleNodeElem( in long_array theElems, + in long_array theNodesNot, + in long_array theAffectedElems ); /*! * \brief Creates a hole in a mesh by doubling the nodes of some particular elements @@ -710,9 +765,9 @@ module SMESH * \return TRUE if operation has been completed successfully, FALSE otherwise * \sa DoubleNodeGroupInRegion(), DoubleNodeGroupsInRegion() */ - boolean DoubleNodesInRegion( in long_array theElems, - in long_array theNodesNot, - in GEOM::GEOM_Object theShape ); + boolean DoubleNodeElemInRegion( in long_array theElems, + in long_array theNodesNot, + in GEOM::GEOM_Object theShape ); /*! * \brief Creates a hole in a mesh by doubling the nodes of some particular elements @@ -724,9 +779,9 @@ module SMESH * \return TRUE if operation has been completed successfully, FALSE otherwise * \sa DoubleNodes(), DoubleNodeGroups() */ - boolean DoubleNodeGroup( in SMESH_GroupBase theElems, - in SMESH_GroupBase theNodesNot, - in SMESH_GroupBase theAffectedElems ); + boolean DoubleNodeElemGroup( in SMESH_GroupBase theElems, + in SMESH_GroupBase theNodesNot, + in SMESH_GroupBase theAffectedElems ); /*! * \brief Creates a hole in a mesh by doubling the nodes of some particular elements @@ -739,7 +794,7 @@ module SMESH * \return TRUE if operation has been completed successfully, FALSE otherwise * \sa DoubleNodesInRegion(), DoubleNodeGroupsInRegion() */ - boolean DoubleNodeGroupInRegion( in SMESH_GroupBase theElems, + boolean DoubleNodeElemGroupInRegion( in SMESH_GroupBase theElems, in SMESH_GroupBase theNodesNot, in GEOM::GEOM_Object theShape ); @@ -753,9 +808,9 @@ module SMESH * \return TRUE if operation has been completed successfully, FALSE otherwise * \sa DoubleNodeGroup(), DoubleNodes() */ - boolean DoubleNodeGroups( in ListOfGroups theElems, - in ListOfGroups theNodesNot, - in ListOfGroups theAffectedElems ); + boolean DoubleNodeElemGroups( in ListOfGroups theElems, + in ListOfGroups theNodesNot, + in ListOfGroups theAffectedElems ); /*! * \brief Creates a hole in a mesh by doubling the nodes of some particular elements @@ -768,9 +823,16 @@ module SMESH * \return TRUE if operation has been completed successfully, FALSE otherwise * \sa DoubleNodeGroupInRegion(), DoubleNodesInRegion() */ - boolean DoubleNodeGroupsInRegion( in ListOfGroups theElems, - in ListOfGroups theNodesNot, - in GEOM::GEOM_Object theShape ); + boolean DoubleNodeElemGroupsInRegion( in ListOfGroups theElems, + in ListOfGroups theNodesNot, + in GEOM::GEOM_Object theShape ); + + /*! + * \brief Generated skin mesh (containing 2D cells) from 3D mesh + * The created 2D mesh elements based on nodes of free faces of boundary volumes + * \return TRUE if operation has been completed successfully, FALSE otherwise + */ + boolean Make2DMeshFrom3D(); }; }; diff --git a/resources/Makefile.am b/resources/Makefile.am index 2ebd83edf..3fb97d2ae 100644 --- a/resources/Makefile.am +++ b/resources/Makefile.am @@ -165,6 +165,7 @@ dist_salomeres_DATA = \ mesh_tree_mesh_partial.png \ mesh_extractGroup.png \ mesh_precompute.png \ + mesh_2d_from_3d.png \ mesh_free_faces.png # VSR: little trick to avoid putting if SMESHCatalog.xml to the distribution archive diff --git a/resources/mesh_2d_from_3d.png b/resources/mesh_2d_from_3d.png new file mode 100644 index 0000000000000000000000000000000000000000..b0842d3e73e58ae3f2e20c134107040d26ef2309 GIT binary patch literal 406 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85pG3gD_*9)I=GeAbW|YuPggaPEHOH!yof}vVo?EdAc};Se#xu z*)i*ogGk%{iSrgef5CW%rRiXAntI2MGj0+#&Cd&8b5=E7@)eBAaLv*>r;?GjYsSP` zN2ZzBNmSTWe6IgrZG0%|wC=@+$9Ak1YZ2(3ux9HbH-(lBK~hUh82(HP&p&kjpqXWm z)azR@@yoY)LBMpJf`v xm)@x6ULQ62x9*xS{;g>Y4>wBH&&#S|PAz#d@x!?pzkq?p;OXk;vd$@?2>>-xsBHiM literal 0 HcmV?d00001 diff --git a/src/Controls/SMESH_Controls.cxx b/src/Controls/SMESH_Controls.cxx index cc390e500..996cb7604 100644 --- a/src/Controls/SMESH_Controls.cxx +++ b/src/Controls/SMESH_Controls.cxx @@ -149,21 +149,21 @@ namespace{ // SMDS_ElemIteratorPtr anIter = anEdge->nodesIterator(); // if ( anIter != 0 ) { // while( anIter->more() ) { -// const SMDS_MeshNode* aNode = (SMDS_MeshNode*)anIter->next(); -// if ( aNode == 0 ) -// return 0; -// SMDS_ElemIteratorPtr anElemIter = aNode->GetInverseElementIterator(); -// while( anElemIter->more() ) { -// const SMDS_MeshElement* anElem = anElemIter->next(); -// if ( anElem != 0 && anElem->GetType() != SMDSAbs_Edge ) { -// int anId = anElem->GetID(); - -// if ( anIter->more() ) // i.e. first node -// aMap.Add( anId ); -// else if ( aMap.Contains( anId ) ) -// aResult++; -// } -// } +// const SMDS_MeshNode* aNode = (SMDS_MeshNode*)anIter->next(); +// if ( aNode == 0 ) +// return 0; +// SMDS_ElemIteratorPtr anElemIter = aNode->GetInverseElementIterator(); +// while( anElemIter->more() ) { +// const SMDS_MeshElement* anElem = anElemIter->next(); +// if ( anElem != 0 && anElem->GetType() != SMDSAbs_Edge ) { +// int anId = anElem->GetID(); + +// if ( anIter->more() ) // i.e. first node +// aMap.Add( anId ); +// else if ( aMap.Contains( anId ) ) +// aResult++; +// } +// } // } // } @@ -476,9 +476,9 @@ namespace{ inline double getArea(double theHalfPerim, double theTria[3]){ return sqrt(theHalfPerim* - (theHalfPerim-theTria[0])* - (theHalfPerim-theTria[1])* - (theHalfPerim-theTria[2])); + (theHalfPerim-theTria[0])* + (theHalfPerim-theTria[1])* + (theHalfPerim-theTria[2])); } inline double getVolume(double theLen[6]){ @@ -1036,160 +1036,160 @@ double Length2D::GetValue( long theElementId) case SMDSAbs_Node: case SMDSAbs_Edge: if (len == 2){ - aVal = getDistance( P( 1 ), P( 2 ) ); + aVal = getDistance( P( 1 ), P( 2 ) ); break; } else if (len == 3){ // quadratic edge - aVal = getDistance(P( 1 ),P( 3 )) + getDistance(P( 3 ),P( 2 )); + aVal = getDistance(P( 1 ),P( 3 )) + getDistance(P( 3 ),P( 2 )); break; } case SMDSAbs_Face: if (len == 3){ // triangles - double L1 = getDistance(P( 1 ),P( 2 )); - double L2 = getDistance(P( 2 ),P( 3 )); - double L3 = getDistance(P( 3 ),P( 1 )); - aVal = Max(L1,Max(L2,L3)); - break; + double L1 = getDistance(P( 1 ),P( 2 )); + double L2 = getDistance(P( 2 ),P( 3 )); + double L3 = getDistance(P( 3 ),P( 1 )); + aVal = Max(L1,Max(L2,L3)); + break; } else if (len == 4){ // quadrangles - double L1 = getDistance(P( 1 ),P( 2 )); - double L2 = getDistance(P( 2 ),P( 3 )); - double L3 = getDistance(P( 3 ),P( 4 )); - double L4 = getDistance(P( 4 ),P( 1 )); - aVal = Max(Max(L1,L2),Max(L3,L4)); - break; + double L1 = getDistance(P( 1 ),P( 2 )); + double L2 = getDistance(P( 2 ),P( 3 )); + double L3 = getDistance(P( 3 ),P( 4 )); + double L4 = getDistance(P( 4 ),P( 1 )); + aVal = Max(Max(L1,L2),Max(L3,L4)); + break; } if (len == 6){ // quadratic triangles - double L1 = getDistance(P( 1 ),P( 2 )) + getDistance(P( 2 ),P( 3 )); - double L2 = getDistance(P( 3 ),P( 4 )) + getDistance(P( 4 ),P( 5 )); - double L3 = getDistance(P( 5 ),P( 6 )) + getDistance(P( 6 ),P( 1 )); - aVal = Max(L1,Max(L2,L3)); + double L1 = getDistance(P( 1 ),P( 2 )) + getDistance(P( 2 ),P( 3 )); + double L2 = getDistance(P( 3 ),P( 4 )) + getDistance(P( 4 ),P( 5 )); + double L3 = getDistance(P( 5 ),P( 6 )) + getDistance(P( 6 ),P( 1 )); + aVal = Max(L1,Max(L2,L3)); //cout<<"L1="< + using namespace std; Driver_Mesh::Status DriverDAT_R_SMDS_Mesh::Perform() { + Kernel_Utils::Localizer loc; Status aResult = DRS_OK; int i, j; diff --git a/src/DriverDAT/DriverDAT_W_SMDS_Mesh.cxx b/src/DriverDAT/DriverDAT_W_SMDS_Mesh.cxx index 91b06d6b1..54741eac3 100644 --- a/src/DriverDAT/DriverDAT_W_SMDS_Mesh.cxx +++ b/src/DriverDAT/DriverDAT_W_SMDS_Mesh.cxx @@ -27,10 +27,13 @@ #include "utilities.h" +#include + using namespace std; Driver_Mesh::Status DriverDAT_W_SMDS_Mesh::Perform() { + Kernel_Utils::Localizer loc; Status aResult = DRS_OK; int nbNodes, nbCells; diff --git a/src/DriverDAT/Makefile.am b/src/DriverDAT/Makefile.am index e681fa4f0..2a4dead05 100644 --- a/src/DriverDAT/Makefile.am +++ b/src/DriverDAT/Makefile.am @@ -66,6 +66,7 @@ libMeshDriverDAT_la_CPPFLAGS = \ libMeshDriverDAT_la_LDFLAGS = \ ../Driver/libMeshDriver.la \ + $(KERNEL_LDFLAGS) -lSALOMEBasics \ $(CAS_KERNEL) DAT_Test_CPPFLAGS = \ diff --git a/src/DriverMED/DriverMED_Family.cxx b/src/DriverMED/DriverMED_Family.cxx index 84fbf8937..ca31e7b9c 100644 --- a/src/DriverMED/DriverMED_Family.cxx +++ b/src/DriverMED/DriverMED_Family.cxx @@ -28,7 +28,7 @@ #include "DriverMED_Family.h" #include "MED_Factory.hxx" -#include +#include using namespace std; @@ -83,7 +83,7 @@ void DriverMED_Family ::SetType(const SMDSAbs_ElementType theType) { - myType = theType; + myTypes.insert( myType = theType ); } SMDSAbs_ElementType @@ -93,6 +93,13 @@ DriverMED_Family return myType; } +const std::set< SMDSAbs_ElementType >& +DriverMED_Family +::GetTypes() const +{ + return myTypes; +} + bool DriverMED_Family ::MemberOf(std::string theGroupName) const @@ -139,11 +146,11 @@ DriverMED_Family DriverMED_FamilyPtrList DriverMED_Family ::MakeFamilies(const SMESHDS_SubMeshPtrMap& theSubMeshes, - const SMESHDS_GroupBasePtrList& theGroups, - const bool doGroupOfNodes, - const bool doGroupOfEdges, - const bool doGroupOfFaces, - const bool doGroupOfVolumes) + const SMESHDS_GroupBasePtrList& theGroups, + const bool doGroupOfNodes, + const bool doGroupOfEdges, + const bool doGroupOfFaces, + const bool doGroupOfVolumes) { DriverMED_FamilyPtrList aFamilies; @@ -189,7 +196,7 @@ DriverMED_Family aFamilies.erase(aCurrIter); } if (aFam2->IsEmpty()) - break; + break; } } // The rest elements of family @@ -218,7 +225,7 @@ DriverMED_Family aFam1->Split(aFam2, aCommon); if (!aCommon->IsEmpty()) { - aCommon->SetGroupAttributVal(0); + aCommon->SetGroupAttributVal(0); aFamilies.push_back(aCommon); } if (aFam1->IsEmpty()) @@ -226,7 +233,7 @@ DriverMED_Family aFamilies.erase(aCurrIter); } if (aFam2->IsEmpty()) - break; + break; } } // The rest elements of group @@ -310,7 +317,7 @@ DriverMED_Family //============================================================================= MED::PFamilyInfo DriverMED_Family::GetFamilyInfo(const MED::PWrapper& theWrapper, - const MED::PMeshInfo& theMeshInfo) const + const MED::PMeshInfo& theMeshInfo) const { ostringstream aStr; aStr << "FAM_" << myId; @@ -332,20 +339,20 @@ DriverMED_Family::GetFamilyInfo(const MED::PWrapper& theWrapper, MED::PFamilyInfo anInfo; if(myId == 0 || myGroupAttributVal == 0){ anInfo = theWrapper->CrFamilyInfo(theMeshInfo, - aValue, - myId, - myGroupNames); + aValue, + myId, + myGroupNames); }else{ MED::TStringVector anAttrDescs (1, ""); // 1 attribute with empty description, MED::TIntVector anAttrIds (1, myId); // Id=0, MED::TIntVector anAttrVals (1, myGroupAttributVal); anInfo = theWrapper->CrFamilyInfo(theMeshInfo, - aValue, - myId, - myGroupNames, - anAttrDescs, - anAttrIds, - anAttrVals); + aValue, + myId, + myGroupNames, + anAttrDescs, + anAttrIds, + anAttrVals); } // cout << endl; @@ -413,7 +420,7 @@ void DriverMED_Family::Init (SMESHDS_GroupBase* theGroup) DriverMED_FamilyPtrList DriverMED_Family ::SplitByType (SMESHDS_SubMesh* theSubMesh, - const int theId) + const int theId) { DriverMED_FamilyPtrList aFamilies; DriverMED_FamilyPtr aNodesFamily (new DriverMED_Family); diff --git a/src/DriverMED/DriverMED_Family.h b/src/DriverMED/DriverMED_Family.h index 6ec769bba..ccc042b96 100644 --- a/src/DriverMED/DriverMED_Family.h +++ b/src/DriverMED/DriverMED_Family.h @@ -68,16 +68,16 @@ class MESHDRIVERMED_EXPORT DriverMED_Family static DriverMED_FamilyPtrList MakeFamilies (const SMESHDS_SubMeshPtrMap& theSubMeshes, - const SMESHDS_GroupBasePtrList& theGroups, - const bool doGroupOfNodes, - const bool doGroupOfEdges, - const bool doGroupOfFaces, - const bool doGroupOfVolumes); + const SMESHDS_GroupBasePtrList& theGroups, + const bool doGroupOfNodes, + const bool doGroupOfEdges, + const bool doGroupOfFaces, + const bool doGroupOfVolumes); //! Create TFamilyInfo for this family MED::PFamilyInfo GetFamilyInfo (const MED::PWrapper& theWrapper, - const MED::PMeshInfo& theMeshInfo) const; + const MED::PMeshInfo& theMeshInfo) const; //! Returns elements of this family const ElementsSet& GetElements () const; @@ -99,6 +99,7 @@ class MESHDRIVERMED_EXPORT DriverMED_Family void SetType(const SMDSAbs_ElementType theType); SMDSAbs_ElementType GetType(); + const std::set< SMDSAbs_ElementType >& GetTypes() const; bool MemberOf(std::string theGroupName) const; @@ -113,7 +114,7 @@ class MESHDRIVERMED_EXPORT DriverMED_Family static DriverMED_FamilyPtrList SplitByType(SMESHDS_SubMesh* theSubMesh, - const int theId); + const int theId); /*! Remove from elements, common with , @@ -121,7 +122,7 @@ class MESHDRIVERMED_EXPORT DriverMED_Family Create family from common elements, with combined groups list. */ void Split (DriverMED_FamilyPtr by, - DriverMED_FamilyPtr common); + DriverMED_FamilyPtr common); //! Check, if this family has empty list of elements bool IsEmpty () const; @@ -133,6 +134,7 @@ class MESHDRIVERMED_EXPORT DriverMED_Family ElementsSet myElements; MED::TStringSet myGroupNames; int myGroupAttributVal; + std::set myTypes; // Issue 0020576 }; #endif diff --git a/src/DriverMED/DriverMED_R_SMESHDS_Mesh.cxx b/src/DriverMED/DriverMED_R_SMESHDS_Mesh.cxx index 145a13c93..af538f52f 100644 --- a/src/DriverMED/DriverMED_R_SMESHDS_Mesh.cxx +++ b/src/DriverMED/DriverMED_R_SMESHDS_Mesh.cxx @@ -48,10 +48,11 @@ static int MYDEBUG = 0; #define _EDF_NODE_IDS_ using namespace MED; +using namespace std; void DriverMED_R_SMESHDS_Mesh -::SetMeshName(std::string theMeshName) +::SetMeshName(string theMeshName) { myMeshName = theMeshName; } @@ -60,7 +61,7 @@ static const SMDS_MeshNode* FindNode(const SMDS_Mesh* theMesh, TInt theId){ const SMDS_MeshNode* aNode = theMesh->FindNode(theId); if(aNode) return aNode; - EXCEPTION(std::runtime_error,"SMDS_Mesh::FindNode - cannot find a SMDS_MeshNode for ID = "<GetName()); - if(aMeshName != aMeshInfo->GetName()) continue; + if(MYDEBUG) MESSAGE("Perform - aMeshName : "<GetName()); + if(aMeshName != aMeshInfo->GetName()) continue; aResult = DRS_OK; - //TInt aMeshDim = aMeshInfo->GetDim(); - + //TInt aMeshDim = aMeshInfo->GetDim(); + // Reading MED families to the temporary structure - //------------------------------------------------ - TErr anErr; - TInt aNbFams = aMed->GetNbFamilies(aMeshInfo); + //------------------------------------------------ + TErr anErr; + TInt aNbFams = aMed->GetNbFamilies(aMeshInfo); if(MYDEBUG) MESSAGE("Read " << aNbFams << " families"); for (TInt iFam = 0; iFam < aNbFams; iFam++) { - PFamilyInfo aFamilyInfo = aMed->GetPFamilyInfo(aMeshInfo,iFam+1,&anErr); - if(anErr >= 0){ - TInt aFamId = aFamilyInfo->GetId(); - if(MYDEBUG) MESSAGE("Family " << aFamId << " :"); - + PFamilyInfo aFamilyInfo = aMed->GetPFamilyInfo(aMeshInfo,iFam+1,&anErr); + if(anErr >= 0){ + TInt aFamId = aFamilyInfo->GetId(); + if(MYDEBUG) MESSAGE("Family " << aFamId << " :"); + DriverMED_FamilyPtr aFamily (new DriverMED_Family); - + TInt aNbGrp = aFamilyInfo->GetNbGroup(); if(MYDEBUG) MESSAGE("belong to " << aNbGrp << " groups"); - bool isAttrOk = false; - if(aFamilyInfo->GetNbAttr() == aNbGrp) - isAttrOk = true; + bool isAttrOk = false; + if(aFamilyInfo->GetNbAttr() == aNbGrp) + isAttrOk = true; for (TInt iGr = 0; iGr < aNbGrp; iGr++) { - std::string aGroupName = aFamilyInfo->GetGroupName(iGr); + string aGroupName = aFamilyInfo->GetGroupName(iGr); if(isAttrOk){ - TInt anAttrVal = aFamilyInfo->GetAttrVal(iGr); - aFamily->SetGroupAttributVal(anAttrVal); - } - + TInt anAttrVal = aFamilyInfo->GetAttrVal(iGr); + aFamily->SetGroupAttributVal(anAttrVal); + } + if(MYDEBUG) MESSAGE(aGroupName); aFamily->AddGroupName(aGroupName); - + } aFamily->SetId( aFamId ); myFamilies[aFamId] = aFamily; - } + } } - if (aMeshInfo->GetType() == MED::eSTRUCTURE){ - /*bool aRes = */buildMeshGrille(aMed,aMeshInfo); - continue; - } + if (aMeshInfo->GetType() == MED::eSTRUCTURE){ + /*bool aRes = */buildMeshGrille(aMed,aMeshInfo); + continue; + } // Reading MED nodes to the corresponding SMDS structure - //------------------------------------------------------ + //------------------------------------------------------ PNodeInfo aNodeInfo = aMed->GetPNodeInfo(aMeshInfo); - if (!aNodeInfo) { + if (!aNodeInfo) { aResult = DRS_FAIL; - continue; + continue; } - PCoordHelper aCoordHelper = GetCoordHelper(aNodeInfo); + PCoordHelper aCoordHelper = GetCoordHelper(aNodeInfo); - EBooleen anIsNodeNum = aNodeInfo->IsElemNum(); - TInt aNbElems = aNodeInfo->GetNbElem(); - if(MYDEBUG) MESSAGE("Perform - aNodeInfo->GetNbElem() = "<GetNbElem() = "<X()<<", "<Y()<<", "<Z()< TNodeIds; + // Reading pre information about all MED cells + //-------------------------------------------- + typedef MED::TVector TNodeIds; bool takeNumbers = true; // initially we trust the numbers from file - MED::TEntityInfo aEntityInfo = aMed->GetEntityInfo(aMeshInfo); - MED::TEntityInfo::iterator anEntityIter = aEntityInfo.begin(); - for(; anEntityIter != aEntityInfo.end(); anEntityIter++){ - const EEntiteMaillage& anEntity = anEntityIter->first; - if(anEntity == eNOEUD) continue; - // Reading MED cells to the corresponding SMDS structure - //------------------------------------------------------ - const MED::TGeom2Size& aGeom2Size = anEntityIter->second; - MED::TGeom2Size::const_iterator aGeom2SizeIter = aGeom2Size.begin(); - for(; aGeom2SizeIter != aGeom2Size.end(); aGeom2SizeIter++){ - const EGeometrieElement& aGeom = aGeom2SizeIter->first; - - switch(aGeom) { -// case ePOINT1: ## PAL16410 -// break; - case ePOLYGONE: { + MED::TEntityInfo aEntityInfo = aMed->GetEntityInfo(aMeshInfo); + MED::TEntityInfo::iterator anEntityIter = aEntityInfo.begin(); + for(; anEntityIter != aEntityInfo.end(); anEntityIter++){ + const EEntiteMaillage& anEntity = anEntityIter->first; + if(anEntity == eNOEUD) continue; + // Reading MED cells to the corresponding SMDS structure + //------------------------------------------------------ + const MED::TGeom2Size& aGeom2Size = anEntityIter->second; + MED::TGeom2Size::const_iterator aGeom2SizeIter = aGeom2Size.begin(); + for(; aGeom2SizeIter != aGeom2Size.end(); aGeom2SizeIter++){ + const EGeometrieElement& aGeom = aGeom2SizeIter->first; + + switch(aGeom) { +// case ePOINT1: ## PAL16410 +// break; + case ePOLYGONE: { PPolygoneInfo aPolygoneInfo = aMed->GetPPolygoneInfo(aMeshInfo,anEntity,aGeom); EBooleen anIsElemNum = takeNumbers ? aPolygoneInfo->IsElemNum() : eFAUX; - - TInt aNbElem = aPolygoneInfo->GetNbElem(); - for(TInt iElem = 0; iElem < aNbElem; iElem++){ - MED::TCConnSlice aConnSlice = aPolygoneInfo->GetConnSlice(iElem); - TInt aNbConn = aPolygoneInfo->GetNbConn(iElem); - TNodeIds aNodeIds(aNbConn); + + TInt aNbElem = aPolygoneInfo->GetNbElem(); + for(TInt iElem = 0; iElem < aNbElem; iElem++){ + MED::TCConnSlice aConnSlice = aPolygoneInfo->GetConnSlice(iElem); + TInt aNbConn = aPolygoneInfo->GetNbConn(iElem); + TNodeIds aNodeIds(aNbConn); #ifdef _EDF_NODE_IDS_ - if(anIsNodeNum) - for(TInt iConn = 0; iConn < aNbConn; iConn++) - aNodeIds[iConn] = aNodeInfo->GetElemNum(aConnSlice[iConn] - 1); - else - for(TInt iConn = 0; iConn < aNbConn; iConn++) - aNodeIds[iConn] = aConnSlice[iConn]; + if(anIsNodeNum) + for(TInt iConn = 0; iConn < aNbConn; iConn++) + aNodeIds[iConn] = aNodeInfo->GetElemNum(aConnSlice[iConn] - 1); + else + for(TInt iConn = 0; iConn < aNbConn; iConn++) + aNodeIds[iConn] = aConnSlice[iConn]; #else - for(TInt iConn = 0; iConn < aNbConn; iConn++) - aNodeIds[iConn] = aConnSlice[iConn]; + for(TInt iConn = 0; iConn < aNbConn; iConn++) + aNodeIds[iConn] = aConnSlice[iConn]; #endif bool isRenum = false; SMDS_MeshElement* anElement = NULL; @@ -221,12 +222,12 @@ DriverMED_R_SMESHDS_Mesh try{ #endif if(anIsElemNum){ - TInt anElemId = aPolygoneInfo->GetElemNum(iElem); + TInt anElemId = aPolygoneInfo->GetElemNum(iElem); anElement = myMesh->AddPolygonalFaceWithID(aNodeIds,anElemId); - } + } if(!anElement){ - std::vector aNodes(aNbConn); - for(TInt iConn = 0; iConn < aNbConn; iConn++) + vector aNodes(aNbConn); + for(TInt iConn = 0; iConn < aNbConn; iConn++) aNodes[iConn] = FindNode(myMesh,aNodeIds[iConn]); anElement = myMesh->AddPolygonalFace(aNodes); isRenum = anIsElemNum; @@ -256,107 +257,107 @@ DriverMED_R_SMESHDS_Mesh } } break; - } - case ePOLYEDRE: { + } + case ePOLYEDRE: { PPolyedreInfo aPolyedreInfo = aMed->GetPPolyedreInfo(aMeshInfo,anEntity,aGeom); EBooleen anIsElemNum = takeNumbers ? aPolyedreInfo->IsElemNum() : eFAUX; - TInt aNbElem = aPolyedreInfo->GetNbElem(); - for(TInt iElem = 0; iElem < aNbElem; iElem++){ - MED::TCConnSliceArr aConnSliceArr = aPolyedreInfo->GetConnSliceArr(iElem); - TInt aNbFaces = aConnSliceArr.size(); + TInt aNbElem = aPolyedreInfo->GetNbElem(); + for(TInt iElem = 0; iElem < aNbElem; iElem++){ + MED::TCConnSliceArr aConnSliceArr = aPolyedreInfo->GetConnSliceArr(iElem); + TInt aNbFaces = aConnSliceArr.size(); typedef MED::TVector TQuantities; - TQuantities aQuantities(aNbFaces); - TInt aNbNodes = aPolyedreInfo->GetNbNodes(iElem); - TNodeIds aNodeIds(aNbNodes); - for(TInt iFace = 0, iNode = 0; iFace < aNbFaces; iFace++){ - MED::TCConnSlice aConnSlice = aConnSliceArr[iFace]; - TInt aNbConn = aConnSlice.size(); + TQuantities aQuantities(aNbFaces); + TInt aNbNodes = aPolyedreInfo->GetNbNodes(iElem); + TNodeIds aNodeIds(aNbNodes); + for(TInt iFace = 0, iNode = 0; iFace < aNbFaces; iFace++){ + MED::TCConnSlice aConnSlice = aConnSliceArr[iFace]; + TInt aNbConn = aConnSlice.size(); aQuantities[iFace] = aNbConn; #ifdef _EDF_NODE_IDS_ - if(anIsNodeNum) - for(TInt iConn = 0; iConn < aNbConn; iConn++) - aNodeIds[iNode++] = aNodeInfo->GetElemNum(aConnSlice[iConn] - 1); - else - for(TInt iConn = 0; iConn < aNbConn; iConn++) - aNodeIds[iNode++] = aConnSlice[iConn]; + if(anIsNodeNum) + for(TInt iConn = 0; iConn < aNbConn; iConn++) + aNodeIds[iNode++] = aNodeInfo->GetElemNum(aConnSlice[iConn] - 1); + else + for(TInt iConn = 0; iConn < aNbConn; iConn++) + aNodeIds[iNode++] = aConnSlice[iConn]; #else - for(TInt iConn = 0; iConn < aNbConn; iConn++) - aNodeIds[iNode++] = aConnSlice[iConn]; -#endif - } - - bool isRenum = false; - SMDS_MeshElement* anElement = NULL; - TInt aFamNum = aPolyedreInfo->GetFamNum(iElem); - + for(TInt iConn = 0; iConn < aNbConn; iConn++) + aNodeIds[iNode++] = aConnSlice[iConn]; +#endif + } + + bool isRenum = false; + SMDS_MeshElement* anElement = NULL; + TInt aFamNum = aPolyedreInfo->GetFamNum(iElem); + #ifndef _DEXCEPT_ - try{ + try{ #endif - if(anIsElemNum){ - TInt anElemId = aPolyedreInfo->GetElemNum(iElem); - anElement = myMesh->AddPolyhedralVolumeWithID(aNodeIds,aQuantities,anElemId); - } - if(!anElement){ - std::vector aNodes(aNbNodes); - for(TInt iConn = 0; iConn < aNbNodes; iConn++) - aNodes[iConn] = FindNode(myMesh,aNodeIds[iConn]); - anElement = myMesh->AddPolyhedralVolume(aNodes,aQuantities); - isRenum = anIsElemNum; - } + if(anIsElemNum){ + TInt anElemId = aPolyedreInfo->GetElemNum(iElem); + anElement = myMesh->AddPolyhedralVolumeWithID(aNodeIds,aQuantities,anElemId); + } + if(!anElement){ + vector aNodes(aNbNodes); + for(TInt iConn = 0; iConn < aNbNodes; iConn++) + aNodes[iConn] = FindNode(myMesh,aNodeIds[iConn]); + anElement = myMesh->AddPolyhedralVolume(aNodes,aQuantities); + isRenum = anIsElemNum; + } #ifndef _DEXCEPT_ - }catch(const std::exception& exc){ - aResult = DRS_FAIL; - }catch(...){ - aResult = DRS_FAIL; - } -#endif - if(!anElement){ - aResult = DRS_WARN_SKIP_ELEM; - }else{ - if(isRenum){ - anIsElemNum = eFAUX; - takeNumbers = false; - if (aResult < DRS_WARN_RENUMBER) - aResult = DRS_WARN_RENUMBER; - } - if ( checkFamilyID ( aFamily, aFamNum )) { - // Save reference to this element from its family - aFamily->AddElement(anElement); - aFamily->SetType(anElement->GetType()); - } - } - } + }catch(const std::exception& exc){ + aResult = DRS_FAIL; + }catch(...){ + aResult = DRS_FAIL; + } +#endif + if(!anElement){ + aResult = DRS_WARN_SKIP_ELEM; + }else{ + if(isRenum){ + anIsElemNum = eFAUX; + takeNumbers = false; + if (aResult < DRS_WARN_RENUMBER) + aResult = DRS_WARN_RENUMBER; + } + if ( checkFamilyID ( aFamily, aFamNum )) { + // Save reference to this element from its family + aFamily->AddElement(anElement); + aFamily->SetType(anElement->GetType()); + } + } + } break; } - default: { + default: { PCellInfo aCellInfo = aMed->GetPCellInfo(aMeshInfo,anEntity,aGeom); EBooleen anIsElemNum = takeNumbers ? aCellInfo->IsElemNum() : eFAUX; TInt aNbElems = aCellInfo->GetNbElem(); if(MYDEBUG) MESSAGE("Perform - anEntity = "< DriverMED_R_SMESHDS_Mesh::GetMeshNames(Status& theStatus) if (TInt aNbMeshes = aMed->GetNbMeshes()) { for (int iMesh = 0; iMesh < aNbMeshes; iMesh++) { - // Reading the MED mesh - //--------------------- - PMeshInfo aMeshInfo = aMed->GetPMeshInfo(iMesh+1); - aMeshNames.push_back(aMeshInfo->GetName()); + // Reading the MED mesh + //--------------------- + PMeshInfo aMeshInfo = aMed->GetPMeshInfo(iMesh+1); + aMeshNames.push_back(aMeshInfo->GetName()); } } }catch(const std::exception& exc){ @@ -764,26 +765,28 @@ std::list DriverMED_R_SMESHDS_Mesh::GetMeshNames(Status& theStatus) return aMeshNames; } -std::list DriverMED_R_SMESHDS_Mesh::GetGroupNamesAndTypes() +list DriverMED_R_SMESHDS_Mesh::GetGroupNamesAndTypes() { - std::list aResult; - std::set aResGroupNames; + list aResult; + set aResGroupNames; - std::map::iterator aFamsIter = myFamilies.begin(); + map::iterator aFamsIter = myFamilies.begin(); for (; aFamsIter != myFamilies.end(); aFamsIter++) { DriverMED_FamilyPtr aFamily = (*aFamsIter).second; const MED::TStringSet& aGroupNames = aFamily->GetGroupNames(); - std::set::const_iterator aGrNamesIter = aGroupNames.begin(); + set::const_iterator aGrNamesIter = aGroupNames.begin(); for (; aGrNamesIter != aGroupNames.end(); aGrNamesIter++) { - TNameAndType aNameAndType = make_pair( *aGrNamesIter, aFamily->GetType() ); - // Check, if this is a Group or SubMesh name -//if (aName.substr(0, 5) == string("Group")) { + const set< SMDSAbs_ElementType >& types = aFamily->GetTypes(); + set< SMDSAbs_ElementType >::const_iterator type = types.begin(); + for ( ; type != types.end(); ++type ) + { + TNameAndType aNameAndType = make_pair( *aGrNamesIter, *type ); if ( aResGroupNames.insert( aNameAndType ).second ) { aResult.push_back( aNameAndType ); } -// } + } } } @@ -792,28 +795,28 @@ std::list DriverMED_R_SMESHDS_Mesh::GetGroupNamesAndTypes() void DriverMED_R_SMESHDS_Mesh::GetGroup(SMESHDS_Group* theGroup) { - std::string aGroupName (theGroup->GetStoreName()); + string aGroupName (theGroup->GetStoreName()); if(MYDEBUG) MESSAGE("Get Group " << aGroupName); - std::map::iterator aFamsIter = myFamilies.begin(); + map::iterator aFamsIter = myFamilies.begin(); for (; aFamsIter != myFamilies.end(); aFamsIter++) { DriverMED_FamilyPtr aFamily = (*aFamsIter).second; - if (aFamily->GetType() == theGroup->GetType() && aFamily->MemberOf(aGroupName)) + if (aFamily->GetTypes().count( theGroup->GetType() ) && aFamily->MemberOf(aGroupName)) { - const std::set& anElements = aFamily->GetElements(); - std::set::const_iterator anElemsIter = anElements.begin(); - const SMDS_MeshElement * element = 0; + const set& anElements = aFamily->GetElements(); + set::const_iterator anElemsIter = anElements.begin(); for (; anElemsIter != anElements.end(); anElemsIter++) { - element = *anElemsIter; - theGroup->SMDSGroup().Add(element); - int aGroupAttrVal = aFamily->GetGroupAttributVal(); - if( aGroupAttrVal != 0) - theGroup->SetColorGroup(aGroupAttrVal); + const SMDS_MeshElement * element = *anElemsIter; + if ( element->GetType() == theGroup->GetType() ) // Issue 0020576 + theGroup->SMDSGroup().Add(element); } - if ( element ) - theGroup->SetType( theGroup->SMDSGroup().GetType() ); + int aGroupAttrVal = aFamily->GetGroupAttributVal(); + if( aGroupAttrVal != 0) + theGroup->SetColorGroup(aGroupAttrVal); +// if ( element ) -- Issue 0020576 +// theGroup->SetType( theGroup->SMDSGroup().GetType() ); } } } @@ -823,15 +826,15 @@ void DriverMED_R_SMESHDS_Mesh::GetSubMesh (SMESHDS_SubMesh* theSubMesh, { char submeshGrpName[ 30 ]; sprintf( submeshGrpName, "SubMesh %d", theId ); - std::string aName (submeshGrpName); - std::map::iterator aFamsIter = myFamilies.begin(); + string aName (submeshGrpName); + map::iterator aFamsIter = myFamilies.begin(); for (; aFamsIter != myFamilies.end(); aFamsIter++) { DriverMED_FamilyPtr aFamily = (*aFamsIter).second; if (aFamily->MemberOf(aName)) { - const std::set& anElements = aFamily->GetElements(); - std::set::const_iterator anElemsIter = anElements.begin(); + const set& anElements = aFamily->GetElements(); + set::const_iterator anElemsIter = anElements.begin(); if (aFamily->GetType() == SMDSAbs_Node) { for (; anElemsIter != anElements.end(); anElemsIter++) @@ -853,21 +856,21 @@ void DriverMED_R_SMESHDS_Mesh::GetSubMesh (SMESHDS_SubMesh* theSubMesh, void DriverMED_R_SMESHDS_Mesh::CreateAllSubMeshes () { - std::map::iterator aFamsIter = myFamilies.begin(); + map::iterator aFamsIter = myFamilies.begin(); for (; aFamsIter != myFamilies.end(); aFamsIter++) { DriverMED_FamilyPtr aFamily = (*aFamsIter).second; MED::TStringSet aGroupNames = aFamily->GetGroupNames(); - std::set::iterator aGrNamesIter = aGroupNames.begin(); + set::iterator aGrNamesIter = aGroupNames.begin(); for (; aGrNamesIter != aGroupNames.end(); aGrNamesIter++) { - std::string aName = *aGrNamesIter; + string aName = *aGrNamesIter; // Check, if this is a Group or SubMesh name - if (aName.substr(0, 7) == std::string("SubMesh")) + if (aName.substr(0, 7) == string("SubMesh")) { - int Id = atoi(std::string(aName).substr(7).c_str()); - std::set anElements = aFamily->GetElements(); - std::set::iterator anElemsIter = anElements.begin(); + int Id = atoi(string(aName).substr(7).c_str()); + set anElements = aFamily->GetElements(); + set::iterator anElemsIter = anElements.begin(); if (aFamily->GetType() == SMDSAbs_Node) { for (; anElemsIter != anElements.end(); anElemsIter++) @@ -909,7 +912,7 @@ void DriverMED_R_SMESHDS_Mesh::CreateAllSubMeshes () bool DriverMED_R_SMESHDS_Mesh::checkFamilyID(DriverMED_FamilyPtr & aFamily, int anID) const { if ( !aFamily || aFamily->GetId() != anID ) { - std::map::const_iterator i_fam = myFamilies.find(anID); + map::const_iterator i_fam = myFamilies.find(anID); if ( i_fam == myFamilies.end() ) return false; aFamily = i_fam->second; @@ -924,7 +927,7 @@ bool DriverMED_R_SMESHDS_Mesh::checkFamilyID(DriverMED_FamilyPtr & aFamily, int * \return TRUE, if successfully. Else FALSE */ bool DriverMED_R_SMESHDS_Mesh::buildMeshGrille(const MED::PWrapper& theWrapper, - const MED::PMeshInfo& theMeshInfo) + const MED::PMeshInfo& theMeshInfo) { bool res = true; @@ -944,10 +947,10 @@ bool DriverMED_R_SMESHDS_Mesh::buildMeshGrille(const MED::PWrapper& theWrapper, if((aGrilleInfo->myFamNumNode).size() > 0){ TInt aFamNum = aGrilleInfo->GetFamNumNode(iNode); if ( checkFamilyID ( aFamily, aFamNum )) - { - aFamily->AddElement(aNode); - aFamily->SetType(SMDSAbs_Node); - } + { + aFamily->AddElement(aNode); + aFamily->SetType(SMDSAbs_Node); + } } } @@ -959,38 +962,38 @@ bool DriverMED_R_SMESHDS_Mesh::buildMeshGrille(const MED::PWrapper& theWrapper, switch(aGrilleInfo->GetGeom()){ case MED::eSEG2: if(aNodeIds.size() != 2){ - res = false; - EXCEPTION(std::runtime_error,"buildMeshGrille Error. Incorrect size of ids 2!="< + using namespace std; @@ -49,6 +51,7 @@ DriverUNV_R_SMDS_Mesh::~DriverUNV_R_SMDS_Mesh() Driver_Mesh::Status DriverUNV_R_SMDS_Mesh::Perform() { + Kernel_Utils::Localizer loc; Status aResult = DRS_OK; std::ifstream in_stream(myFile.c_str()); try{ diff --git a/src/DriverUNV/DriverUNV_W_SMDS_Mesh.cxx b/src/DriverUNV/DriverUNV_W_SMDS_Mesh.cxx index 7a4da5e92..7b3a4d22b 100644 --- a/src/DriverUNV/DriverUNV_W_SMDS_Mesh.cxx +++ b/src/DriverUNV/DriverUNV_W_SMDS_Mesh.cxx @@ -36,6 +36,8 @@ #include "UNV2417_Structure.hxx" #include "UNV_Utilities.hxx" +#include + using namespace std; using namespace UNV; @@ -57,6 +59,7 @@ namespace{ Driver_Mesh::Status DriverUNV_W_SMDS_Mesh::Perform() { + Kernel_Utils::Localizer loc; Status aResult = DRS_OK; std::ofstream out_stream(myFile.c_str()); try{ diff --git a/src/DriverUNV/Makefile.am b/src/DriverUNV/Makefile.am index ba6910285..bad160b7f 100644 --- a/src/DriverUNV/Makefile.am +++ b/src/DriverUNV/Makefile.am @@ -79,6 +79,7 @@ libMeshDriverUNV_la_CPPFLAGS = \ libMeshDriverUNV_la_LDFLAGS = \ ../Driver/libMeshDriver.la \ + $(KERNEL_LDFLAGS) -lSALOMEBasics \ $(CAS_KERNEL) UNV_Test_CPPFLAGS = \ diff --git a/src/MEFISTO2/aptrte.cxx b/src/MEFISTO2/aptrte.cxx index f1579fa3a..9d9e80c5b 100755 --- a/src/MEFISTO2/aptrte.cxx +++ b/src/MEFISTO2/aptrte.cxx @@ -36,7 +36,10 @@ extern "C" MEFISTO2D_EXPORT R #ifdef WIN32 + #ifdef F2C_BUILD + #else __stdcall + #endif #endif areteideale()//( R3 xyz, R3 direction ) { @@ -52,8 +55,11 @@ static double cpunew, cpuold=0; void #ifdef WIN32 +#ifdef F2C_BUILD +#else __stdcall #endif +#endif tempscpu_( double & tempsec ) //Retourne le temps CPU utilise en secondes { @@ -64,8 +70,11 @@ tempscpu_( double & tempsec ) void #ifdef WIN32 +#ifdef F2C_BUILD +#else __stdcall #endif +#endif deltacpu_( R & dtcpu ) //Retourne le temps CPU utilise en secondes depuis le precedent appel { @@ -744,7 +753,10 @@ void aptrte( Z nutysu, R aretmx, } void #ifdef WIN32 +#ifdef F2C_BUILD +#else __stdcall +#endif #endif qualitetrte( R3 *mnpxyd, Z & mosoar, Z & mxsoar, Z *mnsoar, diff --git a/src/MEFISTO2/aptrte.h b/src/MEFISTO2/aptrte.h index 68fb0e63a..a1f11cb80 100755 --- a/src/MEFISTO2/aptrte.h +++ b/src/MEFISTO2/aptrte.h @@ -156,7 +156,10 @@ MEFISTO2D_EXPORT extern "C" { void #ifdef WIN32 +#ifdef F2C_BUILD +#else __stdcall +#endif #endif qualitetrte( R3 *mnpxyd, Z & mosoar, Z & mxsoar, Z *mnsoar, @@ -193,7 +196,10 @@ extern "C" { void extern "C" { void #ifdef WIN32 +#ifdef F2C_BUILD +#else __stdcall +#endif #endif tempscpu( double & tempsec ); } @@ -202,7 +208,10 @@ extern "C" { void extern "C" { void #ifdef WIN32 +#ifdef F2C_BUILD +#else __stdcall +#endif #endif deltacpu( R & dtcpu ); } @@ -212,7 +221,10 @@ extern "C" { void //initialiser le tableau mnsoar pour le hachage des aretes extern "C" {void #ifdef WIN32 +#ifdef F2C_BUILD +#else __stdcall +#endif #endif insoar( Z & mxsomm, Z & mosoar, Z & mxsoar, Z & n1soar, Z * mnsoar ); } @@ -220,14 +232,20 @@ extern "C" {void //mettre a zero les nb entiers de tab extern "C" {void #ifdef WIN32 +#ifdef F2C_BUILD +#else __stdcall +#endif #endif azeroi( Z & nb, Z * tab ); } extern "C" {void #ifdef WIN32 +#ifdef F2C_BUILD +#else __stdcall +#endif #endif fasoar( Z & ns1, Z & ns2, Z & nt1, Z & nt2, Z & nolign, Z & mosoar, Z & mxsoar, Z & n1soar, Z * mnsoar, Z * mnarst, @@ -279,7 +297,10 @@ extern "C" {void //initialisation du tableau letree et ajout dans letree des sommets 1 a nbsomm extern "C" {void #ifdef WIN32 +#ifdef F2C_BUILD +#else __stdcall +#endif #endif teajte( Z & mxsomm, Z & nbsomm, R3 * mnpxyd, R3 * comxmi, R & aretmx, Z & mxtree, Z * letree, @@ -288,7 +309,10 @@ extern "C" {void extern "C" {void #ifdef WIN32 +#ifdef F2C_BUILD +#else __stdcall +#endif #endif tehote( Z & nutysu, Z & nbarpi, Z & mxsomm, Z & nbsomm, R3 * mnpxyd, R3 * comxmi, R & aretmx, @@ -300,7 +324,10 @@ extern "C" {void extern "C" {void #ifdef WIN32 +#ifdef F2C_BUILD +#else __stdcall +#endif #endif tetrte( R3 * comxmi, R & aretmx, Z & nbarpi, Z & mxsomm, R3 * mnpxyd, Z & mxqueu, Z * mnqueu, Z * mntree, @@ -313,7 +340,10 @@ extern "C" {void extern "C" {void #ifdef WIN32 +#ifdef F2C_BUILD +#else __stdcall +#endif #endif aisoar( Z & mosoar, Z & mxsoar, Z * mnsoar, Z & na ); } @@ -321,7 +351,10 @@ extern "C" {void extern "C" {void #ifdef WIN32 +#ifdef F2C_BUILD +#else __stdcall +#endif #endif tedela( R3 * mnpxyd, Z * mnarst, Z & mosoar, Z & mxsoar, Z & n1soar, Z * mnsoar, Z & na, @@ -332,7 +365,10 @@ extern "C" {void extern "C" {void #ifdef WIN32 +#ifdef F2C_BUILD +#else __stdcall +#endif #endif terefr( Z & nbarpi, R3 * mnpxyd, Z & mosoar, Z & mxsoar, Z & n1soar, Z * mnsoar, @@ -346,7 +382,10 @@ extern "C" {void extern "C" {void #ifdef WIN32 +#ifdef F2C_BUILD +#else __stdcall +#endif #endif tesuex( Z & nblf, Z * nulftr, Z & ndtri0, Z & nbsomm, R3 * mnpxyd, Z * mnslig, @@ -358,7 +397,10 @@ extern "C" {void extern "C" {void #ifdef WIN32 +#ifdef F2C_BUILD +#else __stdcall +#endif #endif teamqt( Z & nutysu, R & aretmx, R & airemx, Z * mnarst, Z & mosoar, Z & mxsoar, Z & n1soar, Z * mnsoar, @@ -377,7 +419,10 @@ extern "C" {void extern "C" {void #ifdef WIN32 +#ifdef F2C_BUILD +#else __stdcall +#endif #endif nusotr( Z & nt, Z & mosoar, Z * mnsoar, Z & moartr, Z * mnartr,Z * nosotr ); } @@ -385,7 +430,10 @@ extern "C" {void extern "C" {void #ifdef WIN32 +#ifdef F2C_BUILD +#else __stdcall +#endif #endif qutr2d( R3 & p1, R3 & p2, R3 & p3, R & qualite ); } @@ -393,7 +441,10 @@ extern "C" {void extern "C" { R #ifdef WIN32 +#ifdef F2C_BUILD +#else __stdcall +#endif #endif surtd2( R3 & p1, R3 & p2, R3 & p3 ); } diff --git a/src/OBJECT/Makefile.am b/src/OBJECT/Makefile.am index 30a2e591a..9a04613b3 100644 --- a/src/OBJECT/Makefile.am +++ b/src/OBJECT/Makefile.am @@ -36,7 +36,6 @@ salomeinclude_HEADERS = \ SMESH_DeviceActor.h \ SMESH_PreviewActorsCollection.h \ SMESH_ExtractGeometry.h \ - SMESH_ActorUtils.h \ SMESH_FaceOrientationFilter.h # Libraries targets @@ -77,5 +76,6 @@ libSMESHObject_la_LDFLAGS = \ ../SMDS/libSMDS.la \ ../Controls/libSMESHControls.la \ $(GUI_LDFLAGS) -lSalomeApp -lSalomeObject -lSVTK -lVTKViewer -lqtx -lsuit \ + $(GEOM_LDFLAGS) -lGEOMObject \ $(CAS_KERNEL) \ $(VTK_LIBS) $(QT_MT_LIBS) diff --git a/src/OBJECT/SMESH_Actor.cxx b/src/OBJECT/SMESH_Actor.cxx index 4709f9357..7a37d6541 100644 --- a/src/OBJECT/SMESH_Actor.cxx +++ b/src/OBJECT/SMESH_Actor.cxx @@ -72,6 +72,11 @@ #include #include +#include +#if !defined(VTK_XVERSION) +#define VTK_XVERSION (VTK_MAJOR_VERSION<<16)+(VTK_MINOR_VERSION<<8)+(VTK_BUILD_VERSION) +#endif + #include "utilities.h" #ifdef _DEBUG_ @@ -90,9 +95,9 @@ SMESH_ActorDef* SMESH_ActorDef::New(){ SMESH_Actor* SMESH_Actor::New(TVisualObjPtr theVisualObj, - const char* theEntry, - const char* theName, - int theIsClear) + const char* theEntry, + const char* theName, + int theIsClear) { SMESH_ActorDef* anActor = SMESH_ActorDef::New(); if(!anActor->Init(theVisualObj,theEntry,theName,theIsClear)){ @@ -399,7 +404,11 @@ SMESH_ActorDef::SMESH_ActorDef() myPtsLabeledDataMapper = vtkLabeledDataMapper::New(); myPtsLabeledDataMapper->SetInput(myPtsSelectVisiblePoints->GetOutput()); +#if (VTK_XVERSION >= 0x050200) + myPtsLabeledDataMapper->SetLabelFormat("%d"); +#else myPtsLabeledDataMapper->SetLabelFormat("%g"); +#endif myPtsLabeledDataMapper->SetLabelModeToLabelScalars(); vtkTextProperty* aPtsTextProp = vtkTextProperty::New(); @@ -440,7 +449,11 @@ SMESH_ActorDef::SMESH_ActorDef() myClsLabeledDataMapper = vtkLabeledDataMapper::New(); myClsLabeledDataMapper->SetInput(myClsSelectVisiblePoints->GetOutput()); +#if (VTK_XVERSION >= 0x050200) + myClsLabeledDataMapper->SetLabelFormat("%d"); +#else myClsLabeledDataMapper->SetLabelFormat("%g"); +#endif myClsLabeledDataMapper->SetLabelModeToLabelScalars(); vtkTextProperty* aClsTextProp = vtkTextProperty::New(); @@ -593,7 +606,7 @@ void SMESH_ActorDef::SetPointsLabeled( bool theIsPointsLabeled ) vtkIntArray *anArray = vtkIntArray::New(); anArray->SetNumberOfValues( aNbElem ); - for ( int anId = 0; anId < aNbElem; anId++ ) + for ( vtkIdType anId = 0; anId < aNbElem; anId++ ) { int aSMDSId = myVisualObj->GetNodeObjId( anId ); anArray->SetValue( anId, aSMDSId ); @@ -664,7 +677,7 @@ SetControlMode(eControl theMode) void SMESH_ActorDef:: SetControlMode(eControl theMode, - bool theCheckEntityMode) + bool theCheckEntityMode) { SUIT_ResourceMgr* mgr = SUIT_Session::session()->resourceMgr(); if( !mgr ) @@ -796,41 +809,41 @@ SetControlMode(eControl theMode, myControlMode = theMode; switch(myControlMode){ case eFreeNodes: - myNodeExtActor->SetExtControlMode(aFunctor); - break; + myNodeExtActor->SetExtControlMode(aFunctor); + break; case eFreeEdges: case eFreeBorders: - my1DExtActor->SetExtControlMode(aFunctor); - break; + my1DExtActor->SetExtControlMode(aFunctor); + break; case eFreeFaces: - my2DExtActor->SetExtControlMode(aFunctor); - break; + my2DExtActor->SetExtControlMode(aFunctor); + break; case eLength2D: case eMultiConnection2D: - my1DExtActor->SetExtControlMode(aFunctor,myScalarBarActor,myLookupTable); - break; + my1DExtActor->SetExtControlMode(aFunctor,myScalarBarActor,myLookupTable); + break; default: - myControlActor->SetControlMode(aFunctor,myScalarBarActor,myLookupTable); + myControlActor->SetControlMode(aFunctor,myScalarBarActor,myLookupTable); } } if(theCheckEntityMode){ if(myControlActor == my1DActor) - SetEntityMode(eEdges); + SetEntityMode(eEdges); else if(myControlActor == my2DActor){ - switch(myControlMode){ - case eLength2D: - case eFreeEdges: - case eFreeFaces: - case eMultiConnection2D: - //SetEntityMode(eEdges); - SetEntityMode(eFaces); - break; - default: - SetEntityMode(eFaces); - } + switch(myControlMode){ + case eLength2D: + case eFreeEdges: + case eFreeFaces: + case eMultiConnection2D: + //SetEntityMode(eEdges); + SetEntityMode(eFaces); + break; + default: + SetEntityMode(eFaces); + } }else if(myControlActor == my3DActor) - SetEntityMode(eVolumes); + SetEntityMode(eVolumes); } }else if(theCheckEntityMode){ @@ -900,9 +913,9 @@ void SMESH_ActorDef::RemoveFromRender(vtkRenderer* theRenderer){ bool SMESH_ActorDef::Init(TVisualObjPtr theVisualObj, - const char* theEntry, - const char* theName, - int theIsClear) + const char* theEntry, + const char* theName, + int theIsClear) { Handle(SALOME_InteractiveObject) anIO = new SALOME_InteractiveObject(theEntry,"SMESH",theName); setIO(anIO); @@ -1034,8 +1047,8 @@ bool SMESH_ActorDef::IsInfinitive(){ vtkDataSet *aDataSet = myPickableActor->GetUnstructuredGrid(); aDataSet->Update(); myIsInfinite = aDataSet->GetNumberOfCells() == 0 || - aDataSet->GetNumberOfCells() == 1 && - aDataSet->GetCell(0)->GetCellType() == VTK_VERTEX; + ( aDataSet->GetNumberOfCells() == 1 && + aDataSet->GetCell(0)->GetCellType() == VTK_VERTEX ); return SALOME_Actor::IsInfinitive(); } @@ -1149,21 +1162,21 @@ void SMESH_ActorDef::SetVisibility(int theMode, bool theIsUpdateRepersentation){ if(myControlMode != eNone){ switch(myControlMode){ case eFreeNodes: - myNodeExtActor->VisibilityOn(); - break; + myNodeExtActor->VisibilityOn(); + break; case eFreeEdges: case eFreeBorders: - my1DExtActor->VisibilityOn(); - break; + my1DExtActor->VisibilityOn(); + break; case eFreeFaces: - my2DExtActor->VisibilityOn(); - break; + my2DExtActor->VisibilityOn(); + break; case eLength2D: case eMultiConnection2D: - my1DExtActor->VisibilityOn(); + my1DExtActor->VisibilityOn(); default: - if(myControlActor->GetUnstructuredGrid()->GetNumberOfCells()) - myScalarBarActor->VisibilityOn(); + if(myControlActor->GetUnstructuredGrid()->GetNumberOfCells()) + myScalarBarActor->VisibilityOn(); } } @@ -1250,7 +1263,11 @@ void SMESH_ActorDef::SetEntityMode(unsigned int theMode) VTKViewer_ExtractUnstructuredGrid* aHightFilter = myHighlitableActor->GetExtractUnstructuredGrid(); aHightFilter->ClearRegisteredCellsWithType(); - aHightFilter->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::eAdding); + + // The following row has been commented (initially added in 1.28.2.3.1 revision) + // Reason: seems to be unnecessary, this filter should always have default (ePassAll) mode of changing + // In addition, it leads to exception (see bug IPAL21372) + //aHightFilter->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::eAdding); if (myEntityMode & e0DElements) { if (MYDEBUG) MESSAGE("0D ELEMENTS"); @@ -1458,12 +1475,12 @@ void SMESH_ActorDef::UpdateHighlight(){ myHighlitableActor->SetHighlited(anIsVisible); myHighlitableActor->SetVisibility(anIsVisible); myHighlitableActor->GetExtractUnstructuredGrid()-> - SetModeOfExtraction(VTKViewer_ExtractUnstructuredGrid::eCells); + SetModeOfExtraction(VTKViewer_ExtractUnstructuredGrid::eCells); myHighlitableActor->SetRepresentation(SMESH_DeviceActor::eWireframe); }else if(myRepresentation == ePoint || GetPointRepresentation()){ myHighlitableActor->SetHighlited(anIsVisible); myHighlitableActor->GetExtractUnstructuredGrid()-> - SetModeOfExtraction(VTKViewer_ExtractUnstructuredGrid::ePoints); + SetModeOfExtraction(VTKViewer_ExtractUnstructuredGrid::ePoints); myHighlitableActor->SetVisibility(anIsVisible); myHighlitableActor->SetRepresentation(SMESH_DeviceActor::ePoint); } @@ -1581,7 +1598,7 @@ void SMESH_ActorDef::SetSufaceColor(vtkFloatingPointType r,vtkFloatingPointType mySurfaceProp->SetColor(r,g,b); if( SMESH_GroupObj* aGroupObj = dynamic_cast( myVisualObj.get() ) ) if( aGroupObj->GetElementType() == SMDSAbs_Face || - aGroupObj->GetElementType() == SMDSAbs_Volume ) + aGroupObj->GetElementType() == SMDSAbs_Volume ) myNameActor->SetBackgroundColor(r,g,b); Modified(); } @@ -1754,8 +1771,8 @@ GetClippingPlane(vtkIdType theID) static void ComputeBoundsParam(vtkDataSet* theDataSet, - vtkFloatingPointType theDirection[3], vtkFloatingPointType theMinPnt[3], - vtkFloatingPointType& theMaxBoundPrj, vtkFloatingPointType& theMinBoundPrj) + vtkFloatingPointType theDirection[3], vtkFloatingPointType theMinPnt[3], + vtkFloatingPointType& theMaxBoundPrj, vtkFloatingPointType& theMinBoundPrj) { vtkFloatingPointType aBounds[6]; theDataSet->GetBounds(aBounds); @@ -1769,13 +1786,13 @@ static void ComputeBoundsParam(vtkDataSet* theDataSet, } vtkFloatingPointType 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]}}; + {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]); @@ -1799,7 +1816,7 @@ static void ComputeBoundsParam(vtkDataSet* theDataSet, static void DistanceToPosition(vtkDataSet* theDataSet, - vtkFloatingPointType theDirection[3], vtkFloatingPointType theDist, vtkFloatingPointType thePos[3]) + vtkFloatingPointType theDirection[3], vtkFloatingPointType theDist, vtkFloatingPointType thePos[3]) { vtkFloatingPointType aMaxBoundPrj, aMinBoundPrj, aMinPnt[3]; ComputeBoundsParam(theDataSet,theDirection,aMinPnt,aMaxBoundPrj,aMinBoundPrj); @@ -1811,7 +1828,7 @@ static void DistanceToPosition(vtkDataSet* theDataSet, static void PositionToDistance(vtkDataSet* theDataSet, - vtkFloatingPointType theDirection[3], vtkFloatingPointType thePos[3], vtkFloatingPointType& theDist) + vtkFloatingPointType theDirection[3], vtkFloatingPointType thePos[3], vtkFloatingPointType& theDist) { vtkFloatingPointType aMaxBoundPrj, aMinBoundPrj, aMinPnt[3]; ComputeBoundsParam(theDataSet,theDirection,aMinPnt,aMaxBoundPrj,aMinBoundPrj); diff --git a/src/OBJECT/SMESH_Actor.h b/src/OBJECT/SMESH_Actor.h index 99005dcf1..89f4fc51a 100644 --- a/src/OBJECT/SMESH_Actor.h +++ b/src/OBJECT/SMESH_Actor.h @@ -44,9 +44,9 @@ class SMESHOBJECT_EXPORT SMESH_Actor: public SALOME_Actor public: vtkTypeMacro(SMESH_Actor,SALOME_Actor); static SMESH_Actor* New(TVisualObjPtr theVisualObj, - const char* theEntry, - const char* theName, - int theIsClear); + const char* theEntry, + const char* theName, + int theIsClear); virtual void SetSufaceColor(vtkFloatingPointType r,vtkFloatingPointType g,vtkFloatingPointType b) = 0; virtual void GetSufaceColor(vtkFloatingPointType& r,vtkFloatingPointType& g,vtkFloatingPointType& b) = 0; @@ -102,7 +102,7 @@ class SMESHOBJECT_EXPORT SMESH_Actor: public SALOME_Actor enum eControl{eNone, eLength, eLength2D, eFreeBorders, eFreeEdges, eFreeNodes, eFreeFaces, eMultiConnection, eArea, eTaper, eAspectRatio, - eMinimumAngle, eWarping, eSkew, eAspectRatio3D, eMultiConnection2D, eVolume3D}; + eMinimumAngle, eWarping, eSkew, eAspectRatio3D, eMultiConnection2D, eVolume3D}; virtual void SetControlMode(eControl theMode) = 0; virtual eControl GetControlMode() = 0; diff --git a/src/OBJECT/SMESH_ActorDef.h b/src/OBJECT/SMESH_ActorDef.h index dbbe0a5bb..98f87fd04 100644 --- a/src/OBJECT/SMESH_ActorDef.h +++ b/src/OBJECT/SMESH_ActorDef.h @@ -272,9 +272,9 @@ class SMESH_ActorDef : public SMESH_Actor ~SMESH_ActorDef(); bool Init(TVisualObjPtr theVisualObj, - const char* theEntry, - const char* theName, - int theIsClear); + const char* theEntry, + const char* theName, + int theIsClear); void SetIsShrunkable(bool theShrunkable); void UpdateHighlight(); diff --git a/src/OBJECT/SMESH_ActorUtils.cxx b/src/OBJECT/SMESH_ActorUtils.cxx index c8fcbfe24..872a30acd 100644 --- a/src/OBJECT/SMESH_ActorUtils.cxx +++ b/src/OBJECT/SMESH_ActorUtils.cxx @@ -41,7 +41,7 @@ namespace SMESH vtkFloatingPointType GetFloat( const QString& theValue, - vtkFloatingPointType theDefault ) + vtkFloatingPointType theDefault ) { int pos = theValue.indexOf( ":" ); vtkFloatingPointType val = theDefault; @@ -50,15 +50,15 @@ namespace SMESH QString name = theValue.right( theValue.length()-pos-1 ), sect = theValue.left( pos ); if( !name.isEmpty() && !sect.isEmpty() ) - val = GetFloat( name, sect, theDefault ); + val = GetFloat( name, sect, theDefault ); } return val; } vtkFloatingPointType GetFloat( const QString& theValue, - const QString& theSection, - vtkFloatingPointType theDefault ) + const QString& theSection, + vtkFloatingPointType theDefault ) { vtkFloatingPointType val = theDefault; SUIT_ResourceMgr* mgr = SUIT_Session::session()->resourceMgr(); @@ -70,7 +70,7 @@ namespace SMESH void WriteUnstructuredGrid(vtkUnstructuredGrid* theGrid, - const char* theFileName) + const char* theFileName) { vtkUnstructuredGridWriter* aWriter = vtkUnstructuredGridWriter::New(); aWriter->SetFileName(theFileName); @@ -83,8 +83,8 @@ namespace SMESH QColor GetColor( const QString& theSect, - const QString& theName, - const QColor& def ) + const QString& theName, + const QColor& def ) { QColor c = def; SUIT_ResourceMgr* mgr = SUIT_Session::session()->resourceMgr(); @@ -95,11 +95,11 @@ namespace SMESH void GetColor( const QString& theSect, - const QString& theName, - int& r, - int& g, - int& b, - const QColor& def ) + const QString& theName, + int& r, + int& g, + int& b, + const QColor& def ) { QColor c = def; SUIT_ResourceMgr* mgr = SUIT_Session::session()->resourceMgr(); @@ -111,11 +111,11 @@ namespace SMESH void GetColor( const QString& theSect, - const QString& theName, - vtkFloatingPointType& r, - vtkFloatingPointType& g, - vtkFloatingPointType& b, - const QColor& def ) + const QString& theName, + vtkFloatingPointType& r, + vtkFloatingPointType& g, + vtkFloatingPointType& b, + const QColor& def ) { int ir( 0 ), ig( 0 ), ib( 0 ); GetColor( theSect, theName, ir, ig, ib, def ); diff --git a/src/OBJECT/SMESH_ActorUtils.h b/src/OBJECT/SMESH_ActorUtils.h index a494f743b..69451fcac 100644 --- a/src/OBJECT/SMESH_ActorUtils.h +++ b/src/OBJECT/SMESH_ActorUtils.h @@ -33,42 +33,42 @@ namespace SMESH SMESHOBJECT_EXPORT vtkFloatingPointType GetFloat( const QString& theValue, - vtkFloatingPointType theDefault = 0 ); + vtkFloatingPointType theDefault = 0 ); SMESHOBJECT_EXPORT vtkFloatingPointType GetFloat( const QString& theName, - const QString& theSection, - vtkFloatingPointType theDefault = 0 ); + const QString& theSection, + vtkFloatingPointType theDefault = 0 ); SMESHOBJECT_EXPORT QColor GetColor( const QString& theSect, - const QString& theName, - const QColor& = QColor() ); + const QString& theName, + const QColor& = QColor() ); SMESHOBJECT_EXPORT void GetColor( const QString& theSect, - const QString& theName, - int&, - int&, - int&, - const QColor& = QColor() ); + const QString& theName, + int&, + int&, + int&, + const QColor& = QColor() ); SMESHOBJECT_EXPORT void GetColor( const QString& theSect, - const QString& theName, - vtkFloatingPointType&, - vtkFloatingPointType&, - vtkFloatingPointType&, - const QColor& = QColor() ); + const QString& theName, + vtkFloatingPointType&, + vtkFloatingPointType&, + vtkFloatingPointType&, + const QColor& = QColor() ); SMESHOBJECT_EXPORT void WriteUnstructuredGrid(vtkUnstructuredGrid* theGrid, - const char* theFileName); + const char* theFileName); } diff --git a/src/OBJECT/SMESH_DeviceActor.cxx b/src/OBJECT/SMESH_DeviceActor.cxx index 2a657eb34..4d0626902 100644 --- a/src/OBJECT/SMESH_DeviceActor.cxx +++ b/src/OBJECT/SMESH_DeviceActor.cxx @@ -91,7 +91,7 @@ SMESH_DeviceActor myMapper = vtkPolyDataMapper::New(); vtkMapper::GetResolveCoincidentTopologyPolygonOffsetParameters(myPolygonOffsetFactor, - myPolygonOffsetUnits); + myPolygonOffsetUnits); myMapper->UseLookupTableScalarRangeOn(); myMapper->SetColorModeToMapScalars(); @@ -281,8 +281,8 @@ SMESH_DeviceActor void SMESH_DeviceActor ::SetControlMode(SMESH::Controls::FunctorPtr theFunctor, - vtkScalarBarActor* theScalarBarActor, - vtkLookupTable* theLookupTable) + vtkScalarBarActor* theScalarBarActor, + vtkLookupTable* theLookupTable) { bool anIsInitialized = theFunctor; if(anIsInitialized){ @@ -304,23 +304,23 @@ SMESH_DeviceActor using namespace SMESH::Controls; if(NumericalFunctor* aNumericalFunctor = dynamic_cast(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); + 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(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); + 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->SetNumberOfTableValues(theScalarBarActor->GetMaximumNumberOfColors()); theLookupTable->Build(); @@ -335,8 +335,8 @@ SMESH_DeviceActor void SMESH_DeviceActor ::SetExtControlMode(SMESH::Controls::FunctorPtr theFunctor, - vtkScalarBarActor* theScalarBarActor, - vtkLookupTable* theLookupTable) + vtkScalarBarActor* theScalarBarActor, + vtkLookupTable* theLookupTable) { bool anIsInitialized = theFunctor; myExtractUnstructuredGrid->ClearRegisteredCells(); @@ -374,18 +374,18 @@ SMESH_DeviceActor 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); - } + 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); + } } VTKViewer_CellLocationsArray* aCellLocationsArray = VTKViewer_CellLocationsArray::New(); @@ -394,7 +394,7 @@ SMESH_DeviceActor aConnectivity->InitTraversal(); for( vtkIdType idType = 0, *pts, npts; aConnectivity->GetNextCell( npts, pts ); idType++ ) - aCellLocationsArray->SetValue( idType, aConnectivity->GetTraversalLocation( npts ) ); + aCellLocationsArray->SetValue( idType, aConnectivity->GetTraversalLocation( npts ) ); aDataSet->SetCells( aCellTypesArray, aCellLocationsArray,aConnectivity ); SetUnstructuredGrid(aDataSet); @@ -434,18 +434,18 @@ SMESH_DeviceActor 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); - } + 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); + } } VTKViewer_CellLocationsArray* aCellLocationsArray = VTKViewer_CellLocationsArray::New(); @@ -454,7 +454,7 @@ SMESH_DeviceActor aConnectivity->InitTraversal(); for( vtkIdType idType = 0, *pts, npts; aConnectivity->GetNextCell( npts, pts ); idType++ ) - aCellLocationsArray->SetValue( idType, aConnectivity->GetTraversalLocation( npts ) ); + aCellLocationsArray->SetValue( idType, aConnectivity->GetTraversalLocation( npts ) ); aDataSet->SetCells( aCellTypesArray, aCellLocationsArray,aConnectivity ); SetUnstructuredGrid(aDataSet); @@ -492,7 +492,7 @@ SMESH_DeviceActor for( vtkIdType i = 0; i < aNbCells; i++ ){ vtkIdType anObjId = myVisualObj->GetElemObjId(i); if(aFreePredicate->IsSatisfy(anObjId)) - myExtractUnstructuredGrid->RegisterCell(i); + myExtractUnstructuredGrid->RegisterCell(i); } if(!myExtractUnstructuredGrid->IsCellsRegistered()) myExtractUnstructuredGrid->RegisterCell(-1); @@ -520,15 +520,15 @@ SMESH_DeviceActor for(; anIter != aBorders.end(); anIter++){ const FreeEdges::Border& aBorder = *anIter; int aNode[2] = { - myVisualObj->GetNodeVTKId(aBorder.myPntId[0]), - myVisualObj->GetNodeVTKId(aBorder.myPntId[1]) + myVisualObj->GetNodeVTKId(aBorder.myPntId[0]), + myVisualObj->GetNodeVTKId(aBorder.myPntId[1]) }; //cout<<"aNode = "<= 0 && aNode[1] >= 0){ - anIdList->SetId( 0, aNode[0] ); - anIdList->SetId( 1, aNode[1] ); - aConnectivity->InsertNextCell( anIdList ); - aCellTypesArray->InsertNextValue( VTK_LINE ); + anIdList->SetId( 0, aNode[0] ); + anIdList->SetId( 1, aNode[1] ); + aConnectivity->InsertNextCell( anIdList ); + aCellTypesArray->InsertNextValue( VTK_LINE ); } } @@ -546,12 +546,11 @@ SMESH_DeviceActor aDataSet->Delete(); }else if(FreeNodes* aFreeNodes = dynamic_cast(theFunctor.get())){ myExtractUnstructuredGrid->SetModeOfChanging(VTKViewer_ExtractUnstructuredGrid::eAdding); - vtkUnstructuredGrid* aGrid = myVisualObj->GetUnstructuredGrid(); vtkIdType aNbNodes = myVisualObj->GetNbEntities(SMDSAbs_Node); for( vtkIdType i = 0; i < aNbNodes; i++ ){ vtkIdType anObjId = myVisualObj->GetNodeObjId(i); if(aFreeNodes->IsSatisfy(anObjId)) - myExtractUnstructuredGrid->RegisterCell(i); + myExtractUnstructuredGrid->RegisterCell(i); } if(!myExtractUnstructuredGrid->IsCellsRegistered()) myExtractUnstructuredGrid->RegisterCell(-1); @@ -828,7 +827,7 @@ SMESH_DeviceActor void SMESH_DeviceActor ::SetPolygonOffsetParameters(vtkFloatingPointType factor, - vtkFloatingPointType units) + vtkFloatingPointType units) { myPolygonOffsetFactor = factor; myPolygonOffsetUnits = units; diff --git a/src/OBJECT/SMESH_DeviceActor.h b/src/OBJECT/SMESH_DeviceActor.h index 218050160..0b9acb48f 100644 --- a/src/OBJECT/SMESH_DeviceActor.h +++ b/src/OBJECT/SMESH_DeviceActor.h @@ -109,11 +109,11 @@ class SMESHOBJECT_EXPORT SMESH_DeviceActor: public vtkLODActor{ vtkUnstructuredGrid* GetUnstructuredGrid(); void SetControlMode(SMESH::Controls::FunctorPtr theFunctor, - vtkScalarBarActor* theScalarBarActor, - vtkLookupTable* theLookupTable); + vtkScalarBarActor* theScalarBarActor, + vtkLookupTable* theLookupTable); void SetExtControlMode(SMESH::Controls::FunctorPtr theFunctor, - vtkScalarBarActor* theScalarBarActor, - vtkLookupTable* theLookupTable); + vtkScalarBarActor* theScalarBarActor, + vtkLookupTable* theLookupTable); void SetExtControlMode(SMESH::Controls::FunctorPtr theFunctor); bool IsHighlited() { return myIsHighlited;} @@ -161,11 +161,11 @@ class SMESHOBJECT_EXPORT SMESH_DeviceActor: public vtkLODActor{ void SetPolygonOffsetParameters(vtkFloatingPointType factor, - vtkFloatingPointType units); + vtkFloatingPointType units); void GetPolygonOffsetParameters(vtkFloatingPointType& factor, - vtkFloatingPointType& units) + vtkFloatingPointType& units) { factor = myPolygonOffsetFactor; units = myPolygonOffsetUnits; diff --git a/src/OBJECT/SMESH_ExtractGeometry.cxx b/src/OBJECT/SMESH_ExtractGeometry.cxx index 0376aba38..c7c63af36 100644 --- a/src/OBJECT/SMESH_ExtractGeometry.cxx +++ b/src/OBJECT/SMESH_ExtractGeometry.cxx @@ -152,7 +152,7 @@ int SMESH_ExtractGeometry::RequestData( { newId = newPts->InsertNextPoint(x); pointMap[ptId] = newId; - myNodeVTK2ObjIds.push_back(ptId); + myNodeVTK2ObjIds.push_back(ptId); outputPD->CopyData(pd,ptId,newId); } } @@ -175,7 +175,7 @@ int SMESH_ExtractGeometry::RequestData( { newId = newPts->InsertNextPoint(x); pointMap[ptId] = newId; - myNodeVTK2ObjIds.push_back(ptId); + myNodeVTK2ObjIds.push_back(ptId); outputPD->CopyData(pd,ptId,newId); } } @@ -228,7 +228,7 @@ int SMESH_ExtractGeometry::RequestData( x = input->GetPoint(ptId); newId = newPts->InsertNextPoint(x); pointMap[ptId] = newId; - myNodeVTK2ObjIds.push_back(ptId); + myNodeVTK2ObjIds.push_back(ptId); outputPD->CopyData(pd,ptId,newId); } newCellPts->InsertId(i,pointMap[ptId]); diff --git a/src/OBJECT/SMESH_FaceOrientationFilter.cxx b/src/OBJECT/SMESH_FaceOrientationFilter.cxx index a7f5d1d94..cf09779d0 100644 --- a/src/OBJECT/SMESH_FaceOrientationFilter.cxx +++ b/src/OBJECT/SMESH_FaceOrientationFilter.cxx @@ -209,8 +209,8 @@ void GetFaceParams( vtkCell* theFace, double theNormal[3], double& theSize ) double* aBounds = theFace->GetBounds(); theSize = pow( pow( aBounds[1] - aBounds[0], 2 ) + - pow( aBounds[3] - aBounds[2], 2 ) + - pow( aBounds[5] - aBounds[4], 2 ), 0.5 ); + pow( aBounds[3] - aBounds[2], 2 ) + + pow( aBounds[5] - aBounds[4], 2 ), 0.5 ); } /*! @@ -268,7 +268,7 @@ int SMESH_FaceOrientationFilter::RequestData( input->GetCellNeighbors( aCellId, aFace->PointIds, aNeighborIds ); if( aNeighborIds->GetNumberOfIds() > 0 ) - continue; + continue; double aSize, aNormal[3]; GetFaceParams( aFace, aNormal, aSize ); diff --git a/src/OBJECT/SMESH_Object.cxx b/src/OBJECT/SMESH_Object.cxx index 5f12330ef..e7ef139a4 100644 --- a/src/OBJECT/SMESH_Object.cxx +++ b/src/OBJECT/SMESH_Object.cxx @@ -46,7 +46,7 @@ #include #include -#include +#include #include #include @@ -81,7 +81,7 @@ static int MYDEBUGWITHFILES = 0; // purpose : Get type of VTK cell //================================================================================= static inline vtkIdType getCellType( const SMDSAbs_ElementType theType, - const bool thePoly, + const bool thePoly, const int theNbNodes ) { switch( theType ) @@ -263,7 +263,7 @@ namespace{ typedef std::vector TConnect; int GetConnect(const SMDS_ElemIteratorPtr& theNodesIter, - TConnect& theConnect) + TConnect& theConnect) { theConnect.clear(); for(; theNodesIter->more();) @@ -273,10 +273,10 @@ namespace{ inline void SetId(vtkIdList *theIdList, - const SMESH_VisualObjDef::TMapOfIds& theSMDS2VTKNodes, - const TConnect& theConnect, - int thePosition, - int theId) + const SMESH_VisualObjDef::TMapOfIds& theSMDS2VTKNodes, + const TConnect& theConnect, + int thePosition, + int theId) { theIdList->SetId(thePosition,theSMDS2VTKNodes.find(theConnect[theId]->GetID())->second); } @@ -372,12 +372,12 @@ void SMESH_VisualObjDef::buildElemPrs() myVTK2SMDSElems.insert( TMapOfIds::value_type( iElem, anId ) ); SMDS_ElemIteratorPtr aNodesIter = anElem->nodesIterator(); - switch (aType) { - case SMDSAbs_Volume:{ + switch (aType) { + case SMDSAbs_Volume:{ aConnect.clear(); - std::vector aConnectivities; - // Convertions connectivities from SMDS to VTK - if (anElem->IsPoly() && aNbNodes > 3) { // POLYEDRE + std::vector aConnectivities; + // Convertions connectivities from SMDS to VTK + if (anElem->IsPoly() && aNbNodes > 3) { // POLYEDRE if ( const SMDS_PolyhedralVolumeOfNodes* ph = dynamic_cast (anElem)) @@ -385,67 +385,67 @@ void SMESH_VisualObjDef::buildElemPrs() aNbNodes = GetConnect(ph->uniqueNodesIterator(),aConnect); anIdList->SetNumberOfIds( aNbNodes ); } - for (int k = 0; k < aNbNodes; k++) - aConnectivities.push_back(k); + 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]); + 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 == 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 == 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]); + 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 (aNbNodes == 10) { - static int anIds[] = {0,2,1,3,6,5,4,7,9,8}; - for (int k = 0; k < aNbNodes; k++) aConnectivities.push_back(anIds[k]); - } + static int anIds[] = {0,2,1,3,6,5,4,7,9,8}; + for (int k = 0; k < aNbNodes; k++) aConnectivities.push_back(anIds[k]); + } else if (aNbNodes == 13) { - static int anIds[] = {0,3,2,1,4,8,7,6,5,9,12,11,10}; - for (int k = 0; k < aNbNodes; k++) aConnectivities.push_back(anIds[k]); - } + static int anIds[] = {0,3,2,1,4,8,7,6,5,9,12,11,10}; + for (int k = 0; k < aNbNodes; k++) aConnectivities.push_back(anIds[k]); + } else if (aNbNodes == 15) { //static int anIds[] = {0,2,1,3,5,4,8,7,6,11,10,9,12,14,13}; static int anIds[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14}; - for (int k = 0; k < aNbNodes; k++) aConnectivities.push_back(anIds[k]); - //for (int k = 0; k < aNbNodes; k++) { + for (int k = 0; k < aNbNodes; k++) aConnectivities.push_back(anIds[k]); + //for (int k = 0; k < aNbNodes; k++) { // int nn = aConnectivities[k]; // const SMDS_MeshNode* N = static_cast (aConnect[nn]); // cout<<"k="<X()<<","<Y()<<","<Z()<<")"< 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()] ); - } - } + 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 ) ); @@ -483,9 +483,9 @@ void SMESH_VisualObjDef::buildElemPrs() // 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 int theEdgeNum, + int& theNodeId1, + int& theNodeId2 ) const { const SMDS_Mesh* aMesh = GetMesh(); if ( aMesh == 0 ) @@ -520,6 +520,19 @@ bool SMESH_VisualObjDef::GetEdgeNodes( const int theElemId, return true; } +//================================================================================= +// function : IsValid +// purpose : Return true if there are some entities +//================================================================================= +bool SMESH_VisualObjDef::IsValid() const +{ + return GetNbEntities(SMDSAbs_Node) > 0 || + GetNbEntities(SMDSAbs_0DElement) > 0 || + GetNbEntities(SMDSAbs_Edge) > 0 || + GetNbEntities(SMDSAbs_Face) > 0 || + GetNbEntities(SMDSAbs_Volume) > 0 ; +} + /* Class : SMESH_MeshObj Description : Class for visualisation of mesh @@ -678,7 +691,7 @@ void SMESH_MeshObj::UpdateFunctor( const SMESH::Controls::FunctorPtr& theFunctor //================================================================================= bool SMESH_MeshObj::IsNodePrs() const { - return myClient->NbEdges() == 0 &&myClient->NbFaces() == 0 && myClient->NbVolumes() == 0 ; + return myClient->Nb0DElements() == 0 && myClient->NbEdges() == 0 && myClient->NbFaces() == 0 && myClient->NbVolumes() == 0 ; } @@ -905,7 +918,7 @@ int SMESH_subMeshObj::GetNbEntities( const SMDSAbs_ElementType theType) const case SMDSAbs_Volume: { SMESH::long_array_var anIds = - mySubMeshServer->GetElementsByType( SMESH::ElementType(theType) ); + mySubMeshServer->GetElementsByType( SMESH::ElementType(theType) ); return anIds->length(); } default: @@ -942,7 +955,7 @@ int SMESH_subMeshObj::GetEntities( const SMDSAbs_ElementType theType, TEntityLis else { SMESH::long_array_var anIds = - mySubMeshServer->GetElementsByType( SMESH::ElementType(theType) ); + mySubMeshServer->GetElementsByType( SMESH::ElementType(theType) ); return getPointers( theType, anIds, aMesh, theResList ); } } diff --git a/src/OBJECT/SMESH_Object.h b/src/OBJECT/SMESH_Object.h index 3d4dbbf8b..3bc178eca 100644 --- a/src/OBJECT/SMESH_Object.h +++ b/src/OBJECT/SMESH_Object.h @@ -62,9 +62,10 @@ public: virtual SMDS_Mesh* GetMesh() const = 0; virtual bool GetEdgeNodes( const int theElemId, - const int theEdgeNum, - int& theNodeId1, - int& theNodeId2 ) const = 0; + const int theEdgeNum, + int& theNodeId1, + int& theNodeId2 ) const = 0; + virtual bool IsValid() const = 0; virtual vtkUnstructuredGrid* GetUnstructuredGrid() = 0; diff --git a/src/OBJECT/SMESH_ObjectDef.h b/src/OBJECT/SMESH_ObjectDef.h index 094504f33..82f540913 100644 --- a/src/OBJECT/SMESH_ObjectDef.h +++ b/src/OBJECT/SMESH_ObjectDef.h @@ -69,6 +69,8 @@ public: virtual bool IsNodePrs() const = 0; virtual SMDS_Mesh* GetMesh() const = 0; + virtual bool IsValid() const; + virtual bool GetEdgeNodes( const int theElemId, const int theEdgeNum, int& theNodeId1, diff --git a/src/OBJECT/SMESH_PreviewActorsCollection.cxx b/src/OBJECT/SMESH_PreviewActorsCollection.cxx index d07e33b71..e565701da 100644 --- a/src/OBJECT/SMESH_PreviewActorsCollection.cxx +++ b/src/OBJECT/SMESH_PreviewActorsCollection.cxx @@ -137,25 +137,25 @@ GEOM_Actor* SMESH_PreviewActorsCollection::createActor(const TopoDS_Shape& shape actor->SetShape(shape,0,0); //Color Properties - /* - vtkProperty* aProp = vtkProperty::New(); - vtkProperty* aHLProp = vtkProperty::New(); - vtkProperty* aPHLProp = vtkProperty::New(); - - aProp->SetColor( 255, 0, 0); - actor->SetProperty(aProp); - - aHLProp->SetColor( 255, 255, 255); - actor->SetHighlightProperty(aHLProp); - - aPHLProp->SetColor( 155, 155, 155); - aPHLProp->SetLineWidth ( 3 ); - aPHLProp->SetOpacity ( 0.75 ); - actor->SetPreHighlightProperty(aPHLProp); - - aProp->Delete(); - aHLProp->Delete(); - aPHLProp->Delete(); + /* + vtkProperty* aProp = vtkProperty::New(); + vtkProperty* aHLProp = vtkProperty::New(); + vtkProperty* aPHLProp = vtkProperty::New(); + + aProp->SetColor( 255, 0, 0); + actor->SetProperty(aProp); + + aHLProp->SetColor( 255, 255, 255); + actor->SetHighlightProperty(aHLProp); + + aPHLProp->SetColor( 155, 155, 155); + aPHLProp->SetLineWidth ( 3 ); + aPHLProp->SetOpacity ( 0.75 ); + actor->SetPreHighlightProperty(aPHLProp); + + aProp->Delete(); + aHLProp->Delete(); + aPHLProp->Delete(); */ return actor; diff --git a/src/SMDS/SMDS_EdgePosition.cxx b/src/SMDS/SMDS_EdgePosition.cxx index 1317d2b75..ae5bf5ccd 100644 --- a/src/SMDS/SMDS_EdgePosition.cxx +++ b/src/SMDS/SMDS_EdgePosition.cxx @@ -36,7 +36,7 @@ using namespace std; //======================================================================= SMDS_EdgePosition::SMDS_EdgePosition(const int aEdgeId, - const double aUParam):SMDS_Position(aEdgeId), myUParameter(aUParam) + const double aUParam):SMDS_Position(aEdgeId), myUParameter(aUParam) { } @@ -47,21 +47,21 @@ SMDS_EdgePosition::SMDS_EdgePosition(const int aEdgeId, const double *SMDS_EdgePosition::Coords() const { - static double origin[]={0,0,0}; - MESSAGE("SMDS_EdgePosition::Coords not implemented"); - return origin; + static double origin[]={0,0,0}; + MESSAGE("SMDS_EdgePosition::Coords not implemented"); + return origin; } /** */ SMDS_TypeOfPosition SMDS_EdgePosition::GetTypeOfPosition() const { - return SMDS_TOP_EDGE; + return SMDS_TOP_EDGE; } void SMDS_EdgePosition::SetUParameter(double aUparam) { - myUParameter = aUparam; + myUParameter = aUparam; } //======================================================================= @@ -71,5 +71,5 @@ void SMDS_EdgePosition::SetUParameter(double aUparam) double SMDS_EdgePosition::GetUParameter() const { - return myUParameter; + return myUParameter; } diff --git a/src/SMDS/SMDS_Mesh.hxx b/src/SMDS/SMDS_Mesh.hxx index 8a68e9a1e..db64ab782 100644 --- a/src/SMDS/SMDS_Mesh.hxx +++ b/src/SMDS/SMDS_Mesh.hxx @@ -75,40 +75,40 @@ public: virtual SMDS_MeshEdge* AddEdgeWithID(int n1, int n2, int ID); virtual SMDS_MeshEdge* AddEdgeWithID(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - int ID); + const SMDS_MeshNode * n2, + int ID); virtual SMDS_MeshEdge* AddEdge(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2); + const SMDS_MeshNode * n2); // 2d order edge with 3 nodes: n12 - node between n1 and n2 virtual SMDS_MeshEdge* AddEdgeWithID(int n1, int n2, int n12, int ID); virtual SMDS_MeshEdge* AddEdgeWithID(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n12, - int ID); + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n12, + int ID); virtual SMDS_MeshEdge* AddEdge(const SMDS_MeshNode * n1, const SMDS_MeshNode * n2, const SMDS_MeshNode * n12); 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); + 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); + 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); + 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); + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4); virtual SMDS_MeshFace* AddFaceWithID(const SMDS_MeshEdge * e1, const SMDS_MeshEdge * e2, @@ -130,100 +130,100 @@ public: virtual SMDS_MeshFace* AddFaceWithID(int n1, int n2, int n3, int n12,int n23,int n31, int ID); virtual SMDS_MeshFace* AddFaceWithID(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n12, - const SMDS_MeshNode * n23, - const SMDS_MeshNode * n31, - int ID); + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n12, + const SMDS_MeshNode * n23, + const SMDS_MeshNode * n31, + int ID); virtual SMDS_MeshFace* AddFace(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, const SMDS_MeshNode * n12, - const SMDS_MeshNode * n23, - const SMDS_MeshNode * n31); + const SMDS_MeshNode * n23, + const SMDS_MeshNode * n31); // 2d order quadrangle virtual SMDS_MeshFace* AddFaceWithID(int n1, int n2, int n3, int n4, int n12,int n23,int n34,int n41, int ID); virtual SMDS_MeshFace* AddFaceWithID(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, - const SMDS_MeshNode * n12, - const SMDS_MeshNode * n23, - const SMDS_MeshNode * n34, - const SMDS_MeshNode * n41, - int ID); + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4, + const SMDS_MeshNode * n12, + const SMDS_MeshNode * n23, + const SMDS_MeshNode * n34, + const SMDS_MeshNode * n41, + int ID); virtual SMDS_MeshFace* AddFace(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4, const SMDS_MeshNode * n12, - const SMDS_MeshNode * n23, - const SMDS_MeshNode * n34, - const SMDS_MeshNode * n41); + const SMDS_MeshNode * n23, + const SMDS_MeshNode * n34, + const SMDS_MeshNode * n41); 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); + 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); + 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); + 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); + 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); + 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); + 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); + 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); + 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, @@ -263,20 +263,20 @@ public: int n12,int n23,int n31, int n14,int n24,int n34, 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 * n12, - const SMDS_MeshNode * n23, - const SMDS_MeshNode * n31, - const SMDS_MeshNode * n14, - const SMDS_MeshNode * n24, - const SMDS_MeshNode * n34, - int ID); + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4, + const SMDS_MeshNode * n12, + const SMDS_MeshNode * n23, + const SMDS_MeshNode * n31, + const SMDS_MeshNode * n14, + const SMDS_MeshNode * n24, + const SMDS_MeshNode * n34, + 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 * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4, const SMDS_MeshNode * n12, const SMDS_MeshNode * n23, const SMDS_MeshNode * n31, @@ -290,24 +290,24 @@ public: int n15,int n25,int n35,int n45, 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 * n12, - const SMDS_MeshNode * n23, - const SMDS_MeshNode * n34, - const SMDS_MeshNode * n41, - const SMDS_MeshNode * n15, - const SMDS_MeshNode * n25, - const SMDS_MeshNode * n35, - const SMDS_MeshNode * n45, - int ID); + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4, + const SMDS_MeshNode * n5, + const SMDS_MeshNode * n12, + const SMDS_MeshNode * n23, + const SMDS_MeshNode * n34, + const SMDS_MeshNode * n41, + const SMDS_MeshNode * n15, + const SMDS_MeshNode * n25, + const SMDS_MeshNode * n35, + const SMDS_MeshNode * n45, + 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 * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4, + const SMDS_MeshNode * n5, const SMDS_MeshNode * n12, const SMDS_MeshNode * n23, const SMDS_MeshNode * n34, @@ -325,27 +325,27 @@ public: int n14,int n25,int n36, 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 * n12, - const SMDS_MeshNode * n23, - const SMDS_MeshNode * n31, - const SMDS_MeshNode * n45, - const SMDS_MeshNode * n56, - const SMDS_MeshNode * n64, - const SMDS_MeshNode * n14, - const SMDS_MeshNode * n25, - const SMDS_MeshNode * n36, - int ID); + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4, + const SMDS_MeshNode * n5, + const SMDS_MeshNode * n6, + const SMDS_MeshNode * n12, + const SMDS_MeshNode * n23, + const SMDS_MeshNode * n31, + const SMDS_MeshNode * n45, + const SMDS_MeshNode * n56, + const SMDS_MeshNode * n64, + const SMDS_MeshNode * n14, + const SMDS_MeshNode * n25, + const SMDS_MeshNode * n36, + 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 * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4, + const SMDS_MeshNode * n5, + const SMDS_MeshNode * n6, const SMDS_MeshNode * n12, const SMDS_MeshNode * n23, const SMDS_MeshNode * n31, @@ -364,34 +364,34 @@ public: int n15,int n26,int n37,int n48, 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, - const SMDS_MeshNode * n12, - const SMDS_MeshNode * n23, - const SMDS_MeshNode * n34, - const SMDS_MeshNode * n41, - const SMDS_MeshNode * n56, - const SMDS_MeshNode * n67, - const SMDS_MeshNode * n78, - const SMDS_MeshNode * n85, - const SMDS_MeshNode * n15, - const SMDS_MeshNode * n26, - const SMDS_MeshNode * n37, - const SMDS_MeshNode * n48, - int ID); + 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, + const SMDS_MeshNode * n12, + const SMDS_MeshNode * n23, + const SMDS_MeshNode * n34, + const SMDS_MeshNode * n41, + const SMDS_MeshNode * n56, + const SMDS_MeshNode * n67, + const SMDS_MeshNode * n78, + const SMDS_MeshNode * n85, + const SMDS_MeshNode * n15, + const SMDS_MeshNode * n26, + const SMDS_MeshNode * n37, + const SMDS_MeshNode * n48, + 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, + 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, const SMDS_MeshNode * n12, const SMDS_MeshNode * n23, const SMDS_MeshNode * n34, @@ -559,29 +559,29 @@ private: SMDS_Mesh(SMDS_Mesh * parent); SMDS_MeshFace * createTriangle(const SMDS_MeshNode * node1, - const SMDS_MeshNode * node2, - const SMDS_MeshNode * node3); + 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, + const SMDS_MeshNode * node2, + const SMDS_MeshNode * node3, + const SMDS_MeshNode * node4, int ID); // SMDS_Mesh0DElement* Find0DElementOrCreate(const SMDS_MeshNode * n); SMDS_MeshEdge* FindEdgeOrCreate(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2); + const SMDS_MeshNode * n2); SMDS_MeshFace* FindFaceOrCreate(const SMDS_MeshNode *n1, - const SMDS_MeshNode *n2, - const SMDS_MeshNode *n3); + 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); + const SMDS_MeshNode *n2, + const SMDS_MeshNode *n3, + const SMDS_MeshNode *n4); bool registerElement(int ID, SMDS_MeshElement * element); void addChildrenWithNodes(std::set& setOfChildren, - const SMDS_MeshElement * element, - std::set& nodes); + const SMDS_MeshElement * element, + std::set& nodes); inline void adjustmyCellsCapacity(int ID) { diff --git a/src/SMDS/SMDS_VolumeOfNodes.cxx b/src/SMDS/SMDS_VolumeOfNodes.cxx index 02e2661a3..73b61ca3f 100644 --- a/src/SMDS/SMDS_VolumeOfNodes.cxx +++ b/src/SMDS/SMDS_VolumeOfNodes.cxx @@ -40,73 +40,73 @@ using namespace std; /// 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) + 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; + 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) + 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; + 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) + 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; + 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) + 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; + 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[], @@ -139,40 +139,40 @@ SMDS_VolumeOfNodes::~SMDS_VolumeOfNodes() void SMDS_VolumeOfNodes::Print(ostream & OS) const { - OS << "volume <" << GetID() << "> : "; - int i; - for (i = 0; i < NbNodes()-1; ++i) OS << myNodes[i] << ","; - OS << myNodes[NbNodes()-1]<< ") " << endl; + OS << "volume <" << GetID() << "> : "; + int i; + for (i = 0; i < NbNodes()-1; ++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"); - } + 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; + 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"); - } + 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; } @@ -234,7 +234,7 @@ SMDS_ElemIteratorPtr SMDS_VolumeOfNodes::elementsIterator(SMDSAbs_ElementType ty SMDSAbs_ElementType SMDS_VolumeOfNodes::GetType() const { - return SMDSAbs_Volume; + return SMDSAbs_Volume; } /*! diff --git a/src/SMDS/SMDS_VolumeTool.cxx b/src/SMDS/SMDS_VolumeTool.cxx index 0984cb505..24509b255 100644 --- a/src/SMDS/SMDS_VolumeTool.cxx +++ b/src/SMDS/SMDS_VolumeTool.cxx @@ -368,6 +368,8 @@ static int QuadHexa_nbN [] = { 8, 8, 8, 8, 8, 8 }; // ======================================================== // to perform some calculations without linkage to CASCADE // ======================================================== +namespace +{ struct XYZ { double x; double y; @@ -376,25 +378,26 @@ struct XYZ { XYZ( double X, double Y, double Z ) { x = X; y = Y; z = Z; } XYZ( const XYZ& other ) { x = other.x; y = other.y; z = other.z; } XYZ( const SMDS_MeshNode* n ) { x = n->X(); y = n->Y(); z = n->Z(); } - XYZ operator-( const XYZ& other ); - XYZ Crossed( const XYZ& other ); - double Dot( const XYZ& other ); - double Magnitude(); + inline XYZ operator-( const XYZ& other ); + inline XYZ Crossed( const XYZ& other ); + inline double Dot( const XYZ& other ); + inline double Magnitude(); }; -XYZ XYZ::operator-( const XYZ& Right ) { +inline XYZ XYZ::operator-( const XYZ& Right ) { return XYZ(x - Right.x, y - Right.y, z - Right.z); } -XYZ XYZ::Crossed( const XYZ& Right ) { +inline XYZ XYZ::Crossed( const XYZ& Right ) { return XYZ (y * Right.z - z * Right.y, z * Right.x - x * Right.z, x * Right.y - y * Right.x); } -double XYZ::Dot( const XYZ& Other ) { +inline double XYZ::Dot( const XYZ& Other ) { return(x * Other.x + y * Other.y + z * Other.z); } -double XYZ::Magnitude() { +inline double XYZ::Magnitude() { return sqrt (x * x + y * y + z * z); } +} //======================================================================= //function : SMDS_VolumeTool @@ -837,6 +840,32 @@ bool SMDS_VolumeTool::GetBaryCenter(double & X, double & Y, double & Z) const return true; } +//================================================================================ +/*! + * \brief Classify a point + * \param tol - thickness of faces + */ +//================================================================================ + +bool SMDS_VolumeTool::IsOut(double X, double Y, double Z, double tol) +{ + // LIMITATION: for convex volumes only + XYZ p( X,Y,Z ); + for ( int iF = 0; iF < myNbFaces; ++iF ) + { + XYZ faceNormal; + if ( !GetFaceNormal( iF, faceNormal.x, faceNormal.y, faceNormal.z )) + continue; + if ( !IsFaceExternal( iF )) + faceNormal = XYZ() - faceNormal; // reverse + + XYZ face2p( p - XYZ( myFaceNodes[0] )); + if ( face2p.Dot( faceNormal ) > tol ) + return true; + } + return false; +} + //======================================================================= //function : SetExternalNormal //purpose : Node order will be so that faces normals are external diff --git a/src/SMDS/SMDS_VolumeTool.hxx b/src/SMDS/SMDS_VolumeTool.hxx index b95bc8a62..3b637c839 100644 --- a/src/SMDS/SMDS_VolumeTool.hxx +++ b/src/SMDS/SMDS_VolumeTool.hxx @@ -93,6 +93,8 @@ class SMDS_EXPORT SMDS_VolumeTool bool GetBaryCenter (double & X, double & Y, double & Z) const; + bool IsOut(double X, double Y, double Z, double tol); + // Classify a point // ----------------------- // info on node connection diff --git a/src/SMESH/SMESH_Block.cxx b/src/SMESH/SMESH_Block.cxx index 59971bfee..821d8fa9f 100644 --- a/src/SMESH/SMESH_Block.cxx +++ b/src/SMESH/SMESH_Block.cxx @@ -996,7 +996,8 @@ int SMESH_Block::GetOrderedEdges (const TopoDS_Face& theFace, for ( iE = 0; wExp.More(); wExp.Next(), iE++ ) { TopoDS_Edge edge = wExp.Current(); - edge = TopoDS::Edge( edge.Oriented( wExp.Orientation() )); + // commented for issue 0020557, other related ones: 0020526, PAL19080 + // edge = TopoDS::Edge( edge.Oriented( wExp.Orientation() )); theEdges.push_back( edge ); } theNbVertexInWires.push_back( iE ); diff --git a/src/SMESH/SMESH_Gen.cxx b/src/SMESH/SMESH_Gen.cxx index 4a998052c..92f5b3f6b 100644 --- a/src/SMESH/SMESH_Gen.cxx +++ b/src/SMESH/SMESH_Gen.cxx @@ -53,9 +53,9 @@ using namespace std; SMESH_Gen::SMESH_Gen() { - MESSAGE("SMESH_Gen::SMESH_Gen"); - _localId = 0; - _hypId = 0; + MESSAGE("SMESH_Gen::SMESH_Gen"); + _localId = 0; + _hypId = 0; _segmentation = 10; SMDS_Mesh::_meshList.clear(); MESSAGE(SMDS_Mesh::_meshList.size()); @@ -69,7 +69,7 @@ SMESH_Gen::SMESH_Gen() SMESH_Gen::~SMESH_Gen() { - MESSAGE("SMESH_Gen::~SMESH_Gen"); + MESSAGE("SMESH_Gen::~SMESH_Gen"); } //============================================================================= @@ -79,26 +79,26 @@ SMESH_Gen::~SMESH_Gen() //============================================================================= /*SMESH_Hypothesis *SMESH_Gen::CreateHypothesis(const char *anHyp, int studyId) - throw(SALOME_Exception) + throw(SALOME_Exception) { - MESSAGE("CreateHypothesis("<GetID(); - myStudyContext->mapHypothesis[hypId] = myHypothesis; - SCRUTE(studyId); - SCRUTE(hypId); + SMESH_Hypothesis *myHypothesis = _hypothesisFactory.Create(anHyp, studyId); + int hypId = myHypothesis->GetID(); + myStudyContext->mapHypothesis[hypId] = myHypothesis; + SCRUTE(studyId); + SCRUTE(hypId); - // store hypothesis in SMESHDS document + // store hypothesis in SMESHDS document - myStudyContext->myDocument->AddHypothesis(myHypothesis); - return myHypothesis; + myStudyContext->myDocument->AddHypothesis(myHypothesis); + return myHypothesis; }*/ //============================================================================= @@ -118,10 +118,10 @@ SMESH_Mesh* SMESH_Gen::CreateMesh(int theStudyId, bool theIsEmbeddedMode) // create a new SMESH_mesh object SMESH_Mesh *aMesh = new SMESH_Mesh(_localId++, - theStudyId, - this, - theIsEmbeddedMode, - aStudyContext->myDocument); + theStudyId, + this, + theIsEmbeddedMode, + aStudyContext->myDocument); aStudyContext->mapMesh[_localId] = aMesh; return aMesh; @@ -136,8 +136,8 @@ SMESH_Mesh* SMESH_Gen::CreateMesh(int theStudyId, bool theIsEmbeddedMode) bool SMESH_Gen::Compute(SMESH_Mesh & aMesh, const TopoDS_Shape & aShape, const bool anUpward, - const ::MeshDimension aDim, - TSetOfInt* aShapesId) + const ::MeshDimension aDim, + TSetOfInt* aShapesId) { MESSAGE("SMESH_Gen::Compute"); MEMOSTAT; @@ -172,7 +172,7 @@ bool SMESH_Gen::Compute(SMESH_Mesh & aMesh, // clear compute state to not show previous compute errors // if preview invoked less dimension less than previous smToCompute->ComputeStateEngine( SMESH_subMesh::CHECK_COMPUTE_STATE ); - continue; + continue; } if (smToCompute->GetComputeState() == SMESH_subMesh::READY_TO_COMPUTE) @@ -182,7 +182,7 @@ bool SMESH_Gen::Compute(SMESH_Mesh & aMesh, if (smToCompute->GetComputeState() == SMESH_subMesh::FAILED_TO_COMPUTE) ret = false; else if ( aShapesId ) - aShapesId->insert( smToCompute->GetId() ); + aShapesId->insert( smToCompute->GetId() ); } return ret; } @@ -207,7 +207,7 @@ bool SMESH_Gen::Compute(SMESH_Mesh & aMesh, // check for preview dimension limitations if ( aShapesId && aShapeDim > (int)aDim ) - continue; + continue; SMESH_Algo* algo = GetAlgo( aMesh, aSubShape ); if ( algo && !algo->NeedDescretBoundary() ) @@ -215,11 +215,11 @@ bool SMESH_Gen::Compute(SMESH_Mesh & aMesh, if ( algo->SupportSubmeshes() ) smWithAlgoSupportingSubmeshes.push_back( smToCompute ); else - { + { smToCompute->ComputeStateEngine( SMESH_subMesh::COMPUTE ); - if ( aShapesId ) - aShapesId->insert( smToCompute->GetId() ); - } + if ( aShapesId ) + aShapesId->insert( smToCompute->GetId() ); + } } } // ------------------------------------------------------------ @@ -246,14 +246,14 @@ bool SMESH_Gen::Compute(SMESH_Mesh & aMesh, SMESH_subMesh* smToCompute = smIt->next(); const TopoDS_Shape& aSubShape = smToCompute->GetSubShape(); - const int aShapeDim = GetShapeDim( aSubShape ); + const int aShapeDim = GetShapeDim( aSubShape ); //if ( aSubShape.ShapeType() == TopAbs_VERTEX ) continue; - if ( aShapeDim < 1 ) continue; + if ( aShapeDim < 1 ) continue; - // check for preview dimension limitations - if ( aShapesId && GetShapeDim( aSubShape.ShapeType() ) > (int)aDim ) - continue; - + // check for preview dimension limitations + if ( aShapesId && GetShapeDim( aSubShape.ShapeType() ) > (int)aDim ) + continue; + SMESH_HypoFilter filter( SMESH_HypoFilter::IsAlgo() ); filter .And( SMESH_HypoFilter::IsApplicableTo( aSubShape )) @@ -271,18 +271,20 @@ bool SMESH_Gen::Compute(SMESH_Mesh & aMesh, // apply the algos that do not require descretized boundaries // ---------------------------------------------------------- for ( subIt = smWithAlgoSupportingSubmeshes.rbegin(); subIt != subEnd; ++subIt ) + { + sm = *subIt; if ( sm->GetComputeState() == SMESH_subMesh::READY_TO_COMPUTE) { - const TopAbs_ShapeEnum aShType = sm->GetSubShape().ShapeType(); - // check for preview dimension limitations - if ( aShapesId && GetShapeDim( aShType ) > (int)aDim ) - continue; + const TopAbs_ShapeEnum aShType = sm->GetSubShape().ShapeType(); + // check for preview dimension limitations + if ( aShapesId && GetShapeDim( aShType ) > (int)aDim ) + continue; sm->ComputeStateEngine( SMESH_subMesh::COMPUTE ); - if ( aShapesId ) - aShapesId->insert( sm->GetId() ); + if ( aShapesId ) + aShapesId->insert( sm->GetId() ); } - + } // ----------------------------------------------- // mesh the rest subshapes starting from vertices // ----------------------------------------------- @@ -304,8 +306,8 @@ bool SMESH_Gen::Compute(SMESH_Mesh & aMesh, bool SMESH_Gen::Evaluate(SMESH_Mesh & aMesh, const TopoDS_Shape & aShape, MapShapeNbElems& aResMap, - const bool anUpward, - TSetOfInt* aShapesId) + const bool anUpward, + TSetOfInt* aShapesId) { MESSAGE("SMESH_Gen::Evaluate"); @@ -330,14 +332,14 @@ bool SMESH_Gen::Evaluate(SMESH_Mesh & aMesh, //if ( !aMesh.HasShapeToMesh() && aShType == TopAbs_VERTEX ) // continue; if ( !aMesh.HasShapeToMesh() ) { - if( aShType == TopAbs_VERTEX || aShType == TopAbs_WIRE || - aShType == TopAbs_SHELL ) - continue; + if( aShType == TopAbs_VERTEX || aShType == TopAbs_WIRE || + aShType == TopAbs_SHELL ) + continue; } smToCompute->Evaluate(aResMap); if( aShapesId ) - aShapesId->insert( smToCompute->GetId() ); + aShapesId->insert( smToCompute->GetId() ); } return ret; } @@ -359,12 +361,12 @@ bool SMESH_Gen::Evaluate(SMESH_Mesh & aMesh, if ( algo && !algo->NeedDescretBoundary() ) { if ( algo->SupportSubmeshes() ) { smWithAlgoSupportingSubmeshes.push_back( smToCompute ); - } + } else { smToCompute->Evaluate(aResMap); - if ( aShapesId ) - aShapesId->insert( smToCompute->GetId() ); - } + if ( aShapesId ) + aShapesId->insert( smToCompute->GetId() ); + } } } // ------------------------------------------------------------ @@ -389,10 +391,10 @@ bool SMESH_Gen::Evaluate(SMESH_Mesh & aMesh, SMESH_subMesh* smToCompute = smIt->next(); const TopoDS_Shape& aSubShape = smToCompute->GetSubShape(); - const int aShapeDim = GetShapeDim( aSubShape ); - if ( aShapeDim < 1 ) continue; + const int aShapeDim = GetShapeDim( aSubShape ); + if ( aShapeDim < 1 ) continue; - //const TopAbs_ShapeEnum aShType = smToCompute->GetSubShape().ShapeType(); + //const TopAbs_ShapeEnum aShType = smToCompute->GetSubShape().ShapeType(); SMESH_HypoFilter filter( SMESH_HypoFilter::IsAlgo() ); filter @@ -410,10 +412,12 @@ bool SMESH_Gen::Evaluate(SMESH_Mesh & aMesh, // ---------------------------------------------------------- // apply the algos that do not require descretized boundaries // ---------------------------------------------------------- - for ( subIt = smWithAlgoSupportingSubmeshes.rbegin(); subIt != subEnd; ++subIt ) { + for ( subIt = smWithAlgoSupportingSubmeshes.rbegin(); subIt != subEnd; ++subIt ) + { + sm = *subIt; sm->Evaluate(aResMap); if ( aShapesId ) - aShapesId->insert( sm->GetId() ); + aShapesId->insert( sm->GetId() ); } // ----------------------------------------------- @@ -437,7 +441,7 @@ static bool checkConformIgnoredAlgos(SMESH_Mesh& aMesh, const SMESH_Algo* aGlobIgnoAlgo, const SMESH_Algo* aLocIgnoAlgo, bool & checkConform, - map& aCheckedMap, + set& aCheckedMap, list< SMESH_Gen::TAlgoStateError > & theErrors) { ASSERT( aSubMesh ); @@ -492,19 +496,15 @@ static bool checkConformIgnoredAlgos(SMESH_Mesh& aMesh, } // sub-algos will be hidden by a local - const map& smMap = aSubMesh->DependsOn(); - map::const_reverse_iterator revItSub; + SMESH_subMeshIteratorPtr revItSub = + aSubMesh->getDependsOnIterator( /*includeSelf=*/false, /*complexShapeFirst=*/true); bool checkConform2 = false; - for ( revItSub = smMap.rbegin(); revItSub != smMap.rend(); revItSub++) + while ( revItSub->more() ) { - checkConformIgnoredAlgos (aMesh, (*revItSub).second, aGlobIgnoAlgo, + SMESH_subMesh* sm = revItSub->next(); + checkConformIgnoredAlgos (aMesh, sm, aGlobIgnoAlgo, algo, checkConform2, aCheckedMap, theErrors); - int key = (*revItSub).first; - SMESH_subMesh* sm = (*revItSub).second; - if ( aCheckedMap.find( key ) == aCheckedMap.end() ) - { - aCheckedMap[ key ] = sm; - } + aCheckedMap.insert( sm ); } } } @@ -525,7 +525,7 @@ static bool checkMissing(SMESH_Gen* aGen, const int aTopAlgoDim, bool* globalChecked, const bool checkNoAlgo, - map& aCheckedMap, + set& aCheckedMap, list< SMESH_Gen::TAlgoStateError > & theErrors) { if ( aSubMesh->GetSubShape().ShapeType() == TopAbs_VERTEX) @@ -598,15 +598,13 @@ static bool checkMissing(SMESH_Gen* aGen, if (!algo->NeedDescretBoundary() || isTopLocalAlgo) { bool checkNoAlgo2 = ( algo->NeedDescretBoundary() ); - const map& subMeshes = aSubMesh->DependsOn(); - map::const_iterator itsub; - for (itsub = subMeshes.begin(); itsub != subMeshes.end(); itsub++) + SMESH_subMeshIteratorPtr itsub = aSubMesh->getDependsOnIterator( /*includeSelf=*/false, + /*complexShapeFirst=*/false); + while ( itsub->more() ) { // sub-meshes should not be checked further more - int key = (*itsub).first; - SMESH_subMesh* sm = (*itsub).second; - if ( aCheckedMap.find( key ) == aCheckedMap.end() ) - aCheckedMap[ key ] = sm; + SMESH_subMesh* sm = itsub->next(); + aCheckedMap.insert( sm ); if (isTopLocalAlgo) { @@ -700,39 +698,25 @@ bool SMESH_Gen::GetAlgoState(SMESH_Mesh& theMesh, } } - const map& smMap = sm->DependsOn(); - map::const_reverse_iterator revItSub = smMap.rbegin(); - map aCheckedMap; + set aCheckedSubs; bool checkConform = ( !theMesh.IsNotConformAllowed() ); - int aKey = 1; - SMESH_subMesh* smToCheck = sm; // loop on theShape and its sub-shapes - while ( smToCheck ) + SMESH_subMeshIteratorPtr revItSub = sm->getDependsOnIterator( /*includeSelf=*/true, + /*complexShapeFirst=*/true); + while ( revItSub->more() ) { + SMESH_subMesh* smToCheck = revItSub->next(); if ( smToCheck->GetSubShape().ShapeType() == TopAbs_VERTEX) break; - if ( aCheckedMap.find( aKey ) == aCheckedMap.end() ) + if ( aCheckedSubs.insert( smToCheck ).second ) // not yet checked if (!checkConformIgnoredAlgos (theMesh, smToCheck, aGlobIgnoAlgo, - 0, checkConform, aCheckedMap, theErrors)) + 0, checkConform, aCheckedSubs, theErrors)) ret = false; if ( smToCheck->GetAlgoState() != SMESH_subMesh::NO_ALGO ) hasAlgo = true; - - // next subMesh - if (revItSub != smMap.rend()) - { - aKey = (*revItSub).first; - smToCheck = (*revItSub).second; - revItSub++; - } - else - { - smToCheck = 0; - } - } // ---------------------------------------------------------------- @@ -752,36 +736,26 @@ bool SMESH_Gen::GetAlgoState(SMESH_Mesh& theMesh, break; } } - aCheckedMap.clear(); - smToCheck = sm; - revItSub = smMap.rbegin(); bool checkNoAlgo = theMesh.HasShapeToMesh() ? bool( aTopAlgoDim ) : false; bool globalChecked[] = { false, false, false, false }; // loop on theShape and its sub-shapes - while ( smToCheck ) + aCheckedSubs.clear(); + revItSub = sm->getDependsOnIterator( /*includeSelf=*/true, /*complexShapeFirst=*/true); + while ( revItSub->more() ) { + SMESH_subMesh* smToCheck = revItSub->next(); if ( smToCheck->GetSubShape().ShapeType() == TopAbs_VERTEX) break; - if ( aCheckedMap.find( aKey ) == aCheckedMap.end() ) + if ( aCheckedSubs.insert( smToCheck ).second ) // not yet checked if (!checkMissing (this, theMesh, smToCheck, aTopAlgoDim, - globalChecked, checkNoAlgo, aCheckedMap, theErrors)) + globalChecked, checkNoAlgo, aCheckedSubs, theErrors)) { ret = false; if (smToCheck->GetAlgoState() == SMESH_subMesh::NO_ALGO ) checkNoAlgo = false; } - - // next subMesh - if (revItSub != smMap.rend()) - { - aKey = (*revItSub).first; - smToCheck = (*revItSub).second; - revItSub++; - } - else - smToCheck = 0; } if ( !hasAlgo ) { @@ -830,16 +804,16 @@ SMESH_Algo *SMESH_Gen::GetAlgo(SMESH_Mesh & aMesh, StudyContextStruct *SMESH_Gen::GetStudyContext(int studyId) { - // Get studyContext, create it if it does'nt exist, with a SMESHDS_Document - - if (_mapStudyContext.find(studyId) == _mapStudyContext.end()) - { - _mapStudyContext[studyId] = new StudyContextStruct; - _mapStudyContext[studyId]->myDocument = new SMESHDS_Document(studyId); - } - StudyContextStruct *myStudyContext = _mapStudyContext[studyId]; + // Get studyContext, create it if it does'nt exist, with a SMESHDS_Document + + if (_mapStudyContext.find(studyId) == _mapStudyContext.end()) + { + _mapStudyContext[studyId] = new StudyContextStruct; + _mapStudyContext[studyId]->myDocument = new SMESHDS_Document(studyId); + } + StudyContextStruct *myStudyContext = _mapStudyContext[studyId]; // ASSERT(_mapStudyContext.find(studyId) != _mapStudyContext.end()); - return myStudyContext; + return myStudyContext; } // //============================================================================= @@ -904,6 +878,6 @@ int SMESH_Gen::GetShapeDim(const TopAbs_ShapeEnum & aShapeType) int SMESH_Gen::GetANewId() { - //MESSAGE("SMESH_Gen::GetANewId"); - return _hypId++; + //MESSAGE("SMESH_Gen::GetANewId"); + return _hypId++; } diff --git a/src/SMESH/SMESH_Gen.hxx b/src/SMESH/SMESH_Gen.hxx index 57a5af6eb..ab610a00a 100644 --- a/src/SMESH/SMESH_Gen.hxx +++ b/src/SMESH/SMESH_Gen.hxx @@ -61,7 +61,7 @@ typedef std::set TSetOfInt; class SMESH_EXPORT SMESH_Gen { - public: +public: SMESH_Gen(); ~SMESH_Gen(); @@ -78,8 +78,8 @@ class SMESH_EXPORT SMESH_Gen bool Compute(::SMESH_Mesh & aMesh, const TopoDS_Shape & aShape, const bool anUpward=false, - const ::MeshDimension aDim=::MeshDim_3D, - TSetOfInt* aShapesId=0); + const ::MeshDimension aDim=::MeshDim_3D, + TSetOfInt* aShapesId=0); /*! * \brief evaluates size of prospective mesh on a shape @@ -89,8 +89,8 @@ class SMESH_EXPORT SMESH_Gen * \retval bool - is a success */ bool Evaluate(::SMESH_Mesh & aMesh, - const TopoDS_Shape & aShape, - MapShapeNbElems& aResMap, + const TopoDS_Shape & aShape, + MapShapeNbElems& aResMap, const bool anUpward=false, TSetOfInt* aShapesId=0); @@ -109,7 +109,7 @@ class SMESH_EXPORT SMESH_Gen */ void SetDefaultNbSegments(int nb) { _nbSegments = nb; } int GetDefaultNbSegments() const { return _nbSegments; } - + struct TAlgoStateError { TAlgoStateErrorName _name; @@ -138,16 +138,6 @@ class SMESH_EXPORT SMESH_Gen SMESH_Algo* GetAlgo(SMESH_Mesh & aMesh, const TopoDS_Shape & aShape, TopoDS_Shape* assignedTo=0); static bool IsGlobalHypothesis(const SMESH_Hypothesis* theHyp, SMESH_Mesh& aMesh); - // inherited methods from SALOMEDS::Driver - -// void Save(int studyId, const char *aUrlOfFile); -// void Load(int studyId, const char *aUrlOfFile); -// void Close(int studyId); -// const char *ComponentDataType(); - -// const char *IORToLocalPersistentID(const char *IORString, bool & IsAFile); -// const char *LocalPersistentIDToIOR(const char *aLocalPersistentID); - int GetANewId(); std::map < int, SMESH_Algo * >_mapAlgo; @@ -156,9 +146,9 @@ class SMESH_EXPORT SMESH_Gen std::map < int, SMESH_2D_Algo * >_map2D_Algo; std::map < int, SMESH_3D_Algo * >_map3D_Algo; - private: +private: - int _localId; // unique Id of created objects, within SMESH_Gen entity + int _localId; // unique Id of created objects, within SMESH_Gen entity std::map < int, StudyContextStruct * >_mapStudyContext; // hypotheses managing diff --git a/src/SMESH/SMESH_Hypothesis.cxx b/src/SMESH/SMESH_Hypothesis.cxx index 4b288a0d9..0fec4925c 100644 --- a/src/SMESH/SMESH_Hypothesis.cxx +++ b/src/SMESH/SMESH_Hypothesis.cxx @@ -39,8 +39,8 @@ using namespace std; //============================================================================= SMESH_Hypothesis::SMESH_Hypothesis(int hypId, - int studyId, - SMESH_Gen* gen) : SMESHDS_Hypothesis(hypId) + int studyId, + SMESH_Gen* gen) : SMESHDS_Hypothesis(hypId) { //MESSAGE("SMESH_Hypothesis::SMESH_Hypothesis"); _gen = gen; diff --git a/src/SMESH/SMESH_Mesh.cxx b/src/SMESH/SMESH_Mesh.cxx index 1281522d9..67d78b4e6 100644 --- a/src/SMESH/SMESH_Mesh.cxx +++ b/src/SMESH/SMESH_Mesh.cxx @@ -81,10 +81,10 @@ typedef SMESH_HypoFilter THypType; //============================================================================= SMESH_Mesh::SMESH_Mesh(int theLocalId, - int theStudyId, - SMESH_Gen* theGen, - bool theIsEmbeddedMode, - SMESHDS_Document* theDocument): + int theStudyId, + SMESH_Gen* theGen, + bool theIsEmbeddedMode, + SMESHDS_Document* theDocument): _groupId( 0 ), _nbSubShapes( 0 ) { MESSAGE("SMESH_Mesh::SMESH_Mesh(int localId)"); @@ -325,14 +325,14 @@ void SMESH_Mesh::ClearSubMesh(const int theShapeId) if ( SMESH_subMesh *sm = GetSubMeshContaining( theShapeId ) ) { SMESH_subMeshIteratorPtr smIt = sm->getDependsOnIterator(/*includeSelf=*/true, - /*complexShapeFirst=*/false); + /*complexShapeFirst=*/false); while ( smIt->more() ) { sm = smIt->next(); TopAbs_ShapeEnum shapeType = sm->GetSubShape().ShapeType(); if ( shapeType == TopAbs_VERTEX || shapeType < TopAbs_SOLID ) - // all other shapes depends on vertices so they are already cleaned - sm->ComputeStateEngine( SMESH_subMesh::CLEAN ); + // all other shapes depends on vertices so they are already cleaned + sm->ComputeStateEngine( SMESH_subMesh::CLEAN ); // to recompute even if failed sm->ComputeStateEngine( SMESH_subMesh::CHECK_COMPUTE_STATE ); } @@ -373,21 +373,21 @@ int SMESH_Mesh::UNVToMesh(const char* theFileName) SMESH_Group* aSMESHGroup = AddGroup( aSubGroup->GetType(), aName.c_str(), aId ); if ( aSMESHGroup ) { - if(MYDEBUG) MESSAGE("UNVToMesh - group added: "<( aSMESHGroup->GetGroupDS() ); - if ( aGroupDS ) { - aGroupDS->SetStoreName(aName.c_str()); - aSubGroup->InitIterator(); - const SMDS_MeshElement* aElement = 0; - while (aSubGroup->More()) { - aElement = aSubGroup->Next(); - if (aElement) { - aGroupDS->SMDSGroup().Add(aElement); - } - } - if (aElement) - aGroupDS->SetType(aElement->GetType()); - } + if(MYDEBUG) MESSAGE("UNVToMesh - group added: "<( aSMESHGroup->GetGroupDS() ); + if ( aGroupDS ) { + aGroupDS->SetStoreName(aName.c_str()); + aSubGroup->InitIterator(); + const SMDS_MeshElement* aElement = 0; + while (aSubGroup->More()) { + aElement = aSubGroup->Next(); + if (aElement) { + aGroupDS->SMDSGroup().Add(aElement); + } + } + if (aElement) + aGroupDS->SetType(aElement->GetType()); + } } } } @@ -1086,9 +1086,9 @@ bool SMESH_Mesh::HasDuplicatedGroupNamesMED() } void SMESH_Mesh::ExportMED(const char *file, - const char* theMeshName, - bool theAutoGroups, - int theVersion) + const char* theMeshName, + bool theAutoGroups, + int theVersion) throw(SALOME_Exception) { Unexpect aCatch(SalomeException); @@ -1376,7 +1376,7 @@ bool SMESH_Mesh::IsMainShape(const TopoDS_Shape& theShape) const SMESH_Group* SMESH_Mesh::AddGroup (const SMDSAbs_ElementType theType, const char* theName, - int& theId, + int& theId, const TopoDS_Shape& theShape) { if (_mapGroup.find(_groupId) != _mapGroup.end()) diff --git a/src/SMESH/SMESH_Mesh.hxx b/src/SMESH/SMESH_Mesh.hxx index 284bf89a7..26339eb09 100644 --- a/src/SMESH/SMESH_Mesh.hxx +++ b/src/SMESH/SMESH_Mesh.hxx @@ -55,10 +55,10 @@ class SMESH_EXPORT SMESH_Mesh { public: SMESH_Mesh(int theLocalId, - int theStudyId, - SMESH_Gen* theGen, - bool theIsEmbeddedMode, - SMESHDS_Document* theDocument); + int theStudyId, + SMESH_Gen* theGen, + bool theIsEmbeddedMode, + SMESHDS_Document* theDocument); virtual ~SMESH_Mesh(); @@ -162,7 +162,7 @@ public: * \brief Return True if anHyp is used to mesh aSubShape */ bool IsUsedHypothesis(SMESHDS_Hypothesis * anHyp, - const SMESH_subMesh * aSubMesh); + const SMESH_subMesh * aSubMesh); /*! * \brief check if a hypothesis alowing notconform mesh is present */ @@ -191,9 +191,9 @@ public: bool HasDuplicatedGroupNamesMED(); void ExportMED(const char *file, - const char* theMeshName = NULL, - bool theAutoGroups = true, - int theVersion = 0) + const char* theMeshName = NULL, + bool theAutoGroups = true, + int theVersion = 0) throw(SALOME_Exception); void ExportDAT(const char *file) throw(SALOME_Exception); @@ -231,8 +231,8 @@ public: int NbGroup() const { return _mapGroup.size(); } SMESH_Group* AddGroup (const SMDSAbs_ElementType theType, - const char* theName, - int& theId, + const char* theName, + int& theId, const TopoDS_Shape& theShape=TopoDS_Shape()); typedef boost::shared_ptr< SMDS_Iterator > GroupIteratorPtr; diff --git a/src/SMESH/SMESH_MeshEditor.cxx b/src/SMESH/SMESH_MeshEditor.cxx index d347a7157..32dcba796 100644 --- a/src/SMESH/SMESH_MeshEditor.cxx +++ b/src/SMESH/SMESH_MeshEditor.cxx @@ -78,6 +78,8 @@ #include #include +#include +#include #define cast2Node(elem) static_cast( elem ) @@ -90,8 +92,23 @@ typedef map > TElemOfElem //typedef TNodeOfNodeVecMap::iterator TNodeOfNodeVecMapItr; //typedef map > TElemOfVecOfMapNodesMap; -struct TNodeXYZ : public gp_XYZ { +//======================================================================= +/*! + * \brief SMDS_MeshNode -> gp_XYZ convertor + */ +//======================================================================= + +struct TNodeXYZ : public gp_XYZ +{ TNodeXYZ( const SMDS_MeshNode* n ):gp_XYZ( n->X(), n->Y(), n->Z() ) {} + double Distance( const SMDS_MeshNode* n ) + { + return gp_Vec( *this, TNodeXYZ( n )).Magnitude(); + } + double SquareDistance( const SMDS_MeshNode* n ) + { + return gp_Vec( *this, TNodeXYZ( n )).SquareMagnitude(); + } }; //======================================================================= @@ -2788,12 +2805,12 @@ void SMESH_MeshEditor::sweepElement(const SMDS_MeshElement* elem, return; } - issimple[iNode] = (listNewNodes.size()==nbSteps); + issimple[iNode] = (listNewNodes.size()==nbSteps); // is node medium itNN[ iNode ] = listNewNodes.begin(); prevNod[ iNode ] = node; nextNod[ iNode ] = listNewNodes.front(); - if( !issimple[iNode] ) { + if( !elem->IsQuadratic() || !issimple[iNode] ) { if ( prevNod[ iNode ] != nextNod [ iNode ]) iNotSameNode = iNode; else { @@ -2806,8 +2823,8 @@ void SMESH_MeshEditor::sweepElement(const SMDS_MeshElement* elem, //cout<<" nbSame = "< 2) { - //MESSAGE( " Too many same nodes of element " << elem->GetID() ); - INFOS( " Too many same nodes of element " << elem->GetID() ); + MESSAGE( " Too many same nodes of element " << elem->GetID() ); + //INFOS( " Too many same nodes of element " << elem->GetID() ); return; } @@ -5066,12 +5083,13 @@ SMESH_MeshEditor::generateGroups(const SMESH_SequenceOfElemPtr& nodeGens, return newGroupIDs; } -//======================================================================= -//function : FindCoincidentNodes -//purpose : Return list of group of nodes close to each other within theTolerance -// Search among theNodes or in the whole mesh if theNodes is empty using -// an Octree algorithm -//======================================================================= +//================================================================================ +/*! + * \brief Return list of group of nodes close to each other within theTolerance + * Search among theNodes or in the whole mesh if theNodes is empty using + * an Octree algorithm + */ +//================================================================================ void SMESH_MeshEditor::FindCoincidentNodes (set & theNodes, const double theTolerance, @@ -5089,10 +5107,11 @@ void SMESH_MeshEditor::FindCoincidentNodes (set & theNodes } else nodes=theNodes; - SMESH_OctreeNode::FindCoincidentNodes ( nodes, &theGroupsOfNodes, theTolerance); + SMESH_OctreeNode::FindCoincidentNodes ( nodes, &theGroupsOfNodes, theTolerance); } + //======================================================================= /*! * \brief Implementation of search for the node closest to point @@ -5101,11 +5120,14 @@ void SMESH_MeshEditor::FindCoincidentNodes (set & theNodes struct SMESH_NodeSearcherImpl: public SMESH_NodeSearcher { + //--------------------------------------------------------------------- /*! * \brief Constructor */ SMESH_NodeSearcherImpl( const SMESHDS_Mesh* theMesh ) { + myMesh = ( SMESHDS_Mesh* ) theMesh; + set nodes; if ( theMesh ) { SMDS_NodeIteratorPtr nIt = theMesh->nodesIterator(); @@ -5113,19 +5135,43 @@ struct SMESH_NodeSearcherImpl: public SMESH_NodeSearcher nodes.insert( nodes.end(), nIt->next() ); } myOctreeNode = new SMESH_OctreeNode(nodes) ; + + // get max size of a leaf box + SMESH_OctreeNode* tree = myOctreeNode; + while ( !tree->isLeaf() ) + { + SMESH_OctreeNodeIteratorPtr cIt = tree->GetChildrenIterator(); + if ( cIt->more() ) + tree = cIt->next(); + } + myHalfLeafSize = tree->maxSize() / 2.; } + + //--------------------------------------------------------------------- + /*! + * \brief Move node and update myOctreeNode accordingly + */ + void MoveNode( const SMDS_MeshNode* node, const gp_Pnt& toPnt ) + { + myOctreeNode->UpdateByMoveNode( node, toPnt ); + myMesh->MoveNode( node, toPnt.X(), toPnt.Y(), toPnt.Z() ); + } + + //--------------------------------------------------------------------- /*! * \brief Do it's job */ const SMDS_MeshNode* FindClosestTo( const gp_Pnt& thePnt ) { SMDS_MeshNode tgtNode( thePnt.X(), thePnt.Y(), thePnt.Z() ); + map dist2Nodes; + myOctreeNode->NodesAround( &tgtNode, dist2Nodes, myHalfLeafSize ); + if ( !dist2Nodes.empty() ) + return dist2Nodes.begin()->second; list nodes; - //const double precision = 1e-6; - //myOctreeNode->NodesAround( &tgtNode, &nodes, precision ); + //myOctreeNode->NodesAround( &tgtNode, &nodes, myHalfLeafSize ); double minSqDist = DBL_MAX; - Bnd_B3d box; if ( nodes.empty() ) // get all nodes of OctreeNode's closest to thePnt { // sort leafs by their distance from thePnt @@ -5134,20 +5180,25 @@ struct SMESH_NodeSearcherImpl: public SMESH_NodeSearcher list< SMESH_OctreeNode* > treeList; list< SMESH_OctreeNode* >::iterator trIt; treeList.push_back( myOctreeNode ); + + SMDS_MeshNode pointNode( thePnt.X(), thePnt.Y(), thePnt.Z() ); for ( trIt = treeList.begin(); trIt != treeList.end(); ++trIt) { SMESH_OctreeNode* tree = *trIt; - if ( !tree->isLeaf() ) { // put children to the queue + if ( !tree->isLeaf() ) // put children to the queue + { + if ( !tree->isInside( &pointNode, myHalfLeafSize )) continue; SMESH_OctreeNodeIteratorPtr cIt = tree->GetChildrenIterator(); while ( cIt->more() ) treeList.push_back( cIt->next() ); } - else if ( tree->NbNodes() ) { // put tree to treeMap - tree->getBox( box ); + else if ( tree->NbNodes() ) // put a tree to the treeMap + { + const Bnd_B3d& box = tree->getBox(); double sqDist = thePnt.SquareDistance( 0.5 * ( box.CornerMin() + box.CornerMax() )); pair it_in = treeMap.insert( make_pair( sqDist, tree )); if ( !it_in.second ) // not unique distance to box center - treeMap.insert( it_in.first, make_pair( sqDist - 1e-13*treeMap.size(), tree )); + treeMap.insert( it_in.first, make_pair( sqDist + 1e-13*treeMap.size(), tree )); } } // find distance after which there is no sense to check tree's @@ -5155,7 +5206,7 @@ struct SMESH_NodeSearcherImpl: public SMESH_NodeSearcher TDistTreeMap::iterator sqDist_tree = treeMap.begin(); if ( treeMap.size() > 5 ) { SMESH_OctreeNode* closestTree = sqDist_tree->second; - closestTree->getBox( box ); + const Bnd_B3d& box = closestTree->getBox(); double limit = sqrt( sqDist_tree->first ) + sqrt ( box.SquareExtent() ); sqLimit = limit * limit; } @@ -5180,12 +5231,23 @@ struct SMESH_NodeSearcherImpl: public SMESH_NodeSearcher } return closestNode; } + + //--------------------------------------------------------------------- /*! * \brief Destructor */ ~SMESH_NodeSearcherImpl() { delete myOctreeNode; } + + //--------------------------------------------------------------------- + /*! + * \brief Return the node tree + */ + const SMESH_OctreeNode* getTree() const { return myOctreeNode; } + private: SMESH_OctreeNode* myOctreeNode; + SMESHDS_Mesh* myMesh; + double myHalfLeafSize; // max size of a leaf box }; //======================================================================= @@ -5199,6 +5261,404 @@ SMESH_NodeSearcher* SMESH_MeshEditor::GetNodeSearcher() return new SMESH_NodeSearcherImpl( GetMeshDS() ); } +// ======================================================================== +namespace // Utils used in SMESH_ElementSearcherImpl::FindElementsByPoint() +{ + const int MaxNbElemsInLeaf = 10; // maximal number of elements in a leaf of tree + const int MaxLevel = 7; // maximal tree height -> nb terminal boxes: 8^7 = 2097152 + const double NodeRadius = 1e-9; // to enlarge bnd box of element + + //======================================================================= + /*! + * \brief Octal tree of bounding boxes of elements + */ + //======================================================================= + + class ElementBndBoxTree : public SMESH_Octree + { + public: + + ElementBndBoxTree(const SMDS_Mesh& mesh, SMDSAbs_ElementType elemType); + void getElementsNearPoint( const gp_Pnt& point, TIDSortedElemSet& foundElems); + ~ElementBndBoxTree(); + + protected: + ElementBndBoxTree() {} + SMESH_Octree* allocateOctreeChild() const { return new ElementBndBoxTree; } + void buildChildrenData(); + Bnd_B3d* buildRootBox(); + private: + //!< Bounding box of element + struct ElementBox : public Bnd_B3d + { + const SMDS_MeshElement* _element; + int _refCount; // an ElementBox can be included in several tree branches + ElementBox(const SMDS_MeshElement* elem); + }; + vector< ElementBox* > _elements; + }; + + //================================================================================ + /*! + * \brief ElementBndBoxTree creation + */ + //================================================================================ + + ElementBndBoxTree::ElementBndBoxTree(const SMDS_Mesh& mesh, SMDSAbs_ElementType elemType) + :SMESH_Octree( new SMESH_Octree::Limit( MaxLevel, /*minSize=*/0. )) + { + int nbElems = mesh.GetMeshInfo().NbElements( elemType ); + _elements.reserve( nbElems ); + + SMDS_ElemIteratorPtr elemIt = mesh.elementsIterator( elemType ); + while ( elemIt->more() ) + _elements.push_back( new ElementBox( elemIt->next() )); + + if ( _elements.size() > MaxNbElemsInLeaf ) + compute(); + else + myIsLeaf = true; + } + + //================================================================================ + /*! + * \brief Destructor + */ + //================================================================================ + + ElementBndBoxTree::~ElementBndBoxTree() + { + for ( int i = 0; i < _elements.size(); ++i ) + if ( --_elements[i]->_refCount <= 0 ) + delete _elements[i]; + } + + //================================================================================ + /*! + * \brief Return the maximal box + */ + //================================================================================ + + Bnd_B3d* ElementBndBoxTree::buildRootBox() + { + Bnd_B3d* box = new Bnd_B3d; + for ( int i = 0; i < _elements.size(); ++i ) + box->Add( *_elements[i] ); + return box; + } + + //================================================================================ + /*! + * \brief Redistrubute element boxes among children + */ + //================================================================================ + + void ElementBndBoxTree::buildChildrenData() + { + for ( int i = 0; i < _elements.size(); ++i ) + { + for (int j = 0; j < 8; j++) + { + if ( !_elements[i]->IsOut( myChildren[j]->getBox() )) + { + _elements[i]->_refCount++; + ((ElementBndBoxTree*)myChildren[j])->_elements.push_back( _elements[i]); + } + } + _elements[i]->_refCount--; + } + _elements.clear(); + + for (int j = 0; j < 8; j++) + { + ElementBndBoxTree* child = static_cast( myChildren[j]); + if ( child->_elements.size() <= MaxNbElemsInLeaf ) + child->myIsLeaf = true; + + if ( child->_elements.capacity() - child->_elements.size() > 1000 ) + child->_elements.resize( child->_elements.size() ); // compact + } + } + + //================================================================================ + /*! + * \brief Return elements which can include the point + */ + //================================================================================ + + void ElementBndBoxTree::getElementsNearPoint( const gp_Pnt& point, + TIDSortedElemSet& foundElems) + { + if ( level() && getBox().IsOut( point.XYZ() )) + return; + + if ( isLeaf() ) + { + for ( int i = 0; i < _elements.size(); ++i ) + if ( !_elements[i]->IsOut( point.XYZ() )) + foundElems.insert( _elements[i]->_element ); + } + else + { + for (int i = 0; i < 8; i++) + ((ElementBndBoxTree*) myChildren[i])->getElementsNearPoint( point, foundElems ); + } + } + + //================================================================================ + /*! + * \brief Construct the element box + */ + //================================================================================ + + ElementBndBoxTree::ElementBox::ElementBox(const SMDS_MeshElement* elem) + { + _element = elem; + _refCount = 1; + SMDS_ElemIteratorPtr nIt = elem->nodesIterator(); + while ( nIt->more() ) + Add( TNodeXYZ( cast2Node( nIt->next() ))); + Enlarge( NodeRadius ); + } + +} // namespace + +//======================================================================= +/*! + * \brief Implementation of search for the elements by point + */ +//======================================================================= + +struct SMESH_ElementSearcherImpl: public SMESH_ElementSearcher +{ + SMESHDS_Mesh* _mesh; + ElementBndBoxTree* _ebbTree; + SMESH_NodeSearcherImpl* _nodeSearcher; + SMDSAbs_ElementType _elementType; + + SMESH_ElementSearcherImpl( SMESHDS_Mesh& mesh ): _mesh(&mesh),_ebbTree(0),_nodeSearcher(0) {} + ~SMESH_ElementSearcherImpl() + { + if ( _ebbTree ) delete _ebbTree; _ebbTree = 0; + if ( _nodeSearcher ) delete _nodeSearcher; _nodeSearcher = 0; + } + + /*! + * \brief Return elements of given type where the given point is IN or ON. + * + * 'ALL' type means elements of any type excluding nodes and 0D elements + */ + void FindElementsByPoint(const gp_Pnt& point, + SMDSAbs_ElementType type, + vector< const SMDS_MeshElement* >& foundElements) + { + foundElements.clear(); + + const SMDS_MeshInfo& meshInfo = _mesh->GetMeshInfo(); + + // ----------------- + // define tolerance + // ----------------- + double tolerance = 0; + if ( _nodeSearcher && meshInfo.NbNodes() > 1 ) + { + double boxSize = _nodeSearcher->getTree()->maxSize(); + tolerance = 1e-8 * boxSize/* / meshInfo.NbNodes()*/; + } + else if ( _ebbTree && meshInfo.NbElements() > 0 ) + { + double boxSize = _ebbTree->maxSize(); + tolerance = 1e-8 * boxSize/* / meshInfo.NbElements()*/; + } + if ( tolerance == 0 ) + { + // define tolerance by size of a most complex element + int complexType = SMDSAbs_Volume; + while ( complexType > SMDSAbs_All && + meshInfo.NbElements( SMDSAbs_ElementType( complexType )) < 1 ) + --complexType; + if ( complexType == SMDSAbs_All ) return; // empty mesh + + double elemSize; + if ( complexType == int( SMDSAbs_Node )) + { + SMDS_NodeIteratorPtr nodeIt = _mesh->nodesIterator(); + elemSize = 1; + if ( meshInfo.NbNodes() > 2 ) + elemSize = TNodeXYZ( nodeIt->next() ).Distance( nodeIt->next() ); + } + else + { + const SMDS_MeshElement* elem = + _mesh->elementsIterator( SMDSAbs_ElementType( complexType ))->next(); + SMDS_ElemIteratorPtr nodeIt = elem->nodesIterator(); + TNodeXYZ n1( cast2Node( nodeIt->next() )); + while ( nodeIt->more() ) + { + double dist = n1.Distance( cast2Node( nodeIt->next() )); + elemSize = max( dist, elemSize ); + } + } + tolerance = 1e-6 * elemSize; + } + + // ================================================================================= + if ( type == SMDSAbs_Node || type == SMDSAbs_0DElement ) + { + if ( !_nodeSearcher ) + _nodeSearcher = new SMESH_NodeSearcherImpl( _mesh ); + + const SMDS_MeshNode* closeNode = _nodeSearcher->FindClosestTo( point ); + if ( !closeNode ) return; + + if ( point.Distance( TNodeXYZ( closeNode )) > tolerance ) + return; // to far from any node + + if ( type == SMDSAbs_Node ) + { + foundElements.push_back( closeNode ); + } + else + { + SMDS_ElemIteratorPtr elemIt = closeNode->GetInverseElementIterator( SMDSAbs_0DElement ); + while ( elemIt->more() ) + foundElements.push_back( elemIt->next() ); + } + } + // ================================================================================= + else // elements more complex than 0D + { + if ( !_ebbTree || _elementType != type ) + { + if ( _ebbTree ) delete _ebbTree; + _ebbTree = new ElementBndBoxTree( *_mesh, _elementType = type ); + } + TIDSortedElemSet suspectElems; + _ebbTree->getElementsNearPoint( point, suspectElems ); + TIDSortedElemSet::iterator elem = suspectElems.begin(); + for ( ; elem != suspectElems.end(); ++elem ) + if ( !SMESH_MeshEditor::isOut( *elem, point, tolerance )) + foundElements.push_back( *elem ); + } + } +}; // struct SMESH_ElementSearcherImpl + +//======================================================================= +/*! + * \brief Return SMESH_ElementSearcher + */ +//======================================================================= + +SMESH_ElementSearcher* SMESH_MeshEditor::GetElementSearcher() +{ + return new SMESH_ElementSearcherImpl( *GetMeshDS() ); +} + +//======================================================================= +/*! + * \brief Return true if the point is IN or ON of the element + */ +//======================================================================= + +bool SMESH_MeshEditor::isOut( const SMDS_MeshElement* element, const gp_Pnt& point, double tol ) +{ + if ( element->GetType() == SMDSAbs_Volume) + { + return SMDS_VolumeTool( element ).IsOut( point.X(), point.Y(), point.Z(), tol ); + } + + // get ordered nodes + + vector< gp_XYZ > xyz; + + SMDS_ElemIteratorPtr nodeIt = element->nodesIterator(); + if ( element->IsQuadratic() ) + if (const SMDS_QuadraticFaceOfNodes* f=dynamic_cast(element)) + nodeIt = f->interlacedNodesElemIterator(); + else if (const SMDS_QuadraticEdge* e =dynamic_cast(element)) + nodeIt = e->interlacedNodesElemIterator(); + + while ( nodeIt->more() ) + xyz.push_back( TNodeXYZ( cast2Node( nodeIt->next() ))); + + if ( element->GetType() == SMDSAbs_Face ) // -------------------------------------------------- + { + // gravity center + gp_XYZ gc(0,0,0); + gc = accumulate( xyz.begin(), xyz.end(), gc ); + gc /= element->NbNodes(); + + // compute face normal using gc + gp_Vec normal(0,0,0); + xyz.push_back( xyz.front() ); + for ( int i = 0; i < element->NbNodes(); ++i ) + { + gp_Vec edge( xyz[i], xyz[i+1]); + gp_Vec n2gc( xyz[i], gc ); + normal += edge ^ n2gc; + } + double faceDoubleArea = normal.Magnitude(); + if ( faceDoubleArea <= numeric_limits::min() ) + return true; // invalid face + normal /= faceDoubleArea; + + // check if the point lays on face plane + gp_Vec n2p( xyz[0], point ); + if ( fabs( n2p * normal ) > tol ) + return true; // not on face plane + + // check if point is out of face boundary + int i, out = false; + for ( i = 0; !out && i < element->NbNodes(); ++i ) + { + gp_Vec edge( xyz[i], xyz[i+1]); + gp_Vec n2p ( xyz[i], point ); + gp_Vec cross = edge ^ n2p; + out = ( cross * normal < -tol ); + } + if ( out && element->IsPoly() ) + { + // define point position by the closest edge + double minDist = numeric_limits::max(); + int iMinDist; + for ( i = 0; i < element->NbNodes(); ++i ) + { + gp_Vec edge( xyz[i], xyz[i+1]); + gp_Vec n1p ( xyz[i], point); + double dist = ( edge ^ n1p ).Magnitude() / edge.Magnitude(); + if ( dist < minDist ) + iMinDist = i; + } + gp_Vec edge( xyz[iMinDist], xyz[iMinDist+1]); + gp_Vec n2p ( xyz[iMinDist], point ); + gp_Vec cross = edge ^ n2p; + out = ( cross * normal < -tol ); + } + return out; + } + if ( element->GetType() == SMDSAbs_Edge ) // -------------------------------------------------- + { + for ( int i = 1; i < element->NbNodes(); ++i ) + { + gp_Vec edge( xyz[i-1], xyz[i]); + gp_Vec n1p ( xyz[i-1], point); + double dist = ( edge ^ n1p ).Magnitude() / edge.Magnitude(); + if ( dist > tol ) + return true; + gp_Vec n2p( xyz[i], point ); + if ( fabs( edge.Magnitude() - n1p.Magnitude() - n2p.Magnitude()) > tol ) + return true; + } + return false; + } + // Node or 0D element ------------------------------------------------------------------------- + { + gp_Vec n2p ( xyz[0], point ); + return n2p.Magnitude() <= tol; + } + return true; +} + //======================================================================= //function : SimplifyFace //purpose : @@ -6107,7 +6567,7 @@ bool SMESH_MeshEditor::FindFreeBorder (const SMDS_MeshNode* theFirst //vector nodes; const SMDS_MeshNode *nIgnore = theFirstNode, *nStart = theSecondNode; - set < const SMDS_MeshElement* > foundElems; + TIDSortedElemSet foundElems; bool needTheLast = ( theLastNode != 0 ); while ( nStart != theLastNode ) { @@ -7185,6 +7645,9 @@ int SMESH_MeshEditor::convertElemToQuadratic(SMESHDS_SubMesh * theSm, case 4: NewElem = theHelper.AddVolume(aNds[0], aNds[1], aNds[2], aNds[3], id, theForce3d); break; + case 5: + NewElem = theHelper.AddVolume(aNds[0], aNds[1], aNds[2], aNds[3], aNds[4], id, theForce3d); + break; case 6: NewElem = theHelper.AddVolume(aNds[0], aNds[1], aNds[2], aNds[3], aNds[4], aNds[5], id, theForce3d); break; @@ -7229,7 +7692,6 @@ void SMESH_MeshEditor::ConvertToQuadratic(const bool theForce3d) SMESH_subMesh* sm = smIt->next(); if ( SMESHDS_SubMesh *smDS = sm->GetSubMeshDS() ) { aHelper.SetSubShape( sm->GetSubShape() ); - if ( !theForce3d) aHelper.SetCheckNodePosition(true); nbCheckedElems += convertElemToQuadratic(smDS, aHelper, theForce3d); } } @@ -7310,6 +7772,10 @@ void SMESH_MeshEditor::ConvertToQuadratic(const bool theForce3d) NewVolume = aHelper.AddVolume(aNds[0], aNds[1], aNds[2], aNds[3], id, theForce3d ); break; + case 5: + NewVolume = aHelper.AddVolume(aNds[0], aNds[1], aNds[2], + aNds[3], aNds[4], id, theForce3d); + break; case 6: NewVolume = aHelper.AddVolume(aNds[0], aNds[1], aNds[2], aNds[3], aNds[4], aNds[5], id, theForce3d); @@ -8265,7 +8731,7 @@ bool SMESH_MeshEditor::doubleNodes( SMESHDS_Mesh* theMeshDS, theNodeNodeMap[ aCurrNode ] = aNewNode; myLastCreatedNodes.Append( aNewNode ); } - isDuplicate |= (aCurrNode == aNewNode); + isDuplicate |= (aCurrNode != aNewNode); newNodes[ ind++ ] = aNewNode; } if ( !isDuplicate ) @@ -8303,6 +8769,95 @@ static bool isInside(const SMDS_MeshElement* theElem, return (aState == TopAbs_IN || aState == TopAbs_ON ); } +/*! + \brief Creates a hole in a mesh by doubling the nodes of some particular elements + \param theNodes - identifiers of nodes to be doubled + \param theModifiedElems - identifiers of elements to be updated by the new (doubled) + nodes. If list of element identifiers is empty then nodes are doubled but + they not assigned to elements + \return TRUE if operation has been completed successfully, FALSE otherwise +*/ +bool SMESH_MeshEditor::DoubleNodes( const std::list< int >& theListOfNodes, + const std::list< int >& theListOfModifiedElems ) +{ + myLastCreatedElems.Clear(); + myLastCreatedNodes.Clear(); + + if ( theListOfNodes.size() == 0 ) + return false; + + SMESHDS_Mesh* aMeshDS = GetMeshDS(); + if ( !aMeshDS ) + return false; + + // iterate through nodes and duplicate them + + std::map< const SMDS_MeshNode*, const SMDS_MeshNode* > anOldNodeToNewNode; + + std::list< int >::const_iterator aNodeIter; + for ( aNodeIter = theListOfNodes.begin(); aNodeIter != theListOfNodes.end(); ++aNodeIter ) + { + int aCurr = *aNodeIter; + SMDS_MeshNode* aNode = (SMDS_MeshNode*)aMeshDS->FindNode( aCurr ); + if ( !aNode ) + continue; + + // duplicate node + + const SMDS_MeshNode* aNewNode = aMeshDS->AddNode( aNode->X(), aNode->Y(), aNode->Z() ); + if ( aNewNode ) + { + anOldNodeToNewNode[ aNode ] = aNewNode; + myLastCreatedNodes.Append( aNewNode ); + } + } + + // Create map of new nodes for modified elements + + std::map< SMDS_MeshElement*, vector > anElemToNodes; + + std::list< int >::const_iterator anElemIter; + for ( anElemIter = theListOfModifiedElems.begin(); + anElemIter != theListOfModifiedElems.end(); ++anElemIter ) + { + int aCurr = *anElemIter; + SMDS_MeshElement* anElem = (SMDS_MeshElement*)aMeshDS->FindElement( aCurr ); + if ( !anElem ) + continue; + + vector aNodeArr( anElem->NbNodes() ); + + SMDS_ElemIteratorPtr anIter = anElem->nodesIterator(); + int ind = 0; + while ( anIter->more() ) + { + SMDS_MeshNode* aCurrNode = (SMDS_MeshNode*)anIter->next(); + if ( aCurr && anOldNodeToNewNode.find( aCurrNode ) != anOldNodeToNewNode.end() ) + { + const SMDS_MeshNode* aNewNode = anOldNodeToNewNode[ aCurrNode ]; + aNodeArr[ ind++ ] = aNewNode; + } + else + aNodeArr[ ind++ ] = aCurrNode; + } + anElemToNodes[ anElem ] = aNodeArr; + } + + // Change nodes of elements + + std::map< SMDS_MeshElement*, vector >::iterator + anElemToNodesIter = anElemToNodes.begin(); + for ( ; anElemToNodesIter != anElemToNodes.end(); ++anElemToNodesIter ) + { + const SMDS_MeshElement* anElem = anElemToNodesIter->first; + vector aNodeArr = anElemToNodesIter->second; + if ( anElem ) + aMeshDS->ChangeElementNodes( anElem, &aNodeArr[ 0 ], anElem->NbNodes() ); + } + + return true; +} + /*! \brief Creates a hole in a mesh by doubling the nodes of some particular elements \param theElems - group of of elements (edges or faces) to be replicated @@ -8317,9 +8872,6 @@ bool SMESH_MeshEditor::DoubleNodesInRegion( const TIDSortedElemSet& theElems, const TIDSortedElemSet& theNodesNot, const TopoDS_Shape& theShape ) { - SMESHDS_Mesh* aMesh = GetMeshDS(); - if (!aMesh) - return false; if ( theShape.IsNull() ) return false; @@ -8354,3 +8906,59 @@ bool SMESH_MeshEditor::DoubleNodesInRegion( const TIDSortedElemSet& theElems, } return DoubleNodes( theElems, theNodesNot, anAffected ); } + +/*! + * \brief Generated skin mesh (containing 2D cells) from 3D mesh + * The created 2D mesh elements based on nodes of free faces of boundary volumes + * \return TRUE if operation has been completed successfully, FALSE otherwise + */ + +bool SMESH_MeshEditor::Make2DMeshFrom3D() +{ + // iterates on volume elements and detect all free faces on them + SMESHDS_Mesh* aMesh = GetMeshDS(); + if (!aMesh) + return false; + bool res = false; + SMDS_VolumeIteratorPtr vIt = aMesh->volumesIterator(); + while(vIt->more()) + { + const SMDS_MeshVolume* volume = vIt->next(); + SMDS_VolumeTool vTool( volume ); + const bool isPoly = volume->IsPoly(); + const bool isQuad = volume->IsQuadratic(); + for ( int iface = 0, n = vTool.NbFaces(); iface < n; iface++ ) + { + if (!vTool.IsFreeFace(iface)) + continue; + vector nodes; + int nbFaceNodes = vTool.NbFaceNodes(iface); + const SMDS_MeshNode** faceNodes = vTool.GetFaceNodes(iface); + if (vTool.IsFaceExternal(iface)) + { + int inode = 0; + for ( ; inode < nbFaceNodes; inode += isQuad ? 2 : 1) + nodes.push_back(faceNodes[inode]); + if (isQuad) + for ( inode = 1; inode < nbFaceNodes; inode += 2) + nodes.push_back(faceNodes[inode]); + } + else + { + int inode = nbFaceNodes-1; + for ( ; inode >=0; inode -= isQuad ? 2 : 1) + nodes.push_back(faceNodes[inode]); + if (isQuad) + for ( inode = nbFaceNodes-2; inode >=0; inode -= 2) + nodes.push_back(faceNodes[inode]); + } + + // add new face based on volume nodes + if (aMesh->FindFace( nodes ) ) + continue; // face already exsist + myLastCreatedElems.Append( AddElement(nodes, SMDSAbs_Face, isPoly && iface == 1) ); + res = true; + } + } + return res; +} diff --git a/src/SMESH/SMESH_MeshEditor.hxx b/src/SMESH/SMESH_MeshEditor.hxx index a0dec46dc..fba504773 100644 --- a/src/SMESH/SMESH_MeshEditor.hxx +++ b/src/SMESH/SMESH_MeshEditor.hxx @@ -55,12 +55,38 @@ typedef std::map > TElemOfElemListMap; typedef std::map TNodeNodeMap; - //!< Set of elements sorted by ID, to be used to assure predictability of edition +//!< Set of elements sorted by ID, to be used to assure predictability of edition typedef std::set< const SMDS_MeshElement*, TIDCompare > TIDSortedElemSet; typedef pair< const SMDS_MeshNode*, const SMDS_MeshNode* > NLink; +//======================================================================= +/*! + * \brief Searcher for the node closest to point + */ +//======================================================================= +struct SMESH_NodeSearcher +{ + virtual const SMDS_MeshNode* FindClosestTo( const gp_Pnt& pnt ) = 0; + virtual void MoveNode( const SMDS_MeshNode* node, const gp_Pnt& toPnt ) = 0; +}; + +//======================================================================= +/*! + * \brief Return elements of given type where the given point is IN or ON. + * + * 'ALL' type means elements of any type excluding nodes and 0D elements + */ +//======================================================================= + +struct SMESH_ElementSearcher +{ + virtual void FindElementsByPoint(const gp_Pnt& point, + SMDSAbs_ElementType type, + std::vector< const SMDS_MeshElement* >& foundElems)=0; +}; + //======================================================================= /*! * \brief A sorted pair of nodes @@ -77,18 +103,6 @@ struct SMESH_TLink: public NLink const SMDS_MeshNode* node2() const { return second; } }; -// ============================================================ -/*! - * \brief Searcher for the node closest to point - */ -// ============================================================ - -struct SMESH_NodeSearcher -{ - virtual const SMDS_MeshNode* FindClosestTo( const gp_Pnt& pnt ) = 0; -}; - - //======================================================================= /*! * auxiliary class @@ -365,6 +379,7 @@ public: SMESH_Mesh* theTargetMesh=0); // Move or copy theElements applying theTrsf to their nodes + typedef std::list< std::list< const SMDS_MeshNode* > > TListOfListOfNodes; void FindCoincidentNodes (std::set & theNodes, @@ -378,6 +393,16 @@ public: */ SMESH_NodeSearcher* GetNodeSearcher(); + /*! + * \brief Return SMESH_ElementSearcher + */ + SMESH_ElementSearcher* GetElementSearcher(); + /*! + * \brief Return true if the point is IN or ON of the element + */ + static bool isOut( const SMDS_MeshElement* element, const gp_Pnt& point, double tol ); + + int SimplifyFace (const std::vector faceNodes, std::vector& poly_nodes, std::vector& quantities) const; @@ -391,7 +416,7 @@ public: typedef std::list< std::list< int > > TListOfListOfElementsID; void FindEqualElements(std::set & theElements, - TListOfListOfElementsID & theGroupsOfElementsID); + TListOfListOfElementsID & theGroupsOfElementsID); // Return list of group of elements build on the same nodes. // Search among theElements or in the whole mesh if theElements is empty. @@ -576,6 +601,9 @@ public: const SMESH_SequenceOfElemPtr& GetLastCreatedNodes() const { return myLastCreatedNodes; } const SMESH_SequenceOfElemPtr& GetLastCreatedElems() const { return myLastCreatedElems; } + + bool DoubleNodes( const std::list< int >& theListOfNodes, + const std::list< int >& theListOfModifiedElems ); bool DoubleNodes( const TIDSortedElemSet& theElems, const TIDSortedElemSet& theNodesNot, @@ -584,7 +612,14 @@ public: bool DoubleNodesInRegion( const TIDSortedElemSet& theElems, const TIDSortedElemSet& theNodesNot, const TopoDS_Shape& theShape ); - + + /*! + * \brief Generated skin mesh (containing 2D cells) from 3D mesh + * The created 2D mesh elements based on nodes of free faces of boundary volumes + * \return TRUE if operation has been completed successfully, FALSE otherwise + */ + bool Make2DMeshFrom3D(); + private: /*! @@ -653,25 +688,25 @@ private: * auxilary for ExtrusionAlongTrack */ Extrusion_Error MakeEdgePathPoints(std::list& aPrms, - const TopoDS_Edge& aTrackEdge, - bool FirstIsStart, - list& LPP); + const TopoDS_Edge& aTrackEdge, + bool FirstIsStart, + list& LPP); Extrusion_Error MakeExtrElements(TIDSortedElemSet& theElements, - list& fullList, - const bool theHasAngles, - list& theAngles, - const bool theLinearVariation, - const bool theHasRefPoint, - const gp_Pnt& theRefPoint, - const bool theMakeGroups); + list& fullList, + const bool theHasAngles, + list& theAngles, + const bool theLinearVariation, + const bool theHasRefPoint, + const gp_Pnt& theRefPoint, + const bool theMakeGroups); void LinearAngleVariation(const int NbSteps, - list& theAngles); + list& theAngles); bool doubleNodes( SMESHDS_Mesh* theMeshDS, const TIDSortedElemSet& theElems, const TIDSortedElemSet& theNodesNot, std::map< const SMDS_MeshNode*, - const SMDS_MeshNode* >& theNodeNodeMap, + const SMDS_MeshNode* >& theNodeNodeMap, const bool theIsDoubleElem ); private: diff --git a/src/SMESH/SMESH_MesherHelper.cxx b/src/SMESH/SMESH_MesherHelper.cxx index 8b2062deb..0ca91a4d3 100644 --- a/src/SMESH/SMESH_MesherHelper.cxx +++ b/src/SMESH/SMESH_MesherHelper.cxx @@ -71,7 +71,7 @@ namespace { //================================================================================ SMESH_MesherHelper::SMESH_MesherHelper(SMESH_Mesh& theMesh) - : myMesh(&theMesh), myShapeID(0), myCreateQuadratic(false), myCheckNodePos(false) + : myMesh(&theMesh), myShapeID(0), myCreateQuadratic(false) { mySetElemOnShape = ( ! myMesh->HasShapeToMesh() ); } @@ -326,9 +326,8 @@ gp_Pnt2d SMESH_MesherHelper::GetUVOnSeam( const gp_Pnt2d& uv1, const gp_Pnt2d& u * \param F - the face * \param n - the node * \param n2 - a node of element being created located inside a face + * \param check - optional flag returing false if found UV are invalid * \retval gp_XY - resulting UV - * - * Auxilary function called form GetMediumNode() */ //======================================================================= @@ -339,37 +338,14 @@ gp_XY SMESH_MesherHelper::GetNodeUV(const TopoDS_Face& F, { gp_Pnt2d uv( 1e100, 1e100 ); const SMDS_PositionPtr Pos = n->GetPosition(); + bool uvOK = false; if(Pos->GetTypeOfPosition()==SMDS_TOP_FACE) { // node has position on face const SMDS_FacePosition* fpos = static_cast(n->GetPosition().get()); uv.SetCoord(fpos->GetUParameter(),fpos->GetVParameter()); - if ( check && *check ) - { - // check that uv is correct - TopLoc_Location loc; - Handle(Geom_Surface) surface = BRep_Tool::Surface( F,loc ); - double tol = 2 * BRep_Tool::Tolerance( F ); - gp_Pnt nodePnt = XYZ( n ); - if ( !loc.IsIdentity() ) nodePnt.Transform( loc.Transformation().Inverted() ); - if ( nodePnt.Distance( surface->Value( uv.X(), uv.Y() )) > tol ) { - // uv incorrect, project the node to surface - GeomAPI_ProjectPointOnSurf projector( nodePnt, surface, tol ); - if ( !projector.IsDone() || projector.NbPoints() < 1 ) { - MESSAGE( "SMESH_MesherHelper::GetNodeUV() failed to project" ) - return uv.XY(); - } - Quantity_Parameter U,V; - projector.LowerDistanceParameters(U,V); - if ( nodePnt.Distance( surface->Value( U, V )) > tol ) - MESSAGE( "SMESH_MesherHelper::GetNodeUV(), invalid projection" ); - uv.SetCoord( U,V ); - } - else if ( uv.XY().Modulus() > numeric_limits::min() ) { - *check = false; // parameters are OK, do not check further more - } - } + uvOK = CheckNodeUV( F, n, uv.ChangeCoord(), BRep_Tool::Tolerance( F )); } else if(Pos->GetTypeOfPosition()==SMDS_TOP_EDGE) { @@ -380,42 +356,49 @@ gp_XY SMESH_MesherHelper::GetNodeUV(const TopoDS_Face& F, static_cast(n->GetPosition().get()); int edgeID = Pos->GetShapeId(); TopoDS_Edge E = TopoDS::Edge(GetMeshDS()->IndexToShape(edgeID)); - double f, l; + double f, l, u = epos->GetUParameter(); Handle(Geom2d_Curve) C2d = BRep_Tool::CurveOnSurface(E, F, f, l); - uv = C2d->Value( epos->GetUParameter() ); + if ( f < u && u < l ) + uv = C2d->Value( u ); + else + uv.SetCoord(0.,0.); + uvOK = CheckNodeUV( F, n, uv.ChangeCoord(), BRep_Tool::Tolerance( E )); + // for a node on a seam edge select one of UVs on 2 pcurves if ( n2 && IsSeamShape( edgeID ) ) + { uv = GetUVOnSeam( uv, GetNodeUV( F, n2, 0 )); - - // adjust uv to period - TopLoc_Location loc; - Handle(Geom_Surface) S = BRep_Tool::Surface(F,loc); - Standard_Boolean isUPeriodic = S->IsUPeriodic(); - Standard_Boolean isVPeriodic = S->IsVPeriodic(); - if ( isUPeriodic || isVPeriodic ) { - Standard_Real UF,UL,VF,VL; - S->Bounds(UF,UL,VF,VL); - if(isUPeriodic) - uv.SetX( uv.X() + ShapeAnalysis::AdjustToPeriod(uv.X(),UF,UL)); - if(isVPeriodic) - uv.SetY( uv.Y() + ShapeAnalysis::AdjustToPeriod(uv.Y(),VF,VL)); + } + else + { // adjust uv to period + TopLoc_Location loc; + Handle(Geom_Surface) S = BRep_Tool::Surface(F,loc); + Standard_Boolean isUPeriodic = S->IsUPeriodic(); + Standard_Boolean isVPeriodic = S->IsVPeriodic(); + if ( isUPeriodic || isVPeriodic ) { + Standard_Real UF,UL,VF,VL; + S->Bounds(UF,UL,VF,VL); + if(isUPeriodic) + uv.SetX( uv.X() + ShapeAnalysis::AdjustToPeriod(uv.X(),UF,UL)); + if(isVPeriodic) + uv.SetY( uv.Y() + ShapeAnalysis::AdjustToPeriod(uv.Y(),VF,VL)); + } } } else if(Pos->GetTypeOfPosition()==SMDS_TOP_VERTEX) { if ( int vertexID = n->GetPosition()->GetShapeId() ) { - bool ok = true; const TopoDS_Vertex& V = TopoDS::Vertex(GetMeshDS()->IndexToShape(vertexID)); try { uv = BRep_Tool::Parameters( V, F ); + uvOK = true; } catch (Standard_Failure& exc) { - ok = false; } - if ( !ok ) { - for ( TopExp_Explorer vert(F,TopAbs_VERTEX); !ok && vert.More(); vert.Next() ) - ok = ( V == vert.Current() ); - if ( !ok ) { + if ( !uvOK ) { + for ( TopExp_Explorer vert(F,TopAbs_VERTEX); !uvOK && vert.More(); vert.Next() ) + uvOK = ( V == vert.Current() ); + if ( !uvOK ) { #ifdef _DEBUG_ MESSAGE ( "SMESH_MesherHelper::GetNodeUV(); Vertex " << vertexID << " not in face " << GetMeshDS()->ShapeToIndex( F ) ); @@ -423,14 +406,14 @@ gp_XY SMESH_MesherHelper::GetNodeUV(const TopoDS_Face& F, // get UV of a vertex closest to the node double dist = 1e100; gp_Pnt pn = XYZ( n ); - for ( TopExp_Explorer vert(F,TopAbs_VERTEX); !ok && vert.More(); vert.Next() ) { + for ( TopExp_Explorer vert(F,TopAbs_VERTEX); !uvOK && vert.More(); vert.Next() ) { TopoDS_Vertex curV = TopoDS::Vertex( vert.Current() ); gp_Pnt p = BRep_Tool::Pnt( curV ); double curDist = p.SquareDistance( pn ); if ( curDist < dist ) { dist = curDist; uv = BRep_Tool::Parameters( curV, F ); - if ( dist < DBL_MIN ) break; + uvOK = ( dist < DBL_MIN ); } } } @@ -454,9 +437,58 @@ gp_XY SMESH_MesherHelper::GetNodeUV(const TopoDS_Face& F, uv = GetUVOnSeam( uv, GetNodeUV( F, n2, 0 )); } } + + if ( check ) + *check = uvOK; + return uv.XY(); } +//======================================================================= +/*! + * \brief Check and fix node UV on a face + * \retval bool - false if UV is bad and could not be fixed + */ +//======================================================================= + +bool SMESH_MesherHelper::CheckNodeUV(const TopoDS_Face& F, + const SMDS_MeshNode* n, + gp_XY& uv, + const double tol) const +{ + if ( !myOkNodePosShapes.count( n->GetPosition()->GetShapeId() )) + { + // check that uv is correct + TopLoc_Location loc; + Handle(Geom_Surface) surface = BRep_Tool::Surface( F,loc ); + gp_Pnt nodePnt = XYZ( n ); + if ( !loc.IsIdentity() ) nodePnt.Transform( loc.Transformation().Inverted() ); + if ( nodePnt.Distance( surface->Value( uv.X(), uv.Y() )) > tol ) + { + // uv incorrect, project the node to surface + GeomAPI_ProjectPointOnSurf projector( nodePnt, surface, tol ); + if ( !projector.IsDone() || projector.NbPoints() < 1 ) + { + MESSAGE( "SMESH_MesherHelper::CheckNodeUV() failed to project" ); + return false; + } + Quantity_Parameter U,V; + projector.LowerDistanceParameters(U,V); + if ( nodePnt.Distance( surface->Value( U, V )) > tol ) + { + MESSAGE( "SMESH_MesherHelper::CheckNodeUV(), invalid projection" ); + return false; + } + uv.SetCoord( U,V ); + } + else if ( uv.Modulus() > numeric_limits::min() ) + { + ((SMESH_MesherHelper*) this)->myOkNodePosShapes.insert( n->GetPosition()->GetShapeId() ); + } + } + return true; +} + //======================================================================= /*! * \brief Return middle UV taking in account surface period @@ -583,23 +615,26 @@ const SMDS_MeshNode* SMESH_MesherHelper::GetMediumNode(const SMDS_MeshNode* n1, F = TopoDS::Face(myShape); faceID = myShapeID; } + bool uvOK1, uvOK2; + gp_XY p1 = GetNodeUV(F,n1,n2, &uvOK1); + gp_XY p2 = GetNodeUV(F,n2,n1, &uvOK2); - gp_XY p1 = GetNodeUV(F,n1,n2, &myCheckNodePos); - gp_XY p2 = GetNodeUV(F,n2,n1, &myCheckNodePos); - - if ( IsDegenShape( Pos1->GetShapeId() )) - p1.SetCoord( myParIndex, p2.Coord( myParIndex )); - else if ( IsDegenShape( Pos2->GetShapeId() )) - p2.SetCoord( myParIndex, p1.Coord( myParIndex )); - - TopLoc_Location loc; - Handle(Geom_Surface) S = BRep_Tool::Surface(F,loc); - gp_XY uv = GetMiddleUV( S, p1, p2 ); - gp_Pnt P = S->Value( uv.X(), uv.Y() ).Transformed(loc); - n12 = meshDS->AddNode(P.X(), P.Y(), P.Z()); - meshDS->SetNodeOnFace(n12, faceID, uv.X(), uv.Y()); - myTLinkNodeMap.insert(make_pair(link,n12)); - return n12; + if ( uvOK1 && uvOK2 ) + { + if ( IsDegenShape( Pos1->GetShapeId() )) + p1.SetCoord( myParIndex, p2.Coord( myParIndex )); + else if ( IsDegenShape( Pos2->GetShapeId() )) + p2.SetCoord( myParIndex, p1.Coord( myParIndex )); + + TopLoc_Location loc; + Handle(Geom_Surface) S = BRep_Tool::Surface(F,loc); + gp_XY uv = GetMiddleUV( S, p1, p2 ); + gp_Pnt P = S->Value( uv.X(), uv.Y() ).Transformed(loc); + n12 = meshDS->AddNode(P.X(), P.Y(), P.Z()); + meshDS->SetNodeOnFace(n12, faceID, uv.X(), uv.Y()); + myTLinkNodeMap.insert(make_pair(link,n12)); + return n12; + } } if (edgeID>0 || shapeType == TopAbs_EDGE) { @@ -611,8 +646,8 @@ const SMDS_MeshNode* SMESH_MesherHelper::GetMediumNode(const SMDS_MeshNode* n1, edgeID = myShapeID; } - double p1 = GetNodeU(E,n1, &myCheckNodePos); - double p2 = GetNodeU(E,n2, &myCheckNodePos); + double p1 = GetNodeU(E,n1); + double p2 = GetNodeU(E,n2); double f,l; Handle(Geom_Curve) C = BRep_Tool::Curve(E, f, l); @@ -723,7 +758,7 @@ SMDS_MeshFace* SMESH_MesherHelper::AddFace(const SMDS_MeshNode* n1, const SMDS_MeshNode* n2, const SMDS_MeshNode* n3, const int id, - const bool force3d) + const bool force3d) { SMESHDS_Mesh * meshDS = GetMeshDS(); SMDS_MeshFace* elem = 0; @@ -764,7 +799,7 @@ SMDS_MeshFace* SMESH_MesherHelper::AddFace(const SMDS_MeshNode* n1, const SMDS_MeshNode* n3, const SMDS_MeshNode* n4, const int id, - const bool force3d) + const bool force3d) { SMESHDS_Mesh * meshDS = GetMeshDS(); SMDS_MeshFace* elem = 0; @@ -824,7 +859,7 @@ SMDS_MeshVolume* SMESH_MesherHelper::AddVolume(const SMDS_MeshNode* n1, const SMDS_MeshNode* n5, const SMDS_MeshNode* n6, const int id, - const bool force3d) + const bool force3d) { SMESHDS_Mesh * meshDS = GetMeshDS(); SMDS_MeshVolume* elem = 0; @@ -871,7 +906,7 @@ SMDS_MeshVolume* SMESH_MesherHelper::AddVolume(const SMDS_MeshNode* n1, const SMDS_MeshNode* n3, const SMDS_MeshNode* n4, const int id, - const bool force3d) + const bool force3d) { SMESHDS_Mesh * meshDS = GetMeshDS(); SMDS_MeshVolume* elem = 0; @@ -913,7 +948,7 @@ SMDS_MeshVolume* SMESH_MesherHelper::AddVolume(const SMDS_MeshNode* n1, const SMDS_MeshNode* n4, const SMDS_MeshNode* n5, const int id, - const bool force3d) + const bool force3d) { SMDS_MeshVolume* elem = 0; if(!myCreateQuadratic) { @@ -964,7 +999,7 @@ SMDS_MeshVolume* SMESH_MesherHelper::AddVolume(const SMDS_MeshNode* n1, const SMDS_MeshNode* n7, const SMDS_MeshNode* n8, const int id, - const bool force3d) + const bool force3d) { SMESHDS_Mesh * meshDS = GetMeshDS(); SMDS_MeshVolume* elem = 0; diff --git a/src/SMESH/SMESH_MesherHelper.hxx b/src/SMESH/SMESH_MesherHelper.hxx index 65c3f600d..80bd0affa 100644 --- a/src/SMESH/SMESH_MesherHelper.hxx +++ b/src/SMESH/SMESH_MesherHelper.hxx @@ -151,15 +151,6 @@ public: */ void SetElementsOnShape(bool toSet) { mySetElemOnShape = toSet; } - /*! - * \brief Enable/disable checking of node parameters on shapes while adding elements. - * In case of incorrect parameters mudium node place is computed as the middle - * of two nodes. Default is false. - * NOTE that this flag is reset to "not to check" if check with non-default partameter - * is successful - */ - void SetCheckNodePosition(bool toCheck) { myCheckNodePos = toCheck; } - /*! * \brief Set shape to make elements on without calling IsQuadraticSubMesh() */ @@ -193,7 +184,7 @@ public: const SMDS_MeshNode* n2, const SMDS_MeshNode* n3, const int id=0, - const bool force3d = false); + const bool force3d = false); /*! * Creates quadratic or linear quadrangle */ @@ -202,7 +193,7 @@ public: const SMDS_MeshNode* n3, const SMDS_MeshNode* n4, const int id = 0, - const bool force3d = false); + const bool force3d = false); /*! * Creates quadratic or linear tetraahedron */ @@ -211,7 +202,7 @@ public: const SMDS_MeshNode* n3, const SMDS_MeshNode* n4, const int id = 0, - const bool force3d = true); + const bool force3d = true); /*! * Creates quadratic or linear pyramid */ @@ -221,7 +212,7 @@ public: const SMDS_MeshNode* n4, const SMDS_MeshNode* n5, const int id = 0, - const bool force3d = true); + const bool force3d = true); /*! * Creates quadratic or linear pentahedron */ @@ -232,7 +223,7 @@ public: const SMDS_MeshNode* n5, const SMDS_MeshNode* n6, const int id = 0, - const bool force3d = true); + const bool force3d = true); /*! * Creates quadratic or linear hexahedron */ @@ -245,7 +236,7 @@ public: const SMDS_MeshNode* n7, const SMDS_MeshNode* n8, const int id = 0, - bool force3d = true); + bool force3d = true); /*! * \brief Return U of the given node on the edge */ @@ -260,6 +251,14 @@ public: const SMDS_MeshNode* n, const SMDS_MeshNode* inFaceNode=0, bool* check=0) const; + /*! + * \brief Check and fix node UV on a face + * \retval bool - false if UV is bad and could not be fixed + */ + bool CheckNodeUV(const TopoDS_Face& F, + const SMDS_MeshNode* n, + gp_XY& uv, + const double tol) const; /*! * \brief Return middle UV taking in account surface period */ @@ -393,7 +392,7 @@ protected: // to create quadratic elements bool myCreateQuadratic; bool mySetElemOnShape; - bool myCheckNodePos; + std::set< int > myOkNodePosShapes; }; diff --git a/src/SMESH/SMESH_Octree.cxx b/src/SMESH/SMESH_Octree.cxx index 4642fa61d..00bdb2669 100644 --- a/src/SMESH/SMESH_Octree.cxx +++ b/src/SMESH/SMESH_Octree.cxx @@ -30,19 +30,37 @@ //=========================================================================== /*! - * \brief SMESH_Octree Constructor - * \param maxLevel - The level max the octree can reach (If <0 unlimited) + * Constructor. limit must be provided at tree root construction. + * limit will be deleted by SMESH_Octree. */ //=========================================================================== -SMESH_Octree::SMESH_Octree (const int maxLevel, const double minBoxSize): - myChildren(NULL), - myFather(NULL), - myLevel(0), - myMaxLevel(maxLevel), - myMinBoxSize(minBoxSize), - myIsLeaf(-1) + +SMESH_Octree::SMESH_Octree (SMESH_Octree::Limit* limit): + myChildren(NULL), + myFather(NULL), + myIsLeaf( false ), + myLimit( limit ), + myLevel(0), + myBox(NULL) +{ +} + +//================================================================================ +/*! + * \brief Compute the Octree + */ +//================================================================================ + +void SMESH_Octree::compute() { - myBox = new Bnd_B3d(); + if ( myLevel==0 ) + { + myBox = buildRootBox(); + if ( myLimit->myMinBoxSize > 0. && maxSize() <= myLimit->myMinBoxSize ) + myIsLeaf = true; + else + buildChildren(); + } } //====================================== @@ -50,85 +68,25 @@ SMESH_Octree::SMESH_Octree (const int maxLevel, const double minBoxSize): * \brief SMESH_Octree Destructor */ //====================================== + SMESH_Octree::~SMESH_Octree () { if(myChildren != NULL) { - if(!myIsLeaf) + if(!isLeaf()) { for(int i = 0; i<8; i++) delete myChildren[i]; delete[] myChildren; + myChildren = 0; } } - delete myBox; -} - -//=========================================================================== -/*! - * \brief Set the bounding box of the Octree - * \param box - 3d Bounding Box of the Octree - */ -//=========================================================================== -void SMESH_Octree::setBox(const Bnd_B3d* box) -{ -// delete myBox; -// myBox=new Bnd_B3d(*box); - *myBox = *box; -} - -//=========================================================================== -/*! - * \brief Set box to the 3d Bounding Box of the Octree - * \param box - Set box to the 3d Bounding Box of the Octree - */ -//=========================================================================== -void SMESH_Octree::getBox(Bnd_B3d& box) -{ -// if(box != NULL) -// delete box; -// box = new Bnd_B3d (*myBox); - box = *myBox; -} - -//=========================================================================== -/*! - * \brief Set the max level of the Octree - * \param maxLevel - The level max the octree can reach (If <0 unlimited) - */ -//=========================================================================== -void SMESH_Octree::setMaxLevel(const int maxLevel) -{myMaxLevel = maxLevel;} - - -//=========================================================================== -/*! - * \brief Compute the bigger dimension of the box - * \param box - 3d Box - * \retval double - bigger dimension of the box - */ -//=========================================================================== -double SMESH_Octree::maxSize(const Bnd_B3d* box) -{ - if(box ==NULL) - return 0; - gp_XYZ min = box->CornerMin(); - gp_XYZ max = box->CornerMax(); - gp_XYZ Size = (max - min); - double returnVal = (Size.X()>Size.Y())?Size.X():Size.Y(); - return (returnVal>Size.Z())?returnVal:Size.Z(); -} - -//============================= -/*! - * \brief Compute the Octree - */ -//============================= -void SMESH_Octree::Compute() -{ - // As soon as the Octree is a Leaf, I stop building his children - if(!isLeaf()) - buildChildren(); + if ( myBox ) + delete myBox; + myBox = 0; + if ( level() == 0 ) + delete myLimit; + myLimit = 0; } //================================================================= @@ -136,8 +94,11 @@ void SMESH_Octree::Compute() * \brief Build the 8 children boxes and call buildChildrenData() */ //================================================================= + void SMESH_Octree::buildChildren() { + if ( isLeaf() ) return; + myChildren = new SMESH_Octree*[8]; gp_XYZ min = myBox->CornerMin(); @@ -147,7 +108,6 @@ void SMESH_Octree::buildChildren() gp_XYZ childHsize = HSize/2.; Standard_Real XminChild, YminChild, ZminChild; - Bnd_B3d* box; gp_XYZ minChild; for (int i = 0; i < 8; i++) { @@ -166,19 +126,53 @@ void SMESH_Octree::buildChildren() ZminChild = (i<4)?min.Z():mid.Z(); minChild.SetCoord(XminChild, YminChild, ZminChild); - box = new Bnd_B3d(minChild+childHsize,childHsize); // The child is of the same type than its father (For instance, a SMESH_OctreeNode) // We allocate the memory we need for the child myChildren[i] = allocateOctreeChild(); // and we assign to him its box. - myChildren[i]->setBox(box); - delete box; + myChildren[i]->myFather = this; + myChildren[i]->myLimit = myLimit; + myChildren[i]->myLevel = myLevel + 1; + myChildren[i]->myBox = new Bnd_B3d(minChild+childHsize,childHsize); + if ( myLimit->myMinBoxSize > 0. && myChildren[i]->maxSize() <= myLimit->myMinBoxSize ) + myChildren[i]->myIsLeaf = true; } - // After building the 8 boxes, we put the data into the children.. + // After building the 8 boxes, we put the data into the children. buildChildrenData(); //After we pass to the next level of the Octree - for (int i = 0; i < 8; i++) - myChildren[i]->Compute(); + for (int i = 0; i<8; i++) + myChildren[i]->buildChildren(); +} + +//================================================================================ +/*! + * \brief Tell if Octree is a leaf or not + * An inheriting class can influence it via myIsLeaf protected field + */ +//================================================================================ + +bool SMESH_Octree::isLeaf() const +{ + return myIsLeaf || ((myLimit->myMaxLevel > 0) ? (level() >= myLimit->myMaxLevel) : false ); +} + +//=========================================================================== +/*! + * \brief Compute the bigger dimension of my box + */ +//=========================================================================== + +double SMESH_Octree::maxSize() const +{ + if ( myBox ) + { + gp_XYZ min = myBox->CornerMin(); + gp_XYZ max = myBox->CornerMax(); + gp_XYZ Size = (max - min); + double returnVal = (Size.X()>Size.Y())?Size.X():Size.Y(); + return (returnVal>Size.Z())?returnVal:Size.Z(); + } + return 0.; } diff --git a/src/SMESH/SMESH_Octree.hxx b/src/SMESH/SMESH_Octree.hxx index f906c2a08..79a641dd4 100644 --- a/src/SMESH/SMESH_Octree.hxx +++ b/src/SMESH/SMESH_Octree.hxx @@ -34,68 +34,90 @@ class SMESH_Octree { public: - // Constructor - SMESH_Octree (const int maxLevel = -1, const double minBoxSize = 0.); - // Destructor - virtual ~SMESH_Octree (); - - // Tell if Octree is a leaf or not (has to be implemented in inherited classes) - virtual const bool isLeaf() = 0; + // Data limiting the tree height + struct Limit { + // MaxLevel of the Octree + int myMaxLevel; + // Minimal size of the Box + double myMinBoxSize; - // Compute the Octree - void Compute(); + // Default: + // maxLevel-> 8^8 = 16777216 terminal trees + // minSize -> box size not checked + Limit(int maxLevel=8, double minSize=0.):myMaxLevel(maxLevel),myMinBoxSize(minSize) {} + virtual ~Limit() {} // it can be inherited + }; - // Set the maximal level of the Octree - void setMaxLevel(const int maxLevel); + // Constructor. limit must be provided at tree root construction. + // limit will be deleted by SMESH_Octree + SMESH_Octree (Limit* limit=0); - // Set the minimal size of the Box - void setMinBoxSize(const double minBoxSize){myMinBoxSize = minBoxSize;}; - - // Set the bounding box of the Octree - void setBox(const Bnd_B3d* box); + // Destructor + virtual ~SMESH_Octree (); - // Set box to the 3d Bounding Box of the Octree - void getBox(Bnd_B3d & box); + // Compute the Octree. Must be called by constructor of inheriting class + void compute(); - // Compute the bigger dimension of the box - static double maxSize(const Bnd_B3d* box); + // Tell if Octree is a leaf or not. + // An inheriting class can influence it via myIsLeaf protected field + bool isLeaf() const; // Return its level int level() const { return myLevel; } + // Get box to the 3d Bounding Box of the Octree + const Bnd_B3d& getBox() const { return *myBox; } + + // Compute the bigger dimension of my box + double maxSize() const; + + // Return index of a child the given point is in + inline int getChildIndex(double x, double y, double z, const gp_XYZ& boxMiddle)const; + protected: - // Constructor for children (has to be implemented in inherited classes) - virtual SMESH_Octree* allocateOctreeChild() = 0; + // Return box of the whole tree + virtual Bnd_B3d* buildRootBox() = 0; - // Build the 8 children boxes - void buildChildren(); + // Constructor for children + virtual SMESH_Octree* allocateOctreeChild() const = 0; - // Build the data in the 8 children (has to be implemented in inherited classes) - virtual void buildChildrenData() = 0; + // Build the data in the 8 children + virtual void buildChildrenData() = 0; // members - // Box of the Octree - Bnd_B3d* myBox; - // Array of 8 Octree children SMESH_Octree** myChildren; // Point the father, set to NULL for the level 0 SMESH_Octree* myFather; + // Tell us if the Octree is a leaf or not + bool myIsLeaf; + + // Tree limit + const Limit* myLimit; + +private: + // Build the 8 children boxes recursively + void buildChildren(); + // Level of the Octree int myLevel; - // MaxLevel of the Octree - int myMaxLevel; + Bnd_B3d* myBox; +}; - // Minimal size of the Box - double myMinBoxSize; +//================================================================================ +/*! + * \brief Return index of a child the given point is in + */ +//================================================================================ - // Tell us if the Octree is a leaf or not (-1 if not initialized) - int myIsLeaf; -}; +inline int SMESH_Octree::getChildIndex(double x, double y, double z, const gp_XYZ& mid) const +{ + return (x > mid.X()) + ( y > mid.Y())*2 + (z > mid.Z())*4; +} #endif diff --git a/src/SMESH/SMESH_OctreeNode.cxx b/src/SMESH/SMESH_OctreeNode.cxx index 9a74d71bd..8a230d72e 100644 --- a/src/SMESH/SMESH_OctreeNode.cxx +++ b/src/SMESH/SMESH_OctreeNode.cxx @@ -46,18 +46,22 @@ using namespace std; //================================================================ SMESH_OctreeNode::SMESH_OctreeNode (const set & theNodes, const int maxLevel, const int maxNbNodes , const double minBoxSize ) - :SMESH_Octree(maxLevel,minBoxSize), + :SMESH_Octree( new SMESH_Octree::Limit( maxLevel,minBoxSize)), myMaxNbNodes(maxNbNodes), myNodes(theNodes) { - // We need to compute the first bounding box via a special method - computeBoxForFather(); - myNbNodes = myNodes.size(); - myIsLeaf = ((myLevel == myMaxLevel) || - (myNbNodes <= myMaxNbNodes) || - (maxSize(myBox) <= myMinBoxSize)); - // All the children (Boxes and Data) are computed in Compute() - Compute(); + compute(); +} + +//================================================================================ +/*! + * \brief Constructor used to allocate a child + */ +//================================================================================ + +SMESH_OctreeNode::SMESH_OctreeNode (int maxNbNodes): + SMESH_Octree(), myMaxNbNodes(maxNbNodes) +{ } //================================================================================== @@ -65,16 +69,10 @@ SMESH_OctreeNode::SMESH_OctreeNode (const set & theNodes, * \brief Construct an empty SMESH_OctreeNode used by SMESH_Octree::buildChildren() */ //================================================================================== -SMESH_Octree* SMESH_OctreeNode::allocateOctreeChild() + +SMESH_Octree* SMESH_OctreeNode::allocateOctreeChild() const { - SMESH_OctreeNode * theOctree = new SMESH_OctreeNode(); - theOctree->myFather = this; - theOctree->myLevel = myLevel + 1; - theOctree->myMaxLevel = myMaxLevel; - theOctree->myMaxNbNodes = myMaxNbNodes; - theOctree->myMinBoxSize = myMinBoxSize; - theOctree->myNbNodes = 0; - return theOctree; + return new SMESH_OctreeNode(myMaxNbNodes); } //====================================== @@ -84,25 +82,20 @@ SMESH_Octree* SMESH_OctreeNode::allocateOctreeChild() * We take the max/min coord of the nodes */ //====================================== -void SMESH_OctreeNode::computeBoxForFather() + +Bnd_B3d* SMESH_OctreeNode::buildRootBox() { + Bnd_B3d* box = new Bnd_B3d; set::iterator it = myNodes.begin(); for (; it != myNodes.end(); it++) { const SMDS_MeshNode* n1 = *it; gp_XYZ p1( n1->X(), n1->Y(), n1->Z() ); - myBox->Add(p1); + box->Add(p1); } -} + if ( myNodes.size() <= myMaxNbNodes ) + myIsLeaf = true; -//==================================================================================== -/*! - * \brief Tell if Octree is a leaf or not (has to be implemented in inherited classes) - * \retval - True if the Octree is a leaf - */ -//==================================================================================== -const bool SMESH_OctreeNode::isLeaf() -{ - return myIsLeaf; + return box; } //==================================================================================== @@ -113,19 +106,15 @@ const bool SMESH_OctreeNode::isLeaf() * \retval bool - True if Node is in the box within precision */ //==================================================================================== + const bool SMESH_OctreeNode::isInside (const SMDS_MeshNode * Node, const double precision) { - double X = Node->X(); - double Y = Node->Y(); - double Z = Node->Z(); - bool Out = 1 ; + gp_XYZ p (Node->X(),Node->Y(),Node->Z()); if (precision <= 0.) - return !(myBox->IsOut(gp_XYZ(X,Y,Z))); - Bnd_B3d BoxWithPrecision; - getBox(BoxWithPrecision); + return !(getBox().IsOut(p)); + Bnd_B3d BoxWithPrecision = getBox(); BoxWithPrecision.Enlarge(precision); - Out = BoxWithPrecision.IsOut(gp_XYZ(X,Y,Z)); - return !(Out); + return ! BoxWithPrecision.IsOut(p); } //================================================ @@ -136,16 +125,15 @@ const bool SMESH_OctreeNode::isInside (const SMDS_MeshNode * Node, const double //================================================ void SMESH_OctreeNode::buildChildrenData() { - gp_XYZ min = myBox->CornerMin(); - gp_XYZ max = myBox->CornerMax(); + gp_XYZ min = getBox().CornerMin(); + gp_XYZ max = getBox().CornerMax(); gp_XYZ mid = (min + max)/2.; set::iterator it = myNodes.begin(); - int ChildBoxNum; while (it != myNodes.end()) { const SMDS_MeshNode* n1 = *it; - ChildBoxNum = (n1->X() > mid.X()) + (n1->Y() > mid.Y())*2 + (n1->Z() > mid.Z())*4; + int ChildBoxNum = getChildIndex( n1->X(), n1->Y(), n1->Z(), mid ); SMESH_OctreeNode* myChild = dynamic_cast (myChildren[ChildBoxNum]); myChild->myNodes.insert(myChild->myNodes.end(),n1); myNodes.erase( it ); @@ -154,10 +142,8 @@ void SMESH_OctreeNode::buildChildrenData() for (int i = 0; i < 8; i++) { SMESH_OctreeNode* myChild = dynamic_cast (myChildren[i]); - myChild->myNbNodes = (myChild->myNodes).size(); - myChild->myIsLeaf = ((myChild->myLevel == myMaxLevel) || - (myChild->myNbNodes <= myMaxNbNodes) || - (maxSize(myChild->myBox) <= myMinBoxSize)); + if ( myChild->myNodes.size() <= myMaxNbNodes ) + myChild->myIsLeaf = true; } } @@ -175,7 +161,7 @@ void SMESH_OctreeNode::NodesAround (const SMDS_MeshNode * Node, { if (isInside(Node,precision)) { - if (myIsLeaf) + if (isLeaf()) { Result->insert(Result->end(), myNodes.begin(), myNodes.end()); } @@ -190,6 +176,61 @@ void SMESH_OctreeNode::NodesAround (const SMDS_MeshNode * Node, } } +//================================================================================ +/*! + * \brief Return in dist2Nodes nodes mapped to their square distance from Node + * \param node - node to find nodes closest to + * \param dist2Nodes - map of found nodes and their distances + * \param precision - radius of a sphere to check nodes inside + * \retval bool - true if an exact overlapping found + */ +//================================================================================ + +bool SMESH_OctreeNode::NodesAround(const SMDS_MeshNode * node, + map& dist2Nodes, + double precision) +{ + if ( !dist2Nodes.empty() ) + precision = min ( precision, sqrt( dist2Nodes.begin()->first )); + else if ( precision == 0. ) + precision = maxSize() / 2; + + if (isInside(node,precision)) + { + if (!isLeaf()) + { + // first check a child containing node + gp_XYZ mid = (getBox().CornerMin() + getBox().CornerMax()) / 2.; + int nodeChild = getChildIndex( node->X(), node->Y(), node->Z(), mid ); + if ( ((SMESH_OctreeNode*) myChildren[nodeChild])->NodesAround(node, dist2Nodes, precision)) + return true; + + for (int i = 0; i < 8; i++) + if ( i != nodeChild ) + if (((SMESH_OctreeNode*) myChildren[i])->NodesAround(node, dist2Nodes, precision)) + return true; + } + else if ( NbNodes() > 0 ) + { + double minDist = precision * precision; + gp_Pnt p1 ( node->X(), node->Y(), node->Z() ); + set::iterator nIt = myNodes.begin(); + for ( ; nIt != myNodes.end(); ++nIt ) + { + gp_Pnt p2 ( (*nIt)->X(), (*nIt)->Y(), (*nIt)->Z() ); + double dist2 = p1.SquareDistance( p2 ); + if ( dist2 < minDist ) + dist2Nodes.insert( make_pair( minDist = dist2, *nIt )); + } +// if ( dist2Nodes.size() > 1 ) // leave only closest node in dist2Nodes +// dist2Nodes.erase( ++dist2Nodes.begin(), dist2Nodes.end()); + + return ( sqrt( minDist) <= precision * 1e-12 ); + } + } + return false; +} + //============================= /*! * \brief Return in theGroupsOfNodes a list of group of nodes close to each other within theTolerance @@ -202,15 +243,14 @@ void SMESH_OctreeNode::NodesAround (const SMDS_MeshNode * Node, * \param maxNbNodes - maximum Nodes in a Leaf of the SMESH_OctreeNode constructed, default value is 5 */ //============================= -void SMESH_OctreeNode::FindCoincidentNodes (set theSetOfNodes, +void SMESH_OctreeNode::FindCoincidentNodes (set& theSetOfNodes, list< list< const SMDS_MeshNode*> >* theGroupsOfNodes, const double theTolerance, const int maxLevel, const int maxNbNodes) { - SMESH_OctreeNode* theOctreeNode = new SMESH_OctreeNode(theSetOfNodes, maxLevel, maxNbNodes, theTolerance); - theOctreeNode->FindCoincidentNodes (&theSetOfNodes, theTolerance, theGroupsOfNodes); - delete theOctreeNode; + SMESH_OctreeNode theOctreeNode(theSetOfNodes, maxLevel, maxNbNodes, theTolerance); + theOctreeNode.FindCoincidentNodes (&theSetOfNodes, theTolerance, theGroupsOfNodes); } //============================= @@ -285,7 +325,7 @@ void SMESH_OctreeNode::FindCoincidentNodes (const SMDS_MeshNode * Node, if (isInsideBool) { // I'm only looking in the leaves, since all the nodes are stored there. - if (myIsLeaf) + if (isLeaf()) { gp_Pnt p1 (Node->X(), Node->Y(), Node->Z()); @@ -333,6 +373,43 @@ void SMESH_OctreeNode::FindCoincidentNodes (const SMDS_MeshNode * Node, } } +//================================================================================ +/*! + * \brief Update data according to node movement + */ +//================================================================================ + +void SMESH_OctreeNode::UpdateByMoveNode( const SMDS_MeshNode* node, const gp_Pnt& toPnt ) +{ + if ( isLeaf() ) + { + set::iterator pNode = myNodes.find( node ); + bool nodeInMe = ( pNode != myNodes.end() ); + + SMDS_MeshNode pointNode( toPnt.X(), toPnt.Y(), toPnt.Z() ); + bool pointInMe = isInside( &pointNode, 1e-10 ); + + if ( pointInMe != nodeInMe ) + { + if ( pointInMe ) + myNodes.insert( node ); + else + myNodes.erase( node ); + } + } + else if ( myChildren ) + { + gp_XYZ mid = (getBox().CornerMin() + getBox().CornerMax()) / 2.; + int nodeChild = getChildIndex( node->X(), node->Y(), node->Z(), mid ); + int pointChild = getChildIndex( toPnt.X(), toPnt.Y(), toPnt.Z(), mid ); + if ( nodeChild != pointChild ) + { + ((SMESH_OctreeNode*) myChildren[ nodeChild ])->UpdateByMoveNode( node, toPnt ); + ((SMESH_OctreeNode*) myChildren[ pointChild ])->UpdateByMoveNode( node, toPnt ); + } + } +} + //================================================================================ /*! * \brief Return iterator over children @@ -342,7 +419,7 @@ SMESH_OctreeNodeIteratorPtr SMESH_OctreeNode::GetChildrenIterator() { return SMESH_OctreeNodeIteratorPtr ( new SMDS_SetIterator< SMESH_OctreeNode*, SMESH_Octree** > - ( myChildren, ( isLeaf() ? myChildren : &myChildren[ 8 ] ))); + ( myChildren, (( isLeaf() || !myChildren ) ? myChildren : &myChildren[ 8 ] ))); } //================================================================================ @@ -354,5 +431,5 @@ SMDS_NodeIteratorPtr SMESH_OctreeNode::GetNodeIterator() { return SMDS_NodeIteratorPtr ( new SMDS_SetIterator< SMDS_pNode, set< SMDS_pNode >::const_iterator > - ( myNodes.begin(), myNodes.end() )); + ( myNodes.begin(), myNodes.size() ? myNodes.end() : myNodes.begin())); } diff --git a/src/SMESH/SMESH_OctreeNode.hxx b/src/SMESH/SMESH_OctreeNode.hxx index 6a3b0cb39..7799765d0 100644 --- a/src/SMESH/SMESH_OctreeNode.hxx +++ b/src/SMESH/SMESH_OctreeNode.hxx @@ -34,6 +34,7 @@ #include #include +#include #include "SMDS_ElemIterator.hxx" @@ -44,7 +45,7 @@ class SMESH_OctreeNode; typedef SMDS_Iterator SMESH_OctreeNodeIterator; typedef boost::shared_ptr SMESH_OctreeNodeIteratorPtr; -class SMESH_OctreeNode : public SMESH_Octree{ +class SMESH_OctreeNode : public SMESH_Octree { public: @@ -59,9 +60,6 @@ public: //============================= virtual ~SMESH_OctreeNode () {}; - // Tells us if SMESH_OctreeNode is a leaf or not (-1 = not initialiazed) - virtual const bool isLeaf(); - // Tells us if Node is inside the current box with the precision "precision" virtual const bool isInside(const SMDS_MeshNode * Node, const double precision = 0.); @@ -70,6 +68,11 @@ public: std::list* Result, const double precision = 0.); + // Return in dist2Nodes nodes mapped to their square distance from Node + bool NodesAround(const SMDS_MeshNode * Node, + std::map& dist2Nodes, + double precision); + // Return in theGroupsOfNodes a list of group of nodes close to each other within theTolerance // Search for all the nodes in nodes void FindCoincidentNodes ( std::set* nodes, @@ -78,10 +81,15 @@ public: // Static method that return in theGroupsOfNodes a list of group of nodes close to each other within // theTolerance search for all the nodes in nodes - static void FindCoincidentNodes ( std::set nodes, + static void FindCoincidentNodes ( std::set& nodes, std::list< std::list< const SMDS_MeshNode*> >* theGroupsOfNodes, - const double theTolerance = 0.00001, const int maxLevel = -1, + const double theTolerance = 0.00001, + const int maxLevel = -1, const int maxNbNodes = 5); + /*! + * \brief Update data according to node movement + */ + void UpdateByMoveNode( const SMDS_MeshNode* node, const gp_Pnt& toPnt ); /*! * \brief Return iterator over children */ @@ -93,25 +101,20 @@ public: /*! * \brief Return nb nodes in a tree */ - int NbNodes() const { return myNbNodes; } + int NbNodes() const { return myNodes.size(); } protected: -//============================= -/*! - * \brief Empty constructor - */ -//============================= - SMESH_OctreeNode (){}; + SMESH_OctreeNode (int maxNbNodes ); + + // Compute the bounding box of the whole set of nodes myNodes + virtual Bnd_B3d* buildRootBox(); // Shares the father's data with each of his child virtual void buildChildrenData(); - // Compute the bounding box of the whole set of nodes myNodes (only used for OctreeNode level 0) - void computeBoxForFather(); - // Construct an empty SMESH_OctreeNode used by SMESH_Octree::buildChildren() - virtual SMESH_Octree* allocateOctreeChild(); + virtual SMESH_Octree* allocateOctreeChild() const; // Return in result a list of nodes closed to Node and remove it from SetOfNodes void FindCoincidentNodes( const SMDS_MeshNode * Node, @@ -120,13 +123,11 @@ protected: const double precision); // The max number of nodes a leaf box can contain - int myMaxNbNodes; + int myMaxNbNodes; // The set of nodes inside the box of the Octree (Empty if Octree is not a leaf) std::set myNodes; - // The number of nodes I have inside the box - int myNbNodes; }; #endif diff --git a/src/SMESH/SMESH_subMesh.cxx b/src/SMESH/SMESH_subMesh.cxx index ad59f98c9..21d167518 100644 --- a/src/SMESH/SMESH_subMesh.cxx +++ b/src/SMESH/SMESH_subMesh.cxx @@ -82,22 +82,22 @@ SMESH_subMesh::SMESH_subMesh(int Id, SMESHDS_Mesh * meshDS, const TopoDS_Shape & aSubShape) { - _subShape = aSubShape; - _subMeshDS = meshDS->MeshElements(_subShape); // may be null ... - _father = father; - _Id = Id; - _dependenceAnalysed = _alwaysComputed = false; - - if (_subShape.ShapeType() == TopAbs_VERTEX) - { - _algoState = HYP_OK; - _computeState = READY_TO_COMPUTE; - } - else - { + _subShape = aSubShape; + _subMeshDS = meshDS->MeshElements(_subShape); // may be null ... + _father = father; + _Id = Id; + _dependenceAnalysed = _alwaysComputed = false; + + if (_subShape.ShapeType() == TopAbs_VERTEX) + { + _algoState = HYP_OK; + _computeState = READY_TO_COMPUTE; + } + else + { _algoState = NO_ALGO; _computeState = NOT_READY; - } + } } //============================================================================= @@ -392,7 +392,7 @@ const map < int, SMESH_subMesh * >& SMESH_subMesh::DependsOn() } case TopAbs_COMPSOLID: { - //MESSAGE("compsolid"); + //MESSAGE("compsolid"); for (TopExp_Explorer exp(_subShape, TopAbs_SOLID); exp.More(); exp.Next()) { @@ -448,7 +448,7 @@ const map < int, SMESH_subMesh * >& SMESH_subMesh::DependsOn() for (TopExp_Explorer exp(_subShape, TopAbs_VERTEX); exp.More(); exp.Next()) { - InsertDependence(exp.Current()); + InsertDependence(exp.Current()); } break; } @@ -495,8 +495,8 @@ void SMESH_subMesh::InsertDependence(const TopoDS_Shape aSubShape) const TopoDS_Shape & SMESH_subMesh::GetSubShape() const { - //MESSAGE("SMESH_subMesh::GetSubShape"); - return _subShape; + //MESSAGE("SMESH_subMesh::GetSubShape"); + return _subShape; } @@ -947,6 +947,12 @@ SMESH_Hypothesis::Hypothesis_Status break; } case REMOVE_FATHER_ALGO: { + // IPAL21346. Edges not removed when Netgen 1d-2d is removed from a SOLID. + // CLEAN was not called at event REMOVE_ALGO because the algo is not applicable to SOLID. + algo = dynamic_cast (anHyp); + if (!algo->NeedDescretBoundary()) + needFullClean = true; + algo = gen->GetAlgo((*_father), _subShape); if (algo == NULL) // no more applying algo on father { @@ -1142,48 +1148,48 @@ void SMESH_subMesh::CleanDependsOn() void SMESH_subMesh::DumpAlgoState(bool isMain) { - int dim = SMESH_Gen::GetShapeDim(_subShape); + int dim = SMESH_Gen::GetShapeDim(_subShape); // if (dim < 1) return; - if (isMain) - { - const map < int, SMESH_subMesh * >&subMeshes = DependsOn(); - - map < int, SMESH_subMesh * >::const_iterator itsub; - for (itsub = subMeshes.begin(); itsub != subMeshes.end(); itsub++) - { - SMESH_subMesh *sm = (*itsub).second; - sm->DumpAlgoState(false); - } - } - int type = _subShape.ShapeType(); - MESSAGE("dim = " << dim << " type of shape " << type); - switch (_algoState) - { - case NO_ALGO: - MESSAGE(" AlgoState = NO_ALGO"); - break; - case MISSING_HYP: - MESSAGE(" AlgoState = MISSING_HYP"); - break; - case HYP_OK: - MESSAGE(" AlgoState = HYP_OK"); - break; - } - switch (_computeState) - { - case NOT_READY: - MESSAGE(" ComputeState = NOT_READY"); - break; - case READY_TO_COMPUTE: - MESSAGE(" ComputeState = READY_TO_COMPUTE"); - break; - case COMPUTE_OK: - MESSAGE(" ComputeState = COMPUTE_OK"); - break; - case FAILED_TO_COMPUTE: - MESSAGE(" ComputeState = FAILED_TO_COMPUTE"); - break; - } + if (isMain) + { + const map < int, SMESH_subMesh * >&subMeshes = DependsOn(); + + map < int, SMESH_subMesh * >::const_iterator itsub; + for (itsub = subMeshes.begin(); itsub != subMeshes.end(); itsub++) + { + SMESH_subMesh *sm = (*itsub).second; + sm->DumpAlgoState(false); + } + } + int type = _subShape.ShapeType(); + MESSAGE("dim = " << dim << " type of shape " << type); + switch (_algoState) + { + case NO_ALGO: + MESSAGE(" AlgoState = NO_ALGO"); + break; + case MISSING_HYP: + MESSAGE(" AlgoState = MISSING_HYP"); + break; + case HYP_OK: + MESSAGE(" AlgoState = HYP_OK"); + break; + } + switch (_computeState) + { + case NOT_READY: + MESSAGE(" ComputeState = NOT_READY"); + break; + case READY_TO_COMPUTE: + MESSAGE(" ComputeState = READY_TO_COMPUTE"); + break; + case COMPUTE_OK: + MESSAGE(" ComputeState = COMPUTE_OK"); + break; + case FAILED_TO_COMPUTE: + MESSAGE(" ComputeState = FAILED_TO_COMPUTE"); + break; + } } //================================================================================ @@ -1278,13 +1284,13 @@ bool SMESH_subMesh::ComputeStateEngine(int event) if ( _algoState == HYP_OK ) _computeState = READY_TO_COMPUTE; break; - case COMPUTE: // nothing to do + case COMPUTE: // nothing to do break; case CLEAN: CleanDependants(); RemoveSubMeshElementsAndNodes(); break; - case SUBMESH_COMPUTED: // nothing to do + case SUBMESH_COMPUTED: // nothing to do break; case SUBMESH_RESTORED: ComputeSubMeshStateEngine( SUBMESH_RESTORED ); diff --git a/src/SMESH/SMESH_subMesh.hxx b/src/SMESH/SMESH_subMesh.hxx index d4c0468f9..3aaf987af 100644 --- a/src/SMESH/SMESH_subMesh.hxx +++ b/src/SMESH/SMESH_subMesh.hxx @@ -61,7 +61,7 @@ class SMESH_EXPORT SMESH_subMesh { public: SMESH_subMesh(int Id, SMESH_Mesh * father, SMESHDS_Mesh * meshDS, - const TopoDS_Shape & aSubShape); + const TopoDS_Shape & aSubShape); virtual ~ SMESH_subMesh(); int GetId() const; diff --git a/src/SMESHDS/SMESHDS_CommandType.hxx b/src/SMESHDS/SMESHDS_CommandType.hxx index a033961bc..7279ba932 100644 --- a/src/SMESHDS/SMESHDS_CommandType.hxx +++ b/src/SMESHDS/SMESHDS_CommandType.hxx @@ -30,7 +30,6 @@ enum SMESHDS_CommandType { SMESHDS_AddNode, - SMESHDS_Add0DElement, SMESHDS_AddEdge, SMESHDS_AddTriangle, SMESHDS_AddQuadrangle, @@ -54,7 +53,9 @@ enum SMESHDS_CommandType { SMESHDS_AddQuadTetrahedron, SMESHDS_AddQuadPyramid, SMESHDS_AddQuadPentahedron, - SMESHDS_AddQuadHexahedron + SMESHDS_AddQuadHexahedron, + // special type for 0D elements + SMESHDS_Add0DElement }; diff --git a/src/SMESHDS/SMESHDS_Mesh.cxx b/src/SMESHDS/SMESHDS_Mesh.cxx index ff27ae915..34118b829 100644 --- a/src/SMESHDS/SMESHDS_Mesh.cxx +++ b/src/SMESHDS/SMESHDS_Mesh.cxx @@ -284,21 +284,21 @@ SMDS_MeshEdge* SMESHDS_Mesh::AddEdgeWithID(int n1, int n2, int ID) } SMDS_MeshEdge* SMESHDS_Mesh::AddEdgeWithID(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - int ID) + const SMDS_MeshNode * n2, + int ID) { return AddEdgeWithID(n1->GetID(), - n2->GetID(), - ID); + n2->GetID(), + ID); } SMDS_MeshEdge* SMESHDS_Mesh::AddEdge(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2) + const SMDS_MeshNode * n2) { SMDS_MeshEdge* anElem = SMDS_Mesh::AddEdge(n1,n2); if(anElem) myScript->AddEdge(anElem->GetID(), - n1->GetID(), - n2->GetID()); + n1->GetID(), + n2->GetID()); return anElem; } @@ -314,25 +314,25 @@ SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(int n1, int n2, int n3, int ID) } SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - int ID) + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + int ID) { return AddFaceWithID(n1->GetID(), - n2->GetID(), - n3->GetID(), - ID); + n2->GetID(), + n3->GetID(), + ID); } SMDS_MeshFace* SMESHDS_Mesh::AddFace( const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3) + 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()); + n1->GetID(), + n2->GetID(), + n3->GetID()); return anElem; } @@ -348,29 +348,29 @@ SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(int n1, int n2, int n3, int n4, int I } SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, - int ID) + 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); + 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) + 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()); + n1->GetID(), + n2->GetID(), + n3->GetID(), + n4->GetID()); return anElem; } @@ -386,29 +386,29 @@ SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(int n1, int n2, int n3, int n4, i } SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, - int ID) + 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); + 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) + 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()); + n1->GetID(), + n2->GetID(), + n3->GetID(), + n4->GetID()); return anElem; } @@ -424,33 +424,33 @@ SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(int n1, int n2, int n3, int n4, i } 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) + 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); + 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) + 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()); + n1->GetID(), + n2->GetID(), + n3->GetID(), + n4->GetID(), + n5->GetID()); return anElem; } @@ -466,37 +466,37 @@ SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(int n1, int n2, int n3, int n4, i } 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) + 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); + 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) + 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()); + n1->GetID(), + n2->GetID(), + n3->GetID(), + n4->GetID(), + n5->GetID(), + n6->GetID()); return anElem; } @@ -512,45 +512,45 @@ SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(int n1, int n2, int n3, int n4, i } 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) + 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); + 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) + 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()); + n1->GetID(), + n2->GetID(), + n3->GetID(), + n4->GetID(), + n5->GetID(), + n6->GetID(), + n7->GetID(), + n8->GetID()); return anElem; } @@ -1059,7 +1059,7 @@ void SMESHDS_Mesh::UnSetMeshElementOnShape(const SMDS_MeshElement * elem, //======================================================================= TopoDS_Shape SMESHDS_Mesh::ShapeToMesh() const { - return myShape; + return myShape; } //======================================================================= @@ -1143,7 +1143,7 @@ SMESHDS_Mesh::GetHypothesis(const TopoDS_Shape & S) const //======================================================================= SMESHDS_Script* SMESHDS_Mesh::GetScript() { - return myScript; + return myScript; } //======================================================================= @@ -1152,7 +1152,7 @@ SMESHDS_Script* SMESHDS_Mesh::GetScript() //======================================================================= void SMESHDS_Mesh::ClearScript() { - myScript->Clear(); + myScript->Clear(); } //======================================================================= @@ -1161,9 +1161,9 @@ void SMESHDS_Mesh::ClearScript() //======================================================================= 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(); + if (myShape.IsNull()) MESSAGE("myShape is NULL"); + int Index = myIndexToShape.FindIndex(S); + return myShapeIndexToSubMesh.find(Index)!=myShapeIndexToSubMesh.end(); } //======================================================================= @@ -1235,7 +1235,7 @@ int SMESHDS_Mesh::AddCompoundSubmesh(const TopoDS_Shape& S, //======================================================================= const TopoDS_Shape& SMESHDS_Mesh::IndexToShape(int ShapeIndex) const { - return myIndexToShape.FindKey(ShapeIndex); + return myIndexToShape.FindKey(ShapeIndex); } //======================================================================= @@ -1351,8 +1351,8 @@ SMDS_MeshEdge* SMESHDS_Mesh::AddEdge(const SMDS_MeshNode* n1, { SMDS_MeshEdge* anElem = SMDS_Mesh::AddEdge(n1,n2,n12); if(anElem) myScript->AddEdge(anElem->GetID(), - n1->GetID(), - n2->GetID(), + n1->GetID(), + n2->GetID(), n12->GetID()); return anElem; } @@ -1367,9 +1367,9 @@ SMDS_MeshEdge* SMESHDS_Mesh::AddEdgeWithID(const SMDS_MeshNode * n1, int ID) { return AddEdgeWithID(n1->GetID(), - n2->GetID(), + n2->GetID(), n12->GetID(), - ID); + ID); } @@ -1386,7 +1386,7 @@ SMDS_MeshFace* SMESHDS_Mesh::AddFace(const SMDS_MeshNode * n1, { SMDS_MeshFace *anElem = SMDS_Mesh::AddFace(n1,n2,n3,n12,n23,n31); if(anElem) myScript->AddFace(anElem->GetID(), - n1->GetID(), n2->GetID(), n3->GetID(), + n1->GetID(), n2->GetID(), n3->GetID(), n12->GetID(), n23->GetID(), n31->GetID()); return anElem; } @@ -1417,7 +1417,7 @@ SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1, { return AddFaceWithID(n1->GetID(), n2->GetID(), n3->GetID(), n12->GetID(), n23->GetID(), n31->GetID(), - ID); + ID); } @@ -1436,7 +1436,7 @@ SMDS_MeshFace* SMESHDS_Mesh::AddFace(const SMDS_MeshNode * n1, { SMDS_MeshFace *anElem = SMDS_Mesh::AddFace(n1,n2,n3,n4,n12,n23,n34,n41); if(anElem) myScript->AddFace(anElem->GetID(), - n1->GetID(), n2->GetID(), n3->GetID(), n4->GetID(), + n1->GetID(), n2->GetID(), n3->GetID(), n4->GetID(), n12->GetID(), n23->GetID(), n34->GetID(), n41->GetID()); return anElem; } @@ -1469,7 +1469,7 @@ SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1, { return AddFaceWithID(n1->GetID(), n2->GetID(), n3->GetID(), n4->GetID(), n12->GetID(), n23->GetID(), n34->GetID(), n41->GetID(), - ID); + ID); } @@ -1490,8 +1490,8 @@ SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1, { SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1,n2,n3,n4,n12,n23,n31,n14,n24,n34); if(anElem) myScript->AddVolume(anElem->GetID(), - n1->GetID(), n2->GetID(), n3->GetID(), n4->GetID(), - n12->GetID(), n23->GetID(), n31->GetID(), + n1->GetID(), n2->GetID(), n3->GetID(), n4->GetID(), + n12->GetID(), n23->GetID(), n31->GetID(), n14->GetID(), n24->GetID(), n34->GetID()); return anElem; } @@ -1509,7 +1509,7 @@ SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(int n1, int n2, int n3, int n4, if(anElem) myScript->AddVolume(ID,n1,n2,n3,n4,n12,n23,n31,n14,n24,n34); return anElem; } - + //======================================================================= //function : AddVolumeWithID //purpose : 2d order tetrahedron of 10 nodes @@ -1575,7 +1575,7 @@ SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(int n1, int n2, int n3, int n4, i n15,n25,n35,n45); return anElem; } - + //======================================================================= //function : AddVolumeWithID //purpose : 2d order pyramid of 13 nodes @@ -1652,7 +1652,7 @@ SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(int n1, int n2, int n3, n45,n56,n64,n14,n25,n36); return anElem; } - + //======================================================================= //function : AddVolumeWithID //purpose : 2d order Pentahedron with 15 nodes @@ -1740,7 +1740,7 @@ SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(int n1, int n2, int n3, int n4, n56,n67,n78,n85,n15,n26,n37,n48); return anElem; } - + //======================================================================= //function : AddVolumeWithID //purpose : 2d order Hexahedrons with 20 nodes diff --git a/src/SMESHDS/SMESHDS_Mesh.hxx b/src/SMESHDS/SMESHDS_Mesh.hxx index 4c1398fef..116deb607 100644 --- a/src/SMESHDS/SMESHDS_Mesh.hxx +++ b/src/SMESHDS/SMESHDS_Mesh.hxx @@ -75,156 +75,156 @@ public: virtual SMDS_MeshEdge* AddEdgeWithID(int n1, int n2, int ID); virtual SMDS_MeshEdge* AddEdgeWithID(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - int ID); + const SMDS_MeshNode * n2, + int ID); virtual SMDS_MeshEdge* AddEdge(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2); + const SMDS_MeshNode * n2); // 2d order edge with 3 nodes: n12 - node between n1 and n2 virtual SMDS_MeshEdge* AddEdgeWithID(int n1, int n2, int n12, int ID); virtual SMDS_MeshEdge* AddEdgeWithID(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n12, - int ID); + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n12, + int ID); virtual SMDS_MeshEdge* AddEdge(const SMDS_MeshNode * n1, const SMDS_MeshNode * n2, const SMDS_MeshNode * n12); 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); + 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); + 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); + 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); + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4); // 2d order triangle of 6 nodes virtual SMDS_MeshFace* AddFaceWithID(int n1, int n2, int n3, int n12,int n23,int n31, int ID); virtual SMDS_MeshFace* AddFaceWithID(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n12, - const SMDS_MeshNode * n23, - const SMDS_MeshNode * n31, - int ID); + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n12, + const SMDS_MeshNode * n23, + const SMDS_MeshNode * n31, + int ID); virtual SMDS_MeshFace* AddFace(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, const SMDS_MeshNode * n12, - const SMDS_MeshNode * n23, - const SMDS_MeshNode * n31); + const SMDS_MeshNode * n23, + const SMDS_MeshNode * n31); // 2d order quadrangle virtual SMDS_MeshFace* AddFaceWithID(int n1, int n2, int n3, int n4, int n12,int n23,int n34,int n41, int ID); virtual SMDS_MeshFace* AddFaceWithID(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, - const SMDS_MeshNode * n12, - const SMDS_MeshNode * n23, - const SMDS_MeshNode * n34, - const SMDS_MeshNode * n41, - int ID); + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4, + const SMDS_MeshNode * n12, + const SMDS_MeshNode * n23, + const SMDS_MeshNode * n34, + const SMDS_MeshNode * n41, + int ID); virtual SMDS_MeshFace* AddFace(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4, const SMDS_MeshNode * n12, - const SMDS_MeshNode * n23, - const SMDS_MeshNode * n34, - const SMDS_MeshNode * n41); + const SMDS_MeshNode * n23, + const SMDS_MeshNode * n34, + const SMDS_MeshNode * n41); 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); + 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); + 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); + 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); + 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); + 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); + 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); + 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); + 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); // 2d order tetrahedron of 10 nodes virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4, int n12,int n23,int n31, int n14,int n24,int n34, 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 * n12, - const SMDS_MeshNode * n23, - const SMDS_MeshNode * n31, - const SMDS_MeshNode * n14, - const SMDS_MeshNode * n24, - const SMDS_MeshNode * n34, - int ID); + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4, + const SMDS_MeshNode * n12, + const SMDS_MeshNode * n23, + const SMDS_MeshNode * n31, + const SMDS_MeshNode * n14, + const SMDS_MeshNode * n24, + const SMDS_MeshNode * n34, + 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 * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4, const SMDS_MeshNode * n12, const SMDS_MeshNode * n23, const SMDS_MeshNode * n31, @@ -238,24 +238,24 @@ public: int n15,int n25,int n35,int n45, 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 * n12, - const SMDS_MeshNode * n23, - const SMDS_MeshNode * n34, - const SMDS_MeshNode * n41, - const SMDS_MeshNode * n15, - const SMDS_MeshNode * n25, - const SMDS_MeshNode * n35, - const SMDS_MeshNode * n45, - int ID); + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4, + const SMDS_MeshNode * n5, + const SMDS_MeshNode * n12, + const SMDS_MeshNode * n23, + const SMDS_MeshNode * n34, + const SMDS_MeshNode * n41, + const SMDS_MeshNode * n15, + const SMDS_MeshNode * n25, + const SMDS_MeshNode * n35, + const SMDS_MeshNode * n45, + 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 * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4, + const SMDS_MeshNode * n5, const SMDS_MeshNode * n12, const SMDS_MeshNode * n23, const SMDS_MeshNode * n34, @@ -273,27 +273,27 @@ public: int n14,int n25,int n36, 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 * n12, - const SMDS_MeshNode * n23, - const SMDS_MeshNode * n31, - const SMDS_MeshNode * n45, - const SMDS_MeshNode * n56, - const SMDS_MeshNode * n64, - const SMDS_MeshNode * n14, - const SMDS_MeshNode * n25, - const SMDS_MeshNode * n36, - int ID); + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4, + const SMDS_MeshNode * n5, + const SMDS_MeshNode * n6, + const SMDS_MeshNode * n12, + const SMDS_MeshNode * n23, + const SMDS_MeshNode * n31, + const SMDS_MeshNode * n45, + const SMDS_MeshNode * n56, + const SMDS_MeshNode * n64, + const SMDS_MeshNode * n14, + const SMDS_MeshNode * n25, + const SMDS_MeshNode * n36, + 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 * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4, + const SMDS_MeshNode * n5, + const SMDS_MeshNode * n6, const SMDS_MeshNode * n12, const SMDS_MeshNode * n23, const SMDS_MeshNode * n31, @@ -312,34 +312,34 @@ public: int n15,int n26,int n37,int n48, 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, - const SMDS_MeshNode * n12, - const SMDS_MeshNode * n23, - const SMDS_MeshNode * n34, - const SMDS_MeshNode * n41, - const SMDS_MeshNode * n56, - const SMDS_MeshNode * n67, - const SMDS_MeshNode * n78, - const SMDS_MeshNode * n85, - const SMDS_MeshNode * n15, - const SMDS_MeshNode * n26, - const SMDS_MeshNode * n37, - const SMDS_MeshNode * n48, - int ID); + 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, + const SMDS_MeshNode * n12, + const SMDS_MeshNode * n23, + const SMDS_MeshNode * n34, + const SMDS_MeshNode * n41, + const SMDS_MeshNode * n56, + const SMDS_MeshNode * n67, + const SMDS_MeshNode * n78, + const SMDS_MeshNode * n85, + const SMDS_MeshNode * n15, + const SMDS_MeshNode * n26, + const SMDS_MeshNode * n37, + const SMDS_MeshNode * n48, + 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, + 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, const SMDS_MeshNode * n12, const SMDS_MeshNode * n23, const SMDS_MeshNode * n34, @@ -405,9 +405,9 @@ public: void SetNodeOnVertex(SMDS_MeshNode * aNode, const TopoDS_Vertex & S); void UnSetNodeOnShape(const SMDS_MeshNode * aNode); void SetMeshElementOnShape(const SMDS_MeshElement * anElt, - const TopoDS_Shape & S); + const TopoDS_Shape & S); void UnSetMeshElementOnShape(const SMDS_MeshElement * anElt, - const TopoDS_Shape & S); + const TopoDS_Shape & S); bool HasMeshElements(const TopoDS_Shape & S); SMESHDS_SubMesh * MeshElements(const TopoDS_Shape & S) const; SMESHDS_SubMesh * MeshElements(const int Index); diff --git a/src/SMESHGUI/Makefile.am b/src/SMESHGUI/Makefile.am index 94559f098..1b278b946 100644 --- a/src/SMESHGUI/Makefile.am +++ b/src/SMESHGUI/Makefile.am @@ -91,6 +91,7 @@ salomeinclude_HEADERS = \ SMESHGUI_MeshEditPreview.h \ SMESHGUI_IdValidator.h \ SMESHGUI_MeshInfosBox.h \ + SMESHGUI_Make2DFrom3DOp.h \ SMESH_SMESHGUI.hxx # Libraries targets @@ -159,7 +160,8 @@ dist_libSMESH_la_SOURCES = \ SMESHGUI_MeshEditPreview.cxx \ SMESHGUI_GroupOnShapeDlg.cxx \ SMESHGUI_FileInfoDlg.cxx \ - SMESHGUI_MeshInfosBox.cxx + SMESHGUI_MeshInfosBox.cxx \ + SMESHGUI_Make2DFrom3DOp.cxx MOC_FILES = \ SMESHGUI_moc.cxx \ @@ -212,7 +214,8 @@ MOC_FILES = \ SMESHGUI_MakeNodeAtPointDlg_moc.cxx \ SMESHGUI_GroupOnShapeDlg_moc.cxx \ SMESHGUI_FileInfoDlg_moc.cxx \ - SMESHGUI_MeshInfosBox_moc.cxx + SMESHGUI_MeshInfosBox_moc.cxx \ + SMESHGUI_Make2DFrom3DOp_moc.cxx nodist_libSMESH_la_SOURCES= \ $(MOC_FILES) diff --git a/src/SMESHGUI/SMESHGUI.cxx b/src/SMESHGUI/SMESHGUI.cxx index 26e1de4db..10e2d8820 100644 --- a/src/SMESHGUI/SMESHGUI.cxx +++ b/src/SMESHGUI/SMESHGUI.cxx @@ -67,6 +67,7 @@ #include "SMESHGUI_BuildCompoundDlg.h" #include "SMESHGUI_ComputeDlg.h" #include "SMESHGUI_FileInfoDlg.h" +#include "SMESHGUI_Make2DFrom3DOp.h" #include "SMESHGUI_Utils.h" #include "SMESHGUI_MeshUtils.h" @@ -117,7 +118,7 @@ #include CORBA_CLIENT_HEADER(SMESH_MeshEditor) // Qt includes -// #define INCLUDE_MENUITEM_DEF // VSR commented ???????? +// #define INCLUDE_MENUITEM_DEF // VSR commented ???????? #include // BOOST includes @@ -144,7 +145,7 @@ // Declarations //============================================================= void ImportMeshesFromFile(SMESH::SMESH_Gen_ptr theComponentMesh, - int theCommandID); + int theCommandID); void ExportMeshToFile(int theCommandID); @@ -158,7 +159,7 @@ // Definitions //============================================================= void ImportMeshesFromFile( SMESH::SMESH_Gen_ptr theComponentMesh, - int theCommandID ) + int theCommandID ) { QStringList filter; std::string myExtension; @@ -179,9 +180,9 @@ anInitialPath = QDir::currentPath(); QStringList filenames = SUIT_FileDlg::getOpenFileNames( SMESHGUI::desktop(), - anInitialPath, - filter, - QObject::tr( "SMESH_IMPORT_MESH" ) ); + anInitialPath, + filter, + QObject::tr( "SMESH_IMPORT_MESH" ) ); if ( filenames.count() > 0 ) { SUIT_OverrideCursor wc; _PTR(Study) aStudy = SMESH::GetActiveStudyDocument(); @@ -189,58 +190,58 @@ QStringList errors; bool isEmpty = false; for ( QStringList::ConstIterator it = filenames.begin(); it != filenames.end(); ++it ) { - QString filename = *it; - SMESH::mesh_array_var aMeshes = new SMESH::mesh_array; - try { - switch ( theCommandID ) { - case 111: - { - // DAT format (currently unsupported) - errors.append( QString( "%1 :\n\t%2" ).arg( filename ). - arg( QObject::tr( "SMESH_ERR_NOT_SUPPORTED_FORMAT" ) ) ); - break; - } - case 112: - { - // UNV format - aMeshes->length( 1 ); - aMeshes[0] = theComponentMesh->CreateMeshesFromUNV( filename.toLatin1().constData() ); - if ( aMeshes[0]->_is_nil() ) - errors.append( QString( "%1 :\n\t%2" ).arg( filename ). - arg( QObject::tr( "SMESH_ERR_UNKNOWN_IMPORT_ERROR" ) ) ); - break; - } - case 113: - { - // MED format - SMESH::DriverMED_ReadStatus res; - aMeshes = theComponentMesh->CreateMeshesFromMED( filename.toLatin1().constData(), res ); - if ( res != SMESH::DRS_OK ) { - errors.append( QString( "%1 :\n\t%2" ).arg( filename ). - arg( QObject::tr( QString( "SMESH_DRS_%1" ).arg( res ).toLatin1().data() ) ) ); - } - break; - } - } - } - catch ( const SALOME::SALOME_Exception& S_ex ) { - errors.append( QString( "%1 :\n\t%2" ).arg( filename ). - arg( QObject::tr( "SMESH_ERR_UNKNOWN_IMPORT_ERROR" ) ) ); - } - - for ( int i = 0, iEnd = aMeshes->length(); i < iEnd; i++ ) { - _PTR(SObject) aMeshSO = SMESH::FindSObject( aMeshes[i] ); - if ( aMeshSO ) { - _PTR(StudyBuilder) aBuilder = aStudy->NewBuilder(); - _PTR(AttributePixMap) aPixmap = aBuilder->FindOrCreateAttribute( aMeshSO, "AttributePixMap" ); - aPixmap->SetPixMap( "ICON_SMESH_TREE_MESH_IMPORTED" ); - if ( theCommandID == 112 ) // mesh names aren't taken from the file for UNV import - SMESH::SetName( aMeshSO, QFileInfo(filename).fileName() ); - } - else { - isEmpty = true; - } - } + QString filename = *it; + SMESH::mesh_array_var aMeshes = new SMESH::mesh_array; + try { + switch ( theCommandID ) { + case 111: + { + // DAT format (currently unsupported) + errors.append( QString( "%1 :\n\t%2" ).arg( filename ). + arg( QObject::tr( "SMESH_ERR_NOT_SUPPORTED_FORMAT" ) ) ); + break; + } + case 112: + { + // UNV format + aMeshes->length( 1 ); + aMeshes[0] = theComponentMesh->CreateMeshesFromUNV( filename.toLatin1().constData() ); + if ( aMeshes[0]->_is_nil() ) + errors.append( QString( "%1 :\n\t%2" ).arg( filename ). + arg( QObject::tr( "SMESH_ERR_UNKNOWN_IMPORT_ERROR" ) ) ); + break; + } + case 113: + { + // MED format + SMESH::DriverMED_ReadStatus res; + aMeshes = theComponentMesh->CreateMeshesFromMED( filename.toLatin1().constData(), res ); + if ( res != SMESH::DRS_OK ) { + errors.append( QString( "%1 :\n\t%2" ).arg( filename ). + arg( QObject::tr( QString( "SMESH_DRS_%1" ).arg( res ).toLatin1().data() ) ) ); + } + break; + } + } + } + catch ( const SALOME::SALOME_Exception& S_ex ) { + errors.append( QString( "%1 :\n\t%2" ).arg( filename ). + arg( QObject::tr( "SMESH_ERR_UNKNOWN_IMPORT_ERROR" ) ) ); + } + + for ( int i = 0, iEnd = aMeshes->length(); i < iEnd; i++ ) { + _PTR(SObject) aMeshSO = SMESH::FindSObject( aMeshes[i] ); + if ( aMeshSO ) { + _PTR(StudyBuilder) aBuilder = aStudy->NewBuilder(); + _PTR(AttributePixMap) aPixmap = aBuilder->FindOrCreateAttribute( aMeshSO, "AttributePixMap" ); + aPixmap->SetPixMap( "ICON_SMESH_TREE_MESH_IMPORTED" ); + if ( theCommandID == 112 ) // mesh names aren't taken from the file for UNV import + SMESH::SetName( aMeshSO, QFileInfo(filename).fileName() ); + } + else { + isEmpty = true; + } + } } // update Object browser @@ -248,16 +249,16 @@ // show Error message box if there were errors if ( errors.count() > 0 ) { - SUIT_MessageBox::critical( SMESHGUI::desktop(), - QObject::tr( "SMESH_ERROR" ), - QObject::tr( "SMESH_IMPORT_ERRORS" ) + "\n" + errors.join( "\n" ) ); + SUIT_MessageBox::critical( SMESHGUI::desktop(), + QObject::tr( "SMESH_ERROR" ), + QObject::tr( "SMESH_IMPORT_ERRORS" ) + "\n" + errors.join( "\n" ) ); } // show warning message box, if some imported mesh is empty if ( isEmpty ) { - SUIT_MessageBox::warning( SMESHGUI::desktop(), - QObject::tr( "SMESH_WRN_WARNING" ), - QObject::tr( "SMESH_DRS_SOME_EMPTY" ) ); + SUIT_MessageBox::warning( SMESHGUI::desktop(), + QObject::tr( "SMESH_WRN_WARNING" ), + QObject::tr( "SMESH_DRS_SOME_EMPTY" ) ); } } } @@ -487,7 +488,7 @@ } inline void InverseEntityMode(unsigned int& theOutputMode, - unsigned int theMode) + unsigned int theMode) { bool anIsNotPresent = ~theOutputMode & theMode; if(anIsNotPresent) @@ -505,31 +506,31 @@ if(selected.Extent() >= 1){ SALOME_ListIteratorOfListIO It( selected ); for( ; It.More(); It.Next()){ - Handle(SALOME_InteractiveObject) IObject = It.Value(); - if(IObject->hasEntry()){ - if(SMESH_Actor *anActor = SMESH::FindActorByEntry(IObject->getEntry())){ - unsigned int aMode = anActor->GetEntityMode(); - switch(theCommandID){ + Handle(SALOME_InteractiveObject) IObject = It.Value(); + if(IObject->hasEntry()){ + if(SMESH_Actor *anActor = SMESH::FindActorByEntry(IObject->getEntry())){ + unsigned int aMode = anActor->GetEntityMode(); + switch(theCommandID){ case 216: InverseEntityMode(aMode,SMESH_Actor::e0DElements); break; - case 217: - InverseEntityMode(aMode,SMESH_Actor::eEdges); - break; - case 218: - InverseEntityMode(aMode,SMESH_Actor::eFaces); - break; - case 219: - InverseEntityMode(aMode,SMESH_Actor::eVolumes); - break; - case 220: - aMode = SMESH_Actor::eAllEntity; - break; - } - if(aMode) - anActor->SetEntityMode(aMode); - } - } + case 217: + InverseEntityMode(aMode,SMESH_Actor::eEdges); + break; + case 218: + InverseEntityMode(aMode,SMESH_Actor::eFaces); + break; + case 219: + InverseEntityMode(aMode,SMESH_Actor::eVolumes); + break; + case 220: + aMode = SMESH_Actor::eAllEntity; + break; + } + if(aMode) + anActor->SetEntityMode(aMode); + } + } } } } @@ -574,12 +575,12 @@ _PTR(SObject) aGroupSObject = SMESH::FindSObject(aGroupObject); if(SMESH_Actor *anActor = SMESH::FindActorByEntry(aGroupSObject->GetID().c_str())) { - if( aGroupObject->GetType() == SMESH::NODE ) - anActor->SetNodeColor( aColor.R, aColor.G, aColor.B ); - else if( aGroupObject->GetType() == SMESH::EDGE ) - anActor->SetEdgeColor( aColor.R, aColor.G, aColor.B ); - else - anActor->SetSufaceColor( aColor.R, aColor.G, aColor.B ); + if( aGroupObject->GetType() == SMESH::NODE ) + anActor->SetNodeColor( aColor.R, aColor.G, aColor.B ); + else if( aGroupObject->GetType() == SMESH::EDGE ) + anActor->SetEdgeColor( aColor.R, aColor.G, aColor.B ); + else + anActor->SetSufaceColor( aColor.R, aColor.G, aColor.B ); } } @@ -596,7 +597,7 @@ Handle(SALOME_InteractiveObject) anIObject = selected.First(); SMESH::SMESH_Mesh_var aMesh = SMESH::IObjectToInterface(anIObject); if ( !aMesh->_is_nil() ) { - aMesh->SetAutoColor( false ); + aMesh->SetAutoColor( false ); } } } @@ -619,36 +620,36 @@ if(selected.Extent() >= 1){ switch(theCommandID){ case 1134:{ - SMESHGUI::GetSMESHGUI()->EmitSignalDeactivateDialog(); - (new SMESHGUI_ClippingDlg( SMESHGUI::GetSMESHGUI() ))->show(); - return; + SMESHGUI::GetSMESHGUI()->EmitSignalDeactivateDialog(); + (new SMESHGUI_ClippingDlg( SMESHGUI::GetSMESHGUI() ))->show(); + return; } case 1133:{ - SMESHGUI::GetSMESHGUI()->EmitSignalDeactivateDialog(); - (new SMESHGUI_TransparencyDlg( SMESHGUI::GetSMESHGUI() ))->show(); - return; + SMESHGUI::GetSMESHGUI()->EmitSignalDeactivateDialog(); + (new SMESHGUI_TransparencyDlg( SMESHGUI::GetSMESHGUI() ))->show(); + return; }} SALOME_ListIteratorOfListIO It( selected ); for( ; It.More(); It.Next()){ - Handle(SALOME_InteractiveObject) IObject = It.Value(); - if(IObject->hasEntry()){ - if(SMESH_Actor *anActor = SMESH::FindActorByEntry(IObject->getEntry())){ - switch(theCommandID){ - case 211: - anActor->SetRepresentation(SMESH_Actor::eEdge); - break; - case 212: - anActor->SetRepresentation(SMESH_Actor::eSurface); - break; - case 213: - if(anActor->IsShrunk()) - anActor->UnShrink(); - else - anActor->SetShrink(); - break; - case 215: - anActor->SetRepresentation(SMESH_Actor::ePoint); - break; + Handle(SALOME_InteractiveObject) IObject = It.Value(); + if(IObject->hasEntry()){ + if(SMESH_Actor *anActor = SMESH::FindActorByEntry(IObject->getEntry())){ + switch(theCommandID){ + case 211: + anActor->SetRepresentation(SMESH_Actor::eEdge); + break; + case 212: + anActor->SetRepresentation(SMESH_Actor::eSurface); + break; + case 213: + if(anActor->IsShrunk()) + anActor->UnShrink(); + else + anActor->SetShrink(); + break; + case 215: + anActor->SetRepresentation(SMESH_Actor::ePoint); + break; case 231: if(anActor->GetQuadratic2DRepresentation() != SMESH_Actor::eLines) anActor->SetQuadratic2DRepresentation(SMESH_Actor::eLines); @@ -657,103 +658,103 @@ if(anActor->GetQuadratic2DRepresentation() != SMESH_Actor::eArcs) anActor->SetQuadratic2DRepresentation(SMESH_Actor::eArcs); break; - case 1132:{ - vtkFloatingPointType color[3]; - anActor->GetSufaceColor(color[0], color[1], color[2]); - int c0 = int (color[0] * 255); - int c1 = int (color[1] * 255); - int c2 = int (color[2] * 255); - QColor c(c0, c1, c2); - - vtkFloatingPointType edgecolor[3]; - anActor->GetEdgeColor(edgecolor[0], edgecolor[1], edgecolor[2]); - c0 = int (edgecolor[0] * 255); - c1 = int (edgecolor[1] * 255); - c2 = int (edgecolor[2] * 255); - QColor e(c0, c1, c2); - - vtkFloatingPointType backfacecolor[3]; - anActor->GetBackSufaceColor(backfacecolor[0], backfacecolor[1], backfacecolor[2]); - c0 = int (backfacecolor[0] * 255); - c1 = int (backfacecolor[1] * 255); - c2 = int (backfacecolor[2] * 255); - QColor b(c0, c1, c2); - - vtkFloatingPointType nodecolor[3]; - anActor->GetNodeColor(nodecolor[0], nodecolor[1], nodecolor[2]); - c0 = int (nodecolor[0] * 255); - c1 = int (nodecolor[1] * 255); - c2 = int (nodecolor[2] * 255); - QColor n(c0, c1, c2); - - int Edgewidth = (int)anActor->GetLineWidth(); - if(Edgewidth == 0) - Edgewidth = 1; - int intValue = int(anActor->GetNodeSize()); - vtkFloatingPointType Shrink = anActor->GetShrinkFactor(); - - SMESHGUI_Preferences_ColorDlg *aDlg = - new SMESHGUI_Preferences_ColorDlg( SMESHGUI::GetSMESHGUI() ); - aDlg->SetColor(1, c); - aDlg->SetColor(2, e); - aDlg->SetColor(3, n); - aDlg->SetColor(4, b); - aDlg->SetIntValue(1, Edgewidth); - aDlg->SetIntValue(2, intValue); - aDlg->SetIntValue(3, int(Shrink*100.)); - if(aDlg->exec()){ - QColor color = aDlg->GetColor(1); - QColor edgecolor = aDlg->GetColor(2); - QColor nodecolor = aDlg->GetColor(3); - QColor backfacecolor = aDlg->GetColor(4); - /* actor color and backface color */ - anActor->SetSufaceColor(vtkFloatingPointType (color.red()) / 255., - vtkFloatingPointType (color.green()) / 255., - vtkFloatingPointType (color.blue()) / 255.); - anActor->SetBackSufaceColor(vtkFloatingPointType (backfacecolor.red()) / 255., - vtkFloatingPointType (backfacecolor.green()) / 255., - vtkFloatingPointType (backfacecolor.blue()) / 255.); - - /* edge color */ - anActor->SetEdgeColor(vtkFloatingPointType (edgecolor.red()) / 255., - vtkFloatingPointType (edgecolor.green()) / 255., - vtkFloatingPointType (edgecolor.blue()) / 255.); - - /* Shrink factor and size edges */ - anActor->SetShrinkFactor(aDlg->GetIntValue(3) / 100.); - anActor->SetLineWidth(aDlg->GetIntValue(1)); - - /* Nodes color and size */ - anActor->SetNodeColor(vtkFloatingPointType (nodecolor.red()) / 255., - vtkFloatingPointType (nodecolor.green()) / 255., - vtkFloatingPointType (nodecolor.blue()) / 255.); - anActor->SetNodeSize(aDlg->GetIntValue(2)); - - SMESH::SMESH_GroupBase_var aGroupObject = SMESH::IObjectToInterface(IObject); - if( !aGroupObject->_is_nil() ) - { - SMESH::ElementType anElementType = aGroupObject->GetType(); - QColor aColor; - switch( anElementType ) - { - case SMESH::NODE: aColor = nodecolor; break; - case SMESH::EDGE: aColor = edgecolor; break; - default: aColor = color; break; - } - - SALOMEDS::Color aGroupColor; - aGroupColor.R = (float)aColor.red() / 255.0; - aGroupColor.G = (float)aColor.green() / 255.0; - aGroupColor.B = (float)aColor.blue() / 255.0; - aGroupObject->SetColor( aGroupColor ); - } - - delete aDlg; - } - break; - }} - } - } + case 1132:{ + vtkFloatingPointType color[3]; + anActor->GetSufaceColor(color[0], color[1], color[2]); + int c0 = int (color[0] * 255); + int c1 = int (color[1] * 255); + int c2 = int (color[2] * 255); + QColor c(c0, c1, c2); + + vtkFloatingPointType edgecolor[3]; + anActor->GetEdgeColor(edgecolor[0], edgecolor[1], edgecolor[2]); + c0 = int (edgecolor[0] * 255); + c1 = int (edgecolor[1] * 255); + c2 = int (edgecolor[2] * 255); + QColor e(c0, c1, c2); + + vtkFloatingPointType backfacecolor[3]; + anActor->GetBackSufaceColor(backfacecolor[0], backfacecolor[1], backfacecolor[2]); + c0 = int (backfacecolor[0] * 255); + c1 = int (backfacecolor[1] * 255); + c2 = int (backfacecolor[2] * 255); + QColor b(c0, c1, c2); + + vtkFloatingPointType nodecolor[3]; + anActor->GetNodeColor(nodecolor[0], nodecolor[1], nodecolor[2]); + c0 = int (nodecolor[0] * 255); + c1 = int (nodecolor[1] * 255); + c2 = int (nodecolor[2] * 255); + QColor n(c0, c1, c2); + + int Edgewidth = (int)anActor->GetLineWidth(); + if(Edgewidth == 0) + Edgewidth = 1; + int intValue = int(anActor->GetNodeSize()); + vtkFloatingPointType Shrink = anActor->GetShrinkFactor(); + + SMESHGUI_Preferences_ColorDlg *aDlg = + new SMESHGUI_Preferences_ColorDlg( SMESHGUI::GetSMESHGUI() ); + aDlg->SetColor(1, c); + aDlg->SetColor(2, e); + aDlg->SetColor(3, n); + aDlg->SetColor(4, b); + aDlg->SetIntValue(1, Edgewidth); + aDlg->SetIntValue(2, intValue); + aDlg->SetIntValue(3, int(Shrink*100.)); + if(aDlg->exec()){ + QColor color = aDlg->GetColor(1); + QColor edgecolor = aDlg->GetColor(2); + QColor nodecolor = aDlg->GetColor(3); + QColor backfacecolor = aDlg->GetColor(4); + /* actor color and backface color */ + anActor->SetSufaceColor(vtkFloatingPointType (color.red()) / 255., + vtkFloatingPointType (color.green()) / 255., + vtkFloatingPointType (color.blue()) / 255.); + anActor->SetBackSufaceColor(vtkFloatingPointType (backfacecolor.red()) / 255., + vtkFloatingPointType (backfacecolor.green()) / 255., + vtkFloatingPointType (backfacecolor.blue()) / 255.); + + /* edge color */ + anActor->SetEdgeColor(vtkFloatingPointType (edgecolor.red()) / 255., + vtkFloatingPointType (edgecolor.green()) / 255., + vtkFloatingPointType (edgecolor.blue()) / 255.); + + /* Shrink factor and size edges */ + anActor->SetShrinkFactor(aDlg->GetIntValue(3) / 100.); + anActor->SetLineWidth(aDlg->GetIntValue(1)); + + /* Nodes color and size */ + anActor->SetNodeColor(vtkFloatingPointType (nodecolor.red()) / 255., + vtkFloatingPointType (nodecolor.green()) / 255., + vtkFloatingPointType (nodecolor.blue()) / 255.); + anActor->SetNodeSize(aDlg->GetIntValue(2)); + + SMESH::SMESH_GroupBase_var aGroupObject = SMESH::IObjectToInterface(IObject); + if( !aGroupObject->_is_nil() ) + { + SMESH::ElementType anElementType = aGroupObject->GetType(); + QColor aColor; + switch( anElementType ) + { + case SMESH::NODE: aColor = nodecolor; break; + case SMESH::EDGE: aColor = edgecolor; break; + default: aColor = color; break; + } + + SALOMEDS::Color aGroupColor; + aGroupColor.R = (float)aColor.red() / 255.0; + aGroupColor.G = (float)aColor.green() / 255.0; + aGroupColor.B = (float)aColor.blue() / 255.0; + aGroupObject->SetColor( aGroupColor ); + } + + delete aDlg; + } + break; + }} + } + } } SMESH::RepaintCurrentView(); } @@ -769,88 +770,88 @@ if( !selected.IsEmpty() ){ Handle(SALOME_InteractiveObject) anIO = selected.First(); if(!anIO.IsNull()){ - QString aTitle; - SMESH_Actor::eControl aControl = SMESH_Actor::eNone; - if(SMESH_Actor *anActor = SMESH::FindActorByEntry(anIO->getEntry())){ - switch ( theCommandID ){ - case 6001: - aTitle = QObject::tr( "LENGTH_EDGES" ); - aControl = SMESH_Actor::eLength; - break; - case 6018: - aTitle = QObject::tr( "LENGTH2D_EDGES" ); - aControl = SMESH_Actor::eLength2D; - break; - case 6002: - aTitle = QObject::tr( "FREE_EDGES" ); - aControl = SMESH_Actor::eFreeEdges; - break; - case 6003: - aTitle = QObject::tr( "FREE_BORDERS" ); - aControl = SMESH_Actor::eFreeBorders; - break; - case 6004: - aTitle = QObject::tr( "MULTI_BORDERS" ); - aControl = SMESH_Actor::eMultiConnection; - break; - case 6005: - aTitle = QObject::tr( "FREE_NODES" ); - aControl = SMESH_Actor::eFreeNodes; - break; - case 6019: - aTitle = QObject::tr( "MULTI2D_BORDERS" ); - aControl = SMESH_Actor::eMultiConnection2D; - break; - case 6011: - aTitle = QObject::tr( "AREA_ELEMENTS" ); - aControl = SMESH_Actor::eArea; - break; - case 6012: - aTitle = QObject::tr( "TAPER_ELEMENTS" ); - aControl = SMESH_Actor::eTaper; - break; - case 6013: - aTitle = QObject::tr( "ASPECTRATIO_ELEMENTS" ); - aControl = SMESH_Actor::eAspectRatio; - break; - case 6017: - aTitle = QObject::tr( "ASPECTRATIO_3D_ELEMENTS" ); - aControl = SMESH_Actor::eAspectRatio3D; - break; - case 6014: - aTitle = QObject::tr( "MINIMUMANGLE_ELEMENTS" ); - aControl = SMESH_Actor::eMinimumAngle; - break; - case 6015: - aTitle = QObject::tr( "WARP_ELEMENTS" ); - aControl = SMESH_Actor::eWarping; - break; - case 6016: - aTitle = QObject::tr( "SKEW_ELEMENTS" ); - aControl = SMESH_Actor::eSkew; - break; - case 6009: - aTitle = QObject::tr( "SMESH_VOLUME" ); - aControl = SMESH_Actor::eVolume3D; - break; - case 6021: - aTitle = QObject::tr( "FREE_FACES" ); - aControl = SMESH_Actor::eFreeFaces; - break; - } - anActor->SetControlMode(aControl); - anActor->GetScalarBarActor()->SetTitle(aTitle.toLatin1().data()); - SMESH::RepaintCurrentView(); - } + QString aTitle; + SMESH_Actor::eControl aControl = SMESH_Actor::eNone; + if(SMESH_Actor *anActor = SMESH::FindActorByEntry(anIO->getEntry())){ + switch ( theCommandID ){ + case 6001: + aTitle = QObject::tr( "LENGTH_EDGES" ); + aControl = SMESH_Actor::eLength; + break; + case 6018: + aTitle = QObject::tr( "LENGTH2D_EDGES" ); + aControl = SMESH_Actor::eLength2D; + break; + case 6002: + aTitle = QObject::tr( "FREE_EDGES" ); + aControl = SMESH_Actor::eFreeEdges; + break; + case 6003: + aTitle = QObject::tr( "FREE_BORDERS" ); + aControl = SMESH_Actor::eFreeBorders; + break; + case 6004: + aTitle = QObject::tr( "MULTI_BORDERS" ); + aControl = SMESH_Actor::eMultiConnection; + break; + case 6005: + aTitle = QObject::tr( "FREE_NODES" ); + aControl = SMESH_Actor::eFreeNodes; + break; + case 6019: + aTitle = QObject::tr( "MULTI2D_BORDERS" ); + aControl = SMESH_Actor::eMultiConnection2D; + break; + case 6011: + aTitle = QObject::tr( "AREA_ELEMENTS" ); + aControl = SMESH_Actor::eArea; + break; + case 6012: + aTitle = QObject::tr( "TAPER_ELEMENTS" ); + aControl = SMESH_Actor::eTaper; + break; + case 6013: + aTitle = QObject::tr( "ASPECTRATIO_ELEMENTS" ); + aControl = SMESH_Actor::eAspectRatio; + break; + case 6017: + aTitle = QObject::tr( "ASPECTRATIO_3D_ELEMENTS" ); + aControl = SMESH_Actor::eAspectRatio3D; + break; + case 6014: + aTitle = QObject::tr( "MINIMUMANGLE_ELEMENTS" ); + aControl = SMESH_Actor::eMinimumAngle; + break; + case 6015: + aTitle = QObject::tr( "WARP_ELEMENTS" ); + aControl = SMESH_Actor::eWarping; + break; + case 6016: + aTitle = QObject::tr( "SKEW_ELEMENTS" ); + aControl = SMESH_Actor::eSkew; + break; + case 6009: + aTitle = QObject::tr( "SMESH_VOLUME" ); + aControl = SMESH_Actor::eVolume3D; + break; + case 6021: + aTitle = QObject::tr( "FREE_FACES" ); + aControl = SMESH_Actor::eFreeFaces; + break; + } + anActor->SetControlMode(aControl); + anActor->GetScalarBarActor()->SetTitle(aTitle.toLatin1().data()); + SMESH::RepaintCurrentView(); + } } } } bool CheckOIType(const Handle(SALOME_InteractiveObject) & theIO, - MeshObjectType theType, - const QString theInTypeName, - QString & theOutTypeName) + MeshObjectType theType, + const QString theInTypeName, + QString & theOutTypeName) { SMESH_TypeFilter aTypeFilter( theType ); QString entry; @@ -875,17 +876,17 @@ _PTR(SComponent) aSComp = aSObj->GetFatherComponent(); CORBA::String_var anID = aSComp->GetID().c_str(); if (!strcmp(anID.in(),theIO->getEntry())) - return "Component"; + return "Component"; } QString aTypeName; if ( - CheckOIType ( theIO, HYPOTHESIS, "Hypothesis", aTypeName ) || - CheckOIType ( theIO, ALGORITHM, "Algorithm", aTypeName ) || - CheckOIType ( theIO, MESH, "Mesh", aTypeName ) || - CheckOIType ( theIO, SUBMESH, "SubMesh", aTypeName ) || - CheckOIType ( theIO, GROUP, "Group", aTypeName ) - ) + CheckOIType ( theIO, HYPOTHESIS, "Hypothesis", aTypeName ) || + CheckOIType ( theIO, ALGORITHM, "Algorithm", aTypeName ) || + CheckOIType ( theIO, MESH, "Mesh", aTypeName ) || + CheckOIType ( theIO, SUBMESH, "SubMesh", aTypeName ) || + CheckOIType ( theIO, GROUP, "Group", aTypeName ) + ) return aTypeName; return "NoType"; @@ -904,10 +905,10 @@ SALOME_ListIteratorOfListIO It(selected); for ( ; It.More(); It.Next()) { - Handle(SALOME_InteractiveObject) IObject = It.Value(); - QString Type = CheckTypeObject(IObject); - if (Type.compare(RefType) != 0) - return "Heterogeneous Selection"; + Handle(SALOME_InteractiveObject) IObject = It.Value(); + QString Type = CheckTypeObject(IObject); + if (Type.compare(RefType) != 0) + return "Heterogeneous Selection"; } return RefType; @@ -935,17 +936,17 @@ QString cur = anIO->getComponentDataType(); _PTR(SObject) aSO = aStudy->FindObjectID(anIO->getEntry()); if (aSO) { - // check if object is reference - _PTR(SObject) aRefSObj; - aNameList.append("\n - "); - if ( aSO->ReferencedObject( aRefSObj ) ) { - QString aRefName = QString::fromStdString ( aRefSObj->GetName() ); - aNameList.append( aRefName ); - cur = QString::fromStdString ( aRefSObj->GetFatherComponent()->ComponentDataType() ); - } - else - aNameList.append(anIO->getName()); - objectCount++; + // check if object is reference + _PTR(SObject) aRefSObj; + aNameList.append("\n - "); + if ( aSO->ReferencedObject( aRefSObj ) ) { + QString aRefName = QString::fromStdString ( aRefSObj->GetName() ); + aNameList.append( aRefName ); + cur = QString::fromStdString ( aRefSObj->GetFatherComponent()->ComponentDataType() ); + } + else + aNameList.append(anIO->getName()); + objectCount++; } if( aParentComponent.isNull() ) @@ -959,17 +960,17 @@ if ( aParentComponent != SMESHGUI::GetSMESHGUI()->name() ) { SUIT_MessageBox::warning( SMESHGUI::desktop(), - QObject::tr("ERR_ERROR"), - QObject::tr("NON_SMESH_OBJECTS_SELECTED").arg( SMESHGUI::GetSMESHGUI()->moduleName() ) ); + QObject::tr("ERR_ERROR"), + QObject::tr("NON_SMESH_OBJECTS_SELECTED").arg( SMESHGUI::GetSMESHGUI()->moduleName() ) ); return; } // VSR 17/11/04: check if all objects selected belong to SMESH component <-- finish if (SUIT_MessageBox::warning - (SMESHGUI::desktop(), - QObject::tr("SMESH_WRN_WARNING"), - QObject::tr("SMESH_REALLY_DELETE").arg( objectCount ).arg( aNameList ), - SUIT_MessageBox::Yes | SUIT_MessageBox::No, - SUIT_MessageBox::Yes) != SUIT_MessageBox::Yes) + (SMESHGUI::desktop(), + QObject::tr("SMESH_WRN_WARNING"), + QObject::tr("SMESH_REALLY_DELETE").arg( objectCount ).arg( aNameList ), + SUIT_MessageBox::Yes | SUIT_MessageBox::No, + SUIT_MessageBox::Yes) != SUIT_MessageBox::Yes) return; SalomeApp_Application* anApp = dynamic_cast( SUIT_Session::session()->activeApplication() ); @@ -982,18 +983,18 @@ for( ; It.More(); It.Next()){ // loop on selected IO's Handle(SALOME_InteractiveObject) IObject = It.Value(); if(IObject->hasEntry()) { - _PTR(SObject) aSO = aStudy->FindObjectID(IObject->getEntry()); - - // disable removal of "SMESH" component object - if(aSO->FindAttribute(anAttr, "AttributeIOR")){ - anIOR = anAttr; - if ( engineIOR() == anIOR->Value().c_str() ) - continue; - } - //Check the referenced object - _PTR(SObject) aRefSObject; - if ( aSO && aSO->ReferencedObject( aRefSObject ) ) - aSO = aRefSObject; // Delete main Object instead of reference + _PTR(SObject) aSO = aStudy->FindObjectID(IObject->getEntry()); + + // disable removal of "SMESH" component object + if(aSO->FindAttribute(anAttr, "AttributeIOR")){ + anIOR = anAttr; + if ( engineIOR() == anIOR->Value().c_str() ) + continue; + } + //Check the referenced object + _PTR(SObject) aRefSObject; + if ( aSO && aSO->ReferencedObject( aRefSObject ) ) + aSO = aRefSObject; // Delete main Object instead of reference // put the whole hierarchy of sub-objects of the selected SO into a list and // then treat them all starting from the deepest objects (at list back) @@ -1016,15 +1017,15 @@ std::string anEntry = SO->GetID(); /** Erase graphical object **/ - if(SO->FindAttribute(anAttr, "AttributeIOR")){ - QVector aViews = vm->getViews(); - for(int i = 0; i < nbSf; i++){ - SUIT_ViewWindow *sf = aViews[i]; - if(SMESH_Actor* anActor = SMESH::FindActorByEntry(sf,anEntry.c_str())){ - SMESH::RemoveActor(sf,anActor); - } - } - } + if(SO->FindAttribute(anAttr, "AttributeIOR")){ + QVector aViews = vm->getViews(); + for(int i = 0; i < nbSf; i++){ + SUIT_ViewWindow *sf = aViews[i]; + if(SMESH_Actor* anActor = SMESH::FindActorByEntry(sf,anEntry.c_str())){ + SMESH::RemoveActor(sf,anActor); + } + } + } /** Remove an object from data structures **/ SMESH::SMESH_GroupBase_var aGroup = SMESH::SMESH_GroupBase::_narrow( SMESH::SObjectToObject( SO )); @@ -1057,7 +1058,7 @@ //op->finish(); } } - } /* listSO back loop */ + } /* listSO back loop */ } /* IObject->hasEntry() */ } /* more/next */ aStudyBuilder->CommitCommand(); @@ -1179,7 +1180,7 @@ SMESHGUI* SMESHGUI::GetSMESHGUI() { _PTR(Study) aStudy = study->studyDS(); if ( aStudy ) - GetSMESHGen()->SetCurrentStudy( _CAST(Study,aStudy)->GetStudy() ); + GetSMESHGen()->SetCurrentStudy( _CAST(Study,aStudy)->GetStudy() ); } } @@ -1244,6 +1245,16 @@ void SMESHGUI::EmitSignalCloseAllDialogs() emit SignalCloseAllDialogs(); } +//============================================================================= +/*! + * + */ +//============================================================================= +void SMESHGUI::EmitSignalVisibilityChanged() +{ + emit SignalVisibilityChanged(); +} + //============================================================================= /*! * @@ -1293,16 +1304,6 @@ SalomeApp_Study* SMESHGUI::activeStudy() return NULL; } -//============================================================================= -/*! - * - */ -//============================================================================= -char* SMESHGUI::JoinObjectParameters(const QStringList& theParametersList) -{ - return theParametersList.join(":").toLatin1().data(); -} - //============================================================================= /*! * @@ -1331,8 +1332,8 @@ static int isStudyLocked(_PTR(Study) theStudy){ static bool checkLock(_PTR(Study) theStudy) { if (isStudyLocked(theStudy)) { SUIT_MessageBox::warning( SMESHGUI::desktop(), - QObject::tr("WRN_WARNING"), - QObject::tr("WRN_STUDY_LOCKED") ); + QObject::tr("WRN_WARNING"), + QObject::tr("WRN_STUDY_LOCKED") ); return true; } return false; @@ -1374,13 +1375,13 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) //QAction* act = action( theCommandID ); - switch (theCommandID) { - case 33: // DELETE + switch (theCommandID) { + case 33: // DELETE if(checkLock(aStudy)) break; OnEditDelete(); break; - case 113: // IMPORT + case 113: // IMPORT case 112: case 111: { @@ -1408,7 +1409,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) break; } - case 122: // EXPORT MED + case 122: // EXPORT MED case 121: case 123: case 124: @@ -1421,7 +1422,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) break; } - case 200: // SCALAR BAR + case 200: // SCALAR BAR { LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr(); SALOME_ListIO selected; @@ -1429,12 +1430,12 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) aSel->selectedObjects( selected ); if( selected.Extent() ) { - Handle(SALOME_InteractiveObject) anIO = selected.First(); - if( anIO->hasEntry() ) { - if( SMESH_Actor* anActor = SMESH::FindActorByEntry( anIO->getEntry() ) ) { - anActor->SetControlMode( SMESH_Actor::eNone ); - } - } + Handle(SALOME_InteractiveObject) anIO = selected.First(); + if( anIO->hasEntry() ) { + if( SMESH_Actor* anActor = SMESH::FindActorByEntry( anIO->getEntry() ) ) { + anActor->SetControlMode( SMESH_Actor::eNone ); + } + } } break; } @@ -1488,16 +1489,16 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) SALOME_ListIteratorOfListIO it(selected); for( ; it.More(); it.Next()) { Handle(SALOME_InteractiveObject) anIObject = it.Value(); - if(anIObject->hasEntry()) { - if(SMESH_Actor *anActor = SMESH::FindActorByEntry(anIObject->getEntry())){ - anActor->SetFacesOriented( !anActor->GetFacesOriented() ); - } - } + if(anIObject->hasEntry()) { + if(SMESH_Actor *anActor = SMESH::FindActorByEntry(anIObject->getEntry())){ + anActor->SetFacesOriented( !anActor->GetFacesOriented() ); + } + } } break; } - case 214: // UPDATE + case 214: // UPDATE { if(checkLock(aStudy)) break; try { @@ -1520,15 +1521,15 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) break; } - case 300: // ERASE - case 301: // DISPLAY - case 302: // DISPLAY ONLY + case 300: // ERASE + case 301: // DISPLAY + case 302: // DISPLAY ONLY { SMESH::EDisplaing anAction; switch (theCommandID) { - case 300: anAction = SMESH::eErase; break; - case 301: anAction = SMESH::eDisplay; break; - case 302: anAction = SMESH::eDisplayOnly; break; + case 300: anAction = SMESH::eErase; break; + case 301: anAction = SMESH::eDisplay; break; + case 302: anAction = SMESH::eDisplayOnly; break; } LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr(); @@ -1537,7 +1538,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) aSel->selectedObjects( sel_objects ); if( theCommandID==302 ) - startOperation( myEraseAll ); + startOperation( myEraseAll ); extractContainers( sel_objects, to_process ); @@ -1550,8 +1551,10 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) for ( ; It.More(); It.Next()) { Handle(SALOME_InteractiveObject) IOS = It.Value(); if (IOS->hasEntry()) { - if (!SMESH::UpdateView(anAction, IOS->getEntry())) + if (!SMESH::UpdateView(anAction, IOS->getEntry())) { + SMESHGUI::GetSMESHGUI()->EmitSignalVisibilityChanged(); break; // PAL16774 (Crash after display of many groups) + } if (anAction == SMESH::eDisplayOnly) anAction = SMESH::eDisplay; } @@ -1559,8 +1562,10 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) } // PAL13338 + PAL15161 --> - if ( ( theCommandID==301 || theCommandID==302 ) && !checkLock(aStudy)) + if ( ( theCommandID==301 || theCommandID==302 ) && !checkLock(aStudy)) { SMESH::UpdateView(); + SMESHGUI::GetSMESHGUI()->EmitSignalVisibilityChanged(); + } // PAL13338 + PAL15161 <-- } catch (...) { // PAL16774 (Crash after display of many groups) @@ -1568,28 +1573,28 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) } if (anAction == SMESH::eErase) { - SALOME_ListIO l1; - aSel->setSelectedObjects( l1 ); + SALOME_ListIO l1; + aSel->setSelectedObjects( l1 ); } else - aSel->setSelectedObjects( to_process ); - + aSel->setSelectedObjects( to_process ); + break; } - case 4000: // NODES + case 4000: // NODES { if(checkLock(aStudy)) break; if ( vtkwnd ) { - EmitSignalDeactivateDialog(); + EmitSignalDeactivateDialog(); - ( new SMESHGUI_NodesDlg( this ) )->show(); + ( new SMESHGUI_NodesDlg( this ) )->show(); } else { - SUIT_MessageBox::warning(desktop(), - tr("SMESH_WRN_WARNING"), - tr("SMESH_WRN_VIEWER_VTK")); + SUIT_MessageBox::warning(desktop(), + tr("SMESH_WRN_WARNING"), + tr("SMESH_WRN_VIEWER_VTK")); } break; } @@ -1604,12 +1609,12 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) break; } - case 406: // MOVE NODE + case 406: // MOVE NODE { if ( !vtkwnd ) { SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ), - tr( "NOT_A_VTK_VIEWER" ) ); + tr( "NOT_A_VTK_VIEWER" ) ); break; } @@ -1618,9 +1623,9 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) break; } - case 701: // COMPUTE MESH - case 711: // PRECOMPUTE MESH - case 712: // EVALUATE MESH + case 701: // COMPUTE MESH + case 711: // PRECOMPUTE MESH + case 712: // EVALUATE MESH { if (checkLock(aStudy)) break; startOperation( theCommandID ); @@ -1646,7 +1651,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) if ( !vtkwnd ) { SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ), - tr( "NOT_A_VTK_VIEWER" ) ); + tr( "NOT_A_VTK_VIEWER" ) ); break; } @@ -1676,7 +1681,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) if ( !vtkwnd ) { SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ), - tr( "NOT_A_VTK_VIEWER" ) ); + tr( "NOT_A_VTK_VIEWER" ) ); break; } @@ -1699,12 +1704,12 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) { if(checkLock(aStudy)) break; if( vtkwnd ) { - EmitSignalDeactivateDialog(); - ( new SMESHGUI_SmoothingDlg( this ) )->show(); + EmitSignalDeactivateDialog(); + ( new SMESHGUI_SmoothingDlg( this ) )->show(); } else { - SUIT_MessageBox::warning(desktop(), - tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK")); + SUIT_MessageBox::warning(desktop(), + tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK")); } break; } @@ -1712,11 +1717,11 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) { if (checkLock(aStudy)) break; if (vtkwnd) { - EmitSignalDeactivateDialog(); - ( new SMESHGUI_ExtrusionDlg ( this ) )->show(); + EmitSignalDeactivateDialog(); + ( new SMESHGUI_ExtrusionDlg ( this ) )->show(); } else { - SUIT_MessageBox::warning(desktop(), - tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK")); + SUIT_MessageBox::warning(desktop(), + tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK")); } break; } @@ -1724,12 +1729,12 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) { if(checkLock(aStudy)) break; if( vtkwnd ) { - EmitSignalDeactivateDialog(); - ( new SMESHGUI_RevolutionDlg( this ) )->show(); + EmitSignalDeactivateDialog(); + ( new SMESHGUI_RevolutionDlg( this ) )->show(); } else { - SUIT_MessageBox::warning(desktop(), - tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK")); + SUIT_MessageBox::warning(desktop(), + tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK")); } break; } @@ -1743,8 +1748,8 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) ( new SMESHGUI_MeshPatternDlg( this ) )->show(); } else { - SUIT_MessageBox::warning(desktop(), - tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK")); + SUIT_MessageBox::warning(desktop(), + tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK")); } break; } @@ -1752,11 +1757,11 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) { if (checkLock(aStudy)) break; if (vtkwnd) { - EmitSignalDeactivateDialog(); - ( new SMESHGUI_ExtrusionAlongPathDlg( this ) )->show(); + EmitSignalDeactivateDialog(); + ( new SMESHGUI_ExtrusionAlongPathDlg( this ) )->show(); } else { - SUIT_MessageBox::warning(desktop(), - tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK")); + SUIT_MessageBox::warning(desktop(), + tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK")); } break; } @@ -1765,12 +1770,17 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) startOperation( 417 ); /* if (checkLock(aStudy)) break; if (vtkwnd) { - EmitSignalDeactivateDialog(); - new SMESHGUI_ConvToQuadDlg(); + EmitSignalDeactivateDialog(); + new SMESHGUI_ConvToQuadDlg(); } else { - SUIT_MessageBox::warning(desktop(), + SUIT_MessageBox::warning(desktop(), tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK")); - }*/ + }*/ + break; + } + case 418: // create 2D mesh from 3D + { + startOperation( 418 ); break; } case 806: // CREATE GEO GROUP @@ -1783,7 +1793,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) if ( !vtkwnd ) { SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ), - tr( "NOT_A_VTK_VIEWER" ) ); + tr( "NOT_A_VTK_VIEWER" ) ); break; } @@ -1798,7 +1808,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) int nbSel = selected.Extent(); if (nbSel == 1) { - // check if mesh is selected + // check if mesh is selected aMesh = SMESH::GetMeshByIO( selected.First() ); } SMESHGUI_GroupDlg *aDlg = new SMESHGUI_GroupDlg( this, aMesh); @@ -1811,7 +1821,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) if ( !vtkwnd ) { SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ), - tr( "NOT_A_VTK_VIEWER" ) ); + tr( "NOT_A_VTK_VIEWER" ) ); break; } @@ -1825,52 +1835,52 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) int nbSel = selected.Extent(); if (nbSel == 1) { - // check if submesh is selected - Handle(SALOME_InteractiveObject) IObject = selected.First(); - if (IObject->hasEntry()) { - _PTR(SObject) aSObj = aStudy->FindObjectID(IObject->getEntry()); - if( aSObj ) { - SMESH::SMESH_subMesh_var aSubMesh = SMESH::SMESH_subMesh::_narrow( SMESH::SObjectToObject( aSObj ) ); - if (!aSubMesh->_is_nil()) { - try { - SMESH::SMESH_Mesh_var aMesh = aSubMesh->GetFather(); - // get submesh elements list by types - SMESH::long_array_var aNodes = aSubMesh->GetElementsByType(SMESH::NODE); - SMESH::long_array_var aEdges = aSubMesh->GetElementsByType(SMESH::EDGE); - SMESH::long_array_var aFaces = aSubMesh->GetElementsByType(SMESH::FACE); - SMESH::long_array_var aVolumes = aSubMesh->GetElementsByType(SMESH::VOLUME); - // create group for each type o elements - QString aName = IObject->getName(); - if (aNodes->length() > 0) { - SMESH::SMESH_Group_var aGroup = SMESH::AddGroup(aMesh, SMESH::NODE, aName + "_Nodes"); - aGroup->Add(aNodes.inout()); - } - if (aEdges->length() > 0) { - SMESH::SMESH_Group_var aGroup = SMESH::AddGroup(aMesh, SMESH::EDGE, aName + "_Edges"); - aGroup->Add(aEdges.inout()); - } - if (aFaces->length() > 0) { - SMESH::SMESH_Group_var aGroup = SMESH::AddGroup(aMesh, SMESH::FACE, aName + "_Faces"); - aGroup->Add(aFaces.inout()); - } - if (aVolumes->length() > 0) { - SMESH::SMESH_Group_var aGroup = SMESH::AddGroup(aMesh, SMESH::VOLUME, aName + "_Volumes"); - aGroup->Add(aVolumes.inout()); - } - updateObjBrowser(); - - } + // check if submesh is selected + Handle(SALOME_InteractiveObject) IObject = selected.First(); + if (IObject->hasEntry()) { + _PTR(SObject) aSObj = aStudy->FindObjectID(IObject->getEntry()); + if( aSObj ) { + SMESH::SMESH_subMesh_var aSubMesh = SMESH::SMESH_subMesh::_narrow( SMESH::SObjectToObject( aSObj ) ); + if (!aSubMesh->_is_nil()) { + try { + SMESH::SMESH_Mesh_var aMesh = aSubMesh->GetFather(); + // get submesh elements list by types + SMESH::long_array_var aNodes = aSubMesh->GetElementsByType(SMESH::NODE); + SMESH::long_array_var aEdges = aSubMesh->GetElementsByType(SMESH::EDGE); + SMESH::long_array_var aFaces = aSubMesh->GetElementsByType(SMESH::FACE); + SMESH::long_array_var aVolumes = aSubMesh->GetElementsByType(SMESH::VOLUME); + // create group for each type o elements + QString aName = IObject->getName(); + if (aNodes->length() > 0) { + SMESH::SMESH_Group_var aGroup = SMESH::AddGroup(aMesh, SMESH::NODE, aName + "_Nodes"); + aGroup->Add(aNodes.inout()); + } + if (aEdges->length() > 0) { + SMESH::SMESH_Group_var aGroup = SMESH::AddGroup(aMesh, SMESH::EDGE, aName + "_Edges"); + aGroup->Add(aEdges.inout()); + } + if (aFaces->length() > 0) { + SMESH::SMESH_Group_var aGroup = SMESH::AddGroup(aMesh, SMESH::FACE, aName + "_Faces"); + aGroup->Add(aFaces.inout()); + } + if (aVolumes->length() > 0) { + SMESH::SMESH_Group_var aGroup = SMESH::AddGroup(aMesh, SMESH::VOLUME, aName + "_Volumes"); + aGroup->Add(aVolumes.inout()); + } + updateObjBrowser(); + + } catch(const SALOME::SALOME_Exception & S_ex){ - SalomeApp_Tools::QtCatchCorbaException(S_ex); - } - } - } - } + SalomeApp_Tools::QtCatchCorbaException(S_ex); + } + } + } + } } else if(nbSel==0) { SUIT_MessageBox::warning(desktop(), - tr("SMESH_WRN_WARNING"), - tr("SMESH_WRN_NO_AVAILABLE_DATA")); + tr("SMESH_WRN_WARNING"), + tr("SMESH_WRN_NO_AVAILABLE_DATA")); } break; } @@ -1880,7 +1890,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) if ( !vtkwnd ) { SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ), - tr( "NOT_A_VTK_VIEWER" ) ); + tr( "NOT_A_VTK_VIEWER" ) ); break; } @@ -1899,16 +1909,16 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) SMESH::SMESH_GroupBase_var aGroup = SMESH::IObjectToInterface(It.Value()); if (!aGroup->_is_nil()) { - nbSelectedGroups++; + nbSelectedGroups++; SMESHGUI_GroupDlg *aDlg = new SMESHGUI_GroupDlg( this, aGroup); aDlg->show(); - } + } } if (nbSelectedGroups == 0) - { - SMESHGUI_GroupDlg *aDlg = new SMESHGUI_GroupDlg( this, SMESH::SMESH_GroupBase::_nil()); - aDlg->show(); - } + { + SMESHGUI_GroupDlg *aDlg = new SMESHGUI_GroupDlg( this, SMESH::SMESH_GroupBase::_nil()); + aDlg->show(); + } break; } @@ -1916,8 +1926,8 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) { if(checkLock(aStudy)) break; if (myState == 800) { - SMESHGUI_GroupDlg *aDlg = (SMESHGUI_GroupDlg*) myActiveDialogBox; - if (aDlg) aDlg->onAdd(); + SMESHGUI_GroupDlg *aDlg = (SMESHGUI_GroupDlg*) myActiveDialogBox; + if (aDlg) aDlg->onAdd(); } break; } @@ -1926,8 +1936,8 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) { if(checkLock(aStudy)) break; if (myState == 800) { - SMESHGUI_GroupDlg *aDlg = (SMESHGUI_GroupDlg*) myActiveDialogBox; - if (aDlg) aDlg->onRemove(); + SMESHGUI_GroupDlg *aDlg = (SMESHGUI_GroupDlg*) myActiveDialogBox; + if (aDlg) aDlg->onRemove(); } break; } @@ -1937,7 +1947,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) if ( !vtkwnd ) { SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ), - tr( "NOT_A_VTK_VIEWER" ) ); + tr( "NOT_A_VTK_VIEWER" ) ); break; } @@ -1957,7 +1967,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) if (!aGroup->_is_nil()) { SMESHGUI_GroupDlg *aDlg = new SMESHGUI_GroupDlg( this, aGroup, true ); aDlg->show(); - } + } } break; } @@ -1969,7 +1979,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) if ( !vtkwnd ) { SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ), - tr( "NOT_A_VTK_VIEWER" ) ); + tr( "NOT_A_VTK_VIEWER" ) ); break; } @@ -2008,7 +2018,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) if ( !vtkwnd ) { SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ), - tr( "NOT_A_VTK_VIEWER" ) ); + tr( "NOT_A_VTK_VIEWER" ) ); break; } @@ -2021,7 +2031,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) break; } - case 900: // MESH INFOS + case 900: // MESH INFOS { EmitSignalDeactivateDialog(); LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr(); @@ -2033,8 +2043,8 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) SALOME_ListIO IOs; SALOME_ListIteratorOfListIO It (selected); for ( ; It.More(); It.Next() ) { - IOs.Clear(); IOs.Append( It.Value() ); - aSel->setSelectedObjects( IOs ); + IOs.Clear(); IOs.Append( It.Value() ); + aSel->setSelectedObjects( IOs ); ( new SMESHGUI_MeshInfosDlg( this ) )->show(); } // restore selection @@ -2045,7 +2055,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) break; } - case 902: // STANDARD MESH INFOS + case 902: // STANDARD MESH INFOS { EmitSignalDeactivateDialog(); LightApp_SelectionMgr *aSel = SMESHGUI::selectionMgr(); @@ -2057,27 +2067,27 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) SALOME_ListIO IOs; SALOME_ListIteratorOfListIO It (selected); for ( ; It.More(); It.Next() ) { - IOs.Clear(); - IOs.Append( It.Value() ); - aSel->setSelectedObjects( IOs ); + IOs.Clear(); + IOs.Append( It.Value() ); + aSel->setSelectedObjects( IOs ); ( new SMESHGUI_StandardMeshInfosDlg( this ) )->show(); } // restore selection - aSel->setSelectedObjects( selected ); + aSel->setSelectedObjects( selected ); } else ( new SMESHGUI_StandardMeshInfosDlg( this ) )->show(); break; } - case 903: // WHAT IS + case 903: // WHAT IS { EmitSignalDeactivateDialog(); ( new SMESHGUI_WhatIsDlg( this ) )->show(); break; } - case 1100: // EDIT HYPOTHESIS + case 1100: // EDIT HYPOTHESIS { if(checkLock(aStudy)) break; @@ -2090,7 +2100,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) if (nbSel == 1) { Handle(SALOME_InteractiveObject) anIObject = selected.First(); - SMESH::SMESH_Hypothesis_var aHypothesis = SMESH::IObjectToInterface(anIObject); + SMESH::SMESH_Hypothesis_var aHypothesis = SMESH::IObjectToInterface(anIObject); /* Look for all mesh objects that have this hypothesis affected in order to flag as ModifiedMesh */ /* At end below '...->updateObjBrowser(true)' will change icon of mesh objects */ @@ -2112,7 +2122,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) break; } - case 1101: // RENAME + case 1101: // RENAME { if ( checkLock( aStudy ) ) break; @@ -2152,14 +2162,14 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) { SMESHGUI::GetSMESHGen()->SetName(obj->GetIOR().c_str(), newName.toLatin1().data()); - // update name of group object and its actor - SMESH::SMESH_GroupBase_var aGroupObject = SMESH::IObjectToInterface(IObject); - if( !aGroupObject->_is_nil() ) - { - aGroupObject->SetName( newName.toLatin1().data() ); - if ( SMESH_Actor *anActor = SMESH::FindActorByEntry( IObject->getEntry() ) ) - anActor->setName( newName.toLatin1().data() ); - } + // update name of group object and its actor + SMESH::SMESH_GroupBase_var aGroupObject = SMESH::IObjectToInterface(IObject); + if( !aGroupObject->_is_nil() ) + { + aGroupObject->SetName( newName.toLatin1().data() ); + if ( SMESH_Actor *anActor = SMESH::FindActorByEntry( IObject->getEntry() ) ) + anActor->setName( newName.toLatin1().data() ); + } updateObjBrowser(); } @@ -2170,13 +2180,13 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) if (!isAny) { SUIT_MessageBox::warning(desktop(), - QObject::tr("SMESH_WRN_WARNING"), - QObject::tr("SMESH_WRN_NO_APPROPRIATE_SELECTION")); + QObject::tr("SMESH_WRN_WARNING"), + QObject::tr("SMESH_WRN_NO_APPROPRIATE_SELECTION")); } break; } - case 1102: // REMOVE HYPOTHESIS / ALGORITHMS + case 1102: // REMOVE HYPOTHESIS / ALGORITHMS { if(checkLock(aStudy)) break; SUIT_OverrideCursor wc; @@ -2188,8 +2198,8 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) SALOME_ListIteratorOfListIO It(selected); for (int i = 0; It.More(); It.Next(), i++) { - Handle(SALOME_InteractiveObject) IObject = It.Value(); - SMESH::RemoveHypothesisOrAlgorithmOnMesh(IObject); + Handle(SALOME_InteractiveObject) IObject = It.Value(); + SMESH::RemoveHypothesisOrAlgorithmOnMesh(IObject); } SALOME_ListIO l1; aSel->setSelectedObjects( l1 ); @@ -2197,17 +2207,17 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) break; } - case 4009: // ELEM0D - case 4010: // GEOM::EDGE - case 4021: // TRIANGLE - case 4022: // QUAD - case 4023: // POLYGON - case 4031: // TETRA - case 4032: // HEXA + case 4009: // ELEM0D + case 4010: // GEOM::EDGE + case 4021: // TRIANGLE + case 4022: // QUAD + case 4023: // POLYGON + case 4031: // TETRA + case 4032: // HEXA { if(checkLock(aStudy)) break; if ( vtkwnd ) { - EmitSignalDeactivateDialog(); + EmitSignalDeactivateDialog(); SMDSAbs_ElementType type = SMDSAbs_Edge; int nbNodes = 2; switch (theCommandID) { @@ -2219,32 +2229,32 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) type = SMDSAbs_Face; nbNodes = 4; break; case 4031: // TETRA type = SMDSAbs_Volume; nbNodes = 4; break; - case 4023: // POLYGON - type = SMDSAbs_Face; nbNodes = 5; break; // 5 - identificator for POLYGON + case 4023: // POLYGON + type = SMDSAbs_Face; nbNodes = 5; break; // 5 - identificator for POLYGON case 4032: // HEXA type = SMDSAbs_Volume; nbNodes = 8; break; - case 4033: // POLYHEDRE - type = SMDSAbs_Volume; nbNodes = 9; break; // 9 - identificator for POLYHEDRE + case 4033: // POLYHEDRE + type = SMDSAbs_Volume; nbNodes = 9; break; // 9 - identificator for POLYHEDRE default:; } - ( new SMESHGUI_AddMeshElementDlg( this, type, nbNodes ) )->show(); + ( new SMESHGUI_AddMeshElementDlg( this, type, nbNodes ) )->show(); } else { - SUIT_MessageBox::warning(desktop(), - tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK")); + SUIT_MessageBox::warning(desktop(), + tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK")); } break; } - case 4033: // POLYHEDRON + case 4033: // POLYHEDRON { if(checkLock(aStudy)) break; if ( vtkwnd ) { - EmitSignalDeactivateDialog(); - ( new SMESHGUI_CreatePolyhedralVolumeDlg( this ) )->show(); + EmitSignalDeactivateDialog(); + ( new SMESHGUI_CreatePolyhedralVolumeDlg( this ) )->show(); } else { - SUIT_MessageBox::warning(SMESHGUI::desktop(), - tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK")); + SUIT_MessageBox::warning(SMESHGUI::desktop(), + tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK")); } break; } @@ -2258,60 +2268,60 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) { if(checkLock(aStudy)) break; if ( vtkwnd ) { - EmitSignalDeactivateDialog(); - int type; - - switch (theCommandID) { - case 4034: - type = QUAD_EDGE; break; - case 4035: - type = QUAD_TRIANGLE; break; - case 4036: - type = QUAD_QUADRANGLE; break; - case 4037: - type = QUAD_TETRAHEDRON; break; - case 4038: - type = QUAD_PYRAMID; break; - case 4039: - type = QUAD_PENTAHEDRON; break; - case 4040: - type = QUAD_HEXAHEDRON; - break; - default:; - } - ( new SMESHGUI_AddQuadraticElementDlg( this, type ) )->show(); + EmitSignalDeactivateDialog(); + int type; + + switch (theCommandID) { + case 4034: + type = QUAD_EDGE; break; + case 4035: + type = QUAD_TRIANGLE; break; + case 4036: + type = QUAD_QUADRANGLE; break; + case 4037: + type = QUAD_TETRAHEDRON; break; + case 4038: + type = QUAD_PYRAMID; break; + case 4039: + type = QUAD_PENTAHEDRON; break; + case 4040: + type = QUAD_HEXAHEDRON; + break; + default:; + } + ( new SMESHGUI_AddQuadraticElementDlg( this, type ) )->show(); } else { - SUIT_MessageBox::warning(SMESHGUI::desktop(), - tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK")); + SUIT_MessageBox::warning(SMESHGUI::desktop(), + tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK")); } break; } - case 4041: // REMOVES NODES + case 4041: // REMOVES NODES { if(checkLock(aStudy)) break; if ( vtkwnd ) { - EmitSignalDeactivateDialog(); - ( new SMESHGUI_RemoveNodesDlg( this ) )->show(); + EmitSignalDeactivateDialog(); + ( new SMESHGUI_RemoveNodesDlg( this ) )->show(); } else { - SUIT_MessageBox::warning(SMESHGUI::desktop(), - tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK")); + SUIT_MessageBox::warning(SMESHGUI::desktop(), + tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK")); } break; } - case 4042: // REMOVES ELEMENTS + case 4042: // REMOVES ELEMENTS { if(checkLock(aStudy)) break; if( vtkwnd ) { - EmitSignalDeactivateDialog(); - ( new SMESHGUI_RemoveElementsDlg( this ) )->show(); + EmitSignalDeactivateDialog(); + ( new SMESHGUI_RemoveElementsDlg( this ) )->show(); } else - { - SUIT_MessageBox::warning(SMESHGUI::desktop(), - tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK")); - } + { + SUIT_MessageBox::warning(SMESHGUI::desktop(), + tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK")); + } break; } case 4043: { // CLEAR_MESH @@ -2345,53 +2355,53 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) } } catch (const SALOME::SALOME_Exception& S_ex){ - wc.suspend(); - SalomeApp_Tools::QtCatchCorbaException(S_ex); - wc.resume(); + wc.suspend(); + SalomeApp_Tools::QtCatchCorbaException(S_ex); + wc.resume(); } } SMESH::UpdateView(); updateObjBrowser(); break; } - case 4051: // RENUMBERING NODES + case 4051: // RENUMBERING NODES { if(checkLock(aStudy)) break; if( vtkwnd ) { - EmitSignalDeactivateDialog(); - ( new SMESHGUI_RenumberingDlg( this, 0 ) )->show(); + EmitSignalDeactivateDialog(); + ( new SMESHGUI_RenumberingDlg( this, 0 ) )->show(); } else - { - SUIT_MessageBox::warning(SMESHGUI::desktop(), - tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK")); - } + { + SUIT_MessageBox::warning(SMESHGUI::desktop(), + tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK")); + } break; } - case 4052: // RENUMBERING ELEMENTS + case 4052: // RENUMBERING ELEMENTS { if(checkLock(aStudy)) break; if ( vtkwnd ) { - EmitSignalDeactivateDialog(); - ( new SMESHGUI_RenumberingDlg( this, 1 ) )->show(); + EmitSignalDeactivateDialog(); + ( new SMESHGUI_RenumberingDlg( this, 1 ) )->show(); } else - { - SUIT_MessageBox::warning(SMESHGUI::desktop(), - tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK")); - } + { + SUIT_MessageBox::warning(SMESHGUI::desktop(), + tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK")); + } break; } case 4061: // TRANSLATION { if(checkLock(aStudy)) break; if ( vtkwnd ) { - EmitSignalDeactivateDialog(); - ( new SMESHGUI_TranslationDlg( this ) )->show(); + EmitSignalDeactivateDialog(); + ( new SMESHGUI_TranslationDlg( this ) )->show(); } else { - SUIT_MessageBox::warning(SMESHGUI::desktop(), - tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK")); + SUIT_MessageBox::warning(SMESHGUI::desktop(), + tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK")); } break; } @@ -2399,12 +2409,12 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) { if(checkLock(aStudy)) break; if( vtkwnd ) { - EmitSignalDeactivateDialog(); - ( new SMESHGUI_RotationDlg( this ) )->show(); + EmitSignalDeactivateDialog(); + ( new SMESHGUI_RotationDlg( this ) )->show(); } else { - SUIT_MessageBox::warning(SMESHGUI::desktop(), - tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK")); + SUIT_MessageBox::warning(SMESHGUI::desktop(), + tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK")); } break; } @@ -2412,12 +2422,12 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) { if(checkLock(aStudy)) break; if(vtkwnd) { - EmitSignalDeactivateDialog(); - ( new SMESHGUI_SymmetryDlg( this ) )->show(); + EmitSignalDeactivateDialog(); + ( new SMESHGUI_SymmetryDlg( this ) )->show(); } else { - SUIT_MessageBox::warning(SMESHGUI::desktop(), - tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK")); + SUIT_MessageBox::warning(SMESHGUI::desktop(), + tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK")); } break; } @@ -2425,12 +2435,12 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) { if(checkLock(aStudy)) break; if(vtkwnd) { - EmitSignalDeactivateDialog(); - ( new SMESHGUI_SewingDlg( this ) )->show(); + EmitSignalDeactivateDialog(); + ( new SMESHGUI_SewingDlg( this ) )->show(); } else { - SUIT_MessageBox::warning(SMESHGUI::desktop(), - tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK")); + SUIT_MessageBox::warning(SMESHGUI::desktop(), + tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK")); } break; } @@ -2438,12 +2448,12 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) { if(checkLock(aStudy)) break; if(vtkwnd) { - EmitSignalDeactivateDialog(); - ( new SMESHGUI_EditMeshDlg( this, 0 ) )->show(); + EmitSignalDeactivateDialog(); + ( new SMESHGUI_EditMeshDlg( this, 0 ) )->show(); } else { - SUIT_MessageBox::warning(SMESHGUI::desktop(), - tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK")); + SUIT_MessageBox::warning(SMESHGUI::desktop(), + tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK")); } break; } @@ -2451,11 +2461,11 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) { if (checkLock(aStudy)) break; if (vtkwnd) { - EmitSignalDeactivateDialog(); - ( new SMESHGUI_EditMeshDlg( this, 1 ) )->show(); + EmitSignalDeactivateDialog(); + ( new SMESHGUI_EditMeshDlg( this, 1 ) )->show(); } else { - SUIT_MessageBox::warning(SMESHGUI::desktop(), - tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK")); + SUIT_MessageBox::warning(SMESHGUI::desktop(), + tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK")); } break; } @@ -2482,7 +2492,7 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) } break; - case 6017: // CONTROLS + case 6017: // CONTROLS case 6016: case 6015: case 6014: @@ -2504,27 +2514,27 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) SALOME_ListIO selected; mgr->selectedObjects( selected ); if ( selected.Extent() == 1 && selected.First()->hasEntry() ) { - _PTR(SObject) SO = aStudy->FindObjectID( selected.First()->getEntry() ); - if ( SO ) { - CORBA::Object_var aObject = SMESH::SObjectToObject( SO ); - SMESH::SMESH_Mesh_var aMesh = SMESH::SMESH_Mesh::_narrow( aObject ); - SMESH::SMESH_subMesh_var aSubMesh = SMESH::SMESH_subMesh::_narrow( aObject ); - SMESH::SMESH_GroupBase_var aGroup = SMESH::SMESH_GroupBase::_narrow( aObject ); - if ( !aMesh->_is_nil() || !aSubMesh->_is_nil() || !aGroup->_is_nil() ) { - ::Control( theCommandID ); - break; - } - } + _PTR(SObject) SO = aStudy->FindObjectID( selected.First()->getEntry() ); + if ( SO ) { + CORBA::Object_var aObject = SMESH::SObjectToObject( SO ); + SMESH::SMESH_Mesh_var aMesh = SMESH::SMESH_Mesh::_narrow( aObject ); + SMESH::SMESH_subMesh_var aSubMesh = SMESH::SMESH_subMesh::_narrow( aObject ); + SMESH::SMESH_GroupBase_var aGroup = SMESH::SMESH_GroupBase::_narrow( aObject ); + if ( !aMesh->_is_nil() || !aSubMesh->_is_nil() || !aGroup->_is_nil() ) { + ::Control( theCommandID ); + break; + } + } } SUIT_MessageBox::warning(desktop(), - tr( "SMESH_WRN_WARNING" ), - tr( "SMESH_BAD_SELECTION" ) ); + tr( "SMESH_WRN_WARNING" ), + tr( "SMESH_BAD_SELECTION" ) ); break; } else { SUIT_MessageBox::warning(desktop(), - tr( "SMESH_WRN_WARNING" ), - tr( "NOT_A_VTK_VIEWER" ) ); + tr( "SMESH_WRN_WARNING" ), + tr( "NOT_A_VTK_VIEWER" ) ); } break; case 9010: @@ -2535,11 +2545,11 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) SALOME_ListIteratorOfListIO it(selected); for( ; it.More(); it.Next()) { Handle(SALOME_InteractiveObject) anIObject = it.Value(); - if(anIObject->hasEntry()) { - if(SMESH_Actor *anActor = SMESH::FindActorByEntry(anIObject->getEntry())){ - anActor->SetPointsLabeled( !anActor->GetPointsLabeled() ); - } - } + if(anIObject->hasEntry()) { + if(SMESH_Actor *anActor = SMESH::FindActorByEntry(anIObject->getEntry())){ + anActor->SetPointsLabeled( !anActor->GetPointsLabeled() ); + } + } } break; } @@ -2548,12 +2558,12 @@ bool SMESHGUI::OnGUIEvent( int theCommandID ) LightApp_SelectionMgr* mgr = selectionMgr(); SALOME_ListIO selected; mgr->selectedObjects( selected ); - if (selected.Extent() == 1) { - Handle(SALOME_InteractiveObject) anIObject = selected.First(); - if(anIObject->hasEntry()) - if(SMESH_Actor *anActor = SMESH::FindActorByEntry(anIObject->getEntry())){ - anActor->SetCellsLabeled( !anActor->GetCellsLabeled() ); - } + if (selected.Extent() == 1) { + Handle(SALOME_InteractiveObject) anIObject = selected.First(); + if(anIObject->hasEntry()) + if(SMESH_Actor *anActor = SMESH::FindActorByEntry(anIObject->getEntry())){ + anActor->SetCellsLabeled( !anActor->GetCellsLabeled() ); + } } break; } @@ -2640,7 +2650,7 @@ void SMESHGUI::createPopupItem( const int id, const QString& clients, const QString& types, const QString& theRule, - const int pId ) + const int pId ) { int parentId = pId; if( pId!=-1 ) @@ -2768,6 +2778,7 @@ void SMESHGUI::initialize( CAM_Application* app ) createSMESHAction( 415, "MAP", "ICON_MAP" ); createSMESHAction( 416, "EXTRUSION_ALONG", "ICON_EXTRUSION_ALONG" ); createSMESHAction( 417, "CONV_TO_QUAD", "ICON_CONV_TO_QUAD" ); + createSMESHAction( 418, "2D_FROM_3D", "ICON_2D_FROM_3D" ); createSMESHAction( 200, "RESET" ); createSMESHAction( 201, "SCALAR_BAR_PROP" ); createSMESHAction( 211, "WIRE", "ICON_WIRE", 0, true ); @@ -2937,6 +2948,7 @@ void SMESHGUI::initialize( CAM_Application* app ) createMenu( 414, modifyId, -1 ); createMenu( 415, modifyId, -1 ); createMenu( 417, modifyId, -1 ); + createMenu( 418, modifyId, -1 ); createMenu( 214, viewId, -1 ); @@ -3033,6 +3045,7 @@ void SMESHGUI::initialize( CAM_Application* app ) createTool( 414, modifyTb ); createTool( 415, modifyTb ); createTool( 417, modifyTb ); + createTool( 418, modifyTb ); createTool( 214, dispModeTb ); @@ -3041,24 +3054,37 @@ void SMESHGUI::initialize( CAM_Application* app ) myRules.clear(); QString OB = "'ObjectBrowser'", - View = "'" + SVTK_Viewer::Type() + "'", - pat = "'%1'", - mesh = pat.arg( SMESHGUI_Selection::typeName( MESH ) ), - group = pat.arg( SMESHGUI_Selection::typeName( GROUP ) ), - hypo = pat.arg( SMESHGUI_Selection::typeName( HYPOTHESIS ) ), - algo = pat.arg( SMESHGUI_Selection::typeName( ALGORITHM ) ), - elems = QString( "'%1' '%2' '%3' '%4' '%5' '%6'" ). + View = "'" + SVTK_Viewer::Type() + "'", + pat = "'%1'", + mesh = pat.arg( SMESHGUI_Selection::typeName( MESH ) ), + group = pat.arg( SMESHGUI_Selection::typeName( GROUP ) ), + hypo = pat.arg( SMESHGUI_Selection::typeName( HYPOTHESIS ) ), + algo = pat.arg( SMESHGUI_Selection::typeName( ALGORITHM ) ), + elems = QString( "'%1' '%2' '%3' '%4' '%5' '%6'" ). arg( SMESHGUI_Selection::typeName( SUBMESH_VERTEX ) ). - arg( SMESHGUI_Selection::typeName( SUBMESH_EDGE ) ). - arg( SMESHGUI_Selection::typeName( SUBMESH_FACE ) ). - arg( SMESHGUI_Selection::typeName( SUBMESH_SOLID ) ). - arg( SMESHGUI_Selection::typeName( SUBMESH_COMPOUND ) ). - arg( SMESHGUI_Selection::typeName( SUBMESH ) ), + arg( SMESHGUI_Selection::typeName( SUBMESH_EDGE ) ). + arg( SMESHGUI_Selection::typeName( SUBMESH_FACE ) ). + arg( SMESHGUI_Selection::typeName( SUBMESH_SOLID ) ). + arg( SMESHGUI_Selection::typeName( SUBMESH_COMPOUND ) ). + arg( SMESHGUI_Selection::typeName( SUBMESH ) ), subMesh = elems, - mesh_group = mesh + " " + subMesh + " " + group, - hyp_alg = hypo + " " + algo; + mesh_group = mesh + " " + subMesh + " " + group, + hyp_alg = hypo + " " + algo; // popup for object browser + QString + isInvisible("not( isVisible )"), + isEmpty("numberOfNodes = 0"), + isNotEmpty("numberOfNodes <> 0"), + + // has nodes, edges, etc in VISIBLE! actor + hasNodes("(numberOfNodes > 0 )"),//&& isVisible)"), + hasElems("(count( elemTypes ) > 0)"), + hasDifferentElems("(count( elemTypes ) > 1)"), + hasElems0d("({'Elem0d'} in elemTypes)"), + hasEdges("({'Edge'} in elemTypes)"), + hasFaces("({'Face'} in elemTypes)"), + hasVolumes("({'Volume'} in elemTypes)"); createPopupItem( 150, OB, mesh, "&& selcount=1 && isImported" ); // FILE INFORMATION createPopupItem( 703, OB, mesh, "&& isComputable"); // CREATE_SUBMESH @@ -3087,6 +3113,9 @@ void SMESHGUI::initialize( CAM_Application* app ) popupMgr()->insert( separator(), -1, 0 ); createPopupItem( 4043, OB, mesh ); // CLEAR_MESH popupMgr()->insert( separator(), -1, 0 ); + createPopupItem( 417, OB, mesh/*, "&& " + hasElems*/); // convert to quadratic + createPopupItem( 418, OB, mesh/*, "&& " + hasVolumes*/); // create 2D mesh on 3D + popupMgr()->insert( separator(), -1, 0 ); QString only_one_non_empty = QString( " && %1=1 && numberOfNodes>0" ).arg( dc ); @@ -3114,20 +3143,6 @@ void SMESHGUI::initialize( CAM_Application* app ) popupMgr()->insert( separator(), -1, 0 ); int anId; - QString - isInvisible("not( isVisible )"), - isEmpty("numberOfNodes = 0"), - isNotEmpty("numberOfNodes <> 0"), - - // has nodes, edges, etc in VISIBLE! actor - hasNodes("(numberOfNodes > 0 )"),//&& isVisible)"), - hasElems("(count( elemTypes ) > 0)"), - hasDifferentElems("(count( elemTypes ) > 1)"), - hasElems0d("({'Elem0d'} in elemTypes)"), - hasEdges("({'Edge'} in elemTypes)"), - hasFaces("({'Face'} in elemTypes)"), - hasVolumes("({'Volume'} in elemTypes)"); - QString aClient = QString( "%1client in {%2}" ).arg( lc ).arg( "'VTKViewer'" ); QString aType = QString( "%1type in {%2}" ).arg( lc ); aType = aType.arg( mesh_group ); @@ -3352,7 +3367,7 @@ void SMESHGUI::initialize( CAM_Application* app ) popupMgr()->insert( separator(), -1, -1 ); connect( application(), SIGNAL( viewManagerActivated( SUIT_ViewManager* ) ), - this, SLOT( onViewManagerActivated( SUIT_ViewManager* ) ) ); + this, SLOT( onViewManagerActivated( SUIT_ViewManager* ) ) ); } //================================================================================ @@ -3474,7 +3489,7 @@ void SMESHGUI::contextMenuPopup( const QString& client, QMenu* menu, QString& ti if ( obj ) { QString aName = QString( obj->GetName().c_str() ); while ( aName.at( aName.length() - 1 ) == ' ' ) // Remove extraspaces in Name of Popup - aName.remove( (aName.length() - 1), 1 ); + aName.remove( (aName.length() - 1), 1 ); title = aName; } } @@ -3751,48 +3766,48 @@ void SMESHGUI::preferencesChanged( const QString& sect, const QString& name ) if( name=="selection_object_color" || name=="selection_element_color" || name=="selection_width" || name=="highlight_color" || name=="highlight_width" || name=="selection_precision_node" || name=="selection_precision_element" || - name=="selection_precision_object") + name=="selection_precision_object") SMESH::UpdateSelectionProp( this ); else if (name == QString("scalar_bar_vertical_x") || name == QString("scalar_bar_vertical_width")){ sbX1 = aResourceMgr->doubleValue("SMESH", "scalar_bar_vertical_x", sbX1); sbW = aResourceMgr->doubleValue("SMESH", "scalar_bar_vertical_width", sbW); if(sbX1+sbW > aTol){ - aWarning = "Origin and Size Vertical: X+Width > 1\n"; - sbX1=0.01; - sbW=0.08; - aResourceMgr->setValue("SMESH", "scalar_bar_vertical_x", sbX1); - aResourceMgr->setValue("SMESH", "scalar_bar_vertical_width", sbW); + aWarning = "Origin and Size Vertical: X+Width > 1\n"; + sbX1=0.01; + sbW=0.08; + aResourceMgr->setValue("SMESH", "scalar_bar_vertical_x", sbX1); + aResourceMgr->setValue("SMESH", "scalar_bar_vertical_width", sbW); } } else if(name == QString("scalar_bar_vertical_y") || name == QString("scalar_bar_vertical_height")){ sbY1 = aResourceMgr->doubleValue("SMESH", "scalar_bar_vertical_y", sbY1); sbH = aResourceMgr->doubleValue("SMESH", "scalar_bar_vertical_height",sbH); if(sbY1+sbH > aTol){ - aWarning = "Origin and Size Vertical: Y+Height > 1\n"; - aResourceMgr->setValue("SMESH", "scalar_bar_vertical_y", sbY1); - aResourceMgr->setValue("SMESH", "scalar_bar_vertical_height",sbH); + aWarning = "Origin and Size Vertical: Y+Height > 1\n"; + aResourceMgr->setValue("SMESH", "scalar_bar_vertical_y", sbY1); + aResourceMgr->setValue("SMESH", "scalar_bar_vertical_height",sbH); } } else if(name == QString("scalar_bar_horizontal_x") || name == QString("scalar_bar_horizontal_width")){ sbX1 = aResourceMgr->doubleValue("SMESH", "scalar_bar_horizontal_x", sbX1); sbW = aResourceMgr->doubleValue("SMESH", "scalar_bar_horizontal_width", sbW); if(sbX1+sbW > aTol){ - aWarning = "Origin and Size Horizontal: X+Width > 1\n"; - sbX1=0.1; - sbW=0.08; - aResourceMgr->setValue("SMESH", "scalar_bar_horizontal_x", sbX1); - aResourceMgr->setValue("SMESH", "scalar_bar_horizontal_width", sbW); + aWarning = "Origin and Size Horizontal: X+Width > 1\n"; + sbX1=0.1; + sbW=0.08; + aResourceMgr->setValue("SMESH", "scalar_bar_horizontal_x", sbX1); + aResourceMgr->setValue("SMESH", "scalar_bar_horizontal_width", sbW); } } else if(name == QString("scalar_bar_horizontal_y") || name == QString("scalar_bar_horizontal_height")){ sbY1 = aResourceMgr->doubleValue("SMESH", "scalar_bar_horizontal_y", sbY1); sbH = aResourceMgr->doubleValue("SMESH", "scalar_bar_horizontal_height",sbH); if(sbY1+sbH > aTol){ - aWarning = "Origin and Size Horizontal: Y+Height > 1\n"; - sbY1=0.01; - sbH=0.08; - aResourceMgr->setValue("SMESH", "scalar_bar_horizontal_y", sbY1); - aResourceMgr->setValue("SMESH", "scalar_bar_horizontal_height",sbH); + aWarning = "Origin and Size Horizontal: Y+Height > 1\n"; + sbY1=0.01; + sbH=0.08; + aResourceMgr->setValue("SMESH", "scalar_bar_horizontal_y", sbY1); + aResourceMgr->setValue("SMESH", "scalar_bar_horizontal_height",sbH); } } else if ( name == "segmentation" ) { @@ -3807,8 +3822,8 @@ void SMESHGUI::preferencesChanged( const QString& sect, const QString& name ) if(aWarning.size() != 0){ aWarning += "The default values are applied instead."; SUIT_MessageBox::warning(SMESHGUI::desktop(), - QObject::tr("SMESH_ERR_SCALARBAR_PARAMS"), - QObject::tr(aWarning.c_str())); + QObject::tr("SMESH_ERR_SCALARBAR_PARAMS"), + QObject::tr(aWarning.c_str())); } } } @@ -3900,6 +3915,9 @@ LightApp_Operation* SMESHGUI::createOperation( const int id ) const case 417: //convert to quadratic op = new SMESHGUI_ConvToQuadOp(); break; + case 418: // create 2D mesh as boundary on 3D + op = new SMESHGUI_Make2DFrom3DOp(); + break; case 4067: // make mesh pass through point op = new SMESHGUI_MakeNodeAtPointOp(); break; @@ -3947,7 +3965,7 @@ SALOMEDS::Color SMESHGUI::getUniqueColor( const QList& theReser { aTolerance /= 2; if( aTolerance < 1 ) - break; + break; } //cout << "Iteration N" << anIterations << " (tolerance=" << aTolerance << ")"<< endl; @@ -3968,9 +3986,9 @@ SALOMEDS::Color SMESHGUI::getUniqueColor( const QList& theReser //cout << h << " "; if( abs( h - aHue ) < aTolerance ) { - ok = false; - //cout << "break (diff = " << abs( h - aHue ) << ")"; - break; + ok = false; + //cout << "break (diff = " << abs( h - aHue ) << ")"; + break; } } //cout << endl; @@ -4036,19 +4054,19 @@ void SMESHGUI::storeVisualParameters (int savePoint) QVector views = vman->getViews(); for (int i = 0, iEnd = vman->getViewsCount(); i < iEnd; i++) { - if (SVTK_ViewWindow* vtkView = dynamic_cast(views[i])) + if (SVTK_ViewWindow* vtkView = dynamic_cast(views[i])) { - VTK::ActorCollectionCopy aCopy(vtkView->getRenderer()->GetActors()); - vtkActorCollection* allActors = aCopy.GetActors(); - allActors->InitTraversal(); - while (vtkActor* actor = allActors->GetNextActor()) + VTK::ActorCollectionCopy aCopy(vtkView->getRenderer()->GetActors()); + vtkActorCollection* allActors = aCopy.GetActors(); + allActors->InitTraversal(); + while (vtkActor* actor = allActors->GetNextActor()) { - if (actor->GetVisibility()) // store only visible actors + if (actor->GetVisibility()) // store only visible actors { SMESH_Actor* aSmeshActor = 0; if (actor->IsA("SMESH_Actor")) aSmeshActor = SMESH_Actor::SafeDownCast(actor); - if (aSmeshActor && aSmeshActor->hasIO()) + if (aSmeshActor && aSmeshActor->hasIO()) { Handle(SALOME_InteractiveObject) io = aSmeshActor->getIO(); if (io->hasEntry()) @@ -4157,10 +4175,10 @@ void SMESHGUI::storeVisualParameters (int savePoint) ip->setParameter(entry, param + QString::number(ipl+1).toLatin1().data(), planeValue); } } // if (io->hasEntry()) - } // SMESH_Actor && hasIO - } // isVisible - } // while.. actors traversal - } // if (vtkView) + } // SMESH_Actor && hasIO + } // isVisible + } // while.. actors traversal + } // if (vtkView) } // for (views) vtkViewers++; } // if (SVTK view model) @@ -4228,7 +4246,7 @@ void SMESHGUI::restoreVisualParameters (int savePoint) bool ok; int viewIndex = viewIndexStr.toUInt(&ok); if (!ok) // bad conversion of view index to integer - continue; + continue; // viewers if (viewerTypStr == SVTK_Viewer::Type()) @@ -4255,7 +4273,7 @@ void SMESHGUI::restoreVisualParameters (int savePoint) // access later when restoring other parameters SVTK_ViewWindow* vtkView = (SVTK_ViewWindow*) vman->getActiveView(); vtkRenderer* Renderer = vtkView->getRenderer(); - VTK::ActorCollectionCopy aCopy(Renderer->GetActors()); + VTK::ActorCollectionCopy aCopy(Renderer->GetActors()); vtkActorCollection* theActors = aCopy.GetActors(); theActors->InitTraversal(); bool isFound = false; @@ -4276,10 +4294,10 @@ void SMESHGUI::restoreVisualParameters (int savePoint) } } } // if (paramNameStr == "Visibility") - else + else { // the rest properties "work" with SMESH_Actor - if (aSmeshActor) + if (aSmeshActor) { QString val ((*valuesIt).c_str()); @@ -4382,7 +4400,7 @@ void SMESHGUI::restoreVisualParameters (int savePoint) } } } // if (aSmeshActor) - } // other parameters than Visibility + } // other parameters than Visibility } } // for names/parameters iterator } // for entries iterator diff --git a/src/SMESHGUI/SMESHGUI.h b/src/SMESHGUI/SMESHGUI.h index 23af4d0e2..f6960a481 100644 --- a/src/SMESHGUI/SMESHGUI.h +++ b/src/SMESHGUI/SMESHGUI.h @@ -70,7 +70,6 @@ public : static SUIT_ResourceMgr* resourceMgr(); static SUIT_Desktop* desktop(); static SalomeApp_Study* activeStudy(); - static char* JoinObjectParameters(const QStringList& theParametersList); bool isActiveStudyLocked(); @@ -104,6 +103,7 @@ public : void EmitSignalDeactivateDialog(); void EmitSignalStudyFrameChanged(); void EmitSignalCloseAllDialogs(); + void EmitSignalVisibilityChanged(); virtual void contextMenuPopup( const QString&, QMenu*, QString& ); virtual void createPreferences(); @@ -132,6 +132,7 @@ signals: void SignalDeactivateActiveDialog(); void SignalStudyFrameChanged(); void SignalCloseAllDialogs(); + void SignalVisibilityChanged(); protected: void createSMESHAction( const int, diff --git a/src/SMESHGUI/SMESHGUI_AddMeshElementDlg.cxx b/src/SMESHGUI/SMESHGUI_AddMeshElementDlg.cxx index fd617e809..33c410193 100644 --- a/src/SMESHGUI/SMESHGUI_AddMeshElementDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_AddMeshElementDlg.cxx @@ -186,11 +186,11 @@ namespace SMESH vtkIdList *anIds = vtkIdList::New(); if(aConn) - for (int i = 0, iEnd = theIds.size(); i < iEnd; i++) - anIds->InsertId(i,theIds[aConn[i]]); + for (int i = 0, iEnd = theIds.size(); i < iEnd; i++) + anIds->InsertId(i,theIds[aConn[i]]); else - for (int i = 0, iEnd = theIds.size(); i < iEnd; i++) - anIds->InsertId(i,theIds[i]); + for (int i = 0, iEnd = theIds.size(); i < iEnd; i++) + anIds->InsertId(i,theIds[i]); myGrid->InsertNextCell(theType,anIds); anIds->Delete(); @@ -212,8 +212,8 @@ namespace SMESH ~TElementSimulation() { if (FindVtkViewWindow(myApplication->activeViewManager(), myViewWindow)) { - myVTKViewWindow->RemoveActor(myPreviewActor); - myVTKViewWindow->RemoveActor(myFaceOrientation); + myVTKViewWindow->RemoveActor(myPreviewActor); + myVTKViewWindow->RemoveActor(myFaceOrientation); } myPreviewActor->Delete(); myFaceOrientation->Delete(); @@ -237,7 +237,7 @@ namespace SMESH //================================================================================= SMESHGUI_AddMeshElementDlg::SMESHGUI_AddMeshElementDlg( SMESHGUI* theModule, SMDSAbs_ElementType ElementType, - int nbNodes ) + int nbNodes ) : QDialog( SMESH::GetDesktop( theModule ) ), mySMESHGUI( theModule ), mySelectionMgr( SMESH::GetSelectionMgr( theModule ) ) @@ -466,9 +466,9 @@ void SMESHGUI_AddMeshElementDlg::ClickOnApply() aMeshEditor->AddEdge(anArrayOfIndices.inout()); break; case SMDSAbs_Face: { if(myIsPoly) - aMeshEditor->AddPolygonalFace(anArrayOfIndices.inout()); + aMeshEditor->AddPolygonalFace(anArrayOfIndices.inout()); else - aMeshEditor->AddFace(anArrayOfIndices.inout()); + aMeshEditor->AddFace(anArrayOfIndices.inout()); break; } case SMDSAbs_Volume: @@ -536,10 +536,10 @@ void SMESHGUI_AddMeshElementDlg::ClickOnHelp() platform = "application"; #endif SUIT_MessageBox::warning(this, tr("WRN_WARNING"), - tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). - arg(app->resourceMgr()->stringValue("ExternalBrowser", - platform)). - arg(myHelpFileName)); + tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). + arg(app->resourceMgr()->stringValue("ExternalBrowser", + platform)). + arg(myHelpFileName)); } } @@ -571,12 +571,12 @@ void SMESHGUI_AddMeshElementDlg::onTextChange (const QString& theNewText) bool allOk = true; for (int i = 0; i < aListId.count(); i++) { if( const SMDS_MeshNode * n = aMesh->FindNode( aListId[ i ].toInt() ) ) - { - newIndices.Add( n->GetID() ); - myNbOkNodes++; - } + { + newIndices.Add( n->GetID() ); + myNbOkNodes++; + } else - allOk = false; + allOk = false; } mySelector->AddOrRemoveIndex( myActor->getIO(), newIndices, false ); @@ -587,10 +587,10 @@ void SMESHGUI_AddMeshElementDlg::onTextChange (const QString& theNewText) if (myIsPoly) { - if ( !allOk || myElementType != SMDSAbs_Face || aListId.count() < 3 ) - myNbOkNodes = 0; - else - myNbOkNodes = aListId.count(); + if ( !allOk || myElementType != SMDSAbs_Face || aListId.count() < 3 ) + myNbOkNodes = 0; + else + myNbOkNodes = aListId.count(); } } diff --git a/src/SMESHGUI/SMESHGUI_AddQuadraticElementDlg.cxx b/src/SMESHGUI/SMESHGUI_AddQuadraticElementDlg.cxx index 1c3106e73..4a9fa18ac 100644 --- a/src/SMESHGUI/SMESHGUI_AddQuadraticElementDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_AddQuadraticElementDlg.cxx @@ -221,7 +221,7 @@ namespace SMESH void SetPosition (SMESH_Actor* theActor, const int theType, TVTKIds& theIds, - const int theMode, + const int theMode, const bool theReverse) { vtkUnstructuredGrid *aGrid = theActor->GetUnstructuredGrid(); @@ -311,8 +311,8 @@ namespace SMESH ~TElementSimulation() { if (FindVtkViewWindow(myApplication->activeViewManager(), myViewWindow)) { - myVTKViewWindow->RemoveActor(myPreviewActor); - myVTKViewWindow->RemoveActor(myFaceOrientation); + myVTKViewWindow->RemoveActor(myPreviewActor); + myVTKViewWindow->RemoveActor(myFaceOrientation); } myPreviewActor->Delete(); myFaceOrientation->Delete(); @@ -411,7 +411,7 @@ QWidget* IdEditItem::createEditor() const // purpose : constructor //================================================================================= SMESHGUI_AddQuadraticElementDlg::SMESHGUI_AddQuadraticElementDlg( SMESHGUI* theModule, - const int theType ) + const int theType ) : QDialog( SMESH::GetDesktop( theModule ) ), mySMESHGUI( theModule ), mySelectionMgr( SMESH::GetSelectionMgr( theModule ) ), @@ -766,10 +766,10 @@ void SMESHGUI_AddQuadraticElementDlg::ClickOnHelp() platform = "application"; #endif SUIT_MessageBox::warning(this, tr("WRN_WARNING"), - tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). - arg(app->resourceMgr()->stringValue("ExternalBrowser", - platform)). - arg(myHelpFileName)); + tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). + arg(app->resourceMgr()->stringValue("ExternalBrowser", + platform)). + arg(myHelpFileName)); } } @@ -797,12 +797,12 @@ void SMESHGUI_AddQuadraticElementDlg::onTextChange (const QString& theNewText) for (int i = 0; i < aListId.count(); i++) { if ( const SMDS_MeshNode * n = aMesh->FindNode( aListId[ i ].toInt() ) ) { - newIndices.Add( n->GetID() ); + newIndices.Add( n->GetID() ); } else { - allOk = false; - break; + allOk = false; + break; } } @@ -914,16 +914,16 @@ void SMESHGUI_AddQuadraticElementDlg::displaySimulation() else { for ( int row = 0; row < myNbCorners; row++ ) - anIds.push_back( myActor->GetObject()->GetNodeVTKId( myTable->item(row, 0)->text().toInt() ) ); + anIds.push_back( myActor->GetObject()->GetNodeVTKId( myTable->item(row, 0)->text().toInt() ) ); for ( int row = 0; row < myTable->rowCount(); row++ ) { - anID = myTable->item(row, 1)->text().toInt(&ok); - if (!ok) { - anID = myTable->item(row, 0)->text().toInt(); - aDisplayMode = VTK_WIREFRAME; - } - anIds.push_back( myActor->GetObject()->GetNodeVTKId(anID) ); + anID = myTable->item(row, 1)->text().toInt(&ok); + if (!ok) { + anID = myTable->item(row, 0)->text().toInt(); + aDisplayMode = VTK_WIREFRAME; + } + anIds.push_back( myActor->GetObject()->GetNodeVTKId(anID) ); } } @@ -1117,7 +1117,7 @@ void SMESHGUI_AddQuadraticElementDlg::UpdateTable( bool theConersValidity ) // clear table for ( int row = 0; row < myTable->rowCount(); row++ ) for ( int col = 0; col < myTable->columnCount(); col++ ) - if ( QTableWidgetItem* aTWI = myTable->item(row, col) ) aTWI->setText(""); + if ( QTableWidgetItem* aTWI = myTable->item(row, col) ) aTWI->setText(""); myTable->setEnabled( false ); } diff --git a/src/SMESHGUI/SMESHGUI_BuildCompoundDlg.cxx b/src/SMESHGUI/SMESHGUI_BuildCompoundDlg.cxx index 2d6b7435b..1e58867d0 100644 --- a/src/SMESHGUI/SMESHGUI_BuildCompoundDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_BuildCompoundDlg.cxx @@ -289,27 +289,28 @@ bool SMESHGUI_BuildCompoundDlg::ClickOnApply() if (!isValid()) return false; + SMESH::SMESH_Mesh_var aCompoundMesh; + if (!myMesh->_is_nil()) { QStringList aParameters; aParameters << (CheckBoxMerge->isChecked() ? SpinBoxTol->text() : QString(" ")); - try { + try { SUIT_OverrideCursor aWaitCursor; SMESH::SMESH_Gen_var aSMESHGen = SMESHGUI::GetSMESHGen(); // concatenate meshes - SMESH::SMESH_Mesh_var aCompoundMesh; if(CheckBoxCommon->isChecked()) - aCompoundMesh = aSMESHGen->ConcatenateWithGroups(myMeshArray, - !(ComboBoxUnion->currentIndex()), - CheckBoxMerge->isChecked(), - SpinBoxTol->GetValue()); + aCompoundMesh = aSMESHGen->ConcatenateWithGroups(myMeshArray, + !(ComboBoxUnion->currentIndex()), + CheckBoxMerge->isChecked(), + SpinBoxTol->GetValue()); else - aCompoundMesh = aSMESHGen->Concatenate(myMeshArray, - !(ComboBoxUnion->currentIndex()), - CheckBoxMerge->isChecked(), - SpinBoxTol->GetValue()); + aCompoundMesh = aSMESHGen->Concatenate(myMeshArray, + !(ComboBoxUnion->currentIndex()), + CheckBoxMerge->isChecked(), + SpinBoxTol->GetValue()); - aCompoundMesh->SetParameters( SMESHGUI::JoinObjectParameters(aParameters) ); + aCompoundMesh->SetParameters( aParameters.join(":").toLatin1().constData() ); SMESH::SetName( SMESH::FindSObject( aCompoundMesh ), LineEditName->text() ); mySMESHGUI->updateObjBrowser(); @@ -319,8 +320,16 @@ bool SMESHGUI_BuildCompoundDlg::ClickOnApply() LineEditName->setText(GetDefaultName(tr("COMPOUND_MESH"))); - //mySelectionMgr->clearSelected(); - SMESH::UpdateView(); + // IPAL21468 Compound is hidden after creation. + if ( SMESHGUI::automaticUpdate() ) { + mySelectionMgr->clearSelected(); + SMESH::UpdateView(); + + _PTR(SObject) aSO = SMESH::FindSObject(aCompoundMesh.in()); + if ( SMESH_Actor* anActor = SMESH::CreateActor(aSO->GetStudy(), aSO->GetID().c_str()) ) + SMESH::DisplayActor(SMESH::GetActiveWindow(), anActor); + }// end IPAL21468 + return true; } return false; @@ -360,10 +369,10 @@ void SMESHGUI_BuildCompoundDlg::ClickOnHelp() app->onHelpContextModule(mySMESHGUI ? app->moduleName(mySMESHGUI->moduleName()) : QString(""), myHelpFileName); else { SUIT_MessageBox::warning(this, tr("WRN_WARNING"), - tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). - arg(app->resourceMgr()->stringValue("ExternalBrowser", - "application")). - arg(myHelpFileName)); + tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). + arg(app->resourceMgr()->stringValue("ExternalBrowser", + "application")). + arg(myHelpFileName)); } } diff --git a/src/SMESHGUI/SMESHGUI_ClippingDlg.cxx b/src/SMESHGUI/SMESHGUI_ClippingDlg.cxx index 6f2d9293e..be11acf6c 100644 --- a/src/SMESHGUI/SMESHGUI_ClippingDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_ClippingDlg.cxx @@ -72,7 +72,7 @@ class OrientedPlane: public vtkPlane { - SVTK_ViewWindow* myViewWindow; + QPointer myViewWindow; vtkDataSetMapper* myMapper; @@ -168,7 +168,8 @@ protected: } ~OrientedPlane(){ - myViewWindow->RemoveActor(myActor); + if (myViewWindow) + myViewWindow->RemoveActor(myActor); myActor->Delete(); myMapper->RemoveAllInputs(); @@ -264,31 +265,31 @@ void SMESHGUI_ClippingDlg::AddPlane (SMESH_Actor* theActor, vtkFloatingPointType aDel = aDataSet->GetLength()/2.0; vtkFloatingPointType aDelta[2][3] = {{aDir[0][0]*aDel, aDir[0][1]*aDel, aDir[0][2]*aDel}, - {aDir[1][0]*aDel, aDir[1][1]*aDel, aDir[1][2]*aDel}}; + {aDir[1][0]*aDel, aDir[1][1]*aDel, aDir[1][2]*aDel}}; vtkFloatingPointType aParam, aPnt0[3], aPnt1[3], aPnt2[3]; vtkFloatingPointType aPnt01[3] = {aPnt[0] - aDelta[0][0] - aDelta[1][0], - aPnt[1] - aDelta[0][1] - aDelta[1][1], - aPnt[2] - aDelta[0][2] - aDelta[1][2]}; + aPnt[1] - aDelta[0][1] - aDelta[1][1], + aPnt[2] - aDelta[0][2] - aDelta[1][2]}; vtkFloatingPointType aPnt02[3] = {aPnt01[0] + aNormal[0], - aPnt01[1] + aNormal[1], - aPnt01[2] + aNormal[2]}; + aPnt01[1] + aNormal[1], + aPnt01[2] + aNormal[2]}; vtkPlane::IntersectWithLine(aPnt01,aPnt02,aNormal,anOrigin,aParam,aPnt0); vtkFloatingPointType aPnt11[3] = {aPnt[0] - aDelta[0][0] + aDelta[1][0], - aPnt[1] - aDelta[0][1] + aDelta[1][1], - aPnt[2] - aDelta[0][2] + aDelta[1][2]}; + aPnt[1] - aDelta[0][1] + aDelta[1][1], + aPnt[2] - aDelta[0][2] + aDelta[1][2]}; vtkFloatingPointType aPnt12[3] = {aPnt11[0] + aNormal[0], - aPnt11[1] + aNormal[1], - aPnt11[2] + aNormal[2]}; + aPnt11[1] + aNormal[1], + aPnt11[2] + aNormal[2]}; vtkPlane::IntersectWithLine(aPnt11,aPnt12,aNormal,anOrigin,aParam,aPnt1); vtkFloatingPointType aPnt21[3] = {aPnt[0] + aDelta[0][0] - aDelta[1][0], - aPnt[1] + aDelta[0][1] - aDelta[1][1], - aPnt[2] + aDelta[0][2] - aDelta[1][2]}; + aPnt[1] + aDelta[0][1] - aDelta[1][1], + aPnt[2] + aDelta[0][2] - aDelta[1][2]}; vtkFloatingPointType aPnt22[3] = {aPnt21[0] + aNormal[0], - aPnt21[1] + aNormal[1], - aPnt21[2] + aNormal[2]}; + aPnt21[1] + aNormal[1], + aPnt21[2] + aNormal[2]}; vtkPlane::IntersectWithLine(aPnt21,aPnt22,aNormal,anOrigin,aParam,aPnt2); vtkPlaneSource* aPlaneSource = aPlane->myPlaneSource; @@ -555,17 +556,17 @@ void SMESHGUI_ClippingDlg::ClickOnHelp() if (app) app->onHelpContextModule(mySMESHGUI ? app->moduleName(mySMESHGUI->moduleName()) : QString(""), myHelpFileName); else { - QString platform; + QString platform; #ifdef WIN32 - platform = "winapplication"; + platform = "winapplication"; #else - platform = "application"; + platform = "application"; #endif SUIT_MessageBox::warning(this, tr("WRN_WARNING"), - tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). - arg(app->resourceMgr()->stringValue("ExternalBrowser", - platform)). - arg(myHelpFileName)); + tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). + arg(app->resourceMgr()->stringValue("ExternalBrowser", + platform)). + arg(myHelpFileName)); } } @@ -581,24 +582,24 @@ void SMESHGUI_ClippingDlg::onSelectionChanged() Handle(SALOME_InteractiveObject) IOS = aList.First(); myActor = SMESH::FindActorByEntry(IOS->getEntry()); if (myActor) { - std::for_each(myPlanes.begin(),myPlanes.end(),TSetVisiblity(false)); - myPlanes.clear(); - - vtkIdType anId = 0, anEnd = myActor->GetNumberOfClippingPlanes(); - for ( ; anId < anEnd; anId++) { - if (vtkImplicitFunction* aFunction = myActor->GetClippingPlane(anId)) { - if(OrientedPlane* aPlane = OrientedPlane::SafeDownCast(aFunction)){ - OrientedPlane* anOrientedPlane = OrientedPlane::New(aViewWindow); - SMESH::TVTKPlane aTVTKPlane(anOrientedPlane); - anOrientedPlane->Delete(); - aTVTKPlane->ShallowCopy(aPlane); - myPlanes.push_back(aTVTKPlane); - } - } - } - - std::for_each(myPlanes.begin(),myPlanes.end(), - TSetVisiblity(PreviewCheckBox->isChecked())); + std::for_each(myPlanes.begin(),myPlanes.end(),TSetVisiblity(false)); + myPlanes.clear(); + + vtkIdType anId = 0, anEnd = myActor->GetNumberOfClippingPlanes(); + for ( ; anId < anEnd; anId++) { + if (vtkImplicitFunction* aFunction = myActor->GetClippingPlane(anId)) { + if(OrientedPlane* aPlane = OrientedPlane::SafeDownCast(aFunction)){ + OrientedPlane* anOrientedPlane = OrientedPlane::New(aViewWindow); + SMESH::TVTKPlane aTVTKPlane(anOrientedPlane); + anOrientedPlane->Delete(); + aTVTKPlane->ShallowCopy(aPlane); + myPlanes.push_back(aTVTKPlane); + } + } + } + + std::for_each(myPlanes.begin(),myPlanes.end(), + TSetVisiblity(PreviewCheckBox->isChecked())); } } SMESH::RenderViewWindow(aViewWindow); @@ -840,31 +841,31 @@ void SMESHGUI_ClippingDlg::SetCurrentPlaneParam() vtkFloatingPointType aDel = aDataSet->GetLength()/2.0; vtkFloatingPointType aDelta[2][3] = {{aDir[0][0]*aDel, aDir[0][1]*aDel, aDir[0][2]*aDel}, - {aDir[1][0]*aDel, aDir[1][1]*aDel, aDir[1][2]*aDel}}; + {aDir[1][0]*aDel, aDir[1][1]*aDel, aDir[1][2]*aDel}}; vtkFloatingPointType aParam, aPnt0[3], aPnt1[3], aPnt2[3]; vtkFloatingPointType aPnt01[3] = {aPnt[0] - aDelta[0][0] - aDelta[1][0], - aPnt[1] - aDelta[0][1] - aDelta[1][1], - aPnt[2] - aDelta[0][2] - aDelta[1][2]}; + aPnt[1] - aDelta[0][1] - aDelta[1][1], + aPnt[2] - aDelta[0][2] - aDelta[1][2]}; vtkFloatingPointType aPnt02[3] = {aPnt01[0] + aNormal[0], - aPnt01[1] + aNormal[1], - aPnt01[2] + aNormal[2]}; + aPnt01[1] + aNormal[1], + aPnt01[2] + aNormal[2]}; vtkPlane::IntersectWithLine(aPnt01,aPnt02,aNormal,anOrigin,aParam,aPnt0); vtkFloatingPointType aPnt11[3] = {aPnt[0] - aDelta[0][0] + aDelta[1][0], - aPnt[1] - aDelta[0][1] + aDelta[1][1], - aPnt[2] - aDelta[0][2] + aDelta[1][2]}; + aPnt[1] - aDelta[0][1] + aDelta[1][1], + aPnt[2] - aDelta[0][2] + aDelta[1][2]}; vtkFloatingPointType aPnt12[3] = {aPnt11[0] + aNormal[0], - aPnt11[1] + aNormal[1], - aPnt11[2] + aNormal[2]}; + aPnt11[1] + aNormal[1], + aPnt11[2] + aNormal[2]}; vtkPlane::IntersectWithLine(aPnt11,aPnt12,aNormal,anOrigin,aParam,aPnt1); vtkFloatingPointType aPnt21[3] = {aPnt[0] + aDelta[0][0] - aDelta[1][0], - aPnt[1] + aDelta[0][1] - aDelta[1][1], - aPnt[2] + aDelta[0][2] - aDelta[1][2]}; + aPnt[1] + aDelta[0][1] - aDelta[1][1], + aPnt[2] + aDelta[0][2] - aDelta[1][2]}; vtkFloatingPointType aPnt22[3] = {aPnt21[0] + aNormal[0], - aPnt21[1] + aNormal[1], - aPnt21[2] + aNormal[2]}; + aPnt21[1] + aNormal[1], + aPnt21[2] + aNormal[2]}; vtkPlane::IntersectWithLine(aPnt21,aPnt22,aNormal,anOrigin,aParam,aPnt2); vtkPlaneSource* aPlaneSource = aPlane->myPlaneSource; diff --git a/src/SMESHGUI/SMESHGUI_ClippingDlg.h b/src/SMESHGUI/SMESHGUI_ClippingDlg.h index af9829762..ed92330f2 100644 --- a/src/SMESHGUI/SMESHGUI_ClippingDlg.h +++ b/src/SMESHGUI/SMESHGUI_ClippingDlg.h @@ -82,16 +82,16 @@ public: // used in SMESHGUI::restoreVisualParameters() to avoid // declaration of OrientedPlane outside of SMESHGUI_ClippingDlg.cxx static void AddPlane (SMESH_Actor* theActor, - SVTK_ViewWindow* theViewWindow, - SMESH::Orientation theOrientation, - double theDistance, - vtkFloatingPointType theAngle[2]); + SVTK_ViewWindow* theViewWindow, + SMESH::Orientation theOrientation, + double theDistance, + vtkFloatingPointType theAngle[2]); static void GetPlaneParam (SMESH_Actor* theActor, - int thePlaneIndex, - SMESH::Orientation& theOrientation, - double& theDistance, - vtkFloatingPointType* theAngle); + int thePlaneIndex, + SMESH::Orientation& theOrientation, + double& theDistance, + vtkFloatingPointType* theAngle); protected: void keyPressEvent( QKeyEvent* ); diff --git a/src/SMESHGUI/SMESHGUI_ComputeDlg.cxx b/src/SMESHGUI/SMESHGUI_ComputeDlg.cxx index 087c102df..600427081 100644 --- a/src/SMESHGUI/SMESHGUI_ComputeDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_ComputeDlg.cxx @@ -638,8 +638,8 @@ void SMESHGUI_BaseComputeOp::startOperation() int nbSel = selected.Extent(); if (nbSel != 1) { SUIT_MessageBox::warning(desktop(), - tr("SMESH_WRN_WARNING"), - tr("SMESH_WRN_NO_AVAILABLE_DATA")); + tr("SMESH_WRN_WARNING"), + tr("SMESH_WRN_NO_AVAILABLE_DATA")); onCancel(); return; } @@ -648,8 +648,8 @@ void SMESHGUI_BaseComputeOp::startOperation() myMesh = SMESH::GetMeshByIO(myIObject); if (myMesh->_is_nil()) { SUIT_MessageBox::warning(desktop(), - tr("SMESH_WRN_WARNING"), - tr("SMESH_WRN_NO_AVAILABLE_DATA")); + tr("SMESH_WRN_WARNING"), + tr("SMESH_WRN_NO_AVAILABLE_DATA")); onCancel(); return; } @@ -742,9 +742,9 @@ void SMESHGUI_BaseComputeOp::computeMesh() LightApp_SelectionMgr *Sel = selectionMgr(); if ( Sel ) { - SALOME_ListIO selected; - selected.Append( myIObject ); - Sel->setSelectedObjects( selected ); + SALOME_ListIO selected; + selected.Append( myIObject ); + Sel->setSelectedObjects( selected ); } } } @@ -787,10 +787,10 @@ void SMESHGUI_BaseComputeOp::computeMesh() } void SMESHGUI_BaseComputeOp::showComputeResult( const bool theMemoryLack, - const bool theNoCompError, - SMESH::compute_error_array_var& theCompErrors, - const bool theNoHypoError, - const QString& theHypErrors ) + const bool theNoCompError, + SMESH::compute_error_array_var& theCompErrors, + const bool theNoHypoError, + const QString& theHypErrors ) { bool hasShape = myMesh->HasShapeToMesh(); SMESHGUI_ComputeDlg* aCompDlg = computeDlg(); @@ -855,29 +855,29 @@ void SMESHGUI_BaseComputeOp::showComputeResult( const bool theMemoryLack, { SMESH::ComputeError & err = theCompErrors[ row ]; - QString text = err.algoName.in(); - if ( !tbl->item( row, COL_ALGO ) ) tbl->setItem( row, COL_ALGO, new QTableWidgetItem( text ) ); - else tbl->item( row, COL_ALGO )->setText( text ); + QString text = err.algoName.in(); + if ( !tbl->item( row, COL_ALGO ) ) tbl->setItem( row, COL_ALGO, new QTableWidgetItem( text ) ); + else tbl->item( row, COL_ALGO )->setText( text ); - text = SMESH::errorText( err.code, err.comment.in() ); - if ( !tbl->item( row, COL_ERROR ) ) tbl->setItem( row, COL_ERROR, new QTableWidgetItem( text ) ); - else tbl->item( row, COL_ERROR )->setText( text ); + text = SMESH::errorText( err.code, err.comment.in() ); + if ( !tbl->item( row, COL_ERROR ) ) tbl->setItem( row, COL_ERROR, new QTableWidgetItem( text ) ); + else tbl->item( row, COL_ERROR )->setText( text ); - text = QString("%1").arg( err.subShapeID ); - if ( !tbl->item( row, COL_SHAPEID ) ) tbl->setItem( row, COL_SHAPEID, new QTableWidgetItem( text ) ); - else tbl->item( row, COL_SHAPEID )->setText( text ); + text = QString("%1").arg( err.subShapeID ); + if ( !tbl->item( row, COL_SHAPEID ) ) tbl->setItem( row, COL_SHAPEID, new QTableWidgetItem( text ) ); + else tbl->item( row, COL_SHAPEID )->setText( text ); text = hasShape ? SMESH::shapeText( err.subShapeID, myMainShape ) : QString(""); - if ( !tbl->item( row, COL_SHAPE ) ) tbl->setItem( row, COL_SHAPE, new QTableWidgetItem( text ) ); - else tbl->item( row, COL_SHAPE )->setText( text ); + if ( !tbl->item( row, COL_SHAPE ) ) tbl->setItem( row, COL_SHAPE, new QTableWidgetItem( text ) ); + else tbl->item( row, COL_SHAPE )->setText( text ); text = ( !hasShape || SMESH::getSubShapeSO( err.subShapeID, myMainShape )) ? "PUBLISHED" : ""; - if ( !tbl->item( row, COL_PUBLISHED ) ) tbl->setItem( row, COL_PUBLISHED, new QTableWidgetItem( text ) ); - else tbl->item( row, COL_PUBLISHED )->setText( text ); // if text=="", "PUBLISH" button enabled + if ( !tbl->item( row, COL_PUBLISHED ) ) tbl->setItem( row, COL_PUBLISHED, new QTableWidgetItem( text ) ); + else tbl->item( row, COL_PUBLISHED )->setText( text ); // if text=="", "PUBLISH" button enabled text = err.hasBadMesh ? "hasBadMesh" : ""; - if ( !tbl->item( row, COL_BAD_MESH ) ) tbl->setItem( row, COL_BAD_MESH, new QTableWidgetItem( text ) ); - else tbl->item( row, COL_BAD_MESH )->setText( text ); + if ( !tbl->item( row, COL_BAD_MESH ) ) tbl->setItem( row, COL_BAD_MESH, new QTableWidgetItem( text ) ); + else tbl->item( row, COL_BAD_MESH )->setText( text ); if ( err.hasBadMesh ) hasBadMesh = true; //tbl->item( row, COL_ERROR )->setWordWrap( true ); // VSR: TODO ??? @@ -1166,6 +1166,8 @@ SMESHGUI_ComputeOp::~SMESHGUI_ComputeOp() void SMESHGUI_ComputeOp::startOperation() { SMESHGUI_BaseComputeOp::startOperation(); + if (myMesh->_is_nil()) + return; computeMesh(); } @@ -1268,6 +1270,8 @@ void SMESHGUI_PrecomputeOp::startOperation() } SMESHGUI_BaseComputeOp::startOperation(); + if (myMesh->_is_nil()) + return; // disconnect slot from preview dialog to have Apply from results of compute operation only disconnect( myDlg, SIGNAL( dlgOk() ), this, SLOT( onOk() ) ); @@ -1377,7 +1381,7 @@ void SMESHGUI_PrecomputeOp::getAssignedAlgos(_PTR(SObject) theMesh, default: break; } if ( !algo->_is_nil() ) - theModeMap[ dim ] = 0; + theModeMap[ dim ] = 0; } } } @@ -1487,7 +1491,7 @@ void SMESHGUI_PrecomputeOp::onPreview() myPreviewDisplayer->SetData( previewRes ); // append shape indeces with computed mesh entities for ( int i = 0, n = aShapesId->length(); i < n; i++ ) - myMapShapeId[ aShapesId[ i ] ] = 0; + myMapShapeId[ aShapesId[ i ] ] = 0; } else myPreviewDisplayer->SetVisibility(false); @@ -1647,6 +1651,8 @@ void SMESHGUI_EvaluateOp::startOperation() { SMESHGUI_BaseComputeOp::evaluateDlg(); SMESHGUI_BaseComputeOp::startOperation(); + if (myMesh->_is_nil()) + return; evaluateMesh(); } @@ -1664,7 +1670,7 @@ LightApp_Dialog* SMESHGUI_EvaluateOp::dlg() const //================================================================================ /*! - * \brief evaluaateMesh() + * \brief evaluateMesh() */ //================================================================================ @@ -1681,9 +1687,12 @@ void SMESHGUI_BaseComputeOp::evaluateMesh() SMESH::long_array_var aRes; _PTR(SObject) aMeshSObj = SMESH::FindSObject(myMesh); + if ( !aMeshSObj ) // IPAL21340 + return; + bool hasShape = myMesh->HasShapeToMesh(); bool shapeOK = myMainShape->_is_nil() ? !hasShape : hasShape; - if ( shapeOK && aMeshSObj ) + if ( shapeOK ) { myCompDlg->myMeshName->setText( aMeshSObj->GetName().c_str() ); SMESH::SMESH_Gen_var gen = getSMESHGUI()->GetSMESHGen(); @@ -1750,16 +1759,16 @@ void SMESHGUI_BaseComputeOp::evaluateMesh() // SHOW RESULTS if ( isShowResultDlg ) showEvaluateResult( aRes, memoryLack, noCompError, aCompErrors, - noHypoError, aHypErrors); + noHypoError, aHypErrors); } void SMESHGUI_BaseComputeOp::showEvaluateResult(const SMESH::long_array& theRes, - const bool theMemoryLack, - const bool theNoCompError, - SMESH::compute_error_array_var& theCompErrors, - const bool theNoHypoError, - const QString& theHypErrors) + const bool theMemoryLack, + const bool theNoCompError, + SMESH::compute_error_array_var& theCompErrors, + const bool theNoHypoError, + const QString& theHypErrors) { bool hasShape = myMesh->HasShapeToMesh(); SMESHGUI_ComputeDlg* aCompDlg = evaluateDlg(); @@ -1816,29 +1825,29 @@ void SMESHGUI_BaseComputeOp::showEvaluateResult(const SMESH::long_array& theRes, { SMESH::ComputeError & err = theCompErrors[ row ]; - QString text = err.algoName.in(); - if ( !tbl->item( row, COL_ALGO ) ) tbl->setItem( row, COL_ALGO, new QTableWidgetItem( text ) ); - else tbl->item( row, COL_ALGO )->setText( text ); + QString text = err.algoName.in(); + if ( !tbl->item( row, COL_ALGO ) ) tbl->setItem( row, COL_ALGO, new QTableWidgetItem( text ) ); + else tbl->item( row, COL_ALGO )->setText( text ); - text = SMESH::errorText( err.code, err.comment.in() ); - if ( !tbl->item( row, COL_ERROR ) ) tbl->setItem( row, COL_ERROR, new QTableWidgetItem( text ) ); - else tbl->item( row, COL_ERROR )->setText( text ); + text = SMESH::errorText( err.code, err.comment.in() ); + if ( !tbl->item( row, COL_ERROR ) ) tbl->setItem( row, COL_ERROR, new QTableWidgetItem( text ) ); + else tbl->item( row, COL_ERROR )->setText( text ); - text = QString("%1").arg( err.subShapeID ); - if ( !tbl->item( row, COL_SHAPEID ) ) tbl->setItem( row, COL_SHAPEID, new QTableWidgetItem( text ) ); - else tbl->item( row, COL_SHAPEID )->setText( text ); + text = QString("%1").arg( err.subShapeID ); + if ( !tbl->item( row, COL_SHAPEID ) ) tbl->setItem( row, COL_SHAPEID, new QTableWidgetItem( text ) ); + else tbl->item( row, COL_SHAPEID )->setText( text ); text = hasShape ? SMESH::shapeText( err.subShapeID, myMainShape ) : QString(""); - if ( !tbl->item( row, COL_SHAPE ) ) tbl->setItem( row, COL_SHAPE, new QTableWidgetItem( text ) ); - else tbl->item( row, COL_SHAPE )->setText( text ); + if ( !tbl->item( row, COL_SHAPE ) ) tbl->setItem( row, COL_SHAPE, new QTableWidgetItem( text ) ); + else tbl->item( row, COL_SHAPE )->setText( text ); text = ( !hasShape || SMESH::getSubShapeSO( err.subShapeID, myMainShape )) ? "PUBLISHED" : ""; - if ( !tbl->item( row, COL_PUBLISHED ) ) tbl->setItem( row, COL_PUBLISHED, new QTableWidgetItem( text ) ); - else tbl->item( row, COL_PUBLISHED )->setText( text ); // if text=="", "PUBLISH" button enabled + if ( !tbl->item( row, COL_PUBLISHED ) ) tbl->setItem( row, COL_PUBLISHED, new QTableWidgetItem( text ) ); + else tbl->item( row, COL_PUBLISHED )->setText( text ); // if text=="", "PUBLISH" button enabled text = err.hasBadMesh ? "hasBadMesh" : ""; - if ( !tbl->item( row, COL_BAD_MESH ) ) tbl->setItem( row, COL_BAD_MESH, new QTableWidgetItem( text ) ); - else tbl->item( row, COL_BAD_MESH )->setText( text ); + if ( !tbl->item( row, COL_BAD_MESH ) ) tbl->setItem( row, COL_BAD_MESH, new QTableWidgetItem( text ) ); + else tbl->item( row, COL_BAD_MESH )->setText( text ); if ( err.hasBadMesh ) hasBadMesh = true; //tbl->item( row, COL_ERROR )->setWordWrap( true ); // VSR: TODO ??? diff --git a/src/SMESHGUI/SMESHGUI_ComputeDlg.h b/src/SMESHGUI/SMESHGUI_ComputeDlg.h index 85102f3b1..858cb0b48 100644 --- a/src/SMESHGUI/SMESHGUI_ComputeDlg.h +++ b/src/SMESHGUI/SMESHGUI_ComputeDlg.h @@ -79,18 +79,18 @@ protected: SMESHGUI_ComputeDlg* computeDlg() const; void computeMesh(); void showComputeResult( const bool, - const bool, - SMESH::compute_error_array_var&, - const bool, - const QString& ); + const bool, + SMESH::compute_error_array_var&, + const bool, + const QString& ); SMESHGUI_ComputeDlg* evaluateDlg() const; void evaluateMesh(); void showEvaluateResult(const SMESH::long_array& theRes, - const bool, - const bool, - SMESH::compute_error_array_var&, - const bool, - const QString&); + const bool, + const bool, + SMESH::compute_error_array_var&, + const bool, + const QString&); protected slots: virtual bool onApply(); diff --git a/src/SMESHGUI/SMESHGUI_ConvToQuadOp.cxx b/src/SMESHGUI/SMESHGUI_ConvToQuadOp.cxx index 962b11abd..15a6d8ff8 100644 --- a/src/SMESHGUI/SMESHGUI_ConvToQuadOp.cxx +++ b/src/SMESHGUI/SMESHGUI_ConvToQuadOp.cxx @@ -32,9 +32,10 @@ #include // SALOME GUI includes -#include -#include #include +#include +#include +#include // IDL includes #include @@ -176,6 +177,7 @@ SUIT_SelectionFilter* SMESHGUI_ConvToQuadOp::createFilter( const int theId ) con //================================================================================ bool SMESHGUI_ConvToQuadOp::onApply() { + SUIT_OverrideCursor aWaitCursor; QString aMess; @@ -185,7 +187,7 @@ bool SMESHGUI_ConvToQuadOp::onApply() { dlg()->show(); SUIT_MessageBox::warning( myDlg, - tr( "SMESH_WRN_WARNING" ), tr("MESH_IS_NOT_SELECTED") ); + tr( "SMESH_WRN_WARNING" ), tr("MESH_IS_NOT_SELECTED") ); return false; } @@ -196,7 +198,7 @@ bool SMESHGUI_ConvToQuadOp::onApply() if( CORBA::is_nil(mesh) ) { SUIT_MessageBox::warning( myDlg, - tr( "SMESH_WRN_WARNING" ), tr("REF_IS_NULL") ); + tr( "SMESH_WRN_WARNING" ), tr("REF_IS_NULL") ); return false; } @@ -210,7 +212,7 @@ bool SMESHGUI_ConvToQuadOp::onApply() { bool aParam = true; if( myDlg->IsEnabledCheck() ) - aParam = myDlg->IsMediumNdsOnGeom(); + aParam = myDlg->IsMediumNdsOnGeom(); aEditor->ConvertToQuadratic( aParam ); aResult = true; diff --git a/src/SMESHGUI/SMESHGUI_CreatePatternDlg.cxx b/src/SMESHGUI/SMESHGUI_CreatePatternDlg.cxx index e50b7048c..5ee6ade48 100755 --- a/src/SMESHGUI/SMESHGUI_CreatePatternDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_CreatePatternDlg.cxx @@ -193,11 +193,11 @@ QWidget* SMESHGUI_CreatePatternDlg::createMainFrame( QWidget* theParent ) // Connect signals and slots connect( myTypeGrp, SIGNAL( buttonClicked( int ) ), - this, SLOT( onTypeChanged( int ) ) ); + this, SLOT( onTypeChanged( int ) ) ); connect( myProjectChk, SIGNAL( toggled( bool ) ), - this, SLOT( onProject( bool ) ) ); + this, SLOT( onProject( bool ) ) ); connect( aSelBtn, SIGNAL( clicked() ), - this, SLOT( onSelBtnClicked() ) ); + this, SLOT( onSelBtnClicked() ) ); return aMainGrp; } @@ -274,11 +274,11 @@ void SMESHGUI_CreatePatternDlg::Init( const int theType ) // selection and SMESHGUI connect( mySelectionMgr, SIGNAL( currentSelectionChanged() ), - this, SLOT( onSelectionDone() ) ); + this, SLOT( onSelectionDone() ) ); connect( mySMESHGUI, SIGNAL( SignalDeactivateActiveDialog() ), - this, SLOT( onDeactivate() ) ); + this, SLOT( onDeactivate() ) ); connect( mySMESHGUI, SIGNAL( SignalCloseAllDialogs() ), - this, SLOT( onClose() ) ); + this, SLOT( onClose() ) ); mySwitch2d->setEnabled( theType == Type_2d ); mySwitch3d->setEnabled( theType == Type_3d ); @@ -342,8 +342,8 @@ bool SMESHGUI_CreatePatternDlg::isValid() { if ( myGeomObj->_is_nil() ) { SUIT_MessageBox::information( this, - tr( "SMESH_INSUFFICIENT_DATA" ), - tr( "SMESHGUI_INVALID_PARAMETERS" ) ); + tr( "SMESH_INSUFFICIENT_DATA" ), + tr( "SMESHGUI_INVALID_PARAMETERS" ) ); return false; } return true; @@ -406,13 +406,13 @@ void SMESHGUI_CreatePatternDlg::onSave() if ( aWritten != aLen ) { SUIT_MessageBox::information( this, - tr( "SMESH_ERROR" ), - tr( "ERROR_OF_SAVING" ) ); + tr( "SMESH_ERROR" ), + tr( "ERROR_OF_SAVING" ) ); } else { //SUIT_Application::getDesktop()->setSelectionModes(ActorSelection); if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ) ) - aViewWindow->SetSelectionMode( ActorSelection ); + aViewWindow->SetSelectionMode( ActorSelection ); disconnect( mySelectionMgr, 0, this, 0 ); disconnect( mySMESHGUI, 0, this, 0 ); mySMESHGUI->ResetState(); @@ -465,7 +465,7 @@ void SMESHGUI_CreatePatternDlg::onOk() else { //SUIT_Application::getDesktop()->setSelectionModes(ActorSelection); if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI ) ) - aViewWindow->SetSelectionMode( ActorSelection ); + aViewWindow->SetSelectionMode( ActorSelection ); disconnect( mySelectionMgr, 0, this, 0 ); disconnect( mySMESHGUI, 0, this, 0 ); mySMESHGUI->ResetState(); @@ -512,11 +512,11 @@ void SMESHGUI_CreatePatternDlg::onHelp() platform = "application"; #endif SUIT_MessageBox::warning( this, - tr( "WRN_WARNING" ), - tr( "EXTERNAL_BROWSER_CANNOT_SHOW_PAGE" ). - arg( app->resourceMgr()->stringValue( "ExternalBrowser", - platform ) ). - arg( myHelpFileName ) ); + tr( "WRN_WARNING" ), + tr( "EXTERNAL_BROWSER_CANNOT_SHOW_PAGE" ). + arg( app->resourceMgr()->stringValue( "ExternalBrowser", + platform ) ). + arg( myHelpFileName ) ); } } @@ -754,20 +754,20 @@ void SMESHGUI_CreatePatternDlg::activateSelection() if ( myType == Type_2d ) { mySelectionMgr->installFilter( new SMESH_NumberFilter( "SMESH", - TopAbs_SHAPE, - -1, - TopAbs_FACE ) ); + TopAbs_SHAPE, + -1, + TopAbs_FACE ) ); } else { TColStd_MapOfInteger aTypes; aTypes.Add( TopAbs_SHELL ); aTypes.Add( TopAbs_SOLID ); mySelectionMgr->installFilter( new SMESH_NumberFilter( "SMESH", - TopAbs_FACE, - 6, - aTypes, - GEOM::GEOM_Object::_nil(), - true ) ); + TopAbs_FACE, + 6, + aTypes, + GEOM::GEOM_Object::_nil(), + true ) ); } } diff --git a/src/SMESHGUI/SMESHGUI_CreatePolyhedralVolumeDlg.cxx b/src/SMESHGUI/SMESHGUI_CreatePolyhedralVolumeDlg.cxx index a9736fd61..c62b83711 100644 --- a/src/SMESHGUI/SMESHGUI_CreatePolyhedralVolumeDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_CreatePolyhedralVolumeDlg.cxx @@ -129,9 +129,9 @@ namespace SMESH typedef std::vector TVTKIds; void SetPosition(SMESH_Actor* theActor, - vtkIdType theType, - const TVTKIds& theIds, - bool theReset=true) + vtkIdType theType, + const TVTKIds& theIds, + bool theReset=true) { vtkUnstructuredGrid *aGrid = theActor->GetUnstructuredGrid(); myGrid->SetPoints(aGrid->GetPoints()); @@ -141,14 +141,14 @@ namespace SMESH vtkIdList *anIds = vtkIdList::New(); for (int i = 0, iEnd = theIds.size(); i < iEnd; i++) - anIds->InsertId(i,theIds[i]); + anIds->InsertId(i,theIds[i]); myGrid->InsertNextCell(theType,anIds); if(theIds.size()!=0){ - myGrid->InsertNextCell(theType,anIds); - myGrid->Modified(); + myGrid->InsertNextCell(theType,anIds); + myGrid->Modified(); } - + anIds->Delete(); SetVisibility(true); @@ -167,7 +167,7 @@ namespace SMESH ~TPolySimulation(){ if( myViewWindow ) - myViewWindow->RemoveActor(myPreviewActor); + myViewWindow->RemoveActor(myPreviewActor); myPreviewActor->Delete(); @@ -358,42 +358,42 @@ void SMESHGUI_CreatePolyhedralVolumeDlg::ConstructorsClicked(int constructorId) { case 0 : { - if ( myActor ){ + if ( myActor ){ myActor->SetPointRepresentation(true); - } + } else SMESH::SetPointRepresentation(true); - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(NodeSelection); - - AddButton->setEnabled(false); - RemoveButton->setEnabled(false); - TextLabelIds->setText( tr( "SMESH_ID_NODES" ) ); - myFacesByNodesLabel->show(); - myFacesByNodes->clear(); - myFacesByNodes->show(); - AddButton->show(); - RemoveButton->show(); - Preview->show(); - break; + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) + aViewWindow->SetSelectionMode(NodeSelection); + + AddButton->setEnabled(false); + RemoveButton->setEnabled(false); + TextLabelIds->setText( tr( "SMESH_ID_NODES" ) ); + myFacesByNodesLabel->show(); + myFacesByNodes->clear(); + myFacesByNodes->show(); + AddButton->show(); + RemoveButton->show(); + Preview->show(); + break; } case 1 : { - if( myActor ){ - myActor->SetPointRepresentation(false); - } else { - SMESH::SetPointRepresentation(false); - } - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(FaceSelection); - - TextLabelIds->setText( tr( "SMESH_ID_FACES" ) ); - myFacesByNodesLabel->hide(); - myFacesByNodes->hide(); - AddButton->hide(); - RemoveButton->hide(); - Preview->show(); - break; + if( myActor ){ + myActor->SetPointRepresentation(false); + } else { + SMESH::SetPointRepresentation(false); + } + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) + aViewWindow->SetSelectionMode(FaceSelection); + + TextLabelIds->setText( tr( "SMESH_ID_FACES" ) ); + myFacesByNodesLabel->hide(); + myFacesByNodes->hide(); + AddButton->hide(); + RemoveButton->hide(); + Preview->show(); + break; } } @@ -425,71 +425,71 @@ void SMESHGUI_CreatePolyhedralVolumeDlg::ClickOnApply() if(checkEditLine(false) == -1) {return;} busy = true; if (GetConstructorId() == 0) - { - SMESH::long_array_var anIdsOfNodes = new SMESH::long_array; - SMESH::long_array_var aQuantities = new SMESH::long_array; - - aQuantities->length( myFacesByNodes->count() ); - - TColStd_ListOfInteger aNodesIds; - - int aNbQuantities = 0; - for (int i = 0; i < myFacesByNodes->count(); i++ ) { - QStringList anIds = myFacesByNodes->item(i)->text().split( " ", QString::SkipEmptyParts ); - for (QStringList::iterator it = anIds.begin(); it != anIds.end(); ++it) - aNodesIds.Append( (*it).toInt() ); - - aQuantities[aNbQuantities++] = anIds.count(); - } - - anIdsOfNodes->length(aNodesIds.Extent()); - - int aNbIdsOfNodes = 0; - TColStd_ListIteratorOfListOfInteger It; - It.Initialize(aNodesIds); - for( ;It.More();It.Next()) - anIdsOfNodes[aNbIdsOfNodes++] = It.Value(); - - try{ - SUIT_OverrideCursor aWaitCursor; - SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditor(); - aMeshEditor->AddPolyhedralVolume(anIdsOfNodes, aQuantities); - }catch(SALOME::SALOME_Exception& exc){ - INFOS("Follow exception was cought:\n\t"<length( myFacesByNodes->count() ); + + TColStd_ListOfInteger aNodesIds; + + int aNbQuantities = 0; + for (int i = 0; i < myFacesByNodes->count(); i++ ) { + QStringList anIds = myFacesByNodes->item(i)->text().split( " ", QString::SkipEmptyParts ); + for (QStringList::iterator it = anIds.begin(); it != anIds.end(); ++it) + aNodesIds.Append( (*it).toInt() ); + + aQuantities[aNbQuantities++] = anIds.count(); + } + + anIdsOfNodes->length(aNodesIds.Extent()); + + int aNbIdsOfNodes = 0; + TColStd_ListIteratorOfListOfInteger It; + It.Initialize(aNodesIds); + for( ;It.More();It.Next()) + anIdsOfNodes[aNbIdsOfNodes++] = It.Value(); + + try{ + SUIT_OverrideCursor aWaitCursor; + SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditor(); + aMeshEditor->AddPolyhedralVolume(anIdsOfNodes, aQuantities); + }catch(SALOME::SALOME_Exception& exc){ + INFOS("Follow exception was cought:\n\t"<text().split( " ", QString::SkipEmptyParts ); - anIdsOfFaces->length(aListId.count()); - for ( int i = 0; i < aListId.count(); i++ ) - anIdsOfFaces[i] = aListId[i].toInt(); - - try{ - SUIT_OverrideCursor aWaitCursor; - SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditor(); - aMeshEditor->AddPolyhedralVolumeByFaces(anIdsOfFaces); - }catch(SALOME::SALOME_Exception& exc){ - INFOS("Follow exception was cought:\n\t"<text().split( " ", QString::SkipEmptyParts ); + anIdsOfFaces->length(aListId.count()); + for ( int i = 0; i < aListId.count(); i++ ) + anIdsOfFaces[i] = aListId[i].toInt(); + + try{ + SUIT_OverrideCursor aWaitCursor; + SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditor(); + aMeshEditor->AddPolyhedralVolumeByFaces(anIdsOfFaces); + }catch(SALOME::SALOME_Exception& exc){ + INFOS("Follow exception was cought:\n\t"<setSelectedObjects( aList ); SMESH::UpdateView(); if( myActor ){ - unsigned int anEntityMode = myActor->GetEntityMode(); - myActor->SetEntityMode(SMESH_Actor::eVolumes | anEntityMode); + unsigned int anEntityMode = myActor->GetEntityMode(); + myActor->SetEntityMode(SMESH_Actor::eVolumes | anEntityMode); } //ConstructorsClicked( GetConstructorId() ); busy = false; @@ -507,7 +507,7 @@ void SMESHGUI_CreatePolyhedralVolumeDlg::ClickOnOk() ClickOnCancel(); } - + //================================================================================= // function : ClickOnCancel() // purpose : @@ -543,10 +543,10 @@ void SMESHGUI_CreatePolyhedralVolumeDlg::ClickOnHelp() platform = "application"; #endif SUIT_MessageBox::warning(this, tr("WRN_WARNING"), - tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). - arg(app->resourceMgr()->stringValue("ExternalBrowser", - platform)). - arg(myHelpFileName)); + tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). + arg(app->resourceMgr()->stringValue("ExternalBrowser", + platform)). + arg(myHelpFileName)); } } @@ -570,67 +570,67 @@ void SMESHGUI_CreatePolyhedralVolumeDlg::onTextChange(const QString& theNewText) if (GetConstructorId() == 0) { if ( aMesh ) { - TColStd_MapOfInteger newIndices; + TColStd_MapOfInteger newIndices; - QStringList aListId = theNewText.split( " ", QString::SkipEmptyParts ); - for ( int i = 0; i < aListId.count(); i++ ) { - const SMDS_MeshNode * n = aMesh->FindNode( aListId[ i ].toInt() ); - if ( n ) { - newIndices.Add(n->GetID()); - myNbOkElements++; - } - } + QStringList aListId = theNewText.split( " ", QString::SkipEmptyParts ); + for ( int i = 0; i < aListId.count(); i++ ) { + const SMDS_MeshNode * n = aMesh->FindNode( aListId[ i ].toInt() ); + if ( n ) { + newIndices.Add(n->GetID()); + myNbOkElements++; + } + } - mySelector->AddOrRemoveIndex( myActor->getIO(), newIndices, false ); + mySelector->AddOrRemoveIndex( myActor->getIO(), newIndices, false ); - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->highlight( myActor->getIO(), true, true ); + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) + aViewWindow->highlight( myActor->getIO(), true, true ); - if ( myNbOkElements>0 && aListId.count()>=3) - AddButton->setEnabled(true); - else - AddButton->setEnabled(false); + if ( myNbOkElements>0 && aListId.count()>=3) + AddButton->setEnabled(true); + else + AddButton->setEnabled(false); - displaySimulation(); + displaySimulation(); } } else if (GetConstructorId() == 1) { - myNbOkElements = 0; - buttonOk->setEnabled( false ); - buttonApply->setEnabled( false ); + myNbOkElements = 0; + buttonOk->setEnabled( false ); + buttonApply->setEnabled( false ); - // check entered ids of faces and hilight them - QStringList aListId; - if ( aMesh ) { - TColStd_MapOfInteger newIndices; + // check entered ids of faces and hilight them + QStringList aListId; + if ( aMesh ) { + TColStd_MapOfInteger newIndices; - aListId = theNewText.split( " ", QString::SkipEmptyParts ); - - for ( int i = 0; i < aListId.count(); i++ ) { - const SMDS_MeshElement * e = aMesh->FindElement( aListId[ i ].toInt() ); - if ( e ) { - newIndices.Add(e->GetID()); - myNbOkElements++; - } - } - - mySelector->AddOrRemoveIndex( myActor->getIO(), newIndices, false ); - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->highlight( myActor->getIO(), true, true ); + aListId = theNewText.split( " ", QString::SkipEmptyParts ); + + for ( int i = 0; i < aListId.count(); i++ ) { + const SMDS_MeshElement * e = aMesh->FindElement( aListId[ i ].toInt() ); + if ( e ) { + newIndices.Add(e->GetID()); + myNbOkElements++; + } + } + + mySelector->AddOrRemoveIndex( myActor->getIO(), newIndices, false ); + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) + aViewWindow->highlight( myActor->getIO(), true, true ); - if ( myNbOkElements ) { - if (aListId.count()>1){ - buttonOk->setEnabled( true ); - buttonApply->setEnabled( true ); - } - else{ - buttonOk->setEnabled( false ); - buttonApply->setEnabled( false ); - } - if(aListId.count()>1) - displaySimulation(); - } - } + if ( myNbOkElements ) { + if (aListId.count()>1){ + buttonOk->setEnabled( true ); + buttonApply->setEnabled( true ); + } + else{ + buttonOk->setEnabled( false ); + buttonApply->setEnabled( false ); + } + if(aListId.count()>1) + displaySimulation(); + } + } } busy = false; } @@ -749,13 +749,13 @@ int SMESHGUI_CreatePolyhedralVolumeDlg::checkEditLine(bool checkLast) case 0:{ // nodes const SMDS_MeshNode * aNode = aMesh->FindNode( aListId[ i ].toInt() ); if( !aNode ){ - SUIT_MessageBox::warning(this, - tr("SMESH_POLYEDRE_CREATE_ERROR"), - tr("The incorrect indices of nodes!")); - - myEditCurrentArgument->clear(); - myEditCurrentArgument->setText( aString ); - return -1; + SUIT_MessageBox::warning(this, + tr("SMESH_POLYEDRE_CREATE_ERROR"), + tr("The incorrect indices of nodes!")); + + myEditCurrentArgument->clear(); + myEditCurrentArgument->setText( aString ); + return -1; } break; @@ -764,24 +764,24 @@ int SMESHGUI_CreatePolyhedralVolumeDlg::checkEditLine(bool checkLast) bool aElemIsOK = true; const SMDS_MeshElement * aElem = aMesh->FindElement( aListId[ i ].toInt() ); if (!aElem) - { - aElemIsOK = false; - } + { + aElemIsOK = false; + } else - { - SMDSAbs_ElementType aType = aMesh->GetElementType( aElem->GetID(),true ); - if (aType != SMDSAbs_Face){ - aElemIsOK = false; - } - } + { + SMDSAbs_ElementType aType = aMesh->GetElementType( aElem->GetID(),true ); + if (aType != SMDSAbs_Face){ + aElemIsOK = false; + } + } if (!aElemIsOK){ - SUIT_MessageBox::warning(this, - tr("SMESH_POLYEDRE_CREATE_ERROR"), - tr("The incorrect indices of faces!")); - - myEditCurrentArgument->clear(); - myEditCurrentArgument->setText( aString ); - return -1; + SUIT_MessageBox::warning(this, + tr("SMESH_POLYEDRE_CREATE_ERROR"), + tr("The incorrect indices of faces!")); + + myEditCurrentArgument->clear(); + myEditCurrentArgument->setText( aString ); + return -1; } break; } @@ -804,66 +804,66 @@ void SMESHGUI_CreatePolyhedralVolumeDlg::displaySimulation() vtkIdType aType = VTK_CONVEX_POINT_SET; SMDS_Mesh* aMesh = 0; if ( myActor ){ - aMesh = myActor->GetObject()->GetMesh(); + aMesh = myActor->GetObject()->GetMesh(); } if (GetConstructorId() == 0 && aMesh){ - if (!AddButton->isEnabled()){ - mySimulation->ResetGrid(true); - for (int i = 0; i < myFacesByNodes->count(); i++) { - QStringList anIds = myFacesByNodes->item(i)->text().split( " ", QString::SkipEmptyParts ); - SMESH::TPolySimulation::TVTKIds aVTKIds_faces; - for (QStringList::iterator it = anIds.begin(); it != anIds.end(); ++it){ - const SMDS_MeshNode* aNode = aMesh->FindNode( (*it).toInt() ); - if (!aNode) continue; - vtkIdType aId = myActor->GetObject()->GetNodeVTKId( (*it).toInt() ); - aVTKIds.push_back(aId); - aVTKIds_faces.push_back(aId); - } - if(!Preview->isChecked()){ - aType = VTK_POLYGON; - mySimulation->SetPosition(myActor, aType, aVTKIds_faces,false); - } - } - if(myFacesByNodes->count() == 0){ - mySimulation->SetVisibility(false); - } else { - mySimulation->SetVisibility(true); - } - if(Preview->isChecked()){ - mySimulation->SetPosition(myActor, aType, aVTKIds); - } - } else { - // add ids from edit line - QStringList anEditIds = myEditCurrentArgument->text().split( " ", QString::SkipEmptyParts ); - for ( int i = 0; i < anEditIds.count(); i++ ) - aVTKIds.push_back( myActor->GetObject()->GetNodeVTKId( anEditIds[ i ].toInt() )); - aType = VTK_POLYGON; - mySimulation->SetPosition(myActor, aType, aVTKIds); - } + if (!AddButton->isEnabled()){ + mySimulation->ResetGrid(true); + for (int i = 0; i < myFacesByNodes->count(); i++) { + QStringList anIds = myFacesByNodes->item(i)->text().split( " ", QString::SkipEmptyParts ); + SMESH::TPolySimulation::TVTKIds aVTKIds_faces; + for (QStringList::iterator it = anIds.begin(); it != anIds.end(); ++it){ + const SMDS_MeshNode* aNode = aMesh->FindNode( (*it).toInt() ); + if (!aNode) continue; + vtkIdType aId = myActor->GetObject()->GetNodeVTKId( (*it).toInt() ); + aVTKIds.push_back(aId); + aVTKIds_faces.push_back(aId); + } + if(!Preview->isChecked()){ + aType = VTK_POLYGON; + mySimulation->SetPosition(myActor, aType, aVTKIds_faces,false); + } + } + if(myFacesByNodes->count() == 0){ + mySimulation->SetVisibility(false); + } else { + mySimulation->SetVisibility(true); + } + if(Preview->isChecked()){ + mySimulation->SetPosition(myActor, aType, aVTKIds); + } + } else { + // add ids from edit line + QStringList anEditIds = myEditCurrentArgument->text().split( " ", QString::SkipEmptyParts ); + for ( int i = 0; i < anEditIds.count(); i++ ) + aVTKIds.push_back( myActor->GetObject()->GetNodeVTKId( anEditIds[ i ].toInt() )); + aType = VTK_POLYGON; + mySimulation->SetPosition(myActor, aType, aVTKIds); + } }else if(GetConstructorId() == 1 && aMesh){ - QStringList aListId = myEditCurrentArgument->text().split( " ", QString::SkipEmptyParts ); - for ( int i = 0; i < aListId.count(); i++ ) - { - const SMDS_MeshElement * anElem = aMesh->FindElement( aListId[ i ].toInt() ); - if ( !anElem ) continue; - SMDSAbs_ElementType aFaceType = aMesh->GetElementType( anElem->GetID(),true ); - if (aFaceType != SMDSAbs_Face) continue; - - SMDS_ElemIteratorPtr anIter = anElem->nodesIterator(); - SMESH::TPolySimulation::TVTKIds aVTKIds_faces; - while( anIter->more() ) - if ( const SMDS_MeshNode* aNode = (SMDS_MeshNode*)anIter->next() ){ - vtkIdType aId = myActor->GetObject()->GetNodeVTKId( aNode->GetID() ); - aVTKIds.push_back(aId); - aVTKIds_faces.push_back(aId); - } - if(!Preview->isChecked()){ - aType = VTK_POLYGON; - mySimulation->SetPosition(myActor, aType, aVTKIds_faces); - } - } - if(Preview->isChecked()) - mySimulation->SetPosition(myActor, aType, aVTKIds); + QStringList aListId = myEditCurrentArgument->text().split( " ", QString::SkipEmptyParts ); + for ( int i = 0; i < aListId.count(); i++ ) + { + const SMDS_MeshElement * anElem = aMesh->FindElement( aListId[ i ].toInt() ); + if ( !anElem ) continue; + SMDSAbs_ElementType aFaceType = aMesh->GetElementType( anElem->GetID(),true ); + if (aFaceType != SMDSAbs_Face) continue; + + SMDS_ElemIteratorPtr anIter = anElem->nodesIterator(); + SMESH::TPolySimulation::TVTKIds aVTKIds_faces; + while( anIter->more() ) + if ( const SMDS_MeshNode* aNode = (SMDS_MeshNode*)anIter->next() ){ + vtkIdType aId = myActor->GetObject()->GetNodeVTKId( aNode->GetID() ); + aVTKIds.push_back(aId); + aVTKIds_faces.push_back(aId); + } + if(!Preview->isChecked()){ + aType = VTK_POLYGON; + mySimulation->SetPosition(myActor, aType, aVTKIds_faces); + } + } + if(Preview->isChecked()) + mySimulation->SetPosition(myActor, aType, aVTKIds); } SMESH::UpdateView(); } diff --git a/src/SMESHGUI/SMESHGUI_DeleteGroupDlg.cxx b/src/SMESHGUI/SMESHGUI_DeleteGroupDlg.cxx index 6e2a106a2..1922e70de 100644 --- a/src/SMESHGUI/SMESHGUI_DeleteGroupDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_DeleteGroupDlg.cxx @@ -189,7 +189,7 @@ bool SMESHGUI_DeleteGroupDlg::isValid() { if (myListBox->count() == 0) { SUIT_MessageBox::information(SMESHGUI::desktop(), tr("SMESH_INSUFFICIENT_DATA"), - tr("NO_SELECTED_GROUPS")); + tr("NO_SELECTED_GROUPS")); return false; } @@ -266,10 +266,10 @@ void SMESHGUI_DeleteGroupDlg::onHelp() platform = "application"; #endif SUIT_MessageBox::warning(this, tr("WRN_WARNING"), - tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). - arg(app->resourceMgr()->stringValue("ExternalBrowser", - platform)). - arg(myHelpFileName)); + tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). + arg(app->resourceMgr()->stringValue("ExternalBrowser", + platform)). + arg(myHelpFileName)); } } diff --git a/src/SMESHGUI/SMESHGUI_Dialog.h b/src/SMESHGUI/SMESHGUI_Dialog.h index 7da64f71e..eb60f800b 100644 --- a/src/SMESHGUI/SMESHGUI_Dialog.h +++ b/src/SMESHGUI/SMESHGUI_Dialog.h @@ -44,8 +44,8 @@ class SMESHGUI_EXPORT SMESHGUI_Dialog : public LightApp_Dialog Q_OBJECT public: - SMESHGUI_Dialog( QWidget* = 0, const bool = false, const bool = false, - const int = OK | Close | Apply | Help ); + SMESHGUI_Dialog( QWidget* = 0, const bool modal = false, const bool allowResize = false, + const int = OK | Close | Apply | Help ); virtual ~SMESHGUI_Dialog(); virtual void show(); diff --git a/src/SMESHGUI/SMESHGUI_Displayer.cxx b/src/SMESHGUI/SMESHGUI_Displayer.cxx index 613fbb9e4..0b41a00d0 100644 --- a/src/SMESHGUI/SMESHGUI_Displayer.cxx +++ b/src/SMESHGUI/SMESHGUI_Displayer.cxx @@ -59,16 +59,16 @@ SALOME_Prs* SMESHGUI_Displayer::buildPresentation( const QString& entry, SALOME_ SUIT_ViewWindow* wnd = vtk_viewer->getViewManager()->getActiveView(); SMESH_Actor* anActor = SMESH::FindActorByEntry( wnd, entry.toLatin1().data() ); if( !anActor ) - anActor = SMESH::CreateActor( study()->studyDS(), entry.toLatin1().data(), true ); + anActor = SMESH::CreateActor( study()->studyDS(), entry.toLatin1().data(), true ); if( anActor ) { - SMESH::DisplayActor( wnd, anActor ); + SMESH::DisplayActor( wnd, anActor ); prs = LightApp_Displayer::buildPresentation( entry.toLatin1().data(), aViewFrame ); } if( prs ) - UpdatePrs( prs ); + UpdatePrs( prs ); else if( anActor ) - SMESH::RemoveActor( vtk_viewer->getViewManager()->getActiveView(), anActor ); + SMESH::RemoveActor( vtk_viewer->getViewManager()->getActiveView(), anActor ); } } diff --git a/src/SMESHGUI/SMESHGUI_EditMeshDlg.cxx b/src/SMESHGUI/SMESHGUI_EditMeshDlg.cxx index c8aa3710d..5c84c204b 100644 --- a/src/SMESHGUI/SMESHGUI_EditMeshDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_EditMeshDlg.cxx @@ -169,7 +169,7 @@ namespace SMESH } void SetPointsData ( SMDS_Mesh* theMesh, - TColStd_MapOfInteger & theNodesIdMap ) + TColStd_MapOfInteger & theNodesIdMap ) { vtkPoints* aPoints = vtkPoints::New(); aPoints->SetNumberOfPoints(theNodesIdMap.Extent()); @@ -177,9 +177,9 @@ namespace SMESH TColStd_MapIteratorOfMapOfInteger idIter( theNodesIdMap ); for( int i = 0; idIter.More(); idIter.Next(), i++ ) { - const SMDS_MeshNode* aNode = theMesh->FindNode(idIter.Key()); - aPoints->SetPoint( i, aNode->X(), aNode->Y(), aNode->Z() ); - myIDs.push_back(idIter.Key()); + const SMDS_MeshNode* aNode = theMesh->FindNode(idIter.Key()); + aPoints->SetPoint( i, aNode->X(), aNode->Y(), aNode->Z() ); + myIDs.push_back(idIter.Key()); } myIdGrid->SetPoints(aPoints); @@ -190,7 +190,7 @@ namespace SMESH } void SetElemsData( TColStd_MapOfInteger & theElemsIdMap, - std::list & aGrCentersXYZ ) + std::list & aGrCentersXYZ ) { vtkPoints* aPoints = vtkPoints::New(); aPoints->SetNumberOfPoints(theElemsIdMap.Extent()); @@ -198,14 +198,14 @@ namespace SMESH TColStd_MapIteratorOfMapOfInteger idIter( theElemsIdMap ); for( ; idIter.More(); idIter.Next() ) { - myIDs.push_back(idIter.Key()); + myIDs.push_back(idIter.Key()); } gp_XYZ aXYZ; std::list::iterator coordIt = aGrCentersXYZ.begin(); for( int i = 0; coordIt != aGrCentersXYZ.end(); coordIt++, i++ ) { - aXYZ = *coordIt; - aPoints->SetPoint( i, aXYZ.X(), aXYZ.Y(), aXYZ.Z() ); + aXYZ = *coordIt; + aPoints->SetPoint( i, aXYZ.X(), aXYZ.Y(), aXYZ.Z() ); } myIdGrid->SetPoints(aPoints); aPoints->Delete(); @@ -234,20 +234,20 @@ namespace SMESH myIsPointsLabeled = theIsPointsLabeled && myIdGrid->GetNumberOfPoints(); if ( myIsPointsLabeled ) { - myPointsNumDataSet->ShallowCopy(myIdGrid); - vtkDataSet *aDataSet = myPointsNumDataSet; - int aNbElem = myIDs.size(); - vtkIntArray *anArray = vtkIntArray::New(); - anArray->SetNumberOfValues( aNbElem ); - for ( int i = 0; i < aNbElem; i++ ) - anArray->SetValue( i, myIDs[i] ); - aDataSet->GetPointData()->SetScalars( anArray ); - anArray->Delete(); - myPtsMaskPoints->SetInput( aDataSet ); - myPointLabels->SetVisibility( theIsActorVisible ); + myPointsNumDataSet->ShallowCopy(myIdGrid); + vtkDataSet *aDataSet = myPointsNumDataSet; + int aNbElem = myIDs.size(); + vtkIntArray *anArray = vtkIntArray::New(); + anArray->SetNumberOfValues( aNbElem ); + for ( int i = 0; i < aNbElem; i++ ) + anArray->SetValue( i, myIDs[i] ); + aDataSet->GetPointData()->SetScalars( anArray ); + anArray->Delete(); + myPtsMaskPoints->SetInput( aDataSet ); + myPointLabels->SetVisibility( theIsActorVisible ); } else { - myPointLabels->SetVisibility( false ); + myPointLabels->SetVisibility( false ); } } @@ -270,7 +270,7 @@ namespace SMESH //myPtsSelectVisiblePoints->UnRegisterAllOutputs(); //vtk 5.0 porting myPtsSelectVisiblePoints->Delete(); - //myPtsMaskPoints->UnRegisterAllOutputs(); //vtk 5.0 porting + //myPtsMaskPoints->UnRegisterAllOutputs(); //vtk 5.0 porting myPtsMaskPoints->Delete(); myPointLabels->Delete(); @@ -282,8 +282,8 @@ namespace SMESH static const char * IconFirst[] = { "18 10 2 1", -" g None", -". g #000000", +" g None", +". g #000000", " . . ", " .. .. .. ", " .. ... ... ", @@ -300,7 +300,7 @@ static const char * IconFirst[] = { // purpose : //================================================================================= SMESHGUI_EditMeshDlg::SMESHGUI_EditMeshDlg (SMESHGUI* theModule, - int theAction) + int theAction) : QDialog(SMESH::GetDesktop(theModule)), mySMESHGUI(theModule), mySelectionMgr(SMESH::GetSelectionMgr(theModule)), @@ -327,9 +327,9 @@ SMESHGUI_EditMeshDlg::SMESHGUI_EditMeshDlg (SMESHGUI* theModule, /***************************************************************/ GroupConstructors = new QGroupBox(myAction == 1 ? - tr("SMESH_MERGE_ELEMENTS") : - tr("SMESH_MERGE_NODES"), - this); + tr("SMESH_MERGE_ELEMENTS") : + tr("SMESH_MERGE_NODES"), + this); QButtonGroup* ButtonGroup = new QButtonGroup(this); QHBoxLayout* GroupConstructorsLayout = new QHBoxLayout(GroupConstructors); @@ -362,9 +362,9 @@ SMESHGUI_EditMeshDlg::SMESHGUI_EditMeshDlg (SMESHGUI* theModule, /***************************************************************/ // Controls for coincident elements detecting GroupCoincident = new QGroupBox(myAction == 1 ? - tr("COINCIDENT_ELEMENTS") : - tr("COINCIDENT_NODES"), - this); + tr("COINCIDENT_ELEMENTS") : + tr("COINCIDENT_NODES"), + this); QGridLayout* GroupCoincidentLayout = new QGridLayout(GroupCoincident); GroupCoincidentLayout->setSpacing(SPACING); @@ -542,7 +542,7 @@ void SMESHGUI_EditMeshDlg::Init() // purpose : //================================================================================= void SMESHGUI_EditMeshDlg::FindGravityCenter(TColStd_MapOfInteger & theElemsIdMap, - std::list< gp_XYZ > & theGrCentersXYZ) + std::list< gp_XYZ > & theGrCentersXYZ) { if (!myActor) return; @@ -659,10 +659,10 @@ void SMESHGUI_EditMeshDlg::ClickOnHelp() platform = "application"; #endif SUIT_MessageBox::warning(this, tr("WRN_WARNING"), - tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). - arg(app->resourceMgr()->stringValue("ExternalBrowser", - platform)). - arg(myHelpFileName)); + tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). + arg(app->resourceMgr()->stringValue("ExternalBrowser", + platform)). + arg(myHelpFileName)); } } @@ -722,15 +722,15 @@ void SMESHGUI_EditMeshDlg::onDetect() switch (myAction) { case 0 : if(!mySubMeshOrGroup->_is_nil()) - aMeshEditor->FindCoincidentNodesOnPart(mySubMeshOrGroup, SpinBoxTolerance->GetValue(), aGroupsArray); + aMeshEditor->FindCoincidentNodesOnPart(mySubMeshOrGroup, SpinBoxTolerance->GetValue(), aGroupsArray); else - aMeshEditor->FindCoincidentNodes(SpinBoxTolerance->GetValue(), aGroupsArray); + aMeshEditor->FindCoincidentNodes(SpinBoxTolerance->GetValue(), aGroupsArray); break; case 1 : if(!mySubMeshOrGroup->_is_nil()) - aMeshEditor->FindEqualElements(mySubMeshOrGroup, aGroupsArray); + aMeshEditor->FindEqualElements(mySubMeshOrGroup, aGroupsArray); else - aMeshEditor->FindEqualElements(myMesh, aGroupsArray); + aMeshEditor->FindEqualElements(myMesh, aGroupsArray); break; } @@ -739,7 +739,7 @@ void SMESHGUI_EditMeshDlg::onDetect() QStringList anIDs; for (int j = 0; j < aGroup.length(); j++) - anIDs.append(QString::number(aGroup[j])); + anIDs.append(QString::number(aGroup[j])); ListCoincident->addItem(anIDs.join(" ")); } @@ -1044,11 +1044,11 @@ void SMESHGUI_EditMeshDlg::SelectionIntoArgument() if (myAction == 0) { SMESH::SetPointRepresentation(true); if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(NodeSelection); + aViewWindow->SetSelectionMode(NodeSelection); } else if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(CellSelection); + aViewWindow->SetSelectionMode(CellSelection); } } diff --git a/src/SMESHGUI/SMESHGUI_EditMeshDlg.h b/src/SMESHGUI/SMESHGUI_EditMeshDlg.h index 3b96bede4..14b3d9ff7 100644 --- a/src/SMESHGUI/SMESHGUI_EditMeshDlg.h +++ b/src/SMESHGUI/SMESHGUI_EditMeshDlg.h @@ -83,7 +83,7 @@ private: void onEditGroup(); void FindGravityCenter( TColStd_MapOfInteger&, - std::list& ); + std::list& ); // add the centers of gravity of ElemsIdMap elements to the GrCentersXYZ list private: diff --git a/src/SMESHGUI/SMESHGUI_ExtrusionAlongPathDlg.cxx b/src/SMESHGUI/SMESHGUI_ExtrusionAlongPathDlg.cxx index 8d1d9c300..2131b25e6 100644 --- a/src/SMESHGUI/SMESHGUI_ExtrusionAlongPathDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_ExtrusionAlongPathDlg.cxx @@ -354,9 +354,9 @@ SMESHGUI_ExtrusionAlongPathDlg::SMESHGUI_ExtrusionAlongPathDlg( SMESHGUI* theMod connect(mySMESHGUI, SIGNAL(SignalCloseAllDialogs()), this, SLOT(reject())); connect(ElementsLineEdit, SIGNAL(textChanged(const QString&)), - SLOT(onTextChange(const QString&))); + SLOT(onTextChange(const QString&))); connect(StartPointLineEdit, SIGNAL(textChanged(const QString&)), - SLOT(onTextChange(const QString&))); + SLOT(onTextChange(const QString&))); connect(MeshCheck, SIGNAL(toggled(bool)), SLOT(onSelectMesh())); @@ -440,19 +440,19 @@ void SMESHGUI_ExtrusionAlongPathDlg::ConstructorsClicked (int type) SMESH::SetPointRepresentation(false); if (MeshCheck->isChecked()) { if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(ActorSelection); + aViewWindow->SetSelectionMode(ActorSelection); mySelectionMgr->installFilter(myElementsFilter); } else { if (type == 0) - { - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(EdgeSelection); - } + { + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) + aViewWindow->SetSelectionMode(EdgeSelection); + } if (type == 1) - { - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(FaceSelection); - } + { + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) + aViewWindow->SetSelectionMode(FaceSelection); + } } } connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(SelectionIntoArgument())); @@ -492,16 +492,16 @@ bool SMESHGUI_ExtrusionAlongPathDlg::ClickOnApply() bool bOk; int j = 0; for (int i = 0; i < aListElementsId.count(); i++) { - long ind = aListElementsId[ i ].toLong(&bOk); - if (bOk) { - const SMDS_MeshElement* e = aMesh->FindElement(ind); - if (e) { - bool typeMatch = Elements1dRB->isChecked() && e->GetType() == SMDSAbs_Edge || - Elements2dRB->isChecked() && e->GetType() == SMDSAbs_Face; - if (typeMatch) - anElementsId[ j++ ] = ind; - } - } + long ind = aListElementsId[ i ].toLong(&bOk); + if (bOk) { + const SMDS_MeshElement* e = aMesh->FindElement(ind); + if (e) { + bool typeMatch = Elements1dRB->isChecked() && e->GetType() == SMDSAbs_Edge || + Elements2dRB->isChecked() && e->GetType() == SMDSAbs_Face; + if (typeMatch) + anElementsId[ j++ ] = ind; + } + } } anElementsId->length(j); } @@ -559,44 +559,44 @@ bool SMESHGUI_ExtrusionAlongPathDlg::ClickOnApply() /* if ( MakeGroupsCheck->isEnabled() && MakeGroupsCheck->isChecked() ) { if( MeshCheck->isChecked() ) { - if( GetConstructorId() == 0 ) - SMESH::ListOfGroups_var groups = - aMeshEditor->ExtrusionAlongPathObject1DMakeGroups(myIDSource, myPathMesh, - myPathShape, aNodeStart, - AnglesGrp->isChecked(), anAngles, - BasePointGrp->isChecked(), aBasePoint, retVal); - else - SMESH::ListOfGroups_var groups = - aMeshEditor->ExtrusionAlongPathObject2DMakeGroups(myIDSource, myPathMesh, - myPathShape, aNodeStart, - AnglesGrp->isChecked(), anAngles, - BasePointGrp->isChecked(), aBasePoint, retVal); + if( GetConstructorId() == 0 ) + SMESH::ListOfGroups_var groups = + aMeshEditor->ExtrusionAlongPathObject1DMakeGroups(myIDSource, myPathMesh, + myPathShape, aNodeStart, + AnglesGrp->isChecked(), anAngles, + BasePointGrp->isChecked(), aBasePoint, retVal); + else + SMESH::ListOfGroups_var groups = + aMeshEditor->ExtrusionAlongPathObject2DMakeGroups(myIDSource, myPathMesh, + myPathShape, aNodeStart, + AnglesGrp->isChecked(), anAngles, + BasePointGrp->isChecked(), aBasePoint, retVal); } else - SMESH::ListOfGroups_var groups = - aMeshEditor->ExtrusionAlongPathMakeGroups(anElementsId, myPathMesh, - myPathShape, aNodeStart, - AnglesGrp->isChecked(), anAngles, - BasePointGrp->isChecked(), aBasePoint, retVal); + SMESH::ListOfGroups_var groups = + aMeshEditor->ExtrusionAlongPathMakeGroups(anElementsId, myPathMesh, + myPathShape, aNodeStart, + AnglesGrp->isChecked(), anAngles, + BasePointGrp->isChecked(), aBasePoint, retVal); } else { if( MeshCheck->isChecked() ) { - if( GetConstructorId() == 0 ) - retVal = aMeshEditor->ExtrusionAlongPathObject1D(myIDSource, myPathMesh, - myPathShape, aNodeStart, - AnglesGrp->isChecked(), anAngles, - BasePointGrp->isChecked(), aBasePoint); - else - retVal = aMeshEditor->ExtrusionAlongPathObject2D(myIDSource, myPathMesh, - myPathShape, aNodeStart, - AnglesGrp->isChecked(), anAngles, - BasePointGrp->isChecked(), aBasePoint); + if( GetConstructorId() == 0 ) + retVal = aMeshEditor->ExtrusionAlongPathObject1D(myIDSource, myPathMesh, + myPathShape, aNodeStart, + AnglesGrp->isChecked(), anAngles, + BasePointGrp->isChecked(), aBasePoint); + else + retVal = aMeshEditor->ExtrusionAlongPathObject2D(myIDSource, myPathMesh, + myPathShape, aNodeStart, + AnglesGrp->isChecked(), anAngles, + BasePointGrp->isChecked(), aBasePoint); } else - retVal = aMeshEditor->ExtrusionAlongPath(anElementsId, myPathMesh, - myPathShape, aNodeStart, - AnglesGrp->isChecked(), anAngles, - BasePointGrp->isChecked(), aBasePoint); + retVal = aMeshEditor->ExtrusionAlongPath(anElementsId, myPathMesh, + myPathShape, aNodeStart, + AnglesGrp->isChecked(), anAngles, + BasePointGrp->isChecked(), aBasePoint); } */ @@ -606,55 +606,55 @@ bool SMESHGUI_ExtrusionAlongPathDlg::ClickOnApply() ElemType = SMESH::EDGE; if( !MeshCheck->isChecked() ) { SMESH::ListOfGroups_var groups = - aMeshEditor->ExtrusionAlongPathX(anElementsId, myPath, aNodeStart, AnglesGrp->isChecked(), - anAngles, LinearAnglesCheck->isChecked(), - BasePointGrp->isChecked(), aBasePoint, - NeedGroups, ElemType, retVal); + aMeshEditor->ExtrusionAlongPathX(anElementsId, myPath, aNodeStart, AnglesGrp->isChecked(), + anAngles, LinearAnglesCheck->isChecked(), + BasePointGrp->isChecked(), aBasePoint, + NeedGroups, ElemType, retVal); } else { SMESH::ListOfGroups_var groups = - aMeshEditor->ExtrusionAlongPathObjX(myIDSource, myPath, aNodeStart, AnglesGrp->isChecked(), - anAngles, LinearAnglesCheck->isChecked(), - BasePointGrp->isChecked(), aBasePoint, - NeedGroups, ElemType, retVal); + aMeshEditor->ExtrusionAlongPathObjX(myIDSource, myPath, aNodeStart, AnglesGrp->isChecked(), + anAngles, LinearAnglesCheck->isChecked(), + BasePointGrp->isChecked(), aBasePoint, + NeedGroups, ElemType, retVal); } if( retVal == SMESH::SMESH_MeshEditor::EXTR_OK ) - myMesh->SetParameters( SMESHGUI::JoinObjectParameters(aParameters) ); + myMesh->SetParameters( aParameters.join(":").toLatin1().constData() ); //wc.stop(); wc.suspend(); switch (retVal) { case SMESH::SMESH_MeshEditor::EXTR_NO_ELEMENTS: SUIT_MessageBox::warning(this, - tr("SMESH_ERROR"), - tr("NO_ELEMENTS_SELECTED")); + tr("SMESH_ERROR"), + tr("NO_ELEMENTS_SELECTED")); return false; break; case SMESH::SMESH_MeshEditor::EXTR_PATH_NOT_EDGE: SUIT_MessageBox::warning(this, - tr("SMESH_ERROR"), - tr("SELECTED_PATH_IS_NOT_EDGE")); + tr("SMESH_ERROR"), + tr("SELECTED_PATH_IS_NOT_EDGE")); return false; break; case SMESH::SMESH_MeshEditor::EXTR_BAD_PATH_SHAPE: SUIT_MessageBox::warning(this, - tr("SMESH_ERROR"), - tr("BAD_SHAPE_TYPE")); + tr("SMESH_ERROR"), + tr("BAD_SHAPE_TYPE")); return false; break; case SMESH::SMESH_MeshEditor::EXTR_BAD_STARTING_NODE: SUIT_MessageBox::warning(this, - tr("SMESH_ERROR"), - tr("EXTR_BAD_STARTING_NODE")); + tr("SMESH_ERROR"), + tr("EXTR_BAD_STARTING_NODE")); return false; break; case SMESH::SMESH_MeshEditor::EXTR_BAD_ANGLES_NUMBER: SUIT_MessageBox::warning(this, - tr("SMESH_ERROR"), - tr("WRONG_ANGLES_NUMBER")); + tr("SMESH_ERROR"), + tr("WRONG_ANGLES_NUMBER")); return false; break; case SMESH::SMESH_MeshEditor::EXTR_CANT_GET_TANGENT: SUIT_MessageBox::warning(this, - tr("SMESH_ERROR"), - tr("CANT_GET_TANGENT")); + tr("SMESH_ERROR"), + tr("CANT_GET_TANGENT")); return false; break; case SMESH::SMESH_MeshEditor::EXTR_OK: break; @@ -700,10 +700,10 @@ void SMESHGUI_ExtrusionAlongPathDlg::ClickOnHelp() platform = "application"; #endif SUIT_MessageBox::warning(this, tr("WRN_WARNING"), - tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). - arg(app->resourceMgr()->stringValue("ExternalBrowser", - platform)). - arg(myHelpFileName)); + tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). + arg(app->resourceMgr()->stringValue("ExternalBrowser", + platform)). + arg(myHelpFileName)); } } @@ -762,21 +762,21 @@ void SMESHGUI_ExtrusionAlongPathDlg::onTextChange (const QString& theNewText) const Handle(SALOME_InteractiveObject)& anIO = myMeshActor->getIO(); TColStd_MapOfInteger newIndices; for (int i = 0; i < aListId.count(); i++) { - long ind = aListId[ i ].toLong(&bOk); - if (bOk) { - const SMDS_MeshElement* e = aMesh->FindElement(ind); - if (e) { - // check also type of element - bool typeMatch = Elements1dRB->isChecked() && e->GetType() == SMDSAbs_Edge || - Elements2dRB->isChecked() && e->GetType() == SMDSAbs_Face; - if (typeMatch) - newIndices.Add(e->GetID()); - } - } + long ind = aListId[ i ].toLong(&bOk); + if (bOk) { + const SMDS_MeshElement* e = aMesh->FindElement(ind); + if (e) { + // check also type of element + bool typeMatch = Elements1dRB->isChecked() && e->GetType() == SMDSAbs_Edge || + Elements2dRB->isChecked() && e->GetType() == SMDSAbs_Face; + if (typeMatch) + newIndices.Add(e->GetID()); + } + } } mySelector->AddOrRemoveIndex(anIO, newIndices, false); if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->highlight( anIO, true, true ); + aViewWindow->highlight( anIO, true, true ); } } else if (send == StartPointLineEdit && @@ -785,27 +785,27 @@ void SMESHGUI_ExtrusionAlongPathDlg::onTextChange (const QString& theNewText) SMESH_Actor* aPathActor = SMESH::FindActorByObject(myPath); SMDS_Mesh* aMesh = 0; if (aPathActor) - aMesh = aPathActor->GetObject()->GetMesh(); + aMesh = aPathActor->GetObject()->GetMesh(); if (aMesh) { - //mySelectionMgr->clearSelected(); - //mySelectionMgr->AddIObject(aPathActor->getIO()); + //mySelectionMgr->clearSelected(); + //mySelectionMgr->AddIObject(aPathActor->getIO()); SALOME_ListIO aList; aList.Append(aPathActor->getIO()); mySelectionMgr->setSelectedObjects(aList, false); - bool bOk; - long ind = theNewText.toLong(&bOk); - if (bOk) { - const SMDS_MeshNode* n = aMesh->FindNode(ind); - if (n) { - //if (!mySelectionMgr->IsIndexSelected(aPathActor->getIO(), n->GetID())) { + bool bOk; + long ind = theNewText.toLong(&bOk); + if (bOk) { + const SMDS_MeshNode* n = aMesh->FindNode(ind); + if (n) { + //if (!mySelectionMgr->IsIndexSelected(aPathActor->getIO(), n->GetID())) { TColStd_MapOfInteger newIndices; - newIndices.Add(n->GetID()); - mySelector->AddOrRemoveIndex( aPathActor->getIO(), newIndices, false ); - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->highlight( aPathActor->getIO(), true, true ); - } - } + newIndices.Add(n->GetID()); + mySelector->AddOrRemoveIndex( aPathActor->getIO(), newIndices, false ); + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) + aViewWindow->highlight( aPathActor->getIO(), true, true ); + } + } } } } @@ -929,10 +929,10 @@ void SMESHGUI_ExtrusionAlongPathDlg::SelectionIntoArgument() TopoDS_Vertex aVertex; if (!aGeomObj->_is_nil()) { if (aGeomObj->IsShape() && GEOMBase::GetShape(aGeomObj, aVertex) && !aVertex.IsNull()) { - gp_Pnt aPnt = BRep_Tool::Pnt(aVertex); - XSpin->SetValue(aPnt.X()); - YSpin->SetValue(aPnt.Y()); - ZSpin->SetValue(aPnt.Z()); + gp_Pnt aPnt = BRep_Tool::Pnt(aVertex); + XSpin->SetValue(aPnt.X()); + YSpin->SetValue(aPnt.Y()); + ZSpin->SetValue(aPnt.Z()); } return; } @@ -997,19 +997,19 @@ void SMESHGUI_ExtrusionAlongPathDlg::SetEditCurrentArgument (QToolButton* button SMESH::SetPointRepresentation(false); if (MeshCheck->isChecked()) { if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(ActorSelection); + aViewWindow->SetSelectionMode(ActorSelection); mySelectionMgr->installFilter(myElementsFilter); } else { if (Elements1dRB->isChecked()) - { - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(EdgeSelection); - } + { + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) + aViewWindow->SetSelectionMode(EdgeSelection); + } else if (Elements2dRB->isChecked()) - { - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(FaceSelection); - } + { + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) + aViewWindow->SetSelectionMode(FaceSelection); + } } } else if (button == SelectPathMeshButton) { myEditCurrentArgument = PathMeshLineEdit; @@ -1024,10 +1024,10 @@ void SMESHGUI_ExtrusionAlongPathDlg::SetEditCurrentArgument (QToolButton* button if (!myPath->_is_nil()) { SMESH_Actor* aPathActor = SMESH::FindActorByObject(myPath); if (aPathActor) { - SMESH::SetPointRepresentation(true); - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(NodeSelection); - SMESH::SetPickable(aPathActor); + SMESH::SetPointRepresentation(true); + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) + aViewWindow->SetSelectionMode(NodeSelection); + SMESH::SetPickable(aPathActor); } } } @@ -1172,21 +1172,21 @@ bool SMESHGUI_ExtrusionAlongPathDlg::eventFilter (QObject* object, QEvent* event QKeyEvent* ke = (QKeyEvent*)event; if (object == AnglesList) { if (ke->key() == Qt::Key_Delete) - OnAngleRemoved(); + OnAngleRemoved(); } } else if (event->type() == QEvent::FocusIn) { if (object == ElementsLineEdit) { if (myEditCurrentArgument != ElementsLineEdit) - SetEditCurrentArgument(SelectElementsButton); + SetEditCurrentArgument(SelectElementsButton); } else if (object == StartPointLineEdit) { if (myEditCurrentArgument != StartPointLineEdit) - SetEditCurrentArgument(SelectStartPointButton); + SetEditCurrentArgument(SelectStartPointButton); } else if (object == XSpin->editor() || object == YSpin->editor() || object == ZSpin->editor()) { if (myEditCurrentArgument != XSpin) - SetEditCurrentArgument(SelectBasePointButton); + SetEditCurrentArgument(SelectBasePointButton); } } return QDialog::eventFilter(object, event); @@ -1216,8 +1216,8 @@ void SMESHGUI_ExtrusionAlongPathDlg::setFilters() { if(myMesh->_is_nil()) { SUIT_MessageBox::critical(this, - tr("SMESH_ERROR"), - tr("NO_MESH_SELECTED")); + tr("SMESH_ERROR"), + tr("NO_MESH_SELECTED")); return; } if ( !myFilterDlg ) @@ -1270,7 +1270,7 @@ void SMESHGUI_ExtrusionAlongPathDlg::updateLinearAngles() enableLinear = false; anItem->text().toDouble(&enableLinear); if( !enableLinear ) - break; + break; } } if( !enableLinear ) diff --git a/src/SMESHGUI/SMESHGUI_ExtrusionDlg.cxx b/src/SMESHGUI/SMESHGUI_ExtrusionDlg.cxx index 2ed912383..7c32fc1e2 100644 --- a/src/SMESHGUI/SMESHGUI_ExtrusionDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_ExtrusionDlg.cxx @@ -400,24 +400,24 @@ void SMESHGUI_ExtrusionDlg::ConstructorsClicked (int constructorId) { GroupArguments->setTitle(tr("EXTRUSION_1D")); if (!CheckBoxMesh->isChecked()) - { - LineEditElements->clear(); - myIDs.clear(); - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(EdgeSelection); - } + { + LineEditElements->clear(); + myIDs.clear(); + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) + aViewWindow->SetSelectionMode(EdgeSelection); + } break; } case 1: { GroupArguments->setTitle(tr("EXTRUSION_2D")); if (!CheckBoxMesh->isChecked()) - { - LineEditElements->clear(); - myIDs.clear(); - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(FaceSelection); - } + { + LineEditElements->clear(); + myIDs.clear(); + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) + aViewWindow->SetSelectionMode(FaceSelection); + } break; } } @@ -509,8 +509,8 @@ bool SMESHGUI_ExtrusionDlg::ClickOnApply() aParameters << SpinBox_Dz->text(); } else if ( RadioButton4->isChecked() ) { gp_XYZ aNormale(SpinBox_Vx->GetValue(), - SpinBox_Vy->GetValue(), - SpinBox_Vz->GetValue()); + SpinBox_Vy->GetValue(), + SpinBox_Vz->GetValue()); aNormale /= aNormale.Modulus(); @@ -536,29 +536,29 @@ bool SMESHGUI_ExtrusionDlg::ClickOnApply() if ( MakeGroupsCheck->isEnabled() && MakeGroupsCheck->isChecked() ) { if( CheckBoxMesh->isChecked() ) { - if( GetConstructorId() == 0 ) - SMESH::ListOfGroups_var groups = - aMeshEditor->ExtrusionSweepObject1DMakeGroups(mySelectedObject, aVector, aNbSteps); - else - SMESH::ListOfGroups_var groups = - aMeshEditor->ExtrusionSweepObject2DMakeGroups(mySelectedObject, aVector, aNbSteps); - } - else - SMESH::ListOfGroups_var groups = - aMeshEditor->ExtrusionSweepMakeGroups(myElementsId.inout(), aVector, aNbSteps); + if( GetConstructorId() == 0 ) + SMESH::ListOfGroups_var groups = + aMeshEditor->ExtrusionSweepObject1DMakeGroups(mySelectedObject, aVector, aNbSteps); + else + SMESH::ListOfGroups_var groups = + aMeshEditor->ExtrusionSweepObject2DMakeGroups(mySelectedObject, aVector, aNbSteps); + } + else + SMESH::ListOfGroups_var groups = + aMeshEditor->ExtrusionSweepMakeGroups(myElementsId.inout(), aVector, aNbSteps); } else { - if( CheckBoxMesh->isChecked() ) { - if( GetConstructorId() == 0 ) - aMeshEditor->ExtrusionSweepObject1D(mySelectedObject, aVector, aNbSteps); - else - aMeshEditor->ExtrusionSweepObject2D(mySelectedObject, aVector, aNbSteps); - } - else - aMeshEditor->ExtrusionSweep(myElementsId.inout(), aVector, aNbSteps); + if( CheckBoxMesh->isChecked() ) { + if( GetConstructorId() == 0 ) + aMeshEditor->ExtrusionSweepObject1D(mySelectedObject, aVector, aNbSteps); + else + aMeshEditor->ExtrusionSweepObject2D(mySelectedObject, aVector, aNbSteps); + } + else + aMeshEditor->ExtrusionSweep(myElementsId.inout(), aVector, aNbSteps); } - myMesh->SetParameters( SMESHGUI::JoinObjectParameters(aParameters) ); + myMesh->SetParameters( aParameters.join(":").toLatin1().constData() ); } catch (...) { } @@ -611,10 +611,10 @@ void SMESHGUI_ExtrusionDlg::ClickOnHelp() platform = "application"; #endif SUIT_MessageBox::warning(this, tr("WRN_WARNING"), - tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). - arg(app->resourceMgr()->stringValue("ExternalBrowser", - platform)). - arg(myHelpFileName)); + tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). + arg(app->resourceMgr()->stringValue("ExternalBrowser", + platform)). + arg(myHelpFileName)); } } @@ -666,7 +666,7 @@ void SMESHGUI_ExtrusionDlg::onTextChange (const QString& theNewText) myElementsId->length( myNbOkElements = newIndices.Extent() ); mySelector->AddOrRemoveIndex(myIO, newIndices, false); if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->highlight( myIO, true, true ); + aViewWindow->highlight( myIO, true, true ); } } @@ -744,7 +744,7 @@ void SMESHGUI_ExtrusionDlg::SelectionIntoArgument() aNbElements = aMapIndex.Extent(); if (aNbElements < 1) - return; + return; myElementsId = new SMESH::long_array; myElementsId->length( aNbElements ); @@ -802,20 +802,20 @@ void SMESHGUI_ExtrusionDlg::SetEditCurrentArgument() myEditCurrentArgument = (QWidget*)LineEditElements; if (CheckBoxMesh->isChecked()) { if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(ActorSelection); + aViewWindow->SetSelectionMode(ActorSelection); mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter); } else { int aConstructorId = GetConstructorId(); if (aConstructorId == 0) - { - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(EdgeSelection); - } + { + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) + aViewWindow->SetSelectionMode(EdgeSelection); + } else if (aConstructorId == 1) - { - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(FaceSelection); - } + { + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) + aViewWindow->SetSelectionMode(FaceSelection); + } } } else if (send == SelectVectorButton){ @@ -930,13 +930,13 @@ void SMESHGUI_ExtrusionDlg::onSelectMesh (bool toSelectMesh) int aConstructorId = GetConstructorId(); if (aConstructorId == 0) { - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(EdgeSelection); + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) + aViewWindow->SetSelectionMode(EdgeSelection); } else if (aConstructorId == 1) { - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(FaceSelection); + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) + aViewWindow->SetSelectionMode(FaceSelection); } LineEditElements->setReadOnly(false); @@ -983,8 +983,8 @@ void SMESHGUI_ExtrusionDlg::setFilters() { if(myMesh->_is_nil()) { SUIT_MessageBox::critical(this, - tr("SMESH_ERROR"), - tr("NO_MESH_SELECTED")); + tr("SMESH_ERROR"), + tr("NO_MESH_SELECTED")); return; } if ( !myFilterDlg ) diff --git a/src/SMESHGUI/SMESHGUI_FilterDlg.cxx b/src/SMESHGUI/SMESHGUI_FilterDlg.cxx index c6b4b699f..4cc5d3fdc 100755 --- a/src/SMESHGUI/SMESHGUI_FilterDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_FilterDlg.cxx @@ -210,7 +210,7 @@ bool SMESHGUI_FilterTable::AdditionalWidget::IsValid (const bool theMsg) const if (aWg->isEnabled() && aWg->validator()->validate(aText, p) != QValidator::Acceptable) { if (theMsg) SUIT_MessageBox::information(SMESHGUI::desktop(), tr("SMESH_INSUFFICIENT_DATA"), - tr("SMESHGUI_INVALID_PARAMETERS")); + tr("SMESHGUI_INVALID_PARAMETERS")); return false; } } @@ -423,13 +423,13 @@ public: ~ComboDelegate(); QWidget* createEditor( QWidget*, const QStyleOptionViewItem&, - const QModelIndex& ) const; + const QModelIndex& ) const; void setEditorData( QWidget*, const QModelIndex& ) const; void setModelData( QWidget*, QAbstractItemModel*, const QModelIndex& ) const; void updateEditorGeometry( QWidget*, const QStyleOptionViewItem&, - const QModelIndex& ) const; + const QModelIndex& ) const; private: QTableWidget* myTable; }; @@ -445,8 +445,8 @@ SMESHGUI_FilterTable::ComboDelegate::~ComboDelegate() } QWidget* SMESHGUI_FilterTable::ComboDelegate::createEditor( QWidget* parent, - const QStyleOptionViewItem& option, - const QModelIndex& index ) const + const QStyleOptionViewItem& option, + const QModelIndex& index ) const { QStringList l = index.data( Qt::UserRole ).toStringList(); if ( !l.isEmpty() ) { @@ -459,7 +459,7 @@ QWidget* SMESHGUI_FilterTable::ComboDelegate::createEditor( QWidget* parent, } void SMESHGUI_FilterTable::ComboDelegate::setEditorData( QWidget* editor, - const QModelIndex& index ) const + const QModelIndex& index ) const { QString value = index.model()->data( index, Qt::DisplayRole ).toString(); QComboBox* cb = dynamic_cast( editor ); @@ -475,8 +475,8 @@ void SMESHGUI_FilterTable::ComboDelegate::setEditorData( QWidget* editor, } void SMESHGUI_FilterTable::ComboDelegate::setModelData( QWidget* editor, - QAbstractItemModel* model, - const QModelIndex& index) const + QAbstractItemModel* model, + const QModelIndex& index) const { QComboBox* cb = dynamic_cast( editor ); if ( cb ) model->setData( index, cb->currentText(), Qt::DisplayRole ); @@ -484,8 +484,8 @@ void SMESHGUI_FilterTable::ComboDelegate::setModelData( QWidget* editor, } void SMESHGUI_FilterTable::ComboDelegate::updateEditorGeometry( QWidget* editor, - const QStyleOptionViewItem& option, - const QModelIndex& index ) const + const QStyleOptionViewItem& option, + const QModelIndex& index ) const { editor->setGeometry( option.rect ); } @@ -597,8 +597,8 @@ bool SMESHGUI_FilterTable::Table::isEditable (int row, int col) const void SMESHGUI_FilterTable::Table::setReadOnly( bool on ) { setEditTriggers( on ? - QAbstractItemView::NoEditTriggers : - QAbstractItemView::AllEditTriggers ); + QAbstractItemView::NoEditTriggers : + QAbstractItemView::AllEditTriggers ); } bool SMESHGUI_FilterTable::Table::isReadOnly() const @@ -1031,10 +1031,10 @@ void SMESHGUI_FilterTable::GetCriterion (const int theRow, theCriterion.Threshold = (double)((ComboItem*)aTable->item(theRow, 2))->value(); else if ( aCriterionType != SMESH::FT_RangeOfIds && aCriterionType != SMESH::FT_BelongToGeom && - aCriterionType != SMESH::FT_BelongToPlane && - aCriterionType != SMESH::FT_BelongToCylinder && - aCriterionType != SMESH::FT_BelongToGenSurface && - aCriterionType != SMESH::FT_LyingOnGeom) + aCriterionType != SMESH::FT_BelongToPlane && + aCriterionType != SMESH::FT_BelongToCylinder && + aCriterionType != SMESH::FT_BelongToGenSurface && + aCriterionType != SMESH::FT_LyingOnGeom) { theCriterion.Compare = ((ComboItem*)aTable->item(theRow, 1))->value(); theCriterion.Threshold = aTable->item(theRow, 2)->text().toDouble(); @@ -1462,9 +1462,9 @@ void SMESHGUI_FilterTable::onCriterionChanged (const int row, const int col, con aText.toDouble(&isOk); aTable->item( row, 2 )->setText(isOk ? aText : QString("")); if (!aTable->isEditable(row, 1)) - aTable->setEditable(true, row, 1); + aTable->setEditable(true, row, 1); if (!aTable->isEditable(row, 2)) - aTable->setEditable(true, row, 2); + aTable->setEditable(true, row, 2); } } @@ -1781,7 +1781,7 @@ SMESHGUI_FilterTable::Table* SMESHGUI_FilterTable::createTable (QWidget* thePar } static int aLenCr = qAbs( aMaxLenCr - - aMetrics.width(tr("CRITERION"))) / aMetrics.width(' ') + 5; + aMetrics.width(tr("CRITERION"))) / aMetrics.width(' ') + 5; QString aCrStr; aCrStr.fill(' ', aLenCr); @@ -1811,10 +1811,10 @@ SMESHGUI_FilterTable::Table* SMESHGUI_FilterTable::createTable (QWidget* thePar aTable->setSizePolicy(QSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding)); connect(aTable, SIGNAL(cellChanged(int, int)), - this, SLOT(onCriterionChanged(int, int))); + this, SLOT(onCriterionChanged(int, int))); connect(aTable, SIGNAL(currentCellChanged(int, int, int, int)), - this, SLOT(onCurrentChanged(int, int))); + this, SLOT(onCurrentChanged(int, int))); return aTable; } @@ -1844,15 +1844,15 @@ void SMESHGUI_FilterTable::SetEditable (const bool isEditable) Table* aTable = anIter.value(); for (int i = 0, n = aTable->rowCount(); i < n; i++) for (int j = 0, m = aTable->columnCount(); j < m; j++) - { - QTableWidgetItem* anItem = aTable->item(i, j); - if ( dynamic_cast( anItem ) ) { - Qt::ItemFlags f = anItem->flags(); - if (!isEditable) f = f & ~Qt::ItemIsUserCheckable; - else f = f | Qt::ItemIsUserCheckable; - anItem->setFlags( f ); - } - } + { + QTableWidgetItem* anItem = aTable->item(i, j); + if ( dynamic_cast( anItem ) ) { + Qt::ItemFlags f = anItem->flags(); + if (!isEditable) f = f & ~Qt::ItemIsUserCheckable; + else f = f | Qt::ItemIsUserCheckable; + anItem->setFlags( f ); + } + } //end of IPAL19974 if (isEditable) @@ -2037,8 +2037,8 @@ void SMESHGUI_FilterTable::SetID( const int theRow, // Purpose : Get text and internal value from cell of ID value //======================================================================= bool SMESHGUI_FilterTable::GetID( const int theRow, - QString& theText, - const int theEntityType ) + QString& theText, + const int theEntityType ) { Table* aTable = myTables[ theEntityType == -1 ? GetType() : theEntityType ]; QTableWidgetItem* anItem = aTable->item( theRow, 5 ); @@ -2335,8 +2335,8 @@ void SMESHGUI_FilterDlg::Init (const QList& theTypes) mySetInViewer->setChecked(true); mySourceGrp->button(myApplyToState.contains(theTypes.first()) ? - myApplyToState[ theTypes.first() ] : - Selection)->setChecked(true); + myApplyToState[ theTypes.first() ] : + Selection)->setChecked(true); } //======================================================================= @@ -2410,10 +2410,10 @@ void SMESHGUI_FilterDlg::onHelp() platform = "application"; #endif SUIT_MessageBox::warning(this, tr("WRN_WARNING"), - tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). - arg(app->resourceMgr()->stringValue("ExternalBrowser", - platform)). - arg(myHelpFileName)); + tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). + arg(app->resourceMgr()->stringValue("ExternalBrowser", + platform)). + arg(myHelpFileName)); } } @@ -2568,7 +2568,7 @@ bool SMESHGUI_FilterDlg::isValid() const SMESH::GetActiveStudyDocument()->FindObjectByName(aName.toLatin1().constData(), "GEOM"); if (aList.size() == 0) { SUIT_MessageBox::information(SMESHGUI::desktop(), tr("SMESH_INSUFFICIENT_DATA"), - tr("BAD_SHAPE_NAME").arg(aName)); + tr("BAD_SHAPE_NAME").arg(aName)); return false; } @@ -2584,26 +2584,26 @@ bool SMESHGUI_FilterDlg::isValid() const aFace.IsNull() || aFace.ShapeType() != TopAbs_FACE) { SUIT_MessageBox::information(SMESHGUI::desktop(), tr("SMESH_INSUFFICIENT_DATA"), - tr("SHAPE_IS_NOT_A_FACE").arg(aName)); + tr("SHAPE_IS_NOT_A_FACE").arg(aName)); return false; } Handle(Geom_Surface) aSurf = BRep_Tool::Surface(TopoDS::Face(aFace)); if (aSurf.IsNull()) { SUIT_MessageBox::information(SMESHGUI::desktop(), tr("SMESH_INSUFFICIENT_DATA"), - tr("SHAPE_IS_NOT_A_FACE").arg(aName)); + tr("SHAPE_IS_NOT_A_FACE").arg(aName)); return false; } if (aType == SMESH::FT_BelongToPlane && !aSurf->IsKind(STANDARD_TYPE(Geom_Plane))) { SUIT_MessageBox::information(SMESHGUI::desktop(), tr("SMESH_INSUFFICIENT_DATA"), - tr("SHAPE_IS_NOT_A_PLANE").arg(aName)); + tr("SHAPE_IS_NOT_A_PLANE").arg(aName)); return false; } if (aType == SMESH::FT_BelongToCylinder && !aSurf->IsKind(STANDARD_TYPE(Geom_CylindricalSurface))) { SUIT_MessageBox::information(SMESHGUI::desktop(), tr("SMESH_INSUFFICIENT_DATA"), - tr("SHAPE_IS_NOT_A_CYLINDER").arg(aName)); + tr("SHAPE_IS_NOT_A_CYLINDER").arg(aName)); return false; } } @@ -2632,7 +2632,13 @@ void SMESHGUI_FilterDlg::SetSourceWg (QWidget* theWg, //======================================================================= void SMESHGUI_FilterDlg::SetMesh (SMESH::SMESH_Mesh_var theMesh) { - myMesh = theMesh; + if ( !theMesh->_is_nil() ) { + myMesh = theMesh; + if ( !myFilter[ myTable->GetType() ]->_is_nil() && !myFilter[ myTable->GetType() ]->GetPredicate()->_is_nil() ) { + SMESH::Predicate_ptr aPred = myFilter[ myTable->GetType() ]->GetPredicate(); + aPred->SetMesh(myMesh); + } + } const bool isEnable = !(myMesh->_is_nil()); myButtons[BTN_OK]->setEnabled(isEnable); myButtons[BTN_Apply]->setEnabled(isEnable); diff --git a/src/SMESHGUI/SMESHGUI_FilterDlg.h b/src/SMESHGUI/SMESHGUI_FilterDlg.h index 4380d54d8..e38b5b6cd 100755 --- a/src/SMESHGUI/SMESHGUI_FilterDlg.h +++ b/src/SMESHGUI/SMESHGUI_FilterDlg.h @@ -123,12 +123,12 @@ public: const int = -1 ); void SetID( const int, - const QString&, - const int = -1 ); + const QString&, + const int = -1 ); bool GetID( const int, - QString&, - const int = -1 ); + QString&, + const int = -1 ); void Update(); diff --git a/src/SMESHGUI/SMESHGUI_FilterLibraryDlg.cxx b/src/SMESHGUI/SMESHGUI_FilterLibraryDlg.cxx index 47c9e912c..9eb27ab6b 100644 --- a/src/SMESHGUI/SMESHGUI_FilterLibraryDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_FilterLibraryDlg.cxx @@ -226,7 +226,7 @@ QWidget* SMESHGUI_FilterLibraryDlg::createMainFrame (QWidget* theParent) connect(myOpenBtn, SIGNAL(clicked()), this, SLOT(onBrowse())); connect(myListBox, SIGNAL(itemSelectionChanged()), - this, SLOT(onFilterChanged())); + this, SLOT(onFilterChanged())); connect(myAddBtn, SIGNAL(clicked()), this, SLOT(onAddBtnPressed())); connect(myDeleteBtn, SIGNAL(clicked()), this, SLOT(onDeleteBtnPressed())); @@ -423,7 +423,7 @@ bool SMESHGUI_FilterLibraryDlg::onApply() if (myLibrary->_is_nil()) { SUIT_MessageBox::information(SMESHGUI::desktop(), tr("SMESH_WRN_WARNING"), - tr("LIBRARY_IS_NOT_LOADED")); + tr("LIBRARY_IS_NOT_LOADED")); return false; } @@ -437,11 +437,11 @@ bool SMESHGUI_FilterLibraryDlg::onApply() } else if (myMode == EDIT || myMode == ADD_TO) { SMESH::Filter_var aFilter = createFilter(); if (!myListBox->selectedItems().empty() && - !myLibrary->Replace(myCurrFilterName.toLatin1().constData(), - myName->text().toLatin1().constData(), - aFilter.in())) { + !myLibrary->Replace(myCurrFilterName.toLatin1().constData(), + myName->text().toLatin1().constData(), + aFilter.in())) { SUIT_MessageBox::information(SMESHGUI::desktop(), tr("SMESH_ERROR"), - tr("ERROR_OF_EDITING")); + tr("ERROR_OF_EDITING")); aResult = false; } else @@ -457,7 +457,7 @@ bool SMESHGUI_FilterLibraryDlg::onApply() delete aFileName; } else if (myMode != COPY_FROM) { SUIT_MessageBox::information(SMESHGUI::desktop(), tr("SMESH_ERROR"), - tr("ERROR_OF_SAVING")); + tr("ERROR_OF_SAVING")); } else { } @@ -507,10 +507,10 @@ void SMESHGUI_FilterLibraryDlg::onHelp() platform = "application"; #endif SUIT_MessageBox::warning(this, tr("WRN_WARNING"), - tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). - arg(app->resourceMgr()->stringValue("ExternalBrowser", - platform)). - arg(myHelpFileName)); + tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). + arg(app->resourceMgr()->stringValue("ExternalBrowser", + platform)). + arg(myHelpFileName)); } } @@ -674,7 +674,7 @@ void SMESHGUI_FilterLibraryDlg::processNewLibrary() if (myLibrary->_is_nil()) { if (myMode == COPY_FROM) { SUIT_MessageBox::information(SMESHGUI::desktop(), tr("SMESH_ERROR"), - tr("ERROR_LOAD")); + tr("ERROR_LOAD")); return; } else { myLibrary = aFilterMgr->CreateLibrary(); @@ -730,7 +730,7 @@ bool SMESHGUI_FilterLibraryDlg::isNameValid(const bool theMess) const if (aCurrName.isEmpty()) { if (theMess) SUIT_MessageBox::information(SMESHGUI::desktop(), tr("SMESH_INSUFFICIENT_DATA"), - tr("EMPTY_FILTER_NAME")); + tr("EMPTY_FILTER_NAME")); return false; } @@ -739,7 +739,7 @@ bool SMESHGUI_FilterLibraryDlg::isNameValid(const bool theMess) const if (aNames[ f ] == aCurrName && aNames[ f ] != myCurrFilterName) { if (theMess) SUIT_MessageBox::information(SMESHGUI::desktop(), tr("SMESH_INSUFFICIENT_DATA"), - tr("ERROR_FILTER_NAME")); + tr("ERROR_FILTER_NAME")); return false; } } @@ -787,7 +787,7 @@ bool SMESHGUI_FilterLibraryDlg::isPermissionValid(const bool theIsExistingOnly) if (!isWritable) { SUIT_MessageBox::information(SMESHGUI::desktop(), tr("SMESH_WRN_WARNING"), - tr("NO_PERMISSION")); + tr("NO_PERMISSION")); return false; } @@ -831,8 +831,8 @@ void SMESHGUI_FilterLibraryDlg::onFilterChanged() SMESH::Filter_var aFilter = createFilter(); myLibrary->Replace(myCurrFilterName.toLatin1().constData(), - myName->text().toLatin1().constData(), - aFilter); + myName->text().toLatin1().constData(), + aFilter); } // Fill table with filter parameters @@ -938,8 +938,8 @@ void SMESHGUI_FilterLibraryDlg::onAddBtnPressed() SMESH::Filter_var aFilter = createFilter(); myLibrary->Replace(myCurrFilterName.toLatin1().constData(), - myName->text().toLatin1().constData(), - aFilter); + myName->text().toLatin1().constData(), + aFilter); } myTable->Clear(myTable->GetType()); @@ -955,7 +955,7 @@ void SMESHGUI_FilterLibraryDlg::addFilterToLib (const QString& theName) { if (myLibrary->_is_nil()) { SUIT_MessageBox::information(SMESHGUI::desktop(), tr("SMESH_WRN_WARNING"), - tr("LIBRARY_IS_NOT_LOADED")); + tr("LIBRARY_IS_NOT_LOADED")); return; } @@ -979,7 +979,7 @@ void SMESHGUI_FilterLibraryDlg::addFilterToLib (const QString& theName) if (!aResult) { SUIT_MessageBox::information(SMESHGUI::desktop(), tr("SMESH_ERROR"), - tr("ERROR_OF_ADDING")); + tr("ERROR_OF_ADDING")); } updateList(); @@ -989,7 +989,7 @@ void SMESHGUI_FilterLibraryDlg::addFilterToLib (const QString& theName) if (theName != aName) SUIT_MessageBox::information(SMESHGUI::desktop(), tr("SMESH_WARNING"), - tr("ASSIGN_NEW_NAME").arg(theName).arg(aName)); + tr("ASSIGN_NEW_NAME").arg(theName).arg(aName)); } //======================================================================= @@ -1089,7 +1089,7 @@ void SMESHGUI_FilterLibraryDlg::onDeleteBtnPressed() { if (myLibrary->_is_nil()) { SUIT_MessageBox::information(SMESHGUI::desktop(), tr("SMESH_WRN_WARNING"), - tr("LIBRARY_IS_NOT_LOADED")); + tr("LIBRARY_IS_NOT_LOADED")); return; } @@ -1097,7 +1097,7 @@ void SMESHGUI_FilterLibraryDlg::onDeleteBtnPressed() if (anIndex == -1 || !myLibrary->Delete(myCurrFilterName.toLatin1().constData())) { SUIT_MessageBox::information(SMESHGUI::desktop(), tr("SMESH_ERROR"), - tr("ERROR_OF_DELETING")); + tr("ERROR_OF_DELETING")); } else { myCurrFilterName = ""; myCurrFilter = -1; @@ -1188,8 +1188,8 @@ void SMESHGUI_FilterLibraryDlg::onNeedValidation() { SMESH::Filter_var aFilter = createFilter(myTable->GetType()); myLibrary->Replace(myCurrFilterName.toLatin1().constData(), - myName->text().toLatin1().constData(), - aFilter); + myName->text().toLatin1().constData(), + aFilter); } } } diff --git a/src/SMESHGUI/SMESHGUI_GEOMGenUtils.cxx b/src/SMESHGUI/SMESHGUI_GEOMGenUtils.cxx index 33907aec0..d3544b4d2 100644 --- a/src/SMESHGUI/SMESHGUI_GEOMGenUtils.cxx +++ b/src/SMESHGUI/SMESHGUI_GEOMGenUtils.cxx @@ -64,7 +64,7 @@ namespace SMESH SMESH::SMESH_subMesh_var aSubmesh = SObjectToInterface( theMeshOrSubmesh ); if ( !aSubmesh->_is_nil() ) - return aSubmesh->GetSubShape(); + return aSubmesh->GetSubShape(); } } return GEOM::GEOM_Object::_nil(); @@ -89,7 +89,7 @@ namespace SMESH SALOMEDS_SObject* aRefSO = _CAST(SObject,aRefSOClient); aMeshShape = GEOM::GEOM_Object::_narrow(aRefSO->GetObject()); } else { - SALOMEDS_SObject* aSO = _CAST(SObject,aSObject); + SALOMEDS_SObject* aSO = _CAST(SObject,aSObject); aMeshShape = GEOM::GEOM_Object::_narrow(aSO->GetObject()); } diff --git a/src/SMESHGUI/SMESHGUI_GroupDlg.cxx b/src/SMESHGUI/SMESHGUI_GroupDlg.cxx index 80e98c0cf..32f66474c 100644 --- a/src/SMESHGUI/SMESHGUI_GroupDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_GroupDlg.cxx @@ -103,14 +103,13 @@ // purpose : //================================================================================= SMESHGUI_GroupDlg::SMESHGUI_GroupDlg( SMESHGUI* theModule, - SMESH::SMESH_Mesh_ptr theMesh ) + SMESH::SMESH_Mesh_ptr theMesh ) : QDialog( SMESH::GetDesktop( theModule ) ), mySMESHGUI( theModule ), mySelectionMgr( SMESH::GetSelectionMgr( theModule ) ), mySelector( SMESH::GetViewWindow( theModule )->GetSelector() ), myIsBusy( false ), - myNameChanged( false ), - myActor( 0 ) + myNameChanged( false ) { initDialog( true ); if ( !theMesh->_is_nil() ) @@ -129,7 +128,7 @@ SMESHGUI_GroupDlg::SMESHGUI_GroupDlg( SMESHGUI* theModule, // purpose : //================================================================================= SMESHGUI_GroupDlg::SMESHGUI_GroupDlg( SMESHGUI* theModule, - SMESH::SMESH_GroupBase_ptr theGroup, + SMESH::SMESH_GroupBase_ptr theGroup, const bool theIsConvert ) : QDialog( SMESH::GetDesktop( theModule ) ), mySMESHGUI( theModule ), @@ -330,7 +329,7 @@ void SMESHGUI_GroupDlg::initDialog( bool create) QLabel* aColorLab = new QLabel(tr( "SMESH_CHECK_COLOR" ), aColorBox ); myColorBtn = new QtxColorButton(aColorBox); myColorBtn->setSizePolicy( QSizePolicy::MinimumExpanding, - myColorBtn->sizePolicy().verticalPolicy() ); + myColorBtn->sizePolicy().verticalPolicy() ); aColorBoxLayout->addWidget(aColorLab); aColorBoxLayout->addWidget(myColorBtn); @@ -413,6 +412,7 @@ void SMESHGUI_GroupDlg::initDialog( bool create) connect(mySMESHGUI, SIGNAL(SignalDeactivateActiveDialog()), this, SLOT(onDeactivate())); connect(mySMESHGUI, SIGNAL(SignalCloseAllDialogs()), this, SLOT(onClose())); connect(mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(onObjectSelectionChanged())); + connect(mySMESHGUI, SIGNAL(SignalVisibilityChanged()), this, SLOT(onVisibilityChanged())); rb1->setChecked(true); // VSR !!! onGrpTypeChanged(0); // VSR!!! @@ -552,11 +552,12 @@ void SMESHGUI_GroupDlg::init (SMESH::SMESH_GroupBase_ptr theGroup, // actor of theGroup, if it is visible, else try // any visible actor of group or submesh of myMesh // commented, because an attempt to set selection on not displayed cells leads to error - //SetAppropriateActor(); - myActor = SMESH::FindActorByObject(myMesh); - if ( !myActor ) - myActor = SMESH::FindActorByObject(theGroup); - SMESH::SetPickable(myActor); + SetAppropriateActor(); + + /* SMESH_Actor* anActor = SMESH::FindActorByObject(myMesh); + if ( !anActor ) + anActor = SMESH::FindActorByObject(theGroup); + SMESH::SetPickable(anActor);*/ int grpType = (!myGroup->_is_nil() ? 0 : (theIsConvert ? 0 : 1)); myGrpTypeGroup->button(grpType)->setChecked(true); @@ -685,44 +686,50 @@ void SMESHGUI_GroupDlg::setSelectionMode (int theMode) if (mySelectionMode != theMode) { // [PAL10408] mySelectionMgr->clearSelected(); mySelectionMgr->clearFilters(); - if (myActor) - myActor->SetPointRepresentation(false); + if (myActorsList.count() > 0) { + QListIterator it( myActorsList ); + while ( it.hasNext() ) + it.next()->SetPointRepresentation(false); + } else 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; + if (myActorsList.count() > 0) { + QListIterator it( myActorsList ); + while ( it.hasNext() ) + it.next()->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; + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) + aViewWindow->SetSelectionMode(EdgeSelection); + break; case 2: - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(FaceSelection); - break; + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) + aViewWindow->SetSelectionMode(FaceSelection); + break; default: - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(VolumeSelection); + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) + aViewWindow->SetSelectionMode(VolumeSelection); } } else { if (theMode == 4) - mySelectionMgr->installFilter(mySubMeshFilter); + mySelectionMgr->installFilter(mySubMeshFilter); else if (theMode == 5) - mySelectionMgr->installFilter(myGroupFilter); + mySelectionMgr->installFilter(myGroupFilter); else if (theMode == 6) - mySelectionMgr->installFilter(myMeshFilter); + mySelectionMgr->installFilter(myMeshFilter); else if (theMode == 7) - mySelectionMgr->installFilter(myGeomFilter); + mySelectionMgr->installFilter(myGeomFilter); if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(ActorSelection); + aViewWindow->SetSelectionMode(ActorSelection); } mySelectionMode = theMode; } @@ -752,7 +759,7 @@ bool SMESHGUI_GroupDlg::onApply() if (myMesh->_is_nil()) return false; myGroup = myMesh->ConvertToStandalone( myGroupOnGeom ); - // nullify pointer, because object become dead + // nullify pointer, because object become dead myGroupOnGeom = SMESH::SMESH_GroupOnGeom::_nil(); } } @@ -773,7 +780,7 @@ bool SMESHGUI_GroupDlg::onApply() int i, k = myElements->count(); anIdList->length(k); for (i = 0; i < k; i++) { - anIdList[i] = myElements->item(i)->text().toInt(); + anIdList[i] = myElements->item(i)->text().toInt(); } myGroup = SMESH::AddGroup(myMesh, aType, myName->text()); @@ -800,46 +807,46 @@ bool SMESHGUI_GroupDlg::onApply() _PTR(SObject) aMeshGroupSO = SMESH::FindSObject(myGroup); if(SMESH_Actor *anActor = SMESH::FindActorByEntry(aMeshGroupSO->GetID().c_str())) { - anActor->setName(myName->text().toLatin1().data()); - switch ( myTypeId ) { - case 0: anActor->SetNodeColor( aColor.R, aColor.G, aColor.B ); break; - case 1: anActor->SetEdgeColor( aColor.R, aColor.G, aColor.B ); break; - case 2: - case 3: anActor->SetSufaceColor( aColor.R, aColor.G, aColor.B ); break; - } + anActor->setName(myName->text().toLatin1().data()); + switch ( myTypeId ) { + case 0: anActor->SetNodeColor( aColor.R, aColor.G, aColor.B ); break; + case 1: anActor->SetEdgeColor( aColor.R, aColor.G, aColor.B ); break; + case 2: + case 3: anActor->SetSufaceColor( aColor.R, aColor.G, aColor.B ); break; + } } QList aAddList; int i, total = myElements->count(); for (i = 0; i < total; i++) { - int anId = myElements->item(i)->text().toInt(); - int idx = myIdList.indexOf(anId); - if ( idx == -1 ) - aAddList.append(anId); - else - myIdList.removeAt(idx); + int anId = myElements->item(i)->text().toInt(); + int idx = myIdList.indexOf(anId); + if ( idx == -1 ) + aAddList.append(anId); + else + myIdList.removeAt(idx); } if (!aAddList.empty()) { - SMESH::long_array_var anIdList = new SMESH::long_array; - int added = aAddList.count(); - anIdList->length(added); - for (i = 0; i < added; i++) - anIdList[i] = aAddList[i]; - myGroup->Add(anIdList.inout()); + SMESH::long_array_var anIdList = new SMESH::long_array; + int added = aAddList.count(); + anIdList->length(added); + for (i = 0; i < added; i++) + anIdList[i] = aAddList[i]; + myGroup->Add(anIdList.inout()); } if (!myIdList.empty()) { - SMESH::long_array_var anIdList = new SMESH::long_array; - int removed = myIdList.count(); - anIdList->length(removed); - for (i = 0; i < removed; i++) - anIdList[i] = myIdList[i]; - myGroup->Remove(anIdList.inout()); + SMESH::long_array_var anIdList = new SMESH::long_array; + int removed = myIdList.count(); + anIdList->length(removed); + for (i = 0; i < removed; i++) + anIdList[i] = myIdList[i]; + myGroup->Remove(anIdList.inout()); } /* init for next operation */ myIdList.clear(); for (i = 0; i < total; i++) { - myIdList.append(myElements->item(i)->text().toInt()); + myIdList.append(myElements->item(i)->text().toInt()); } } @@ -863,12 +870,12 @@ bool SMESHGUI_GroupDlg::onApply() _PTR(Study) aStudy = SMESH::GetActiveStudyDocument(); GEOM::GEOM_IGroupOperations_var aGroupOp = - SMESH::GetGEOMGen()->GetIGroupOperations(aStudy->StudyId()); + SMESH::GetGEOMGen()->GetIGroupOperations(aStudy->StudyId()); if (myGeomObjects->length() == 1) { - myGroupOnGeom = myMesh->CreateGroupFromGEOM(aType, - myName->text().toLatin1().data(), - myGeomObjects[0]); + myGroupOnGeom = myMesh->CreateGroupFromGEOM(aType, + myName->text().toLatin1().data(), + myGeomObjects[0]); } else { SMESH::SMESH_Gen_var aSMESHGen = SMESHGUI::GetSMESHGen(); @@ -910,12 +917,12 @@ bool SMESHGUI_GroupDlg::onApply() aNewGeomGroupName += myName->text(); SALOMEDS::SObject_var aNewGroupSO = geomGen->AddInStudy(aSMESHGen->GetCurrentStudy(), aGroupVar, - aNewGeomGroupName.toLatin1().data(), aMeshShape); + aNewGeomGroupName.toLatin1().data(), aMeshShape); } myGroupOnGeom = myMesh->CreateGroupFromGEOM(aType, - myName->text().toLatin1().data(), - aGroupVar); + myName->text().toLatin1().data(), + aGroupVar); } SALOMEDS::Color aColor = getGroupColor(); @@ -938,13 +945,13 @@ bool SMESHGUI_GroupDlg::onApply() _PTR(SObject) aMeshGroupSO = SMESH::FindSObject(myGroupOnGeom); if(SMESH_Actor *anActor = SMESH::FindActorByEntry(aMeshGroupSO->GetID().c_str())) { - anActor->setName(myName->text().toLatin1().data()); - switch ( myTypeId ) { - case 0: anActor->SetNodeColor( aColor.R, aColor.G, aColor.B ); break; - case 1: anActor->SetEdgeColor( aColor.R, aColor.G, aColor.B ); break; - case 2: - case 3: anActor->SetSufaceColor( aColor.R, aColor.G, aColor.B ); break; - } + anActor->setName(myName->text().toLatin1().data()); + switch ( myTypeId ) { + case 0: anActor->SetNodeColor( aColor.R, aColor.G, aColor.B ); break; + case 1: anActor->SetEdgeColor( aColor.R, aColor.G, aColor.B ); break; + case 2: + case 3: anActor->SetSufaceColor( aColor.R, aColor.G, aColor.B ); break; + } } } @@ -972,9 +979,9 @@ void SMESHGUI_GroupDlg::onOK() //================================================================================= void SMESHGUI_GroupDlg::onListSelectionChanged() { - // MESSAGE( "SMESHGUI_GroupDlg::onListSelectionChanged(); myActor = " << myActor); - if( myIsBusy || !myActor) return; - myIsBusy = true; + //MESSAGE( "SMESHGUI_GroupDlg::onListSelectionChanged(); myActorsList.count() = " << myActorsList.count()); + if( myIsBusy || myActorsList.count() == 0 ) return; + myIsBusy = true; if (myCurrentLineEdit == 0) { mySelectionMgr->clearSelected(); @@ -982,9 +989,9 @@ void SMESHGUI_GroupDlg::onListSelectionChanged() QList selItems = myElements->selectedItems(); QListWidgetItem* anItem; foreach(anItem, selItems) aIndexes.Add(anItem->text().toInt()); - mySelector->AddOrRemoveIndex(myActor->getIO(), aIndexes, false); + mySelector->AddOrRemoveIndex(myActorsList.first()->getIO(), aIndexes, false); SALOME_ListIO aList; - aList.Append(myActor->getIO()); + aList.Append(myActorsList.first()->getIO()); mySelectionMgr->setSelectedObjects(aList,false); } myIsBusy = false; @@ -1026,7 +1033,7 @@ void SMESHGUI_GroupDlg::onObjectSelectionChanged() myGeomObjects->length(0); if (myGeomGroupBtn->isChecked()) - myGeomGroupBtn->setChecked(false); + myGeomGroupBtn->setChecked(false); if (!myCreate) myName->setText( "" ); @@ -1045,16 +1052,20 @@ void SMESHGUI_GroupDlg::onObjectSelectionChanged() Handle(SALOME_InteractiveObject) IO = aList.First(); if (myCreate) { - restoreShowEntityMode(); - myMesh = SMESH::IObjectToInterface(IO); + restoreShowEntityMode(); + myMesh = SMESH::IObjectToInterface(IO); setShowEntityMode(); updateGeomPopup(); if (myMesh->_is_nil()) - { + { updateButtons(); - myIsBusy = false; - return; - } + myIsBusy = false; + return; + } + + if ( myFilterDlg && !myMesh->_is_nil()){ + myFilterDlg->SetMesh( myMesh ); + } myGroup = SMESH::SMESH_Group::_nil(); // NPAL19389: create a group with a selection in another group @@ -1075,15 +1086,14 @@ void SMESHGUI_GroupDlg::onObjectSelectionChanged() else { SMESH::SMESH_GroupBase_var aGroup = SMESH::IObjectToInterface(IO); if (aGroup->_is_nil()) - { - myIsBusy = false; + { + myIsBusy = false; return; - } + } myIsBusy = false; - myCurrentLineEdit = 0; - myGroup = SMESH::SMESH_Group::_nil(); - myGroupOnGeom = SMESH::SMESH_GroupOnGeom::_nil(); + myGroup = SMESH::SMESH_Group::_nil(); + myGroupOnGeom = SMESH::SMESH_GroupOnGeom::_nil(); init(aGroup); myIsBusy = true; @@ -1097,13 +1107,13 @@ void SMESHGUI_GroupDlg::onObjectSelectionChanged() if (myGrpTypeId == 0) { - if (myTypeId == -1) - onTypeChanged(0); - else - { - myElements->clear(); - setSelectionMode(myTypeId); - } + if (myTypeId == -1) + onTypeChanged(0); + else + { + myElements->clear(); + setSelectionMode(myTypeId); + } } myIsBusy = false; @@ -1119,10 +1129,10 @@ void SMESHGUI_GroupDlg::onObjectSelectionChanged() if (aNbSel == 0 || !aMeshSO) { - myGeomObjects->length(0); - updateButtons(); - myIsBusy = false; - return; + myGeomObjects->length(0); + updateButtons(); + myIsBusy = false; + return; } myGeomObjects->length(aNbSel); @@ -1181,10 +1191,10 @@ void SMESHGUI_GroupDlg::onObjectSelectionChanged() myGeomObjects->length(i); if ( i == 0 ) - { - myIsBusy = false; - return; - } + { + myIsBusy = false; + return; + } aNbSel = i; } @@ -1218,13 +1228,12 @@ void SMESHGUI_GroupDlg::onObjectSelectionChanged() } else // !myCurrentLineEdit: local selection of nodes or elements { - if (aNbSel == 1 && myActor && myActor->hasIO()) + if (aNbSel == 1 && myActorsList.count() > 0 ) { -#ifdef ENABLE_SWITCH_ACTOR_DURING_ELEMENTS_SELECTION // NPAL19389: create a group with a selection in another group // Switch myActor to the newly selected one, if the last // is visible and belongs to group or submesh of myMesh - Handle(SALOME_InteractiveObject) curIO = myActor->getIO(); + /* Handle(SALOME_InteractiveObject) curIO = myActor->getIO(); Handle(SALOME_InteractiveObject) selIO = aList.First(); if (curIO->hasEntry() && selIO->hasEntry()) { const char* selEntry = selIO->getEntry(); @@ -1251,50 +1260,74 @@ void SMESHGUI_GroupDlg::onObjectSelectionChanged() } } } - } + }*/ // NPAL19389 END -#endif // ENABLE_SWITCH_ACTOR_DURING_ELEMENTS_SELECTION QString aListStr = ""; int aNbItems = 0; if (myTypeId == 0) { - aNbItems = SMESH::GetNameOfSelectedNodes(mySelector, myActor->getIO(), aListStr); + QListIterator it( myActorsList ); + while ( it.hasNext() ) { + QString tmpStr; + aNbItems += SMESH::GetNameOfSelectedNodes(mySelector, it.next()->getIO(), tmpStr); + aListStr += tmpStr; + } } else { - aNbItems = SMESH::GetNameOfSelectedElements(mySelector, myActor->getIO(), aListStr); + QListIterator it( myActorsList ); + while ( it.hasNext() ) { + QString tmpStr; + aNbItems += SMESH::GetNameOfSelectedElements(mySelector, it.next()->getIO(), tmpStr); + aListStr += tmpStr; + } } if (aNbItems > 0) { - QListWidgetItem* anItem; - QList listItemsToSel; - QStringList anElements = aListStr.split( " ", QString::SkipEmptyParts); - for (QStringList::iterator it = anElements.begin(); it != anElements.end(); ++it) { - QList found = myElements->findItems(*it, Qt::MatchExactly); - foreach(anItem, found) - if (!anItem->isSelected()) - listItemsToSel.push_back(anItem); - } - bool blocked = myElements->signalsBlocked(); - myElements->blockSignals(true); - foreach(anItem, listItemsToSel) anItem->setSelected(true); - myElements->blockSignals(blocked); - onListSelectionChanged(); - listItemsToSel.clear(); + QListWidgetItem* anItem; + QList listItemsToSel; + QStringList anElements = aListStr.split( " ", QString::SkipEmptyParts); + for (QStringList::iterator it = anElements.begin(); it != anElements.end(); ++it) { + QList found = myElements->findItems(*it, Qt::MatchExactly); + foreach(anItem, found) + if (!anItem->isSelected()) + listItemsToSel.push_back(anItem); + } + bool blocked = myElements->signalsBlocked(); + myElements->blockSignals(true); + foreach(anItem, listItemsToSel) anItem->setSelected(true); + myElements->blockSignals(blocked); + onListSelectionChanged(); + listItemsToSel.clear(); } } } - - if (!myActor) { - if (!myGroup->_is_nil()) - myActor = SMESH::FindActorByObject(myGroup); - else if(!myGroupOnGeom->_is_nil()) - myActor = SMESH::FindActorByObject(myGroupOnGeom); - else - myActor = SMESH::FindActorByObject(myMesh); + + if (myActorsList.count() == 0) { + if (!myGroup->_is_nil()) { + SMESH_Actor* anActor = SMESH::FindActorByObject(myGroup); + if ( anActor ) + myActorsList.append( anActor ); + } + else if(!myGroupOnGeom->_is_nil()) { + SMESH_Actor* anActor = SMESH::FindActorByObject(myGroupOnGeom); + if ( anActor ) + myActorsList.append( anActor ); + } + else { + SMESH_Actor* anActor = SMESH::FindActorByObject( myMesh ); + if ( anActor ) + myActorsList.append( anActor ); + } } // somehow, if we display the mesh, while selecting from another actor, // the mesh becomes pickable, and there is no way to select any element - if (myActor) - SMESH::SetPickable(myActor); + if (myActorsList.count() > 0) { + QListIterator it( myActorsList ); + while ( it.hasNext() ) { + SMESH_Actor* anActor = it.next(); + if ( IsActorVisible(anActor) ) + anActor->SetPickable(true); + } + } myIsBusy = false; } @@ -1387,11 +1420,14 @@ void SMESHGUI_GroupDlg::setCurrentSelection() QPushButton* send = (QPushButton*)sender(); myCurrentLineEdit = 0; if (send == myMeshGroupBtn) { - myCurrentLineEdit = myMeshGroupLine; + disconnect(myMeshGroupBtn, SIGNAL(clicked()), this, SLOT(setCurrentSelection())); + mySelectionMgr->clearSelected(); if (myCreate) setSelectionMode(6); else setSelectionMode(5); + connect(myMeshGroupBtn, SIGNAL(clicked()), this, SLOT(setCurrentSelection())); + myCurrentLineEdit = myMeshGroupLine; onObjectSelectionChanged(); } else if (send == mySubMeshBtn) { @@ -1413,8 +1449,8 @@ void SMESHGUI_GroupDlg::setFilters() { if(myMesh->_is_nil()) { SUIT_MessageBox::critical(this, - tr("SMESH_ERROR"), - tr("NO_MESH_SELECTED")); + tr("SMESH_ERROR"), + tr("NO_MESH_SELECTED")); return; } @@ -1469,7 +1505,7 @@ void SMESHGUI_GroupDlg::onAdd() int aNbSel = aList.Extent(); - if (aNbSel == 0 || !myActor || myMesh->_is_nil()) return; + if (aNbSel == 0 || myActorsList.count() == 0 || myMesh->_is_nil()) return; myIsBusy = true; @@ -1503,26 +1539,36 @@ void SMESHGUI_GroupDlg::onAdd() QString aListStr = ""; int aNbItems = 0; if (myTypeId == 0) { - aNbItems = SMESH::GetNameOfSelectedNodes(mySelector, myActor->getIO(), aListStr); + QListIterator it( myActorsList ); + while ( it.hasNext() ) { + QString tmpStr; + aNbItems += SMESH::GetNameOfSelectedNodes(mySelector, it.next()->getIO(), tmpStr); + aListStr += tmpStr; + } } else { - aNbItems = SMESH::GetNameOfSelectedElements(mySelector, myActor->getIO(), aListStr); + QListIterator it( myActorsList ); + while ( it.hasNext() ) { + QString tmpStr; + aNbItems += SMESH::GetNameOfSelectedElements(mySelector, it.next()->getIO(), tmpStr); + aListStr += tmpStr; + } } if (aNbItems > 0) { QStringList anElements = aListStr.split( " ", QString::SkipEmptyParts); for (QStringList::iterator it = anElements.begin(); it != anElements.end(); ++it) { - QList found = myElements->findItems(*it, Qt::MatchExactly); - if (found.count() == 0) { - anItem = new QListWidgetItem(*it); - myElements->addItem(anItem); - if (!anItem->isSelected()) - listItemsToSel.push_back(anItem); - } - else { - foreach(anItem, found) - if (!anItem->isSelected()) - listItemsToSel.push_back(anItem); - } + QList found = myElements->findItems(*it, Qt::MatchExactly); + if (found.count() == 0) { + anItem = new QListWidgetItem(*it); + myElements->addItem(anItem); + if (!anItem->isSelected()) + listItemsToSel.push_back(anItem); + } + else { + foreach(anItem, found) + if (!anItem->isSelected()) + listItemsToSel.push_back(anItem); + } } bool blocked = myElements->signalsBlocked(); myElements->blockSignals(true); @@ -1542,8 +1588,8 @@ void SMESHGUI_GroupDlg::onAdd() SMESH::SMESH_subMesh_var aSubMesh = SMESH::IObjectToInterface(anIt.Value()); if (!aSubMesh->_is_nil()) { - // check if mesh is the same - if (aSubMesh->GetFather()->GetId() == myMesh->GetId()) { + // 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(); @@ -1553,21 +1599,21 @@ void SMESHGUI_GroupDlg::onAdd() if (found.count() == 0) { anItem = new QListWidgetItem(aText); myElements->addItem(anItem); - if (!anItem->isSelected()) - listItemsToSel.push_back(anItem); + if (!anItem->isSelected()) + listItemsToSel.push_back(anItem); + } + else { + foreach(anItem, found) + if (!anItem->isSelected()) + listItemsToSel.push_back(anItem); } - else { - foreach(anItem, found) - if (!anItem->isSelected()) - listItemsToSel.push_back(anItem); - } } - bool blocked = myElements->signalsBlocked(); - myElements->blockSignals(true); - foreach(anItem, listItemsToSel) anItem->setSelected(true); - myElements->blockSignals(blocked); - onListSelectionChanged(); - listItemsToSel.clear(); + bool blocked = myElements->signalsBlocked(); + myElements->blockSignals(true); + foreach(anItem, listItemsToSel) anItem->setSelected(true); + myElements->blockSignals(blocked); + onListSelectionChanged(); + listItemsToSel.clear(); } catch (const SALOME::SALOME_Exception& ex) { SalomeApp_Tools::QtCatchCorbaException(ex); @@ -1589,32 +1635,32 @@ void SMESHGUI_GroupDlg::onAdd() SMESH::SMESH_GroupBase_var aGroup = SMESH::IObjectToInterface(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(); - for (int i = 0; i < k; i++) { - QString aText = QString::number(anElements[i]); - QList found = myElements->findItems(aText, Qt::MatchExactly); - if (found.count() == 0) { - anItem = new QListWidgetItem(aText); - myElements->addItem(anItem); - if (!anItem->isSelected()) - listItemsToSel.push_back(anItem); - } - else { - foreach(anItem, found) - if (!anItem->isSelected()) - listItemsToSel.push_back(anItem); - } - } - bool blocked = myElements->signalsBlocked(); - myElements->blockSignals(true); - foreach(anItem, listItemsToSel) anItem->setSelected(true); - myElements->blockSignals(blocked); - onListSelectionChanged(); - listItemsToSel.clear(); - } + // 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(); + for (int i = 0; i < k; i++) { + QString aText = QString::number(anElements[i]); + QList found = myElements->findItems(aText, Qt::MatchExactly); + if (found.count() == 0) { + anItem = new QListWidgetItem(aText); + myElements->addItem(anItem); + if (!anItem->isSelected()) + listItemsToSel.push_back(anItem); + } + else { + foreach(anItem, found) + if (!anItem->isSelected()) + listItemsToSel.push_back(anItem); + } + } + bool blocked = myElements->signalsBlocked(); + myElements->blockSignals(true); + foreach(anItem, listItemsToSel) anItem->setSelected(true); + myElements->blockSignals(blocked); + onListSelectionChanged(); + listItemsToSel.clear(); + } } } mySelectGroup->setChecked(false); @@ -1652,19 +1698,19 @@ void SMESHGUI_GroupDlg::onAdd() int k = anElements->length(); for (int i = 0; i < k; i++) { - QString aText = QString::number(anElements[i]); - QList found = myElements->findItems(aText, Qt::MatchExactly); - if (found.count() == 0) { - anItem = new QListWidgetItem(aText); - myElements->addItem(anItem); - if (!anItem->isSelected()) - listItemsToSel.push_back(anItem); - } - else { - foreach(anItem, found) - if (!anItem->isSelected()) - listItemsToSel.push_back(anItem); - } + QString aText = QString::number(anElements[i]); + QList found = myElements->findItems(aText, Qt::MatchExactly); + if (found.count() == 0) { + anItem = new QListWidgetItem(aText); + myElements->addItem(anItem); + if (!anItem->isSelected()) + listItemsToSel.push_back(anItem); + } + else { + foreach(anItem, found) + if (!anItem->isSelected()) + listItemsToSel.push_back(anItem); + } } bool blocked = myElements->signalsBlocked(); myElements->blockSignals(true); @@ -1717,42 +1763,42 @@ void SMESHGUI_GroupDlg::onRemove() SALOME_ListIteratorOfListIO anIt (aList); for ( ; anIt.More(); anIt.Next()) { - SMESH::SMESH_subMesh_var aSubMesh = SMESH::IObjectToInterface(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(); - for (int i = 0; i < k; i++) { - QList found = - myElements->findItems(QString::number(anElements[i]), Qt::MatchExactly); - QListWidgetItem* anItem; - foreach(anItem, found) 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(); - for (int i = 0; i < k; i++) { - QList found = - myElements->findItems(QString::number(anElements[i]), Qt::MatchExactly); - QListWidgetItem* anItem; - foreach(anItem, found) delete anItem; - } - } - catch (const SALOME::SALOME_Exception& ex) { - SalomeApp_Tools::QtCatchCorbaException(ex); - } - } - } - } + SMESH::SMESH_subMesh_var aSubMesh = SMESH::IObjectToInterface(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(); + for (int i = 0; i < k; i++) { + QList found = + myElements->findItems(QString::number(anElements[i]), Qt::MatchExactly); + QListWidgetItem* anItem; + foreach(anItem, found) 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(); + for (int i = 0; i < k; i++) { + QList found = + myElements->findItems(QString::number(anElements[i]), Qt::MatchExactly); + QListWidgetItem* anItem; + foreach(anItem, found) delete anItem; + } + } + catch (const SALOME::SALOME_Exception& ex) { + SalomeApp_Tools::QtCatchCorbaException(ex); + } + } + } + } } } else if (myCurrentLineEdit == myGroupLine) { @@ -1763,20 +1809,20 @@ void SMESHGUI_GroupDlg::onRemove() SALOME_ListIteratorOfListIO anIt (aList); for ( ; anIt.More(); anIt.Next()) { - SMESH::SMESH_Group_var aGroup = SMESH::IObjectToInterface(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(); - for (int i = 0; i < k; i++) { - QList found = - myElements->findItems(QString::number(anElements[i]), Qt::MatchExactly); - QListWidgetItem* anItem; - foreach(anItem, found) delete anItem; - } - } - } + SMESH::SMESH_Group_var aGroup = SMESH::IObjectToInterface(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(); + for (int i = 0; i < k; i++) { + QList found = + myElements->findItems(QString::number(anElements[i]), Qt::MatchExactly); + QListWidgetItem* anItem; + foreach(anItem, found) delete anItem; + } + } + } } } } @@ -1804,7 +1850,7 @@ void SMESHGUI_GroupDlg::onSort() int id = myElements->item(i)->text().toInt(); anArray[i] = id; if (myElements->item(i)->isSelected()) - aSelected.append(id); + aSelected.append(id); } // sort & update list std::sort(anArray.begin(), anArray.end()); @@ -1816,7 +1862,7 @@ void SMESHGUI_GroupDlg::onSort() anItem = new QListWidgetItem(QString::number(anArray[i])); myElements->addItem(anItem); if (aSelected.contains(anArray[i])) - listItemsToSel.push_back(anItem); + listItemsToSel.push_back(anItem); } bool blocked = myElements->signalsBlocked(); myElements->blockSignals(true); @@ -1836,6 +1882,15 @@ void SMESHGUI_GroupDlg::closeEvent (QCloseEvent*) onClose(); } +//================================================================================= +// function : onVisibilityChanged() +// purpose : +//================================================================================= +void SMESHGUI_GroupDlg::onVisibilityChanged() +{ + SetAppropriateActor(); +} + //================================================================================= // function : SMESHGUI_GroupDlg::onClose // purpose : SLOT called when "Close" button pressed. Close dialog @@ -1875,10 +1930,10 @@ void SMESHGUI_GroupDlg::onHelp() platform = "application"; #endif SUIT_MessageBox::warning(this, tr( "WRN_WARNING" ), - tr( "EXTERNAL_BROWSER_CANNOT_SHOW_PAGE" ). - arg(app->resourceMgr()->stringValue( "ExternalBrowser", - platform)). - arg(myHelpFileName)); + tr( "EXTERNAL_BROWSER_CANNOT_SHOW_PAGE" ). + arg(app->resourceMgr()->stringValue( "ExternalBrowser", + platform)). + arg(myHelpFileName)); } } @@ -1979,7 +2034,7 @@ void SMESHGUI_GroupDlg::onGeomSelectionButton(bool isBtnOn) myCurrentLineEdit = myGeomGroupLine; QAction* a = myGeomPopup->exec( QCursor::pos() ); if (!a || myActions[a] == DIRECT_GEOM_INDEX) - setSelectionMode(7); + setSelectionMode(7); } else if (!isBtnOn) { @@ -1999,17 +2054,17 @@ void SMESHGUI_GroupDlg::onGeomPopup( QAction* a ) { mySelectionMode = -1; if ( !myShapeByMeshOp ) { - myShapeByMeshOp = new SMESHGUI_ShapeByMeshOp(true); - connect(myShapeByMeshOp, SIGNAL(committed(SUIT_Operation*)), - SLOT(onPublishShapeByMeshDlg(SUIT_Operation*))); - connect(myShapeByMeshOp, SIGNAL(aborted(SUIT_Operation*)), - SLOT(onCloseShapeByMeshDlg(SUIT_Operation*))); + myShapeByMeshOp = new SMESHGUI_ShapeByMeshOp(true); + connect(myShapeByMeshOp, SIGNAL(committed(SUIT_Operation*)), + SLOT(onPublishShapeByMeshDlg(SUIT_Operation*))); + connect(myShapeByMeshOp, SIGNAL(aborted(SUIT_Operation*)), + SLOT(onCloseShapeByMeshDlg(SUIT_Operation*))); } // set mesh object to SMESHGUI_ShapeByMeshOp and start it if ( !myMesh->_is_nil() ) { - myIsBusy = true; + myIsBusy = true; hide(); // stop processing selection - myIsBusy = false; + myIsBusy = false; myShapeByMeshOp->setModule( mySMESHGUI ); myShapeByMeshOp->setStudy( 0 ); // it's really necessary myShapeByMeshOp->SetMesh( myMesh ); @@ -2036,12 +2091,12 @@ void SMESHGUI_GroupDlg::onPublishShapeByMeshDlg(SUIT_Operation* op) QString ID = aGeomVar->GetStudyEntry(); _PTR(Study) aStudy = SMESH::GetActiveStudyDocument(); if ( _PTR(SObject) aGeomSO = aStudy->FindObjectID( ID.toLatin1().data() )) { - SALOME_ListIO anIOList; - Handle(SALOME_InteractiveObject) anIO = new SALOME_InteractiveObject - ( aGeomSO->GetID().c_str(), "SMESH", aGeomSO->GetName().c_str() ); - anIOList.Append( anIO ); - mySelectionMgr->setSelectedObjects( anIOList, false ); - onObjectSelectionChanged(); + SALOME_ListIO anIOList; + Handle(SALOME_InteractiveObject) anIO = new SALOME_InteractiveObject + ( aGeomSO->GetID().c_str(), "SMESH", aGeomSO->GetName().c_str() ); + anIOList.Append( anIO ); + mySelectionMgr->setSelectedObjects( anIOList, false ); + onObjectSelectionChanged(); } } } @@ -2069,8 +2124,8 @@ void SMESHGUI_GroupDlg::onCloseShapeByMeshDlg(SUIT_Operation* op) void SMESHGUI_GroupDlg::setGroupColor( const SALOMEDS::Color& theColor ) { QColor aQColor( (int)( theColor.R * 255.0 ), - (int)( theColor.G * 255.0 ), - (int)( theColor.B * 255.0 ) ); + (int)( theColor.G * 255.0 ), + (int)( theColor.B * 255.0 ) ); setGroupQColor( aQColor ); } @@ -2141,8 +2196,8 @@ void SMESHGUI_GroupDlg::setDefaultGroupColor() SALOMEDS::Color aColor = SMESHGUI::getUniqueColor( aReservedColors ); aQColor.setRgb( (int)( aColor.R * 255.0 ), - (int)( aColor.G * 255.0 ), - (int)( aColor.B * 255.0 ) ); + (int)( aColor.G * 255.0 ), + (int)( aColor.B * 255.0 ) ); } @@ -2158,81 +2213,78 @@ void SMESHGUI_GroupDlg::setDefaultGroupColor() bool SMESHGUI_GroupDlg::SetAppropriateActor() { bool isActor = false; + myActorsList.clear(); if (myMesh->_is_nil()) return false; SVTK_ViewWindow* aViewWindow = SMESH::GetCurrentVtkView(); - // try mesh actor - myActor = SMESH::FindActorByObject(myMesh); - if (myActor && myActor->hasIO()) - { - isActor = true; - if (aViewWindow && !aViewWindow->isVisible(myActor->getIO())) - isActor = false; - } - - // try current group actor - if (!isActor) { - if (!myGroup->_is_nil()) { - myActor = SMESH::FindActorByObject(myGroup); - if (myActor && myActor->hasIO()) - { - isActor = true; - if (aViewWindow && !aViewWindow->isVisible(myActor->getIO())) - isActor = false; + if (myGeomGroupBtn->isChecked()) { // try current group on geometry actor + if (!isActor) { + if (!myGroupOnGeom->_is_nil()) { + SMESH_Actor* anActor = SMESH::FindActorByObject(myGroupOnGeom); + if (anActor && anActor->hasIO()) + { + isActor = true; + if (aViewWindow && !aViewWindow->isVisible(anActor->getIO())) + isActor = false; + else + myActorsList.append(anActor); + } } } - } - - // try current group on geometry actor - if (!isActor) { - if (!myGroupOnGeom->_is_nil()) { - myActor = SMESH::FindActorByObject(myGroupOnGeom); - if (myActor && myActor->hasIO()) + } else { + // try mesh actor + SMESH_Actor* anActor = SMESH::FindActorByObject(myMesh); + if (anActor && anActor->hasIO()) { isActor = true; - if (aViewWindow && !aViewWindow->isVisible(myActor->getIO())) + if (aViewWindow && !aViewWindow->isVisible(anActor->getIO())) isActor = false; + else + myActorsList.append(anActor); } - } - } - - // try any visible actor of group or submesh of current mesh - if (!isActor && aViewWindow) { - // mesh entry - _PTR(SObject) aSObject = SMESH::FindSObject(myMesh); - if (aSObject) { - CORBA::String_var meshEntry = aSObject->GetID().c_str(); - int len = strlen(meshEntry); - - // iterate on all actors in current view window, search for - // any visible actor, that belongs to group or submesh of current mesh - VTK::ActorCollectionCopy aCopy(aViewWindow->getRenderer()->GetActors()); - vtkActorCollection *aCollection = aCopy.GetActors(); - int nbItems = aCollection->GetNumberOfItems(); - for (int i=0; i(aCollection->GetItemAsObject(i)); - if (anActor && anActor->hasIO()) { - Handle(SALOME_InteractiveObject) anIO = anActor->getIO(); - if (aViewWindow->isVisible(anIO)) { - if (anIO->hasEntry() && strncmp(anIO->getEntry(), meshEntry, len) == 0) { - myActor = anActor; - isActor = true; + + // try any visible actor of group or submesh of current mesh + if (aViewWindow) { + // mesh entry + _PTR(SObject) aSObject = SMESH::FindSObject(myMesh); + if (aSObject) { + CORBA::String_var meshEntry = aSObject->GetID().c_str(); + int len = strlen(meshEntry); + + // iterate on all actors in current view window, search for + // any visible actor, that belongs to group or submesh of current mesh + VTK::ActorCollectionCopy aCopy(aViewWindow->getRenderer()->GetActors()); + vtkActorCollection *aCollection = aCopy.GetActors(); + int nbItems = aCollection->GetNumberOfItems(); + for (int i=0; i(aCollection->GetItemAsObject(i)); + if (anActor && anActor->hasIO()) { + Handle(SALOME_InteractiveObject) anIO = anActor->getIO(); + if (aViewWindow->isVisible(anIO)) { + if (anIO->hasEntry() && strncmp(anIO->getEntry(), meshEntry, len) == 0) + myActorsList.append(anActor); + } } } - } } } } - - if (isActor) - SMESH::SetPickable(myActor); - - return isActor; + + if (myActorsList.count() > 0) { + QListIterator it( myActorsList ); + while ( it.hasNext() ) { + SMESH_Actor* anActor = it.next(); + if ( IsActorVisible(anActor) ) + anActor->SetPickable(true); + } + } + + return ( isActor || (myActorsList.count() > 0) ); } - + //======================================================================= //function : setShowEntityMode //purpose : make shown only entity corresponding to my type @@ -2266,3 +2318,15 @@ void SMESHGUI_GroupDlg::restoreShowEntityMode() } myStoredShownEntity = 0; } + +//======================================================================= +//function : IsActorVisible +//purpose : return visibility of the actor +//======================================================================= +bool SMESHGUI_GroupDlg::IsActorVisible( SMESH_Actor* theActor ) +{ + SVTK_ViewWindow* aViewWindow = SMESH::GetCurrentVtkView(); + if (theActor && aViewWindow) + return aViewWindow->isVisible(theActor->getIO()); + return false; +} diff --git a/src/SMESHGUI/SMESHGUI_GroupDlg.h b/src/SMESHGUI/SMESHGUI_GroupDlg.h index 39a417887..2a01d48af 100644 --- a/src/SMESHGUI/SMESHGUI_GroupDlg.h +++ b/src/SMESHGUI/SMESHGUI_GroupDlg.h @@ -68,9 +68,9 @@ class SMESHGUI_EXPORT SMESHGUI_GroupDlg : public QDialog public: SMESHGUI_GroupDlg( SMESHGUI*, - SMESH::SMESH_Mesh_ptr = SMESH::SMESH_Mesh::_nil() ); + SMESH::SMESH_Mesh_ptr = SMESH::SMESH_Mesh::_nil() ); SMESHGUI_GroupDlg( SMESHGUI*, - SMESH::SMESH_GroupBase_ptr, + SMESH::SMESH_GroupBase_ptr, const bool theIsConvert = false ); ~SMESHGUI_GroupDlg(); @@ -90,6 +90,7 @@ private slots: bool onApply(); void onHelp(); void onDeactivate(); + void onVisibilityChanged(); void onListSelectionChanged(); void onObjectSelectionChanged(); @@ -126,6 +127,8 @@ private: bool SetAppropriateActor(); void setShowEntityMode(); void restoreShowEntityMode(); + + bool IsActorVisible( SMESH_Actor* ); void setGroupColor( const SALOMEDS::Color& ); SALOMEDS::Color getGroupColor() const; @@ -137,7 +140,6 @@ private: SMESHGUI* mySMESHGUI; /* Current SMESHGUI object */ LightApp_SelectionMgr* mySelectionMgr; /* User shape selection */ - SMESH_Actor* myActor; /* Current mesh actor */ int myGrpTypeId; /* Current group type id : standalone or group on geometry */ int myTypeId; /* Current type id = radio button id */ int myStoredShownEntity; /* Store ShowEntity mode of myMesh */ @@ -180,6 +182,7 @@ private: SMESHGUI_ShapeByMeshOp* myShapeByMeshOp; SMESH::SMESH_Mesh_var myMesh; + QList myActorsList; SMESH::SMESH_Group_var myGroup; SMESH::SMESH_GroupOnGeom_var myGroupOnGeom; QList myIdList; diff --git a/src/SMESHGUI/SMESHGUI_GroupOpDlg.cxx b/src/SMESHGUI/SMESHGUI_GroupOpDlg.cxx index 44cdfdf94..13f5f4a93 100644 --- a/src/SMESHGUI/SMESHGUI_GroupOpDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_GroupOpDlg.cxx @@ -131,7 +131,7 @@ QWidget* SMESHGUI_GroupOpDlg::createMainFrame( QWidget* theParent ) QLabel* aColorLab = new QLabel(tr( "SMESH_CHECK_COLOR" ), aColorBox ); myColorBtn = new QtxColorButton(aColorBox); myColorBtn->setSizePolicy( QSizePolicy::MinimumExpanding, - myColorBtn->sizePolicy().verticalPolicy() ); + myColorBtn->sizePolicy().verticalPolicy() ); aColorBoxLayout->addWidget(aColorLab); aColorBoxLayout->addWidget(myColorBtn); @@ -242,7 +242,7 @@ bool SMESHGUI_GroupOpDlg::isValid( const QList& theL if ( theListGrp.isEmpty() ) { SUIT_MessageBox::information( this, tr("SMESH_INSUFFICIENT_DATA"), - tr("INCORRECT_ARGUMENTS") ); + tr("INCORRECT_ARGUMENTS") ); return false; } @@ -289,14 +289,14 @@ bool SMESHGUI_GroupOpDlg::isValid( const QList& theL if ( aMeshId == -1 ) { SUIT_MessageBox::information(this, tr("SMESH_INSUFFICIENT_DATA"), - tr("DIFF_MESHES")); + tr("DIFF_MESHES")); return false; } if ( aGrpType == -1 ) { SUIT_MessageBox::information(this, tr("SMESH_INSUFFICIENT_DATA"), - tr("DIFF_TYPES")); + tr("DIFF_TYPES")); return false; } @@ -343,10 +343,10 @@ void SMESHGUI_GroupOpDlg::onHelp() platform = "application"; #endif SUIT_MessageBox::warning(this, tr("WRN_WARNING"), - tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). - arg(app->resourceMgr()->stringValue("ExternalBrowser", - platform)). - arg(myHelpFileName)); + tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). + arg(app->resourceMgr()->stringValue("ExternalBrowser", + platform)). + arg(myHelpFileName)); } } @@ -610,7 +610,7 @@ bool SMESHGUI_UnionGroupsDlg::onApply() else { SUIT_MessageBox::critical(this, tr("SMESH_ERROR"), - tr("SMESH_OPERATION_FAILED")); + tr("SMESH_OPERATION_FAILED")); return false; } } @@ -712,7 +712,7 @@ bool SMESHGUI_IntersectGroupsDlg::onApply() else { SUIT_MessageBox::critical(this, tr("SMESH_ERROR"), - tr("SMESH_OPERATION_FAILED")); + tr("SMESH_OPERATION_FAILED")); return false; } } @@ -878,7 +878,7 @@ bool SMESHGUI_CutGroupsDlg::onApply() else { SUIT_MessageBox::critical(this, tr("SMESH_ERROR"), - tr("SMESH_OPERATION_FAILED")); + tr("SMESH_OPERATION_FAILED")); return false; } } @@ -1029,7 +1029,7 @@ bool SMESHGUI_DimGroupDlg::onApply() else { SUIT_MessageBox::critical(this, tr("SMESH_ERROR"), - tr("SMESH_OPERATION_FAILED")); + tr("SMESH_OPERATION_FAILED")); return false; } } diff --git a/src/SMESHGUI/SMESHGUI_GroupUtils.cxx b/src/SMESHGUI/SMESHGUI_GroupUtils.cxx index e645257e2..6b4079b19 100644 --- a/src/SMESHGUI/SMESHGUI_GroupUtils.cxx +++ b/src/SMESHGUI/SMESHGUI_GroupUtils.cxx @@ -35,13 +35,13 @@ namespace SMESH { SMESH::SMESH_Group_var AddGroup( SMESH::SMESH_Mesh_ptr theMesh, - SMESH::ElementType theType, - const QString& theGroupName ) + SMESH::ElementType theType, + const QString& theGroupName ) { SMESH::SMESH_Group_var aGroup; try { if ( !theMesh->_is_nil() ) - aGroup = theMesh->CreateGroup( theType, theGroupName.toLatin1().data() ); + aGroup = theMesh->CreateGroup( theType, theGroupName.toLatin1().data() ); } catch( const SALOME::SALOME_Exception& S_ex ) { SalomeApp_Tools::QtCatchCorbaException( S_ex ); diff --git a/src/SMESHGUI/SMESHGUI_GroupUtils.h b/src/SMESHGUI/SMESHGUI_GroupUtils.h index e0673a783..0482e78c9 100644 --- a/src/SMESHGUI/SMESHGUI_GroupUtils.h +++ b/src/SMESHGUI/SMESHGUI_GroupUtils.h @@ -40,8 +40,8 @@ namespace SMESH { SMESHGUI_EXPORT SMESH::SMESH_Group_var AddGroup( SMESH::SMESH_Mesh_ptr, - SMESH::ElementType, - const QString& ); + SMESH::ElementType, + const QString& ); } #endif // SMESHGUI_GROUPUTILS_H diff --git a/src/SMESHGUI/SMESHGUI_Hypotheses.cxx b/src/SMESHGUI/SMESHGUI_Hypotheses.cxx index e9391ba04..b0ced7bb6 100644 --- a/src/SMESHGUI/SMESHGUI_Hypotheses.cxx +++ b/src/SMESHGUI/SMESHGUI_Hypotheses.cxx @@ -68,7 +68,7 @@ void SMESHGUI_GenericHypothesisCreator::setInitParamsHypothesis(SMESH::SMESH_Hyp } void SMESHGUI_GenericHypothesisCreator::create( SMESH::SMESH_Hypothesis_ptr initParamsHyp, - const QString& theHypName, + const QString& theHypName, QWidget* parent, QObject* obj, const QString& slot ) { MESSAGE( "Creation of hypothesis with initial params" ); @@ -77,8 +77,8 @@ void SMESHGUI_GenericHypothesisCreator::create( SMESH::SMESH_Hypothesis_ptr init } void SMESHGUI_GenericHypothesisCreator::create( bool isAlgo, - const QString& theHypName, - QWidget* theParent, QObject* obj, const QString& slot ) + const QString& theHypName, + QWidget* theParent, QObject* obj, const QString& slot ) { MESSAGE( "Creation of hypothesis" ); @@ -97,8 +97,8 @@ void SMESHGUI_GenericHypothesisCreator::create( bool isAlgo, } void SMESHGUI_GenericHypothesisCreator::edit( SMESH::SMESH_Hypothesis_ptr theHypothesis, - const QString& theHypName, - QWidget* theParent, QObject* obj, const QString& slot ) + const QString& theHypName, + QWidget* theParent, QObject* obj, const QString& slot ) { if( CORBA::is_nil( theHypothesis ) ) return; @@ -111,8 +111,8 @@ void SMESHGUI_GenericHypothesisCreator::edit( SMESH::SMESH_Hypothesis_ptr theHyp } void SMESHGUI_GenericHypothesisCreator::editHypothesis( SMESH::SMESH_Hypothesis_ptr h, - const QString& theHypName, - QWidget* theParent, + const QString& theHypName, + QWidget* theParent, QObject* obj, const QString& slot ) { myHypName = theHypName; @@ -173,7 +173,7 @@ QFrame* SMESHGUI_GenericHypothesisCreator::buildStdFrame() case QVariant::Int: { SalomeApp_IntSpinBox* sb = new SalomeApp_IntSpinBox( GroupC1 ); - sb->setObjectName( (*anIt).myName ); + sb->setObjectName( (*anIt).myName ); attuneStdWidget( sb, i ); sb->setValue( (*anIt).myValue.toInt() ); connect( sb, SIGNAL( valueChanged( int ) ), this, SLOT( onValueChanged() ) ); @@ -183,7 +183,7 @@ QFrame* SMESHGUI_GenericHypothesisCreator::buildStdFrame() case QVariant::Double: { SalomeApp_DoubleSpinBox* sb = new SMESHGUI_SpinBox( GroupC1 ); - sb->setObjectName( (*anIt).myName ); + sb->setObjectName( (*anIt).myName ); attuneStdWidget( sb, i ); sb->setValue( (*anIt).myValue.toDouble() ); connect( sb, SIGNAL( valueChanged( double ) ), this, SLOT( onValueChanged() ) ); @@ -275,20 +275,23 @@ void SMESHGUI_GenericHypothesisCreator::onDialogFinished( int result ) if( listSOmesh.size() > 0 ) for( int i = 0; i < listSOmesh.size(); i++ ) { - _PTR(SObject) submSO = listSOmesh[i]; - SMESH::SMESH_Mesh_var aMesh = SMESH::SObjectToInterface( submSO ); - SMESH::SMESH_subMesh_var aSubMesh = SMESH::SObjectToInterface( submSO ); - if( !aSubMesh->_is_nil() ) - aMesh = aSubMesh->GetFather(); - _PTR(SObject) meshSO = SMESH::FindSObject( aMesh ); - SMESH::ModifiedMesh( meshSO, false, aMesh->NbNodes()==0); + _PTR(SObject) submSO = listSOmesh[i]; + SMESH::SMESH_Mesh_var aMesh = SMESH::SObjectToInterface( submSO ); + SMESH::SMESH_subMesh_var aSubMesh = SMESH::SObjectToInterface( submSO ); + if( !aSubMesh->_is_nil() ) + aMesh = aSubMesh->GetFather(); + _PTR(SObject) meshSO = SMESH::FindSObject( aMesh ); + SMESH::ModifiedMesh( meshSO, false, aMesh->NbNodes()==0); } } SMESHGUI::GetSMESHGUI()->updateObjBrowser( true, 0 ); myHypo = SMESH::SMESH_Hypothesis::_nil(); myInitParamsHypo = SMESH::SMESH_Hypothesis::_nil(); - myDlg->close(); myDlg = 0; - //delete myDlg; myDlg = 0; + + disconnect( myDlg, SIGNAL( finished( int ) ), this, SLOT( onDialogFinished( int ) ) ); + myDlg->close(); + //delete myDlg; + myDlg = 0; emit finished( result ); } @@ -507,7 +510,7 @@ QString SMESHGUI_GenericHypothesisCreator::helpPage() const aHelpFileName = "a1d_meshing_hypo_page.html#max_length_anchor"; else if ( aHypType == "Arithmetic1D") aHelpFileName = "a1d_meshing_hypo_page.html#arithmetic_1d_anchor"; - else if ( aHypType == "FixedPointsc1D") + else if ( aHypType == "FixedPoints1D") aHelpFileName = "a1d_meshing_hypo_page.html#fixed_points_1d_anchor"; else if ( aHypType == "MaxElementArea") aHelpFileName = "a2d_meshing_hypo_page.html#max_element_area_anchor"; @@ -529,11 +532,16 @@ QString SMESHGUI_GenericHypothesisCreator::helpPage() const aHelpFileName = "projection_algos_page.html"; else if ( aHypType == "NumberOfLayers") aHelpFileName = "radial_prism_algo_page.html"; + else if ( aHypType == "NumberOfLayers2D") + aHelpFileName = "radial_quadrangle_1D2D_algo_page.html"; else if ( aHypType == "LayerDistribution") aHelpFileName = "radial_prism_algo_page.html"; + else if ( aHypType == "LayerDistribution2D") + aHelpFileName = "radial_quadrangle_1D2D_algo_page.html"; else if ( aHypType == "SegmentLengthAroundVertex") aHelpFileName = "segments_around_vertex_algo_page.html"; - + else if ( aHypType == "QuadrangleParams") + aHelpFileName = "a2d_meshing_hypo_page.html#hypo_quad_params_anchor"; return aHelpFileName; } @@ -623,10 +631,10 @@ void SMESHGUI_HypothesisDlg::onHelp() platform = "application"; #endif SUIT_MessageBox::warning(this, tr("WRN_WARNING"), - tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). - arg(app->resourceMgr()->stringValue("ExternalBrowser", - platform)). - arg(myHelpFileName)); + tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). + arg(app->resourceMgr()->stringValue("ExternalBrowser", + platform)). + arg(myHelpFileName)); } } @@ -641,18 +649,18 @@ void SMESHGUI_HypothesisDlg::setType( const QString& t ) } HypothesisData::HypothesisData( const QString& theTypeName, - const QString& thePluginName, - const QString& theServerLibName, - const QString& theClientLibName, - const QString& theLabel, - const QString& theIconId, - const QList& theDim, - const bool theIsAux, - const QStringList& theNeededHypos, - const QStringList& theOptionalHypos, - const QStringList& theInputTypes, - const QStringList& theOutputTypes, - const bool theIsNeedGeometry, + const QString& thePluginName, + const QString& theServerLibName, + const QString& theClientLibName, + const QString& theLabel, + const QString& theIconId, + const QList& theDim, + const bool theIsAux, + const QStringList& theNeededHypos, + const QStringList& theOptionalHypos, + const QStringList& theInputTypes, + const QStringList& theOutputTypes, + const bool theIsNeedGeometry, const bool supportSub) : TypeName( theTypeName ), PluginName( thePluginName ), @@ -678,8 +686,8 @@ HypothesesSet::HypothesesSet( const QString& theSetName ) } HypothesesSet::HypothesesSet( const QString& theSetName, - const QStringList& theHypoList, - const QStringList& theAlgoList ) + const QStringList& theHypoList, + const QStringList& theAlgoList ) : myHypoSetName( theSetName ), myHypoList( theHypoList ), myAlgoList( theAlgoList ), diff --git a/src/SMESHGUI/SMESHGUI_Hypotheses.h b/src/SMESHGUI/SMESHGUI_Hypotheses.h index cccf69fd6..0891def1b 100644 --- a/src/SMESHGUI/SMESHGUI_Hypotheses.h +++ b/src/SMESHGUI/SMESHGUI_Hypotheses.h @@ -52,7 +52,7 @@ public: virtual ~SMESHGUI_GenericHypothesisCreator(); void create( SMESH::SMESH_Hypothesis_ptr, - const QString&, QWidget*, QObject*, const QString& ); + const QString&, QWidget*, QObject*, const QString& ); void create( bool, const QString&, QWidget*, QObject*, const QString& ); void edit( SMESH::SMESH_Hypothesis_ptr, const QString&, QWidget*, QObject*, const QString& ); void setInitParamsHypothesis(SMESH::SMESH_Hypothesis_ptr); @@ -68,6 +68,9 @@ public: QString getShapeEntry() const { return myShapeEntry; } void setShapeEntry( const QString& theEntry ); + QString getMainShapeEntry() const { return myMainShapeEntry; } + void setMainShapeEntry( const QString& theEntry ) { myMainShapeEntry = theEntry; } + signals: void finished( int ); @@ -102,7 +105,7 @@ protected: static QString stdParamValues( const ListOfStdParams& ); virtual void attuneStdWidget( QWidget*, const int ) const; virtual QWidget* getCustomWidget( const StdParam&, - QWidget*, const int ) const; + QWidget*, const int ) const; virtual bool getParamFromCustomWidget( StdParam&, QWidget* ) const; virtual void valueChanged( QWidget* ); virtual QString caption() const; @@ -126,6 +129,7 @@ private: bool myIsCreate; QtxDialog* myDlg; QString myShapeEntry; + QString myMainShapeEntry; }; class SMESHGUI_HypothesisDlg : public QtxDialog @@ -162,7 +166,7 @@ public: const QList&, const bool, const QStringList&, const QStringList&, const QStringList&, const QStringList&, - const bool=true, const bool supportSub=false ); + const bool=true, const bool supportSub=false ); QString TypeName; //!< hypothesis type name QString PluginName; //!< plugin name diff --git a/src/SMESHGUI/SMESHGUI_HypothesesUtils.cxx b/src/SMESHGUI/SMESHGUI_HypothesesUtils.cxx index 6bfb02b6f..65a599579 100644 --- a/src/SMESHGUI/SMESHGUI_HypothesesUtils.cxx +++ b/src/SMESHGUI/SMESHGUI_HypothesesUtils.cxx @@ -89,39 +89,39 @@ namespace SMESH QList myListOfHypothesesSets; void processHypothesisStatus(const int theHypStatus, - SMESH::SMESH_Hypothesis_ptr theHyp, - const bool theIsAddition) + SMESH::SMESH_Hypothesis_ptr theHyp, + const bool theIsAddition) { if (theHypStatus > SMESH::HYP_OK) { // get Hyp name QString aHypName ("NULL Hypothesis"); if (!CORBA::is_nil(theHyp)) { - _PTR(SObject) Shyp = SMESH::FindSObject(theHyp); - if (Shyp) - // name in study - aHypName = Shyp->GetName().c_str(); - else - // label in xml file - aHypName = GetHypothesisData(theHyp->GetName())->Label; + _PTR(SObject) Shyp = SMESH::FindSObject(theHyp); + if (Shyp) + // name in study + aHypName = Shyp->GetName().c_str(); + else + // label in xml file + aHypName = GetHypothesisData(theHyp->GetName())->Label; } // message bool isFatal = (theHypStatus >= SMESH::HYP_UNKNOWN_FATAL); QString aMsg; if (theIsAddition) - aMsg = (isFatal ? "SMESH_CANT_ADD_HYP" : "SMESH_ADD_HYP_WRN"); + aMsg = (isFatal ? "SMESH_CANT_ADD_HYP" : "SMESH_ADD_HYP_WRN"); else - aMsg = (isFatal ? "SMESH_CANT_RM_HYP" : "SMESH_RM_HYP_WRN"); + aMsg = (isFatal ? "SMESH_CANT_RM_HYP" : "SMESH_RM_HYP_WRN"); aMsg = QObject::tr(aMsg.toLatin1().data()).arg(aHypName) + - QObject::tr(QString("SMESH_HYP_%1").arg(theHypStatus).toLatin1().data()); + QObject::tr(QString("SMESH_HYP_%1").arg(theHypStatus).toLatin1().data()); if ( theHypStatus == SMESH::HYP_HIDDEN_ALGO ) // PAL18501 aMsg = aMsg.arg( GetHypothesisData(theHyp->GetName())->Dim[0] ); SUIT_MessageBox::warning(SMESHGUI::desktop(), - QObject::tr("SMESH_WRN_WARNING"), - aMsg); + QObject::tr("SMESH_WRN_WARNING"), + aMsg); } } @@ -138,73 +138,73 @@ namespace SMESH QString HypsXml; char* cenv = getenv("SMESH_MeshersList"); if (cenv) - HypsXml.sprintf("%s", cenv); + HypsXml.sprintf("%s", cenv); QStringList HypsXmlList = HypsXml.split(":", QString::SkipEmptyParts); if (HypsXmlList.count() == 0) { - SUIT_MessageBox::critical(SMESHGUI::desktop(), - QObject::tr("SMESH_WRN_WARNING"), - QObject::tr("MESHERS_FILE_NO_VARIABLE")); - return; + SUIT_MessageBox::critical(SMESHGUI::desktop(), + QObject::tr("SMESH_WRN_WARNING"), + QObject::tr("MESHERS_FILE_NO_VARIABLE")); + return; } // loop on files in HypsXml QString aNoAccessFiles; for (int i = 0; i < HypsXmlList.count(); i++) { - QString HypsXml = HypsXmlList[ i ]; + QString HypsXml = HypsXmlList[ i ]; - // Find full path to the resource XML file - QString xmlFile = resMgr->path("resources", "SMESH", HypsXml + ".xml"); + // Find full path to the resource XML file + QString xmlFile = resMgr->path("resources", "SMESH", HypsXml + ".xml"); if ( xmlFile.isEmpty() ) // try PLUGIN resources xmlFile = resMgr->path("resources", HypsXml, HypsXml + ".xml"); - QFile file (xmlFile); - if (file.exists() && file.open(QIODevice::ReadOnly)) { - file.close(); - - SMESHGUI_XmlHandler* aXmlHandler = new SMESHGUI_XmlHandler(); - ASSERT(aXmlHandler); - - QXmlInputSource source (&file); - QXmlSimpleReader reader; - reader.setContentHandler(aXmlHandler); - reader.setErrorHandler(aXmlHandler); - bool ok = reader.parse(source); - file.close(); - if (ok) { - myHypothesesMap.unite( aXmlHandler->myHypothesesMap ); + QFile file (xmlFile); + if (file.exists() && file.open(QIODevice::ReadOnly)) { + file.close(); + + SMESHGUI_XmlHandler* aXmlHandler = new SMESHGUI_XmlHandler(); + ASSERT(aXmlHandler); + + QXmlInputSource source (&file); + QXmlSimpleReader reader; + reader.setContentHandler(aXmlHandler); + reader.setErrorHandler(aXmlHandler); + bool ok = reader.parse(source); + file.close(); + if (ok) { + myHypothesesMap.unite( aXmlHandler->myHypothesesMap ); myAlgorithmsMap.unite( aXmlHandler->myAlgorithmsMap ); - QList::iterator it, pos = myListOfHypothesesSets.begin(); - for ( it = aXmlHandler->myListOfHypothesesSets.begin(); - it != aXmlHandler->myListOfHypothesesSets.end(); - ++it ) { - myListOfHypothesesSets.insert( pos, *it ); - } - } - else { - SUIT_MessageBox::critical(SMESHGUI::desktop(), - QObject::tr("INF_PARSE_ERROR"), - QObject::tr(aXmlHandler->errorProtocol().toLatin1().data())); - } + QList::iterator it, pos = myListOfHypothesesSets.begin(); + for ( it = aXmlHandler->myListOfHypothesesSets.begin(); + it != aXmlHandler->myListOfHypothesesSets.end(); + ++it ) { + myListOfHypothesesSets.insert( pos, *it ); + } + } + else { + SUIT_MessageBox::critical(SMESHGUI::desktop(), + QObject::tr("INF_PARSE_ERROR"), + QObject::tr(aXmlHandler->errorProtocol().toLatin1().data())); + } delete aXmlHandler; - } - else { - if (aNoAccessFiles.isEmpty()) - aNoAccessFiles = xmlFile; - else - aNoAccessFiles += ", " + xmlFile; - } + } + else { + if (aNoAccessFiles.isEmpty()) + aNoAccessFiles = xmlFile; + else + aNoAccessFiles += ", " + xmlFile; + } } // end loop if (!aNoAccessFiles.isEmpty()) { - QString aMess = QObject::tr("MESHERS_FILE_CANT_OPEN") + " " + aNoAccessFiles + "\n"; - aMess += QObject::tr("MESHERS_FILE_CHECK_VARIABLE"); - wc.suspend(); - SUIT_MessageBox::warning(SMESHGUI::desktop(), - QObject::tr("SMESH_WRN_WARNING"), - aMess); - wc.resume(); + QString aMess = QObject::tr("MESHERS_FILE_CANT_OPEN") + " " + aNoAccessFiles + "\n"; + aMess += QObject::tr("MESHERS_FILE_CHECK_VARIABLE"); + wc.suspend(); + SUIT_MessageBox::warning(SMESHGUI::desktop(), + QObject::tr("SMESH_WRN_WARNING"), + aMess); + wc.resume(); } } } @@ -226,13 +226,13 @@ namespace SMESH for ( anIter = pMap.begin(); anIter != pMap.end(); anIter++ ) { HypothesisData* aData = anIter.value(); if ( ( theDim < 0 || aData->Dim.contains( theDim ) ) && aData->IsAux == isAux) { - if (checkGeometry) { - if (aData->IsNeedGeometry == isNeedGeometry) - aHypList.append(anIter.key()); - } - else { - aHypList.append(anIter.key()); - } + if (checkGeometry) { + if (aData->IsNeedGeometry == isNeedGeometry) + aHypList.append(anIter.key()); + } + else { + aHypList.append(anIter.key()); + } } } return aHypList; @@ -248,11 +248,11 @@ namespace SMESH QList::iterator hypoSet; for ( hypoSet = myListOfHypothesesSets.begin(); - hypoSet != myListOfHypothesesSets.end(); - ++hypoSet ) { + hypoSet != myListOfHypothesesSets.end(); + ++hypoSet ) { HypothesesSet* aSet = *hypoSet; if ( aSet && aSet->count( true ) ) { - aSetNameList.append( aSet->name() ); + aSetNameList.append( aSet->name() ); } } @@ -263,11 +263,11 @@ namespace SMESH { QList::iterator hypoSet; for ( hypoSet = myListOfHypothesesSets.begin(); - hypoSet != myListOfHypothesesSets.end(); - ++hypoSet ) { + hypoSet != myListOfHypothesesSets.end(); + ++hypoSet ) { HypothesesSet* aSet = *hypoSet; if ( aSet && aSet->name() == theSetName ) - return aSet; + return aSet; } return 0; } @@ -347,48 +347,48 @@ namespace SMESH // 3. Load Client Plugin Library try { - // load plugin library - if(MYDEBUG) MESSAGE("Loading client meshers plugin library ..."); - LibHandle libHandle = LoadLib( aClientLibName.toLatin1().data() ); - if (!libHandle) { - // report any error, if occured - if ( MYDEBUG ) { + // load plugin library + if(MYDEBUG) MESSAGE("Loading client meshers plugin library ..."); + LibHandle libHandle = LoadLib( aClientLibName.toLatin1().data() ); + if (!libHandle) { + // report any error, if occured + if ( MYDEBUG ) { #ifdef WIN32 - const char* anError = "Can't load client meshers plugin library"; + const char* anError = "Can't load client meshers plugin library"; #else - const char* anError = dlerror(); + const char* anError = dlerror(); #endif - MESSAGE(anError); - } - } - else { - // get method, returning hypothesis creator - if(MYDEBUG) MESSAGE("Find GetHypothesisCreator() method ..."); - typedef SMESHGUI_GenericHypothesisCreator* (*GetHypothesisCreator) \ - ( const QString& ); - GetHypothesisCreator procHandle = - (GetHypothesisCreator)GetProc(libHandle, "GetHypothesisCreator"); - if (!procHandle) { - if(MYDEBUG) MESSAGE("bad hypothesis client plugin library"); - UnLoadLib(libHandle); - } - else { - // get hypothesis creator - if(MYDEBUG) MESSAGE("Get Hypothesis Creator for " << aHypType.toLatin1().data()); - aCreator = procHandle( aHypType ); - if (!aCreator) { - if(MYDEBUG) MESSAGE("no such a hypothesis in this plugin"); - } - else { - // map hypothesis creator to a hypothesis name + MESSAGE(anError); + } + } + else { + // get method, returning hypothesis creator + if(MYDEBUG) MESSAGE("Find GetHypothesisCreator() method ..."); + typedef SMESHGUI_GenericHypothesisCreator* (*GetHypothesisCreator) \ + ( const QString& ); + GetHypothesisCreator procHandle = + (GetHypothesisCreator)GetProc(libHandle, "GetHypothesisCreator"); + if (!procHandle) { + if(MYDEBUG) MESSAGE("bad hypothesis client plugin library"); + UnLoadLib(libHandle); + } + else { + // get hypothesis creator + if(MYDEBUG) MESSAGE("Get Hypothesis Creator for " << aHypType.toLatin1().data()); + aCreator = procHandle( aHypType ); + if (!aCreator) { + if(MYDEBUG) MESSAGE("no such a hypothesis in this plugin"); + } + else { + // map hypothesis creator to a hypothesis name // BUG 0020378 - //myHypCreatorMap[aHypType] = aCreator; - } - } - } + //myHypCreatorMap[aHypType] = aCreator; + } + } + } } catch (const SALOME::SALOME_Exception& S_ex) { - SalomeApp_Tools::QtCatchCorbaException(S_ex); + SalomeApp_Tools::QtCatchCorbaException(S_ex); } } @@ -397,25 +397,25 @@ namespace SMESH SMESH::SMESH_Hypothesis_ptr CreateHypothesis(const QString& aHypType, - const QString& aHypName, - const bool isAlgo) + const QString& aHypName, + const bool isAlgo) { if(MYDEBUG) MESSAGE("Create " << aHypType.toLatin1().data() << - " with name " << aHypName.toLatin1().data()); + " with name " << aHypName.toLatin1().data()); HypothesisData* aHypData = GetHypothesisData(aHypType); QString aServLib = aHypData->ServerLibName; try { SMESH::SMESH_Hypothesis_var aHypothesis; aHypothesis = SMESHGUI::GetSMESHGen()->CreateHypothesis(aHypType.toLatin1().data(), - aServLib.toLatin1().data()); + aServLib.toLatin1().data()); if (!aHypothesis->_is_nil()) { - _PTR(SObject) aHypSObject = SMESH::FindSObject(aHypothesis.in()); - if (aHypSObject) { - if (!aHypName.isEmpty()) - SMESH::SetName(aHypSObject, aHypName); - SMESHGUI::GetSMESHGUI()->updateObjBrowser(); - return aHypothesis._retn(); - } + _PTR(SObject) aHypSObject = SMESH::FindSObject(aHypothesis.in()); + if (aHypSObject) { + if (!aHypName.isEmpty()) + SMESH::SetName(aHypSObject, aHypName); + SMESHGUI::GetSMESHGUI()->updateObjBrowser(); + return aHypothesis._retn(); + } } } catch (const SALOME::SALOME_Exception & S_ex) { SalomeApp_Tools::QtCatchCorbaException(S_ex); @@ -435,23 +435,23 @@ namespace SMESH _PTR(SObject) SM = SMESH::FindSObject(aMesh); GEOM::GEOM_Object_var aShapeObject = SMESH::GetShapeOnMeshOrSubMesh(SM); try { - res = aMesh->AddHypothesis(aShapeObject, aHyp); - if (res < SMESH::HYP_UNKNOWN_FATAL) { - _PTR(SObject) aSH = SMESH::FindSObject(aHyp); - if (SM && aSH) { - SMESH::ModifiedMesh(SM, false, aMesh->NbNodes()==0); - } - } - if (res > SMESH::HYP_OK) { - wc.suspend(); - processHypothesisStatus(res, aHyp, true); - wc.resume(); - } + res = aMesh->AddHypothesis(aShapeObject, aHyp); + if (res < SMESH::HYP_UNKNOWN_FATAL) { + _PTR(SObject) aSH = SMESH::FindSObject(aHyp); + if (SM && aSH) { + SMESH::ModifiedMesh(SM, false, aMesh->NbNodes()==0); + } + } + if (res > SMESH::HYP_OK) { + wc.suspend(); + processHypothesisStatus(res, aHyp, true); + wc.resume(); + } } catch(const SALOME::SALOME_Exception& S_ex) { - wc.suspend(); - SalomeApp_Tools::QtCatchCorbaException(S_ex); - res = SMESH::HYP_UNKNOWN_FATAL; + wc.suspend(); + SalomeApp_Tools::QtCatchCorbaException(S_ex); + res = SMESH::HYP_UNKNOWN_FATAL; } } return res < SMESH::HYP_UNKNOWN_FATAL; @@ -466,33 +466,33 @@ namespace SMESH if (!aSubMesh->_is_nil() && ! aHyp->_is_nil()) { try { - SMESH::SMESH_Mesh_var aMesh = aSubMesh->GetFather(); - _PTR(SObject) SsubM = SMESH::FindSObject(aSubMesh); - GEOM::GEOM_Object_var aShapeObject = SMESH::GetShapeOnMeshOrSubMesh(SsubM); - if (!aMesh->_is_nil() && SsubM && !aShapeObject->_is_nil()) { - res = aMesh->AddHypothesis(aShapeObject, aHyp); - if (res < SMESH::HYP_UNKNOWN_FATAL) { + SMESH::SMESH_Mesh_var aMesh = aSubMesh->GetFather(); + _PTR(SObject) SsubM = SMESH::FindSObject(aSubMesh); + GEOM::GEOM_Object_var aShapeObject = SMESH::GetShapeOnMeshOrSubMesh(SsubM); + if (!aMesh->_is_nil() && SsubM && !aShapeObject->_is_nil()) { + res = aMesh->AddHypothesis(aShapeObject, aHyp); + if (res < SMESH::HYP_UNKNOWN_FATAL) { _PTR(SObject) meshSO = SMESH::FindSObject(aMesh); if (meshSO) SMESH::ModifiedMesh(meshSO, false, aMesh->NbNodes()==0); - } - if (res > SMESH::HYP_OK) { - wc.suspend(); - processHypothesisStatus(res, aHyp, true); - wc.resume(); - } - } - else { - SCRUTE(aHyp->_is_nil()); - SCRUTE(aMesh->_is_nil()); - SCRUTE(!SsubM); - SCRUTE(aShapeObject->_is_nil()); - } + } + if (res > SMESH::HYP_OK) { + wc.suspend(); + processHypothesisStatus(res, aHyp, true); + wc.resume(); + } + } + else { + SCRUTE(aHyp->_is_nil()); + SCRUTE(aMesh->_is_nil()); + SCRUTE(!SsubM); + SCRUTE(aShapeObject->_is_nil()); + } } catch(const SALOME::SALOME_Exception& S_ex) { - wc.suspend(); - SalomeApp_Tools::QtCatchCorbaException(S_ex); - res = SMESH::HYP_UNKNOWN_FATAL; + wc.suspend(); + SalomeApp_Tools::QtCatchCorbaException(S_ex); + res = SMESH::HYP_UNKNOWN_FATAL; } } else { @@ -511,28 +511,28 @@ namespace SMESH _PTR(Study) aStudy = GetActiveStudyDocument(); _PTR(SObject) aHypObj = aStudy->FindObjectID( IObject->getEntry() ); if( aHypObj ) - { - _PTR(SObject) MorSM = SMESH::GetMeshOrSubmesh( aHypObj ); - _PTR(SObject) aRealHypo; - if( aHypObj->ReferencedObject( aRealHypo ) ) - { - SMESH_Hypothesis_var hypo = SMESH_Hypothesis::_narrow( SObjectToObject( aRealHypo ) ); - RemoveHypothesisOrAlgorithmOnMesh( MorSM, hypo ); - } - else - { - SMESH_Hypothesis_var hypo = SMESH_Hypothesis::_narrow( SObjectToObject( aHypObj ) ); - SObjectList meshList = GetMeshesUsingAlgoOrHypothesis( hypo ); - for( int i = 0; i < meshList.size(); i++ ) - RemoveHypothesisOrAlgorithmOnMesh( meshList[ i ], hypo ); - } - } + { + _PTR(SObject) MorSM = SMESH::GetMeshOrSubmesh( aHypObj ); + _PTR(SObject) aRealHypo; + if( aHypObj->ReferencedObject( aRealHypo ) ) + { + SMESH_Hypothesis_var hypo = SMESH_Hypothesis::_narrow( SObjectToObject( aRealHypo ) ); + RemoveHypothesisOrAlgorithmOnMesh( MorSM, hypo ); + } + else + { + SMESH_Hypothesis_var hypo = SMESH_Hypothesis::_narrow( SObjectToObject( aHypObj ) ); + SObjectList meshList = GetMeshesUsingAlgoOrHypothesis( hypo ); + for( int i = 0; i < meshList.size(); i++ ) + RemoveHypothesisOrAlgorithmOnMesh( meshList[ i ], hypo ); + } + } } catch(const SALOME::SALOME_Exception& S_ex) { - wc.suspend(); - SalomeApp_Tools::QtCatchCorbaException(S_ex); - res = SMESH::HYP_UNKNOWN_FATAL; + wc.suspend(); + SalomeApp_Tools::QtCatchCorbaException(S_ex); + res = SMESH::HYP_UNKNOWN_FATAL; } return res < SMESH::HYP_UNKNOWN_FATAL; } @@ -566,7 +566,7 @@ namespace SMESH } else if(!aMesh->HasShapeToMesh()){ res = aMesh->RemoveHypothesis(aShapeObject, anHyp); - if (res < SMESH::HYP_UNKNOWN_FATAL) { + if (res < SMESH::HYP_UNKNOWN_FATAL) { _PTR(SObject) meshSO = SMESH::FindSObject(aMesh); if (meshSO) SMESH::ModifiedMesh(meshSO, false, aMesh->NbNodes()==0); @@ -579,9 +579,9 @@ namespace SMESH } } } catch(const SALOME::SALOME_Exception& S_ex) { - wc.suspend(); - SalomeApp_Tools::QtCatchCorbaException(S_ex); - res = SMESH::HYP_UNKNOWN_FATAL; + wc.suspend(); + SalomeApp_Tools::QtCatchCorbaException(S_ex); + res = SMESH::HYP_UNKNOWN_FATAL; } } return res < SMESH::HYP_UNKNOWN_FATAL; @@ -596,25 +596,25 @@ namespace SMESH if (!AlgoOrHyp->_is_nil()) { _PTR(SObject) SO_Hypothesis = SMESH::FindSObject(AlgoOrHyp); if (SO_Hypothesis) { - SObjectList listSO = - SMESHGUI::activeStudy()->studyDS()->FindDependances(SO_Hypothesis); - - if(MYDEBUG) MESSAGE("SMESHGUI::GetMeshesUsingAlgoOrHypothesis(): dependency number ="<GetFather(); - if (aFather) { - _PTR(SObject) SOfatherFather = aFather->GetFather(); - if (SOfatherFather) { - if(MYDEBUG) MESSAGE("SMESHGUI::GetMeshesUsingAlgoOrHypothesis(): dependency added to list"); - index++; - listSOmesh.resize(index); - listSOmesh[index - 1] = SOfatherFather; - } - } - } - } + SObjectList listSO = + SMESHGUI::activeStudy()->studyDS()->FindDependances(SO_Hypothesis); + + if(MYDEBUG) MESSAGE("SMESHGUI::GetMeshesUsingAlgoOrHypothesis(): dependency number ="<GetFather(); + if (aFather) { + _PTR(SObject) SOfatherFather = aFather->GetFather(); + if (SOfatherFather) { + if(MYDEBUG) MESSAGE("SMESHGUI::GetMeshesUsingAlgoOrHypothesis(): dependency added to list"); + index++; + listSOmesh.resize(index); + listSOmesh[index - 1] = SOfatherFather; + } + } + } + } } } if (MYDEBUG) MESSAGE("SMESHGUI::GetMeshesUsingAlgoOrHypothesis(): completed"); diff --git a/src/SMESHGUI/SMESHGUI_HypothesesUtils.h b/src/SMESHGUI/SMESHGUI_HypothesesUtils.h index 8ed6cd16f..56a80e434 100644 --- a/src/SMESHGUI/SMESHGUI_HypothesesUtils.h +++ b/src/SMESHGUI/SMESHGUI_HypothesesUtils.h @@ -65,7 +65,7 @@ namespace SMESH QStringList GetAvailableHypotheses( const bool, const int = -1, const bool = false, - const bool = true); + const bool = true); SMESHGUI_EXPORT QStringList GetHypothesesSets(); @@ -77,12 +77,12 @@ namespace SMESH SMESHGUI_EXPORT bool IsAvailableHypothesis( const HypothesisData*, - const QString&, - bool& ); + const QString&, + bool& ); SMESHGUI_EXPORT bool IsCompatibleAlgorithm( const HypothesisData*, - const HypothesisData* ); + const HypothesisData* ); SMESHGUI_EXPORT SMESHGUI_GenericHypothesisCreator* GetHypothesisCreator( const QString& ); @@ -103,7 +103,7 @@ namespace SMESH SMESHGUI_EXPORT bool RemoveHypothesisOrAlgorithmOnMesh( _PTR(SObject), - SMESH::SMESH_Hypothesis_ptr ); + SMESH::SMESH_Hypothesis_ptr ); typedef std::vector<_PTR(SObject)> SObjectList; SObjectList GetMeshesUsingAlgoOrHypothesis( SMESH::SMESH_Hypothesis_ptr ); diff --git a/src/SMESHGUI/SMESHGUI_IdValidator.h b/src/SMESHGUI/SMESHGUI_IdValidator.h index 66dcd6322..0f1cb30ef 100644 --- a/src/SMESHGUI/SMESHGUI_IdValidator.h +++ b/src/SMESHGUI/SMESHGUI_IdValidator.h @@ -47,15 +47,15 @@ public: // truncate extra ids int ind = 0, nbId = 0; while ( ind < input.length() ) { - if ( input.at( ind ) != ' ' ) { - if ( ++nbId > myMaxNbId ) { - input.truncate( ind ); - break; - } - ind = input.indexOf( ' ', ind ); - if ( ind < 0 ) break; - } - ind++; + if ( input.at( ind ) != ' ' ) { + if ( ++nbId > myMaxNbId ) { + input.truncate( ind ); + break; + } + ind = input.indexOf( ' ', ind ); + if ( ind < 0 ) break; + } + ind++; } } if ( pos > input.length() ) diff --git a/src/SMESHGUI/SMESHGUI_Make2DFrom3DOp.cxx b/src/SMESHGUI/SMESHGUI_Make2DFrom3DOp.cxx new file mode 100644 index 000000000..5c6f73c33 --- /dev/null +++ b/src/SMESHGUI/SMESHGUI_Make2DFrom3DOp.cxx @@ -0,0 +1,251 @@ +// Copyright (C) 2007-2009 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +// File : SMESHGUI_Make2DFrom3DOp.cxx +// Author : Open CASCADE S.A.S. +// SMESH includes +// +#include "SMESHGUI_Make2DFrom3DOp.h" + +#include "SMESHGUI.h" +#include "SMESHGUI_Utils.h" +#include "SMESHGUI_VTKUtils.h" +#include "SMESHGUI_MeshUtils.h" +#include "SMESHGUI_MeshInfosBox.h" + +// SALOME GUI includes +#include + +#include +#include +#include +#include + +#include + +// SALOME KERNEL includes +#include +#include + +// Qt includes +// IDL includes +#include +#include CORBA_SERVER_HEADER(SMESH_Gen) +#include CORBA_SERVER_HEADER(SMESH_MeshEditor) + +#include +#include +#include +#include +#include +#include + +// MESH includes +#include "SMDSAbs_ElementType.hxx" +#include "SMDSAbs_ElementType.hxx" + + +#define SPACING 6 +#define MARGIN 11 + +// ========================================================================================= +/*! + * \brief Dialog to show creted mesh statistic + */ +//======================================================================= + +SMESHGUI_Make2DFrom3DDlg::SMESHGUI_Make2DFrom3DDlg( QWidget* parent ) + : SMESHGUI_Dialog( parent, false, true, Close/* | Help*/ ) +{ + setWindowTitle( tr("CAPTION") ); + QVBoxLayout* aDlgLay = new QVBoxLayout (mainFrame()); + aDlgLay->setMargin( 0 ); + aDlgLay->setSpacing( SPACING ); + QFrame* aMainFrame = createMainFrame(mainFrame()); + aDlgLay->addWidget(aMainFrame); + aDlgLay->setStretchFactor(aMainFrame, 1); +} + +// ========================================================================================= +/*! + * \brief Dialog destructor + */ +//======================================================================= + +SMESHGUI_Make2DFrom3DDlg::~SMESHGUI_Make2DFrom3DDlg() +{ +} + +//======================================================================= +// function : createMainFrame() +// purpose : Create frame containing dialog's fields +//======================================================================= + +QFrame* SMESHGUI_Make2DFrom3DDlg::createMainFrame (QWidget* theParent) +{ + QFrame* aFrame = new QFrame(theParent); + + SUIT_ResourceMgr* rm = resourceMgr(); + QPixmap iconCompute (rm->loadPixmap("SMESH", tr("ICON_2D_FROM_3D"))); + + // Mesh name + QGroupBox* nameBox = new QGroupBox(tr("SMESH_MESHINFO_NAME"), aFrame ); + QHBoxLayout* nameBoxLayout = new QHBoxLayout(nameBox); + nameBoxLayout->setMargin(MARGIN); nameBoxLayout->setSpacing(SPACING); + myMeshName = new QLabel(nameBox); + nameBoxLayout->addWidget(myMeshName); + + // Mesh Info + + myFullInfo = new SMESHGUI_MeshInfosBox(true, aFrame); + + // add all widgets to aFrame + QVBoxLayout* aLay = new QVBoxLayout(aFrame); + aLay->setMargin( 0 ); + aLay->setSpacing( 0 ); + aLay->addWidget( nameBox ); + aLay->addWidget( myFullInfo ); + + ((QPushButton*) button( OK ))->setDefault( true ); + return aFrame; +} + +//================================================================================ +/*! + * \brief set name of the mesh +*/ +//================================================================================ + +void SMESHGUI_Make2DFrom3DDlg::SetMeshName(const QString& theName) +{ + myMeshName->setText( theName ); +} + +//================================================================================ +/*! + * \brief set mesh info +*/ +//================================================================================ + +void SMESHGUI_Make2DFrom3DDlg::SetMeshInfo(const SMESH::long_array& theInfo) +{ + myFullInfo->SetMeshInfo( theInfo ); +} + +//================================================================================ +/*! + * \brief Constructor +*/ +//================================================================================ + +SMESHGUI_Make2DFrom3DOp::SMESHGUI_Make2DFrom3DOp() + : SMESHGUI_Operation() +{ + myDlg = new SMESHGUI_Make2DFrom3DDlg(desktop()); +} + +//================================================================================ +/*! + * \brief Desctructor +*/ +//================================================================================ + +SMESHGUI_Make2DFrom3DOp::~SMESHGUI_Make2DFrom3DOp() +{ +} + +//================================================================================ +/*! + * \brief perform it's intention action: compute 2D mesh on 3D + */ +//================================================================================ + +void SMESHGUI_Make2DFrom3DOp::startOperation() +{ + myMesh = SMESH::SMESH_Mesh::_nil(); + + // check selection + LightApp_SelectionMgr *Sel = selectionMgr(); + SALOME_ListIO selected; Sel->selectedObjects( selected ); + + int nbSel = selected.Extent(); + if (nbSel != 1) { + SUIT_MessageBox::warning(desktop(), + tr("SMESH_WRN_WARNING"), + tr("SMESH_WRN_NO_AVAILABLE_DATA")); + onCancel(); + return; + } + + Handle(SALOME_InteractiveObject) anIO = selected.First(); + myMesh = SMESH::GetMeshByIO(anIO); + if (myMesh->_is_nil()) { + SUIT_MessageBox::warning(desktop(), + tr("SMESH_WRN_WARNING"), + tr("SMESH_WRN_NO_AVAILABLE_DATA")); + onCancel(); + return; + } + + SMESHGUI_Operation::startOperation(); + + + // backup mesh info before 2D mesh computation + SMESH::long_array_var anOldInfo = myMesh->GetMeshInfo(); + + + if (!compute2DMesh()) { + SUIT_MessageBox::warning(desktop(), + tr("SMESH_WRN_WARNING"), + tr("SMESH_WRN_COMPUTE_FAILED")); + onCancel(); + return; + } + // get new mesh statistic + SMESH::long_array_var aNewInfo = myMesh->GetMeshInfo(); + // get difference in mesh statistic from old to new + for ( int i = SMDSEntity_Node; i < SMDSEntity_Last; i++ ) + aNewInfo[i] -= anOldInfo[i]; + + // update presentation + SMESH::Update(anIO, SMESH::eDisplay); + + // show computated result + _PTR(SObject) aMeshSObj = SMESH::FindSObject(myMesh); + if ( aMeshSObj ) + myDlg->SetMeshName( aMeshSObj->GetName().c_str() ); + myDlg->SetMeshInfo( aNewInfo ); + myDlg->show(); /*exec();*/ + commit(); +} + +//================================================================================ +/*! + * \brief compute 2D mesh on initial 3D + */ +//================================================================================ + +bool SMESHGUI_Make2DFrom3DOp::compute2DMesh() +{ + SUIT_OverrideCursor wc; + SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditor(); + return aMeshEditor->Make2DMeshFrom3D(); +} diff --git a/src/SMESHGUI/SMESHGUI_Make2DFrom3DOp.h b/src/SMESHGUI/SMESHGUI_Make2DFrom3DOp.h new file mode 100644 index 000000000..adc0aa5e0 --- /dev/null +++ b/src/SMESHGUI/SMESHGUI_Make2DFrom3DOp.h @@ -0,0 +1,87 @@ +// Copyright (C) 2007-2009 CEA/DEN, EDF R&D, OPEN CASCADE +// +// Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, +// CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS +// +// This library is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 2.1 of the License. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// +// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +// +// SMESH SMESHGUI : GUI for SMESH component +// File : SMESHGUI_Make2DFrom3D.h +// Author : Open CASCADE S.A.S. +// +#ifndef SMESHGUI_Make2DFrom3DOp_H +#define SMESHGUI_Make2DFrom3DOp_H + +// SMESH includes +#include "SMESH_SMESHGUI.hxx" + +#include "SMESHGUI_Dialog.h" +#include "SMESHGUI_Operation.h" + +// IDL includes +#include +#include CORBA_SERVER_HEADER(SMESH_Mesh) + +class QFrame; +class SMESHGUI_MeshInfosBox; + +/*! + * \brief Dialog to show result mesh statistic + */ + +class SMESHGUI_Make2DFrom3DDlg : public SMESHGUI_Dialog +{ + Q_OBJECT + + public: + SMESHGUI_Make2DFrom3DDlg( QWidget* ); + virtual ~SMESHGUI_Make2DFrom3DDlg(); + + void SetMeshName(const QString& theName); + void SetMeshInfo(const SMESH::long_array& theInfo); + + private: + QFrame* createMainFrame( QWidget* ); + + private: + QLabel* myMeshName; + SMESHGUI_MeshInfosBox* myFullInfo; +}; + + +/*! + * \brief Operation to compute 2D mesh on 3D + */ + +class SMESHGUI_Make2DFrom3DOp : public SMESHGUI_Operation +{ + public: + SMESHGUI_Make2DFrom3DOp(); + virtual ~SMESHGUI_Make2DFrom3DOp(); + + protected: + virtual void startOperation(); + + private: + bool compute2DMesh(); + + private: + SMESH::SMESH_Mesh_var myMesh; + QPointer myDlg; +}; + +#endif // SMESHGUI_Make2DFrom3DOp_H diff --git a/src/SMESHGUI/SMESHGUI_MakeNodeAtPointDlg.cxx b/src/SMESHGUI/SMESHGUI_MakeNodeAtPointDlg.cxx index ac654fdd6..ae769c301 100644 --- a/src/SMESHGUI/SMESHGUI_MakeNodeAtPointDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_MakeNodeAtPointDlg.cxx @@ -208,7 +208,7 @@ QWidget* SMESHGUI_MakeNodeAtPointDlg::createMainFrame (QWidget* theParent) connect(myAutoSearchChkBox, SIGNAL (toggled(bool)), this, SLOT(ButtonToggled(bool))); myMoveRBtn->setChecked(true); - myIdBtn->setDown(true); + myIdBtn->setChecked(true); myAutoSearchChkBox->setChecked(true); return aFrame; @@ -228,11 +228,11 @@ void SMESHGUI_MakeNodeAtPointDlg::ButtonToggled (bool on) if ( aSender == myCoordBtn ) // button to set coord by node selection { if ( myIdBtn->isEnabled() ) - myIdBtn->setDown( !on ); + myIdBtn->setChecked( !on ); } else if ( aSender == myIdBtn ) // button to select a node to move { - myCoordBtn->setDown( !on ); + myCoordBtn->setChecked( !on ); } else if ( aSender == myMoveRBtn ) // move node method { @@ -241,7 +241,7 @@ void SMESHGUI_MakeNodeAtPointDlg::ButtonToggled (bool on) else if ( aSender == myCreateRBtn ) // create node method { myNodeToMoveGrp->setEnabled( false ); - myCoordBtn->setDown( true ); + myCoordBtn->setChecked( true ); } } if ( aSender == myAutoSearchChkBox ) // automatic node search @@ -249,9 +249,9 @@ void SMESHGUI_MakeNodeAtPointDlg::ButtonToggled (bool on) if ( on ) { myId->setText(""); myId->setReadOnly ( true ); - myIdBtn->setDown( false ); + myIdBtn->setChecked( false ); myIdBtn->setEnabled( false ); - myCoordBtn->setDown( true ); + myCoordBtn->setChecked( true ); } else { myId->setReadOnly ( false ); @@ -367,7 +367,7 @@ bool SMESHGUI_MakeNodeAtPointOp::onApply() if ( !myMeshActor ) { SUIT_MessageBox::warning( dlg(), tr( "SMESH_WRN_WARNING" ), - tr("INVALID_MESH") ); + tr("INVALID_MESH") ); dlg()->show(); return false; } @@ -376,7 +376,7 @@ bool SMESHGUI_MakeNodeAtPointOp::onApply() if ( !isValid( msg ) ) { // node id is invalid if( !msg.isEmpty() ) SUIT_MessageBox::warning( dlg(), tr( "SMESH_WRN_WARNING" ), - tr("INVALID_ID") ); + tr("INVALID_ID") ); dlg()->show(); return false; } @@ -386,7 +386,7 @@ bool SMESHGUI_MakeNodeAtPointOp::onApply() SMESH::SMESH_Mesh_var aMesh = SMESH::GetMeshByIO(myMeshActor->getIO()); if (aMesh->_is_nil()) { SUIT_MessageBox::information(SMESHGUI::desktop(), tr("SMESH_ERROR"), - tr("SMESHG_NO_MESH") ); + tr("SMESHG_NO_MESH") ); return true; } SMESH::SMESH_MeshEditor_var aMeshEditor = aMesh->GetMeshEditor(); @@ -394,7 +394,7 @@ bool SMESHGUI_MakeNodeAtPointOp::onApply() return true; int aResult = 0; - if ( myDlg->myCreateRBtn->isDown() ) + if ( myDlg->myCreateRBtn->isChecked() ) { aResult = aMeshEditor->AddNode(myDlg->myX->GetValue(), myDlg->myY->GetValue(), @@ -414,7 +414,7 @@ bool SMESHGUI_MakeNodeAtPointOp::onApply() aParameters << myDlg->myX->text(); aParameters << myDlg->myY->text(); aParameters << myDlg->myZ->text(); - aMesh->SetParameters( SMESHGUI::JoinObjectParameters(aParameters) ); + aMesh->SetParameters( aParameters.join(":").toLatin1().constData() ); myDlg->myId->setText(""); @@ -444,7 +444,7 @@ bool SMESHGUI_MakeNodeAtPointOp::isValid( QString& msg ) { bool ok = true; if ( myMeshActor && - myDlg->myMoveRBtn->isDown() && + myDlg->myMoveRBtn->isChecked() && !myDlg->myAutoSearchChkBox->isChecked() ) { ok = false; @@ -482,7 +482,7 @@ void SMESHGUI_MakeNodeAtPointOp::onSelectionDone() SMESH_Actor* aMeshActor = SMESH::FindActorByEntry(anIO->getEntry()); if (!aMeshActor) { // coord by geom - if ( myDlg->myCoordBtn->isDown() ) { + if ( myDlg->myCoordBtn->isChecked() ) { GEOM::GEOM_Object_var geom = SMESH::IObjectToInterface(anIO); if ( !geom->_is_nil() ) { TopoDS_Vertex aShape; @@ -510,14 +510,14 @@ void SMESHGUI_MakeNodeAtPointOp::onSelectionDone() if (SMDS_Mesh* aMesh = aMeshActor->GetObject()->GetMesh()) { if (const SMDS_MeshNode* aNode = aMesh->FindNode(aString.toInt())) { myNoPreview = true; - if ( myDlg->myCoordBtn->isDown() ) { // set coord + if ( myDlg->myCoordBtn->isChecked() ) { // set coord myDlg->myX->SetValue(aNode->X()); myDlg->myY->SetValue(aNode->Y()); myDlg->myZ->SetValue(aNode->Z()); myNoPreview = false; redisplayPreview(); } - else if ( myDlg->myIdBtn->isDown() && + else if ( myDlg->myIdBtn->isChecked() && myDlg->myIdBtn->isEnabled() ) { // set node to move myDlg->myId->setText(aString); myNoPreview = false; @@ -545,7 +545,7 @@ void SMESHGUI_MakeNodeAtPointOp::redisplayPreview() SMESH::MeshPreviewStruct_var aMeshPreviewStruct; bool moveShown = false; - if ( myDlg->myMoveRBtn->isDown() && // Move method + if ( myDlg->myMoveRBtn->isChecked() && // Move method myMeshActor) { const bool autoSearch = myDlg->myAutoSearchChkBox->isChecked(); diff --git a/src/SMESHGUI/SMESHGUI_MeshDlg.cxx b/src/SMESHGUI/SMESHGUI_MeshDlg.cxx index 3a9f90256..a3446f299 100644 --- a/src/SMESHGUI/SMESHGUI_MeshDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_MeshDlg.cxx @@ -381,7 +381,7 @@ SMESHGUI_MeshDlg::SMESHGUI_MeshDlg( const bool theToCreate, const bool theIsMesh myHypoSetButton->setText( tr( "HYPOTHESES_SETS" ) ); myHypoSetButton->setEnabled( false ); myHypoSetButton->setSizePolicy( QSizePolicy::MinimumExpanding, - myHypoSetButton->sizePolicy().verticalPolicy() ); + myHypoSetButton->sizePolicy().verticalPolicy() ); // Fill layout QGridLayout* aLay = new QGridLayout( mainFrame() ); @@ -542,14 +542,14 @@ void SMESHGUI_MeshDlg::setGeomPopupEnabled( const bool enable ) myGeomPopup->addAction( tr("DIRECT_GEOM_SELECTION") )->setData( DIRECT_GEOM_INDEX ); myGeomPopup->addAction( tr("GEOM_BY_MESH_ELEM_SELECTION") )->setData( GEOM_BY_MESH_INDEX ); connect( myGeomPopup, SIGNAL( triggered( QAction* ) ), SLOT( onGeomPopup( QAction* ) ) ); - connect( selBtn, SIGNAL( toggled(bool) ), this, SLOT( onGeomSelectionButton(bool) )); + connect( selBtn, SIGNAL( toggled(bool) ), this, SLOT( onGeomSelectionButton(bool) )); } } else { disconnect( selBtn, SIGNAL( toggled(bool) ), this, SLOT( onGeomSelectionButton(bool) )); if ( myGeomPopup ) { - delete myGeomPopup; - myGeomPopup = 0; + delete myGeomPopup; + myGeomPopup = 0; } } } diff --git a/src/SMESHGUI/SMESHGUI_MeshInfosBox.cxx b/src/SMESHGUI/SMESHGUI_MeshInfosBox.cxx index ffa85053d..7554a7959 100644 --- a/src/SMESHGUI/SMESHGUI_MeshInfosBox.cxx +++ b/src/SMESHGUI/SMESHGUI_MeshInfosBox.cxx @@ -60,7 +60,14 @@ enum TCol { // ========================================================================================= SMESHGUI_MeshInfosBox::SMESHGUI_MeshInfosBox(const bool full, QWidget* theParent) - : QGroupBox( tr("SMESH_MESHINFO_TITLE"), theParent ), myFull( full ) +: QGroupBox( tr("SMESH_MESHINFO_TITLE"), theParent ), myFull( full ), + myNbNode(0), my0DElem(0), myNbEdge(0), myNbLinEdge(0), myNbQuadEdge(0), + myNbTrai(0), myNbLinTrai(0), myNbQuadTrai(0), myNbQuad(0), myNbLinQuad(0), + myNbQuadQuad(0), myNbFace(0), myNbLinFace(0), myNbQuadFace(0), myNbPolyg(0), + myNbHexa(0), myNbLinHexa(0), myNbQuadHexa(0), myNbTetra(0), myNbLinTetra(0), + myNbQuadTetra(0), myNbPyra(0), myNbLinPyra(0), myNbQuadPyra(0), myNbPrism(0), + myNbLinPrism(0), myNbQuadPrism(0), myNbVolum(0), myNbLinVolum(0), myNbQuadVolum(0), + myNbPolyh(0) { QGridLayout* l = new QGridLayout(this); l->setMargin( MARGIN ); @@ -277,6 +284,17 @@ SMESHGUI_MeshInfosBox::SMESHGUI_MeshInfosBox(const bool full, QWidget* theParent myNbNode = new QLabel( this ); l->addWidget( myNbNode, row, 1 ); + // 0D elements + row = l->rowCount(); // retrieve current row count + // -- + lab = new QLabel(COLONIZE(tr("SMESH_MESHINFO_0DELEMS")), this ); + l->addWidget( lab, row, 0 ); + // -- + my0DElem = new QLabel( this ); + l->addWidget( my0DElem, row, 1 ); + + addSeparator(this); // add separator + // edges row = l->rowCount(); // retrieve current row count // -- @@ -340,52 +358,52 @@ void SMESHGUI_MeshInfosBox::SetMeshInfo(const SMESH::long_array& theInfo) // edges myNbEdge ->setText( QString("%1").arg( theInfo[SMDSEntity_Edge] + - theInfo[SMDSEntity_Quad_Edge] )); + theInfo[SMDSEntity_Quad_Edge] )); myNbLinEdge ->setText( QString("%1").arg( theInfo[SMDSEntity_Edge] )); myNbQuadEdge ->setText( QString("%1").arg( theInfo[SMDSEntity_Quad_Edge] )); // faces myNbFace ->setText( QString("%1").arg( theInfo[SMDSEntity_Triangle] + - theInfo[SMDSEntity_Quad_Triangle] + - theInfo[SMDSEntity_Quadrangle] + - theInfo[SMDSEntity_Quad_Quadrangle] + - theInfo[SMDSEntity_Polygon] )); + theInfo[SMDSEntity_Quad_Triangle] + + theInfo[SMDSEntity_Quadrangle] + + theInfo[SMDSEntity_Quad_Quadrangle] + + theInfo[SMDSEntity_Polygon] )); myNbLinFace ->setText( QString("%1").arg( theInfo[SMDSEntity_Triangle] + - theInfo[SMDSEntity_Quadrangle] + - theInfo[SMDSEntity_Polygon] )); + theInfo[SMDSEntity_Quadrangle] + + theInfo[SMDSEntity_Polygon] )); myNbQuadFace ->setText( QString("%1").arg( theInfo[SMDSEntity_Quad_Triangle] + - theInfo[SMDSEntity_Quad_Quadrangle] )); + theInfo[SMDSEntity_Quad_Quadrangle] )); // volumes myNbVolum ->setText( QString("%1").arg( theInfo[SMDSEntity_Tetra] + - theInfo[SMDSEntity_Quad_Tetra] + - theInfo[SMDSEntity_Pyramid] + - theInfo[SMDSEntity_Quad_Pyramid] + - theInfo[SMDSEntity_Hexa] + - theInfo[SMDSEntity_Quad_Hexa] + - theInfo[SMDSEntity_Penta] + - theInfo[SMDSEntity_Quad_Penta] + - theInfo[SMDSEntity_Polyhedra] )); + theInfo[SMDSEntity_Quad_Tetra] + + theInfo[SMDSEntity_Pyramid] + + theInfo[SMDSEntity_Quad_Pyramid] + + theInfo[SMDSEntity_Hexa] + + theInfo[SMDSEntity_Quad_Hexa] + + theInfo[SMDSEntity_Penta] + + theInfo[SMDSEntity_Quad_Penta] + + theInfo[SMDSEntity_Polyhedra] )); myNbLinVolum ->setText( QString("%1").arg( theInfo[SMDSEntity_Tetra] + - theInfo[SMDSEntity_Pyramid] + - theInfo[SMDSEntity_Hexa] + - theInfo[SMDSEntity_Penta] + - theInfo[SMDSEntity_Polyhedra] )); + theInfo[SMDSEntity_Pyramid] + + theInfo[SMDSEntity_Hexa] + + theInfo[SMDSEntity_Penta] + + theInfo[SMDSEntity_Polyhedra] )); myNbQuadVolum->setText( QString("%1").arg( theInfo[SMDSEntity_Quad_Tetra] + - theInfo[SMDSEntity_Quad_Pyramid] + - theInfo[SMDSEntity_Quad_Hexa] + - theInfo[SMDSEntity_Quad_Penta] )); + theInfo[SMDSEntity_Quad_Pyramid] + + theInfo[SMDSEntity_Quad_Hexa] + + theInfo[SMDSEntity_Quad_Penta] )); if ( myFull ) { // triangles myNbTrai ->setText( QString("%1").arg( theInfo[SMDSEntity_Triangle] + - theInfo[SMDSEntity_Quad_Triangle] )); + theInfo[SMDSEntity_Quad_Triangle] )); myNbLinTrai ->setText( QString("%1").arg( theInfo[SMDSEntity_Triangle] )); myNbQuadTrai ->setText( QString("%1").arg( theInfo[SMDSEntity_Quad_Triangle] )); // quadrangles myNbQuad ->setText( QString("%1").arg( theInfo[SMDSEntity_Quadrangle] + - theInfo[SMDSEntity_Quad_Quadrangle] )); + theInfo[SMDSEntity_Quad_Quadrangle] )); myNbLinQuad ->setText( QString("%1").arg( theInfo[SMDSEntity_Quadrangle] )); myNbQuadQuad ->setText( QString("%1").arg( theInfo[SMDSEntity_Quad_Quadrangle] )); // poligones @@ -393,22 +411,22 @@ void SMESHGUI_MeshInfosBox::SetMeshInfo(const SMESH::long_array& theInfo) // tetras myNbTetra ->setText( QString("%1").arg( theInfo[SMDSEntity_Tetra] + - theInfo[SMDSEntity_Quad_Tetra] )); + theInfo[SMDSEntity_Quad_Tetra] )); myNbLinTetra ->setText( QString("%1").arg( theInfo[SMDSEntity_Tetra] )); myNbQuadTetra->setText( QString("%1").arg( theInfo[SMDSEntity_Quad_Tetra] )); // hexas myNbHexa ->setText( QString("%1").arg( theInfo[SMDSEntity_Hexa] + - theInfo[SMDSEntity_Quad_Hexa] )); + theInfo[SMDSEntity_Quad_Hexa] )); myNbLinHexa ->setText( QString("%1").arg( theInfo[SMDSEntity_Hexa] )); myNbQuadHexa ->setText( QString("%1").arg( theInfo[SMDSEntity_Quad_Hexa] )); // pyras myNbPyra ->setText( QString("%1").arg( theInfo[SMDSEntity_Pyramid] + - theInfo[SMDSEntity_Quad_Pyramid] )); + theInfo[SMDSEntity_Quad_Pyramid] )); myNbLinPyra ->setText( QString("%1").arg( theInfo[SMDSEntity_Pyramid] )); myNbQuadPyra ->setText( QString("%1").arg( theInfo[SMDSEntity_Quad_Pyramid] )); // prisms myNbPrism ->setText( QString("%1").arg( theInfo[SMDSEntity_Penta] + - theInfo[SMDSEntity_Quad_Penta] )); + theInfo[SMDSEntity_Quad_Penta] )); myNbLinPrism ->setText( QString("%1").arg( theInfo[SMDSEntity_Penta] )); myNbQuadPrism->setText( QString("%1").arg( theInfo[SMDSEntity_Quad_Penta] )); // polyedres diff --git a/src/SMESHGUI/SMESHGUI_MeshInfosDlg.cxx b/src/SMESHGUI/SMESHGUI_MeshInfosDlg.cxx index 0bc4b633a..fd6d42e52 100644 --- a/src/SMESHGUI/SMESHGUI_MeshInfosDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_MeshInfosDlg.cxx @@ -198,17 +198,17 @@ void SMESHGUI_MeshInfosDlg::DumpMeshInfos() //CORBA::Object_var anObject = aSO->GetObject(); CORBA::Object_var anObject = SMESH::SObjectToObject(aSO); if (!CORBA::is_nil(anObject)) { - SMESH::SMESH_IDSource_var anIDSource = SMESH::SMESH_IDSource::_narrow(anObject); - if (!anIDSource->_is_nil()) { - myWGStack->setCurrentWidget(myMeshWidget); - setWindowTitle(tr("SMESH_MESHINFO_TITLE") + " [" + tr("SMESH_OBJECT_MESH") + "]"); - myMeshName->setText(aSO->GetName().c_str()); + SMESH::SMESH_IDSource_var anIDSource = SMESH::SMESH_IDSource::_narrow(anObject); + if (!anIDSource->_is_nil()) { + myWGStack->setCurrentWidget(myMeshWidget); + setWindowTitle(tr("SMESH_MESHINFO_TITLE") + " [" + tr("SMESH_OBJECT_MESH") + "]"); + myMeshName->setText(aSO->GetName().c_str()); - SMESH::long_array_var aMeshInfo = anIDSource->GetMeshInfo(); - myMeshInfoBox->SetMeshInfo( aMeshInfo ); + SMESH::long_array_var aMeshInfo = anIDSource->GetMeshInfo(); + myMeshInfoBox->SetMeshInfo( aMeshInfo ); - return; - } + return; + } } } } @@ -297,10 +297,10 @@ void SMESHGUI_MeshInfosDlg::onHelp() platform = "application"; #endif SUIT_MessageBox::warning(this, tr("WRN_WARNING"), - tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). - arg(app->resourceMgr()->stringValue("ExternalBrowser", - platform)). - arg(myHelpFileName)); + tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). + arg(app->resourceMgr()->stringValue("ExternalBrowser", + platform)). + arg(myHelpFileName)); } } diff --git a/src/SMESHGUI/SMESHGUI_MeshOp.cxx b/src/SMESHGUI/SMESHGUI_MeshOp.cxx index ce49ff910..eaa3098aa 100644 --- a/src/SMESHGUI/SMESHGUI_MeshOp.cxx +++ b/src/SMESHGUI/SMESHGUI_MeshOp.cxx @@ -85,7 +85,8 @@ SMESHGUI_MeshOp::SMESHGUI_MeshOp( const bool theToCreate, const bool theIsMesh ) myToCreate( theToCreate ), myIsMesh( theIsMesh ), myDlg( 0 ), - myShapeByMeshOp( 0 ) + myShapeByMeshOp( 0 ), + myHypoSet( 0 ) { if ( GeometryGUI::GetGeomGen()->_is_nil() )// check that GEOM_Gen exists GeometryGUI::InitGeomGen(); @@ -575,11 +576,11 @@ void SMESHGUI_MeshOp::selectionDone() SMESH::SObjectToInterface( pSubmesh ); bool editSubmesh = ( !sm->_is_nil() && SUIT_MessageBox::question( myDlg, tr( "SMESH_WARNING" ), - tr( "EDIT_SUBMESH_QUESTION"), - SUIT_MessageBox::Yes | - SUIT_MessageBox::No, - SUIT_MessageBox::No ) - == SUIT_MessageBox::Yes ); + tr( "EDIT_SUBMESH_QUESTION"), + SUIT_MessageBox::Yes | + SUIT_MessageBox::No, + SUIT_MessageBox::No ) + == SUIT_MessageBox::Yes ); if ( editSubmesh ) { selectionMgr()->clearFilters(); @@ -1068,18 +1069,47 @@ void SMESHGUI_MeshOp::createHypothesis(const int theDim, removeCustomFilters(); // Issue 0020170 // Get Entry of the Geom object + QString aGeomEntry = ""; + QString aMeshEntry = ""; QString anObjEntry = ""; - anObjEntry = myDlg->selectedObject( SMESHGUI_MeshDlg::Geom ); - if ( anObjEntry == "" ) { - anObjEntry = myDlg->selectedObject( SMESHGUI_MeshDlg::Obj ); - if ( anObjEntry != "" ) { - _PTR(SObject) pObj = studyDS()->FindObjectID( anObjEntry.toLatin1().data() ); - GEOM::GEOM_Object_var aGeomVar = SMESH::GetShapeOnMeshOrSubMesh( pObj ); - anObjEntry = ( aGeomVar->_is_nil() ) ? "" : anObjEntry = aGeomVar->GetStudyEntry(); - } + aGeomEntry = myDlg->selectedObject( SMESHGUI_MeshDlg::Geom ); + aMeshEntry = myDlg->selectedObject( SMESHGUI_MeshDlg::Mesh ); + anObjEntry = myDlg->selectedObject( SMESHGUI_MeshDlg::Obj ); + + if ( aMeshEntry != "" ) { // Get Geom object from Mesh + _PTR(SObject) pObj = studyDS()->FindObjectID( aMeshEntry.toLatin1().data() ); + GEOM::GEOM_Object_var aGeomVar = SMESH::GetShapeOnMeshOrSubMesh( pObj ); + aMeshEntry = ( aGeomVar->_is_nil() ) ? "" : aMeshEntry = aGeomVar->GetStudyEntry(); + } + + if ( aMeshEntry == "" && aGeomEntry == "" ) { + _PTR(SObject) pObj = studyDS()->FindObjectID( anObjEntry.toLatin1().data() ); + GEOM::GEOM_Object_var aGeomVar = SMESH::GetShapeOnMeshOrSubMesh( pObj ); + if ( !aGeomVar->_is_nil() ) + aGeomEntry = aGeomVar->GetStudyEntry(); } - aCreator->setShapeEntry( anObjEntry ); + if ( anObjEntry != "" && aGeomEntry != "" && aMeshEntry == "" ) { // take geometry from submesh + _PTR(SObject) pObj = studyDS()->FindObjectID( anObjEntry.toLatin1().data() ); + if ( pObj ) { + // if current object is sub-mesh + SMESH::SMESH_subMesh_var aSubMeshVar = + SMESH::SMESH_subMesh::_narrow( _CAST( SObject,pObj )->GetObject() ); + if ( !aSubMeshVar->_is_nil() ) { + SMESH::SMESH_Mesh_var aMeshVar = aSubMeshVar->GetFather(); + if ( !aMeshVar->_is_nil() ) { + _PTR(SObject) aMeshSO = SMESH::FindSObject( aMeshVar ); + GEOM::GEOM_Object_var aGeomVar = SMESH::GetShapeOnMeshOrSubMesh( aMeshSO ); + if ( !aGeomVar->_is_nil() ) + aMeshEntry = aGeomVar->GetStudyEntry(); + } + } + } + } + + aCreator->setShapeEntry( aGeomEntry ); + if ( aMeshEntry != "" ) + aCreator->setMainShapeEntry( aMeshEntry ); myDlg->setEnabled( false ); aCreator->create(initParamHyp, aHypName, myDlg, this, SLOT( onHypoCreated( int ) ) ); dialog = true; @@ -1162,18 +1192,47 @@ void SMESHGUI_MeshOp::onEditHyp( const int theHypType, const int theIndex ) aCreator->setInitParamsHypothesis( initParamHyp ); // Get Entry of the Geom object + QString aGeomEntry = ""; + QString aMeshEntry = ""; QString anObjEntry = ""; - anObjEntry = myDlg->selectedObject( SMESHGUI_MeshDlg::Geom ); - if ( anObjEntry == "" ) { - anObjEntry = myDlg->selectedObject( SMESHGUI_MeshDlg::Obj ); - if ( anObjEntry != "" ) { - _PTR(SObject) pObj = studyDS()->FindObjectID( anObjEntry.toLatin1().data() ); - GEOM::GEOM_Object_var aGeomVar = SMESH::GetShapeOnMeshOrSubMesh( pObj ); - anObjEntry = aGeomVar->GetStudyEntry(); + aGeomEntry = myDlg->selectedObject( SMESHGUI_MeshDlg::Geom ); + aMeshEntry = myDlg->selectedObject( SMESHGUI_MeshDlg::Mesh ); + anObjEntry = myDlg->selectedObject( SMESHGUI_MeshDlg::Obj ); + + if ( aMeshEntry != "" ) { // Get Geom object from Mesh + _PTR(SObject) pObj = studyDS()->FindObjectID( aMeshEntry.toLatin1().data() ); + GEOM::GEOM_Object_var aGeomVar = SMESH::GetShapeOnMeshOrSubMesh( pObj ); + aMeshEntry = ( aGeomVar->_is_nil() ) ? "" : aMeshEntry = aGeomVar->GetStudyEntry(); + } + + if ( aMeshEntry == "" && aGeomEntry == "" ) { + _PTR(SObject) pObj = studyDS()->FindObjectID( anObjEntry.toLatin1().data() ); + GEOM::GEOM_Object_var aGeomVar = SMESH::GetShapeOnMeshOrSubMesh( pObj ); + if ( !aGeomVar->_is_nil() ) + aGeomEntry = aGeomVar->GetStudyEntry(); + } + + if ( anObjEntry != "" && aGeomEntry != "" && aMeshEntry == "" ) { // take geometry from submesh + _PTR(SObject) pObj = studyDS()->FindObjectID( anObjEntry.toLatin1().data() ); + if ( pObj ) { + // if current object is sub-mesh + SMESH::SMESH_subMesh_var aSubMeshVar = + SMESH::SMESH_subMesh::_narrow( _CAST( SObject,pObj )->GetObject() ); + if ( !aSubMeshVar->_is_nil() ) { + SMESH::SMESH_Mesh_var aMeshVar = aSubMeshVar->GetFather(); + if ( !aMeshVar->_is_nil() ) { + _PTR(SObject) aMeshSO = SMESH::FindSObject( aMeshVar ); + GEOM::GEOM_Object_var aGeomVar = SMESH::GetShapeOnMeshOrSubMesh( aMeshSO ); + if ( !aGeomVar->_is_nil() ) + aMeshEntry = aGeomVar->GetStudyEntry(); + } + } } } - aCreator->setShapeEntry( anObjEntry ); + aCreator->setShapeEntry( aGeomEntry ); + if ( aMeshEntry != "" ) + aCreator->setMainShapeEntry( aMeshEntry ); removeCustomFilters(); // Issue 0020170 myDlg->setEnabled( false ); aCreator->edit( aHyp.in(), aHypItem.second, dlg(), this, SLOT( onHypoEdited( int ) ) ); @@ -1331,7 +1390,7 @@ void SMESHGUI_MeshOp::onAlgoSelected( const int theIndex, CORBA::String_var curHypType = curHyp->GetName(); if ( !algoDeselectedByUser && myObjHyps[ dim ][ type ].count() > 0 && - curHypType == myObjHyps[ dim ][ type ].first().first->GetName()) + !strcmp( curHypType, myObjHyps[ dim ][ type ].first().first->GetName()) ) { HypothesisData* hypData = SMESH::GetHypothesisData( curHyp->GetName() ); for (int i = 0; i < myAvailableHypData[ dim ][ Algo ].count(); ++i) { @@ -1607,7 +1666,7 @@ bool SMESHGUI_MeshOp::createSubMesh( QString& theMess ) aNewGeomGroupName += aName; SALOMEDS::SObject_var aNewGroupSO = geomGen->AddInStudy(aSMESHGen->GetCurrentStudy(), aGeomVar, - aNewGeomGroupName.toLatin1().data(), mainGeom); + aNewGeomGroupName.toLatin1().data(), mainGeom); } } } @@ -1760,7 +1819,7 @@ SMESH::SMESH_Hypothesis_var SMESHGUI_MeshOp::getAlgo( const int theDim ) { SMESH::SMESH_Hypothesis_var aHypVar = (*anIter).first; CORBA::String_var aName = aHypVar->GetName(); - if ( !aHypVar->_is_nil() && aHypName == aName ) + if ( !aHypVar->_is_nil() && !strcmp(aHypName.toLatin1().data(), aName) ) { anAlgoVar = aHypVar; break; @@ -1801,7 +1860,7 @@ SMESH::SMESH_Hypothesis_var SMESHGUI_MeshOp::getAlgo( const int theDim ) { SMESH::SMESH_Hypothesis_var aHypVar = (*anIter).first; CORBA::String_var aName = aHypVar->GetName(); - if ( !aHypVar->_is_nil() && aHypName == aName ) + if ( !aHypVar->_is_nil() && !strcmp(aHypName.toLatin1().data(), aName) ) { anAlgoVar = aHypVar; break; diff --git a/src/SMESHGUI/SMESHGUI_MeshOp.h b/src/SMESHGUI/SMESHGUI_MeshOp.h index e3e4358ed..93804eb09 100644 --- a/src/SMESHGUI/SMESHGUI_MeshOp.h +++ b/src/SMESHGUI/SMESHGUI_MeshOp.h @@ -102,7 +102,7 @@ private: const int ); // access to myAvailableHypData void createHypothesis( const int, const int, - const QString& ); + const QString& ); bool createMesh( QString& ); bool createSubMesh( QString& ); diff --git a/src/SMESHGUI/SMESHGUI_MeshPatternDlg.cxx b/src/SMESHGUI/SMESHGUI_MeshPatternDlg.cxx index 820b2ec91..d80523066 100755 --- a/src/SMESHGUI/SMESHGUI_MeshPatternDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_MeshPatternDlg.cxx @@ -420,10 +420,10 @@ bool SMESHGUI_MeshPatternDlg::isValid (const bool theMess) ok = myNode2->isValid( msg, theMess ) && ok; if( !ok ) { if( theMess ) { - QString str( tr( "SMESH_INCORRECT_INPUT" ) ); - if ( !msg.isEmpty() ) - str += "\n" + msg; - SUIT_MessageBox::critical( this, tr( "SMESH_ERROR" ), str ); + QString str( tr( "SMESH_INCORRECT_INPUT" ) ); + if ( !msg.isEmpty() ) + str += "\n" + msg; + SUIT_MessageBox::critical( this, tr( "SMESH_ERROR" ), str ); } return false; } @@ -440,14 +440,14 @@ bool SMESHGUI_MeshPatternDlg::isValid (const bool theMess) { if (theMess) SUIT_MessageBox::information(this, tr("SMESH_INSUFFICIENT_DATA"), - tr("SMESHGUI_INVALID_PARAMETERS")); + tr("SMESHGUI_INVALID_PARAMETERS")); return false; } if ( myName->text().isEmpty() ) { if (theMess) SUIT_MessageBox::information(this, tr("SMESH_INSUFFICIENT_DATA"), - tr("SMESHGUI_INVALID_PARAMETERS")); + tr("SMESHGUI_INVALID_PARAMETERS")); return false; } @@ -473,16 +473,16 @@ bool SMESHGUI_MeshPatternDlg::onApply() varIds->length(ids.count()); int i = 0; for (QList::iterator it = ids.begin(); it != ids.end(); ++it) - varIds[i++] = *it; + varIds[i++] = *it; myType == Type_2d - ? myPattern->ApplyToMeshFaces (myMesh, varIds, getNode(false), myReverseChk->isChecked()) - : myPattern->ApplyToHexahedrons(myMesh, varIds, getNode(false), getNode(true)); + ? myPattern->ApplyToMeshFaces (myMesh, varIds, getNode(false), myReverseChk->isChecked()) + : myPattern->ApplyToHexahedrons(myMesh, varIds, getNode(false), getNode(true)); QStringList aParameters; aParameters << myNode1->text(); if(myType == Type_3d ) - aParameters << myNode2->text(); - myMesh->SetParameters( SMESHGUI::JoinObjectParameters(aParameters) ); + aParameters << myNode2->text(); + myMesh->SetParameters( aParameters.join(":").toLatin1().constData() ); } else { // Applying a pattern to geometrical object if (myType == Type_2d) @@ -497,15 +497,15 @@ bool SMESHGUI_MeshPatternDlg::onApply() //mySelectionMgr->clearSelected(); bool autoUpdate = SMESHGUI::automaticUpdate(); if (!isRefine() && autoUpdate) { - _PTR(SObject) aSO = SMESH::FindSObject(myMesh.in()); - SMESH_Actor* anActor = SMESH::FindActorByEntry(aSO->GetID().c_str()); - if (!anActor) { - anActor = SMESH::CreateActor(aSO->GetStudy(), aSO->GetID().c_str()); - if (anActor) { - SMESH::DisplayActor(SMESH::GetActiveWindow(), anActor); - SMESH::FitAll(); - } - } + _PTR(SObject) aSO = SMESH::FindSObject(myMesh.in()); + SMESH_Actor* anActor = SMESH::FindActorByEntry(aSO->GetID().c_str()); + if (!anActor) { + anActor = SMESH::CreateActor(aSO->GetStudy(), aSO->GetID().c_str()); + if (anActor) { + SMESH::DisplayActor(SMESH::GetActiveWindow(), anActor); + SMESH::FitAll(); + } + } } mySelectionMgr->clearSelected(); SMESH::UpdateView(); @@ -517,7 +517,7 @@ bool SMESHGUI_MeshPatternDlg::onApply() return true; } else { SUIT_MessageBox::information(this, tr("SMESH_ERROR"), - tr("SMESH_OPERATION_FAILED")); + tr("SMESH_OPERATION_FAILED")); return false; } } catch (const SALOME::SALOME_Exception& S_ex) { @@ -565,17 +565,17 @@ void SMESHGUI_MeshPatternDlg::onHelp() if (app) app->onHelpContextModule(mySMESHGUI ? app->moduleName(mySMESHGUI->moduleName()) : QString(""), myHelpFileName); else { - QString platform; + QString platform; #ifdef WIN32 - platform = "winapplication"; + platform = "winapplication"; #else - platform = "application"; + platform = "application"; #endif SUIT_MessageBox::warning(this, tr("WRN_WARNING"), - tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). - arg(app->resourceMgr()->stringValue("ExternalBrowser", - platform)). - arg(myHelpFileName)); + tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). + arg(app->resourceMgr()->stringValue("ExternalBrowser", + platform)). + arg(myHelpFileName)); } } @@ -593,7 +593,7 @@ void SMESHGUI_MeshPatternDlg::onSelectionDone() SALOME_ListIO aList; mySelectionMgr->selectedObjects(aList,SVTK_Viewer::Type()); if (aList.Extent() != 1) - return; + return; // Retrieve mesh from selection Handle(SALOME_InteractiveObject) anIO = aList.First(); @@ -624,11 +624,11 @@ void SMESHGUI_MeshPatternDlg::onSelectionDone() SALOME_ListIO aList; mySelectionMgr->selectedObjects(aList,SVTK_Viewer::Type()); if (aList.Extent() != 1) - return; + return; QString anIds; if (!SMESH::GetNameOfSelectedElements(mySelector, aList.First(), anIds)) - anIds = ""; + anIds = ""; myBusy = true; mySelEdit[ Ids ]->setText(anIds); @@ -638,7 +638,7 @@ void SMESHGUI_MeshPatternDlg::onSelectionDone() SALOME_ListIO aList; mySelectionMgr->selectedObjects(aList, SVTK_Viewer::Type()); if (aList.Extent() != 1) - return; + return; // Get geom object from selection Handle(SALOME_InteractiveObject) anIO = aList.First(); @@ -809,14 +809,14 @@ void SMESHGUI_MeshPatternDlg::onOpen() QFile aFile(fName); if (!aFile.open(QIODevice::ReadOnly)) { SUIT_MessageBox::information(this, tr("SMESH_ERROR"), - tr("ERROR_OF_OPENING")); + tr("ERROR_OF_OPENING")); return; } QByteArray aDataArray = aFile.readAll(); if (aDataArray.isEmpty()) { SUIT_MessageBox::information(this, tr("SMESH_ERROR"), - tr("ERROR_OF_READING")); + tr("ERROR_OF_READING")); return; } @@ -1046,11 +1046,11 @@ void SMESHGUI_MeshPatternDlg::updateWgState() if (!CORBA::is_nil(myPattern)/* && getIds(ids)*/) { SMESH::long_array_var keyPoints = myPattern->GetKeyPoints(); if (keyPoints->length()) { - myNode1->setEnabled(true); - myNode2->setEnabled(true); - myNode1->setRange(1, keyPoints->length()); - myNode2->setRange(1, keyPoints->length()); - return; + myNode1->setEnabled(true); + myNode2->setEnabled(true); + myNode1->setRange(1, keyPoints->length()); + myNode2->setRange(1, keyPoints->length()); + return; } } @@ -1075,13 +1075,13 @@ void SMESHGUI_MeshPatternDlg::activateSelection() if (myType == Type_2d) { - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(FaceSelection); + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) + aViewWindow->SetSelectionMode(FaceSelection); } else { - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(CellSelection); + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) + aViewWindow->SetSelectionMode(CellSelection); } } else { @@ -1146,7 +1146,7 @@ bool SMESHGUI_MeshPatternDlg::loadFromFile (const QString& theName) } catch (const SALOME::SALOME_Exception& S_ex) { SalomeApp_Tools::QtCatchCorbaException(S_ex); SUIT_MessageBox::information(this, tr("SMESH_ERROR"), - tr("ERROR_OF_LOADING") ); + tr("ERROR_OF_LOADING") ); return false; } } @@ -1229,13 +1229,13 @@ vtkUnstructuredGrid* SMESHGUI_MeshPatternDlg::getGrid() varIds->length(ids.count()); int i = 0; for (QList::iterator it = ids.begin(); it != ids.end(); ++it) - varIds[i++] = *it; + varIds[i++] = *it; pnts = myType == Type_2d - ? myPattern->ApplyToMeshFaces (myMesh, varIds, getNode(false), myReverseChk->isChecked()) - : myPattern->ApplyToHexahedrons(myMesh, varIds, getNode(false), getNode(true)); + ? myPattern->ApplyToMeshFaces (myMesh, varIds, getNode(false), myReverseChk->isChecked()) + : myPattern->ApplyToHexahedrons(myMesh, varIds, getNode(false), getNode(true)); } else { pnts = myType == Type_2d - ? myPattern->ApplyToFace (myGeomObj[ Object ], myGeomObj[ Vertex1 ], myReverseChk->isChecked()) + ? myPattern->ApplyToFace (myGeomObj[ Object ], myGeomObj[ Vertex1 ], myReverseChk->isChecked()) : myPattern->ApplyTo3DBlock(myGeomObj[ Object ], myGeomObj[ Vertex1 ], myGeomObj[ Vertex2 ]); } @@ -1380,7 +1380,7 @@ void SMESHGUI_MeshPatternDlg::onTextChanged (const QString& theNewText) for (int i = 0; i < aListId.count(); i++) { const SMDS_MeshElement * e = aMesh->FindElement(aListId[ i ].toInt()); if (e && e->GetType() == (myType == Type_2d ? SMDSAbs_Face : SMDSAbs_Volume)) - newIndices.Add(e->GetID()); + newIndices.Add(e->GetID()); } mySelector->AddOrRemoveIndex( anActor->getIO(), newIndices, false); if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) diff --git a/src/SMESHGUI/SMESHGUI_MeshUtils.cxx b/src/SMESHGUI/SMESHGUI_MeshUtils.cxx index b524c2f83..df71815c2 100644 --- a/src/SMESHGUI/SMESHGUI_MeshUtils.cxx +++ b/src/SMESHGUI/SMESHGUI_MeshUtils.cxx @@ -46,13 +46,13 @@ namespace SMESH if(!CORBA::is_nil(anObj)){ SMESH_Mesh_var aMesh = SMESH_Mesh::_narrow(anObj); if(!CORBA::is_nil(aMesh)) - return aMesh; + return aMesh; SMESH_GroupBase_var aGroup = SMESH_GroupBase::_narrow(anObj); if(!CORBA::is_nil(aGroup)) - return aGroup->GetMesh(); + return aGroup->GetMesh(); SMESH_subMesh_var aSubMesh = SMESH_subMesh::_narrow(anObj); if(!CORBA::is_nil(aSubMesh)) - return aSubMesh->GetFather(); + return aSubMesh->GetFather(); } return SMESH_Mesh::_nil(); } @@ -65,17 +65,17 @@ namespace SMESH QString name = baseName; while ( !aStudy->FindObjectByName( name.toLatin1().data(), "SMESH" ).empty() ) { int nb = 0; - QStringList names = name.split("_", QString::KeepEmptyParts); - if ( names.count() > 0 ) { - bool ok; - int index = names.last().toInt( &ok ); - if ( ok ) { - nb = index; - names.removeLast(); - } - } - names.append( QString::number( nb+1 ) ); - name = names.join( "_" ); + QStringList names = name.split("_", QString::KeepEmptyParts); + if ( names.count() > 0 ) { + bool ok; + int index = names.last().toInt( &ok ); + if ( ok ) { + nb = index; + names.removeLast(); + } + } + names.append( QString::number( nb+1 ) ); + name = names.join( "_" ); } return name; } diff --git a/src/SMESHGUI/SMESHGUI_MoveNodesDlg.cxx b/src/SMESHGUI/SMESHGUI_MoveNodesDlg.cxx index 199575293..6243255af 100644 --- a/src/SMESHGUI/SMESHGUI_MoveNodesDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_MoveNodesDlg.cxx @@ -278,7 +278,7 @@ bool SMESHGUI_MoveNodesDlg::isValid (const bool theMess) if (myId->text().isEmpty()) { if (theMess) SUIT_MessageBox::information(this, tr("SMESH_WARNING"), - tr("NODE_ID_IS_NOT_DEFINED")); + tr("NODE_ID_IS_NOT_DEFINED")); return false; } @@ -291,7 +291,7 @@ bool SMESHGUI_MoveNodesDlg::isValid (const bool theMess) if( theMess ) { QString str( tr( "SMESH_INCORRECT_INPUT" ) ); if ( !msg.isEmpty() ) - str += "\n" + msg; + str += "\n" + msg; SUIT_MessageBox::critical( this, tr( "SMESH_ERROR" ), str ); } return false; @@ -329,7 +329,7 @@ bool SMESHGUI_MoveNodesDlg::onApply() SMESH::SMESH_Mesh_var aMesh = SMESH::GetMeshByIO(myMeshActor->getIO()); if (aMesh->_is_nil()) { SUIT_MessageBox::information(this, tr("SMESH_ERROR"), - tr("SMESHG_NO_MESH")); + tr("SMESHG_NO_MESH")); return false; } @@ -346,7 +346,7 @@ bool SMESHGUI_MoveNodesDlg::onApply() aParameters << myX->text(); aParameters << myY->text(); aParameters << myZ->text(); - aMesh->SetParameters( SMESHGUI::JoinObjectParameters(aParameters) ); + aMesh->SetParameters( aParameters.join(":").toLatin1().constData() ); } catch (...) { } @@ -398,17 +398,17 @@ void SMESHGUI_MoveNodesDlg::onHelp() if (app) app->onHelpContextModule(mySMESHGUI ? app->moduleName(mySMESHGUI->moduleName()) : QString(""), myHelpFileName); else { - QString platform; + QString platform; #ifdef WIN32 - platform = "winapplication"; + platform = "winapplication"; #else - platform = "application"; + platform = "application"; #endif SUIT_MessageBox::warning(this, tr("WRN_WARNING"), - tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). - arg(app->resourceMgr()->stringValue("ExternalBrowser", - platform)). - arg(myHelpFileName)); + tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). + arg(app->resourceMgr()->stringValue("ExternalBrowser", + platform)). + arg(myHelpFileName)); } } @@ -435,13 +435,13 @@ void SMESHGUI_MoveNodesDlg::onTextChange (const QString& theNewText) myBusy = false; if(const SMDS_MeshElement *anElem = aMesh->FindElement(theNewText.toInt())) { - TColStd_MapOfInteger aListInd; - aListInd.Add(anElem->GetID()); - mySelector->AddOrRemoveIndex(anIO,aListInd, false); - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->highlight(anIO,true,true); - - onSelectionDone(); + TColStd_MapOfInteger aListInd; + aListInd.Add(anElem->GetID()); + mySelector->AddOrRemoveIndex(anIO,aListInd, false); + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) + aViewWindow->highlight(anIO,true,true); + + onSelectionDone(); } } } diff --git a/src/SMESHGUI/SMESHGUI_MultiEditDlg.cxx b/src/SMESHGUI/SMESHGUI_MultiEditDlg.cxx index 526c3f3e3..907f8a65b 100755 --- a/src/SMESHGUI/SMESHGUI_MultiEditDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_MultiEditDlg.cxx @@ -100,8 +100,8 @@ //======================================================================= SMESHGUI_MultiEditDlg ::SMESHGUI_MultiEditDlg(SMESHGUI* theModule, - const int theMode, - const bool the3d2d): + const int theMode, + const bool the3d2d): QDialog(SMESH::GetDesktop(theModule)), mySelector(SMESH::GetViewWindow(theModule)->GetSelector()), mySelectionMgr(SMESH::GetSelectionMgr(theModule)), @@ -192,7 +192,7 @@ QWidget* SMESHGUI_MultiEditDlg::createMainFrame (QWidget* theParent, const bool myToAllChk = new QCheckBox(tr("TO_ALL"), mySelGrp); mySelGrpLayout->addWidget(myToAllChk, mySelGrpLayout->rowCount(), 0, - 1, mySelGrpLayout->columnCount()); + 1, mySelGrpLayout->columnCount()); // Split/Join criterion group myCriterionGrp = new QGroupBox(tr("SPLIT_JOIN_CRITERION"), aMainGrp); @@ -440,30 +440,30 @@ SMESH::long_array_var SMESHGUI_MultiEditDlg::getIds() // skl 07.02.2006 SMDS_Mesh* aMesh = myActor->GetObject()->GetMesh(); if( myFilterType == SMESH::TriaFilter || - myFilterType == SMESH::QuadFilter || - myFilterType == SMESH::FaceFilter ) { - SMDS_FaceIteratorPtr it = aMesh->facesIterator(); - while(it->more()) { - const SMDS_MeshFace* f = it->next(); - if(myFilterType == SMESH::FaceFilter) { - myIds.Add(f->GetID()); - } - else if( myFilterType==SMESH::TriaFilter && - ( f->NbNodes()==3 || f->NbNodes()==6 ) ) { - myIds.Add(f->GetID()); - } - else if( myFilterType==SMESH::QuadFilter && - ( f->NbNodes()==4 || f->NbNodes()==8 ) ) { - myIds.Add(f->GetID()); - } - } + myFilterType == SMESH::QuadFilter || + myFilterType == SMESH::FaceFilter ) { + SMDS_FaceIteratorPtr it = aMesh->facesIterator(); + while(it->more()) { + const SMDS_MeshFace* f = it->next(); + if(myFilterType == SMESH::FaceFilter) { + myIds.Add(f->GetID()); + } + else if( myFilterType==SMESH::TriaFilter && + ( f->NbNodes()==3 || f->NbNodes()==6 ) ) { + myIds.Add(f->GetID()); + } + else if( myFilterType==SMESH::QuadFilter && + ( f->NbNodes()==4 || f->NbNodes()==8 ) ) { + myIds.Add(f->GetID()); + } + } } else if(myFilterType == SMESH::VolumeFilter) { - SMDS_VolumeIteratorPtr it = aMesh->volumesIterator(); - while(it->more()) { - const SMDS_MeshVolume* f = it->next(); - myIds.Add(f->GetID()); - } + SMDS_VolumeIteratorPtr it = aMesh->volumesIterator(); + while(it->more()) { + const SMDS_MeshVolume* f = it->next(); + myIds.Add(f->GetID()); + } } /* commented by skl 07.02.2006 TVisualObjPtr aVisualObj = anActor->GetObject(); @@ -472,14 +472,14 @@ SMESH::long_array_var SMESHGUI_MultiEditDlg::getIds() for (int i = 0, n = aGrid->GetNumberOfCells(); i < n; i++) { vtkCell* aCell = aGrid->GetCell(i); if (aCell != 0) { - vtkTriangle* aTri = vtkTriangle::SafeDownCast(aCell); - vtkQuad* aQua = vtkQuad::SafeDownCast(aCell); - vtkPolygon* aPG = vtkPolygon::SafeDownCast(aCell); + vtkTriangle* aTri = vtkTriangle::SafeDownCast(aCell); + vtkQuad* aQua = vtkQuad::SafeDownCast(aCell); + vtkPolygon* aPG = vtkPolygon::SafeDownCast(aCell); - vtkCell3D* a3d = vtkCell3D::SafeDownCast(aCell); - vtkConvexPointSet* aPH = vtkConvexPointSet::SafeDownCast(aCell); + vtkCell3D* a3d = vtkCell3D::SafeDownCast(aCell); + vtkConvexPointSet* aPH = vtkConvexPointSet::SafeDownCast(aCell); - if (aTri && myFilterType == SMESHGUI_TriaFilter || + if (aTri && myFilterType == SMESHGUI_TriaFilter || aQua && myFilterType == SMESHGUI_QuadFilter || (aTri || aQua || aPG) && myFilterType == SMESHGUI_FaceFilter || (a3d || aPH) && myFilterType == SMESHGUI_VolumeFilter) { @@ -540,10 +540,10 @@ void SMESHGUI_MultiEditDlg::onHelp() platform = "application"; #endif SUIT_MessageBox::warning(this, tr("WRN_WARNING"), - tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). - arg(app->resourceMgr()->stringValue("ExternalBrowser", - platform)). - arg(myHelpFileName)); + tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). + arg(app->resourceMgr()->stringValue("ExternalBrowser", + platform)). + arg(myHelpFileName)); } } @@ -594,10 +594,10 @@ void SMESHGUI_MultiEditDlg::onSelectionDone() if (aNbItems > 0) { QStringList anElements = aListStr.split(" ", QString::SkipEmptyParts); for (QStringList::iterator it = anElements.begin(); it != anElements.end(); ++it) { - QList items = myListBox->findItems(*it, Qt::MatchExactly); - QListWidgetItem* anItem; - foreach(anItem, items) - anItem->setSelected(true); + QList items = myListBox->findItems(*it, Qt::MatchExactly); + QListWidgetItem* anItem; + foreach(anItem, items) + anItem->setSelected(true); } } myMesh = SMESH::GetMeshByIO(anIO); @@ -1180,7 +1180,7 @@ bool SMESHGUI_UnionOfTrianglesDlg::isValid (const bool theMess) if( theMess ) { QString str( tr( "SMESH_INCORRECT_INPUT" ) ); if ( !msg.isEmpty() ) - str += "\n" + msg; + str += "\n" + msg; SUIT_MessageBox::critical( this, tr( "SMESH_ERROR" ), str ); } return false; @@ -1198,7 +1198,7 @@ bool SMESHGUI_UnionOfTrianglesDlg::process (SMESH::SMESH_MeshEditor_ptr theEdito if( ok ) { QStringList aParameters; aParameters << myMaxAngleSpin->text(); - myMesh->SetParameters( SMESHGUI::JoinObjectParameters(aParameters) ); + myMesh->SetParameters( aParameters.join(":").toLatin1().constData() ); } return ok; } diff --git a/src/SMESHGUI/SMESHGUI_MultiEditDlg.h b/src/SMESHGUI/SMESHGUI_MultiEditDlg.h index 0ada531f9..f14996814 100755 --- a/src/SMESHGUI/SMESHGUI_MultiEditDlg.h +++ b/src/SMESHGUI/SMESHGUI_MultiEditDlg.h @@ -113,7 +113,7 @@ protected: void setSelectionMode(); virtual bool isIdValid( const int ) const; virtual bool process( SMESH::SMESH_MeshEditor_ptr, - const SMESH::long_array& ) = 0; + const SMESH::long_array& ) = 0; int entityType(); protected: diff --git a/src/SMESHGUI/SMESHGUI_NodesDlg.cxx b/src/SMESHGUI/SMESHGUI_NodesDlg.cxx index 2e00469d6..76b75dbb9 100644 --- a/src/SMESHGUI/SMESHGUI_NodesDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_NodesDlg.cxx @@ -95,11 +95,11 @@ namespace SMESH _PTR(SObject) aSobj = SMESH::FindSObject( theMesh ); SMESH::SMESH_MeshEditor_var aMeshEditor = theMesh->GetMeshEditor(); aMeshEditor->AddNode( x, y, z ); - theMesh->SetParameters( SMESHGUI::JoinObjectParameters(theParameters) ); + theMesh->SetParameters( theParameters.join(":").toLatin1().constData() ); _PTR(Study) aStudy = GetActiveStudyDocument(); CORBA::Long anId = aStudy->StudyId(); if (TVisualObjPtr aVisualObj = SMESH::GetVisualObj( anId, aSobj->GetID().c_str() ) ) { - aVisualObj->Update( true ); + aVisualObj->Update( true ); } } catch ( SALOME::SALOME_Exception& exc ) { @@ -235,7 +235,7 @@ SMESHGUI_NodesDlg::SMESHGUI_NodesDlg( SMESHGUI* theModule ): mySimulation = new SMESH::TNodeSimulation( SMESH::GetViewWindow( mySMESHGUI ) ); QPixmap image0( SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap( "SMESH", - tr( "ICON_DLG_NODE" ) ) ); + tr( "ICON_DLG_NODE" ) ) ); QVBoxLayout* SMESHGUI_NodesDlgLayout = new QVBoxLayout( this ); SMESHGUI_NodesDlgLayout->setSpacing( SPACING ); @@ -398,7 +398,7 @@ bool SMESHGUI_NodesDlg::ClickOnApply() if ( myMesh->_is_nil() ) { SUIT_MessageBox::warning( this, tr( "SMESH_WRN_WARNING" ), - tr( "MESH_IS_NOT_SELECTED" ) ); + tr( "MESH_IS_NOT_SELECTED" ) ); return false; } @@ -472,7 +472,7 @@ void SMESHGUI_NodesDlg::ClickOnHelp() LightApp_Application* app = (LightApp_Application*)( SUIT_Session::session()->activeApplication() ); if ( app ) app->onHelpContextModule( mySMESHGUI ? app->moduleName( mySMESHGUI->moduleName() ) : - QString( "" ), myHelpFileName ); + QString( "" ), myHelpFileName ); else { QString platform; #ifdef WIN32 @@ -481,10 +481,10 @@ void SMESHGUI_NodesDlg::ClickOnHelp() platform = "application"; #endif SUIT_MessageBox::warning( this, tr("WRN_WARNING"), - tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). - arg( app->resourceMgr()->stringValue( "ExternalBrowser", - platform ) ). - arg( myHelpFileName ) ); + tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). + arg( app->resourceMgr()->stringValue( "ExternalBrowser", + platform ) ). + arg( myHelpFileName ) ); } } @@ -508,19 +508,19 @@ void SMESHGUI_NodesDlg::SelectionIntoArgument() if ( myMesh->_is_nil() ) return; QString aText; if ( SMESH::GetNameOfSelectedNodes( mySelector, anIO, aText ) == 1 ) { - if ( SMESH_Actor* anActor = SMESH::FindActorByObject( myMesh.in() ) ) { - if ( SMDS_Mesh* aMesh = anActor->GetObject()->GetMesh() ) { - if ( const SMDS_MeshNode* aNode = aMesh->FindNode( aText.toInt() ) ) { - SpinBox_X->SetValue( aNode->X() ); - SpinBox_Y->SetValue( aNode->Y() ); - SpinBox_Z->SetValue( aNode->Z() ); + if ( SMESH_Actor* anActor = SMESH::FindActorByObject( myMesh.in() ) ) { + if ( SMDS_Mesh* aMesh = anActor->GetObject()->GetMesh() ) { + if ( const SMDS_MeshNode* aNode = aMesh->FindNode( aText.toInt() ) ) { + SpinBox_X->SetValue( aNode->X() ); + SpinBox_Y->SetValue( aNode->Y() ); + SpinBox_Z->SetValue( aNode->Z() ); } - } - } + } + } } mySimulation->SetPosition( SpinBox_X->GetValue(), - SpinBox_Y->GetValue(), - SpinBox_Z->GetValue() ); + SpinBox_Y->GetValue(), + SpinBox_Z->GetValue() ); } } } diff --git a/src/SMESHGUI/SMESHGUI_Operation.cxx b/src/SMESHGUI/SMESHGUI_Operation.cxx index 40bb88e65..863d4333a 100755 --- a/src/SMESHGUI/SMESHGUI_Operation.cxx +++ b/src/SMESHGUI/SMESHGUI_Operation.cxx @@ -120,7 +120,7 @@ bool SMESHGUI_Operation::isReadyToStart() const else if ( getSMESHGUI() == 0 ) { SUIT_MessageBox::warning( desktop(), tr( "SMESH_WRN_WARNING" ), - tr( "NO_MODULE" ) ); + tr( "NO_MODULE" ) ); return false; } else if ( isStudyLocked() ) @@ -200,10 +200,10 @@ void SMESHGUI_Operation::onHelp() platform = "application"; #endif SUIT_MessageBox::warning( desktop(), tr("WRN_WARNING"), - tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). - arg(app->resourceMgr()->stringValue("ExternalBrowser", - platform)). - arg(myHelpFileName) ); + tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). + arg(app->resourceMgr()->stringValue("ExternalBrowser", + platform)). + arg(myHelpFileName) ); } } @@ -231,7 +231,7 @@ bool SMESHGUI_Operation::isStudyLocked( const bool theMess ) const { if ( theMess ) SUIT_MessageBox::warning( SMESHGUI::desktop(), tr( "WRN_WARNING" ), - tr( "WRN_STUDY_LOCKED" ) ); + tr( "WRN_STUDY_LOCKED" ) ); return true; } } @@ -260,7 +260,7 @@ bool SMESHGUI_Operation::isValid( SUIT_Operation* theOtherOp ) const return theOtherOp && theOtherOp->inherits( "SMESHGUI_Operation" ) && ( !anOps.contains( theOtherOp->metaObject()->className() ) || - anOps.contains( metaObject()->className() ) ); + anOps.contains( metaObject()->className() ) ); return true; } diff --git a/src/SMESHGUI/SMESHGUI_PatternWidget.cxx b/src/SMESHGUI/SMESHGUI_PatternWidget.cxx index c8ab77ac8..608a6e3a0 100644 --- a/src/SMESHGUI/SMESHGUI_PatternWidget.cxx +++ b/src/SMESHGUI/SMESHGUI_PatternWidget.cxx @@ -95,9 +95,9 @@ void SMESHGUI_PatternWidget::paintEvent( QPaintEvent* ) QPoint aQPnt = mapCoords( aPoint.x, aPoint.y ); painter.drawPie( aQPnt.x() - Radius, aQPnt.y() - Radius, - Radius * 2, Radius * 2, 0, 360 * 16 ); + Radius * 2, Radius * 2, 0, 360 * 16 ); painter.drawText( aQPnt.x() + Shift, aQPnt.y() - Shift, - QString::number( i+1 ) ); + QString::number( i+1 ) ); } // Draw lines diff --git a/src/SMESHGUI/SMESHGUI_PatternWidget.h b/src/SMESHGUI/SMESHGUI_PatternWidget.h index e4a6e41d3..fb2547811 100644 --- a/src/SMESHGUI/SMESHGUI_PatternWidget.h +++ b/src/SMESHGUI/SMESHGUI_PatternWidget.h @@ -53,8 +53,8 @@ public: ~SMESHGUI_PatternWidget(); void SetPoints( const PointVector&, - const QVector&, - const ConnectivityVector& ); + const QVector&, + const ConnectivityVector& ); private: PointVector myPoints; diff --git a/src/SMESHGUI/SMESHGUI_Preferences_ColorDlg.cxx b/src/SMESHGUI/SMESHGUI_Preferences_ColorDlg.cxx index 3b16aaf0b..f8ed909ae 100644 --- a/src/SMESHGUI/SMESHGUI_Preferences_ColorDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_Preferences_ColorDlg.cxx @@ -158,10 +158,10 @@ SMESHGUI_Preferences_ColorDlg::SMESHGUI_Preferences_ColorDlg( SMESHGUI* theModul connect( buttonCancel, SIGNAL( clicked() ), this, SLOT( ClickOnCancel() ) ); connect( mySMESHGUI, SIGNAL ( SignalDeactivateActiveDialog() ), - this, SLOT( DeactivateActiveDialog() ) ); + this, SLOT( DeactivateActiveDialog() ) ); /* to close dialog if study change */ connect( mySMESHGUI, SIGNAL ( SignalCloseAllDialogs() ), - this, SLOT( ClickOnCancel() ) ); + this, SLOT( ClickOnCancel() ) ); } //================================================================================= diff --git a/src/SMESHGUI/SMESHGUI_Preferences_ScalarBarDlg.cxx b/src/SMESHGUI/SMESHGUI_Preferences_ScalarBarDlg.cxx index a6d44e57a..175677f53 100644 --- a/src/SMESHGUI/SMESHGUI_Preferences_ScalarBarDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_Preferences_ScalarBarDlg.cxx @@ -300,7 +300,7 @@ SMESHGUI_Preferences_ScalarBarDlg::SMESHGUI_Preferences_ScalarBarDlg( SMESHGUI* SUIT_ResourceMgr* mgr = SMESH::GetResourceMgr( mySMESHGUI ); QColor titleColor = mgr->colorValue("SMESH", "scalar_bar_title_color", - QColor(255, 255, 255)); + QColor(255, 255, 255)); myTitleColorBtn->setColor(titleColor); myTitleFontCombo->setCurrentIndex(0); if (mgr->hasValue("SMESH", "scalar_bar_title_font")) { @@ -316,9 +316,9 @@ SMESHGUI_Preferences_ScalarBarDlg::SMESHGUI_Preferences_ScalarBarDlg( SMESHGUI* myTitleItalicCheck->setChecked( f.italic() ); myTitleShadowCheck->setChecked( f.overline() ); } - + QColor labelColor = mgr->colorValue("SMESH", "scalar_bar_label_color", - QColor(255, 255, 255)); + QColor(255, 255, 255)); myLabelsColorBtn->setColor(labelColor); myLabelsFontCombo->setCurrentIndex(0); if (mgr->hasValue("SMESH", "scalar_bar_label_font")) { @@ -352,16 +352,16 @@ SMESHGUI_Preferences_ScalarBarDlg::SMESHGUI_Preferences_ScalarBarDlg( SMESHGUI* QString name = isHoriz ? "scalar_bar_horizontal_%1" : "scalar_bar_vertical_%1"; myIniX = mgr->doubleValue("SMESH", name.arg( "x" ), - myHorizRadioBtn->isChecked() ? DEF_HOR_X : DEF_VER_X); + myHorizRadioBtn->isChecked() ? DEF_HOR_X : DEF_VER_X); myIniY = mgr->doubleValue("SMESH", name.arg( "y" ), - myHorizRadioBtn->isChecked() ? DEF_HOR_Y : DEF_VER_Y); + myHorizRadioBtn->isChecked() ? DEF_HOR_Y : DEF_VER_Y); myIniW = mgr->doubleValue("SMESH", name.arg( "width" ), - myHorizRadioBtn->isChecked() ? DEF_HOR_W : DEF_VER_W); + myHorizRadioBtn->isChecked() ? DEF_HOR_W : DEF_VER_W); myIniH = mgr->doubleValue("SMESH", name.arg( "height" ), - myHorizRadioBtn->isChecked() ? DEF_HOR_H : DEF_VER_H); + myHorizRadioBtn->isChecked() ? DEF_HOR_H : DEF_VER_H); setOriginAndSize(myIniX, myIniY, myIniW, myIniH); @@ -504,10 +504,10 @@ void SMESHGUI_Preferences_ScalarBarDlg::onHelp() platform = "application"; #endif SUIT_MessageBox::warning(this, tr("WRN_WARNING"), - tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). - arg(app->resourceMgr()->stringValue("ExternalBrowser", - platform)). - arg(myHelpFileName)); + tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). + arg(app->resourceMgr()->stringValue("ExternalBrowser", + platform)). + arg(myHelpFileName)); } } @@ -528,56 +528,56 @@ void SMESHGUI_Preferences_ScalarBarDlg::onSelectionChanged() if( anIO->hasEntry() ) { SMESH_Actor* anActor = SMESH::FindActorByEntry(anIO->getEntry()); if ( anActor && anActor->GetScalarBarActor() && anActor->GetControlMode() != SMESH_Actor::eNone ) { - myActor = anActor; - vtkScalarBarActor* myScalarBarActor = myActor->GetScalarBarActor(); - - if ( myScalarBarActor->GetLookupTable() ) { - vtkFloatingPointType *range = myScalarBarActor->GetLookupTable()->GetRange(); - myMinEdit->setText( QString::number( range[0],'g',12 ) ); - myMaxEdit->setText( QString::number( range[1],'g',12 ) ); - } - - vtkTextProperty* aTitleTextPrp = myScalarBarActor->GetTitleTextProperty(); - vtkFloatingPointType aTColor[3]; - aTitleTextPrp->GetColor( aTColor ); - myTitleColorBtn->setColor( QColor( (int)( aTColor[0]*255 ), (int)( aTColor[1]*255 ), (int)( aTColor[2]*255 ) ) ); - myTitleFontCombo->setCurrentIndex( aTitleTextPrp->GetFontFamily() ); - myTitleBoldCheck->setChecked( aTitleTextPrp->GetBold() ); - myTitleItalicCheck->setChecked( aTitleTextPrp->GetItalic() ); - myTitleShadowCheck->setChecked( aTitleTextPrp->GetShadow() ); - - vtkTextProperty* aLabelsTextPrp = myScalarBarActor->GetLabelTextProperty(); - vtkFloatingPointType aLColor[3]; - aLabelsTextPrp->GetColor( aLColor ); - myLabelsColorBtn->setColor( QColor( (int)( aLColor[0]*255 ), (int)( aLColor[1]*255 ), (int)( aLColor[2]*255 ) ) ); - myLabelsFontCombo->setCurrentIndex( aLabelsTextPrp->GetFontFamily() ); - myLabelsBoldCheck->setChecked( aLabelsTextPrp->GetBold() ); - myLabelsItalicCheck->setChecked( aLabelsTextPrp->GetItalic() ); - myLabelsShadowCheck->setChecked( aLabelsTextPrp->GetShadow() ); - - myLabelsSpin->setValue( myScalarBarActor->GetNumberOfLabels() ); - myColorsSpin->setValue( myScalarBarActor->GetMaximumNumberOfColors() ); - - if ( myScalarBarActor->GetOrientation() == VTK_ORIENT_VERTICAL ) - myVertRadioBtn->setChecked( true ); - else - myHorizRadioBtn->setChecked( true ); - myIniOrientation = myVertRadioBtn->isChecked(); - - myIniX = myScalarBarActor->GetPosition()[0]; - myIniY = myScalarBarActor->GetPosition()[1]; - myIniW = myScalarBarActor->GetWidth(); - myIniH = myScalarBarActor->GetHeight(); - setOriginAndSize( myIniX, myIniY, myIniW, myIniH ); - - myRangeGrp->setEnabled( true ); - myFontGrp->setEnabled( true ); - myLabColorGrp->setEnabled( true ); - myOrientationGrp->setEnabled( true ); - myOriginDimGrp->setEnabled( true ); - myOkBtn->setEnabled( true ); - myApplyBtn->setEnabled( true ); - return; + myActor = anActor; + vtkScalarBarActor* myScalarBarActor = myActor->GetScalarBarActor(); + + if ( myScalarBarActor->GetLookupTable() ) { + vtkFloatingPointType *range = myScalarBarActor->GetLookupTable()->GetRange(); + myMinEdit->setText( QString::number( range[0],'g',12 ) ); + myMaxEdit->setText( QString::number( range[1],'g',12 ) ); + } + + vtkTextProperty* aTitleTextPrp = myScalarBarActor->GetTitleTextProperty(); + vtkFloatingPointType aTColor[3]; + aTitleTextPrp->GetColor( aTColor ); + myTitleColorBtn->setColor( QColor( (int)( aTColor[0]*255 ), (int)( aTColor[1]*255 ), (int)( aTColor[2]*255 ) ) ); + myTitleFontCombo->setCurrentIndex( aTitleTextPrp->GetFontFamily() ); + myTitleBoldCheck->setChecked( aTitleTextPrp->GetBold() ); + myTitleItalicCheck->setChecked( aTitleTextPrp->GetItalic() ); + myTitleShadowCheck->setChecked( aTitleTextPrp->GetShadow() ); + + vtkTextProperty* aLabelsTextPrp = myScalarBarActor->GetLabelTextProperty(); + vtkFloatingPointType aLColor[3]; + aLabelsTextPrp->GetColor( aLColor ); + myLabelsColorBtn->setColor( QColor( (int)( aLColor[0]*255 ), (int)( aLColor[1]*255 ), (int)( aLColor[2]*255 ) ) ); + myLabelsFontCombo->setCurrentIndex( aLabelsTextPrp->GetFontFamily() ); + myLabelsBoldCheck->setChecked( aLabelsTextPrp->GetBold() ); + myLabelsItalicCheck->setChecked( aLabelsTextPrp->GetItalic() ); + myLabelsShadowCheck->setChecked( aLabelsTextPrp->GetShadow() ); + + myLabelsSpin->setValue( myScalarBarActor->GetNumberOfLabels() ); + myColorsSpin->setValue( myScalarBarActor->GetMaximumNumberOfColors() ); + + if ( myScalarBarActor->GetOrientation() == VTK_ORIENT_VERTICAL ) + myVertRadioBtn->setChecked( true ); + else + myHorizRadioBtn->setChecked( true ); + myIniOrientation = myVertRadioBtn->isChecked(); + + myIniX = myScalarBarActor->GetPosition()[0]; + myIniY = myScalarBarActor->GetPosition()[1]; + myIniW = myScalarBarActor->GetWidth(); + myIniH = myScalarBarActor->GetHeight(); + setOriginAndSize( myIniX, myIniY, myIniW, myIniH ); + + myRangeGrp->setEnabled( true ); + myFontGrp->setEnabled( true ); + myLabColorGrp->setEnabled( true ); + myOrientationGrp->setEnabled( true ); + myOriginDimGrp->setEnabled( true ); + myOkBtn->setEnabled( true ); + myApplyBtn->setEnabled( true ); + return; } } } @@ -625,9 +625,9 @@ void SMESHGUI_Preferences_ScalarBarDlg::onXYChanged() */ //================================================================================================= void SMESHGUI_Preferences_ScalarBarDlg::setOriginAndSize( const double x, - const double y, - const double w, - const double h ) + const double y, + const double w, + const double h ) { blockSignals( true ); myXSpin->setValue( x ); @@ -656,9 +656,9 @@ void SMESHGUI_Preferences_ScalarBarDlg::onOrientationChanged() setOriginAndSize( myIniX, myIniY, myIniW, myIniH ); else setOriginAndSize( aOrientation ? DEF_VER_X : DEF_HOR_X, - aOrientation ? DEF_VER_Y : DEF_HOR_Y, - aOrientation ? DEF_VER_W : DEF_HOR_W, - aOrientation ? DEF_VER_H : DEF_HOR_H ); + aOrientation ? DEF_VER_Y : DEF_HOR_Y, + aOrientation ? DEF_VER_W : DEF_HOR_W, + aOrientation ? DEF_VER_H : DEF_HOR_H ); } //================================================================================================= diff --git a/src/SMESHGUI/SMESHGUI_Preferences_ScalarBarDlg.h b/src/SMESHGUI/SMESHGUI_Preferences_ScalarBarDlg.h index 609631267..cc4126202 100644 --- a/src/SMESHGUI/SMESHGUI_Preferences_ScalarBarDlg.h +++ b/src/SMESHGUI/SMESHGUI_Preferences_ScalarBarDlg.h @@ -63,9 +63,9 @@ public: void closeEvent( QCloseEvent* ); void setOriginAndSize( const double, - const double, - const double, - const double ); + const double, + const double, + const double ); void initScalarBarFromResources(); protected slots: diff --git a/src/SMESHGUI/SMESHGUI_RemoveElementsDlg.cxx b/src/SMESHGUI/SMESHGUI_RemoveElementsDlg.cxx index 7986c2d63..9af8862ef 100644 --- a/src/SMESHGUI/SMESHGUI_RemoveElementsDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_RemoveElementsDlg.cxx @@ -204,7 +204,7 @@ void SMESHGUI_RemoveElementsDlg::Init() /* to close dialog if study change */ connect(mySMESHGUI, SIGNAL (SignalCloseAllDialogs()), this, SLOT(ClickOnCancel())); connect(myEditCurrentArgument, SIGNAL(textChanged(const QString&)), - SLOT(onTextChange(const QString&))); + SLOT(onTextChange(const QString&))); if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) aViewWindow->SetSelectionMode(CellSelection); @@ -291,10 +291,10 @@ void SMESHGUI_RemoveElementsDlg::ClickOnHelp() platform = "application"; #endif SUIT_MessageBox::warning(this, tr("WRN_WARNING"), - tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). - arg(app->resourceMgr()->stringValue("ExternalBrowser", - platform)). - arg(myHelpFileName)); + tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). + arg(app->resourceMgr()->stringValue("ExternalBrowser", + platform)). + arg(myHelpFileName)); } } @@ -321,15 +321,15 @@ void SMESHGUI_RemoveElementsDlg::onTextChange(const QString& theNewText) QStringList aListId = theNewText.split(" ", QString::SkipEmptyParts); for (int i = 0; i < aListId.count(); i++) { - if(const SMDS_MeshElement *anElem = aMesh->FindElement(aListId[i].toInt())) { - newIndices.Add(anElem->GetID()); - myNbOkElements++; - } + 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); + aViewWindow->highlight(anIO,true,true); } } @@ -410,8 +410,8 @@ void SMESHGUI_RemoveElementsDlg::SetEditCurrentArgument() case 0: /* default constructor */ { if(send == SelectButtonC1A1) { - LineEditC1A1->setFocus(); - myEditCurrentArgument = LineEditC1A1; + LineEditC1A1->setFocus(); + myEditCurrentArgument = LineEditC1A1; } SelectionIntoArgument(); break; @@ -509,8 +509,8 @@ void SMESHGUI_RemoveElementsDlg::setFilters() { if(myMesh->_is_nil()) { SUIT_MessageBox::critical(this, - tr("SMESH_ERROR"), - tr("NO_MESH_SELECTED")); + tr("SMESH_ERROR"), + tr("NO_MESH_SELECTED")); return; } if ( !myFilterDlg ) diff --git a/src/SMESHGUI/SMESHGUI_RemoveNodesDlg.cxx b/src/SMESHGUI/SMESHGUI_RemoveNodesDlg.cxx index c511dbae4..e6687ff29 100644 --- a/src/SMESHGUI/SMESHGUI_RemoveNodesDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_RemoveNodesDlg.cxx @@ -204,7 +204,7 @@ void SMESHGUI_RemoveNodesDlg::Init() /* to close dialog if study change */ connect(mySMESHGUI, SIGNAL (SignalCloseAllDialogs()), this, SLOT(ClickOnCancel())); connect(myEditCurrentArgument, SIGNAL(textChanged(const QString&)), - SLOT(onTextChange(const QString&))); + SLOT(onTextChange(const QString&))); SMESH::SetPointRepresentation(true); @@ -297,10 +297,10 @@ void SMESHGUI_RemoveNodesDlg::ClickOnHelp() platform = "application"; #endif SUIT_MessageBox::warning(this, tr("WRN_WARNING"), - tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). - arg(app->resourceMgr()->stringValue("ExternalBrowser", - platform)). - arg(myHelpFileName)); + tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). + arg(app->resourceMgr()->stringValue("ExternalBrowser", + platform)). + arg(myHelpFileName)); } } @@ -327,15 +327,15 @@ void SMESHGUI_RemoveNodesDlg::onTextChange(const QString& theNewText) QStringList aListId = theNewText.split(" ", QString::SkipEmptyParts); for (int i = 0; i < aListId.count(); i++) { - if (const SMDS_MeshNode *aNode = aMesh->FindNode(aListId[i].toInt())) { - newIndices.Add(aNode->GetID()); - myNbOkNodes++; - } + 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); + aViewWindow->highlight(anIO,true,true); } } @@ -416,8 +416,8 @@ void SMESHGUI_RemoveNodesDlg::SetEditCurrentArgument() case 0: /* default constructor */ { if(send == SelectButtonC1A1) { - LineEditC1A1->setFocus(); - myEditCurrentArgument = LineEditC1A1; + LineEditC1A1->setFocus(); + myEditCurrentArgument = LineEditC1A1; } SelectionIntoArgument(); break; @@ -516,8 +516,8 @@ void SMESHGUI_RemoveNodesDlg::setFilters() { if(myMesh->_is_nil()) { SUIT_MessageBox::critical(this, - tr("SMESH_ERROR"), - tr("NO_MESH_SELECTED")); + tr("SMESH_ERROR"), + tr("NO_MESH_SELECTED")); return; } if ( !myFilterDlg ) diff --git a/src/SMESHGUI/SMESHGUI_RenumberingDlg.cxx b/src/SMESHGUI/SMESHGUI_RenumberingDlg.cxx index 26a2614ac..5e575a670 100644 --- a/src/SMESHGUI/SMESHGUI_RenumberingDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_RenumberingDlg.cxx @@ -78,14 +78,14 @@ SMESHGUI_RenumberingDlg::SMESHGUI_RenumberingDlg( SMESHGUI* theModule, const int setModal(false); setAttribute(Qt::WA_DeleteOnClose, true); setWindowTitle(unit == 0 ? - tr("SMESH_RENUMBERING_NODES_TITLE") : - tr("SMESH_RENUMBERING_ELEMENTS_TITLE")); + tr("SMESH_RENUMBERING_NODES_TITLE") : + tr("SMESH_RENUMBERING_ELEMENTS_TITLE")); setSizeGripEnabled(true); SUIT_ResourceMgr* resMgr = SMESH::GetResourceMgr( mySMESHGUI ); QPixmap image0(resMgr->loadPixmap("SMESH", unit == 0 ? - tr("ICON_DLG_RENUMBERING_NODES") : - tr("ICON_DLG_RENUMBERING_ELEMENTS"))); + tr("ICON_DLG_RENUMBERING_NODES") : + tr("ICON_DLG_RENUMBERING_ELEMENTS"))); QPixmap image1(resMgr->loadPixmap("SMESH",tr("ICON_SELECT"))); QVBoxLayout* SMESHGUI_RenumberingDlgLayout = new QVBoxLayout(this); @@ -94,9 +94,9 @@ SMESHGUI_RenumberingDlg::SMESHGUI_RenumberingDlg( SMESHGUI* theModule, const int /***************************************************************/ GroupConstructors = new QGroupBox(unit == 0 ? - tr("SMESH_NODES") : - tr("SMESH_ELEMENTS"), - this); + tr("SMESH_NODES") : + tr("SMESH_ELEMENTS"), + this); myHelpFileName = unit == 0 ? "renumbering_nodes_and_elements_page.html#renumbering_nodes_anchor" : "renumbering_nodes_and_elements_page.html#renumbering_elements_anchor"; @@ -219,22 +219,22 @@ void SMESHGUI_RenumberingDlg::ClickOnApply() bool isUnitsLabeled = false; if (myUnit == 0 && anActor) { - isUnitsLabeled = anActor->GetPointsLabeled(); - if (isUnitsLabeled) anActor->SetPointsLabeled(false); + isUnitsLabeled = anActor->GetPointsLabeled(); + if (isUnitsLabeled) anActor->SetPointsLabeled(false); } else if (myUnit == 1 && anActor) { - isUnitsLabeled = anActor->GetCellsLabeled(); - if (isUnitsLabeled) anActor->SetCellsLabeled(false); + isUnitsLabeled = anActor->GetCellsLabeled(); + if (isUnitsLabeled) anActor->SetCellsLabeled(false); } SUIT_OverrideCursor aWaitCursor; if (myUnit == 0) { - aMeshEditor->RenumberNodes(); - if (isUnitsLabeled && anActor) anActor->SetPointsLabeled(true); + aMeshEditor->RenumberNodes(); + if (isUnitsLabeled && anActor) anActor->SetPointsLabeled(true); } else if (myUnit == 1) { - aMeshEditor->RenumberElements(); - if (isUnitsLabeled && anActor) anActor->SetCellsLabeled(true); + aMeshEditor->RenumberElements(); + if (isUnitsLabeled && anActor) anActor->SetCellsLabeled(true); } } catch(...) { @@ -285,10 +285,10 @@ void SMESHGUI_RenumberingDlg::ClickOnHelp() platform = "application"; #endif SUIT_MessageBox::warning(this, tr("WRN_WARNING"), - tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). - arg(app->resourceMgr()->stringValue("ExternalBrowser", - platform)). - arg(myHelpFileName)); + tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). + arg(app->resourceMgr()->stringValue("ExternalBrowser", + platform)). + arg(myHelpFileName)); } } @@ -316,7 +316,7 @@ void SMESHGUI_RenumberingDlg::SelectionIntoArgument() Handle(SALOME_InteractiveObject) IO = aList.First(); myMesh = SMESH::IObjectToInterface(IO); if (myMesh->_is_nil()) - aString = ""; + aString = ""; } } @@ -338,12 +338,12 @@ void SMESHGUI_RenumberingDlg::SetEditCurrentArgument() { case 0: /* default constructor */ { - if(send == SelectButton) { - LineEditMesh->setFocus(); - myEditCurrentArgument = LineEditMesh; - } - SelectionIntoArgument(); - break; + if(send == SelectButton) { + LineEditMesh->setFocus(); + myEditCurrentArgument = LineEditMesh; + } + SelectionIntoArgument(); + break; } } } diff --git a/src/SMESHGUI/SMESHGUI_RevolutionDlg.cxx b/src/SMESHGUI/SMESHGUI_RevolutionDlg.cxx index e9e7fef05..484989dfd 100644 --- a/src/SMESHGUI/SMESHGUI_RevolutionDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_RevolutionDlg.cxx @@ -452,7 +452,7 @@ void SMESHGUI_RevolutionDlg::ConstructorsClicked (int constructorId) myIDs.clear(); myNbOkElements = 0; if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(aSelMode); + aViewWindow->SetSelectionMode(aSelMode); } myEditCurrentArgument = (QWidget*)LineEditElements; @@ -519,32 +519,32 @@ bool SMESHGUI_RevolutionDlg::ClickOnApply() if ( MakeGroupsCheck->isEnabled() && MakeGroupsCheck->isChecked() ) { if( CheckBoxMesh->isChecked() ) { - if( GetConstructorId() == 0 ) - SMESH::ListOfGroups_var groups = - aMeshEditor->RotationSweepObject1DMakeGroups(mySelectedObject, anAxis, - anAngle, aNbSteps, aTolerance); - else - SMESH::ListOfGroups_var groups = - aMeshEditor->RotationSweepObject2DMakeGroups(mySelectedObject, anAxis, - anAngle, aNbSteps, aTolerance); - } - else - SMESH::ListOfGroups_var groups = - aMeshEditor->RotationSweepMakeGroups(anElementsId.inout(), anAxis, - anAngle, aNbSteps, aTolerance); + if( GetConstructorId() == 0 ) + SMESH::ListOfGroups_var groups = + aMeshEditor->RotationSweepObject1DMakeGroups(mySelectedObject, anAxis, + anAngle, aNbSteps, aTolerance); + else + SMESH::ListOfGroups_var groups = + aMeshEditor->RotationSweepObject2DMakeGroups(mySelectedObject, anAxis, + anAngle, aNbSteps, aTolerance); + } + else + SMESH::ListOfGroups_var groups = + aMeshEditor->RotationSweepMakeGroups(anElementsId.inout(), anAxis, + anAngle, aNbSteps, aTolerance); } else { if( CheckBoxMesh->isChecked() ) { - if( GetConstructorId() == 0 ) - aMeshEditor->RotationSweepObject1D(mySelectedObject, anAxis, anAngle, aNbSteps, aTolerance); - else - aMeshEditor->RotationSweepObject2D(mySelectedObject, anAxis, anAngle, aNbSteps, aTolerance); - } - else - aMeshEditor->RotationSweep(anElementsId.inout(), anAxis, anAngle, aNbSteps, aTolerance); + if( GetConstructorId() == 0 ) + aMeshEditor->RotationSweepObject1D(mySelectedObject, anAxis, anAngle, aNbSteps, aTolerance); + else + aMeshEditor->RotationSweepObject2D(mySelectedObject, anAxis, anAngle, aNbSteps, aTolerance); + } + else + aMeshEditor->RotationSweep(anElementsId.inout(), anAxis, anAngle, aNbSteps, aTolerance); } - myMesh->SetParameters( SMESHGUI::JoinObjectParameters(aParameters) ); + myMesh->SetParameters( aParameters.join(":").toLatin1().constData() ); } catch (...) { } @@ -602,10 +602,10 @@ void SMESHGUI_RevolutionDlg::ClickOnHelp() platform = "application"; #endif SUIT_MessageBox::warning(this, tr("WRN_WARNING"), - tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). - arg(app->resourceMgr()->stringValue("ExternalBrowser", - platform)). - arg(myHelpFileName)); + tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). + arg(app->resourceMgr()->stringValue("ExternalBrowser", + platform)). + arg(myHelpFileName)); } } @@ -653,15 +653,15 @@ void SMESHGUI_RevolutionDlg::onTextChange (const QString& theNewText) QStringList aListId = theNewText.split(" ", QString::SkipEmptyParts); for (int i = 0; i < aListId.count(); i++) { - const SMDS_MeshElement * e = aMesh->FindElement(aListId[ i ].toInt()); - if (e) - newIndices.Add(e->GetID()); - myNbOkElements++; + const SMDS_MeshElement * e = aMesh->FindElement(aListId[ i ].toInt()); + if (e) + newIndices.Add(e->GetID()); + myNbOkElements++; } mySelector->AddOrRemoveIndex(myActor->getIO(), newIndices, false); if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->highlight( myActor->getIO(), true, true ); + aViewWindow->highlight( myActor->getIO(), true, true ); myElementsId = theNewText; } @@ -744,7 +744,7 @@ void SMESHGUI_RevolutionDlg::SelectionIntoArgument() aNbUnits = SMESH::GetNameOfSelectedElements(mySelector, IO, aString); myElementsId = aString; if (aNbUnits < 1) - return; + return; } myNbOkElements = true; } else { @@ -834,20 +834,20 @@ void SMESHGUI_RevolutionDlg::SetEditCurrentArgument() SMESH::SetPointRepresentation(false); if (CheckBoxMesh->isChecked()) { if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(ActorSelection); + aViewWindow->SetSelectionMode(ActorSelection); mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter); } else { int aConstructorId = GetConstructorId(); if (aConstructorId == 0) - { - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(EdgeSelection); - } + { + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) + aViewWindow->SetSelectionMode(EdgeSelection); + } else if (aConstructorId == 1) - { - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(FaceSelection); - } + { + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) + aViewWindow->SetSelectionMode(FaceSelection); + } } } else if (send == SelectPointButton) { myEditCurrentArgument = (QWidget*)SpinBox_X; @@ -956,13 +956,13 @@ void SMESHGUI_RevolutionDlg::onSelectMesh (bool toSelectMesh) int aConstructorId = GetConstructorId(); if (aConstructorId == 0) { - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(EdgeSelection); + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) + aViewWindow->SetSelectionMode(EdgeSelection); } else if (aConstructorId == 1) { - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(FaceSelection); + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) + aViewWindow->SetSelectionMode(FaceSelection); } LineEditElements->setReadOnly(false); @@ -993,8 +993,8 @@ int SMESHGUI_RevolutionDlg::GetConstructorId() bool SMESHGUI_RevolutionDlg::IsAxisOk() { return (SpinBox_DX->GetValue() != 0 || - SpinBox_DY->GetValue() != 0 || - SpinBox_DZ->GetValue() != 0); + SpinBox_DY->GetValue() != 0 || + SpinBox_DZ->GetValue() != 0); } //================================================================================= @@ -1055,7 +1055,7 @@ void SMESHGUI_RevolutionDlg::onDisplaySimulation(bool toDisplayPreview) anElementsId->length(aListElementsId.count()); for (int i = 0; i < aListElementsId.count(); i++) - anElementsId[i] = aListElementsId[i].toInt(); + anElementsId[i] = aListElementsId[i].toInt(); SMESH::AxisStruct anAxis; @@ -1071,27 +1071,27 @@ void SMESHGUI_RevolutionDlg::onDisplaySimulation(bool toDisplayPreview) double aTolerance = SpinBox_Tolerance->GetValue(); if (GroupAngle->checkedId() == 1) - anAngle = anAngle/aNbSteps; + anAngle = anAngle/aNbSteps; try { - SUIT_OverrideCursor aWaitCursor; - SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditPreviewer(); + SUIT_OverrideCursor aWaitCursor; + SMESH::SMESH_MeshEditor_var aMeshEditor = myMesh->GetMeshEditPreviewer(); if( CheckBoxMesh->isChecked() ) { - if( GetConstructorId() == 0 ) - aMeshEditor->RotationSweepObject1D(mySelectedObject, anAxis, - anAngle, aNbSteps, aTolerance); - else - aMeshEditor->RotationSweepObject2D(mySelectedObject, anAxis, - anAngle, aNbSteps, aTolerance); - } - else - aMeshEditor->RotationSweep(anElementsId.inout(), - anAxis, - anAngle, - aNbSteps, - aTolerance); - SMESH::MeshPreviewStruct_var aMeshPreviewStruct = aMeshEditor->GetPreviewData(); - mySimulation->SetData(aMeshPreviewStruct._retn()); + if( GetConstructorId() == 0 ) + aMeshEditor->RotationSweepObject1D(mySelectedObject, anAxis, + anAngle, aNbSteps, aTolerance); + else + aMeshEditor->RotationSweepObject2D(mySelectedObject, anAxis, + anAngle, aNbSteps, aTolerance); + } + else + aMeshEditor->RotationSweep(anElementsId.inout(), + anAxis, + anAngle, + aNbSteps, + aTolerance); + SMESH::MeshPreviewStruct_var aMeshPreviewStruct = aMeshEditor->GetPreviewData(); + mySimulation->SetData(aMeshPreviewStruct._retn()); } catch (...) {} } else @@ -1155,8 +1155,8 @@ void SMESHGUI_RevolutionDlg::setFilters() { if(myMesh->_is_nil()) { SUIT_MessageBox::critical(this, - tr("SMESH_ERROR"), - tr("NO_MESH_SELECTED")); + tr("SMESH_ERROR"), + tr("NO_MESH_SELECTED")); return; } if ( !myFilterDlg ) diff --git a/src/SMESHGUI/SMESHGUI_RotationDlg.cxx b/src/SMESHGUI/SMESHGUI_RotationDlg.cxx index 4f122537b..d9352dbc8 100644 --- a/src/SMESHGUI/SMESHGUI_RotationDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_RotationDlg.cxx @@ -414,8 +414,8 @@ bool SMESHGUI_RotationDlg::ClickOnApply() aMeshEditor->RotateObject(mySelectedObject, anAxis, anAngle, false); else aMeshEditor->Rotate(anElementsId, anAxis, anAngle, false); - if( !myMesh->_is_nil()) - myMesh->SetParameters(SMESHGUI::JoinObjectParameters(aParameters)); + if( !myMesh->_is_nil()) + myMesh->SetParameters( aParameters.join(":").toLatin1().constData() ); break; case COPY_ELEMS_BUTTON: if ( makeGroups ) { @@ -431,8 +431,8 @@ bool SMESHGUI_RotationDlg::ClickOnApply() else aMeshEditor->Rotate(anElementsId, anAxis, anAngle, true); } - if( !myMesh->_is_nil()) - myMesh->SetParameters(SMESHGUI::JoinObjectParameters(aParameters)); + if( !myMesh->_is_nil()) + myMesh->SetParameters( aParameters.join(":").toLatin1().constData() ); break; case MAKE_MESH_BUTTON: SMESH::SMESH_Mesh_var mesh; @@ -442,8 +442,8 @@ bool SMESHGUI_RotationDlg::ClickOnApply() else mesh = aMeshEditor->RotateMakeMesh(anElementsId, anAxis, anAngle, makeGroups, LineEditNewMesh->text().toLatin1().data()); - if( !mesh->_is_nil()) - mesh->SetParameters(SMESHGUI::JoinObjectParameters(aParameters)); + if( !mesh->_is_nil()) + mesh->SetParameters( aParameters.join(":").toLatin1().constData() ); } } catch (...) { } @@ -506,10 +506,10 @@ void SMESHGUI_RotationDlg::ClickOnHelp() platform = "application"; #endif SUIT_MessageBox::warning(this, tr("WRN_WARNING"), - tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). - arg(app->resourceMgr()->stringValue("ExternalBrowser", - platform)). - arg(myHelpFileName)); + tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). + arg(app->resourceMgr()->stringValue("ExternalBrowser", + platform)). + arg(myHelpFileName)); } } @@ -543,15 +543,15 @@ void SMESHGUI_RotationDlg::onTextChange (const QString& theNewText) QStringList aListId = theNewText.split(" ", QString::SkipEmptyParts); for (int i = 0; i < aListId.count(); i++) { - const SMDS_MeshElement * e = aMesh->FindElement(aListId[ i ].toInt()); - if (e) - newIndices.Add(e->GetID()); - myNbOkElements++; + const SMDS_MeshElement * e = aMesh->FindElement(aListId[ i ].toInt()); + if (e) + newIndices.Add(e->GetID()); + myNbOkElements++; } mySelector->AddOrRemoveIndex( anIO, newIndices, false ); if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->highlight( anIO, true, true ); + aViewWindow->highlight( anIO, true, true ); myElementsId = theNewText; } @@ -743,23 +743,23 @@ void SMESHGUI_RotationDlg::SetEditCurrentArgument() myEditCurrentArgument = (QWidget*)LineEditElements; SMESH::SetPointRepresentation(false); if (CheckBoxMesh->isChecked()) { - if ( aViewWindow ) - aViewWindow->SetSelectionMode(ActorSelection); + if ( aViewWindow ) + aViewWindow->SetSelectionMode(ActorSelection); mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter); } else { - if ( aViewWindow ) - aViewWindow->SetSelectionMode( CellSelection ); - } + if ( aViewWindow ) + aViewWindow->SetSelectionMode( CellSelection ); + } } else if (send == SelectPointButton) { myEditCurrentArgument = (QWidget*)SpinBox_X; SMESH::SetPointRepresentation(true); - if ( aViewWindow ) - aViewWindow->SetSelectionMode( NodeSelection ); + if ( aViewWindow ) + aViewWindow->SetSelectionMode( NodeSelection ); } else if (send == SelectVectorButton) { myEditCurrentArgument = (QWidget*)SpinBox_DX; SMESH::SetPointRepresentation(true); - if ( aViewWindow ) - aViewWindow->SetSelectionMode( NodeSelection ); + if ( aViewWindow ) + aViewWindow->SetSelectionMode( NodeSelection ); } break; } @@ -879,8 +879,8 @@ void SMESHGUI_RotationDlg::onSelectMesh (bool toSelectMesh) bool SMESHGUI_RotationDlg::IsAxisOk() { return (SpinBox_DX->GetValue() != 0 || - SpinBox_DY->GetValue() != 0 || - SpinBox_DZ->GetValue() != 0); + SpinBox_DY->GetValue() != 0 || + SpinBox_DZ->GetValue() != 0); } //================================================================================= @@ -977,8 +977,8 @@ void SMESHGUI_RotationDlg::setFilters() { if(myMesh->_is_nil()) { SUIT_MessageBox::critical(this, - tr("SMESH_ERROR"), - tr("NO_MESH_SELECTED")); + tr("SMESH_ERROR"), + tr("NO_MESH_SELECTED")); return; } if ( !myFilterDlg ) diff --git a/src/SMESHGUI/SMESHGUI_Selection.cxx b/src/SMESHGUI/SMESHGUI_Selection.cxx index ba08f5570..8eb024b8d 100644 --- a/src/SMESHGUI/SMESHGUI_Selection.cxx +++ b/src/SMESHGUI/SMESHGUI_Selection.cxx @@ -360,7 +360,7 @@ QVariant SMESHGUI_Selection::isComputable( int ind ) const SMESH::SMESH_Mesh_var mesh = SMESH::GetMeshByIO(io); // m,sm,gr->m if ( !mesh->_is_nil() ) {*/ _PTR(SObject) so = SMESH::GetActiveStudyDocument()->FindObjectID( entry( ind ).toLatin1().data() ); - //FindSObject( mesh ); + //FindSObject( mesh ); if ( so ) { CORBA::Object_var obj = SMESH::SObjectToObject(so, SMESH::GetActiveStudyDocument()); if(!CORBA::is_nil(obj)){ @@ -428,7 +428,7 @@ QVariant SMESHGUI_Selection::isVisible( int ind ) const SMESH_Actor* actor = SMESH::FindActorByEntry( ent.toLatin1().data() ); if ( actor && actor->hasIO() ) { if(SVTK_ViewWindow* aViewWindow = SMESH::GetCurrentVtkView()) - return QVariant( aViewWindow->isVisible( actor->getIO() ) ); + return QVariant( aViewWindow->isVisible( actor->getIO() ) ); } } return QVariant( false ); diff --git a/src/SMESHGUI/SMESHGUI_SelectionOp.cxx b/src/SMESHGUI/SMESHGUI_SelectionOp.cxx index 1cb2fc213..30ca05205 100644 --- a/src/SMESHGUI/SMESHGUI_SelectionOp.cxx +++ b/src/SMESHGUI/SMESHGUI_SelectionOp.cxx @@ -423,9 +423,9 @@ void SMESHGUI_SelectionOp::selected( QStringList& names, SalomeApp_Study* _study = dynamic_cast( study() ); if( _study ) { - _PTR(SObject) obj = _study->studyDS()->FindObjectID( anIt.Value()->getEntry() ); - if( obj ) - names.append( obj->GetName().c_str() ); + _PTR(SObject) obj = _study->studyDS()->FindObjectID( anIt.Value()->getEntry() ); + if( obj ) + names.append( obj->GetName().c_str() ); } } } diff --git a/src/SMESHGUI/SMESHGUI_SelectionOp.h b/src/SMESHGUI/SMESHGUI_SelectionOp.h index 34e5e1135..083df7390 100644 --- a/src/SMESHGUI/SMESHGUI_SelectionOp.h +++ b/src/SMESHGUI/SMESHGUI_SelectionOp.h @@ -103,18 +103,18 @@ protected: //! Hilight object in VTK viewer void highlight( const Handle( SALOME_InteractiveObject )&, - const bool, const bool = true ); + const bool, const bool = true ); //! Select some nodes or elements in VTK void addOrRemoveIndex( const Handle( SALOME_InteractiveObject )&, - const TColStd_MapOfInteger&, const bool ); + const TColStd_MapOfInteger&, const bool isModeShift); SVTK_ViewWindow* viewWindow() const; SVTK_Selector* selector() const; //! Get names, types and ids of selected objects virtual void selected( QStringList&, - SMESHGUI_Dialog::TypesList&, QStringList& ) const; + SMESHGUI_Dialog::TypesList&, QStringList& ) const; //! Find type by id virtual int typeById( const QString&, const EntityType ) const; diff --git a/src/SMESHGUI/SMESHGUI_SewingDlg.cxx b/src/SMESHGUI/SMESHGUI_SewingDlg.cxx index b42b97e50..2a94befb8 100644 --- a/src/SMESHGUI/SMESHGUI_SewingDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_SewingDlg.cxx @@ -385,9 +385,9 @@ void SMESHGUI_SewingDlg::ConstructorsClicked (int constructorId) LineEdit5->setEnabled(false); if (!CheckBoxPolygons->isVisible()) - CheckBoxPolygons->show(); + CheckBoxPolygons->show(); if (!CheckBoxPolyedrs->isVisible()) - CheckBoxPolyedrs->show(); + CheckBoxPolyedrs->show(); myOk5 = true; @@ -412,7 +412,7 @@ void SMESHGUI_SewingDlg::ConstructorsClicked (int constructorId) SMESH::SetPointRepresentation(false); if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(CellSelection); + aViewWindow->SetSelectionMode(CellSelection); break; } } @@ -472,8 +472,8 @@ bool SMESHGUI_SewingDlg::ClickOnApply() LineEdit4->text().toLong(), LineEdit5->text().toLong(), LineEdit6->text().toLong(), - toCreatePolygons, - toCreatePolyedrs); + toCreatePolygons, + toCreatePolyedrs); else if (aConstructorId == 1) anError = aMeshEditor->SewConformFreeBorders(LineEdit1->text().toLong(), LineEdit2->text().toLong(), @@ -486,8 +486,8 @@ bool SMESHGUI_SewingDlg::ClickOnApply() LineEdit3->text().toLong(), LineEdit4->text().toLong(), LineEdit6->text().toLong(), - toCreatePolygons, - toCreatePolyedrs); + toCreatePolygons, + toCreatePolyedrs); else if (aConstructorId == 3) { QStringList aListElementsId1 = LineEdit1->text().split(" ", QString::SkipEmptyParts); QStringList aListElementsId2 = LineEdit4->text().split(" ", QString::SkipEmptyParts); @@ -580,10 +580,10 @@ void SMESHGUI_SewingDlg::ClickOnHelp() platform = "application"; #endif SUIT_MessageBox::warning(this, tr("WRN_WARNING"), - tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). - arg(app->resourceMgr()->stringValue("ExternalBrowser", - platform)). - arg(myHelpFileName)); + tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). + arg(app->resourceMgr()->stringValue("ExternalBrowser", + platform)). + arg(myHelpFileName)); } } @@ -632,15 +632,15 @@ void SMESHGUI_SewingDlg::onTextChange (const QString& theNewText) SMESH::SetPointRepresentation(true); if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(NodeSelection); + aViewWindow->SetSelectionMode(NodeSelection); const SMDS_MeshNode * n = aMesh->FindNode(theNewText.toInt()); if (n) { - newIndices.Add(n->GetID()); - mySelector->AddOrRemoveIndex(myActor->getIO(), newIndices, false); - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->highlight( myActor->getIO(), true, true ); - + newIndices.Add(n->GetID()); + mySelector->AddOrRemoveIndex(myActor->getIO(), newIndices, false); + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) + aViewWindow->highlight( myActor->getIO(), true, true ); + if (send == LineEdit1) myOk1 = true; else if (send == LineEdit2) @@ -658,7 +658,7 @@ void SMESHGUI_SewingDlg::onTextChange (const QString& theNewText) SMESH::SetPointRepresentation(false); if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(CellSelection); + aViewWindow->SetSelectionMode(CellSelection); QStringList aListId = theNewText.split(" ", QString::SkipEmptyParts); @@ -667,8 +667,8 @@ void SMESHGUI_SewingDlg::onTextChange (const QString& theNewText) for (int i = 0; i < aListId.count(); i++) { const SMDS_MeshElement * e = aMesh->FindElement(aListId[ i ].toInt()); if (e) - newIndices.Add(e->GetID()); - + newIndices.Add(e->GetID()); + if (!isEvenOneExists) isEvenOneExists = true; } @@ -676,7 +676,7 @@ void SMESHGUI_SewingDlg::onTextChange (const QString& theNewText) mySelector->AddOrRemoveIndex(myActor->getIO(), newIndices, false); if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->highlight( myActor->getIO(), true, true ); + aViewWindow->highlight( myActor->getIO(), true, true ); if (isEvenOneExists) { if (send == LineEdit1) diff --git a/src/SMESHGUI/SMESHGUI_ShapeByMeshDlg.cxx b/src/SMESHGUI/SMESHGUI_ShapeByMeshDlg.cxx index 82352334b..aeae0ef73 100644 --- a/src/SMESHGUI/SMESHGUI_ShapeByMeshDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_ShapeByMeshDlg.cxx @@ -129,7 +129,7 @@ QFrame* SMESHGUI_ShapeByMeshDlg::createMainFrame (QWidget* theParent) QLabel* anIdLabel = new QLabel( tr("ELEMENT_ID"), aMainGrp ); myElementId = new QLineEdit( aMainGrp ); myElementId->setValidator( new SMESHGUI_IdValidator( theParent, - !myIsMultipleAllowed ? 1 : 0 ) ); // 0 for any number of entities + !myIsMultipleAllowed ? 1 : 0 ) ); // 0 for any number of entities // shape name QLabel* aNameLabel = new QLabel( tr("GEOMETRY_NAME"), aMainGrp ); @@ -250,36 +250,36 @@ void SMESHGUI_ShapeByMeshOp::SetMesh (SMESH::SMESH_Mesh_ptr thePtr) int shapeDim = 0; // max dim with several shapes //if ( /*mySelectionMgr*/ selectionMgr()->isOk(anIObj) ) // check that the mesh has a valid shape { - _PTR(SObject) aSO = SMESH::FindSObject(myMesh.in()); - GEOM::GEOM_Object_var mainShape = SMESH::GetGeom(aSO); - if ( !mainShape->_is_nil() ) - { - TopoDS_Shape aShape; - if ( GEOMBase::GetShape(mainShape, aShape)) - { - TopAbs_ShapeEnum types[4] = { TopAbs_EDGE, TopAbs_FACE, TopAbs_SHELL, TopAbs_SOLID }; - for ( int dim = 4; dim > 0; --dim ) { - TopAbs_ShapeEnum type = types[ dim - 1 ]; - TopAbs_ShapeEnum avoid = ( type == TopAbs_SHELL ) ? TopAbs_SOLID : TopAbs_SHAPE; - TopExp_Explorer exp( aShape, type, avoid ); - for ( ; nbShapes[ type ] < 2 && exp.More(); exp.Next() ) - ++nbShapes[ type ]; - if ( nbShapes[ type ] > 1 ) { - shapeDim = dim; - break; - } - } - } - } + _PTR(SObject) aSO = SMESH::FindSObject(myMesh.in()); + GEOM::GEOM_Object_var mainShape = SMESH::GetGeom(aSO); + if ( !mainShape->_is_nil() ) + { + TopoDS_Shape aShape; + if ( GEOMBase::GetShape(mainShape, aShape)) + { + TopAbs_ShapeEnum types[4] = { TopAbs_EDGE, TopAbs_FACE, TopAbs_SHELL, TopAbs_SOLID }; + for ( int dim = 4; dim > 0; --dim ) { + TopAbs_ShapeEnum type = types[ dim - 1 ]; + TopAbs_ShapeEnum avoid = ( type == TopAbs_SHELL ) ? TopAbs_SOLID : TopAbs_SHAPE; + TopExp_Explorer exp( aShape, type, avoid ); + for ( ; nbShapes[ type ] < 2 && exp.More(); exp.Next() ) + ++nbShapes[ type ]; + if ( nbShapes[ type ] > 1 ) { + shapeDim = dim; + break; + } + } + } + } } if (shapeDim > 0) - { - if ( nbShapes[ TopAbs_SHELL ] + nbShapes[ TopAbs_SOLID ] > 1 ) - shapeDim = 3; - hasElement[ EDGE ] = shapeDim > 0 && myMesh->NbEdges(); - hasElement[ FACE ] = shapeDim > 1 && myMesh->NbFaces(); - hasElement[ VOLUME ] = shapeDim > 2 && myMesh->NbVolumes(); - } + { + if ( nbShapes[ TopAbs_SHELL ] + nbShapes[ TopAbs_SOLID ] > 1 ) + shapeDim = 3; + hasElement[ EDGE ] = shapeDim > 0 && myMesh->NbEdges(); + hasElement[ FACE ] = shapeDim > 1 && myMesh->NbFaces(); + hasElement[ VOLUME ] = shapeDim > 2 && myMesh->NbVolumes(); + } myHasSolids = nbShapes[ TopAbs_SOLID ]; } @@ -306,83 +306,83 @@ void SMESHGUI_ShapeByMeshOp::commitOperation() QStringList aListId = myDlg->myElementId->text().split( " ", QString::SkipEmptyParts); if (aListId.count() == 1) { - int elemID = (aListId.first()).toInt(); - myGeomObj = GEOM::GEOM_Object::_duplicate( - SMESHGUI::GetSMESHGen()->GetGeometryByMeshElement - ( myMesh.in(), elemID, myDlg->myGeomName->text().toLatin1().constData()) ); + int elemID = (aListId.first()).toInt(); + myGeomObj = GEOM::GEOM_Object::_duplicate( + SMESHGUI::GetSMESHGen()->GetGeometryByMeshElement + ( myMesh.in(), elemID, myDlg->myGeomName->text().toLatin1().constData()) ); } else { - GEOM::GEOM_Gen_var geomGen = SMESH::GetGEOMGen(); - _PTR(Study) aStudy = SMESH::GetActiveStudyDocument(); - - if (geomGen->_is_nil() || !aStudy) - return; - - GEOM::GEOM_IShapesOperations_var aShapesOp = - geomGen->GetIShapesOperations(aStudy->StudyId()); - if (aShapesOp->_is_nil() ) - return; - - TopAbs_ShapeEnum aGroupType = TopAbs_SHAPE; - - std::map aGeomObjectsMap; - GEOM::GEOM_Object_var aGeomObject; - - GEOM::GEOM_Object_var aMeshShape = myMesh->GetShapeToMesh(); - - for ( int i = 0; i < aListId.count(); i++ ) - { - aGeomObject = - SMESHGUI::GetSMESHGen()->FindGeometryByMeshElement(myMesh.in(), aListId[i].toInt()); - - if (aGeomObject->_is_nil()) continue; - - double anId = aShapesOp->GetSubShapeIndex(aMeshShape, aGeomObject); - if (aShapesOp->IsDone() && aGeomObjectsMap.find(anId) == aGeomObjectsMap.end()) - { - aGeomObjectsMap[anId] = aGeomObject; - - TopAbs_ShapeEnum aSubShapeType = (TopAbs_ShapeEnum)aGeomObject->GetShapeType(); - if (i == 0) - aGroupType = aSubShapeType; - else if (aSubShapeType != aGroupType) - aGroupType = TopAbs_SHAPE; - } - } - - int aNumberOfGO = aGeomObjectsMap.size(); - if (aNumberOfGO == 1) - myGeomObj = (*aGeomObjectsMap.begin()).second; - else if (aNumberOfGO > 1) - { - GEOM::GEOM_IGroupOperations_var aGroupOp = - geomGen->GetIGroupOperations(aStudy->StudyId()); - if(aGroupOp->_is_nil()) - return; - - GEOM::ListOfGO_var aGeomObjects = new GEOM::ListOfGO(); - aGeomObjects->length( aNumberOfGO ); - - int i = 0; - std::map::iterator anIter; - for (anIter = aGeomObjectsMap.begin(); anIter!=aGeomObjectsMap.end(); anIter++) - aGeomObjects[i++] = (*anIter).second; - - //create geometry group - myGeomObj = aGroupOp->CreateGroup(aMeshShape, aGroupType); - aGroupOp->UnionList(myGeomObj, aGeomObjects); - - if (!aGroupOp->IsDone()) - return; - } - - // publish the GEOM object in study - QString aNewGeomGroupName ( myDlg->myGeomName->text() ); - - SALOMEDS::SObject_var aNewGroupSO = - geomGen->AddInStudy(SMESHGUI::GetSMESHGen()->GetCurrentStudy(), myGeomObj, - aNewGeomGroupName.toLatin1().data(), aMeshShape); + GEOM::GEOM_Gen_var geomGen = SMESH::GetGEOMGen(); + _PTR(Study) aStudy = SMESH::GetActiveStudyDocument(); + + if (geomGen->_is_nil() || !aStudy) + return; + + GEOM::GEOM_IShapesOperations_var aShapesOp = + geomGen->GetIShapesOperations(aStudy->StudyId()); + if (aShapesOp->_is_nil() ) + return; + + TopAbs_ShapeEnum aGroupType = TopAbs_SHAPE; + + std::map aGeomObjectsMap; + GEOM::GEOM_Object_var aGeomObject; + + GEOM::GEOM_Object_var aMeshShape = myMesh->GetShapeToMesh(); + + for ( int i = 0; i < aListId.count(); i++ ) + { + aGeomObject = + SMESHGUI::GetSMESHGen()->FindGeometryByMeshElement(myMesh.in(), aListId[i].toInt()); + + if (aGeomObject->_is_nil()) continue; + + double anId = aShapesOp->GetSubShapeIndex(aMeshShape, aGeomObject); + if (aShapesOp->IsDone() && aGeomObjectsMap.find(anId) == aGeomObjectsMap.end()) + { + aGeomObjectsMap[anId] = aGeomObject; + + TopAbs_ShapeEnum aSubShapeType = (TopAbs_ShapeEnum)aGeomObject->GetShapeType(); + if (i == 0) + aGroupType = aSubShapeType; + else if (aSubShapeType != aGroupType) + aGroupType = TopAbs_SHAPE; + } + } + + int aNumberOfGO = aGeomObjectsMap.size(); + if (aNumberOfGO == 1) + myGeomObj = (*aGeomObjectsMap.begin()).second; + else if (aNumberOfGO > 1) + { + GEOM::GEOM_IGroupOperations_var aGroupOp = + geomGen->GetIGroupOperations(aStudy->StudyId()); + if(aGroupOp->_is_nil()) + return; + + GEOM::ListOfGO_var aGeomObjects = new GEOM::ListOfGO(); + aGeomObjects->length( aNumberOfGO ); + + int i = 0; + std::map::iterator anIter; + for (anIter = aGeomObjectsMap.begin(); anIter!=aGeomObjectsMap.end(); anIter++) + aGeomObjects[i++] = (*anIter).second; + + //create geometry group + myGeomObj = aGroupOp->CreateGroup(aMeshShape, aGroupType); + aGroupOp->UnionList(myGeomObj, aGeomObjects); + + if (!aGroupOp->IsDone()) + return; + } + + // publish the GEOM object in study + QString aNewGeomGroupName ( myDlg->myGeomName->text() ); + + SALOMEDS::SObject_var aNewGroupSO = + geomGen->AddInStudy(SMESHGUI::GetSMESHGen()->GetCurrentStudy(), myGeomObj, + aNewGeomGroupName.toLatin1().data(), aMeshShape); } } catch (const SALOME::SALOME_Exception& S_ex) { @@ -422,7 +422,7 @@ void SMESHGUI_ShapeByMeshOp::onSelectionDone() aList.First(), aString); if (nbElems > 0) { if (!myIsMultipleAllowed && nbElems != 1 ) - return; + return; setElementID( aString ); myDlg->setButtonEnabled( true, QtxDialog::OK ); } @@ -485,31 +485,31 @@ void SMESHGUI_ShapeByMeshOp::onElemIdChanged(const QString& theNewText) { if ( SMDS_Mesh* aMesh = actor->GetObject()->GetMesh() ) { - SMDSAbs_ElementType type = SMDSAbs_Edge; - switch ( myDlg->myElemTypeGroup->checkedId() ) { - case EDGE : type = SMDSAbs_Edge; break; - case FACE : type = SMDSAbs_Face; break; - case VOLUME: type = SMDSAbs_Volume; break; - default: return; - } - TColStd_MapOfInteger newIndices; - QStringList aListId = theNewText.split( " ", QString::SkipEmptyParts); - for ( int i = 0; i < aListId.count(); i++ ) { - if ( const SMDS_MeshElement * e = aMesh->FindElement( aListId[ i ].toInt() )) - if ( e->GetType() == type ) - newIndices.Add( e->GetID() ); - } - - if ( !newIndices.IsEmpty() ) - { - if (!myIsMultipleAllowed && newIndices.Extent() != 1) - return; - if ( SVTK_Selector* s = selector() ) { - s->AddOrRemoveIndex( actor->getIO(), newIndices, false ); - viewWindow()->highlight( actor->getIO(), true, true ); - myDlg->setButtonEnabled( true, QtxDialog::OK ); - } - } + SMDSAbs_ElementType type = SMDSAbs_Edge; + switch ( myDlg->myElemTypeGroup->checkedId() ) { + case EDGE : type = SMDSAbs_Edge; break; + case FACE : type = SMDSAbs_Face; break; + case VOLUME: type = SMDSAbs_Volume; break; + default: return; + } + TColStd_MapOfInteger newIndices; + QStringList aListId = theNewText.split( " ", QString::SkipEmptyParts); + for ( int i = 0; i < aListId.count(); i++ ) { + if ( const SMDS_MeshElement * e = aMesh->FindElement( aListId[ i ].toInt() )) + if ( e->GetType() == type ) + newIndices.Add( e->GetID() ); + } + + if ( !newIndices.IsEmpty() ) + { + if (!myIsMultipleAllowed && newIndices.Extent() != 1) + return; + if ( SVTK_Selector* s = selector() ) { + s->AddOrRemoveIndex( actor->getIO(), newIndices, false ); + viewWindow()->highlight( actor->getIO(), true, true ); + myDlg->setButtonEnabled( true, QtxDialog::OK ); + } + } } } } diff --git a/src/SMESHGUI/SMESHGUI_SingleEditDlg.cxx b/src/SMESHGUI/SMESHGUI_SingleEditDlg.cxx index 6a27b17a3..a99a2ae96 100755 --- a/src/SMESHGUI/SMESHGUI_SingleEditDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_SingleEditDlg.cxx @@ -278,10 +278,10 @@ void SMESHGUI_SingleEditDlg::onHelp() platform = "application"; #endif SUIT_MessageBox::warning(this, tr("WRN_WARNING"), - tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). - arg(app->resourceMgr()->stringValue("ExternalBrowser", - platform)). - arg(myHelpFileName)); + tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). + arg(app->resourceMgr()->stringValue("ExternalBrowser", + platform)). + arg(myHelpFileName)); } } @@ -348,13 +348,13 @@ void SMESHGUI_SingleEditDlg::onTextChange (const QString& theNewText) int id1, id2; if ( !getNodeIds(myEdge->text(), id1, id2) ) - return; + return; const SMDS_MeshNode* aNode1 = aMesh->FindNode( id1 ); const SMDS_MeshNode* aNode2 = aMesh->FindNode( id2 ); if ( !aNode1 || !aNode2 || aNode1 == aNode2 ) - return; + return; // find a triangle and an edge index const SMDS_MeshElement* tria1; @@ -362,23 +362,23 @@ void SMESHGUI_SingleEditDlg::onTextChange (const QString& theNewText) if ( findTriangles(aNode1,aNode2,tria1,tria2) ) { - newIndices.Add(tria1->GetID()); - - const SMDS_MeshNode* a3Nodes[3]; - SMDS_ElemIteratorPtr it; - int edgeInd = 2, i; - for (i = 0, it = tria1->nodesIterator(); it->more(); i++) { - a3Nodes[ i ] = static_cast(it->next()); - if (i > 0 && ( a3Nodes[ i ] == aNode1 && a3Nodes[ i - 1] == aNode2 || - a3Nodes[ i ] == aNode2 && a3Nodes[ i - 1] == aNode1 ) ) { - edgeInd = i - 1; - break; - } - } - newIndices.Add(-edgeInd-1); - - myOkBtn->setEnabled(true); - myApplyBtn->setEnabled(true); + newIndices.Add(tria1->GetID()); + + const SMDS_MeshNode* a3Nodes[3]; + SMDS_ElemIteratorPtr it; + int edgeInd = 2, i; + for (i = 0, it = tria1->nodesIterator(); it->more(); i++) { + a3Nodes[ i ] = static_cast(it->next()); + if (i > 0 && ( a3Nodes[ i ] == aNode1 && a3Nodes[ i - 1] == aNode2 || + a3Nodes[ i ] == aNode2 && a3Nodes[ i - 1] == aNode1 ) ) { + edgeInd = i - 1; + break; + } + } + newIndices.Add(-edgeInd-1); + + myOkBtn->setEnabled(true); + myApplyBtn->setEnabled(true); } mySelector->AddOrRemoveIndex(anIO,newIndices, false); SMESH::GetViewWindow(mySMESHGUI)->highlight( anIO, true, true ); @@ -416,17 +416,17 @@ void SMESHGUI_SingleEditDlg::onSelectionDone() { const SMDS_MeshElement* tria[2]; if( SMESH::GetEdgeNodes( mySelector, aVisualObj, anId1, anId2 ) >= 1 && - findTriangles( aMesh->FindNode( anId1 ), aMesh->FindNode( anId2 ), tria[0],tria[1] ) ) + findTriangles( aMesh->FindNode( anId1 ), aMesh->FindNode( anId2 ), tria[0],tria[1] ) ) { - QString aText = QString("%1-%2").arg(anId1).arg(anId2); - myEdge->setText(aText); - - myOkBtn->setEnabled(true); - myApplyBtn->setEnabled(true); + QString aText = QString("%1-%2").arg(anId1).arg(anId2); + myEdge->setText(aText); + + myOkBtn->setEnabled(true); + myApplyBtn->setEnabled(true); } else { - myEdge->clear(); + myEdge->clear(); } } } @@ -494,8 +494,8 @@ bool SMESHGUI_SingleEditDlg::onApply() if (aMesh->_is_nil()) { SUIT_MessageBox::information(SMESH::GetDesktop(mySMESHGUI), - tr("SMESH_ERROR"), - tr("SMESHG_NO_MESH")); + tr("SMESH_ERROR"), + tr("SMESHG_NO_MESH")); return false; } diff --git a/src/SMESHGUI/SMESHGUI_SmoothingDlg.cxx b/src/SMESHGUI/SMESHGUI_SmoothingDlg.cxx index 9112c56d0..1cab8d3f4 100644 --- a/src/SMESHGUI/SMESHGUI_SmoothingDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_SmoothingDlg.cxx @@ -365,22 +365,22 @@ bool SMESHGUI_SmoothingDlg::ClickOnApply() if ( CheckBoxParametric->isChecked() ) { if(CheckBoxMesh->isChecked()) - aResult = aMeshEditor->SmoothParametricObject(mySelectedObject, aNodesId.inout(), - anIterationLimit, aMaxAspectRatio, aMethod); - else - aResult = aMeshEditor->SmoothParametric(anElementsId.inout(), aNodesId.inout(), - anIterationLimit, aMaxAspectRatio, aMethod); + aResult = aMeshEditor->SmoothParametricObject(mySelectedObject, aNodesId.inout(), + anIterationLimit, aMaxAspectRatio, aMethod); + else + aResult = aMeshEditor->SmoothParametric(anElementsId.inout(), aNodesId.inout(), + anIterationLimit, aMaxAspectRatio, aMethod); } else { if(CheckBoxMesh->isChecked()) - aResult = aMeshEditor->SmoothObject(mySelectedObject, aNodesId.inout(), - anIterationLimit, aMaxAspectRatio, aMethod); - else - aResult = aMeshEditor->Smooth(anElementsId.inout(), aNodesId.inout(), - anIterationLimit, aMaxAspectRatio, aMethod); + aResult = aMeshEditor->SmoothObject(mySelectedObject, aNodesId.inout(), + anIterationLimit, aMaxAspectRatio, aMethod); + else + aResult = aMeshEditor->Smooth(anElementsId.inout(), aNodesId.inout(), + anIterationLimit, aMaxAspectRatio, aMethod); } - myMesh->SetParameters( SMESHGUI::JoinObjectParameters(aParameters) ); + myMesh->SetParameters( aParameters.join(":").toLatin1().constData() ); } catch (...) { } @@ -448,10 +448,10 @@ void SMESHGUI_SmoothingDlg::ClickOnHelp() platform = "application"; #endif SUIT_MessageBox::warning(this, tr("WRN_WARNING"), - tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). - arg(app->resourceMgr()->stringValue("ExternalBrowser", - platform)). - arg(myHelpFileName)); + tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). + arg(app->resourceMgr()->stringValue("ExternalBrowser", + platform)). + arg(myHelpFileName)); } } @@ -490,28 +490,28 @@ void SMESHGUI_SmoothingDlg::onTextChange (const QString& theNewText) const Handle(SALOME_InteractiveObject)& anIO = myActor->getIO(); TColStd_MapOfInteger newIndices; for (int i = 0; i < aListId.count(); i++) { - const SMDS_MeshElement * e = aMesh->FindElement(aListId[ i ].toInt()); - if (e) - newIndices.Add(e->GetID()); - myNbOkElements++; + const SMDS_MeshElement * e = aMesh->FindElement(aListId[ i ].toInt()); + if (e) + newIndices.Add(e->GetID()); + myNbOkElements++; } mySelector->AddOrRemoveIndex(anIO, newIndices, false); if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->highlight( anIO, true, true ); + aViewWindow->highlight( anIO, true, true ); myElementsId = theNewText; } else if (send == LineEditNodes) { TColStd_MapOfInteger newIndices; for (int i = 0; i < aListId.count(); i++) { - const SMDS_MeshNode * n = aMesh->FindNode(aListId[ i ].toInt()); - if (n) - newIndices.Add(n->GetID()); - myNbOkNodes++; + const SMDS_MeshNode * n = aMesh->FindNode(aListId[ i ].toInt()); + if (n) + newIndices.Add(n->GetID()); + myNbOkNodes++; } mySelector->AddOrRemoveIndex(myActor->getIO(), newIndices, false); if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->highlight( myActor->getIO(), true, true ); + aViewWindow->highlight( myActor->getIO(), true, true ); } } @@ -629,21 +629,21 @@ void SMESHGUI_SmoothingDlg::SetEditCurrentArgument() myEditCurrentArgument = LineEditElements; SMESH::SetPointRepresentation(false); if (CheckBoxMesh->isChecked()) { - // mySelectionMgr->setSelectionModes(ActorSelection); - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(ActorSelection); - mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter); + // mySelectionMgr->setSelectionModes(ActorSelection); + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) + aViewWindow->SetSelectionMode(ActorSelection); + mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter); } else { - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(FaceSelection); - } + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) + aViewWindow->SetSelectionMode(FaceSelection); + } } else if (send == SelectNodesButton) { - LineEditNodes->clear(); + LineEditNodes->clear(); myEditCurrentArgument = LineEditNodes; SMESH::SetPointRepresentation(true); - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) { - aViewWindow->SetSelectionMode(NodeSelection); - } + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) { + aViewWindow->SetSelectionMode(NodeSelection); + } } myEditCurrentArgument->setFocus(); @@ -782,8 +782,8 @@ void SMESHGUI_SmoothingDlg::setFilters( const bool theIsElem ) { if(myMesh->_is_nil()) { SUIT_MessageBox::critical(this, - tr("SMESH_ERROR"), - tr("NO_MESH_SELECTED")); + tr("SMESH_ERROR"), + tr("NO_MESH_SELECTED")); return; } if ( !myFilterDlg ) diff --git a/src/SMESHGUI/SMESHGUI_SpinBox.cxx b/src/SMESHGUI/SMESHGUI_SpinBox.cxx index 1b30cb08a..c617f5ec7 100644 --- a/src/SMESHGUI/SMESHGUI_SpinBox.cxx +++ b/src/SMESHGUI/SMESHGUI_SpinBox.cxx @@ -107,9 +107,9 @@ QDoubleValidator* SMESHGUI_SpinBox::validator() const // purpose : //================================================================================= void SMESHGUI_SpinBox::RangeStepAndValidator( double min, - double max, - double step, - unsigned short precision ) + double max, + double step, + unsigned short precision ) { setPrecision(precision*(-1)); // PAL8769. Minus is for using 'g' double->string conversion specifier, // see QtxDoubleSpinBox::mapValueToText( double v ) diff --git a/src/SMESHGUI/SMESHGUI_SpinBox.h b/src/SMESHGUI/SMESHGUI_SpinBox.h index cdca31653..aa757ee63 100644 --- a/src/SMESHGUI/SMESHGUI_SpinBox.h +++ b/src/SMESHGUI/SMESHGUI_SpinBox.h @@ -52,9 +52,9 @@ public: ~SMESHGUI_SpinBox(); void RangeStepAndValidator( double = -1000000.0, - double = +1000000.0, - double = 100.0, - unsigned short = 3 ); + double = +1000000.0, + double = 100.0, + unsigned short = 3 ); void SetValue( double ); double GetValue() const; QString GetString() const; diff --git a/src/SMESHGUI/SMESHGUI_StandardMeshInfosDlg.cxx b/src/SMESHGUI/SMESHGUI_StandardMeshInfosDlg.cxx index 4b7540fc0..d62b3a702 100644 --- a/src/SMESHGUI/SMESHGUI_StandardMeshInfosDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_StandardMeshInfosDlg.cxx @@ -203,20 +203,20 @@ void SMESHGUI_StandardMeshInfosDlg::DumpMeshInfos() int aDimension = 0; double aNbDimElements = 0; if (aNbVolumes > 0) { - aNbDimElements = aNbVolumes; - aDimension = 3; + aNbDimElements = aNbVolumes; + aDimension = 3; } else if(aNbFaces > 0) { - aNbDimElements = aNbFaces; - aDimension = 2; + aNbDimElements = aNbFaces; + aDimension = 2; } else if(aNbEdges > 0) { - aNbDimElements = aNbEdges; - aDimension = 1; + aNbDimElements = aNbEdges; + aDimension = 1; } else if(aNbNodes > 0) { - aNbDimElements = aNbNodes; - aDimension = 0; + aNbDimElements = aNbNodes; + aDimension = 0; } // information about the mesh @@ -234,15 +234,15 @@ void SMESHGUI_StandardMeshInfosDlg::DumpMeshInfos() aMeshSO->FindSubObject(SMESH::Tag_NodeGroups, anObj); if (anObj) { _PTR(ChildIterator) it = aStudy->NewChildIterator(anObj); - if (it->More()) { + if (it->More()) { anInfo.append(QString("Groups:

      ")); hasGroup = true; } - for ( ; it->More(); it->Next()) { + for ( ; it->More(); it->Next()) { _PTR(SObject) subObj = it->Value(); CORBA::Object_var anObject = SMESH::SObjectToObject(subObj); - SMESH::SMESH_GroupBase_var aGroup = SMESH::SMESH_GroupBase::_narrow(anObject); - if (!aGroup->_is_nil()) { + SMESH::SMESH_GroupBase_var aGroup = SMESH::SMESH_GroupBase::_narrow(anObject); + if (!aGroup->_is_nil()) { anInfo.append(QString("- %1
      ").arg(aGroup->GetName())); anInfo.append(QString("%1
      ").arg("on nodes")); anInfo.append(QString("%1
      ").arg(aGroup->Size())); @@ -259,7 +259,7 @@ void SMESHGUI_StandardMeshInfosDlg::DumpMeshInfos() anInfo.append(QString("
      ")); } } - } + } } // info about groups on edges @@ -271,11 +271,11 @@ void SMESHGUI_StandardMeshInfosDlg::DumpMeshInfos() anInfo.append(QString("Groups:

      ")); hasGroup = true; } - for ( ; it->More(); it->Next()) { + for ( ; it->More(); it->Next()) { _PTR(SObject) subObj = it->Value(); CORBA::Object_var anObject = SMESH::SObjectToObject(subObj); - SMESH::SMESH_GroupBase_var aGroup = SMESH::SMESH_GroupBase::_narrow(anObject); - if (!aGroup->_is_nil()) { + SMESH::SMESH_GroupBase_var aGroup = SMESH::SMESH_GroupBase::_narrow(anObject); + if (!aGroup->_is_nil()) { anInfo.append(QString("- %1
      ").arg(aGroup->GetName())); anInfo.append(QString("%1
      ").arg("on edges")); anInfo.append(QString("%1
      ").arg(aGroup->Size())); @@ -292,7 +292,7 @@ void SMESHGUI_StandardMeshInfosDlg::DumpMeshInfos() anInfo.append(QString("
      ")); } } - } + } } // info about groups on faces @@ -300,15 +300,15 @@ void SMESHGUI_StandardMeshInfosDlg::DumpMeshInfos() aMeshSO->FindSubObject(SMESH::Tag_FaceGroups, anObj); if (anObj) { _PTR(ChildIterator) it = aStudy->NewChildIterator(anObj); - if (!hasGroup && it->More()) { + if (!hasGroup && it->More()) { anInfo.append(QString("Groups:

      ")); hasGroup = true; } - for ( ; it->More(); it->Next()) { + for ( ; it->More(); it->Next()) { _PTR(SObject) subObj = it->Value(); CORBA::Object_var anObject = SMESH::SObjectToObject(subObj); - SMESH::SMESH_GroupBase_var aGroup = SMESH::SMESH_GroupBase::_narrow(anObject); - if (!aGroup->_is_nil()) { + SMESH::SMESH_GroupBase_var aGroup = SMESH::SMESH_GroupBase::_narrow(anObject); + if (!aGroup->_is_nil()) { anInfo.append(QString("- %1
      ").arg(aGroup->GetName())); anInfo.append(QString("%1
      ").arg("on faces")); anInfo.append(QString("%1
      ").arg(aGroup->Size())); @@ -325,7 +325,7 @@ void SMESHGUI_StandardMeshInfosDlg::DumpMeshInfos() anInfo.append(QString("
      ")); } } - } + } } // info about groups on volumes @@ -333,13 +333,13 @@ void SMESHGUI_StandardMeshInfosDlg::DumpMeshInfos() aMeshSO->FindSubObject(SMESH::Tag_VolumeGroups, anObj); if (anObj) { _PTR(ChildIterator) it = aStudy->NewChildIterator(anObj); - if (!hasGroup && it->More()) + if (!hasGroup && it->More()) anInfo.append(QString("Groups:
      ")); - for ( ; it->More(); it->Next()) { + for ( ; it->More(); it->Next()) { _PTR(SObject) subObj = it->Value(); CORBA::Object_var anObject = SMESH::SObjectToObject(subObj); - SMESH::SMESH_GroupBase_var aGroup = SMESH::SMESH_GroupBase::_narrow(anObject); - if (!aGroup->_is_nil()) { + SMESH::SMESH_GroupBase_var aGroup = SMESH::SMESH_GroupBase::_narrow(anObject); + if (!aGroup->_is_nil()) { anInfo.append(QString("- %1
      ").arg(aGroup->GetName())); anInfo.append(QString("%1
      ").arg("on volumes")); anInfo.append(QString("%1
      ").arg(aGroup->Size())); @@ -356,7 +356,7 @@ void SMESHGUI_StandardMeshInfosDlg::DumpMeshInfos() anInfo.append(QString("
      ")); } } - } + } } myInfo->setText(anInfo); @@ -448,10 +448,10 @@ void SMESHGUI_StandardMeshInfosDlg::onHelp() platform = "application"; #endif SUIT_MessageBox::warning(this, tr("WRN_WARNING"), - tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). - arg(app->resourceMgr()->stringValue("ExternalBrowser", - platform)). - arg(myHelpFileName)); + tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). + arg(app->resourceMgr()->stringValue("ExternalBrowser", + platform)). + arg(myHelpFileName)); } } diff --git a/src/SMESHGUI/SMESHGUI_SymmetryDlg.cxx b/src/SMESHGUI/SMESHGUI_SymmetryDlg.cxx index a7c0cbaae..5da44a6ae 100644 --- a/src/SMESHGUI/SMESHGUI_SymmetryDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_SymmetryDlg.cxx @@ -416,8 +416,8 @@ void SMESHGUI_SymmetryDlg::ConstructorsClicked (int constructorId) SMESH::SetPointRepresentation(false); if (!CheckBoxMesh->isChecked()) { - if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(CellSelection); + if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) + aViewWindow->SetSelectionMode(CellSelection); } } @@ -499,8 +499,8 @@ bool SMESHGUI_SymmetryDlg::ClickOnApply() else aMeshEditor->Mirror(anElementsId, aMirror, aMirrorType, false ); - if( !myMesh->_is_nil()) - myMesh->SetParameters(SMESHGUI::JoinObjectParameters(aParameters)); + if( !myMesh->_is_nil()) + myMesh->SetParameters( aParameters.join(":").toLatin1().constData() ); break; } case COPY_ELEMS_BUTTON: { @@ -517,8 +517,8 @@ bool SMESHGUI_SymmetryDlg::ClickOnApply() else aMeshEditor->Mirror(anElementsId, aMirror, aMirrorType, true); } - if( !myMesh->_is_nil()) - myMesh->SetParameters(SMESHGUI::JoinObjectParameters(aParameters)); + if( !myMesh->_is_nil()) + myMesh->SetParameters( aParameters.join(":").toLatin1().constData() ); break; } case MAKE_MESH_BUTTON: { @@ -529,8 +529,8 @@ bool SMESHGUI_SymmetryDlg::ClickOnApply() else mesh = aMeshEditor->MirrorMakeMesh(anElementsId, aMirror, aMirrorType, makeGroups, LineEditNewMesh->text().toLatin1().data()); - if( !mesh->_is_nil()) - mesh->SetParameters(SMESHGUI::JoinObjectParameters(aParameters)); + if( !mesh->_is_nil()) + mesh->SetParameters( aParameters.join(":").toLatin1().constData() ); break; } } @@ -595,10 +595,10 @@ void SMESHGUI_SymmetryDlg::ClickOnHelp() platform = "application"; #endif SUIT_MessageBox::warning(this, tr("WRN_WARNING"), - tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). - arg(app->resourceMgr()->stringValue("ExternalBrowser", - platform)). - arg(myHelpFileName)); + tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). + arg(app->resourceMgr()->stringValue("ExternalBrowser", + platform)). + arg(myHelpFileName)); } } @@ -633,15 +633,15 @@ void SMESHGUI_SymmetryDlg::onTextChange (const QString& theNewText) if (send == LineEditElements) { for (int i = 0; i < aListId.count(); i++) { - const SMDS_MeshElement * e = aMesh->FindElement(aListId[ i ].toInt()); - if (e) - newIndices.Add(e->GetID()); - myNbOkElements++; + const SMDS_MeshElement * e = aMesh->FindElement(aListId[ i ].toInt()); + if (e) + newIndices.Add(e->GetID()); + myNbOkElements++; } mySelector->AddOrRemoveIndex( anIO, newIndices, false ); if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->highlight( anIO, true, true ); + aViewWindow->highlight( anIO, true, true ); myElementsId = theNewText; } @@ -832,11 +832,11 @@ void SMESHGUI_SymmetryDlg::SetEditCurrentArgument() SMESH::SetPointRepresentation(false); if (CheckBoxMesh->isChecked()) { if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(ActorSelection); + aViewWindow->SetSelectionMode(ActorSelection); mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter); } else { if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode(CellSelection); + aViewWindow->SetSelectionMode(CellSelection); } } else if (send == SelectPointButton) { myEditCurrentArgument = (QWidget*)SpinBox_X; @@ -1076,8 +1076,8 @@ void SMESHGUI_SymmetryDlg::setFilters() { if(myMesh->_is_nil()) { SUIT_MessageBox::critical(this, - tr("SMESH_ERROR"), - tr("NO_MESH_SELECTED")); + tr("SMESH_ERROR"), + tr("NO_MESH_SELECTED")); return; } if ( !myFilterDlg ) diff --git a/src/SMESHGUI/SMESHGUI_TranslationDlg.cxx b/src/SMESHGUI/SMESHGUI_TranslationDlg.cxx index 757c34b8f..97d5ca582 100644 --- a/src/SMESHGUI/SMESHGUI_TranslationDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_TranslationDlg.cxx @@ -417,7 +417,7 @@ void SMESHGUI_TranslationDlg::ConstructorsClicked (int constructorId) SMESH::SetPointRepresentation(false); if (!CheckBoxMesh->isChecked()) if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode( CellSelection ); + aViewWindow->SetSelectionMode( CellSelection ); } myEditCurrentArgument = (QWidget*)LineEditElements; @@ -487,8 +487,8 @@ bool SMESHGUI_TranslationDlg::ClickOnApply() aMeshEditor->TranslateObject(mySelectedObject, aVector, false); else aMeshEditor->Translate(anElementsId, aVector, false); - if( !myMesh->_is_nil()) - myMesh->SetParameters(SMESHGUI::JoinObjectParameters(aParameters)); + if( !myMesh->_is_nil()) + myMesh->SetParameters( aParameters.join(":").toLatin1().constData() ); break; case COPY_ELEMS_BUTTON: if ( makeGroups ) { @@ -504,8 +504,8 @@ bool SMESHGUI_TranslationDlg::ClickOnApply() else aMeshEditor->Translate(anElementsId, aVector, true); } - if( !myMesh->_is_nil()) - myMesh->SetParameters(SMESHGUI::JoinObjectParameters(aParameters)); + if( !myMesh->_is_nil()) + myMesh->SetParameters( aParameters.join(":").toLatin1().constData() ); break; case MAKE_MESH_BUTTON: SMESH::SMESH_Mesh_var mesh; @@ -515,8 +515,8 @@ bool SMESHGUI_TranslationDlg::ClickOnApply() else mesh = aMeshEditor->TranslateMakeMesh(anElementsId, aVector, makeGroups, LineEditNewMesh->text().toLatin1().data()); - if( !mesh->_is_nil()) - mesh->SetParameters(SMESHGUI::JoinObjectParameters(aParameters)); + if( !mesh->_is_nil()) + mesh->SetParameters( aParameters.join(":").toLatin1().constData() ); } } catch (...) { } @@ -580,10 +580,10 @@ void SMESHGUI_TranslationDlg::ClickOnHelp() platform = "application"; #endif SUIT_MessageBox::warning(this, tr("WRN_WARNING"), - tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). - arg(app->resourceMgr()->stringValue("ExternalBrowser", - platform)). - arg(myHelpFileName)); + tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). + arg(app->resourceMgr()->stringValue("ExternalBrowser", + platform)). + arg(myHelpFileName)); } } @@ -618,10 +618,10 @@ void SMESHGUI_TranslationDlg::onTextChange (const QString& theNewText) if (send == LineEditElements) { for (int i = 0; i < aListId.count(); i++) { - const SMDS_MeshElement * e = aMesh->FindElement(aListId[ i ].toInt()); - if (e) - newIndices.Add(e->GetID()); - myNbOkElements++; + const SMDS_MeshElement * e = aMesh->FindElement(aListId[ i ].toInt()); + if (e) + newIndices.Add(e->GetID()); + myNbOkElements++; } } @@ -809,12 +809,12 @@ void SMESHGUI_TranslationDlg::SetEditCurrentArgument() SMESH::SetPointRepresentation(false); if (CheckBoxMesh->isChecked()) { if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode( ActorSelection ); + aViewWindow->SetSelectionMode( ActorSelection ); mySelectionMgr->installFilter(myMeshOrSubMeshOrGroupFilter); } else { if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode( CellSelection ); + aViewWindow->SetSelectionMode( CellSelection ); } } else if (send == SelectButton1) { myEditCurrentArgument = (QWidget*)SpinBox1_1; @@ -1024,8 +1024,8 @@ void SMESHGUI_TranslationDlg::setFilters() { if(myMesh->_is_nil()) { SUIT_MessageBox::critical(this, - tr("SMESH_ERROR"), - tr("NO_MESH_SELECTED")); + tr("SMESH_ERROR"), + tr("NO_MESH_SELECTED")); return; } if ( !myFilterDlg ) diff --git a/src/SMESHGUI/SMESHGUI_TransparencyDlg.cxx b/src/SMESHGUI/SMESHGUI_TransparencyDlg.cxx index b979ddffc..28f5af456 100644 --- a/src/SMESHGUI/SMESHGUI_TransparencyDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_TransparencyDlg.cxx @@ -172,7 +172,7 @@ void SMESHGUI_TransparencyDlg::ClickOnHelp() LightApp_Application* app = (LightApp_Application*)( SUIT_Session::session()->activeApplication() ); if ( app ) app->onHelpContextModule( mySMESHGUI ? app->moduleName( mySMESHGUI->moduleName() ) : - QString( "" ), myHelpFileName ); + QString( "" ), myHelpFileName ); else { QString platform; #ifdef WIN32 @@ -181,10 +181,10 @@ void SMESHGUI_TransparencyDlg::ClickOnHelp() platform = "application"; #endif SUIT_MessageBox::warning( this, tr( "WRN_WARNING" ), - tr( "EXTERNAL_BROWSER_CANNOT_SHOW_PAGE" ). - arg( app->resourceMgr()->stringValue( "ExternalBrowser", - platform ) ). - arg( myHelpFileName ) ); + tr( "EXTERNAL_BROWSER_CANNOT_SHOW_PAGE" ). + arg( app->resourceMgr()->stringValue( "ExternalBrowser", + platform ) ). + arg( myHelpFileName ) ); } } @@ -207,7 +207,7 @@ void SMESHGUI_TransparencyDlg::SetTransparency() Handle(SALOME_InteractiveObject) IOS = It.Value(); SMESH_Actor* anActor = SMESH::FindActorByEntry( IOS->getEntry() ); if ( anActor ) - anActor->SetOpacity( opacity ); + anActor->SetOpacity( opacity ); } myViewWindow->Repaint(); } @@ -238,31 +238,31 @@ void SMESHGUI_TransparencyDlg::onSelectionChanged() if ( aList.Extent() == 1 ) { Handle(SALOME_InteractiveObject) FirstIOS = aList.First(); if ( !FirstIOS.IsNull() ) { - SMESH_Actor* anActor = SMESH::FindActorByEntry( FirstIOS->getEntry() ); - if ( anActor ) - opacity = int( anActor->GetOpacity() * 100. + 0.5 ); + SMESH_Actor* anActor = SMESH::FindActorByEntry( FirstIOS->getEntry() ); + if ( anActor ) + opacity = int( anActor->GetOpacity() * 100. + 0.5 ); } } else if ( aList.Extent() > 1 ) { SALOME_ListIteratorOfListIO It( aList ); int setOp = -1; for ( ; It.More(); It.Next() ) { - Handle(SALOME_InteractiveObject) IO = It.Value(); - if ( !IO.IsNull() ) { - SMESH_Actor* anActor = SMESH::FindActorByEntry( IO->getEntry() ); - if ( anActor ) { - int op = int( anActor->GetOpacity() * 100. + 0.5 ); - if ( setOp < 0 ) - setOp = op; - else if ( setOp != op ) { - setOp = 100; - break; - } - } - } + Handle(SALOME_InteractiveObject) IO = It.Value(); + if ( !IO.IsNull() ) { + SMESH_Actor* anActor = SMESH::FindActorByEntry( IO->getEntry() ); + if ( anActor ) { + int op = int( anActor->GetOpacity() * 100. + 0.5 ); + if ( setOp < 0 ) + setOp = op; + else if ( setOp != op ) { + setOp = 100; + break; + } + } + } } if ( setOp >= 0 ) - opacity = setOp; + opacity = setOp; } else { } diff --git a/src/SMESHGUI/SMESHGUI_Utils.cxx b/src/SMESHGUI/SMESHGUI_Utils.cxx index 33eb25b96..7c6b279c4 100644 --- a/src/SMESHGUI/SMESHGUI_Utils.cxx +++ b/src/SMESHGUI/SMESHGUI_Utils.cxx @@ -80,11 +80,11 @@ namespace SMESH if(theOwner){ const Handle(SALOME_InteractiveObject)& anIO = theOwner->IO(); if(!anIO.IsNull()){ - if(anIO->hasEntry()){ - _PTR(Study) aStudy = GetActiveStudyDocument(); - _PTR(SObject) aSObj = aStudy->FindObjectID(anIO->getEntry()); - anObj = SObjectToObject(aSObj,aStudy); - } + if(anIO->hasEntry()){ + _PTR(Study) aStudy = GetActiveStudyDocument(); + _PTR(SObject) aSObj = aStudy->FindObjectID(anIO->getEntry()); + anObj = SObjectToObject(aSObj,aStudy); + } } } return anObj; @@ -124,9 +124,9 @@ namespace SMESH (SUIT_Session::session()->activeApplication()); if (app && !CORBA::is_nil(theObject)) { if(_PTR(Study) aStudy = GetActiveStudyDocument()){ - CORBA::String_var anIOR = app->orb()->object_to_string(theObject); - if (strcmp(anIOR.in(), "") != 0) - return aStudy->FindObjectIOR(anIOR.in()); + CORBA::String_var anIOR = app->orb()->object_to_string(theObject); + if (strcmp(anIOR.in(), "") != 0) + return aStudy->FindObjectIOR(anIOR.in()); } } return _PTR(SObject)(); @@ -187,9 +187,9 @@ namespace SMESH if (theSObject) { _PTR(GenericAttribute) anAttr; if (theSObject->FindAttribute(anAttr, "AttributeIOR")) { - _PTR(AttributeIOR) anIOR = anAttr; - CORBA::String_var aVal = anIOR->Value().c_str(); - return app->orb()->string_to_object(aVal); + _PTR(AttributeIOR) anIOR = anAttr; + CORBA::String_var aVal = anIOR->Value().c_str(); + return app->orb()->string_to_object(aVal); } } return CORBA::Object::_nil(); @@ -205,9 +205,9 @@ namespace SMESH { if (!theIO.IsNull()) { if (theIO->hasEntry()) { - _PTR(Study) aStudy = GetActiveStudyDocument(); - _PTR(SObject) anObj = aStudy->FindObjectID(theIO->getEntry()); - return SObjectToObject(anObj,aStudy); + _PTR(Study) aStudy = GetActiveStudyDocument(); + _PTR(SObject) anObj = aStudy->FindObjectID(theIO->getEntry()); + return SObjectToObject(anObj,aStudy); } } return CORBA::Object::_nil(); @@ -273,11 +273,11 @@ namespace SMESH for (int i = 1; anIter->More(); anIter->Next(), i++) { _PTR(SObject) aSObj = anIter->Value(); if (i >= 4) { - _PTR(ChildIterator) anIter1 = aStudy->NewChildIterator(aSObj); - for ( ; anIter1->More(); anIter1->Next()) { - _PTR(SObject) aSObj1 = anIter1->Value(); - anAttr = aBuilder->FindOrCreateAttribute(aSObj1, "AttributePixMap"); - aPixmap = anAttr; + _PTR(ChildIterator) anIter1 = aStudy->NewChildIterator(aSObj); + for ( ; anIter1->More(); anIter1->Next()) { + _PTR(SObject) aSObj1 = anIter1->Value(); + anAttr = aBuilder->FindOrCreateAttribute(aSObj1, "AttributePixMap"); + aPixmap = anAttr; if (theIsNotModif) { aPixmap->SetPixMap("ICON_SMESH_TREE_MESH"); } else if ( isEmptyMesh ) { @@ -285,7 +285,7 @@ namespace SMESH } else { aPixmap->SetPixMap("ICON_SMESH_TREE_MESH_PARTIAL"); } - } + } } } } @@ -300,10 +300,10 @@ namespace SMESH } else { SUIT_MessageBox::warning(0, QObject::tr("WRN_WARNING"), - QObject::tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). - arg(app->resourceMgr()->stringValue("ExternalBrowser", - "application")). - arg(theHelpFileName)); + QObject::tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). + arg(app->resourceMgr()->stringValue("ExternalBrowser", + "application")). + arg(theHelpFileName)); } } diff --git a/src/SMESHGUI/SMESHGUI_Utils.h b/src/SMESHGUI/SMESHGUI_Utils.h index 77f26e3e1..2604ca57f 100644 --- a/src/SMESHGUI/SMESHGUI_Utils.h +++ b/src/SMESHGUI/SMESHGUI_Utils.h @@ -88,7 +88,7 @@ SMESHGUI_EXPORT { CORBA::Object_var anObj = DataOwnerToObject(theDataOwner); if(!CORBA::is_nil(anObj)) - return TInterface::_narrow(anObj); + return TInterface::_narrow(anObj); return TInterface::_nil(); } @@ -114,7 +114,7 @@ SMESHGUI_EXPORT SMESHGUI_EXPORT CORBA::Object_var SObjectToObject( _PTR(SObject), - _PTR(Study) ); + _PTR(Study) ); SMESHGUI_EXPORT CORBA::Object_var SObjectToObject( _PTR(SObject) ); @@ -124,7 +124,7 @@ SMESHGUI_EXPORT { CORBA::Object_var anObj = SObjectToObject(theSObject); if(!CORBA::is_nil(anObj)) - return TInterface::_narrow(anObj); + return TInterface::_narrow(anObj); return TInterface::_nil(); } @@ -136,7 +136,7 @@ SMESHGUI_EXPORT { CORBA::Object_var anObj = IObjectToObject(theIO); if(!CORBA::is_nil(anObj)) - return TInterface::_narrow(anObj); + return TInterface::_narrow(anObj); return TInterface::_nil(); } @@ -148,7 +148,7 @@ SMESHGUI_EXPORT { CORBA::Object_var anObj = IORToObject( theIOR ); if ( !CORBA::is_nil( anObj ) ) - return TInterface::_narrow( anObj ); + return TInterface::_narrow( anObj ); return TInterface::_nil(); } diff --git a/src/SMESHGUI/SMESHGUI_VTKUtils.cxx b/src/SMESHGUI/SMESHGUI_VTKUtils.cxx index 3d2840b9b..7b5db1430 100644 --- a/src/SMESHGUI/SMESHGUI_VTKUtils.cxx +++ b/src/SMESHGUI/SMESHGUI_VTKUtils.cxx @@ -145,7 +145,7 @@ namespace SMESH for ( int iV = 0; iV < views.count(); ++iV ) { if(SVTK_ViewWindow* vtkWnd = GetVtkViewWindow(views[iV])) { vtkRenderer *aRenderer = vtkWnd->getRenderer(); - VTK::ActorCollectionCopy aCopy(aRenderer->GetActors()); + VTK::ActorCollectionCopy aCopy(aRenderer->GetActors()); vtkActorCollection *actors = aCopy.GetActors(); for (int i = 0; i < actors->GetNumberOfItems(); ++i ) { // size of actors changes inside the loop @@ -188,7 +188,7 @@ namespace SMESH for ( int iV = 0; iV < views.count(); ++iV ) { if(SVTK_ViewWindow* vtkWnd = GetVtkViewWindow(views[iV])) { vtkRenderer *aRenderer = vtkWnd->getRenderer(); - VTK::ActorCollectionCopy aCopy(aRenderer->GetActors()); + VTK::ActorCollectionCopy aCopy(aRenderer->GetActors()); vtkActorCollection *actors = aCopy.GetActors(); for (int i = 0; i < actors->GetNumberOfItems(); ++i ) { // size of actors changes inside the loop @@ -231,18 +231,18 @@ namespace SMESH // char* buf = new char[100*1024]; // delete [] buf; SUIT_MessageBox::warning(SMESHGUI::desktop(), QObject::tr("SMESH_WRN_WARNING"), - QObject::tr("SMESH_VISU_PROBLEM")); + QObject::tr("SMESH_VISU_PROBLEM")); } catch (...) { // no more memory at all: last resort MESSAGE_BEGIN ( "SMESHGUI_VTKUtils::OnVisuException(), exception even at showing a message!!!" << - std::endl << "Try to remove all visual data..." ); + std::endl << "Try to remove all visual data..." ); if (theVISU_MemoryReserve) { delete theVISU_MemoryReserve; theVISU_MemoryReserve = 0; } RemoveAllObjectsWithActors(); SUIT_MessageBox::warning(SMESHGUI::desktop(), QObject::tr("SMESH_WRN_WARNING"), - QObject::tr("SMESH_VISU_PROBLEM_CLEAR")); + QObject::tr("SMESH_VISU_PROBLEM_CLEAR")); MESSAGE_END ( "...done" ); } } @@ -261,59 +261,59 @@ namespace SMESH #endif TVisualObjCont::iterator anIter = VISUAL_OBJ_CONT.find(aKey); if(anIter != VISUAL_OBJ_CONT.end()){ - aVisualObj = anIter->second; + aVisualObj = anIter->second; }else{ SalomeApp_Application* app = dynamic_cast( SMESHGUI::activeStudy()->application() ); - _PTR(Study) aStudy = SMESHGUI::activeStudy()->studyDS(); - _PTR(SObject) aSObj = aStudy->FindObjectID(theEntry); - if(aSObj){ - _PTR(GenericAttribute) anAttr; - if(aSObj->FindAttribute(anAttr,"AttributeIOR")){ - _PTR(AttributeIOR) anIOR = anAttr; - CORBA::String_var aVal = anIOR->Value().c_str(); - CORBA::Object_var anObj = app->orb()->string_to_object( aVal.in() ); - if(!CORBA::is_nil(anObj)){ - //Try narrow to SMESH_Mesh interface - SMESH::SMESH_Mesh_var aMesh = SMESH::SMESH_Mesh::_narrow(anObj); - if(!aMesh->_is_nil()){ - aVisualObj.reset(new SMESH_MeshObj(aMesh)); - TVisualObjCont::value_type aValue(aKey,aVisualObj); - VISUAL_OBJ_CONT.insert(aValue); - } - //Try narrow to SMESH_Group interface - SMESH::SMESH_GroupBase_var aGroup = SMESH::SMESH_GroupBase::_narrow(anObj); - if(!aGroup->_is_nil()){ - _PTR(SObject) aFatherSObj = aSObj->GetFather(); - if(!aFatherSObj) return aVisualObj; - aFatherSObj = aFatherSObj->GetFather(); - if(!aFatherSObj) return aVisualObj; - CORBA::String_var anEntry = aFatherSObj->GetID().c_str(); - TVisualObjPtr aVisObj = GetVisualObj(theStudyId,anEntry.in()); - if(SMESH_MeshObj* aMeshObj = dynamic_cast(aVisObj.get())){ - aVisualObj.reset(new SMESH_GroupObj(aGroup,aMeshObj)); - TVisualObjCont::value_type aValue(aKey,aVisualObj); - VISUAL_OBJ_CONT.insert(aValue); - } - } - //Try narrow to SMESH_subMesh interface - SMESH::SMESH_subMesh_var aSubMesh = SMESH::SMESH_subMesh::_narrow(anObj); - if(!aSubMesh->_is_nil()){ - _PTR(SObject) aFatherSObj = aSObj->GetFather(); - if(!aFatherSObj) return aVisualObj; - aFatherSObj = aFatherSObj->GetFather(); - if(!aFatherSObj) return aVisualObj; - CORBA::String_var anEntry = aFatherSObj->GetID().c_str(); - TVisualObjPtr aVisObj = GetVisualObj(theStudyId,anEntry.in()); - if(SMESH_MeshObj* aMeshObj = dynamic_cast(aVisObj.get())){ - aVisualObj.reset(new SMESH_subMeshObj(aSubMesh,aMeshObj)); - TVisualObjCont::value_type aValue(aKey,aVisualObj); - VISUAL_OBJ_CONT.insert(aValue); - } - } - } - } - } + _PTR(Study) aStudy = SMESHGUI::activeStudy()->studyDS(); + _PTR(SObject) aSObj = aStudy->FindObjectID(theEntry); + if(aSObj){ + _PTR(GenericAttribute) anAttr; + if(aSObj->FindAttribute(anAttr,"AttributeIOR")){ + _PTR(AttributeIOR) anIOR = anAttr; + CORBA::String_var aVal = anIOR->Value().c_str(); + CORBA::Object_var anObj = app->orb()->string_to_object( aVal.in() ); + if(!CORBA::is_nil(anObj)){ + //Try narrow to SMESH_Mesh interface + SMESH::SMESH_Mesh_var aMesh = SMESH::SMESH_Mesh::_narrow(anObj); + if(!aMesh->_is_nil()){ + aVisualObj.reset(new SMESH_MeshObj(aMesh)); + TVisualObjCont::value_type aValue(aKey,aVisualObj); + VISUAL_OBJ_CONT.insert(aValue); + } + //Try narrow to SMESH_Group interface + SMESH::SMESH_GroupBase_var aGroup = SMESH::SMESH_GroupBase::_narrow(anObj); + if(!aGroup->_is_nil()){ + _PTR(SObject) aFatherSObj = aSObj->GetFather(); + if(!aFatherSObj) return aVisualObj; + aFatherSObj = aFatherSObj->GetFather(); + if(!aFatherSObj) return aVisualObj; + CORBA::String_var anEntry = aFatherSObj->GetID().c_str(); + TVisualObjPtr aVisObj = GetVisualObj(theStudyId,anEntry.in()); + if(SMESH_MeshObj* aMeshObj = dynamic_cast(aVisObj.get())){ + aVisualObj.reset(new SMESH_GroupObj(aGroup,aMeshObj)); + TVisualObjCont::value_type aValue(aKey,aVisualObj); + VISUAL_OBJ_CONT.insert(aValue); + } + } + //Try narrow to SMESH_subMesh interface + SMESH::SMESH_subMesh_var aSubMesh = SMESH::SMESH_subMesh::_narrow(anObj); + if(!aSubMesh->_is_nil()){ + _PTR(SObject) aFatherSObj = aSObj->GetFather(); + if(!aFatherSObj) return aVisualObj; + aFatherSObj = aFatherSObj->GetFather(); + if(!aFatherSObj) return aVisualObj; + CORBA::String_var anEntry = aFatherSObj->GetID().c_str(); + TVisualObjPtr aVisObj = GetVisualObj(theStudyId,anEntry.in()); + if(SMESH_MeshObj* aMeshObj = dynamic_cast(aVisObj.get())){ + aVisualObj.reset(new SMESH_subMeshObj(aSubMesh,aMeshObj)); + TVisualObjCont::value_type aValue(aKey,aVisualObj); + VISUAL_OBJ_CONT.insert(aValue); + } + } + } + } + } } }catch(...){ INFOS("GetMeshObj - There is no SMESH_Mesh object for the SALOMEDS::Strudy and Entry!!!"); @@ -354,7 +354,7 @@ namespace SMESH if ( usedMB * 10 > freeMB ) // even dont try to show SUIT_MessageBox::warning(SMESHGUI::desktop(), QObject::tr("SMESH_WRN_WARNING"), - QObject::tr("SMESH_NO_MESH_VISUALIZATION")); + QObject::tr("SMESH_NO_MESH_VISUALIZATION")); else // there is a chance to succeed continu = SUIT_MessageBox::warning @@ -362,7 +362,7 @@ namespace SMESH QObject::tr("SMESH_WRN_WARNING"), QObject::tr("SMESH_CONTINUE_MESH_VISUALIZATION"), SUIT_MessageBox::Yes | SUIT_MessageBox::No, - SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes; + SUIT_MessageBox::Yes ) == SUIT_MessageBox::Yes; if ( !continu ) { // remove the corresponding actors from all views RemoveVisualObjectWithActors( theEntry ); @@ -391,7 +391,7 @@ namespace SMESH if (anApp) { if (SVTK_ViewWindow* aView = dynamic_cast(anApp->desktop()->activeWindow())) - return aView; + return aView; SUIT_ViewManager* aViewManager = anApp->getViewManager(SVTK_Viewer::Type(), createIfNotFound); @@ -516,7 +516,7 @@ namespace SMESH SMESH_Actor* FindActorByEntry(SUIT_ViewWindow *theWindow, - const char* theEntry) + const char* theEntry) { if(SVTK_ViewWindow* aViewWindow = GetVtkViewWindow(theWindow)){ vtkRenderer *aRenderer = aViewWindow->getRenderer(); @@ -524,14 +524,14 @@ namespace SMESH vtkActorCollection *aCollection = aCopy.GetActors(); aCollection->InitTraversal(); while(vtkActor *anAct = aCollection->GetNextActor()){ - if(SMESH_Actor *anActor = dynamic_cast(anAct)){ - if(anActor->hasIO()){ - Handle(SALOME_InteractiveObject) anIO = anActor->getIO(); - if(anIO->hasEntry() && strcmp(anIO->getEntry(),theEntry) == 0){ - return anActor; - } - } - } + if(SMESH_Actor *anActor = dynamic_cast(anAct)){ + if(anActor->hasIO()){ + Handle(SALOME_InteractiveObject) anIO = anActor->getIO(); + if(anIO->hasEntry() && strcmp(anIO->getEntry(),theEntry) == 0){ + return anActor; + } + } + } } } return NULL; @@ -553,8 +553,8 @@ namespace SMESH CORBA::String_var anIOR = app->orb()->object_to_string( theObject ); _PTR(SObject) aSObject = aStudy->FindObjectIOR(anIOR.in()); if(aSObject){ - CORBA::String_var anEntry = aSObject->GetID().c_str(); - return FindActorByEntry(anEntry.in()); + CORBA::String_var anEntry = aSObject->GetID().c_str(); + return FindActorByEntry(anEntry.in()); } } return NULL; @@ -562,41 +562,41 @@ namespace SMESH SMESH_Actor* CreateActor(_PTR(Study) theStudy, - const char* theEntry, - int theIsClear) + const char* theEntry, + int theIsClear) { SMESH_Actor *anActor = NULL; CORBA::Long anId = theStudy->StudyId(); if(TVisualObjPtr aVisualObj = GetVisualObj(anId,theEntry)){ _PTR(SObject) aSObj = theStudy->FindObjectID(theEntry); if(aSObj){ - _PTR(GenericAttribute) anAttr; - if(aSObj->FindAttribute(anAttr,"AttributeName")){ - _PTR(AttributeName) aName = anAttr; - std::string aNameVal = aName->Value(); - anActor = SMESH_Actor::New(aVisualObj,theEntry,aNameVal.c_str(),theIsClear); - } - - SMESH::SMESH_GroupBase_var aGroup = SMESH::SMESH_GroupBase::_narrow( SMESH::SObjectToObject( aSObj )); - if(!CORBA::is_nil(aGroup)) - { - SALOMEDS::Color aColor = aGroup->GetColor(); - if( !( aColor.R > 0 || aColor.G > 0 || aColor.B > 0 ) ) - { - int r = 0, g = 0, b = 0; - SMESH::GetColor( "SMESH", "fill_color", r, g, b, QColor( 0, 170, 255 ) ); - aColor.R = (float)r / 255.0; - aColor.G = (float)g / 255.0; - aColor.B = (float)b / 255.0; - aGroup->SetColor( aColor ); - } - if( aGroup->GetType() == SMESH::NODE ) - anActor->SetNodeColor( aColor.R, aColor.G, aColor.B ); - else if( aGroup->GetType() == SMESH::EDGE ) - anActor->SetEdgeColor( aColor.R, aColor.G, aColor.B ); - else - anActor->SetSufaceColor( aColor.R, aColor.G, aColor.B ); - } + _PTR(GenericAttribute) anAttr; + if(aSObj->FindAttribute(anAttr,"AttributeName")){ + _PTR(AttributeName) aName = anAttr; + std::string aNameVal = aName->Value(); + anActor = SMESH_Actor::New(aVisualObj,theEntry,aNameVal.c_str(),theIsClear); + } + + SMESH::SMESH_GroupBase_var aGroup = SMESH::SMESH_GroupBase::_narrow( SMESH::SObjectToObject( aSObj )); + if(!CORBA::is_nil(aGroup)) + { + SALOMEDS::Color aColor = aGroup->GetColor(); + if( !( aColor.R > 0 || aColor.G > 0 || aColor.B > 0 ) ) + { + int r = 0, g = 0, b = 0; + SMESH::GetColor( "SMESH", "fill_color", r, g, b, QColor( 0, 170, 255 ) ); + aColor.R = (float)r / 255.0; + aColor.G = (float)g / 255.0; + aColor.B = (float)b / 255.0; + aGroup->SetColor( aColor ); + } + if( aGroup->GetType() == SMESH::NODE ) + anActor->SetNodeColor( aColor.R, aColor.G, aColor.B ); + else if( aGroup->GetType() == SMESH::EDGE ) + anActor->SetEdgeColor( aColor.R, aColor.G, aColor.B ); + else + anActor->SetSufaceColor( aColor.R, aColor.G, aColor.B ); + } } } return anActor; @@ -626,14 +626,14 @@ namespace SMESH if(SVTK_ViewWindow* vtkWnd = GetVtkViewWindow(theWnd)){ vtkWnd->RemoveActor(theActor); if(theActor->hasIO()){ - Handle(SALOME_InteractiveObject) anIO = theActor->getIO(); - if(anIO->hasEntry()){ - std::string anEntry = anIO->getEntry(); - SalomeApp_Study* aStudy = dynamic_cast( vtkWnd->getViewManager()->study() ); - int aStudyId = aStudy->id(); - TVisualObjCont::key_type aKey(aStudyId,anEntry); - VISUAL_OBJ_CONT.erase(aKey); - } + Handle(SALOME_InteractiveObject) anIO = theActor->getIO(); + if(anIO->hasEntry()){ + std::string anEntry = anIO->getEntry(); + SalomeApp_Study* aStudy = dynamic_cast( vtkWnd->getViewManager()->study() ); + int aStudyId = aStudy->id(); + TVisualObjCont::key_type aKey(aStudyId,anEntry); + VISUAL_OBJ_CONT.erase(aKey); + } } theActor->Delete(); vtkWnd->Repaint(); @@ -654,7 +654,7 @@ namespace SMESH vtkActorCollection *aCollection = aCopy.GetActors(); aCollection->InitTraversal(); while(vtkActor *anAct = aCollection->GetNextActor()) - if(dynamic_cast(anAct)) + if(dynamic_cast(anAct)) return false; } return true; @@ -676,43 +676,44 @@ namespace SMESH switch (theAction) { case eDisplayAll: { - while (vtkActor *anAct = aCollection->GetNextActor()) { - if (SMESH_Actor *anActor = dynamic_cast(anAct)) { - anActor->SetVisibility(true); - } - } - break; + while (vtkActor *anAct = aCollection->GetNextActor()) { + if (SMESH_Actor *anActor = dynamic_cast(anAct)) { + anActor->SetVisibility(true); + } + } + break; } case eDisplayOnly: case eEraseAll: { - while (vtkActor *anAct = aCollection->GetNextActor()) { - if (SMESH_Actor *anActor = dynamic_cast(anAct)) { - anActor->SetVisibility(false); - } - } + while (vtkActor *anAct = aCollection->GetNextActor()) { + if (SMESH_Actor *anActor = dynamic_cast(anAct)) { + anActor->SetVisibility(false); + } + } } default: { - if (SMESH_Actor *anActor = FindActorByEntry(theWnd,theEntry)) { - switch (theAction) { - case eDisplay: - case eDisplayOnly: - anActor->SetVisibility(true); - if (theAction == eDisplayOnly) aRenderer->ResetCameraClippingRange(); - break; - case eErase: - anActor->SetVisibility(false); - break; - } - } else { - switch (theAction) { - case eDisplay: - case eDisplayOnly: + if (SMESH_Actor *anActor = FindActorByEntry(theWnd,theEntry)) { + switch (theAction) { + case eDisplay: + case eDisplayOnly: + anActor->SetVisibility(true); + if (theAction == eDisplayOnly) aRenderer->ResetCameraClippingRange(); + break; + case eErase: + anActor->SetVisibility(false); + break; + } + } else { + switch (theAction) { + case eDisplay: + case eDisplayOnly: { SalomeApp_Study* aStudy = dynamic_cast(theWnd->getViewManager()->study()); _PTR(Study) aDocument = aStudy->studyDS(); // Pass non-visual objects (hypotheses, etc.), return true in this case CORBA::Long anId = aDocument->StudyId(); - if (TVisualObjPtr aVisualObj = GetVisualObj(anId,theEntry)) + TVisualObjPtr aVisualObj; + if ( (aVisualObj = GetVisualObj(anId,theEntry)) && aVisualObj->IsValid()) { if ((anActor = CreateActor(aDocument,theEntry,true))) { bool needFitAll = noSmeshActors(theWnd); // fit for the first object only @@ -725,8 +726,8 @@ namespace SMESH } break; } - } - } + } + } } } } @@ -747,24 +748,24 @@ namespace SMESH SALOME_ListIO selected; mgr->selectedObjects( selected ); if( selected.Extent() == 0){ - vtkRenderer* aRenderer = aWnd->getRenderer(); - VTK::ActorCollectionCopy aCopy(aRenderer->GetActors()); - vtkActorCollection *aCollection = aCopy.GetActors(); - aCollection->InitTraversal(); - while(vtkActor *anAct = aCollection->GetNextActor()){ - if(SMESH_Actor *anActor = dynamic_cast(anAct)){ - if(anActor->hasIO()) - if (!Update(anActor->getIO(),anActor->GetVisibility())) + vtkRenderer* aRenderer = aWnd->getRenderer(); + VTK::ActorCollectionCopy aCopy(aRenderer->GetActors()); + vtkActorCollection *aCollection = aCopy.GetActors(); + aCollection->InitTraversal(); + while(vtkActor *anAct = aCollection->GetNextActor()){ + if(SMESH_Actor *anActor = dynamic_cast(anAct)){ + if(anActor->hasIO()) + if (!Update(anActor->getIO(),anActor->GetVisibility())) break; // avoid multiple warinings if visu failed - } - } + } + } }else{ - SALOME_ListIteratorOfListIO anIter( selected ); - for( ; anIter.More(); anIter.Next()){ - Handle(SALOME_InteractiveObject) anIO = anIter.Value(); - if ( !Update(anIO,true) ) + SALOME_ListIteratorOfListIO anIter( selected ); + for( ; anIter.More(); anIter.Next()){ + Handle(SALOME_InteractiveObject) anIO = anIter.Value(); + if ( !Update(anIO,true) ) break; // avoid multiple warinings if visu failed - } + } } RepaintCurrentView(); } @@ -813,7 +814,7 @@ namespace SMESH QColor aHiColor = mgr->colorValue( "SMESH", "selection_object_color", Qt::white ), aSelColor = mgr->colorValue( "SMESH", "selection_element_color", Qt::yellow ), - aPreColor = mgr->colorValue( "SMESH", "highlight_color", Qt::cyan ); + aPreColor = mgr->colorValue( "SMESH", "highlight_color", Qt::cyan ); int SW = mgr->integerValue( "SMESH", "selection_width", 5 ), PW = mgr->integerValue( "SMESH", "highlight_width", 5 ); @@ -829,39 +830,39 @@ namespace SMESH double SP1 = mgr->doubleValue( "SMESH", "selection_precision_node", 0.025 ), SP2 = mgr->doubleValue( "SMESH", "selection_precision_element", 0.001 ), - SP3 = mgr->doubleValue( "SMESH", "selection_precision_object", 0.025 ); + SP3 = mgr->doubleValue( "SMESH", "selection_precision_object", 0.025 ); for ( int i=0, n=views.count(); iSetSelectionProp(aSelColor.red()/255., - aSelColor.green()/255., - aSelColor.blue()/255., - SW ); - // tolerances - aVtkView->SetSelectionTolerance(SP1, SP2, SP3); - - // pre-selection - aVtkView->SetPreselectionProp(aPreColor.red()/255., - aPreColor.green()/255., - aPreColor.blue()/255., - PW); - // update actors - vtkRenderer* aRenderer = aVtkView->getRenderer(); - VTK::ActorCollectionCopy aCopy(aRenderer->GetActors()); - vtkActorCollection *aCollection = aCopy.GetActors(); - aCollection->InitTraversal(); - while(vtkActor *anAct = aCollection->GetNextActor()){ - if(SMESH_Actor *anActor = dynamic_cast(anAct)){ - anActor->SetHighlightColor(aHiColor.red()/255., - aHiColor.green()/255., - aHiColor.blue()/255.); - anActor->SetPreHighlightColor(aPreColor.red()/255., - aPreColor.green()/255., - aPreColor.blue()/255.); - } - } + // mesh element selection + aVtkView->SetSelectionProp(aSelColor.red()/255., + aSelColor.green()/255., + aSelColor.blue()/255., + SW ); + // tolerances + aVtkView->SetSelectionTolerance(SP1, SP2, SP3); + + // pre-selection + aVtkView->SetPreselectionProp(aPreColor.red()/255., + aPreColor.green()/255., + aPreColor.blue()/255., + PW); + // update actors + vtkRenderer* aRenderer = aVtkView->getRenderer(); + VTK::ActorCollectionCopy aCopy(aRenderer->GetActors()); + vtkActorCollection *aCollection = aCopy.GetActors(); + aCollection->InitTraversal(); + while(vtkActor *anAct = aCollection->GetNextActor()){ + if(SMESH_Actor *anActor = dynamic_cast(anAct)){ + anActor->SetHighlightColor(aHiColor.red()/255., + aHiColor.green()/255., + aHiColor.blue()/255.); + anActor->SetPreHighlightColor(aPreColor.red()/255., + aPreColor.green()/255., + aPreColor.blue()/255.); + } + } } } } @@ -878,7 +879,7 @@ namespace SMESH } void SetFilter(const Handle(VTKViewer_Filter)& theFilter, - SVTK_Selector* theSelector) + SVTK_Selector* theSelector) { if (theSelector) theSelector->SetFilter(theFilter); @@ -906,7 +907,7 @@ namespace SMESH } bool IsValid(SALOME_Actor* theActor, int theCellId, - SVTK_Selector* theSelector) + SVTK_Selector* theSelector) { return theSelector->IsValid(theActor,theCellId); } @@ -920,11 +921,11 @@ namespace SMESH vtkActorCollection *aCollection = aCopy.GetActors(); aCollection->InitTraversal(); while(vtkActor *anAct = aCollection->GetNextActor()){ - if(SMESH_Actor *anActor = dynamic_cast(anAct)){ - if(anActor->GetVisibility()){ - anActor->SetPointRepresentation(theIsVisible); - } - } + if(SMESH_Actor *anActor = dynamic_cast(anAct)){ + if(anActor->GetVisibility()){ + anActor->SetPointRepresentation(theIsVisible); + } + } } RepaintCurrentView(); } @@ -939,14 +940,14 @@ namespace SMESH vtkActorCollection *aCollection = aCopy.GetActors(); aCollection->InitTraversal(); while(vtkActor *anAct = aCollection->GetNextActor()){ - if(SALOME_Actor *anActor = dynamic_cast(anAct)){ - if(anActor->GetVisibility()){ - anActor->SetPickable(anIsAllPickable); - } - } + if(SALOME_Actor *anActor = dynamic_cast(anAct)){ + if(anActor->GetVisibility()){ + anActor->SetPickable(anIsAllPickable); + } + } } if(theActor) - theActor->SetPickable(!anIsAllPickable); + theActor->SetPickable(!anIsAllPickable); RepaintCurrentView(); } } @@ -954,8 +955,8 @@ namespace SMESH //---------------------------------------------------------------------------- int GetNameOfSelectedNodes(SVTK_Selector* theSelector, - const Handle(SALOME_InteractiveObject)& theIO, - QString& theName) + const Handle(SALOME_InteractiveObject)& theIO, + QString& theName) { theName = ""; TColStd_IndexedMapOfInteger aMapIndex; @@ -968,8 +969,8 @@ namespace SMESH } int GetNameOfSelectedElements(SVTK_Selector* theSelector, - const Handle(SALOME_InteractiveObject)& theIO, - QString& theName) + const Handle(SALOME_InteractiveObject)& theIO, + QString& theName) { theName = ""; TColStd_IndexedMapOfInteger aMapIndex; @@ -989,9 +990,9 @@ namespace SMESH int GetEdgeNodes(SVTK_Selector* theSelector, - const TVisualObjPtr& theVisualObject, - int& theId1, - int& theId2) + const TVisualObjPtr& theVisualObject, + int& theId1, + int& theId2) { const SALOME_ListIO& selected = theSelector->StoredIObjects(); @@ -1011,9 +1012,9 @@ namespace SMESH for ( int i = 1; i <= aMapIndex.Extent(); i++ ) { int aVal = aMapIndex( i ); if ( aVal > 0 ) - anObjId = aVal; + anObjId = aVal; else - anEdgeNum = abs( aVal ) - 1; + anEdgeNum = abs( aVal ) - 1; } if ( anObjId == -1 || anEdgeNum == -1 ) @@ -1024,18 +1025,18 @@ namespace SMESH //---------------------------------------------------------------------------- int GetNameOfSelectedNodes(LightApp_SelectionMgr *theMgr, - const Handle(SALOME_InteractiveObject)& theIO, - QString& theName) + const Handle(SALOME_InteractiveObject)& theIO, + QString& theName) { theName = ""; if(theIO->hasEntry()){ if(FindActorByEntry(theIO->getEntry())){ - TColStd_IndexedMapOfInteger aMapIndex; - theMgr->GetIndexes(theIO,aMapIndex); - for(int i = 1; i <= aMapIndex.Extent(); i++){ - theName += QString(" %1").arg(aMapIndex(i)); - } - return aMapIndex.Extent(); + TColStd_IndexedMapOfInteger aMapIndex; + theMgr->GetIndexes(theIO,aMapIndex); + for(int i = 1; i <= aMapIndex.Extent(); i++){ + theName += QString(" %1").arg(aMapIndex(i)); + } + return aMapIndex.Extent(); } } return -1; @@ -1053,23 +1054,23 @@ namespace SMESH int GetNameOfSelectedElements(LightApp_SelectionMgr *theMgr, - const Handle(SALOME_InteractiveObject)& theIO, - QString& theName) + const Handle(SALOME_InteractiveObject)& theIO, + QString& theName) { theName = ""; if(theIO->hasEntry()){ if(FindActorByEntry(theIO->getEntry())){ - TColStd_IndexedMapOfInteger aMapIndex; - theMgr->GetIndexes(theIO,aMapIndex); - typedef std::set TIdContainer; - TIdContainer anIdContainer; - for( int i = 1; i <= aMapIndex.Extent(); i++) - anIdContainer.insert(aMapIndex(i)); - TIdContainer::const_iterator anIter = anIdContainer.begin(); - for( ; anIter != anIdContainer.end(); anIter++){ - theName += QString(" %1").arg(*anIter); - } - return aMapIndex.Extent(); + TColStd_IndexedMapOfInteger aMapIndex; + theMgr->GetIndexes(theIO,aMapIndex); + typedef std::set TIdContainer; + TIdContainer anIdContainer; + for( int i = 1; i <= aMapIndex.Extent(); i++) + anIdContainer.insert(aMapIndex(i)); + TIdContainer::const_iterator anIter = anIdContainer.begin(); + for( ; anIter != anIdContainer.end(); anIter++){ + theName += QString(" %1").arg(*anIter); + } + return aMapIndex.Extent(); } } return -1; @@ -1089,8 +1090,8 @@ namespace SMESH } int GetSelected(LightApp_SelectionMgr* theMgr, - TColStd_IndexedMapOfInteger& theMap, - const bool theIsElement) + TColStd_IndexedMapOfInteger& theMap, + const bool theIsElement) { theMap.Clear(); SALOME_ListIO selected; theMgr->selectedObjects( selected ); @@ -1099,7 +1100,7 @@ namespace SMESH { Handle(SALOME_InteractiveObject) anIO = selected.First(); if ( anIO->hasEntry() ) { - theMgr->GetIndexes( anIO, theMap ); + theMgr->GetIndexes( anIO, theMap ); } } return theMap.Extent(); @@ -1130,9 +1131,9 @@ namespace SMESH for ( int i = 1; i <= aMapIndex.Extent(); i++ ) { int aVal = aMapIndex( i ); if ( aVal > 0 ) - anObjId = aVal; + anObjId = aVal; else - anEdgeNum = abs( aVal ); + anEdgeNum = abs( aVal ); } if ( anObjId == -1 || anEdgeNum == -1 ) diff --git a/src/SMESHGUI/SMESHGUI_VTKUtils.h b/src/SMESHGUI/SMESHGUI_VTKUtils.h index 05d2e268b..0d49a4437 100644 --- a/src/SMESHGUI/SMESHGUI_VTKUtils.h +++ b/src/SMESHGUI/SMESHGUI_VTKUtils.h @@ -69,7 +69,7 @@ SMESHGUI_EXPORT //---------------------------------------------------------------------------- SMESHGUI_EXPORT SVTK_ViewWindow* GetViewWindow( const SalomeApp_Module* = 0, - bool = false ); + bool = false ); SMESHGUI_EXPORT SVTK_ViewWindow* FindVtkViewWindow( SUIT_ViewManager*, SUIT_ViewWindow* ); SMESHGUI_EXPORT @@ -112,7 +112,7 @@ SMESHGUI_EXPORT SMESHGUI_EXPORT bool UpdateView( SUIT_ViewWindow*, EDisplaing, const char* = "" ); -SMESHGUI_EXPORT +SMESHGUI_EXPORT bool UpdateView( EDisplaing, const char* = "" ); SMESHGUI_EXPORT @@ -153,31 +153,31 @@ SMESHGUI_EXPORT //---------------------------------------------------------------------------- SMESHGUI_EXPORT int GetNameOfSelectedNodes( SVTK_Selector*, - const Handle(SALOME_InteractiveObject)&, - QString& ); + const Handle(SALOME_InteractiveObject)&, + QString& ); SMESHGUI_EXPORT int GetNameOfSelectedElements( SVTK_Selector*, - const Handle(SALOME_InteractiveObject)&, - QString& ); + const Handle(SALOME_InteractiveObject)&, + QString& ); SMESHGUI_EXPORT int GetEdgeNodes( SVTK_Selector*, const TVisualObjPtr&, int&, int& ); //---------------------------------------------------------------------------- SMESHGUI_EXPORT int GetNameOfSelectedNodes( LightApp_SelectionMgr*, - const Handle(SALOME_InteractiveObject)&, - QString& ); + const Handle(SALOME_InteractiveObject)&, + QString& ); SMESHGUI_EXPORT int GetNameOfSelectedNodes( LightApp_SelectionMgr*, QString& ); SMESHGUI_EXPORT int GetNameOfSelectedElements( LightApp_SelectionMgr*, - const Handle(SALOME_InteractiveObject)&, - QString& ); + const Handle(SALOME_InteractiveObject)&, + QString& ); SMESHGUI_EXPORT int GetNameOfSelectedElements( LightApp_SelectionMgr*, QString& ); SMESHGUI_EXPORT int GetSelected( LightApp_SelectionMgr*, TColStd_IndexedMapOfInteger&, - const bool = true ); + const bool = true ); SMESHGUI_EXPORT int GetEdgeNodes( LightApp_SelectionMgr*, int&, int& ); diff --git a/src/SMESHGUI/SMESHGUI_WhatIsDlg.cxx b/src/SMESHGUI/SMESHGUI_WhatIsDlg.cxx index 57830cefb..f2913e836 100755 --- a/src/SMESHGUI/SMESHGUI_WhatIsDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_WhatIsDlg.cxx @@ -242,14 +242,14 @@ void SMESHGUI_WhatIsDlg::SelectionsClicked (int selectionId) { SMESH::SetPointRepresentation(true); if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode( NodeSelection ); + aViewWindow->SetSelectionMode( NodeSelection ); break; } case 1: { SMESH::SetPointRepresentation(false); if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) - aViewWindow->SetSelectionMode( CellSelection ); + aViewWindow->SetSelectionMode( CellSelection ); break; } } @@ -299,10 +299,10 @@ void SMESHGUI_WhatIsDlg::ClickOnHelp() app->onHelpContextModule(mySMESHGUI ? app->moduleName(mySMESHGUI->moduleName()) : QString(""), myHelpFileName); else { SUIT_MessageBox::warning(this, tr("WRN_WARNING"), - tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). - arg(app->resourceMgr()->stringValue("ExternalBrowser", - "application")). - arg(myHelpFileName)); + tr("EXTERNAL_BROWSER_CANNOT_SHOW_PAGE"). + arg(app->resourceMgr()->stringValue("ExternalBrowser", + "application")). + arg(myHelpFileName)); } } @@ -329,10 +329,10 @@ void SMESHGUI_WhatIsDlg::onTextChange (const QString& theNewText) for (int i = 0; i < aListId.count(); i++) { const SMDS_MeshElement * e = RadioButtonNodes->isChecked()? - aMesh->FindNode(aListId[ i ].toInt()): - aMesh->FindElement(aListId[ i ].toInt()); + aMesh->FindNode(aListId[ i ].toInt()): + aMesh->FindElement(aListId[ i ].toInt()); if (e) - newIndices.Add(e->GetID()); + newIndices.Add(e->GetID()); } mySelector->AddOrRemoveIndex( anIO, newIndices, false ); @@ -455,22 +455,22 @@ void SMESHGUI_WhatIsDlg::SelectionIntoArgument() anInfo+=tr("SMESH_FACE")+"
      "; anInfo+="" + tr("SMESH_MESHINFO_TYPE")+": "; if(!ef->IsPoly()) - anInfo+=(ef->IsQuadratic()?tr("SMESH_MESHINFO_ORDER2"):tr("SMESH_MESHINFO_ORDER1"))+" "; + anInfo+=(ef->IsQuadratic()?tr("SMESH_MESHINFO_ORDER2"):tr("SMESH_MESHINFO_ORDER1"))+" "; switch(ef->NbNodes()) { case 3: case 6: - { - anInfo+=tr("SMESH_TRIANGLE"); - break; - } + { + anInfo+=tr("SMESH_TRIANGLE"); + break; + } case 4: case 8: - { - anInfo+=tr("SMESH_QUADRANGLE"); - break; - } + { + anInfo+=tr("SMESH_QUADRANGLE"); + break; + } default: - break; + break; } anInfo+="
      "; } else if(e->GetType() == SMDSAbs_Volume) { @@ -479,39 +479,39 @@ void SMESHGUI_WhatIsDlg::SelectionIntoArgument() const SMDS_MeshVolume *ev = (SMDS_MeshVolume*) e; SMDS_VolumeTool vt(ev); if(vt.GetVolumeType() != SMDS_VolumeTool::POLYHEDA) - anInfo+=(ev->IsQuadratic()?tr("SMESH_MESHINFO_ORDER2"):tr("SMESH_MESHINFO_ORDER1"))+" "; + anInfo+=(ev->IsQuadratic()?tr("SMESH_MESHINFO_ORDER2"):tr("SMESH_MESHINFO_ORDER1"))+" "; switch(vt.GetVolumeType()) { case SMDS_VolumeTool::TETRA: case SMDS_VolumeTool::QUAD_TETRA: - { - anInfo+=tr("SMESH_TETRAS"); - break; - } + { + anInfo+=tr("SMESH_TETRAS"); + break; + } case SMDS_VolumeTool::PYRAM: case SMDS_VolumeTool::QUAD_PYRAM: - { - anInfo+=tr("SMESH_PYRAMID"); - break; - } + { + anInfo+=tr("SMESH_PYRAMID"); + break; + } case SMDS_VolumeTool::PENTA: case SMDS_VolumeTool::QUAD_PENTA: - { - anInfo+=tr("SMESH_PRISM"); - break; - } + { + anInfo+=tr("SMESH_PRISM"); + break; + } case SMDS_VolumeTool::HEXA: case SMDS_VolumeTool::QUAD_HEXA: - { - anInfo+=tr("SMESH_HEXAS"); - break; - } + { + anInfo+=tr("SMESH_HEXAS"); + break; + } case SMDS_VolumeTool::POLYHEDA: - { - anInfo+=tr("SMESH_POLYEDRON"); - break; - } + { + anInfo+=tr("SMESH_POLYEDRON"); + break; + } default: - break; + break; } anInfo+="
      "; } @@ -523,17 +523,17 @@ void SMESHGUI_WhatIsDlg::SelectionIntoArgument() const SMDS_MeshNode* node = static_cast( nodeIt->next() ); anXYZ.Add( gp_XYZ( node->X(), node->Y(), node->Z() ) ); if(e->GetType() != SMDSAbs_Node) - aNodesInfo+=QString("Node %1:
      Id=%2, X=%3, Y=%4, Z=%5
      ").arg(nbNodes+1).arg(node->GetID()).arg(node->X()).arg(node->Y()).arg(node->Z()); + aNodesInfo+=QString("Node %1:
      Id=%2, X=%3, Y=%4, Z=%5
      ").arg(nbNodes+1).arg(node->GetID()).arg(node->X()).arg(node->Y()).arg(node->Z()); // Calculate Connectivity SMDS_ElemIteratorPtr it = node->GetInverseElementIterator(); if (it) { - aNodesInfo+="" + tr("CONNECTED_ELEMENTS") + ":"; - while (it->more()) { - const SMDS_MeshElement* elem = it->next(); - aNodesInfo+=QString(" %1").arg(elem->GetID()); - } - if ( (nbNodes+1) != e->NbNodes()) - aNodesInfo+=QString("

      "); + aNodesInfo+="" + tr("CONNECTED_ELEMENTS") + ":"; + while (it->more()) { + const SMDS_MeshElement* elem = it->next(); + aNodesInfo+=QString(" %1").arg(elem->GetID()); + } + if ( (nbNodes+1) != e->NbNodes()) + aNodesInfo+=QString("

      "); } } if(e->GetType() != SMDSAbs_Node) diff --git a/src/SMESHGUI/SMESHGUI_XmlHandler.cxx b/src/SMESHGUI/SMESHGUI_XmlHandler.cxx index 4e1ea4eef..16833ee66 100644 --- a/src/SMESHGUI/SMESHGUI_XmlHandler.cxx +++ b/src/SMESHGUI/SMESHGUI_XmlHandler.cxx @@ -103,7 +103,7 @@ bool SMESHGUI_XmlHandler::startElement (const QString&, const QString&, { MESSAGE("Loading Resources " << aResName.toLatin1().data()); SUIT_ResourceMgr* resMgr = SMESHGUI::resourceMgr(); - QString lang = resMgr->stringValue( resMgr->langSection(), "language", "en" ); + QString lang = resMgr->stringValue( resMgr->langSection(), "language", "en" ); resMgr->loadTranslator( "resources", QString( "%1_msg_%2.qm" ).arg( aResName, lang ) ); resMgr->loadTranslator( "resources", QString( "%1_images.qm" ).arg( aResName, lang ) ); } @@ -186,7 +186,7 @@ bool SMESHGUI_XmlHandler::startElement (const QString&, const QString&, { QString aHypos = isHypo ? atts.value("hypos") : atts.value("algos"); aHypos = aHypos.remove( ' ' ); - aHypoSet->set( !isHypo, aHypos.split( ',', QString::SkipEmptyParts ) ); + aHypoSet->set( !isHypo, aHypos.split( ',', QString::SkipEmptyParts ) ); } } } diff --git a/src/SMESHGUI/SMESHGUI_XmlHandler.h b/src/SMESHGUI/SMESHGUI_XmlHandler.h index 09db44219..3c38797e8 100644 --- a/src/SMESHGUI/SMESHGUI_XmlHandler.h +++ b/src/SMESHGUI/SMESHGUI_XmlHandler.h @@ -45,7 +45,7 @@ public: bool startDocument(); bool startElement( const QString&, const QString&, - const QString&, const QXmlAttributes& ); + const QString&, const QXmlAttributes& ); bool endElement( const QString&, const QString&, const QString& ); bool characters( const QString& ); diff --git a/src/SMESHGUI/SMESH_images.ts b/src/SMESHGUI/SMESH_images.ts index c2569ba1a..8b455dfe0 100644 --- a/src/SMESHGUI/SMESH_images.ts +++ b/src/SMESHGUI/SMESH_images.ts @@ -445,5 +445,9 @@ ICON_UNDERLYING_ELEMS mesh_extractGroup.png + + ICON_2D_FROM_3D + mesh_2d_from_3d.png + diff --git a/src/SMESHGUI/SMESH_msg_en.ts b/src/SMESHGUI/SMESH_msg_en.ts index ab6fe272b..959a47634 100644 --- a/src/SMESHGUI/SMESH_msg_en.ts +++ b/src/SMESHGUI/SMESH_msg_en.ts @@ -201,6 +201,10 @@ MEN_CONV_TO_QUAD Convert to/from quadratic + + MEN_2D_FROM_3D + Create 2D mesh from 3D + MEN_CREATE_GROUP Create Group @@ -309,6 +313,10 @@ MEN_EXPORT_MED Export to MED File + + MEN_EXPORT_SAUV + Export to SAUV (ASCII) file + MEN_EXPORT_STL Export to STL File @@ -393,6 +401,10 @@ MEN_MED MED file + + MEN_SAUV + SAUV (ASCII) file + MEN_MERGE Merge Nodes @@ -2043,6 +2055,10 @@ Consider saving your work before application crash STB_CONV_TO_QUAD Convert to/from quadratic + + STB_2D_FROM_3D + Create 2D mesh from 3D + STB_CREATE_GROUP Create Group @@ -2135,6 +2151,10 @@ Consider saving your work before application crash STB_EXPORT_MED Export to MED file + + STB_EXPORT_SAUV + Export to SAUV (ASCII) file + STB_EXPORT_STL Export to STL file @@ -2209,6 +2229,10 @@ Consider saving your work before application crash STB_MED Import MED file + + STB_SAUV + Import SAUV (ASCII) file + STB_MERGE Merge nodes @@ -2537,6 +2561,10 @@ Consider saving your work before application crash TOP_CONV_TO_QUAD Convert to/from quadratic + + TOP_2D_FROM_3D + Create 2D mesh from 3D + TOP_CREATE_GROUP Create Group @@ -2629,6 +2657,10 @@ Consider saving your work before application crash TOP_EXPORT_MED Export to MED file + + TOP_EXPORT_SAUV + Export to SAUV (ASCII) file + TOP_EXPORT_STL Export to STL file @@ -2703,6 +2735,10 @@ Consider saving your work before application crash TOP_MED Import MED file + + TOP_SAUV + Import SAUV (ASCII) file + TOP_MERGE Merge nodes @@ -3375,6 +3411,13 @@ Please specify it and try again No valid mesh object selected + + SMESHGUI_Make2DFrom3DDlg + + CAPTION + Create 2D mesh from 3D + + SMESHGUI_CreatePatternDlg diff --git a/src/SMESH_I/SMESH_2smeshpy.cxx b/src/SMESH_I/SMESH_2smeshpy.cxx index 077766762..8d3cacc13 100644 --- a/src/SMESH_I/SMESH_2smeshpy.cxx +++ b/src/SMESH_I/SMESH_2smeshpy.cxx @@ -121,7 +121,7 @@ namespace { TCollection_AsciiString SMESH_2smeshpy::ConvertScript(const TCollection_AsciiString& theScript, Resource_DataMapOfAsciiStringAsciiString& theEntry2AccessorMethod, - Resource_DataMapOfAsciiStringAsciiString& theObjectNames) + Resource_DataMapOfAsciiStringAsciiString& theObjectNames) { theGen = new _pyGen( theEntry2AccessorMethod, theObjectNames ); @@ -196,7 +196,7 @@ SMESH_2smeshpy::ConvertScript(const TCollection_AsciiString& theScript, //================================================================================ _pyGen::_pyGen(Resource_DataMapOfAsciiStringAsciiString& theEntry2AccessorMethod, - Resource_DataMapOfAsciiStringAsciiString& theObjectNames) + Resource_DataMapOfAsciiStringAsciiString& theObjectNames) : _pyObject( new _pyCommand( TPythonDump::SMESHGenName(), 0 )), myID2AccessorMethod( theEntry2AccessorMethod ), myObjectNames( theObjectNames ) @@ -541,7 +541,7 @@ Handle(_pyHypothesis) _pyGen::FindAlgo( const _pyID& theGeom, const _pyID& theMe if ( !hyp->IsNull() && (*hyp)->IsAlgo() && theHypothesis->CanBeCreatedBy( (*hyp)->GetAlgoType() ) && - (*hyp)->GetGeom() == theGeom && + (*hyp)->GetGeom() == theGeom && (*hyp)->GetMesh() == theMesh ) return *hyp; return 0; @@ -624,8 +624,8 @@ void _pyGen::SetCommandBefore( Handle(_pyCommand) theCmd, Handle(_pyCommand) the //================================================================================ void _pyGen::setNeighbourCommand( Handle(_pyCommand)& theCmd, - Handle(_pyCommand)& theOtherCmd, - const bool theIsAfter ) + Handle(_pyCommand)& theOtherCmd, + const bool theIsAfter ) { list< Handle(_pyCommand) >::iterator pos; pos = find( myCommands.begin(), myCommands.end(), theCmd ); @@ -680,8 +680,8 @@ _pyID _pyGen::GenerateNewID( const _pyID& theID ) while ( myObjectNames.IsBound( aNewID ) ); myObjectNames.Bind( aNewID, myObjectNames.IsBound( theID ) - ? (myObjectNames.Find( theID ) + _pyID( "_" ) + _pyID( index-1 )) - : _pyID( "A" ) + aNewID ); + ? (myObjectNames.Find( theID ) + _pyID( "_" ) + _pyID( index-1 )) + : _pyID( "A" ) + aNewID ); return aNewID; } @@ -952,21 +952,21 @@ void _pyMesh::Flush() if ( algo->IsWrapped() ) { _pyID localAlgoID = theGen->GenerateNewID( algoID ); TCollection_AsciiString aNewCmdStr = localAlgoID + - TCollection_AsciiString( " = " ) + theGen->GetID() + - TCollection_AsciiString( ".CreateHypothesis( \"" ) + algo->GetAlgoType() + - TCollection_AsciiString( "\" )" ); + TCollection_AsciiString( " = " ) + theGen->GetID() + + TCollection_AsciiString( ".CreateHypothesis( \"" ) + algo->GetAlgoType() + + TCollection_AsciiString( "\" )" ); Handle(_pyCommand) newCmd = theGen->AddCommand( aNewCmdStr ); Handle(_pyAlgorithm) newAlgo = Handle(_pyAlgorithm)::DownCast(theGen->FindHyp( localAlgoID )); if ( !newAlgo.IsNull() ) { - newAlgo->Assign( algo, this->GetID() ); - newAlgo->SetCreationCmd( newCmd ); - algo = newAlgo; - // set algorithm creation - theGen->SetCommandBefore( newCmd, addCmd ); + newAlgo->Assign( algo, this->GetID() ); + newAlgo->SetCreationCmd( newCmd ); + algo = newAlgo; + // set algorithm creation + theGen->SetCommandBefore( newCmd, addCmd ); } else - newCmd->Clear(); + newCmd->Clear(); } _pyID geom = addCmd->GetArg( 1 ); bool isLocalAlgo = ( geom != GetGeom() ); @@ -982,14 +982,14 @@ void _pyMesh::Flush() addCmd->SetArg( addCmd->GetNbArgs() + 1, TCollection_AsciiString( "geom=" ) + geom ); // sm = mesh.GetSubMesh(geom, name) --> sm = ALGO.GetSubMesh() - list < Handle(_pySubMesh) >::iterator smIt; + list < Handle(_pySubMesh) >::iterator smIt; for ( smIt = mySubmeshes.begin(); smIt != mySubmeshes.end(); ++smIt ) { - Handle(_pySubMesh) subMesh = *smIt; + Handle(_pySubMesh) subMesh = *smIt; Handle(_pyCommand) subCmd = subMesh->GetCreationCmd(); if ( geom == subCmd->GetArg( 1 )) { subCmd->SetObject( algo->GetID() ); subCmd->RemoveArgs(); - subMesh->SetCreator( algo ); + subMesh->SetCreator( algo ); } } } @@ -1271,11 +1271,11 @@ Handle(_pyHypothesis) _pyHypothesis::NewHypothesis( const Handle(_pyCommand)& th } else if ( hypType == "QuadranglePreference" ) { hyp->SetConvMethodAndType( "QuadranglePreference", "Quadrangle_2D"); - hyp->SetConvMethodAndType( "QuadranglePreference", "NETGEN_2D_ONLY"); + hyp->SetConvMethodAndType( "SetQuadAllowed", "NETGEN_2D_ONLY"); } else if ( hypType == "TrianglePreference" ) { hyp->SetConvMethodAndType( "TrianglePreference", "Quadrangle_2D"); - } + } // BLSURF ---------- else if ( hypType == "BLSURF" ) { algo->SetConvMethodAndType( "Triangle", hypType.ToCString()); @@ -1532,7 +1532,7 @@ void _pyHypothesis::ClearAllCommands() //================================================================================ void _pyHypothesis::Assign( const Handle(_pyHypothesis)& theOther, - const _pyID& theMesh ) + const _pyID& theMesh ) { myIsWrapped = false; myMesh = theMesh; @@ -1995,15 +1995,15 @@ const TCollection_AsciiString & _pyCommand::GetObject() int nb1 = 0; // number of ' character at the left of = int nb2 = 0; // number of " character at the left of = for ( int i = 1; i < begPos-1; i++ ) { - if ( myString.Value( i )=='\'' ) - nb1 += 1; - else if ( myString.Value( i )=='"' ) - nb2 += 1; + if ( myString.Value( i )=='\'' ) + nb1 += 1; + else if ( myString.Value( i )=='"' ) + nb2 += 1; } // if number of ' or " is not divisible by 2, // then get an object at the start of the command if ( nb1 % 2 != 0 || nb2 % 2 != 0 ) - begPos = 1; + begPos = 1; } myObj = GetWord( myString, begPos, true ); // check if object is complex, @@ -2073,16 +2073,16 @@ const TCollection_AsciiString & _pyCommand::GetArg( int index ) while ( begPos != EMPTY ) { begPos += prevLen; if( myString.Value( begPos ) == '(' ) - nbNestings++; + nbNestings++; // check if we are looking at the closing parenthesis while ( begPos <= Length() && isspace( myString.Value( begPos ))) ++begPos; if ( begPos > Length() ) break; if ( myString.Value( begPos ) == ')' ) { - nbNestings--; - if( nbNestings == 0 ) - break; + nbNestings--; + if( nbNestings == 0 ) + break; } myArgs.Append( GetWord( myString, begPos, true, true )); SetBegPos( ARG1_IND + i, begPos ); diff --git a/src/SMESH_I/SMESH_2smeshpy.hxx b/src/SMESH_I/SMESH_2smeshpy.hxx index 015d91bde..16926e54d 100644 --- a/src/SMESH_I/SMESH_2smeshpy.hxx +++ b/src/SMESH_I/SMESH_2smeshpy.hxx @@ -327,7 +327,7 @@ public: void Process( const Handle(_pyCommand)& theCommand); void Flush(); virtual void Assign( const Handle(_pyHypothesis)& theOther, - const _pyID& theMesh ); + const _pyID& theMesh ); DEFINE_STANDARD_RTTI (_pyHypothesis) }; diff --git a/src/SMESH_I/SMESH_DumpPython.cxx b/src/SMESH_I/SMESH_DumpPython.cxx index 07ab0f695..5b012b59c 100644 --- a/src/SMESH_I/SMESH_DumpPython.cxx +++ b/src/SMESH_I/SMESH_DumpPython.cxx @@ -66,8 +66,8 @@ namespace SMESH TCollection_AsciiString aCollection(Standard_CString(aString.c_str())); SALOMEDS::Study_ptr aStudy = aSMESHGen->GetCurrentStudy(); if(!aStudy->_is_nil() && !aCollection.IsEmpty()){ - aSMESHGen->AddToPythonScript(aStudy->StudyId(),aCollection); - if(MYDEBUG) MESSAGE(aString); + aSMESHGen->AddToPythonScript(aStudy->StudyId(),aCollection); + if(MYDEBUG) MESSAGE(aString); } } } @@ -192,10 +192,11 @@ namespace SMESH operator<<(CORBA::Object_ptr theArg) { SMESH_Gen_i* aSMESHGen = SMESH_Gen_i::GetSMESHGen(); - SALOMEDS::Study_ptr aStudy = aSMESHGen->GetCurrentStudy(); + SALOMEDS::Study_var aStudy = aSMESHGen->GetCurrentStudy(); SALOMEDS::SObject_var aSObject = SMESH_Gen_i::ObjectToSObject(aStudy,theArg); if(!aSObject->_is_nil()) { - myStream << aSObject->GetID(); + CORBA::String_var id = aSObject->GetID(); + myStream << id; } else if ( !CORBA::is_nil(theArg)) { if ( aSMESHGen->CanPublishInStudy( theArg )) // not published SMESH object myStream << "smeshObj_" << size_t(theArg); @@ -484,6 +485,7 @@ Engines::TMPFile* SMESH_Gen_i::DumpPython (CORBA::Object_ptr theStudy, // Add trace of API methods calls and replace study entries by names TCollection_AsciiString aScript = + "# -*- coding: iso-8859-1 -*-\n" "### This file is generated by SALOME automatically by dump python functionality of SMESH component\n\n"; aScript += DumpPython_impl(aStudy, aMap, aMapNames, isPublished, isValidScript, aSavedTrace); @@ -585,8 +587,8 @@ Handle(TColStd_HSequenceOfInteger) FindEntries (TCollection_AsciiString& theStri isFound = Standard_False; while((j < aLen) && ( isdigit(c) || c == ':' )) { //Check if it is an entry - c = (int)arr[j++]; - if(c == ':') isFound = Standard_True; + c = (int)arr[j++]; + if(c == ':') isFound = Standard_True; } if (isFound) { @@ -784,7 +786,7 @@ TCollection_AsciiString SMESH_Gen_i::DumpPython_impl } // set initial part of aSript - TCollection_AsciiString initPart = "import salome, SMESH\n"; + TCollection_AsciiString initPart = "import salome, SMESH, SALOMEDS\n"; initPart += helper + "import " + aSmeshpy + "\n\n"; if ( importGeom ) { @@ -819,7 +821,7 @@ TCollection_AsciiString SMESH_Gen_i::DumpPython_impl if( !CORBA::is_nil(aGroup) ) { SALOMEDS::Color aColor = aGroup->GetColor(); - if ( aColor.R > 0 || aColor.G > 0 || aColor.B > 0 ) + if ( aColor.R >= 0 || aColor.G >= 0 || aColor.B >= 0 ) { CORBA::String_var anEntry = aSObj->GetID(); anUpdatedScript += SMESH_Comment("\n\t") diff --git a/src/SMESH_I/SMESH_Filter_i.cxx b/src/SMESH_I/SMESH_Filter_i.cxx index c75d81e88..e9370beda 100644 --- a/src/SMESH_I/SMESH_Filter_i.cxx +++ b/src/SMESH_I/SMESH_Filter_i.cxx @@ -2436,13 +2436,13 @@ CORBA::Boolean Filter_i::SetCriteria( const SMESH::Filter::Criteria& theCriteria pd << "aCriterion = SMESH.Filter.Criterion(" << aCriterion << "," << aCompare << "," << aThreshold << ",'" << aThresholdStr; if (aThresholdID && strlen(aThresholdID)) - //pd << "',salome.ObjectToID(" << aThresholdID + //pd << "',salome.ObjectToID(" << aThresholdID pd << "','" << aThresholdID - << "'," << aUnary << "," << aBinary << "," << aTolerance - << "," << aTypeOfElem << "," << aPrecision << ")"; + << "'," << aUnary << "," << aBinary << "," << aTolerance + << "," << aTypeOfElem << "," << aPrecision << ")"; else - pd << "',''," << aUnary << "," << aBinary << "," << aTolerance - << "," << aTypeOfElem << "," << aPrecision << ")"; + pd << "',''," << aUnary << "," << aBinary << "," << aTolerance + << "," << aTypeOfElem << "," << aPrecision << ")"; } SMESH::Predicate_ptr aPredicate = SMESH::Predicate::_nil(); @@ -2534,7 +2534,7 @@ CORBA::Boolean Filter_i::SetCriteria( const SMESH::Filter::Criteria& theCriteria { SMESH::LyingOnGeom_ptr tmpPred = aFilterMgr->CreateLyingOnGeom(); tmpPred->SetElementType( aTypeOfElem ); - tmpPred->SetShape( aThresholdID, aThresholdStr ); + tmpPred->SetShape( aThresholdID, aThresholdStr ); tmpPred->SetTolerance( aTolerance ); aPredicate = tmpPred; } diff --git a/src/SMESH_I/SMESH_Filter_i.hxx b/src/SMESH_I/SMESH_Filter_i.hxx index 090705d05..44cc246bf 100644 --- a/src/SMESH_I/SMESH_Filter_i.hxx +++ b/src/SMESH_I/SMESH_Filter_i.hxx @@ -107,10 +107,10 @@ namespace SMESH double GetTolerance(); virtual bool Contains( const SMESHDS_Mesh* theMeshDS, - const TopoDS_Shape& theShape, - const SMDS_MeshElement* theElem, - TopAbs_ShapeEnum theFindShapeEnum, - TopAbs_ShapeEnum theAvoidShapeEnum = TopAbs_SHAPE ); + const TopoDS_Shape& theShape, + const SMDS_MeshElement* theElem, + TopAbs_ShapeEnum theFindShapeEnum, + TopAbs_ShapeEnum theAvoidShapeEnum = TopAbs_SHAPE ); private: virtual void init(); @@ -133,7 +133,7 @@ namespace SMESH Description : An abstact class for all functors */ class SMESH_I_EXPORT Functor_i: public virtual POA_SMESH::Functor, - public virtual SALOME::GenericObj_i + public virtual SALOME::GenericObj_i { public: void SetMesh( SMESH_Mesh_ptr theMesh ); @@ -152,7 +152,7 @@ namespace SMESH Description : Base class for numerical functors */ class SMESH_I_EXPORT NumericalFunctor_i: public virtual POA_SMESH::NumericalFunctor, - public virtual Functor_i + public virtual Functor_i { public: CORBA::Double GetValue( CORBA::Long theElementId ); @@ -170,7 +170,7 @@ namespace SMESH Description : Functor for calculation of minimum angle */ class SMESH_I_EXPORT MinimumAngle_i: public virtual POA_SMESH::MinimumAngle, - public virtual NumericalFunctor_i + public virtual NumericalFunctor_i { public: MinimumAngle_i(); @@ -183,7 +183,7 @@ namespace SMESH Description : Functor for calculating aspect ratio */ class SMESH_I_EXPORT AspectRatio_i: public virtual POA_SMESH::AspectRatio, - public virtual NumericalFunctor_i + public virtual NumericalFunctor_i { public: AspectRatio_i(); @@ -196,7 +196,7 @@ namespace SMESH Description : Functor for calculating aspect ratio for 3D */ class SMESH_I_EXPORT AspectRatio3D_i: public virtual POA_SMESH::AspectRatio3D, - public virtual NumericalFunctor_i + public virtual NumericalFunctor_i { public: AspectRatio3D_i(); @@ -209,7 +209,7 @@ namespace SMESH Description : Functor for calculating warping */ class SMESH_I_EXPORT Warping_i: public virtual POA_SMESH::Warping, - public virtual NumericalFunctor_i + public virtual NumericalFunctor_i { public: Warping_i(); @@ -222,7 +222,7 @@ namespace SMESH Description : Functor for calculating taper */ class SMESH_I_EXPORT Taper_i: public virtual POA_SMESH::Taper, - public virtual NumericalFunctor_i + public virtual NumericalFunctor_i { public: Taper_i(); @@ -235,7 +235,7 @@ namespace SMESH Description : Functor for calculating skew in degrees */ class SMESH_I_EXPORT Skew_i: public virtual POA_SMESH::Skew, - public virtual NumericalFunctor_i + public virtual NumericalFunctor_i { public: Skew_i(); @@ -248,7 +248,7 @@ namespace SMESH Description : Functor for calculating area */ class SMESH_I_EXPORT Area_i: public virtual POA_SMESH::Area, - public virtual NumericalFunctor_i + public virtual NumericalFunctor_i { public: Area_i(); @@ -274,7 +274,7 @@ namespace SMESH Description : Functor for calculating length of edge */ class SMESH_I_EXPORT Length_i: public virtual POA_SMESH::Length, - public virtual NumericalFunctor_i + public virtual NumericalFunctor_i { public: Length_i(); @@ -286,7 +286,7 @@ namespace SMESH Description : Functor for calculating length of edge */ class SMESH_I_EXPORT Length2D_i: public virtual POA_SMESH::Length2D, - public virtual NumericalFunctor_i + public virtual NumericalFunctor_i { public: Length2D_i(); @@ -303,7 +303,7 @@ namespace SMESH Description : Functor for calculating number of faces conneted to the edge */ class SMESH_I_EXPORT MultiConnection_i: public virtual POA_SMESH::MultiConnection, - public virtual NumericalFunctor_i + public virtual NumericalFunctor_i { public: MultiConnection_i(); @@ -315,7 +315,7 @@ namespace SMESH Description : Functor for calculating number of faces conneted to the edge */ class SMESH_I_EXPORT MultiConnection2D_i: public virtual POA_SMESH::MultiConnection2D, - public virtual NumericalFunctor_i + public virtual NumericalFunctor_i { public: MultiConnection2D_i(); @@ -335,7 +335,7 @@ namespace SMESH Description : Base class for all predicates */ class SMESH_I_EXPORT Predicate_i: public virtual POA_SMESH::Predicate, - public virtual Functor_i + public virtual Functor_i { public: CORBA::Boolean IsSatisfy( CORBA::Long theElementId ); @@ -352,7 +352,7 @@ namespace SMESH the point of view of MED convention */ class SMESH_I_EXPORT BadOrientedVolume_i: public virtual POA_SMESH::BadOrientedVolume, - public virtual Predicate_i + public virtual Predicate_i { public: BadOrientedVolume_i(); @@ -364,7 +364,7 @@ namespace SMESH Description : Predicate for selection on geometrical support */ class SMESH_I_EXPORT BelongToGeom_i: public virtual POA_SMESH::BelongToGeom, - public virtual Predicate_i + public virtual Predicate_i { public: BelongToGeom_i(); @@ -395,7 +395,7 @@ namespace SMESH Description : Verify whether mesh element lie in pointed Geom planar object */ class SMESH_I_EXPORT BelongToSurface_i: public virtual POA_SMESH::BelongToSurface, - public virtual Predicate_i + public virtual Predicate_i { public: BelongToSurface_i( const Handle(Standard_Type)& ); @@ -426,7 +426,7 @@ namespace SMESH Description : Verify whether mesh element lie in pointed Geom planar object */ class SMESH_I_EXPORT BelongToPlane_i: public virtual POA_SMESH::BelongToPlane, - public virtual BelongToSurface_i + public virtual BelongToSurface_i { public: BelongToPlane_i(); @@ -439,7 +439,7 @@ namespace SMESH Description : Verify whether mesh element lie in pointed Geom cylindrical object */ class SMESH_I_EXPORT BelongToCylinder_i: public virtual POA_SMESH::BelongToCylinder, - public virtual BelongToSurface_i + public virtual BelongToSurface_i { public: BelongToCylinder_i(); @@ -465,7 +465,7 @@ namespace SMESH Description : Predicate for selection on geometrical support(lying or partially lying) */ class SMESH_I_EXPORT LyingOnGeom_i: public virtual POA_SMESH::LyingOnGeom, - public virtual Predicate_i + public virtual Predicate_i { public: LyingOnGeom_i(); @@ -496,7 +496,7 @@ namespace SMESH Description : Predicate for free borders */ class SMESH_I_EXPORT FreeBorders_i: public virtual POA_SMESH::FreeBorders, - public virtual Predicate_i + public virtual Predicate_i { public: FreeBorders_i(); @@ -509,7 +509,7 @@ namespace SMESH Description : Predicate for free edges */ class SMESH_I_EXPORT FreeEdges_i: public virtual POA_SMESH::FreeEdges, - public virtual Predicate_i + public virtual Predicate_i { public: FreeEdges_i(); @@ -526,7 +526,7 @@ namespace SMESH Description : Predicate for free faces */ class SMESH_I_EXPORT FreeFaces_i: public virtual POA_SMESH::FreeFaces, - public virtual Predicate_i + public virtual Predicate_i { public: FreeFaces_i(); @@ -539,7 +539,7 @@ namespace SMESH Description : Predicate for free nodes */ class SMESH_I_EXPORT FreeNodes_i: public virtual POA_SMESH::FreeNodes, - public virtual Predicate_i + public virtual Predicate_i { public: FreeNodes_i(); @@ -552,7 +552,7 @@ namespace SMESH Description : Predicate for Range of Ids */ class SMESH_I_EXPORT RangeOfIds_i: public virtual POA_SMESH::RangeOfIds, - public virtual Predicate_i + public virtual Predicate_i { public: RangeOfIds_i(); @@ -572,7 +572,7 @@ namespace SMESH Description : Verify whether a mesh element is linear */ class SMESH_I_EXPORT LinearOrQuadratic_i: public virtual POA_SMESH::LinearOrQuadratic, - public virtual Predicate_i + public virtual Predicate_i { public: LinearOrQuadratic_i(); @@ -588,7 +588,7 @@ namespace SMESH Description : Functor for check color of group to whic mesh element belongs to */ class SMESH_I_EXPORT GroupColor_i: public virtual POA_SMESH::GroupColor, - public virtual Predicate_i + public virtual Predicate_i { public: GroupColor_i(); @@ -607,7 +607,7 @@ namespace SMESH Description : Functor for check element geometry type */ class SMESH_I_EXPORT ElemGeomType_i: public virtual POA_SMESH::ElemGeomType, - public virtual Predicate_i + public virtual Predicate_i { public: ElemGeomType_i(); @@ -626,7 +626,7 @@ namespace SMESH Description : Base class for comparators */ class SMESH_I_EXPORT Comparator_i: public virtual POA_SMESH::Comparator, - public virtual Predicate_i + public virtual Predicate_i { public: virtual ~Comparator_i(); @@ -651,7 +651,7 @@ namespace SMESH Description : Comparator "<" */ class SMESH_I_EXPORT LessThan_i: public virtual POA_SMESH::LessThan, - public virtual Comparator_i + public virtual Comparator_i { public: LessThan_i(); @@ -664,7 +664,7 @@ namespace SMESH Description : Comparator ">" */ class SMESH_I_EXPORT MoreThan_i: public virtual POA_SMESH::MoreThan, - public virtual Comparator_i + public virtual Comparator_i { public: MoreThan_i(); @@ -677,7 +677,7 @@ namespace SMESH Description : Comparator "=" */ class SMESH_I_EXPORT EqualTo_i: public virtual POA_SMESH::EqualTo, - public virtual Comparator_i + public virtual Comparator_i { public: EqualTo_i(); @@ -695,7 +695,7 @@ namespace SMESH Description : Logical NOT predicate */ class SMESH_I_EXPORT LogicalNOT_i: public virtual POA_SMESH::LogicalNOT, - public virtual Predicate_i + public virtual Predicate_i { public: LogicalNOT_i(); @@ -716,7 +716,7 @@ namespace SMESH Description : Base class for binary logical predicate */ class SMESH_I_EXPORT LogicalBinary_i: public virtual POA_SMESH::LogicalBinary, - public virtual Predicate_i + public virtual Predicate_i { public: virtual ~LogicalBinary_i(); @@ -742,7 +742,7 @@ namespace SMESH Description : Logical AND */ class SMESH_I_EXPORT LogicalAND_i: public virtual POA_SMESH::LogicalAND, - public virtual LogicalBinary_i + public virtual LogicalBinary_i { public: LogicalAND_i(); @@ -755,7 +755,7 @@ namespace SMESH Description : Logical OR */ class SMESH_I_EXPORT LogicalOR_i: public virtual POA_SMESH::LogicalOR, - public virtual LogicalBinary_i + public virtual LogicalBinary_i { public: LogicalOR_i(); @@ -767,7 +767,7 @@ namespace SMESH FILTER */ class SMESH_I_EXPORT Filter_i: public virtual POA_SMESH::Filter, - public virtual SALOME::GenericObj_i + public virtual SALOME::GenericObj_i { public: Filter_i(); @@ -792,13 +792,13 @@ namespace SMESH static void GetElementsId( Predicate_i*, - const SMDS_Mesh*, - Controls::Filter::TIdSequence& ); + const SMDS_Mesh*, + Controls::Filter::TIdSequence& ); static void GetElementsId( Predicate_i*, - SMESH_Mesh_ptr, - Controls::Filter::TIdSequence& ); + SMESH_Mesh_ptr, + Controls::Filter::TIdSequence& ); virtual long_array* @@ -833,7 +833,7 @@ namespace SMESH FILTER LIBRARY */ class SMESH_I_EXPORT FilterLibrary_i: public virtual POA_SMESH::FilterLibrary, - public virtual SALOME::GenericObj_i + public virtual SALOME::GenericObj_i { public: FilterLibrary_i( const char* theFileName ); @@ -846,8 +846,8 @@ namespace SMESH CORBA::Boolean AddEmpty( const char* theFilterName, ElementType theType ); CORBA::Boolean Delete ( const char* theFilterName ); CORBA::Boolean Replace ( const char* theFilterName, - const char* theNewName, - Filter_ptr theFilter ); + const char* theNewName, + Filter_ptr theFilter ); CORBA::Boolean Save(); CORBA::Boolean SaveAs( const char* aFileName ); @@ -871,7 +871,7 @@ namespace SMESH */ class SMESH_I_EXPORT FilterManager_i: public virtual POA_SMESH::FilterManager, - public virtual SALOME::GenericObj_i + public virtual SALOME::GenericObj_i { public: FilterManager_i(); diff --git a/src/SMESH_I/SMESH_Gen_i.cxx b/src/SMESH_I/SMESH_Gen_i.cxx index 7e85c91ea..9e041d589 100644 --- a/src/SMESH_I/SMESH_Gen_i.cxx +++ b/src/SMESH_I/SMESH_Gen_i.cxx @@ -173,11 +173,11 @@ CORBA::Object_var SMESH_Gen_i::SObjectToObject( SALOMEDS::SObject_ptr theSObject if ( !theSObject->_is_nil() ) { try { if( theSObject->FindAttribute( anAttr, "AttributeIOR" ) ) { - SALOMEDS::AttributeIOR_var anIOR = SALOMEDS::AttributeIOR::_narrow( anAttr ); - CORBA::String_var aValue = anIOR->Value(); - if( strcmp( aValue, "" ) != 0 ) - anObj = GetORB()->string_to_object( aValue ); - } + SALOMEDS::AttributeIOR_var anIOR = SALOMEDS::AttributeIOR::_narrow( anAttr ); + CORBA::String_var aValue = anIOR->Value(); + if( strcmp( aValue, "" ) != 0 ) + anObj = GetORB()->string_to_object( aValue ); + } } catch( ... ) { INFOS( "SObjectToObject - Unknown exception was caught!!!" ); @@ -260,9 +260,9 @@ SMESH_Gen_i::SMESH_Gen_i() //============================================================================= SMESH_Gen_i::SMESH_Gen_i( CORBA::ORB_ptr orb, - PortableServer::POA_ptr poa, - PortableServer::ObjectId* contId, - const char* instanceName, + PortableServer::POA_ptr poa, + PortableServer::ObjectId* contId, + const char* instanceName, const char* interfaceName ) : Engines_Component_i( orb, poa, contId, instanceName, interfaceName ) { @@ -582,13 +582,13 @@ void SMESH_Gen_i::SetCurrentStudy( SALOMEDS::Study_ptr theStudy ) SALOMEDS::SComponent_var me = SALOMEDS::SComponent::_narrow ( myCurrentStudy->FindComponent( ComponentDataType() ) ); if ( !me->_is_nil() ) { - SALOMEDS::ChildIterator_var anIter = myCurrentStudy->NewChildIterator( me ); - for ( ; anIter->More(); anIter->Next() ) { - SALOMEDS::SObject_var so = anIter->Value(); - CORBA::Object_var ior = SObjectToObject( so ); - if ( SMESH_Mesh_i* mesh = SMESH::DownCast( ior )) - mesh->CheckGeomGroupModif(); - } + SALOMEDS::ChildIterator_var anIter = myCurrentStudy->NewChildIterator( me ); + for ( ; anIter->More(); anIter->Next() ) { + SALOMEDS::SObject_var so = anIter->Value(); + CORBA::Object_var ior = SObjectToObject( so ); + if ( SMESH_Mesh_i* mesh = SMESH::DownCast( ior )) + mesh->CheckGeomGroupModif(); + } } } } @@ -943,9 +943,9 @@ SMESH::mesh_array* SMESH_Gen_i::CreateMeshesFromMED( const char* theFileName, SMESH_Mesh_i* meshServant = dynamic_cast( GetServant( mesh ).in() ); ASSERT( meshServant ); SMESH::DriverMED_ReadStatus status1 = - meshServant->ImportMEDFile( theFileName, (*it).c_str() ); + meshServant->ImportMEDFile( theFileName, (*it).c_str() ); if (status1 > theStatus) - theStatus = status1; + theStatus = status1; aResult[i++] = SMESH::SMESH_Mesh::_duplicate( mesh ); } @@ -1298,7 +1298,7 @@ SMESH::algo_error_array* SMESH_Gen_i::GetAlgoState( SMESH::SMESH_Mesh_ptr theMes //============================================================================= SMESH::long_array* SMESH_Gen_i::GetSubShapesId( GEOM::GEOM_Object_ptr theMainShapeObject, - const SMESH::object_array& theListOfSubShapeObject ) + const SMESH::object_array& theListOfSubShapeObject ) throw ( SALOME::SALOME_Exception ) { Unexpect aCatch(SALOME_SalomeException); @@ -1318,43 +1318,43 @@ SMESH::long_array* SMESH_Gen_i::GetSubShapesId( GEOM::GEOM_Object_ptr theMainSha TopExp::MapShapes(myMainShape,myIndexToShape); for ( int i = 0; i < theListOfSubShapeObject.length(); i++ ) - { - GEOM::GEOM_Object_var aShapeObject - = GEOM::GEOM_Object::_narrow(theListOfSubShapeObject[i]); - if ( CORBA::is_nil( aShapeObject ) ) - THROW_SALOME_CORBA_EXCEPTION ("bad shape object reference", \ - SALOME::BAD_PARAM ); - - TopoDS_Shape locShape = GeomObjectToShape(aShapeObject); - for (TopExp_Explorer exp(locShape,TopAbs_FACE); exp.More(); exp.Next()) - { - const TopoDS_Face& F = TopoDS::Face(exp.Current()); - setId.insert(myIndexToShape.FindIndex(F)); - if(MYDEBUG) SCRUTE(myIndexToShape.FindIndex(F)); - } - for (TopExp_Explorer exp(locShape,TopAbs_EDGE); exp.More(); exp.Next()) - { - const TopoDS_Edge& E = TopoDS::Edge(exp.Current()); - setId.insert(myIndexToShape.FindIndex(E)); - if(MYDEBUG) SCRUTE(myIndexToShape.FindIndex(E)); - } - for (TopExp_Explorer exp(locShape,TopAbs_VERTEX); exp.More(); exp.Next()) - { - const TopoDS_Vertex& V = TopoDS::Vertex(exp.Current()); - setId.insert(myIndexToShape.FindIndex(V)); - if(MYDEBUG) SCRUTE(myIndexToShape.FindIndex(V)); - } - } + { + GEOM::GEOM_Object_var aShapeObject + = GEOM::GEOM_Object::_narrow(theListOfSubShapeObject[i]); + if ( CORBA::is_nil( aShapeObject ) ) + THROW_SALOME_CORBA_EXCEPTION ("bad shape object reference", \ + SALOME::BAD_PARAM ); + + TopoDS_Shape locShape = GeomObjectToShape(aShapeObject); + for (TopExp_Explorer exp(locShape,TopAbs_FACE); exp.More(); exp.Next()) + { + const TopoDS_Face& F = TopoDS::Face(exp.Current()); + setId.insert(myIndexToShape.FindIndex(F)); + if(MYDEBUG) SCRUTE(myIndexToShape.FindIndex(F)); + } + for (TopExp_Explorer exp(locShape,TopAbs_EDGE); exp.More(); exp.Next()) + { + const TopoDS_Edge& E = TopoDS::Edge(exp.Current()); + setId.insert(myIndexToShape.FindIndex(E)); + if(MYDEBUG) SCRUTE(myIndexToShape.FindIndex(E)); + } + for (TopExp_Explorer exp(locShape,TopAbs_VERTEX); exp.More(); exp.Next()) + { + const TopoDS_Vertex& V = TopoDS::Vertex(exp.Current()); + setId.insert(myIndexToShape.FindIndex(V)); + if(MYDEBUG) SCRUTE(myIndexToShape.FindIndex(V)); + } + } shapesId->length(setId.size()); set::iterator iind; int i=0; for (iind = setId.begin(); iind != setId.end(); iind++) - { - if(MYDEBUG) SCRUTE((*iind)); - shapesId[i] = (*iind); - if(MYDEBUG) SCRUTE(shapesId[i]); - i++; - } + { + if(MYDEBUG) SCRUTE((*iind)); + shapesId[i] = (*iind); + if(MYDEBUG) SCRUTE(shapesId[i]); + i++; + } } catch (SALOME_Exception& S_ex) { @@ -1431,9 +1431,9 @@ CORBA::Boolean SMESH_Gen_i::Compute( SMESH::SMESH_Mesh_ptr theMesh, //============================================================================= SMESH::MeshPreviewStruct* SMESH_Gen_i::Precompute( SMESH::SMESH_Mesh_ptr theMesh, - GEOM::GEOM_Object_ptr theShapeObject, - SMESH::Dimension theDimension, - SMESH::long_array& theShapesId) + GEOM::GEOM_Object_ptr theShapeObject, + SMESH::Dimension theDimension, + SMESH::long_array& theShapesId) throw ( SALOME::SALOME_Exception ) { Unexpect aCatch(SALOME_SalomeException); @@ -1460,7 +1460,7 @@ SMESH::MeshPreviewStruct* SMESH_Gen_i::Precompute( SMESH::SMESH_Mesh_ptr theMesh if(theMesh->HasShapeToMesh()) myLocShape = GeomObjectToShape( theShapeObject ); else - return result._retn();; + return result._retn();; // call implementation compute ::SMESH_Mesh& myLocMesh = meshServant->GetImpl(); @@ -1468,132 +1468,132 @@ SMESH::MeshPreviewStruct* SMESH_Gen_i::Precompute( SMESH::SMESH_Mesh_ptr theMesh ::MeshDimension aDim = (MeshDimension)theDimension; if ( myGen.Compute( myLocMesh, myLocShape, false, aDim, &shapeIds ) ) { - int nbShapeId = shapeIds.size(); - theShapesId.length( nbShapeId ); - // iterates on shapes and collect mesh entities into mesh preview - TSetOfInt::const_iterator idIt = shapeIds.begin(); - TSetOfInt::const_iterator idEnd = shapeIds.end(); - std::map< int, int > mapOfShIdNb; - std::set< SMESH_TLink > setOfEdge; - std::list< SMDSAbs_ElementType > listOfElemType; - typedef map TNode2LocalIDMap; - typedef TNode2LocalIDMap::iterator TNodeLocalID; - TNode2LocalIDMap mapNode2LocalID; - list< TNodeLocalID > connectivity; - int i, nbConnNodes = 0; - std::set< const SMESH_subMesh* > setOfVSubMesh; - // iterates on shapes - for ( ; idIt != idEnd; idIt++ ) - { - if ( mapOfShIdNb.find( *idIt ) != mapOfShIdNb.end() ) - continue; - SMESH_subMesh* sm = myLocMesh.GetSubMeshContaining(*idIt); - if ( !sm || !sm->IsMeshComputed() ) - continue; - - const TopoDS_Shape& aSh = sm->GetSubShape(); - const int shDim = myGen.GetShapeDim( aSh ); - if ( shDim < 1 || shDim > theDimension ) - continue; - - mapOfShIdNb[ *idIt ] = 0; - theShapesId[ mapOfShIdNb.size() - 1 ] = *idIt; - - SMESHDS_SubMesh* smDS = sm->GetSubMeshDS(); - if ( !smDS ) continue; - - if ( theDimension == SMESH::DIM_2D ) - { - SMDS_ElemIteratorPtr faceIt = smDS->GetElements(); - while ( faceIt->more() ) - { - const SMDS_MeshElement* face = faceIt->next(); - int aNbNode = face->NbNodes(); - if ( aNbNode > 4 ) - aNbNode /= 2; // do not take into account additional middle nodes - - SMDS_MeshNode* node1 = (SMDS_MeshNode*)face->GetNode( 0 ); - for ( int nIndx = 0; nIndx < aNbNode; nIndx++ ) - { - SMDS_MeshNode* node2 = (SMDS_MeshNode*)face->GetNode( nIndx+1 < aNbNode ? nIndx+1 : 0 ); - if ( setOfEdge.insert( SMESH_TLink ( node1, node2 ) ).second ) - { - listOfElemType.push_back( SMDSAbs_Edge ); - connectivity.push_back - ( mapNode2LocalID.insert( make_pair( node1, ++nbConnNodes)).first ); - connectivity.push_back - ( mapNode2LocalID.insert( make_pair( node2, ++nbConnNodes)).first ); - } - node1 = node2; - } - } - } - else if ( theDimension == SMESH::DIM_1D ) - { - SMDS_NodeIteratorPtr nodeIt = smDS->GetNodes(); - while ( nodeIt->more() ) - { - listOfElemType.push_back( SMDSAbs_Node ); - connectivity.push_back - ( mapNode2LocalID.insert( make_pair( nodeIt->next(), ++nbConnNodes)).first ); - } - // add corner nodes by first vertex from edge - SMESH_subMeshIteratorPtr edgeSmIt = - sm->getDependsOnIterator(/*includeSelf*/false, - /*complexShapeFirst*/false); - while ( edgeSmIt->more() ) - { - SMESH_subMesh* vertexSM = edgeSmIt->next(); - // check that vertex is not already treated - if ( !setOfVSubMesh.insert( vertexSM ).second ) - continue; - if ( vertexSM->GetSubShape().ShapeType() != TopAbs_VERTEX ) - continue; - - const SMESHDS_SubMesh* vertexSmDS = vertexSM->GetSubMeshDS(); - SMDS_NodeIteratorPtr nodeIt = vertexSmDS->GetNodes(); - while ( nodeIt->more() ) - { - listOfElemType.push_back( SMDSAbs_Node ); - connectivity.push_back - ( mapNode2LocalID.insert( make_pair( nodeIt->next(), ++nbConnNodes)).first ); - } - } - } - } - - // fill node coords and assign local ids to the nodes - int nbNodes = mapNode2LocalID.size(); - result->nodesXYZ.length( nbNodes ); - TNodeLocalID node2ID = mapNode2LocalID.begin(); - for ( i = 0; i < nbNodes; ++i, ++node2ID ) { - node2ID->second = i; - const SMDS_MeshNode* node = (const SMDS_MeshNode*) node2ID->first; - result->nodesXYZ[i].x = node->X(); - result->nodesXYZ[i].y = node->Y(); - result->nodesXYZ[i].z = node->Z(); - } - // fill connectivity - result->elementConnectivities.length( nbConnNodes ); - list< TNodeLocalID >::iterator connIt = connectivity.begin(); - for ( i = 0; i < nbConnNodes; ++i, ++connIt ) { - result->elementConnectivities[i] = (*connIt)->second; - } - - // fill element types - result->elementTypes.length( listOfElemType.size() ); - std::list< SMDSAbs_ElementType >::const_iterator typeIt = listOfElemType.begin(); - std::list< SMDSAbs_ElementType >::const_iterator typeEnd = listOfElemType.end(); - for ( i = 0; typeIt != typeEnd; ++i, ++typeIt ) + int nbShapeId = shapeIds.size(); + theShapesId.length( nbShapeId ); + // iterates on shapes and collect mesh entities into mesh preview + TSetOfInt::const_iterator idIt = shapeIds.begin(); + TSetOfInt::const_iterator idEnd = shapeIds.end(); + std::map< int, int > mapOfShIdNb; + std::set< SMESH_TLink > setOfEdge; + std::list< SMDSAbs_ElementType > listOfElemType; + typedef map TNode2LocalIDMap; + typedef TNode2LocalIDMap::iterator TNodeLocalID; + TNode2LocalIDMap mapNode2LocalID; + list< TNodeLocalID > connectivity; + int i, nbConnNodes = 0; + std::set< const SMESH_subMesh* > setOfVSubMesh; + // iterates on shapes + for ( ; idIt != idEnd; idIt++ ) { - SMDSAbs_ElementType elemType = *typeIt; - result->elementTypes[i].SMDS_ElementType = (SMESH::ElementType)elemType; - result->elementTypes[i].isPoly = false; - result->elementTypes[i].nbNodesInElement = elemType == SMDSAbs_Edge ? 2 : 1; - } - - // correct number of shapes - theShapesId.length( mapOfShIdNb.size() ); + if ( mapOfShIdNb.find( *idIt ) != mapOfShIdNb.end() ) + continue; + SMESH_subMesh* sm = myLocMesh.GetSubMeshContaining(*idIt); + if ( !sm || !sm->IsMeshComputed() ) + continue; + + const TopoDS_Shape& aSh = sm->GetSubShape(); + const int shDim = myGen.GetShapeDim( aSh ); + if ( shDim < 1 || shDim > theDimension ) + continue; + + mapOfShIdNb[ *idIt ] = 0; + theShapesId[ mapOfShIdNb.size() - 1 ] = *idIt; + + SMESHDS_SubMesh* smDS = sm->GetSubMeshDS(); + if ( !smDS ) continue; + + if ( theDimension == SMESH::DIM_2D ) + { + SMDS_ElemIteratorPtr faceIt = smDS->GetElements(); + while ( faceIt->more() ) + { + const SMDS_MeshElement* face = faceIt->next(); + int aNbNode = face->NbNodes(); + if ( aNbNode > 4 ) + aNbNode /= 2; // do not take into account additional middle nodes + + SMDS_MeshNode* node1 = (SMDS_MeshNode*)face->GetNode( 0 ); + for ( int nIndx = 0; nIndx < aNbNode; nIndx++ ) + { + SMDS_MeshNode* node2 = (SMDS_MeshNode*)face->GetNode( nIndx+1 < aNbNode ? nIndx+1 : 0 ); + if ( setOfEdge.insert( SMESH_TLink ( node1, node2 ) ).second ) + { + listOfElemType.push_back( SMDSAbs_Edge ); + connectivity.push_back + ( mapNode2LocalID.insert( make_pair( node1, ++nbConnNodes)).first ); + connectivity.push_back + ( mapNode2LocalID.insert( make_pair( node2, ++nbConnNodes)).first ); + } + node1 = node2; + } + } + } + else if ( theDimension == SMESH::DIM_1D ) + { + SMDS_NodeIteratorPtr nodeIt = smDS->GetNodes(); + while ( nodeIt->more() ) + { + listOfElemType.push_back( SMDSAbs_Node ); + connectivity.push_back + ( mapNode2LocalID.insert( make_pair( nodeIt->next(), ++nbConnNodes)).first ); + } + // add corner nodes by first vertex from edge + SMESH_subMeshIteratorPtr edgeSmIt = + sm->getDependsOnIterator(/*includeSelf*/false, + /*complexShapeFirst*/false); + while ( edgeSmIt->more() ) + { + SMESH_subMesh* vertexSM = edgeSmIt->next(); + // check that vertex is not already treated + if ( !setOfVSubMesh.insert( vertexSM ).second ) + continue; + if ( vertexSM->GetSubShape().ShapeType() != TopAbs_VERTEX ) + continue; + + const SMESHDS_SubMesh* vertexSmDS = vertexSM->GetSubMeshDS(); + SMDS_NodeIteratorPtr nodeIt = vertexSmDS->GetNodes(); + while ( nodeIt->more() ) + { + listOfElemType.push_back( SMDSAbs_Node ); + connectivity.push_back + ( mapNode2LocalID.insert( make_pair( nodeIt->next(), ++nbConnNodes)).first ); + } + } + } + } + + // fill node coords and assign local ids to the nodes + int nbNodes = mapNode2LocalID.size(); + result->nodesXYZ.length( nbNodes ); + TNodeLocalID node2ID = mapNode2LocalID.begin(); + for ( i = 0; i < nbNodes; ++i, ++node2ID ) { + node2ID->second = i; + const SMDS_MeshNode* node = (const SMDS_MeshNode*) node2ID->first; + result->nodesXYZ[i].x = node->X(); + result->nodesXYZ[i].y = node->Y(); + result->nodesXYZ[i].z = node->Z(); + } + // fill connectivity + result->elementConnectivities.length( nbConnNodes ); + list< TNodeLocalID >::iterator connIt = connectivity.begin(); + for ( i = 0; i < nbConnNodes; ++i, ++connIt ) { + result->elementConnectivities[i] = (*connIt)->second; + } + + // fill element types + result->elementTypes.length( listOfElemType.size() ); + std::list< SMDSAbs_ElementType >::const_iterator typeIt = listOfElemType.begin(); + std::list< SMDSAbs_ElementType >::const_iterator typeEnd = listOfElemType.end(); + for ( i = 0; typeIt != typeEnd; ++i, ++typeIt ) + { + SMDSAbs_ElementType elemType = *typeIt; + result->elementTypes[i].SMDS_ElementType = (SMESH::ElementType)elemType; + result->elementTypes[i].isPoly = false; + result->elementTypes[i].nbNodesInElement = elemType == SMDSAbs_Edge ? 2 : 1; + } + + // correct number of shapes + theShapesId.length( mapOfShIdNb.size() ); } } } @@ -1619,7 +1619,7 @@ SMESH::MeshPreviewStruct* SMESH_Gen_i::Precompute( SMESH::SMESH_Mesh_ptr theMesh //============================================================================= SMESH::long_array* SMESH_Gen_i::Evaluate(SMESH::SMESH_Mesh_ptr theMesh, - GEOM::GEOM_Object_ptr theShapeObject) + GEOM::GEOM_Object_ptr theShapeObject) // SMESH::long_array& theNbElems) throw ( SALOME::SALOME_Exception ) { @@ -1663,10 +1663,10 @@ SMESH::long_array* SMESH_Gen_i::Evaluate(SMESH::SMESH_Mesh_ptr theMesh, /*CORBA::Boolean ret =*/ myGen.Evaluate( myLocMesh, myLocShape, aResMap); MapShapeNbElemsItr anIt = aResMap.begin(); for(; anIt!=aResMap.end(); anIt++) { - const vector& aVec = (*anIt).second; - for(i = SMESH::Entity_Node; i < SMESH::Entity_Last; i++) { - nbels[i] += aVec[i]; - } + const vector& aVec = (*anIt).second; + for(i = SMESH::Entity_Node; i < SMESH::Entity_Last; i++) { + nbels[i] += aVec[i]; + } } #ifdef _DEBUG_ cout<_is_nil() ) { GeomObjectToShape( geom ); // let geom client remember the found shape - return geom._retn(); + return geom._retn(); } } } @@ -1825,16 +1825,16 @@ SMESH_Gen_i::FindGeometryByMeshElement( SMESH::SMESH_Mesh_ptr theMesh, //================================================================================ SMESH::SMESH_Mesh_ptr SMESH_Gen_i::Concatenate(const SMESH::mesh_array& theMeshesArray, - CORBA::Boolean theUniteIdenticalGroups, - CORBA::Boolean theMergeNodesAndElements, - CORBA::Double theMergeTolerance) + CORBA::Boolean theUniteIdenticalGroups, + CORBA::Boolean theMergeNodesAndElements, + CORBA::Double theMergeTolerance) throw ( SALOME::SALOME_Exception ) { return ConcatenateCommon(theMeshesArray, - theUniteIdenticalGroups, - theMergeNodesAndElements, - theMergeTolerance, - false); + theUniteIdenticalGroups, + theMergeNodesAndElements, + theMergeTolerance, + false); } //================================================================================ @@ -1848,7 +1848,7 @@ SMESH::SMESH_Mesh_ptr SMESH_Gen_i::Concatenate(const SMESH::mesh_array& theMeshe SMESH::SMESH_Mesh_ptr SMESH_Gen_i::ConcatenateWithGroups(const SMESH::mesh_array& theMeshesArray, - CORBA::Boolean theUniteIdenticalGroups, + CORBA::Boolean theUniteIdenticalGroups, CORBA::Boolean theMergeNodesAndElements, CORBA::Double theMergeTolerance) throw ( SALOME::SALOME_Exception ) @@ -1857,7 +1857,7 @@ SMESH_Gen_i::ConcatenateWithGroups(const SMESH::mesh_array& theMeshesArray, theUniteIdenticalGroups, theMergeNodesAndElements, theMergeTolerance, - true); + true); } //================================================================================ @@ -1870,10 +1870,10 @@ SMESH_Gen_i::ConcatenateWithGroups(const SMESH::mesh_array& theMeshesArray, SMESH::SMESH_Mesh_ptr SMESH_Gen_i::ConcatenateCommon(const SMESH::mesh_array& theMeshesArray, - CORBA::Boolean theUniteIdenticalGroups, + CORBA::Boolean theUniteIdenticalGroups, CORBA::Boolean theMergeNodesAndElements, CORBA::Double theMergeTolerance, - CORBA::Boolean theCommonGroups) + CORBA::Boolean theCommonGroups) throw ( SALOME::SALOME_Exception ) { typedef map TIDsMap; @@ -1881,7 +1881,8 @@ SMESH_Gen_i::ConcatenateCommon(const SMESH::mesh_array& theMeshesArray, typedef map< pair, TListOfNewGroups > TGroupsMap; typedef std::set TGroups; - TPythonDump aPythonDump; // prevent dump of called methods + TPythonDump* pPythonDump = new TPythonDump; + TPythonDump& aPythonDump = *pPythonDump; // prevent dump of called methods // create mesh SMESH::SMESH_Mesh_var aNewMesh = CreateEmptyMesh(); @@ -1899,236 +1900,236 @@ SMESH_Gen_i::ConcatenateCommon(const SMESH::mesh_array& theMeshesArray, // loop on meshes for ( int i = 0; i < theMeshesArray.length(); i++) { - SMESH::SMESH_Mesh_var anInitMesh = theMeshesArray[i]; - if ( !anInitMesh->_is_nil() ) { - SMESH_Mesh_i* anInitImpl = dynamic_cast( GetServant( anInitMesh ).in() ); - if ( anInitImpl ) { - ::SMESH_Mesh& aInitLocMesh = anInitImpl->GetImpl(); - SMESHDS_Mesh* anInitMeshDS = aInitLocMesh.GetMeshDS(); - - TIDsMap nodesMap; - TIDsMap elemsMap; - - // loop on elements of mesh - SMDS_ElemIteratorPtr itElems = anInitMeshDS->elementsIterator(); - const SMDS_MeshElement* anElem = 0; - const SMDS_MeshElement* aNewElem = 0; - int anElemNbNodes = 0; - - int anNbNodes = 0; - int anNbEdges = 0; - int anNbFaces = 0; - int anNbVolumes = 0; - - SMESH::long_array_var anIDsNodes = new SMESH::long_array(); - SMESH::long_array_var anIDsEdges = new SMESH::long_array(); - SMESH::long_array_var anIDsFaces = new SMESH::long_array(); - SMESH::long_array_var anIDsVolumes = new SMESH::long_array(); - - if( theCommonGroups ) { - anIDsNodes->length( anInitMeshDS->NbNodes() ); - anIDsEdges->length( anInitMeshDS->NbEdges() ); - anIDsFaces->length( anInitMeshDS->NbFaces() ); - anIDsVolumes->length( anInitMeshDS->NbVolumes() ); - } - - for ( int j = 0; itElems->more(); j++) { - anElem = itElems->next(); - SMDSAbs_ElementType anElemType = anElem->GetType(); - anElemNbNodes = anElem->NbNodes(); - std::vector aNodesArray (anElemNbNodes); - - // loop on nodes of element - const SMDS_MeshNode* aNode = 0; - const SMDS_MeshNode* aNewNode = 0; - SMDS_ElemIteratorPtr itNodes = anElem->nodesIterator(); - - for ( int k = 0; itNodes->more(); k++) { - aNode = static_cast(itNodes->next()); - if ( nodesMap.find(aNode->GetID()) == nodesMap.end() ) { - aNewNode = aNewMeshDS->AddNode(aNode->X(), aNode->Y(), aNode->Z()); - nodesMap.insert( make_pair(aNode->GetID(), aNewNode->GetID()) ); - if( theCommonGroups ) - anIDsNodes[anNbNodes++] = aNewNode->GetID(); - } - else - aNewNode = aNewMeshDS->FindNode( nodesMap.find(aNode->GetID())->second ); - aNodesArray[k] = aNewNode; - }//nodes loop - - // creates a corresponding element on existent nodes in new mesh - if ( anElem->IsPoly() && anElemType == SMDSAbs_Volume ) - { - const SMDS_PolyhedralVolumeOfNodes* aVolume = - dynamic_cast (anElem); - if ( aVolume ) { - aNewElem = aNewMeshDS->AddPolyhedralVolume(aNodesArray, - aVolume->GetQuanities()); - elemsMap.insert(make_pair(anElem->GetID(), aNewElem->GetID())); - if( theCommonGroups ) - anIDsVolumes[anNbVolumes++] = aNewElem->GetID(); - } - } - else { - - aNewElem = aNewEditor.AddElement(aNodesArray, - anElemType, - anElem->IsPoly()); - elemsMap.insert(make_pair(anElem->GetID(), aNewElem->GetID())); - if( theCommonGroups ) { - if( anElemType == SMDSAbs_Edge ) - anIDsEdges[anNbEdges++] = aNewElem->GetID(); - else if( anElemType == SMDSAbs_Face ) - anIDsFaces[anNbFaces++] = aNewElem->GetID(); - else if( anElemType == SMDSAbs_Volume ) - anIDsVolumes[anNbVolumes++] = aNewElem->GetID(); - } - } - }//elems loop - - aListOfGroups = anInitImpl->GetGroups(); - SMESH::SMESH_GroupBase_ptr aGroup; - - // loop on groups of mesh - SMESH::long_array_var anInitIDs = new SMESH::long_array(); - SMESH::long_array_var anNewIDs = new SMESH::long_array(); - SMESH::SMESH_Group_var aNewGroup; - - SMESH::ElementType aGroupType; - CORBA::String_var aGroupName; - if ( theCommonGroups ) { - for(aGroupType=SMESH::NODE;aGroupType<=SMESH::VOLUME;aGroupType=(SMESH::ElementType)(aGroupType+1)) { - string str = "Gr"; - SALOMEDS::SObject_var aMeshSObj = ObjectToSObject( myCurrentStudy, anInitMesh ); - if(aMeshSObj) - str += aMeshSObj->GetName(); - str += "_"; - - int anLen = 0; - - switch(aGroupType) { - case SMESH::NODE: - str += "Nodes"; - anIDsNodes->length(anNbNodes); - anLen = anNbNodes; - break; - case SMESH::EDGE: - str += "Edges"; - anIDsEdges->length(anNbEdges); - anLen = anNbEdges; - break; - case SMESH::FACE: - str += "Faces"; - anIDsFaces->length(anNbFaces); - anLen = anNbFaces; - break; - case SMESH::VOLUME: - str += "Volumes"; - anIDsVolumes->length(anNbVolumes); - anLen = anNbVolumes; - break; - default: - break; - } - - if(anLen) { - aGroupName = str.c_str(); - - // add a new group in the mesh - aNewGroup = aNewImpl->CreateGroup(aGroupType, aGroupName); - - switch(aGroupType) { - case SMESH::NODE: - aNewGroup->Add( anIDsNodes ); - break; - case SMESH::EDGE: - aNewGroup->Add( anIDsEdges ); - break; - case SMESH::FACE: - aNewGroup->Add( anIDsFaces ); - break; - case SMESH::VOLUME: - aNewGroup->Add( anIDsVolumes ); - break; - default: - break; - } - - aListOfNewGroups.clear(); - aListOfNewGroups.push_back(aNewGroup); - aGroupsMap.insert(make_pair( make_pair(aGroupName, aGroupType), aListOfNewGroups )); - } - } - } - - // check that current group name and type don't have identical ones in union mesh - for (int i = 0; i < aListOfGroups->length(); i++) { - aGroup = aListOfGroups[i]; - aListOfNewGroups.clear(); - aGroupType = aGroup->GetType(); - aGroupName = aGroup->GetName(); - - TGroupsMap::iterator anIter = aGroupsMap.find(make_pair(aGroupName, aGroupType)); - - // convert a list of IDs - anInitIDs = aGroup->GetListOfID(); - anNewIDs->length(anInitIDs->length()); - if ( aGroupType == SMESH::NODE ) - for (int j = 0; j < anInitIDs->length(); j++) { - anNewIDs[j] = nodesMap.find(anInitIDs[j])->second; - } - else - for (int j = 0; j < anInitIDs->length(); j++) { - anNewIDs[j] = elemsMap.find(anInitIDs[j])->second; - } - - // check that current group name and type don't have identical ones in union mesh - if ( anIter == aGroupsMap.end() ) { - // add a new group in the mesh - aNewGroup = aNewImpl->CreateGroup(aGroupType, aGroupName); - // add elements into new group - aNewGroup->Add( anNewIDs ); - - aListOfNewGroups.push_back(aNewGroup); - aGroupsMap.insert(make_pair( make_pair(aGroupName, aGroupType), aListOfNewGroups )); - } - - else if ( theUniteIdenticalGroups ) { - // unite identical groups - TListOfNewGroups& aNewGroups = anIter->second; - aNewGroups.front()->Add( anNewIDs ); - } - - else { - // rename identical groups - aNewGroup = aNewImpl->CreateGroup(aGroupType, aGroupName); - aNewGroup->Add( anNewIDs ); - - TListOfNewGroups& aNewGroups = anIter->second; - string aNewGroupName; - if (aNewGroups.size() == 1) { - aNewGroupName = string(aGroupName) + "_1"; - aNewGroups.front()->SetName(aNewGroupName.c_str()); - } - char aGroupNum[128]; - sprintf(aGroupNum, "%u", aNewGroups.size()+1); - aNewGroupName = string(aGroupName) + "_" + string(aGroupNum); - aNewGroup->SetName(aNewGroupName.c_str()); - aNewGroups.push_back(aNewGroup); - } - }//groups loop - } - } + SMESH::SMESH_Mesh_var anInitMesh = theMeshesArray[i]; + if ( !anInitMesh->_is_nil() ) { + SMESH_Mesh_i* anInitImpl = dynamic_cast( GetServant( anInitMesh ).in() ); + if ( anInitImpl ) { + ::SMESH_Mesh& aInitLocMesh = anInitImpl->GetImpl(); + SMESHDS_Mesh* anInitMeshDS = aInitLocMesh.GetMeshDS(); + + TIDsMap nodesMap; + TIDsMap elemsMap; + + // loop on elements of mesh + SMDS_ElemIteratorPtr itElems = anInitMeshDS->elementsIterator(); + const SMDS_MeshElement* anElem = 0; + const SMDS_MeshElement* aNewElem = 0; + int anElemNbNodes = 0; + + int anNbNodes = 0; + int anNbEdges = 0; + int anNbFaces = 0; + int anNbVolumes = 0; + + SMESH::long_array_var anIDsNodes = new SMESH::long_array(); + SMESH::long_array_var anIDsEdges = new SMESH::long_array(); + SMESH::long_array_var anIDsFaces = new SMESH::long_array(); + SMESH::long_array_var anIDsVolumes = new SMESH::long_array(); + + if( theCommonGroups ) { + anIDsNodes->length( anInitMeshDS->NbNodes() ); + anIDsEdges->length( anInitMeshDS->NbEdges() ); + anIDsFaces->length( anInitMeshDS->NbFaces() ); + anIDsVolumes->length( anInitMeshDS->NbVolumes() ); + } + + for ( int j = 0; itElems->more(); j++) { + anElem = itElems->next(); + SMDSAbs_ElementType anElemType = anElem->GetType(); + anElemNbNodes = anElem->NbNodes(); + std::vector aNodesArray (anElemNbNodes); + + // loop on nodes of element + const SMDS_MeshNode* aNode = 0; + const SMDS_MeshNode* aNewNode = 0; + SMDS_ElemIteratorPtr itNodes = anElem->nodesIterator(); + + for ( int k = 0; itNodes->more(); k++) { + aNode = static_cast(itNodes->next()); + if ( nodesMap.find(aNode->GetID()) == nodesMap.end() ) { + aNewNode = aNewMeshDS->AddNode(aNode->X(), aNode->Y(), aNode->Z()); + nodesMap.insert( make_pair(aNode->GetID(), aNewNode->GetID()) ); + if( theCommonGroups ) + anIDsNodes[anNbNodes++] = aNewNode->GetID(); + } + else + aNewNode = aNewMeshDS->FindNode( nodesMap.find(aNode->GetID())->second ); + aNodesArray[k] = aNewNode; + }//nodes loop + + // creates a corresponding element on existent nodes in new mesh + if ( anElem->IsPoly() && anElemType == SMDSAbs_Volume ) + { + const SMDS_PolyhedralVolumeOfNodes* aVolume = + dynamic_cast (anElem); + if ( aVolume ) { + aNewElem = aNewMeshDS->AddPolyhedralVolume(aNodesArray, + aVolume->GetQuanities()); + elemsMap.insert(make_pair(anElem->GetID(), aNewElem->GetID())); + if( theCommonGroups ) + anIDsVolumes[anNbVolumes++] = aNewElem->GetID(); + } + } + else { + + aNewElem = aNewEditor.AddElement(aNodesArray, + anElemType, + anElem->IsPoly()); + elemsMap.insert(make_pair(anElem->GetID(), aNewElem->GetID())); + if( theCommonGroups ) { + if( anElemType == SMDSAbs_Edge ) + anIDsEdges[anNbEdges++] = aNewElem->GetID(); + else if( anElemType == SMDSAbs_Face ) + anIDsFaces[anNbFaces++] = aNewElem->GetID(); + else if( anElemType == SMDSAbs_Volume ) + anIDsVolumes[anNbVolumes++] = aNewElem->GetID(); + } + } + }//elems loop + + aListOfGroups = anInitImpl->GetGroups(); + SMESH::SMESH_GroupBase_ptr aGroup; + + // loop on groups of mesh + SMESH::long_array_var anInitIDs = new SMESH::long_array(); + SMESH::long_array_var anNewIDs = new SMESH::long_array(); + SMESH::SMESH_Group_var aNewGroup; + + SMESH::ElementType aGroupType; + CORBA::String_var aGroupName; + if ( theCommonGroups ) { + for(aGroupType=SMESH::NODE;aGroupType<=SMESH::VOLUME;aGroupType=(SMESH::ElementType)(aGroupType+1)) { + string str = "Gr"; + SALOMEDS::SObject_var aMeshSObj = ObjectToSObject( myCurrentStudy, anInitMesh ); + if(aMeshSObj) + str += aMeshSObj->GetName(); + str += "_"; + + int anLen = 0; + + switch(aGroupType) { + case SMESH::NODE: + str += "Nodes"; + anIDsNodes->length(anNbNodes); + anLen = anNbNodes; + break; + case SMESH::EDGE: + str += "Edges"; + anIDsEdges->length(anNbEdges); + anLen = anNbEdges; + break; + case SMESH::FACE: + str += "Faces"; + anIDsFaces->length(anNbFaces); + anLen = anNbFaces; + break; + case SMESH::VOLUME: + str += "Volumes"; + anIDsVolumes->length(anNbVolumes); + anLen = anNbVolumes; + break; + default: + break; + } + + if(anLen) { + aGroupName = str.c_str(); + + // add a new group in the mesh + aNewGroup = aNewImpl->CreateGroup(aGroupType, aGroupName); + + switch(aGroupType) { + case SMESH::NODE: + aNewGroup->Add( anIDsNodes ); + break; + case SMESH::EDGE: + aNewGroup->Add( anIDsEdges ); + break; + case SMESH::FACE: + aNewGroup->Add( anIDsFaces ); + break; + case SMESH::VOLUME: + aNewGroup->Add( anIDsVolumes ); + break; + default: + break; + } + + aListOfNewGroups.clear(); + aListOfNewGroups.push_back(aNewGroup); + aGroupsMap.insert(make_pair( make_pair(aGroupName, aGroupType), aListOfNewGroups )); + } + } + } + + // check that current group name and type don't have identical ones in union mesh + for (int i = 0; i < aListOfGroups->length(); i++) { + aGroup = aListOfGroups[i]; + aListOfNewGroups.clear(); + aGroupType = aGroup->GetType(); + aGroupName = aGroup->GetName(); + + TGroupsMap::iterator anIter = aGroupsMap.find(make_pair(aGroupName, aGroupType)); + + // convert a list of IDs + anInitIDs = aGroup->GetListOfID(); + anNewIDs->length(anInitIDs->length()); + if ( aGroupType == SMESH::NODE ) + for (int j = 0; j < anInitIDs->length(); j++) { + anNewIDs[j] = nodesMap.find(anInitIDs[j])->second; + } + else + for (int j = 0; j < anInitIDs->length(); j++) { + anNewIDs[j] = elemsMap.find(anInitIDs[j])->second; + } + + // check that current group name and type don't have identical ones in union mesh + if ( anIter == aGroupsMap.end() ) { + // add a new group in the mesh + aNewGroup = aNewImpl->CreateGroup(aGroupType, aGroupName); + // add elements into new group + aNewGroup->Add( anNewIDs ); + + aListOfNewGroups.push_back(aNewGroup); + aGroupsMap.insert(make_pair( make_pair(aGroupName, aGroupType), aListOfNewGroups )); + } + + else if ( theUniteIdenticalGroups ) { + // unite identical groups + TListOfNewGroups& aNewGroups = anIter->second; + aNewGroups.front()->Add( anNewIDs ); + } + + else { + // rename identical groups + aNewGroup = aNewImpl->CreateGroup(aGroupType, aGroupName); + aNewGroup->Add( anNewIDs ); + + TListOfNewGroups& aNewGroups = anIter->second; + string aNewGroupName; + if (aNewGroups.size() == 1) { + aNewGroupName = string(aGroupName) + "_1"; + aNewGroups.front()->SetName(aNewGroupName.c_str()); + } + char aGroupNum[128]; + sprintf(aGroupNum, "%u", aNewGroups.size()+1); + aNewGroupName = string(aGroupName) + "_" + string(aGroupNum); + aNewGroup->SetName(aNewGroupName.c_str()); + aNewGroups.push_back(aNewGroup); + } + }//groups loop + } + } }//meshes loop if (theMergeNodesAndElements) { - // merge nodes - set aMeshNodes; // no input nodes - SMESH_MeshEditor::TListOfListOfNodes aGroupsOfNodes; - aNewEditor.FindCoincidentNodes( aMeshNodes, theMergeTolerance, aGroupsOfNodes ); - aNewEditor.MergeNodes( aGroupsOfNodes ); - // merge elements - aNewEditor.MergeEqualElements(); + // merge nodes + set aMeshNodes; // no input nodes + SMESH_MeshEditor::TListOfListOfNodes aGroupsOfNodes; + aNewEditor.FindCoincidentNodes( aMeshNodes, theMergeTolerance, aGroupsOfNodes ); + aNewEditor.MergeNodes( aGroupsOfNodes ); + // merge elements + aNewEditor.MergeEqualElements(); } } } @@ -2146,9 +2147,27 @@ SMESH_Gen_i::ConcatenateCommon(const SMESH::mesh_array& theMeshesArray, } aPythonDump << "], "; aPythonDump << theUniteIdenticalGroups << ", " - << theMergeNodesAndElements << ", " + << theMergeNodesAndElements << ", " << theMergeTolerance << ")"; + delete pPythonDump; // enable python dump from GetGroups() + + // 0020577: EDF 1164 SMESH: Bad dump of concatenate with create common groups + if ( !aNewMesh->_is_nil() ) + { + SMESH::ListOfGroups_var groups = aNewMesh->GetGroups(); + } + + // IPAL21468 Change icon of compound because it need not be computed. + SALOMEDS::SObject_var aMeshSObj = ObjectToSObject( myCurrentStudy, aNewMesh ); + if( !aMeshSObj->_is_nil() ) { + SALOMEDS::GenericAttribute_var anAttr; + SALOMEDS::StudyBuilder_var aBuilder = myCurrentStudy->NewBuilder(); + anAttr = aBuilder->FindOrCreateAttribute( aMeshSObj,"AttributePixMap" ); + SALOMEDS::AttributePixMap_var aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr); + aPixmap->SetPixMap("ICON_SMESH_TREE_MESH"); + } + return aNewMesh._retn(); } @@ -2411,17 +2430,17 @@ SALOMEDS::TMPFile* SMESH_Gen_i::Save( SALOMEDS::SComponent_ptr theComponent, aDataset->WriteOnDisk( ( char* )( strHasData.c_str() ) ); aDataset->CloseOnDisk(); - // ouv : NPAL12872 + // ouv : NPAL12872 // for each mesh open the HDF group basing on its auto color parameter - char meshAutoColorName[ 30 ]; - sprintf( meshAutoColorName, "AutoColorMesh %d", id ); - int anAutoColor[1]; - anAutoColor[0] = myImpl->GetAutoColor(); - aSize[ 0 ] = 1; - aDataset = new HDFdataset( meshAutoColorName, aTopGroup, HDF_INT32, aSize, 1 ); - aDataset->CreateOnDisk(); - aDataset->WriteOnDisk( anAutoColor ); - aDataset->CloseOnDisk(); + char meshAutoColorName[ 30 ]; + sprintf( meshAutoColorName, "AutoColorMesh %d", id ); + int anAutoColor[1]; + anAutoColor[0] = myImpl->GetAutoColor(); + aSize[ 0 ] = 1; + aDataset = new HDFdataset( meshAutoColorName, aTopGroup, HDF_INT32, aSize, 1 ); + aDataset->CreateOnDisk(); + aDataset->WriteOnDisk( anAutoColor ); + aDataset->CloseOnDisk(); // write reference on a shape if exists SALOMEDS::SObject_var myRef; @@ -2705,328 +2724,328 @@ SALOMEDS::TMPFile* SMESH_Gen_i::Save( SALOMEDS::SComponent_ptr theComponent, //if ( shapeRefFound ) //myWriter.AddAllSubMeshes(); - // groups root sub-branch - SALOMEDS::SObject_var myGroupsBranch; - for ( int i = GetNodeGroupsTag(); i <= GetVolumeGroupsTag(); i++ ) { - found = gotBranch->FindSubObject( i, myGroupsBranch ); - if ( found ) { - char name_group[ 30 ]; - if ( i == GetNodeGroupsTag() ) - strcpy( name_group, "Groups of Nodes" ); - else if ( i == GetEdgeGroupsTag() ) - strcpy( name_group, "Groups of Edges" ); - else if ( i == GetFaceGroupsTag() ) - strcpy( name_group, "Groups of Faces" ); - else if ( i == GetVolumeGroupsTag() ) - strcpy( name_group, "Groups of Volumes" ); - - aGroup = new HDFgroup( name_group, aTopGroup ); - aGroup->CreateOnDisk(); - - SALOMEDS::ChildIterator_var it = myCurrentStudy->NewChildIterator( myGroupsBranch ); - for ( ; it->More(); it->Next() ) { - SALOMEDS::SObject_var mySObject = it->Value(); - CORBA::Object_var aSubObject = SObjectToObject( mySObject ); - if ( !CORBA::is_nil( aSubObject ) ) { - SMESH_GroupBase_i* myGroupImpl = - dynamic_cast( GetServant( aSubObject ).in() ); - if ( !myGroupImpl ) - continue; - - CORBA::String_var objStr = GetORB()->object_to_string( aSubObject ); - int anId = myStudyContext->findId( string( objStr.in() ) ); - - // For each group, create a dataset named "Group " - // and store the group's user name into it - char grpName[ 30 ]; - sprintf( grpName, "Group %d", anId ); - char* aUserName = myGroupImpl->GetName(); - aSize[ 0 ] = strlen( aUserName ) + 1; - - aDataset = new HDFdataset( grpName, aGroup, HDF_STRING, aSize, 1 ); - aDataset->CreateOnDisk(); - aDataset->WriteOnDisk( aUserName ); - aDataset->CloseOnDisk(); - - // ouv : NPAL12872 - // For each group, create a dataset named "Group Color" - // and store the group's color into it - char grpColorName[ 30 ]; - sprintf( grpColorName, "ColorGroup %d", anId ); - SALOMEDS::Color aColor = myGroupImpl->GetColor(); - double anRGB[3]; - anRGB[ 0 ] = aColor.R; - anRGB[ 1 ] = aColor.G; - anRGB[ 2 ] = aColor.B; - aSize[ 0 ] = 3; - aDataset = new HDFdataset( grpColorName, aGroup, HDF_FLOAT64, aSize, 1 ); - aDataset->CreateOnDisk(); - aDataset->WriteOnDisk( anRGB ); - aDataset->CloseOnDisk(); - - // Store the group contents into MED file - if ( myLocMesh.GetGroup( myGroupImpl->GetLocalID() ) ) { - - if(MYDEBUG) MESSAGE( "VSR - SMESH_Gen_i::Save(): saving group with StoreName = " - << grpName << " to MED file" ); - SMESHDS_GroupBase* aGrpBaseDS = - myLocMesh.GetGroup( myGroupImpl->GetLocalID() )->GetGroupDS(); - aGrpBaseDS->SetStoreName( grpName ); - - // Pass SMESHDS_Group to MED writer - SMESHDS_Group* aGrpDS = dynamic_cast( aGrpBaseDS ); - if ( aGrpDS ) - myWriter.AddGroup( aGrpDS ); - - // write reference on a shape if exists - SMESHDS_GroupOnGeom* aGeomGrp = - dynamic_cast( aGrpBaseDS ); - if ( aGeomGrp ) { - SALOMEDS::SObject_var mySubRef, myShape; - if (mySObject->FindSubObject( GetRefOnShapeTag(), mySubRef ) && - mySubRef->ReferencedObject( myShape ) && - !CORBA::is_nil( myShape->GetObject() )) - { - string myRefOnObject = myShape->GetID(); - if ( myRefOnObject.length() > 0 ) { - char aRefName[ 30 ]; - sprintf( aRefName, "Ref on shape %d", anId); - aSize[ 0 ] = myRefOnObject.length() + 1; - aDataset = new HDFdataset(aRefName, aGroup, HDF_STRING, aSize, 1); - aDataset->CreateOnDisk(); - aDataset->WriteOnDisk( ( char* )( myRefOnObject.c_str() ) ); - aDataset->CloseOnDisk(); - } - } - else // shape ref is invalid: - { - // save a group on geometry as ordinary group - myWriter.AddGroup( aGeomGrp ); - } - } - } - } - } - aGroup->CloseOnDisk(); - } - } // loop on groups - - if ( strcmp( strHasData.c_str(), "1" ) == 0 ) - { - // Flush current mesh information into MED file - myWriter.Perform(); - - // maybe a shape was deleted in the study - if ( !shapeRefFound && !mySMESHDSMesh->ShapeToMesh().IsNull() && hasShape) { - TopoDS_Shape nullShape; - myLocMesh.ShapeToMesh( nullShape ); // remove shape referring data - } - - if ( !mySMESHDSMesh->SubMeshes().empty() ) - { - // Store submeshes - // ---------------- - aGroup = new HDFgroup( "Submeshes", aTopGroup ); - aGroup->CreateOnDisk(); - - // each element belongs to one or none submesh, - // so for each node/element, we store a submesh ID - - // Make maps of submesh IDs of elements sorted by element IDs - typedef int TElemID; - typedef int TSubMID; - map< TElemID, TSubMID > eId2smId, nId2smId; - map< TElemID, TSubMID >::iterator hint; // insertion to map is done before hint - const map& aSubMeshes = mySMESHDSMesh->SubMeshes(); - map::const_iterator itSubM ( aSubMeshes.begin() ); - SMDS_NodeIteratorPtr itNode; - SMDS_ElemIteratorPtr itElem; - for ( itSubM = aSubMeshes.begin(); itSubM != aSubMeshes.end() ; itSubM++ ) - { - TSubMID aSubMeID = itSubM->first; - SMESHDS_SubMesh* aSubMesh = itSubM->second; - if ( aSubMesh->IsComplexSubmesh() ) - continue; // submesh containing other submeshs - // nodes - hint = nId2smId.begin(); // optimize insertion basing on increasing order of elem Ids in submesh - for ( itNode = aSubMesh->GetNodes(); itNode->more(); ++hint) - hint = nId2smId.insert( hint, make_pair( itNode->next()->GetID(), aSubMeID )); + // groups root sub-branch + SALOMEDS::SObject_var myGroupsBranch; + for ( int i = GetNodeGroupsTag(); i <= GetVolumeGroupsTag(); i++ ) { + found = gotBranch->FindSubObject( i, myGroupsBranch ); + if ( found ) { + char name_group[ 30 ]; + if ( i == GetNodeGroupsTag() ) + strcpy( name_group, "Groups of Nodes" ); + else if ( i == GetEdgeGroupsTag() ) + strcpy( name_group, "Groups of Edges" ); + else if ( i == GetFaceGroupsTag() ) + strcpy( name_group, "Groups of Faces" ); + else if ( i == GetVolumeGroupsTag() ) + strcpy( name_group, "Groups of Volumes" ); + + aGroup = new HDFgroup( name_group, aTopGroup ); + aGroup->CreateOnDisk(); + + SALOMEDS::ChildIterator_var it = myCurrentStudy->NewChildIterator( myGroupsBranch ); + for ( ; it->More(); it->Next() ) { + SALOMEDS::SObject_var mySObject = it->Value(); + CORBA::Object_var aSubObject = SObjectToObject( mySObject ); + if ( !CORBA::is_nil( aSubObject ) ) { + SMESH_GroupBase_i* myGroupImpl = + dynamic_cast( GetServant( aSubObject ).in() ); + if ( !myGroupImpl ) + continue; + + CORBA::String_var objStr = GetORB()->object_to_string( aSubObject ); + int anId = myStudyContext->findId( string( objStr.in() ) ); + + // For each group, create a dataset named "Group " + // and store the group's user name into it + char grpName[ 30 ]; + sprintf( grpName, "Group %d", anId ); + char* aUserName = myGroupImpl->GetName(); + aSize[ 0 ] = strlen( aUserName ) + 1; + + aDataset = new HDFdataset( grpName, aGroup, HDF_STRING, aSize, 1 ); + aDataset->CreateOnDisk(); + aDataset->WriteOnDisk( aUserName ); + aDataset->CloseOnDisk(); + + // ouv : NPAL12872 + // For each group, create a dataset named "Group Color" + // and store the group's color into it + char grpColorName[ 30 ]; + sprintf( grpColorName, "ColorGroup %d", anId ); + SALOMEDS::Color aColor = myGroupImpl->GetColor(); + double anRGB[3]; + anRGB[ 0 ] = aColor.R; + anRGB[ 1 ] = aColor.G; + anRGB[ 2 ] = aColor.B; + aSize[ 0 ] = 3; + aDataset = new HDFdataset( grpColorName, aGroup, HDF_FLOAT64, aSize, 1 ); + aDataset->CreateOnDisk(); + aDataset->WriteOnDisk( anRGB ); + aDataset->CloseOnDisk(); + + // Store the group contents into MED file + if ( myLocMesh.GetGroup( myGroupImpl->GetLocalID() ) ) { + + if(MYDEBUG) MESSAGE( "VSR - SMESH_Gen_i::Save(): saving group with StoreName = " + << grpName << " to MED file" ); + SMESHDS_GroupBase* aGrpBaseDS = + myLocMesh.GetGroup( myGroupImpl->GetLocalID() )->GetGroupDS(); + aGrpBaseDS->SetStoreName( grpName ); + + // Pass SMESHDS_Group to MED writer + SMESHDS_Group* aGrpDS = dynamic_cast( aGrpBaseDS ); + if ( aGrpDS ) + myWriter.AddGroup( aGrpDS ); + + // write reference on a shape if exists + SMESHDS_GroupOnGeom* aGeomGrp = + dynamic_cast( aGrpBaseDS ); + if ( aGeomGrp ) { + SALOMEDS::SObject_var mySubRef, myShape; + if (mySObject->FindSubObject( GetRefOnShapeTag(), mySubRef ) && + mySubRef->ReferencedObject( myShape ) && + !CORBA::is_nil( myShape->GetObject() )) + { + string myRefOnObject = myShape->GetID(); + if ( myRefOnObject.length() > 0 ) { + char aRefName[ 30 ]; + sprintf( aRefName, "Ref on shape %d", anId); + aSize[ 0 ] = myRefOnObject.length() + 1; + aDataset = new HDFdataset(aRefName, aGroup, HDF_STRING, aSize, 1); + aDataset->CreateOnDisk(); + aDataset->WriteOnDisk( ( char* )( myRefOnObject.c_str() ) ); + aDataset->CloseOnDisk(); + } + } + else // shape ref is invalid: + { + // save a group on geometry as ordinary group + myWriter.AddGroup( aGeomGrp ); + } + } + } + } + } + aGroup->CloseOnDisk(); + } + } // loop on groups + + if ( strcmp( strHasData.c_str(), "1" ) == 0 ) + { + // Flush current mesh information into MED file + myWriter.Perform(); + + // maybe a shape was deleted in the study + if ( !shapeRefFound && !mySMESHDSMesh->ShapeToMesh().IsNull() && hasShape) { + TopoDS_Shape nullShape; + myLocMesh.ShapeToMesh( nullShape ); // remove shape referring data + } + + if ( !mySMESHDSMesh->SubMeshes().empty() ) + { + // Store submeshes + // ---------------- + aGroup = new HDFgroup( "Submeshes", aTopGroup ); + aGroup->CreateOnDisk(); + + // each element belongs to one or none submesh, + // so for each node/element, we store a submesh ID + + // Make maps of submesh IDs of elements sorted by element IDs + typedef int TElemID; + typedef int TSubMID; + map< TElemID, TSubMID > eId2smId, nId2smId; + map< TElemID, TSubMID >::iterator hint; // insertion to map is done before hint + const map& aSubMeshes = mySMESHDSMesh->SubMeshes(); + map::const_iterator itSubM ( aSubMeshes.begin() ); + SMDS_NodeIteratorPtr itNode; + SMDS_ElemIteratorPtr itElem; + for ( itSubM = aSubMeshes.begin(); itSubM != aSubMeshes.end() ; itSubM++ ) + { + TSubMID aSubMeID = itSubM->first; + SMESHDS_SubMesh* aSubMesh = itSubM->second; + if ( aSubMesh->IsComplexSubmesh() ) + continue; // submesh containing other submeshs + // nodes + hint = nId2smId.begin(); // optimize insertion basing on increasing order of elem Ids in submesh + for ( itNode = aSubMesh->GetNodes(); itNode->more(); ++hint) + hint = nId2smId.insert( hint, make_pair( itNode->next()->GetID(), aSubMeID )); // elements - hint = eId2smId.begin(); - for ( itElem = aSubMesh->GetElements(); itElem->more(); ++hint) - hint = eId2smId.insert( hint, make_pair( itElem->next()->GetID(), aSubMeID )); - } - - // Care of elements that are not on submeshes - if ( mySMESHDSMesh->NbNodes() != nId2smId.size() ) { - for ( itNode = mySMESHDSMesh->nodesIterator(); itNode->more(); ) - /* --- stl_map.h says : */ - /* A %map relies on unique keys and thus a %pair is only inserted if its */ - /* first element (the key) is not already present in the %map. */ - nId2smId.insert( make_pair( itNode->next()->GetID(), 0 )); - } - int nbElems = mySMESHDSMesh->NbEdges() + mySMESHDSMesh->NbFaces() + mySMESHDSMesh->NbVolumes(); - if ( nbElems != eId2smId.size() ) { - for ( itElem = mySMESHDSMesh->elementsIterator(); itElem->more(); ) - eId2smId.insert( make_pair( itElem->next()->GetID(), 0 )); - } - - // Store submesh IDs - for ( int isNode = 0; isNode < 2; ++isNode ) - { - map< TElemID, TSubMID >& id2smId = isNode ? nId2smId : eId2smId; - if ( id2smId.empty() ) continue; - map< TElemID, TSubMID >::const_iterator id_smId = id2smId.begin(); - // make and fill array of submesh IDs - int* smIDs = new int [ id2smId.size() ]; - for ( int i = 0; id_smId != id2smId.end(); ++id_smId, ++i ) - smIDs[ i ] = id_smId->second; - // write HDF group - aSize[ 0 ] = id2smId.size(); - string aDSName( isNode ? "Node Submeshes" : "Element Submeshes"); - aDataset = new HDFdataset( (char*)aDSName.c_str(), aGroup, HDF_INT32, aSize, 1 ); - aDataset->CreateOnDisk(); - aDataset->WriteOnDisk( smIDs ); - aDataset->CloseOnDisk(); - // - delete smIDs; - } + hint = eId2smId.begin(); + for ( itElem = aSubMesh->GetElements(); itElem->more(); ++hint) + hint = eId2smId.insert( hint, make_pair( itElem->next()->GetID(), aSubMeID )); + } + + // Care of elements that are not on submeshes + if ( mySMESHDSMesh->NbNodes() != nId2smId.size() ) { + for ( itNode = mySMESHDSMesh->nodesIterator(); itNode->more(); ) + /* --- stl_map.h says : */ + /* A %map relies on unique keys and thus a %pair is only inserted if its */ + /* first element (the key) is not already present in the %map. */ + nId2smId.insert( make_pair( itNode->next()->GetID(), 0 )); + } + int nbElems = mySMESHDSMesh->NbEdges() + mySMESHDSMesh->NbFaces() + mySMESHDSMesh->NbVolumes(); + if ( nbElems != eId2smId.size() ) { + for ( itElem = mySMESHDSMesh->elementsIterator(); itElem->more(); ) + eId2smId.insert( make_pair( itElem->next()->GetID(), 0 )); + } + + // Store submesh IDs + for ( int isNode = 0; isNode < 2; ++isNode ) + { + map< TElemID, TSubMID >& id2smId = isNode ? nId2smId : eId2smId; + if ( id2smId.empty() ) continue; + map< TElemID, TSubMID >::const_iterator id_smId = id2smId.begin(); + // make and fill array of submesh IDs + int* smIDs = new int [ id2smId.size() ]; + for ( int i = 0; id_smId != id2smId.end(); ++id_smId, ++i ) + smIDs[ i ] = id_smId->second; + // write HDF group + aSize[ 0 ] = id2smId.size(); + string aDSName( isNode ? "Node Submeshes" : "Element Submeshes"); + aDataset = new HDFdataset( (char*)aDSName.c_str(), aGroup, HDF_INT32, aSize, 1 ); + aDataset->CreateOnDisk(); + aDataset->WriteOnDisk( smIDs ); + aDataset->CloseOnDisk(); + // + delete smIDs; + } + + // Store node positions on sub-shapes (SMDS_Position): + // ---------------------------------------------------- + + aGroup = new HDFgroup( "Node Positions", aTopGroup ); + aGroup->CreateOnDisk(); + + // in aGroup, create 5 datasets to contain: + // "Nodes on Edges" - ID of node on edge + // "Edge positions" - U parameter on node on edge + // "Nodes on Faces" - ID of node on face + // "Face U positions" - U parameter of node on face + // "Face V positions" - V parameter of node on face - // Store node positions on sub-shapes (SMDS_Position): - // ---------------------------------------------------- - - aGroup = new HDFgroup( "Node Positions", aTopGroup ); - aGroup->CreateOnDisk(); - - // in aGroup, create 5 datasets to contain: - // "Nodes on Edges" - ID of node on edge - // "Edge positions" - U parameter on node on edge - // "Nodes on Faces" - ID of node on face - // "Face U positions" - U parameter of node on face - // "Face V positions" - V parameter of node on face - - // Find out nb of nodes on edges and faces - // Collect corresponing sub-meshes - int nbEdgeNodes = 0, nbFaceNodes = 0; - list aEdgeSM, aFaceSM; - // loop on SMESHDS_SubMesh'es - for ( itSubM = aSubMeshes.begin(); itSubM != aSubMeshes.end() ; itSubM++ ) - { - SMESHDS_SubMesh* aSubMesh = (*itSubM).second; - if ( aSubMesh->IsComplexSubmesh() ) - continue; // submesh containing other submeshs - int nbNodes = aSubMesh->NbNodes(); - if ( nbNodes == 0 ) continue; - - int aShapeID = (*itSubM).first; - int aShapeType = mySMESHDSMesh->IndexToShape( aShapeID ).ShapeType(); - // write only SMDS_FacePosition and SMDS_EdgePosition - switch ( aShapeType ) { - case TopAbs_FACE: - nbFaceNodes += nbNodes; - aFaceSM.push_back( aSubMesh ); - break; - case TopAbs_EDGE: - nbEdgeNodes += nbNodes; - aEdgeSM.push_back( aSubMesh ); - break; - default: - continue; - } - } - // Treat positions on edges or faces - for ( int onFace = 0; onFace < 2; onFace++ ) - { - // Create arrays to store in datasets - int iNode = 0, nbNodes = ( onFace ? nbFaceNodes : nbEdgeNodes ); - if (!nbNodes) continue; - int* aNodeIDs = new int [ nbNodes ]; - double* aUPos = new double [ nbNodes ]; - double* aVPos = ( onFace ? new double[ nbNodes ] : 0 ); - - // Fill arrays - // loop on sub-meshes - list * pListSM = ( onFace ? &aFaceSM : &aEdgeSM ); - list::iterator itSM = pListSM->begin(); - for ( ; itSM != pListSM->end(); itSM++ ) - { - SMESHDS_SubMesh* aSubMesh = (*itSM); - - SMDS_NodeIteratorPtr itNode = aSubMesh->GetNodes(); - // loop on nodes in aSubMesh - while ( itNode->more() ) - { - //node ID - const SMDS_MeshNode* node = itNode->next(); - aNodeIDs [ iNode ] = node->GetID(); - - // Position - const SMDS_PositionPtr pos = node->GetPosition(); - if ( onFace ) { // on FACE - const SMDS_FacePosition* fPos = - dynamic_cast( pos.get() ); - if ( fPos ) { - aUPos[ iNode ] = fPos->GetUParameter(); - aVPos[ iNode ] = fPos->GetVParameter(); - iNode++; - } - else - nbNodes--; - } - else { // on EDGE - const SMDS_EdgePosition* ePos = - dynamic_cast( pos.get() ); - if ( ePos ) { - aUPos[ iNode ] = ePos->GetUParameter(); - iNode++; - } - else - nbNodes--; - } - } // loop on nodes in aSubMesh - } // loop on sub-meshes - - // Write datasets - if ( nbNodes ) - { - aSize[ 0 ] = nbNodes; - // IDS - string aDSName( onFace ? "Nodes on Faces" : "Nodes on Edges"); - aDataset = new HDFdataset( (char*)aDSName.c_str(), aGroup, HDF_INT32, aSize, 1 ); - aDataset->CreateOnDisk(); - aDataset->WriteOnDisk( aNodeIDs ); - aDataset->CloseOnDisk(); - - // U Positions - aDSName = ( onFace ? "Face U positions" : "Edge positions"); - aDataset = new HDFdataset( (char*)aDSName.c_str(), aGroup, HDF_FLOAT64, aSize, 1); - aDataset->CreateOnDisk(); - aDataset->WriteOnDisk( aUPos ); - aDataset->CloseOnDisk(); - // V Positions - if ( onFace ) { - aDataset = new HDFdataset( "Face V positions", aGroup, HDF_FLOAT64, aSize, 1); - aDataset->CreateOnDisk(); - aDataset->WriteOnDisk( aVPos ); - aDataset->CloseOnDisk(); - } - } - delete [] aNodeIDs; - delete [] aUPos; - if ( aVPos ) delete [] aVPos; - - } // treat positions on edges or faces - - // close "Node Positions" group - aGroup->CloseOnDisk(); - - } // if ( there are submeshes in SMESHDS_Mesh ) - } // if ( hasData ) - - // close mesh HDF group - aTopGroup->CloseOnDisk(); - } - } + // Find out nb of nodes on edges and faces + // Collect corresponing sub-meshes + int nbEdgeNodes = 0, nbFaceNodes = 0; + list aEdgeSM, aFaceSM; + // loop on SMESHDS_SubMesh'es + for ( itSubM = aSubMeshes.begin(); itSubM != aSubMeshes.end() ; itSubM++ ) + { + SMESHDS_SubMesh* aSubMesh = (*itSubM).second; + if ( aSubMesh->IsComplexSubmesh() ) + continue; // submesh containing other submeshs + int nbNodes = aSubMesh->NbNodes(); + if ( nbNodes == 0 ) continue; + + int aShapeID = (*itSubM).first; + int aShapeType = mySMESHDSMesh->IndexToShape( aShapeID ).ShapeType(); + // write only SMDS_FacePosition and SMDS_EdgePosition + switch ( aShapeType ) { + case TopAbs_FACE: + nbFaceNodes += nbNodes; + aFaceSM.push_back( aSubMesh ); + break; + case TopAbs_EDGE: + nbEdgeNodes += nbNodes; + aEdgeSM.push_back( aSubMesh ); + break; + default: + continue; + } + } + // Treat positions on edges or faces + for ( int onFace = 0; onFace < 2; onFace++ ) + { + // Create arrays to store in datasets + int iNode = 0, nbNodes = ( onFace ? nbFaceNodes : nbEdgeNodes ); + if (!nbNodes) continue; + int* aNodeIDs = new int [ nbNodes ]; + double* aUPos = new double [ nbNodes ]; + double* aVPos = ( onFace ? new double[ nbNodes ] : 0 ); + + // Fill arrays + // loop on sub-meshes + list * pListSM = ( onFace ? &aFaceSM : &aEdgeSM ); + list::iterator itSM = pListSM->begin(); + for ( ; itSM != pListSM->end(); itSM++ ) + { + SMESHDS_SubMesh* aSubMesh = (*itSM); + + SMDS_NodeIteratorPtr itNode = aSubMesh->GetNodes(); + // loop on nodes in aSubMesh + while ( itNode->more() ) + { + //node ID + const SMDS_MeshNode* node = itNode->next(); + aNodeIDs [ iNode ] = node->GetID(); + + // Position + const SMDS_PositionPtr pos = node->GetPosition(); + if ( onFace ) { // on FACE + const SMDS_FacePosition* fPos = + dynamic_cast( pos.get() ); + if ( fPos ) { + aUPos[ iNode ] = fPos->GetUParameter(); + aVPos[ iNode ] = fPos->GetVParameter(); + iNode++; + } + else + nbNodes--; + } + else { // on EDGE + const SMDS_EdgePosition* ePos = + dynamic_cast( pos.get() ); + if ( ePos ) { + aUPos[ iNode ] = ePos->GetUParameter(); + iNode++; + } + else + nbNodes--; + } + } // loop on nodes in aSubMesh + } // loop on sub-meshes + + // Write datasets + if ( nbNodes ) + { + aSize[ 0 ] = nbNodes; + // IDS + string aDSName( onFace ? "Nodes on Faces" : "Nodes on Edges"); + aDataset = new HDFdataset( (char*)aDSName.c_str(), aGroup, HDF_INT32, aSize, 1 ); + aDataset->CreateOnDisk(); + aDataset->WriteOnDisk( aNodeIDs ); + aDataset->CloseOnDisk(); + + // U Positions + aDSName = ( onFace ? "Face U positions" : "Edge positions"); + aDataset = new HDFdataset( (char*)aDSName.c_str(), aGroup, HDF_FLOAT64, aSize, 1); + aDataset->CreateOnDisk(); + aDataset->WriteOnDisk( aUPos ); + aDataset->CloseOnDisk(); + // V Positions + if ( onFace ) { + aDataset = new HDFdataset( "Face V positions", aGroup, HDF_FLOAT64, aSize, 1); + aDataset->CreateOnDisk(); + aDataset->WriteOnDisk( aVPos ); + aDataset->CloseOnDisk(); + } + } + delete [] aNodeIDs; + delete [] aUPos; + if ( aVPos ) delete [] aVPos; + + } // treat positions on edges or faces + + // close "Node Positions" group + aGroup->CloseOnDisk(); + + } // if ( there are submeshes in SMESHDS_Mesh ) + } // if ( hasData ) + + // close mesh HDF group + aTopGroup->CloseOnDisk(); + } + } } } } @@ -3055,8 +3074,8 @@ SALOMEDS::TMPFile* SMESH_Gen_i::Save( SALOMEDS::SComponent_ptr theComponent, //============================================================================= SALOMEDS::TMPFile* SMESH_Gen_i::SaveASCII( SALOMEDS::SComponent_ptr theComponent, - const char* theURL, - bool isMultiFile ) { + const char* theURL, + bool isMultiFile ) { if(MYDEBUG) MESSAGE( "SMESH_Gen_i::SaveASCII" ); SALOMEDS::TMPFile_var aStreamFile = Save( theComponent, theURL, isMultiFile ); return aStreamFile._retn(); @@ -3130,9 +3149,9 @@ private: //============================================================================= bool SMESH_Gen_i::Load( SALOMEDS::SComponent_ptr theComponent, - const SALOMEDS::TMPFile& theStream, - const char* theURL, - bool isMultiFile ) + const SALOMEDS::TMPFile& theStream, + const char* theURL, + bool isMultiFile ) { INFOS( "SMESH_Gen_i::Load" ); @@ -3161,7 +3180,7 @@ bool SMESH_Gen_i::Load( SALOMEDS::SComponent_ptr theComponent, // Convert the stream into sequence of files to process SALOMEDS::ListOfFileNames_var aFileSeq = SALOMEDS_Tool::PutStreamToFiles( theStream, tmpDir.ToCString(), - isMultiFile ); + isMultiFile ); TCollection_AsciiString aStudyName( "" ); if ( isMultiFile ) aStudyName = ( (char*)SALOMEDS_Tool::GetNameFromPath( myCurrentStudy->URL() ).c_str() ); @@ -3217,88 +3236,88 @@ bool SMESH_Gen_i::Load( SALOMEDS::SComponent_ptr theComponent, // get number of hypotheses int aNbObjects = aTopGroup->nInternalObjects(); for ( int j = 0; j < aNbObjects; j++ ) { - // try to identify hypothesis - char hypGrpName[ HDF_NAME_MAX_LEN+1 ]; + // try to identify hypothesis + char hypGrpName[ HDF_NAME_MAX_LEN+1 ]; aTopGroup->InternalObjectIndentify( j, hypGrpName ); - if ( string( hypGrpName ).substr( 0, 10 ) == string( "Hypothesis" ) ) { - // open hypothesis group - aGroup = new HDFgroup( hypGrpName, aTopGroup ); - aGroup->OpenOnDisk(); - - // --> get hypothesis id - int id = atoi( string( hypGrpName ).substr( 10 ).c_str() ); - string hypname; - string libname; - string hypdata; - - // get number of datasets - int aNbSubObjects = aGroup->nInternalObjects(); - for ( int k = 0; k < aNbSubObjects; k++ ) { - // identify dataset - char name_of_subgroup[ HDF_NAME_MAX_LEN+1 ]; - aGroup->InternalObjectIndentify( k, name_of_subgroup ); - // --> get hypothesis name - if ( strcmp( name_of_subgroup, "Name" ) == 0 ) { - aDataset = new HDFdataset( name_of_subgroup, aGroup ); - aDataset->OpenOnDisk(); - size = aDataset->GetSize(); - char* hypname_str = new char[ size ]; - aDataset->ReadFromDisk( hypname_str ); - hypname = string( hypname_str ); - delete [] hypname_str; - aDataset->CloseOnDisk(); - } - // --> get hypothesis plugin library name - if ( strcmp( name_of_subgroup, "LibName" ) == 0 ) { - aDataset = new HDFdataset( name_of_subgroup, aGroup ); - aDataset->OpenOnDisk(); - size = aDataset->GetSize(); - char* libname_str = new char[ size ]; - aDataset->ReadFromDisk( libname_str ); - if(MYDEBUG) SCRUTE( libname_str ); - libname = string( libname_str ); - delete [] libname_str; - aDataset->CloseOnDisk(); - } - // --> get hypothesis data - if ( strcmp( name_of_subgroup, "Data" ) == 0 ) { - aDataset = new HDFdataset( name_of_subgroup, aGroup ); - aDataset->OpenOnDisk(); - size = aDataset->GetSize(); - char* hypdata_str = new char[ size ]; - aDataset->ReadFromDisk( hypdata_str ); - hypdata = string( hypdata_str ); - delete [] hypdata_str; - aDataset->CloseOnDisk(); - } - } - // close hypothesis HDF group - aGroup->CloseOnDisk(); - - // --> restore hypothesis from data - if ( id > 0 && !hypname.empty()/* && !hypdata.empty()*/ ) { // VSR : persistent data can be empty - if(MYDEBUG) MESSAGE("VSR - load hypothesis : id = " << id << + if ( string( hypGrpName ).substr( 0, 10 ) == string( "Hypothesis" ) ) { + // open hypothesis group + aGroup = new HDFgroup( hypGrpName, aTopGroup ); + aGroup->OpenOnDisk(); + + // --> get hypothesis id + int id = atoi( string( hypGrpName ).substr( 10 ).c_str() ); + string hypname; + string libname; + string hypdata; + + // get number of datasets + int aNbSubObjects = aGroup->nInternalObjects(); + for ( int k = 0; k < aNbSubObjects; k++ ) { + // identify dataset + char name_of_subgroup[ HDF_NAME_MAX_LEN+1 ]; + aGroup->InternalObjectIndentify( k, name_of_subgroup ); + // --> get hypothesis name + if ( strcmp( name_of_subgroup, "Name" ) == 0 ) { + aDataset = new HDFdataset( name_of_subgroup, aGroup ); + aDataset->OpenOnDisk(); + size = aDataset->GetSize(); + char* hypname_str = new char[ size ]; + aDataset->ReadFromDisk( hypname_str ); + hypname = string( hypname_str ); + delete [] hypname_str; + aDataset->CloseOnDisk(); + } + // --> get hypothesis plugin library name + if ( strcmp( name_of_subgroup, "LibName" ) == 0 ) { + aDataset = new HDFdataset( name_of_subgroup, aGroup ); + aDataset->OpenOnDisk(); + size = aDataset->GetSize(); + char* libname_str = new char[ size ]; + aDataset->ReadFromDisk( libname_str ); + if(MYDEBUG) SCRUTE( libname_str ); + libname = string( libname_str ); + delete [] libname_str; + aDataset->CloseOnDisk(); + } + // --> get hypothesis data + if ( strcmp( name_of_subgroup, "Data" ) == 0 ) { + aDataset = new HDFdataset( name_of_subgroup, aGroup ); + aDataset->OpenOnDisk(); + size = aDataset->GetSize(); + char* hypdata_str = new char[ size ]; + aDataset->ReadFromDisk( hypdata_str ); + hypdata = string( hypdata_str ); + delete [] hypdata_str; + aDataset->CloseOnDisk(); + } + } + // close hypothesis HDF group + aGroup->CloseOnDisk(); + + // --> restore hypothesis from data + if ( id > 0 && !hypname.empty()/* && !hypdata.empty()*/ ) { // VSR : persistent data can be empty + if(MYDEBUG) MESSAGE("VSR - load hypothesis : id = " << id << ", name = " << hypname.c_str() << ", persistent string = " << hypdata.c_str()); SMESH::SMESH_Hypothesis_var myHyp; - try { // protect persistence mechanism against exceptions - myHyp = this->createHypothesis( hypname.c_str(), libname.c_str() ); - } - catch (...) { - INFOS( "Exception during hypothesis creation" ); - } + try { // protect persistence mechanism against exceptions + myHyp = this->createHypothesis( hypname.c_str(), libname.c_str() ); + } + catch (...) { + INFOS( "Exception during hypothesis creation" ); + } - SMESH_Hypothesis_i* myImpl = dynamic_cast( GetServant( myHyp ).in() ); - if ( myImpl ) { - // myImpl->LoadFrom( hypdata.c_str() ); + SMESH_Hypothesis_i* myImpl = dynamic_cast( GetServant( myHyp ).in() ); + if ( myImpl ) { + // myImpl->LoadFrom( hypdata.c_str() ); hypDataList.push_back( make_pair( myImpl, hypdata )); - string iorString = GetORB()->object_to_string( myHyp ); - int newId = myStudyContext->findId( iorString ); - myStudyContext->mapOldToNew( id, newId ); - } - else - if(MYDEBUG) MESSAGE( "VSR - SMESH_Gen::Load - can't get servant" ); + string iorString = GetORB()->object_to_string( myHyp ); + int newId = myStudyContext->findId( iorString ); + myStudyContext->mapOldToNew( id, newId ); + } + else + if(MYDEBUG) MESSAGE( "VSR - SMESH_Gen::Load - can't get servant" ); } } } @@ -3316,89 +3335,89 @@ bool SMESH_Gen_i::Load( SALOMEDS::SComponent_ptr theComponent, // get number of algorithms int aNbObjects = aTopGroup->nInternalObjects(); for ( int j = 0; j < aNbObjects; j++ ) { - // try to identify algorithm - char hypGrpName[ HDF_NAME_MAX_LEN+1 ]; + // try to identify algorithm + char hypGrpName[ HDF_NAME_MAX_LEN+1 ]; aTopGroup->InternalObjectIndentify( j, hypGrpName ); - if ( string( hypGrpName ).substr( 0, 9 ) == string( "Algorithm" ) ) { - // open algorithm group - aGroup = new HDFgroup( hypGrpName, aTopGroup ); - aGroup->OpenOnDisk(); - - // --> get algorithm id - int id = atoi( string( hypGrpName ).substr( 9 ).c_str() ); - string hypname; - string libname; - string hypdata; - - // get number of datasets - int aNbSubObjects = aGroup->nInternalObjects(); - for ( int k = 0; k < aNbSubObjects; k++ ) { - // identify dataset - char name_of_subgroup[ HDF_NAME_MAX_LEN+1 ]; - aGroup->InternalObjectIndentify( k, name_of_subgroup ); - // --> get algorithm name - if ( strcmp( name_of_subgroup, "Name" ) == 0 ) { - aDataset = new HDFdataset( name_of_subgroup, aGroup ); - aDataset->OpenOnDisk(); - size = aDataset->GetSize(); - char* hypname_str = new char[ size ]; - aDataset->ReadFromDisk( hypname_str ); - hypname = string( hypname_str ); - delete [] hypname_str; - aDataset->CloseOnDisk(); - } - // --> get algorithm plugin library name - if ( strcmp( name_of_subgroup, "LibName" ) == 0 ) { - aDataset = new HDFdataset( name_of_subgroup, aGroup ); - aDataset->OpenOnDisk(); - size = aDataset->GetSize(); - char* libname_str = new char[ size ]; - aDataset->ReadFromDisk( libname_str ); - if(MYDEBUG) SCRUTE( libname_str ); - libname = string( libname_str ); - delete [] libname_str; - aDataset->CloseOnDisk(); - } - // --> get algorithm data - if ( strcmp( name_of_subgroup, "Data" ) == 0 ) { - aDataset = new HDFdataset( name_of_subgroup, aGroup ); - aDataset->OpenOnDisk(); - size = aDataset->GetSize(); - char* hypdata_str = new char[ size ]; - aDataset->ReadFromDisk( hypdata_str ); - if(MYDEBUG) SCRUTE( hypdata_str ); - hypdata = string( hypdata_str ); - delete [] hypdata_str; - aDataset->CloseOnDisk(); - } - } - // close algorithm HDF group - aGroup->CloseOnDisk(); - - // --> restore algorithm from data - if ( id > 0 && !hypname.empty()/* && !hypdata.empty()*/ ) { // VSR : persistent data can be empty - if(MYDEBUG) MESSAGE("VSR - load algo : id = " << id << + if ( string( hypGrpName ).substr( 0, 9 ) == string( "Algorithm" ) ) { + // open algorithm group + aGroup = new HDFgroup( hypGrpName, aTopGroup ); + aGroup->OpenOnDisk(); + + // --> get algorithm id + int id = atoi( string( hypGrpName ).substr( 9 ).c_str() ); + string hypname; + string libname; + string hypdata; + + // get number of datasets + int aNbSubObjects = aGroup->nInternalObjects(); + for ( int k = 0; k < aNbSubObjects; k++ ) { + // identify dataset + char name_of_subgroup[ HDF_NAME_MAX_LEN+1 ]; + aGroup->InternalObjectIndentify( k, name_of_subgroup ); + // --> get algorithm name + if ( strcmp( name_of_subgroup, "Name" ) == 0 ) { + aDataset = new HDFdataset( name_of_subgroup, aGroup ); + aDataset->OpenOnDisk(); + size = aDataset->GetSize(); + char* hypname_str = new char[ size ]; + aDataset->ReadFromDisk( hypname_str ); + hypname = string( hypname_str ); + delete [] hypname_str; + aDataset->CloseOnDisk(); + } + // --> get algorithm plugin library name + if ( strcmp( name_of_subgroup, "LibName" ) == 0 ) { + aDataset = new HDFdataset( name_of_subgroup, aGroup ); + aDataset->OpenOnDisk(); + size = aDataset->GetSize(); + char* libname_str = new char[ size ]; + aDataset->ReadFromDisk( libname_str ); + if(MYDEBUG) SCRUTE( libname_str ); + libname = string( libname_str ); + delete [] libname_str; + aDataset->CloseOnDisk(); + } + // --> get algorithm data + if ( strcmp( name_of_subgroup, "Data" ) == 0 ) { + aDataset = new HDFdataset( name_of_subgroup, aGroup ); + aDataset->OpenOnDisk(); + size = aDataset->GetSize(); + char* hypdata_str = new char[ size ]; + aDataset->ReadFromDisk( hypdata_str ); + if(MYDEBUG) SCRUTE( hypdata_str ); + hypdata = string( hypdata_str ); + delete [] hypdata_str; + aDataset->CloseOnDisk(); + } + } + // close algorithm HDF group + aGroup->CloseOnDisk(); + + // --> restore algorithm from data + if ( id > 0 && !hypname.empty()/* && !hypdata.empty()*/ ) { // VSR : persistent data can be empty + if(MYDEBUG) MESSAGE("VSR - load algo : id = " << id << ", name = " << hypname.c_str() << ", persistent string = " << hypdata.c_str()); SMESH::SMESH_Hypothesis_var myHyp; - try { // protect persistence mechanism against exceptions - myHyp = this->createHypothesis( hypname.c_str(), libname.c_str() ); - } - catch (...) { - INFOS( "Exception during hypothesis creation" ); - } + try { // protect persistence mechanism against exceptions + myHyp = this->createHypothesis( hypname.c_str(), libname.c_str() ); + } + catch (...) { + INFOS( "Exception during hypothesis creation" ); + } - SMESH_Hypothesis_i* myImpl = dynamic_cast( GetServant( myHyp ).in() ); - if ( myImpl ) { - //myImpl->LoadFrom( hypdata.c_str() ); + SMESH_Hypothesis_i* myImpl = dynamic_cast( GetServant( myHyp ).in() ); + if ( myImpl ) { + //myImpl->LoadFrom( hypdata.c_str() ); hypDataList.push_back( make_pair( myImpl, hypdata )); - string iorString = GetORB()->object_to_string( myHyp ); - int newId = myStudyContext->findId( iorString ); - myStudyContext->mapOldToNew( id, newId ); - } - else - if(MYDEBUG) MESSAGE( "VSR - SMESH_Gen::Load - can't get servant" ); + string iorString = GetORB()->object_to_string( myHyp ); + int newId = myStudyContext->findId( iorString ); + myStudyContext->mapOldToNew( id, newId ); + } + else + if(MYDEBUG) MESSAGE( "VSR - SMESH_Gen::Load - can't get servant" ); } } } @@ -3414,44 +3433,44 @@ bool SMESH_Gen_i::Load( SALOMEDS::SComponent_ptr theComponent, aFile->InternalObjectIndentify( i, meshName ); if ( string( meshName ).substr( 0, 4 ) == string( "Mesh" ) ) { - // --> get mesh id - int id = atoi( string( meshName ).substr( 4 ).c_str() ); - if ( id <= 0 ) - continue; - - // open mesh HDF group - aTopGroup = new HDFgroup( meshName, aFile ); - aTopGroup->OpenOnDisk(); - - // get number of child HDF objects - int aNbObjects = aTopGroup->nInternalObjects(); - if ( aNbObjects > 0 ) { - // create mesh - if(MYDEBUG) MESSAGE( "VSR - load mesh : id = " << id ); - SMESH::SMESH_Mesh_var myNewMesh = this->createMesh(); - SMESH_Mesh_i* myNewMeshImpl = dynamic_cast( GetServant( myNewMesh ).in() ); + // --> get mesh id + int id = atoi( string( meshName ).substr( 4 ).c_str() ); + if ( id <= 0 ) + continue; + + // open mesh HDF group + aTopGroup = new HDFgroup( meshName, aFile ); + aTopGroup->OpenOnDisk(); + + // get number of child HDF objects + int aNbObjects = aTopGroup->nInternalObjects(); + if ( aNbObjects > 0 ) { + // create mesh + if(MYDEBUG) MESSAGE( "VSR - load mesh : id = " << id ); + SMESH::SMESH_Mesh_var myNewMesh = this->createMesh(); + SMESH_Mesh_i* myNewMeshImpl = dynamic_cast( GetServant( myNewMesh ).in() ); if ( !myNewMeshImpl ) - continue; + continue; meshGroupList.push_back( make_pair( myNewMeshImpl, aTopGroup )); - string iorString = GetORB()->object_to_string( myNewMesh ); - int newId = myStudyContext->findId( iorString ); - myStudyContext->mapOldToNew( id, newId ); - - // ouv : NPAL12872 - // try to read and set auto color flag - char aMeshAutoColorName[ 30 ]; - sprintf( aMeshAutoColorName, "AutoColorMesh %d", id); - if( aTopGroup->ExistInternalObject( aMeshAutoColorName ) ) - { - aDataset = new HDFdataset( aMeshAutoColorName, aTopGroup ); - aDataset->OpenOnDisk(); - size = aDataset->GetSize(); - int* anAutoColor = new int[ size ]; - aDataset->ReadFromDisk( anAutoColor ); - aDataset->CloseOnDisk(); - myNewMeshImpl->SetAutoColor( (bool)anAutoColor[0] ); - } + string iorString = GetORB()->object_to_string( myNewMesh ); + int newId = myStudyContext->findId( iorString ); + myStudyContext->mapOldToNew( id, newId ); + + // ouv : NPAL12872 + // try to read and set auto color flag + char aMeshAutoColorName[ 30 ]; + sprintf( aMeshAutoColorName, "AutoColorMesh %d", id); + if( aTopGroup->ExistInternalObject( aMeshAutoColorName ) ) + { + aDataset = new HDFdataset( aMeshAutoColorName, aTopGroup ); + aDataset->OpenOnDisk(); + size = aDataset->GetSize(); + int* anAutoColor = new int[ size ]; + aDataset->ReadFromDisk( anAutoColor ); + aDataset->CloseOnDisk(); + myNewMeshImpl->SetAutoColor( (bool)anAutoColor[0] ); + } // try to read and set reference to shape GEOM::GEOM_Object_var aShapeObject; @@ -4075,21 +4094,21 @@ bool SMESH_Gen_i::Load( SALOMEDS::SComponent_ptr theComponent, SMESHDS_GroupBase* aGroupBaseDS = aLocalGroup->GetGroupDS(); aGroupBaseDS->SetStoreName( name_dataset ); - // ouv : NPAL12872 - // Read color of the group + // ouv : NPAL12872 + // Read color of the group char aGroupColorName[ 30 ]; sprintf( aGroupColorName, "ColorGroup %d", subid); if ( aGroup->ExistInternalObject( aGroupColorName ) ) - { - aDataset = new HDFdataset( aGroupColorName, aGroup ); - aDataset->OpenOnDisk(); - size = aDataset->GetSize(); - double* anRGB = new double[ size ]; - aDataset->ReadFromDisk( anRGB ); - aDataset->CloseOnDisk(); - Quantity_Color aColor( anRGB[0], anRGB[1], anRGB[2], Quantity_TOC_RGB ); - aGroupBaseDS->SetColor( aColor ); - } + { + aDataset = new HDFdataset( aGroupColorName, aGroup ); + aDataset->OpenOnDisk(); + size = aDataset->GetSize(); + double* anRGB = new double[ size ]; + aDataset->ReadFromDisk( anRGB ); + aDataset->CloseOnDisk(); + Quantity_Color aColor( anRGB[0], anRGB[1], anRGB[2], Quantity_TOC_RGB ); + aGroupBaseDS->SetColor( aColor ); + } // Fill group with contents from MED file SMESHDS_Group* aGrp = dynamic_cast( aGroupBaseDS ); @@ -4126,9 +4145,9 @@ bool SMESH_Gen_i::Load( SALOMEDS::SComponent_ptr theComponent, //============================================================================= bool SMESH_Gen_i::LoadASCII( SALOMEDS::SComponent_ptr theComponent, - const SALOMEDS::TMPFile& theStream, - const char* theURL, - bool isMultiFile ) { + const SALOMEDS::TMPFile& theStream, + const char* theURL, + bool isMultiFile ) { if(MYDEBUG) MESSAGE( "SMESH_Gen_i::LoadASCII" ); return Load( theComponent, theStream, theURL, isMultiFile ); @@ -4197,6 +4216,7 @@ void SMESH_Gen_i::Close( SALOMEDS::SComponent_ptr theComponent ) // context->myDocument = 0; // } + myCurrentStudy = SALOMEDS::Study::_nil(); return; } @@ -4224,9 +4244,9 @@ char* SMESH_Gen_i::ComponentDataType() //============================================================================= char* SMESH_Gen_i::IORToLocalPersistentID( SALOMEDS::SObject_ptr /*theSObject*/, - const char* IORString, - CORBA::Boolean /*isMultiFile*/, - CORBA::Boolean /*isASCII*/ ) + const char* IORString, + CORBA::Boolean /*isMultiFile*/, + CORBA::Boolean /*isASCII*/ ) { if(MYDEBUG) MESSAGE( "SMESH_Gen_i::IORToLocalPersistentID" ); StudyContext* myStudyContext = GetCurrentStudyContext(); @@ -4252,9 +4272,9 @@ char* SMESH_Gen_i::IORToLocalPersistentID( SALOMEDS::SObject_ptr /*theSObject*/, //============================================================================= char* SMESH_Gen_i::LocalPersistentIDToIOR( SALOMEDS::SObject_ptr /*theSObject*/, - const char* aLocalPersistentID, - CORBA::Boolean /*isMultiFile*/, - CORBA::Boolean /*isASCII*/ ) + const char* aLocalPersistentID, + CORBA::Boolean /*isMultiFile*/, + CORBA::Boolean /*isASCII*/ ) { if(MYDEBUG) MESSAGE( "SMESH_Gen_i::LocalPersistentIDToIOR(): id = " << aLocalPersistentID ); StudyContext* myStudyContext = GetCurrentStudyContext(); @@ -4318,6 +4338,11 @@ void SMESH_Gen_i::SetName(const char* theIOR, } } +int SMESH_Gen_i::GetCurrentStudyID() +{ + return myCurrentStudy->_is_nil() || myCurrentStudy->_non_existent() ? -1 : myCurrentStudy->StudyId(); +} + //============================================================================= /*! * SMESHEngine_factory @@ -4329,10 +4354,10 @@ void SMESH_Gen_i::SetName(const char* theIOR, extern "C" { SMESH_I_EXPORT PortableServer::ObjectId* SMESHEngine_factory( CORBA::ORB_ptr orb, - PortableServer::POA_ptr poa, - PortableServer::ObjectId* contId, - const char* instanceName, - const char* interfaceName ) + PortableServer::POA_ptr poa, + PortableServer::ObjectId* contId, + const char* instanceName, + const char* interfaceName ) { if(MYDEBUG) MESSAGE( "PortableServer::ObjectId* SMESHEngine_factory()" ); if(MYDEBUG) SCRUTE(interfaceName); diff --git a/src/SMESH_I/SMESH_Gen_i.hxx b/src/SMESH_I/SMESH_Gen_i.hxx index 9ba9bdbb9..13bca294a 100644 --- a/src/SMESH_I/SMESH_Gen_i.hxx +++ b/src/SMESH_I/SMESH_Gen_i.hxx @@ -176,7 +176,7 @@ public: // ***************************************** // Set a new Mesh object name void SetName(const char* theIOR, - const char* theName); + const char* theName); //GEOM::GEOM_Gen_ptr SetGeomEngine( const char* containerLoc ); void SetGeomEngine( GEOM::GEOM_Gen_ptr geomcompo ); @@ -266,9 +266,9 @@ public: * Return mesh preview structure */ SMESH::MeshPreviewStruct* Precompute( SMESH::SMESH_Mesh_ptr theMesh, - GEOM::GEOM_Object_ptr theSubObject, - SMESH::Dimension theDimension, - SMESH::long_array& theShapesId ) + GEOM::GEOM_Object_ptr theSubObject, + SMESH::Dimension theDimension, + SMESH::long_array& theShapesId ) throw ( SALOME::SALOME_Exception ); // Returns errors of hypotheses definintion @@ -294,30 +294,30 @@ public: // Return geometrical object the given element is built on. Don't publish it in study. GEOM::GEOM_Object_ptr FindGeometryByMeshElement( SMESH::SMESH_Mesh_ptr theMesh, - CORBA::Long theElementID) + CORBA::Long theElementID) throw ( SALOME::SALOME_Exception ); // Concatenate the given meshes into one mesh SMESH::SMESH_Mesh_ptr ConcatenateCommon(const SMESH::mesh_array& theMeshesArray, - CORBA::Boolean theUniteIdenticalGroups, - CORBA::Boolean theMergeNodesAndElements, - CORBA::Double theMergeTolerance, - CORBA::Boolean theCommonGroups) + CORBA::Boolean theUniteIdenticalGroups, + CORBA::Boolean theMergeNodesAndElements, + CORBA::Double theMergeTolerance, + CORBA::Boolean theCommonGroups) throw ( SALOME::SALOME_Exception ); // Concatenate the given meshes into one mesh SMESH::SMESH_Mesh_ptr Concatenate(const SMESH::mesh_array& theMeshesArray, - CORBA::Boolean theUniteIdenticalGroups, - CORBA::Boolean theMergeNodesAndElements, - CORBA::Double theMergeTolerance) + CORBA::Boolean theUniteIdenticalGroups, + CORBA::Boolean theMergeNodesAndElements, + CORBA::Double theMergeTolerance) throw ( SALOME::SALOME_Exception ); // Concatenate the given meshes into one mesh // Create the groups of all elements from initial meshes SMESH::SMESH_Mesh_ptr ConcatenateWithGroups(const SMESH::mesh_array& theMeshesArray, - CORBA::Boolean theUniteIdenticalGroups, - CORBA::Boolean theMergeNodesAndElements, - CORBA::Double theMergeTolerance) + CORBA::Boolean theUniteIdenticalGroups, + CORBA::Boolean theMergeNodesAndElements, + CORBA::Double theMergeTolerance) throw ( SALOME::SALOME_Exception ); // **************************************************** @@ -326,22 +326,22 @@ public: // Save SMESH data SALOMEDS::TMPFile* Save( SALOMEDS::SComponent_ptr theComponent, - const char* theURL, - bool isMultiFile ); + const char* theURL, + bool isMultiFile ); // Load SMESH data bool Load( SALOMEDS::SComponent_ptr theComponent, - const SALOMEDS::TMPFile& theStream, - const char* theURL, - bool isMultiFile ); + const SALOMEDS::TMPFile& theStream, + const char* theURL, + bool isMultiFile ); // Save SMESH data in ASCII format SALOMEDS::TMPFile* SaveASCII( SALOMEDS::SComponent_ptr theComponent, - const char* theURL, - bool isMultiFile ); + const char* theURL, + bool isMultiFile ); // Load SMESH data in ASCII format bool LoadASCII( SALOMEDS::SComponent_ptr theComponent, - const SALOMEDS::TMPFile& theStream, - const char* theURL, - bool isMultiFile ); + const SALOMEDS::TMPFile& theStream, + const char* theURL, + bool isMultiFile ); // Create filter manager SMESH::FilterManager_ptr CreateFilterManager(); @@ -357,22 +357,22 @@ public: // Transform data from transient form to persistent char* IORToLocalPersistentID( SALOMEDS::SObject_ptr theSObject, - const char* IORString, - CORBA::Boolean isMultiFile, - CORBA::Boolean isASCII ); + const char* IORString, + CORBA::Boolean isMultiFile, + CORBA::Boolean isASCII ); // Transform data from persistent form to transient char* LocalPersistentIDToIOR( SALOMEDS::SObject_ptr theSObject, - const char* aLocalPersistentID, - CORBA::Boolean isMultiFile, - CORBA::Boolean isASCII ); + const char* aLocalPersistentID, + CORBA::Boolean isMultiFile, + CORBA::Boolean isASCII ); // Returns true if object can be published in the study bool CanPublishInStudy( CORBA::Object_ptr theIOR ); // Publish object in the study SALOMEDS::SObject_ptr PublishInStudy( SALOMEDS::Study_ptr theStudy, - SALOMEDS::SObject_ptr theSObject, - CORBA::Object_ptr theObject, - const char* theName ) + SALOMEDS::SObject_ptr theSObject, + CORBA::Object_ptr theObject, + const char* theName ) throw ( SALOME::SALOME_Exception ); // Copy-paste methods - returns true if object can be copied to the clipboard @@ -383,8 +383,8 @@ public: CORBA::Boolean CanPaste( const char* theComponentName, CORBA::Long theObjectID ) { return false; } // Copy-paste methods - paste object from the clipboard SALOMEDS::SObject_ptr PasteInto( const SALOMEDS::TMPFile& theStream, - CORBA::Long theObjectID, - SALOMEDS::SObject_ptr theObject ) { + CORBA::Long theObjectID, + SALOMEDS::SObject_ptr theObject ) { SALOMEDS::SObject_var aResultSO; return aResultSO._retn(); } @@ -394,8 +394,8 @@ public: // ============ virtual Engines::TMPFile* DumpPython(CORBA::Object_ptr theStudy, - CORBA::Boolean isPublished, - CORBA::Boolean& isValidScript); + CORBA::Boolean isPublished, + CORBA::Boolean& isValidScript); void AddToPythonScript (int theStudyID, const TCollection_AsciiString& theString); @@ -452,7 +452,7 @@ public: SMESH::SMESH_Mesh_ptr theMesh, SMESH::SMESH_subMesh_ptr theSubMesh, GEOM::GEOM_Object_ptr theShapeObject, - const char* theName = 0); + const char* theName = 0); SALOMEDS::SObject_ptr PublishGroup (SALOMEDS::Study_ptr theStudy, SMESH::SMESH_Mesh_ptr theMesh, SMESH::SMESH_GroupBase_ptr theGroup, @@ -498,8 +498,7 @@ public: } // Get current study ID - int GetCurrentStudyID() - { return myCurrentStudy->_is_nil() ? -1 : myCurrentStudy->StudyId(); } + int GetCurrentStudyID(); /*! * \brief Find SObject for an algo diff --git a/src/SMESH_I/SMESH_Gen_i_1.cxx b/src/SMESH_I/SMESH_Gen_i_1.cxx index bce1e6eb5..2b216fe26 100644 --- a/src/SMESH_I/SMESH_Gen_i_1.cxx +++ b/src/SMESH_I/SMESH_Gen_i_1.cxx @@ -210,8 +210,10 @@ GEOM::GEOM_Object_ptr SMESH_Gen_i::ShapeToGeomObject (const TopoDS_Shape& theSha GEOM_Client* aClient = GetShapeReader(); TCollection_AsciiString IOR; if ( aClient && aClient->Find( theShape, IOR )) - aShapeObj = GEOM::GEOM_Object::_narrow - ( GetORB()->string_to_object( IOR.ToCString() ) ); + { + CORBA::Object_var obj = GetORB()->string_to_object( IOR.ToCString() ); + aShapeObj = GEOM::GEOM_Object::_narrow ( obj ); + } } return aShapeObj._retn(); } @@ -262,7 +264,8 @@ static SALOMEDS::SObject_ptr publish(SALOMEDS::Study_ptr theStudy, } if ( thePixMap ) { anAttr = aStudyBuilder->FindOrCreateAttribute( SO, "AttributePixMap" ); - SALOMEDS::AttributePixMap::_narrow( anAttr )->SetPixMap( thePixMap ); + SALOMEDS::AttributePixMap_var pm = SALOMEDS::AttributePixMap::_narrow( anAttr ); + pm->SetPixMap( thePixMap ); } if ( !theSelectable ) { anAttr = aStudyBuilder->FindOrCreateAttribute( SO, "AttributeSelectable" ); @@ -368,9 +371,9 @@ static void addReference (SALOMEDS::Study_ptr theStudy, //============================================================================= SALOMEDS::SObject_ptr SMESH_Gen_i::PublishInStudy(SALOMEDS::Study_ptr theStudy, - SALOMEDS::SObject_ptr theSObject, - CORBA::Object_ptr theIOR, - const char* theName) + SALOMEDS::SObject_ptr theSObject, + CORBA::Object_ptr theIOR, + const char* theName) throw (SALOME::SALOME_Exception) { Unexpect aCatch(SALOME_SalomeException); @@ -465,9 +468,9 @@ static long findMaxChildTag( SALOMEDS::SObject_ptr theSObject ) 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; + long nTag = anIter->Value()->Tag(); + if ( nTag > aTag ) + aTag = nTag; } } } @@ -518,13 +521,12 @@ SALOMEDS::SObject_ptr SMESH_Gen_i::PublishMesh (SALOMEDS::Study_ptr theStudy, // 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 ); - } + SMESH::ListOfHypothesis_var hypList = theMesh->GetHypothesisList( aShapeObject ); + for ( int i = 0; i < hypList->length(); i++ ) { + SMESH::SMESH_Hypothesis_var aHyp = SMESH::SMESH_Hypothesis::_narrow( hypList[ i ]); + PublishHypothesis( theStudy, aHyp ); + AddHypothesisToShape( theStudy, theMesh, aShapeObject, aHyp ); + } } // Publish submeshes @@ -900,9 +902,9 @@ void SMESH_Gen_i::UpdateParameters(CORBA::Object_ptr theObject, const char* theP SALOMEDS::SObject_var aSObj = ObjectToSObject(aStudy,theObject); if(aSObj->_is_nil()) return; - + SALOMEDS::StudyBuilder_var aStudyBuilder = aStudy->NewBuilder(); - + SALOMEDS::GenericAttribute_var aFindAttr; bool hasAttr = aSObj->FindAttribute(aFindAttr, "AttributeString"); if(VARIABLE_DEBUG) @@ -912,23 +914,23 @@ void SMESH_Gen_i::UpdateParameters(CORBA::Object_ptr theObject, const char* theP anAttr = aStudyBuilder->FindOrCreateAttribute( aSObj, "AttributeString"); SALOMEDS::AttributeString_var aStringAttr = SALOMEDS::AttributeString::_narrow(anAttr); + CORBA::String_var oldparVar = aStringAttr->Value(); + CORBA::String_var inpparVar = ParseParameters(theParameters); TCollection_AsciiString aNewParams; - TCollection_AsciiString aOldParameters(aStringAttr->Value()); - TCollection_AsciiString anInputParams(ParseParameters(theParameters)); - + TCollection_AsciiString aOldParameters(oldparVar.inout()); + TCollection_AsciiString anInputParams(inpparVar.inout()); if(!hasAttr) aNewParams = anInputParams; else aNewParams = aOldParameters+"|"+anInputParams; if(VARIABLE_DEBUG) - { - cout<<"Input Parameters : "<SetValue( aNewParams.ToCString() ); } @@ -938,21 +940,45 @@ void SMESH_Gen_i::UpdateParameters(CORBA::Object_ptr theObject, const char* theP //======================================================================= char* SMESH_Gen_i::ParseParameters(const char* theParameters) { - const char* aParameters = CORBA::string_dup(theParameters); + //const char* aParameters = theParameters; +// const char* aParameters = CORBA::string_dup(theParameters); TCollection_AsciiString anInputParams; - SALOMEDS::Study_ptr aStudy = GetCurrentStudy(); + SALOMEDS::Study_var aStudy = GetCurrentStudy(); if( !aStudy->_is_nil() ) { - SALOMEDS::ListOfListOfStrings_var aSections = aStudy->ParseVariables(aParameters); - for(int j=0;jlength();j++) { - SALOMEDS::ListOfStrings aVars= aSections[j]; - for(int i=0;iIsVariable(aVars[i].in()) ? - TCollection_AsciiString(aVars[i].in()) : TCollection_AsciiString(""); - if(i != aVars.length()-1) - anInputParams+=":"; +// SALOMEDS::ListOfListOfStrings_var aSections = aStudy->ParseVariables(theParameters); +// for(int j=0;jlength();j++) { +// SALOMEDS::ListOfStrings aVars= aSections[j]; +// for(int i=0;iIsVariable(aVars[i].in()) ? +// TCollection_AsciiString(aVars[i].in()) : TCollection_AsciiString(""); +// if(i != aVars.length()-1) +// anInputParams+=":"; +// } +// if(j!=aSections->length()-1) +// anInputParams+="|"; +// } + TCollection_AsciiString paramStr( theParameters ); + static TCollection_AsciiString separators(":|"); + int beg = 0, end; + char sep, *pParams = (char*)paramStr.ToCString(); + while ( beg < paramStr.Length() ) + { + end = beg-1; + while ( ++end < paramStr.Length() ) + if ( pParams[end] == ':' || pParams[end] == '|') + break; + if ( end < paramStr.Length()) + { + sep = pParams[end]; + pParams[end] = '\0'; } - if(j!=aSections->length()-1) - anInputParams+="|"; + if ( aStudy->IsVariable( pParams+beg )) + anInputParams += pParams+beg; + if ( end < paramStr.Length() ) + anInputParams += sep; + else + break; + beg = end + 1; } } return CORBA::string_dup(anInputParams.ToCString()); diff --git a/src/SMESH_I/SMESH_Group_i.cxx b/src/SMESH_I/SMESH_Group_i.cxx index 2f9a7f775..7502c5409 100644 --- a/src/SMESH_I/SMESH_Group_i.cxx +++ b/src/SMESH_I/SMESH_Group_i.cxx @@ -305,8 +305,8 @@ typedef bool (SMESHDS_Group::*TFunChangeGroup)(const int); CORBA::Long ChangeByPredicate( SMESH::Predicate_i* thePredicate, - SMESHDS_GroupBase* theGroupBase, - TFunChangeGroup theFun) + SMESHDS_GroupBase* theGroupBase, + TFunChangeGroup theFun) { CORBA::Long aNb = 0; if(SMESHDS_Group* aGroupDS = dynamic_cast(theGroupBase)){ @@ -317,7 +317,7 @@ ChangeByPredicate( SMESH::Predicate_i* thePredicate, CORBA::Long i = 0, iEnd = aSequence.size(); for(; i < iEnd; i++) if((aGroupDS->*theFun)(aSequence[i])) - aNb++; + aNb++; return aNb; } return aNb; diff --git a/src/SMESH_I/SMESH_MEDFamily_i.cxx b/src/SMESH_I/SMESH_MEDFamily_i.cxx index 35bacddc3..393e49c42 100644 --- a/src/SMESH_I/SMESH_MEDFamily_i.cxx +++ b/src/SMESH_I/SMESH_MEDFamily_i.cxx @@ -77,7 +77,7 @@ SMESH_MEDFamily_i::~SMESH_MEDFamily_i() */ //============================================================================= SMESH_MEDFamily_i::SMESH_MEDFamily_i(int identifier, SMESH_subMesh_i* sm, - string name, string description, SALOME_MED::medEntityMesh entity): + string name, string description, SALOME_MED::medEntityMesh entity): SMESH_MEDSupport_i( sm, name, description, entity ), _subMesh_i(sm), @@ -103,7 +103,7 @@ throw (SALOME::SALOME_Exception) { if (_subMeshDS==NULL) THROW_SALOME_CORBA_EXCEPTION("No associated Family",\ - SALOME::INTERNAL_ERROR); + SALOME::INTERNAL_ERROR); return _identifier; } @@ -117,7 +117,7 @@ throw (SALOME::SALOME_Exception) { if (_subMeshDS==NULL) THROW_SALOME_CORBA_EXCEPTION("No associated Family",\ - SALOME::INTERNAL_ERROR); + SALOME::INTERNAL_ERROR); return _numberOfAttribute; } //============================================================================= @@ -130,12 +130,12 @@ throw (SALOME::SALOME_Exception) { if (_subMeshDS==NULL) THROW_SALOME_CORBA_EXCEPTION("No associated Family",\ - SALOME::INTERNAL_ERROR); + 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::BAD_PARAM); }; SALOME_MED::long_array_var myseq= new SALOME_MED::long_array; @@ -157,15 +157,15 @@ CORBA::Long SMESH_MEDFamily_i::getAttributeIdentifier(CORBA::Long i) { if (_subMeshDS==NULL) THROW_SALOME_CORBA_EXCEPTION("No associated Family",\ - SALOME::INTERNAL_ERROR); + SALOME::INTERNAL_ERROR); MESSAGE("Les familles SMESH n ont pas d attribut"); THROW_SALOME_CORBA_EXCEPTION("No attributes"\ - ,SALOME::BAD_PARAM); + ,SALOME::BAD_PARAM); if (_numberOfAttribute == 0) { MESSAGE("Les familles SMESH n ont pas d attribut"); THROW_SALOME_CORBA_EXCEPTION("No attributes"\ - ,SALOME::BAD_PARAM); + ,SALOME::BAD_PARAM); }; ASSERT (i <= _numberOfAttribute); return _attributeIdentifier[i]; @@ -180,13 +180,13 @@ SALOME_MED::long_array* SMESH_MEDFamily_i::getAttributesValues() { if (_subMeshDS==NULL) THROW_SALOME_CORBA_EXCEPTION("No associated Family",\ - SALOME::INTERNAL_ERROR); + 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::BAD_PARAM); }; SALOME_MED::long_array_var myseq= new SALOME_MED::long_array; @@ -207,12 +207,12 @@ CORBA::Long SMESH_MEDFamily_i::getAttributeValue(CORBA::Long i) { if (_subMeshDS==NULL) THROW_SALOME_CORBA_EXCEPTION("No associated Family",\ - SALOME::INTERNAL_ERROR); + 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::BAD_PARAM); } ASSERT (i <= _numberOfAttribute); @@ -228,12 +228,12 @@ SALOME_MED::string_array * SMESH_MEDFamily_i::getAttributesDescriptions() { if (_subMeshDS==NULL) THROW_SALOME_CORBA_EXCEPTION("No associated Family",\ - SALOME::INTERNAL_ERROR); + 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::BAD_PARAM); } SALOME_MED::string_array_var myseq = new SALOME_MED::string_array; for (int i=0;i<_numberOfAttribute;i++) @@ -252,12 +252,12 @@ char * SMESH_MEDFamily_i::getAttributeDescription( CORBA::Long i) { if (_subMeshDS==NULL) THROW_SALOME_CORBA_EXCEPTION("No associated Family",\ - SALOME::INTERNAL_ERROR); + 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::BAD_PARAM); } ASSERT (i <= _numberOfAttribute); return CORBA::string_dup(_attributeDescription[i].c_str()); diff --git a/src/SMESH_I/SMESH_MEDFamily_i.hxx b/src/SMESH_I/SMESH_MEDFamily_i.hxx index 2b850fc8a..e6af38067 100644 --- a/src/SMESH_I/SMESH_MEDFamily_i.hxx +++ b/src/SMESH_I/SMESH_MEDFamily_i.hxx @@ -56,7 +56,7 @@ public : // Constructors and associated internal methods SMESH_MEDFamily_i(int identifier, SMESH_subMesh_i* sm, - std::string name, std::string description, SALOME_MED::medEntityMesh entity ); + std::string name, std::string description, SALOME_MED::medEntityMesh entity ); SMESH_MEDFamily_i(const SMESH_MEDFamily_i & f); // IDL Methods diff --git a/src/SMESH_I/SMESH_MEDMesh_i.cxx b/src/SMESH_I/SMESH_MEDMesh_i.cxx index 9ee46fda3..f73bf1102 100644 --- a/src/SMESH_I/SMESH_MEDMesh_i.cxx +++ b/src/SMESH_I/SMESH_MEDMesh_i.cxx @@ -24,6 +24,7 @@ // Module : SMESH // #include "SMESH_MEDMesh_i.hxx" +#include "SMESH_Gen_i.hxx" #include "SMESH_Mesh_i.hxx" #include "SMESHDS_Mesh.hxx" @@ -69,8 +70,8 @@ using namespace std; // 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"); + BEGIN_OF("Default Constructor SMESH_MEDMesh_i"); + END_OF("Default Constructor SMESH_MEDMesh_i"); } //============================================================================= @@ -88,18 +89,18 @@ SMESH_MEDMesh_i::~SMESH_MEDMesh_i() */ //============================================================================= SMESH_MEDMesh_i::SMESH_MEDMesh_i(::SMESH_Mesh_i * m_i):_meshId(""), - _compte(false), - _creeFamily(false), - _famIdent(0), - _indexElts(0), - _indexEnts(0) + _compte(false), + _creeFamily(false), + _famIdent(0), + _indexElts(0), + _indexEnts(0) { - BEGIN_OF("Constructor SMESH_MEDMesh_i"); + BEGIN_OF("Constructor SMESH_MEDMesh_i"); - _mesh_i = m_i; - _meshDS = _mesh_i->GetImpl().GetMeshDS(); + _mesh_i = m_i; + _meshDS = _mesh_i->GetImpl().GetMeshDS(); - END_OF("Constructor SMESH_MEDMesh_i"); + END_OF("Constructor SMESH_MEDMesh_i"); } //============================================================================= @@ -109,22 +110,28 @@ SMESH_MEDMesh_i::SMESH_MEDMesh_i(::SMESH_Mesh_i * m_i):_meshId(""), //============================================================================= 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); - } + if (_meshDS == NULL) + THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", + SALOME::INTERNAL_ERROR); + + try + { + SMESH_Gen_i* gen = SMESH_Gen_i::GetSMESHGen(); + SALOMEDS::Study_var study = gen->GetCurrentStudy(); + SALOMEDS::SObject_var meshSO = gen->ObjectToSObject( study, _mesh_i->_this()); + if ( meshSO->_is_nil() ) + return CORBA::string_dup("toto"); + + CORBA::String_var name = meshSO->GetName(); + return CORBA::string_dup( name.in() ); + } + catch(...) + { + MESSAGE("Exception en accedant au nom"); + THROW_SALOME_CORBA_EXCEPTION("Unable to acces Mesh C++ Object", + SALOME::INTERNAL_ERROR); + } + return 0; } //============================================================================= @@ -134,8 +141,8 @@ char *SMESH_MEDMesh_i::getName() throw(SALOME::SALOME_Exception) //============================================================================= CORBA::Long SMESH_MEDMesh_i::getCorbaIndex()throw(SALOME::SALOME_Exception) { - MESSAGE("Non Implemente"); - THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); + MESSAGE("Non Implemente"); + THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); } //============================================================================= @@ -145,11 +152,11 @@ CORBA::Long SMESH_MEDMesh_i::getCorbaIndex()throw(SALOME::SALOME_Exception) //============================================================================= 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; + // 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; } //============================================================================= @@ -159,14 +166,14 @@ CORBA::Long SMESH_MEDMesh_i::getSpaceDimension()throw(SALOME::SALOME_Exception) //============================================================================= 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; + 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; } //============================================================================= /*! @@ -188,7 +195,7 @@ CORBA::Boolean SMESH_MEDMesh_i::getIsAGrid() throw (SALOME::SALOME_Exception) //============================================================================= CORBA::Boolean SMESH_MEDMesh_i::existConnectivity(SALOME_MED::medConnectivity connectivityType, - SALOME_MED::medEntityMesh entity) + SALOME_MED::medEntityMesh entity) throw (SALOME::SALOME_Exception) { MESSAGE("!!!!!! IMPLEMENTED BUT ONLY PARTIALLY !!!!!!"); @@ -218,21 +225,21 @@ CORBA::Double SMESH_MEDMesh_i::getCoordinate(CORBA::Long Number, CORBA::Long Axi //============================================================================= 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); - } + 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); + } } //============================================================================= @@ -240,56 +247,56 @@ char *SMESH_MEDMesh_i::getCoordinatesSystem() throw(SALOME::SALOME_Exception) * CORBA: Accessor for Coordinates */ //============================================================================= -SALOME_MED::double_array * SMESH_MEDMesh_i::getCoordinates( - SALOME_MED::medModeSwitch typeSwitch) throw(SALOME::SALOME_Exception) +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(); + 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(); } //============================================================================= @@ -298,28 +305,28 @@ SALOME_MED::double_array * SMESH_MEDMesh_i::getCoordinates( */ //============================================================================= SALOME_MED::string_array * - SMESH_MEDMesh_i::getCoordinatesNames()throw(SALOME::SALOME_Exception) +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(); + 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(); } @@ -329,28 +336,28 @@ SALOME_MED::string_array * */ //============================================================================= SALOME_MED::string_array * - SMESH_MEDMesh_i::getCoordinatesUnits()throw(SALOME::SALOME_Exception) +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(); + 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(); } //============================================================================= @@ -360,19 +367,19 @@ SALOME_MED::string_array * //============================================================================= 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); - } + 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); + } } //============================================================================= @@ -381,119 +388,119 @@ CORBA::Long SMESH_MEDMesh_i::getNumberOfNodes()throw(SALOME::SALOME_Exception) */ //============================================================================= CORBA::Long SMESH_MEDMesh_i::getNumberOfTypes(SALOME_MED::medEntityMesh entity) -throw(SALOME::SALOME_Exception) + 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); - } + 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 + * Not implemented for MED_ALL_ENTITIES */ //============================================================================= SALOME_MED::medGeometryElement_array * - SMESH_MEDMesh_i::getTypes(SALOME_MED::medEntityMesh entity) throw(SALOME:: - SALOME_Exception) +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(); + 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 + * 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) + 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); - } + 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); + } } //============================================================================= @@ -503,29 +510,29 @@ CORBA::Long SMESH_MEDMesh_i::getNumberOfElements(SALOME_MED:: //============================================================================= SALOME_MED::long_array * SMESH_MEDMesh_i::getConnectivity(SALOME_MED::medModeSwitch typeSwitch, - SALOME_MED::medConnectivity mode, - SALOME_MED::medEntityMesh entity, - SALOME_MED::medGeometryElement geomElement) + 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(); + 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(); } //============================================================================= @@ -535,12 +542,12 @@ SMESH_MEDMesh_i::getConnectivity(SALOME_MED::medModeSwitch typeSwitch, //============================================================================= SALOME_MED::long_array * SMESH_MEDMesh_i::getConnectivityIndex(SALOME_MED::medConnectivity mode, - SALOME_MED::medEntityMesh entity) + SALOME_MED::medEntityMesh entity) throw(SALOME::SALOME_Exception) { - MESSAGE("Pas Implemente dans SMESH"); - THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); - return 0; + MESSAGE("Pas Implemente dans SMESH"); + THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); + return 0; } //============================================================================= @@ -550,15 +557,15 @@ SMESH_MEDMesh_i::getConnectivityIndex(SALOME_MED::medConnectivity mode, //============================================================================= CORBA::Long SMESH_MEDMesh_i::getElementNumber(SALOME_MED::medConnectivity mode, - SALOME_MED::medEntityMesh entity, - SALOME_MED::medGeometryElement type, - const SALOME_MED::long_array & connectivity) + 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; + const char *LOC = "getElementNumber "; + MESSAGE(LOC << "Pas Implemente dans SMESH"); + THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); + return -1; } //============================================================================= @@ -568,12 +575,12 @@ SMESH_MEDMesh_i::getElementNumber(SALOME_MED::medConnectivity mode, */ //============================================================================= SALOME_MED::long_array * - SMESH_MEDMesh_i::getReverseConnectivity(SALOME_MED:: - medConnectivity mode) throw(SALOME::SALOME_Exception) +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; + MESSAGE("Pas Implemente dans SMESH"); + THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); + return 0; } //============================================================================= @@ -582,12 +589,12 @@ SALOME_MED::long_array * */ //============================================================================= SALOME_MED::long_array * - SMESH_MEDMesh_i::getReverseConnectivityIndex(SALOME_MED:: - medConnectivity mode) throw(SALOME::SALOME_Exception) +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; + MESSAGE("Pas Implemente dans SMESH"); + THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); + return 0; } //============================================================================= @@ -596,14 +603,14 @@ SALOME_MED::long_array * */ //============================================================================= CORBA::Long SMESH_MEDMesh_i::getNumberOfFamilies(SALOME_MED:: - medEntityMesh entity) throw(SALOME::SALOME_Exception) + 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(); + if (_creeFamily == false) + createFamilies(); + if (_mesh_i == 0) + THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", + SALOME::INTERNAL_ERROR); + return _families.size(); } //============================================================================= @@ -612,13 +619,13 @@ CORBA::Long SMESH_MEDMesh_i::getNumberOfFamilies(SALOME_MED:: */ //============================================================================= CORBA::Long SMESH_MEDMesh_i::getNumberOfGroups(SALOME_MED::medEntityMesh entity) -throw(SALOME::SALOME_Exception) + 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; + if (_mesh_i == 0) + THROW_SALOME_CORBA_EXCEPTION("No associated Mesh", + SALOME::INTERNAL_ERROR); + MESSAGE(" Pas d implementation des groupes dans SMESH"); + return 0; } //============================================================================= @@ -627,24 +634,24 @@ throw(SALOME::SALOME_Exception) */ //============================================================================= SALOME_MED::Family_array * - SMESH_MEDMesh_i::getFamilies(SALOME_MED:: - medEntityMesh entity) throw(SALOME::SALOME_Exception) +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(); + 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(); } //============================================================================= @@ -653,16 +660,16 @@ SALOME_MED::Family_array * */ //============================================================================= SALOME_MED::FAMILY_ptr SMESH_MEDMesh_i::getFamily(SALOME_MED:: - medEntityMesh entity, CORBA::Long i) throw(SALOME::SALOME_Exception) + 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]; + 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]; } //============================================================================= @@ -671,14 +678,14 @@ SALOME_MED::FAMILY_ptr SMESH_MEDMesh_i::getFamily(SALOME_MED:: */ //============================================================================= SALOME_MED::Group_array * - SMESH_MEDMesh_i::getGroups(SALOME_MED::medEntityMesh entity) throw(SALOME:: - SALOME_Exception) +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); + 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); } //============================================================================= @@ -687,13 +694,13 @@ SALOME_MED::Group_array * */ //============================================================================= SALOME_MED::GROUP_ptr SMESH_MEDMesh_i::getGroup(SALOME_MED:: - medEntityMesh entity, CORBA::Long i) throw(SALOME::SALOME_Exception) + 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); + 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); } //============================================================================= /*! @@ -764,11 +771,11 @@ SMESH_MEDMesh_i::getSkin(SALOME_MED::SUPPORT_ptr mySupport3D) */ //============================================================================= SALOME_MED::FIELD_ptr SMESH_MEDMesh_i::getVolume(SALOME_MED:: - SUPPORT_ptr mySupport) throw(SALOME::SALOME_Exception) + SUPPORT_ptr mySupport) throw(SALOME::SALOME_Exception) { - MESSAGE("Pas Implemente dans SMESH"); - THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); - return 0; + MESSAGE("Pas Implemente dans SMESH"); + THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); + return 0; } //============================================================================= @@ -777,11 +784,11 @@ SALOME_MED::FIELD_ptr SMESH_MEDMesh_i::getVolume(SALOME_MED:: */ //============================================================================= SALOME_MED::FIELD_ptr SMESH_MEDMesh_i::getArea(SALOME_MED:: - SUPPORT_ptr mySupport) throw(SALOME::SALOME_Exception) + SUPPORT_ptr mySupport) throw(SALOME::SALOME_Exception) { - MESSAGE("Pas Implemente dans SMESH"); - THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); - return 0; + MESSAGE("Pas Implemente dans SMESH"); + THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); + return 0; } //============================================================================= @@ -790,11 +797,11 @@ SALOME_MED::FIELD_ptr SMESH_MEDMesh_i::getArea(SALOME_MED:: */ //============================================================================= SALOME_MED::FIELD_ptr SMESH_MEDMesh_i::getLength(SALOME_MED:: - SUPPORT_ptr mySupport) throw(SALOME::SALOME_Exception) + SUPPORT_ptr mySupport) throw(SALOME::SALOME_Exception) { - MESSAGE("Pas Implemente dans SMESH"); - THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); - return 0; + MESSAGE("Pas Implemente dans SMESH"); + THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); + return 0; } //============================================================================= @@ -803,11 +810,11 @@ SALOME_MED::FIELD_ptr SMESH_MEDMesh_i::getLength(SALOME_MED:: */ //============================================================================= SALOME_MED::FIELD_ptr SMESH_MEDMesh_i::getNormal(SALOME_MED:: - SUPPORT_ptr mySupport) throw(SALOME::SALOME_Exception) + SUPPORT_ptr mySupport) throw(SALOME::SALOME_Exception) { - MESSAGE("Pas Implemente dans SMESH"); - THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); - return 0; + MESSAGE("Pas Implemente dans SMESH"); + THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); + return 0; } //============================================================================= @@ -816,11 +823,11 @@ SALOME_MED::FIELD_ptr SMESH_MEDMesh_i::getNormal(SALOME_MED:: */ //============================================================================= SALOME_MED::FIELD_ptr SMESH_MEDMesh_i::getBarycenter(SALOME_MED:: - SUPPORT_ptr mySupport) throw(SALOME::SALOME_Exception) + SUPPORT_ptr mySupport) throw(SALOME::SALOME_Exception) { - MESSAGE("Pas Implemente dans SMESH"); - THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); - return 0; + MESSAGE("Pas Implemente dans SMESH"); + THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); + return 0; } //============================================================================= @@ -829,11 +836,11 @@ SALOME_MED::FIELD_ptr SMESH_MEDMesh_i::getBarycenter(SALOME_MED:: */ //============================================================================= SALOME_MED::FIELD_ptr SMESH_MEDMesh_i::getNeighbourhood(SALOME_MED:: - SUPPORT_ptr mySupport) throw(SALOME::SALOME_Exception) + SUPPORT_ptr mySupport) throw(SALOME::SALOME_Exception) { - MESSAGE("Non Implemente"); - THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); - return 0; + MESSAGE("Non Implemente"); + THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); + return 0; } //============================================================================= @@ -843,57 +850,57 @@ SALOME_MED::FIELD_ptr SMESH_MEDMesh_i::getNeighbourhood(SALOME_MED:: */ //============================================================================= void SMESH_MEDMesh_i::addInStudy(SALOMEDS::Study_ptr myStudy, - SALOME_MED::MESH_ptr myIor) throw(SALOME::SALOME_Exception) + 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_::Instance() ; - * ASSERT(SINGLETON_::IsAlreadyExisting()) ; - * CORBA::ORB_var &orb = init(0,0); - * CORBA::String_var iorStr = orb->object_to_string(myIor); - * //myBuilder->AddAttribute(newObj,SALOMEDS::IOR,iorStr.in()); - * 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)"); + 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_::Instance() ; + * ASSERT(SINGLETON_::IsAlreadyExisting()) ; + * CORBA::ORB_var &orb = init(0,0); + * CORBA::String_var iorStr = orb->object_to_string(myIor); + * //myBuilder->AddAttribute(newObj,SALOMEDS::IOR,iorStr.in()); + * 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)"); } //============================================================================= @@ -902,10 +909,10 @@ void SMESH_MEDMesh_i::addInStudy(SALOMEDS::Study_ptr myStudy, */ //============================================================================= void SMESH_MEDMesh_i::write(CORBA::Long i, const char *driverMeshName) -throw(SALOME::SALOME_Exception) + throw(SALOME::SALOME_Exception) { - MESSAGE("Non Implemente"); - THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); + MESSAGE("Non Implemente"); + THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); } //============================================================================= @@ -915,8 +922,8 @@ throw(SALOME::SALOME_Exception) //============================================================================= void SMESH_MEDMesh_i::read(CORBA::Long i) throw(SALOME::SALOME_Exception) { - MESSAGE("Non Implemente"); - THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); + MESSAGE("Non Implemente"); + THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); } //============================================================================= @@ -926,8 +933,8 @@ void SMESH_MEDMesh_i::read(CORBA::Long i) throw(SALOME::SALOME_Exception) //============================================================================= void SMESH_MEDMesh_i::rmDriver(CORBA::Long i) throw(SALOME::SALOME_Exception) { - MESSAGE("Non Implemente"); - THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); + MESSAGE("Non Implemente"); + THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); } //============================================================================= @@ -936,11 +943,11 @@ void SMESH_MEDMesh_i::rmDriver(CORBA::Long i) throw(SALOME::SALOME_Exception) */ //============================================================================= CORBA::Long SMESH_MEDMesh_i::addDriver(SALOME_MED::medDriverTypes driverType, - const char *fileName, const char *meshName) throw(SALOME::SALOME_Exception) + const char *fileName, const char *meshName) throw(SALOME::SALOME_Exception) { - MESSAGE("Non Implemente"); - THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); - return 0; + MESSAGE("Non Implemente"); + THROW_SALOME_CORBA_EXCEPTION("Unimplemented Method", SALOME::BAD_PARAM); + return 0; } //============================================================================= @@ -950,174 +957,174 @@ CORBA::Long SMESH_MEDMesh_i::addDriver(SALOME_MED::medDriverTypes driverType, //============================================================================= 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 + 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 }; //============================================================================= @@ -1128,42 +1135,42 @@ void SMESH_MEDMesh_i::calculeNbElts() throw(SALOME::SALOME_Exception) 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); + 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); #ifdef WNT SALOME_MED::FAMILY_ptr famille = SALOME_MED::FAMILY::_nil(); POA_SALOME_MED::FAMILY* servantbase = dynamic_cast(famservant); if ( servantbase ) famille = SALOME_MED::FAMILY::_narrow( servantbase->_this() ); #else - SALOME_MED::FAMILY_ptr famille = + SALOME_MED::FAMILY_ptr famille = SALOME_MED::FAMILY::_narrow( famservant->POA_SALOME_MED::FAMILY::_this() ); #endif - _families.push_back(famille); - } - } + _families.push_back(famille); + } + } }; //============================================================================= /*! @@ -1216,7 +1223,7 @@ SMESH_MEDMesh_i::getConnectGlobal(SALOME_MED::medEntityMesh entity) //============================================================================= SALOME_MED::medGeometryElement SMESH_MEDMesh_i::getElementType(SALOME_MED::medEntityMesh entity, - CORBA::Long number) + CORBA::Long number) throw (SALOME::SALOME_Exception) { MESSAGE("!!!! NOT YET IMPLEMENTED !!!!!"); diff --git a/src/SMESH_I/SMESH_MEDMesh_i.hxx b/src/SMESH_I/SMESH_MEDMesh_i.hxx index 8e56e0e79..72b31032e 100644 --- a/src/SMESH_I/SMESH_MEDMesh_i.hxx +++ b/src/SMESH_I/SMESH_MEDMesh_i.hxx @@ -82,9 +82,9 @@ public: void release() {} SALOME::SenderDouble_ptr getSenderForCoordinates(SALOME_MED::medModeSwitch) {return SALOME::SenderDouble::_nil();} SALOME::SenderInt_ptr getSenderForConnectivity(SALOME_MED::medModeSwitch, - SALOME_MED::medConnectivity, - SALOME_MED::medEntityMesh, - SALOME_MED::medGeometryElement) + SALOME_MED::medConnectivity, + SALOME_MED::medEntityMesh, + SALOME_MED::medGeometryElement) { return SALOME::SenderInt::_nil(); } @@ -103,7 +103,7 @@ public: CORBA::Boolean existConnectivity(SALOME_MED::medConnectivity connectivityType, - SALOME_MED::medEntityMesh entity) + SALOME_MED::medEntityMesh entity) throw (SALOME::SALOME_Exception); char *getCoordinatesSystem() throw(SALOME::SALOME_Exception); @@ -127,27 +127,27 @@ public: SALOME_MED::medGeometryElement_array * getTypes(SALOME_MED::medEntityMesh entity) throw(SALOME:: - SALOME_Exception); + SALOME_Exception); SALOME_MED::medGeometryElement getElementType(SALOME_MED::medEntityMesh entity, - CORBA::Long number) + CORBA::Long number) throw (SALOME::SALOME_Exception); CORBA::Long getNumberOfElements(SALOME_MED::medEntityMesh entity, - SALOME_MED::medGeometryElement geomElement) + SALOME_MED::medGeometryElement geomElement) throw(SALOME::SALOME_Exception); SALOME_MED::long_array * getConnectivity(SALOME_MED::medModeSwitch typeSwitch, - SALOME_MED::medConnectivity mode, - SALOME_MED::medEntityMesh entity, - SALOME_MED::medGeometryElement geomElement) + SALOME_MED::medConnectivity mode, + SALOME_MED::medEntityMesh entity, + SALOME_MED::medGeometryElement geomElement) throw(SALOME::SALOME_Exception); SALOME_MED::long_array * getConnectivityIndex(SALOME_MED::medConnectivity mode, - SALOME_MED::medEntityMesh entity) + SALOME_MED::medEntityMesh entity) throw(SALOME::SALOME_Exception); SALOME_MED::long_array* @@ -155,9 +155,9 @@ public: throw (SALOME::SALOME_Exception); CORBA::Long getElementNumber(SALOME_MED::medConnectivity mode, - SALOME_MED::medEntityMesh entity, - SALOME_MED::medGeometryElement type, - const SALOME_MED::long_array & connectivity) + SALOME_MED::medEntityMesh entity, + SALOME_MED::medGeometryElement type, + const SALOME_MED::long_array & connectivity) throw(SALOME::SALOME_Exception); SALOME_MED::long_array * @@ -180,14 +180,14 @@ public: throw(SALOME::SALOME_Exception); SALOME_MED::FAMILY_ptr getFamily(SALOME_MED::medEntityMesh entity, - CORBA::Long i) + CORBA::Long i) throw(SALOME::SALOME_Exception); SALOME_MED::Group_array * getGroups(SALOME_MED::medEntityMesh entity) throw(SALOME::SALOME_Exception); SALOME_MED::GROUP_ptr getGroup(SALOME_MED::medEntityMesh entity, - CORBA::Long i) + CORBA::Long i) throw(SALOME::SALOME_Exception); SALOME_MED::SUPPORT_ptr @@ -221,10 +221,10 @@ public: // Others void addInStudy(SALOMEDS::Study_ptr myStudy, - SALOME_MED::MESH_ptr myIor) + SALOME_MED::MESH_ptr myIor) throw(SALOME::SALOME_Exception); CORBA::Long addDriver(SALOME_MED::medDriverTypes driverType, - const char *fileName, const char *meshName) + const char *fileName, const char *meshName) throw(SALOME::SALOME_Exception); void rmDriver(CORBA::Long i) throw(SALOME::SALOME_Exception); void read(CORBA::Long i) throw(SALOME::SALOME_Exception); diff --git a/src/SMESH_I/SMESH_MEDSupport_i.cxx b/src/SMESH_I/SMESH_MEDSupport_i.cxx index 56f3b73eb..4b1e66ddf 100644 --- a/src/SMESH_I/SMESH_MEDSupport_i.cxx +++ b/src/SMESH_I/SMESH_MEDSupport_i.cxx @@ -45,8 +45,8 @@ using namespace std; //============================================================================= SMESH_MEDSupport_i::SMESH_MEDSupport_i() { - BEGIN_OF("Default Constructor SMESH_MEDSupport_i"); - END_OF("Default Constructor SMESH_MEDSupport_i"); + BEGIN_OF("Default Constructor SMESH_MEDSupport_i"); + END_OF("Default Constructor SMESH_MEDSupport_i"); } //============================================================================= @@ -55,40 +55,40 @@ SMESH_MEDSupport_i::SMESH_MEDSupport_i() */ //============================================================================= 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) + 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"); + 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"); } //============================================================================= @@ -101,19 +101,19 @@ 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"); + BEGIN_OF("Constructor SMESH_MEDSupport_i"); - _meshDS = _subMesh_i->_mesh_i->GetImpl().GetMeshDS(); + _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(); - } + 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"); + END_OF("Constructor SMESH_MEDSupport_i"); } //============================================================================= @@ -134,11 +134,11 @@ SMESH_MEDSupport_i::~SMESH_MEDSupport_i() 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); + 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); } @@ -150,10 +150,10 @@ CORBA::Long SMESH_MEDSupport_i::getCorbaIndex()throw(SALOME::SALOME_Exception) 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()); + if (_subMeshDS==NULL) + THROW_SALOME_CORBA_EXCEPTION("No associated Support", + SALOME::INTERNAL_ERROR); + return CORBA::string_dup(_name.c_str()); } @@ -165,10 +165,10 @@ char *SMESH_MEDSupport_i::getName() throw(SALOME::SALOME_Exception) 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()); + if (_subMeshDS==NULL) + THROW_SALOME_CORBA_EXCEPTION("No associated Support", + SALOME::INTERNAL_ERROR); + return CORBA::string_dup(_description.c_str()); } //============================================================================= @@ -178,13 +178,13 @@ char *SMESH_MEDSupport_i::getDescription() throw(SALOME::SALOME_Exception) //============================================================================= SALOME_MED::MESH_ptr SMESH_MEDSupport_i::getMesh()throw(SALOME:: - SALOME_Exception) + SALOME_Exception) { - if (_subMeshDS==NULL) - THROW_SALOME_CORBA_EXCEPTION("No associated Support", - SALOME::INTERNAL_ERROR); + if (_subMeshDS==NULL) + THROW_SALOME_CORBA_EXCEPTION("No associated Support", + SALOME::INTERNAL_ERROR); - return _subMesh_i->_mesh_i->GetMEDMesh(); + return _subMesh_i->_mesh_i->GetMEDMesh(); } //============================================================================= @@ -194,36 +194,36 @@ SALOME_MED::MESH_ptr SMESH_MEDSupport_i::getMesh()throw(SALOME:: //============================================================================= CORBA::Boolean SMESH_MEDSupport_i::isOnAllElements()throw(SALOME:: - SALOME_Exception) + 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; + 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; } //============================================================================= @@ -233,12 +233,12 @@ CORBA::Boolean SMESH_MEDSupport_i::isOnAllElements()throw(SALOME:: //============================================================================= SALOME_MED::medEntityMesh SMESH_MEDSupport_i::getEntity()throw(SALOME:: - SALOME_Exception) + SALOME_Exception) { - if (_subMeshDS==NULL) - THROW_SALOME_CORBA_EXCEPTION("No associated Support", - SALOME::INTERNAL_ERROR); - return _entity; + if (_subMeshDS==NULL) + THROW_SALOME_CORBA_EXCEPTION("No associated Support", + SALOME::INTERNAL_ERROR); + return _entity; } //============================================================================= @@ -248,29 +248,29 @@ SALOME_MED::medEntityMesh SMESH_MEDSupport_i::getEntity()throw(SALOME:: //============================================================================= SALOME_MED::medGeometryElement_array * - SMESH_MEDSupport_i::getTypes()throw(SALOME::SALOME_Exception) + 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(); + 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(); } //============================================================================= @@ -280,12 +280,12 @@ SALOME_MED::medGeometryElement_array * */ //============================================================================= CORBA::Long SMESH_MEDSupport_i::getNumberOfElements(SALOME_MED:: - medGeometryElement geomElement) throw(SALOME::SALOME_Exception) + medGeometryElement geomElement) throw(SALOME::SALOME_Exception) { - if (_subMeshDS==NULL) - THROW_SALOME_CORBA_EXCEPTION("No associated Support", - SALOME::INTERNAL_ERROR); - return _numberOfGeometricType; + if (_subMeshDS==NULL) + THROW_SALOME_CORBA_EXCEPTION("No associated Support", + SALOME::INTERNAL_ERROR); + return _numberOfGeometricType; } @@ -296,32 +296,32 @@ CORBA::Long SMESH_MEDSupport_i::getNumberOfElements(SALOME_MED:: //============================================================================= SALOME_MED::long_array * SMESH_MEDSupport_i::getNumber( - SALOME_MED::medGeometryElement geomElement) throw(SALOME::SALOME_Exception) + 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); + 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); + // 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; + SALOME_MED::long_array_var myseq = new SALOME_MED::long_array; - int i = 0; - myseq->length(_subMeshDS->NbNodes()); + int i = 0; + myseq->length(_subMeshDS->NbNodes()); - SMDS_NodeIteratorPtr it = _subMeshDS->GetNodes(); - while(it->more()) - { - myseq[i] = it->next()->GetID(); - i++; - }; + 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(); + SCRUTE(myseq->length()); + MESSAGE("End of SMESH_MEDSupport_i::getNumber"); + return myseq._retn(); } @@ -332,7 +332,7 @@ SALOME_MED::long_array * SMESH_MEDSupport_i::getNumber( //============================================================================= SALOME_MED::long_array * SMESH_MEDSupport_i::getNumberFromFile( - SALOME_MED::medGeometryElement geomElement) throw(SALOME::SALOME_Exception) + SALOME_MED::medGeometryElement geomElement) throw(SALOME::SALOME_Exception) { return getNumber(geomElement); } @@ -345,11 +345,11 @@ SALOME_MED::long_array * SMESH_MEDSupport_i::getNumberFromFile( //============================================================================= SALOME_MED::long_array * - SMESH_MEDSupport_i::getNumberIndex()throw(SALOME::SALOME_Exception) + 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; + MESSAGE("Not implemented for SMESH_i"); + THROW_SALOME_CORBA_EXCEPTION("Not Implemented", SALOME::BAD_PARAM); + return NULL; } //============================================================================= /*! @@ -358,10 +358,10 @@ SALOME_MED::long_array * //============================================================================= CORBA::Long SMESH_MEDSupport_i::getNumberOfGaussPoint(SALOME_MED:: - medGeometryElement geomElement) throw(SALOME::SALOME_Exception) + medGeometryElement geomElement) throw(SALOME::SALOME_Exception) { - MESSAGE("Not implemented for SMESH_i"); - return 0; + MESSAGE("Not implemented for SMESH_i"); + return 0; } //============================================================================= /*! diff --git a/src/SMESH_I/SMESH_MEDSupport_i.hxx b/src/SMESH_I/SMESH_MEDSupport_i.hxx index 15cf3b8f4..56c36a881 100644 --- a/src/SMESH_I/SMESH_MEDSupport_i.hxx +++ b/src/SMESH_I/SMESH_MEDSupport_i.hxx @@ -42,78 +42,78 @@ class SMESH_subMesh_i; class SMESH_I_EXPORT SMESH_MEDSupport_i: - public virtual POA_SALOME_MED::SUPPORT, public virtual SALOME::GenericObj_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, - std::string name, std::string description, SALOME_MED::medEntityMesh entity); - SMESH_MEDSupport_i(const SMESH_MEDSupport_i & s); + SMESH_MEDSupport_i(SMESH_subMesh_i * sm, + std::string name, std::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); + 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); + 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 * + getNumber(SALOME_MED::medGeometryElement geomElement) + throw(SALOME::SALOME_Exception); /*! * Same function as getNumber. */ - SALOME_MED::long_array * - getNumberFromFile(SALOME_MED::medGeometryElement geomElement) - throw(SALOME::SALOME_Exception); + SALOME_MED::long_array * + getNumberFromFile(SALOME_MED::medGeometryElement geomElement) + throw(SALOME::SALOME_Exception); - SALOME_MED::long_array * getNumberIndex() - throw(SALOME::SALOME_Exception); + SALOME_MED::long_array * getNumberIndex() + throw(SALOME::SALOME_Exception); CORBA::Long - getNumberOfGaussPoint(SALOME_MED::medGeometryElement geomElement) - throw(SALOME::SALOME_Exception); + getNumberOfGaussPoint(SALOME_MED::medGeometryElement geomElement) + throw(SALOME::SALOME_Exception); SALOME_MED::long_array* getNumbersOfGaussPoint() - throw (SALOME::SALOME_Exception); + throw (SALOME::SALOME_Exception); - SALOME_MED::medGeometryElement_array *getTypes() - 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); + CORBA::Long getCorbaIndex() throw(SALOME::SALOME_Exception); SALOME_MED::SUPPORT::supportInfos * getSupportGlobal() - throw (SALOME::SALOME_Exception); + throw (SALOME::SALOME_Exception); - void createSeq() throw(SALOME::SALOME_Exception); + void createSeq() throw(SALOME::SALOME_Exception); public: //public field - const SMESHDS_SubMesh * _subMeshDS; - ::SMESH_subMesh_i * _subMesh_i; + const SMESHDS_SubMesh * _subMeshDS; + ::SMESH_subMesh_i * _subMesh_i; - SMESHDS_Mesh * _meshDS; - std::string _name; + SMESHDS_Mesh * _meshDS; + std::string _name; std::string _description; - bool _isOnAllElements; - bool _seqNumber; - int _seqLength; + bool _isOnAllElements; + bool _seqNumber; + int _seqLength; - SALOME_MED::medEntityMesh _entity; - SALOME_MED::medGeometryElement * _geometricType; - int _numberOfGeometricType; + SALOME_MED::medEntityMesh _entity; + SALOME_MED::medGeometryElement * _geometricType; + int _numberOfGeometricType; protected: - SMESH_MEDSupport_i(); - ~SMESH_MEDSupport_i(); + SMESH_MEDSupport_i(); + ~SMESH_MEDSupport_i(); }; #endif /* _MED_MEDSUPPORT_I_HXX_ */ diff --git a/src/SMESH_I/SMESH_MeshEditor_i.cxx b/src/SMESH_I/SMESH_MeshEditor_i.cxx index 6d0002396..000bc95e8 100644 --- a/src/SMESH_I/SMESH_MeshEditor_i.cxx +++ b/src/SMESH_I/SMESH_MeshEditor_i.cxx @@ -149,24 +149,26 @@ namespace { } };// struct TPreviewMesh - static SMESH_NodeSearcher * myNodeSearcher = 0; + static SMESH_NodeSearcher * theNodeSearcher = 0; + static SMESH_ElementSearcher * theElementSearcher = 0; //============================================================================= /*! - * \brief Deleter of myNodeSearcher at any compute event occured + * \brief Deleter of theNodeSearcher at any compute event occured */ //============================================================================= - struct TNodeSearcherDeleter : public SMESH_subMeshEventListener + struct TSearchersDeleter : public SMESH_subMeshEventListener { SMESH_Mesh* myMesh; //!< Constructor - TNodeSearcherDeleter(): SMESH_subMeshEventListener( false ), // won't be deleted by submesh - myMesh(0) {} - //!< Delete myNodeSearcher + TSearchersDeleter(): SMESH_subMeshEventListener( false ), // won't be deleted by submesh + myMesh(0) {} + //!< Delete theNodeSearcher static void Delete() { - if ( myNodeSearcher ) { delete myNodeSearcher; myNodeSearcher = 0; } + if ( theNodeSearcher ) delete theNodeSearcher; theNodeSearcher = 0; + if ( theElementSearcher ) delete theElementSearcher; theElementSearcher = 0; } typedef map < int, SMESH_subMesh * > TDependsOnMap; //!< The meshod called by submesh: do my main job @@ -178,19 +180,22 @@ namespace { Unset( sm->GetFather() ); } } - //!< set self on all submeshes and delete myNodeSearcher if other mesh is set + //!< set self on all submeshes and delete theNodeSearcher if other mesh is set void Set(SMESH_Mesh* mesh) { - if ( myMesh && myMesh != mesh ) { - Delete(); - Unset( myMesh ); - } - myMesh = mesh; - if ( SMESH_subMesh* myMainSubMesh = mesh->GetSubMeshContaining(1) ) { - const TDependsOnMap & subMeshes = myMainSubMesh->DependsOn(); - TDependsOnMap::const_iterator sm; - for (sm = subMeshes.begin(); sm != subMeshes.end(); sm++) - sm->second->SetEventListener( this, 0, sm->second ); + if ( myMesh != mesh ) + { + if ( myMesh ) { + Delete(); + Unset( myMesh ); + } + myMesh = mesh; + if ( SMESH_subMesh* myMainSubMesh = mesh->GetSubMeshContaining(1) ) { + const TDependsOnMap & subMeshes = myMainSubMesh->DependsOn(); + TDependsOnMap::const_iterator sm; + for (sm = subMeshes.begin(); sm != subMeshes.end(); sm++) + sm->second->SetEventListener( this, 0, sm->second ); + } } } //!< delete self from all submeshes @@ -204,7 +209,8 @@ namespace { } myMesh = 0; } - }; + + } theSearchersDeleter; TCollection_AsciiString mirrorTypeName( SMESH::SMESH_MeshEditor::MirrorType theMirrorType ) { @@ -252,7 +258,7 @@ SMESH_MeshEditor_i::~SMESH_MeshEditor_i() */ //================================================================================ -void SMESH_MeshEditor_i::initData() +void SMESH_MeshEditor_i::initData(bool deleteSearchers) { if ( myPreviewMode ) { myPreviewData = new SMESH::MeshPreviewStruct(); @@ -260,7 +266,8 @@ void SMESH_MeshEditor_i::initData() else { myLastCreatedElems = new SMESH::long_array(); myLastCreatedNodes = new SMESH::long_array(); - TNodeSearcherDeleter::Delete(); + if ( deleteSearchers ) + TSearchersDeleter::Delete(); } } @@ -271,7 +278,7 @@ void SMESH_MeshEditor_i::initData() //============================================================================= CORBA::Boolean - SMESH_MeshEditor_i::RemoveElements(const SMESH::long_array & IDsOfElements) +SMESH_MeshEditor_i::RemoveElements(const SMESH::long_array & IDsOfElements) { initData(); @@ -430,6 +437,9 @@ CORBA::Long SMESH_MeshEditor_i::AddFace(const SMESH::long_array & IDsOfNodes) elem = GetMeshDS()->AddFace(nodes[0], nodes[1], nodes[2], nodes[3], nodes[4], nodes[5], nodes[6], nodes[7]); } + else if (NbNodes > 2) { + elem = GetMeshDS()->AddPolygonalFace(nodes); + } // Update Python script TPythonDump() << "faceID = " << this << ".AddFace( " << IDsOfNodes << " )"; @@ -445,8 +455,7 @@ CORBA::Long SMESH_MeshEditor_i::AddFace(const SMESH::long_array & IDsOfNodes) * AddPolygonalFace */ //============================================================================= -CORBA::Long SMESH_MeshEditor_i::AddPolygonalFace - (const SMESH::long_array & IDsOfNodes) +CORBA::Long SMESH_MeshEditor_i::AddPolygonalFace (const SMESH::long_array & IDsOfNodes) { initData(); @@ -456,7 +465,7 @@ CORBA::Long SMESH_MeshEditor_i::AddPolygonalFace nodes[i] = GetMeshDS()->FindNode(IDsOfNodes[i]); const SMDS_MeshElement* elem = GetMeshDS()->AddPolygonalFace(nodes); - + // Update Python script TPythonDump() <<"faceID = "<SetMeshElementOnShape( elem, ShapeID ); } - -//============================================================================= -/*! - * - */ -//============================================================================= - -CORBA::Boolean SMESH_MeshEditor_i::MoveNode(CORBA::Long NodeID, - CORBA::Double x, - CORBA::Double y, - CORBA::Double z) -{ - initData(); - - const SMDS_MeshNode * node = GetMeshDS()->FindNode( NodeID ); - if ( !node ) - return false; - - GetMeshDS()->MoveNode(node, x, y, z); - - // Update Python script - TPythonDump() << "isDone = " << this << ".MoveNode( " - << NodeID << ", " << x << ", " << y << ", " << z << " )"; - - return true; -} - //============================================================================= /*! * @@ -903,10 +883,10 @@ namespace //================================================================================ /*! * \brief function for conversion long_array to TIDSortedElemSet - * \param IDs - array of IDs - * \param aMesh - mesh - * \param aMap - collection to fill - * \param aType - element type + * \param IDs - array of IDs + * \param aMesh - mesh + * \param aMap - collection to fill + * \param aType - element type */ //================================================================================ @@ -919,7 +899,7 @@ namespace CORBA::Long ind = IDs[i]; const SMDS_MeshElement * elem = (aType == SMDSAbs_Node ? aMesh->FindNode(ind) - : aMesh->FindElement(ind)); + : aMesh->FindElement(ind)); if ( elem && ( aType == SMDSAbs_All || elem->GetType() == aType )) aMap.insert( elem ); } @@ -1165,14 +1145,14 @@ CORBA::Long SMESH_MeshEditor_i::BestSplit (CORBA::Long IDOfQuad, //======================================================================= CORBA::Boolean - SMESH_MeshEditor_i::Smooth(const SMESH::long_array & IDsOfElements, - const SMESH::long_array & IDsOfFixedNodes, - CORBA::Long MaxNbOfIterations, - CORBA::Double MaxAspectRatio, - SMESH::SMESH_MeshEditor::Smooth_Method Method) +SMESH_MeshEditor_i::Smooth(const SMESH::long_array & IDsOfElements, + const SMESH::long_array & IDsOfFixedNodes, + CORBA::Long MaxNbOfIterations, + CORBA::Double MaxAspectRatio, + SMESH::SMESH_MeshEditor::Smooth_Method Method) { return smooth( IDsOfElements, IDsOfFixedNodes, MaxNbOfIterations, - MaxAspectRatio, Method, false ); + MaxAspectRatio, Method, false ); } @@ -1182,14 +1162,14 @@ CORBA::Boolean //======================================================================= CORBA::Boolean - SMESH_MeshEditor_i::SmoothParametric(const SMESH::long_array & IDsOfElements, - const SMESH::long_array & IDsOfFixedNodes, - CORBA::Long MaxNbOfIterations, - CORBA::Double MaxAspectRatio, - SMESH::SMESH_MeshEditor::Smooth_Method Method) +SMESH_MeshEditor_i::SmoothParametric(const SMESH::long_array & IDsOfElements, + const SMESH::long_array & IDsOfFixedNodes, + CORBA::Long MaxNbOfIterations, + CORBA::Double MaxAspectRatio, + SMESH::SMESH_MeshEditor::Smooth_Method Method) { return smooth( IDsOfElements, IDsOfFixedNodes, MaxNbOfIterations, - MaxAspectRatio, Method, true ); + MaxAspectRatio, Method, true ); } @@ -1199,11 +1179,11 @@ CORBA::Boolean //======================================================================= CORBA::Boolean - SMESH_MeshEditor_i::SmoothObject(SMESH::SMESH_IDSource_ptr theObject, - const SMESH::long_array & IDsOfFixedNodes, - CORBA::Long MaxNbOfIterations, - CORBA::Double MaxAspectRatio, - SMESH::SMESH_MeshEditor::Smooth_Method Method) +SMESH_MeshEditor_i::SmoothObject(SMESH::SMESH_IDSource_ptr theObject, + const SMESH::long_array & IDsOfFixedNodes, + CORBA::Long MaxNbOfIterations, + CORBA::Double MaxAspectRatio, + SMESH::SMESH_MeshEditor::Smooth_Method Method) { return smoothObject (theObject, IDsOfFixedNodes, MaxNbOfIterations, MaxAspectRatio, Method, false); @@ -1216,11 +1196,11 @@ CORBA::Boolean //======================================================================= CORBA::Boolean - SMESH_MeshEditor_i::SmoothParametricObject(SMESH::SMESH_IDSource_ptr theObject, - const SMESH::long_array & IDsOfFixedNodes, - CORBA::Long MaxNbOfIterations, - CORBA::Double MaxAspectRatio, - SMESH::SMESH_MeshEditor::Smooth_Method Method) +SMESH_MeshEditor_i::SmoothParametricObject(SMESH::SMESH_IDSource_ptr theObject, + const SMESH::long_array & IDsOfFixedNodes, + CORBA::Long MaxNbOfIterations, + CORBA::Double MaxAspectRatio, + SMESH::SMESH_MeshEditor::Smooth_Method Method) { return smoothObject (theObject, IDsOfFixedNodes, MaxNbOfIterations, MaxAspectRatio, Method, true); @@ -1234,12 +1214,12 @@ CORBA::Boolean //============================================================================= CORBA::Boolean - SMESH_MeshEditor_i::smooth(const SMESH::long_array & IDsOfElements, - const SMESH::long_array & IDsOfFixedNodes, - CORBA::Long MaxNbOfIterations, - CORBA::Double MaxAspectRatio, - SMESH::SMESH_MeshEditor::Smooth_Method Method, - bool IsParametric) +SMESH_MeshEditor_i::smooth(const SMESH::long_array & IDsOfElements, + const SMESH::long_array & IDsOfFixedNodes, + CORBA::Long MaxNbOfIterations, + CORBA::Double MaxAspectRatio, + SMESH::SMESH_MeshEditor::Smooth_Method Method, + bool IsParametric) { initData(); @@ -1354,9 +1334,9 @@ void SMESH_MeshEditor_i::RenumberElements() } //======================================================================= - /*! - * \brief Return groups by their IDs - */ +/*! + * \brief Return groups by their IDs + */ //======================================================================= SMESH::ListOfGroups* SMESH_MeshEditor_i::getGroups(const std::list* groupIDs) @@ -1379,7 +1359,7 @@ SMESH_MeshEditor_i::rotationSweep(const SMESH::long_array & theIDsOfElements, CORBA::Long theNbOfSteps, CORBA::Double theTolerance, const bool theMakeGroups, - const SMDSAbs_ElementType theElementType) + const SMDSAbs_ElementType theElementType) { initData(); @@ -1408,8 +1388,8 @@ SMESH_MeshEditor_i::rotationSweep(const SMESH::long_array & theIDsOfElements, ::SMESH_MeshEditor anEditor( mesh ); ::SMESH_MeshEditor::PGroupIDs groupIds = - anEditor.RotationSweep (*workElements, Ax1, theAngleInRadians, - theNbOfSteps, theTolerance, theMakeGroups, makeWalls); + anEditor.RotationSweep (*workElements, Ax1, theAngleInRadians, + theNbOfSteps, theTolerance, theMakeGroups, makeWalls); storeResult(anEditor); return theMakeGroups ? getGroups(groupIds.get()) : 0; @@ -1479,10 +1459,10 @@ SMESH_MeshEditor_i::RotationSweepMakeGroups(const SMESH::long_array& theIDsOfEle //======================================================================= void SMESH_MeshEditor_i::RotationSweepObject(SMESH::SMESH_IDSource_ptr theObject, - const SMESH::AxisStruct & theAxis, - CORBA::Double theAngleInRadians, - CORBA::Long theNbOfSteps, - CORBA::Double theTolerance) + const SMESH::AxisStruct & theAxis, + CORBA::Double theAngleInRadians, + CORBA::Long theNbOfSteps, + CORBA::Double theTolerance) { if ( !myPreviewMode ) { TPythonDump() << this << ".RotationSweepObject( " @@ -1507,10 +1487,10 @@ void SMESH_MeshEditor_i::RotationSweepObject(SMESH::SMESH_IDSource_ptr theObject //======================================================================= void SMESH_MeshEditor_i::RotationSweepObject1D(SMESH::SMESH_IDSource_ptr theObject, - const SMESH::AxisStruct & theAxis, - CORBA::Double theAngleInRadians, - CORBA::Long theNbOfSteps, - CORBA::Double theTolerance) + const SMESH::AxisStruct & theAxis, + CORBA::Double theAngleInRadians, + CORBA::Long theNbOfSteps, + CORBA::Double theTolerance) { if ( !myPreviewMode ) { TPythonDump() << this << ".RotationSweepObject1D( " @@ -1527,7 +1507,7 @@ void SMESH_MeshEditor_i::RotationSweepObject1D(SMESH::SMESH_IDSource_ptr theObje theNbOfSteps, theTolerance, false, - SMDSAbs_Edge); + SMDSAbs_Edge); } //======================================================================= @@ -1536,10 +1516,10 @@ void SMESH_MeshEditor_i::RotationSweepObject1D(SMESH::SMESH_IDSource_ptr theObje //======================================================================= void SMESH_MeshEditor_i::RotationSweepObject2D(SMESH::SMESH_IDSource_ptr theObject, - const SMESH::AxisStruct & theAxis, - CORBA::Double theAngleInRadians, - CORBA::Long theNbOfSteps, - CORBA::Double theTolerance) + const SMESH::AxisStruct & theAxis, + CORBA::Double theAngleInRadians, + CORBA::Long theNbOfSteps, + CORBA::Double theTolerance) { if ( !myPreviewMode ) { TPythonDump() << this << ".RotationSweepObject2D( " @@ -1556,7 +1536,7 @@ void SMESH_MeshEditor_i::RotationSweepObject2D(SMESH::SMESH_IDSource_ptr theObje theNbOfSteps, theTolerance, false, - SMDSAbs_Face); + SMDSAbs_Face); } //======================================================================= @@ -1583,7 +1563,7 @@ SMESH_MeshEditor_i::RotationSweepObjectMakeGroups(SMESH::SMESH_IDSource_ptr theO DumpGroupsList(aPythonDump,aGroups); aPythonDump<< this << ".RotationSweepObjectMakeGroups( " << theObject << ", " - << theAxis << ", " + << theAxis << ", " << theAngleInRadians << ", " << theNbOfSteps << ", " << theTolerance << " )"; @@ -1598,10 +1578,10 @@ SMESH_MeshEditor_i::RotationSweepObjectMakeGroups(SMESH::SMESH_IDSource_ptr theO SMESH::ListOfGroups* SMESH_MeshEditor_i::RotationSweepObject1DMakeGroups(SMESH::SMESH_IDSource_ptr theObject, - const SMESH::AxisStruct& theAxis, - CORBA::Double theAngleInRadians, - CORBA::Long theNbOfSteps, - CORBA::Double theTolerance) + const SMESH::AxisStruct& theAxis, + CORBA::Double theAngleInRadians, + CORBA::Long theNbOfSteps, + CORBA::Double theTolerance) { SMESH::long_array_var anElementsId = theObject->GetIDs(); SMESH::ListOfGroups *aGroups = rotationSweep(anElementsId, @@ -1610,13 +1590,13 @@ SMESH_MeshEditor_i::RotationSweepObject1DMakeGroups(SMESH::SMESH_IDSource_ptr th theNbOfSteps, theTolerance, true, - SMDSAbs_Edge); + SMDSAbs_Edge); if ( !myPreviewMode ) { TPythonDump aPythonDump; DumpGroupsList(aPythonDump,aGroups); aPythonDump<< this << ".RotationSweepObject1DMakeGroups( " << theObject << ", " - << theAxis << ", " + << theAxis << ", " << theAngleInRadians << ", " << theNbOfSteps << ", " << theTolerance << " )"; @@ -1631,10 +1611,10 @@ SMESH_MeshEditor_i::RotationSweepObject1DMakeGroups(SMESH::SMESH_IDSource_ptr th SMESH::ListOfGroups* SMESH_MeshEditor_i::RotationSweepObject2DMakeGroups(SMESH::SMESH_IDSource_ptr theObject, - const SMESH::AxisStruct& theAxis, - CORBA::Double theAngleInRadians, - CORBA::Long theNbOfSteps, - CORBA::Double theTolerance) + const SMESH::AxisStruct& theAxis, + CORBA::Double theAngleInRadians, + CORBA::Long theNbOfSteps, + CORBA::Double theTolerance) { SMESH::long_array_var anElementsId = theObject->GetIDs(); SMESH::ListOfGroups *aGroups = rotationSweep(anElementsId, @@ -1643,13 +1623,13 @@ SMESH_MeshEditor_i::RotationSweepObject2DMakeGroups(SMESH::SMESH_IDSource_ptr th theNbOfSteps, theTolerance, true, - SMDSAbs_Face); + SMDSAbs_Face); if ( !myPreviewMode ) { TPythonDump aPythonDump; DumpGroupsList(aPythonDump,aGroups); aPythonDump<< this << ".RotationSweepObject2DMakeGroups( " << theObject << ", " - << theAxis << ", " + << theAxis << ", " << theAngleInRadians << ", " << theNbOfSteps << ", " << theTolerance << " )"; @@ -1721,8 +1701,8 @@ void SMESH_MeshEditor_i::ExtrusionSweep(const SMESH::long_array & theIDsOfElemen //======================================================================= void SMESH_MeshEditor_i::ExtrusionSweepObject(SMESH::SMESH_IDSource_ptr theObject, - const SMESH::DirStruct & theStepVector, - CORBA::Long theNbOfSteps) + const SMESH::DirStruct & theStepVector, + CORBA::Long theNbOfSteps) { SMESH::long_array_var anElementsId = theObject->GetIDs(); extrusionSweep (anElementsId, theStepVector, theNbOfSteps, false ); @@ -1777,7 +1757,7 @@ SMESH_MeshEditor_i::ExtrusionSweepMakeGroups(const SMESH::long_array& theIDsOfEl CORBA::Long theNbOfSteps) { SMESH::ListOfGroups* aGroups = extrusionSweep (theIDsOfElements, theStepVector, theNbOfSteps, true ); - + if ( !myPreviewMode ) { TPythonDump aPythonDump; DumpGroupsList(aPythonDump,aGroups); @@ -1798,7 +1778,7 @@ SMESH_MeshEditor_i::ExtrusionSweepObjectMakeGroups(SMESH::SMESH_IDSource_ptr the { SMESH::long_array_var anElementsId = theObject->GetIDs(); SMESH::ListOfGroups * aGroups = extrusionSweep (anElementsId, theStepVector, theNbOfSteps, true ); - + if ( !myPreviewMode ) { TPythonDump aPythonDump; DumpGroupsList(aPythonDump,aGroups); @@ -1824,7 +1804,7 @@ SMESH_MeshEditor_i::ExtrusionSweepObject1DMakeGroups(SMESH::SMESH_IDSource_ptr t TPythonDump aPythonDump; DumpGroupsList(aPythonDump,aGroups); aPythonDump << this << ".ExtrusionSweepObject1DMakeGroups( " - << theObject << ", " << theStepVector << ", " << theNbOfSteps << " )"; + << theObject << ", " << theStepVector << ", " << theNbOfSteps << " )"; } return aGroups; } @@ -1845,7 +1825,7 @@ SMESH_MeshEditor_i::ExtrusionSweepObject2DMakeGroups(SMESH::SMESH_IDSource_ptr t TPythonDump aPythonDump; DumpGroupsList(aPythonDump,aGroups); aPythonDump << this << ".ExtrusionSweepObject2DMakeGroups( " - << theObject << ", " << theStepVector << ", " << theNbOfSteps << " )"; + << theObject << ", " << theStepVector << ", " << theNbOfSteps << " )"; } return aGroups; } @@ -1888,10 +1868,10 @@ SMESH_MeshEditor_i::advancedExtrusion(const SMESH::long_array & theIDsOfElements //======================================================================= void SMESH_MeshEditor_i::AdvancedExtrusion(const SMESH::long_array & theIDsOfElements, - const SMESH::DirStruct & theStepVector, - CORBA::Long theNbOfSteps, - CORBA::Long theExtrFlags, - CORBA::Double theSewTolerance) + const SMESH::DirStruct & theStepVector, + CORBA::Long theNbOfSteps, + CORBA::Long theExtrFlags, + CORBA::Double theSewTolerance) { if ( !myPreviewMode ) { TPythonDump() << "stepVector = " << theStepVector; @@ -1923,12 +1903,12 @@ SMESH_MeshEditor_i::AdvancedExtrusionMakeGroups(const SMESH::long_array& theIDsO CORBA::Double theSewTolerance) { SMESH::ListOfGroups * aGroups = advancedExtrusion( theIDsOfElements, - theStepVector, - theNbOfSteps, - theExtrFlags, - theSewTolerance, - true); - + theStepVector, + theNbOfSteps, + theExtrFlags, + theSewTolerance, + true); + if ( !myPreviewMode ) { TPythonDump() << "stepVector = " << theStepVector; TPythonDump aPythonDump; @@ -1955,13 +1935,13 @@ SMESH_MeshEditor_i::AdvancedExtrusionMakeGroups(const SMESH::long_array& theIDsO static SMESH::SMESH_MeshEditor::Extrusion_Error convExtrError( const::SMESH_MeshEditor::Extrusion_Error e ) { switch ( e ) { - RETCASE( EXTR_OK ); - RETCASE( EXTR_NO_ELEMENTS ); - RETCASE( EXTR_PATH_NOT_EDGE ); - RETCASE( EXTR_BAD_PATH_SHAPE ); - RETCASE( EXTR_BAD_STARTING_NODE ); - RETCASE( EXTR_BAD_ANGLES_NUMBER ); - RETCASE( EXTR_CANT_GET_TANGENT ); + RETCASE( EXTR_OK ); + RETCASE( EXTR_NO_ELEMENTS ); + RETCASE( EXTR_PATH_NOT_EDGE ); + RETCASE( EXTR_BAD_PATH_SHAPE ); + RETCASE( EXTR_BAD_STARTING_NODE ); + RETCASE( EXTR_BAD_ANGLES_NUMBER ); + RETCASE( EXTR_CANT_GET_TANGENT ); } return SMESH::SMESH_MeshEditor::EXTR_OK; } @@ -1983,7 +1963,7 @@ SMESH_MeshEditor_i::extrusionAlongPath(const SMESH::long_array & theIDsOfEleme const SMESH::PointStruct & theRefPoint, const bool theMakeGroups, SMESH::SMESH_MeshEditor::Extrusion_Error & theError, - const SMDSAbs_ElementType theElementType) + const SMDSAbs_ElementType theElementType) { initData(); @@ -2045,16 +2025,16 @@ SMESH_MeshEditor_i::extrusionAlongPath(const SMESH::long_array & theIDsOfEleme SMESH::ListOfGroups* SMESH_MeshEditor_i::extrusionAlongPathX(const SMESH::long_array & IDsOfElements, - SMESH::SMESH_IDSource_ptr Path, - CORBA::Long NodeStart, - CORBA::Boolean HasAngles, - const SMESH::double_array& Angles, - CORBA::Boolean LinearVariation, - CORBA::Boolean HasRefPoint, - const SMESH::PointStruct& RefPoint, - const bool MakeGroups, - const SMDSAbs_ElementType ElementType, - SMESH::SMESH_MeshEditor::Extrusion_Error & Error) + SMESH::SMESH_IDSource_ptr Path, + CORBA::Long NodeStart, + CORBA::Boolean HasAngles, + const SMESH::double_array& Angles, + CORBA::Boolean LinearVariation, + CORBA::Boolean HasRefPoint, + const SMESH::PointStruct& RefPoint, + const bool MakeGroups, + const SMDSAbs_ElementType ElementType, + SMESH::SMESH_MeshEditor::Extrusion_Error & Error) { SMESH::ListOfGroups* EmptyGr = new SMESH::ListOfGroups; @@ -2088,8 +2068,8 @@ SMESH_MeshEditor_i::extrusionAlongPathX(const SMESH::long_array & IDsOfElements return EmptyGr; } error = anEditor.ExtrusionAlongTrack( elements, &(aMeshImp->GetImpl()), aNodeStart, - HasAngles, angles, LinearVariation, - HasRefPoint, refPnt, MakeGroups ); + HasAngles, angles, LinearVariation, + HasRefPoint, refPnt, MakeGroups ); } else { SMESH_subMesh_i* aSubMeshImp = SMESH::DownCast( Path ); @@ -2098,26 +2078,26 @@ SMESH_MeshEditor_i::extrusionAlongPathX(const SMESH::long_array & IDsOfElements SMESH::SMESH_Mesh_ptr aPathMesh = aSubMeshImp->GetFather(); aMeshImp = SMESH::DownCast( aPathMesh ); SMDS_MeshNode* aNodeStart = - (SMDS_MeshNode*)aMeshImp->GetImpl().GetMeshDS()->FindNode(NodeStart); + (SMDS_MeshNode*)aMeshImp->GetImpl().GetMeshDS()->FindNode(NodeStart); if ( !aNodeStart ) { - Error = SMESH::SMESH_MeshEditor::EXTR_BAD_STARTING_NODE; - return EmptyGr; + Error = SMESH::SMESH_MeshEditor::EXTR_BAD_STARTING_NODE; + return EmptyGr; } SMESH_subMesh* aSubMesh = - aMeshImp->GetImpl().GetSubMeshContaining(aSubMeshImp->GetId()); + aMeshImp->GetImpl().GetSubMeshContaining(aSubMeshImp->GetId()); error = anEditor.ExtrusionAlongTrack( elements, aSubMesh, aNodeStart, - HasAngles, angles, LinearVariation, - HasRefPoint, refPnt, MakeGroups ); + HasAngles, angles, LinearVariation, + HasRefPoint, refPnt, MakeGroups ); } else { SMESH_Group_i* aGroupImp = SMESH::DownCast( Path ); if(aGroupImp) { - // path as group of 1D elements + // path as group of 1D elements } else { - // invalid path - Error = SMESH::SMESH_MeshEditor::EXTR_BAD_PATH_SHAPE; - return EmptyGr; + // invalid path + Error = SMESH::SMESH_MeshEditor::EXTR_BAD_PATH_SHAPE; + return EmptyGr; } } } @@ -2142,14 +2122,14 @@ SMESH_MeshEditor_i::extrusionAlongPathX(const SMESH::long_array & IDsOfElements //======================================================================= SMESH::SMESH_MeshEditor::Extrusion_Error - SMESH_MeshEditor_i::ExtrusionAlongPath(const SMESH::long_array & theIDsOfElements, - SMESH::SMESH_Mesh_ptr thePathMesh, - GEOM::GEOM_Object_ptr thePathShape, - CORBA::Long theNodeStart, - CORBA::Boolean theHasAngles, - const SMESH::double_array & theAngles, - CORBA::Boolean theHasRefPoint, - const SMESH::PointStruct & theRefPoint) +SMESH_MeshEditor_i::ExtrusionAlongPath(const SMESH::long_array & theIDsOfElements, + SMESH::SMESH_Mesh_ptr thePathMesh, + GEOM::GEOM_Object_ptr thePathShape, + CORBA::Long theNodeStart, + CORBA::Boolean theHasAngles, + const SMESH::double_array & theAngles, + CORBA::Boolean theHasRefPoint, + const SMESH::PointStruct & theRefPoint) { if ( !myPreviewMode ) { TPythonDump() << "error = " << this << ".ExtrusionAlongPath( " @@ -2230,13 +2210,13 @@ SMESH_MeshEditor_i::ExtrusionAlongPathObject(SMESH::SMESH_IDSource_ptr theObje SMESH::SMESH_MeshEditor::Extrusion_Error SMESH_MeshEditor_i::ExtrusionAlongPathObject1D(SMESH::SMESH_IDSource_ptr theObject, - SMESH::SMESH_Mesh_ptr thePathMesh, - GEOM::GEOM_Object_ptr thePathShape, - CORBA::Long theNodeStart, - CORBA::Boolean theHasAngles, - const SMESH::double_array & theAngles, - CORBA::Boolean theHasRefPoint, - const SMESH::PointStruct & theRefPoint) + SMESH::SMESH_Mesh_ptr thePathMesh, + GEOM::GEOM_Object_ptr thePathShape, + CORBA::Long theNodeStart, + CORBA::Boolean theHasAngles, + const SMESH::double_array & theAngles, + CORBA::Boolean theHasRefPoint, + const SMESH::PointStruct & theRefPoint) { if ( !myPreviewMode ) { TPythonDump() << "error = " << this << ".ExtrusionAlongPathObject1D( " @@ -2264,7 +2244,7 @@ SMESH_MeshEditor_i::ExtrusionAlongPathObject1D(SMESH::SMESH_IDSource_ptr theOb theRefPoint, false, anError, - SMDSAbs_Edge); + SMDSAbs_Edge); return anError; } @@ -2275,13 +2255,13 @@ SMESH_MeshEditor_i::ExtrusionAlongPathObject1D(SMESH::SMESH_IDSource_ptr theOb SMESH::SMESH_MeshEditor::Extrusion_Error SMESH_MeshEditor_i::ExtrusionAlongPathObject2D(SMESH::SMESH_IDSource_ptr theObject, - SMESH::SMESH_Mesh_ptr thePathMesh, - GEOM::GEOM_Object_ptr thePathShape, - CORBA::Long theNodeStart, - CORBA::Boolean theHasAngles, - const SMESH::double_array & theAngles, - CORBA::Boolean theHasRefPoint, - const SMESH::PointStruct & theRefPoint) + SMESH::SMESH_Mesh_ptr thePathMesh, + GEOM::GEOM_Object_ptr thePathShape, + CORBA::Long theNodeStart, + CORBA::Boolean theHasAngles, + const SMESH::double_array & theAngles, + CORBA::Boolean theHasRefPoint, + const SMESH::PointStruct & theRefPoint) { if ( !myPreviewMode ) { TPythonDump() << "error = " << this << ".ExtrusionAlongPathObject2D( " @@ -2309,7 +2289,7 @@ SMESH_MeshEditor_i::ExtrusionAlongPathObject2D(SMESH::SMESH_IDSource_ptr theOb theRefPoint, false, anError, - SMDSAbs_Face); + SMDSAbs_Face); return anError; } @@ -2330,16 +2310,16 @@ SMESH_MeshEditor_i::ExtrusionAlongPathMakeGroups(const SMESH::long_array& theI const SMESH::PointStruct& theRefPoint, SMESH::SMESH_MeshEditor::Extrusion_Error& Error) { - SMESH::ListOfGroups * aGroups = extrusionAlongPath( theIDsOfElements, - thePathMesh, - thePathShape, - theNodeStart, - theHasAngles, - theAngles, - theHasRefPoint, - theRefPoint, - true, - Error); + SMESH::ListOfGroups * aGroups = extrusionAlongPath( theIDsOfElements, + thePathMesh, + thePathShape, + theNodeStart, + theHasAngles, + theAngles, + theHasRefPoint, + theRefPoint, + true, + Error); if ( !myPreviewMode ) { bool isDumpGroups = aGroups && aGroups->length() > 0; TPythonDump aPythonDump; @@ -2350,7 +2330,7 @@ SMESH_MeshEditor_i::ExtrusionAlongPathMakeGroups(const SMESH::long_array& theI aPythonDump << ", error)"; else aPythonDump <<"error"; - + aPythonDump<<" = "<< this << ".ExtrusionAlongPathMakeGroups( " << theIDsOfElements << ", " << thePathMesh << ", " @@ -2394,7 +2374,7 @@ ExtrusionAlongPathObjectMakeGroups(SMESH::SMESH_IDSource_ptr theObject, theRefPoint, true, Error); - + if ( !myPreviewMode ) { bool isDumpGroups = aGroups && aGroups->length() > 0; TPythonDump aPythonDump; @@ -2413,11 +2393,11 @@ ExtrusionAlongPathObjectMakeGroups(SMESH::SMESH_IDSource_ptr theObject, << theNodeStart << ", " << theHasAngles << ", " << theAngles << ", " - << theHasRefPoint << ", " - << "SMESH.PointStruct( " - << ( theHasRefPoint ? theRefPoint.x : 0 ) << ", " - << ( theHasRefPoint ? theRefPoint.y : 0 ) << ", " - << ( theHasRefPoint ? theRefPoint.z : 0 ) << " ) )"; + << theHasRefPoint << ", " + << "SMESH.PointStruct( " + << ( theHasRefPoint ? theRefPoint.x : 0 ) << ", " + << ( theHasRefPoint ? theRefPoint.y : 0 ) << ", " + << ( theHasRefPoint ? theRefPoint.z : 0 ) << " ) )"; } return aGroups; } @@ -2429,14 +2409,14 @@ ExtrusionAlongPathObjectMakeGroups(SMESH::SMESH_IDSource_ptr theObject, SMESH::ListOfGroups* SMESH_MeshEditor_i:: ExtrusionAlongPathObject1DMakeGroups(SMESH::SMESH_IDSource_ptr theObject, - SMESH::SMESH_Mesh_ptr thePathMesh, - GEOM::GEOM_Object_ptr thePathShape, - CORBA::Long theNodeStart, - CORBA::Boolean theHasAngles, - const SMESH::double_array& theAngles, - CORBA::Boolean theHasRefPoint, - const SMESH::PointStruct& theRefPoint, - SMESH::SMESH_MeshEditor::Extrusion_Error& Error) + SMESH::SMESH_Mesh_ptr thePathMesh, + GEOM::GEOM_Object_ptr thePathShape, + CORBA::Long theNodeStart, + CORBA::Boolean theHasAngles, + const SMESH::double_array& theAngles, + CORBA::Boolean theHasRefPoint, + const SMESH::PointStruct& theRefPoint, + SMESH::SMESH_MeshEditor::Extrusion_Error& Error) { SMESH::long_array_var anElementsId = theObject->GetIDs(); SMESH::ListOfGroups * aGroups = extrusionAlongPath( anElementsId, @@ -2449,8 +2429,8 @@ ExtrusionAlongPathObject1DMakeGroups(SMESH::SMESH_IDSource_ptr theObject, theRefPoint, true, Error, - SMDSAbs_Edge); - + SMDSAbs_Edge); + if ( !myPreviewMode ) { bool isDumpGroups = aGroups && aGroups->length() > 0; TPythonDump aPythonDump; @@ -2469,11 +2449,11 @@ ExtrusionAlongPathObject1DMakeGroups(SMESH::SMESH_IDSource_ptr theObject, << theNodeStart << ", " << theHasAngles << ", " << theAngles << ", " - << theHasRefPoint << ", " - << "SMESH.PointStruct( " - << ( theHasRefPoint ? theRefPoint.x : 0 ) << ", " - << ( theHasRefPoint ? theRefPoint.y : 0 ) << ", " - << ( theHasRefPoint ? theRefPoint.z : 0 ) << " ) )"; + << theHasRefPoint << ", " + << "SMESH.PointStruct( " + << ( theHasRefPoint ? theRefPoint.x : 0 ) << ", " + << ( theHasRefPoint ? theRefPoint.y : 0 ) << ", " + << ( theHasRefPoint ? theRefPoint.z : 0 ) << " ) )"; } return aGroups; } @@ -2485,14 +2465,14 @@ ExtrusionAlongPathObject1DMakeGroups(SMESH::SMESH_IDSource_ptr theObject, SMESH::ListOfGroups* SMESH_MeshEditor_i:: ExtrusionAlongPathObject2DMakeGroups(SMESH::SMESH_IDSource_ptr theObject, - SMESH::SMESH_Mesh_ptr thePathMesh, - GEOM::GEOM_Object_ptr thePathShape, - CORBA::Long theNodeStart, - CORBA::Boolean theHasAngles, - const SMESH::double_array& theAngles, - CORBA::Boolean theHasRefPoint, - const SMESH::PointStruct& theRefPoint, - SMESH::SMESH_MeshEditor::Extrusion_Error& Error) + SMESH::SMESH_Mesh_ptr thePathMesh, + GEOM::GEOM_Object_ptr thePathShape, + CORBA::Long theNodeStart, + CORBA::Boolean theHasAngles, + const SMESH::double_array& theAngles, + CORBA::Boolean theHasRefPoint, + const SMESH::PointStruct& theRefPoint, + SMESH::SMESH_MeshEditor::Extrusion_Error& Error) { SMESH::long_array_var anElementsId = theObject->GetIDs(); SMESH::ListOfGroups * aGroups = extrusionAlongPath( anElementsId, @@ -2505,8 +2485,8 @@ ExtrusionAlongPathObject2DMakeGroups(SMESH::SMESH_IDSource_ptr theObject, theRefPoint, true, Error, - SMDSAbs_Face); - + SMDSAbs_Face); + if ( !myPreviewMode ) { bool isDumpGroups = aGroups && aGroups->length() > 0; TPythonDump aPythonDump; @@ -2525,11 +2505,11 @@ ExtrusionAlongPathObject2DMakeGroups(SMESH::SMESH_IDSource_ptr theObject, << theNodeStart << ", " << theHasAngles << ", " << theAngles << ", " - << theHasRefPoint << ", " - << "SMESH.PointStruct( " - << ( theHasRefPoint ? theRefPoint.x : 0 ) << ", " - << ( theHasRefPoint ? theRefPoint.y : 0 ) << ", " - << ( theHasRefPoint ? theRefPoint.z : 0 ) << " ) )"; + << theHasRefPoint << ", " + << "SMESH.PointStruct( " + << ( theHasRefPoint ? theRefPoint.x : 0 ) << ", " + << ( theHasRefPoint ? theRefPoint.y : 0 ) << ", " + << ( theHasRefPoint ? theRefPoint.z : 0 ) << " ) )"; } return aGroups; } @@ -2541,30 +2521,30 @@ ExtrusionAlongPathObject2DMakeGroups(SMESH::SMESH_IDSource_ptr theObject, //======================================================================= SMESH::ListOfGroups* SMESH_MeshEditor_i:: ExtrusionAlongPathObjX(SMESH::SMESH_IDSource_ptr Object, - SMESH::SMESH_IDSource_ptr Path, - CORBA::Long NodeStart, - CORBA::Boolean HasAngles, - const SMESH::double_array& Angles, - CORBA::Boolean LinearVariation, - CORBA::Boolean HasRefPoint, - const SMESH::PointStruct& RefPoint, - CORBA::Boolean MakeGroups, - SMESH::ElementType ElemType, - SMESH::SMESH_MeshEditor::Extrusion_Error& Error) + SMESH::SMESH_IDSource_ptr Path, + CORBA::Long NodeStart, + CORBA::Boolean HasAngles, + const SMESH::double_array& Angles, + CORBA::Boolean LinearVariation, + CORBA::Boolean HasRefPoint, + const SMESH::PointStruct& RefPoint, + CORBA::Boolean MakeGroups, + SMESH::ElementType ElemType, + SMESH::SMESH_MeshEditor::Extrusion_Error& Error) { SMESH::long_array_var anElementsId = Object->GetIDs(); SMESH::ListOfGroups * aGroups = extrusionAlongPathX(anElementsId, - Path, - NodeStart, - HasAngles, - Angles, - LinearVariation, - HasRefPoint, - RefPoint, - MakeGroups, - (SMDSAbs_ElementType)ElemType, - Error); - + Path, + NodeStart, + HasAngles, + Angles, + LinearVariation, + HasRefPoint, + RefPoint, + MakeGroups, + (SMDSAbs_ElementType)ElemType, + Error); + if ( !myPreviewMode ) { bool isDumpGroups = aGroups && aGroups->length() > 0; TPythonDump aPythonDump; @@ -2582,13 +2562,14 @@ ExtrusionAlongPathObjX(SMESH::SMESH_IDSource_ptr Object, << NodeStart << ", " << HasAngles << ", " << Angles << ", " - << LinearVariation << ", " - << HasRefPoint << ", " - << "SMESH.PointStruct( " - << ( HasRefPoint ? RefPoint.x : 0 ) << ", " - << ( HasRefPoint ? RefPoint.y : 0 ) << ", " - << ( HasRefPoint ? RefPoint.z : 0 ) << " ), " - << ElemType << " )"; + << LinearVariation << ", " + << HasRefPoint << ", " + << "SMESH.PointStruct( " + << ( HasRefPoint ? RefPoint.x : 0 ) << ", " + << ( HasRefPoint ? RefPoint.y : 0 ) << ", " + << ( HasRefPoint ? RefPoint.z : 0 ) << " ), " + << MakeGroups << ", " + << ElemType << " )"; } return aGroups; } @@ -2600,29 +2581,29 @@ ExtrusionAlongPathObjX(SMESH::SMESH_IDSource_ptr Object, //======================================================================= SMESH::ListOfGroups* SMESH_MeshEditor_i:: ExtrusionAlongPathX(const SMESH::long_array& IDsOfElements, - SMESH::SMESH_IDSource_ptr Path, - CORBA::Long NodeStart, - CORBA::Boolean HasAngles, - const SMESH::double_array& Angles, - CORBA::Boolean LinearVariation, - CORBA::Boolean HasRefPoint, - const SMESH::PointStruct& RefPoint, - CORBA::Boolean MakeGroups, - SMESH::ElementType ElemType, - SMESH::SMESH_MeshEditor::Extrusion_Error& Error) + SMESH::SMESH_IDSource_ptr Path, + CORBA::Long NodeStart, + CORBA::Boolean HasAngles, + const SMESH::double_array& Angles, + CORBA::Boolean LinearVariation, + CORBA::Boolean HasRefPoint, + const SMESH::PointStruct& RefPoint, + CORBA::Boolean MakeGroups, + SMESH::ElementType ElemType, + SMESH::SMESH_MeshEditor::Extrusion_Error& Error) { SMESH::ListOfGroups * aGroups = extrusionAlongPathX(IDsOfElements, - Path, - NodeStart, - HasAngles, - Angles, - LinearVariation, - HasRefPoint, - RefPoint, - MakeGroups, - (SMDSAbs_ElementType)ElemType, - Error); - + Path, + NodeStart, + HasAngles, + Angles, + LinearVariation, + HasRefPoint, + RefPoint, + MakeGroups, + (SMDSAbs_ElementType)ElemType, + Error); + if ( !myPreviewMode ) { bool isDumpGroups = aGroups && aGroups->length() > 0; TPythonDump aPythonDump; @@ -2640,13 +2621,13 @@ ExtrusionAlongPathX(const SMESH::long_array& IDsOfElements, << NodeStart << ", " << HasAngles << ", " << Angles << ", " - << LinearVariation << ", " - << HasRefPoint << ", " - << "SMESH.PointStruct( " - << ( HasRefPoint ? RefPoint.x : 0 ) << ", " - << ( HasRefPoint ? RefPoint.y : 0 ) << ", " - << ( HasRefPoint ? RefPoint.z : 0 ) << " ), " - << ElemType << " )"; + << LinearVariation << ", " + << HasRefPoint << ", " + << "SMESH.PointStruct( " + << ( HasRefPoint ? RefPoint.x : 0 ) << ", " + << ( HasRefPoint ? RefPoint.y : 0 ) << ", " + << ( HasRefPoint ? RefPoint.z : 0 ) << " ), " + << ElemType << " )"; } return aGroups; } @@ -2656,10 +2637,10 @@ ExtrusionAlongPathX(const SMESH::long_array& IDsOfElements, /*! * \brief Compute rotation angles for ExtrusionAlongPath as linear variation * of given angles along path steps - * \param PathMesh mesh containing a 1D sub-mesh on the edge, along - * which proceeds the extrusion - * \param PathShape is shape(edge); as the mesh can be complex, the edge - * is used to define the sub-mesh for the path + * \param PathMesh mesh containing a 1D sub-mesh on the edge, along + * which proceeds the extrusion + * \param PathShape is shape(edge); as the mesh can be complex, the edge + * is used to define the sub-mesh for the path */ //================================================================================ @@ -2699,7 +2680,7 @@ SMESH_MeshEditor_i::LinearAnglesVariation(SMESH::SMESH_Mesh_ptr thePathMes int iP = int( angPrevFloor ); double angPrevCeil = ceil(angPrev); angle = ( angPrevCeil - angPrev ) * theAngles[ iP ]; - + int iC = int( angCurFloor ); if ( iC < nbAngles ) angle += ( angCur - angCurFloor ) * theAngles[ iC ]; @@ -2794,9 +2775,9 @@ void SMESH_MeshEditor_i::Mirror(const SMESH::long_array & theIDsOfElem //======================================================================= void SMESH_MeshEditor_i::MirrorObject(SMESH::SMESH_IDSource_ptr theObject, - const SMESH::AxisStruct & theAxis, - SMESH::SMESH_MeshEditor::MirrorType theMirrorType, - CORBA::Boolean theCopy) + const SMESH::AxisStruct & theAxis, + SMESH::SMESH_MeshEditor::MirrorType theMirrorType, + CORBA::Boolean theCopy) { if ( !myPreviewMode ) { TPythonDump() << this << ".MirrorObject( " @@ -2870,7 +2851,7 @@ SMESH_MeshEditor_i::MirrorMakeMesh(const SMESH::long_array& theIDsOfE SMESH::SMESH_Mesh_var mesh; { // open new scope to dump "MakeMesh" command // and then "GetGroups" using SMESH_Mesh::GetGroups() - + TPythonDump pydump; // to prevent dump at mesh creation mesh = makeMesh( theMeshName ); @@ -2880,7 +2861,7 @@ SMESH_MeshEditor_i::MirrorMakeMesh(const SMESH::long_array& theIDsOfE false, theCopyGroups, & mesh_i->GetImpl()); mesh_i->CreateGroupServants(); } - + if ( !myPreviewMode ) { pydump << mesh << " = " << this << ".MirrorMakeMesh( " << theIDsOfElements << ", " @@ -2894,7 +2875,7 @@ SMESH_MeshEditor_i::MirrorMakeMesh(const SMESH::long_array& theIDsOfE //dump "GetGroups" if(!myPreviewMode && mesh_i) mesh_i->GetGroups(); - + return mesh._retn(); } @@ -2914,7 +2895,7 @@ SMESH_MeshEditor_i::MirrorObjectMakeMesh(SMESH::SMESH_IDSource_ptr the SMESH::SMESH_Mesh_var mesh; { // open new scope to dump "MakeMesh" command // and then "GetGroups" using SMESH_Mesh::GetGroups() - + TPythonDump pydump; // to prevent dump at mesh creation mesh = makeMesh( theMeshName ); @@ -2939,7 +2920,7 @@ SMESH_MeshEditor_i::MirrorObjectMakeMesh(SMESH::SMESH_IDSource_ptr the //dump "GetGroups" if(!myPreviewMode && mesh_i) mesh_i->GetGroups(); - + return mesh._retn(); } @@ -3001,8 +2982,8 @@ void SMESH_MeshEditor_i::Translate(const SMESH::long_array & theIDsOfElements, //======================================================================= void SMESH_MeshEditor_i::TranslateObject(SMESH::SMESH_IDSource_ptr theObject, - const SMESH::DirStruct & theVector, - CORBA::Boolean theCopy) + const SMESH::DirStruct & theVector, + CORBA::Boolean theCopy) { if ( !myPreviewMode ) { TPythonDump() << this << ".TranslateObject( " @@ -3048,7 +3029,7 @@ SMESH_MeshEditor_i::TranslateObjectMakeGroups(SMESH::SMESH_IDSource_ptr theObjec { SMESH::long_array_var anElementsId = theObject->GetIDs(); SMESH::ListOfGroups * aGroups = translate(anElementsId, theVector, true, true); - + if ( !myPreviewMode ) { TPythonDump aPythonDump; @@ -3073,21 +3054,21 @@ SMESH_MeshEditor_i::TranslateMakeMesh(const SMESH::long_array& theIDsOfElements, { SMESH_Mesh_i* mesh_i; SMESH::SMESH_Mesh_var mesh; - + { // open new scope to dump "MakeMesh" command // and then "GetGroups" using SMESH_Mesh::GetGroups() TPythonDump pydump; // to prevent dump at mesh creation - + mesh = makeMesh( theMeshName ); mesh_i = SMESH::DownCast( mesh ); - + if ( mesh_i ) { translate(theIDsOfElements, theVector, false, theCopyGroups, & mesh_i->GetImpl()); mesh_i->CreateGroupServants(); } - + if ( !myPreviewMode ) { pydump << mesh << " = " << this << ".TranslateMakeMesh( " << theIDsOfElements << ", " @@ -3096,11 +3077,11 @@ SMESH_MeshEditor_i::TranslateMakeMesh(const SMESH::long_array& theIDsOfElements, << theMeshName << "' )"; } } - + //dump "GetGroups" if(!myPreviewMode && mesh_i) mesh_i->GetGroups(); - + return mesh._retn(); } @@ -3119,11 +3100,11 @@ SMESH_MeshEditor_i::TranslateObjectMakeMesh(SMESH::SMESH_IDSource_ptr theObject, SMESH::SMESH_Mesh_var mesh; { // open new scope to dump "MakeMesh" command // and then "GetGroups" using SMESH_Mesh::GetGroups() - + TPythonDump pydump; // to prevent dump at mesh creation mesh = makeMesh( theMeshName ); mesh_i = SMESH::DownCast( mesh ); - + if ( mesh_i ) { SMESH::long_array_var anElementsId = theObject->GetIDs(); translate(anElementsId, theVector, @@ -3138,11 +3119,11 @@ SMESH_MeshEditor_i::TranslateObjectMakeMesh(SMESH::SMESH_IDSource_ptr theObject, << theMeshName << "' )"; } } - + //dump "GetGroups" if(!myPreviewMode && mesh_i) mesh_i->GetGroups(); - + return mesh._retn(); } @@ -3210,9 +3191,9 @@ void SMESH_MeshEditor_i::Rotate(const SMESH::long_array & theIDsOfElements, //======================================================================= void SMESH_MeshEditor_i::RotateObject(SMESH::SMESH_IDSource_ptr theObject, - const SMESH::AxisStruct & theAxis, - CORBA::Double theAngle, - CORBA::Boolean theCopy) + const SMESH::AxisStruct & theAxis, + CORBA::Double theAngle, + CORBA::Boolean theCopy) { if ( !myPreviewMode ) { TPythonDump() << this << ".RotateObject( " @@ -3245,7 +3226,7 @@ SMESH_MeshEditor_i::RotateMakeGroups(const SMESH::long_array& theIDsOfElements, DumpGroupsList(aPythonDump,aGroups); aPythonDump << this << ".RotateMakeGroups( " << theIDsOfElements << ", " - << theAxis << ", " + << theAxis << ", " << theAngle << " )"; } return aGroups; @@ -3263,14 +3244,14 @@ SMESH_MeshEditor_i::RotateObjectMakeGroups(SMESH::SMESH_IDSource_ptr theObject, { SMESH::long_array_var anElementsId = theObject->GetIDs(); SMESH::ListOfGroups * aGroups = rotate(anElementsId,theAxis,theAngle,true,true); - + if ( !myPreviewMode ) { TPythonDump aPythonDump; DumpGroupsList(aPythonDump,aGroups); aPythonDump << this << ".RotateObjectMakeGroups( " - << theObject << ", " - << theAxis << ", " - << theAngle << " )"; + << theObject << ", " + << theAxis << ", " + << theAngle << " )"; } return aGroups; } @@ -3292,12 +3273,12 @@ SMESH_MeshEditor_i::RotateMakeMesh(const SMESH::long_array& theIDsOfElements, { // open new scope to dump "MakeMesh" command // and then "GetGroups" using SMESH_Mesh::GetGroups() - + TPythonDump pydump; // to prevent dump at mesh creation mesh = makeMesh( theMeshName ); mesh_i = SMESH::DownCast( mesh ); - + if ( mesh_i ) { rotate(theIDsOfElements, theAxis, theAngleInRadians, false, theCopyGroups, & mesh_i->GetImpl()); @@ -3312,11 +3293,11 @@ SMESH_MeshEditor_i::RotateMakeMesh(const SMESH::long_array& theIDsOfElements, << theMeshName << "' )"; } } - + //dump "GetGroups" if(!myPreviewMode && mesh_i) mesh_i->GetGroups(); - + return mesh._retn(); } @@ -3334,14 +3315,14 @@ SMESH_MeshEditor_i::RotateObjectMakeMesh(SMESH::SMESH_IDSource_ptr theObject, { SMESH::SMESH_Mesh_var mesh; SMESH_Mesh_i* mesh_i; - + {// open new scope to dump "MakeMesh" command // and then "GetGroups" using SMESH_Mesh::GetGroups() - + TPythonDump pydump; // to prevent dump at mesh creation mesh = makeMesh( theMeshName ); mesh_i = SMESH::DownCast( mesh ); - + if (mesh_i ) { SMESH::long_array_var anElementsId = theObject->GetIDs(); rotate(anElementsId, theAxis, theAngleInRadians, @@ -3357,11 +3338,11 @@ SMESH_MeshEditor_i::RotateObjectMakeMesh(SMESH::SMESH_IDSource_ptr theObject, << theMeshName << "' )"; } } - + //dump "GetGroups" if(!myPreviewMode && mesh_i) mesh_i->GetGroups(); - + return mesh._retn(); } @@ -3410,7 +3391,7 @@ void SMESH_MeshEditor_i::FindCoincidentNodesOnPart(SMESH::SMESH_IDSource_ptr set nodes; if ( !CORBA::is_nil(SMESH::SMESH_GroupBase::_narrow(theObject)) && - SMESH::SMESH_GroupBase::_narrow(theObject)->GetType() == SMESH::NODE) { + SMESH::SMESH_GroupBase::_narrow(theObject)->GetType() == SMESH::NODE) { for(int i = 0; i < aElementsId->length(); i++) { CORBA::Long ind = aElementsId[i]; const SMDS_MeshNode * elem = aMesh->FindNode(ind); @@ -3429,13 +3410,13 @@ void SMESH_MeshEditor_i::FindCoincidentNodesOnPart(SMESH::SMESH_IDSource_ptr } } } - - + + ::SMESH_MeshEditor::TListOfListOfNodes aListOfListOfNodes; ::SMESH_MeshEditor anEditor( myMesh ); if(!nodes.empty()) anEditor.FindCoincidentNodes( nodes, Tolerance, aListOfListOfNodes ); - + GroupsOfNodes = new SMESH::array_of_long_array; GroupsOfNodes->length( aListOfListOfNodes.size() ); ::SMESH_MeshEditor::TListOfListOfNodes::iterator llIt = aListOfListOfNodes.begin(); @@ -3495,11 +3476,11 @@ void SMESH_MeshEditor_i::MergeNodes (const SMESH::array_of_long_array& GroupsOfN //purpose : //======================================================================= void SMESH_MeshEditor_i::FindEqualElements(SMESH::SMESH_IDSource_ptr theObject, - SMESH::array_of_long_array_out GroupsOfElementsID) + SMESH::array_of_long_array_out GroupsOfElementsID) { initData(); if ( !(!CORBA::is_nil(SMESH::SMESH_GroupBase::_narrow(theObject)) && - SMESH::SMESH_GroupBase::_narrow(theObject)->GetType() == SMESH::NODE) ) { + SMESH::SMESH_GroupBase::_narrow(theObject)->GetType() == SMESH::NODE) ) { typedef list TListOfIDs; set elems; SMESH::long_array_var aElementsId = theObject->GetIDs(); @@ -3509,7 +3490,7 @@ void SMESH_MeshEditor_i::FindEqualElements(SMESH::SMESH_IDSource_ptr theObj CORBA::Long anID = aElementsId[i]; const SMDS_MeshElement * elem = aMesh->FindElement(anID); if (elem) { - elems.insert(elem); + elems.insert(elem); } } @@ -3527,12 +3508,12 @@ void SMESH_MeshEditor_i::FindEqualElements(SMESH::SMESH_IDSource_ptr theObj aGroup.length( listOfIDs.size() ); TListOfIDs::iterator idIt = listOfIDs.begin(); for (int k = 0; idIt != listOfIDs.end(); ++idIt, ++k ) { - aGroup[ k ] = *idIt; + aGroup[ k ] = *idIt; } } - TPythonDump() << "equal_elements = " << this << ".FindEqualElements( " - <FindNode( NodeID ); + if ( !node ) + return false; + + if ( theNodeSearcher ) + theSearchersDeleter.Set( myMesh ); // remove theNodeSearcher if mesh is other + + if ( theNodeSearcher ) // move node and update theNodeSearcher data accordingly + theNodeSearcher->MoveNode(node, gp_Pnt( x,y,z )); + else + GetMeshDS()->MoveNode(node, x, y, z); + + // Update Python script + TPythonDump() << "isDone = " << this << ".MoveNode( " + << NodeID << ", " << x << ", " << y << ", " << z << " )"; + + return true; +} + +//================================================================================ +/*! + * \brief Return ID of node closest to a given point + */ +//================================================================================ + +CORBA::Long SMESH_MeshEditor_i::FindNodeClosestTo(CORBA::Double x, + CORBA::Double y, + CORBA::Double z) +{ + theSearchersDeleter.Set( myMesh ); // remove theNodeSearcher if mesh is other + + if ( !theNodeSearcher ) { + ::SMESH_MeshEditor anEditor( myMesh ); + theNodeSearcher = anEditor.GetNodeSearcher(); + } + gp_Pnt p( x,y,z ); + if ( const SMDS_MeshNode* node = theNodeSearcher->FindClosestTo( p )) + return node->GetID(); + + return 0; +} + //================================================================================ /*! * \brief If the given ID is a valid node ID (nodeID > 0), just move this node, else @@ -3597,24 +3633,24 @@ CORBA::Long SMESH_MeshEditor_i::MoveClosestNodeToPoint(CORBA::Double x, CORBA::Double z, CORBA::Long theNodeID) { - // We keep myNodeSearcher until any mesh modification: - // 1) initData() deletes myNodeSearcher at any edition, - // 2) TNodeSearcherDeleter - at any mesh compute event and mesh change + // We keep theNodeSearcher until any mesh modification: + // 1) initData() deletes theNodeSearcher at any edition, + // 2) TSearchersDeleter - at any mesh compute event and mesh change - initData(); + initData(/*deleteSearchers=*/false); + + theSearchersDeleter.Set( myMesh ); // remove theNodeSearcher if mesh is other int nodeID = theNodeID; const SMDS_MeshNode* node = GetMeshDS()->FindNode( nodeID ); - if ( !node ) + if ( !node ) // preview moving node { - static TNodeSearcherDeleter deleter; - deleter.Set( myMesh ); - if ( !myNodeSearcher ) { + if ( !theNodeSearcher ) { ::SMESH_MeshEditor anEditor( myMesh ); - myNodeSearcher = anEditor.GetNodeSearcher(); + theNodeSearcher = anEditor.GetNodeSearcher(); } gp_Pnt p( x,y,z ); - node = myNodeSearcher->FindClosestTo( p ); + node = theNodeSearcher->FindClosestTo( p ); } if ( node ) { nodeID = node->GetID(); @@ -3638,6 +3674,10 @@ CORBA::Long SMESH_MeshEditor_i::MoveClosestNodeToPoint(CORBA::Double x, ::SMESH_MeshEditor anEditor( & tmpMesh ); storeResult( anEditor ); } + else if ( theNodeSearcher ) // move node and update theNodeSearcher data accordingly + { + theNodeSearcher->MoveNode(node, gp_Pnt( x,y,z )); + } else { GetMeshDS()->MoveNode(node, x, y, z); @@ -3653,6 +3693,44 @@ CORBA::Long SMESH_MeshEditor_i::MoveClosestNodeToPoint(CORBA::Double x, return nodeID; } +//======================================================================= +/*! + * Return elements of given type where the given point is IN or ON. + * + * 'ALL' type means elements of any type excluding nodes + */ +//======================================================================= + +SMESH::long_array* SMESH_MeshEditor_i::FindElementsByPoint(CORBA::Double x, + CORBA::Double y, + CORBA::Double z, + SMESH::ElementType type) +{ + SMESH::long_array_var res = new SMESH::long_array; + vector< const SMDS_MeshElement* > foundElems; + + theSearchersDeleter.Set( myMesh ); + if ( !theElementSearcher ) { + ::SMESH_MeshEditor anEditor( myMesh ); + theElementSearcher = anEditor.GetElementSearcher(); + } + theElementSearcher->FindElementsByPoint( gp_Pnt( x,y,z ), + SMDSAbs_ElementType( type ), + foundElems); + res->length( foundElems.size() ); + for ( int i = 0; i < foundElems.size(); ++i ) + res[i] = foundElems[i]->GetID(); + + if ( !myPreviewMode ) // call from tui + TPythonDump() << res << " = " << this << ".FindElementsByPoint( " + << x << ", " + << y << ", " + << z << ", " + << type << " )"; + + return res._retn(); +} + //======================================================================= //function : convError //purpose : @@ -3663,16 +3741,16 @@ CORBA::Long SMESH_MeshEditor_i::MoveClosestNodeToPoint(CORBA::Double x, static SMESH::SMESH_MeshEditor::Sew_Error convError( const::SMESH_MeshEditor::Sew_Error e ) { switch ( e ) { - RETCASE( SEW_OK ); - RETCASE( SEW_BORDER1_NOT_FOUND ); - RETCASE( SEW_BORDER2_NOT_FOUND ); - RETCASE( SEW_BOTH_BORDERS_NOT_FOUND ); - RETCASE( SEW_BAD_SIDE_NODES ); - RETCASE( SEW_VOLUMES_TO_SPLIT ); - RETCASE( SEW_DIFF_NB_OF_ELEMENTS ); - RETCASE( SEW_TOPO_DIFF_SETS_OF_ELEMENTS ); - RETCASE( SEW_BAD_SIDE1_NODES ); - RETCASE( SEW_BAD_SIDE2_NODES ); + RETCASE( SEW_OK ); + RETCASE( SEW_BORDER1_NOT_FOUND ); + RETCASE( SEW_BORDER2_NOT_FOUND ); + RETCASE( SEW_BOTH_BORDERS_NOT_FOUND ); + RETCASE( SEW_BAD_SIDE_NODES ); + RETCASE( SEW_VOLUMES_TO_SPLIT ); + RETCASE( SEW_DIFF_NB_OF_ELEMENTS ); + RETCASE( SEW_TOPO_DIFF_SETS_OF_ELEMENTS ); + RETCASE( SEW_BAD_SIDE1_NODES ); + RETCASE( SEW_BAD_SIDE2_NODES ); } return SMESH::SMESH_MeshEditor::SEW_OK; } @@ -3683,14 +3761,14 @@ static SMESH::SMESH_MeshEditor::Sew_Error convError( const::SMESH_MeshEditor::Se //======================================================================= SMESH::SMESH_MeshEditor::Sew_Error - SMESH_MeshEditor_i::SewFreeBorders(CORBA::Long FirstNodeID1, - CORBA::Long SecondNodeID1, - CORBA::Long LastNodeID1, - CORBA::Long FirstNodeID2, - CORBA::Long SecondNodeID2, - CORBA::Long LastNodeID2, - CORBA::Boolean CreatePolygons, - CORBA::Boolean CreatePolyedrs) +SMESH_MeshEditor_i::SewFreeBorders(CORBA::Long FirstNodeID1, + CORBA::Long SecondNodeID1, + CORBA::Long LastNodeID1, + CORBA::Long FirstNodeID2, + CORBA::Long SecondNodeID2, + CORBA::Long LastNodeID2, + CORBA::Boolean CreatePolygons, + CORBA::Boolean CreatePolyedrs) { initData(); @@ -3912,9 +3990,9 @@ SMESH_MeshEditor_i::SewSideElements(const SMESH::long_array& IDsOfSide1Elements, //================================================================================ /*! * \brief Set new nodes for given element - * \param ide - element id - * \param newIDs - new node ids - * \retval CORBA::Boolean - true if result is OK + * \param ide - element id + * \param newIDs - new node ids + * \retval CORBA::Boolean - true if result is OK */ //================================================================================ @@ -3945,11 +4023,11 @@ CORBA::Boolean SMESH_MeshEditor_i::ChangeElemNodes(CORBA::Long ide, return GetMeshDS()->ChangeElementNodes( elem, & aNodes[0], nbn1+1 ); } - + //================================================================================ /*! * \brief Update myLastCreated* or myPreviewData - * \param anEditor - it contains last modification results + * \param anEditor - it contains last modification results */ //================================================================================ @@ -4007,8 +4085,8 @@ void SMESH_MeshEditor_i::storeResult(::SMESH_MeshEditor& anEditor) /*if (aMeshElem->GetType() == SMDSAbs_Volume) { aType = SMDSAbs_Node; isPoly = false; - } - else*/ { + } + else*/ { aType = aMeshElem->GetType(); isPoly = aMeshElem->IsPoly(); } @@ -4026,7 +4104,7 @@ void SMESH_MeshEditor_i::storeResult(::SMESH_MeshEditor& anEditor) myPreviewData->elementConnectivities.length(aNodesConnectivity.size()); for( int i = 0; aConnIter != aNodesConnectivity.end(); aConnIter++, i++ ) myPreviewData->elementConnectivities[i] = *aConnIter; - + return; } @@ -4060,7 +4138,7 @@ SMESH::MeshPreviewStruct* SMESH_MeshEditor_i::GetPreviewData() //================================================================================ /*! * \brief Returns list of it's IDs of created nodes - * \retval SMESH::long_array* - list of node ID + * \retval SMESH::long_array* - list of node ID */ //================================================================================ @@ -4072,7 +4150,7 @@ SMESH::long_array* SMESH_MeshEditor_i::GetLastCreatedNodes() //================================================================================ /*! * \brief Returns list of it's IDs of created elements - * \retval SMESH::long_array* - list of elements' ID + * \retval SMESH::long_array* - list of elements' ID */ //================================================================================ @@ -4136,23 +4214,159 @@ void SMESH_MeshEditor_i::DumpGroupsList(TPythonDump & theDumpPytho } } +//================================================================================ +/*! + \brief Creates a hole in a mesh by doubling the nodes of some particular elements + \param theNodes - identifiers of nodes to be doubled + \param theModifiedElems - identifiers of elements to be updated by the new (doubled) + nodes. If list of element identifiers is empty then nodes are doubled but + they not assigned to elements + \return TRUE if operation has been completed successfully, FALSE otherwise + \sa DoubleNode(), DoubleNodeGroup(), DoubleNodeGroups() +*/ +//================================================================================ + +CORBA::Boolean SMESH_MeshEditor_i::DoubleNodes( const SMESH::long_array& theNodes, + const SMESH::long_array& theModifiedElems ) +{ + initData(); + + ::SMESH_MeshEditor aMeshEditor( myMesh ); + list< int > aListOfNodes; + int i, n; + for ( i = 0, n = theNodes.length(); i < n; i++ ) + aListOfNodes.push_back( theNodes[ i ] ); + + list< int > aListOfElems; + for ( i = 0, n = theModifiedElems.length(); i < n; i++ ) + aListOfElems.push_back( theModifiedElems[ i ] ); + + bool aResult = aMeshEditor.DoubleNodes( aListOfNodes, aListOfElems ); + + storeResult( aMeshEditor) ; + + return aResult; +} + +//================================================================================ +/*! + \brief Creates a hole in a mesh by doubling the nodes of some particular elements + This method provided for convenience works as DoubleNodes() described above. + \param theNodeId - identifier of node to be doubled. + \param theModifiedElems - identifiers of elements to be updated. + \return TRUE if operation has been completed successfully, FALSE otherwise + \sa DoubleNodes(), DoubleNodeGroup(), DoubleNodeGroups() +*/ +//================================================================================ + +CORBA::Boolean SMESH_MeshEditor_i::DoubleNode( CORBA::Long theNodeId, + const SMESH::long_array& theModifiedElems ) +{ + SMESH::long_array_var aNodes = new SMESH::long_array; + aNodes->length( 1 ); + aNodes[ 0 ] = theNodeId; + return DoubleNodes( aNodes, theModifiedElems ); +} + +//================================================================================ +/*! + \brief Creates a hole in a mesh by doubling the nodes of some particular elements + This method provided for convenience works as DoubleNodes() described above. + \param theNodes - group of nodes to be doubled. + \param theModifiedElems - group of elements to be updated. + \return TRUE if operation has been completed successfully, FALSE otherwise + \sa DoubleNode(), DoubleNodes(), DoubleNodeGroups() +*/ +//================================================================================ + +CORBA::Boolean SMESH_MeshEditor_i::DoubleNodeGroup( + SMESH::SMESH_GroupBase_ptr theNodes, + SMESH::SMESH_GroupBase_ptr theModifiedElems ) +{ + if ( CORBA::is_nil( theNodes ) && theNodes->GetType() != SMESH::NODE ) + return false; + + SMESH::long_array_var aNodes = theNodes->GetListOfID(); + SMESH::long_array_var aModifiedElems; + if ( !CORBA::is_nil( theModifiedElems ) ) + aModifiedElems = theModifiedElems->GetListOfID(); + else + { + aModifiedElems = new SMESH::long_array; + aModifiedElems->length( 0 ); + } + + return DoubleNodes( aNodes, aModifiedElems ); +} + +//================================================================================ +/*! + \brief Creates a hole in a mesh by doubling the nodes of some particular elements + This method provided for convenience works as DoubleNodes() described above. + \param theNodes - list of groups of nodes to be doubled + \param theModifiedElems - list of groups of elements to be updated. + \return TRUE if operation has been completed successfully, FALSE otherwise + \sa DoubleNode(), DoubleNodeGroup(), DoubleNodes() +*/ +//================================================================================ + +CORBA::Boolean SMESH_MeshEditor_i::DoubleNodeGroups( + const SMESH::ListOfGroups& theNodes, + const SMESH::ListOfGroups& theModifiedElems ) +{ + initData(); + + ::SMESH_MeshEditor aMeshEditor( myMesh ); + + std::list< int > aNodes; + int i, n, j, m; + for ( i = 0, n = theNodes.length(); i < n; i++ ) + { + SMESH::SMESH_GroupBase_var aGrp = theNodes[ i ]; + if ( !CORBA::is_nil( aGrp ) && aGrp->GetType() == SMESH::NODE ) + { + SMESH::long_array_var aCurr = aGrp->GetListOfID(); + for ( j = 0, m = aCurr->length(); j < m; j++ ) + aNodes.push_back( aCurr[ j ] ); + } + } + + std::list< int > anElems; + for ( i = 0, n = theModifiedElems.length(); i < n; i++ ) + { + SMESH::SMESH_GroupBase_var aGrp = theModifiedElems[ i ]; + if ( !CORBA::is_nil( aGrp ) && aGrp->GetType() != SMESH::NODE ) + { + SMESH::long_array_var aCurr = aGrp->GetListOfID(); + for ( j = 0, m = aCurr->length(); j < m; j++ ) + anElems.push_back( aCurr[ j ] ); + } + } + + bool aResult = aMeshEditor.DoubleNodes( aNodes, anElems ); + + storeResult( aMeshEditor) ; + + return aResult; +} + //================================================================================ /*! \brief Creates a hole in a mesh by doubling the nodes of some particular elements \param theElems - the list of elements (edges or faces) to be replicated - The nodes for duplication could be found from these elements + The nodes for duplication could be found from these elements \param theNodesNot - list of nodes to NOT replicate \param theAffectedElems - the list of elements (cells and edges) to which the - replicated nodes should be associated to. + replicated nodes should be associated to. \return TRUE if operation has been completed successfully, FALSE otherwise \sa DoubleNodeGroup(), DoubleNodeGroups() */ //================================================================================ -CORBA::Boolean SMESH_MeshEditor_i::DoubleNodes( const SMESH::long_array& theElems, - const SMESH::long_array& theNodesNot, - const SMESH::long_array& theAffectedElems ) - +CORBA::Boolean SMESH_MeshEditor_i::DoubleNodeElem( const SMESH::long_array& theElems, + const SMESH::long_array& theNodesNot, + const SMESH::long_array& theAffectedElems ) + { initData(); @@ -4168,6 +4382,9 @@ CORBA::Boolean SMESH_MeshEditor_i::DoubleNodes( const SMESH::long_array& theElem storeResult( aMeshEditor) ; + // Update Python script + TPythonDump() << "isDone = " << this << ".DoubleNodes( " << theElems << ", " + << theNodesNot << ", " << theAffectedElems << " )"; return aResult; } @@ -4175,21 +4392,21 @@ CORBA::Boolean SMESH_MeshEditor_i::DoubleNodes( const SMESH::long_array& theElem /*! \brief Creates a hole in a mesh by doubling the nodes of some particular elements \param theElems - the list of elements (edges or faces) to be replicated - The nodes for duplication could be found from these elements + The nodes for duplication could be found from these elements \param theNodesNot - list of nodes to NOT replicate \param theShape - shape to detect affected elements (element which geometric center - located on or inside shape). - The replicated nodes should be associated to affected elements. + located on or inside shape). + The replicated nodes should be associated to affected elements. \return TRUE if operation has been completed successfully, FALSE otherwise \sa DoubleNodeGroupInRegion(), DoubleNodeGroupsInRegion() */ //================================================================================ -CORBA::Boolean SMESH_MeshEditor_i::DoubleNodesInRegion - ( const SMESH::long_array& theElems, - const SMESH::long_array& theNodesNot, - GEOM::GEOM_Object_ptr theShape ) - +CORBA::Boolean SMESH_MeshEditor_i::DoubleNodeElemInRegion +( const SMESH::long_array& theElems, + const SMESH::long_array& theNodesNot, + GEOM::GEOM_Object_ptr theShape ) + { initData(); @@ -4205,6 +4422,9 @@ CORBA::Boolean SMESH_MeshEditor_i::DoubleNodesInRegion storeResult( aMeshEditor) ; + // Update Python script + TPythonDump() << "isDone = " << this << ".DoubleNodesInRegion( " << theElems << ", " + << theNodesNot << ", " << theShape << " )"; return aResult; } @@ -4214,7 +4434,7 @@ CORBA::Boolean SMESH_MeshEditor_i::DoubleNodesInRegion \param theElems - group of of elements (edges or faces) to be replicated \param theNodesNot - group of nodes not to replicated \param theAffectedElems - group of elements to which the replicated nodes - should be associated to. + should be associated to. \return TRUE if operation has been completed successfully, FALSE otherwise \sa DoubleNodes(), DoubleNodeGroups() */ @@ -4224,7 +4444,7 @@ static void groupToSet(SMESH::SMESH_GroupBase_ptr theGrp, SMESHDS_Mesh* theMeshDS, TIDSortedElemSet& theElemSet, const SMDSAbs_ElementType theType) - + { if ( CORBA::is_nil( theGrp ) ) return; @@ -4232,15 +4452,15 @@ static void groupToSet(SMESH::SMESH_GroupBase_ptr theGrp, arrayToSet( anIDs, theMeshDS, theElemSet, theType); } -CORBA::Boolean SMESH_MeshEditor_i::DoubleNodeGroup( - SMESH::SMESH_GroupBase_ptr theElems, - SMESH::SMESH_GroupBase_ptr theNodesNot, - SMESH::SMESH_GroupBase_ptr theAffectedElems ) +CORBA::Boolean SMESH_MeshEditor_i::DoubleNodeElemGroup( + SMESH::SMESH_GroupBase_ptr theElems, + SMESH::SMESH_GroupBase_ptr theNodesNot, + SMESH::SMESH_GroupBase_ptr theAffectedElems ) { if ( CORBA::is_nil( theElems ) && theElems->GetType() == SMESH::NODE ) return false; - + initData(); ::SMESH_MeshEditor aMeshEditor( myMesh ); @@ -4255,6 +4475,9 @@ CORBA::Boolean SMESH_MeshEditor_i::DoubleNodeGroup( storeResult( aMeshEditor) ; + // Update Python script + TPythonDump() << "isDone = " << this << ".DoubleNodeGroup( " << theElems << ", " + << theNodesNot << ", " << theAffectedElems << " )"; return aResult; } @@ -4264,22 +4487,22 @@ CORBA::Boolean SMESH_MeshEditor_i::DoubleNodeGroup( \param theElems - group of of elements (edges or faces) to be replicated \param theNodesNot - group of nodes not to replicated \param theShape - shape to detect affected elements (element which geometric center - located on or inside shape). - The replicated nodes should be associated to affected elements. + located on or inside shape). + The replicated nodes should be associated to affected elements. \return TRUE if operation has been completed successfully, FALSE otherwise \sa DoubleNodesInRegion(), DoubleNodeGroupsInRegion() */ //================================================================================ -CORBA::Boolean SMESH_MeshEditor_i::DoubleNodeGroupInRegion( - SMESH::SMESH_GroupBase_ptr theElems, - SMESH::SMESH_GroupBase_ptr theNodesNot, - GEOM::GEOM_Object_ptr theShape ) +CORBA::Boolean SMESH_MeshEditor_i::DoubleNodeElemGroupInRegion( + SMESH::SMESH_GroupBase_ptr theElems, + SMESH::SMESH_GroupBase_ptr theNodesNot, + GEOM::GEOM_Object_ptr theShape ) { if ( CORBA::is_nil( theElems ) && theElems->GetType() == SMESH::NODE ) return false; - + initData(); ::SMESH_MeshEditor aMeshEditor( myMesh ); @@ -4294,6 +4517,9 @@ CORBA::Boolean SMESH_MeshEditor_i::DoubleNodeGroupInRegion( storeResult( aMeshEditor) ; + // Update Python script + TPythonDump() << "isDone = " << this << ".DoubleNodeGroupInRegion( " << theElems << ", " + << theNodesNot << ", " << theShape << " )"; return aResult; } @@ -4304,7 +4530,7 @@ CORBA::Boolean SMESH_MeshEditor_i::DoubleNodeGroupInRegion( \param theElems - list of groups of elements (edges or faces) to be replicated \param theNodesNot - list of groups of nodes not to replicated \param theAffectedElems - group of elements to which the replicated nodes - should be associated to. + should be associated to. \return TRUE if operation has been completed successfully, FALSE otherwise \sa DoubleNodeGroup(), DoubleNodes() */ @@ -4319,7 +4545,7 @@ static void listOfGroupToSet(const SMESH::ListOfGroups& theGrpList, { SMESH::SMESH_GroupBase_var aGrp = theGrpList[ i ]; if ( !CORBA::is_nil( aGrp ) && (theIsNodeGrp ? aGrp->GetType() == SMESH::NODE - : aGrp->GetType() != SMESH::NODE ) ) + : aGrp->GetType() != SMESH::NODE ) ) { SMESH::long_array_var anIDs = aGrp->GetIDs(); arrayToSet( anIDs, theMeshDS, theElemSet, theIsNodeGrp ? SMDSAbs_Node : SMDSAbs_All ); @@ -4327,10 +4553,10 @@ static void listOfGroupToSet(const SMESH::ListOfGroups& theGrpList, } } -CORBA::Boolean SMESH_MeshEditor_i::DoubleNodeGroups( - const SMESH::ListOfGroups& theElems, - const SMESH::ListOfGroups& theNodesNot, - const SMESH::ListOfGroups& theAffectedElems ) +CORBA::Boolean SMESH_MeshEditor_i::DoubleNodeElemGroups( + const SMESH::ListOfGroups& theElems, + const SMESH::ListOfGroups& theNodesNot, + const SMESH::ListOfGroups& theAffectedElems ) { initData(); @@ -4346,6 +4572,9 @@ CORBA::Boolean SMESH_MeshEditor_i::DoubleNodeGroups( storeResult( aMeshEditor) ; + // Update Python script + TPythonDump() << "isDone = " << this << ".DoubleNodeGroups( " << &theElems << ", " + << &theNodesNot << ", " << &theAffectedElems << " )"; return aResult; } @@ -4356,17 +4585,17 @@ CORBA::Boolean SMESH_MeshEditor_i::DoubleNodeGroups( \param theElems - list of groups of elements (edges or faces) to be replicated \param theNodesNot - list of groups of nodes not to replicated \param theShape - shape to detect affected elements (element which geometric center - located on or inside shape). - The replicated nodes should be associated to affected elements. + located on or inside shape). + The replicated nodes should be associated to affected elements. \return TRUE if operation has been completed successfully, FALSE otherwise \sa DoubleNodeGroupInRegion(), DoubleNodesInRegion() */ //================================================================================ -CORBA::Boolean SMESH_MeshEditor_i::DoubleNodeGroupsInRegion( - const SMESH::ListOfGroups& theElems, - const SMESH::ListOfGroups& theNodesNot, - GEOM::GEOM_Object_ptr theShape ) +CORBA::Boolean SMESH_MeshEditor_i::DoubleNodeElemGroupsInRegion( + const SMESH::ListOfGroups& theElems, + const SMESH::ListOfGroups& theNodesNot, + GEOM::GEOM_Object_ptr theShape ) { initData(); @@ -4382,5 +4611,28 @@ CORBA::Boolean SMESH_MeshEditor_i::DoubleNodeGroupsInRegion( storeResult( aMeshEditor) ; + // Update Python script + TPythonDump() << "isDone = " << this << ".DoubleNodeGroupsInRegion( " << &theElems << ", " + << &theNodesNot << ", " << theShape << " )"; + return aResult; +} + +//================================================================================ +/*! + \brief Generated skin mesh (containing 2D cells) from 3D mesh + The created 2D mesh elements based on nodes of free faces of boundary volumes + \return TRUE if operation has been completed successfully, FALSE otherwise +*/ +//================================================================================ + +CORBA::Boolean SMESH_MeshEditor_i::Make2DMeshFrom3D() +{ + initData(); + + ::SMESH_MeshEditor aMeshEditor( myMesh ); + bool aResult = aMeshEditor.Make2DMeshFrom3D(); + storeResult( aMeshEditor) ; + + TPythonDump() << "isDone = " << this << ".Make2DMeshFrom3D()"; return aResult; } diff --git a/src/SMESH_I/SMESH_MeshEditor_i.hxx b/src/SMESH_I/SMESH_MeshEditor_i.hxx index 73df0b465..5c4dd85ca 100644 --- a/src/SMESH_I/SMESH_MeshEditor_i.hxx +++ b/src/SMESH_I/SMESH_MeshEditor_i.hxx @@ -138,10 +138,10 @@ class SMESH_MeshEditor_i: public POA_SMESH::SMESH_MeshEditor CORBA::Double MaxAspectRatio, SMESH::SMESH_MeshEditor::Smooth_Method Method); CORBA::Boolean SmoothObject(SMESH::SMESH_IDSource_ptr theObject, - const SMESH::long_array & IDsOfFixedNodes, - CORBA::Long MaxNbOfIterations, - CORBA::Double MaxAspectRatio, - SMESH::SMESH_MeshEditor::Smooth_Method Method); + const SMESH::long_array & IDsOfFixedNodes, + CORBA::Long MaxNbOfIterations, + CORBA::Double MaxAspectRatio, + SMESH::SMESH_MeshEditor::Smooth_Method Method); CORBA::Boolean SmoothParametric(const SMESH::long_array & IDsOfElements, const SMESH::long_array & IDsOfFixedNodes, CORBA::Long MaxNbOfIterations, @@ -159,10 +159,10 @@ class SMESH_MeshEditor_i: public POA_SMESH::SMESH_MeshEditor SMESH::SMESH_MeshEditor::Smooth_Method Method, bool IsParametric); CORBA::Boolean smoothObject(SMESH::SMESH_IDSource_ptr theObject, - const SMESH::long_array & IDsOfFixedNodes, - CORBA::Long MaxNbOfIterations, - CORBA::Double MaxAspectRatio, - SMESH::SMESH_MeshEditor::Smooth_Method Method, + const SMESH::long_array & IDsOfFixedNodes, + CORBA::Long MaxNbOfIterations, + CORBA::Double MaxAspectRatio, + SMESH::SMESH_MeshEditor::Smooth_Method Method, bool IsParametric); @@ -178,27 +178,27 @@ class SMESH_MeshEditor_i: public POA_SMESH::SMESH_MeshEditor CORBA::Long NbOfSteps, CORBA::Double Tolerance); void RotationSweepObject(SMESH::SMESH_IDSource_ptr theObject, - const SMESH::AxisStruct & Axis, - CORBA::Double AngleInRadians, - CORBA::Long NbOfSteps, - CORBA::Double Tolerance); + const SMESH::AxisStruct & Axis, + CORBA::Double AngleInRadians, + CORBA::Long NbOfSteps, + CORBA::Double Tolerance); void RotationSweepObject1D(SMESH::SMESH_IDSource_ptr theObject, - const SMESH::AxisStruct & Axis, - CORBA::Double AngleInRadians, - CORBA::Long NbOfSteps, - CORBA::Double Tolerance); + const SMESH::AxisStruct & Axis, + CORBA::Double AngleInRadians, + CORBA::Long NbOfSteps, + CORBA::Double Tolerance); void RotationSweepObject2D(SMESH::SMESH_IDSource_ptr theObject, - const SMESH::AxisStruct & Axis, - CORBA::Double AngleInRadians, - CORBA::Long NbOfSteps, - CORBA::Double Tolerance); + const SMESH::AxisStruct & Axis, + CORBA::Double AngleInRadians, + CORBA::Long NbOfSteps, + CORBA::Double Tolerance); void ExtrusionSweep(const SMESH::long_array & IDsOfElements, const SMESH::DirStruct & StepVector, CORBA::Long NbOfSteps); void ExtrusionSweepObject(SMESH::SMESH_IDSource_ptr theObject, - const SMESH::DirStruct & StepVector, - CORBA::Long NbOfSteps); + const SMESH::DirStruct & StepVector, + CORBA::Long NbOfSteps); void ExtrusionSweepObject1D(SMESH::SMESH_IDSource_ptr theObject, const SMESH::DirStruct & StepVector, CORBA::Long NbOfSteps); @@ -206,23 +206,32 @@ class SMESH_MeshEditor_i: public POA_SMESH::SMESH_MeshEditor const SMESH::DirStruct & StepVector, CORBA::Long NbOfSteps); void AdvancedExtrusion(const SMESH::long_array & theIDsOfElements, - const SMESH::DirStruct & theStepVector, - CORBA::Long theNbOfSteps, - CORBA::Long theExtrFlags, - CORBA::Double theSewTolerance); + const SMESH::DirStruct & theStepVector, + CORBA::Long theNbOfSteps, + CORBA::Long theExtrFlags, + CORBA::Double theSewTolerance); SMESH::SMESH_MeshEditor::Extrusion_Error - ExtrusionAlongPath(const SMESH::long_array & IDsOfElements, - SMESH::SMESH_Mesh_ptr PathMesh, - GEOM::GEOM_Object_ptr PathShape, - CORBA::Long NodeStart, - CORBA::Boolean HasAngles, - const SMESH::double_array & Angles, - CORBA::Boolean HasRefPoint, - const SMESH::PointStruct & RefPoint); + ExtrusionAlongPath(const SMESH::long_array & IDsOfElements, + SMESH::SMESH_Mesh_ptr PathMesh, + GEOM::GEOM_Object_ptr PathShape, + CORBA::Long NodeStart, + CORBA::Boolean HasAngles, + const SMESH::double_array & Angles, + CORBA::Boolean HasRefPoint, + const SMESH::PointStruct & RefPoint); SMESH::SMESH_MeshEditor::Extrusion_Error - ExtrusionAlongPathObject(SMESH::SMESH_IDSource_ptr theObject, + ExtrusionAlongPathObject(SMESH::SMESH_IDSource_ptr theObject, + SMESH::SMESH_Mesh_ptr PathMesh, + GEOM::GEOM_Object_ptr PathShape, + CORBA::Long NodeStart, + CORBA::Boolean HasAngles, + const SMESH::double_array & Angles, + CORBA::Boolean HasRefPoint, + const SMESH::PointStruct & RefPoint); + SMESH::SMESH_MeshEditor::Extrusion_Error + ExtrusionAlongPathObject1D(SMESH::SMESH_IDSource_ptr theObject, SMESH::SMESH_Mesh_ptr PathMesh, GEOM::GEOM_Object_ptr PathShape, CORBA::Long NodeStart, @@ -231,23 +240,14 @@ class SMESH_MeshEditor_i: public POA_SMESH::SMESH_MeshEditor CORBA::Boolean HasRefPoint, const SMESH::PointStruct & RefPoint); SMESH::SMESH_MeshEditor::Extrusion_Error - ExtrusionAlongPathObject1D(SMESH::SMESH_IDSource_ptr theObject, - SMESH::SMESH_Mesh_ptr PathMesh, - GEOM::GEOM_Object_ptr PathShape, - CORBA::Long NodeStart, - CORBA::Boolean HasAngles, - const SMESH::double_array & Angles, - CORBA::Boolean HasRefPoint, - const SMESH::PointStruct & RefPoint); - SMESH::SMESH_MeshEditor::Extrusion_Error - ExtrusionAlongPathObject2D(SMESH::SMESH_IDSource_ptr theObject, - SMESH::SMESH_Mesh_ptr PathMesh, - GEOM::GEOM_Object_ptr PathShape, - CORBA::Long NodeStart, - CORBA::Boolean HasAngles, - const SMESH::double_array & Angles, - CORBA::Boolean HasRefPoint, - const SMESH::PointStruct & RefPoint); + ExtrusionAlongPathObject2D(SMESH::SMESH_IDSource_ptr theObject, + SMESH::SMESH_Mesh_ptr PathMesh, + GEOM::GEOM_Object_ptr PathShape, + CORBA::Long NodeStart, + CORBA::Boolean HasAngles, + const SMESH::double_array & Angles, + CORBA::Boolean HasRefPoint, + const SMESH::PointStruct & RefPoint); SMESH::double_array* LinearAnglesVariation(SMESH::SMESH_Mesh_ptr PathMesh, GEOM::GEOM_Object_ptr PathShape, @@ -258,23 +258,23 @@ class SMESH_MeshEditor_i: public POA_SMESH::SMESH_MeshEditor SMESH::SMESH_MeshEditor::MirrorType MirrorType, CORBA::Boolean Copy); void MirrorObject(SMESH::SMESH_IDSource_ptr theObject, - const SMESH::AxisStruct & Axis, - SMESH::SMESH_MeshEditor::MirrorType MirrorType, - CORBA::Boolean Copy); + const SMESH::AxisStruct & Axis, + SMESH::SMESH_MeshEditor::MirrorType MirrorType, + CORBA::Boolean Copy); void Translate(const SMESH::long_array & IDsOfElements, const SMESH::DirStruct & Vector, CORBA::Boolean Copy); void TranslateObject(SMESH::SMESH_IDSource_ptr theObject, - const SMESH::DirStruct & Vector, - CORBA::Boolean Copy); + const SMESH::DirStruct & Vector, + CORBA::Boolean Copy); void Rotate(const SMESH::long_array & IDsOfElements, const SMESH::AxisStruct & Axis, CORBA::Double Angle, CORBA::Boolean Copy); void RotateObject(SMESH::SMESH_IDSource_ptr theObject, - const SMESH::AxisStruct & Axis, - CORBA::Double Angle, - CORBA::Boolean Copy); + const SMESH::AxisStruct & Axis, + CORBA::Double Angle, + CORBA::Boolean Copy); SMESH::ListOfGroups* RotationSweepMakeGroups(const SMESH::long_array& IDsOfElements, const SMESH::AxisStruct& Axix, @@ -287,15 +287,15 @@ class SMESH_MeshEditor_i: public POA_SMESH::SMESH_MeshEditor CORBA::Long NbOfSteps, CORBA::Double Tolerance); SMESH::ListOfGroups* RotationSweepObject1DMakeGroups(SMESH::SMESH_IDSource_ptr Object, - const SMESH::AxisStruct& Axix, - CORBA::Double AngleInRadians, - CORBA::Long NbOfSteps, - CORBA::Double Tolerance); + const SMESH::AxisStruct& Axix, + CORBA::Double AngleInRadians, + CORBA::Long NbOfSteps, + CORBA::Double Tolerance); SMESH::ListOfGroups* RotationSweepObject2DMakeGroups(SMESH::SMESH_IDSource_ptr Object, - const SMESH::AxisStruct& Axix, - CORBA::Double AngleInRadians, - CORBA::Long NbOfSteps, - CORBA::Double Tolerance); + const SMESH::AxisStruct& Axix, + CORBA::Double AngleInRadians, + CORBA::Long NbOfSteps, + CORBA::Double Tolerance); SMESH::ListOfGroups* ExtrusionSweepMakeGroups(const SMESH::long_array& IDsOfElements, const SMESH::DirStruct& StepVector, CORBA::Long NbOfSteps); @@ -332,47 +332,47 @@ class SMESH_MeshEditor_i: public POA_SMESH::SMESH_MeshEditor const SMESH::PointStruct& RefPoint, SMESH::SMESH_MeshEditor::Extrusion_Error& Error); SMESH::ListOfGroups* ExtrusionAlongPathObject1DMakeGroups(SMESH::SMESH_IDSource_ptr Object, - SMESH::SMESH_Mesh_ptr PathMesh, - GEOM::GEOM_Object_ptr PathShape, - CORBA::Long NodeStart, - CORBA::Boolean HasAngles, - const SMESH::double_array& Angles, - CORBA::Boolean HasRefPoint, - const SMESH::PointStruct& RefPoint, - SMESH::SMESH_MeshEditor::Extrusion_Error& Error); + SMESH::SMESH_Mesh_ptr PathMesh, + GEOM::GEOM_Object_ptr PathShape, + CORBA::Long NodeStart, + CORBA::Boolean HasAngles, + const SMESH::double_array& Angles, + CORBA::Boolean HasRefPoint, + const SMESH::PointStruct& RefPoint, + SMESH::SMESH_MeshEditor::Extrusion_Error& Error); SMESH::ListOfGroups* ExtrusionAlongPathObject2DMakeGroups(SMESH::SMESH_IDSource_ptr Object, - SMESH::SMESH_Mesh_ptr PathMesh, - GEOM::GEOM_Object_ptr PathShape, - CORBA::Long NodeStart, - CORBA::Boolean HasAngles, - const SMESH::double_array& Angles, - CORBA::Boolean HasRefPoint, - const SMESH::PointStruct& RefPoint, - SMESH::SMESH_MeshEditor::Extrusion_Error& Error); + SMESH::SMESH_Mesh_ptr PathMesh, + GEOM::GEOM_Object_ptr PathShape, + CORBA::Long NodeStart, + CORBA::Boolean HasAngles, + const SMESH::double_array& Angles, + CORBA::Boolean HasRefPoint, + const SMESH::PointStruct& RefPoint, + SMESH::SMESH_MeshEditor::Extrusion_Error& Error); // skl 04.06.2009 SMESH::ListOfGroups* ExtrusionAlongPathObjX(SMESH::SMESH_IDSource_ptr Object, - SMESH::SMESH_IDSource_ptr Path, - CORBA::Long NodeStart, - CORBA::Boolean HasAngles, - const SMESH::double_array& Angles, - CORBA::Boolean LinearVariation, - CORBA::Boolean HasRefPoint, - const SMESH::PointStruct& RefPoint, - CORBA::Boolean MakeGroups, - SMESH::ElementType ElemType, - SMESH::SMESH_MeshEditor::Extrusion_Error& Error); + SMESH::SMESH_IDSource_ptr Path, + CORBA::Long NodeStart, + CORBA::Boolean HasAngles, + const SMESH::double_array& Angles, + CORBA::Boolean LinearVariation, + CORBA::Boolean HasRefPoint, + const SMESH::PointStruct& RefPoint, + CORBA::Boolean MakeGroups, + SMESH::ElementType ElemType, + SMESH::SMESH_MeshEditor::Extrusion_Error& Error); SMESH::ListOfGroups* ExtrusionAlongPathX(const SMESH::long_array& IDsOfElements, - SMESH::SMESH_IDSource_ptr Path, - CORBA::Long NodeStart, - CORBA::Boolean HasAngles, - const SMESH::double_array& Angles, - CORBA::Boolean LinearVariation, - CORBA::Boolean HasRefPoint, - const SMESH::PointStruct& RefPoint, - CORBA::Boolean MakeGroups, - SMESH::ElementType ElemType, - SMESH::SMESH_MeshEditor::Extrusion_Error& Error); + SMESH::SMESH_IDSource_ptr Path, + CORBA::Long NodeStart, + CORBA::Boolean HasAngles, + const SMESH::double_array& Angles, + CORBA::Boolean LinearVariation, + CORBA::Boolean HasRefPoint, + const SMESH::PointStruct& RefPoint, + CORBA::Boolean MakeGroups, + SMESH::ElementType ElemType, + SMESH::SMESH_MeshEditor::Extrusion_Error& Error); SMESH::ListOfGroups* MirrorMakeGroups(const SMESH::long_array& IDsOfElements, const SMESH::AxisStruct& Mirror, @@ -434,7 +434,21 @@ class SMESH_MeshEditor_i: public POA_SMESH::SMESH_MeshEditor CORBA::Double y, CORBA::Double z, CORBA::Long nodeID); - + /*! + * \brief Return ID of node closest to a given point + */ + CORBA::Long FindNodeClosestTo(CORBA::Double x, + CORBA::Double y, + CORBA::Double z); + /*! + * Return elements of given type where the given point is IN or ON. + * + * 'ALL' type means elements of any type excluding nodes + */ + SMESH::long_array* FindElementsByPoint(CORBA::Double x, + CORBA::Double y, + CORBA::Double z, + SMESH::ElementType type); SMESH::SMESH_MeshEditor::Sew_Error @@ -474,7 +488,7 @@ class SMESH_MeshEditor_i: public POA_SMESH::SMESH_MeshEditor * element - returns false */ CORBA::Boolean ChangeElemNodes(CORBA::Long ide, const SMESH::long_array& newIDs); - + /*! * Return data of mesh edition preview */ @@ -496,10 +510,21 @@ class SMESH_MeshEditor_i: public POA_SMESH::SMESH_MeshEditor /*! * \brief Return edited mesh ID - * \retval int - mesh ID + * \retval int - mesh ID */ int GetMeshId() const { return myMesh->GetId(); } - + + CORBA::Boolean DoubleNodes( const SMESH::long_array& theNodes, + const SMESH::long_array& theModifiedElems ); + + CORBA::Boolean DoubleNode( CORBA::Long theNodeId, + const SMESH::long_array& theModifiedElems ); + + CORBA::Boolean DoubleNodeGroup( SMESH::SMESH_GroupBase_ptr theNodes, + SMESH::SMESH_GroupBase_ptr theModifiedElems ); + + CORBA::Boolean DoubleNodeGroups( const SMESH::ListOfGroups& theNodes, + const SMESH::ListOfGroups& theModifiedElems); /*! * \brief Creates a hole in a mesh by doubling the nodes of some particular elements @@ -510,10 +535,10 @@ class SMESH_MeshEditor_i: public POA_SMESH::SMESH_MeshEditor * replicated nodes should be associated to. * \return TRUE if operation has been completed successfully, FALSE otherwise * \sa DoubleNodeGroup(), DoubleNodeGroups() - */ - CORBA::Boolean DoubleNodes( const SMESH::long_array& theElems, - const SMESH::long_array& theNodesNot, - const SMESH::long_array& theAffectedElems ); + */ + CORBA::Boolean DoubleNodeElem( const SMESH::long_array& theElems, + const SMESH::long_array& theNodesNot, + const SMESH::long_array& theAffectedElems ); /*! * \brief Creates a hole in a mesh by doubling the nodes of some particular elements @@ -526,9 +551,9 @@ class SMESH_MeshEditor_i: public POA_SMESH::SMESH_MeshEditor * \return TRUE if operation has been completed successfully, FALSE otherwise * \sa DoubleNodeGroupInRegion(), DoubleNodeGroupsInRegion() */ - CORBA::Boolean DoubleNodesInRegion( const SMESH::long_array& theElems, - const SMESH::long_array& theNodesNot, - GEOM::GEOM_Object_ptr theShape ); + CORBA::Boolean DoubleNodeElemInRegion( const SMESH::long_array& theElems, + const SMESH::long_array& theNodesNot, + GEOM::GEOM_Object_ptr theShape ); /*! * \brief Creates a hole in a mesh by doubling the nodes of some particular elements @@ -539,10 +564,10 @@ class SMESH_MeshEditor_i: public POA_SMESH::SMESH_MeshEditor * \return TRUE if operation has been completed successfully, FALSE otherwise * \sa DoubleNodes(), DoubleNodeGroups() */ - CORBA::Boolean DoubleNodeGroup( SMESH::SMESH_GroupBase_ptr theElems, - SMESH::SMESH_GroupBase_ptr theNodesNot, - SMESH::SMESH_GroupBase_ptr theAffectedElems ); - + CORBA::Boolean DoubleNodeElemGroup( SMESH::SMESH_GroupBase_ptr theElems, + SMESH::SMESH_GroupBase_ptr theNodesNot, + SMESH::SMESH_GroupBase_ptr theAffectedElems ); + /*! * \brief Creates a hole in a mesh by doubling the nodes of some particular elements * \param theElems - group of of elements (edges or faces) to be replicated @@ -553,9 +578,9 @@ class SMESH_MeshEditor_i: public POA_SMESH::SMESH_MeshEditor * \return TRUE if operation has been completed successfully, FALSE otherwise * \sa DoubleNodesInRegion(), DoubleNodeGroupsInRegion() */ - CORBA::Boolean DoubleNodeGroupInRegion( SMESH::SMESH_GroupBase_ptr theElems, - SMESH::SMESH_GroupBase_ptr theNodesNot, - GEOM::GEOM_Object_ptr theShape ); + CORBA::Boolean DoubleNodeElemGroupInRegion( SMESH::SMESH_GroupBase_ptr theElems, + SMESH::SMESH_GroupBase_ptr theNodesNot, + GEOM::GEOM_Object_ptr theShape ); /*! * \brief Creates a hole in a mesh by doubling the nodes of some particular elements @@ -567,9 +592,9 @@ class SMESH_MeshEditor_i: public POA_SMESH::SMESH_MeshEditor * \return TRUE if operation has been completed successfully, FALSE otherwise * \sa DoubleNodeGroup(), DoubleNodes() */ - CORBA::Boolean DoubleNodeGroups( const SMESH::ListOfGroups& theElems, - const SMESH::ListOfGroups& theNodesNot, - const SMESH::ListOfGroups& theAffectedElems ); + CORBA::Boolean DoubleNodeElemGroups( const SMESH::ListOfGroups& theElems, + const SMESH::ListOfGroups& theNodesNot, + const SMESH::ListOfGroups& theAffectedElems ); /*! @@ -583,9 +608,16 @@ class SMESH_MeshEditor_i: public POA_SMESH::SMESH_MeshEditor * \return TRUE if operation has been completed successfully, FALSE otherwise * \sa DoubleNodeGroupInRegion(), DoubleNodesInRegion() */ - CORBA::Boolean DoubleNodeGroupsInRegion( const SMESH::ListOfGroups& theElems, - const SMESH::ListOfGroups& theNodesNot, - GEOM::GEOM_Object_ptr theShape ); + CORBA::Boolean DoubleNodeElemGroupsInRegion( const SMESH::ListOfGroups& theElems, + const SMESH::ListOfGroups& theNodesNot, + GEOM::GEOM_Object_ptr theShape ); + + /*! + * \brief Generated skin mesh (containing 2D cells) from 3D mesh + * The created 2D mesh elements based on nodes of free faces of boundary volumes + * \return TRUE if operation has been completed successfully, FALSE otherwise + */ + CORBA::Boolean Make2DMeshFrom3D(); private: //!< private methods @@ -593,13 +625,13 @@ class SMESH_MeshEditor_i: public POA_SMESH::SMESH_MeshEditor /*! * \brief Update myLastCreated* or myPreviewData - * \param anEditor - it contains edition results + * \param anEditor - it contains edition results */ void storeResult(::SMESH_MeshEditor& anEditor); /*! * \brief Clear myLastCreated* or myPreviewData */ - void initData(); + void initData(bool deleteSearchers=true); /*! * \brief Return groups by their IDs @@ -612,7 +644,7 @@ class SMESH_MeshEditor_i: public POA_SMESH::SMESH_MeshEditor CORBA::Long NbOfSteps, CORBA::Double Tolerance, const bool MakeGroups, - const SMDSAbs_ElementType ElementType=SMDSAbs_All); + const SMDSAbs_ElementType ElementType=SMDSAbs_All); SMESH::ListOfGroups* extrusionSweep(const SMESH::long_array & IDsOfElements, const SMESH::DirStruct & StepVector, CORBA::Long NbOfSteps, @@ -634,18 +666,18 @@ class SMESH_MeshEditor_i: public POA_SMESH::SMESH_MeshEditor const SMESH::PointStruct & RefPoint, const bool MakeGroups, SMESH::SMESH_MeshEditor::Extrusion_Error & Error, - const SMDSAbs_ElementType ElementType=SMDSAbs_All); + const SMDSAbs_ElementType ElementType=SMDSAbs_All); SMESH::ListOfGroups* extrusionAlongPathX(const SMESH::long_array & IDsOfElements, - SMESH::SMESH_IDSource_ptr Path, - CORBA::Long NodeStart, - CORBA::Boolean HasAngles, - const SMESH::double_array& Angles, - CORBA::Boolean LinearVariation, - CORBA::Boolean HasRefPoint, - const SMESH::PointStruct& RefPoint, - const bool MakeGroups, - const SMDSAbs_ElementType ElementType, - SMESH::SMESH_MeshEditor::Extrusion_Error & theError); + SMESH::SMESH_IDSource_ptr Path, + CORBA::Long NodeStart, + CORBA::Boolean HasAngles, + const SMESH::double_array& Angles, + CORBA::Boolean LinearVariation, + CORBA::Boolean HasRefPoint, + const SMESH::PointStruct& RefPoint, + const bool MakeGroups, + const SMDSAbs_ElementType ElementType, + SMESH::SMESH_MeshEditor::Extrusion_Error & theError); SMESH::ListOfGroups* mirror(const SMESH::long_array & IDsOfElements, const SMESH::AxisStruct & Axis, SMESH::SMESH_MeshEditor::MirrorType MirrorType, @@ -665,7 +697,7 @@ class SMESH_MeshEditor_i: public POA_SMESH::SMESH_MeshEditor ::SMESH_Mesh* TargetMesh=0); SMESH::SMESH_Mesh_ptr makeMesh(const char* theMeshName); - + void DumpGroupsList(SMESH::TPythonDump & theDumpPython, const SMESH::ListOfGroups * theGroupList); diff --git a/src/SMESH_I/SMESH_Mesh_i.cxx b/src/SMESH_I/SMESH_Mesh_i.cxx index 175be3dad..6b6d8220b 100644 --- a/src/SMESH_I/SMESH_Mesh_i.cxx +++ b/src/SMESH_I/SMESH_Mesh_i.cxx @@ -95,8 +95,8 @@ int SMESH_Mesh_i::myIdGenerator = 0; //============================================================================= SMESH_Mesh_i::SMESH_Mesh_i( PortableServer::POA_ptr thePOA, - SMESH_Gen_i* gen_i, - CORBA::Long studyId ) + SMESH_Gen_i* gen_i, + CORBA::Long studyId ) : SALOME::GenericObj_i( thePOA ) { MESSAGE("SMESH_Mesh_i"); @@ -522,41 +522,40 @@ SMESH::Hypothesis_Status SMESH_Mesh_i::RemoveHypothesis(GEOM::GEOM_Object_ptr aS */ //============================================================================= -SMESH_Hypothesis::Hypothesis_Status SMESH_Mesh_i::removeHypothesis(GEOM::GEOM_Object_ptr aSubShapeObject, - SMESH::SMESH_Hypothesis_ptr anHyp) +SMESH_Hypothesis::Hypothesis_Status +SMESH_Mesh_i::removeHypothesis(GEOM::GEOM_Object_ptr aSubShapeObject, + SMESH::SMESH_Hypothesis_ptr anHyp) { - if(MYDEBUG) MESSAGE("removeHypothesis()"); - // **** proposer liste de subShape (selection multiple) + if(MYDEBUG) MESSAGE("removeHypothesis()"); + // **** proposer liste de subShape (selection multiple) - if (CORBA::is_nil(aSubShapeObject) && HasShapeToMesh()) - THROW_SALOME_CORBA_EXCEPTION("bad subShape reference", - SALOME::BAD_PARAM); + if (CORBA::is_nil(aSubShapeObject) && HasShapeToMesh()) + THROW_SALOME_CORBA_EXCEPTION("bad subShape reference", SALOME::BAD_PARAM); - SMESH::SMESH_Hypothesis_var myHyp = SMESH::SMESH_Hypothesis::_narrow(anHyp); - if (CORBA::is_nil(myHyp)) - THROW_SALOME_CORBA_EXCEPTION("bad hypothesis reference", - SALOME::BAD_PARAM); + SMESH::SMESH_Hypothesis_var myHyp = SMESH::SMESH_Hypothesis::_narrow(anHyp); + if (CORBA::is_nil(myHyp)) + THROW_SALOME_CORBA_EXCEPTION("bad hypothesis reference", SALOME::BAD_PARAM); - SMESH_Hypothesis::Hypothesis_Status status = SMESH_Hypothesis::HYP_OK; - try - { - TopoDS_Shape myLocSubShape; - //use PseudoShape in case if mesh has no shape - if(HasShapeToMesh()) - myLocSubShape = _gen_i->GeomObjectToShape( aSubShapeObject); - else - myLocSubShape = _impl->GetShapeToMesh(); - - int hypId = myHyp->GetId(); - status = _impl->RemoveHypothesis(myLocSubShape, hypId); - if ( !SMESH_Hypothesis::IsStatusFatal(status) ) - _mapHypo.erase( hypId ); - } - catch(SALOME_Exception & S_ex) - { - THROW_SALOME_CORBA_EXCEPTION(S_ex.what(), SALOME::BAD_PARAM); - } - return status; + SMESH_Hypothesis::Hypothesis_Status status = SMESH_Hypothesis::HYP_OK; + try + { + TopoDS_Shape myLocSubShape; + //use PseudoShape in case if mesh has no shape + if(HasShapeToMesh()) + myLocSubShape = _gen_i->GeomObjectToShape( aSubShapeObject); + else + myLocSubShape = _impl->GetShapeToMesh(); + + int hypId = myHyp->GetId(); + status = _impl->RemoveHypothesis(myLocSubShape, hypId); +// if ( !SMESH_Hypothesis::IsStatusFatal(status) ) EAP: hyp can be used on many subshapes +// _mapHypo.erase( hypId ); + } + catch(SALOME_Exception & S_ex) + { + THROW_SALOME_CORBA_EXCEPTION(S_ex.what(), SALOME::BAD_PARAM); + } + return status; } //============================================================================= @@ -566,14 +565,13 @@ SMESH_Hypothesis::Hypothesis_Status SMESH_Mesh_i::removeHypothesis(GEOM::GEOM_Ob //============================================================================= SMESH::ListOfHypothesis * - SMESH_Mesh_i::GetHypothesisList(GEOM::GEOM_Object_ptr aSubShapeObject) + SMESH_Mesh_i::GetHypothesisList(GEOM::GEOM_Object_ptr aSubShapeObject) throw(SALOME::SALOME_Exception) { Unexpect aCatch(SALOME_SalomeException); if (MYDEBUG) MESSAGE("GetHypothesisList"); if (_impl->HasShapeToMesh() && CORBA::is_nil(aSubShapeObject)) - THROW_SALOME_CORBA_EXCEPTION("bad subShape reference", - SALOME::BAD_PARAM); + THROW_SALOME_CORBA_EXCEPTION("bad subShape reference", SALOME::BAD_PARAM); SMESH::ListOfHypothesis_var aList = new SMESH::ListOfHypothesis(); @@ -588,7 +586,7 @@ throw(SALOME::SALOME_Exception) for ( list::const_iterator anIt = aLocalList.begin(); i < n && anIt != aLocalList.end(); anIt++ ) { SMESHDS_Hypothesis* aHyp = (SMESHDS_Hypothesis*)(*anIt); if ( _mapHypo.find( aHyp->GetID() ) != _mapHypo.end() ) - aList[i++] = SMESH::SMESH_Hypothesis::_narrow( _mapHypo[aHyp->GetID()] ); + aList[i++] = SMESH::SMESH_Hypothesis::_narrow( _mapHypo[aHyp->GetID()] ); } aList->length( i ); @@ -606,14 +604,14 @@ throw(SALOME::SALOME_Exception) */ //============================================================================= SMESH::SMESH_subMesh_ptr SMESH_Mesh_i::GetSubMesh(GEOM::GEOM_Object_ptr aSubShapeObject, - const char* theName ) + const char* theName ) throw(SALOME::SALOME_Exception) { Unexpect aCatch(SALOME_SalomeException); MESSAGE("SMESH_Mesh_i::GetSubMesh"); if (CORBA::is_nil(aSubShapeObject)) THROW_SALOME_CORBA_EXCEPTION("bad subShape reference", - SALOME::BAD_PARAM); + SALOME::BAD_PARAM); SMESH::SMESH_subMesh_var subMesh; SMESH::SMESH_Mesh_var aMesh = SMESH::SMESH_Mesh::_narrow(_this()); @@ -667,7 +665,10 @@ void SMESH_Mesh_i::RemoveSubMesh( SMESH::SMESH_subMesh_ptr theSubMesh ) long aTag = SMESH_Gen_i::GetRefOnShapeTag(); SALOMEDS::SObject_var anObj, aRef; if ( anSO->FindSubObject( aTag, anObj ) && anObj->ReferencedObject( aRef ) ) - aSubShapeObject = GEOM::GEOM_Object::_narrow( aRef->GetObject() ); + aSubShapeObject = GEOM::GEOM_Object::_narrow( aRef->GetObject() ); + +// if ( aSubShapeObject->_is_nil() ) // not published shape (IPAL13617) +// aSubShapeObject = theSubMesh->GetSubShape(); aStudy->NewBuilder()->RemoveObjectWithChildren( anSO ); @@ -1980,20 +1981,37 @@ void SMESH_Mesh_i::removeSubMesh (SMESH::SMESH_subMesh_ptr theSubMesh, GEOM::GEOM_Object_ptr theSubShapeObject ) { MESSAGE("SMESH_Mesh_i::removeSubMesh()"); - if ( theSubMesh->_is_nil() || theSubShapeObject->_is_nil() ) + if ( theSubMesh->_is_nil() /*|| theSubShapeObject->_is_nil()*/ ) return; - try { - SMESH::ListOfHypothesis_var aHypList = GetHypothesisList( theSubShapeObject ); - for ( int i = 0, n = aHypList->length(); i < n; i++ ) { - removeHypothesis( theSubShapeObject, aHypList[i] ); + if ( theSubShapeObject->_is_nil() ) // not published shape (IPAL13617) + { + CORBA::Long shapeId = theSubMesh->GetId(); + if ( _mapSubMesh.find( shapeId ) != _mapSubMesh.end()) + { + TopoDS_Shape S = _mapSubMesh[ shapeId ]->GetSubShape(); + if ( !S.IsNull() ) + { + list hyps = _impl->GetHypothesisList( S ); + list::const_iterator hyp = hyps.begin(); + for ( ; hyp != hyps.end(); ++hyp ) + _impl->RemoveHypothesis(S, (*hyp)->GetID()); + } } } - catch( const SALOME::SALOME_Exception& ) { - INFOS("SMESH_Mesh_i::removeSubMesh(): exception caught!"); + else + { + try { + SMESH::ListOfHypothesis_var aHypList = GetHypothesisList( theSubShapeObject ); + for ( int i = 0, n = aHypList->length(); i < n; i++ ) { + removeHypothesis( theSubShapeObject, aHypList[i] ); + } + } + catch( const SALOME::SALOME_Exception& ) { + INFOS("SMESH_Mesh_i::removeSubMesh(): exception caught!"); + } + removeGeomGroupData( theSubShapeObject ); } - removeGeomGroupData( theSubShapeObject ); - int subMeshId = theSubMesh->GetId(); _mapSubMesh.erase(subMeshId); @@ -2100,14 +2118,14 @@ throw(SALOME::SALOME_Exception) aLog[indexLog].coords.length(rnum); aLog[indexLog].indexes.length(inum); for(int i = 0; i < rnum; i++){ - aLog[indexLog].coords[i] = *ir; - //MESSAGE(" "<ClearLog(); } //============================================================================= @@ -2288,8 +2306,8 @@ void SMESH_Mesh_i::PrepareForWriting (const char* file) } void SMESH_Mesh_i::ExportToMED (const char* file, - CORBA::Boolean auto_groups, - SMESH::MED_VERSION theVersion) + CORBA::Boolean auto_groups, + SMESH::MED_VERSION theVersion) throw(SALOME::SALOME_Exception) { Unexpect aCatch(SALOME_SalomeException); @@ -2304,20 +2322,20 @@ void SMESH_Mesh_i::ExportToMED (const char* file, aMeshName = aMeshSO->GetName(); // asv : 27.10.04 : fix of 6903: check for StudyLocked before adding attributes if ( !aStudy->GetProperties()->IsLocked() ) - { - SALOMEDS::GenericAttribute_var anAttr; - SALOMEDS::StudyBuilder_var aStudyBuilder = aStudy->NewBuilder(); - SALOMEDS::AttributeExternalFileDef_var aFileName; - anAttr=aStudyBuilder->FindOrCreateAttribute(aMeshSO, "AttributeExternalFileDef"); - aFileName = SALOMEDS::AttributeExternalFileDef::_narrow(anAttr); - ASSERT(!aFileName->_is_nil()); + { + SALOMEDS::GenericAttribute_var anAttr; + SALOMEDS::StudyBuilder_var aStudyBuilder = aStudy->NewBuilder(); + SALOMEDS::AttributeExternalFileDef_var aFileName; + anAttr=aStudyBuilder->FindOrCreateAttribute(aMeshSO, "AttributeExternalFileDef"); + aFileName = SALOMEDS::AttributeExternalFileDef::_narrow(anAttr); + ASSERT(!aFileName->_is_nil()); aFileName->SetValue(file); SALOMEDS::AttributeFileType_var aFileType; anAttr=aStudyBuilder->FindOrCreateAttribute(aMeshSO, "AttributeFileType"); aFileType = SALOMEDS::AttributeFileType::_narrow(anAttr); ASSERT(!aFileType->_is_nil()); aFileType->SetValue("FICHIERMED"); - } + } } } // Update Python script @@ -2334,7 +2352,7 @@ void SMESH_Mesh_i::ExportToMED (const char* file, } void SMESH_Mesh_i::ExportMED (const char* file, - CORBA::Boolean auto_groups) + CORBA::Boolean auto_groups) throw(SALOME::SALOME_Exception) { ExportToMED(file,auto_groups,SMESH::MED_V2_1); @@ -2418,7 +2436,7 @@ CORBA::Long SMESH_Mesh_i::NbNodes()throw(SALOME::SALOME_Exception) CORBA::Long SMESH_Mesh_i::NbElements()throw (SALOME::SALOME_Exception) { Unexpect aCatch(SALOME_SalomeException); - return NbEdges() + NbFaces() + NbVolumes(); + return Nb0DElements() + NbEdges() + NbFaces() + NbVolumes(); } //============================================================================= diff --git a/src/SMESH_I/SMESH_Mesh_i.hxx b/src/SMESH_I/SMESH_Mesh_i.hxx index 2c46676f6..e8598de34 100644 --- a/src/SMESH_I/SMESH_Mesh_i.hxx +++ b/src/SMESH_I/SMESH_Mesh_i.hxx @@ -58,7 +58,7 @@ class SMESH_I_EXPORT SMESH_Mesh_i: public: SMESH_Mesh_i( PortableServer::POA_ptr thePOA, SMESH_Gen_i* myGen_i, - CORBA::Long studyId ); + CORBA::Long studyId ); virtual ~SMESH_Mesh_i(); diff --git a/src/SMESH_I/SMESH_NoteBook.cxx b/src/SMESH_I/SMESH_NoteBook.cxx index bd7268049..2345a4279 100644 --- a/src/SMESH_I/SMESH_NoteBook.cxx +++ b/src/SMESH_I/SMESH_NoteBook.cxx @@ -239,19 +239,19 @@ void SMESH_NoteBook::ReplaceVariables() TMeshEditorMap::const_iterator meIt = myMeshEditors.find(aObject); if(meIt != myMeshEditors.end()) { TCollection_AsciiString aMesh = (*meIt).second; - it = _objectMap.find(aMesh); + it = _objectMap.find(aMesh); } } if(it == _objectMap.end()) { // additional check for pattern mapping if(aMethod.IsEqual("ApplyToMeshFaces") || - aMethod.IsEqual("ApplyToHexahedrons")) - it = _objectMap.find(aCmd->GetArg(1)); + aMethod.IsEqual("ApplyToHexahedrons")) + it = _objectMap.find(aCmd->GetArg(1)); } if(it != _objectMap.end()) { if(MYDEBUG) - cout << "Found object : " << (*it).first << endl; + cout << "Found object : " << (*it).first << endl; ObjectStates *aStates = (*it).second; // Case for LocalLength hypothesis if(aStates->GetObjectType().IsEqual("LocalLength") && aStates->GetCurrectState().size() >= 2) { @@ -402,9 +402,9 @@ void SMESH_NoteBook::ReplaceVariables() } else if(aStates->GetObjectType().IsEqual("Mesh")) { - TState aCurrentState = aStates->GetCurrectState(); + TState aCurrentState = aStates->GetCurrectState(); int aCurrentStateSize = aCurrentState.size(); - if(aMethod.IsEqual("Translate") || + if(aMethod.IsEqual("Translate") || aMethod.IsEqual("TranslateMakeGroups") || aMethod.IsEqual("TranslateMakeMesh") || aMethod.IsEqual("TranslateObject") || @@ -419,211 +419,211 @@ void SMESH_NoteBook::ReplaceVariables() } } if(anArgIndex > 0) { - if(aCurrentStateSize == 3) { // translation by dx, dy, dz - for(int j = 0; j < aCurrentStateSize; j++) { - if(!aCurrentState.at(j).IsEmpty()) { - isVariableFound = true; - aCmd->SetArg(anArgIndex+j, aCurrentState.at(j)); - } - } - } - else if(aCurrentStateSize == 6) { // translation by x1, x2, y1, y2, z1, z2 - // TODO: limitation until operations on the variables will be introduced - /* - isVariableFound = true; - for(int j = 0; j < 3; j++) { - TCollection_AsciiString anArg = aCmd->GetArg(anArgIndex+j); - TCollection_AsciiString aValue1 = aCurrentState.at(2*j), aValue2 = aCurrentState.at(2*j+1); - bool aV1 = !aValue1.IsEmpty(); - bool aV2 = !aValue2.IsEmpty(); - double aValue, aCurrentValue = anArg.IsRealValue() ? anArg.RealValue() : 0; - if(aV1 && !aV2) { - if(!GetReal(aValue1, aValue)) - aValue = 0; - aValue2 = TCollection_AsciiString( aValue + aCurrentValue ); - } - else if(!aV1 && aV2) { - if(!GetReal(aValue2, aValue)) - aValue = 0; - aValue1 = TCollection_AsciiString( aValue - aCurrentValue ); - } - else if(!aV1 && !aV2) { - aValue1 = TCollection_AsciiString( 0 ); - aValue2 = TCollection_AsciiString( aCurrentValue ); - } - aCmd->SetArg(anArgIndex+j, aValue1 + ", " + aValue2 ); - } - */ - } + if(aCurrentStateSize == 3) { // translation by dx, dy, dz + for(int j = 0; j < aCurrentStateSize; j++) { + if(!aCurrentState.at(j).IsEmpty()) { + isVariableFound = true; + aCmd->SetArg(anArgIndex+j, aCurrentState.at(j)); + } + } + } + else if(aCurrentStateSize == 6) { // translation by x1, x2, y1, y2, z1, z2 + // TODO: limitation until operations on the variables will be introduced + /* + isVariableFound = true; + for(int j = 0; j < 3; j++) { + TCollection_AsciiString anArg = aCmd->GetArg(anArgIndex+j); + TCollection_AsciiString aValue1 = aCurrentState.at(2*j), aValue2 = aCurrentState.at(2*j+1); + bool aV1 = !aValue1.IsEmpty(); + bool aV2 = !aValue2.IsEmpty(); + double aValue, aCurrentValue = anArg.IsRealValue() ? anArg.RealValue() : 0; + if(aV1 && !aV2) { + if(!GetReal(aValue1, aValue)) + aValue = 0; + aValue2 = TCollection_AsciiString( aValue + aCurrentValue ); + } + else if(!aV1 && aV2) { + if(!GetReal(aValue2, aValue)) + aValue = 0; + aValue1 = TCollection_AsciiString( aValue - aCurrentValue ); + } + else if(!aV1 && !aV2) { + aValue1 = TCollection_AsciiString( 0 ); + aValue2 = TCollection_AsciiString( aCurrentValue ); + } + aCmd->SetArg(anArgIndex+j, aValue1 + ", " + aValue2 ); + } + */ + } } if(isVariableFound) { TCollection_AsciiString aDim; - if(aCurrentStateSize == 6) - aDim = "6"; + if(aCurrentStateSize == 6) + aDim = "6"; aCmd->SetArg(anArgIndex - 1, TCollection_AsciiString(SMESH_2smeshpy::SmeshpyName())+".PointStructStr"+aDim); aCmd->SetArg(anArgIndex - 2, TCollection_AsciiString(SMESH_2smeshpy::SmeshpyName())+".DirStructStr"); } aStates->IncrementState(); } - else if(aMethod.IsEqual("Rotate") || - aMethod.IsEqual("RotateMakeGroups") || - aMethod.IsEqual("RotateMakeMesh") || + else if(aMethod.IsEqual("Rotate") || + aMethod.IsEqual("RotateMakeGroups") || + aMethod.IsEqual("RotateMakeMesh") || aMethod.IsEqual("RotateObject") || aMethod.IsEqual("RotateObjectMakeGroups") || aMethod.IsEqual("RotateObjectMakeMesh") || - aMethod.IsEqual("RotationSweep") || - aMethod.IsEqual("RotationSweepObject") || - aMethod.IsEqual("RotationSweepObject1D") || - aMethod.IsEqual("RotationSweepObject2D") || - aMethod.IsEqual("RotationSweepMakeGroups") || - aMethod.IsEqual("RotationSweepObjectMakeGroups") || - aMethod.IsEqual("RotationSweepObject1DMakeGroups") || - aMethod.IsEqual("RotationSweepObject2DMakeGroups") || - aMethod.IsEqual("Mirror") || - aMethod.IsEqual("MirrorMakeMesh") || + aMethod.IsEqual("RotationSweep") || + aMethod.IsEqual("RotationSweepObject") || + aMethod.IsEqual("RotationSweepObject1D") || + aMethod.IsEqual("RotationSweepObject2D") || + aMethod.IsEqual("RotationSweepMakeGroups") || + aMethod.IsEqual("RotationSweepObjectMakeGroups") || + aMethod.IsEqual("RotationSweepObject1DMakeGroups") || + aMethod.IsEqual("RotationSweepObject2DMakeGroups") || + aMethod.IsEqual("Mirror") || + aMethod.IsEqual("MirrorMakeMesh") || aMethod.IsEqual("MirrorMakeGroups") || aMethod.IsEqual("MirrorObject") || aMethod.IsEqual("MirrorObjectMakeMesh") || aMethod.IsEqual("MirrorObjectMakeGroups")) { - bool isSubstitute = false; - int anArgIndex = 0; - for(int i = 1, n = aCmd->GetNbArgs(); i <= n; i++) { - if(aCmd->GetArg(i).IsEqual("SMESH.AxisStruct")) { - anArgIndex = i+1; - break; - } - } - if(anArgIndex > 0) { - for(int j = 0; j < aCurrentStateSize; j++) { - if(!aCurrentState.at(j).IsEmpty()) { - if(j < 6) // 0-5 - axis struct, 6 - angle (rotation & sweep), 7-8 - nbSteps and tolerance (sweep) - isSubstitute = true; - aCmd->SetArg(anArgIndex+j, aCurrentState.at(j)); - } - } - } - if(isSubstitute) - aCmd->SetArg(anArgIndex - 1, TCollection_AsciiString(SMESH_2smeshpy::SmeshpyName())+".AxisStructStr"); - aStates->IncrementState(); - } - else if(aMethod.IsEqual("AddNode") || - aMethod.IsEqual("MoveClosestNodeToPoint")) { - for(int j = 0; j < aCurrentStateSize; j++) { - if(!aCurrentState.at(j).IsEmpty()) - aCmd->SetArg(j+1, aCurrentState.at(j)); - } - aStates->IncrementState(); - } - else if(aMethod.IsEqual("MoveNode")) { - for(int j = 0; j < aCurrentStateSize; j++) { - if(!aCurrentState.at(j).IsEmpty()) - aCmd->SetArg(j+2, aCurrentState.at(j)); - } - aStates->IncrementState(); - } - else if(aMethod.IsEqual("ExtrusionSweep") || - aMethod.IsEqual("ExtrusionSweepObject") || - aMethod.IsEqual("ExtrusionSweepObject1D") || - aMethod.IsEqual("ExtrusionSweepObject2D") || - aMethod.IsEqual("ExtrusionSweepMakeGroups") || - aMethod.IsEqual("ExtrusionSweepObjectMakeGroups") || - aMethod.IsEqual("ExtrusionSweepObject1DMakeGroups") || - aMethod.IsEqual("ExtrusionSweepObject2DMakeGroups")) { - bool isSubstitute = false; - int anArgIndex = 0; - for(int i = 1, n = aCmd->GetNbArgs(); i <= n; i++) { - if(aCmd->GetArg(i).IsEqual("SMESH.PointStruct")) { - anArgIndex = i+1; - break; - } - } - if(anArgIndex > 0) { - for(int j = 0; j < aCurrentStateSize; j++) { - if(!aCurrentState.at(j).IsEmpty()) { - if(j < 3) // 0-2 - dir struct, 3 - number of steps - isSubstitute = true; - aCmd->SetArg(anArgIndex+j, aCurrentState.at(j)); - } - } - } - if(isSubstitute) { + bool isSubstitute = false; + int anArgIndex = 0; + for(int i = 1, n = aCmd->GetNbArgs(); i <= n; i++) { + if(aCmd->GetArg(i).IsEqual("SMESH.AxisStruct")) { + anArgIndex = i+1; + break; + } + } + if(anArgIndex > 0) { + for(int j = 0; j < aCurrentStateSize; j++) { + if(!aCurrentState.at(j).IsEmpty()) { + if(j < 6) // 0-5 - axis struct, 6 - angle (rotation & sweep), 7-8 - nbSteps and tolerance (sweep) + isSubstitute = true; + aCmd->SetArg(anArgIndex+j, aCurrentState.at(j)); + } + } + } + if(isSubstitute) + aCmd->SetArg(anArgIndex - 1, TCollection_AsciiString(SMESH_2smeshpy::SmeshpyName())+".AxisStructStr"); + aStates->IncrementState(); + } + else if(aMethod.IsEqual("AddNode") || + aMethod.IsEqual("MoveClosestNodeToPoint")) { + for(int j = 0; j < aCurrentStateSize; j++) { + if(!aCurrentState.at(j).IsEmpty()) + aCmd->SetArg(j+1, aCurrentState.at(j)); + } + aStates->IncrementState(); + } + else if(aMethod.IsEqual("MoveNode")) { + for(int j = 0; j < aCurrentStateSize; j++) { + if(!aCurrentState.at(j).IsEmpty()) + aCmd->SetArg(j+2, aCurrentState.at(j)); + } + aStates->IncrementState(); + } + else if(aMethod.IsEqual("ExtrusionSweep") || + aMethod.IsEqual("ExtrusionSweepObject") || + aMethod.IsEqual("ExtrusionSweepObject1D") || + aMethod.IsEqual("ExtrusionSweepObject2D") || + aMethod.IsEqual("ExtrusionSweepMakeGroups") || + aMethod.IsEqual("ExtrusionSweepObjectMakeGroups") || + aMethod.IsEqual("ExtrusionSweepObject1DMakeGroups") || + aMethod.IsEqual("ExtrusionSweepObject2DMakeGroups")) { + bool isSubstitute = false; + int anArgIndex = 0; + for(int i = 1, n = aCmd->GetNbArgs(); i <= n; i++) { + if(aCmd->GetArg(i).IsEqual("SMESH.PointStruct")) { + anArgIndex = i+1; + break; + } + } + if(anArgIndex > 0) { + for(int j = 0; j < aCurrentStateSize; j++) { + if(!aCurrentState.at(j).IsEmpty()) { + if(j < 3) // 0-2 - dir struct, 3 - number of steps + isSubstitute = true; + aCmd->SetArg(anArgIndex+j, aCurrentState.at(j)); + } + } + } + if(isSubstitute) { aCmd->SetArg(anArgIndex - 1, TCollection_AsciiString(SMESH_2smeshpy::SmeshpyName())+".PointStructStr"); aCmd->SetArg(anArgIndex - 2, TCollection_AsciiString(SMESH_2smeshpy::SmeshpyName())+".DirStructStr"); - } - aStates->IncrementState(); - } - else if(aMethod.IsEqual("ExtrusionAlongPath") || - aMethod.IsEqual("ExtrusionAlongPathObject") || - aMethod.IsEqual("ExtrusionAlongPathObject1D") || - aMethod.IsEqual("ExtrusionAlongPathObject2D") || - aMethod.IsEqual("ExtrusionAlongPathMakeGroups") || - aMethod.IsEqual("ExtrusionAlongPathObjectMakeGroups") || - aMethod.IsEqual("ExtrusionAlongPathObject1DMakeGroups") || - aMethod.IsEqual("ExtrusionAlongPathObject2DMakeGroups") || - /* workaround for a bug in the command parsing algorithm */ - aCmd->GetString().Search("ExtrusionAlongPathMakeGroups") != -1 || - aCmd->GetString().Search("ExtrusionAlongPathObjectMakeGroups") != -1 || - aCmd->GetString().Search("ExtrusionAlongPathObject1DMakeGroups") != -1 || - aCmd->GetString().Search("ExtrusionAlongPathObject2DMakeGroups") != -1 ) { - int aNbAngles = aCurrentStateSize-3; // State looks like "Angle1:...:AngleN:X:Y:Z" - bool isSubstitute = false; - int anArgIndex = 0; - for(int i = 1, n = aCmd->GetNbArgs(); i <= n; i++) { - if(aCmd->GetArg(i).IsEqual("SMESH.PointStruct")) { - anArgIndex = i-1-aNbAngles; - break; - } - } - if(anArgIndex > 0) { - int j = 0; - for(; j < aNbAngles; j++) { - if(!aCurrentState.at(j).IsEmpty()) { - aCmd->SetArg(anArgIndex+j-1, aCurrentState.at(j)); - } - } - for(; j < aNbAngles+3; j++) { - if(!aCurrentState.at(j).IsEmpty()) { - isSubstitute = true; - aCmd->SetArg(anArgIndex+j+2, aCurrentState.at(j)); - } - } - } - if(isSubstitute) - aCmd->SetArg(anArgIndex + aNbAngles + 1, - TCollection_AsciiString(SMESH_2smeshpy::SmeshpyName())+".PointStructStr"); - aStates->IncrementState(); - } - else if(aMethod.IsEqual("TriToQuad") || - aMethod.IsEqual("Concatenate") || - aMethod.IsEqual("ConcatenateWithGroups")) { - if(aCurrentStateSize && !aCurrentState.at(0).IsEmpty()) - aCmd->SetArg(aCmd->GetNbArgs(), aCurrentState.at(0)); - aStates->IncrementState(); - } - else if(aMethod.IsEqual("Smooth") || - aMethod.IsEqual("SmoothObject") || - aMethod.IsEqual("SmoothParametric") || - aMethod.IsEqual("SmoothParametricObject")) { - int anArgIndex = aCmd->GetNbArgs() - 2; - for(int j = 0; j < aCurrentStateSize; j++) { - if(!aCurrentState.at(j).IsEmpty()) - aCmd->SetArg(anArgIndex+j, aCurrentState.at(j)); - } - aStates->IncrementState(); - } - else if(aMethod.IsEqual("ApplyToMeshFaces") || - aMethod.IsEqual("ApplyToHexahedrons")) { - int anArgIndex = aCmd->GetNbArgs()-1; - for(int j = 0; j < aCurrentStateSize; j++) - if(!aCurrentState.at(j).IsEmpty()) - aCmd->SetArg(anArgIndex+j, aCurrentState.at(j)); - aStates->IncrementState(); - } + } + aStates->IncrementState(); + } + else if(aMethod.IsEqual("ExtrusionAlongPath") || + aMethod.IsEqual("ExtrusionAlongPathObject") || + aMethod.IsEqual("ExtrusionAlongPathObject1D") || + aMethod.IsEqual("ExtrusionAlongPathObject2D") || + aMethod.IsEqual("ExtrusionAlongPathMakeGroups") || + aMethod.IsEqual("ExtrusionAlongPathObjectMakeGroups") || + aMethod.IsEqual("ExtrusionAlongPathObject1DMakeGroups") || + aMethod.IsEqual("ExtrusionAlongPathObject2DMakeGroups") || + /* workaround for a bug in the command parsing algorithm */ + aCmd->GetString().Search("ExtrusionAlongPathMakeGroups") != -1 || + aCmd->GetString().Search("ExtrusionAlongPathObjectMakeGroups") != -1 || + aCmd->GetString().Search("ExtrusionAlongPathObject1DMakeGroups") != -1 || + aCmd->GetString().Search("ExtrusionAlongPathObject2DMakeGroups") != -1 ) { + int aNbAngles = aCurrentStateSize-3; // State looks like "Angle1:...:AngleN:X:Y:Z" + bool isSubstitute = false; + int anArgIndex = 0; + for(int i = 1, n = aCmd->GetNbArgs(); i <= n; i++) { + if(aCmd->GetArg(i).IsEqual("SMESH.PointStruct")) { + anArgIndex = i-1-aNbAngles; + break; + } + } + if(anArgIndex > 0) { + int j = 0; + for(; j < aNbAngles; j++) { + if(!aCurrentState.at(j).IsEmpty()) { + aCmd->SetArg(anArgIndex+j-1, aCurrentState.at(j)); + } + } + for(; j < aNbAngles+3; j++) { + if(!aCurrentState.at(j).IsEmpty()) { + isSubstitute = true; + aCmd->SetArg(anArgIndex+j+2, aCurrentState.at(j)); + } + } + } + if(isSubstitute) + aCmd->SetArg(anArgIndex + aNbAngles + 1, + TCollection_AsciiString(SMESH_2smeshpy::SmeshpyName())+".PointStructStr"); + aStates->IncrementState(); + } + else if(aMethod.IsEqual("TriToQuad") || + aMethod.IsEqual("Concatenate") || + aMethod.IsEqual("ConcatenateWithGroups")) { + if(aCurrentStateSize && !aCurrentState.at(0).IsEmpty()) + aCmd->SetArg(aCmd->GetNbArgs(), aCurrentState.at(0)); + aStates->IncrementState(); + } + else if(aMethod.IsEqual("Smooth") || + aMethod.IsEqual("SmoothObject") || + aMethod.IsEqual("SmoothParametric") || + aMethod.IsEqual("SmoothParametricObject")) { + int anArgIndex = aCmd->GetNbArgs() - 2; + for(int j = 0; j < aCurrentStateSize; j++) { + if(!aCurrentState.at(j).IsEmpty()) + aCmd->SetArg(anArgIndex+j, aCurrentState.at(j)); + } + aStates->IncrementState(); + } + else if(aMethod.IsEqual("ApplyToMeshFaces") || + aMethod.IsEqual("ApplyToHexahedrons")) { + int anArgIndex = aCmd->GetNbArgs()-1; + for(int j = 0; j < aCurrentStateSize; j++) + if(!aCurrentState.at(j).IsEmpty()) + aCmd->SetArg(anArgIndex+j, aCurrentState.at(j)); + aStates->IncrementState(); + } } } else { if(MYDEBUG) - cout << "Object not found" << endl; + cout << "Object not found" << endl; } if(MYDEBUG) { cout<<"Command after: "<< aCmd->GetString()<GetMethod() == "GetMeshEditor" ) { // MeshEditor creation myMeshEditors.insert( make_pair( aCommand->GetResultValue(), - aCommand->GetObject() ) ); + aCommand->GetObject() ) ); } } diff --git a/src/SMESH_I/SMESH_Pattern_i.cxx b/src/SMESH_I/SMESH_Pattern_i.cxx index b96a8d954..f3f1fcfbc 100644 --- a/src/SMESH_I/SMESH_Pattern_i.cxx +++ b/src/SMESH_I/SMESH_Pattern_i.cxx @@ -149,7 +149,7 @@ CORBA::Boolean SMESH_Pattern_i::LoadFromFace(SMESH::SMESH_Mesh_ptr theMesh, return false; // Update Python script - TPythonDump() << "isDone = pattern.LoadFromFace( " << theMesh << ", " + TPythonDump() << "isDone = pattern.LoadFromFace( " << theMesh << ".GetMesh(), " << theFace << ", " << theProject << " )"; addErrorCode( "LoadFromFace" ); @@ -180,7 +180,7 @@ CORBA::Boolean SMESH_Pattern_i::LoadFrom3DBlock(SMESH::SMESH_Mesh_ptr theMesh, return false; // Update Python script - TPythonDump() << "isDone = pattern.LoadFrom3DBlock( " << theMesh << ", " << theBlock << " )"; + TPythonDump() << "isDone = pattern.LoadFrom3DBlock( " << theMesh << ".GetMesh(), " << theBlock << " )"; addErrorCode( "LoadFrom3DBlock" ); return myPattern.Load( aMesh, TopoDS::Shell( exp.Current() )); @@ -316,7 +316,7 @@ SMESH::point_array* } // Update Python script - TPythonDump() << "pattern.ApplyToMeshFaces( " << theMesh << ", " + TPythonDump() << "pattern.ApplyToMeshFaces( " << theMesh << ".GetMesh(), " << theFacesIDs << ", " << theNodeIndexOnKeyPoint1 << ", " << theReverse << " )"; @@ -361,7 +361,7 @@ SMESH::point_array* } // Update Python script - TPythonDump() << "pattern.ApplyToHexahedrons( " << theMesh << ", " + TPythonDump() << "pattern.ApplyToHexahedrons( " << theMesh << ".GetMesh(), " << theVolumesIDs << ", " << theNode000Index << ", " << theNode001Index << " )"; @@ -382,7 +382,7 @@ CORBA::Boolean SMESH_Pattern_i::MakeMesh (SMESH::SMESH_Mesh_ptr theMesh, return false; // Update Python script - TPythonDump() << "isDone = pattern.MakeMesh( " << theMesh << ", " + TPythonDump() << "isDone = pattern.MakeMesh( " << theMesh << ".GetMesh(), " << CreatePolygons << ", " << CreatePolyedrs << " )"; addErrorCode( "MakeMesh" ); diff --git a/src/SMESH_I/SMESH_PythonDump.hxx b/src/SMESH_I/SMESH_PythonDump.hxx index bee3cbb83..10d6dd85c 100644 --- a/src/SMESH_I/SMESH_PythonDump.hxx +++ b/src/SMESH_I/SMESH_PythonDump.hxx @@ -56,7 +56,7 @@ public: static TCollection_AsciiString ConvertScript(const TCollection_AsciiString& theScript, Resource_DataMapOfAsciiStringAsciiString& theEntry2AccessorMethod, - Resource_DataMapOfAsciiStringAsciiString& theObjectNames); + Resource_DataMapOfAsciiStringAsciiString& theObjectNames); /*! * \brief Return the name of the python file wrapping IDL API diff --git a/src/SMESH_I/SMESH_subMesh_i.cxx b/src/SMESH_I/SMESH_subMesh_i.cxx index 7d342969a..2720de2c7 100644 --- a/src/SMESH_I/SMESH_subMesh_i.cxx +++ b/src/SMESH_I/SMESH_subMesh_i.cxx @@ -59,9 +59,9 @@ SMESH_subMesh_i::SMESH_subMesh_i() //============================================================================= SMESH_subMesh_i::SMESH_subMesh_i( PortableServer::POA_ptr thePOA, - SMESH_Gen_i* gen_i, - SMESH_Mesh_i* mesh_i, - int localId ) + SMESH_Gen_i* gen_i, + SMESH_Mesh_i* mesh_i, + int localId ) : SALOME::GenericObj_i( thePOA ) { MESSAGE("SMESH_subMesh_i::SMESH_subMesh_i"); @@ -458,11 +458,11 @@ GEOM::GEOM_Object_ptr SMESH_subMesh_i::GetSubShape() TopoDS_Shape S = _mesh_i->_mapSubMesh[ _localId ]->GetSubShape(); if ( !S.IsNull() ) { aShapeObj = _gen_i->ShapeToGeomObject( S ); - //mzn: N7PAL16232, N7PAL16233 - //In some cases it's possible that GEOM_Client contains the shape same to S, but - //with another orientation. - if (aShapeObj->_is_nil()) - aShapeObj = _gen_i->ShapeToGeomObject( S.Reversed() ); + //mzn: N7PAL16232, N7PAL16233 + //In some cases it's possible that GEOM_Client contains the shape same to S, but + //with another orientation. + if (aShapeObj->_is_nil()) + aShapeObj = _gen_i->ShapeToGeomObject( S.Reversed() ); } } } diff --git a/src/SMESH_I/SMESH_subMesh_i.hxx b/src/SMESH_I/SMESH_subMesh_i.hxx index 26b37a753..5a6eb8bd8 100644 --- a/src/SMESH_I/SMESH_subMesh_i.hxx +++ b/src/SMESH_I/SMESH_subMesh_i.hxx @@ -48,8 +48,8 @@ public: SMESH_subMesh_i(); SMESH_subMesh_i( PortableServer::POA_ptr thePOA, SMESH_Gen_i* gen_i, - SMESH_Mesh_i* mesh_i, - int localId ); + SMESH_Mesh_i* mesh_i, + int localId ); ~SMESH_subMesh_i(); CORBA::Long GetNumberOfElements() diff --git a/src/SMESH_I/smeshpy.py b/src/SMESH_I/smeshpy.py index 869ea8108..5b820f22f 100644 --- a/src/SMESH_I/smeshpy.py +++ b/src/SMESH_I/smeshpy.py @@ -1,3 +1,4 @@ +# -*- coding: iso-8859-1 -*- # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, diff --git a/src/SMESH_SWIG/PAL_MESH_041_mesh.py b/src/SMESH_SWIG/PAL_MESH_041_mesh.py index c1138f9be..523429d2b 100755 --- a/src/SMESH_SWIG/PAL_MESH_041_mesh.py +++ b/src/SMESH_SWIG/PAL_MESH_041_mesh.py @@ -1,3 +1,4 @@ +# -*- coding: iso-8859-1 -*- # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, diff --git a/src/SMESH_SWIG/PAL_MESH_043_2D.py b/src/SMESH_SWIG/PAL_MESH_043_2D.py index 678f6db30..35bd54cda 100755 --- a/src/SMESH_SWIG/PAL_MESH_043_2D.py +++ b/src/SMESH_SWIG/PAL_MESH_043_2D.py @@ -1,3 +1,4 @@ +# -*- coding: iso-8859-1 -*- # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, diff --git a/src/SMESH_SWIG/PAL_MESH_043_3D.py b/src/SMESH_SWIG/PAL_MESH_043_3D.py index e40854bbe..bc4e115f0 100755 --- a/src/SMESH_SWIG/PAL_MESH_043_3D.py +++ b/src/SMESH_SWIG/PAL_MESH_043_3D.py @@ -1,3 +1,4 @@ +# -*- coding: iso-8859-1 -*- # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, diff --git a/src/SMESH_SWIG/SMESH_AdvancedEditor.py b/src/SMESH_SWIG/SMESH_AdvancedEditor.py index 86e8ce1f0..a480d029f 100644 --- a/src/SMESH_SWIG/SMESH_AdvancedEditor.py +++ b/src/SMESH_SWIG/SMESH_AdvancedEditor.py @@ -1,3 +1,4 @@ +# -*- coding: iso-8859-1 -*- # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, diff --git a/src/SMESH_SWIG/SMESH_BelongToGeom.py b/src/SMESH_SWIG/SMESH_BelongToGeom.py index b66986067..0ba648118 100644 --- a/src/SMESH_SWIG/SMESH_BelongToGeom.py +++ b/src/SMESH_SWIG/SMESH_BelongToGeom.py @@ -1,3 +1,4 @@ +# -*- coding: iso-8859-1 -*- # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, diff --git a/src/SMESH_SWIG/SMESH_BuildCompound.py b/src/SMESH_SWIG/SMESH_BuildCompound.py index 843071ed1..e82abfa40 100644 --- a/src/SMESH_SWIG/SMESH_BuildCompound.py +++ b/src/SMESH_SWIG/SMESH_BuildCompound.py @@ -1,3 +1,4 @@ +# -*- coding: iso-8859-1 -*- # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, diff --git a/src/SMESH_SWIG/SMESH_GroupFromGeom.py b/src/SMESH_SWIG/SMESH_GroupFromGeom.py index 1bc88014b..e4763c0b0 100644 --- a/src/SMESH_SWIG/SMESH_GroupFromGeom.py +++ b/src/SMESH_SWIG/SMESH_GroupFromGeom.py @@ -1,3 +1,4 @@ +# -*- coding: iso-8859-1 -*- # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, diff --git a/src/SMESH_SWIG/SMESH_GroupFromGeom2.py b/src/SMESH_SWIG/SMESH_GroupFromGeom2.py index 0b15ecbac..85dbd4056 100755 --- a/src/SMESH_SWIG/SMESH_GroupFromGeom2.py +++ b/src/SMESH_SWIG/SMESH_GroupFromGeom2.py @@ -1,3 +1,4 @@ +# -*- coding: iso-8859-1 -*- # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, diff --git a/src/SMESH_SWIG/SMESH_GroupLyingOnGeom.py b/src/SMESH_SWIG/SMESH_GroupLyingOnGeom.py index 67d498fad..816dede85 100644 --- a/src/SMESH_SWIG/SMESH_GroupLyingOnGeom.py +++ b/src/SMESH_SWIG/SMESH_GroupLyingOnGeom.py @@ -1,3 +1,4 @@ +# -*- coding: iso-8859-1 -*- # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, diff --git a/src/SMESH_SWIG/SMESH_Nut.py b/src/SMESH_SWIG/SMESH_Nut.py index 6585cd5e4..11428f8c5 100755 --- a/src/SMESH_SWIG/SMESH_Nut.py +++ b/src/SMESH_SWIG/SMESH_Nut.py @@ -1,3 +1,4 @@ +# -*- coding: iso-8859-1 -*- # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, diff --git a/src/SMESH_SWIG/SMESH_Partition1_tetra.py b/src/SMESH_SWIG/SMESH_Partition1_tetra.py index 11a68dfa4..e3af5d2d1 100644 --- a/src/SMESH_SWIG/SMESH_Partition1_tetra.py +++ b/src/SMESH_SWIG/SMESH_Partition1_tetra.py @@ -1,3 +1,4 @@ +# -*- coding: iso-8859-1 -*- # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, diff --git a/src/SMESH_SWIG/SMESH_Sphere.py b/src/SMESH_SWIG/SMESH_Sphere.py index b5e54a42d..3b1ca2e79 100644 --- a/src/SMESH_SWIG/SMESH_Sphere.py +++ b/src/SMESH_SWIG/SMESH_Sphere.py @@ -1,3 +1,4 @@ +# -*- coding: iso-8859-1 -*- # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, diff --git a/src/SMESH_SWIG/SMESH_blocks.py b/src/SMESH_SWIG/SMESH_blocks.py index e61ce50f2..d3e744d5f 100644 --- a/src/SMESH_SWIG/SMESH_blocks.py +++ b/src/SMESH_SWIG/SMESH_blocks.py @@ -1,3 +1,4 @@ +# -*- coding: iso-8859-1 -*- # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, diff --git a/src/SMESH_SWIG/SMESH_box.py b/src/SMESH_SWIG/SMESH_box.py index b57138a1c..8a1b39cac 100755 --- a/src/SMESH_SWIG/SMESH_box.py +++ b/src/SMESH_SWIG/SMESH_box.py @@ -1,3 +1,4 @@ +# -*- coding: iso-8859-1 -*- # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, diff --git a/src/SMESH_SWIG/SMESH_box2_tetra.py b/src/SMESH_SWIG/SMESH_box2_tetra.py index c77f1f001..79cf3b536 100644 --- a/src/SMESH_SWIG/SMESH_box2_tetra.py +++ b/src/SMESH_SWIG/SMESH_box2_tetra.py @@ -1,3 +1,4 @@ +# -*- coding: iso-8859-1 -*- # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, diff --git a/src/SMESH_SWIG/SMESH_box3_tetra.py b/src/SMESH_SWIG/SMESH_box3_tetra.py index e13fd8659..fd1b3ef62 100644 --- a/src/SMESH_SWIG/SMESH_box3_tetra.py +++ b/src/SMESH_SWIG/SMESH_box3_tetra.py @@ -1,3 +1,4 @@ +# -*- coding: iso-8859-1 -*- # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, diff --git a/src/SMESH_SWIG/SMESH_box_tetra.py b/src/SMESH_SWIG/SMESH_box_tetra.py index 39dd1db2d..279ae11ab 100644 --- a/src/SMESH_SWIG/SMESH_box_tetra.py +++ b/src/SMESH_SWIG/SMESH_box_tetra.py @@ -1,3 +1,4 @@ +# -*- coding: iso-8859-1 -*- # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, diff --git a/src/SMESH_SWIG/SMESH_controls.py b/src/SMESH_SWIG/SMESH_controls.py index 18cdb4a4c..41e561329 100644 --- a/src/SMESH_SWIG/SMESH_controls.py +++ b/src/SMESH_SWIG/SMESH_controls.py @@ -1,3 +1,4 @@ +# -*- coding: iso-8859-1 -*- # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, diff --git a/src/SMESH_SWIG/SMESH_demo_hexa2_upd.py b/src/SMESH_SWIG/SMESH_demo_hexa2_upd.py index 245fccec4..f5f6d65e5 100755 --- a/src/SMESH_SWIG/SMESH_demo_hexa2_upd.py +++ b/src/SMESH_SWIG/SMESH_demo_hexa2_upd.py @@ -1,3 +1,4 @@ +# -*- coding: iso-8859-1 -*- # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, diff --git a/src/SMESH_SWIG/SMESH_fixation.py b/src/SMESH_SWIG/SMESH_fixation.py index 597b1d0ea..bb406f035 100644 --- a/src/SMESH_SWIG/SMESH_fixation.py +++ b/src/SMESH_SWIG/SMESH_fixation.py @@ -1,3 +1,4 @@ +# -*- coding: iso-8859-1 -*- # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, diff --git a/src/SMESH_SWIG/SMESH_fixation_hexa.py b/src/SMESH_SWIG/SMESH_fixation_hexa.py index 5195cc9ae..6a73b38b8 100644 --- a/src/SMESH_SWIG/SMESH_fixation_hexa.py +++ b/src/SMESH_SWIG/SMESH_fixation_hexa.py @@ -1,3 +1,4 @@ +# -*- coding: iso-8859-1 -*- # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, diff --git a/src/SMESH_SWIG/SMESH_fixation_netgen.py b/src/SMESH_SWIG/SMESH_fixation_netgen.py index ae0039735..16295a5e5 100644 --- a/src/SMESH_SWIG/SMESH_fixation_netgen.py +++ b/src/SMESH_SWIG/SMESH_fixation_netgen.py @@ -1,3 +1,4 @@ +# -*- coding: iso-8859-1 -*- # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, diff --git a/src/SMESH_SWIG/SMESH_fixation_tetra.py b/src/SMESH_SWIG/SMESH_fixation_tetra.py index bb190b30f..483cd666d 100644 --- a/src/SMESH_SWIG/SMESH_fixation_tetra.py +++ b/src/SMESH_SWIG/SMESH_fixation_tetra.py @@ -1,3 +1,4 @@ +# -*- coding: iso-8859-1 -*- # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, diff --git a/src/SMESH_SWIG/SMESH_flight_skin.py b/src/SMESH_SWIG/SMESH_flight_skin.py index 6aa8d3716..534bed16c 100644 --- a/src/SMESH_SWIG/SMESH_flight_skin.py +++ b/src/SMESH_SWIG/SMESH_flight_skin.py @@ -1,3 +1,4 @@ +# -*- coding: iso-8859-1 -*- # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, diff --git a/src/SMESH_SWIG/SMESH_freebord.py b/src/SMESH_SWIG/SMESH_freebord.py index b1c1e8b9b..4c5fc646d 100644 --- a/src/SMESH_SWIG/SMESH_freebord.py +++ b/src/SMESH_SWIG/SMESH_freebord.py @@ -1,3 +1,4 @@ +# -*- coding: iso-8859-1 -*- # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, diff --git a/src/SMESH_SWIG/SMESH_hexaedre.py b/src/SMESH_SWIG/SMESH_hexaedre.py index d32e9b0bd..4345b08b8 100755 --- a/src/SMESH_SWIG/SMESH_hexaedre.py +++ b/src/SMESH_SWIG/SMESH_hexaedre.py @@ -1,3 +1,4 @@ +# -*- coding: iso-8859-1 -*- # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, diff --git a/src/SMESH_SWIG/SMESH_mechanic.py b/src/SMESH_SWIG/SMESH_mechanic.py index f1b02854d..46032383c 100644 --- a/src/SMESH_SWIG/SMESH_mechanic.py +++ b/src/SMESH_SWIG/SMESH_mechanic.py @@ -1,3 +1,4 @@ +# -*- coding: iso-8859-1 -*- # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, diff --git a/src/SMESH_SWIG/SMESH_mechanic_editor.py b/src/SMESH_SWIG/SMESH_mechanic_editor.py index 80780ca63..9ff002704 100644 --- a/src/SMESH_SWIG/SMESH_mechanic_editor.py +++ b/src/SMESH_SWIG/SMESH_mechanic_editor.py @@ -1,3 +1,4 @@ +# -*- coding: iso-8859-1 -*- # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, diff --git a/src/SMESH_SWIG/SMESH_mechanic_netgen.py b/src/SMESH_SWIG/SMESH_mechanic_netgen.py index e296eaed1..038e64e0b 100644 --- a/src/SMESH_SWIG/SMESH_mechanic_netgen.py +++ b/src/SMESH_SWIG/SMESH_mechanic_netgen.py @@ -1,3 +1,4 @@ +# -*- coding: iso-8859-1 -*- # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, diff --git a/src/SMESH_SWIG/SMESH_mechanic_tetra.py b/src/SMESH_SWIG/SMESH_mechanic_tetra.py index ff2f421f7..1307067df 100644 --- a/src/SMESH_SWIG/SMESH_mechanic_tetra.py +++ b/src/SMESH_SWIG/SMESH_mechanic_tetra.py @@ -1,3 +1,4 @@ +# -*- coding: iso-8859-1 -*- # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, diff --git a/src/SMESH_SWIG/SMESH_reg.py b/src/SMESH_SWIG/SMESH_reg.py index 8a0ec7cfc..92005898d 100644 --- a/src/SMESH_SWIG/SMESH_reg.py +++ b/src/SMESH_SWIG/SMESH_reg.py @@ -1,3 +1,4 @@ +# -*- coding: iso-8859-1 -*- # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, diff --git a/src/SMESH_SWIG/SMESH_shared_modules.py b/src/SMESH_SWIG/SMESH_shared_modules.py index 01286ea65..594832b32 100644 --- a/src/SMESH_SWIG/SMESH_shared_modules.py +++ b/src/SMESH_SWIG/SMESH_shared_modules.py @@ -1,3 +1,4 @@ +# -*- coding: iso-8859-1 -*- # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, diff --git a/src/SMESH_SWIG/SMESH_test.py b/src/SMESH_SWIG/SMESH_test.py index c18504dea..da4eda843 100644 --- a/src/SMESH_SWIG/SMESH_test.py +++ b/src/SMESH_SWIG/SMESH_test.py @@ -1,3 +1,4 @@ +# -*- coding: iso-8859-1 -*- # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, @@ -129,5 +130,5 @@ for a in log: i2 = a.indexes[ii] ii = ii+1 i3 = a.indexes[ii] - #ii = ii+1 + ii = ii+1 print "AddTriangle %i - %i %i %i" % (ind, i1, i2, i3) diff --git a/src/SMESH_SWIG/SMESH_test0.py b/src/SMESH_SWIG/SMESH_test0.py index 421acc1ed..407d25ead 100644 --- a/src/SMESH_SWIG/SMESH_test0.py +++ b/src/SMESH_SWIG/SMESH_test0.py @@ -1,3 +1,4 @@ +# -*- coding: iso-8859-1 -*- # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, diff --git a/src/SMESH_SWIG/SMESH_test1.py b/src/SMESH_SWIG/SMESH_test1.py index 25ce49704..cd68018d2 100644 --- a/src/SMESH_SWIG/SMESH_test1.py +++ b/src/SMESH_SWIG/SMESH_test1.py @@ -1,3 +1,4 @@ +# -*- coding: iso-8859-1 -*- # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, diff --git a/src/SMESH_SWIG/SMESH_test1_AndDisplay.py b/src/SMESH_SWIG/SMESH_test1_AndDisplay.py index e529d2c13..c87694894 100644 --- a/src/SMESH_SWIG/SMESH_test1_AndDisplay.py +++ b/src/SMESH_SWIG/SMESH_test1_AndDisplay.py @@ -1,3 +1,4 @@ +# -*- coding: iso-8859-1 -*- # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, diff --git a/src/SMESH_SWIG/SMESH_test2.py b/src/SMESH_SWIG/SMESH_test2.py index fe38b2da4..01c912973 100644 --- a/src/SMESH_SWIG/SMESH_test2.py +++ b/src/SMESH_SWIG/SMESH_test2.py @@ -1,3 +1,4 @@ +# -*- coding: iso-8859-1 -*- # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, diff --git a/src/SMESH_SWIG/SMESH_test3.py b/src/SMESH_SWIG/SMESH_test3.py index 59c853a46..a2c771b80 100644 --- a/src/SMESH_SWIG/SMESH_test3.py +++ b/src/SMESH_SWIG/SMESH_test3.py @@ -1,3 +1,4 @@ +# -*- coding: iso-8859-1 -*- # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, diff --git a/src/SMESH_SWIG/SMESH_test4.py b/src/SMESH_SWIG/SMESH_test4.py index dd86094d5..181833934 100755 --- a/src/SMESH_SWIG/SMESH_test4.py +++ b/src/SMESH_SWIG/SMESH_test4.py @@ -1,3 +1,4 @@ +# -*- coding: iso-8859-1 -*- # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, diff --git a/src/SMESH_SWIG/SMESH_test5.py b/src/SMESH_SWIG/SMESH_test5.py index 03a380ca6..616f0e39d 100644 --- a/src/SMESH_SWIG/SMESH_test5.py +++ b/src/SMESH_SWIG/SMESH_test5.py @@ -1,3 +1,4 @@ +# -*- coding: iso-8859-1 -*- # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, diff --git a/src/SMESH_SWIG/batchmode_mefisto.py b/src/SMESH_SWIG/batchmode_mefisto.py index 775023370..0e768a4d1 100644 --- a/src/SMESH_SWIG/batchmode_mefisto.py +++ b/src/SMESH_SWIG/batchmode_mefisto.py @@ -1,3 +1,4 @@ +# -*- coding: iso-8859-1 -*- # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, diff --git a/src/SMESH_SWIG/batchmode_smesh.py b/src/SMESH_SWIG/batchmode_smesh.py index d6688362d..eb2c4e1fe 100644 --- a/src/SMESH_SWIG/batchmode_smesh.py +++ b/src/SMESH_SWIG/batchmode_smesh.py @@ -1,3 +1,4 @@ +# -*- coding: iso-8859-1 -*- # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, diff --git a/src/SMESH_SWIG/ex00_all.py b/src/SMESH_SWIG/ex00_all.py index e4159ebdb..0ef515b9c 100644 --- a/src/SMESH_SWIG/ex00_all.py +++ b/src/SMESH_SWIG/ex00_all.py @@ -1,3 +1,4 @@ +# -*- coding: iso-8859-1 -*- # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, diff --git a/src/SMESH_SWIG/ex01_cube2build.py b/src/SMESH_SWIG/ex01_cube2build.py index fbc8c5f23..34bb6e39d 100644 --- a/src/SMESH_SWIG/ex01_cube2build.py +++ b/src/SMESH_SWIG/ex01_cube2build.py @@ -1,3 +1,4 @@ +# -*- coding: iso-8859-1 -*- # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, diff --git a/src/SMESH_SWIG/ex02_cube2primitive.py b/src/SMESH_SWIG/ex02_cube2primitive.py index 732b579b7..885d8722a 100644 --- a/src/SMESH_SWIG/ex02_cube2primitive.py +++ b/src/SMESH_SWIG/ex02_cube2primitive.py @@ -1,3 +1,4 @@ +# -*- coding: iso-8859-1 -*- # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, diff --git a/src/SMESH_SWIG/ex03_cube2partition.py b/src/SMESH_SWIG/ex03_cube2partition.py index e3447c37d..d620a6411 100644 --- a/src/SMESH_SWIG/ex03_cube2partition.py +++ b/src/SMESH_SWIG/ex03_cube2partition.py @@ -1,3 +1,4 @@ +# -*- coding: iso-8859-1 -*- # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, diff --git a/src/SMESH_SWIG/ex04_cube5tetraHexa.py b/src/SMESH_SWIG/ex04_cube5tetraHexa.py index 18d4900ff..02f6f2c87 100644 --- a/src/SMESH_SWIG/ex04_cube5tetraHexa.py +++ b/src/SMESH_SWIG/ex04_cube5tetraHexa.py @@ -1,3 +1,4 @@ +# -*- coding: iso-8859-1 -*- # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, diff --git a/src/SMESH_SWIG/ex05_hole1build.py b/src/SMESH_SWIG/ex05_hole1build.py index 050509e29..31793da2e 100644 --- a/src/SMESH_SWIG/ex05_hole1build.py +++ b/src/SMESH_SWIG/ex05_hole1build.py @@ -1,3 +1,4 @@ +# -*- coding: iso-8859-1 -*- # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, diff --git a/src/SMESH_SWIG/ex06_hole1boolean.py b/src/SMESH_SWIG/ex06_hole1boolean.py index 3f2c6893d..acdc7f5e9 100644 --- a/src/SMESH_SWIG/ex06_hole1boolean.py +++ b/src/SMESH_SWIG/ex06_hole1boolean.py @@ -1,3 +1,4 @@ +# -*- coding: iso-8859-1 -*- # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, diff --git a/src/SMESH_SWIG/ex07_hole1partition.py b/src/SMESH_SWIG/ex07_hole1partition.py index c46864c2d..4ca5c481d 100644 --- a/src/SMESH_SWIG/ex07_hole1partition.py +++ b/src/SMESH_SWIG/ex07_hole1partition.py @@ -1,3 +1,4 @@ +# -*- coding: iso-8859-1 -*- # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, diff --git a/src/SMESH_SWIG/ex08_hole2build.py b/src/SMESH_SWIG/ex08_hole2build.py index 6ccb77d41..cb417562e 100644 --- a/src/SMESH_SWIG/ex08_hole2build.py +++ b/src/SMESH_SWIG/ex08_hole2build.py @@ -1,3 +1,4 @@ +# -*- coding: iso-8859-1 -*- # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, diff --git a/src/SMESH_SWIG/ex09_grid4build.py b/src/SMESH_SWIG/ex09_grid4build.py index d0e0fb72a..4fd9c6db2 100644 --- a/src/SMESH_SWIG/ex09_grid4build.py +++ b/src/SMESH_SWIG/ex09_grid4build.py @@ -1,3 +1,4 @@ +# -*- coding: iso-8859-1 -*- # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, diff --git a/src/SMESH_SWIG/ex10_grid4geometry.py b/src/SMESH_SWIG/ex10_grid4geometry.py index 8f63e031d..f9a8c399b 100644 --- a/src/SMESH_SWIG/ex10_grid4geometry.py +++ b/src/SMESH_SWIG/ex10_grid4geometry.py @@ -1,3 +1,4 @@ +# -*- coding: iso-8859-1 -*- # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, diff --git a/src/SMESH_SWIG/ex11_grid3partition.py b/src/SMESH_SWIG/ex11_grid3partition.py index 3369074d2..1ed38c03b 100644 --- a/src/SMESH_SWIG/ex11_grid3partition.py +++ b/src/SMESH_SWIG/ex11_grid3partition.py @@ -1,3 +1,4 @@ +# -*- coding: iso-8859-1 -*- # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, diff --git a/src/SMESH_SWIG/ex12_grid17partition.py b/src/SMESH_SWIG/ex12_grid17partition.py index 2f41e3bee..3499a3e0b 100644 --- a/src/SMESH_SWIG/ex12_grid17partition.py +++ b/src/SMESH_SWIG/ex12_grid17partition.py @@ -1,3 +1,4 @@ +# -*- coding: iso-8859-1 -*- # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, diff --git a/src/SMESH_SWIG/ex13_hole1partial.py b/src/SMESH_SWIG/ex13_hole1partial.py index 0b3ff6baf..609f48052 100644 --- a/src/SMESH_SWIG/ex13_hole1partial.py +++ b/src/SMESH_SWIG/ex13_hole1partial.py @@ -1,3 +1,4 @@ +# -*- coding: iso-8859-1 -*- # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, diff --git a/src/SMESH_SWIG/ex14_cyl1holed.py b/src/SMESH_SWIG/ex14_cyl1holed.py index 42d460b93..1c89971fc 100644 --- a/src/SMESH_SWIG/ex14_cyl1holed.py +++ b/src/SMESH_SWIG/ex14_cyl1holed.py @@ -1,3 +1,4 @@ +# -*- coding: iso-8859-1 -*- # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, diff --git a/src/SMESH_SWIG/ex15_cyl2geometry.py b/src/SMESH_SWIG/ex15_cyl2geometry.py index 2bcba7195..72a0a4b92 100644 --- a/src/SMESH_SWIG/ex15_cyl2geometry.py +++ b/src/SMESH_SWIG/ex15_cyl2geometry.py @@ -1,3 +1,4 @@ +# -*- coding: iso-8859-1 -*- # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, diff --git a/src/SMESH_SWIG/ex16_cyl2complementary.py b/src/SMESH_SWIG/ex16_cyl2complementary.py index 774cc5f7d..4a3adf337 100644 --- a/src/SMESH_SWIG/ex16_cyl2complementary.py +++ b/src/SMESH_SWIG/ex16_cyl2complementary.py @@ -1,3 +1,4 @@ +# -*- coding: iso-8859-1 -*- # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, diff --git a/src/SMESH_SWIG/ex17_dome1.py b/src/SMESH_SWIG/ex17_dome1.py index a25de9627..c94136b20 100644 --- a/src/SMESH_SWIG/ex17_dome1.py +++ b/src/SMESH_SWIG/ex17_dome1.py @@ -1,3 +1,4 @@ +# -*- coding: iso-8859-1 -*- # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, diff --git a/src/SMESH_SWIG/ex18_dome2.py b/src/SMESH_SWIG/ex18_dome2.py index f56015619..fc78722d7 100644 --- a/src/SMESH_SWIG/ex18_dome2.py +++ b/src/SMESH_SWIG/ex18_dome2.py @@ -1,3 +1,4 @@ +# -*- coding: iso-8859-1 -*- # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, diff --git a/src/SMESH_SWIG/ex19_sphereINcube.py b/src/SMESH_SWIG/ex19_sphereINcube.py index 510adf800..53b6e2ae6 100644 --- a/src/SMESH_SWIG/ex19_sphereINcube.py +++ b/src/SMESH_SWIG/ex19_sphereINcube.py @@ -1,3 +1,4 @@ +# -*- coding: iso-8859-1 -*- # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, diff --git a/src/SMESH_SWIG/ex21_lamp.py b/src/SMESH_SWIG/ex21_lamp.py index f6c3c3789..b7a511d4d 100644 --- a/src/SMESH_SWIG/ex21_lamp.py +++ b/src/SMESH_SWIG/ex21_lamp.py @@ -1,3 +1,4 @@ +# -*- coding: iso-8859-1 -*- # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, diff --git a/src/SMESH_SWIG/ex24_cylinder.py b/src/SMESH_SWIG/ex24_cylinder.py index 6d9f3077d..2e7b52d82 100644 --- a/src/SMESH_SWIG/ex24_cylinder.py +++ b/src/SMESH_SWIG/ex24_cylinder.py @@ -1,3 +1,4 @@ +# -*- coding: iso-8859-1 -*- # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, diff --git a/src/SMESH_SWIG/ex29_refine.py b/src/SMESH_SWIG/ex29_refine.py index 1e218a8fa..2f378a1b1 100644 --- a/src/SMESH_SWIG/ex29_refine.py +++ b/src/SMESH_SWIG/ex29_refine.py @@ -1,3 +1,4 @@ +# -*- coding: iso-8859-1 -*- # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, diff --git a/src/SMESH_SWIG/ex30_groupsOp.py b/src/SMESH_SWIG/ex30_groupsOp.py index af892e7ff..f1a857d9a 100755 --- a/src/SMESH_SWIG/ex30_groupsOp.py +++ b/src/SMESH_SWIG/ex30_groupsOp.py @@ -1,73 +1,74 @@ - -import sys -import salome -import geompy -import math -import SALOMEDS -import SMESH -import smesh - -salome.salome_init() -aStudyId = salome.myStudy._get_StudyId() - -geompy.init_geom(salome.myStudy) -global Face_1 -Face_1 = geompy.MakeFaceHW(100, 100, 1) -geompy.addToStudy( Face_1, "Face_1" ) - -#smesh.smesh.SetCurrentStudy(aStudyId) -import StdMeshers -pattern = smesh.GetPattern() -Mesh_1 = smesh.Mesh(Face_1) -Regular_1D = Mesh_1.Segment() -Nb_Segments_1 = Regular_1D.NumberOfSegments(10) -Nb_Segments_1.SetDistrType( 0 ) -Quadrangle_2D = Mesh_1.Quadrangle() -isDone = Mesh_1.Compute() - -# groups creation - -aListOfElems = [ 52, 53, 54, 55, 56, 57, - 62, 63, 64, 65, 66, 67, - 72, 73, 74, 75, 76, 77, - 82, 83, 84, 85, 86, 87 ] - -aRedGroup = Mesh_1.GetMesh().CreateGroup( smesh.FACE, "Red" ) -aRedGroup.Add( aListOfElems ); -aRedGroup.SetColor( SALOMEDS.Color( 1, 0, 0 ) ) - -aListOfElems = [ 55, 56, 57, 58, 59, - 65, 66, 67, 68, 69, - 75, 76, 77, 78, 79, - 85, 86, 87, 88, 89, - 95, 96, 97, 98, 99, - 105, 106, 107, 108, 109, - 115, 116, 117, 118, 119, - 125, 126, 127, 128, 129 ] - -aGreenGroup = Mesh_1.GetMesh().CreateGroup( smesh.FACE, "Green" ) -aGreenGroup.Add( aListOfElems ); -aGreenGroup.SetColor( SALOMEDS.Color( 0, 1, 0 ) ) - -aListOfElems = [ 63, 64, 65, 66, 67, 68, - 73, 74, 75, 76, 77, 78, - 83, 84, 85, 86, 87, 88, - 93, 94, 95, 96, 97, 98, - 103, 104, 105, 106, 107, 108, - 113, 114, 115, 116, 117, 118 ] - -aBlueGroup = Mesh_1.GetMesh().CreateGroup( smesh.FACE, "Blue" ) -aBlueGroup.Add( aListOfElems ); -aBlueGroup.SetColor( SALOMEDS.Color( 0, 0, 1 ) ) - -# UnionListOfGroups() -aUnGrp = Mesh_1.UnionListOfGroups([aRedGroup, aGreenGroup, aBlueGroup], "UnionGrp" ) - -# IntersectListOfGroups() -aIntGrp=Mesh_1.IntersectListOfGroups([aRedGroup, aGreenGroup, aBlueGroup], "IntGrp" ) - -# CutListOfGroups() -aCutGrp=Mesh_1.CutListOfGroups([aRedGroup],[aGreenGroup,aBlueGroup],"CutGrp") - -salome.sg.updateObjBrowser( 1 ) - +# -*- coding: iso-8859-1 -*- + +import sys +import salome +import geompy +import math +import SALOMEDS +import SMESH +import smesh + +salome.salome_init() +aStudyId = salome.myStudy._get_StudyId() + +geompy.init_geom(salome.myStudy) +global Face_1 +Face_1 = geompy.MakeFaceHW(100, 100, 1) +geompy.addToStudy( Face_1, "Face_1" ) + +#smesh.smesh.SetCurrentStudy(aStudyId) +import StdMeshers +pattern = smesh.GetPattern() +Mesh_1 = smesh.Mesh(Face_1) +Regular_1D = Mesh_1.Segment() +Nb_Segments_1 = Regular_1D.NumberOfSegments(10) +Nb_Segments_1.SetDistrType( 0 ) +Quadrangle_2D = Mesh_1.Quadrangle() +isDone = Mesh_1.Compute() + +# groups creation + +aListOfElems = [ 52, 53, 54, 55, 56, 57, + 62, 63, 64, 65, 66, 67, + 72, 73, 74, 75, 76, 77, + 82, 83, 84, 85, 86, 87 ] + +aRedGroup = Mesh_1.GetMesh().CreateGroup( smesh.FACE, "Red" ) +aRedGroup.Add( aListOfElems ); +aRedGroup.SetColor( SALOMEDS.Color( 1, 0, 0 ) ) + +aListOfElems = [ 55, 56, 57, 58, 59, + 65, 66, 67, 68, 69, + 75, 76, 77, 78, 79, + 85, 86, 87, 88, 89, + 95, 96, 97, 98, 99, + 105, 106, 107, 108, 109, + 115, 116, 117, 118, 119, + 125, 126, 127, 128, 129 ] + +aGreenGroup = Mesh_1.GetMesh().CreateGroup( smesh.FACE, "Green" ) +aGreenGroup.Add( aListOfElems ); +aGreenGroup.SetColor( SALOMEDS.Color( 0, 1, 0 ) ) + +aListOfElems = [ 63, 64, 65, 66, 67, 68, + 73, 74, 75, 76, 77, 78, + 83, 84, 85, 86, 87, 88, + 93, 94, 95, 96, 97, 98, + 103, 104, 105, 106, 107, 108, + 113, 114, 115, 116, 117, 118 ] + +aBlueGroup = Mesh_1.GetMesh().CreateGroup( smesh.FACE, "Blue" ) +aBlueGroup.Add( aListOfElems ); +aBlueGroup.SetColor( SALOMEDS.Color( 0, 0, 1 ) ) + +# UnionListOfGroups() +aUnGrp = Mesh_1.UnionListOfGroups([aRedGroup, aGreenGroup, aBlueGroup], "UnionGrp" ) + +# IntersectListOfGroups() +aIntGrp=Mesh_1.IntersectListOfGroups([aRedGroup, aGreenGroup, aBlueGroup], "IntGrp" ) + +# CutListOfGroups() +aCutGrp=Mesh_1.CutListOfGroups([aRedGroup],[aGreenGroup,aBlueGroup],"CutGrp") + +salome.sg.updateObjBrowser( 1 ) + diff --git a/src/SMESH_SWIG/ex30_tepal.py b/src/SMESH_SWIG/ex30_tepal.py index c73dc872d..61a035022 100644 --- a/src/SMESH_SWIG/ex30_tepal.py +++ b/src/SMESH_SWIG/ex30_tepal.py @@ -1,3 +1,4 @@ +# -*- coding: iso-8859-1 -*- # CEA/LGLS 2008, Christian Van Wambeke (CEA/LGLS), Francis KLOSS (OCC) # ==================================================================== diff --git a/src/SMESH_SWIG/ex31_dimGroup.py b/src/SMESH_SWIG/ex31_dimGroup.py index 13cd9cf26..7f4600d3f 100755 --- a/src/SMESH_SWIG/ex31_dimGroup.py +++ b/src/SMESH_SWIG/ex31_dimGroup.py @@ -1,47 +1,49 @@ -import sys -import salome -import geompy -import math -import SALOMEDS -import SMESH -import smesh - -salome.salome_init() -aStudyId = salome.myStudy._get_StudyId() - -geompy.init_geom(salome.myStudy) - -geompy.init_geom(salome.myStudy) -global Box_1 -Box_1 = geompy.MakeBoxDXDYDZ(200, 200, 200) -geompy.addToStudy( Box_1, "Box_1" ) - -#smesh.smesh.SetCurrentStudy(theStudy) -import StdMeshers -Mesh_1 = smesh.Mesh(Box_1) -Regular_1D = Mesh_1.Segment() -Nb_Segments_1 = Regular_1D.NumberOfSegments(10) -Nb_Segments_1.SetDistrType( 0 ) -Quadrangle_2D = Mesh_1.Quadrangle() -Hexa_3D = Mesh_1.Hexahedron() -isDone = Mesh_1.Compute() - -### CreateDimGroup() - -aListOf3d_1=range(721,821) - -aGrp3D_1=Mesh_1.GetMesh().CreateGroup( smesh.VOLUME, "Src 3D 1" ) -aGrp3D_1.Add( aListOf3d_1 ) - -aListOf3d_2=range(821, 921) -aGrp3D_2=Mesh_1.GetMesh().CreateGroup( smesh.VOLUME, "Src 3D 2" ) -aGrp3D_2.Add( aListOf3d_2 ) - -aGrp2D = Mesh_1.CreateDimGroup( [aGrp3D_1, aGrp3D_2], smesh.FACE, "Faces" ) - -aGrp1D = Mesh_1.CreateDimGroup( [aGrp3D_1, aGrp3D_2], smesh.EDGE, "Edges" ) - -aGrp0D = Mesh_1.CreateDimGroup( [aGrp3D_1, aGrp3D_2], smesh.NODE, "Nodes" ) - -salome.sg.updateObjBrowser( 1 ) - +# -*- coding: iso-8859-1 -*- + +import sys +import salome +import geompy +import math +import SALOMEDS +import SMESH +import smesh + +salome.salome_init() +aStudyId = salome.myStudy._get_StudyId() + +geompy.init_geom(salome.myStudy) + +geompy.init_geom(salome.myStudy) +global Box_1 +Box_1 = geompy.MakeBoxDXDYDZ(200, 200, 200) +geompy.addToStudy( Box_1, "Box_1" ) + +#smesh.smesh.SetCurrentStudy(theStudy) +import StdMeshers +Mesh_1 = smesh.Mesh(Box_1) +Regular_1D = Mesh_1.Segment() +Nb_Segments_1 = Regular_1D.NumberOfSegments(10) +Nb_Segments_1.SetDistrType( 0 ) +Quadrangle_2D = Mesh_1.Quadrangle() +Hexa_3D = Mesh_1.Hexahedron() +isDone = Mesh_1.Compute() + +### CreateDimGroup() + +aListOf3d_1=range(721,821) + +aGrp3D_1=Mesh_1.GetMesh().CreateGroup( smesh.VOLUME, "Src 3D 1" ) +aGrp3D_1.Add( aListOf3d_1 ) + +aListOf3d_2=range(821, 921) +aGrp3D_2=Mesh_1.GetMesh().CreateGroup( smesh.VOLUME, "Src 3D 2" ) +aGrp3D_2.Add( aListOf3d_2 ) + +aGrp2D = Mesh_1.CreateDimGroup( [aGrp3D_1, aGrp3D_2], smesh.FACE, "Faces" ) + +aGrp1D = Mesh_1.CreateDimGroup( [aGrp3D_1, aGrp3D_2], smesh.EDGE, "Edges" ) + +aGrp0D = Mesh_1.CreateDimGroup( [aGrp3D_1, aGrp3D_2], smesh.NODE, "Nodes" ) + +salome.sg.updateObjBrowser( 1 ) + diff --git a/src/SMESH_SWIG/smesh.py b/src/SMESH_SWIG/smesh.py index dc22bc389..217439fa5 100644 --- a/src/SMESH_SWIG/smesh.py +++ b/src/SMESH_SWIG/smesh.py @@ -1,3 +1,4 @@ +# -*- coding: iso-8859-1 -*- # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, diff --git a/src/SMESH_SWIG/smeshDC.py b/src/SMESH_SWIG/smeshDC.py index 689e76f49..4789415c9 100644 --- a/src/SMESH_SWIG/smeshDC.py +++ b/src/SMESH_SWIG/smeshDC.py @@ -1,3 +1,4 @@ +# -*- coding: iso-8859-1 -*- # Copyright (C) 2007-2008 CEA/DEN, EDF R&D, OPEN CASCADE # # Copyright (C) 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, @@ -107,6 +108,38 @@ except ImportError: noNETGENPlugin = 1 pass +# import GHS3DPlugin module if possible +noGHS3DPlugin = 0 +try: + import GHS3DPlugin +except ImportError: + noGHS3DPlugin = 1 + pass + +# import GHS3DPRLPlugin module if possible +noGHS3DPRLPlugin = 0 +try: + import GHS3DPRLPlugin +except ImportError: + noGHS3DPRLPlugin = 1 + pass + +# import HexoticPlugin module if possible +noHexoticPlugin = 0 +try: + import HexoticPlugin +except ImportError: + noHexoticPlugin = 1 + pass + +# import BLSURFPlugin module if possible +noBLSURFPlugin = 0 +try: + import BLSURFPlugin +except ImportError: + noBLSURFPlugin = 1 + pass + ## @addtogroup l1_auxiliary ## @{ @@ -148,7 +181,10 @@ VeryFine = 4 Custom = 5 # Optimization level of GHS3D +# V3.1 None_Optimization, Light_Optimization, Medium_Optimization, Strong_Optimization = 0,1,2,3 +# V4.1 (partialy redefines V3.1). Issue 0020574 +None_Optimization, Light_Optimization, Standard_Optimization, StandardPlus_Optimization, Strong_Optimization = 0,1,2,3,4 # Topology treatment way of BLSURF FromCAD, PreProcess, PreProcessPlus = 0,1,2 @@ -402,6 +438,25 @@ def TreatHypoStatus(status, hypName, geomName, isAlgo): print hypName, "was not assigned to",geomName,":", reason pass +## Check meshing plugin availability +def CheckPlugin(plugin): + if plugin == NETGEN and noNETGENPlugin: + print "Warning: NETGENPlugin module unavailable" + return False + elif plugin == GHS3D and noGHS3DPlugin: + print "Warning: GHS3DPlugin module unavailable" + return False + elif plugin == GHS3DPRL and noGHS3DPRLPlugin: + print "Warning: GHS3DPRLPlugin module unavailable" + return False + elif plugin == Hexotic and noHexoticPlugin: + print "Warning: HexoticPlugin module unavailable" + return False + elif plugin == BLSURF and noBLSURFPlugin: + print "Warning: BLSURFPlugin module unavailable" + return False + return True + # end of l1_auxiliary ## @} @@ -420,7 +475,9 @@ class smeshDC(SMESH._objref_SMESH_Gen): # @return an instance of Mesh class. # @ingroup l2_construct def Mesh(self, obj=0, name=0): - return Mesh(self,self.geompyD,obj,name) + if isinstance(obj,str): + obj,name = name,obj + return Mesh(self,self.geompyD,obj,name) ## Returns a long value from enumeration # Should be used for SMESH.FunctorType enumeration @@ -753,12 +810,26 @@ class smeshDC(SMESH._objref_SMESH_Gen): print "Error: given parameter is not numerucal functor type." ## Creates hypothesis - # @param - # @param + # @param theHType mesh hypothesis type (string) + # @param theLibName mesh plug-in library name # @return created hypothesis instance def CreateHypothesis(self, theHType, theLibName="libStdMeshersEngine.so"): return SMESH._objref_SMESH_Gen.CreateHypothesis(self, theHType, theLibName ) + ## Gets the mesh stattistic + # @return dictionary type element - count of elements + # @ingroup l1_meshinfo + def GetMeshInfo(self, obj): + if isinstance( obj, Mesh ): + obj = obj.GetMesh() + d = {} + if hasattr(obj, "_narrow") and obj._narrow(SMESH.SMESH_IDSource): + values = obj.GetMeshInfo() + for i in range(SMESH.Entity_Last._v): + if i < len(values): d[SMESH.EntityType._item(i)]=values[i] + pass + return d + import omniORB #Registering the new proxy for SMESH_Gen omniORB.registerObjref(SMESH._objref_SMESH_Gen._NP_RepositoryId, smeshDC) @@ -1249,6 +1320,8 @@ class Mesh: # Exports the mesh in a file in MED format and chooses the \a version of MED format # @param f the file name # @param version values are SMESH.MED_V2_1, SMESH.MED_V2_2 + # @param opt boolean parameter for creating/not creating + # the groups Group_On_All_Nodes, Group_On_All_Faces, ... # @ingroup l2_impexp def ExportToMED(self, f, version, opt=0): self.mesh.ExportToMED(f, opt, version) @@ -1320,19 +1393,37 @@ class Mesh: elif tgeo == "SHELL": typ = VOLUME elif tgeo == "COMPOUND": - if len( self.geompyD.GetObjectIDs( grp )) == 0: - print "Mesh.Group: empty geometric group", GetName( grp ) - return 0 - tgeo = self.geompyD.GetType(grp) - if tgeo == geompyDC.ShapeType["VERTEX"]: - typ = NODE - elif tgeo == geompyDC.ShapeType["EDGE"]: - typ = EDGE - elif tgeo == geompyDC.ShapeType["FACE"]: - typ = FACE - elif tgeo == geompyDC.ShapeType["SOLID"]: - typ = VOLUME - + try: # it raises on a compound of compounds + if len( self.geompyD.GetObjectIDs( grp )) == 0: + print "Mesh.Group: empty geometric group", GetName( grp ) + return 0 + pass + except: + pass + if grp.GetType() == 37: # GEOMImpl_Types.hxx: #define GEOM_GROUP 37 + # group + tgeo = self.geompyD.GetType(grp) + if tgeo == geompyDC.ShapeType["VERTEX"]: + typ = NODE + elif tgeo == geompyDC.ShapeType["EDGE"]: + typ = EDGE + elif tgeo == geompyDC.ShapeType["FACE"]: + typ = FACE + elif tgeo == geompyDC.ShapeType["SOLID"]: + typ = VOLUME + pass + pass + else: + # just a compound + for elemType, shapeType in [[VOLUME,"SOLID"],[FACE,"FACE"], + [EDGE,"EDGE"],[NODE,"VERTEX"]]: + if self.geompyD.SubShapeAll(grp,geompyDC.ShapeType[shapeType]): + typ = elemType + break + pass + pass + pass + pass if typ == None: print "Mesh.Group: bad first argument: expected a group, a vertex, an edge, a face or a solid" return 0 @@ -1593,13 +1684,7 @@ class Mesh: # @ingroup l1_meshinfo def GetMeshInfo(self, obj = None): if not obj: obj = self.mesh - d = {} - if hasattr(obj, "_narrow") and obj._narrow(SMESH.SMESH_IDSource): - values = obj.GetMeshInfo() - for i in range(SMESH.Entity_Last._v): - if i < len(values): d[SMESH.EntityType._item(i)]=values[i] - pass - return d + return self.smeshpyD.GetMeshInfo(obj) ## Returns the number of nodes in the mesh # @return an integer value @@ -2125,6 +2210,8 @@ class Mesh: # @param x the X coordinate of a point # @param y the Y coordinate of a point # @param z the Z coordinate of a point + # @param NodeID if specified (>0), the node with this ID is moved, + # otherwise, the node closest to point (@a x,@a y,@a z) is moved # @return the ID of a node # @ingroup l2_modif_throughp def MoveClosestNodeToPoint(self, x, y, z, NodeID): @@ -2139,8 +2226,21 @@ class Mesh: # @return the ID of a node # @ingroup l2_modif_throughp def FindNodeClosestTo(self, x, y, z): - preview = self.mesh.GetMeshEditPreviewer() - return preview.MoveClosestNodeToPoint(x, y, z, -1) + #preview = self.mesh.GetMeshEditPreviewer() + #return preview.MoveClosestNodeToPoint(x, y, z, -1) + return self.editor.FindNodeClosestTo(x, y, z) + + ## Finds the elements where a point lays IN or ON + # @param x the X coordinate of a point + # @param y the Y coordinate of a point + # @param z the Z coordinate of a point + # @param elementType type of elements to find (SMESH.ALL type + # means elements of any type excluding nodes and 0D elements) + # @return list of IDs of found elements + # @ingroup l2_modif_throughp + def FindElementsByPoint(self, x, y, z, elementType = SMESH.ALL): + return self.editor.FindElementsByPoint(x, y, z, elementType) + ## Finds the node closest to a point and moves it to a point location # @param x the X coordinate of a point @@ -2497,6 +2597,12 @@ class Mesh: def ConvertFromQuadratic(self): return self.editor.ConvertFromQuadratic() + ## Creates 2D mesh as skin on boundary faces of a 3D mesh + # @return TRUE if operation has been completed successfully, FALSE otherwise + # @ingroup l2_modif_edit + def Make2DMeshFrom3D(self): + return self.editor. Make2DMeshFrom3D() + ## Renumber mesh nodes # @ingroup l2_modif_renumber def RenumberNodes(self): @@ -2792,7 +2898,7 @@ class Mesh: HasRefPoint, RefPoint, MakeGroups, ElemType) else: if isinstance(Base,Mesh): - return self.editor.ExtrusionAlongPathObjX(Base.GetMesh(), Path, NodeStart, + return self.editor.ExtrusionAlongPathObjX(Base, Path, NodeStart, HasAngles, Angles, LinearVariation, HasRefPoint, RefPoint, MakeGroups, ElemType) else: @@ -3253,6 +3359,8 @@ class Mesh: # @return a list of groups of equal elements # @ingroup l2_modif_trsf def FindEqualElements (self, MeshOrSubMeshOrGroup): + if ( isinstance( MeshOrSubMeshOrGroup, Mesh )): + MeshOrSubMeshOrGroup = MeshOrSubMeshOrGroup.GetMesh() return self.editor.FindEqualElements(MeshOrSubMeshOrGroup) ## Merges elements in each given group. @@ -3330,6 +3438,43 @@ class Mesh: # @ingroup l1_auxiliary def GetLastCreatedElems(self): return self.editor.GetLastCreatedElems() + + ## Creates a hole in a mesh by doubling the nodes of some particular elements + # @param theNodes identifiers of nodes to be doubled + # @param theModifiedElems identifiers of elements to be updated by the new (doubled) + # nodes. If list of element identifiers is empty then nodes are doubled but + # they not assigned to elements + # @return TRUE if operation has been completed successfully, FALSE otherwise + # @ingroup l2_modif_edit + def DoubleNodes(self, theNodes, theModifiedElems): + return self.editor.DoubleNodes(theNodes, theModifiedElems) + + ## Creates a hole in a mesh by doubling the nodes of some particular elements + # This method provided for convenience works as DoubleNodes() described above. + # @param theNodes identifiers of node to be doubled + # @param theModifiedElems identifiers of elements to be updated + # @return TRUE if operation has been completed successfully, FALSE otherwise + # @ingroup l2_modif_edit + def DoubleNode(self, theNodeId, theModifiedElems): + return self.editor.DoubleNode(theNodeId, theModifiedElems) + + ## Creates a hole in a mesh by doubling the nodes of some particular elements + # This method provided for convenience works as DoubleNodes() described above. + # @param theNodes group of nodes to be doubled + # @param theModifiedElems group of elements to be updated. + # @return TRUE if operation has been completed successfully, FALSE otherwise + # @ingroup l2_modif_edit + def DoubleNodeGroup(self, theNodes, theModifiedElems): + return self.editor.DoubleNodeGroup(theNodes, theModifiedElems) + + ## Creates a hole in a mesh by doubling the nodes of some particular elements + # This method provided for convenience works as DoubleNodes() described above. + # @param theNodes list of groups of nodes to be doubled + # @param theModifiedElems list of groups of elements to be updated. + # @return TRUE if operation has been completed successfully, FALSE otherwise + # @ingroup l2_modif_edit + def DoubleNodeGroups(self, theNodes, theModifiedElems): + return self.editor.DoubleNodeGroups(theNodes, theModifiedElems) ## Creates a hole in a mesh by doubling the nodes of some particular elements # @param theElems - the list of elements (edges or faces) to be replicated @@ -3339,8 +3484,8 @@ class Mesh: # replicated nodes should be associated to. # @return TRUE if operation has been completed successfully, FALSE otherwise # @ingroup l2_modif_edit - def DoubleNodes(self, theElems, theNodesNot, theAffectedElems): - return self.editor.DoubleNodes(theElems, theNodesNot, theAffectedElems) + def DoubleNodeElem(self, theElems, theNodesNot, theAffectedElems): + return self.editor.DoubleNodeElem(theElems, theNodesNot, theAffectedElems) ## Creates a hole in a mesh by doubling the nodes of some particular elements # @param theElems - the list of elements (edges or faces) to be replicated @@ -3351,8 +3496,8 @@ class Mesh: # The replicated nodes should be associated to affected elements. # @return TRUE if operation has been completed successfully, FALSE otherwise # @ingroup l2_modif_edit - def DoubleNodesInRegion(self, theElems, theNodesNot, theShape): - return self.editor.DoubleNodesInRegion(theElems, theNodesNot, theShape) + def DoubleNodeElemInRegion(self, theElems, theNodesNot, theShape): + return self.editor.DoubleNodeElemInRegion(theElems, theNodesNot, theShape) ## Creates a hole in a mesh by doubling the nodes of some particular elements # This method provided for convenience works as DoubleNodes() described above. @@ -3361,8 +3506,8 @@ class Mesh: # @param theAffectedElems - group of elements to which the replicated nodes # should be associated to. # @ingroup l2_modif_edit - def DoubleNodeGroup(self, theElems, theNodesNot, theAffectedElems): - return self.editor.DoubleNodeGroup(theElems, theNodesNot, theAffectedElems) + def DoubleNodeElemGroup(self, theElems, theNodesNot, theAffectedElems): + return self.editor.DoubleNodeElemGroup(theElems, theNodesNot, theAffectedElems) ## Creates a hole in a mesh by doubling the nodes of some particular elements # This method provided for convenience works as DoubleNodes() described above. @@ -3372,8 +3517,8 @@ class Mesh: # located on or inside shape). # The replicated nodes should be associated to affected elements. # @ingroup l2_modif_edit - def DoubleNodeGroupInRegion(self, theElems, theNodesNot, theShape): - return self.editor.DoubleNodeGroup(theElems, theNodesNot, theShape) + def DoubleNodeElemGroupInRegion(self, theElems, theNodesNot, theShape): + return self.editor.DoubleNodeElemGroup(theElems, theNodesNot, theShape) ## Creates a hole in a mesh by doubling the nodes of some particular elements # This method provided for convenience works as DoubleNodes() described above. @@ -3383,8 +3528,8 @@ class Mesh: # should be associated to. # @return TRUE if operation has been completed successfully, FALSE otherwise # @ingroup l2_modif_edit - def DoubleNodeGroups(self, theElems, theNodesNot, theAffectedElems): - return self.editor.DoubleNodeGroups(theElems, theNodesNot, theAffectedElems) + def DoubleNodeElemGroups(self, theElems, theNodesNot, theAffectedElems): + return self.editor.DoubleNodeElemGroups(theElems, theNodesNot, theAffectedElems) ## Creates a hole in a mesh by doubling the nodes of some particular elements # This method provided for convenience works as DoubleNodes() described above. @@ -3395,8 +3540,8 @@ class Mesh: # The replicated nodes should be associated to affected elements. # @return TRUE if operation has been completed successfully, FALSE otherwise # @ingroup l2_modif_edit - def DoubleNodeGroupsInRegion(self, theElems, theNodesNot, theShape): - return self.editor.DoubleNodeGroupsInRegion(theElems, theNodesNot, theShape) + def DoubleNodeElemGroupsInRegion(self, theElems, theNodesNot, theShape): + return self.editor.DoubleNodeElemGroupsInRegion(theElems, theNodesNot, theShape) ## The mother class to define algorithm, it is not recommended to use it directly. # @@ -3974,19 +4119,15 @@ class Mesh_Triangle(Mesh_Algorithm): self.Create(mesh, geom, "MEFISTO_2D") pass elif algoType == BLSURF: - import BLSURFPlugin + CheckPlugin(BLSURF) self.Create(mesh, geom, "BLSURF", "libBLSURFEngine.so") #self.SetPhysicalMesh() - PAL19680 elif algoType == NETGEN: - if noNETGENPlugin: - print "Warning: NETGENPlugin module unavailable" - pass + CheckPlugin(NETGEN) self.Create(mesh, geom, "NETGEN_2D", "libNETGENEngine.so") pass elif algoType == NETGEN_2D: - if noNETGENPlugin: - print "Warning: NETGENPlugin module unavailable" - pass + CheckPlugin(NETGEN) self.Create(mesh, geom, "NETGEN_2D_ONLY", "libNETGENEngine.so") pass @@ -4035,6 +4176,7 @@ class Mesh_Triangle(Mesh_Algorithm): # @ingroup l3_hypos_blsurf def SetPhySize(self, theVal): # Parameter of BLSURF algo + self.SetPhysicalMesh(1) #Custom - else why to set the size? self.Parameters().SetPhySize(theVal) ## Sets lower boundary of mesh element size (PhySize). @@ -4289,22 +4431,22 @@ class Mesh_Tetrahedron(Mesh_Algorithm): Mesh_Algorithm.__init__(self) if algoType == NETGEN: + CheckPlugin(NETGEN) self.Create(mesh, geom, "NETGEN_3D", "libNETGENEngine.so") pass elif algoType == FULL_NETGEN: - if noNETGENPlugin: - print "Warning: NETGENPlugin module has not been imported." + CheckPlugin(NETGEN) self.Create(mesh, geom, "NETGEN_2D3D", "libNETGENEngine.so") pass elif algoType == GHS3D: - import GHS3DPlugin + CheckPlugin(GHS3D) self.Create(mesh, geom, "GHS3D_3D" , "libGHS3DEngine.so") pass elif algoType == GHS3DPRL: - import GHS3DPRLPlugin + CheckPlugin(GHS3DPRL) self.Create(mesh, geom, "GHS3DPRL_3D" , "libGHS3DPRLEngine.so") pass @@ -4442,8 +4584,9 @@ class Mesh_Tetrahedron(Mesh_Algorithm): self.Parameters().SetToMeshHoles(toMesh) ## Set Optimization level: - # None_Optimization, Light_Optimization, Medium_Optimization, Strong_Optimization. - # Default is Medium_Optimization + # None_Optimization, Light_Optimization, Standard_Optimization, StandardPlus_Optimization, + # Strong_Optimization. + # Default is Standard_Optimization # @ingroup l3_hypos_ghs3dh def SetOptimizationLevel(self, level): # Parameter of GHS3D @@ -4540,7 +4683,7 @@ class Mesh_Hexahedron(Mesh_Algorithm): pass elif algoType == Hexotic: - import HexoticPlugin + CheckPlugin(Hexotic) self.Create(mesh, geom, "Hexotic_3D", "libHexoticEngine.so") pass @@ -4573,8 +4716,7 @@ class Mesh_Netgen(Mesh_Algorithm): def __init__(self, mesh, is3D, geom=0): Mesh_Algorithm.__init__(self) - if noNETGENPlugin: - print "Warning: NETGENPlugin module has not been imported." + CheckPlugin(NETGEN) self.is3D = is3D if is3D: @@ -5093,7 +5235,7 @@ omniORB.registerObjref(StdMeshers._objref_StdMeshers_MaxElementArea._NP_Reposito class MaxElementVolume(StdMeshers._objref_StdMeshers_MaxElementVolume): ## Set Max Element Volume parameter value - # @param area numerical value or name of variable from notebook + # @param volume numerical value or name of variable from notebook def SetMaxElementVolume(self, volume): volume ,parameters = ParseParameters(StdMeshers._objref_StdMeshers_MaxElementVolume.GetLastParameters(self),1,1,volume) StdMeshers._objref_StdMeshers_MaxElementVolume.SetParameters(self,parameters) @@ -5137,110 +5279,112 @@ class NumberOfSegments(StdMeshers._objref_StdMeshers_NumberOfSegments): #Registering the new proxy for NumberOfSegments omniORB.registerObjref(StdMeshers._objref_StdMeshers_NumberOfSegments._NP_RepositoryId, NumberOfSegments) +if not noNETGENPlugin: + #Wrapper class for NETGENPlugin_Hypothesis hypothesis + class NETGENPlugin_Hypothesis(NETGENPlugin._objref_NETGENPlugin_Hypothesis): + + ## Set Max Size parameter value + # @param maxsize numerical value or name of variable from notebook + def SetMaxSize(self, maxsize): + lastParameters = NETGENPlugin._objref_NETGENPlugin_Hypothesis.GetLastParameters(self) + maxsize, parameters = ParseParameters(lastParameters,4,1,maxsize) + NETGENPlugin._objref_NETGENPlugin_Hypothesis.SetParameters(self,parameters) + NETGENPlugin._objref_NETGENPlugin_Hypothesis.SetMaxSize(self,maxsize) + + ## Set Growth Rate parameter value + # @param value numerical value or name of variable from notebook + def SetGrowthRate(self, value): + lastParameters = NETGENPlugin._objref_NETGENPlugin_Hypothesis.GetLastParameters(self) + value, parameters = ParseParameters(lastParameters,4,2,value) + NETGENPlugin._objref_NETGENPlugin_Hypothesis.SetParameters(self,parameters) + NETGENPlugin._objref_NETGENPlugin_Hypothesis.SetGrowthRate(self,value) + + ## Set Number of Segments per Edge parameter value + # @param value numerical value or name of variable from notebook + def SetNbSegPerEdge(self, value): + lastParameters = NETGENPlugin._objref_NETGENPlugin_Hypothesis.GetLastParameters(self) + value, parameters = ParseParameters(lastParameters,4,3,value) + NETGENPlugin._objref_NETGENPlugin_Hypothesis.SetParameters(self,parameters) + NETGENPlugin._objref_NETGENPlugin_Hypothesis.SetNbSegPerEdge(self,value) + + ## Set Number of Segments per Radius parameter value + # @param value numerical value or name of variable from notebook + def SetNbSegPerRadius(self, value): + lastParameters = NETGENPlugin._objref_NETGENPlugin_Hypothesis.GetLastParameters(self) + value, parameters = ParseParameters(lastParameters,4,4,value) + NETGENPlugin._objref_NETGENPlugin_Hypothesis.SetParameters(self,parameters) + NETGENPlugin._objref_NETGENPlugin_Hypothesis.SetNbSegPerRadius(self,value) + + #Registering the new proxy for NETGENPlugin_Hypothesis + omniORB.registerObjref(NETGENPlugin._objref_NETGENPlugin_Hypothesis._NP_RepositoryId, NETGENPlugin_Hypothesis) + + + #Wrapper class for NETGENPlugin_Hypothesis_2D hypothesis + class NETGENPlugin_Hypothesis_2D(NETGENPlugin_Hypothesis,NETGENPlugin._objref_NETGENPlugin_Hypothesis_2D): + pass -#Wrapper class for NETGENPlugin_Hypothesis hypothesis -class NETGENPlugin_Hypothesis(NETGENPlugin._objref_NETGENPlugin_Hypothesis): - - ## Set Max Size parameter value - # @param maxsize numerical value or name of variable from notebook - def SetMaxSize(self, maxsize): - lastParameters = NETGENPlugin._objref_NETGENPlugin_Hypothesis.GetLastParameters(self) - maxsize, parameters = ParseParameters(lastParameters,4,1,maxsize) - NETGENPlugin._objref_NETGENPlugin_Hypothesis.SetParameters(self,parameters) - NETGENPlugin._objref_NETGENPlugin_Hypothesis.SetMaxSize(self,maxsize) - - ## Set Growth Rate parameter value - # @param value numerical value or name of variable from notebook - def SetGrowthRate(self, value): - lastParameters = NETGENPlugin._objref_NETGENPlugin_Hypothesis.GetLastParameters(self) - value, parameters = ParseParameters(lastParameters,4,2,value) - NETGENPlugin._objref_NETGENPlugin_Hypothesis.SetParameters(self,parameters) - NETGENPlugin._objref_NETGENPlugin_Hypothesis.SetGrowthRate(self,value) - - ## Set Number of Segments per Edge parameter value - # @param value numerical value or name of variable from notebook - def SetNbSegPerEdge(self, value): - lastParameters = NETGENPlugin._objref_NETGENPlugin_Hypothesis.GetLastParameters(self) - value, parameters = ParseParameters(lastParameters,4,3,value) - NETGENPlugin._objref_NETGENPlugin_Hypothesis.SetParameters(self,parameters) - NETGENPlugin._objref_NETGENPlugin_Hypothesis.SetNbSegPerEdge(self,value) - - ## Set Number of Segments per Radius parameter value - # @param value numerical value or name of variable from notebook - def SetNbSegPerRadius(self, value): - lastParameters = NETGENPlugin._objref_NETGENPlugin_Hypothesis.GetLastParameters(self) - value, parameters = ParseParameters(lastParameters,4,4,value) - NETGENPlugin._objref_NETGENPlugin_Hypothesis.SetParameters(self,parameters) - NETGENPlugin._objref_NETGENPlugin_Hypothesis.SetNbSegPerRadius(self,value) - -#Registering the new proxy for NETGENPlugin_Hypothesis -omniORB.registerObjref(NETGENPlugin._objref_NETGENPlugin_Hypothesis._NP_RepositoryId, NETGENPlugin_Hypothesis) - - -#Wrapper class for NETGENPlugin_Hypothesis_2D hypothesis -class NETGENPlugin_Hypothesis_2D(NETGENPlugin_Hypothesis,NETGENPlugin._objref_NETGENPlugin_Hypothesis_2D): - pass - -#Registering the new proxy for NETGENPlugin_Hypothesis_2D -omniORB.registerObjref(NETGENPlugin._objref_NETGENPlugin_Hypothesis_2D._NP_RepositoryId, NETGENPlugin_Hypothesis_2D) - -#Wrapper class for NETGENPlugin_SimpleHypothesis_2D hypothesis -class NETGEN_SimpleParameters_2D(NETGENPlugin._objref_NETGENPlugin_SimpleHypothesis_2D): - - ## Set Number of Segments parameter value - # @param nbSeg numerical value or name of variable from notebook - def SetNumberOfSegments(self, nbSeg): - lastParameters = NETGENPlugin._objref_NETGENPlugin_SimpleHypothesis_2D.GetLastParameters(self) - nbSeg, parameters = ParseParameters(lastParameters,2,1,nbSeg) - NETGENPlugin._objref_NETGENPlugin_SimpleHypothesis_2D.SetParameters(self,parameters) - NETGENPlugin._objref_NETGENPlugin_SimpleHypothesis_2D.SetNumberOfSegments(self, nbSeg) - - ## Set Local Length parameter value - # @param length numerical value or name of variable from notebook - def SetLocalLength(self, length): - lastParameters = NETGENPlugin._objref_NETGENPlugin_SimpleHypothesis_2D.GetLastParameters(self) - length, parameters = ParseParameters(lastParameters,2,1,length) - NETGENPlugin._objref_NETGENPlugin_SimpleHypothesis_2D.SetParameters(self,parameters) - NETGENPlugin._objref_NETGENPlugin_SimpleHypothesis_2D.SetLocalLength(self, length) - - ## Set Max Element Area parameter value - # @param area numerical value or name of variable from notebook - def SetMaxElementArea(self, area): - lastParameters = NETGENPlugin._objref_NETGENPlugin_SimpleHypothesis_2D.GetLastParameters(self) - area, parameters = ParseParameters(lastParameters,2,2,area) - NETGENPlugin._objref_NETGENPlugin_SimpleHypothesis_2D.SetParameters(self,parameters) - NETGENPlugin._objref_NETGENPlugin_SimpleHypothesis_2D.SetMaxElementArea(self, area) - - def LengthFromEdges(self): - lastParameters = NETGENPlugin._objref_NETGENPlugin_SimpleHypothesis_2D.GetLastParameters(self) - value = 0; - value, parameters = ParseParameters(lastParameters,2,2,value) - NETGENPlugin._objref_NETGENPlugin_SimpleHypothesis_2D.SetParameters(self,parameters) - NETGENPlugin._objref_NETGENPlugin_SimpleHypothesis_2D.LengthFromEdges(self) - -#Registering the new proxy for NETGEN_SimpleParameters_2D -omniORB.registerObjref(NETGENPlugin._objref_NETGENPlugin_SimpleHypothesis_2D._NP_RepositoryId, NETGEN_SimpleParameters_2D) - - -#Wrapper class for NETGENPlugin_SimpleHypothesis_3D hypothesis -class NETGEN_SimpleParameters_3D(NETGEN_SimpleParameters_2D,NETGENPlugin._objref_NETGENPlugin_SimpleHypothesis_3D): - ## Set Max Element Volume parameter value - # @param volume numerical value or name of variable from notebook - def SetMaxElementVolume(self, volume): - lastParameters = NETGENPlugin._objref_NETGENPlugin_SimpleHypothesis_3D.GetLastParameters(self) - volume, parameters = ParseParameters(lastParameters,3,3,volume) - NETGENPlugin._objref_NETGENPlugin_SimpleHypothesis_3D.SetParameters(self,parameters) - NETGENPlugin._objref_NETGENPlugin_SimpleHypothesis_3D.SetMaxElementVolume(self, volume) - - def LengthFromFaces(self): - lastParameters = NETGENPlugin._objref_NETGENPlugin_SimpleHypothesis_3D.GetLastParameters(self) - value = 0; - value, parameters = ParseParameters(lastParameters,3,3,value) - NETGENPlugin._objref_NETGENPlugin_SimpleHypothesis_3D.SetParameters(self,parameters) - NETGENPlugin._objref_NETGENPlugin_SimpleHypothesis_3D.LengthFromFaces(self) - -#Registering the new proxy for NETGEN_SimpleParameters_3D -omniORB.registerObjref(NETGENPlugin._objref_NETGENPlugin_SimpleHypothesis_3D._NP_RepositoryId, NETGEN_SimpleParameters_3D) + #Registering the new proxy for NETGENPlugin_Hypothesis_2D + omniORB.registerObjref(NETGENPlugin._objref_NETGENPlugin_Hypothesis_2D._NP_RepositoryId, NETGENPlugin_Hypothesis_2D) + + #Wrapper class for NETGENPlugin_SimpleHypothesis_2D hypothesis + class NETGEN_SimpleParameters_2D(NETGENPlugin._objref_NETGENPlugin_SimpleHypothesis_2D): + + ## Set Number of Segments parameter value + # @param nbSeg numerical value or name of variable from notebook + def SetNumberOfSegments(self, nbSeg): + lastParameters = NETGENPlugin._objref_NETGENPlugin_SimpleHypothesis_2D.GetLastParameters(self) + nbSeg, parameters = ParseParameters(lastParameters,2,1,nbSeg) + NETGENPlugin._objref_NETGENPlugin_SimpleHypothesis_2D.SetParameters(self,parameters) + NETGENPlugin._objref_NETGENPlugin_SimpleHypothesis_2D.SetNumberOfSegments(self, nbSeg) + + ## Set Local Length parameter value + # @param length numerical value or name of variable from notebook + def SetLocalLength(self, length): + lastParameters = NETGENPlugin._objref_NETGENPlugin_SimpleHypothesis_2D.GetLastParameters(self) + length, parameters = ParseParameters(lastParameters,2,1,length) + NETGENPlugin._objref_NETGENPlugin_SimpleHypothesis_2D.SetParameters(self,parameters) + NETGENPlugin._objref_NETGENPlugin_SimpleHypothesis_2D.SetLocalLength(self, length) + + ## Set Max Element Area parameter value + # @param area numerical value or name of variable from notebook + def SetMaxElementArea(self, area): + lastParameters = NETGENPlugin._objref_NETGENPlugin_SimpleHypothesis_2D.GetLastParameters(self) + area, parameters = ParseParameters(lastParameters,2,2,area) + NETGENPlugin._objref_NETGENPlugin_SimpleHypothesis_2D.SetParameters(self,parameters) + NETGENPlugin._objref_NETGENPlugin_SimpleHypothesis_2D.SetMaxElementArea(self, area) + + def LengthFromEdges(self): + lastParameters = NETGENPlugin._objref_NETGENPlugin_SimpleHypothesis_2D.GetLastParameters(self) + value = 0; + value, parameters = ParseParameters(lastParameters,2,2,value) + NETGENPlugin._objref_NETGENPlugin_SimpleHypothesis_2D.SetParameters(self,parameters) + NETGENPlugin._objref_NETGENPlugin_SimpleHypothesis_2D.LengthFromEdges(self) + + #Registering the new proxy for NETGEN_SimpleParameters_2D + omniORB.registerObjref(NETGENPlugin._objref_NETGENPlugin_SimpleHypothesis_2D._NP_RepositoryId, NETGEN_SimpleParameters_2D) + + + #Wrapper class for NETGENPlugin_SimpleHypothesis_3D hypothesis + class NETGEN_SimpleParameters_3D(NETGEN_SimpleParameters_2D,NETGENPlugin._objref_NETGENPlugin_SimpleHypothesis_3D): + ## Set Max Element Volume parameter value + # @param volume numerical value or name of variable from notebook + def SetMaxElementVolume(self, volume): + lastParameters = NETGENPlugin._objref_NETGENPlugin_SimpleHypothesis_3D.GetLastParameters(self) + volume, parameters = ParseParameters(lastParameters,3,3,volume) + NETGENPlugin._objref_NETGENPlugin_SimpleHypothesis_3D.SetParameters(self,parameters) + NETGENPlugin._objref_NETGENPlugin_SimpleHypothesis_3D.SetMaxElementVolume(self, volume) + + def LengthFromFaces(self): + lastParameters = NETGENPlugin._objref_NETGENPlugin_SimpleHypothesis_3D.GetLastParameters(self) + value = 0; + value, parameters = ParseParameters(lastParameters,3,3,value) + NETGENPlugin._objref_NETGENPlugin_SimpleHypothesis_3D.SetParameters(self,parameters) + NETGENPlugin._objref_NETGENPlugin_SimpleHypothesis_3D.LengthFromFaces(self) + + #Registering the new proxy for NETGEN_SimpleParameters_3D + omniORB.registerObjref(NETGENPlugin._objref_NETGENPlugin_SimpleHypothesis_3D._NP_RepositoryId, NETGEN_SimpleParameters_3D) + + pass # if not noNETGENPlugin: class Pattern(SMESH._objref_SMESH_Pattern): diff --git a/src/StdMeshers/StdMeshers_CompositeHexa_3D.cxx b/src/StdMeshers/StdMeshers_CompositeHexa_3D.cxx index d04f77c55..38bbdeaf3 100644 --- a/src/StdMeshers/StdMeshers_CompositeHexa_3D.cxx +++ b/src/StdMeshers/StdMeshers_CompositeHexa_3D.cxx @@ -252,7 +252,7 @@ StdMeshers_CompositeHexa_3D::StdMeshers_CompositeHexa_3D(int hypId, int studyId, :SMESH_3D_Algo(hypId, studyId, gen) { _name = "CompositeHexa_3D"; - _shapeType = (1 << TopAbs_SHELL) | (1 << TopAbs_SOLID); // 1 bit /shape type + _shapeType = (1 << TopAbs_SHELL) | (1 << TopAbs_SOLID); // 1 bit /shape type } //================================================================================ @@ -514,7 +514,7 @@ bool StdMeshers_CompositeHexa_3D::Compute(SMESH_Mesh& theMesh, //purpose : auxilary for Evaluate //======================================================================= int GetNb2d(_QuadFaceGrid* QFG, SMESH_Mesh& theMesh, - MapShapeNbElems& aResMap) + MapShapeNbElems& aResMap) { int nb2d = 0; _QuadFaceGrid::TChildIterator aCI = QFG->GetChildren(); @@ -539,8 +539,8 @@ int GetNb2d(_QuadFaceGrid* QFG, SMESH_Mesh& theMesh, //================================================================================ bool StdMeshers_CompositeHexa_3D::Evaluate(SMESH_Mesh& theMesh, - const TopoDS_Shape& theShape, - MapShapeNbElems& aResMap) + const TopoDS_Shape& theShape, + MapShapeNbElems& aResMap) { SMESH_MesherHelper aTool(theMesh); bool _quadraticMesh = aTool.IsQuadraticSubMesh(theShape); @@ -636,22 +636,22 @@ bool StdMeshers_CompositeHexa_3D::Evaluate(SMESH_Mesh& theMesh, int nb0 = 0; SMESH_subMesh *sm = theMesh.GetSubMesh(exp.Current()); if( sm ) { - MapShapeNbElemsItr anIt = aResMap.find(sm); - if( anIt == aResMap.end() ) continue; - std::vector aVec = (*anIt).second; - nb0 = aVec[SMDSEntity_Node]; + MapShapeNbElemsItr anIt = aResMap.find(sm); + if( anIt == aResMap.end() ) continue; + std::vector aVec = (*anIt).second; + nb0 = aVec[SMDSEntity_Node]; } int j = 1; for(; j<=BndEdges.Length(); j++) { - if( BndEdges.Value(j) == exp.Current() ) { - // internal edge => remove it - BndEdges.Remove(j); - nb0d_in += nb0; - break; - } + if( BndEdges.Value(j) == exp.Current() ) { + // internal edge => remove it + BndEdges.Remove(j); + nb0d_in += nb0; + break; + } } if( j > BndEdges.Length() ) { - BndEdges.Append(exp.Current()); + BndEdges.Append(exp.Current()); } //if( BndEdges.Contains(exp.Current()) ) { //BndEdges.Remove( exp.Current() ); diff --git a/src/StdMeshers/StdMeshers_FaceSide.cxx b/src/StdMeshers/StdMeshers_FaceSide.cxx index 15ebca373..c677973be 100644 --- a/src/StdMeshers/StdMeshers_FaceSide.cxx +++ b/src/StdMeshers/StdMeshers_FaceSide.cxx @@ -165,8 +165,8 @@ StdMeshers_FaceSide::StdMeshers_FaceSide(const TopoDS_Face& theFace, //================================================================================ StdMeshers_FaceSide::StdMeshers_FaceSide(const SMDS_MeshNode* theNode, - const gp_Pnt2d thePnt2d, - const StdMeshers_FaceSide* theSide) + const gp_Pnt2d thePnt2d, + const StdMeshers_FaceSide* theSide) { myC2d.resize(1); myLength = 0; @@ -541,15 +541,7 @@ TSideVector StdMeshers_FaceSide::GetFaceWires(const TopoDS_Face& theFace, return TSideVector(0); } } - // find out side orientation, which is important if there are several wires (PAL19080) - bool isForward = true; - if ( nbWires > 1 ) { - TopExp_Explorer e( theFace, TopAbs_EDGE ); - while ( ! e.Current().IsSame( wireEdges.back() )) - e.Next(); - isForward = ( e.Current().Orientation() == wireEdges.back().Orientation() ); - } - + const bool isForward = true; StdMeshers_FaceSide* wire = new StdMeshers_FaceSide( theFace, wireEdges, &theMesh, isForward, theIgnoreMediumNodes); wires[ iW ] = StdMeshers_FaceSidePtr( wire ); diff --git a/src/StdMeshers/StdMeshers_FaceSide.hxx b/src/StdMeshers/StdMeshers_FaceSide.hxx index f340dad04..8382a8fbd 100644 --- a/src/StdMeshers/StdMeshers_FaceSide.hxx +++ b/src/StdMeshers/StdMeshers_FaceSide.hxx @@ -97,7 +97,7 @@ public: * \brief Wrap for vertex using data from other FaceSide */ StdMeshers_FaceSide(const SMDS_MeshNode* theNode, - const gp_Pnt2d thePnt2d, + const gp_Pnt2d thePnt2d, const StdMeshers_FaceSide* theSide); /*! * \brief Return wires of a face as StdMeshers_FaceSide's diff --git a/src/StdMeshers/StdMeshers_Hexa_3D.cxx b/src/StdMeshers/StdMeshers_Hexa_3D.cxx index 1300bf9b1..42b5488ec 100644 --- a/src/StdMeshers/StdMeshers_Hexa_3D.cxx +++ b/src/StdMeshers/StdMeshers_Hexa_3D.cxx @@ -61,10 +61,10 @@ typedef SMESH_Comment TComm; using namespace std; static SMESH_ComputeErrorPtr ComputePentahedralMesh(SMESH_Mesh &, - const TopoDS_Shape &); + const TopoDS_Shape &); static bool EvaluatePentahedralMesh(SMESH_Mesh &, const TopoDS_Shape &, - MapShapeNbElems &); + MapShapeNbElems &); //============================================================================= /*! @@ -77,7 +77,7 @@ StdMeshers_Hexa_3D::StdMeshers_Hexa_3D(int hypId, int studyId, SMESH_Gen * gen) { MESSAGE("StdMeshers_Hexa_3D::StdMeshers_Hexa_3D"); _name = "Hexa_3D"; - _shapeType = (1 << TopAbs_SHELL) | (1 << TopAbs_SOLID); // 1 bit /shape type + _shapeType = (1 << TopAbs_SHELL) | (1 << TopAbs_SOLID); // 1 bit /shape type } //============================================================================= @@ -298,7 +298,7 @@ bool StdMeshers_Hexa_3D::Compute(SMESH_Mesh & aMesh, try { aQuads[i] = quadAlgo->CheckAnd2Dcompute(aMesh, aFace, _quadraticMesh); if(!aQuads[i]) { - return error( quadAlgo->GetComputeError()); + return error( quadAlgo->GetComputeError()); } } catch(SALOME_Exception & S_ex) { @@ -361,7 +361,7 @@ bool StdMeshers_Hexa_3D::Compute(SMESH_Mesh & aMesh, int _indX1 = GetFaceIndex(aMesh, aShape, meshFaces, aCube.V100, aCube.V101, aCube.V110, aCube.V111); - // IPAL21120: SIGSEGV on Meshing attached Compound with Automatic Hexadralization + // IPAL21120: SIGSEGV on Meshing attached Compound with Automatic Hexadralization if ( _indY1 < 1 || _indZ0 < 1 || _indZ1 < 1 || _indX0 < 1 || _indX1 < 1 ) return error(COMPERR_BAD_SHAPE); @@ -374,8 +374,8 @@ bool StdMeshers_Hexa_3D::Compute(SMESH_Mesh & aMesh, // 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 cx0; // for face X=0 + Conv2DStruct cx1; // for face X=1 Conv2DStruct cy0; Conv2DStruct cy1; Conv2DStruct cz0; @@ -414,12 +414,12 @@ bool StdMeshers_Hexa_3D::Compute(SMESH_Mesh & aMesh, const TopoDS_Face & F = TopoDS::Face(meshFaces[_indX0]->GetSubShape()); faceQuadStruct *quad = aCube.quad_X0; - int i = 0; // j = x/face , k = y/face + int i = 0; // j = x/face , k = y/face int nbdown = quad->side[0]->NbPoints(); int nbright = quad->side[1]->NbPoints(); SMDS_NodeIteratorPtr itf= aMesh.GetSubMesh(F)->GetSubMeshDS()->GetNodes(); - + while(itf->more()) { const SMDS_MeshNode * node = itf->next(); if(aTool.IsMedium(node)) @@ -433,8 +433,8 @@ bool StdMeshers_Hexa_3D::Compute(SMESH_Mesh & aMesh, 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 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(" "<uv_grid[ij1].node; @@ -448,7 +448,7 @@ bool StdMeshers_Hexa_3D::Compute(SMESH_Mesh & aMesh, SMDS_NodeIteratorPtr itf= aMesh.GetSubMesh(F)->GetSubMeshDS()->GetNodes(); faceQuadStruct *quad = aCube.quad_X1; - int i = nbx - 1; // j = x/face , k = y/face + int i = nbx - 1; // j = x/face , k = y/face int nbdown = quad->side[0]->NbPoints(); int nbright = quad->side[1]->NbPoints(); @@ -465,8 +465,8 @@ bool StdMeshers_Hexa_3D::Compute(SMESH_Mesh & aMesh, 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 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(" "<uv_grid[ij1].node; @@ -480,7 +480,7 @@ bool StdMeshers_Hexa_3D::Compute(SMESH_Mesh & aMesh, SMDS_NodeIteratorPtr itf= aMesh.GetSubMesh(F)->GetSubMeshDS()->GetNodes(); faceQuadStruct *quad = aCube.quad_Y0; - int j = 0; // i = x/face , k = y/face + int j = 0; // i = x/face , k = y/face int nbdown = quad->side[0]->NbPoints(); int nbright = quad->side[1]->NbPoints(); @@ -497,8 +497,8 @@ bool StdMeshers_Hexa_3D::Compute(SMESH_Mesh & aMesh, 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 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(" "<uv_grid[ij1].node; @@ -512,7 +512,7 @@ bool StdMeshers_Hexa_3D::Compute(SMESH_Mesh & aMesh, SMDS_NodeIteratorPtr itf= aMesh.GetSubMesh(F)->GetSubMeshDS()->GetNodes(); faceQuadStruct *quad = aCube.quad_Y1; - int j = nby - 1; // i = x/face , k = y/face + int j = nby - 1; // i = x/face , k = y/face int nbdown = quad->side[0]->NbPoints(); int nbright = quad->side[1]->NbPoints(); @@ -529,8 +529,8 @@ bool StdMeshers_Hexa_3D::Compute(SMESH_Mesh & aMesh, 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 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(" "<uv_grid[ij1].node; @@ -544,7 +544,7 @@ bool StdMeshers_Hexa_3D::Compute(SMESH_Mesh & aMesh, SMDS_NodeIteratorPtr itf= aMesh.GetSubMesh(F)->GetSubMeshDS()->GetNodes(); faceQuadStruct *quad = aCube.quad_Z0; - int k = 0; // i = x/face , j = y/face + int k = 0; // i = x/face , j = y/face int nbdown = quad->side[0]->NbPoints(); int nbright = quad->side[1]->NbPoints(); @@ -561,8 +561,8 @@ bool StdMeshers_Hexa_3D::Compute(SMESH_Mesh & aMesh, 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 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(" "<uv_grid[ij1].node; @@ -576,7 +576,7 @@ bool StdMeshers_Hexa_3D::Compute(SMESH_Mesh & aMesh, SMDS_NodeIteratorPtr itf= aMesh.GetSubMesh(F)->GetSubMeshDS()->GetNodes(); faceQuadStruct *quad = aCube.quad_Z1; - int k = nbz - 1; // i = x/face , j = y/face + int k = nbz - 1; // i = x/face , j = y/face int nbdown = quad->side[0]->NbPoints(); int nbright = quad->side[1]->NbPoints(); @@ -593,8 +593,8 @@ bool StdMeshers_Hexa_3D::Compute(SMESH_Mesh & aMesh, 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 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(" "<uv_grid[ij1].node; @@ -655,9 +655,9 @@ bool StdMeshers_Hexa_3D::Compute(SMESH_Mesh & aMesh, 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 + 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++) { @@ -750,8 +750,8 @@ bool StdMeshers_Hexa_3D::Compute(SMESH_Mesh & aMesh, //============================================================================= bool StdMeshers_Hexa_3D::Evaluate(SMESH_Mesh & aMesh, - const TopoDS_Shape & aShape, - MapShapeNbElems& aResMap) + const TopoDS_Shape & aShape, + MapShapeNbElems& aResMap) { vector < SMESH_subMesh * >meshFaces; TopTools_SequenceOfShape aFaces; @@ -789,7 +789,7 @@ bool StdMeshers_Hexa_3D::Evaluate(SMESH_Mesh & aMesh, std::vector aVec = (*anIt).second; int nbtri = Max(aVec[SMDSEntity_Triangle],aVec[SMDSEntity_Quad_Triangle]); if( nbtri == 0 ) - isAllQuad = true; + isAllQuad = true; } if ( ! isAllQuad ) { return EvaluatePentahedralMesh(aMesh, aShape, aResMap); @@ -810,8 +810,8 @@ bool StdMeshers_Hexa_3D::Evaluate(SMESH_Mesh & aMesh, std::vector aVec = (*anIt).second; nb1d += Max(aVec[SMDSEntity_Edge],aVec[SMDSEntity_Quad_Edge]); if(IsFirst) { - IsQuadratic = (aVec[SMDSEntity_Quad_Edge] > aVec[SMDSEntity_Edge]); - IsFirst = false; + IsQuadratic = (aVec[SMDSEntity_Quad_Edge] > aVec[SMDSEntity_Edge]); + IsFirst = false; } } } @@ -821,8 +821,8 @@ bool StdMeshers_Hexa_3D::Evaluate(SMESH_Mesh & aMesh, bool IsOpposite = true; for(TopExp_Explorer exp(aFaces.Value(i), TopAbs_EDGE); exp.More(); exp.Next()) { if( Edges1.Contains(exp.Current()) ) { - IsOpposite = false; - break; + IsOpposite = false; + break; } } if(IsOpposite) { @@ -872,12 +872,12 @@ bool StdMeshers_Hexa_3D::Evaluate(SMESH_Mesh & aMesh, 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(" "<X(); + p[1] = node->Y(); + p[2] = node->Z(); + //MESSAGE(" "<&meshFaces, - const TopoDS_Vertex & V0, - const TopoDS_Vertex & V1, - const TopoDS_Vertex & V2, const TopoDS_Vertex & V3) + 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; - } - } - //IPAL21120 ASSERT(faceIndex > 0); - //SCRUTE(faceIndex); - return faceIndex; + //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; + } + } + //IPAL21120 ASSERT(faceIndex > 0); + //SCRUTE(faceIndex); + return faceIndex; } //============================================================================= @@ -925,46 +925,46 @@ int StdMeshers_Hexa_3D::GetFaceIndex(SMESH_Mesh & aMesh, //============================================================================= 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) + 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; + //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; } //============================================================================= @@ -974,135 +974,135 @@ TopoDS_Edge //============================================================================= 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) + 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); +// 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; -// } +// if (isForward) +// { +// VA = VFirst; +// VB = VLast; +// } +// else +// { +// VA = VLast; +// VB = VFirst; +// } VA = quad.side[0]->FirstVertex(); VB = quad.side[0]->LastVertex(); - 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.side[0]->NbPoints(); - int nbright = quad.side[1]->NbPoints(); - 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); + 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.side[0]->NbPoints(); + int nbright = quad.side[1]->NbPoints(); + 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); } //================================================================================ @@ -1189,8 +1189,8 @@ SMESH_ComputeErrorPtr ComputePentahedralMesh(SMESH_Mesh & aMesh, //======================================================================= bool EvaluatePentahedralMesh(SMESH_Mesh & aMesh, - const TopoDS_Shape & aShape, - MapShapeNbElems& aResMap) + const TopoDS_Shape & aShape, + MapShapeNbElems& aResMap) { StdMeshers_Penta_3D anAlgo; bool bOK = anAlgo.Evaluate(aMesh, aShape, aResMap); diff --git a/src/StdMeshers/StdMeshers_MEFISTO_2D.cxx b/src/StdMeshers/StdMeshers_MEFISTO_2D.cxx index 23582d72e..ca1ef9e11 100644 --- a/src/StdMeshers/StdMeshers_MEFISTO_2D.cxx +++ b/src/StdMeshers/StdMeshers_MEFISTO_2D.cxx @@ -53,6 +53,7 @@ #include #include #include +#include #include #include #include @@ -303,7 +304,7 @@ bool StdMeshers_MEFISTO_2D::Evaluate(SMESH_Mesh & aMesh, TopoDS_Face F = TopoDS::Face(aShape.Oriented(TopAbs_FORWARD)); double aLen = 0.0; - double NbSeg = 0; + int NbSeg = 0; bool IsQuadratic = false; bool IsFirst = true; TopExp_Explorer exp(F,TopAbs_EDGE); @@ -331,16 +332,27 @@ bool StdMeshers_MEFISTO_2D::Evaluate(SMESH_Mesh & aMesh, P1 = P2; } } + if(NbSeg<1) { + std::vector aResVec(SMDSEntity_Last); + for(int i=SMDSEntity_Node; iGetComputeError(); + smError.reset( new SMESH_ComputeError(COMPERR_ALGO_FAILED, + "Submesh can not be evaluated",this)); + return false; + } aLen = aLen/NbSeg; // middle length - _edgeLength = DBL_MAX; + _edgeLength = Precision::Infinite(); double tmpLength = Min( _edgeLength, aLen ); GProp_GProps G; BRepGProp::SurfaceProperties(aShape,G); double anArea = G.Mass(); - int nbFaces = (int) ( anArea/(tmpLength*tmpLength*sqrt(3.)/4) ); + int nbFaces = Precision::IsInfinite( tmpLength ) ? 0 : + (int)( anArea/(tmpLength*tmpLength*sqrt(3.)/4) ); int nbNodes = (int) ( nbFaces*3 - (NbSeg-1)*2 ) / 6; std::vector aVec(SMDSEntity_Last); diff --git a/src/StdMeshers/StdMeshers_NumberOfSegments.cxx b/src/StdMeshers/StdMeshers_NumberOfSegments.cxx index e03a921e8..ce4876ee3 100644 --- a/src/StdMeshers/StdMeshers_NumberOfSegments.cxx +++ b/src/StdMeshers/StdMeshers_NumberOfSegments.cxx @@ -49,6 +49,8 @@ #include #endif +#include + using namespace std; const double PRECISION = 1e-7; @@ -233,11 +235,11 @@ void StdMeshers_NumberOfSegments::SetTableFunction(const vector& table) #ifdef NO_CAS_CATCH OCC_CATCH_SIGNALS; #endif - val = pow( 10.0, val ); + val = pow( 10.0, val ); } catch(Standard_Failure) { - Handle(Standard_Failure) aFail = Standard_Failure::Caught(); - throw SALOME_Exception( LOCALIZED( "invalid value")); - return; + Handle(Standard_Failure) aFail = Standard_Failure::Caught(); + throw SALOME_Exception( LOCALIZED( "invalid value")); + return; } } else if( _convMode==1 && val<0.0 ) @@ -303,7 +305,7 @@ bool isCorrectArg( const Handle( Expr_GeneralExpression )& expr ) if( !name.IsNull() ) { if( name->GetName()!="t" ) - res = false; + res = false; } else res = isCorrectArg( sub ); @@ -317,10 +319,12 @@ bool isCorrectArg( const Handle( Expr_GeneralExpression )& expr ) */ //================================================================================ bool process( const TCollection_AsciiString& str, int convMode, - bool& syntax, bool& args, - bool& non_neg, bool& non_zero, - bool& singulars, double& sing_point ) + bool& syntax, bool& args, + bool& non_neg, bool& non_zero, + bool& singulars, double& sing_point ) { + Kernel_Utils::Localizer loc; + bool parsed_ok = true; Handle( ExprIntrp_GenExp ) myExpr; try { @@ -359,19 +363,20 @@ bool process( const TCollection_AsciiString& str, int convMode, double t = double(i)/double(max), val; if( !f.value( t, val ) ) { - sing_point = t; - singulars = true; - break; + sing_point = t; + singulars = true; + break; } if( val<0 ) { - non_neg = false; - break; + non_neg = false; + break; } if( val>PRECISION ) - non_zero = true; + non_zero = true; } } + return res && non_neg && non_zero && ( !singulars ); } diff --git a/src/StdMeshers/StdMeshers_Quadrangle_2D.cxx b/src/StdMeshers/StdMeshers_Quadrangle_2D.cxx index 8ae77c241..501915676 100644 --- a/src/StdMeshers/StdMeshers_Quadrangle_2D.cxx +++ b/src/StdMeshers/StdMeshers_Quadrangle_2D.cxx @@ -77,7 +77,7 @@ typedef SMESH_Comment TComm; //============================================================================= StdMeshers_Quadrangle_2D::StdMeshers_Quadrangle_2D (int hypId, int studyId, - SMESH_Gen* gen) + SMESH_Gen* gen) : SMESH_2D_Algo(hypId, studyId, gen) { MESSAGE("StdMeshers_Quadrangle_2D::StdMeshers_Quadrangle_2D"); @@ -123,7 +123,7 @@ bool StdMeshers_Quadrangle_2D::CheckHypothesis theHyp = hyps.front(); if(strcmp("QuadrangleParams", theHyp->GetName()) == 0) { const StdMeshers_QuadrangleParams* theHyp1 = - (const StdMeshers_QuadrangleParams*)theHyp; + (const StdMeshers_QuadrangleParams*)theHyp; myTriaVertexID = theHyp1->GetTriaVertex(); myQuadranglePreference= false; myTrianglePreference= false; @@ -144,29 +144,29 @@ bool StdMeshers_Quadrangle_2D::CheckHypothesis theHyp = hyps.front(); if(strcmp("QuadrangleParams", theHyp->GetName()) == 0) { const StdMeshers_QuadrangleParams* theHyp1 = - (const StdMeshers_QuadrangleParams*)theHyp; + (const StdMeshers_QuadrangleParams*)theHyp; myTriaVertexID = theHyp1->GetTriaVertex(); theHyp = hyps.back(); if(strcmp("QuadranglePreference", theHyp->GetName()) == 0) { - myQuadranglePreference= true; - myTrianglePreference= false; + myQuadranglePreference= true; + myTrianglePreference= false; } else if(strcmp("TrianglePreference", theHyp->GetName()) == 0){ - myQuadranglePreference= false; - myTrianglePreference= true; + myQuadranglePreference= false; + myTrianglePreference= true; } } else { if(strcmp("QuadranglePreference", theHyp->GetName()) == 0) { - myQuadranglePreference= true; - myTrianglePreference= false; + myQuadranglePreference= true; + myTrianglePreference= false; } else if(strcmp("TrianglePreference", theHyp->GetName()) == 0){ - myQuadranglePreference= false; - myTrianglePreference= true; + myQuadranglePreference= false; + myTrianglePreference= true; } const StdMeshers_QuadrangleParams* theHyp2 = - (const StdMeshers_QuadrangleParams*)hyps.back(); + (const StdMeshers_QuadrangleParams*)hyps.back(); myTriaVertexID = theHyp2->GetTriaVertex(); } } @@ -286,7 +286,7 @@ bool StdMeshers_Quadrangle_2D::Compute (SMESH_Mesh& aMesh, d = quad->uv_grid[(j + 1) * nbhoriz + i].node; SMDS_MeshFace* face = myTool->AddFace(a, b, c, d); if(face) { - meshDS->SetMeshElementOnShape(face, geomFaceID); + meshDS->SetMeshElementOnShape(face, geomFaceID); } } } @@ -638,7 +638,7 @@ bool StdMeshers_Quadrangle_2D::Compute (SMESH_Mesh& aMesh, bool StdMeshers_Quadrangle_2D::Evaluate(SMESH_Mesh& aMesh, const TopoDS_Shape& aShape, - MapShapeNbElems& aResMap) + MapShapeNbElems& aResMap) { aMesh.GetSubMesh(aShape); @@ -778,31 +778,31 @@ FaceQuadStruct* StdMeshers_Quadrangle_2D::CheckNbEdges(SMESH_Mesh & aMes SMESHDS_Mesh* meshDS = aMesh.GetMeshDS(); TopoDS_Vertex V = TopoDS::Vertex(meshDS->IndexToShape(myTriaVertexID)); if(!V.IsNull()) { - TopoDS_Edge E1,E2,E3; - for(; edgeIt != edges.end(); ++edgeIt) { - TopoDS_Edge E = TopoDS::Edge(*edgeIt); - TopoDS_Vertex VF, VL; - TopExp::Vertices(E, VF, VL, true); - if( VF.IsSame(V) ) - E1 = E; - else if( VL.IsSame(V) ) - E3 = E; - else - E2 = E; - } - quad->side.reserve(4); - quad->side.push_back( new StdMeshers_FaceSide(F, E1, &aMesh, true, ignoreMediumNodes)); - quad->side.push_back( new StdMeshers_FaceSide(F, E2, &aMesh, true, ignoreMediumNodes)); - quad->side.push_back( new StdMeshers_FaceSide(F, E3, &aMesh, false, ignoreMediumNodes)); - std::vector UVPSleft = quad->side[0]->GetUVPtStruct(true,0); - std::vector UVPStop = quad->side[1]->GetUVPtStruct(false,1); - std::vector UVPSright = quad->side[2]->GetUVPtStruct(true,1); - const SMDS_MeshNode* aNode = UVPSleft[0].node; - gp_Pnt2d aPnt2d( UVPSleft[0].u, UVPSleft[0].v ); - StdMeshers_FaceSide* VertFS = - new StdMeshers_FaceSide(aNode, aPnt2d, quad->side[1]); - quad->side.push_back(VertFS); - return quad; + TopoDS_Edge E1,E2,E3; + for(; edgeIt != edges.end(); ++edgeIt) { + TopoDS_Edge E = TopoDS::Edge(*edgeIt); + TopoDS_Vertex VF, VL; + TopExp::Vertices(E, VF, VL, true); + if( VF.IsSame(V) ) + E1 = E; + else if( VL.IsSame(V) ) + E3 = E; + else + E2 = E; + } + quad->side.reserve(4); + quad->side.push_back( new StdMeshers_FaceSide(F, E1, &aMesh, true, ignoreMediumNodes)); + quad->side.push_back( new StdMeshers_FaceSide(F, E2, &aMesh, true, ignoreMediumNodes)); + quad->side.push_back( new StdMeshers_FaceSide(F, E3, &aMesh, false, ignoreMediumNodes)); + std::vector UVPSleft = quad->side[0]->GetUVPtStruct(true,0); + std::vector UVPStop = quad->side[1]->GetUVPtStruct(false,1); + std::vector UVPSright = quad->side[2]->GetUVPtStruct(true,1); + const SMDS_MeshNode* aNode = UVPSleft[0].node; + gp_Pnt2d aPnt2d( UVPSleft[0].u, UVPSleft[0].v ); + StdMeshers_FaceSide* VertFS = + new StdMeshers_FaceSide(aNode, aPnt2d, quad->side[1]); + quad->side.push_back(VertFS); + return quad; } } return 0; @@ -900,10 +900,10 @@ FaceQuadStruct* StdMeshers_Quadrangle_2D::CheckNbEdges(SMESH_Mesh & aMes //============================================================================= bool StdMeshers_Quadrangle_2D::CheckNbEdgesForEvaluate(SMESH_Mesh& aMesh, - const TopoDS_Shape & aShape, - MapShapeNbElems& aResMap, - std::vector& aNbNodes, - bool& IsQuadratic) + const TopoDS_Shape & aShape, + MapShapeNbElems& aResMap, + std::vector& aNbNodes, + bool& IsQuadratic) { const TopoDS_Face & F = TopoDS::Face(aShape); @@ -933,45 +933,45 @@ bool StdMeshers_Quadrangle_2D::CheckNbEdgesForEvaluate(SMESH_Mesh& aMesh, SMESHDS_Mesh* meshDS = aMesh.GetMeshDS(); TopoDS_Vertex V = TopoDS::Vertex(meshDS->IndexToShape(myTriaVertexID)); if(!V.IsNull()) { - TopoDS_Edge E1,E2,E3; - for(; edgeIt != edges.end(); ++edgeIt) { - TopoDS_Edge E = TopoDS::Edge(*edgeIt); - TopoDS_Vertex VF, VL; - TopExp::Vertices(E, VF, VL, true); - if( VF.IsSame(V) ) - E1 = E; - else if( VL.IsSame(V) ) - E3 = E; - else - E2 = E; - } - SMESH_subMesh * sm = aMesh.GetSubMesh(E1); - MapShapeNbElemsItr anIt = aResMap.find(sm); - if(anIt==aResMap.end()) return false; - std::vector aVec = (*anIt).second; - if(IsQuadratic) - aNbNodes[0] = (aVec[SMDSEntity_Node]-1)/2 + 2; - else - aNbNodes[0] = aVec[SMDSEntity_Node] + 2; - sm = aMesh.GetSubMesh(E2); - anIt = aResMap.find(sm); - if(anIt==aResMap.end()) return false; - aVec = (*anIt).second; - if(IsQuadratic) - aNbNodes[1] = (aVec[SMDSEntity_Node]-1)/2 + 2; - else - aNbNodes[1] = aVec[SMDSEntity_Node] + 2; - sm = aMesh.GetSubMesh(E3); - anIt = aResMap.find(sm); - if(anIt==aResMap.end()) return false; - aVec = (*anIt).second; - if(IsQuadratic) - aNbNodes[2] = (aVec[SMDSEntity_Node]-1)/2 + 2; - else - aNbNodes[2] = aVec[SMDSEntity_Node] + 2; - aNbNodes[3] = aNbNodes[1]; - aNbNodes.resize(5); - nbSides = 4; + TopoDS_Edge E1,E2,E3; + for(; edgeIt != edges.end(); ++edgeIt) { + TopoDS_Edge E = TopoDS::Edge(*edgeIt); + TopoDS_Vertex VF, VL; + TopExp::Vertices(E, VF, VL, true); + if( VF.IsSame(V) ) + E1 = E; + else if( VL.IsSame(V) ) + E3 = E; + else + E2 = E; + } + SMESH_subMesh * sm = aMesh.GetSubMesh(E1); + MapShapeNbElemsItr anIt = aResMap.find(sm); + if(anIt==aResMap.end()) return false; + std::vector aVec = (*anIt).second; + if(IsQuadratic) + aNbNodes[0] = (aVec[SMDSEntity_Node]-1)/2 + 2; + else + aNbNodes[0] = aVec[SMDSEntity_Node] + 2; + sm = aMesh.GetSubMesh(E2); + anIt = aResMap.find(sm); + if(anIt==aResMap.end()) return false; + aVec = (*anIt).second; + if(IsQuadratic) + aNbNodes[1] = (aVec[SMDSEntity_Node]-1)/2 + 2; + else + aNbNodes[1] = aVec[SMDSEntity_Node] + 2; + sm = aMesh.GetSubMesh(E3); + anIt = aResMap.find(sm); + if(anIt==aResMap.end()) return false; + aVec = (*anIt).second; + if(IsQuadratic) + aNbNodes[2] = (aVec[SMDSEntity_Node]-1)/2 + 2; + else + aNbNodes[2] = aVec[SMDSEntity_Node] + 2; + aNbNodes[3] = aNbNodes[1]; + aNbNodes.resize(5); + nbSides = 4; } } } @@ -980,13 +980,13 @@ bool StdMeshers_Quadrangle_2D::CheckNbEdgesForEvaluate(SMESH_Mesh& aMesh, SMESH_subMesh * sm = aMesh.GetSubMesh( *edgeIt ); MapShapeNbElemsItr anIt = aResMap.find(sm); if(anIt==aResMap.end()) { - return false; + return false; } std::vector aVec = (*anIt).second; if(IsQuadratic) - aNbNodes[nbSides] = (aVec[SMDSEntity_Node]-1)/2 + 2; + aNbNodes[nbSides] = (aVec[SMDSEntity_Node]-1)/2 + 2; else - aNbNodes[nbSides] = aVec[SMDSEntity_Node] + 2; + aNbNodes[nbSides] = aVec[SMDSEntity_Node] + 2; nbSides++; } } @@ -1012,16 +1012,16 @@ bool StdMeshers_Quadrangle_2D::CheckNbEdgesForEvaluate(SMESH_Mesh& aMesh, list::iterator ite = sideEdges.begin(); aNbNodes[nbSides] = 1; for(; ite!=sideEdges.end(); ite++) { - SMESH_subMesh * sm = aMesh.GetSubMesh( *ite ); - MapShapeNbElemsItr anIt = aResMap.find(sm); - if(anIt==aResMap.end()) { - return false; - } - std::vector aVec = (*anIt).second; - if(IsQuadratic) - aNbNodes[nbSides] += (aVec[SMDSEntity_Node]-1)/2 + 1; - else - aNbNodes[nbSides] += aVec[SMDSEntity_Node] + 1; + SMESH_subMesh * sm = aMesh.GetSubMesh( *ite ); + MapShapeNbElemsItr anIt = aResMap.find(sm); + if(anIt==aResMap.end()) { + return false; + } + std::vector aVec = (*anIt).second; + if(IsQuadratic) + aNbNodes[nbSides] += (aVec[SMDSEntity_Node]-1)/2 + 1; + else + aNbNodes[nbSides] += aVec[SMDSEntity_Node] + 1; } ++nbSides; } @@ -1050,20 +1050,20 @@ bool StdMeshers_Quadrangle_2D::CheckNbEdgesForEvaluate(SMESH_Mesh& aMesh, sideEdges.splice( sideEdges.begin(), edges, --edges.end()); } } - list::iterator ite = sideEdges.begin(); - aNbNodes[nbSides] = 1; - for(; ite!=sideEdges.end(); ite++) { - SMESH_subMesh * sm = aMesh.GetSubMesh( *ite ); - MapShapeNbElemsItr anIt = aResMap.find(sm); - if(anIt==aResMap.end()) { - return false; - } - std::vector aVec = (*anIt).second; - if(IsQuadratic) - aNbNodes[nbSides] += (aVec[SMDSEntity_Node]-1)/2 + 1; - else - aNbNodes[nbSides] += aVec[SMDSEntity_Node] + 1; - } + list::iterator ite = sideEdges.begin(); + aNbNodes[nbSides] = 1; + for(; ite!=sideEdges.end(); ite++) { + SMESH_subMesh * sm = aMesh.GetSubMesh( *ite ); + MapShapeNbElemsItr anIt = aResMap.find(sm); + if(anIt==aResMap.end()) { + return false; + } + std::vector aVec = (*anIt).second; + if(IsQuadratic) + aNbNodes[nbSides] += (aVec[SMDSEntity_Node]-1)/2 + 1; + else + aNbNodes[nbSides] += aVec[SMDSEntity_Node] + 1; + } ++nbSides; } } @@ -1221,11 +1221,11 @@ bool StdMeshers_Quadrangle_2D::SetNormalizedGrid (SMESH_Mesh & aMesh, for (int j = 0; j < nbvertic; j++) { int ij = j * nbhoriz + i; // --- droite i cste : x = x0 + y(x1-x0) - double x0 = uv_e0[i].normParam; // bas - sud - double x1 = uv_e2[i].normParam; // haut - nord + double x0 = uv_e0[i].normParam; // bas - sud + double x1 = uv_e2[i].normParam; // haut - nord // --- droite j cste : y = y0 + x(y1-y0) - double y0 = uv_e3[j].normParam; // gauche-ouest - double y1 = uv_e1[j].normParam; // droite - est + double y0 = uv_e3[j].normParam; // gauche-ouest + double y1 = uv_e1[j].normParam; // droite - est // --- intersection : x=x0+(y0+x(y1-y0))(x1-x0) double x = (x0 + y0 * (x1 - x0)) / (1 - (y1 - y0) * (x1 - x0)); double y = y0 + x * (y1 - y0); @@ -1754,7 +1754,7 @@ bool StdMeshers_Quadrangle_2D::ComputeQuadPref (SMESH_Mesh & aMesh, int nbf=0; for(j=1; jAddFace(NodesBRD.Value(i,j), NodesBRD.Value(i+1,j), @@ -1867,7 +1867,7 @@ bool StdMeshers_Quadrangle_2D::ComputeQuadPref (SMESH_Mesh & aMesh, // create faces for(j=1; j<=drl+addv; j++) { for(i=1; iAddFace(NodesC.Value(i,j), NodesC.Value(i+1,j), @@ -1901,7 +1901,7 @@ bool StdMeshers_Quadrangle_2D::ComputeQuadPref (SMESH_Mesh & aMesh, NodesLast.SetValue(nnn,1,NodesC.Value(nb,i)); } for(i=1; iAddFace(NodesLast.Value(i,1), NodesLast.Value(i+1,1), @@ -1933,8 +1933,8 @@ bool StdMeshers_Quadrangle_2D::ComputeQuadPref (SMESH_Mesh & aMesh, bool StdMeshers_Quadrangle_2D::EvaluateQuadPref(SMESH_Mesh & aMesh, const TopoDS_Shape& aShape, std::vector& aNbNodes, - MapShapeNbElems& aResMap, - bool IsQuadratic) + MapShapeNbElems& aResMap, + bool IsQuadratic) { // Auxilary key in order to keep old variant // of meshing after implementation new variant diff --git a/src/StdMeshers/StdMeshers_RadialQuadrangle_1D2D.cxx b/src/StdMeshers/StdMeshers_RadialQuadrangle_1D2D.cxx index 95423e861..8d21195db 100644 --- a/src/StdMeshers/StdMeshers_RadialQuadrangle_1D2D.cxx +++ b/src/StdMeshers/StdMeshers_RadialQuadrangle_1D2D.cxx @@ -45,23 +45,15 @@ #include #include -//#include #include -#include -#include -//#include -//#include -//#include -//#include -//#include - - -#include +#include #include #include +#include #include #include -#include +#include +#include using namespace std; @@ -148,13 +140,167 @@ bool StdMeshers_RadialQuadrangle_1D2D::CheckHypothesis return true; } +namespace +{ + // ------------------------------------------------------------------------------ + /*! + * \brief Listener used to mark edges meshed by StdMeshers_RadialQuadrangle_1D2D + */ + class TLinEdgeMarker : public SMESH_subMeshEventListener + { + TLinEdgeMarker(): SMESH_subMeshEventListener(/*isDeletable=*/false) {} + public: + static SMESH_subMeshEventListener* getListener() + { + static TLinEdgeMarker theEdgeMarker; + return &theEdgeMarker; + } + }; + + // ------------------------------------------------------------------------------ + /*! + * \brief Mark an edge as computed by StdMeshers_RadialQuadrangle_1D2D + */ + void markLinEdgeAsComputedByMe(const TopoDS_Edge& edge, SMESH_subMesh* faceSubMesh) + { + if ( SMESH_subMesh* edgeSM = faceSubMesh->GetFather()->GetSubMeshContaining( edge )) + { + if ( !edgeSM->GetEventListenerData( TLinEdgeMarker::getListener() )) + faceSubMesh->SetEventListener( TLinEdgeMarker::getListener(), + SMESH_subMeshEventListenerData::MakeData(faceSubMesh), + edgeSM); + } + } + // ------------------------------------------------------------------------------ + /*! + * \brief Return true if a radial edge was meshed with StdMeshers_RadialQuadrangle_1D2D with + * the same radial distribution + */ + bool isEdgeCompitaballyMeshed(const TopoDS_Edge& edge, SMESH_subMesh* faceSubMesh) + { + if ( SMESH_subMesh* edgeSM = faceSubMesh->GetFather()->GetSubMeshContaining( edge )) + { + if ( SMESH_subMeshEventListenerData* otherFaceData = + edgeSM->GetEventListenerData( TLinEdgeMarker::getListener() )) + { + // compare hypothesis aplied to two disk faces sharing radial edges + SMESH_Mesh& mesh = *faceSubMesh->GetFather(); + SMESH_Algo* radialQuadAlgo = mesh.GetGen()->GetAlgo(mesh, faceSubMesh->GetSubShape() ); + SMESH_subMesh* otherFaceSubMesh = otherFaceData->mySubMeshes.front(); + const list & hyps1 = + radialQuadAlgo->GetUsedHypothesis( mesh, faceSubMesh->GetSubShape()); + const list & hyps2 = + radialQuadAlgo->GetUsedHypothesis( mesh, otherFaceSubMesh->GetSubShape()); + if( hyps1.empty() && hyps2.empty() ) + return true; // defaul hyps + if ( hyps1.size() != hyps2.size() || + strcmp( hyps1.front()->GetName(), hyps2.front()->GetName() )) + return false; + ostringstream hypDump1, hypDump2; + list ::const_iterator hyp1 = hyps1.begin(); + for ( ; hyp1 != hyps1.end(); ++hyp1 ) + const_cast(*hyp1)->SaveTo( hypDump1 ); + list ::const_iterator hyp2 = hyps2.begin(); + for ( ; hyp2 != hyps2.end(); ++hyp2 ) + const_cast(*hyp2)->SaveTo( hypDump2 ); + return hypDump1.str() == hypDump2.str(); + } + } + return false; + } + + //================================================================================ + /*! + * \brief Return base curve of the edge and extremum parameters + */ + //================================================================================ + + Handle(Geom_Curve) getCurve(const TopoDS_Edge& edge, double* f=0, double* l=0) + { + Handle(Geom_Curve) C; + if ( !edge.IsNull() ) + { + double first = 0., last = 0.; + C = BRep_Tool::Curve(edge, first, last); + if ( !C.IsNull() ) + { + Handle(Geom_TrimmedCurve) tc = Handle(Geom_TrimmedCurve)::DownCast(C); + while( !tc.IsNull() ) { + C = tc->BasisCurve(); + tc = Handle(Geom_TrimmedCurve)::DownCast(C); + } + if ( f ) *f = first; + if ( l ) *l = last; + } + } + return C; + } + + //================================================================================ + /*! + * \brief Return edges of the face + * \retval int - nb of edges + */ + //================================================================================ + + int analyseFace(const TopoDS_Shape& face, + TopoDS_Edge& CircEdge, + TopoDS_Edge& LinEdge1, + TopoDS_Edge& LinEdge2) + { + CircEdge.Nullify(); LinEdge1.Nullify(); LinEdge2.Nullify(); + int nbe = 0; + + for ( TopExp_Explorer exp( face, TopAbs_EDGE ); exp.More(); exp.Next(), ++nbe ) + { + const TopoDS_Edge& E = TopoDS::Edge( exp.Current() ); + double f,l; + Handle(Geom_Curve) C = getCurve(E,&f,&l); + if ( !C.IsNull() ) + { + if ( C->IsKind( STANDARD_TYPE(Geom_Circle))) + { + if ( CircEdge.IsNull() ) + CircEdge = E; + else + return 0; + } + else if ( LinEdge1.IsNull() ) + LinEdge1 = E; + else + LinEdge2 = E; + } + } + return nbe; + } +} + +//======================================================================= +/*! + * \brief Allow algo to do something after persistent restoration + * \param subMesh - restored submesh + * + * call markLinEdgeAsComputedByMe() + */ +//======================================================================= + +void StdMeshers_RadialQuadrangle_1D2D::SubmeshRestored(SMESH_subMesh* faceSubMesh) +{ + if ( !faceSubMesh->IsEmpty() ) + { + TopoDS_Edge CircEdge, LinEdge1, LinEdge2; + analyseFace( faceSubMesh->GetSubShape(), CircEdge, LinEdge1, LinEdge2 ); + if ( !LinEdge1.IsNull() ) markLinEdgeAsComputedByMe( LinEdge1, faceSubMesh ); + if ( !LinEdge2.IsNull() ) markLinEdgeAsComputedByMe( LinEdge2, faceSubMesh ); + } +} //======================================================================= //function : Compute //purpose : //======================================================================= -bool StdMeshers_RadialQuadrangle_1D2D::Compute(SMESH_Mesh& aMesh, +bool StdMeshers_RadialQuadrangle_1D2D::Compute(SMESH_Mesh& aMesh, const TopoDS_Shape& aShape) { TopExp_Explorer exp; @@ -162,33 +308,16 @@ bool StdMeshers_RadialQuadrangle_1D2D::Compute(SMESH_Mesh& aMesh, myHelper = new SMESH_MesherHelper( aMesh ); myHelper->IsQuadraticSubMesh( aShape ); + // to delete helper at exit from Compute() + auto_ptr helperDeleter( myHelper ); myLayerPositions.clear(); - TopoDS_Edge E1,E2,E3; - Handle(Geom_Curve) C1,C2,C3; - double f1,l1,f2,l2,f3,l3; - int nbe = 0; - for ( exp.Init( aShape, TopAbs_EDGE ); exp.More(); exp.Next() ) { - nbe++; - TopoDS_Edge E = TopoDS::Edge( exp.Current() ); - if(nbe==1) { - E1 = E; - C1 = BRep_Tool::Curve(E,f1,l1); - } - else if(nbe==2) { - E2 = E; - C2 = BRep_Tool::Curve(E,f2,l2); - } - else if(nbe==3) { - E3 = E; - C3 = BRep_Tool::Curve(E,f3,l3); - } - } - - if(nbe>3) + TopoDS_Edge CircEdge, LinEdge1, LinEdge2; + int nbe = analyseFace( aShape, CircEdge, LinEdge1, LinEdge2 ); + if( nbe>3 || nbe < 1 || CircEdge.IsNull() ) return error(COMPERR_BAD_SHAPE); - + gp_Pnt P0,P1; // points for rotation TColgp_SequenceOfPnt Points; @@ -196,42 +325,40 @@ bool StdMeshers_RadialQuadrangle_1D2D::Compute(SMESH_Mesh& aMesh, TColStd_SequenceOfReal Angles; // Nodes1 and Nodes2 - nodes along radiuses // CNodes - nodes on circle edge - std::vector< const SMDS_MeshNode* > Nodes1, Nodes2, CNodes; + vector< const SMDS_MeshNode* > Nodes1, Nodes2, CNodes; SMDS_MeshNode * NC; // parameters edge nodes on face - TColgp_SequenceOfPnt2d Pnts2d1, Pnts2d2; + TColgp_SequenceOfPnt2d Pnts2d1; gp_Pnt2d PC; int faceID = meshDS->ShapeToIndex(aShape); TopoDS_Face F = TopoDS::Face(aShape); Handle(Geom_Surface) S = BRep_Tool::Surface(F); - //cout<<"RadialQuadrangle_1D2D::Compute nbe = "<Compute( aMesh, CircEdge, false, MeshDim_1D ); + bool ok = _gen->Compute( aMesh, CircEdge ); + if( !ok ) return false; + map< double, const SMDS_MeshNode* > theNodes; + ok = GetSortedNodesOnEdge(aMesh.GetMeshDS(),CircEdge,true,theNodes); if( !ok ) return false; - std::map< double, const SMDS_MeshNode* > theNodes; - GetSortedNodesOnEdge(aMesh.GetMeshDS(),CircEdge,true,theNodes); CNodes.clear(); - std::map< double, const SMDS_MeshNode* >::iterator itn = theNodes.begin(); + map< double, const SMDS_MeshNode* >::iterator itn = theNodes.begin(); const SMDS_MeshNode* NF = (*itn).second; CNodes.push_back( (*itn).second ); double fang = (*itn).first; - itn++; - for(; itn != theNodes.end(); itn++ ) { - CNodes.push_back( (*itn).second ); - double ang = (*itn).first - fang; - if( ang>PI ) ang = ang - 2*PI; - if( ang<-PI ) ang = ang + 2*PI; - Angles.Append( ang ); + if ( itn != theNodes.end() ) { + itn++; + for(; itn != theNodes.end(); itn++ ) { + CNodes.push_back( (*itn).second ); + double ang = (*itn).first - fang; + if( ang>PI ) ang = ang - 2*PI; + if( ang<-PI ) ang = ang + 2*PI; + Angles.Append( ang ); + } } P1 = gp_Pnt( NF->X(), NF->Y(), NF->Z() ); P0 = aCirc->Location(); @@ -267,88 +394,53 @@ bool StdMeshers_RadialQuadrangle_1D2D::Compute(SMESH_Mesh& aMesh, double V = PC.Y() + aVec2d.Y()*myLayerPositions[i]; meshDS->SetNodeOnFace( node, faceID, U, V ); Pnts2d1.Append(gp_Pnt2d(U,V)); - Pnts2d2.Append(gp_Pnt2d(U,V)); } Nodes1[Nodes1.size()-1] = NF; Nodes2[Nodes1.size()-1] = NF; } - else if(nbe==2) { + else if(nbe==2 && LinEdge1.Orientation() != TopAbs_INTERNAL ) + { // one curve must be a half of circle and other curve must be // a segment of line - Handle(Geom_TrimmedCurve) tc = Handle(Geom_TrimmedCurve)::DownCast(C1); - while( !tc.IsNull() ) { - C1 = tc->BasisCurve(); - tc = Handle(Geom_TrimmedCurve)::DownCast(C1); - } - tc = Handle(Geom_TrimmedCurve)::DownCast(C2); - while( !tc.IsNull() ) { - C2 = tc->BasisCurve(); - tc = Handle(Geom_TrimmedCurve)::DownCast(C2); - } - - Handle(Geom_Circle) aCirc = Handle(Geom_Circle)::DownCast(C1); - Handle(Geom_Line) aLine = Handle(Geom_Line)::DownCast(C2); - CircEdge = E1; - LinEdge1 = E2; - double fp = f1; - double lp = l1; - if( aCirc.IsNull() ) { - aCirc = Handle(Geom_Circle)::DownCast(C2); - CircEdge = E2; - LinEdge1 = E1; - fp = f2; - lp = l2; - aLine = Handle(Geom_Line)::DownCast(C3); - } - if( aCirc.IsNull() ) { - // not circle - return error(COMPERR_BAD_SHAPE); - } + double fp, lp; + Handle(Geom_Circle) aCirc = Handle(Geom_Circle)::DownCast( getCurve( CircEdge, &fp, &lp )); if( fabs(fabs(lp-fp)-PI) > Precision::Confusion() ) { // not half of circle return error(COMPERR_BAD_SHAPE); } + Handle(Geom_Line) aLine = Handle(Geom_Line)::DownCast( getCurve( LinEdge1 )); if( aLine.IsNull() ) { // other curve not line return error(COMPERR_BAD_SHAPE); } - SMESH_subMesh* sm1 = aMesh.GetSubMesh(LinEdge1); - if( sm1 ) { - SMESHDS_SubMesh* sdssm1 = sm1->GetSubMeshDS(); - if( sdssm1 ) { - if( sm1->GetSubMeshDS()->NbNodes()>0 ) { - SMESH_subMesh* sm = aMesh.GetSubMesh(F); - SMESH_ComputeErrorPtr& smError = sm->GetComputeError(); - smError.reset(new SMESH_ComputeError(COMPERR_ALGO_FAILED, - "Invalid set of hypothesises",this)); - return false; - } - } + bool linEdgeComputed = false; + if( SMESH_subMesh* sm1 = aMesh.GetSubMesh(LinEdge1) ) { + if( !sm1->IsEmpty() ) + if( isEdgeCompitaballyMeshed( LinEdge1, aMesh.GetSubMesh(F) )) + linEdgeComputed = true; + else + return error("Invalid set of hypotheses"); } - bool ok = _gen->Compute( aMesh, CircEdge, false, MeshDim_1D ); + bool ok = _gen->Compute( aMesh, CircEdge ); if( !ok ) return false; - std::map< double, const SMDS_MeshNode* > theNodes; + map< double, const SMDS_MeshNode* > theNodes; GetSortedNodesOnEdge(aMesh.GetMeshDS(),CircEdge,true,theNodes); CNodes.clear(); - std::map< double, const SMDS_MeshNode* >::iterator itn = theNodes.begin(); - const SMDS_MeshNode* NF = (*itn).second; - CNodes.push_back( (*itn).second ); + map< double, const SMDS_MeshNode* >::iterator itn = theNodes.begin(); double fang = (*itn).first; itn++; - const SMDS_MeshNode* NL; - int nbn = 1; for(; itn != theNodes.end(); itn++ ) { - nbn++; - if( nbn == theNodes.size() ) - NL = (*itn).second; CNodes.push_back( (*itn).second ); double ang = (*itn).first - fang; if( ang>PI ) ang = ang - 2*PI; if( ang<-PI ) ang = ang + 2*PI; Angles.Append( ang ); } + const SMDS_MeshNode* NF = theNodes.begin()->second; + const SMDS_MeshNode* NL = theNodes.rbegin()->second; + CNodes.push_back( NF ); P1 = gp_Pnt( NF->X(), NF->Y(), NF->Z() ); gp_Pnt P2( NL->X(), NL->Y(), NL->Z() ); P0 = aCirc->Location(); @@ -356,164 +448,143 @@ bool StdMeshers_RadialQuadrangle_1D2D::Compute(SMESH_Mesh& aMesh, myLayerPositions.clear(); computeLayerPositions(P0,P1); - gp_Vec aVec(P0,P1); - int edgeID = meshDS->ShapeToIndex(LinEdge1); - // check orientation - Handle(Geom_Curve) Crv = BRep_Tool::Curve(LinEdge1,fp,lp); - gp_Pnt Ptmp; - Crv->D0(fp,Ptmp); - bool ori = true; - if( P1.Distance(Ptmp) > Precision::Confusion() ) - ori = false; - // get UV points for edge - gp_Pnt2d PF,PL; - BRep_Tool::UVPoints( LinEdge1, TopoDS::Face(aShape), PF, PL ); - PC = gp_Pnt2d( (PF.X()+PL.X())/2, (PF.Y()+PL.Y())/2 ); - gp_Vec2d V2d; - if(ori) V2d = gp_Vec2d(PC,PF); - else V2d = gp_Vec2d(PC,PL); - // add nodes on edge - double cp = (fp+lp)/2; - double dp2 = (lp-fp)/2; - NC = meshDS->AddNode(P0.X(), P0.Y(), P0.Z()); - meshDS->SetNodeOnEdge(NC, edgeID, cp); - Nodes1.resize( myLayerPositions.size()+1 ); - Nodes2.resize( myLayerPositions.size()+1 ); - int i = 0; - for(; iAddNode(P.X(), P.Y(), P.Z()); - Nodes1[i] = node; - double param; - if(ori) - param = fp + dp2*(1-myLayerPositions[i]); - else - param = cp + dp2*myLayerPositions[i]; - meshDS->SetNodeOnEdge(node, edgeID, param); - P = gp_Pnt( P0.X() - aVec.X()*myLayerPositions[i], - P0.Y() - aVec.Y()*myLayerPositions[i], - P0.Z() - aVec.Z()*myLayerPositions[i] ); - node = meshDS->AddNode(P.X(), P.Y(), P.Z()); - Nodes2[i] = node; - if(!ori) - param = fp + dp2*(1-myLayerPositions[i]); - else - param = cp + dp2*myLayerPositions[i]; - meshDS->SetNodeOnEdge(node, edgeID, param); - // parameters on face - gp_Pnt2d P2d( PC.X() + V2d.X()*myLayerPositions[i], - PC.Y() + V2d.Y()*myLayerPositions[i] ); - Pnts2d1.Append(P2d); - P2d = gp_Pnt2d( PC.X() - V2d.X()*myLayerPositions[i], - PC.Y() - V2d.Y()*myLayerPositions[i] ); - Pnts2d2.Append(P2d); + if ( linEdgeComputed ) + { + if (!GetSortedNodesOnEdge(aMesh.GetMeshDS(),LinEdge1,true,theNodes)) + return error("Invalid mesh on a straight edge"); + + vector< const SMDS_MeshNode* > *pNodes1 = &Nodes1, *pNodes2 = &Nodes2; + bool nodesFromP0ToP1 = ( theNodes.rbegin()->second == NF ); + if ( !nodesFromP0ToP1 ) std::swap( pNodes1, pNodes2 ); + + map< double, const SMDS_MeshNode* >::reverse_iterator ritn = theNodes.rbegin(); + itn = theNodes.begin(); + for ( int i = Nodes1.size()-1; i > -1; ++itn, ++ritn, --i ) + { + (*pNodes1)[i] = ritn->second; + (*pNodes2)[i] = itn->second; + Points.Append( gpXYZ( Nodes1[i])); + Pnts2d1.Append( myHelper->GetNodeUV( F, Nodes1[i])); + } + NC = const_cast( itn->second ); + Points.Remove( Nodes1.size() ); } - Nodes1[ myLayerPositions.size() ] = NF; - Nodes2[ myLayerPositions.size() ] = NL; - // create 1D elements on edge - std::vector< const SMDS_MeshNode* > tmpNodes; - tmpNodes.resize(2*Nodes1.size()+1); - for(i=0; iAddEdge( tmpNodes[i-1], tmpNodes[i] ); - if(ME) meshDS->SetMeshElementOnShape(ME, edgeID); + else + { + gp_Vec aVec(P0,P1); + int edgeID = meshDS->ShapeToIndex(LinEdge1); + // check orientation + Handle(Geom_Curve) Crv = BRep_Tool::Curve(LinEdge1,fp,lp); + gp_Pnt Ptmp; + Crv->D0(fp,Ptmp); + bool ori = true; + if( P1.Distance(Ptmp) > Precision::Confusion() ) + ori = false; + // get UV points for edge + gp_Pnt2d PF,PL; + BRep_Tool::UVPoints( LinEdge1, TopoDS::Face(aShape), PF, PL ); + PC = gp_Pnt2d( (PF.X()+PL.X())/2, (PF.Y()+PL.Y())/2 ); + gp_Vec2d V2d; + if(ori) V2d = gp_Vec2d(PC,PF); + else V2d = gp_Vec2d(PC,PL); + // add nodes on edge + double cp = (fp+lp)/2; + double dp2 = (lp-fp)/2; + NC = meshDS->AddNode(P0.X(), P0.Y(), P0.Z()); + meshDS->SetNodeOnEdge(NC, edgeID, cp); + Nodes1.resize( myLayerPositions.size()+1 ); + Nodes2.resize( myLayerPositions.size()+1 ); + int i = 0; + for(; iAddNode(P.X(), P.Y(), P.Z()); + Nodes1[i] = node; + double param; + if(ori) + param = fp + dp2*(1-myLayerPositions[i]); + else + param = cp + dp2*myLayerPositions[i]; + meshDS->SetNodeOnEdge(node, edgeID, param); + P = gp_Pnt( P0.X() - aVec.X()*myLayerPositions[i], + P0.Y() - aVec.Y()*myLayerPositions[i], + P0.Z() - aVec.Z()*myLayerPositions[i] ); + node = meshDS->AddNode(P.X(), P.Y(), P.Z()); + Nodes2[i] = node; + if(!ori) + param = fp + dp2*(1-myLayerPositions[i]); + else + param = cp + dp2*myLayerPositions[i]; + meshDS->SetNodeOnEdge(node, edgeID, param); + // parameters on face + gp_Pnt2d P2d( PC.X() + V2d.X()*myLayerPositions[i], + PC.Y() + V2d.Y()*myLayerPositions[i] ); + Pnts2d1.Append(P2d); + } + Nodes1[ myLayerPositions.size() ] = NF; + Nodes2[ myLayerPositions.size() ] = NL; + // create 1D elements on edge + vector< const SMDS_MeshNode* > tmpNodes; + tmpNodes.resize(2*Nodes1.size()+1); + for(i=0; iAddEdge( tmpNodes[i-1], tmpNodes[i] ); + if(ME) meshDS->SetMeshElementOnShape(ME, edgeID); + } + markLinEdgeAsComputedByMe( LinEdge1, aMesh.GetSubMesh( F )); } } - else { // nbe==3 + else // nbe==3 or ( nbe==2 && linEdge is INTERNAL ) + { + if (nbe==2 && LinEdge1.Orientation() == TopAbs_INTERNAL ) + LinEdge2 = LinEdge1; + // one curve must be a part of circle and other curves must be // segments of line - Handle(Geom_TrimmedCurve) tc = Handle(Geom_TrimmedCurve)::DownCast(C1); - while( !tc.IsNull() ) { - C1 = tc->BasisCurve(); - tc = Handle(Geom_TrimmedCurve)::DownCast(C1); - } - tc = Handle(Geom_TrimmedCurve)::DownCast(C2); - while( !tc.IsNull() ) { - C2 = tc->BasisCurve(); - tc = Handle(Geom_TrimmedCurve)::DownCast(C2); - } - tc = Handle(Geom_TrimmedCurve)::DownCast(C3); - while( !tc.IsNull() ) { - C3 = tc->BasisCurve(); - tc = Handle(Geom_TrimmedCurve)::DownCast(C3); - } - - Handle(Geom_Circle) aCirc = Handle(Geom_Circle)::DownCast(C1); - Handle(Geom_Line) aLine1 = Handle(Geom_Line)::DownCast(C2); - Handle(Geom_Line) aLine2 = Handle(Geom_Line)::DownCast(C3); - CircEdge = E1; - LinEdge1 = E2; - LinEdge2 = E3; - double fp = f1; - double lp = l1; - if( aCirc.IsNull() ) { - aCirc = Handle(Geom_Circle)::DownCast(C2); - CircEdge = E2; - LinEdge1 = E3; - LinEdge2 = E1; - fp = f2; - lp = l2; - aLine1 = Handle(Geom_Line)::DownCast(C3); - aLine2 = Handle(Geom_Line)::DownCast(C1); - if( aCirc.IsNull() ) { - aCirc = Handle(Geom_Circle)::DownCast(C3); - CircEdge = E3; - LinEdge1 = E1; - LinEdge2 = E2; - fp = f3; - lp = l3; - aLine1 = Handle(Geom_Line)::DownCast(C1); - aLine2 = Handle(Geom_Line)::DownCast(C2); - } - } - if( aCirc.IsNull() ) { - // not circle - return error(COMPERR_BAD_SHAPE); - } + double fp, lp; + Handle(Geom_Circle) aCirc = Handle(Geom_Circle)::DownCast( getCurve( CircEdge )); + Handle(Geom_Line) aLine1 = Handle(Geom_Line)::DownCast( getCurve( LinEdge1 )); + Handle(Geom_Line) aLine2 = Handle(Geom_Line)::DownCast( getCurve( LinEdge2 )); if( aLine1.IsNull() || aLine2.IsNull() ) { // other curve not line return error(COMPERR_BAD_SHAPE); } - SMESH_subMesh* sm1 = aMesh.GetSubMesh(LinEdge1); - SMESH_subMesh* sm2 = aMesh.GetSubMesh(LinEdge2); - if( sm1 && sm2 ) { - SMESHDS_SubMesh* sdssm1 = sm1->GetSubMeshDS(); - SMESHDS_SubMesh* sdssm2 = sm2->GetSubMeshDS(); - if( sdssm1 && sdssm2 ) { - if( sm1->GetSubMeshDS()->NbNodes()>0 || sm2->GetSubMeshDS()->NbNodes()>0 ) { - SMESH_subMesh* sm = aMesh.GetSubMesh(F); - SMESH_ComputeErrorPtr& smError = sm->GetComputeError(); - smError.reset(new SMESH_ComputeError(COMPERR_ALGO_FAILED, - "Invalid set of hypothesises",this)); - return false; - } - } - } - bool ok = _gen->Compute( aMesh, CircEdge, false, MeshDim_1D ); + bool linEdge1Computed = false; + if ( SMESH_subMesh* sm1 = aMesh.GetSubMesh(LinEdge1)) + if( !sm1->IsEmpty() ) + if( isEdgeCompitaballyMeshed( LinEdge1, aMesh.GetSubMesh(F) )) + linEdge1Computed = true; + else + return error("Invalid set of hypotheses"); + + bool linEdge2Computed = false; + if ( SMESH_subMesh* sm2 = aMesh.GetSubMesh(LinEdge2)) + if( !sm2->IsEmpty() ) + if( isEdgeCompitaballyMeshed( LinEdge2, aMesh.GetSubMesh(F) )) + linEdge2Computed = true; + else + return error("Invalid set of hypotheses"); + + bool ok = _gen->Compute( aMesh, CircEdge ); if( !ok ) return false; - std::map< double, const SMDS_MeshNode* > theNodes; + map< double, const SMDS_MeshNode* > theNodes; GetSortedNodesOnEdge(aMesh.GetMeshDS(),CircEdge,true,theNodes); + const SMDS_MeshNode* NF = theNodes.begin()->second; + const SMDS_MeshNode* NL = theNodes.rbegin()->second; CNodes.clear(); - std::map< double, const SMDS_MeshNode* >::iterator itn = theNodes.begin(); - const SMDS_MeshNode* NF = (*itn).second; - CNodes.push_back( (*itn).second ); + CNodes.push_back( NF ); + map< double, const SMDS_MeshNode* >::iterator itn = theNodes.begin(); double fang = (*itn).first; itn++; - const SMDS_MeshNode* NL; - int nbn = 1; for(; itn != theNodes.end(); itn++ ) { - nbn++; - if( nbn == theNodes.size() ) - NL = (*itn).second; CNodes.push_back( (*itn).second ); double ang = (*itn).first - fang; if( ang>PI ) ang = ang - 2*PI; @@ -527,6 +598,9 @@ bool StdMeshers_RadialQuadrangle_1D2D::Compute(SMESH_Mesh& aMesh, myLayerPositions.clear(); computeLayerPositions(P0,P1); + Nodes1.resize( myLayerPositions.size()+1 ); + Nodes2.resize( myLayerPositions.size()+1 ); + exp.Init( LinEdge1, TopAbs_VERTEX ); TopoDS_Vertex V1 = TopoDS::Vertex( exp.Current() ); exp.Next(); @@ -534,119 +608,169 @@ bool StdMeshers_RadialQuadrangle_1D2D::Compute(SMESH_Mesh& aMesh, gp_Pnt PE1 = BRep_Tool::Pnt(V1); gp_Pnt PE2 = BRep_Tool::Pnt(V2); if( ( P1.Distance(PE1) > Precision::Confusion() ) && - ( P1.Distance(PE2) > Precision::Confusion() ) ) { - TopoDS_Edge E = LinEdge1; - LinEdge1 = LinEdge2; - LinEdge2 = E; + ( P1.Distance(PE2) > Precision::Confusion() ) ) + { + std::swap( LinEdge1, LinEdge2 ); + std::swap( linEdge1Computed, linEdge2Computed ); } - TopoDS_Vertex VC; + TopoDS_Vertex VC = V2; if( ( P1.Distance(PE1) > Precision::Confusion() ) && - ( P2.Distance(PE1) > Precision::Confusion() ) ) { + ( P2.Distance(PE1) > Precision::Confusion() ) ) VC = V1; - } - else VC = V2; int vertID = meshDS->ShapeToIndex(VC); + // LinEdge1 - int edgeID = meshDS->ShapeToIndex(LinEdge1); - gp_Vec aVec(P0,P1); - // check orientation - Handle(Geom_Curve) Crv = BRep_Tool::Curve(LinEdge1,fp,lp); - gp_Pnt Ptmp; - Crv->D0(fp,Ptmp); - bool ori = false; - if( P1.Distance(Ptmp) > Precision::Confusion() ) - ori = true; - // get UV points for edge - gp_Pnt2d PF,PL; - BRep_Tool::UVPoints( LinEdge1, TopoDS::Face(aShape), PF, PL ); - gp_Vec2d V2d; - if(ori) { - V2d = gp_Vec2d(PF,PL); - PC = PF; - } - else { - V2d = gp_Vec2d(PL,PF); - PC = PL; - } - NC = meshDS->AddNode(P0.X(), P0.Y(), P0.Z()); - meshDS->SetNodeOnVertex(NC, vertID); - double dp = lp-fp; - Nodes1.resize( myLayerPositions.size()+1 ); - int i = 0; - for(; iAddNode(P.X(), P.Y(), P.Z()); - Nodes1[i] = node; - double param; - if(!ori) - param = fp + dp*(1-myLayerPositions[i]); - else - param = fp + dp*myLayerPositions[i]; - meshDS->SetNodeOnEdge(node, edgeID, param); - // parameters on face - gp_Pnt2d P2d( PC.X() + V2d.X()*myLayerPositions[i], - PC.Y() + V2d.Y()*myLayerPositions[i] ); - Pnts2d1.Append(P2d); + if ( linEdge1Computed ) + { + if (!GetSortedNodesOnEdge(aMesh.GetMeshDS(),LinEdge1,true,theNodes)) + return error("Invalid mesh on a straight edge"); + + bool nodesFromP0ToP1 = ( theNodes.rbegin()->second == NF ); + NC = const_cast + ( nodesFromP0ToP1 ? theNodes.begin()->second : theNodes.rbegin()->second ); + int i = 0, ir = Nodes1.size()-1; + int * pi = nodesFromP0ToP1 ? &i : &ir; + itn = theNodes.begin(); + if ( nodesFromP0ToP1 ) ++itn; + for ( ; i < Nodes1.size(); ++i, --ir, ++itn ) + { + Nodes1[*pi] = itn->second; + } + for ( i = 0; i < Nodes1.size()-1; ++i ) + { + Points.Append( gpXYZ( Nodes1[i])); + Pnts2d1.Append( myHelper->GetNodeUV( F, Nodes1[i])); + } } - Nodes1[ myLayerPositions.size() ] = NF; - // create 1D elements on edge - SMDS_MeshEdge* ME = myHelper->AddEdge( NC, Nodes1[0] ); - if(ME) meshDS->SetMeshElementOnShape(ME, edgeID); - for(i=1; iAddEdge( Nodes1[i-1], Nodes1[i] ); + else + { + int edgeID = meshDS->ShapeToIndex(LinEdge1); + gp_Vec aVec(P0,P1); + // check orientation + Handle(Geom_Curve) Crv = BRep_Tool::Curve(LinEdge1,fp,lp); + gp_Pnt Ptmp = Crv->Value(fp); + bool ori = false; + if( P1.Distance(Ptmp) > Precision::Confusion() ) + ori = true; + // get UV points for edge + gp_Pnt2d PF,PL; + BRep_Tool::UVPoints( LinEdge1, TopoDS::Face(aShape), PF, PL ); + gp_Vec2d V2d; + if(ori) { + V2d = gp_Vec2d(PF,PL); + PC = PF; + } + else { + V2d = gp_Vec2d(PL,PF); + PC = PL; + } + NC = const_cast( VertexNode( VC, meshDS )); + if ( !NC ) + { + NC = meshDS->AddNode(P0.X(), P0.Y(), P0.Z()); + meshDS->SetNodeOnVertex(NC, vertID); + } + double dp = lp-fp; + int i = 0; + for(; iAddNode(P.X(), P.Y(), P.Z()); + Nodes1[i] = node; + double param; + if(!ori) + param = fp + dp*(1-myLayerPositions[i]); + else + param = fp + dp*myLayerPositions[i]; + meshDS->SetNodeOnEdge(node, edgeID, param); + // parameters on face + gp_Pnt2d P2d( PC.X() + V2d.X()*myLayerPositions[i], + PC.Y() + V2d.Y()*myLayerPositions[i] ); + Pnts2d1.Append(P2d); + } + Nodes1[ myLayerPositions.size() ] = NF; + // create 1D elements on edge + SMDS_MeshEdge* ME = myHelper->AddEdge( NC, Nodes1[0] ); if(ME) meshDS->SetMeshElementOnShape(ME, edgeID); + for(i=1; iAddEdge( Nodes1[i-1], Nodes1[i] ); + if(ME) meshDS->SetMeshElementOnShape(ME, edgeID); + } + if (nbe==2 && LinEdge1.Orientation() == TopAbs_INTERNAL ) + Nodes2 = Nodes1; } + markLinEdgeAsComputedByMe( LinEdge1, aMesh.GetSubMesh( F )); + // LinEdge2 - edgeID = meshDS->ShapeToIndex(LinEdge1); - aVec = gp_Vec(P0,P2); - // check orientation - Crv = BRep_Tool::Curve(LinEdge2,fp,lp); - Crv->D0(fp,Ptmp); - ori = false; - if( P2.Distance(Ptmp) > Precision::Confusion() ) - ori = true; - // get UV points for edge - BRep_Tool::UVPoints( LinEdge2, TopoDS::Face(aShape), PF, PL ); - if(ori) { - V2d = gp_Vec2d(PF,PL); - PC = PF; - } - else { - V2d = gp_Vec2d(PL,PF); - PC = PL; - } - dp = lp-fp; - Nodes2.resize( myLayerPositions.size()+1 ); - for(i=0; iAddNode(P.X(), P.Y(), P.Z()); - Nodes2[i] = node; - double param; - if(!ori) - param = fp + dp*(1-myLayerPositions[i]); - else - param = fp + dp*myLayerPositions[i]; - meshDS->SetNodeOnEdge(node, edgeID, param); - // parameters on face - gp_Pnt2d P2d( PC.X() + V2d.X()*myLayerPositions[i], - PC.Y() + V2d.Y()*myLayerPositions[i] ); - Pnts2d2.Append(P2d); + if ( linEdge2Computed ) + { + if (!GetSortedNodesOnEdge(aMesh.GetMeshDS(),LinEdge2,true,theNodes)) + return error("Invalid mesh on a straight edge"); + + bool nodesFromP0ToP2 = ( theNodes.rbegin()->second == NL ); + int i = 0, ir = Nodes1.size()-1; + int * pi = nodesFromP0ToP2 ? &i : &ir; + itn = theNodes.begin(); + if ( nodesFromP0ToP2 ) ++itn; + for ( ; i < Nodes2.size(); ++i, --ir, ++itn ) + Nodes2[*pi] = itn->second; } - Nodes2[ myLayerPositions.size() ] = NL; - // create 1D elements on edge - ME = myHelper->AddEdge( NC, Nodes2[0] ); - if(ME) meshDS->SetMeshElementOnShape(ME, edgeID); - for(i=1; iAddEdge( Nodes2[i-1], Nodes2[i] ); + else + { + int edgeID = meshDS->ShapeToIndex(LinEdge2); + gp_Vec aVec = gp_Vec(P0,P2); + // check orientation + Handle(Geom_Curve) Crv = BRep_Tool::Curve(LinEdge2,fp,lp); + gp_Pnt Ptmp = Crv->Value(fp); + bool ori = false; + if( P2.Distance(Ptmp) > Precision::Confusion() ) + ori = true; + // get UV points for edge + gp_Pnt2d PF,PL; + BRep_Tool::UVPoints( LinEdge2, TopoDS::Face(aShape), PF, PL ); + gp_Vec2d V2d; + if(ori) { + V2d = gp_Vec2d(PF,PL); + PC = PF; + } + else { + V2d = gp_Vec2d(PL,PF); + PC = PL; + } + double dp = lp-fp; + for(int i=0; iAddNode(P.X(), P.Y(), P.Z()); + Nodes2[i] = node; + double param; + if(!ori) + param = fp + dp*(1-myLayerPositions[i]); + else + param = fp + dp*myLayerPositions[i]; + meshDS->SetNodeOnEdge(node, edgeID, param); + // parameters on face + gp_Pnt2d P2d( PC.X() + V2d.X()*myLayerPositions[i], + PC.Y() + V2d.Y()*myLayerPositions[i] ); + } + Nodes2[ myLayerPositions.size() ] = NL; + // create 1D elements on edge + SMDS_MeshEdge* ME = myHelper->AddEdge( NC, Nodes2[0] ); if(ME) meshDS->SetMeshElementOnShape(ME, edgeID); + for(int i=1; iAddEdge( Nodes2[i-1], Nodes2[i] ); + if(ME) meshDS->SetMeshElementOnShape(ME, edgeID); + } } + markLinEdgeAsComputedByMe( LinEdge2, aMesh.GetSubMesh( F )); } + // orientation + bool IsForward = ( CircEdge.Orientation()==TopAbs_FORWARD ); + // create nodes and mesh elements on face // find axis of rotation gp_Pnt P2 = gp_Pnt( CNodes[1]->X(), CNodes[1]->Y(), CNodes[1]->Z() ); @@ -658,7 +782,7 @@ bool StdMeshers_RadialQuadrangle_1D2D::Compute(SMESH_Mesh& aMesh, //cout<<"Angles.Length() = "< #include +#include using namespace std; @@ -757,7 +758,7 @@ bool StdMeshers_Regular_1D::computeInternalParameters(SMESH_Mesh & theMesh, double an = _value[ END_LENGTH_IND ]; double q = ( an - a1 ) / ( 2 *theLength/( a1 + an ) - 1 ); - int n = int( 1 + ( an - a1 ) / q ); + int n = int(fabs(q) > numeric_limits::min() ? ( 1+( an-a1 )/q ) : ( 1+theLength/a1 )); double U1 = theReverse ? l : f; double Un = theReverse ? f : l; @@ -1032,7 +1033,7 @@ bool StdMeshers_Regular_1D::Evaluate(SMESH_Mesh & theMesh, if ( _hypType == NONE ) return false; - SMESHDS_Mesh * meshDS = theMesh.GetMeshDS(); + //SMESHDS_Mesh * meshDS = theMesh.GetMeshDS(); const TopoDS_Edge & EE = TopoDS::Edge(theShape); TopoDS_Edge E = TopoDS::Edge(EE.Oriented(TopAbs_FORWARD)); diff --git a/src/StdMeshersGUI/Makefile.am b/src/StdMeshersGUI/Makefile.am index fbc244b0f..e8a194771 100644 --- a/src/StdMeshersGUI/Makefile.am +++ b/src/StdMeshersGUI/Makefile.am @@ -96,8 +96,7 @@ libStdMeshersGUI_la_LDFLAGS = \ ../SMESHGUI/libSMESH.la \ ../OBJECT/libSMESHObject.la \ $(GUI_LDFLAGS) -lSalomeApp \ - $(CAS_LDPATH) -lTKernel -lTKBO -lTKAdvTools \ - $(QWT_LIBS) + $(CAS_LDPATH) -lTKernel -lTKBO -lTKAdvTools # resources files nodist_salomeres_DATA= \ diff --git a/src/StdMeshersGUI/StdMeshersGUI_DistrPreview.cxx b/src/StdMeshersGUI/StdMeshersGUI_DistrPreview.cxx index ead8d1c3d..e26ffd7e1 100644 --- a/src/StdMeshersGUI/StdMeshersGUI_DistrPreview.cxx +++ b/src/StdMeshersGUI/StdMeshersGUI_DistrPreview.cxx @@ -50,6 +50,8 @@ # include #endif +#include + StdMeshersGUI_DistrPreview::StdMeshersGUI_DistrPreview( QWidget* p, StdMeshers::StdMeshers_NumberOfSegments_ptr h ) : QwtPlot( p ), myPoints( 50 ), @@ -60,6 +62,7 @@ StdMeshersGUI_DistrPreview::StdMeshersGUI_DistrPreview( QWidget* p, StdMeshers:: myIsDone( true ), myNbSeg( 1 ) { + Kernel_Utils::Localizer loc; myHypo = StdMeshers::StdMeshers_NumberOfSegments::_duplicate( h ); myVars.ChangeValue( 1 ) = new Expr_NamedUnknown( "t" ); myDensity = new QwtPlotCurve( QString() ); @@ -200,6 +203,7 @@ bool StdMeshersGUI_DistrPreview::createTable( SMESH::double_array& func ) void StdMeshersGUI_DistrPreview::update() { + Kernel_Utils::Localizer loc; SMESH::double_array graph, distr; if( isTableFunc() ) { @@ -343,6 +347,7 @@ bool isCorrectArg( const Handle( Expr_GeneralExpression )& expr ) bool StdMeshersGUI_DistrPreview::init( const QString& str ) { + Kernel_Utils::Localizer loc; bool parsed_ok = true; try { #ifdef NO_CAS_CATCH diff --git a/src/StdMeshersGUI/StdMeshersGUI_FixedPointsParamWdg.cxx b/src/StdMeshersGUI/StdMeshersGUI_FixedPointsParamWdg.cxx index 51685c370..c5c228bc7 100644 --- a/src/StdMeshersGUI/StdMeshersGUI_FixedPointsParamWdg.cxx +++ b/src/StdMeshersGUI/StdMeshersGUI_FixedPointsParamWdg.cxx @@ -25,6 +25,9 @@ // #include "StdMeshersGUI_FixedPointsParamWdg.h" +#include +#include + // Qt includes #include #include @@ -36,7 +39,6 @@ #include #include #include -#include #include #include @@ -44,8 +46,13 @@ #define MARGIN 0 #define SAME_TEXT "-/-" +#define TOLERANCE 1e-7 +#define EQUAL_DBL(a,b) (fabs(a-b)b)&&!EQUAL_DBL(a,b)) + /* - * function : Tree Widget Item Delegate + * class : Tree Widget Item Delegate * purpose : Custom item delegate */ @@ -74,7 +81,7 @@ QWidget* StdMeshersGUI_FixedPointsParamWdg::LineDelegate::createEditor( QWidget* { QWidget* w = 0; if ( (index.column() == 1 ) ) { - QSpinBox* sb = new QSpinBox( parent ); + QtxIntSpinBox* sb = new QtxIntSpinBox( parent ); sb->setFrame( false ); sb->setRange( 1, 999); w = sb; @@ -87,8 +94,8 @@ void StdMeshersGUI_FixedPointsParamWdg::LineDelegate::setModelData( QWidget* edi QAbstractItemModel* model, const QModelIndex& index ) const { - model->setData( index, qobject_cast( editor )->value(), Qt::EditRole ); - model->setData( index, qobject_cast( editor )->value(), Qt::UserRole ); + model->setData( index, qobject_cast( editor )->value(), Qt::EditRole ); + model->setData( index, qobject_cast( editor )->value(), Qt::UserRole ); } //================================================================================ @@ -107,7 +114,7 @@ StdMeshersGUI_FixedPointsParamWdg myListWidget = new QListWidget( this ); myTreeWidget = new QTreeWidget( this ); - mySpinBox = new QDoubleSpinBox( this ); + mySpinBox = new QtxDoubleSpinBox( this ); myAddButton = new QPushButton( tr( "SMESH_BUT_ADD" ), this ); myRemoveButton = new QPushButton( tr( "SMESH_BUT_REMOVE" ), this ); mySameValues = new QCheckBox( tr("SMESH_SAME_NB_SEGMENTS"), this); @@ -136,10 +143,15 @@ StdMeshersGUI_FixedPointsParamWdg mySpinBox->setRange( 0, 1 ); mySpinBox->setSingleStep( 0.1 ); - - connect( myAddButton, SIGNAL(clicked()), SLOT(onAdd())); - connect( myRemoveButton, SIGNAL(clicked()), SLOT(onRemove())); - connect( mySameValues, SIGNAL(stateChanged(int)), SLOT(onCheckBoxChanged())); + mySpinBox->setDecimals( 4 ); + mySpinBox->setPrecision( 4 ); + myListWidget->setMinimumWidth( 70 ); + + connect( myAddButton, SIGNAL( clicked() ), SLOT( onAdd() ) ); + connect( myRemoveButton, SIGNAL( clicked() ), SLOT( onRemove() ) ); + connect( mySameValues, SIGNAL( stateChanged( int ) ), SLOT( onCheckBoxChanged() ) ); + connect( mySpinBox, SIGNAL( valueChanged( double ) ), SLOT( updateState() ) ); + connect( myListWidget, SIGNAL( itemSelectionChanged() ), SLOT( updateState() ) ); myListWidget->installEventFilter( this ); clear(); @@ -182,6 +194,7 @@ void StdMeshersGUI_FixedPointsParamWdg::clear() myTreeWidget->addTopLevelItem( newTreeItem( 0, 1 ) ); mySpinBox->setValue( 0. ); onCheckBoxChanged(); + updateState(); } //================================================================================= @@ -244,13 +257,13 @@ QString StdMeshersGUI_FixedPointsParamWdg::treeItemText( double v1, double v2 ) //================================================================================= void StdMeshersGUI_FixedPointsParamWdg::addPoint( double v) { - if ( v > 0 && v < 1) { + if ( GT_DBL(v, 0.0) && LT_DBL(v, 1.0)) { bool toInsert = true; int idx = myTreeWidget->topLevelItemCount()-1; for ( int i = 0 ; i < myListWidget->count(); i++ ) { double lv = point( i ); - if ( lv == v ) { toInsert = false; break; } - else if ( lv > v ) { + if ( EQUAL_DBL(lv, v) ) { toInsert = false; break; } + else if ( GT_DBL(lv, v) ) { idx = i; break; } } @@ -263,6 +276,7 @@ void StdMeshersGUI_FixedPointsParamWdg::addPoint( double v) onCheckBoxChanged(); } } + updateState(); } //================================================================================= @@ -281,6 +295,7 @@ void StdMeshersGUI_FixedPointsParamWdg::removePoints() idx > myListWidget->count()-1 ? 1 : point( idx ) ) ); } onCheckBoxChanged(); + updateState(); } double StdMeshersGUI_FixedPointsParamWdg::point( int idx ) const @@ -314,6 +329,17 @@ void StdMeshersGUI_FixedPointsParamWdg::onCheckBoxChanged() } } +//================================================================================= +// function : updateState() +// purpose : Update widgets state +//================================================================================= +void StdMeshersGUI_FixedPointsParamWdg::updateState() +{ + double v = mySpinBox->value(); + myAddButton->setEnabled( GT_DBL(v, 0.0) && LT_DBL(v, 1.0) ); + myRemoveButton->setEnabled( myListWidget->selectedItems().count() > 0 ); +} + //================================================================================= // function : GetListOfPoints // purpose : Called to get the list of Edges IDs @@ -325,7 +351,6 @@ SMESH::double_array_var StdMeshersGUI_FixedPointsParamWdg::GetListOfPoints() anArray->length( size ); for (int i = 0; i < size; i++) { anArray[i] = point(i); - // printf ("Point %f \n", anArray[i]); } return anArray; } @@ -339,7 +364,6 @@ void StdMeshersGUI_FixedPointsParamWdg::SetListOfPoints( SMESH::double_array_var clear(); for ( int i = 0; i < thePoints->length(); i++ ) { addPoint( thePoints[ i ] ); - // printf ("Add Point %f \n", thePoints[ i ]); } } @@ -354,7 +378,6 @@ SMESH::long_array_var StdMeshersGUI_FixedPointsParamWdg::GetListOfSegments() anArray->length( size ); for (int i = 0; i < size; i++) { anArray[i] = nbSegments( i ); - // printf ("Segments %d \n", anArray[i] ); } return anArray; } @@ -369,6 +392,5 @@ void StdMeshersGUI_FixedPointsParamWdg::SetListOfSegments( SMESH::long_array_var mySameValues->setChecked(true); for ( int i = 0; i < theSegments->length(); i++ ) { setNbSegments( i, theSegments[i] ); - // printf ("\nadd Segment = %d\n", theSegments[i]); } } diff --git a/src/StdMeshersGUI/StdMeshersGUI_FixedPointsParamWdg.h b/src/StdMeshersGUI/StdMeshersGUI_FixedPointsParamWdg.h index b96806de4..273781d34 100644 --- a/src/StdMeshersGUI/StdMeshersGUI_FixedPointsParamWdg.h +++ b/src/StdMeshersGUI/StdMeshersGUI_FixedPointsParamWdg.h @@ -34,10 +34,10 @@ #include class SMESHGUI; +class QtxDoubleSpinBox; class QPushButton; class QLineEdit; class QCheckBox; -class QDoubleSpinBox; class QListWidget; class QListWidgetItem; class QTreeWidget; @@ -67,6 +67,7 @@ private slots: void onAdd(); void onRemove(); void onCheckBoxChanged(); + void updateState(); private: void clear(); @@ -83,7 +84,7 @@ private: private: QListWidget* myListWidget; QTreeWidget* myTreeWidget; - QDoubleSpinBox* mySpinBox; + QtxDoubleSpinBox* mySpinBox; QPushButton* myAddButton; QPushButton* myRemoveButton; QCheckBox* mySameValues; diff --git a/src/StdMeshersGUI/StdMeshersGUI_NbSegmentsCreator.cxx b/src/StdMeshersGUI/StdMeshersGUI_NbSegmentsCreator.cxx index 93b3ca60a..2ee5473af 100644 --- a/src/StdMeshersGUI/StdMeshersGUI_NbSegmentsCreator.cxx +++ b/src/StdMeshersGUI/StdMeshersGUI_NbSegmentsCreator.cxx @@ -197,14 +197,16 @@ QFrame* StdMeshersGUI_NbSegmentsCreator::buildFrame() row++; // 8) reverce edge parameters - myReversedEdgesBox = new QGroupBox(tr( "SMESH_REVERCE_EDGES" ), fr); + myReversedEdgesBox = new QGroupBox(tr( "SMESH_REVERSED_EDGES" ), fr); QHBoxLayout* edgeLay = new QHBoxLayout( myReversedEdgesBox ); myDirectionWidget = new StdMeshersGUI_SubShapeSelectorWdg(); - QString anEntry = getShapeEntry(); - if ( anEntry == "" ) - anEntry = h->GetObjectEntry(); - myDirectionWidget->SetMainShapeEntry( anEntry ); + QString aGeomEntry = getShapeEntry(); + QString aMainEntry = getMainShapeEntry(); + if ( aGeomEntry == "" ) + aGeomEntry = h->GetObjectEntry(); + myDirectionWidget->SetGeomShapeEntry( aGeomEntry ); + myDirectionWidget->SetMainShapeEntry( aMainEntry ); myDirectionWidget->SetListOfIDs( h->GetReversedEdges() ); edgeLay->addWidget( myDirectionWidget ); @@ -377,7 +379,7 @@ bool StdMeshersGUI_NbSegmentsCreator::storeParamsToHypo( const NbSegmentsHypothe //the function will be checked with old conversion mode, so that it may occurs //unexpected errors for user - h->SetParameters(SMESHGUI::JoinObjectParameters(aVariablesList)); + h->SetParameters(aVariablesList.join(":").toLatin1().constData()); } catch(const SALOME::SALOME_Exception& ex) { diff --git a/src/StdMeshersGUI/StdMeshersGUI_StdHypothesisCreator.cxx b/src/StdMeshersGUI/StdMeshersGUI_StdHypothesisCreator.cxx index 35231586d..0d72900dc 100644 --- a/src/StdMeshersGUI/StdMeshersGUI_StdHypothesisCreator.cxx +++ b/src/StdMeshersGUI/StdMeshersGUI_StdHypothesisCreator.cxx @@ -384,6 +384,12 @@ bool StdMeshersGUI_StdHypothesisCreator::checkParams( QString& msg ) const widget< StdMeshersGUI_LayerDistributionParamWdg >( 0 ); ok = ( w && w->IsOk() ); } + else if ( hypType() == "QuadrangleParams" ) + { + StdMeshersGUI_SubShapeSelectorWdg* w = + widget< StdMeshersGUI_SubShapeSelectorWdg >( 0 ); + ok = ( w->GetListSize() > 0 ); + } return ok; } @@ -415,9 +421,9 @@ QString StdMeshersGUI_StdHypothesisCreator::storeParams() const StdMeshers::StdMeshers_LocalLength::_narrow( hypothesis() ); h->SetLength( params[0].myValue.toDouble() ); - h->SetParameters(SMESHGUI::JoinObjectParameters(aVariablesList)); + h->SetParameters(aVariablesList.join(":").toLatin1().constData()); h->SetPrecision( params[1].myValue.toDouble() ); - h->SetParameters(SMESHGUI::JoinObjectParameters(aVariablesList)); + h->SetParameters(aVariablesList.join(":").toLatin1().constData()); } else if( hypType()=="MaxLength" ) { @@ -425,7 +431,7 @@ QString StdMeshersGUI_StdHypothesisCreator::storeParams() const StdMeshers::StdMeshers_MaxLength::_narrow( hypothesis() ); h->SetLength( params[0].myValue.toDouble() ); - h->SetParameters(SMESHGUI::JoinObjectParameters(aVariablesList)); + h->SetParameters(aVariablesList.join(":").toLatin1().constData()); h->SetUsePreestimatedLength( widget< QCheckBox >( 1 )->isChecked() ); if ( !h->HavePreestimatedLength() && !h->_is_equivalent( initParamsHypothesis() )) { StdMeshers::StdMeshers_MaxLength_var hInit = @@ -439,7 +445,7 @@ QString StdMeshersGUI_StdHypothesisCreator::storeParams() const StdMeshers::StdMeshers_SegmentLengthAroundVertex::_narrow( hypothesis() ); h->SetLength( params[0].myValue.toDouble() ); - h->SetParameters(SMESHGUI::JoinObjectParameters(aVariablesList)); + h->SetParameters(aVariablesList.join(":").toLatin1().constData()); } else if( hypType()=="Arithmetic1D" ) { @@ -450,13 +456,12 @@ QString StdMeshersGUI_StdHypothesisCreator::storeParams() const widget< StdMeshersGUI_SubShapeSelectorWdg >( 2 ); h->SetStartLength( params[0].myValue.toDouble() ); - h->SetParameters(SMESHGUI::JoinObjectParameters(aVariablesList)); + h->SetParameters(aVariablesList.join(":").toLatin1().constData()); h->SetEndLength( params[1].myValue.toDouble() ); - h->SetParameters(SMESHGUI::JoinObjectParameters(aVariablesList)); + h->SetParameters(aVariablesList.join(":").toLatin1().constData()); if (w) { h->SetReversedEdges( w->GetListOfIDs() ); - const char * entry = w->GetMainShapeEntry(); - h->SetObjectEntry( entry ); + h->SetObjectEntry( w->GetMainShapeEntry() ); } } else if( hypType()=="FixedPoints1D" ) @@ -471,21 +476,20 @@ QString StdMeshersGUI_StdHypothesisCreator::storeParams() const widget< StdMeshersGUI_SubShapeSelectorWdg >( 1 ); if (w1) { - h->SetParameters(SMESHGUI::JoinObjectParameters(aVariablesList)); + h->SetParameters(aVariablesList.join(":").toLatin1().constData()); h->SetPoints( w1->GetListOfPoints() ); h->SetNbSegments( w1->GetListOfSegments() ); } if (w2) { h->SetReversedEdges( w2->GetListOfIDs() ); - const char * entry = w2->GetMainShapeEntry(); - h->SetObjectEntry( entry ); + h->SetObjectEntry( w2->GetMainShapeEntry() ); } } else if( hypType()=="MaxElementArea" ) { StdMeshers::StdMeshers_MaxElementArea_var h = StdMeshers::StdMeshers_MaxElementArea::_narrow( hypothesis() ); - h->SetParameters(SMESHGUI::JoinObjectParameters(aVariablesList)); + h->SetParameters(aVariablesList.join(":").toLatin1().constData()); h->SetMaxElementArea( params[0].myValue.toDouble() ); } else if( hypType()=="MaxElementVolume" ) @@ -494,7 +498,7 @@ QString StdMeshersGUI_StdHypothesisCreator::storeParams() const StdMeshers::StdMeshers_MaxElementVolume::_narrow( hypothesis() ); h->SetMaxElementVolume( params[0].myValue.toDouble() ); - h->SetParameters(SMESHGUI::JoinObjectParameters(aVariablesList)); + h->SetParameters(aVariablesList.join(":").toLatin1().constData()); } else if( hypType()=="StartEndLength" ) { @@ -505,9 +509,9 @@ QString StdMeshersGUI_StdHypothesisCreator::storeParams() const widget< StdMeshersGUI_SubShapeSelectorWdg >( 2 ); h->SetStartLength( params[0].myValue.toDouble() ); - h->SetParameters(SMESHGUI::JoinObjectParameters(aVariablesList)); + h->SetParameters(aVariablesList.join(":").toLatin1().constData()); h->SetEndLength( params[1].myValue.toDouble() ); - h->SetParameters(SMESHGUI::JoinObjectParameters(aVariablesList)); + h->SetParameters(aVariablesList.join(":").toLatin1().constData()); if (w) { h->SetReversedEdges( w->GetListOfIDs() ); h->SetObjectEntry( w->GetMainShapeEntry() ); @@ -517,7 +521,7 @@ QString StdMeshersGUI_StdHypothesisCreator::storeParams() const { StdMeshers::StdMeshers_Deflection1D_var h = StdMeshers::StdMeshers_Deflection1D::_narrow( hypothesis() ); - h->SetParameters(SMESHGUI::JoinObjectParameters(aVariablesList)); + h->SetParameters(aVariablesList.join(":").toLatin1().constData()); h->SetDeflection( params[0].myValue.toDouble() ); } else if( hypType()=="AutomaticLength" ) @@ -533,7 +537,7 @@ QString StdMeshersGUI_StdHypothesisCreator::storeParams() const StdMeshers::StdMeshers_NumberOfLayers::_narrow( hypothesis() ); h->SetNumberOfLayers( params[0].myValue.toInt() ); - h->SetParameters(SMESHGUI::JoinObjectParameters(aVariablesList)); + h->SetParameters(aVariablesList.join(":").toLatin1().constData()); } else if( hypType()=="LayerDistribution" ) { @@ -552,7 +556,7 @@ QString StdMeshersGUI_StdHypothesisCreator::storeParams() const StdMeshers::StdMeshers_NumberOfLayers2D::_narrow( hypothesis() ); h->SetNumberOfLayers( params[0].myValue.toInt() ); - h->SetParameters(SMESHGUI::JoinObjectParameters(aVariablesList)); + h->SetParameters(aVariablesList.join(":").toLatin1().constData()); } else if( hypType()=="LayerDistribution2D" ) { @@ -606,11 +610,11 @@ QString StdMeshersGUI_StdHypothesisCreator::storeParams() const StdMeshersGUI_SubShapeSelectorWdg* w = widget< StdMeshersGUI_SubShapeSelectorWdg >( 0 ); if (w) { - if( w->GetListOfIDs()->length()>0 ) { - h->SetTriaVertex( w->GetListOfIDs()[0] ); + if( w->GetListSize() > 0 ) { + h->SetTriaVertex( w->GetListOfIDs()[0] ); // getlist must be called once + const char * entry = w->GetMainShapeEntry(); + h->SetObjectEntry( entry ); } - const char * entry = w->GetMainShapeEntry(); - h->SetObjectEntry( entry ); } } } @@ -736,10 +740,13 @@ bool StdMeshersGUI_StdHypothesisCreator::stdParams( ListOfStdParams& p ) const StdMeshersGUI_SubShapeSelectorWdg* aDirectionWidget = new StdMeshersGUI_SubShapeSelectorWdg(); - QString anEntry = SMESHGUI_GenericHypothesisCreator::getShapeEntry(); - if ( anEntry == "" ) - anEntry = h->GetObjectEntry(); - aDirectionWidget->SetMainShapeEntry( anEntry ); + QString aGeomEntry = SMESHGUI_GenericHypothesisCreator::getShapeEntry(); + QString aMainEntry = SMESHGUI_GenericHypothesisCreator::getMainShapeEntry(); + if ( aGeomEntry == "" ) + aGeomEntry = h->GetObjectEntry(); + + aDirectionWidget->SetGeomShapeEntry( aGeomEntry ); + aDirectionWidget->SetMainShapeEntry( aMainEntry ); aDirectionWidget->SetListOfIDs( h->GetReversedEdges() ); aDirectionWidget->showPreview( true ); customWidgets()->append ( aDirectionWidget ); @@ -769,9 +776,11 @@ bool StdMeshersGUI_StdHypothesisCreator::stdParams( ListOfStdParams& p ) const StdMeshersGUI_SubShapeSelectorWdg* aDirectionWidget = new StdMeshersGUI_SubShapeSelectorWdg(); QString anEntry = SMESHGUI_GenericHypothesisCreator::getShapeEntry(); + QString aMainEntry = SMESHGUI_GenericHypothesisCreator::getMainShapeEntry(); if ( anEntry == "" ) anEntry = h->GetObjectEntry(); - aDirectionWidget->SetMainShapeEntry( anEntry ); + aDirectionWidget->SetGeomShapeEntry( anEntry ); + aDirectionWidget->SetMainShapeEntry( aMainEntry ); aDirectionWidget->SetListOfIDs( h->GetReversedEdges() ); aDirectionWidget->showPreview( true ); customWidgets()->append ( aDirectionWidget ); @@ -823,11 +832,12 @@ bool StdMeshersGUI_StdHypothesisCreator::stdParams( ListOfStdParams& p ) const StdMeshersGUI_SubShapeSelectorWdg* aDirectionWidget = new StdMeshersGUI_SubShapeSelectorWdg(); QString anEntry = SMESHGUI_GenericHypothesisCreator::getShapeEntry(); + QString aMainEntry = SMESHGUI_GenericHypothesisCreator::getMainShapeEntry(); if ( anEntry == "" ) anEntry = h->GetObjectEntry(); - aDirectionWidget->SetMainShapeEntry( anEntry ); + aDirectionWidget->SetGeomShapeEntry( anEntry ); + aDirectionWidget->SetMainShapeEntry( aMainEntry ); aDirectionWidget->SetListOfIDs( h->GetReversedEdges() ); - aDirectionWidget->SetMainShapeEntry( h->GetObjectEntry() ); aDirectionWidget->showPreview( true ); customWidgets()->append ( aDirectionWidget ); } @@ -874,7 +884,7 @@ bool StdMeshersGUI_StdHypothesisCreator::stdParams( ListOfStdParams& p ) const aLastVarsList.append(QString(aParameters[i].in())); if(!aLastVarsList.isEmpty()) - h->GetLayerDistribution()->SetLastParameters(SMESHGUI::JoinObjectParameters(aLastVarsList)); + h->GetLayerDistribution()->SetLastParameters(aLastVarsList.join(":").toLatin1().constData()); customWidgets()->append ( new StdMeshersGUI_LayerDistributionParamWdg( h->GetLayerDistribution(), hypName(), dlg())); @@ -900,7 +910,7 @@ bool StdMeshersGUI_StdHypothesisCreator::stdParams( ListOfStdParams& p ) const aLastVarsList.append(QString(aParameters[i].in())); if(!aLastVarsList.isEmpty()) - h->GetLayerDistribution()->SetLastParameters(SMESHGUI::JoinObjectParameters(aLastVarsList)); + h->GetLayerDistribution()->SetLastParameters(aLastVarsList.join(":").toLatin1().constData()); customWidgets()->append ( new StdMeshersGUI_LayerDistributionParamWdg( h->GetLayerDistribution(), hypName(), dlg())); @@ -984,9 +994,11 @@ bool StdMeshersGUI_StdHypothesisCreator::stdParams( ListOfStdParams& p ) const aDirectionWidget->SetMaxSize(1); aDirectionWidget->SetSubShType(TopAbs_VERTEX); QString anEntry = SMESHGUI_GenericHypothesisCreator::getShapeEntry(); + QString aMainEntry = SMESHGUI_GenericHypothesisCreator::getMainShapeEntry(); if ( anEntry == "" ) anEntry = h->GetObjectEntry(); - aDirectionWidget->SetMainShapeEntry( anEntry ); + aDirectionWidget->SetGeomShapeEntry( anEntry ); + aDirectionWidget->SetMainShapeEntry( aMainEntry ); SMESH::long_array_var aVec = new SMESH::long_array; int vertID = h->GetTriaVertex(); if(vertID>0) { @@ -1116,7 +1128,7 @@ QString StdMeshersGUI_StdHypothesisCreator::hypTypeName( const QString& t ) cons types.insert( "ProjectionSource3D", "PROJECTION_SOURCE_3D" ); types.insert( "NumberOfLayers", "NUMBER_OF_LAYERS" ); types.insert( "LayerDistribution", "LAYER_DISTRIBUTION" ); - types.insert( "NumberOfLayers2D", "NUMBER_OF_LAYERS" ); + types.insert( "NumberOfLayers2D", "NUMBER_OF_LAYERS_2D" ); types.insert( "LayerDistribution2D", "LAYER_DISTRIBUTION" ); types.insert( "SegmentLengthAroundVertex", "SEGMENT_LENGTH_AROUND_VERTEX" ); types.insert( "MaxLength", "MAX_LENGTH" ); diff --git a/src/StdMeshersGUI/StdMeshersGUI_SubShapeSelectorWdg.cxx b/src/StdMeshersGUI/StdMeshersGUI_SubShapeSelectorWdg.cxx index 0d0a79ca0..65b99514e 100644 --- a/src/StdMeshersGUI/StdMeshersGUI_SubShapeSelectorWdg.cxx +++ b/src/StdMeshersGUI/StdMeshersGUI_SubShapeSelectorWdg.cxx @@ -23,6 +23,7 @@ // Author : Open CASCADE S.A.S. (dmv) // SMESH includes // + #include "StdMeshersGUI_SubShapeSelectorWdg.h" // SMESH Includes @@ -81,7 +82,8 @@ StdMeshersGUI_SubShapeSelectorWdg ::StdMeshersGUI_SubShapeSelectorWdg( QWidget * parent ): QWidget( parent ), - myPreviewActor( 0 ) + myPreviewActor( 0 ), + myMaxSize( 0 ) { QPixmap image0( SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap( "SMESH", tr( "ICON_SELECT" ) ) ); @@ -104,7 +106,6 @@ StdMeshersGUI_SubShapeSelectorWdg setLayout( edgesLayout ); setMinimumWidth( 300 ); - myMaxSize = 1000; mySubShType = TopAbs_EDGE; init(); @@ -141,6 +142,7 @@ StdMeshersGUI_SubShapeSelectorWdg::~StdMeshersGUI_SubShapeSelectorWdg() void StdMeshersGUI_SubShapeSelectorWdg::init() { myParamValue = ""; + myIsNotCorrected = true; // to dont call the GetCorrectedValue method twice myListOfIDs.clear(); mySelectedIDs.clear(); @@ -268,7 +270,7 @@ void StdMeshersGUI_SubShapeSelectorWdg::onAdd() return; myListWidget->blockSignals( true ); - for (int i = 0; i < mySelectedIDs.size(); i++) { + for (int i = 0; i < mySelectedIDs.size() && (myMaxSize < 1 || myListOfIDs.size() < myMaxSize); i++) { if ( myListOfIDs.indexOf( mySelectedIDs.at(i) ) == -1 ) { QString anID = QString(" %1").arg( mySelectedIDs.at(i) ); @@ -279,11 +281,8 @@ void StdMeshersGUI_SubShapeSelectorWdg::onAdd() } } onListSelectionChanged(); - myListWidget->blockSignals( false ); - - if( myListOfIDs.size() >= myMaxSize ) - myAddButton->setEnabled( false ); + myAddButton->setEnabled( myListOfIDs.size() < myMaxSize ); } //================================================================================= @@ -334,13 +333,14 @@ void StdMeshersGUI_SubShapeSelectorWdg::onListSelectionChanged() // function : setGeomShape // purpose : Called to set geometry //================================================================================ -void StdMeshersGUI_SubShapeSelectorWdg::SetMainShapeEntry( const QString& theEntry ) +void StdMeshersGUI_SubShapeSelectorWdg::SetGeomShapeEntry( const QString& theEntry ) { if ( theEntry != "") { myParamValue = theEntry; myEntry = theEntry; - myMainShape = GetTopoDSByEntry( theEntry ); + myGeomShape = GetTopoDSByEntry( theEntry ); updateState(); + myIsNotCorrected = true; } } @@ -351,7 +351,7 @@ void StdMeshersGUI_SubShapeSelectorWdg::SetMainShapeEntry( const QString& theEnt void StdMeshersGUI_SubShapeSelectorWdg::updateState() { bool state = false; - if ( !myMainShape.IsNull() ) + if ( !myGeomShape.IsNull() ) state = true; myListWidget->setEnabled( state ); @@ -361,8 +361,7 @@ void StdMeshersGUI_SubShapeSelectorWdg::updateState() if (state) { myPreviewActor = new SMESH_PreviewActorsCollection(); myPreviewActor->SetSelector( mySelector ); - //myPreviewActor->Init( myMainShape, TopAbs_EDGE, myEntry ); - myPreviewActor->Init( myMainShape, mySubShType, myEntry ); + myPreviewActor->Init( myGeomShape, mySubShType, myEntry ); myPreviewActor->SetShown( false ); myIsShown = false; if ( SVTK_ViewWindow* aViewWindow = SMESH::GetViewWindow( mySMESHGUI )) { @@ -414,6 +413,10 @@ TopoDS_Shape StdMeshersGUI_SubShapeSelectorWdg::GetTopoDSByEntry( const QString& SMESH::long_array_var StdMeshersGUI_SubShapeSelectorWdg::GetListOfIDs() { SMESH::long_array_var anArray = new SMESH::long_array; + + if ( myMainEntry != "" && myIsNotCorrected ) + myListOfIDs = GetCorrectedListOfIDs( true ); + int size = myListOfIDs.size(); anArray->length( size ); if ( size ) { @@ -435,6 +438,67 @@ void StdMeshersGUI_SubShapeSelectorWdg::SetListOfIDs( SMESH::long_array_var theI int size = theIds->length(); for ( int i = 0; i < size; i++ ) mySelectedIDs.append( theIds[ i ] ); + + mySelectedIDs = GetCorrectedListOfIDs( false ); onAdd(); } +//================================================================================= +// function : SetMainShapeEntry +// purpose : Called to set the Main Object Entry +//================================================================================= +void StdMeshersGUI_SubShapeSelectorWdg::SetMainShapeEntry( const QString& theEntry ) +{ + myMainEntry = theEntry; + myMainShape = GetTopoDSByEntry( theEntry ); + myIsNotCorrected = true; +} + +//================================================================================= +// function : GetMainShapeEntry +// purpose : Called to get the Main Object Entry +//================================================================================= +const char* StdMeshersGUI_SubShapeSelectorWdg::GetMainShapeEntry() +{ + if ( myMainEntry == "") + return myEntry.toLatin1().data(); + + return myMainEntry.toLatin1().data(); +} + +//================================================================================= +// function : GetCorrectedListOfIds +// purpose : Called to convert the list of IDs from subshape IDs to main shape IDs +//================================================================================= +QList StdMeshersGUI_SubShapeSelectorWdg::GetCorrectedListOfIDs( bool fromSubshapeToMainshape ) +{ + if ( ( myMainShape.IsNull() || myGeomShape.IsNull() ) && fromSubshapeToMainshape ) + return myListOfIDs; + else if ( ( myMainShape.IsNull() || myGeomShape.IsNull() ) && !fromSubshapeToMainshape ) + return mySelectedIDs; + + QList aList; + TopTools_IndexedMapOfShape aGeomMap; + TopTools_IndexedMapOfShape aMainMap; + TopExp::MapShapes(myGeomShape, aGeomMap); + TopExp::MapShapes(myMainShape, aMainMap); + + if ( fromSubshapeToMainshape ) { // convert indexes from subshape to mainshape + int size = myListOfIDs.size(); + for (int i = 0; i < size; i++) { + TopoDS_Shape aSubShape = aGeomMap.FindKey( myListOfIDs.at(i) ); + int index = aMainMap.FindIndex( aSubShape ); + aList.append( index ); + } + myIsNotCorrected = false; + } else { // convert indexes from main shape to subshape + int size = mySelectedIDs.size(); + for (int i = 0; i < size; i++) { + TopoDS_Shape aSubShape = aMainMap.FindKey( mySelectedIDs.at(i) ); + int index = aGeomMap.FindIndex( aSubShape ); + aList.append( index ); + } + } + + return aList; +} diff --git a/src/StdMeshersGUI/StdMeshersGUI_SubShapeSelectorWdg.h b/src/StdMeshersGUI/StdMeshersGUI_SubShapeSelectorWdg.h index 6447516fb..49e49e82a 100644 --- a/src/StdMeshersGUI/StdMeshersGUI_SubShapeSelectorWdg.h +++ b/src/StdMeshersGUI/StdMeshersGUI_SubShapeSelectorWdg.h @@ -59,11 +59,17 @@ public: SMESH::long_array_var GetListOfIDs(); void SetListOfIDs( SMESH::long_array_var ); + void SetGeomShapeEntry( const QString& theEntry ); + const char* GetGeomShapeEntry() { return myEntry.toLatin1().data();} + void SetMainShapeEntry( const QString& theEntry ); - const char* GetMainShapeEntry() { return myEntry.toLatin1().data();} + const char* GetMainShapeEntry(); + TopoDS_Shape GetGeomShape() { return myGeomShape; } TopoDS_Shape GetMainShape() { return myMainShape; } + QList GetCorrectedListOfIDs( bool fromSubshapeToMainshape = true ); + static GEOM::GEOM_Object_var GetGeomObjectByEntry( const QString& ); static TopoDS_Shape GetTopoDSByEntry( const QString& ); @@ -71,6 +77,8 @@ public: void showPreview ( bool ); + int GetListSize() { return myListOfIDs.size(); } + void SetMaxSize(int aMaxSize) { myMaxSize = aMaxSize; } void SetSubShType(TopAbs_ShapeEnum aSubShType) { mySubShType = aSubShType; } @@ -91,8 +99,10 @@ private: LightApp_SelectionMgr* mySelectionMgr; /* User shape selection */ SVTK_Selector* mySelector; SMESH::SMESH_Mesh_var myMesh; + TopoDS_Shape myGeomShape; TopoDS_Shape myMainShape; QString myEntry; + QString myMainEntry; vtkRenderer* myRenderer; QListWidget* myListWidget; @@ -103,6 +113,7 @@ private: QString myParamValue; bool myIsShown; + bool myIsNotCorrected; // for manage possible size of myListOfIDs int myMaxSize; diff --git a/src/StdMeshersGUI/StdMeshers_images.ts b/src/StdMeshersGUI/StdMeshers_images.ts index 7dc80991b..7438aa85e 100644 --- a/src/StdMeshersGUI/StdMeshers_images.ts +++ b/src/StdMeshersGUI/StdMeshers_images.ts @@ -73,6 +73,10 @@ ICON_DLG_NUMBER_OF_LAYERS mesh_hypo_layer_distribution.png + + ICON_DLG_NUMBER_OF_LAYERS_2D + mesh_hypo_layer_distribution.png + ICON_DLG_PROJECTION_SOURCE_1D mesh_hypo_source_edge.png diff --git a/src/StdMeshersGUI/StdMeshers_msg_en.ts b/src/StdMeshersGUI/StdMeshers_msg_en.ts index caabb7f54..0a8ca42f4 100644 --- a/src/StdMeshersGUI/StdMeshers_msg_en.ts +++ b/src/StdMeshersGUI/StdMeshers_msg_en.ts @@ -221,10 +221,18 @@ SMESH_NUMBER_OF_LAYERS_HYPOTHESIS Radial Prism Parameter + + SMESH_NUMBER_OF_LAYERS_2D_HYPOTHESIS + Radial Quadrangle Parameter + SMESH_NUMBER_OF_LAYERS_TITLE Hypothesis Construction + + SMESH_NUMBER_OF_LAYERS_2D_TITLE + Hypothesis Construction + SMESH_PROJECTION_SOURCE_1D_HYPOTHESIS Projection Source 1D -- 2.39.2
      zAGSyub?%8sDC?GNLZwDyNUq85ZGS5Y$Em=eA!jo|@{se$~Q&N->02(z1UfO*t&hD7GnWw#7+F_D^ z{|Jb>Y0}T>8T)pZf}G?`N%8l;STp+Cr_J3mxlN^MKxDQ>X?(P)h{w z&wy0a|D)-fqbhyBx5HFZO*PrJZQJ%_+jdR1ZQJ%V*>19J8}IY^zU%kjX|>L&wa#R*vx%xqQCUHF92_Mh>OwoZ0-LQ88HC;)P{)wGA3iUo_Y*hOSlb>TW)h>h_c47 zzR5r4OW8gB>GVfGe`bm~%7J3O3<9j;E^<1_0nHLX9{{jDKLv~QKy?}8bQhV__0-gs zD{E+xx618%E4b0K?T180})N^tC~W+E2D}@Suhc&-Ne%P(rXFR{BT)z{9Mu60yjgJ-4BxOqQv$( z%by#WeeJ6#_P$o}hF3;L{_!w))gF_=;csVWC+=bZ5A_$u;Xwvs(}r3Dz{A*JFdA#q zzgeGjYYP-qRK*2Ko^>v~crpUiu%7+6WO(?qA4)4)a#mj0`(SuCA^#Pr47#}U9_gIA;r#i(B4VWuH@a* z-~aiCD=S$P%{|Mt9xsHyYi5xFw0MnQUrSFLiqeqew3yBZrz=RmKBs!^;8$-^ z&`=X~h~zxA5oAlM8ZxG}H&zg*r5)U>8No>jw^mhe7WIZP)>mTu(JC;fze@9~MmjY6 zF^&!8ZEP-p?|S+Qoxx|G5wJTjEY5EK)9g?C8n%EIHs(g=wLCp7raCa32xW7EbT%4@ zeJi&UTocz5POgR(V|KcO=EIt=#8h4sFZ4oAPYFC?KJj>+l8?-^;jXgs+BXgYk{E`@ zc+pR;jK^=}OX@AJNV|v=G5&QEA1t!2d*|a$s)z@=G=?^Qu7h_hV-%9mSJOAU>|i`@ z+$Mg*UrUYJ>(@cY09s@yW}l^;p2)&>P$+e|or%4l=g|*oE#;J&mL_?VcEAT*oEi0*ci@4t9?_Y5 z0ms>4)c*RO0v>zBlL<EnZ4I<{hXlAgvHao+ z5=4G)+t|Oz99PI=?ZbpLIJ<(Dx`<|7fur=4M+=1nrU>>XpZabsIu@F$u9G`f-t0Et zZyT7jZ&GWL&O2X%iu=778vWQGHtjBA6=-elCz1$4Qj@CObs;12VZc&i?Booc;g6a4fZM97q z&q_02T7rZfxfE?!iw%d*ducOOH{=r6g#+{BvsQwtnmn=-p4A^0QO;?cz9d^DXI*#O;D0owCERofKOu~SX#Uts! zByD9<>eg+z!F*ptcIr7y5td=*pOL~>kF$eAL1d(RRVK%iKyP-M+=855^rx#~#A3H# z`@YIjy_1 zw)~-fyBLbgPlyYK9K_-BjlYN-ZZ0dnF*N-w#T2%0WH;Nj3tj2-R*GEfTuDbvNRm{w z!CeaB0%jYN_2jmazv1Iu(EJB*@4k}c2v)F8t}hk>vfNQbp(hI(+mqL`=WYuC@8Aq-tkmLJGe;o2mQc;OlUEl$2HC6J{R{s*j7q2}8} z0?s5{+LCzuyOM+b$}F&u+(%oZ`wJ$~i*pA#dBQzb&IW$d&-{NXm{nt|+V0E}XAr4b z!o5)OcDEecfXRM-Ns)hJGUGomB8#8l6ty)5j&^1|xe=HKFjCaVhDK8VC5*Z}{J5Nx zOL&1QtEui^6~Gqt&{VtX462T&)3KRMn{B18c|1ICJDt3?#l1GS8yzG!P*R2XT2>M3 z{P_ z7D6DmWifUAjm%s(^Up9TlbAh6lyPP-=X#%JOjjTFCS1m}%?b)&HBSHm4=CIb*sAH^ zhRVQCGPyBqNCJ3aj8uVKt%VIGDOv%u-i!_)rQJoUg~ZB@?YsDb;!eWAF;81s$@0i< zlANLhns?&DjX~+y#}s4K6e<5p@D68vH+?pBt^AC4oFKd$qUhqAXgSlMMpn;XSR!Vu zrB~kYLj0JUJR{e#)Pwyh(R3jdJmar!!v?bS%DcB?oT#6-6(X|TVUM0;3rp;AYVU_1 zTc0O`JQ7p|g~g0DOJXu^jXS;~KrXOsAeSamYL2v$9HB7x8nMwkdCcm z6kBrquZdGw3MtvV5{A&WcgKjv`In0}@&~vF8oUR*Lf$OQi=8NS4IEWgdOJbJxmo?o zqWbq&f}8BFw?S1G;|LXdHWjnMnHuXZ+|S>{)cvc_ywCfF+gA9sh4GNRQO>5$;>eJ{ zEE9G-ekwYCFWCPn^W#1)Ia!nfg$M-(lgk_=rW-2WY$sr(s?fMSU2)iV%RQ$AO}`?4 zAfMcU1H+Q()|y9hP&KV`jA>IBmYo6g(6 zD+E0A;^@Oq!P8-Rl zFJy)#potC9mtILFSWt^S?iZ;ujEmpvFZPTBgg0YRBQG%4wy^N85!hf5!}}xYIOzUd zKO7iZyu6@s$H@8fyU(_an!4_x0Uh|HiPJ5Bm&=jrc~kb{PR!8z3u2}vl-LN|7J_M5 zV}V-iWi>S=ldDw!0fRZZxv709cpsMNtOO<=H9Jy(dC2~UfA{vA@!j_mG)(0CH!u+* zL_ugkS!n$qa{eG1u%?PWljnsobhJZPi@Kc5P3`^}E&}NLh(A-MfX-eEEym=wLm0!d z+@P#DCZz(&Y-yqokQIz$CArw4(R{012lD>f7}_7Jk-bi zsYHVh0(JFVSX?1PE=`O>`(tJAgu3`nK~q`!9+u|_b+Or6mn&VhCS;-uMP9}C0Gt1& zB7@7-i_dg1?TNzD>~G-lz1oEzeSO%~+ph+CinnC^YkIE?q-343ml1V!>4tGDigJrT zYT}r=Nv)MhDho@E>;!PctPnp`P}`nQPyh+|W-uIzB@8Qrkwg>Qe7?}m&(}S8uHB!k z`2_uAgEYF<(SS#=hS~n_EV5z5uH= z7Bb4r#C^M?yAps<2}nfj)ah;H=`^?3NAbgy!ukFH`JT66;X5>Duij;gW&Tq9yBK!# zClr`(O50PMwo5cuHc$c@3ItmGIwN+y?-H>&wr!S^sn)Hpf@GwNbMTgmz&;p=$x&qE zZ(uDkSAR>7J|tQ+5N10zC=k4H{ahtHzcx0Mi5%X06IvH~}ej!08 z9tIvzmZkLQE?RG6t-i!NI;7AO(C^@pl{t&bEK6!jlHADK737KNiNquNe_nu~!=9IQ z`)5t8My^bz&RW<|{BO-86lj_0^47%6iGJRYVERMbc-9!Ckga+WmvoP&IXYrIkgu)*j59a;) z4R4qEPLr(*ia)pGF2M$(Dw8*BSWz48$7OTNILoCD+&Yn#7$c5duO@+jnDK|yv}li6_`(6IZF zB~=8&a|U?cufKCbJG(gn4Ct)e9L$d%D=Ob@p__mRqX;NL0Law)xR7)ZRi2ZeK&dmh z{H}J@JIA5^eYwY-CKtbB2rvgdZr&DlRlEipK`(dcv*hBnNjcii+u4{E3@7B{c{hDA zDSL6=-Ia3}9iqkq5V|@Z9&0QjK_A$l%t*$Ch2w=WuxNL5^Kql)%~OIv*?Og@t-XG@ z`~NA1MJg&P2?>d98GR&vyx!5m2YdjI4|L4CrM<2pcCmYp0Op+u%?)R8scRLD!=%f&q|ky4`rfE&WQvo!e{(0gV_tCn42nj6IxRCL3m z<7>XH-L3=fMZ4|y?K z{#h#HewkT`l&YeVn4;yModd~tlfKYIw1=&wFq*$j!*^!z_tBq5sxs5>_#x?FMlrz# zlIu%v#VJbStDo?`d1>e^HTb;kQd+{1OmKAfXuVG*ww<|@@k|o=rmQliPP1-Sr!nR! zI>T(%H2a!}?CGK0-;UmX*yR#k2~=7^TN%RUx-_$>rT6tr%6UPRadF;s?5_Z>Y&oNtU*GcObrbKhY`d1(KS>ZRE8T#Cpxq* zb+O&XTT#1GN|6Icjc3ObExq!0D}w@fIlOmb)05iL!Og_kX+F=0$;}Ve>BmE;$NS=!D8@(YPAvGK2U+)fM7@^wrAMEqkNwZAjw`z+TK^^=Z95|dlr&j0g!B}lizdK_WkDa*v^}2k_c%n3CHT%$Fe9?p& zJ{6y1HPG~rlIF^y|DF#lh9Ab0bcupPa{UmasT10pcd43p)5vQU#2ckJqPXIRDx7^; zDpJjn<7cCruAtbTbNEw{kYES$+r=La^_-;MUe`!kWIy&(F*F;f_3S>G6_9R|Wl6Ve z*JXtO4~E#&-#bm`$e8Ys1|p!A@4wDdSe^}H^i2$1>DuVx39=^!aFg6LIg~V5bT-APa#S1=2 zR#{jmD9x9;=PkZQUPs5+vLkyU0 zwLd-SoW3|jb#%b_Ww0j*(77S~TG2HzfpwG>?&4&U(WRaI^kOEr>MC7%_cc`nq0Iqo zB^_Aa{4NA?)NIlT-a-NX)v&|cpQE`6+eRmKc-~(3kXy32BMWfiipoj?Jv|BU@7}9b z|6?Nh(Xg?{qcE+~dv>K$ew+mipH|;H)*0?70D2^~2TG0v009zGDvuuf>#@CAO$ZtQ z;C~$tDT3dQ{pW<<)ag#M2}R*D5Z6qT*@NH+FI1wL4pjRQ_6Pt&I3LE4p;xbodP-B9 zneqVC*_$4Z)!^(vxa$2^Eb99zdvtj>`rIRPN&8VBBQr_H#+y2O8FOwkVD+E#*0k65 zzc#6C!FsIHlA^rK@T{O-`@wE1%H`P>1QyawT(rJ@{s=XG1ZX7yq$v5g;qk$k!%w#x z;r9)&3tRV|PG0DxIG#wREkGTJYBgQ3NQXRZZ&#G#_*_Q;)`iL6ae$`)s1Fzymm}}A z!yk9SdzK@gYrwee?i5Yz@c?ry~|rU)%|yh~Cv zhBq0E(h@EQdtLr6K9Z`#fK7phXC_Ff=jG=JJCGxd(D}4n91Ygj_>EI z4fT*5p+2yXz(`!}Y@of}@+%Z1KHNJlmnJdp_VlJ48EtSkcl(>b3>a-9w17O#OZGRl3G96_6BoE)ya+9#W|d?OmVxZE>4F!J z*PoEyjh!p39BG&g)v>UvmSfHuE%AUU2jgNjz=ys`6VATnK&~*a27v6{TpDwmD!G71 z$GVeBHg|1tC@7payR5qMsLAbnBxL8^MLpSiL1s5*{;1~2_uvWa-3WCNqAi^6fQ|;D z$j~+?dK%ri5>vCP$jD?y;D1eHpOLK){sWkK9X7ZdK30v`vit}Z4H)W6kYJv8W86} z`rkRYH1Vh~E3Si)1{+-4)+RJARk-Tily=6=9jEw$9xk+NDN$yl_BV{Jx}ISTzj?B0 zqGlA;`=&JHEx)3VE({PH07rl>793RS0ZihXI=enw8og^v5R zsd{aYS2FVZaw*F@L%`bh%t9|QvQpERIsHviR0W7i(=WrE=Qi(|ZGJz@jqJ|h+FP|~ z_1r?O5qn1@koC3aAPLpPUD#UDh@r09H5S2x&1zy)c)7ZbJG&CSTUpkvT{oRhn8kV4 zuQGlyT~!!^<5sX;4p0hwoaoLN+1hzIkE9?hulvoKt@_n?rn6nvw<%t2#CsbvJyb`A zfZeR#smuhXVWd2IVU_AWN1<;CJg+esFg>*2Gklp%2>QY?weKVKSFZ7_dmr0Y*!sfL zzkl1dwir0tdn2Sqaoi-28d*40EocYtaM+d;n7<)M7@#IXG@^Bp^9of^r^l_!JhNab zv_l7)4}M^zi`P1@5qHCSQp4>L58&No&S%4KPXXu`FXFe~&Y6MDu)2YWnID%cw_(d^ zFjozZ(2u0ST7eE2)z{69|IDc>mozp*w+3eXIp46B1=#vXK#xvlZ3ZIeBvPh_9tO#& z(hoZ6Brs?|O`onpdO~2Zr}*=F6KQQ-cdc4k=LGeXlZWZ`<=4)8TmN&VbQ4#Kt3j67 zJ!cZ*%NtFl?D53N43IO$`!B12?aga2d;A1afdGG-;@Yy7mZr{l%eZb8-oMmIbo@Gp zO>;`Kb^sS&NR!t&K6zM2J1eRsk<-?Oy}m-yz%@ZjPQ;C|n(daMM@NAoWQ(YMzcGI)6>kBXsK~QX;n-gIMtk?Vu$M%{1QP%YhA{~batmQ^ze*u z?4Fc6e3bDRgwBQwTl>m#o!Vj4Ya4u6U+*+2oxty$n4o%3Y&&~r_0?Q*BDS1ErxE5< zWATb}o-=t-3jXJ?-O8{X7|f-Oh+qLA9v+-iIUFI?vglE8vk&mQx(h@(N7W4?V4%#MX^uym;0aE;*{rA_w~h@H*qfmq#G8AC9JET(--^^( z6t<4_N1!1VdUi1f(bbUjmOEg=!aKmoEN^+T*3yYVCCjMC>W_oAxMAsZUl5UDmf7mD zO*6)5ICq3C4cZsFk&PyP?I@Ha-*Qx=d`&PxYFKRZ_ot-)QwpcA@Hp`Cnyok$2|D^W zGp~>w$p}&F;tSwHDRp93h(m=(1Z!a+@1JiJLdL3esQ$RM5)22!_|G~uGzp5TQ5j8S zOaaZxfy>uu<4x35$&gxV^E~8j|B08i9tVt>v~al%+U9s_!G2AZ6+w*x7DWvad67`r zNM9M!&@c9Fe!0}#oMZ>i_S0;NnsFEi>l3qyIpOMmU=ib#2E(ZIY|}V@vIHQgv_OzX zVRrID!M1GHX(2w@X4S+Mb=6M&n1l#>Com$88qF_52Z@PM=1L1$b8*{N&)dqQxBfa= znG%Dv==jhC2gZH#7$V;O@r`+Tw&M8s7~<0VgnkbWM&JOem2F zT6V0cq9g|DEX84zJqxIjK%yjRYg-iaX5W8~F~ETEGdDRFFs<%T?*7=GZ(}hwF@Aph z=rivHsrh)>r(K%H6_pfCMhUhxcO;7~OgR2Gnv(v}>2Uw4Or+GX;&un^M~5kIhK+o` zpgL>wZNQ_cHK_sxM%XJhuB#lta+93#gi zXp&2xF3Eqi%pXi8@SS^S3Anp52Ao{Mw=J(ph06W)=4;b7U5|NlXOsW*xclD7FF%iUK9Mksf{e7n~G%Jm)$r^D?@ANZmG&q$~k;)R$+bso~U{ z=u9>yFi}J4)9=*ocOX()iXq8USnn4vasEZ@{i((%>I^1pChvYZ(PyX@-a&xiHeF3M z=zoU}1_!7|z8QQ;n|f@}pB5Ct=YOp+{$-DVxg#17c1B3q36fhzc7bIjY~!2GnDpY8WBN(J zj?@5KG$IQE1kovbaszh=U^ord!Iz0Uw!ry#_BpiXrCezNMnbn_Fh_26&^7pkv`0N+ zSP?-_rC>(J$F@!Frp`Y%(mHO+RIYdQO$9Vnn~m|soxok`GsEOn8j@xTazdzbqb~Z* z*`b`xyr%&@Z$?o$r7D+yL{{dE`nL(OXPtc}hSAdEQWD^$fi_)O`Rl*FuffF3Y|+>P zQZ)IA-}bpi|jqy#NU{dDdQfjS)H$Ce26 zwe>DH9FV>bsm8tJv!g$p>kEq-BI0Y{&%5a8MEzX19hu2LD*OMfu=uec`|*xc=cd}v zvde&7e%hB}>@QDFMWugq%=Y)e0Nu|wdUvUlm%;njd-=~_Z1Gp62!sS|$;i>Xjj&%l zqd?is!~Hq>F>^S;_Wb7F1YoCt1A0xu z6%71O-fed{xw7Ze9=QtdM!(d^V8}gvH+?gJD{OWT*+Jd`pf$VsJ`#Jftu>dAcwuG_Yt5>iRsp+%g1VZ%gB{dV zuL!CZQWWJF)A*>ssoyWD25W57==chp@eNs$?1+~15TZStFNdB4mL}

      HJ1mrn?@)Z;_xkssx}UzPh|e1g$;bI`0sV8l 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�h6rVz`p!WhPU|kK*><+gH%2nmy}cV3NST>$ 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 UW*X!rcndMY`k*cDnFS%{--@tOAOHXW literal 30204 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 diff --git a/doc/salome/gui/SMESH/images/ghs3d_parameters_basic.png b/doc/salome/gui/SMESH/images/ghs3d_parameters_basic.png index 0cce50bb8bf7c93fcbbf19f1eb71c30e1ed7a573..cd92b45fc0317aed0952c14bbdbdf1a2a0850cf9 100644 GIT binary patch literal 14634 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 literal 19585 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 diff --git a/doc/salome/gui/SMESH/images/hypo_quad_params_2.png b/doc/salome/gui/SMESH/images/hypo_quad_params_2.png new file mode 100644 index 0000000000000000000000000000000000000000..9f6fa251ebdac0d3f77c1e3605659a573749d38a GIT binary patch literal 2115 zcma);X;@QN8plJd$TgM5=m=y)MGcFJpj6pW0tkdHY_fzU6d^^>kqUxrfzAc1Odx0o zAQnnlEKdRi*)mWFTm-=)t1KPJ!$gD>kYxnIVj^==+L;eCANoA+%{~9$dEfs%_sw~7 za-ZyMyKgUkFA9a)XK!cihC(TvkzYz^KqN=ij)NO?%g*OEm>-p23PkPvSQKi{n!UB9 zN9>b@3G=TGit%Y8l^pihC)odF=H9^0d1Q4tBtQ4Wp1P(-gRD*B2O!@gj5LL?D?_q` zOQW71)c$d?Qlhdc&iTu1{8U?8XT}DL-EG(^jc{>+?^@OJZ&5)C=kS7@zMgu-2nhITU#^-zckCHoE7 zWK`J8D8j+Zz6M?ZD>``)F(pp!tbPq9n-NI7cNuRO3%G>g2RNpk-H)E_$R*TXHaSm) zbeS!Gy9%(WRW`r_Msj??4&WpP8Q^eX4#57C04w%K0(@@Omx#Hh>JLoR?CEkm6aodE z{5G4csOI7VblPhtkmkDP3eu=T7WT@pB^1J}t_uJehDwhjR{ z+G)-B4{%26r}NQ!5I5pCJ00XLkbd#*N)AXoc4jASycRC7Q+r7$u=&ld{%nz!n_^@U zZD6N}cNsFz8f^Z_Je`dr`pr0Mr$xQ{UQJ#NUd@{es%HmF3+2^k?`j^jGN~ad%E!{V zA5;e!(dWHMN|BoaEil3J{dFP`!CB!OLgnMi`#84hAUE4Uo>al&J!dLb6t-QjfbZB@ zUG$+|@FeDfy?Ewa$$m-*4>auY>7e@>k$(>5J=QH!$JH#LIj?Yt2VNJ@{rNN=Uav^~ zS^0A`XBvl`e0&zrd?wbiY299X}km*o9Lm(Ayo+U9EEJ6)XG+Sa*h7-Ra@k)g{o(G?-e#y;^FZju9^ zXXV`g7R{NL`>2FPrwqr-eGKpc)O}_AG~#y&o2-+s0v`yBTjo>Z==IE3`7d1hhJhb+;S5Cmi1vv z@x9hv?oXi4jE+lge7C7vc3PBiQbOaR7JIxAb^CYS->gu2C}0#J{7zvauMswVI96FC zZXhGJ569R8yZFVhiPli_>I7X4g@Upr-Oiz~!NY6ghNGsT&TnR; z!iUW0N65(JzoHtmx(hCSW^}-!@1WP`>(WD{4Y#t`pqX_&f*C_6AbHcg6c+1u801Z! zBgM98xt|G_*3kolB=*rPT+7Jf0SDDgW{V0LN#EaTI~cQ<@FTBXf5b7owz)=Iofk9_j9nke<+xw*%Uzn;J}!HoP=UfemH-_LI=q+DOC VeC1!&0sa-B>}{N_D~Z&v{|yi6z`Ote literal 0 HcmV?d00001 diff --git a/doc/salome/gui/SMESH/images/hypo_quad_params_res_2.png b/doc/salome/gui/SMESH/images/hypo_quad_params_res_2.png new file mode 100644 index 0000000000000000000000000000000000000000..6dc37e2985484626a1aa80a7aa496fb040e76c8d GIT binary patch literal 9391 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 points 1D hypothesis -Fixed points 1D hypothesis allows to split edges into segments -using set of fixed points given by normalized parameters on edge and -set of numbers of segments for splitting each sub-segment between -fixed points. Optionally it is possible to set flag -Same Nb. Segments for all intervals and -only one value for mentioned number of segments. - -The direction of the splitting is defined by the orientation of the +Fixed points 1D hypothesis allows splitting edges through a +set of points parameterized on the edge (from 1 to 0) and a number of segments for each +interval limited by the points. + +\image html hypo_fixedpnt_dlg.png + +It is possible to check in Same Nb. Segments for all intervals +option and to define one value for all intervals. + +The splitting direction is defined by the orientation of the underlying geometrical edge. "Reverse Edges" list box allows to specify the edges for which the splitting should be made in the -direction opposing to their orientation. This list box is enabled only -if the geometry object is selected for the meshing. In this case the -user can select edges to be reversed either directly picking them in -the 3D viewer or by selecting the edges or groups of edges in the +direction opposite to their orientation. This list box is enabled only +if the geometrical object is selected for meshing. In this case it is +possible to select the edges to be reversed either directly picking them in +the 3D viewer or selecting the edges or groups of edges in the Object browser. -Using of this hypothesis for quadrangle face where main mesh is -created using Quadrangle(Mapping) and NumberOfSegments -hypothesises. Creation hypothesis FixedPoint_1D for submesh on -one edge: +\image html mesh_fixedpnt.png "Example of a submesh on the edge built using Fixed points 1D hypothesis" -\image html hypo_fixedpnt_dlg.png - -Resulting 2D mesh: - -\image html mesh_fixedpnt.png +See Also a sample TUI Script of a +\ref tui_fixed_points "Defining Fixed Points" hypothesis operation. */ diff --git a/doc/salome/gui/SMESH/input/2d_meshing_hypo.doc b/doc/salome/gui/SMESH/input/2d_meshing_hypo.doc index c912c568f..dd42e9962 100644 --- a/doc/salome/gui/SMESH/input/2d_meshing_hypo.doc +++ b/doc/salome/gui/SMESH/input/2d_meshing_hypo.doc @@ -23,6 +23,8 @@ which will compose the mesh of these 2D faces. \image html a-maxelarea.png +\n + \image html max_el_area.png "In this example, Max. element area is very small compared to the 1D hypothesis" See Also a sample TUI Script of a @@ -52,6 +54,18 @@ used as a degenerated edge. \image html hypo_quad_params_res.png "The resulting mesh" +This hypothesis can be also used to mesh a segment of a circular face. +Please, consider that there is a limitation on the selectiion of the degenerated +vertex for the faces built with the angle > 180 degrees (see the picture). + +\image html hypo_quad_params_2.png "3/4 of a circular face" + +In this case, selection of a wrong vertex for the Quadrangle parameters +hypothesis will generate a wrong mesh. The picture below +shows the good (left) and the bad (right) results of meshing. + +\image html hypo_quad_params_res_2.png "The resulting meshes" +
      \anchor quadrangle_preference_anchor

      Quadrangle Preference

      diff --git a/doc/salome/gui/SMESH/input/about_hypo.doc b/doc/salome/gui/SMESH/input/about_hypo.doc index 578823bd6..cc8f5fd52 100644 --- a/doc/salome/gui/SMESH/input/about_hypo.doc +++ b/doc/salome/gui/SMESH/input/about_hypo.doc @@ -28,6 +28,7 @@ them, you operate numerical values):
      • \ref max_element_area_anchor "Max Element Area"
      • \ref length_from_edges_anchor "Length from Edges"
      • +
      • \ref hypo_quad_params_anchor "Quadrangle Parameters"
      • \ref quadrangle_preference_anchor "Quadrangle Preference"
      • \ref triangle_preference_anchor "Triangle Preference"
      diff --git a/doc/salome/gui/SMESH/input/about_meshes.doc b/doc/salome/gui/SMESH/input/about_meshes.doc index 84e84cdcf..8a81c7ea0 100644 --- a/doc/salome/gui/SMESH/input/about_meshes.doc +++ b/doc/salome/gui/SMESH/input/about_meshes.doc @@ -26,6 +26,7 @@ entities including:
      • \b Node — 0D object of a mesh presented by a point with coordinates (x, y, z).
      • +
      • \b 0D element — element of a mesh defined by one node.
      • \b Edge — 1D element of a mesh defined by two nodes.
      • \b Face — 2D element of a mesh defined by three or four edges (closed contour).
      • \b Volume — 3D element of a mesh defined by several faces.
      • diff --git a/doc/salome/gui/SMESH/input/basic_meshing_algos.doc b/doc/salome/gui/SMESH/input/basic_meshing_algos.doc index 7549a121e..a83a64f9f 100644 --- a/doc/salome/gui/SMESH/input/basic_meshing_algos.doc +++ b/doc/salome/gui/SMESH/input/basic_meshing_algos.doc @@ -47,7 +47,7 @@ tetrahedral (pyramidal) elements. \image html image126.gif "Example of a hexahedral 3D mesh"
      -\Note that BLSURF and GHS3D are commercial meshers and require a +\note BLSURF and GHS3D are commercial meshers and require a license to be used within the Mesh module. There is also a number of more specific algorithms: @@ -56,8 +56,7 @@ There is also a number of more specific algorithms:
    1. \subpage radial_prism_algo_page "for meshing geometrical objects with cavities"
    2. \subpage segments_around_vertex_algo_page "for defining the local size of elements around a certain node"
    3. \subpage prism_3d_algo_page "for meshing prismatic shapes"
    4. -
    5. \subpage radial_quadrangle_1D2D_algo_page "for meshing special 2d -faces (circles and part of circles)"
    6. +
    7. \subpage radial_quadrangle_1D2D_algo_page "for meshing special 2d faces (circles and part of circles)"
    8. \ref constructing_meshes_page "Constructing meshes" page describes in diff --git a/doc/salome/gui/SMESH/input/blsurf_hypo.doc b/doc/salome/gui/SMESH/input/blsurf_hypo.doc index ecbd5a74f..03c0fc594 100644 --- a/doc/salome/gui/SMESH/input/blsurf_hypo.doc +++ b/doc/salome/gui/SMESH/input/blsurf_hypo.doc @@ -5,6 +5,8 @@ \n BLSURF Parameters hypothesis works only with BLSURF 2d algorithm. This algorithm is a commercial software. +

      General parameters

      + \image html blsurf_parameters.png
        @@ -53,6 +55,8 @@ two adjacent edges. edges are not respected and all geometrical faces are meshed as one hyper-face. +

        Advanced parameters

        + \image html blsurf_parameters_advanced.png
      • Topology - allows creation of a conform mesh on a shell of @@ -83,12 +87,12 @@ the diagonal of the bounding box of the geometrical object to mesh.
        • topo_eps1 (real) - is the tolerance level inside a CAD -patch. By default is equal to diag × 10-4. This tolerance is used to +patch. By default is equal to diag � 10-4. This tolerance is used to identify nodes to merge within one geometrical face when \b Topology option is to pre-process. Default is diag/10.0.
        • topo_eps2 (real) - is the tolerance level between two CAD -patches. By default is equal to diag × 10-4. This tolerance is used to +patches. By default is equal to diag � 10-4. This tolerance is used to identify nodes to merge over different geometrical faces when \b Topology option is to pre-process. Default is diag/10.0.
        • @@ -199,24 +203,37 @@ String variables:
        • import_option
        +

        Custom size map

        + \image html blsurf_parameters_sizemap.png -It is possible to define user sizes on faces, edges or verteces. +User sizes can be defined on faces, edges or vertices.
          -
        • Those faces, edges and verteces must be sub-shapes (from explode command) of the meshed geometry object.
        • -
        • Groups are currently not handled.
        • -
        • Multi-selection is possible.
        • -
        • The sizes are constant values.
        • +
        • The faces, edges and vertices can belong to the meshed geometrical +object or to its sub-shapes (created using Explode command).
        • +
        • Groups of faces, edges and vertices are also handled.
        • +
        • It is possible to attribute the same size to several geometries using multi-selection.
        • +
        • The sizes are constant values or python functions.
        • +
        • In case of a python function, the following rules must be respected: +
            +
          • The name of the function is f.
          • +
          • If geometry is a face or a group of faces, the function is f(u,v).
          • +
          • If geometry is an edge or a group of edges, the function is f(t).
          • +
          • If geometry is a vertex or a group of vertices, the function is f().
          • +
          • The function must return a double.
          • +

        See Also a sample TUI Script of the \ref tui_blsurf "creation of a BLSurf hypothesis", including size map. \anchor blsurf_sizemap_computation

        Computation of the physical size

        -Here is the detail on the calculation of the size (from BLSurf documentation). \n -The size is obtained by querying sizemap functions associated to the input CAD object for surfaces, curves and points. -Each function can either return a value h (which is then trimmed between the two bounds hphymin and hphymax), or "no answer" (by not assigning a value to h), thus providing great flexibility in the specification of the sizes. The computation depends whether point P is internal to a surface, internal to a curve, or at the end of several curves: +The physical size is obtained by querying sizemap functions associated to the input CAD object for surfaces, curves and points. +Each function can either return a value h (which is then trimmed +between the two bounds hphymin and hphymax), or "no answer" (by not +assigning a value to h), thus providing great flexibility in the +specification of the sizes. The computation depends on whether point P is internal to a surface, internal to a curve, or at the end of several curves:
        • If point P is internal to a surface, the CAD surface size function is queried. If no answer is returned, one interpolates with the values at the vertices of the discretized interface curves.
        • If point P is internal to a curve, the CAD curve size function is queried first. If no answer is returned, the surface size function is queried for every adjacent surface and the mean value of the returned values is computed. If no answer is returned, sizes h1 and h2 at both ends of the curve are considered (see next item) and the interpolated value is computed.
        • @@ -225,7 +242,23 @@ Each function can either return a value h (which is then trimmed between the two In order to compute the mean of several values, the arithmetic mean is used by default, but this can be modified by the parameter \ref blsurf_hmean_flag "hmean flag". In the same way, in order to interpolate two values, a linear interpolation is used by default, but this can be modified by \ref blsurf_hinterpol_flag "hinterpol flag". -\n +

          Custom enforced vertices

          + +\image html blsurf_parameters_enforced_vertices.png + +It is possible to define some enforced vertices to BLSurf algorithm +without creating any vertices by CAD algorithms. +
            +
          • The enforced vertex is the projection of a point defined by its +(x,y,z) coordinates on the selected face.
          • +
          • It is possible to define several enforced vertices on a face or a group of faces.
          • +
          • If the projected point is on the boundary or outside of the face, it will be ignored.
          • +
          + +
          See Also a sample TUI Script of the \ref tui_blsurf "creation of a BLSurf hypothesis", including enforced vertices. + +

          Limitations

          + Currently BLSURF plugin has the following limitations.
          • The created mesh will contain inverted elements if it is based on a shape, diff --git a/doc/salome/gui/SMESH/input/building_compounds.doc b/doc/salome/gui/SMESH/input/building_compounds.doc index faf636b82..98a20c470 100644 --- a/doc/salome/gui/SMESH/input/building_compounds.doc +++ b/doc/salome/gui/SMESH/input/building_compounds.doc @@ -47,4 +47,6 @@ for this operation.
          • \image html image160.gif "Example of a compound of two meshed cubes" +See Also a sample +\ref tui_building_compound "TUI Example of building compounds." */ diff --git a/doc/salome/gui/SMESH/input/constructing_meshes.doc b/doc/salome/gui/SMESH/input/constructing_meshes.doc index be7def6a8..625cff3bd 100644 --- a/doc/salome/gui/SMESH/input/constructing_meshes.doc +++ b/doc/salome/gui/SMESH/input/constructing_meshes.doc @@ -126,7 +126,7 @@ visualizing the geometrical entity that causes it. \image html failed_computation.png "Example of the invalid input mesh" -\Note Mesh Computation Information box does not appear if you set +\note Mesh Computation Information box does not appear if you set "Mesh computation/Show a computation result notification" preference to the "Never" value. This option gives the possibility to control mesh computation reporting. There are the following possibilities: always diff --git a/doc/salome/gui/SMESH/input/convert_to_from_quadratic_mesh.doc b/doc/salome/gui/SMESH/input/convert_to_from_quadratic_mesh.doc index 072a91f7a..5409f487e 100644 --- a/doc/salome/gui/SMESH/input/convert_to_from_quadratic_mesh.doc +++ b/doc/salome/gui/SMESH/input/convert_to_from_quadratic_mesh.doc @@ -37,4 +37,6 @@ The following dialog box will appear:
          • Click the \b Apply or \b OK button.