From 9313a9353cce92fd1c7926b3a2358916822a827e Mon Sep 17 00:00:00 2001 From: smh Date: Fri, 2 Apr 2004 13:33:18 +0000 Subject: [PATCH] SALOME PAL V1_4_1 --- INSTALL | 8 +- Makefile.in | 17 +- adm_local/unix/config_files/check_Geom.m4 | 2 +- adm_local/unix/config_files/check_Med.m4 | 2 +- adm_local/unix/make_commence.in | 20 +- bin/VERSION | 2 +- configure.in.base | 27 +- doc/Makefile.in | 11 +- idl/Makefile.in | 23 +- idl/SMESH_BasicHypothesis.idl | 101 +- idl/SMESH_Gen.idl | 66 +- idl/SMESH_Hypothesis.idl | 17 +- idl/SMESH_Mesh.idl | 115 +- resources/SMESH_en.xml | 270 +- resources/SMESH_fr.xml | 46 +- src/Driver/Makefile.in | 2 +- src/DriverDAT/DriverDAT_W_SMDS_Mesh.cxx | 14 +- src/DriverDAT/DriverDAT_W_SMESHDS_Mesh.cxx | 20 +- src/DriverDAT/Makefile.in | 2 +- src/DriverMED/DriverMED_R_SMESHDS_Mesh.cxx | 1113 +- src/DriverMED/DriverMED_R_SMESHDS_Mesh.h | 56 +- src/DriverMED/DriverMED_W_SMDS_Mesh.cxx | 9 +- src/DriverMED/DriverMED_W_SMESHDS_Mesh.cxx | 1078 +- src/DriverMED/DriverMED_W_SMESHDS_Mesh.h | 60 +- src/DriverMED/Makefile.in | 12 +- src/DriverUNV/DriverUNV_W_SMDS_Mesh.cxx | 21 +- src/DriverUNV/DriverUNV_W_SMESHDS_Mesh.cxx | 21 +- src/DriverUNV/Makefile.in | 2 +- src/Makefile.in | 13 +- src/OBJECT/Makefile.in | 25 +- src/OBJECT/SMESH_Actor.cxx | 1598 ++- src/OBJECT/SMESH_Actor.h | 239 +- src/SMDS/Makefile.in | 2 +- src/SMDS/SMDS_EdgePosition.hxx | 1 - src/SMDS/SMDS_FaceOfEdges.cxx | 65 +- src/SMDS/SMDS_FaceOfEdges.hxx | 13 +- src/SMDS/SMDS_FaceOfNodes.cxx | 77 +- src/SMDS/SMDS_FaceOfNodes.hxx | 13 +- src/SMDS/SMDS_HexahedronOfNodes.cxx | 36 +- src/SMDS/SMDS_HexahedronOfNodes.hxx | 18 +- src/SMDS/SMDS_Iterator.hxx | 6 +- src/SMDS/SMDS_IteratorOfElements.cxx | 23 +- src/SMDS/SMDS_IteratorOfElements.hxx | 10 +- src/SMDS/SMDS_Mesh.cxx | 1476 +-- src/SMDS/SMDS_Mesh.hxx | 458 +- src/SMDS/SMDS_MeshEdge.cxx | 63 +- src/SMDS/SMDS_MeshEdge.hxx | 7 +- src/SMDS/SMDS_MeshElement.cxx | 69 +- src/SMDS/SMDS_MeshElement.hxx | 13 +- src/SMDS/SMDS_MeshElementIDFactory.cxx | 24 + src/SMDS/SMDS_MeshElementIDFactory.hxx | 3 +- src/SMDS/SMDS_MeshGroup.cxx | 64 +- src/SMDS/SMDS_MeshGroup.hxx | 55 +- src/SMDS/SMDS_MeshIDFactory.cxx | 2 +- src/SMDS/SMDS_MeshNode.cxx | 158 +- src/SMDS/SMDS_MeshNode.hxx | 11 +- src/SMDS/SMDS_MeshObject.hxx | 3 +- src/SMDS/SMDS_Position.hxx | 6 +- src/SMDS/SMDS_SpacePosition.cxx | 6 +- src/SMDS/SMDS_SpacePosition.hxx | 3 +- src/SMDS/SMDS_Tria3OfNodes.cxx | 66 +- src/SMDS/SMDS_Tria3OfNodes.hxx | 7 +- src/SMDS/SMDS_VertexPosition.hxx | 1 - src/SMDS/SMDS_VolumeOfFaces.cxx | 80 +- src/SMDS/SMDS_VolumeOfFaces.hxx | 29 +- src/SMDS/SMDS_VolumeOfNodes.cxx | 101 +- src/SMDS/SMDS_VolumeOfNodes.hxx | 48 +- src/SMESH/Makefile.in | 39 +- src/SMESH/SMESH_1D_Algo.cxx | 45 - src/SMESH/SMESH_1D_Algo.hxx | 7 - src/SMESH/SMESH_2D_Algo.cxx | 45 - src/SMESH/SMESH_2D_Algo.hxx | 7 - src/SMESH/SMESH_3D_Algo.cxx | 45 - src/SMESH/SMESH_3D_Algo.hxx | 7 - src/SMESH/SMESH_Algo.cxx | 97 +- src/SMESH/SMESH_Algo.hxx | 39 +- src/SMESH/SMESH_Gen.cxx | 759 +- src/SMESH/SMESH_Gen.hxx | 84 +- src/SMESH/SMESH_Hypothesis.cxx | 34 +- src/SMESH/SMESH_Hypothesis.hxx | 28 +- src/SMESH/SMESH_Mesh.cxx | 551 +- src/SMESH/SMESH_Mesh.hxx | 71 +- src/SMESH/SMESH_subMesh.cxx | 1911 ++-- src/SMESH/SMESH_subMesh.hxx | 199 +- src/SMESHDS/Makefile.in | 8 +- src/SMESHDS/SMESHDS_Mesh.cxx | 438 +- src/SMESHDS/SMESHDS_Mesh.hxx | 244 +- src/SMESHDS/SMESHDS_SubMesh.cxx | 27 +- src/SMESHDS/SMESHDS_SubMesh.hxx | 8 +- src/SMESHFiltersSelection/SMESH_Type.h | 3 +- .../SMESH_TypeFilter.cxx | 53 +- src/SMESHGUI/Makefile.in | 46 +- src/SMESHGUI/SMESHGUI.cxx | 9039 +++++++---------- src/SMESHGUI/SMESHGUI.h | 99 +- src/SMESHGUI/SMESHGUI_AddEdgeDlg.cxx | 6 +- src/SMESHGUI/SMESHGUI_AddFaceDlg.cxx | 6 +- src/SMESHGUI/SMESHGUI_AddSubMeshDlg.cxx | 554 +- src/SMESHGUI/SMESHGUI_AddSubMeshDlg.h | 53 +- src/SMESHGUI/SMESHGUI_AddVolumeDlg.cxx | 6 +- .../SMESHGUI_DiagonalInversionDlg.cxx | 4 +- src/SMESHGUI/SMESHGUI_EditHypothesesDlg.cxx | 1004 +- src/SMESHGUI/SMESHGUI_EditHypothesesDlg.h | 87 +- src/SMESHGUI/SMESHGUI_InitMeshDlg.cxx | 418 +- src/SMESHGUI/SMESHGUI_InitMeshDlg.h | 49 +- src/SMESHGUI/SMESHGUI_MeshInfosDlg.cxx | 738 +- src/SMESHGUI/SMESHGUI_MeshInfosDlg.h | 92 +- src/SMESHGUI/SMESHGUI_MoveNodesDlg.cxx | 13 +- src/SMESHGUI/SMESHGUI_NodesDlg.cxx | 8 +- .../SMESHGUI_OrientationElementsDlg.cxx | 6 +- .../SMESHGUI_Preferences_ScalarBarDlg.cxx | 831 +- .../SMESHGUI_Preferences_ScalarBarDlg.h | 107 +- src/SMESHGUI/SMESHGUI_RemoveElementsDlg.cxx | 6 +- src/SMESHGUI/SMESHGUI_RemoveNodesDlg.cxx | 6 +- src/SMESHGUI/SMESHGUI_StudyAPI.cxx | 284 +- src/SMESHGUI/SMESHGUI_StudyAPI.h | 14 +- src/SMESHGUI/SMESHGUI_Swig.cxx | 26 + src/SMESHGUI/SMESHGUI_TransparencyDlg.cxx | 224 +- src/SMESHGUI/SMESHGUI_TransparencyDlg.h | 42 +- src/SMESHGUI/SMESH_icons.po | 67 +- src/SMESHGUI/SMESH_msg_en.po | 536 +- src/SMESH_I/Makefile.in | 67 +- src/SMESH_I/SMESH_1D_Algo_i.cxx | 34 +- src/SMESH_I/SMESH_1D_Algo_i.hxx | 21 +- src/SMESH_I/SMESH_2D_Algo_i.cxx | 34 +- src/SMESH_I/SMESH_2D_Algo_i.hxx | 21 +- src/SMESH_I/SMESH_3D_Algo_i.cxx | 34 +- src/SMESH_I/SMESH_3D_Algo_i.hxx | 21 +- src/SMESH_I/SMESH_Algo_i.cxx | 54 +- src/SMESH_I/SMESH_Algo_i.hxx | 22 +- src/SMESH_I/SMESH_Gen_i.cxx | 3469 ++++--- src/SMESH_I/SMESH_Gen_i.hxx | 332 +- src/SMESH_I/SMESH_Hypothesis_i.cxx | 116 +- src/SMESH_I/SMESH_Hypothesis_i.hxx | 68 +- src/SMESH_I/SMESH_MEDMesh_i.cxx | 24 +- src/SMESH_I/SMESH_MEDSupport_i.cxx | 6 +- src/SMESH_I/SMESH_MeshEditor_i.cxx | 10 +- src/SMESH_I/SMESH_Mesh_i.cxx | 836 +- src/SMESH_I/SMESH_Mesh_i.hxx | 89 +- src/SMESH_I/SMESH_subMesh_i.cxx | 121 +- src/SMESH_I/SMESH_subMesh_i.hxx | 15 +- src/SMESH_I/SMESH_test.py | 26 +- src/SMESH_I/smeshpy.py | 11 +- src/SMESH_SWIG/Makefile.in | 10 +- src/SMESH_SWIG/SMESH_Partition1_tetra.py | 472 +- src/SMESH_SWIG/SMESH_box2_tetra.py | 114 +- src/SMESH_SWIG/SMESH_box3_tetra.py | 114 +- src/SMESH_SWIG/SMESH_box_tetra.py | 120 +- src/SMESH_SWIG/SMESH_fixation.py | 7 +- src/SMESH_SWIG/SMESH_fixation_hexa.py | 79 +- src/SMESH_SWIG/SMESH_fixation_tetra.py | 113 +- src/SMESH_SWIG/SMESH_flight_skin.py | 94 +- src/SMESH_SWIG/SMESH_mechanic.py | 237 +- src/SMESH_SWIG/SMESH_mechanic_tetra.py | 122 +- src/SMESH_SWIG/SMESH_test0.py | 3 - src/SMESH_SWIG/SMESH_test1.py | 130 +- src/SMESH_SWIG/SMESH_test2.py | 4 +- src/SMESH_SWIG/SMESH_test3.py | 3 - src/SMESH_SWIG/batchmode_smesh.py | 211 +- 158 files changed, 18478 insertions(+), 15935 deletions(-) diff --git a/INSTALL b/INSTALL index c090b5ab4..b6c40125f 100644 --- a/INSTALL +++ b/INSTALL @@ -1,6 +1,6 @@ -This is SMESH V1_4_0 +This is SMESH V1_4_1 Compatible with : - GEOM V1_4_0 - KERNEL V1_4_0 - MED V1_4_0 + GEOM V1_4_1 + KERNEL V1_4_1 + MED V1_4_1 diff --git a/Makefile.in b/Makefile.in index ac708eff5..a79be56d3 100644 --- a/Makefile.in +++ b/Makefile.in @@ -14,7 +14,7 @@ VPATH=.:@srcdir@:@top_srcdir@/bin:@top_srcdir@/resources:./bin:@top_srcdir@/idl @COMMENCE@ -SUBDIRS = idl src +SUBDIRS = idl src doc RESOURCES_FILES = \ delete.png \ @@ -40,6 +40,8 @@ mesh_hypo_volume.png \ mesh_info.png \ mesh_init.png \ mesh_length.png \ +mesh_free_edges.png \ +mesh_multi_edges.png \ mesh_line_n.png \ mesh_line.png \ mesh_move_node.png \ @@ -71,6 +73,7 @@ mesh_tree_hypo.png \ mesh_tree_hypo_segment.png \ mesh_tree_hypo_volume.png \ mesh_tree_mesh.png \ +mesh_tree_importedmesh.png \ mesh_tree_mesh_warn.png \ mesh_triangle_n.png \ mesh_triangle.png \ @@ -78,10 +81,16 @@ mesh_update.png \ mesh_vertex_n.png \ mesh_vertex.png \ mesh_wireframe.png \ +mesh_points.png \ mesh_wrap.png \ +mesh_tree_group.png \ +mesh_edit_group.png \ +mesh_make_group.png \ ModuleMesh.png \ select1.png \ SMESH_en.xml \ +SMESH.config \ +StdMeshers.xml \ SMESHCatalog.xml \ flight_solid.brep @@ -104,10 +113,10 @@ include/salome/SALOMEconfig.h: salome_adm/unix/SALOMEconfig.ref # test if SALOMEconfig.h has changed (contents) salome_adm/unix/SALOMEconfig.ref: salome_adm/unix/SALOMEconfig.h @if ! [ -a $@ ]; then \ - cp -p $< $@; \ + cp -p -f $< $@; \ fi; \ if ! cmp $< $@; then \ - cp -p $< $@; \ + cp -p -f $< $@; \ fi; \ include/salome/sstream: salome_adm/unix/sstream @@ -131,7 +140,7 @@ install-include: $(include_list) $(INSTALL) -d $(includedir) @for f in X $(include_list); do \ if test $$f != X; then \ - ($(INSTALL_DATA) $$f $(includedir)/. || exit 1); \ + ($(INSTALL_DATA) -p $$f $(includedir)/. || exit 1); \ fi; \ done diff --git a/adm_local/unix/config_files/check_Geom.m4 b/adm_local/unix/config_files/check_Geom.m4 index 947c44a12..803ca754b 100644 --- a/adm_local/unix/config_files/check_Geom.m4 +++ b/adm_local/unix/config_files/check_Geom.m4 @@ -47,7 +47,7 @@ if test -f ${GEOM_DIR}/bin/salome/libGEOM_Swig.py ; then else AC_MSG_WARN("Cannot find compiled Geom module distribution") fi - + AC_MSG_RESULT(for Geom: $Geom_ok) ])dnl diff --git a/adm_local/unix/config_files/check_Med.m4 b/adm_local/unix/config_files/check_Med.m4 index 839a3d7be..492727053 100644 --- a/adm_local/unix/config_files/check_Med.m4 +++ b/adm_local/unix/config_files/check_Med.m4 @@ -45,7 +45,7 @@ if test -f ${MED_DIR}/bin/salome/libMEDMEM_Swig.py ; then AC_SUBST(MED_ROOT_DIR) else - AC_MSG_WARN("Cannot find compiled Med module distribution") + AC_MSG_WARN("Cannot find Med module sources") fi AC_MSG_RESULT(for Med: $Med_ok) diff --git a/adm_local/unix/make_commence.in b/adm_local/unix/make_commence.in index a42b18798..ad1a9a52f 100644 --- a/adm_local/unix/make_commence.in +++ b/adm_local/unix/make_commence.in @@ -34,6 +34,10 @@ CXX = @CXX@ CXXFLAGS = @CXXFLAGS@ CXX_DEPEND_FLAG = @CXX_DEPEND_FLAG@ +# BOOST Library + +BOOST_CPPFLAGS = @BOOST_CPPFLAGS@ + # JAVA JAVA_INCLUDES = @JAVA_INCLUDES@ @@ -127,7 +131,8 @@ OMNIORB_CXXFLAGS = @OMNIORB_CXXFLAGS@ OMNIORB_IDL = @OMNIORB_IDL@ OMNIORB_IDLCXXFLAGS = @OMNIORB_IDLCXXFLAGS@ -OMNIORB_IDLPYFLAGS = @OMNIORB_IDLPYFLAGS@ -I$(top_srcdir)/idl -I$(top_builddir)/idl -I$(KERNEL_ROOT_DIR)/idl/salome -I$(GEOM_ROOT_DIR)/idl/salome -I$(MED_ROOT_DIR)/idl/salome +OMNIORB_IDLPYFLAGS = @OMNIORB_IDLPYFLAGS@ -I$(top_srcdir)/idl -I$(top_builddir)/idl/salome \ + -I$(KERNEL_ROOT_DIR)/idl/salome -I$(GEOM_ROOT_DIR)/idl/salome -I$(MED_ROOT_DIR)/idl/salome OMNIORB_IDL_CLN_H = @OMNIORB_IDL_CLN_H@ OMNIORB_IDL_CLN_CXX = @OMNIORB_IDL_CLN_CXX@ @@ -144,7 +149,8 @@ CORBA_INCLUDES = @CORBA_INCLUDES@ CORBA_LIBS = @CORBA_LIBS@ CORBA_CXXFLAGS = @CORBA_CXXFLAGS@ -IDLCXXFLAGS = -bcxx @IDLCXXFLAGS@ -I$(top_srcdir)/idl -I$(top_builddir)/idl -I$(KERNEL_ROOT_DIR)/idl/salome -I$(GEOM_ROOT_DIR)/idl/salome -I$(MED_ROOT_DIR)/idl/salome +IDLCXXFLAGS = -bcxx @IDLCXXFLAGS@ -I$(top_srcdir)/idl -I$(top_builddir)/idl/salome \ + -I$(KERNEL_ROOT_DIR)/idl/salome -I$(GEOM_ROOT_DIR)/idl/salome -I$(MED_ROOT_DIR)/idl/salome IDLPYFLAGS = @IDLPYFLAGS@ IDL = @IDL@ @@ -195,13 +201,13 @@ datadir=@datadir@/salome idldir=$(prefix)/idl/salome sharedpydir=@libdir@/python$(PYTHON_VERSION)/site-packages/salome/shared_modules -docdir=$(datadir)/doc +docdir=${prefix}/doc/salome # # begin of package rules # -.PHONY: all lib bin inc resources tests install uninstall dep depend depend_idl cleandep mostlyclean clean distclean +.PHONY: all lib bin inc resources docs tests install uninstall dep depend depend_idl cleandep mostlyclean clean distclean .SUFFIXES: .cxx .cc .c .f .o .lo .idl .py .i .ui .po .qm @@ -243,11 +249,7 @@ ac_cxx_namespaces.m4 check_omniorb.m4 pyembed.m4 \ ac_cxx_partial_specialization.m4 check_opengl.m4 python.m4 \ ac_cxx_typename.m4 check_pthreads.m4 check_cas.m4 \ ac_cc_warnings.m4 check_qt.m4 check_med2.m4 \ -check_swig.m4 - -#ifeq (@WITHNETGEN@,yes) -# ACLOCAL_SRC += check_Netgen.m4 -#endif +check_swig.m4 check_boost.m4 $(top_srcdir)/aclocal.m4: $(ACLOCAL_SRC:%=@KERNEL_ROOT_DIR@/salome_adm/unix/config_files/%) cd $(top_srcdir) ; aclocal --acdir=adm_local/unix/config_files -I @KERNEL_ROOT_DIR@/salome_adm/unix/config_files diff --git a/bin/VERSION b/bin/VERSION index 37cafc3cc..6d0bea42a 100755 --- a/bin/VERSION +++ b/bin/VERSION @@ -1,2 +1,2 @@ -THIS IS SALOME - SMESH VERSION: 1.4.0 +THIS IS SALOME - SMESH VERSION: 1.4.1 diff --git a/configure.in.base b/configure.in.base index f2e7919b0..5573498ca 100644 --- a/configure.in.base +++ b/configure.in.base @@ -113,6 +113,14 @@ dnl AC_CXX_HAVE_SSTREAM +echo +echo --------------------------------------------- +echo BOOST Library +echo --------------------------------------------- +echo + +CHECK_BOOST + dnl dnl --------------------------------------------- dnl testing MPICH @@ -273,14 +281,6 @@ echo CHECK_MED -echo -echo --------------------------------------------- -echo Testing Netgen -echo --------------------------------------------- -echo - -CHECK_NETGEN - echo echo --------------------------------------------- echo Summary @@ -288,7 +288,7 @@ echo --------------------------------------------- echo echo Configure -variables="cc_ok lex_yacc_ok python_ok swig_ok threads_ok OpenGL_ok qt_ok vtk_ok hdf5_ok med2_ok omniORB_ok occ_ok doxygen_ok graphviz_ok Kernel_ok Geom_ok Med_ok Netgen_ok" +variables="cc_ok boost_ok lex_yacc_ok python_ok swig_ok threads_ok OpenGL_ok qt_ok vtk_ok hdf5_ok med2_ok omniORB_ok occ_ok doxygen_ok graphviz_ok Kernel_ok Geom_ok Med_ok" for var in $variables do @@ -318,7 +318,7 @@ else fi # make other build directories -for rep in salome_adm adm_local doc bin/salome include/salome lib/salome share/salome/resources share/salome/doc idl +for rep in salome_adm adm_local doc bin/salome include/salome lib/salome share/salome/resources idl do # if test ! -d $rep ; then # eval mkdir $rep @@ -351,14 +351,15 @@ dnl copy shells and utilities contained in the bin directory dnl excluding .in files (treated in AC-OUTPUT below) and CVS dnl directory -cd bin +mkdir -p bin/salome +cd bin/salome for i in $ROOT_SRCDIR/bin/* do local_bin=`echo $i | sed -e "s,$ROOT_SRCDIR,.,"` case "$local_bin" in *.in | *~) ;; - ./bin/CVS) ;; - *) ln -fs $i; echo $local_bin ;; + ./bin/CVS | ./bin/salome) ;; + *) /usr/bin/install -C $i .; echo $local_bin ;; esac done cd $ROOT_BUILDDIR diff --git a/doc/Makefile.in b/doc/Makefile.in index 019015971..7295ede75 100644 --- a/doc/Makefile.in +++ b/doc/Makefile.in @@ -11,9 +11,11 @@ top_builddir=.. srcdir=@srcdir@ VPATH=.:@srcdir@ -SUBDIRS=html +SUBDIRS= salome -doc: +@COMMENCE@ + +docs: @@SETX@; for d in $(SUBDIRS); do \ (cd $$d && $(MAKE) $@) || exit 1; \ done @@ -31,3 +33,8 @@ install: @@SETX@; for d in $(SUBDIRS); do \ (cd $$d && $(MAKE) $@) || exit 1; \ done + +uninstall: + @@SETX@; for d in $(SUBDIRS); do \ + (cd $$d && $(MAKE) $@) || exit 1; \ + done diff --git a/idl/Makefile.in b/idl/Makefile.in index c53a07895..40a4c84f2 100644 --- a/idl/Makefile.in +++ b/idl/Makefile.in @@ -6,7 +6,7 @@ top_srcdir=@top_srcdir@ top_builddir=.. srcdir=@srcdir@ -VPATH=.:$(srcdir):${KERNEL_ROOT_DIR}/idl/salome:${GEOM_ROOT_DIR}/idl/salome:${MED_ROOT_DIR}/idl/salome +VPATH=.:${KERNEL_ROOT_DIR}/idl/salome:${GEOM_ROOT_DIR}/idl/salome:${MED_ROOT_DIR}/idl/salome @COMMENCE@ @@ -14,16 +14,21 @@ IDL_FILES = \ SMESH_Gen.idl \ SMESH_Mesh.idl \ SMESH_Hypothesis.idl \ - SMESH_BasicHypothesis.idl + SMESH_BasicHypothesis.idl \ + SMESH_Filter.idl \ + SMESH_Group.idl PY_CLIENT_IDL = $(IDL_FILES) # we copy all idl file in $(top_builddir)/idl -inc: $(IDL_FILES:%=$(top_builddir)/idl/%) +inc: $(top_builddir)/idl/salome $(IDL_FILES:%=$(top_builddir)/idl/salome/%) -$(IDL_FILES:%=$(top_builddir)/idl/%):$(top_builddir)/idl/%:% +$(top_builddir)/idl/salome: + mkdir $@ + +$(IDL_FILES:%=$(top_builddir)/idl/salome/%):$(IDL_FILES:%=$(top_srcdir)/idl/%) # $(CP) $< $@ - cp -f $< $@ + cp -f $^ $(top_builddir)/idl/salome lib: pyidl @@ -35,7 +40,7 @@ pyidl: $(PYTHON_BUILD_SITE) $(IDL_FILES:%.idl=$(PYTHON_BUILD_SITE)/%_idl.py) $(PYTHON_BUILD_SITE): $(INSTALL) -d $@ -$(PYTHON_BUILD_SITE)/%_idl.py: %.idl +$(PYTHON_BUILD_SITE)/%_idl.py: $(top_builddir)/idl/salome/%.idl $(OMNIORB_IDL) $(OMNIORB_IDLPYFLAGS) -C$(PYTHON_BUILD_SITE) $< @@ -43,12 +48,12 @@ $(PYTHON_BUILD_SITE)/%_idl.py: %.idl install: install-pyidl install-idl # create directory $(idldir) and copy idl files into it -install-idl: $(IDL_FILES) +install-idl: $(IDL_FILES:%=$(top_builddir)/idl/salome/%) $(INSTALL) -d $(idldir) $(INSTALL_DATA) $^ $(idldir) -install-pyidl: $(IDL_FILES) +install-pyidl: $(IDL_FILES:%=$(top_builddir)/idl/salome/%) $(INSTALL) -d $(PYTHON_SITE_INSTALL) @for file in $^ dummy; do \ if [ $$file != "dummy" ]; then \ @@ -63,6 +68,6 @@ cleandep: distclean: -$(RM) *.py - -$(RM) $(IDL_FILES:%=$(top_builddir)/idl/%) + -$(RM) $(IDL_FILES:%=$(top_builddir)/idl/salome/%) -$(RM) Makefile diff --git a/idl/SMESH_BasicHypothesis.idl b/idl/SMESH_BasicHypothesis.idl index f6a37655c..9987c2c44 100644 --- a/idl/SMESH_BasicHypothesis.idl +++ b/idl/SMESH_BasicHypothesis.idl @@ -30,67 +30,142 @@ #include "SMESH_Hypothesis.idl" -module SMESH +/*! + * StdMeshers: interfaces to standard hypotheses and algorithms + */ +module StdMeshers { - interface SMESH_LocalLength : SMESH_Hypothesis + /*! + * StdMeshers_LocalLength: interface of "Average length" hypothesis + */ + interface StdMeshers_LocalLength : SMESH::SMESH_Hypothesis { + /*! + * Sets parameter value + */ void SetLength(in double length) raises (SALOME::SALOME_Exception); + + /*! + * Returns parameter value + */ double GetLength(); }; - interface SMESH_NumberOfSegments : SMESH_Hypothesis + /*! + * StdMeshers_NumberOfSegments: interface of "Nb. Segments" hypothesis + */ + interface StdMeshers_NumberOfSegments : SMESH::SMESH_Hypothesis { + /*! + * Sets parameter value + */ void SetNumberOfSegments(in long segmentsNumber) raises (SALOME::SALOME_Exception); + + /*! + * Returns parameter value + */ long GetNumberOfSegments(); + + /*! + * Sets parameter value + */ void SetScaleFactor(in double scaleFactor) raises (SALOME::SALOME_Exception); + + /*! + * Returns parameter value + */ double GetScaleFactor(); }; - interface SMESH_MaxElementArea : SMESH_Hypothesis + /*! + * StdMeshers_MaxElementArea: interface of "Max. Triangle Area" hypothesis + */ + interface StdMeshers_MaxElementArea : SMESH::SMESH_Hypothesis { + /*! + * Sets parameter value + */ void SetMaxElementArea(in double area) raises (SALOME::SALOME_Exception); + + /*! + * Returns parameter value + */ double GetMaxElementArea(); }; - interface SMESH_LengthFromEdges : SMESH_Hypothesis + /*! + * StdMeshers_LengthFromEdges: interface of "Length From Edges (2D Hyp. for Triangulator)" hypothesis + */ + interface StdMeshers_LengthFromEdges : SMESH::SMESH_Hypothesis { + /*! + * Sets parameter value + */ void SetMode(in long mode) raises (SALOME::SALOME_Exception); + + /*! + * Returns parameter value + */ long GetMode(); }; - interface SMESH_MaxElementVolume : SMESH_Hypothesis + /*! + * StdMeshers_MaxElementVolume: interface of "Max. Hexahedron or Tetrahedron Volume" hypothesis + */ + interface StdMeshers_MaxElementVolume : SMESH::SMESH_Hypothesis { + /*! + * Sets parameter value + */ void SetMaxElementVolume(in double volume) raises (SALOME::SALOME_Exception); + + /*! + * Returns parameter value + */ double GetMaxElementVolume(); }; - interface SMESH_Regular_1D : SMESH_1D_Algo + /*! + * StdMeshers_NotConformAllowed: interface of "Not Conform Mesh Allowed" hypothesis. + * Presence of this hypothesis permits to algorithm generation of not conform mesh. + */ + interface StdMeshers_NotConformAllowed : SMESH::SMESH_Hypothesis { }; - interface SMESH_MEFISTO_2D : SMESH_2D_Algo + /*! + * StdMeshers_Regular_1D: interface of "Wire discretisation" algorithm + */ + interface StdMeshers_Regular_1D : SMESH::SMESH_1D_Algo { }; - interface SMESH_Quadrangle_2D : SMESH_2D_Algo + /*! + * StdMeshers_MEFISTO_2D: interface of "Triangle (Mefisto)" algorithm + */ + interface StdMeshers_MEFISTO_2D : SMESH::SMESH_2D_Algo { }; - interface SMESH_Hexa_3D : SMESH_3D_Algo + /*! + * StdMeshers_Quadrangle_2D: interface of "Quadrangle (Mapping)" algorithm + */ + interface StdMeshers_Quadrangle_2D : SMESH::SMESH_2D_Algo { }; -#ifdef HAVE_NETGEN - interface SMESH_NETGEN_3D : SMESH_3D_Algo + /*! + * StdMeshers_Hexa_3D: interface of "Hexahedron (i,j,k)" algorithm + */ + interface StdMeshers_Hexa_3D : SMESH::SMESH_3D_Algo { }; -#endif }; diff --git a/idl/SMESH_Gen.idl b/idl/SMESH_Gen.idl index c30750bf0..390813d48 100644 --- a/idl/SMESH_Gen.idl +++ b/idl/SMESH_Gen.idl @@ -39,19 +39,35 @@ module SMESH { typedef sequence shape_array; + typedef sequence mesh_array; + + interface FilterManager; interface SMESH_Gen : Engines::Component, SALOMEDS::Driver { + + FilterManager CreateFilterManager(); + + /*! + Set the current study + */ + void SetCurrentStudy( in SALOMEDS::Study theStudy ); + /*! - * Create an hypothesis that can be shared by differents parts of the mesh. + Get the current study + */ + SALOMEDS::Study GetCurrentStudy(); + + /*! + * Create a hypothesis that can be shared by differents parts of the mesh. * An hypothesis is either: * - a method used to generate or modify a part of the mesh (algorithm). * - a parameter or a law used by an algorithm. * Algorithms are 1D, 2D or 3D. */ - SMESH_Hypothesis CreateHypothesis( in string anHyp, - in long studyId) - raises (SALOME::SALOME_Exception); + SMESH_Hypothesis CreateHypothesis( in string theHypName, + in string theLibName ) + raises ( SALOME::SALOME_Exception ); /*! * Create a Mesh object, given a geometry shape. @@ -60,49 +76,51 @@ module SMESH * of TopoDS_Shapes and bind CORBA references of shape & subshapes * with TopoDS_Shapes */ - SMESH_Mesh Init(in GEOM::GEOM_Gen geomEngine, - in long studyId, - in GEOM::GEOM_Shape aShape) - raises (SALOME::SALOME_Exception); + SMESH_Mesh CreateMesh( in GEOM::GEOM_Shape theShape ) + raises ( SALOME::SALOME_Exception ); + + /*! + * Create Mesh object(s) importing data from given MED file + */ + mesh_array CreateMeshesFromMED( in string theFileName, + out SMESH::DriverMED_ReadStatus theStatus ) + raises ( SALOME::SALOME_Exception ); /*! * Create a Mesh object, without a geometry shape reference */ -// SMESH_Mesh NewEmpty(in GEOM::GEOM_Gen geomEngine, -// in long studyId) -// raises (SALOME::SALOME_Exception); +// SMESH_Mesh NewEmpty() +// raises ( SALOME::SALOME_Exception ); /*! * Mesh a subShape. * First, verify list of hypothesis associated with the subShape, * return NOK if hypothesis are not sufficient */ - boolean Compute(in SMESH_Mesh aMesh, in GEOM::GEOM_Shape aSubShape) - raises (SALOME::SALOME_Exception); + boolean Compute( in SMESH_Mesh theMesh, + in GEOM::GEOM_Shape theSubShape ) + raises ( SALOME::SALOME_Exception ); /*! * */ - boolean IsReadyToCompute(in SMESH_Mesh aMesh, in GEOM::GEOM_Shape aSubShape) - raises (SALOME::SALOME_Exception); + boolean IsReadyToCompute( in SMESH_Mesh theMesh, + in GEOM::GEOM_Shape theSubShape ) + raises ( SALOME::SALOME_Exception ); /*! * */ - long_array GetSubShapesId(in GEOM::GEOM_Gen geomEngine, - in long studyId, - in GEOM::GEOM_Shape mainShape, - in shape_array listOfSubShape) - raises (SALOME::SALOME_Exception); + long_array GetSubShapesId( in GEOM::GEOM_Shape theMainShape, + in shape_array theListOfSubShape ) + raises ( SALOME::SALOME_Exception ); /*! * */ - // long_array GetSubMeshesState(in GEOM::GEOM_Gen geomEngine, - // in long studyId, - // in shape_array listOfSubShape) - // raises (SALOME::SALOME_Exception); + // long_array GetSubMeshesState( in shape_array theListOfSubShape ) + // raises ( SALOME::SALOME_Exception ); }; diff --git a/idl/SMESH_Hypothesis.idl b/idl/SMESH_Hypothesis.idl index e3e82b80c..6389d724f 100644 --- a/idl/SMESH_Hypothesis.idl +++ b/idl/SMESH_Hypothesis.idl @@ -27,26 +27,29 @@ #define _SMESH_HYPOTHESIS_IDL_ #include "SALOME_Exception.idl" +#include "SALOME_GenericObj.idl" module SMESH { - interface SMESH_Hypothesis; - - typedef sequence ListOfHypothesis; - typedef sequence ListOfHypothesisName; - - interface SMESH_Hypothesis + interface SMESH_Hypothesis : SALOME::GenericObj { /*! * Get the Hypothesis typeName */ string GetName(); + /*! + * Get the Hypothesis plugin library Name + */ + string GetLibName(); + /*! * Get the internal Id */ long GetId(); - }; + }; + + typedef sequence ListOfHypothesisName; interface SMESH_Algo : SMESH_Hypothesis { diff --git a/idl/SMESH_Mesh.idl b/idl/SMESH_Mesh.idl index a051ada9d..b81acf6a0 100644 --- a/idl/SMESH_Mesh.idl +++ b/idl/SMESH_Mesh.idl @@ -27,13 +27,30 @@ #define _SMESH_MESH_IDL_ #include "SALOME_Exception.idl" -#include "SMESH_Hypothesis.idl" +//#include "SMESH_Hypothesis.idl" + +#include "SALOME_GenericObj.idl" +//#include "GEOM_Shape.idl" +//#include "MED.idl" + +module GEOM +{ + interface GEOM_Shape; +}; + + +module SALOME_MED +{ + interface MESH; + interface FAMILY; +}; -#include "GEOM_Shape.idl" -#include "MED.idl" module SMESH { + interface SMESH_Hypothesis; + typedef sequence ListOfHypothesis; + typedef sequence double_array ; typedef sequence long_array ; typedef sequence string_array ; @@ -59,12 +76,56 @@ module SMESH double_array coords; long_array indexes; }; + + + /*! + * Enumeration for element type, like in SMDS + */ + enum ElementType + { + ALL, + NODE, + EDGE, + FACE, + VOLUME + }; + + /*! + * Enumeration for hypothesis status (used by AddHypothesis() and RemoveHypothesis() methods) + */ + enum Hypothesis_Status // in the order of severity + { + HYP_OK, + HYP_MISSING, // algo misses a hypothesis + HYP_CONCURENT, // several applicable hypotheses + HYP_BAD_PARAMETER,// hypothesis has a bad parameter value + HYP_UNKNOWN_FATAL,// --- all statuses below should be considered as fatal + // for Add/RemoveHypothesis operations + HYP_INCOMPATIBLE, // hypothesis does not fit algo + HYP_NOTCONFORM, // not conform mesh is produced appling a hypothesis + HYP_ALREADY_EXIST,// such hypothesis already exist + HYP_BAD_DIM // bad dimension + }; + /*! + * Enumeration for DriverMED read status (used by ImportMEDFile() method) + */ + enum DriverMED_ReadStatus // in the order of severity + { + DRS_OK, + DRS_EMPTY, // a MED file contains no mesh with the given name + DRS_WARN_RENUMBER, // a MED file has overlapped ranges of element numbers, + // so the numbers from the file are ignored + DRS_WARN_SKIP_ELEM, // some elements were skipped due to incorrect file data + DRS_FAIL // general failure (exception etc.) + }; + typedef sequence log_array; + interface SMESH_Group; interface SMESH_subMesh; interface SMESH_MeshEditor; - interface SMESH_Mesh + interface SMESH_Mesh : SALOME::GenericObj { /*! * Associate a Shape to a Mesh created with NewEmpty @@ -79,7 +140,7 @@ module SMESH * SubMesh will be used instead of SubShape in a next idl version to * adress a specific subMesh... */ - SMESH_subMesh GetElementsOnShape(in GEOM::GEOM_Shape aSubShape) + SMESH_subMesh GetSubMesh(in GEOM::GEOM_Shape aSubShape, in string name) raises (SALOME::SALOME_Exception); /*! @@ -88,6 +149,25 @@ module SMESH // SMESH_subMesh NewEmpty() // raises (SALOME::SALOME_Exception); + /*! + * Remove a submesh + */ + void RemoveSubMesh(in SMESH_subMesh aSubMesh) + raises (SALOME::SALOME_Exception); + + /*! + * Create a group + */ + SMESH_Group CreateGroup( in ElementType elem_type, + in string name ) + raises (SALOME::SALOME_Exception); + + /*! + * Remove a group + */ + void RemoveGroup(in SMESH_Group aGroup) + raises (SALOME::SALOME_Exception); + /*! * Add hypothesis to the mesh, under a particular subShape * (or the main shape itself) @@ -105,7 +185,8 @@ module SMESH * (or one previous hypothesis on the subShape) * raises exception if hypothesis has not been created */ - boolean AddHypothesis(in GEOM::GEOM_Shape aSubShape, in SMESH_Hypothesis anHyp) + Hypothesis_Status AddHypothesis(in GEOM::GEOM_Shape aSubShape, + in SMESH_Hypothesis anHyp) raises (SALOME::SALOME_Exception); // boolean AddHypothesis(in SMESH_subMesh aSubMesh, in SMESH_Hypothesis anHyp) // raises (SALOME::SALOME_Exception); @@ -114,8 +195,8 @@ module SMESH /*! * Remove an hypothesis previouly added with AddHypothesis. */ - boolean RemoveHypothesis(in GEOM::GEOM_Shape aSubShape, - in SMESH_Hypothesis anHyp) + Hypothesis_Status RemoveHypothesis(in GEOM::GEOM_Shape aSubShape, + in SMESH_Hypothesis anHyp) raises (SALOME::SALOME_Exception); // boolean RemoveHypothesis(in SMESH_subMesh aSubMesh, // in SMESH_Hypothesis anHyp) @@ -165,7 +246,7 @@ module SMESH */ void ExportDAT( in string file ) raises (SALOME::SALOME_Exception); - void ExportMED( in string file ) + void ExportMED( in string file, in boolean auto_groups ) raises (SALOME::SALOME_Exception); void ExportUNV( in string file ) raises (SALOME::SALOME_Exception); @@ -200,11 +281,19 @@ module SMESH long NbHexas() raises (SALOME::SALOME_Exception); + long NbPyramids() + raises (SALOME::SALOME_Exception); + + long NbPrisms() + raises (SALOME::SALOME_Exception); + long NbSubMesh() raises (SALOME::SALOME_Exception); + + string Dump(); }; - interface SMESH_subMesh + interface SMESH_subMesh : SALOME::GenericObj { /*! * @@ -224,6 +313,12 @@ module SMESH long_array GetElementsId() raises (SALOME::SALOME_Exception); + /*! + * + */ + long_array GetElementsByType( in ElementType theType ) + raises (SALOME::SALOME_Exception); + /*! * */ diff --git a/resources/SMESH_en.xml b/resources/SMESH_en.xml index e1bb694bf..449962659 100644 --- a/resources/SMESH_en.xml +++ b/resources/SMESH_en.xml @@ -17,7 +17,7 @@ - + @@ -37,37 +37,34 @@ - - - - - - - - - - - + + - - - + + + + + + + - + + + - - + + @@ -90,30 +87,28 @@ - - - - - - - - + + - - - + + + + + - + - + + + @@ -121,12 +116,6 @@ - - - - - - @@ -134,83 +123,210 @@ - + + + + + - - + + + - + + + + + + + + + + + + + + + + + + + - + + - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + + - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + + + + + - - - - - - - - - - - + + - + + + @@ -233,16 +349,12 @@ - - + + - - - - diff --git a/resources/SMESH_fr.xml b/resources/SMESH_fr.xml index 5c29ab6ec..bef8ea89f 100644 --- a/resources/SMESH_fr.xml +++ b/resources/SMESH_fr.xml @@ -17,7 +17,7 @@ - + @@ -37,17 +37,8 @@ - - - - - - - - - - - + + @@ -58,6 +49,8 @@ + + @@ -90,8 +83,8 @@ - - + + @@ -111,7 +104,7 @@ - + @@ -139,11 +132,15 @@ + + + + @@ -151,13 +148,13 @@ + - @@ -195,17 +192,8 @@ - - - - - - - - - - - + + @@ -233,8 +221,8 @@ - - + + diff --git a/src/Driver/Makefile.in b/src/Driver/Makefile.in index 6016ac85f..252d53062 100644 --- a/src/Driver/Makefile.in +++ b/src/Driver/Makefile.in @@ -46,7 +46,7 @@ LIB_CLIENT_IDL = LIB_SERVER_IDL = # additionnal information to compil and link file -CPPFLAGS += $(OCC_INCLUDES) -I${KERNEL_ROOT_DIR}/include/salome +CPPFLAGS += $(OCC_INCLUDES) -I${KERNEL_ROOT_DIR}/include/salome $(BOOST_CPPFLAGS) CXXFLAGS += $(OCC_CXXFLAGS) $(MED2_INCLUDES) -rdynamic -ldl -I${KERNEL_ROOT_DIR}/include/salome LDFLAGS += $(MED2_LIBS) -lSMESHDS -lSMDS diff --git a/src/DriverDAT/DriverDAT_W_SMDS_Mesh.cxx b/src/DriverDAT/DriverDAT_W_SMDS_Mesh.cxx index 9ebe754b3..8f6a7068d 100644 --- a/src/DriverDAT/DriverDAT_W_SMDS_Mesh.cxx +++ b/src/DriverDAT/DriverDAT_W_SMDS_Mesh.cxx @@ -111,7 +111,7 @@ void DriverDAT_W_SMDS_Mesh::Write() fprintf(stdout, "(* NOEUDS DU MAILLAGE : *)\n"); fprintf(stdout, "(************************)\n"); - SMDS_Iterator * itNodes=myMesh->nodesIterator(); + SMDS_NodeIteratorPtr itNodes=myMesh->nodesIterator(); while(itNodes->more()) { const SMDS_MeshNode * node = itNodes->next(); @@ -127,7 +127,7 @@ void DriverDAT_W_SMDS_Mesh::Write() fprintf(stdout, "(**************************)"); /* Ecriture des connectivites, noms, numeros des mailles */ - SMDS_Iterator * itEdges=myMesh->edgesIterator(); + SMDS_EdgeIteratorPtr itEdges=myMesh->edgesIterator(); while(itEdges->more()) { const SMDS_MeshElement * elem = itEdges->next(); @@ -146,13 +146,13 @@ void DriverDAT_W_SMDS_Mesh::Write() } } - SMDS_Iterator * it=elem->nodesIterator(); + SMDS_ElemIteratorPtr it=elem->nodesIterator(); while(it->more()) fprintf(myFileId, "%d ", it->next()->GetID()); fprintf(myFileId, "\n"); } - SMDS_Iterator * itFaces=myMesh->facesIterator(); + SMDS_FaceIteratorPtr itFaces=myMesh->facesIterator(); while(itFaces->more()) { const SMDS_MeshElement * elem = itFaces->next(); @@ -176,13 +176,13 @@ void DriverDAT_W_SMDS_Mesh::Write() } } - SMDS_Iterator * it=elem->nodesIterator(); + SMDS_ElemIteratorPtr it=elem->nodesIterator(); while(it->more()) fprintf(myFileId, "%d ", it->next()->GetID()); fprintf(myFileId, "\n"); } - SMDS_Iterator * itVolumes=myMesh->volumesIterator(); + SMDS_VolumeIteratorPtr itVolumes=myMesh->volumesIterator(); while(itVolumes->more()) { const SMDS_MeshElement * elem = itVolumes->next(); @@ -196,7 +196,7 @@ void DriverDAT_W_SMDS_Mesh::Write() } } - SMDS_Iterator * it=elem->nodesIterator(); + SMDS_ElemIteratorPtr it=elem->nodesIterator(); while(it->more()) fprintf(myFileId, "%d ", it->next()->GetID()); fprintf(myFileId, "\n"); diff --git a/src/DriverDAT/DriverDAT_W_SMESHDS_Mesh.cxx b/src/DriverDAT/DriverDAT_W_SMESHDS_Mesh.cxx index 0c988c3d8..9518e2f78 100644 --- a/src/DriverDAT/DriverDAT_W_SMESHDS_Mesh.cxx +++ b/src/DriverDAT/DriverDAT_W_SMESHDS_Mesh.cxx @@ -125,14 +125,13 @@ void DriverDAT_W_SMESHDS_Mesh::Add() fprintf(stdout, "(* NOEUDS DU MAILLAGE : *)\n"); fprintf(stdout, "(************************)\n"); - SMDS_Iterator * itNodes=myMesh->nodesIterator(); + SMDS_NodeIteratorPtr itNodes=myMesh->nodesIterator(); while(itNodes->more()) { const SMDS_MeshNode * node = itNodes->next(); fprintf(myFileId, "%d %e %e %e\n", node->GetID(), node->X(), node->Y(), node->Z()); } - delete itNodes; /**************************************************************************** * ECRITURE DES ELEMENTS * @@ -142,7 +141,7 @@ void DriverDAT_W_SMESHDS_Mesh::Add() fprintf(stdout, "(**************************)"); /* Ecriture des connectivites, noms, numeros des mailles */ - SMDS_Iterator * itEdges=myMesh->edgesIterator(); + SMDS_EdgeIteratorPtr itEdges=myMesh->edgesIterator(); while(itEdges->more()) { const SMDS_MeshEdge * elem = itEdges->next(); @@ -161,15 +160,14 @@ void DriverDAT_W_SMESHDS_Mesh::Add() } } - SMDS_Iterator * itNodes=elem->nodesIterator(); + SMDS_ElemIteratorPtr itNodes=elem->nodesIterator(); while(itNodes->more()) fprintf(myFileId, "%d ", itNodes->next()->GetID()); fprintf(myFileId, "\n"); } - delete itEdges; - SMDS_Iterator * itFaces=myMesh->facesIterator(); + SMDS_FaceIteratorPtr itFaces=myMesh->facesIterator(); while(itFaces->more()) { const SMDS_MeshElement * elem = itFaces->next(); @@ -193,16 +191,14 @@ void DriverDAT_W_SMESHDS_Mesh::Add() } } - SMDS_Iterator * itNodes=elem->nodesIterator(); + SMDS_ElemIteratorPtr itNodes=elem->nodesIterator(); while(itNodes->more()) fprintf(myFileId, "%d ", itNodes->next()->GetID()); - delete itNodes; fprintf(myFileId, "\n"); } - delete itFaces; - SMDS_Iterator * itVolumes=myMesh->volumesIterator(); + SMDS_VolumeIteratorPtr itVolumes=myMesh->volumesIterator(); while(itVolumes->more()) { const SMDS_MeshElement * elem = itVolumes->next(); @@ -216,14 +212,12 @@ void DriverDAT_W_SMESHDS_Mesh::Add() } } - SMDS_Iterator * itNodes=elem->nodesIterator(); + SMDS_ElemIteratorPtr itNodes=elem->nodesIterator(); while(itNodes->more()) fprintf(myFileId, "%d ", itNodes->next()->GetID()); - delete itNodes; fprintf(myFileId, "\n"); } - delete itVolumes; fclose(myFileId); } diff --git a/src/DriverDAT/Makefile.in b/src/DriverDAT/Makefile.in index cf3dba921..12dd8b7ca 100644 --- a/src/DriverDAT/Makefile.in +++ b/src/DriverDAT/Makefile.in @@ -46,7 +46,7 @@ LIB_CLIENT_IDL = LIB_SERVER_IDL = # additionnal information to compil and link file -CPPFLAGS += $(OCC_INCLUDES) -I${KERNEL_ROOT_DIR}/include/salome +CPPFLAGS += $(OCC_INCLUDES) -I${KERNEL_ROOT_DIR}/include/salome $(BOOST_CPPFLAGS) CXXFLAGS += $(OCC_CXXFLAGS) $(MED2_INCLUDES) -I${KERNEL_ROOT_DIR}/include/salome LDFLAGS += $(MED2_LIBS) -lMeshDriver diff --git a/src/DriverMED/DriverMED_R_SMESHDS_Mesh.cxx b/src/DriverMED/DriverMED_R_SMESHDS_Mesh.cxx index 1652a55a7..99da911a2 100644 --- a/src/DriverMED/DriverMED_R_SMESHDS_Mesh.cxx +++ b/src/DriverMED/DriverMED_R_SMESHDS_Mesh.cxx @@ -24,664 +24,573 @@ // File : DriverMED_R_SMESHDS_Mesh.cxx // Module : SMESH -using namespace std; #include "DriverMED_R_SMESHDS_Mesh.h" #include "DriverMED_R_SMDS_Mesh.h" #include "utilities.h" +#include "DriverMED_Family.h" + +#include "SMESHDS_Group.hxx" + +#include "MEDA_Wrapper.hxx" +#include "MED_Utilities.hxx" + #include DriverMED_R_SMESHDS_Mesh::DriverMED_R_SMESHDS_Mesh() + : + myMesh (NULL), + myFile (""), + myFileId (-1), + myMeshId (-1) { - myFileId = -1; } DriverMED_R_SMESHDS_Mesh::~DriverMED_R_SMESHDS_Mesh() { - ; +// map::iterator aFamsIter = myFamilies.begin(); +// for (; aFamsIter != myFamilies.end(); aFamsIter++) +// { +// delete (*aFamsIter).second; +// } } void DriverMED_R_SMESHDS_Mesh::SetMesh(SMDS_Mesh * aMesh) { - //myMesh = SMESHDS_Mesh *::DownCast(aMesh); - myMesh = aMesh; + myMesh = aMesh; } void DriverMED_R_SMESHDS_Mesh::SetFile(string aFile) { - myFile = aFile; + myFile = aFile; } void DriverMED_R_SMESHDS_Mesh::SetFileId(med_idt aFileId) { - myFileId = aFileId; + myFileId = aFileId; } void DriverMED_R_SMESHDS_Mesh::SetMeshId(int aMeshId) { - myMeshId = aMeshId; + myMeshId = aMeshId; } -void DriverMED_R_SMESHDS_Mesh::Read() +void DriverMED_R_SMESHDS_Mesh::SetMeshName(string theMeshName) { + myMeshName = theMeshName; +} - string myClass = string("SMDS_Mesh"); - string myExtension = string("MED"); +void DriverMED_R_SMESHDS_Mesh::Read() +{ - DriverMED_R_SMDS_Mesh *myReader = new DriverMED_R_SMDS_Mesh; + string myClass = string("SMDS_Mesh"); + string myExtension = string("MED"); - myReader->SetMesh(myMesh); - myReader->SetMeshId(myMeshId); - myReader->SetFile(myFile); - myReader->SetFileId(-1); + DriverMED_R_SMDS_Mesh *myReader = new DriverMED_R_SMDS_Mesh; - myReader->Read(); + myReader->SetMesh(myMesh); + myReader->SetMeshId(myMeshId); + myReader->SetFile(myFile); + myReader->SetFileId(-1); + myReader->Read(); } void DriverMED_R_SMESHDS_Mesh::Add() { + string myClass = string("SMDS_Mesh"); + string myExtension = string("MED"); - string myClass = string("SMDS_Mesh"); - string myExtension = string("MED"); - - DriverMED_R_SMDS_Mesh *myReader = new DriverMED_R_SMDS_Mesh; - - myReader->SetMesh(myMesh); - myReader->SetMeshId(myMeshId); + DriverMED_R_SMDS_Mesh *myReader = new DriverMED_R_SMDS_Mesh; - SCRUTE(myFileId); - myReader->SetFileId(myFileId); + myReader->SetMesh(myMesh); + myReader->SetMeshId(myMeshId); - myReader->Read(); + SCRUTE(myFileId); + myReader->SetFileId(myFileId); + myReader->Read(); } -void DriverMED_R_SMESHDS_Mesh::ReadMySelf() -{ - - med_err ret = 0; - int i, j, k, l; - int numero; - char message[200]; - bool ok; - /* nombre d'objets MED */ - char nom_universel[MED_TAILLE_LNOM + 1]; - med_int long_fichier_en_tete; - char *fichier_en_tete; - char version_hdf[10]; - char version_med[10]; - med_int nmaa, mdim, nnoe; - med_int nmai[MED_NBR_GEOMETRIE_MAILLE], nfac[MED_NBR_GEOMETRIE_FACE]; - med_int nare[MED_NBR_GEOMETRIE_ARETE]; - /* nom du maillage */ - char nommaa[MED_TAILLE_NOM + 1]; - /* noeuds */ - med_float *coo; - char nomcoo[3 * MED_TAILLE_PNOM + 1]; - char unicoo[3 * MED_TAILLE_PNOM + 1]; - char *nomnoe; - med_int *numnoe; - med_int *nufano; - med_repere rep; - med_booleen inonoe, inunoe; - med_mode_switch mode_coo; - char str[MED_TAILLE_PNOM + 1]; - /* elements */ - med_int nsup; - med_int edim; - med_int taille; - med_int elem_id; - med_int cmpt = 0; - med_int *connectivite; - char *nomele; - med_int *numele; - med_int *nufael; - med_booleen inoele, inuele; - med_connectivite typ_con; - med_geometrie_element typgeo; - med_geometrie_element typmai[MED_NBR_GEOMETRIE_MAILLE] = - { MED_POINT1, MED_SEG2, - MED_SEG3, MED_TRIA3, - MED_TRIA6, MED_QUAD4, - MED_QUAD8, MED_TETRA4, - MED_TETRA10, MED_HEXA8, - MED_HEXA20, MED_PENTA6, - MED_PENTA15, MED_PYRA5, - MED_PYRA13 - }; - med_int desmai[MED_NBR_GEOMETRIE_MAILLE] = - { 0, 2, 3, 3, 3, 4, 4, 4, 4, 6, 6, 5, 5, 5, 5 }; - med_int nmailles[MED_NBR_GEOMETRIE_MAILLE]; - char nommai[MED_NBR_GEOMETRIE_MAILLE][MED_TAILLE_NOM + 1] = { "MED_POINT1", - "MED_SEG2", - "MED_SEG3", - "MED_TRIA3", - "MED_TRIA6", - "MED_QUAD4", - "MED_QUAD8", - "MED_TETRA4", - "MED_TETRA10", - "MED_HEXA8", - "MED_HEXA20", - "MED_PENTA6", - "MED_PENTA15", - "MED_PYRA5", - "MED_PYRA13" - }; - med_geometrie_element typfac[MED_NBR_GEOMETRIE_FACE] = - { MED_TRIA3, MED_TRIA6, - MED_QUAD4, MED_QUAD8 - }; - med_int desfac[MED_NBR_GEOMETRIE_FACE] = { 3, 3, 4, 4 }; - med_int nfaces[MED_NBR_GEOMETRIE_FACE]; - char nomfac[MED_NBR_GEOMETRIE_FACE][MED_TAILLE_NOM + 1] = - { "MED_TRIA3", "MED_TRIA6", - "MED_QUAD4", "MED_QUAD8" - }; - med_geometrie_element typare[MED_NBR_GEOMETRIE_ARETE] = - { MED_SEG2, MED_SEG3 }; - med_int desare[MED_NBR_GEOMETRIE_ARETE] = { 2, 3 }; - med_int naretes[MED_NBR_GEOMETRIE_ARETE]; - char nomare[MED_NBR_GEOMETRIE_ARETE][MED_TAILLE_NOM + 1] = - { "MED_SEG2", "MED_SEG3" }; - /* familles */ - med_int nfam; - med_int natt, ngro; - char *attdes, *gro; - med_int *attval, *attide; - char nomfam[MED_TAILLE_NOM + 1]; - med_int numfam; - char str1[MED_TAILLE_DESC + 1]; - char str2[MED_TAILLE_LNOM + 1]; - string fam; - string fam_type; - string fam_id; - - char *file2Read; - bool locally_managed; - - if (myFileId == -1) - locally_managed = true; - else - locally_managed = false; - - if (locally_managed) - { - file2Read = (char *)myFile.c_str(); - myFileId = MEDouvrir(file2Read, MED_LECT); - if (myFileId < 0) - { - fprintf(stderr, ">> ERREUR : ouverture du fichier %s \n", - file2Read); - exit(EXIT_FAILURE); - } - numero = 1; - } - else - numero = myMeshId; - sprintf(nommaa, "Mesh %d", myMeshId); //pour load - SCRUTE(nommaa); - - typ_con = MED_NOD; - mode_coo = MED_FULL_INTERLACE; - mdim = 3; - - SMESHDS_Mesh * mySMESHDSMesh = dynamic_cast(myMesh); - - //TopoDS_Shape myShape = mySMESHDSMesh->ShapeToMesh(); - - /**************************************************************************** - * NOMBRES D'OBJETS MED * - ****************************************************************************/ - fprintf(stdout, "\n(****************************)\n"); - fprintf(stdout, "(* INFORMATIONS GENERALES : *)\n"); - fprintf(stdout, "(****************************)\n"); - - /* lecture du nom et de la dimension du maillage */ - /*! fprintf(stdout,"%d %d\n",myFileId,numero); - * ret = MEDmaaInfo(myFileId,numero,nommaa,&mdim); - * fprintf(stdout,"%d\n",ret); - * if (ret < 0) - * { - * fprintf(stderr,">> ERREUR : lecture du nom du maillage \n"); - * exit(EXIT_FAILURE); - * } - * fprintf(stdout,"- Nom du maillage : <<%s>>\n",nommaa); - * fprintf(stdout,"- Dimension du maillage : %d\n",mdim); - */ - /* Combien de noeuds ? */ - nnoe = - MEDnEntMaa(myFileId, nommaa, MED_COOR, MED_NOEUD, MED_POINT1, typ_con); - if (nnoe < 0) - { - fprintf(stderr, ">> ERREUR : lecture du nombre de noeuds \n"); - exit(EXIT_FAILURE); - } - fprintf(stdout, "- Nombre de noeuds : %d \n", nnoe); - - /* Combien de mailles, faces ou aretes ? */ - for (i = 0; i < MED_NBR_GEOMETRIE_MAILLE; i++) - { - nmailles[i] = - MEDnEntMaa(myFileId, nommaa, MED_CONN, MED_MAILLE, typmai[i], - typ_con); - if (nmailles[i] < 0) - { - fprintf(stderr, ">> ERREUR : lecture du nombre de mailles \n"); - exit(EXIT_FAILURE); - } - fprintf(stdout, "- Nombre de mailles de type %s : %d \n", nommai[i], - nmailles[i]); - } - for (i = 0; i < MED_NBR_GEOMETRIE_FACE; i++) - { - nfaces[i] = MEDnEntMaa(myFileId, nommaa, MED_CONN, MED_FACE, typfac[i], - typ_con); - if (nfaces[i] < 0) - { - fprintf(stderr, ">> ERREUR : lecture du nombre de faces \n"); - exit(EXIT_FAILURE); - } - fprintf(stdout, "- Nombre de faces de type %s : %d \n", nomfac[i], - nfaces[i]); - } +static const SMDS_MeshNode* +FindNode(const SMDS_Mesh* theMesh, med_int theId){ + const SMDS_MeshNode* aNode = theMesh->FindNode(theId); + if(aNode) return aNode; + EXCEPTION(runtime_error,"SMDS_Mesh::FindNode - cannot find a SMDS_MeshNode for ID = "<> ERREUR : lecture du nombre d'aretes \n"); - exit(EXIT_FAILURE); - } - fprintf(stdout, "- Nombre d'aretes de type %s : %d \n", nomare[i], - naretes[i]); - } - /* nombre de familles */ - nfam = MEDnFam(myFileId, nommaa, 0, MED_FAMILLE); - if (nfam < 0) - { - fprintf(stderr, ">> ERREUR : lecture du nombre de familles \n"); - exit(EXIT_FAILURE); - } - fprintf(stdout, "- Nombre de familles : %d \n", nfam); - - vector < int >family[nfam]; - - /**************************************************************************** - * LECTURE DES NOEUDS * - ****************************************************************************/ - fprintf(stdout, "\n(************************)\n"); - fprintf(stdout, "(* NOEUDS DU MAILLAGE : *)\n"); - fprintf(stdout, "(************************)\n"); - - /* Allocations memoires */ - /* table des coordonnees - * profil : (dimension * nombre de noeuds ) */ - coo = (med_float *) malloc(sizeof(med_float) * nnoe * mdim); - /* table des numeros, des numeros de familles des noeuds - * profil : (nombre de noeuds) */ - numnoe = (med_int *) malloc(sizeof(med_int) * nnoe); - nufano = (med_int *) malloc(sizeof(med_int) * nnoe); - /* table des noms des noeuds - * profil : (nnoe*MED_TAILLE_PNOM+1) */ - nomnoe = (char *)malloc(MED_TAILLE_PNOM * nnoe + 1); - - /* lecture des noeuds : - * - coordonnees - * - noms (optionnel dans un fichier MED) - * - numeros (optionnel dans un fichier MED) - * - numeros des familles */ - ret = MEDnoeudsLire(myFileId, nommaa, mdim, coo, mode_coo, &rep, - nomcoo, unicoo, nomnoe, &inonoe, numnoe, &inunoe, nufano, nnoe); - if (ret < 0) - strcpy(message, ">> ERREUR : lecture des noeuds \n"); - - if (inunoe) - { - for (int i = 0; i < nnoe; i++) - { - ok = mySMESHDSMesh->AddNodeWithID(coo[i * 3], coo[i * 3 + 1], - coo[i * 3 + 2], numnoe[i]); - //fprintf(Out,"%d %f %f %f\n",numnoe[i],coo[i*3],coo[i*3+1],coo[i*3+2]); - } - } - else - { - for (int i = 0; i < nnoe; i++) - { - ok = mySMESHDSMesh->AddNodeWithID(coo[i * 3], coo[i * 3 + 1], - coo[i * 3 + 2], i + 1); - //fprintf(Out,"%d %f %f %f\n",numnoe[i],coo[i*3],coo[i*3+1],i); - family[*(nufano + i)].push_back(numnoe[i]); +DriverMED_R_SMESHDS_Mesh::ReadStatus DriverMED_R_SMESHDS_Mesh::ReadMySelf() +{ + ReadStatus result = DRS_FAIL; + try{ + using namespace MEDA; + + myFamilies.clear(); + MESSAGE("ReadMySelf - myFile : "<GetName()); + if(aMeshName != aMeshInfo->GetName()) continue; + result = DRS_OK; + med_int aMeshDim = aMeshInfo->GetDim(); + + // Reading MED families to the temporary structure + //------------------------------------------------ + med_int aNbFams = aMed.GetNbFamilies(aMeshInfo); + MESSAGE("Read " << aNbFams << " families"); + for (med_int iFam = 0; iFam < aNbFams; iFam++) { + PFamilyInfo aFamilyInfo = aMed.GetFamilyInfo(aMeshInfo, iFam); + med_int aFamId = aFamilyInfo->GetId(); + MESSAGE("Family " << aFamId << " :"); + +//if (aFamId >= FIRST_VALID_FAMILY) { + DriverMED_FamilyPtr aFamily (new DriverMED_Family); + + med_int aNbGrp = aFamilyInfo->GetNbGroup(); + MESSAGE("belong to " << aNbGrp << " groups"); + for (med_int iGr = 0; iGr < aNbGrp; iGr++) { + string aGroupName = aFamilyInfo->GetGroupName(iGr); + MESSAGE(aGroupName); + aFamily->AddGroupName(aGroupName); + } +// aFamily->SetId(aFamId); + myFamilies[aFamId] = aFamily; +// } + } + + // Reading MED nodes to the corresponding SMDS structure + //------------------------------------------------------ + PNodeInfo aNodeInfo = aMed.GetNodeInfo(aMeshInfo); + med_booleen anIsNodeNum = aNodeInfo->IsElemNum(); + med_int aNbElems = aNodeInfo->GetNbElem(); + MESSAGE("ReadMySelf - aNodeInfo->GetNbElem() = "<X()<<", "<Y()<<", "<Z()<GetFamNum(iElem); + if (myFamilies.find(aFamNum) != myFamilies.end()) + { + myFamilies[aFamNum]->AddElement(aNode); + myFamilies[aFamNum]->SetType(SMDSAbs_Node); + } + } + + // Reading pre information about all MED cells + //-------------------------------------------- + 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 med_entite_maillage& anEntity = anEntityIter->first; + if(anEntity == MED_NOEUD) continue; + // Reading MED cells to the corresponding SMDS structure + //------------------------------------------------------ + const MED::TGeom& aTGeom = anEntityIter->second; + MED::TGeom::const_iterator anTGeomIter = aTGeom.begin(); + for(; anTGeomIter != aTGeom.end(); anTGeomIter++){ + const med_geometrie_element& aGeom = anTGeomIter->first; + if(aGeom == MED_POINT1) continue; + PCellInfo aCellInfo = aMed.GetCellInfo(aMeshInfo,anEntity,aGeom); + med_booleen anIsElemNum = takeNumbers ? aCellInfo->IsElemNum() : MED_FAUX; + med_int aNbElems = aCellInfo->GetNbElem(); + MESSAGE("ReadMySelf - anEntity = "< aNodeIds(aNbNodes); + for(int i = 0; i < aNbNodes; i++){ + aNodeIds.at(i) = aCellInfo->GetConn(iElem,i); + //cout<GetFamNum(iElem); + try{ + switch(aGeom){ + case MED_SEG2: + case MED_SEG3: + if(anIsElemNum) + anElement = myMesh->AddEdgeWithID(aNodeIds.at(0), + aNodeIds.at(1), + aCellInfo->GetElemNum(iElem)); + if (!anElement) { + anElement = myMesh->AddEdge(FindNode(myMesh,aNodeIds.at(0)), + FindNode(myMesh,aNodeIds.at(1))); + isRenum = anIsElemNum; + } + break; + case MED_TRIA3: + case MED_TRIA6: + aNbNodes = 3; + if(anIsElemNum) + anElement = myMesh->AddFaceWithID(aNodeIds.at(0), + aNodeIds.at(1), + aNodeIds.at(2), + aCellInfo->GetElemNum(iElem)); + if (!anElement) { + anElement = myMesh->AddFace(FindNode(myMesh,aNodeIds.at(0)), + FindNode(myMesh,aNodeIds.at(1)), + FindNode(myMesh,aNodeIds.at(2))); + isRenum = anIsElemNum; + } + break; + case MED_QUAD4: + case MED_QUAD8: + aNbNodes = 4; + // There is some differnce between SMDS and MED + if(anIsElemNum) + anElement = myMesh->AddFaceWithID(aNodeIds.at(0), + aNodeIds.at(1), + aNodeIds.at(2), + aNodeIds.at(3), + aCellInfo->GetElemNum(iElem)); + if (!anElement) { + anElement = myMesh->AddFace(FindNode(myMesh,aNodeIds.at(0)), + FindNode(myMesh,aNodeIds.at(1)), + FindNode(myMesh,aNodeIds.at(2)), + FindNode(myMesh,aNodeIds.at(3))); + isRenum = anIsElemNum; + } + break; + case MED_TETRA4: + case MED_TETRA10: + aNbNodes = 4; + if(anIsElemNum) + anElement = myMesh->AddVolumeWithID(aNodeIds.at(0), + aNodeIds.at(1), + aNodeIds.at(2), + aNodeIds.at(3), + aCellInfo->GetElemNum(iElem)); + if (!anElement) { + anElement = myMesh->AddVolume(FindNode(myMesh,aNodeIds.at(0)), + FindNode(myMesh,aNodeIds.at(1)), + FindNode(myMesh,aNodeIds.at(2)), + FindNode(myMesh,aNodeIds.at(3))); + isRenum = anIsElemNum; + } + break; + case MED_PYRA5: + case MED_PYRA13: + aNbNodes = 5; + // There is some differnce between SMDS and MED + if(anIsElemNum) + anElement = myMesh->AddVolumeWithID(aNodeIds.at(0), + aNodeIds.at(1), + aNodeIds.at(2), + aNodeIds.at(3), + aNodeIds.at(4), + aCellInfo->GetElemNum(iElem)); + if (!anElement) { + anElement = myMesh->AddVolume(FindNode(myMesh,aNodeIds.at(0)), + FindNode(myMesh,aNodeIds.at(1)), + FindNode(myMesh,aNodeIds.at(2)), + FindNode(myMesh,aNodeIds.at(3)), + FindNode(myMesh,aNodeIds.at(4))); + isRenum = anIsElemNum; + } + break; + case MED_PENTA6: + case MED_PENTA15: + aNbNodes = 6; + if(anIsElemNum) + anElement = myMesh->AddVolumeWithID(aNodeIds.at(0), + aNodeIds.at(1), + aNodeIds.at(2), + aNodeIds.at(3), + aNodeIds.at(4), + aNodeIds.at(5), + aCellInfo->GetElemNum(iElem)); + if (!anElement) { + anElement = myMesh->AddVolume(FindNode(myMesh,aNodeIds.at(0)), + FindNode(myMesh,aNodeIds.at(1)), + FindNode(myMesh,aNodeIds.at(2)), + FindNode(myMesh,aNodeIds.at(3)), + FindNode(myMesh,aNodeIds.at(4)), + FindNode(myMesh,aNodeIds.at(5))); + isRenum = anIsElemNum; + } + break; + case MED_HEXA8: + case MED_HEXA20: + aNbNodes = 8; + if(anIsElemNum) + anElement = myMesh->AddVolumeWithID(aNodeIds.at(0), + aNodeIds.at(1), + aNodeIds.at(2), + aNodeIds.at(3), + aNodeIds.at(4), + aNodeIds.at(5), + aNodeIds.at(6), + aNodeIds.at(7), + aCellInfo->GetElemNum(iElem)); + if (!anElement) { + anElement = myMesh->AddVolume(FindNode(myMesh,aNodeIds.at(0)), + FindNode(myMesh,aNodeIds.at(1)), + FindNode(myMesh,aNodeIds.at(2)), + FindNode(myMesh,aNodeIds.at(3)), + FindNode(myMesh,aNodeIds.at(4)), + FindNode(myMesh,aNodeIds.at(5)), + FindNode(myMesh,aNodeIds.at(6)), + FindNode(myMesh,aNodeIds.at(7))); + isRenum = anIsElemNum; + } + break; } + }catch(const std::exception& exc){ + //INFOS("Follow exception was cought:\n\t"<AddElement(anElement); + myFamilies[aFamNum]->SetType(anElement->GetType()); + } + } + } + } } + break; + } + } + }catch(const std::exception& exc){ + INFOS("Follow exception was cought:\n\t"< 0 && ret == 0) - { - /* dimension de la maille */ - edim = typmai[i] / 100; - nsup = 0; - if (mdim == 2 || mdim == 3) - if (edim == 1) - nsup = 1; - if (mdim == 3) - if (edim == 2) - nsup = 1; - - taille = nsup + typmai[i] % 100; - //taille = typmai[i]%100; - - /* allocation memoire */ - connectivite = (med_int *) malloc(sizeof(med_int) * - taille * nmailles[i]); - nomele = (char *)malloc(sizeof(char) * MED_TAILLE_PNOM * - nmailles[i] + 1); - numele = (med_int *) malloc(sizeof(med_int) * nmailles[i]); - nufael = (med_int *) malloc(sizeof(med_int) * nmailles[i]); - - /* lecture des données */ - ret = - MEDelementsLire(myFileId, nommaa, mdim, connectivite, - mode_coo, nomele, &inoele, numele, &inuele, nufael, - nmailles[i], MED_MAILLE, typmai[i], typ_con); - - switch (typmai[i]) - { - case MED_TRIA3: - { - if (inuele) - { - for (j = 0; j < nmailles[i]; j++) - { - elem_id = *(numele + j); - ok = mySMESHDSMesh->AddFaceWithID(*(connectivite + - j * (taille - nsup)), - *(connectivite + j * (taille - nsup) + 1), - *(connectivite + j * (taille - nsup) + 2), - elem_id); - //fprintf(Out,"%d %d %d %d\n",elem_id,*(connectivite+j*(taille-nsup)),*(connectivite+j*(taille-nsup)+1),*(connectivite+j*(taille-nsup)+2)); - } - } - else - { - for (j = 0; j < nmailles[i]; j++) - { - cmpt++; - ok = mySMESHDSMesh->AddFaceWithID(*(connectivite + - j * (taille)), - *(connectivite + j * (taille) + 1), - *(connectivite + j * (taille) + 2), cmpt); - //fprintf(Out,"%d %d %d %d\n",j,*(connectivite+j*(taille)),*(connectivite+j*(taille)+1),*(connectivite+j*(taille)+2)); - } - } - - break; - } - case MED_QUAD4: - { - if (inuele) - { - for (j = 0; j < nmailles[i]; j++) - { - elem_id = *(numele + j); - ok = mySMESHDSMesh->AddFaceWithID(*(connectivite + - j * (taille - nsup)), - *(connectivite + j * (taille - nsup) + 1), - *(connectivite + j * (taille - nsup) + 2), - *(connectivite + j * (taille - nsup) + 3), - elem_id); - //fprintf(Out,"%d %d %d %d\n",elem_id,*(connectivite+j*(taille-nsup)),*(connectivite+j*(taille-nsup)+1),*(connectivite+j*(taille-nsup)+2),*(connectivite+j*(taille-nsup)+3)); - } - } - else - { - for (j = 0; j < nmailles[i]; j++) - { - cmpt++; - ok = myMesh->AddFaceWithID(*(connectivite + - j * (taille)), - *(connectivite + j * (taille) + 1), - *(connectivite + j * (taille) + 2), - *(connectivite + j * (taille) + 3), cmpt); - //fprintf(Out,"%d %d %d %d\n",j,*(connectivite+j*(taille)),*(connectivite+j*(taille)+1),*(connectivite+j*(taille)+2),*(connectivite+j*(taille)+3)); - } - } - break; - } - case MED_TETRA4: - { - if (inuele) - { - for (j = 0; j < nmailles[i]; j++) - { - elem_id = *(numele + j); - ok = mySMESHDSMesh->AddVolumeWithID(*(connectivite + - j * (taille - nsup)), - *(connectivite + j * (taille - nsup) + 1), - *(connectivite + j * (taille - nsup) + 2), - *(connectivite + j * (taille - nsup) + 3), - elem_id); - //fprintf(Out,"%d %d %d %d\n",elem_id,*(connectivite+j*(taille-nsup)),*(connectivite+j*(taille-nsup)+1),*(connectivite+j*(taille-nsup)+2),*(connectivite+j*(taille-nsup)+3)); - } - } - else - { - for (j = 0; j < nmailles[i]; j++) - { - cmpt++; - ok = mySMESHDSMesh->AddVolumeWithID(*(connectivite + - j * (taille)), - *(connectivite + j * (taille) + 1), - *(connectivite + j * (taille) + 2), - *(connectivite + j * (taille) + 3), cmpt); - //fprintf(Out,"%d %d %d %d\n",j,*(connectivite+j*(taille)),*(connectivite+j*(taille)+1),*(connectivite+j*(taille)+2),*(connectivite+j*(taille)+3)); - } - } - break; - } - case MED_HEXA8: - { - if (inuele) - { - for (j = 0; j < nmailles[i]; j++) - { - elem_id = *(numele + j); - ok = mySMESHDSMesh->AddVolumeWithID(*(connectivite + - j * (taille - nsup)), - *(connectivite + j * (taille - nsup) + 1), - *(connectivite + j * (taille - nsup) + 2), - *(connectivite + j * (taille - nsup) + 3), - *(connectivite + j * (taille - nsup) + 4), - *(connectivite + j * (taille - nsup) + 5), - *(connectivite + j * (taille - nsup) + 6), - *(connectivite + j * (taille - nsup) + 7), - elem_id); - //fprintf(Out,"%d %d %d %d\n",elem_id,*(connectivite+j*(taille-nsup)),*(connectivite+j*(taille-nsup)+1),*(connectivite+j*(taille-nsup)+2),*(connectivite+j*(taille-nsup)+3),*(connectivite+j*(taille-nsup)+4),*(connectivite+j*(taille-nsup)+5),*(connectivite+j*(taille-nsup)+6),*(connectivite+j*(taille-nsup)+7)); - } - } - else - { - for (j = 0; j < nmailles[i]; j++) - { - cmpt++; - ok = mySMESHDSMesh->AddVolumeWithID(*(connectivite + - j * (taille)), - *(connectivite + j * (taille) + 1), - *(connectivite + j * (taille) + 2), - *(connectivite + j * (taille) + 3), - *(connectivite + j * (taille) + 4), - *(connectivite + j * (taille) + 5), - *(connectivite + j * (taille) + 6), - *(connectivite + j * (taille) + 7), cmpt); - //fprintf(Out,"%d %d %d %d\n",j,*(connectivite+j*(taille)),*(connectivite+j*(taille)+1),*(connectivite+j*(taille)+2),*(connectivite+j*(taille)+3),*(connectivite+j*(taille)+4),*(connectivite+j*(taille)+5),*(connectivite+j*(taille)+6),*(connectivite+j*(taille)+7)); - } - } - break; - } - default: - { - break; - } - } - - fprintf(stdout, "\n - Numéros de familles : \n"); - for (j = 0; j < nmailles[i]; j++) - fprintf(stdout, " %d ", *(nufael + j)); - - /* liberation memoire */ - free(connectivite); - free(nomele); - free(numele); - free(nufael); - } - } - - /**************************************************************************** - * LECTURE DES FAMILLES * - ****************************************************************************/ - printf("\n(*************************)\n"); - printf("(* FAMILLES DU MAILLAGE : *)\n"); - printf("(*************************)\n"); - if (ret == 0) - for (i = 0; i < nfam; i++) - { - - /* nombre de groupes */ - ngro = MEDnFam(myFileId, nommaa, i + 1, MED_GROUPE); - if (ngro < 0) - { - ret = -1; - strcpy(message, - ">> ERREUR : lecture du nombre de groupes d'une famille \n"); - } - - /* nombre d'attributs */ - if (ret == 0) - { - natt = MEDnFam(myFileId, nommaa, i + 1, MED_ATTR); - if (natt < 0) - { - ret = -1; - strcpy(message, - ">> ERREUR : lecture du nombre d'attributs d'une famille\n"); - } - } - - if (ret == 0) - fprintf(stdout, "- Famille %d a %d attributs et %d groupes \n", - i + 1, natt, ngro); - - /* nom,numero,attributs,groupes */ - if (ret == 0) - { - attide = (med_int *) malloc(sizeof(med_int) * natt); - attval = (med_int *) malloc(sizeof(med_int) * natt); - attdes = (char *)malloc(MED_TAILLE_DESC * natt + 1); - gro = (char *)malloc(MED_TAILLE_LNOM * ngro + 1); - ret = - MEDfamInfo(myFileId, nommaa, i + 1, nomfam, &numfam, attide, - attval, attdes, &natt, gro, &ngro); - - fam = string(nomfam); - fam_type = fam.substr(1, 1); - fam_id = fam.substr(2, 1); - if ((fam_type == string("V")) || (fam_type == string("A")) || - (fam_type == string("F"))) - LinkMeshToShape(fam_type, fam_id, family[i]); - - fprintf(stdout, " - Famille de nom %s et de numero %d : \n", - nomfam, numfam); - fprintf(stdout, " - Attributs : \n"); - for (j = 0; j < natt; j++) - { - strncpy(str1, attdes + j * MED_TAILLE_DESC, - MED_TAILLE_DESC); - str1[MED_TAILLE_DESC] = '\0'; - fprintf(stdout, " ide = %d - val = %d - des = %s\n", - *(attide + j), *(attval + j), str1); - } - free(attide); - free(attval); - free(attdes); - fprintf(stdout, " - Groupes :\n"); - for (j = 0; j < ngro; j++) - { - strncpy(str2, gro + j * MED_TAILLE_LNOM, MED_TAILLE_LNOM); - str2[MED_TAILLE_LNOM] = '\0'; - fprintf(stdout, " gro = %s\n", str2); - } - free(gro); - } - } - - if (locally_managed) - ret = MEDfermer(myFileId); - +list DriverMED_R_SMESHDS_Mesh::GetMeshNames() +{ + list aMeshNames; + + try { + using namespace MEDA; + + MESSAGE("GetMeshNames - myFile : " << myFile); + TWrapper aMed (myFile); + + if (med_int aNbMeshes = aMed.GetNbMeshes()) { + for (int iMesh = 0; iMesh < aNbMeshes; iMesh++) { + // Reading the MED mesh + //--------------------- + PMeshInfo aMeshInfo = aMed.GetMeshInfo(iMesh); + aMeshNames.push_back(aMeshInfo->GetName()); + } + } + }catch(const std::exception& exc){ + INFOS("Follow exception was cought:\n\t"<myNodes) +list DriverMED_R_SMESHDS_Mesh::GetGroupNames() { + list aResult; + set aResGroupNames; + + map::iterator aFamsIter = myFamilies.begin(); + for (; aFamsIter != myFamilies.end(); aFamsIter++) + { + DriverMED_FamilyPtr aFamily = (*aFamsIter).second; + const MED::TStringSet& aGroupNames = aFamily->GetGroupNames(); + set::iterator aGrNamesIter = aGroupNames.begin(); + for (; aGrNamesIter != aGroupNames.end(); aGrNamesIter++) + { + string aName = *aGrNamesIter; + // Check, if this is a Group or SubMesh name +//if (aName.substr(0, 5) == string("Group")) { + if (aResGroupNames.find(aName) == aResGroupNames.end()) { + aResGroupNames.insert(aName); + aResult.push_back(aName); + } +// } + } + } + + return aResult; +} - SMESHDS_Mesh * mySMESHDSMesh = dynamic_cast(myMesh); +void DriverMED_R_SMESHDS_Mesh::GetGroup(SMESHDS_Group* theGroup) +{ + string aGroupName (theGroup->GetStoreName()); + MESSAGE("Get Group " << aGroupName); + + map::iterator aFamsIter = myFamilies.begin(); + for (; aFamsIter != myFamilies.end(); aFamsIter++) + { + DriverMED_FamilyPtr aFamily = (*aFamsIter).second; + if (aFamily->MemberOf(aGroupName)) + { + const set& anElements = aFamily->GetElements(); + set::iterator anElemsIter = anElements.begin(); + for (; anElemsIter != anElements.end(); anElemsIter++) + { + theGroup->SMDS_MeshGroup::Add(*anElemsIter); + } + } + } +} - int id = atoi(fam_id.c_str()); - if (fam_type == string("V")) - { //Linked to a vertex - for (int i = 0; i < myNodes.size(); i++) - { - const SMDS_MeshNode * node = mySMESHDSMesh->FindNode(myNodes[i]); - //const TopoDS_Vertex& S;//le recuperer !!! - //mySMESHDSMesh->SetNodeOnVertex (node,S); - } - } - else if (fam_type == string("E")) - { //Linked to an edge - for (int i = 0; i < myNodes.size(); i++) - { - const SMDS_MeshNode * node = mySMESHDSMesh->FindNode(myNodes[i]); - //const TopoDS_Edge& S;//le recuperer !!! - //mySMESHDSMesh->SetNodeOnEdge (node,S); - } - } - else if (fam_type == string("F")) - { //Linked to a face - for (int i = 0; i < myNodes.size(); i++) - { - const SMDS_MeshNode * node = mySMESHDSMesh->FindNode(myNodes[i]); - //const TopoDS_Face& S;//le recuperer !!! - //mySMESHDSMesh->SetNodeOnFace (node,S); - } - } +void DriverMED_R_SMESHDS_Mesh::GetSubMesh (SMESHDS_SubMesh* theSubMesh, + const int theId) +{ + char submeshGrpName[ 30 ]; + sprintf( submeshGrpName, "SubMesh %d", theId ); + string aName (submeshGrpName); + map::iterator aFamsIter = myFamilies.begin(); + for (; aFamsIter != myFamilies.end(); aFamsIter++) + { + DriverMED_FamilyPtr aFamily = (*aFamsIter).second; + if (aFamily->MemberOf(aName)) + { + const set& anElements = aFamily->GetElements(); + set::iterator anElemsIter = anElements.begin(); + if (aFamily->GetType() == SMDSAbs_Node) + { + for (; anElemsIter != anElements.end(); anElemsIter++) + { + const SMDS_MeshNode* node = static_cast(*anElemsIter); + theSubMesh->AddNode(node); + } + } + else + { + for (; anElemsIter != anElements.end(); anElemsIter++) + { + theSubMesh->AddElement(*anElemsIter); + } + } + } + } +} +void DriverMED_R_SMESHDS_Mesh::CreateAllSubMeshes () +{ + SMESHDS_Mesh* aSMESHDSMesh = dynamic_cast(myMesh); + if (!aSMESHDSMesh) { + EXCEPTION(runtime_error,"Can not cast SMDS_Mesh to SMESHDS_Mesh"); + } + map::iterator aFamsIter = myFamilies.begin(); + for (; aFamsIter != myFamilies.end(); aFamsIter++) + { + DriverMED_FamilyPtr aFamily = (*aFamsIter).second; + MED::TStringSet aGroupNames = aFamily->GetGroupNames(); + set::iterator aGrNamesIter = aGroupNames.begin(); + for (; aGrNamesIter != aGroupNames.end(); aGrNamesIter++) + { + string aName = *aGrNamesIter; + // Check, if this is a Group or SubMesh name + if (aName.substr(0, 7) == string("SubMesh")) + { + 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++) + { + const SMDS_MeshNode* node = static_cast(*anElemsIter); + aSMESHDSMesh->SetNodeInVolume(node, Id); +// aSMESHDSMesh->SetNodeOnFace(node, Id); +// aSMESHDSMesh->SetNodeOnEdge(node, Id); +// aSMESHDSMesh->SetNodeOnVertex(node, Id); + } + } + else + { + for (; anElemsIter != anElements.end(); anElemsIter++) + { + aSMESHDSMesh->SetMeshElementOnShape(*anElemsIter, Id); + } + } + } + } + } } diff --git a/src/DriverMED/DriverMED_R_SMESHDS_Mesh.h b/src/DriverMED/DriverMED_R_SMESHDS_Mesh.h index 88ae5037c..c592c3034 100644 --- a/src/DriverMED/DriverMED_R_SMESHDS_Mesh.h +++ b/src/DriverMED/DriverMED_R_SMESHDS_Mesh.h @@ -29,34 +29,60 @@ #include "SMESHDS_Mesh.hxx" #include "Mesh_Reader.h" +#include "DriverMED_Family.h" -#include +#include extern "C" { #include } +using namespace std; + +class SMESHDS_Group; +class SMESHDS_SubMesh; + class DriverMED_R_SMESHDS_Mesh:public Mesh_Reader { + public: + + DriverMED_R_SMESHDS_Mesh(); + ~DriverMED_R_SMESHDS_Mesh(); + + enum ReadStatus { + DRS_OK, + DRS_EMPTY, // a MED file contains no mesh with the given name + DRS_WARN_RENUMBER, // a MED file has overlapped ranges of element numbers, + // so the numbers from the file are ignored + DRS_WARN_SKIP_ELEM, // some elements were skipped due to incorrect file data + DRS_FAIL // general failure (exception etc.) + }; + + void Read(); + ReadStatus ReadMySelf(); + void Add(); - public:DriverMED_R_SMESHDS_Mesh(); - ~DriverMED_R_SMESHDS_Mesh(); + list GetGroupNames(); + void GetGroup(SMESHDS_Group* theGroup); + void CreateAllSubMeshes(); + void GetSubMesh(SMESHDS_SubMesh* theSubMesh, const int theId); - void Read(); - void ReadMySelf(); - void Add(); + list GetMeshNames(); - void SetMesh(SMDS_Mesh * aMesh); - void SetFile(string); - void SetFileId(med_idt); - void SetMeshId(int); + void SetMesh(SMDS_Mesh * aMesh); + void SetFile(string); + void SetFileId(med_idt); + void SetMeshId(int); + void SetMeshName(string theMeshName); - void LinkMeshToShape(string, string, vector < int >); + private: - private: SMDS_Mesh * myMesh; - string myFile; - med_idt myFileId; - int myMeshId; + SMDS_Mesh * myMesh; + string myFile; + med_idt myFileId; + int myMeshId; + string myMeshName; + map myFamilies; }; #endif diff --git a/src/DriverMED/DriverMED_W_SMDS_Mesh.cxx b/src/DriverMED/DriverMED_W_SMDS_Mesh.cxx index fd6f3db75..eaa287e3b 100644 --- a/src/DriverMED/DriverMED_W_SMDS_Mesh.cxx +++ b/src/DriverMED/DriverMED_W_SMDS_Mesh.cxx @@ -207,7 +207,7 @@ void DriverMED_W_SMDS_Mesh::Write() for (i = 0; i < MED_NBR_GEOMETRIE_MAILLE; i++) nmailles[i] = 0; - SMDS_Iterator * itFaces=myMesh->facesIterator(); + SMDS_FaceIteratorPtr itFaces=myMesh->facesIterator(); int nb_of_nodes, nb_of_faces; nb_of_faces = myMesh->NbFaces(); //SCRUTE(nb_of_faces); @@ -251,7 +251,7 @@ void DriverMED_W_SMDS_Mesh::Write() } - SMDS_Iterator * itVolumes=myMesh->volumesIterator(); + SMDS_VolumeIteratorPtr itVolumes=myMesh->volumesIterator(); while(itVolumes->more()) { const SMDS_MeshVolume * elem = itVolumes->next(); @@ -295,7 +295,7 @@ void DriverMED_W_SMDS_Mesh::Write() nomnoe = ""; i = 0; - SMDS_Iterator * itNodes=myMesh->nodesIterator(); + SMDS_NodeIteratorPtr itNodes=myMesh->nodesIterator(); while(itNodes->more()) { const SMDS_MeshNode * node = itNodes->next(); @@ -370,8 +370,7 @@ void DriverMED_W_SMDS_Mesh::Write() //elem_id=*(numele+j); //fprintf(stdout,"%d \n",myId); - SMDS_Iterator * itNode= - elem->nodesIterator(); + SMDS_ElemIteratorPtr itNode= elem->nodesIterator(); while(itNode->more()) { diff --git a/src/DriverMED/DriverMED_W_SMESHDS_Mesh.cxx b/src/DriverMED/DriverMED_W_SMESHDS_Mesh.cxx index 845985436..eb6dd43a3 100644 --- a/src/DriverMED/DriverMED_W_SMESHDS_Mesh.cxx +++ b/src/DriverMED/DriverMED_W_SMESHDS_Mesh.cxx @@ -24,673 +24,515 @@ // File : DriverMED_W_SMESHDS_Mesh.cxx // Module : SMESH -using namespace std; #include "DriverMED_W_SMESHDS_Mesh.h" #include "DriverMED_W_SMDS_Mesh.h" +#include "DriverMED_Family.h" + #include "SMDS_MeshElement.hxx" #include "SMDS_MeshNode.hxx" -#include -#include #include "utilities.h" +#include "MEDA_Wrapper.hxx" +#include + +#include "MED_Utilities.hxx" + DriverMED_W_SMESHDS_Mesh::DriverMED_W_SMESHDS_Mesh() + : + myMesh (NULL), + myFile (""), + myFileId (-1), + myMeshId (-1), + myAllSubMeshes (false), + myDoGroupOfNodes (false), + myDoGroupOfEdges (false), + myDoGroupOfFaces (false), + myDoGroupOfVolumes (false) { - ; } DriverMED_W_SMESHDS_Mesh::~DriverMED_W_SMESHDS_Mesh() { - ; } void DriverMED_W_SMESHDS_Mesh::SetMesh(SMDS_Mesh * aMesh) { - myMesh = aMesh; + myMesh = aMesh; } void DriverMED_W_SMESHDS_Mesh::SetFile(string aFile) { - myFile = aFile; + myFile = aFile; } void DriverMED_W_SMESHDS_Mesh::SetFileId(med_idt aFileId) { - myFileId = aFileId; + myFileId = aFileId; } void DriverMED_W_SMESHDS_Mesh::SetMeshId(int aMeshId) { - myMeshId = aMeshId; + myMeshId = aMeshId; } -void DriverMED_W_SMESHDS_Mesh::Write() +void DriverMED_W_SMESHDS_Mesh::SetMeshName(string theMeshName) { + myMeshName = theMeshName; +} - string myClass = string("SMDS_Mesh"); - string myExtension = string("MED"); +void DriverMED_W_SMESHDS_Mesh::AddGroup(SMESHDS_Group* theGroup) +{ + myGroups.push_back(theGroup); +} - DriverMED_W_SMDS_Mesh *myWriter = new DriverMED_W_SMDS_Mesh; +void DriverMED_W_SMESHDS_Mesh::AddAllSubMeshes() +{ + myAllSubMeshes = true; +} - myWriter->SetMesh(myMesh); - // myWriter->SetFile(myFile); - myWriter->SetMeshId(myMeshId); - myWriter->SetFileId(myFileId); +void DriverMED_W_SMESHDS_Mesh::AddSubMesh(SMESHDS_SubMesh* theSubMesh, int theID) +{ + mySubMeshes[theID] = theSubMesh; +} - myWriter->Write(); +void DriverMED_W_SMESHDS_Mesh::AddGroupOfNodes() +{ + myDoGroupOfNodes = true; +} +void DriverMED_W_SMESHDS_Mesh::AddGroupOfEdges() +{ + myDoGroupOfEdges = true; } -void DriverMED_W_SMESHDS_Mesh::Add() +void DriverMED_W_SMESHDS_Mesh::AddGroupOfFaces() { + myDoGroupOfFaces = true; +} - med_err ret = 0; - int i, j, k, l; - int numero; - char message[200]; - bool ok; - /* nombre d'objets MED */ - char nom_universel[MED_TAILLE_LNOM + 1]; - med_int long_fichier_en_tete; - char *fichier_en_tete; - char version_hdf[10]; - char version_med[10]; - med_int nmaa, mdim, nnoe; - med_int nmai[MED_NBR_GEOMETRIE_MAILLE], nfac[MED_NBR_GEOMETRIE_FACE]; - med_int nare[MED_NBR_GEOMETRIE_ARETE]; - /* nom du maillage */ - char nommaa[MED_TAILLE_NOM + 1]; - /* noeuds */ - med_float *coo; - // PN : Initilialisation de nomcoo et unicoo pour lisibilite du maillage - char nomcoo[3 * MED_TAILLE_PNOM + 1] = "x y z "; - char unicoo[3 * MED_TAILLE_PNOM + 1] = "m m m "; - char *nomnoe; - med_int *numnoe; - med_int *nufano; - med_repere rep; - med_booleen inonoe, inunoe; - med_mode_switch mode_coo; - char str[MED_TAILLE_PNOM + 1]; - med_int nbNodes; - /* elements */ - med_int nsup; - med_int edim; - med_int taille; - med_int elem_id, myId; - med_int *connectivite; - char *nomele; - med_int *numele; - med_int *nufael; - med_booleen inoele, inuele; - med_connectivite typ_con; - med_geometrie_element typgeo; - med_geometrie_element typmai[MED_NBR_GEOMETRIE_MAILLE] = - { MED_POINT1, MED_SEG2, - MED_SEG3, MED_TRIA3, - MED_TRIA6, MED_QUAD4, - MED_QUAD8, MED_TETRA4, - MED_TETRA10, MED_HEXA8, - MED_HEXA20, MED_PENTA6, - MED_PENTA15, MED_PYRA5, - MED_PYRA13 - }; - med_int desmai[MED_NBR_GEOMETRIE_MAILLE] = - { 0, 2, 3, 3, 3, 4, 4, 4, 4, 6, 6, 5, 5, 5, 5 }; - med_int nmailles[MED_NBR_GEOMETRIE_MAILLE]; - char nommai[MED_NBR_GEOMETRIE_MAILLE][MED_TAILLE_NOM + 1] = { "MED_POINT1", - "MED_SEG2", - "MED_SEG3", - "MED_TRIA3", - "MED_TRIA6", - "MED_QUAD4", - "MED_QUAD8", - "MED_TETRA4", - "MED_TETRA10", - "MED_HEXA8", - "MED_HEXA20", - "MED_PENTA6", - "MED_PENTA15", - "MED_PYRA5", - "MED_PYRA13" - }; - med_geometrie_element typfac[MED_NBR_GEOMETRIE_FACE] = - { MED_TRIA3, MED_TRIA6, - MED_QUAD4, MED_QUAD8 - }; - med_int desfac[MED_NBR_GEOMETRIE_FACE] = { 3, 3, 4, 4 }; - med_int nfaces[MED_NBR_GEOMETRIE_FACE]; - char nomfac[MED_NBR_GEOMETRIE_FACE][MED_TAILLE_NOM + 1] = - { "MED_TRIA3", "MED_TRIA6", - "MED_QUAD4", "MED_QUAD8" - }; - med_geometrie_element typare[MED_NBR_GEOMETRIE_ARETE] = - { MED_SEG2, MED_SEG3 }; - med_int desare[MED_NBR_GEOMETRIE_ARETE] = { 2, 3 }; - med_int naretes[MED_NBR_GEOMETRIE_ARETE]; - char nomare[MED_NBR_GEOMETRIE_ARETE][MED_TAILLE_NOM + 1] = - { "MED_SEG2", "MED_SEG3" }; - - typ_con = MED_NOD; - mode_coo = MED_FULL_INTERLACE; - numero = myMeshId; - - //---- provisoire : switch pour ecrire les familles de mailles - int besoinfamilledemaille = 1; - //---- provisoire : switch pour ecrire les familles de mailles - - /**************************************************************************** - * OUVERTURE DU FICHIER EN ECRITURE * - ****************************************************************************/ - char *file2Read = (char *)myFile.c_str(); - - MESSAGE(" file2Read " << file2Read) - myFileId = MEDouvrir(file2Read, MED_REMP); - if (myFileId < 0) - { - fprintf(stderr, ">> ERREUR : ouverture du fichier %s \n", file2Read); - exit(EXIT_FAILURE); - } +void DriverMED_W_SMESHDS_Mesh::AddGroupOfVolumes() +{ + myDoGroupOfVolumes = true; +} - /**************************************************************************** - * NOMBRES D'OBJETS MED * - ****************************************************************************/ - MESSAGE("(****************************)"); - MESSAGE("(* INFORMATIONS GENERALES : *)"); - MESSAGE("(****************************)"); - - /* calcul de la dimension */ - mdim = 2; - double epsilon = 0.00001; - double nodeRefX; - double nodeRefY; - double nodeRefZ; - - bool dimX = true; - bool dimY = true; - bool dimZ = true; - - int inode = 0; - SMDS_Iterator * myItNodes=myMesh->nodesIterator(); - while(myItNodes->more()) - { - const SMDS_MeshNode * node = myItNodes->next(); - if (inode == 0) - { - nodeRefX = fabs(node->X()); - nodeRefY = fabs(node->Y()); - nodeRefZ = fabs(node->Z()); - } - SCRUTE(inode); - SCRUTE(nodeRefX); - SCRUTE(nodeRefY); - SCRUTE(nodeRefZ); - - if (inode != 0) - { - if ((fabs(fabs(node->X()) - nodeRefX) > epsilon) && dimX) - dimX = false; - if ((fabs(fabs(node->Y()) - nodeRefY) > epsilon) && dimY) - dimY = false; - if ((fabs(fabs(node->Z()) - nodeRefZ) > epsilon) && dimZ) - dimZ = false; - } - if (!dimX && !dimY && !dimZ) - { - mdim = 3; - break; - } - inode++; - } +void DriverMED_W_SMESHDS_Mesh::Write() +{ + string myClass = string("SMDS_Mesh"); + string myExtension = string("MED"); - if (mdim != 3) - { - if (dimX && dimY && dimZ) - mdim = 0; - else if (!dimX) - { - if (dimY && dimZ) - mdim = 1; - else if ((dimY && !dimZ) || (!dimY && dimZ)) - mdim = 2; - } - else if (!dimY) - { - if (dimX && dimZ) - mdim = 1; - else if ((dimX && !dimZ) || (!dimX && dimZ)) - mdim = 2; - } - else if (!dimZ) - { - if (dimY && dimX) - mdim = 1; - else if ((dimY && !dimX) || (!dimY && dimX)) - mdim = 2; - } - } + DriverMED_W_SMDS_Mesh *myWriter = new DriverMED_W_SMDS_Mesh; - MESSAGE(" mdim " << mdim); - - /* creation du maillage */ - //mdim=3; - sprintf(nommaa, "Mesh %d", numero); - SCRUTE(nommaa); - ret = MEDmaaCr(myFileId, nommaa, mdim); - - ASSERT(ret == 0); - SCRUTE(ret); - - /* Combien de noeuds ? */ - nnoe = myMesh->NbNodes(); - //SCRUTE(nnoe); - /* Combien de mailles, faces ou aretes ? */ - for (i = 0; i < MED_NBR_GEOMETRIE_MAILLE; i++) - nmailles[i] = 0; - - int nb_of_nodes, nb_of_faces, nb_of_edges; - vector < int >elem_Id[MED_NBR_GEOMETRIE_MAILLE]; - - nb_of_edges = myMesh->NbEdges(); - SMDS_Iterator * itEdges=myMesh->edgesIterator(); - while(itEdges->more()) - { - const SMDS_MeshEdge * elem = itEdges->next(); - - nb_of_nodes = elem->NbNodes(); - - switch (nb_of_nodes) - { - case 2: - { - elem_Id[1].push_back(elem->GetID()); - nmailles[1]++; - break; - } - case 3: - { - elem_Id[2].push_back(elem->GetID()); - nmailles[2]++; - break; - } - } - } + myWriter->SetMesh(myMesh); + // myWriter->SetFile(myFile); + myWriter->SetMeshId(myMeshId); + myWriter->SetFileId(myFileId); - nb_of_faces = myMesh->NbFaces(); - SMDS_Iterator * itFaces=myMesh->facesIterator(); - while(itFaces->more()) - { - const SMDS_MeshElement * elem = itFaces->next(); - - nb_of_nodes = elem->NbNodes(); - - switch (nb_of_nodes) - { - case 3: - { - elem_Id[3].push_back(elem->GetID()); - nmailles[3]++; - break; - } - case 4: - { - elem_Id[5].push_back(elem->GetID()); - nmailles[5]++; - break; - } - case 6: - { - elem_Id[4].push_back(elem->GetID()); - nmailles[4]++; - break; - } - } + myWriter->Write(); +} +void DriverMED_W_SMESHDS_Mesh::Add() +{ + if (myMesh->hasConstructionEdges() || myMesh->hasConstructionFaces()) { + INFOS("SMDS_MESH with hasConstructionEdges() or hasConstructionFaces() do not supports!!!"); + return; + } + try{ + using namespace MEDA; + using namespace boost; + + MESSAGE("Add - myFile : "<GetName()); + aMed.SetMeshInfo(aMeshInfo); + + // Storing SMDS groups and sub-meshes + //----------------------------------- + int myNodesDefaultFamilyId = 0; + int myEdgesDefaultFamilyId = 0; + int myFacesDefaultFamilyId = 0; + int myVolumesDefaultFamilyId = 0; + if (myDoGroupOfNodes) + myNodesDefaultFamilyId = REST_NODES_FAMILY; + if (myDoGroupOfEdges) + myEdgesDefaultFamilyId = REST_EDGES_FAMILY; + if (myDoGroupOfFaces) + myFacesDefaultFamilyId = REST_FACES_FAMILY; + if (myDoGroupOfVolumes) + myVolumesDefaultFamilyId = REST_VOLUMES_FAMILY; + + MESSAGE("Add - aFamilyInfo"); + map anElemFamMap; + list aFamilies; + if (myAllSubMeshes) { + SMESHDS_Mesh* aSMESHDSMesh = dynamic_cast(myMesh); + if (!aSMESHDSMesh) { + EXCEPTION(runtime_error,"Can not cast SMDS_Mesh to SMESHDS_Mesh"); + } + aFamilies = DriverMED_Family::MakeFamilies + (aSMESHDSMesh->SubMeshes(), myGroups, + myDoGroupOfNodes, myDoGroupOfEdges, myDoGroupOfFaces, myDoGroupOfVolumes); + } else { + aFamilies = DriverMED_Family::MakeFamilies + (mySubMeshes, myGroups, + myDoGroupOfNodes, myDoGroupOfEdges, myDoGroupOfFaces, myDoGroupOfVolumes); + } + list::iterator aFamsIter = aFamilies.begin(); + + for (; aFamsIter != aFamilies.end(); aFamsIter++) + { + PFamilyInfo aFamilyInfo = (*aFamsIter)->GetFamilyInfo(aMeshInfo); + aMed.SetFamilyInfo(aFamilyInfo); + int aFamId = (*aFamsIter)->GetId(); + + const set& anElems = (*aFamsIter)->GetElements(); + set::iterator anElemsIter = anElems.begin(); + for (; anElemsIter != anElems.end(); anElemsIter++) + { + anElemFamMap[*anElemsIter] = aFamId; + } +// delete (*aFamsIter); + } + + // Storing SMDS nodes to the MED file for the MED mesh + //---------------------------------------------------- + med_int aNbElems = myMesh->NbNodes(); + MED::TIntVector anElemNums(aNbElems); + MED::TIntVector aFamilyNums(aNbElems); + MED::TFloatVector aCoordinates(aNbElems*SMDS_MESH_DIM); + SMDS_NodeIteratorPtr aNodesIter = myMesh->nodesIterator(); + for(med_int iNode = 0, iCoord = 0; aNodesIter->more(); iNode++, iCoord+=SMDS_MESH_DIM){ + const SMDS_MeshNode* aNode = aNodesIter->next(); + aCoordinates[iCoord] = aNode->X(); + aCoordinates[iCoord+1] = aNode->Y(); + aCoordinates[iCoord+2] = aNode->Z(); + anElemNums[iNode] = aNode->GetID(); + //cout<GetID()<<": "<X()<<", "<Y()<<", "<Z()<GetNbElem() = "<NbEdges()){ + SMDS_EdgeIteratorPtr anIter = myMesh->edgesIterator(); + med_int aNbConnectivity = MED::GetNbConn(SMDS_MED_ENTITY,MED_SEG2,SMDS_MESH_DIM); + MED::TIntVector anElemNums(aNbElems); + MED::TIntVector aFamilyNums(aNbElems); + MED::TIntVector aConnectivity(aNbElems*aNbConnectivity); + + for(med_int iElem = 0, iConn = 0; anIter->more(); iElem++, iConn+=aNbConnectivity){ + const SMDS_MeshEdge* anElem = anIter->next(); + SMDS_ElemIteratorPtr aNodesIter = anElem->nodesIterator(); + for(med_int iNode = 0; iNode < aNbConnectivity && aNodesIter->more(); iNode++){ + const SMDS_MeshElement* aNode = aNodesIter->next(); + aConnectivity[iConn+iNode] = aNode->GetID(); } - - SMDS_Iterator * itVolumes=myMesh->volumesIterator(); - while(itVolumes->more()) - { - const SMDS_MeshElement * elem = itVolumes->next(); - - nb_of_nodes = elem->NbNodes(); - switch (nb_of_nodes) - { - case 8: - { - elem_Id[9].push_back(elem->GetID()); - nmailles[9]++; - break; - } - case 4 : - { - elem_Id[7].push_back(elem->GetID()); - nmailles[7]++; - break; - } - } + anElemNums[iElem] = anElem->GetID(); + //cout<GetID()<<": "; + //for(med_int iNode = 0; iNode < aNbNodes; iNode++) + // cout<<(*aConnectivity)[iConn+iNode]<<", "; + //cout<NbFaces()){ + SMDS_FaceIteratorPtr anIter = myMesh->facesIterator(); + + med_int aNbTriaConn = MED::GetNbConn(SMDS_MED_ENTITY,MED_TRIA3,SMDS_MESH_DIM); + MED::TIntVector anTriaElemNums; + anTriaElemNums.reserve(aNbElems); + MED::TIntVector aTriaFamilyNums; + aTriaFamilyNums.reserve(aNbElems); + MED::TIntVector aTriaConn; + aTriaConn.reserve(aNbElems*aNbTriaConn); + + med_int aNbQuadConn = MED::GetNbConn(SMDS_MED_ENTITY,MED_QUAD4,SMDS_MESH_DIM); + MED::TIntVector aQuadElemNums; + aQuadElemNums.reserve(aNbElems); + MED::TIntVector aQuadFamilyNums; + aQuadFamilyNums.reserve(aNbElems); + MED::TIntVector aQuadConn; + aQuadConn.reserve(aNbElems*aNbQuadConn); + + for(med_int iElem = 0; iElem < aNbElems && anIter->more(); iElem++){ + const SMDS_MeshFace* anElem = anIter->next(); + med_int aNbNodes = anElem->NbNodes(); + SMDS_ElemIteratorPtr aNodesIter = anElem->nodesIterator(); + med_int aNbConnectivity; + MED::TIntVector* anElemNums; + MED::TIntVector* aFamilyNums; + MED::TIntVector* aConnectivity; + switch(aNbNodes){ + case 3: + aNbConnectivity = aNbTriaConn; + anElemNums = &anTriaElemNums; + aFamilyNums = &aTriaFamilyNums; + aConnectivity = &aTriaConn; + break; + case 4: + aNbConnectivity = aNbQuadConn; + anElemNums = &aQuadElemNums; + aFamilyNums = &aQuadFamilyNums; + aConnectivity = &aQuadConn; + break; } - - /**************************************************************************** - * ECRITURE DES NOEUDS * - ****************************************************************************/ - MESSAGE("(************************)"); - MESSAGE("(* NOEUDS DU MAILLAGE : *)"); - MESSAGE("(************************)"); - - /* Allocations memoires */ - /* table des coordonnees - * profil : (dimension * nombre de noeuds ) */ - coo = (med_float *) malloc(sizeof(med_float) * nnoe * mdim); - /* table des numeros, des numeros de familles des noeuds - * profil : (nombre de noeuds) */ - numnoe = (med_int *) malloc(sizeof(med_int) * nnoe); - nufano = (med_int *) malloc(sizeof(med_int) * nnoe); - /* table des noms des noeuds - * profil : (nnoe*MED_TAILLE_PNOM+1) */ - nomnoe = ""; - - /* PN pour aster, il faut une famille 0 pour les noeuds et une autre pour les elements */ - /* PN : Creation de la famille 0 */ - char *nomfam = "FAMILLE_0"; - char *attdes = ""; - char *gro = 0; - med_int ngro = 0; - med_int natt = 1; - med_int attide = 0; - med_int attval = 0; - med_int numfam = 0; - med_int attvalabs = 1; - ret = - MEDfamCr(myFileId, nommaa, nomfam, numfam, &attide, &attval, attdes, - natt, gro, ngro); - ASSERT(ret == 0); - - /* PN : FIN Creation de la famille 0 */ - - map < int, int >mapNoeud; - typedef pair < set < int >::iterator, bool > IsFamily; - int nbFamillesNoeud; - - i = 0; - set < int >FamilySet; - nbFamillesNoeud = 0; - int verifienbnoeuds = 0; - med_int *rien = 0; - - SMDS_Iterator * itNodes=myMesh->nodesIterator(); - while(itNodes->more()) - { - const SMDS_MeshNode * node = itNodes->next(); - - if (mdim == 3) - { - coo[i * 3] = node->X(); - coo[i * 3 + 1] = node->Y(); - coo[i * 3 + 2] = node->Z(); - } - else if (mdim == 2) - { - if (dimX) - { - coo[i * 2] = node->Y(); - coo[i * 2 + 1] = node->Z(); - } - if (dimY) - { - coo[i * 2] = node->X(); - coo[i * 2 + 1] = node->Z(); - } - if (dimZ) - { - coo[i * 2] = node->X(); - coo[i * 2 + 1] = node->Y(); - } - } - else - { - if (dimX) - { - coo[i * 2] = node->Y(); - coo[i * 2 + 1] = node->Z(); - } - if (dimY) - { - coo[i * 2] = node->X(); - coo[i * 2 + 1] = node->Z(); - } - if (dimZ) - { - coo[i * 2] = node->X(); - coo[i * 2 + 1] = node->Y(); - } - } - mapNoeud[node->GetID()] = i + 1; - - // renvoie 0 pour les noeuds internes du volume - int numfamille = node->GetPosition()->GetShapeId(); - nufano[i] = numfamille; - - //SCRUTE(i); - //SCRUTE(nufano[i]); - //SCRUTE(coo[i*3]); - //SCRUTE(coo[i*3+1]); - //SCRUTE(coo[i*3+2]); - if (nufano[i] != 0) - { - IsFamily deja = FamilySet.insert(nufano[i]); // insert if new, or gives existant - if (deja.second) // actually inserted - { - char famille[MED_TAILLE_NOM + 1]; - sprintf(famille, "F%d", nufano[i]); - // CreateFamily(strdup(nommaa),strdup(famille),nufano[i],attvalabs++); - attvalabs++; - CreateFamily(strdup(nommaa), strdup(famille), nufano[i], - numfamille); - //MESSAGE("---famille-noeud--- "<more(); iNode++){ + const SMDS_MeshElement* aNode = aNodesIter->next(); + aVector[iNode] = aNode->GetID(); } - ret = MEDnoeudsEcr(myFileId, nommaa, mdim, coo, mode_coo, MED_CART, - nomcoo, unicoo, nomnoe, MED_FAUX, rien, MED_FAUX, - nufano, nnoe, MED_REMP); - ASSERT(ret == 0); - MESSAGE("--- Creation de " << verifienbnoeuds << " noeuds"); - ASSERT(verifienbnoeuds == nnoe); - MESSAGE("--- Creation de " << nbFamillesNoeud << " familles de noeuds"); - - /* liberation memoire */ - free(coo); - free(numnoe); - free(nufano); - - /**************************************************************************** - * ECRITURE DES ELEMENTS * - ****************************************************************************/ - MESSAGE("(**************************)"); - MESSAGE("(* ELEMENTS DU MAILLAGE : *)"); - MESSAGE("(**************************)"); - - /* Ecriture des connectivites, noms, numeros des mailles */ - - if (ret == 0) - { - int nbFamillesElts = 0; - SMESHDS_Mesh * mySMESHDSMesh = dynamic_cast(myMesh); - TopTools_IndexedMapOfShape myIndexToShape; - TopExp::MapShapes(mySMESHDSMesh->ShapeToMesh(), myIndexToShape); - - map mapFamille; - - if (besoinfamilledemaille == 1) - { - int t; - for (t = 1; t <= myIndexToShape.Extent(); t++) - { - const TopoDS_Shape S = myIndexToShape(t); - if (mySMESHDSMesh->HasMeshElements(S)) - { - //MESSAGE ("********* Traitement de la Famille "<<-t); - - SMESHDS_SubMesh * SM = mySMESHDSMesh->MeshElements(S); - SMDS_Iterator * ite=SM->GetElements(); - bool plein = false; - while(ite->more()) - { - mapFamille[ite->next()->GetID()] = -t; - plein = true; - } - if (plein) - { - nbFamillesElts++; - char famille[MED_TAILLE_NOM + 1]; - sprintf(famille, "E%d", t); - CreateFamily(strdup(nommaa), strdup(famille), -t, - attvalabs++); - } - } - } - } - - int indice = 1; - for (i = 0; i < MED_NBR_GEOMETRIE_MAILLE; i++) - { - if (nmailles[i] > 0 && ret == 0) - { - MESSAGE(" Start " << typmai[i]); - - /* dimension de la maille */ - edim = typmai[i] / 100; - nsup = 0; - if (mdim == 2 || mdim == 3) - if (edim == 1) - nsup = 1; - if (mdim == 3) - if (edim == 2) - nsup = 1; - //SCRUTE(nsup); - - taille = nsup + typmai[i] % 100; - //SCRUTE(taille); - - /* allocation memoire */ - connectivite = - (med_int *) malloc(sizeof(med_int) * taille * nmailles[i]); - /* nomele = - (char *)malloc(sizeof(char) * MED_TAILLE_PNOM * - nmailles[i] + 1);*/ - nomele = ""; - numele = (med_int *) malloc(sizeof(med_int) * nmailles[i]); - nufael = (med_int *) malloc(sizeof(med_int) * nmailles[i]); - nbNodes = typmai[i] % 100; - - for (j = 0; j < nmailles[i]; j++) - { - myId = elem_Id[i][j]; - const SMDS_MeshElement * elem = - myMesh->FindElement(myId); - //*(numele+j) = myId; - *(numele + j) = indice++; - - SMDS_Iterator * itk=elem->nodesIterator(); - for (k = 0; itk->more(); k++) - { - *(connectivite + j * taille + k) = - mapNoeud[itk->next()->GetID()]; - } - delete itk; - - if (nsup) - *(connectivite + j * taille + nbNodes) = 0; - - if (besoinfamilledemaille == 1) - { - if (mapFamille.find(myId) != mapFamille.end()) - { - nufael[j] = mapFamille[myId]; - } - else - { - nufael[j] = 0; - } - } - else - { - nufael[j] = 0; - } - - //SCRUTE(myId); - //SCRUTE(j); - //SCRUTE(nufael[j]); - } - - /* ecriture des données */ - - med_int *rien = 0; - ret = - MEDelementsEcr(myFileId, nommaa, mdim, connectivite, - mode_coo, nomele, MED_FAUX, numele, MED_VRAI, nufael, - nmailles[i], MED_MAILLE, typmai[i], typ_con, MED_REMP); - ASSERT(ret == 0); - //SCRUTE(ret); - - if (ret < 0) - MESSAGE(">> ERREUR : ecriture des mailles \n"); - - /* liberation memoire */ - free(connectivite); - free(numele); - free(nufael); - MESSAGE(" End " << typmai[i]); - } - }; - MESSAGE("--- Creation de " << nbFamillesElts << " familles d elements"); + med_int aSize = aConnectivity->size(); + aConnectivity->resize(aSize+aNbConnectivity); + // There is some differnce between SMDS and MED in cells mapping + switch(aNbNodes){ + case 4: + (*aConnectivity)[aSize+0] = aVector[0]; + (*aConnectivity)[aSize+1] = aVector[1]; + (*aConnectivity)[aSize+2] = aVector[3]; + (*aConnectivity)[aSize+3] = aVector[2]; + default: + for(med_int iNode = 0; iNode < aNbNodes; iNode++) + (*aConnectivity)[aSize+iNode] = aVector[iNode]; + } + anElemNums->push_back(anElem->GetID()); + //cout<GetID()<<": "; + //for(med_int iNode = 0; iNode < aNbNodes; iNode++) + // cout<<(*aConnectivity)[aSize+iNode]<<", "; + //cout<push_back(anElemFamMap[anElem]); + else + aFamilyNums->push_back(myFacesDefaultFamilyId); + } + if(med_int aNbElems = anTriaElemNums.size()){ + PCellInfo aCellInfo = TWrapper::CrCellInfo(aMeshInfo, + SMDS_MED_ENTITY, + MED_TRIA3, + SMDS_MED_CONNECTIVITY, + aTriaConn, + aTriaFamilyNums, + anTriaElemNums); + MESSAGE("Add - anEntity = "<> ERREUR : erreur a la fermeture du fichier %s\n", - file2Read); - MESSAGE("fichier ferme"); - -} - -void DriverMED_W_SMESHDS_Mesh::CreateFamily(char *nommaa, char *famille, int i, - med_int k) -{ - - med_int ngro = 0; - med_int natt; - - natt = 1; - char attdes[MED_TAILLE_DESC + 1]; - char gro[MED_TAILLE_LNOM + 1]; - char fam2[MED_TAILLE_LNOM + 1]; - - strcpy(attdes, ""); - strcpy(gro, ""); - strcpy(fam2, famille); - - med_int *attide = new med_int[1]; - med_int *attval = new med_int[1]; - attide[0] = k; - attval[0] = k; - - //MESSAGE("-------- Creation de la Famille : "<< famille << "numero " << i << " --------------"); - med_int ret = - MEDfamCr(myFileId, nommaa, fam2, i, attide, attval, attdes, natt, gro, - ngro); - ASSERT(ret == 0); - delete[]attide; - delete[]attval; - + MED::TIntVector aVector(aNbNodes); + for(med_int iNode = 0; aNodesIter->more(); iNode++){ + const SMDS_MeshElement* aNode = aNodesIter->next(); + aVector[iNode] = aNode->GetID(); + } + med_int aSize = aConnectivity->size(); + aConnectivity->resize(aSize+aNbConnectivity); + // There is some difference between SMDS and MED in cells mapping + switch(aNbNodes){ + case 5: + (*aConnectivity)[aSize+0] = aVector[0]; + (*aConnectivity)[aSize+1] = aVector[3]; + (*aConnectivity)[aSize+2] = aVector[2]; + (*aConnectivity)[aSize+3] = aVector[1]; + (*aConnectivity)[aSize+4] = aVector[4]; + default: + for(med_int iNode = 0; iNode < aNbNodes; iNode++) + (*aConnectivity)[aSize+iNode] = aVector[iNode]; + } + anElemNums->push_back(anElem->GetID()); + + if (anElemFamMap.find(anElem) != anElemFamMap.end()) + aFamilyNums->push_back(anElemFamMap[anElem]); + else + aFamilyNums->push_back(myVolumesDefaultFamilyId); + } + + if(med_int aNbElems = anTetraElemNums.size()){ + PCellInfo aCellInfo = TWrapper::CrCellInfo(aMeshInfo, + SMDS_MED_ENTITY, + MED_TETRA4, + SMDS_MED_CONNECTIVITY, + aTetraConn, + aTetraFamilyNums, + anTetraElemNums); + MESSAGE("Add - anEntity = "< +#include +#include extern "C" { #include } +using namespace std; + +class SMESHDS_Group; +class SMESHDS_SubMesh; + class DriverMED_W_SMESHDS_Mesh:public Mesh_Writer { + public: - public:DriverMED_W_SMESHDS_Mesh(); - ~DriverMED_W_SMESHDS_Mesh(); + DriverMED_W_SMESHDS_Mesh(); + ~DriverMED_W_SMESHDS_Mesh(); - void Add(); - void Write(); - void SetMesh(SMDS_Mesh * aMesh); - void SetFile(string); + /*! sets file name; only for usage with Add(), not Write() + */ + void SetFile(string); + void AddGroupOfNodes(); + void AddGroupOfEdges(); + void AddGroupOfFaces(); + void AddGroupOfVolumes(); - void SetFileId(med_idt); - void SetMeshId(int); + /*! functions to prepare adding one mesh + */ + void SetMesh(SMDS_Mesh * aMesh); + void SetMeshId(int); + void SetMeshName(string theMeshName); + void AddGroup(SMESHDS_Group* theGroup); + void AddAllSubMeshes(); + void AddSubMesh(SMESHDS_SubMesh* theSubMesh, int theID); - void CreateFamily(char *, char *, int, med_int); + /*! add one mesh + */ + void Add(); - private: SMDS_Mesh * myMesh; - string myFile; - med_idt myFileId; - int myMeshId; + /*! functions to write via DriverMED_W_SMDS_Mesh (no groups) + */ + void SetFileId(med_idt); + void Write(); + private: + + SMDS_Mesh * myMesh; + string myFile; + med_idt myFileId; + int myMeshId; + string myMeshName; + list myGroups; + bool myAllSubMeshes; + map mySubMeshes; + bool myDoGroupOfNodes; + bool myDoGroupOfEdges; + bool myDoGroupOfFaces; + bool myDoGroupOfVolumes; }; #endif + diff --git a/src/DriverMED/Makefile.in b/src/DriverMED/Makefile.in index 4217426f5..18d72045c 100644 --- a/src/DriverMED/Makefile.in +++ b/src/DriverMED/Makefile.in @@ -35,7 +35,10 @@ VPATH=.:@srcdir@ @COMMENCE@ # header files -EXPORT_HEADERS= DriverMED_R_SMDS_Mesh.h DriverMED_R_SMESHDS_Mesh.h DriverMED_R_SMESHDS_Document.h DriverMED_W_SMDS_Mesh.h DriverMED_W_SMESHDS_Mesh.h DriverMED_W_SMESHDS_Document.h +EXPORT_HEADERS = \ + DriverMED_R_SMDS_Mesh.h DriverMED_R_SMESHDS_Mesh.h DriverMED_R_SMESHDS_Document.h \ + DriverMED_W_SMDS_Mesh.h DriverMED_W_SMESHDS_Mesh.h DriverMED_W_SMESHDS_Document.h \ + DriverMED_Family.h # Libraries targets LIB = libMeshDriverMED.la @@ -45,15 +48,16 @@ LIB_SRC = \ DriverMED_R_SMESHDS_Document.cxx \ DriverMED_W_SMDS_Mesh.cxx \ DriverMED_W_SMESHDS_Document.cxx \ - DriverMED_W_SMESHDS_Mesh.cxx + DriverMED_W_SMESHDS_Mesh.cxx \ + DriverMED_Family.cxx LIB_CLIENT_IDL = LIB_SERVER_IDL = # additionnal information to compil and link file -CPPFLAGS += $(OCC_INCLUDES) $(QT_INCLUDES) -I${KERNEL_ROOT_DIR}/include/salome +CPPFLAGS += $(OCC_INCLUDES) $(QT_INCLUDES) -I${KERNEL_ROOT_DIR}/include/salome $(BOOST_CPPFLAGS) CXXFLAGS += $(OCC_CXXFLAGS) $(MED2_INCLUDES) -I${KERNEL_ROOT_DIR}/include/salome -LDFLAGS += $(MED2_LIBS) -lMeshDriver -lmed +LDFLAGS += $(MED2_LIBS) -lMeshDriver -L${KERNEL_ROOT_DIR}/lib/salome -lMEDWrapper %_moc.cxx: %.h $(MOC) $< -o $@ diff --git a/src/DriverUNV/DriverUNV_W_SMDS_Mesh.cxx b/src/DriverUNV/DriverUNV_W_SMDS_Mesh.cxx index 01b112baa..80c02b461 100644 --- a/src/DriverUNV/DriverUNV_W_SMDS_Mesh.cxx +++ b/src/DriverUNV/DriverUNV_W_SMDS_Mesh.cxx @@ -101,7 +101,7 @@ void DriverUNV_W_SMDS_Mesh::Write() fprintf(myFileId, "%s\n", sUNV_SEPARATOR); fprintf(myFileId, "%s\n", sNODE_UNV_ID); - SMDS_Iterator * itNodes=myMesh->nodesIterator(); + SMDS_NodeIteratorPtr itNodes=myMesh->nodesIterator(); while(itNodes->more()) { const SMDS_MeshNode * node = itNodes->next(); @@ -110,7 +110,6 @@ void DriverUNV_W_SMDS_Mesh::Write() fprintf(myFileId, "%25.16E%25.16E%25.16E\n", node->X(), node->Y(), node->Z()); } - delete itNodes; fprintf(myFileId, "%s\n", sUNV_SEPARATOR); /**************************************************************************** @@ -124,11 +123,11 @@ void DriverUNV_W_SMDS_Mesh::Write() fprintf(myFileId, "%s\n", sUNV_SEPARATOR); fprintf(myFileId, "%s\n", sELT_UNV_ID); - SMDS_Iterator * itEdges=myMesh->edgesIterator(); + SMDS_EdgeIteratorPtr itEdges=myMesh->edgesIterator(); while(itEdges->more()) { const SMDS_MeshElement * elem = itEdges->next(); - SMDS_Iterator *itn=elem->nodesIterator(); + SMDS_ElemIteratorPtr itn=elem->nodesIterator(); switch (elem->NbNodes()) { @@ -149,11 +148,9 @@ void DriverUNV_W_SMDS_Mesh::Write() break; } - delete itn; } - delete itEdges; - SMDS_Iterator * itFaces=myMesh->facesIterator(); + SMDS_FaceIteratorPtr itFaces=myMesh->facesIterator(); while(itFaces->more()) { const SMDS_MeshElement * elem = itFaces->next(); @@ -184,15 +181,13 @@ void DriverUNV_W_SMDS_Mesh::Write() fprintf(myFileId, "element not registered\n"); } - SMDS_Iterator *itn=elem->nodesIterator(); + SMDS_ElemIteratorPtr itn=elem->nodesIterator(); while(itn->more()) fprintf(myFileId, "%10d", itn->next()->GetID()); - delete itn; fprintf(myFileId, "\n"); } - delete itFaces; - SMDS_Iterator * itVolumes=myMesh->volumesIterator(); + SMDS_VolumeIteratorPtr itVolumes=myMesh->volumesIterator(); while(itVolumes->more()) { const SMDS_MeshElement * elem = itVolumes->next(); @@ -216,13 +211,11 @@ void DriverUNV_W_SMDS_Mesh::Write() break; } - SMDS_Iterator *itn=elem->nodesIterator(); + SMDS_ElemIteratorPtr itn=elem->nodesIterator(); while(itn->more()) fprintf(myFileId, "%10d", itn->next()->GetID()); - delete itn; fprintf(myFileId, "\n"); } - delete itVolumes; fprintf(myFileId, "%s\n", sUNV_SEPARATOR); diff --git a/src/DriverUNV/DriverUNV_W_SMESHDS_Mesh.cxx b/src/DriverUNV/DriverUNV_W_SMESHDS_Mesh.cxx index 2923f9fa5..905eed9ca 100644 --- a/src/DriverUNV/DriverUNV_W_SMESHDS_Mesh.cxx +++ b/src/DriverUNV/DriverUNV_W_SMESHDS_Mesh.cxx @@ -112,7 +112,7 @@ void DriverUNV_W_SMESHDS_Mesh::Add() fprintf(myFileId, "%s\n", sUNV_SEPARATOR); fprintf(myFileId, "%s\n", sNODE_UNV_ID); - SMDS_Iterator * itNodes=myMesh->nodesIterator(); + SMDS_NodeIteratorPtr itNodes=myMesh->nodesIterator(); while(itNodes->more()) { const SMDS_MeshNode * node = itNodes->next(); @@ -121,7 +121,6 @@ void DriverUNV_W_SMESHDS_Mesh::Add() fprintf(myFileId, "%25.16E%25.16E%25.16E\n", node->X(), node->Y(), node->Z()); } - delete itNodes; fprintf(myFileId, "%s\n", sUNV_SEPARATOR); /**************************************************************************** @@ -135,11 +134,11 @@ void DriverUNV_W_SMESHDS_Mesh::Add() fprintf(myFileId, "%s\n", sUNV_SEPARATOR); fprintf(myFileId, "%s\n", sELT_UNV_ID); - SMDS_Iterator * itEdges=myMesh->edgesIterator(); + SMDS_EdgeIteratorPtr itEdges=myMesh->edgesIterator(); while(itEdges->more()) { const SMDS_MeshEdge * elem = itEdges->next(); - SMDS_Iterator *itn=elem->nodesIterator(); + SMDS_ElemIteratorPtr itn=elem->nodesIterator(); switch (elem->NbNodes()) { @@ -159,11 +158,9 @@ void DriverUNV_W_SMESHDS_Mesh::Add() itn->next()->GetID(), itn->next()->GetID()); break; } - delete itn; } - delete itEdges; - SMDS_Iterator * itFaces=myMesh->facesIterator(); + SMDS_FaceIteratorPtr itFaces=myMesh->facesIterator(); while(itFaces->more()) { const SMDS_MeshElement * elem = itFaces->next(); @@ -194,15 +191,13 @@ void DriverUNV_W_SMESHDS_Mesh::Add() fprintf(myFileId, "element not registered\n"); } - SMDS_Iterator *itn=elem->nodesIterator(); + SMDS_ElemIteratorPtr itn=elem->nodesIterator(); while(itn->more()) fprintf(myFileId, "%10d", itn->next()->GetID()); - delete itn; fprintf(myFileId, "\n"); } - delete itFaces; - SMDS_Iterator * itVolumes=myMesh->volumesIterator(); + SMDS_VolumeIteratorPtr itVolumes=myMesh->volumesIterator(); while(itVolumes->more()) { const SMDS_MeshElement * elem = itVolumes->next(); @@ -226,13 +221,11 @@ void DriverUNV_W_SMESHDS_Mesh::Add() break; } - SMDS_Iterator *itn=elem->nodesIterator(); + SMDS_ElemIteratorPtr itn=elem->nodesIterator(); while(itn->more()) fprintf(myFileId, "%10d", itn->next()->GetID()); - delete itn; fprintf(myFileId, "\n"); } - delete itVolumes; fprintf(myFileId, "%s\n", sUNV_SEPARATOR); fclose(myFileId); diff --git a/src/DriverUNV/Makefile.in b/src/DriverUNV/Makefile.in index cfb048787..038ab87f1 100644 --- a/src/DriverUNV/Makefile.in +++ b/src/DriverUNV/Makefile.in @@ -53,7 +53,7 @@ LIB_CLIENT_IDL = LIB_SERVER_IDL = # additionnal information to compil and link file -CPPFLAGS += $(OCC_INCLUDES) -I${KERNEL_ROOT_DIR}/include/salome +CPPFLAGS += $(OCC_INCLUDES) -I${KERNEL_ROOT_DIR}/include/salome $(BOOST_CPPFLAGS) CXXFLAGS += $(OCC_CXXFLAGS) $(MED2_INCLUDES) -I${KERNEL_ROOT_DIR}/include/salome LDFLAGS += $(MED2_LIBS) -lMeshDriver diff --git a/src/Makefile.in b/src/Makefile.in index c3dd0dc5e..0527a7abe 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -31,14 +31,9 @@ VPATH=.:@srcdir@ @COMMENCE@ -SUBDIRS = OBJECT SMDS SMESHDS Driver DriverMED DriverDAT DriverUNV MEFISTO2 \ - SMESH SMESH_I SMESHFiltersSelection SMESHGUI \ - SMESH_SWIG - -ifeq (@WITHNETGEN@,yes) -SUBDIRS = OBJECT SMDS SMESHDS Driver DriverMED DriverDAT DriverUNV MEFISTO2 \ - NETGEN SMESH SMESH_I SMESHFiltersSelection SMESHGUI \ - SMESH_SWIG -endif +SUBDIRS = \ + SMDS SMESHDS Driver DriverMED DriverDAT DriverUNV \ + SMESH SMESH_I OBJECT SMESHFiltersSelection SMESHGUI SMESH_SWIG \ + MEFISTO2 StdMeshers StdMeshers_I StdMeshersGUI @MODULE@ diff --git a/src/OBJECT/Makefile.in b/src/OBJECT/Makefile.in index fbce0dc25..ac9be864c 100644 --- a/src/OBJECT/Makefile.in +++ b/src/OBJECT/Makefile.in @@ -27,31 +27,32 @@ top_srcdir=@top_srcdir@ top_builddir=../.. srcdir=@srcdir@ -VPATH=.:@srcdir@:@top_srcdir@/idl:$(top_builddir)/idl:${KERNEL_ROOT_DIR}/idl/salome:${MED_ROOT_DIR}/idl/salome +VPATH=.:@srcdir@:@top_srcdir@/idl:$(top_builddir)/idl @COMMENCE@ -EXPORT_HEADERS = SMESH_Actor.h \ - SMESH_Grid.h +EXPORT_HEADERS = SMESH_Actor.h SMESH_Object.h # Libraries targets LIB = libSMESHObject.la -LIB_SRC = SMESH_Actor.cxx \ - SMESH_Grid.cxx +LIB_SRC = SMESH_Object.cxx SMESH_DeviceActor.cxx SMESH_Actor.cxx + +LIB_CLIENT_IDL = SALOME_Exception.idl \ + SALOME_GenericObj.idl \ + SMESH_Mesh.idl \ + SMESH_Filter.idl \ + SMESH_Group.idl -LIB_CLIENT_IDL = # Executables targets BIN = BIN_SRC = -CPPFLAGS+=$(QT_INCLUDES) $(PYTHON_INCLUDES) $(OCC_INCLUDES) $(VTK_INCLUDES) $(OGL_INCLUDES) -I${KERNEL_ROOT_DIR}/include/salome -LDFLAGS+=$(QT_MT_LIBS) $(OCC_KERNEL_LIBS) $(VTK_LIBS) $(OGL_LIBS) $(PYTHON_LIBS) -lSalomeObject -L${KERNEL_ROOT_DIR}/lib/salome - -%_moc.cxx: %.h - $(MOC) $< -o $@ - +CPPFLAGS+=$(OCC_INCLUDES) $(VTK_INCLUDES) -I${KERNEL_ROOT_DIR}/include/salome \ + $(BOOST_CPPFLAGS) $(QT_INCLUDES) +LDFLAGS+=$(OCC_KERNEL_LIBS) $(VTK_LIBS) -L${KERNEL_ROOT_DIR}/lib/salome -lSMDS \ + -lSalomeGUI -lSalomeObject -lOpUtil @CONCLUDE@ diff --git a/src/OBJECT/SMESH_Actor.cxx b/src/OBJECT/SMESH_Actor.cxx index a48f011be..29a1f094b 100644 --- a/src/OBJECT/SMESH_Actor.cxx +++ b/src/OBJECT/SMESH_Actor.cxx @@ -26,594 +26,1262 @@ // Module : SMESH // $Header$ -using namespace std; -/*! - \class SMESH_Actor SMESH_Actor.h - \brief ... -*/ #include "SMESH_Actor.h" -#include "SMESH_Grid.h" +#include "SMESH_DeviceActor.h" +#include "SALOME_ExtractUnstructuredGrid.h" + +#include "QAD_Config.h" #include "utilities.h" +#include -// VTK Includes #include -#include -#include -#include -#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#ifdef _DEBUG_ +static int MYDEBUG = 1; +static int MYDEBUGWITHFILES = 0; +#else +static int MYDEBUG = 0; +static int MYDEBUGWITHFILES = 0; +#endif -//------------------------------------------------------------- -// Main methods -//------------------------------------------------------------- +using namespace std; -SMESH_Actor* SMESH_Actor::New() -{ - // First try to create the object from the vtkObjectFactory - vtkObject* ret = vtkObjectFactory::CreateInstance("SMESH_Actor"); - if(ret) - { - return (SMESH_Actor*)ret; - } - // If the factory was unable to create the object, then create it here. - return new SMESH_Actor; + +inline float GetFloat(const QString& theValue, float theDefault = 0){ + if(theValue.isEmpty()) return theDefault; + QString aValue = QAD_CONFIG->getSetting(theValue); + if(aValue.isEmpty()) return theDefault; + return aValue.toFloat(); } -SMESH_Actor::SMESH_Actor() -{ - this->Device = vtkActor::New(); +SMESH_Actor* SMESH_Actor::New(){ + return new SMESH_Actor(); +} - this->EdgeDevice = vtkActor::New(); - EdgeDevice->VisibilityOff(); - EdgeDevice->PickableOff(); - this->EdgeShrinkDevice = vtkActor::New(); - EdgeShrinkDevice->VisibilityOff(); - EdgeShrinkDevice->PickableOff(); +SMESH_Actor* SMESH_Actor::New(TVisualObjPtr theVisualObj, + SMESH::FilterManager_ptr theFilterMgr, + const char* theEntry, + const char* theName, + int theIsClear) +{ + SMESH_Actor* anActor = SMESH_Actor::New(); + anActor->Init(theVisualObj,theFilterMgr,theEntry,theName,theIsClear); + return anActor; +} - DataSource = NULL; - myIO = NULL; +SMESH_Actor::SMESH_Actor(){ + if(MYDEBUG) MESSAGE("SMESH_Actor"); + + myIsPointsVisible = false; + + myIsShrinkable = false; + myIsShrunk = false; + + float aPointSize = GetFloat("SMESH:SettingsNodesSize",3); + float aLineWidth = GetFloat("SMESH:SettingsWidth",1); + + vtkMatrix4x4 *aMatrix = vtkMatrix4x4::New(); + SALOME_ExtractUnstructuredGrid* aFilter = NULL; + + //Definition 2D and 3D divices of the actor + //----------------------------------------- + float anRGB[3] = {1,1,1}; + mySurfaceProp = vtkProperty::New(); + anRGB[0] = GetFloat("SMESH:SettingsFillColorRed", 0)/255.; + anRGB[1] = GetFloat("SMESH:SettingsFillColorGreen", 170)/255.; + anRGB[2] = GetFloat("SMESH:SettingsFillColorBlue", 255)/255.; + mySurfaceProp->SetColor(anRGB[0],anRGB[1],anRGB[2]); + + myBackSurfaceProp = vtkProperty::New(); + anRGB[0] = GetFloat("SMESH:SettingsBackFaceColorRed", 0)/255.; + anRGB[1] = GetFloat("SMESH:SettingsBackFaceColorGreen", 0)/255.; + anRGB[2] = GetFloat("SMESH:SettingsBackFaceColorBlue", 255)/255.; + myBackSurfaceProp->SetColor(anRGB[0],anRGB[1],anRGB[2]); + + my2DActor = SMESH_DeviceActor::New(); + my2DActor->SetUserMatrix(aMatrix); + my2DActor->SetStoreMapping(true); + my2DActor->PickableOff(); + my2DActor->SetProperty(mySurfaceProp); + my2DActor->SetBackfaceProperty(myBackSurfaceProp); + my2DActor->SetRepresentation(SMESH_DeviceActor::eSurface); + aFilter = my2DActor->GetExtractUnstructuredGrid(); + aFilter->SetModeOfChanging(SALOME_ExtractUnstructuredGrid::eAdding); + aFilter->RegisterCellsWithType(VTK_TRIANGLE); + aFilter->RegisterCellsWithType(VTK_POLYGON); + aFilter->RegisterCellsWithType(VTK_QUAD); + + my3DActor = SMESH_DeviceActor::New(); + my3DActor->SetUserMatrix(aMatrix); + my3DActor->SetStoreMapping(true); + my3DActor->PickableOff(); + my3DActor->SetProperty(mySurfaceProp); + my3DActor->SetBackfaceProperty(myBackSurfaceProp); + my3DActor->SetRepresentation(SMESH_DeviceActor::eSurface); + aFilter = my3DActor->GetExtractUnstructuredGrid(); + aFilter->SetModeOfChanging(SALOME_ExtractUnstructuredGrid::eAdding); + aFilter->RegisterCellsWithType(VTK_TETRA); + aFilter->RegisterCellsWithType(VTK_VOXEL); + aFilter->RegisterCellsWithType(VTK_HEXAHEDRON); + aFilter->RegisterCellsWithType(VTK_WEDGE); + aFilter->RegisterCellsWithType(VTK_PYRAMID); + + + //Definition 1D divice of the actor + //--------------------------------- + myEdgeProp = vtkProperty::New(); + myEdgeProp->SetAmbient(1.0); + myEdgeProp->SetDiffuse(0.0); + myEdgeProp->SetSpecular(0.0); + anRGB[0] = GetFloat("SMESH:SettingsOutlineColorRed", 0)/255.; + anRGB[1] = GetFloat("SMESH:SettingsOutlineColorGreen", 170)/255.; + anRGB[2] = GetFloat("SMESH:SettingsOutlineColorBlue", 255)/255.; + myEdgeProp->SetColor(anRGB[0],anRGB[1],anRGB[2]); + myEdgeProp->SetLineWidth(aLineWidth); + + my1DActor = SMESH_DeviceActor::New(); + my1DActor->SetUserMatrix(aMatrix); + my1DActor->SetStoreMapping(true); + my1DActor->PickableOff(); + my1DActor->SetProperty(myEdgeProp); + my1DActor->SetRepresentation(SMESH_DeviceActor::eSurface); + aFilter = my1DActor->GetExtractUnstructuredGrid(); + aFilter->SetModeOfChanging(SALOME_ExtractUnstructuredGrid::eAdding); + aFilter->RegisterCellsWithType(VTK_LINE); + + my1DProp = vtkProperty::New(); + my1DProp->DeepCopy(myEdgeProp); + static int aCotnrolLineWidth = 3; + my1DProp->SetLineWidth(aCotnrolLineWidth); + my1DProp->SetPointSize(aPointSize); + + my1DExtProp = vtkProperty::New(); + my1DExtProp->DeepCopy(myEdgeProp); + anRGB[0] = 1 - anRGB[0]; + anRGB[1] = 1 - anRGB[1]; + anRGB[2] = 1 - anRGB[2]; + my1DExtProp->SetColor(anRGB[0],anRGB[1],anRGB[2]); + my1DExtProp->SetLineWidth(aCotnrolLineWidth); + + my1DExtActor = SMESH_DeviceActor::New(); + my1DExtActor->SetUserMatrix(aMatrix); + my1DExtActor->SetStoreMapping(true); + my1DExtActor->PickableOff(); + my1DExtActor->SetVisibility(false); + my1DExtActor->SetProperty(my1DExtProp); + my1DExtActor->SetRepresentation(SMESH_DeviceActor::eInsideframe); + aFilter = my1DExtActor->GetExtractUnstructuredGrid(); + aFilter->SetModeOfChanging(SALOME_ExtractUnstructuredGrid::eAdding); + aFilter->RegisterCellsWithType(VTK_LINE); + + + //Definition 0D divice of the actor + //--------------------------------- + myNodeProp = vtkProperty::New(); + anRGB[0] = GetFloat("SMESH:SettingsNodeColorRed",255)/255.; + anRGB[1] = GetFloat("SMESH:SettingsNodeColorGreen",0)/255.; + anRGB[2] = GetFloat("SMESH:SettingsNodeColorBlue",0)/255.; + myNodeProp->SetColor(anRGB[0],anRGB[1],anRGB[2]); + myNodeProp->SetPointSize(aPointSize); + + myNodeActor = SMESH_DeviceActor::New(); + myNodeActor->SetUserMatrix(aMatrix); + myNodeActor->SetStoreMapping(true); + myNodeActor->PickableOff(); + myNodeActor->SetVisibility(false); + myNodeActor->SetProperty(myNodeProp); + myNodeActor->SetRepresentation(SMESH_DeviceActor::ePoint); + aFilter = myNodeActor->GetExtractUnstructuredGrid(); + aFilter->SetModeOfExtraction(SALOME_ExtractUnstructuredGrid::ePoints); + + + //Definition of Pickable and Highlitable engines + //---------------------------------------------- + + myBaseActor = SMESH_DeviceActor::New(); + myBaseActor->SetUserMatrix(aMatrix); + myBaseActor->SetStoreMapping(true); + myBaseActor->GetProperty()->SetOpacity(0.0); + + myPickableActor = myBaseActor; + + myHighlightProp = vtkProperty::New(); + myHighlightProp->SetAmbient(1.0); + myHighlightProp->SetDiffuse(0.0); + myHighlightProp->SetSpecular(0.0); + anRGB[0] = GetFloat("SMESH:SettingsSelectColorRed", 255)/255.; // 1; + anRGB[1] = GetFloat("SMESH:SettingsSelectColorGreen", 255)/255.; // 1; + anRGB[2] = GetFloat("SMESH:SettingsSelectColorBlue", 255)/255.; // 1; + myHighlightProp->SetColor(anRGB[0],anRGB[1],anRGB[2]); + myHighlightProp->SetPointSize(aPointSize); + myHighlightProp->SetRepresentation(1); + + myPreselectProp = vtkProperty::New(); + myPreselectProp->SetAmbient(1.0); + myPreselectProp->SetDiffuse(0.0); + myPreselectProp->SetSpecular(0.0); + anRGB[0] = GetFloat("SMESH:SettingsPreSelectColorRed", 0)/255.; // 0; + anRGB[1] = GetFloat("SMESH:SettingsPreSelectColorGreen", 255)/255.; // 1; + anRGB[2] = GetFloat("SMESH:SettingsPreSelectColorBlue", 255)/255.; // 1; + myPreselectProp->SetColor(anRGB[0],anRGB[1],anRGB[2]); + myPreselectProp->SetPointSize(aPointSize); + myPreselectProp->SetRepresentation(1); + + myHighlitableActor = SMESH_DeviceActor::New(); + myHighlitableActor->SetUserMatrix(aMatrix); + myHighlitableActor->SetStoreMapping(false); + myHighlitableActor->PickableOff(); + myHighlitableActor->SetRepresentation(SMESH_DeviceActor::eWireframe); + + + SetShrinkFactor(GetFloat("SMESH:SettingsShrinkCoeff", 75)/100.); + myName = ""; + myIO = NULL; myDisplayMode = 0; ishighlighted = false; ispreselected = false; - edgeColor.r = 0.; - edgeColor.g = 0.; - edgeColor.b = 0.; - - edgeHighlightColor.r = 1.; - edgeHighlightColor.g = 1.; - edgeHighlightColor.b = 1.; + myColorMode = eNone; + my1DColorMode = e1DNone; + myControlActor = my2DActor; - edgePreselectedColor.r = 0.; - edgePreselectedColor.g = 1.; - edgePreselectedColor.b = 1.; + //Definition of myScalarBarActor + //------------------------------ + myLookupTable = vtkLookupTable::New(); + //Fix for Bug PAL5195 - SMESH764: + //Controls - Aspect Ratio: incorrect colors of the best and worst values + myLookupTable->SetHueRange(0.667,0.0); - actorColor.r = 1.; - actorColor.g = 1.; - actorColor.b = 0.; + myScalarBarActor = vtkScalarBarActor::New(); + myScalarBarActor->SetVisibility(false); + myScalarBarActor->SetLookupTable(myLookupTable); - actorHighlightColor.r = 1.; - actorHighlightColor.g = 1.; - actorHighlightColor.b = 1.; + vtkTextProperty* aScalarBarTitleProp = vtkTextProperty::New(); - actorPreselectedColor.r = 0.; - actorPreselectedColor.g = 1.; - actorPreselectedColor.b = 1.; + if ( QAD_CONFIG->hasSetting( "SMESH:ScalarBarTitleColor" ) ) { + QStringList aTColor = QStringList::split( ":", QAD_CONFIG->getSetting( "SMESH:ScalarBarTitleColor" ), false ); + aScalarBarTitleProp->SetColor( ( aTColor.count() > 0 ? aTColor[0].toInt()/255. : 1.0 ), + ( aTColor.count() > 1 ? aTColor[1].toInt()/255. : 1.0 ), + ( aTColor.count() > 2 ? aTColor[2].toInt()/255. : 1.0 ) ); + } + else + aScalarBarTitleProp->SetColor( 1.0, 1.0, 1.0 ); + + aScalarBarTitleProp->SetFontFamilyToArial(); + if( QAD_CONFIG->hasSetting( "SMESH:ScalarBarTitleFont" ) ){ + if ( QAD_CONFIG->getSetting( "SMESH:ScalarBarTitleFont" ) == "Arial" ) + aScalarBarTitleProp->SetFontFamilyToArial(); + else if ( QAD_CONFIG->getSetting( "SMESH:ScalarBarTitleFont" ) == "Courier" ) + aScalarBarTitleProp->SetFontFamilyToCourier(); + else if ( QAD_CONFIG->getSetting( "SMESH:ScalarBarTitleFont" ) == "Times" ) + aScalarBarTitleProp->SetFontFamilyToTimes(); + } - actorNodeColor.r = 1.; - actorNodeColor.g = 1.; - actorNodeColor.b = 0.; + if ( QAD_CONFIG->getSetting( "SMESH:ScalarBarTitleBold" ) == "true" ) + aScalarBarTitleProp->BoldOn(); + else + aScalarBarTitleProp->BoldOff(); - actorNodeSize = 2 ; - -} + if ( QAD_CONFIG->getSetting( "SMESH:ScalarBarTitleItalic" ) == "true" ) + aScalarBarTitleProp->ItalicOn(); + else + aScalarBarTitleProp->ItalicOff(); -SMESH_Actor::~SMESH_Actor() -{ - this->EdgeDevice->Delete(); - this->EdgeShrinkDevice->Delete(); -} + if ( QAD_CONFIG->getSetting( "SMESH:ScalarBarTitleShadow" ) == "true" ) + aScalarBarTitleProp->ShadowOn(); + else + aScalarBarTitleProp->ShadowOff(); -void SMESH_Actor::setReader(vtkUnstructuredGridReader* r) { - myReader=r; -} + myScalarBarActor->SetTitleTextProperty( aScalarBarTitleProp ); + aScalarBarTitleProp->Delete(); + + vtkTextProperty* aScalarBarLabelProp = vtkTextProperty::New(); + + if ( QAD_CONFIG->hasSetting( "SMESH:ScalarBarLabelColor" ) ) { + QStringList aTColor = QStringList::split( ":", QAD_CONFIG->getSetting( "SMESH:ScalarBarLabelColor" ), false ); + aScalarBarLabelProp->SetColor( ( aTColor.count() > 0 ? aTColor[0].toInt()/255. : 1.0 ), + ( aTColor.count() > 1 ? aTColor[1].toInt()/255. : 1.0 ), + ( aTColor.count() > 2 ? aTColor[2].toInt()/255. : 1.0 ) ); + } + else + aScalarBarLabelProp->SetColor( 1.0, 1.0, 1.0 ); + + aScalarBarLabelProp->SetFontFamilyToArial(); + if( QAD_CONFIG->hasSetting( "SMESH:ScalarBarLabelFont" ) ){ + if ( QAD_CONFIG->getSetting( "SMESH:ScalarBarLabelFont" ) == "Arial" ) + aScalarBarLabelProp->SetFontFamilyToArial(); + else if ( QAD_CONFIG->getSetting( "SMESH:ScalarBarLabelFont" ) == "Courier" ) + aScalarBarLabelProp->SetFontFamilyToCourier(); + else if ( QAD_CONFIG->getSetting( "SMESH:ScalarBarLabelFont" ) == "Times" ) + aScalarBarLabelProp->SetFontFamilyToTimes(); + } + + if ( QAD_CONFIG->getSetting( "SMESH:ScalarBarLabelBold" ) == "true" ) + aScalarBarLabelProp->BoldOn(); + else + aScalarBarLabelProp->BoldOff(); + + if ( QAD_CONFIG->getSetting( "SMESH:ScalarBarLabelItalic" ) == "true" ) + aScalarBarLabelProp->ItalicOn(); + else + aScalarBarLabelProp->ItalicOff(); + + if ( QAD_CONFIG->getSetting( "SMESH:ScalarBarLabelShadow" ) == "true" ) + aScalarBarLabelProp->ShadowOn(); + else + aScalarBarLabelProp->ShadowOff(); + + myScalarBarActor->SetLabelTextProperty( aScalarBarLabelProp ); + aScalarBarLabelProp->Delete(); + + if ( QAD_CONFIG->getSetting("SMESH:ScalarBarOrientation") == "Horizontal" ) + myScalarBarActor->SetOrientationToHorizontal(); + else + myScalarBarActor->SetOrientationToVertical(); + + float aXVal = QAD_CONFIG->getSetting("SMESH:ScalarBarOrientation") == "Horizontal" ? 0.20 : 0.01; + if ( QAD_CONFIG->hasSetting( "SMESH:ScalarBarXPosition" ) ) + aXVal = QAD_CONFIG->getSetting( "SMESH:ScalarBarXPosition" ).toFloat(); + float aYVal = QAD_CONFIG->getSetting("SMESH:ScalarBarOrientation") == "Horizontal" ? 0.01 : 0.1; + if ( QAD_CONFIG->hasSetting( "SMESH:ScalarBarYPosition" ) ) + aYVal = QAD_CONFIG->getSetting( "SMESH:ScalarBarYPosition" ).toFloat(); + myScalarBarActor->SetPosition( aXVal, aYVal ); + + float aWVal = QAD_CONFIG->getSetting("SMESH:ScalarBarOrientation") == "Horizontal" ? 0.60 : 0.10; + if ( QAD_CONFIG->hasSetting( "SMESH:ScalarBarWidth" ) ) + aWVal = QAD_CONFIG->getSetting( "SMESH:ScalarBarWidth" ).toFloat(); + myScalarBarActor->SetWidth( aWVal ); + + float aHVal = QAD_CONFIG->getSetting("SMESH:ScalarBarOrientation") == "Horizontal" ? 0.12 : 0.80; + if ( QAD_CONFIG->hasSetting( "SMESH:ScalarBarHeight" ) ) + aHVal = QAD_CONFIG->getSetting( "SMESH:ScalarBarHeight" ).toFloat(); + myScalarBarActor->SetHeight( aHVal ); + + int anIntVal = 5; + if ( QAD_CONFIG->hasSetting( "SMESH:ScalarBarNbOfLabels" ) ) + anIntVal = QAD_CONFIG->getSetting("SMESH:ScalarBarNbOfLabels").toInt(); + myScalarBarActor->SetNumberOfLabels(anIntVal == 0? 5: anIntVal); + + anIntVal = 64; + if ( QAD_CONFIG->hasSetting( "SMESH:ScalarBarNbOfColors" ) ) + anIntVal = QAD_CONFIG->getSetting("SMESH:ScalarBarNbOfColors").toInt(); + myScalarBarActor->SetMaximumNumberOfColors(anIntVal == 0? 64: anIntVal); + + + //Definition of points numbering pipeline + //--------------------------------------- + myPointsNumDataSet = vtkUnstructuredGrid::New(); + + myPtsMaskPoints = vtkMaskPoints::New(); + myPtsMaskPoints->SetInput(myPointsNumDataSet); + myPtsMaskPoints->SetOnRatio(1); + + myPtsSelectVisiblePoints = vtkSelectVisiblePoints::New(); + myPtsSelectVisiblePoints->SetInput(myPtsMaskPoints->GetOutput()); + myPtsSelectVisiblePoints->SelectInvisibleOff(); + myPtsSelectVisiblePoints->SetTolerance(0.1); + + myPtsLabeledDataMapper = vtkLabeledDataMapper::New(); + myPtsLabeledDataMapper->SetInput(myPtsSelectVisiblePoints->GetOutput()); + myPtsLabeledDataMapper->SetLabelFormat("%g"); + myPtsLabeledDataMapper->SetLabelModeToLabelScalars(); + + vtkTextProperty* aPtsTextProp = vtkTextProperty::New(); + aPtsTextProp->SetFontFamilyToTimes(); + static int aPointsFontSize = 10; + aPtsTextProp->SetFontSize(aPointsFontSize); + aPtsTextProp->SetBold(1); + aPtsTextProp->SetItalic(0); + aPtsTextProp->SetShadow(0); + myPtsLabeledDataMapper->SetLabelTextProperty(aPtsTextProp); + aPtsTextProp->Delete(); + + myIsPointsLabeled = false; + + myPointLabels = vtkActor2D::New(); + myPointLabels->SetMapper(myPtsLabeledDataMapper); + myPointLabels->GetProperty()->SetColor(1,1,1); + myPointLabels->SetVisibility(myIsPointsLabeled); + + + //Definition of cells numbering pipeline + //--------------------------------------- + myCellsNumDataSet = vtkUnstructuredGrid::New(); + + myCellCenters = vtkCellCenters::New(); + myCellCenters->SetInput(myCellsNumDataSet); -vtkUnstructuredGridReader* SMESH_Actor::getReader() { - return (myReader); + myClsMaskPoints = vtkMaskPoints::New(); + myClsMaskPoints->SetInput(myCellCenters->GetOutput()); + myClsMaskPoints->SetOnRatio(1); + + myClsSelectVisiblePoints = vtkSelectVisiblePoints::New(); + myClsSelectVisiblePoints->SetInput(myClsMaskPoints->GetOutput()); + myClsSelectVisiblePoints->SelectInvisibleOff(); + myClsSelectVisiblePoints->SetTolerance(0.1); + + myClsLabeledDataMapper = vtkLabeledDataMapper::New(); + myClsLabeledDataMapper->SetInput(myClsSelectVisiblePoints->GetOutput()); + myClsLabeledDataMapper->SetLabelFormat("%g"); + myClsLabeledDataMapper->SetLabelModeToLabelScalars(); + + vtkTextProperty* aClsTextProp = vtkTextProperty::New(); + aClsTextProp->SetFontFamilyToTimes(); + static int aCellsFontSize = 12; + aClsTextProp->SetFontSize(aCellsFontSize); + aClsTextProp->SetBold(1); + aClsTextProp->SetItalic(0); + aClsTextProp->SetShadow(0); + myClsLabeledDataMapper->SetLabelTextProperty(aClsTextProp); + aClsTextProp->Delete(); + + myIsCellsLabeled = false; + + myCellsLabels = vtkActor2D::New(); + myCellsLabels->SetMapper(myClsLabeledDataMapper); + myCellsLabels->GetProperty()->SetColor(0,1,0); + myCellsLabels->SetVisibility(myIsCellsLabeled); } -vtkMapper* SMESH_Actor::getMapper() { - return (this->Mapper); + +SMESH_Actor::~SMESH_Actor(){ + if(MYDEBUG) MESSAGE("~SMESH_Actor"); + + myScalarBarActor->Delete(); + myLookupTable->Delete(); + + mySurfaceProp->Delete(); + myBackSurfaceProp->Delete(); + + myEdgeProp->Delete(); + myHighlightProp->Delete(); + myPreselectProp->Delete(); + + myNodeProp->Delete(); + + my1DProp->Delete(); + my1DActor->Delete(); + + my1DExtProp->Delete(); + my1DExtActor->Delete(); + + my2DActor->Delete(); + my3DActor->Delete(); + + myNodeActor->Delete(); + myBaseActor->Delete(); + myHighlitableActor->Delete(); + + + //Deleting of pints numbering pipeline + //--------------------------------------- + myPointsNumDataSet->Delete(); + + myPtsLabeledDataMapper->RemoveAllInputs(); + myPtsLabeledDataMapper->Delete(); + + myPtsSelectVisiblePoints->UnRegisterAllOutputs(); + myPtsSelectVisiblePoints->Delete(); + + myPtsMaskPoints->UnRegisterAllOutputs(); + myPtsMaskPoints->Delete(); + + myPointLabels->Delete(); + + + //Deleting of cells numbering pipeline + //--------------------------------------- + myCellsNumDataSet->Delete(); + + myClsLabeledDataMapper->RemoveAllInputs(); + myClsLabeledDataMapper->Delete(); + + myClsSelectVisiblePoints->UnRegisterAllOutputs(); + myClsSelectVisiblePoints->Delete(); + + myClsMaskPoints->UnRegisterAllOutputs(); + myClsMaskPoints->Delete(); + + myCellCenters->UnRegisterAllOutputs(); + myCellCenters->Delete(); + + myCellsLabels->Delete(); } -void SMESH_Actor::ShallowCopy(vtkProp *prop) + +void SMESH_Actor::SetPointsLabeled( bool theIsPointsLabeled ) { - SMESH_Actor *f = SMESH_Actor::SafeDownCast(prop); - if ( f != NULL ) + myIsPointsLabeled = theIsPointsLabeled; + + if ( myIsPointsLabeled ) + { + myPointsNumDataSet->ShallowCopy( GetUnstructuredGrid() ); + vtkDataSet *aDataSet = myPointsNumDataSet; + + int aNbElem = aDataSet->GetNumberOfPoints(); + + vtkIntArray *anArray = vtkIntArray::New(); + anArray->SetNumberOfValues( aNbElem ); + + for ( int anId = 0; anId < aNbElem; anId++ ) { - this->setName( f->getName() ); - if ( f->hasIO() ) - this->setIO( f->getIO() ); - this->setDisplayMode( f->getDisplayMode() ); - - // Copy devices - vtkActor* tempDev = vtkActor::New(); - tempDev->ShallowCopy(f->Device); - vtkProperty* prp = vtkProperty::New(); - prp->DeepCopy(f->Device->GetProperty()); - tempDev->SetProperty(prp); - prp = vtkProperty::New(); - prp->DeepCopy(f->Device->GetBackfaceProperty()); - tempDev->SetBackfaceProperty(prp); - this->Device = tempDev; - - tempDev = vtkActor::New(); - tempDev->ShallowCopy(f->EdgeDevice); - prp = vtkProperty::New(); - prp->DeepCopy(f->EdgeDevice->GetProperty()); - tempDev->SetProperty(prp); - prp = vtkProperty::New(); - prp->DeepCopy(f->EdgeDevice->GetBackfaceProperty()); - tempDev->SetBackfaceProperty(prp); - this->EdgeDevice = tempDev; - - tempDev = vtkActor::New(); - tempDev->ShallowCopy(f->EdgeShrinkDevice); - prp = vtkProperty::New(); - prp->DeepCopy(f->EdgeShrinkDevice->GetProperty()); - tempDev->SetProperty(prp); - prp = vtkProperty::New(); - prp->DeepCopy(f->EdgeShrinkDevice->GetBackfaceProperty()); - tempDev->SetBackfaceProperty(prp); - this->EdgeShrinkDevice = tempDev; - - // Copy data source - this->DataSource = f->DataSource; - - this->myReader = f->myReader; + int aSMDSId = myVisualObj->GetNodeObjId( anId ); + anArray->SetValue( anId, aSMDSId ); } - - // Now do superclass - this->SALOME_Actor::ShallowCopy(prop); - - // Here we need to modify default ShallowCopy() results - // Create copies of properties - if ( f != NULL ) { - vtkProperty* prp = vtkProperty::New(); - prp->DeepCopy(f->GetProperty()); - this->SetProperty(prp); - - prp = vtkProperty::New(); - prp->DeepCopy(f->GetBackfaceProperty()); - this->SetBackfaceProperty(prp); - - // Copy the mapper - vtkDataSetMapper* mpr = vtkDataSetMapper::New(); - mpr->ShallowCopy(f->GetMapper()); - mpr->SetInput(f->DataSource); - this->SetMapper(mpr); + + aDataSet->GetPointData()->SetScalars( anArray ); + anArray->Delete(); + myPtsMaskPoints->SetInput( aDataSet ); + myPointLabels->SetVisibility( GetVisibility() ); } -} - -void SMESH_Actor::Render(vtkRenderer *ren, vtkMapper *Mapper ) -{ - if (this->Mapper == NULL) { - MESSAGE ("No mapper for actor.") - return; + else + { + myPointLabels->SetVisibility( false ); } + + SetRepresentation( GetRepresentation() ); +} - if ( myDisplayMode == 1 ) { - EdgeDevice->VisibilityOn(); - EdgeShrinkDevice->VisibilityOff(); - } else if ( myDisplayMode == 2 ) { - EdgeShrinkDevice->VisibilityOn(); - EdgeDevice->VisibilityOff(); - } else { - EdgeShrinkDevice->VisibilityOff(); - EdgeDevice->VisibilityOff(); - } - - - vtkMapper *bestMapper; - bestMapper = this->Mapper; - - /* render the property */ - if (!this->Property) { - // force creation of a property - this->GetProperty(); - } - if ( ishighlighted ) { - if ( myDisplayMode == 1 ) { - EdgeDevice->GetProperty()->SetColor(edgeHighlightColor.r,edgeHighlightColor.g,edgeHighlightColor.b); - this->GetProperty()->SetColor(actorColor.r,actorColor.g,actorColor.b); - } else if ( myDisplayMode == 2 ) { - EdgeShrinkDevice->GetProperty()->SetColor(edgeHighlightColor.r,edgeHighlightColor.g,edgeHighlightColor.b); - } else { - this->GetProperty()->SetColor(actorHighlightColor.r,actorHighlightColor.g,actorHighlightColor.b); - } - } else if (! ispreselected ) { - if ( myDisplayMode == 1 ) { - EdgeDevice->GetProperty()->SetColor(edgeColor.r,edgeColor.g,edgeColor.b); - this->GetProperty()->SetColor(actorColor.r,actorColor.g,actorColor.b); +void SMESH_Actor::SetCellsLabeled(bool theIsCellsLabeled){ + myIsCellsLabeled = theIsCellsLabeled; + if(myIsCellsLabeled){ + myCellsNumDataSet->ShallowCopy(GetUnstructuredGrid()); + vtkDataSet *aDataSet = myCellsNumDataSet; + int aNbElem = aDataSet->GetNumberOfCells(); + vtkIntArray *anArray = vtkIntArray::New(); + anArray->SetNumberOfValues(aNbElem); + for(int anId = 0; anId < aNbElem; anId++){ + int aSMDSId = myVisualObj->GetElemObjId(anId); + anArray->SetValue(anId,aSMDSId); } - else if ( myDisplayMode == 2 ) - EdgeShrinkDevice->GetProperty()->SetColor(edgeColor.r,edgeColor.g,edgeColor.b); - else - this->GetProperty()->SetColor(actorColor.r,actorColor.g,actorColor.b); - } - else { - if ( myDisplayMode == 1 ) - EdgeDevice->GetProperty()->SetColor(edgePreselectedColor.r,edgePreselectedColor.g,edgePreselectedColor.b); - else if ( myDisplayMode == 2 ) - EdgeShrinkDevice->GetProperty()->SetColor(edgePreselectedColor.r,edgePreselectedColor.g,edgePreselectedColor.b); - else - this->GetProperty()->SetColor(actorPreselectedColor.r,actorPreselectedColor.g,actorPreselectedColor.b); + aDataSet->GetCellData()->SetScalars(anArray); + myCellCenters->SetInput(aDataSet); + myCellsLabels->SetVisibility(GetVisibility()); + }else{ + myCellsLabels->SetVisibility(false); } +} - this->Property->Render(this, ren); - if (this->BackfaceProperty) { - this->BackfaceProperty->BackfaceRender(this, ren); - this->Device->SetBackfaceProperty(this->BackfaceProperty); - } - this->Device->SetProperty(this->Property); - - /* render the texture */ - if (this->Texture) { - this->Texture->Render(ren); + +void SMESH_Actor::SetControlMode(eControl theMode){ + myColorMode = eNone; + my1DColorMode = e1DNone; + + my1DActor->GetMapper()->SetScalarVisibility(false); + my2DActor->GetMapper()->SetScalarVisibility(false); + my3DActor->GetMapper()->SetScalarVisibility(false); + myScalarBarActor->SetVisibility(false); + + bool anIsScalarVisible = theMode > eNone; + + if(anIsScalarVisible){ + SMESH::NumericalFunctor_var aFunctor; + SMESH::Predicate_var aPredicate; + + switch(theMode){ + case eLengthEdges: + aFunctor = myFilterMgr->CreateLength(); + myControlActor = my1DActor; + break; + case eFreeBorders: + aPredicate = myFilterMgr->CreateFreeBorders(); + myControlActor = my1DActor; + break; + case eMultiConnection: + aFunctor = myFilterMgr->CreateMultiConnection(); + myControlActor = my1DActor; + break; + case eArea: + aFunctor = myFilterMgr->CreateArea(); + myControlActor = my2DActor; + break; + case eTaper: + aFunctor = myFilterMgr->CreateTaper(); + myControlActor = my2DActor; + break; + case eAspectRatio: + aFunctor = myFilterMgr->CreateAspectRatio(); + myControlActor = my2DActor; + break; + case eMinimumAngle: + aFunctor = myFilterMgr->CreateMinimumAngle(); + myControlActor = my2DActor; + break; + case eWarping: + aFunctor = myFilterMgr->CreateWarping(); + myControlActor = my2DActor; + break; + case eSkew: + aFunctor = myFilterMgr->CreateSkew(); + myControlActor = my2DActor; + break; + default: + return; + } + + vtkUnstructuredGrid* aGrid = myControlActor->GetUnstructuredGrid(); + vtkIdType aNbCells = aGrid->GetNumberOfCells(); + if(aNbCells){ + if(theMode == eFreeBorders){ + if(!aPredicate->_is_nil()){ + myVisualObj->UpdateFunctor(aPredicate); + SALOME_ExtractUnstructuredGrid* aFilter = + my1DExtActor->GetExtractUnstructuredGrid(); + aFilter->SetModeOfChanging(SALOME_ExtractUnstructuredGrid::eAdding); + aFilter->ClearRegisteredCells(); + for( vtkIdType i = 0; i < aNbCells; i++ ){ + vtkIdType anObjId = myControlActor->GetElemObjId( i ); + CORBA::Boolean aValue = aPredicate->IsSatisfy(anObjId); + if(aValue) + aFilter->RegisterCell(i); + } + if(!aFilter->IsCellsRegistered()) + aFilter->RegisterCell(-1); + aPredicate->Destroy(); + } + myColorMode = theMode; + my1DColorMode = e1DHighlited; + }else{ + myColorMode = theMode; + if(myControlActor == my1DActor) + my1DColorMode = e1DColored; + + vtkUnstructuredGrid* aDataSet = vtkUnstructuredGrid::New(); + aDataSet->ShallowCopy(aGrid); + myScalarBarActor->SetVisibility(true); + myControlActor->GetMapper()->SetScalarVisibility(true); + + vtkDoubleArray *aScalars = vtkDoubleArray::New(); + aScalars->SetNumberOfComponents( 1 ); + aScalars->SetNumberOfTuples(aNbCells); + + if(!aFunctor->_is_nil()){ + myVisualObj->UpdateFunctor(aFunctor); + for( vtkIdType i = 0; i < aNbCells; i++ ){ + vtkIdType anObjId = myControlActor->GetElemObjId( i ); + CORBA::Double aValue = aFunctor->GetValue(anObjId); + aScalars->SetValue( i, aValue ); + } + aFunctor->Destroy(); + }else if(!aPredicate->_is_nil()){ + myVisualObj->UpdateFunctor(aPredicate); + for( vtkIdType i = 0; i < aNbCells; i++ ){ + vtkIdType anObjId = myControlActor->GetElemObjId( i ); + CORBA::Boolean aValue = aPredicate->IsSatisfy(anObjId); + aScalars->SetValue( i, aValue ); + } + aPredicate->Destroy(); + } + aDataSet->GetCellData()->SetScalars(aScalars); + aScalars->Delete(); + + float aRange[2]; + aScalars->GetRange(aRange); + myLookupTable->SetRange(aRange); + myLookupTable->Build(); + + myControlActor->GetMergeFilter()->SetScalars(aDataSet); + aDataSet->Delete(); + if(MYDEBUGWITHFILES) + WriteUnstructuredGrid(aDataSet,"/tmp/SetControlMode.vtk"); + } + } } + SetRepresentation(GetRepresentation()); - - // Store information on time it takes to render. - // We might want to estimate time from the number of polygons in mapper. - this->Device->Render(ren,bestMapper); - this->EstimatedRenderTime = bestMapper->GetTimeToDraw(); + Modified(); } -int SMESH_Actor::RenderOpaqueGeometry(vtkViewport *vp) + +void SMESH_Actor::AddToRender(vtkRenderer* theRenderer){ + SALOME_Actor::AddToRender(theRenderer); + + theRenderer->AddActor(myNodeActor); + theRenderer->AddActor(myBaseActor); + + theRenderer->AddActor(my3DActor); + theRenderer->AddActor(my2DActor); + + theRenderer->AddActor(my1DActor); + theRenderer->AddActor(my1DExtActor); + + theRenderer->AddActor(myHighlitableActor); + + theRenderer->AddActor2D(myScalarBarActor); + + myPtsSelectVisiblePoints->SetRenderer(theRenderer); + myClsSelectVisiblePoints->SetRenderer(theRenderer); + + theRenderer->AddActor2D(myPointLabels); + theRenderer->AddActor2D(myCellsLabels); +} + +void SMESH_Actor::RemoveFromRender(vtkRenderer* theRenderer){ + SALOME_Actor::RemoveFromRender(theRenderer); + + theRenderer->RemoveActor(myNodeActor); + theRenderer->RemoveActor(myBaseActor); + theRenderer->RemoveActor(myHighlitableActor); + + theRenderer->RemoveActor(my1DActor); + theRenderer->RemoveActor(my1DExtActor); + + theRenderer->RemoveActor(my2DActor); + theRenderer->RemoveActor(my3DActor); + + theRenderer->RemoveActor(myScalarBarActor); + theRenderer->RemoveActor(myPointLabels); + theRenderer->RemoveActor(myCellsLabels); +} + + +void SMESH_Actor::Init(TVisualObjPtr theVisualObj, + SMESH::FilterManager_ptr theFilterMgr, + const char* theEntry, + const char* theName, + int theIsClear) { - int renderedSomething = 0; - vtkRenderer *ren = (vtkRenderer *)vp; - - if ( ! this->Mapper ) { - return 0; - } - - // make sure we have a property - if (!this->Property) { - // force creation of a property - this->GetProperty(); - } + Handle(SALOME_InteractiveObject) anIO = + new SALOME_InteractiveObject(strdup(theEntry),strdup("MESH"),strdup(theName)); + setIO(anIO); + setName(strdup(theName)); + + myVisualObj = theVisualObj; + myNodeActor->myVisualObj = myVisualObj; + myBaseActor->myVisualObj = myVisualObj; + myHighlitableActor->myVisualObj = myVisualObj; + + my1DActor->myVisualObj = myVisualObj; + my1DExtActor->myVisualObj = myVisualObj; + + my2DActor->myVisualObj = myVisualObj; + my3DActor->myVisualObj = myVisualObj; + + myVisualObj->Update(theIsClear); + SetUnstructuredGrid(myVisualObj->GetUnstructuredGrid()); - if ( ishighlighted ) { - if ( myDisplayMode == 1 ) { - EdgeDevice->GetProperty()->SetColor(edgeHighlightColor.r,edgeHighlightColor.g,edgeHighlightColor.b); - } else if ( myDisplayMode == 2 ) { - EdgeShrinkDevice->GetProperty()->SetColor(edgeHighlightColor.r,edgeHighlightColor.g,edgeHighlightColor.b); - } else { - this->GetProperty()->SetColor(actorHighlightColor.r,actorHighlightColor.g,actorHighlightColor.b); - } - } else if (! ispreselected ) { - if ( myDisplayMode == 1 ) - EdgeDevice->GetProperty()->SetColor(edgeColor.r,edgeColor.g,edgeColor.b); - else if ( myDisplayMode == 2 ) - EdgeShrinkDevice->GetProperty()->SetColor(edgeColor.r,edgeColor.g,edgeColor.b); - else - this->GetProperty()->SetColor(actorColor.r,actorColor.g,actorColor.b); + myFilterMgr = SMESH::FilterManager::_duplicate(theFilterMgr); + + QString aMode = QAD_CONFIG->getSetting("SMESH:DisplayMode"); + SetRepresentation(-1); + if(aMode.compare("Wireframe") == 0){ + SetRepresentation(eEdge); + }else if(aMode.compare("Shading") == 0){ + SetRepresentation(eSurface); + }else if(aMode.compare("Nodes") == 0){ + SetRepresentation(ePoint); } - else { - if ( myDisplayMode == 1 ) - EdgeDevice->GetProperty()->SetColor(edgePreselectedColor.r,edgePreselectedColor.g,edgePreselectedColor.b); - else if ( myDisplayMode == 2 ) - EdgeShrinkDevice->GetProperty()->SetColor(edgePreselectedColor.r,edgePreselectedColor.g,edgePreselectedColor.b); - else - this->GetProperty()->SetColor(actorPreselectedColor.r,actorPreselectedColor.g,actorPreselectedColor.b); + + aMode = QAD_CONFIG->getSetting("SMESH:Shrink"); + if(aMode == "yes"){ + SetShrink(); } - // is this actor opaque ? - if (this->GetIsOpaque()) { - this->Property->Render(this, ren); - - // render the backface property - if (this->BackfaceProperty) { - this->BackfaceProperty->BackfaceRender(this, ren); - } - - // render the texture - if (this->Texture) { - this->Texture->Render(ren); - } - this->Render(ren,this->Mapper); + Modified(); +} + + +vtkPolyData* SMESH_Actor::GetPolyDataInput(){ + return myPickableActor->GetPolyDataInput(); +} + + +void SMESH_Actor::SetTransform(SALOME_Transform* theTransform){ + myNodeActor->SetTransform(theTransform); + myBaseActor->SetTransform(theTransform); + myHighlitableActor->SetTransform(theTransform); + + my1DActor->SetTransform(theTransform); + my1DExtActor->SetTransform(theTransform); + + my2DActor->SetTransform(theTransform); + my3DActor->SetTransform(theTransform); + + Modified(); +} + + +void SMESH_Actor::SetUnstructuredGrid(vtkUnstructuredGrid* theGrid){ + if(theGrid){ + myNodeActor->SetUnstructuredGrid(theGrid); + myBaseActor->SetUnstructuredGrid(theGrid); + myHighlitableActor->SetUnstructuredGrid(theGrid); + + my1DActor->SetUnstructuredGrid(theGrid); + my1DExtActor->SetUnstructuredGrid(theGrid); + + my2DActor->SetUnstructuredGrid(theGrid); + my3DActor->SetUnstructuredGrid(theGrid); + + my1DActor->GetMapper()->SetLookupTable(myLookupTable); + my2DActor->GetMapper()->SetLookupTable(myLookupTable); + my3DActor->GetMapper()->SetLookupTable(myLookupTable); - renderedSomething = 1; + float aFactor, aUnits; + my2DActor->GetPolygonOffsetParameters(aFactor,aUnits); + my2DActor->SetPolygonOffsetParameters(aFactor,aUnits*0.75); + + //SetIsShrunkable(theGrid->GetNumberOfCells() > 10); + SetIsShrunkable(true); + + Modified(); } - - return renderedSomething; } -void SMESH_Actor::SetColor(float r,float g,float b) -{ - actorColor.r = r; - actorColor.g = g; - actorColor.b = b; +void SMESH_Actor::SetMapper(vtkMapper* theMapper){ + vtkLODActor::SetMapper(theMapper); } -void SMESH_Actor::GetColor(float& r,float& g,float& b) -{ - r = actorColor.r; - g = actorColor.g; - b = actorColor.b; + +void SMESH_Actor::ShallowCopy(vtkProp *prop){ + SALOME_Actor::ShallowCopy(prop); } -void SMESH_Actor::SetPreselectedColor(float r,float g,float b) -{ - actorPreselectedColor.r = r; - actorPreselectedColor.g = g; - actorPreselectedColor.b = b; + +vtkMapper* SMESH_Actor::GetMapper(){ + return myPickableActor->GetMapper(); } -void SMESH_Actor::GetPreselectedColor(float& r,float& g,float& b) -{ - r = actorPreselectedColor.r; - g = actorPreselectedColor.g; - b = actorPreselectedColor.b; + +vtkUnstructuredGrid* SMESH_Actor::GetUnstructuredGrid(){ + return myVisualObj->GetUnstructuredGrid(); } -void SMESH_Actor::SetHighlightColor(float r,float g,float b) -{ - actorHighlightColor.r = r; - actorHighlightColor.g = g; - actorHighlightColor.b = b; + +bool SMESH_Actor::IsInfinitive(){ + vtkDataSet *aDataSet = myPickableActor->GetUnstructuredGrid(); + aDataSet->Update(); + myIsInfinite = aDataSet->GetNumberOfCells() == 0; + return SALOME_Actor::IsInfinitive(); } -void SMESH_Actor::GetHighlightColor(float& r,float& g,float& b) -{ - r = actorHighlightColor.r; - g = actorHighlightColor.g; - b = actorHighlightColor.b; + +void SMESH_Actor::SetIsShrunkable(bool theShrunkable){ + myIsShrinkable = theShrunkable; + Modified(); } -void SMESH_Actor::SetEdgeColor(float r,float g,float b) -{ - edgeColor.r = r; - edgeColor.g = g; - edgeColor.b = b; +float SMESH_Actor::GetShrinkFactor(){ + return myBaseActor->GetShrinkFactor(); } -void SMESH_Actor::GetEdgeColor(float& r,float& g,float& b) -{ - r = edgeColor.r; - g = edgeColor.g; - b = edgeColor.b; +void SMESH_Actor::SetShrinkFactor(float theValue){ + myBaseActor->SetShrinkFactor(theValue); + + my1DActor->SetShrinkFactor(theValue); + my1DExtActor->SetShrinkFactor(theValue); + + my2DActor->SetShrinkFactor(theValue); + my3DActor->SetShrinkFactor(theValue); + + Modified(); } -void SMESH_Actor::SetEdgeHighlightColor(float r,float g,float b) -{ - edgeHighlightColor.r = r; - edgeHighlightColor.g = g; - edgeHighlightColor.b = b; +void SMESH_Actor::SetShrink(){ + if(!myIsShrinkable) return; + + myBaseActor->SetShrink(); + + my1DActor->SetShrink(); + my1DExtActor->SetShrink(); + + my2DActor->SetShrink(); + my3DActor->SetShrink(); + + myIsShrunk = true; + Modified(); } -void SMESH_Actor::GetEdgeHighlightColor(float& r,float& g,float& b) -{ - r = edgeHighlightColor.r; - g = edgeHighlightColor.g; - b = edgeHighlightColor.b; +void SMESH_Actor::UnShrink(){ + if(!myIsShrunk) return; + + myBaseActor->UnShrink(); + + my1DActor->UnShrink(); + my1DExtActor->UnShrink(); + + my2DActor->UnShrink(); + my3DActor->UnShrink(); + + myIsShrunk = false; + Modified(); } -void SMESH_Actor::SetEdgePreselectedColor(float r,float g,float b) -{ - edgePreselectedColor.r = r; - edgePreselectedColor.g = g; - edgePreselectedColor.b = b; + +int SMESH_Actor::GetObjId(int theVtkID){ + if (GetRepresentation() == 0){ + return GetNodeObjId(theVtkID); + }else{ + return GetElemObjId(theVtkID); + } } -void SMESH_Actor::GetEdgePreselectedColor(float& r,float& g,float& b) -{ - r = edgePreselectedColor.r; - g = edgePreselectedColor.g; - b = edgePreselectedColor.b; +SALOME_Actor::TVectorId SMESH_Actor::GetVtkId(int theObjID){ + if (GetRepresentation() == 0){ + return GetNodeVtkId(theObjID); + }else{ + return GetElemVtkId(theObjID); + } } -void SMESH_Actor::SetNodeColor(float r,float g,float b) -{ - actorNodeColor.r = r ; - actorNodeColor.g = g ; - actorNodeColor.b = b ; +int SMESH_Actor::GetNodeObjId(int theVtkID){ + return myPickableActor->GetNodeObjId(theVtkID); } -void SMESH_Actor::GetNodeColor(float& r,float& g,float& b) -{ - r = actorNodeColor.r ; - g = actorNodeColor.g ; - b = actorNodeColor.b ; +SALOME_Actor::TVectorId SMESH_Actor::GetNodeVtkId(int theObjID){ + return myPickableActor->GetNodeVtkId(theObjID); } -void SMESH_Actor::SetNodeSize(int size) -{ - actorNodeSize = size ; + +int SMESH_Actor::GetElemObjId(int theVtkID){ + return myPickableActor->GetElemObjId(theVtkID); } -int SMESH_Actor::GetNodeSize() -{ - return actorNodeSize ; +SALOME_Actor::TVectorId SMESH_Actor::GetElemVtkId(int theObjID){ + return myPickableActor->GetElemVtkId(theObjID); } -void SMESH_Actor::AddNode(int idSMESHDSnode,int idVTKnode) -{ - if (DataSource->IsA("SMESH_Grid")) { - ((SMESH_Grid*)DataSource)->AddNode(idSMESHDSnode, idVTKnode); - } else - MESSAGE("AddNode() method has been moved to SMESH_Grid class"); +void SMESH_Actor::SetVisibility(int theMode){ + SALOME_Actor::SetVisibility(theMode); + if(GetVisibility()){ + SetRepresentation(GetRepresentation()); + + if(myColorMode != eNone){ + if(my1DColorMode == e1DHighlited) + my1DExtActor->VisibilityOn(); + else if(myControlActor->GetUnstructuredGrid()->GetNumberOfCells()) + myScalarBarActor->VisibilityOn(); + } + + if(myRepresentation != ePoint) + myPickableActor->VisibilityOn(); + + my1DActor->VisibilityOn(); + + my2DActor->VisibilityOn(); + my3DActor->VisibilityOn(); + + if(myIsPointsLabeled) myPointLabels->VisibilityOn(); + if(myIsCellsLabeled) myCellsLabels->VisibilityOn(); + }else{ + myNodeActor->VisibilityOff(); + myBaseActor->VisibilityOff(); + + my1DActor->VisibilityOff(); + my1DExtActor->VisibilityOff(); + + my2DActor->VisibilityOff(); + my3DActor->VisibilityOff(); + + myScalarBarActor->VisibilityOff(); + myPointLabels->VisibilityOff(); + myCellsLabels->VisibilityOff(); + } + Modified(); } -void SMESH_Actor::AddElement(int idSMESHDSelement, int idVTKelement) -{ - if (DataSource->IsA("SMESH_Grid")) { - ((SMESH_Grid*)DataSource)->AddElement(idSMESHDSelement, idVTKelement); - } else - MESSAGE("AddElement() method has been moved to SMESH_Grid class"); + + +void SMESH_Actor::SetRepresentation(int theMode){ + int aNbEdges = myVisualObj->GetNbEntities(SMESH::EDGE); + int aNbFaces = myVisualObj->GetNbEntities(SMESH::FACE); + int aNbVolumes = myVisualObj->GetNbEntities(SMESH::VOLUME); + if(theMode < 0){ + myRepresentation = eSurface; + if(!aNbFaces && !aNbVolumes && aNbEdges){ + myRepresentation = eEdge; + }else if(!aNbFaces && !aNbVolumes && !aNbEdges){ + myRepresentation = ePoint; + } + }else{ + switch(theMode){ + case eEdge: + if(!aNbFaces && !aNbVolumes && !aNbEdges) return; + break; + case eSurface: + if(!aNbFaces && !aNbVolumes) return; + break; + } + myRepresentation = theMode; + } + + if(!GetUnstructuredGrid()->GetNumberOfCells()) + myRepresentation = ePoint; + + if(myIsShrunk){ + if(myRepresentation == ePoint){ + UnShrink(); + myIsShrunk = true; + }else{ + SetShrink(); + } + } + + myPickableActor = myBaseActor; + myNodeActor->SetVisibility(false); + vtkProperty *aProp = NULL, *aBackProp = NULL; + SMESH_DeviceActor::EReperesent aReperesent = SMESH_DeviceActor::EReperesent(-1); + switch(myRepresentation){ + case ePoint: + myPickableActor = myNodeActor; + aProp = aBackProp = myNodeProp; + aReperesent = SMESH_DeviceActor::ePoint; + break; + case eEdge: + aProp = aBackProp = myEdgeProp; + aReperesent = SMESH_DeviceActor::eInsideframe; + break; + case eSurface: + aProp = mySurfaceProp; + aBackProp = myBackSurfaceProp; + aReperesent = SMESH_DeviceActor::eSurface; + break; + } + + my2DActor->SetProperty(aProp); + my2DActor->SetBackfaceProperty(aBackProp); + my2DActor->SetRepresentation(aReperesent); + + my3DActor->SetProperty(aProp); + my3DActor->SetBackfaceProperty(aBackProp); + my3DActor->SetRepresentation(aReperesent); + + my1DExtActor->SetVisibility(false); + switch(my1DColorMode){ + case e1DColored: + aProp = aBackProp = my1DProp; + if(myRepresentation != ePoint) + aReperesent = SMESH_DeviceActor::eInsideframe; + break; + case e1DHighlited: + my1DExtActor->SetVisibility(true); + break; + } + + my1DActor->SetProperty(aProp); + my1DActor->SetBackfaceProperty(aBackProp); + my1DActor->SetRepresentation(aReperesent); + + if ( GetPointRepresentation() || !GetUnstructuredGrid()->GetNumberOfCells() || myIsPointsLabeled ) + { + myPickableActor = myNodeActor; + myNodeActor->SetVisibility(true); + } + + SetMapper(myPickableActor->GetMapper()); + + Modified(); } -void SMESH_Actor::SetIdsVTKNode(const TColStd_DataMapOfIntegerInteger& mapVTK) -{ - if (DataSource->IsA("SMESH_Grid")) { - ((SMESH_Grid*)DataSource)->SetIdsVTKNode(mapVTK); - } else - MESSAGE("SetIdsVTKNode() method has been moved to SMESH_Grid class"); + +void SMESH_Actor::SetPointRepresentation(int theIsPointsVisible){ + myIsPointsVisible = theIsPointsVisible; + SetRepresentation(GetRepresentation()); } -void SMESH_Actor::SetIdsSMESHDSNode(const TColStd_DataMapOfIntegerInteger& mapSMESHDS) -{ - if (DataSource->IsA("SMESH_Grid")) { - ((SMESH_Grid*)DataSource)->SetIdsSMESHDSNode(mapSMESHDS); - } else - MESSAGE("SetIdsSMESHDSNode() method has been moved to SMESH_Grid class"); + + +void SMESH_Actor::UpdateHighlight(){ + myHighlitableActor->SetVisibility(false); + myNodeActor->SetProperty(myNodeProp); + if(myPickableActor != myNodeActor) + myNodeActor->SetVisibility(false); + + if(ishighlighted){ + myHighlitableActor->SetProperty(myHighlightProp); + }else if(ispreselected){ + myHighlitableActor->SetProperty(myPreselectProp); + } + + if(ishighlighted || ispreselected){ + if(!GetUnstructuredGrid()->GetNumberOfCells()){ + myNodeActor->SetProperty(myHighlitableActor->GetProperty()); + myNodeActor->SetRepresentation(SMESH_DeviceActor::ePoint); + myNodeActor->SetVisibility(GetVisibility()); + }else{ + myHighlitableActor->SetRepresentation(SMESH_DeviceActor::eWireframe); + myHighlitableActor->SetVisibility(GetVisibility()); + } + } } -void SMESH_Actor::SetIdsVTKElement(const TColStd_DataMapOfIntegerInteger& mapVTK) -{ - if (DataSource->IsA("SMESH_Grid")) { - ((SMESH_Grid*)DataSource)->SetIdsVTKElement(mapVTK); - } else - MESSAGE("SetIdsVTKElement() method has been moved to SMESH_Grid class"); + +void SMESH_Actor::highlight(Standard_Boolean highlight){ + ishighlighted = highlight; + UpdateHighlight(); } -void SMESH_Actor::SetIdsSMESHDSElement(const TColStd_DataMapOfIntegerInteger& mapSMESHDS) -{ - if (DataSource->IsA("SMESH_Grid")) { - ((SMESH_Grid*)DataSource)->SetIdsSMESHDSElement(mapSMESHDS); - } else - MESSAGE("SetIdsSMESHDSElement() method has been moved to SMESH_Grid class"); + + +void SMESH_Actor::SetPreSelected(Standard_Boolean presel){ + ispreselected = presel; + UpdateHighlight(); } -int SMESH_Actor::GetIdVTKNode(int idSMESHDSnode) + +// From vtkFollower +int SMESH_Actor::RenderOpaqueGeometry(vtkViewport *vp) { - if (DataSource->IsA("SMESH_Grid")) { - return ((SMESH_Grid*)DataSource)->GetIdVTKNode(idSMESHDSnode); - } else { - MESSAGE("GetIdVTKNode() method has been moved to SMESH_Grid class"); - return -1; - } + if (myPickableActor->GetIsOpaque()) + { + vtkRenderer *ren = static_cast(vp); + this->Render(ren); + return 1; + } + return 0; } -int SMESH_Actor::GetIdVTKElement(int idSMESHDSelement) + + +int SMESH_Actor::RenderTranslucentGeometry(vtkViewport *vp) { - if (DataSource->IsA("SMESH_Grid")) { - return ((SMESH_Grid*)DataSource)->GetIdVTKElement(idSMESHDSelement); - } else { - MESSAGE("GetIdVTKElement() method has been moved to SMESH_Grid class"); - return -1; - } + if (!myPickableActor->GetIsOpaque()) + { + vtkRenderer *ren = static_cast(vp); + this->Render(ren); + return 1; + } + return 0; +} + + +void SMESH_Actor::Render(vtkRenderer *ren){} + +void SMESH_Actor::ReleaseGraphicsResources(vtkWindow *renWin){ + SALOME_Actor::ReleaseGraphicsResources(renWin); + + myPickableActor->ReleaseGraphicsResources(renWin); } -int SMESH_Actor::GetIdSMESHDSNode(int idVTKnode) -{ - if (DataSource->IsA("SMESH_Grid")) { - return ((SMESH_Grid*)DataSource)->GetIdSMESHDSNode(idVTKnode); - } else { - MESSAGE("GetIdSMESHDSNode() method has been moved to SMESH_Grid class"); - return -1; - } + +static void GetColor(vtkProperty *theProperty, float& r,float& g,float& b){ + float* aColor = theProperty->GetColor(); + r = aColor[0]; + g = aColor[1]; + b = aColor[2]; } -int SMESH_Actor::GetIdSMESHDSElement(int idVTKelement) -{ - if (DataSource->IsA("SMESH_Grid")) { - return ((SMESH_Grid*)DataSource)->GetIdSMESHDSElement(idVTKelement); - } else { - MESSAGE("AddNode() method has been moved to SMESH_Grid class"); - return -1; - } + +void SMESH_Actor::SetOpacity(float theValue){ + mySurfaceProp->SetOpacity(theValue); + myBackSurfaceProp->SetOpacity(theValue); + myEdgeProp->SetOpacity(theValue); + myNodeProp->SetOpacity(theValue); + + my1DProp->SetOpacity(theValue); } -void SMESH_Actor::ClearNode() -{ - if (DataSource->IsA("SMESH_Grid")) { - ((SMESH_Grid*)DataSource)->ClearNode(); - } else - MESSAGE("ClearNode() method has been moved to SMESH_Grid class"); + +float SMESH_Actor::GetOpacity(){ + return mySurfaceProp->GetOpacity(); } -void SMESH_Actor::ClearElement() -{ - if (DataSource->IsA("SMESH_Grid")) { - ((SMESH_Grid*)DataSource)->ClearElement(); - } else - MESSAGE("ClearElement() method has been moved to SMESH_Grid class"); + +void SMESH_Actor::SetSufaceColor(float r,float g,float b){ + mySurfaceProp->SetColor(r,g,b); + Modified(); } -void SMESH_Actor::RemoveNode(int id) -{ - if (DataSource->IsA("SMESH_Grid")) { - ((SMESH_Grid*)DataSource)->RemoveNode(id); - } else - MESSAGE("RemoveNode() method has been moved to SMESH_Grid class"); +void SMESH_Actor::GetSufaceColor(float& r,float& g,float& b){ + ::GetColor(mySurfaceProp,r,g,b); } -void SMESH_Actor::RemoveElement(int id) -{ - if (DataSource->IsA("SMESH_Grid")) { - ((SMESH_Grid*)DataSource)->RemoveElement(id); - } else - MESSAGE("RemoveElement() method has been moved to SMESH_Grid class"); -} - -void SMESH_Actor::setDisplayMode(int thenewmode) { - myDisplayMode = thenewmode; - if ( myDisplayMode == 1 ) { - EdgeDevice->VisibilityOn(); - EdgeShrinkDevice->VisibilityOff(); - } else if ( myDisplayMode == 2 ) { - EdgeDevice->VisibilityOff(); - EdgeShrinkDevice->VisibilityOn(); - } else { - EdgeDevice->VisibilityOff(); - EdgeShrinkDevice->VisibilityOff(); - } + +void SMESH_Actor::SetBackSufaceColor(float r,float g,float b){ + myBackSurfaceProp->SetColor(r,g,b); + Modified(); } -float SMESH_Actor::GetShrinkFactor() -{ - return myShrinkFactor; +void SMESH_Actor::GetBackSufaceColor(float& r,float& g,float& b){ + ::GetColor(myBackSurfaceProp,r,g,b); } -void SMESH_Actor::SetShrinkFactor(float value ) -{ - if ( value <= 0.1 ) - value = 0.8; +void SMESH_Actor::SetEdgeColor(float r,float g,float b){ + myEdgeProp->SetColor(r,g,b); + my1DProp->SetColor(r,g,b); + my1DExtProp->SetColor(1.0-r,1.0-g,1.0-b); + Modified(); +} - myShrinkFactor = value; +void SMESH_Actor::GetEdgeColor(float& r,float& g,float& b){ + ::GetColor(myEdgeProp,r,g,b); } -void SMESH_Actor::GetChildActors(vtkActorCollection* actors) -{ - actors->AddItem(EdgeDevice); - actors->AddItem(EdgeShrinkDevice); +void SMESH_Actor::SetNodeColor(float r,float g,float b){ + myNodeProp->SetColor(r,g,b); + Modified(); } -void SMESH_Actor::SetVisibility(bool visibility) -{ - if ( visibility ) { - this->VisibilityOn(); - if ( myDisplayMode == 1 ) { - EdgeDevice->VisibilityOn(); - EdgeShrinkDevice->VisibilityOff(); - } else if ( myDisplayMode == 2 ) { - EdgeDevice->VisibilityOff(); - EdgeShrinkDevice->VisibilityOn(); - } else { - EdgeDevice->VisibilityOff(); - EdgeShrinkDevice->VisibilityOff(); - } - } else { - this->VisibilityOff(); - EdgeDevice->VisibilityOff(); - EdgeShrinkDevice->VisibilityOff(); - } +void SMESH_Actor::GetNodeColor(float& r,float& g,float& b){ + ::GetColor(myNodeProp,r,g,b); +} + +void SMESH_Actor::SetHighlightColor(float r,float g,float b){ + myHighlightProp->SetColor(r,g,b); + Modified(); +} + +void SMESH_Actor::GetHighlightColor(float& r,float& g,float& b){ + ::GetColor(myHighlightProp,r,g,b); +} + +void SMESH_Actor::SetPreHighlightColor(float r,float g,float b){ + myPreselectProp->SetColor(r,g,b); + Modified(); } +void SMESH_Actor::GetPreHighlightColor(float& r,float& g,float& b){ + ::GetColor(myPreselectProp,r,g,b); +} + + +float SMESH_Actor::GetLineWidth(){ + return myEdgeProp->GetLineWidth(); +} + + +void SMESH_Actor::SetLineWidth(float theVal){ + myEdgeProp->SetLineWidth(theVal); + Modified(); +} + + +void SMESH_Actor::SetNodeSize(float theSize){ + myNodeProp->SetPointSize(theSize); + myHighlightProp->SetPointSize(theSize); + myPreselectProp->SetPointSize(theSize); + + my1DExtProp->SetPointSize(theSize); + my1DProp->SetPointSize(theSize); + + Modified(); +} + +float SMESH_Actor::GetNodeSize(){ + return myNodeProp->GetPointSize(); +} + +int SMESH_Actor::GetObjDimension( const int theObjId ) +{ + return myVisualObj->GetElemDimension( theObjId ); +} diff --git a/src/OBJECT/SMESH_Actor.h b/src/OBJECT/SMESH_Actor.h index ced5ade24..2cb9628a8 100644 --- a/src/OBJECT/SMESH_Actor.h +++ b/src/OBJECT/SMESH_Actor.h @@ -30,126 +30,205 @@ #define SMESH_ACTOR_H #include "SALOME_Actor.h" +#include "SMESH_Object.h" -// VTK Includes -#include -#include -#include +class vtkProperty; +class vtkShrinkFilter; +class vtkPolyDataMapper; +class vtkUnstructuredGrid; +class vtkMergeFilter; +class vtkPolyData; -// Open CASCADE Includes -#include -#include +class vtkMapper; +class vtkActor2D; +class vtkMaskPoints; +class vtkLabeledDataMapper; +class vtkSelectVisiblePoints; -typedef struct rgbStruct -{ - float r; - float g; - float b; -} RGBStruct; +class vtkScalarBarActor; +class vtkLookupTable; -class SMESH_Actor : public SALOME_Actor { +class SMESH_DeviceActor; +class SALOME_ExtractUnstructuredGrid; - public: - vtkTypeMacro(SMESH_Actor,SALOME_Actor); - - static SMESH_Actor* New(); - // Description: - // This causes the actor to be rendered. It, in turn, will render the actor`s - // property and then mapper. - virtual void Render(vtkRenderer *, vtkMapper *); +class SMESH_Actor : public SALOME_Actor{ + friend class SMESH_VisualObj; - // Description: - // This method is used internally by the rendering process. - // We overide the superclass method to properly set the estimated render time. - int RenderOpaqueGeometry(vtkViewport *viewport); - - void ShallowCopy(vtkProp *prop); - - void setReader(vtkUnstructuredGridReader* r) ; - vtkUnstructuredGridReader* getReader(); + public: + vtkTypeMacro(SMESH_Actor,SALOME_Actor); + static SMESH_Actor* New(TVisualObjPtr theVisualObj, + SMESH::FilterManager_ptr theFilterMgr, + const char* theEntry, + const char* theName, + int theIsClear); + + virtual void ReleaseGraphicsResources(vtkWindow *renWin); + virtual int RenderOpaqueGeometry(vtkViewport *viewport); + virtual int RenderTranslucentGeometry(vtkViewport *viewport); + virtual void Render(vtkRenderer *ren); + + virtual void AddToRender(vtkRenderer* theRenderer); + virtual void RemoveFromRender(vtkRenderer* theRenderer); - // Highlight virtual bool hasHighlight() { return true; } + virtual void highlight(Standard_Boolean highlight); + virtual void SetPreSelected(Standard_Boolean presel = Standard_False); - vtkMapper* getMapper(); + virtual bool IsInfinitive(); - void setDisplayMode(int); + virtual void SetOpacity(float theValue); + virtual float GetOpacity(); - void SetColor(float r,float g,float b); - void GetColor(float& r,float& g,float& b); - void SetHighlightColor(float r,float g,float b); - void GetHighlightColor(float& r,float& g,float& b); - void SetPreselectedColor(float r,float g,float b); - void GetPreselectedColor(float& r,float& g,float& b); + void SetSufaceColor(float r,float g,float b); + void GetSufaceColor(float& r,float& g,float& b); + + void SetBackSufaceColor(float r,float g,float b); + void GetBackSufaceColor(float& r,float& g,float& b); void SetEdgeColor(float r,float g,float b); void GetEdgeColor(float& r,float& g,float& b); - void SetEdgeHighlightColor(float r,float g,float b); - void GetEdgeHighlightColor(float& r,float& g,float& b); - void SetEdgePreselectedColor(float r,float g,float b); - void GetEdgePreselectedColor(float& r,float& g,float& b); void SetNodeColor(float r,float g,float b); void GetNodeColor(float& r,float& g,float& b); + + void SetHighlightColor(float r,float g,float b); + void GetHighlightColor(float& r,float& g,float& b); + + void SetPreHighlightColor(float r,float g,float b); + void GetPreHighlightColor(float& r,float& g,float& b); - void SetNodeSize(int size) ; - int GetNodeSize() ; + float GetLineWidth(); + void SetLineWidth(float theVal); + void SetNodeSize(float size) ; + float GetNodeSize() ; - void ClearNode(); - void ClearElement(); + virtual int GetObjId(int theVtkID); + virtual TVectorId GetVtkId(int theObjID); - void RemoveNode(int idSMESHDSnode); - void RemoveElement(int idSMESHDSelement); + virtual int GetNodeObjId(int theVtkID); + virtual TVectorId GetNodeVtkId(int theObjID); - void AddNode(int idSMESHDSnode, int idVTKnode); - void AddElement(int idSMESHDSelement, int idVTKelement); + virtual int GetElemObjId(int theVtkID); + virtual TVectorId GetElemVtkId(int theObjID); - int GetIdVTKNode(int idSMESHDSnode); - int GetIdVTKElement(int idSMESHDSelement); + virtual int GetObjDimension( const int theObjId ); - int GetIdSMESHDSNode(int idVTKnode); - int GetIdSMESHDSElement(int idVTKelement); + virtual void SetVisibility(int theMode); - void SetIdsVTKNode(const TColStd_DataMapOfIntegerInteger& mapVTK); - void SetIdsSMESHDSNode(const TColStd_DataMapOfIntegerInteger& mapSMESHDS); + enum EReperesent { ePoint, eEdge, eSurface}; + virtual void SetRepresentation(int theMode); + void SetPointRepresentation(int theIsPointsVisible); + bool GetPointRepresentation(){ return myIsPointsVisible;} - void SetIdsVTKElement(const TColStd_DataMapOfIntegerInteger& mapVTK); - void SetIdsSMESHDSElement(const TColStd_DataMapOfIntegerInteger& mapSMESHDS); + virtual vtkPolyData* GetPolyDataInput(); + virtual void SetTransform(SALOME_Transform* theTransform); - vtkDataSet* DataSource; - vtkActor* EdgeDevice; - vtkActor* EdgeShrinkDevice; + vtkUnstructuredGrid* GetUnstructuredGrid(); + virtual vtkMapper* GetMapper(); float GetShrinkFactor(); void SetShrinkFactor(float value ); - void GetChildActors(vtkActorCollection*); + bool IsShrunkable() { return myIsShrinkable;} + bool IsShrunk() { return myIsShrunk;} + void SetShrink(); + void UnShrink(); - void SetVisibility(bool visibility); + void SetPointsLabeled(bool theIsPointsLabeled); + bool GetPointsLabeled(){ return myIsPointsLabeled;} - protected: + void SetCellsLabeled(bool theIsCellsLabeled); + bool GetCellsLabeled(){ return myIsCellsLabeled;} - SMESH_Actor(); - ~SMESH_Actor(); - SMESH_Actor(const SMESH_Actor&) {}; - void operator=(const SMESH_Actor&) {}; + enum eControl{eNone, eLengthEdges, eFreeBorders, eMultiConnection, + eArea, eTaper, eAspectRatio, eMinimumAngle, eWarping, eSkew}; + void SetControlMode(eControl theMode); + eControl GetControlMode(){ return myColorMode;} + + enum e1DControl{e1DNone, e1DColored, e1DHighlited}; + e1DControl Get1DControlMode(){ return my1DColorMode;} - vtkUnstructuredGridReader* myReader; + vtkScalarBarActor* GetScalarBarActor(){ return myScalarBarActor;} - float myShrinkFactor; + TVisualObjPtr GetObject() { return myVisualObj;} - RGBStruct edgeColor; - RGBStruct edgeHighlightColor; - RGBStruct edgePreselectedColor; + protected: + TVisualObjPtr myVisualObj; + + SMESH::FilterManager_var myFilterMgr; + vtkScalarBarActor* myScalarBarActor; + vtkLookupTable* myLookupTable; + + vtkProperty* mySurfaceProp; + vtkProperty* myBackSurfaceProp; + vtkProperty* myEdgeProp; + vtkProperty* myNodeProp; + + SMESH_DeviceActor* myBaseActor; + SMESH_DeviceActor* myNodeActor; + SMESH_DeviceActor* myPickableActor; + + vtkProperty* myHighlightProp; + vtkProperty* myPreselectProp; + SMESH_DeviceActor* myHighlitableActor; + + eControl myColorMode; + SMESH_DeviceActor* my2DActor; + SMESH_DeviceActor* my3DActor; + SMESH_DeviceActor* myControlActor; + + e1DControl my1DColorMode; + vtkProperty* my1DProp; + SMESH_DeviceActor* my1DActor; + vtkProperty* my1DExtProp; + SMESH_DeviceActor* my1DExtActor; + + bool myIsPointsVisible; + + bool myIsShrinkable; + bool myIsShrunk; + + bool myIsPointsLabeled; + vtkUnstructuredGrid* myPointsNumDataSet; + vtkActor2D *myPointLabels; + vtkMaskPoints* myPtsMaskPoints; + vtkLabeledDataMapper* myPtsLabeledDataMapper; + vtkSelectVisiblePoints* myPtsSelectVisiblePoints; + + bool myIsCellsLabeled; + vtkUnstructuredGrid* myCellsNumDataSet; + vtkActor2D *myCellsLabels; + vtkMaskPoints* myClsMaskPoints; + vtkCellCenters* myCellCenters; + vtkLabeledDataMapper* myClsLabeledDataMapper; + vtkSelectVisiblePoints* myClsSelectVisiblePoints; - RGBStruct actorColor; - RGBStruct actorHighlightColor; - RGBStruct actorPreselectedColor; + SMESH_Actor(); + ~SMESH_Actor(); - RGBStruct actorNodeColor; // LPN - int actorNodeSize; // LPN + void Init(TVisualObjPtr theVisualObj, + SMESH::FilterManager_ptr theFilterMgr, + const char* theEntry, + const char* theName, + int theIsClear); + + void SetUnstructuredGrid(vtkUnstructuredGrid* theGrid); + void SetIsShrunkable(bool theShrunkable); + void UpdateHighlight(); + + private: + // hide the two parameter Render() method from the user and the compiler. + virtual void Render(vtkRenderer *, vtkMapper *) {}; + virtual void ShallowCopy(vtkProp *prop); + virtual void SetMapper(vtkMapper *); + static SMESH_Actor* New(); + // Not implemented. + SMESH_Actor(const SMESH_Actor&); + void operator=(const SMESH_Actor&); }; + + #endif //SMESH_ACTOR_H diff --git a/src/SMDS/Makefile.in b/src/SMDS/Makefile.in index 5c3e9abd9..20bf98ce4 100644 --- a/src/SMDS/Makefile.in +++ b/src/SMDS/Makefile.in @@ -123,7 +123,7 @@ EXPORT_HEADERS= \ #SMDS_MeshNodeIDFactory.hxx # additionnal information to compil and link file -CPPFLAGS += -I${KERNEL_ROOT_DIR}/include/salome +CPPFLAGS += -I${KERNEL_ROOT_DIR}/include/salome $(BOOST_CPPFLAGS) CXXFLAGS += -I${KERNEL_ROOT_DIR}/include/salome LDFLAGS += -L${KERNEL_ROOT_DIR}/lib/salome diff --git a/src/SMDS/SMDS_EdgePosition.hxx b/src/SMDS/SMDS_EdgePosition.hxx index 868310b51..84916246b 100644 --- a/src/SMDS/SMDS_EdgePosition.hxx +++ b/src/SMDS/SMDS_EdgePosition.hxx @@ -38,7 +38,6 @@ class SMDS_EdgePosition:public SMDS_Position SMDS_TypeOfPosition GetTypeOfPosition() const; void SetUParameter(double aUparam); double GetUParameter() const; - ~SMDS_EdgePosition(); private: diff --git a/src/SMDS/SMDS_FaceOfEdges.cxx b/src/SMDS/SMDS_FaceOfEdges.cxx index 0e9243d3f..0a53bba6e 100644 --- a/src/SMDS/SMDS_FaceOfEdges.cxx +++ b/src/SMDS/SMDS_FaceOfEdges.cxx @@ -55,39 +55,44 @@ SMDSAbs_ElementType SMDS_FaceOfEdges::GetType() const return SMDSAbs_Face; } -SMDS_Iterator * SMDS_FaceOfEdges:: +class SMDS_FaceOfEdges_MyIterator:public SMDS_ElemIterator +{ + const vector& mySet; + int index; + public: + SMDS_FaceOfEdges_MyIterator(const vector& s): + mySet(s),index(0) {} + + bool more() + { + return index - { - const vector& mySet; - int index; - public: - MyIterator(const vector& s):mySet(s),index(0) - {} - - bool more() - { - return index set1,set2; - SMDS_Iterator * it; + SMDS_ElemIteratorPtr it; const SMDS_MeshNode * n; it=f1.nodesIterator(); diff --git a/src/SMDS/SMDS_FaceOfEdges.hxx b/src/SMDS/SMDS_FaceOfEdges.hxx index 978ad5df6..414020755 100644 --- a/src/SMDS/SMDS_FaceOfEdges.hxx +++ b/src/SMDS/SMDS_FaceOfEdges.hxx @@ -31,10 +31,13 @@ class SMDS_FaceOfEdges:public SMDS_MeshFace { public: void Print(ostream & OS) const; - SMDS_FaceOfEdges(SMDS_MeshEdge* edge1, SMDS_MeshEdge* edge2, - SMDS_MeshEdge* edge3); - SMDS_FaceOfEdges(SMDS_MeshEdge* edge1, SMDS_MeshEdge* edge2, - SMDS_MeshEdge* edge3, SMDS_MeshEdge* edge4); + SMDS_FaceOfEdges(const SMDS_MeshEdge* edge1, + const SMDS_MeshEdge* edge2, + const SMDS_MeshEdge* edge3); + SMDS_FaceOfEdges(const SMDS_MeshEdge* edge1, + const SMDS_MeshEdge* edge2, + const SMDS_MeshEdge* edge3, + const SMDS_MeshEdge* edge4); SMDSAbs_ElementType GetType() const; int NbEdges() const; @@ -42,7 +45,7 @@ class SMDS_FaceOfEdges:public SMDS_MeshFace // friend bool operator<(const SMDS_FaceOfEdges& e1, const SMDS_FaceOfEdges& e2); protected: - SMDS_Iterator * + SMDS_ElemIteratorPtr elementsIterator(SMDSAbs_ElementType type) const; private: diff --git a/src/SMDS/SMDS_FaceOfNodes.cxx b/src/SMDS/SMDS_FaceOfNodes.cxx index 9a9a945f9..abc9c9d60 100644 --- a/src/SMDS/SMDS_FaceOfNodes.cxx +++ b/src/SMDS/SMDS_FaceOfNodes.cxx @@ -56,42 +56,47 @@ void SMDS_FaceOfNodes::Print(ostream & OS) const OS << myNodes[i] << ") " << endl; } -SMDS_Iterator * SMDS_FaceOfNodes:: +class SMDS_FaceOfNodes_MyIterator:public SMDS_ElemIterator +{ + const vector& mySet; + int index; + public: + SMDS_FaceOfNodes_MyIterator(const vector& s): + mySet(s),index(0) {} + + bool more() + { + return index - { - const vector& mySet; - int index; - public: - MyIterator(const vector& s):mySet(s),index(0) - {} - - bool more() - { - return index set1,set2; - SMDS_Iterator * it; + SMDS_ElemIteratorPtr it; const SMDS_MeshNode * n; it=f1.nodesIterator(); diff --git a/src/SMDS/SMDS_FaceOfNodes.hxx b/src/SMDS/SMDS_FaceOfNodes.hxx index 809ee5f1c..9a2adad0b 100644 --- a/src/SMDS/SMDS_FaceOfNodes.hxx +++ b/src/SMDS/SMDS_FaceOfNodes.hxx @@ -31,16 +31,19 @@ class SMDS_FaceOfNodes:public SMDS_MeshFace { public: void Print(ostream & OS) const; - SMDS_FaceOfNodes(SMDS_MeshNode* node1, SMDS_MeshNode* node2, - SMDS_MeshNode* node3); - SMDS_FaceOfNodes(SMDS_MeshNode* node1, SMDS_MeshNode* node2, - SMDS_MeshNode* node3, SMDS_MeshNode* node4); + SMDS_FaceOfNodes(const SMDS_MeshNode* node1, + const SMDS_MeshNode* node2, + const SMDS_MeshNode* node3); + SMDS_FaceOfNodes(const SMDS_MeshNode* node1, + const SMDS_MeshNode* node2, + const SMDS_MeshNode* node3, + const SMDS_MeshNode* node4); int NbEdges() const; int NbFaces() const; int NbNodes() const; protected: - SMDS_Iterator * + SMDS_ElemIteratorPtr elementsIterator(SMDSAbs_ElementType type) const; private: diff --git a/src/SMDS/SMDS_HexahedronOfNodes.cxx b/src/SMDS/SMDS_HexahedronOfNodes.cxx index cebd29a11..8682ad770 100644 --- a/src/SMDS/SMDS_HexahedronOfNodes.cxx +++ b/src/SMDS/SMDS_HexahedronOfNodes.cxx @@ -29,14 +29,14 @@ /// 5,1 and 7,3 are an edges. /////////////////////////////////////////////////////////////////////////////// SMDS_HexahedronOfNodes::SMDS_HexahedronOfNodes( - SMDS_MeshNode * node1, - SMDS_MeshNode * node2, - SMDS_MeshNode * node3, - SMDS_MeshNode * node4, - SMDS_MeshNode * node5, - SMDS_MeshNode * node6, - SMDS_MeshNode * node7, - 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) { myNodes[0]=node1; myNodes[1]=node2; @@ -75,18 +75,18 @@ int SMDS_HexahedronOfNodes::NbEdges() const return 12; } -SMDS_Iterator * SMDS_HexahedronOfNodes:: +SMDS_ElemIteratorPtr SMDS_HexahedronOfNodes:: elementsIterator(SMDSAbs_ElementType type) const { - switch(type) - { - case SMDSAbs_Volume: - return SMDS_MeshElement::elementsIterator(SMDSAbs_Volume); - case SMDSAbs_Node: - return new SMDS_IteratorOfArray(myNodes); - default: MESSAGE("ERROR : Iterator not implemented"); - } + switch(type) + { + case SMDSAbs_Volume: + return SMDS_MeshElement::elementsIterator(SMDSAbs_Volume); + case SMDSAbs_Node: + return SMDS_ElemIteratorPtr (new SMDS_IteratorOfArray(myNodes)); + default: MESSAGE("ERROR : Iterator not implemented"); + } } SMDSAbs_ElementType SMDS_HexahedronOfNodes::GetType() const diff --git a/src/SMDS/SMDS_HexahedronOfNodes.hxx b/src/SMDS/SMDS_HexahedronOfNodes.hxx index 2e3f22f4a..03cb242e2 100644 --- a/src/SMDS/SMDS_HexahedronOfNodes.hxx +++ b/src/SMDS/SMDS_HexahedronOfNodes.hxx @@ -36,14 +36,14 @@ class SMDS_HexahedronOfNodes:public SMDS_MeshVolume public: SMDS_HexahedronOfNodes( - SMDS_MeshNode * node1, - SMDS_MeshNode * node2, - SMDS_MeshNode * node3, - SMDS_MeshNode * node4, - SMDS_MeshNode * node5, - SMDS_MeshNode * node6, - SMDS_MeshNode * node7, - 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); void Print(ostream & OS) const; int NbFaces() const; @@ -51,7 +51,7 @@ class SMDS_HexahedronOfNodes:public SMDS_MeshVolume int NbEdges() const; SMDSAbs_ElementType GetType() const; protected: - SMDS_Iterator * + SMDS_ElemIteratorPtr elementsIterator(SMDSAbs_ElementType type) const; const SMDS_MeshNode * myNodes[8]; }; diff --git a/src/SMDS/SMDS_Iterator.hxx b/src/SMDS/SMDS_Iterator.hxx index 144f075d1..264438c7d 100644 --- a/src/SMDS/SMDS_Iterator.hxx +++ b/src/SMDS/SMDS_Iterator.hxx @@ -36,7 +36,11 @@ template class SMDS_Iterator virtual VALUE next()=0; /// Delete the current element and step to the next one - virtual void remove(){}; + virtual void remove(){} + + /// Provide virtual destructor just for case if some derived iterator + /// must have a destructor + virtual ~SMDS_Iterator(){} }; #endif diff --git a/src/SMDS/SMDS_IteratorOfElements.cxx b/src/SMDS/SMDS_IteratorOfElements.cxx index 3f1a392fd..c18f24d25 100644 --- a/src/SMDS/SMDS_IteratorOfElements.cxx +++ b/src/SMDS/SMDS_IteratorOfElements.cxx @@ -27,7 +27,6 @@ bool SMDS_IteratorOfElements::subMore() { if(t1Iterator->more()) { - if(t2Iterator!=NULL) delete t2Iterator; t2Iterator=t1Iterator->next()->elementsIterator(myType); return subMore(); } @@ -39,13 +38,8 @@ bool SMDS_IteratorOfElements::subMore() const SMDS_MeshElement * SMDS_IteratorOfElements::subNext() { if((t2Iterator==NULL)||(!t2Iterator->more())) - { if(t1Iterator->more()) - { - if(t2Iterator!=NULL) delete t2Iterator; t2Iterator=t1Iterator->next()->elementsIterator(myType); - } - } return t2Iterator->next(); } @@ -54,9 +48,12 @@ const SMDS_MeshElement * SMDS_IteratorOfElements::subNext() /// to the element element. it is the iterator to get connectivity of element ////////////////////////////////////////////////////////////////////////////// SMDS_IteratorOfElements::SMDS_IteratorOfElements(const SMDS_MeshElement * element, - SMDSAbs_ElementType type, SMDS_Iterator* it) - :t1Iterator(it), t2Iterator(NULL), myType(type), myElement(element), - myProxyElement(NULL) + SMDSAbs_ElementType type, + const SMDS_ElemIteratorPtr& it) + : t1Iterator(it), + t2Iterator(SMDS_ElemIteratorPtr((SMDS_ElemIterator*)NULL)), + myType(type), myElement(element), + myProxyElement(NULL) { while(subMore()) alreadyReturnedElements.insert(subNext()); @@ -81,7 +78,7 @@ bool SMDS_IteratorOfElements::more() if(myReverseIteration) { - SMDS_Iterator * it= + SMDS_ElemIteratorPtr it= myProxyElement->elementsIterator(myElement->GetType()); while(it->more()) { @@ -103,9 +100,3 @@ const SMDS_MeshElement * SMDS_IteratorOfElements::next() myProxyElement=NULL; return e; } - -SMDS_IteratorOfElements::~SMDS_IteratorOfElements() -{ - delete t1Iterator; - if(t2Iterator!=NULL) delete t2Iterator; -} diff --git a/src/SMDS/SMDS_IteratorOfElements.hxx b/src/SMDS/SMDS_IteratorOfElements.hxx index 5d2d3700c..bb4d94ebe 100644 --- a/src/SMDS/SMDS_IteratorOfElements.hxx +++ b/src/SMDS/SMDS_IteratorOfElements.hxx @@ -25,7 +25,7 @@ using namespace std; -class SMDS_IteratorOfElements:public SMDS_Iterator +class SMDS_IteratorOfElements:public SMDS_ElemIterator { public: ///////////////////////////////////////////////////////////////////////////// @@ -33,14 +33,14 @@ class SMDS_IteratorOfElements:public SMDS_Iterator /// to the element element. it is the iterator to get connectivity of element ////////////////////////////////////////////////////////////////////////////// SMDS_IteratorOfElements(const SMDS_MeshElement * element, - SMDSAbs_ElementType type, SMDS_Iterator* it); + SMDSAbs_ElementType type, + const SMDS_ElemIteratorPtr& it); bool more(); const SMDS_MeshElement * next(); - ~SMDS_IteratorOfElements(); private: - SMDS_Iterator * t2Iterator; - SMDS_Iterator * t1Iterator; + SMDS_ElemIteratorPtr t2Iterator; + SMDS_ElemIteratorPtr t1Iterator; SMDSAbs_ElementType myType; const SMDS_MeshElement * myProxyElement; const SMDS_MeshElement * myElement; diff --git a/src/SMDS/SMDS_Mesh.cxx b/src/SMDS/SMDS_Mesh.cxx index ca5172d4e..93c4cf568 100644 --- a/src/SMDS/SMDS_Mesh.cxx +++ b/src/SMDS/SMDS_Mesh.cxx @@ -74,7 +74,7 @@ SMDS_Mesh *SMDS_Mesh::AddSubMesh() SMDS_MeshNode * SMDS_Mesh::AddNode(double x, double y, double z) { - return AddNodeWithID(x,y,z,myNodeIDFactory->GetFreeID()); + return SMDS_Mesh::AddNodeWithID(x,y,z,myNodeIDFactory->GetFreeID()); } /////////////////////////////////////////////////////////////////////////////// @@ -84,18 +84,15 @@ SMDS_MeshNode * SMDS_Mesh::AddNode(double x, double y, double z) /////////////////////////////////////////////////////////////////////////////// SMDS_MeshNode * SMDS_Mesh::AddNodeWithID(double x, double y, double z, int ID) { - // find the MeshNode corresponding to ID - const SMDS_MeshElement *node = myNodeIDFactory->MeshElement(ID); - - if (node == NULL) - { - SMDS_MeshNode * node=new SMDS_MeshNode(x, y, z); - myNodes.insert(node); - myNodeIDFactory->BindID(ID,node); - return node; - } - else - return NULL; + // find the MeshNode corresponding to ID + const SMDS_MeshElement *node = myNodeIDFactory->MeshElement(ID); + if(!node){ + SMDS_MeshNode * node=new SMDS_MeshNode(x, y, z); + myNodes.insert(node); + myNodeIDFactory->BindID(ID,node); + return node; + }else + return NULL; } /////////////////////////////////////////////////////////////////////////////// @@ -105,10 +102,10 @@ SMDS_MeshNode * SMDS_Mesh::AddNodeWithID(double x, double y, double z, int ID) SMDS_MeshEdge* SMDS_Mesh::AddEdgeWithID(int idnode1, int idnode2, int ID) { - SMDS_MeshNode * node1 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode1); - SMDS_MeshNode * node2 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode2); - if((node1==NULL)||(node2==NULL)) return NULL; - return AddEdgeWithID(node1, node2, ID); + SMDS_MeshNode * node1 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode1); + SMDS_MeshNode * node2 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode2); + if(!node1 || !node2) return NULL; + return SMDS_Mesh::AddEdgeWithID(node1, node2, ID); } /////////////////////////////////////////////////////////////////////////////// @@ -117,9 +114,9 @@ SMDS_MeshEdge* SMDS_Mesh::AddEdgeWithID(int idnode1, int idnode2, int ID) /////////////////////////////////////////////////////////////////////////////// SMDS_MeshEdge* SMDS_Mesh::AddEdge(const SMDS_MeshNode * node1, - const SMDS_MeshNode * node2) + const SMDS_MeshNode * node2) { - return AddEdgeWithID(node1, node2, myElementIDFactory->GetFreeID()); + return SMDS_Mesh::AddEdgeWithID(node1, node2, myElementIDFactory->GetFreeID()); } /////////////////////////////////////////////////////////////////////////////// @@ -127,30 +124,28 @@ SMDS_MeshEdge* SMDS_Mesh::AddEdge(const SMDS_MeshNode * node1, /// @param idnode1 ID of the first node /// @param idnode2 ID of the second node /// @param ID ID of the edge to create -/// @return The created edge or NULL if an edge with this ID already exists or +/// @return The created edge or NULL if an element with this ID already exists or /// if input nodes are not found. /////////////////////////////////////////////////////////////////////////////// SMDS_MeshEdge* SMDS_Mesh::AddEdgeWithID(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, int ID) -{ - SMDS_MeshNode *node1,*node2; - node1=const_cast(n1); - node2=const_cast(n2); - - SMDS_MeshEdge * edge=new SMDS_MeshEdge(node1,node2); - if(myElementIDFactory->BindID(ID, edge)) - { - node1->AddInverseElement(edge); - node2->AddInverseElement(edge); - myEdges.insert(edge); - return edge; - } - else - { - delete edge; - return NULL; - } + const SMDS_MeshNode * n2, + int ID) +{ + SMDS_MeshEdge * edge=new SMDS_MeshEdge(n1,n2); + if(myElementIDFactory->BindID(ID, edge)) { + SMDS_MeshNode *node1,*node2; + node1=const_cast(n1); + node2=const_cast(n2); + node1->AddInverseElement(edge); + node2->AddInverseElement(edge); + myEdges.insert(edge); + return edge; + } + else { + delete edge; + return NULL; + } } /////////////////////////////////////////////////////////////////////////////// @@ -159,81 +154,73 @@ SMDS_MeshEdge* SMDS_Mesh::AddEdgeWithID(const SMDS_MeshNode * n1, /////////////////////////////////////////////////////////////////////////////// SMDS_MeshFace* SMDS_Mesh::AddFace(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3) + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3) { - return AddFaceWithID(n1,n2,n3, myElementIDFactory->GetFreeID()); + return SMDS_Mesh::AddFaceWithID(n1,n2,n3, myElementIDFactory->GetFreeID()); } /////////////////////////////////////////////////////////////////////////////// -/// Add a quadrangle defined by its nodes IDs +/// Add a triangle defined by its nodes IDs /////////////////////////////////////////////////////////////////////////////// SMDS_MeshFace* SMDS_Mesh::AddFaceWithID(int idnode1, int idnode2, int idnode3, int ID) { - SMDS_MeshNode * node1 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode1); - SMDS_MeshNode * node2 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode2); - SMDS_MeshNode * node3 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode3); - if((node1==NULL)||(node2==NULL)||(node3==NULL)) return NULL; - return AddFaceWithID(node1, node2, node3, ID); + SMDS_MeshNode * node1 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode1); + SMDS_MeshNode * node2 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode2); + SMDS_MeshNode * node3 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode3); + if(!node1 || !node2 || !node3) return NULL; + return SMDS_Mesh::AddFaceWithID(node1, node2, node3, ID); } /////////////////////////////////////////////////////////////////////////////// -/// Add a quadrangle defined by its nodes +/// Add a triangle defined by its nodes /////////////////////////////////////////////////////////////////////////////// -SMDS_MeshFace* SMDS_Mesh::AddFaceWithID( - const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, int ID) +SMDS_MeshFace* SMDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + int ID) { - SMDS_MeshNode *node1, *node2, *node3; - node1=const_cast(n1), - node2=const_cast(n2), - node3=const_cast(n3); - SMDS_MeshFace * face=createTriangle(node1, node2, node3); + SMDS_MeshFace * face=createTriangle(n1, n2, n3); - if(myElementIDFactory->BindID(ID, face)) - { - node1->AddInverseElement(face); - node2->AddInverseElement(face); - node3->AddInverseElement(face); - return face; - } - else - { - RemoveFace(face); - return NULL; - } + if (!registerElement(ID, face)) { + RemoveElement(face, false); + face = NULL; + } + return face; } /////////////////////////////////////////////////////////////////////////////// -/// Add a triangle defined by its nodes. An ID is automatically affected to the +/// Add a quadrangle defined by its nodes. An ID is automatically affected to the /// created face /////////////////////////////////////////////////////////////////////////////// SMDS_MeshFace* SMDS_Mesh::AddFace(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4) + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4) { - return AddFaceWithID(n1,n2,n3, n4, myElementIDFactory->GetFreeID()); + return SMDS_Mesh::AddFaceWithID(n1,n2,n3, n4, myElementIDFactory->GetFreeID()); } /////////////////////////////////////////////////////////////////////////////// /// Add a quadrangle defined by its nodes IDs /////////////////////////////////////////////////////////////////////////////// -SMDS_MeshFace* SMDS_Mesh::AddFaceWithID(int idnode1, int idnode2, int idnode3, - int idnode4, int ID) +SMDS_MeshFace* SMDS_Mesh::AddFaceWithID(int idnode1, + int idnode2, + int idnode3, + int idnode4, + int ID) { - SMDS_MeshNode *node1, *node2, *node3, *node4; - node1 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode1); - node2 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode2); - node3 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode3); - node4 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode4); - if((node1==NULL)||(node2==NULL)||(node3==NULL)) return NULL; - return AddFaceWithID(node1, node2, node3, node4, ID); + SMDS_MeshNode *node1, *node2, *node3, *node4; + node1 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode1); + node2 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode2); + node3 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode3); + node4 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode4); + if(!node1 || !node2 || !node3 || !node4) return NULL; + return SMDS_Mesh::AddFaceWithID(node1, node2, node3, node4, ID); } /////////////////////////////////////////////////////////////////////////////// @@ -241,29 +228,91 @@ SMDS_MeshFace* SMDS_Mesh::AddFaceWithID(int idnode1, int idnode2, int idnode3, /////////////////////////////////////////////////////////////////////////////// SMDS_MeshFace* SMDS_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) { - SMDS_MeshNode *node1, *node2, *node3, *node4; - node1=const_cast(n1), - node2=const_cast(n2), - node3=const_cast(n3); - node4=const_cast(n4); - SMDS_MeshFace * face=createQuadrangle(node1, node2, node3, node4); + SMDS_MeshFace * face=createQuadrangle(n1, n2, n3, n4); - if(myElementIDFactory->BindID(ID, face)) - { - node1->AddInverseElement(face); - node2->AddInverseElement(face); - node3->AddInverseElement(face); - node4->AddInverseElement(face); - return face; - } - else - { - RemoveFace(face); - return NULL; - } + if (!registerElement(ID, face)) { + RemoveElement(face, false); + face = NULL; + } + return face; +} + +/////////////////////////////////////////////////////////////////////////////// +/// Add a triangle defined by its edges. An ID is automatically assigned to the +/// Created face +/////////////////////////////////////////////////////////////////////////////// + +SMDS_MeshFace* SMDS_Mesh::AddFace(const SMDS_MeshEdge * e1, + const SMDS_MeshEdge * e2, + const SMDS_MeshEdge * e3) +{ + if (!hasConstructionEdges()) + return NULL; + return AddFaceWithID(e1,e2,e3, myElementIDFactory->GetFreeID()); +} + +/////////////////////////////////////////////////////////////////////////////// +/// Add a triangle defined by its edges +/////////////////////////////////////////////////////////////////////////////// + +SMDS_MeshFace* SMDS_Mesh::AddFaceWithID(const SMDS_MeshEdge * e1, + const SMDS_MeshEdge * e2, + const SMDS_MeshEdge * e3, + int ID) +{ + if (!hasConstructionEdges()) + return NULL; + SMDS_MeshFace * face = new SMDS_FaceOfEdges(e1,e2,e3); + myFaces.insert(face); + + if (!registerElement(ID, face)) { + RemoveElement(face, false); + face = NULL; + } + return face; +} + +/////////////////////////////////////////////////////////////////////////////// +/// Add a quadrangle defined by its edges. An ID is automatically assigned to the +/// Created face +/////////////////////////////////////////////////////////////////////////////// + +SMDS_MeshFace* SMDS_Mesh::AddFace(const SMDS_MeshEdge * e1, + const SMDS_MeshEdge * e2, + const SMDS_MeshEdge * e3, + const SMDS_MeshEdge * e4) +{ + if (!hasConstructionEdges()) + return NULL; + return AddFaceWithID(e1,e2,e3,e4, myElementIDFactory->GetFreeID()); +} + +/////////////////////////////////////////////////////////////////////////////// +/// Add a quadrangle defined by its edges +/////////////////////////////////////////////////////////////////////////////// + +SMDS_MeshFace* SMDS_Mesh::AddFaceWithID(const SMDS_MeshEdge * e1, + const SMDS_MeshEdge * e2, + const SMDS_MeshEdge * e3, + const SMDS_MeshEdge * e4, + int ID) +{ + if (!hasConstructionEdges()) + return NULL; + SMDS_MeshFace * face = new SMDS_FaceOfEdges(e1,e2,e3,e4); + myFaces.insert(face); + + if (!registerElement(ID, face)) + { + RemoveElement(face, false); + face = NULL; + } + return face; } /////////////////////////////////////////////////////////////////////////////// @@ -272,32 +321,36 @@ SMDS_MeshFace* SMDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1, /////////////////////////////////////////////////////////////////////////////// SMDS_MeshVolume* SMDS_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) { - int ID = myElementIDFactory->GetFreeID(); - SMDS_MeshVolume * v = AddVolumeWithID(n1, n2, n3, n4, ID); - if(v==NULL) myElementIDFactory->ReleaseID(ID); - return v; + int ID = myElementIDFactory->GetFreeID(); + SMDS_MeshVolume * v = SMDS_Mesh::AddVolumeWithID(n1, n2, n3, n4, ID); + if(v==NULL) myElementIDFactory->ReleaseID(ID); + return v; } /////////////////////////////////////////////////////////////////////////////// ///Create a new tetrahedron and add it to the mesh. ///@param ID The ID of the new volume -///@return The created tetrahedron or NULL if an edge with this ID already exists +///@return The created tetrahedron or NULL if an element with this ID already exists ///or if input nodes are not found. /////////////////////////////////////////////////////////////////////////////// -SMDS_MeshVolume * SMDS_Mesh::AddVolumeWithID(int idnode1, int idnode2, - int idnode3, int idnode4, int ID) +SMDS_MeshVolume * SMDS_Mesh::AddVolumeWithID(int idnode1, + int idnode2, + int idnode3, + int idnode4, + int ID) { - SMDS_MeshNode *node1, *node2, *node3, *node4; - node1 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode1); - node2 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode2); - node3 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode3); - node4 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode4); - if((node1==NULL)||(node2==NULL)||(node3==NULL)||(node4=NULL)) return NULL; - return AddVolumeWithID(node1, node2, node3, node4, ID); + SMDS_MeshNode *node1, *node2, *node3, *node4; + node1 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode1); + node2 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode2); + node3 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode3); + node4 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode4); + if(!node1 || !node2 || !node3 || !node4) return NULL; + return SMDS_Mesh::AddVolumeWithID(node1, node2, node3, node4, ID); } /////////////////////////////////////////////////////////////////////////////// @@ -306,51 +359,35 @@ SMDS_MeshVolume * SMDS_Mesh::AddVolumeWithID(int idnode1, int idnode2, ///@return The created tetrahedron /////////////////////////////////////////////////////////////////////////////// -SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID( - const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, int ID) -{ - SMDS_MeshNode *node1, *node2, *node3, *node4; - node1=const_cast(n1), - node2=const_cast(n2), - node3=const_cast(n3); - node4=const_cast(n4); - SMDS_MeshVolume* volume; - if(hasConstructionFaces()) - { - SMDS_MeshFace * f1=createTriangle(node1,node2,node3); - SMDS_MeshFace * f2=createTriangle(node1,node2,node4); - SMDS_MeshFace * f3=createTriangle(node1,node3,node4); - SMDS_MeshFace * f4=createTriangle(node2,node3,node4); - volume=new SMDS_VolumeOfFaces(f1,f2,f3,f4); - myVolumes.insert(volume); - } - else if(hasConstructionEdges()) - { - MESSAGE("Error : Not implemented"); - return NULL; - } - else - { - volume=new SMDS_VolumeOfNodes(node1,node2,node3,node4); - myVolumes.insert(volume); - } - - if(myElementIDFactory->BindID(ID, volume)) - { - node1->AddInverseElement(volume); - node2->AddInverseElement(volume); - node3->AddInverseElement(volume); - node4->AddInverseElement(volume); - return volume; - } - else - { - RemoveVolume(volume); - return NULL; - } +SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4, + int ID) +{ + SMDS_MeshVolume* volume; + if(hasConstructionFaces()) { + SMDS_MeshFace * f1=FindFaceOrCreate(n1,n2,n3); + SMDS_MeshFace * f2=FindFaceOrCreate(n1,n2,n4); + SMDS_MeshFace * f3=FindFaceOrCreate(n1,n3,n4); + SMDS_MeshFace * f4=FindFaceOrCreate(n2,n3,n4); + volume=new SMDS_VolumeOfFaces(f1,f2,f3,f4); + myVolumes.insert(volume); + } + else if(hasConstructionEdges()) { + MESSAGE("Error : Not implemented"); + return NULL; + } + else { + volume=new SMDS_VolumeOfNodes(n1,n2,n3,n4); + myVolumes.insert(volume); + } + + if (!registerElement(ID, volume)) { + RemoveElement(volume, false); + volume = NULL; + } + return volume; } /////////////////////////////////////////////////////////////////////////////// @@ -360,36 +397,40 @@ SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID( /////////////////////////////////////////////////////////////////////////////// SMDS_MeshVolume* SMDS_Mesh::AddVolume(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, const SMDS_MeshNode * n5) + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4, + const SMDS_MeshNode * n5) { - int ID = myElementIDFactory->GetFreeID(); - SMDS_MeshVolume * v = AddVolumeWithID(n1, n2, n3, n4, n5, ID); - if(v==NULL) myElementIDFactory->ReleaseID(ID); - return v; + int ID = myElementIDFactory->GetFreeID(); + SMDS_MeshVolume * v = SMDS_Mesh::AddVolumeWithID(n1, n2, n3, n4, n5, ID); + if(v==NULL) myElementIDFactory->ReleaseID(ID); + return v; } /////////////////////////////////////////////////////////////////////////////// ///Create a new pyramid and add it to the mesh. ///Nodes 1,2,3 and 4 define the base of the pyramid ///@param ID The ID of the new volume -///@return The created pyramid or NULL if a pyramid with this ID already exists +///@return The created pyramid or NULL if an element with this ID already exists ///or if input nodes are not found. /////////////////////////////////////////////////////////////////////////////// -SMDS_MeshVolume * SMDS_Mesh::AddVolumeWithID(int idnode1, int idnode2, - int idnode3, int idnode4, int idnode5, int ID) +SMDS_MeshVolume * SMDS_Mesh::AddVolumeWithID(int idnode1, + int idnode2, + int idnode3, + int idnode4, + int idnode5, + int ID) { - SMDS_MeshNode *node1, *node2, *node3, *node4, *node5; - node1 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode1); - node2 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode2); - node3 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode3); - node4 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode4); - node5 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode5); - if((node1==NULL)||(node2==NULL)||(node3==NULL)||(node4=NULL)|| - (node5=NULL)) - return NULL; - return AddVolumeWithID(node1, node2, node3, node4, node5, ID); + SMDS_MeshNode *node1, *node2, *node3, *node4, *node5; + node1 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode1); + node2 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode2); + node3 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode3); + node4 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode4); + node5 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode5); + if(!node1 || !node2 || !node3 || !node4 || !node5) return NULL; + return SMDS_Mesh::AddVolumeWithID(node1, node2, node3, node4, node5, ID); } /////////////////////////////////////////////////////////////////////////////// @@ -399,54 +440,36 @@ SMDS_MeshVolume * SMDS_Mesh::AddVolumeWithID(int idnode1, int idnode2, ///@return The created pyramid /////////////////////////////////////////////////////////////////////////////// -SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID( - const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, - const SMDS_MeshNode * n5, int ID) -{ - SMDS_MeshNode *node1, *node2, *node3, *node4, *node5; - node1=const_cast(n1), - node2=const_cast(n2), - node3=const_cast(n3); - node4=const_cast(n4); - node5=const_cast(n5); - SMDS_MeshVolume* volume; - if(hasConstructionFaces()) - { - SMDS_MeshFace * f1=createQuadrangle(node1,node2,node3,node4); - SMDS_MeshFace * f2=createTriangle(node1,node2,node5); - SMDS_MeshFace * f3=createTriangle(node2,node3,node5); - SMDS_MeshFace * f4=createTriangle(node3,node4,node5); - volume=new SMDS_VolumeOfFaces(f1,f2,f3,f4); - myVolumes.insert(volume); - } - else if(hasConstructionEdges()) - { - MESSAGE("Error : Not implemented"); - return NULL; - } - else - { - volume=new SMDS_VolumeOfNodes(node1,node2,node3,node4,node5); - myVolumes.insert(volume); - } - - if(myElementIDFactory->BindID(ID, volume)) - { - node1->AddInverseElement(volume); - node2->AddInverseElement(volume); - node3->AddInverseElement(volume); - node4->AddInverseElement(volume); - node5->AddInverseElement(volume); - return volume; - } - else - { - RemoveVolume(volume); - return NULL; - } +SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4, + const SMDS_MeshNode * n5, + int ID) +{ + SMDS_MeshVolume* volume; + if(hasConstructionFaces()) { + SMDS_MeshFace * f1=FindFaceOrCreate(n1,n2,n3,n4); + SMDS_MeshFace * f2=FindFaceOrCreate(n1,n2,n5); + SMDS_MeshFace * f3=FindFaceOrCreate(n2,n3,n5); + SMDS_MeshFace * f4=FindFaceOrCreate(n3,n4,n5); + volume=new SMDS_VolumeOfFaces(f1,f2,f3,f4); + myVolumes.insert(volume); + } + else if(hasConstructionEdges()) { + MESSAGE("Error : Not implemented"); + return NULL; + } + else { + volume=new SMDS_VolumeOfNodes(n1,n2,n3,n4,n5); + myVolumes.insert(volume); + } + + if (!registerElement(ID, volume)) { + RemoveElement(volume, false); + volume = NULL; + } + return volume; } /////////////////////////////////////////////////////////////////////////////// @@ -456,38 +479,43 @@ SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID( /////////////////////////////////////////////////////////////////////////////// SMDS_MeshVolume* SMDS_Mesh::AddVolume(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, const SMDS_MeshNode * n5, - const SMDS_MeshNode * n6) + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4, + const SMDS_MeshNode * n5, + const SMDS_MeshNode * n6) { - int ID = myElementIDFactory->GetFreeID(); - SMDS_MeshVolume * v = AddVolumeWithID(n1, n2, n3, n4, n5, n6, ID); - if(v==NULL) myElementIDFactory->ReleaseID(ID); - return v; + int ID = myElementIDFactory->GetFreeID(); + SMDS_MeshVolume * v = SMDS_Mesh::AddVolumeWithID(n1, n2, n3, n4, n5, n6, ID); + if(v==NULL) myElementIDFactory->ReleaseID(ID); + return v; } /////////////////////////////////////////////////////////////////////////////// ///Create a new prism and add it to the mesh. ///Nodes 1,2,3 is a triangle and 1,2,5,4 a quadrangle. ///@param ID The ID of the new volume -///@return The created prism or NULL if a prism with this ID already exists +///@return The created prism or NULL if an element with this ID already exists ///or if input nodes are not found. /////////////////////////////////////////////////////////////////////////////// -SMDS_MeshVolume * SMDS_Mesh::AddVolumeWithID(int idnode1, int idnode2, - int idnode3, int idnode4, int idnode5, int idnode6, int ID) -{ - SMDS_MeshNode *node1, *node2, *node3, *node4, *node5, *node6; - node1 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode1); - node2 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode2); - node3 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode3); - node4 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode4); - node5 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode5); - node6 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode6); - if((node1==NULL)||(node2==NULL)||(node3==NULL)||(node4=NULL)|| - (node5==NULL)||(node6=NULL)) - return NULL; - return AddVolumeWithID(node1, node2, node3, node4, node5, node6, ID); +SMDS_MeshVolume * SMDS_Mesh::AddVolumeWithID(int idnode1, + int idnode2, + int idnode3, + int idnode4, + int idnode5, + int idnode6, + int ID) +{ + SMDS_MeshNode *node1, *node2, *node3, *node4, *node5, *node6; + node1 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode1); + node2 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode2); + node3 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode3); + node4 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode4); + node5 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode5); + node6 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode6); + if(!node1 || !node2 || !node3 || !node4 || !node5 || !node6) return NULL; + return SMDS_Mesh::AddVolumeWithID(node1, node2, node3, node4, node5, node6, ID); } /////////////////////////////////////////////////////////////////////////////// @@ -497,58 +525,38 @@ SMDS_MeshVolume * SMDS_Mesh::AddVolumeWithID(int idnode1, int idnode2, ///@return The created prism /////////////////////////////////////////////////////////////////////////////// -SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID( - const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, - const SMDS_MeshNode * n5, - const SMDS_MeshNode * n6, int ID) -{ - SMDS_MeshNode *node1, *node2, *node3, *node4, *node5, *node6; - node1=const_cast(n1), - node2=const_cast(n2), - node3=const_cast(n3); - node4=const_cast(n4); - node5=const_cast(n5); - node6=const_cast(n6); - SMDS_MeshVolume* volume; - if(hasConstructionFaces()) - { - SMDS_MeshFace * f1=createTriangle(node1,node2,node3); - SMDS_MeshFace * f2=createTriangle(node4,node5,node6); - SMDS_MeshFace * f3=createQuadrangle(node1,node4,node5,node2); - SMDS_MeshFace * f4=createQuadrangle(node2,node5,node6,node3); - SMDS_MeshFace * f5=createQuadrangle(node3,node6,node4,node1); - volume=new SMDS_VolumeOfFaces(f1,f2,f3,f4,f5); - myVolumes.insert(volume); - } - else if(hasConstructionEdges()) - { - MESSAGE("Error : Not implemented"); - return NULL; - } - else - { - volume=new SMDS_VolumeOfNodes(node1,node2,node3,node4,node5,node6); - myVolumes.insert(volume); - } - - if(myElementIDFactory->BindID(ID, volume)) - { - node1->AddInverseElement(volume); - node2->AddInverseElement(volume); - node3->AddInverseElement(volume); - node4->AddInverseElement(volume); - node5->AddInverseElement(volume); - node6->AddInverseElement(volume); - return volume; - } - else - { - RemoveVolume(volume); - return NULL; - } +SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4, + const SMDS_MeshNode * n5, + const SMDS_MeshNode * n6, + int ID) +{ + SMDS_MeshVolume* volume; + if(hasConstructionFaces()) { + SMDS_MeshFace * f1=FindFaceOrCreate(n1,n2,n3); + SMDS_MeshFace * f2=FindFaceOrCreate(n4,n5,n6); + SMDS_MeshFace * f3=FindFaceOrCreate(n1,n4,n5,n2); + SMDS_MeshFace * f4=FindFaceOrCreate(n2,n5,n6,n3); + SMDS_MeshFace * f5=FindFaceOrCreate(n3,n6,n4,n1); + volume=new SMDS_VolumeOfFaces(f1,f2,f3,f4,f5); + myVolumes.insert(volume); + } + else if(hasConstructionEdges()) { + MESSAGE("Error : Not implemented"); + return NULL; + } + else { + volume=new SMDS_VolumeOfNodes(n1,n2,n3,n4,n5,n6); + myVolumes.insert(volume); + } + + if (!registerElement(ID, volume)) { + RemoveElement(volume, false); + volume = NULL; + } + return volume; } /////////////////////////////////////////////////////////////////////////////// @@ -558,113 +566,236 @@ SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID( /////////////////////////////////////////////////////////////////////////////// SMDS_MeshVolume* SMDS_Mesh::AddVolume(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, const SMDS_MeshNode * n5, - const SMDS_MeshNode * n6, const SMDS_MeshNode * n7, - const SMDS_MeshNode * n8) + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4, + const SMDS_MeshNode * n5, + const SMDS_MeshNode * n6, + const SMDS_MeshNode * n7, + const SMDS_MeshNode * n8) { - int ID = myElementIDFactory->GetFreeID(); - SMDS_MeshVolume * v = AddVolumeWithID(n1, n2, n3, n4, n5, n6, n7, n8, ID); - if(v==NULL) myElementIDFactory->ReleaseID(ID); - return v; + int ID = myElementIDFactory->GetFreeID(); + SMDS_MeshVolume * v = SMDS_Mesh::AddVolumeWithID(n1, n2, n3, n4, n5, n6, n7, n8, ID); + if(v==NULL) myElementIDFactory->ReleaseID(ID); + return v; } /////////////////////////////////////////////////////////////////////////////// ///Create a new hexahedron and add it to the mesh. ///Nodes 1,2,3,4 and 5,6,7,8 are quadrangle and 5,1 and 7,3 are an edges. ///@param ID The ID of the new volume -///@return The created hexahedron or NULL if an hexahedron with this ID already +///@return The created hexahedron or NULL if an element with this ID already ///exists or if input nodes are not found. /////////////////////////////////////////////////////////////////////////////// -SMDS_MeshVolume * SMDS_Mesh::AddVolumeWithID(int idnode1, int idnode2, - int idnode3, int idnode4, int idnode5, int idnode6, int idnode7, - int idnode8, int ID) -{ - SMDS_MeshNode *node1, *node2, *node3, *node4, *node5, *node6, *node7, *node8; - node1 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode1); - node2 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode2); - node3 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode3); - node4 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode4); - node5 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode5); - node6 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode6); - node7 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode7); - node8 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode8); - if((node1==NULL)||(node2==NULL)||(node3==NULL)||(node4=NULL)|| - (node5==NULL)||(node6=NULL)||(node7==NULL)||(node8=NULL)) - return NULL; - return AddVolumeWithID(node1, node2, node3, node4, node5, node6, node7, - node8, ID); +SMDS_MeshVolume * SMDS_Mesh::AddVolumeWithID(int idnode1, + int idnode2, + int idnode3, + int idnode4, + int idnode5, + int idnode6, + int idnode7, + int idnode8, + int ID) +{ + SMDS_MeshNode *node1, *node2, *node3, *node4, *node5, *node6, *node7, *node8; + node1 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode1); + node2 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode2); + node3 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode3); + node4 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode4); + node5 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode5); + node6 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode6); + node7 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode7); + node8 = (SMDS_MeshNode *)myNodeIDFactory->MeshElement(idnode8); + if(!node1 || !node2 || !node3 || !node4 || !node5 || !node6 || !node7 || !node8) + return NULL; + return SMDS_Mesh::AddVolumeWithID(node1, node2, node3, node4, node5, node6, + node7, node8, ID); } /////////////////////////////////////////////////////////////////////////////// ///Create a new hexahedron and add it to the mesh. ///Nodes 1,2,3,4 and 5,6,7,8 are quadrangle and 5,1 and 7,3 are an edges. ///@param ID The ID of the new volume -///@return The created prism or NULL if an hexadron with this ID already exists +///@return The created prism or NULL if an element with this ID already exists ///or if input nodes are not found. /////////////////////////////////////////////////////////////////////////////// -SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID( - const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, - const SMDS_MeshNode * n5, - const SMDS_MeshNode * n6, - const SMDS_MeshNode * n7, - const SMDS_MeshNode * n8, int ID) -{ - SMDS_MeshNode *node1, *node2, *node3, *node4, *node5, *node6, *node7, *node8; - node1=const_cast(n1), - node2=const_cast(n2), - node3=const_cast(n3); - node4=const_cast(n4); - node5=const_cast(n5); - node6=const_cast(n6); - node7=const_cast(n7); - node8=const_cast(n8); - SMDS_MeshVolume* volume; - if(hasConstructionFaces()) - { - SMDS_MeshFace * f1=FindFaceOrCreate(node1,node2,node3,node4); - SMDS_MeshFace * f2=FindFaceOrCreate(node5,node6,node7,node8); - SMDS_MeshFace * f3=FindFaceOrCreate(node1,node4,node8,node5); - SMDS_MeshFace * f4=FindFaceOrCreate(node1,node2,node6,node5); - SMDS_MeshFace * f5=FindFaceOrCreate(node2,node3,node7,node6); - SMDS_MeshFace * f6=FindFaceOrCreate(node3,node4,node8,node7); - volume=new SMDS_VolumeOfFaces(f1,f2,f3,f4,f5,f6); - myVolumes.insert(volume); - } - else if(hasConstructionEdges()) - { - MESSAGE("Error : Not implemented"); - return NULL; - } - else - { - volume=new SMDS_HexahedronOfNodes(node1,node2,node3,node4,node5,node6, - node7,node8); - myVolumes.insert(volume); - } +SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4, + const SMDS_MeshNode * n5, + const SMDS_MeshNode * n6, + const SMDS_MeshNode * n7, + const SMDS_MeshNode * n8, + int ID) +{ + SMDS_MeshVolume* volume; + if(hasConstructionFaces()) { + SMDS_MeshFace * f1=FindFaceOrCreate(n1,n2,n3,n4); + SMDS_MeshFace * f2=FindFaceOrCreate(n5,n6,n7,n8); + SMDS_MeshFace * f3=FindFaceOrCreate(n1,n4,n8,n5); + SMDS_MeshFace * f4=FindFaceOrCreate(n1,n2,n6,n5); + SMDS_MeshFace * f5=FindFaceOrCreate(n2,n3,n7,n6); + SMDS_MeshFace * f6=FindFaceOrCreate(n3,n4,n8,n7); + volume=new SMDS_VolumeOfFaces(f1,f2,f3,f4,f5,f6); + myVolumes.insert(volume); + } + else if(hasConstructionEdges()) { + MESSAGE("Error : Not implemented"); + return NULL; + } + else { + volume=new SMDS_HexahedronOfNodes(n1,n2,n3,n4,n5,n6,n7,n8); + myVolumes.insert(volume); + } + + if (!registerElement(ID, volume)) { + RemoveElement(volume, false); + volume = NULL; + } + return volume; +} + +/////////////////////////////////////////////////////////////////////////////// +///Create a new tetrahedron defined by its faces and add it to the mesh. +///@return The created tetrahedron +/////////////////////////////////////////////////////////////////////////////// + +SMDS_MeshVolume* SMDS_Mesh::AddVolume(const SMDS_MeshFace * f1, + const SMDS_MeshFace * f2, + const SMDS_MeshFace * f3, + const SMDS_MeshFace * f4) +{ + if (!hasConstructionFaces()) + return NULL; + return AddVolumeWithID(f1,f2,f3,f4, myElementIDFactory->GetFreeID()); +} + +/////////////////////////////////////////////////////////////////////////////// +///Create a new tetrahedron defined by its faces and add it to the mesh. +///@param ID The ID of the new volume +///@return The created tetrahedron +/////////////////////////////////////////////////////////////////////////////// - if(myElementIDFactory->BindID(ID, volume)) - { - node1->AddInverseElement(volume); - node2->AddInverseElement(volume); - node3->AddInverseElement(volume); - node4->AddInverseElement(volume); - node5->AddInverseElement(volume); - node6->AddInverseElement(volume); - node7->AddInverseElement(volume); - node8->AddInverseElement(volume); - return volume; - } - else - { - RemoveVolume(volume); - return NULL; - } +SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshFace * f1, + const SMDS_MeshFace * f2, + const SMDS_MeshFace * f3, + const SMDS_MeshFace * f4, + int ID) +{ + if (!hasConstructionFaces()) + return NULL; + SMDS_MeshVolume * volume = new SMDS_VolumeOfFaces(f1,f2,f3,f4); + myVolumes.insert(volume); + + if (!registerElement(ID, volume)) { + RemoveElement(volume, false); + volume = NULL; + } + return volume; +} + +/////////////////////////////////////////////////////////////////////////////// +///Create a new pyramid defined by its faces and add it to the mesh. +///@return The created pyramid +/////////////////////////////////////////////////////////////////////////////// + +SMDS_MeshVolume* SMDS_Mesh::AddVolume(const SMDS_MeshFace * f1, + const SMDS_MeshFace * f2, + const SMDS_MeshFace * f3, + const SMDS_MeshFace * f4, + const SMDS_MeshFace * f5) +{ + if (!hasConstructionFaces()) + return NULL; + return AddVolumeWithID(f1,f2,f3,f4,f5, myElementIDFactory->GetFreeID()); +} + +/////////////////////////////////////////////////////////////////////////////// +///Create a new pyramid defined by its faces and add it to the mesh. +///@param ID The ID of the new volume +///@return The created pyramid +/////////////////////////////////////////////////////////////////////////////// + +SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshFace * f1, + const SMDS_MeshFace * f2, + const SMDS_MeshFace * f3, + const SMDS_MeshFace * f4, + const SMDS_MeshFace * f5, + int ID) +{ + if (!hasConstructionFaces()) + return NULL; + SMDS_MeshVolume * volume = new SMDS_VolumeOfFaces(f1,f2,f3,f4,f5); + myVolumes.insert(volume); + + if (!registerElement(ID, volume)) { + RemoveElement(volume, false); + volume = NULL; + } + return volume; +} + +/////////////////////////////////////////////////////////////////////////////// +///Create a new prism defined by its faces and add it to the mesh. +///@return The created prism +/////////////////////////////////////////////////////////////////////////////// + +SMDS_MeshVolume* SMDS_Mesh::AddVolume(const SMDS_MeshFace * f1, + const SMDS_MeshFace * f2, + const SMDS_MeshFace * f3, + const SMDS_MeshFace * f4, + const SMDS_MeshFace * f5, + const SMDS_MeshFace * f6) +{ + if (!hasConstructionFaces()) + return NULL; + return AddVolumeWithID(f1,f2,f3,f4,f5,f6, myElementIDFactory->GetFreeID()); +} + +/////////////////////////////////////////////////////////////////////////////// +///Create a new prism defined by its faces and add it to the mesh. +///@param ID The ID of the new volume +///@return The created prism +/////////////////////////////////////////////////////////////////////////////// + +SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID(const SMDS_MeshFace * f1, + const SMDS_MeshFace * f2, + const SMDS_MeshFace * f3, + const SMDS_MeshFace * f4, + const SMDS_MeshFace * f5, + const SMDS_MeshFace * f6, + int ID) +{ + if (!hasConstructionFaces()) + return NULL; + SMDS_MeshVolume * volume = new SMDS_VolumeOfFaces(f1,f2,f3,f4,f5,f6); + myVolumes.insert(volume); + + if (!registerElement(ID, volume)) { + RemoveElement(volume, false); + volume = NULL; + } + return volume; +} + +/////////////////////////////////////////////////////////////////////////////// +/// Registers element with the given ID, maintains inverse connections +/////////////////////////////////////////////////////////////////////////////// +bool SMDS_Mesh::registerElement(int ID, SMDS_MeshElement * element) +{ + if (myElementIDFactory->BindID(ID, element)) { + SMDS_ElemIteratorPtr it = element->nodesIterator(); + while (it->more()) { + SMDS_MeshNode *node = static_cast + (const_cast(it->next())); + node->AddInverseElement(element); + } + return true; + } + return false; } /////////////////////////////////////////////////////////////////////////////// @@ -672,15 +803,16 @@ SMDS_MeshVolume* SMDS_Mesh::AddVolumeWithID( /////////////////////////////////////////////////////////////////////////////// const SMDS_MeshNode * SMDS_Mesh::FindNode(int ID) const { - return (const SMDS_MeshNode *)myNodeIDFactory->MeshElement(ID); + return (const SMDS_MeshNode *)myNodeIDFactory->MeshElement(ID); } /////////////////////////////////////////////////////////////////////////////// ///Create a triangle and add it to the current mesh. This methode do not bind a ///ID to the create triangle. /////////////////////////////////////////////////////////////////////////////// -SMDS_MeshFace * SMDS_Mesh::createTriangle(SMDS_MeshNode * node1, - SMDS_MeshNode * node2, SMDS_MeshNode * node3) +SMDS_MeshFace * SMDS_Mesh::createTriangle(const SMDS_MeshNode * node1, + const SMDS_MeshNode * node2, + const SMDS_MeshNode * node3) { if(hasConstructionEdges()) { @@ -705,8 +837,10 @@ SMDS_MeshFace * SMDS_Mesh::createTriangle(SMDS_MeshNode * node1, ///Create a quadrangle and add it to the current mesh. This methode do not bind ///a ID to the create triangle. /////////////////////////////////////////////////////////////////////////////// -SMDS_MeshFace * SMDS_Mesh::createQuadrangle(SMDS_MeshNode * node1, - SMDS_MeshNode * node2, SMDS_MeshNode * node3, SMDS_MeshNode * node4) +SMDS_MeshFace * SMDS_Mesh::createQuadrangle(const SMDS_MeshNode * node1, + const SMDS_MeshNode * node2, + const SMDS_MeshNode * node3, + const SMDS_MeshNode * node4) { if(hasConstructionEdges()) { @@ -812,9 +946,6 @@ const SMDS_MeshEdge* SMDS_Mesh::FindEdge(int idnode1, int idnode2) const return FindEdge(node1,node2); } -/////////////////////////////////////////////////////////////////////////////// -/// -/////////////////////////////////////////////////////////////////////////////// //#include "Profiler.h" const SMDS_MeshEdge* SMDS_Mesh::FindEdge(const SMDS_MeshNode * node1, const SMDS_MeshNode * node2) const @@ -822,14 +953,14 @@ const SMDS_MeshEdge* SMDS_Mesh::FindEdge(const SMDS_MeshNode * node1, const SMDS_MeshEdge * toReturn=NULL; //PROFILER_Init(); //PROFILER_Set(); - SMDS_Iterator* it1=node1->edgesIterator(); + SMDS_ElemIteratorPtr it1=node1->edgesIterator(); //PROFILER_Get(0); //PROFILER_Set(); while(it1->more()) { const SMDS_MeshEdge * e=static_cast (it1->next()); - SMDS_Iterator* it2=e->nodesIterator(); + SMDS_ElemIteratorPtr it2=e->nodesIterator(); while(it2->more()) { if(it2->next()->GetID()==node2->GetID()) @@ -838,10 +969,8 @@ const SMDS_MeshEdge* SMDS_Mesh::FindEdge(const SMDS_MeshNode * node1, break; } } - delete it2; } //PROFILER_Get(1); - delete it1; return toReturn; } @@ -853,9 +982,8 @@ SMDS_MeshEdge* SMDS_Mesh::FindEdgeOrCreate(const SMDS_MeshNode * node1, toReturn=const_cast(FindEdge(node1,node2)); if(toReturn==NULL) { - toReturn=new SMDS_MeshEdge(const_cast(node1), - const_cast(node2)); - myEdges.insert(toReturn); + toReturn=new SMDS_MeshEdge(node1,node2); + myEdges.insert(toReturn); } return toReturn; } @@ -871,36 +999,53 @@ const SMDS_MeshFace* SMDS_Mesh::FindFace(int idnode1, int idnode2, const SMDS_MeshNode * node1=FindNode(idnode1); const SMDS_MeshNode * node2=FindNode(idnode2); const SMDS_MeshNode * node3=FindNode(idnode3); + if((node1==NULL)||(node2==NULL)||(node3==NULL)) return NULL; + return FindFace(node1, node2, node3); +} + +const SMDS_MeshFace* SMDS_Mesh::FindFace( + const SMDS_MeshNode *node1, + const SMDS_MeshNode *node2, + const SMDS_MeshNode *node3) const +{ const SMDS_MeshFace * face; const SMDS_MeshElement * node; bool node2found, node3found; - if((node1==NULL)||(node2==NULL)||(node3==NULL)) return NULL; - SMDS_Iterator* it1=node1->facesIterator(); + SMDS_ElemIteratorPtr it1=node1->facesIterator(); while(it1->more()) { face=static_cast(it1->next()); if(face->NbNodes()!=3) continue; - SMDS_Iterator* it2=face->nodesIterator(); + SMDS_ElemIteratorPtr it2=face->nodesIterator(); node2found=false; node3found=false; while(it2->more()) { node=it2->next(); - if(node->GetID()==idnode2) node2found=true; - if(node->GetID()==idnode3) node3found=true; + if(node->GetID()==node2->GetID()) node2found=true; + if(node->GetID()==node3->GetID()) node3found=true; } - delete it2; if(node2found&&node3found) - { - delete it1; return face; - } } - delete it1; return NULL; } +SMDS_MeshFace* SMDS_Mesh::FindFaceOrCreate( + const SMDS_MeshNode *node1, + const SMDS_MeshNode *node2, + const SMDS_MeshNode *node3) +{ + SMDS_MeshFace * toReturn=NULL; + toReturn=const_cast(FindFace(node1,node2,node3)); + if(toReturn==NULL) + { + toReturn=createTriangle(node1,node2,node3); + } + return toReturn; +} + //======================================================================= //function : FindFace //purpose : @@ -926,12 +1071,12 @@ const SMDS_MeshFace* SMDS_Mesh::FindFace( const SMDS_MeshFace * face; const SMDS_MeshElement * node; bool node2found, node3found, node4found; - SMDS_Iterator* it1=node1->facesIterator(); + SMDS_ElemIteratorPtr it1=node1->facesIterator(); while(it1->more()) { face=static_cast(it1->next()); if(face->NbNodes()!=4) continue; - SMDS_Iterator* it2=face->nodesIterator(); + SMDS_ElemIteratorPtr it2=face->nodesIterator(); node2found=false; node3found=false; node4found=false; @@ -942,14 +1087,9 @@ const SMDS_MeshFace* SMDS_Mesh::FindFace( if(node->GetID()==node3->GetID()) node3found=true; if(node->GetID()==node4->GetID()) node4found=true; } - delete it2; if(node2found&&node3found&&node4found) - { - delete it1; return face; - } } - delete it1; return NULL; } @@ -961,15 +1101,10 @@ SMDS_MeshFace* SMDS_Mesh::FindFaceOrCreate( { SMDS_MeshFace * toReturn=NULL; toReturn=const_cast(FindFace(node1,node2,node3,node4)); - if(toReturn==NULL) + if(toReturn==NULL) { - toReturn=createQuadrangle( - const_cast(node1), - const_cast(node2), - const_cast(node3), - const_cast(node4) - ); - } + toReturn=createQuadrangle(node1,node2,node3,node4); + } return toReturn; } @@ -991,9 +1126,8 @@ const SMDS_MeshElement* SMDS_Mesh::FindElement(int IDelem) const void SMDS_Mesh::DumpNodes() const { MESSAGE("dump nodes of mesh : "); - SMDS_Iterator * itnode=nodesIterator(); + SMDS_NodeIteratorPtr itnode=nodesIterator(); while(itnode->more()) MESSAGE(itnode->next()); - delete itnode; } //======================================================================= @@ -1004,9 +1138,8 @@ void SMDS_Mesh::DumpNodes() const void SMDS_Mesh::DumpEdges() const { MESSAGE("dump edges of mesh : "); - SMDS_Iterator * itedge=edgesIterator(); + SMDS_EdgeIteratorPtr itedge=edgesIterator(); while(itedge->more()) MESSAGE(itedge->next()); - delete itedge; } //======================================================================= @@ -1017,9 +1150,8 @@ void SMDS_Mesh::DumpEdges() const void SMDS_Mesh::DumpFaces() const { MESSAGE("dump faces of mesh : "); - SMDS_Iterator * itface=facesIterator(); + SMDS_FaceIteratorPtr itface=facesIterator(); while(itface->more()) MESSAGE(itface->next()); - delete itface; } //======================================================================= @@ -1030,9 +1162,8 @@ void SMDS_Mesh::DumpFaces() const void SMDS_Mesh::DumpVolumes() const { MESSAGE("dump volumes of mesh : "); - SMDS_Iterator * itvol=volumesIterator(); + SMDS_VolumeIteratorPtr itvol=volumesIterator(); while(itvol->more()) MESSAGE(itvol->next()); - delete itvol; } //======================================================================= @@ -1053,7 +1184,7 @@ void SMDS_Mesh::DebugStats() const //#ifdef DEB - SMDS_Iterator * itnode=nodesIterator(); + SMDS_NodeIteratorPtr itnode=nodesIterator(); int sizeofnodes = 0; int sizeoffaces = 0; @@ -1063,19 +1194,16 @@ void SMDS_Mesh::DebugStats() const sizeofnodes += sizeof(*node); - SMDS_Iterator * it= - node->GetInverseElementIterator(); + SMDS_ElemIteratorPtr it = node->GetInverseElementIterator(); while(it->more()) { const SMDS_MeshElement *me = it->next(); sizeofnodes += sizeof(me); } - delete it; } - delete itnode; - SMDS_Iterator* itface=facesIterator(); - + + SMDS_FaceIteratorPtr itface=facesIterator(); while(itface->more()) { const SMDS_MeshElement *face = itface->next(); @@ -1086,7 +1214,6 @@ void SMDS_Mesh::DebugStats() const MESSAGE("total size of face elements = " << sizeoffaces);; //#endif - } /////////////////////////////////////////////////////////////////////////////// @@ -1150,12 +1277,11 @@ SMDS_Mesh::~SMDS_Mesh() itc++; } - SMDS_Iterator * itn=nodesIterator(); + SMDS_NodeIteratorPtr itn=nodesIterator(); while(itn->more()) { delete itn->next(); } - delete itn; set::iterator ite=myEdges.begin(); while(ite!=myEdges.end()) @@ -1177,7 +1303,6 @@ SMDS_Mesh::~SMDS_Mesh() delete *itv; itv++; } - } /////////////////////////////////////////////////////////////////////////////// @@ -1243,143 +1368,151 @@ void SMDS_Mesh::setInverseElements(bool b) /// Return an iterator on nodes of the current mesh. Once used this iterator /// must be free by the caller /////////////////////////////////////////////////////////////////////////////// -SMDS_Iterator * SMDS_Mesh::nodesIterator() const +class SMDS_Mesh_MyNodeIterator:public SMDS_NodeIterator { - class MyIterator:public SMDS_Iterator - { - const SetOfNodes& mySet; - SetOfNodes::iterator myIterator; - public: - MyIterator(const SetOfNodes& s):mySet(s) - { - myIterator=mySet.begin(); - } + typedef SMDS_Mesh::SetOfNodes SetOfNodes; + const SetOfNodes& mySet; + SetOfNodes::iterator myIterator; + public: + SMDS_Mesh_MyNodeIterator(const SetOfNodes& s):mySet(s) + { + myIterator=mySet.begin(); + } - bool more() - { - return myIterator!=mySet.end(); - } + bool more() + { + return myIterator!=mySet.end(); + } - const SMDS_MeshNode* next() - { - const SMDS_MeshNode* current=*myIterator; - myIterator++; - return current; - } - }; - return new MyIterator(myNodes); + const SMDS_MeshNode* next() + { + const SMDS_MeshNode* current=*myIterator; + myIterator++; + return current; + } +}; + +SMDS_NodeIteratorPtr SMDS_Mesh::nodesIterator() const +{ + return SMDS_NodeIteratorPtr(new SMDS_Mesh_MyNodeIterator(myNodes)); } /////////////////////////////////////////////////////////////////////////////// ///Return an iterator on volumes of the current mesh. Once used this iterator ///must be free by the caller /////////////////////////////////////////////////////////////////////////////// -SMDS_Iterator * SMDS_Mesh::edgesIterator() const +class SMDS_Mesh_MyEdgeIterator:public SMDS_EdgeIterator { - class MyIterator:public SMDS_Iterator - { - const SetOfEdges& mySet; - const SMDS_MeshEdge * myEdge; - SetOfEdges::iterator myIterator; - public: - MyIterator(const SetOfEdges& s):mySet(s) - { - myIterator=mySet.begin(); - } + typedef SMDS_Mesh::SetOfEdges SetOfEdges; + const SetOfEdges& mySet; + const SMDS_MeshEdge * myEdge; + SetOfEdges::iterator myIterator; + public: + SMDS_Mesh_MyEdgeIterator(const SetOfEdges& s):mySet(s) + { + myIterator=mySet.begin(); + } - bool more() - { - while((myIterator!=mySet.end())) - { - if((*myIterator)->GetID()!=-1) - return true; - myIterator++; - } - return false; - } + bool more() + { + while((myIterator!=mySet.end())) + { + if((*myIterator)->GetID()!=-1) + return true; + myIterator++; + } + return false; + } - const SMDS_MeshEdge* next() - { - const SMDS_MeshEdge* current=*myIterator; - myIterator++; - return current; - } - }; - return new MyIterator(myEdges); + const SMDS_MeshEdge* next() + { + const SMDS_MeshEdge* current=*myIterator; + myIterator++; + return current; + } +}; + +SMDS_EdgeIteratorPtr SMDS_Mesh::edgesIterator() const +{ + return SMDS_EdgeIteratorPtr(new SMDS_Mesh_MyEdgeIterator(myEdges)); } /////////////////////////////////////////////////////////////////////////////// ///Return an iterator on faces of the current mesh. Once used this iterator ///must be free by the caller /////////////////////////////////////////////////////////////////////////////// -SMDS_Iterator * SMDS_Mesh::facesIterator() const +class SMDS_Mesh_MyFaceIterator:public SMDS_FaceIterator { - class MyIterator:public SMDS_Iterator - { - const SetOfFaces& mySet; - set::iterator myIterator; - public: - MyIterator(const SetOfFaces& s):mySet(s) - { - myIterator=mySet.begin(); - } + typedef SMDS_Mesh::SetOfFaces SetOfFaces; + const SetOfFaces& mySet; + SetOfFaces::iterator myIterator; + public: + SMDS_Mesh_MyFaceIterator(const SetOfFaces& s):mySet(s) + { + myIterator=mySet.begin(); + } - bool more() - { - while((myIterator!=mySet.end())) - { - if((*myIterator)->GetID()!=-1) - return true; - myIterator++; - } - return false; - } + bool more() + { + while((myIterator!=mySet.end())) + { + if((*myIterator)->GetID()!=-1) + return true; + myIterator++; + } + return false; + } - const SMDS_MeshFace* next() - { - const SMDS_MeshFace* current=*myIterator; - myIterator++; - return current; - } - }; - return new MyIterator(myFaces); + const SMDS_MeshFace* next() + { + const SMDS_MeshFace* current=*myIterator; + myIterator++; + return current; + } +}; + +SMDS_FaceIteratorPtr SMDS_Mesh::facesIterator() const +{ + return SMDS_FaceIteratorPtr(new SMDS_Mesh_MyFaceIterator(myFaces)); } /////////////////////////////////////////////////////////////////////////////// ///Return an iterator on volumes of the current mesh. Once used this iterator ///must be free by the caller /////////////////////////////////////////////////////////////////////////////// -SMDS_Iterator * SMDS_Mesh::volumesIterator() const +class SMDS_Mesh_MyVolumeIterator:public SMDS_VolumeIterator { - class MyIterator:public SMDS_Iterator - { - const SetOfVolumes& mySet; - SetOfVolumes::iterator myIterator; - public: - MyIterator(const SetOfVolumes& s):mySet(s) - { - myIterator=mySet.begin(); - } + typedef SMDS_Mesh::SetOfVolumes SetOfVolumes; + const SetOfVolumes& mySet; + SetOfVolumes::iterator myIterator; + public: + SMDS_Mesh_MyVolumeIterator(const SetOfVolumes& s):mySet(s) + { + myIterator=mySet.begin(); + } - bool more() - { - return myIterator!=mySet.end(); - } + bool more() + { + return myIterator!=mySet.end(); + } - const SMDS_MeshVolume* next() - { - const SMDS_MeshVolume* current=*myIterator; - myIterator++; - return current; - } - }; - return new MyIterator(myVolumes); + const SMDS_MeshVolume* next() + { + const SMDS_MeshVolume* current=*myIterator; + myIterator++; + return current; + } +}; + +SMDS_VolumeIteratorPtr SMDS_Mesh::volumesIterator() const +{ + return SMDS_VolumeIteratorPtr(new SMDS_Mesh_MyVolumeIterator(myVolumes)); } /////////////////////////////////////////////////////////////////////////////// /// Do intersection of sets (more than 2) /////////////////////////////////////////////////////////////////////////////// -set * intersectionOfSets( +static set * intersectionOfSets( set vs[], int numberOfSets) { set* rsetA=new set(vs[0]); @@ -1401,26 +1534,25 @@ set * intersectionOfSets( /////////////////////////////////////////////////////////////////////////////// /// Return the list of finit elements owning the given element /////////////////////////////////////////////////////////////////////////////// -set * getFinitElements(const SMDS_MeshElement * element) +static set * getFinitElements(const SMDS_MeshElement * element) { int numberOfSets=element->NbNodes(); set initSet[numberOfSets]; - SMDS_Iterator * itNodes=element->nodesIterator(); + SMDS_ElemIteratorPtr itNodes=element->nodesIterator(); int i=0; while(itNodes->more()) { const SMDS_MeshNode * n=static_cast(itNodes->next()); - SMDS_Iterator * itFe = n->GetInverseElementIterator(); + SMDS_ElemIteratorPtr itFe = n->GetInverseElementIterator(); //initSet[i]=set(); - while(itFe->more()) initSet[i].insert(itFe->next()); + while(itFe->more()) + initSet[i].insert(itFe->next()); i++; - delete itFe; } - delete itNodes; return intersectionOfSets(initSet, numberOfSets); } @@ -1428,7 +1560,7 @@ set * getFinitElements(const SMDS_MeshElement * element /////////////////////////////////////////////////////////////////////////////// /// Return the list of nodes used only by the given elements /////////////////////////////////////////////////////////////////////////////// -set * getExclusiveNodes( +static set * getExclusiveNodes( set& elements) { set * toReturn=new set(); @@ -1436,20 +1568,18 @@ set * getExclusiveNodes( while(itElements!=elements.end()) { - SMDS_Iterator * itNodes= - (*itElements)->nodesIterator(); + SMDS_ElemIteratorPtr itNodes = (*itElements)->nodesIterator(); itElements++; while(itNodes->more()) { const SMDS_MeshNode * n=static_cast(itNodes->next()); - SMDS_Iterator * itFe = n->GetInverseElementIterator(); + SMDS_ElemIteratorPtr itFe = n->GetInverseElementIterator(); set s; - while(itFe->more()) s.insert(itFe->next()); - delete itFe; + while(itFe->more()) + s.insert(itFe->next()); if(s==elements) toReturn->insert(n); } - delete itNodes; } return toReturn; } @@ -1471,46 +1601,49 @@ void SMDS_Mesh::addChildrenWithNodes(set& setOfChildren break; case SMDSAbs_Edge: { - SMDS_Iterator * itn=element->nodesIterator(); + SMDS_ElemIteratorPtr itn=element->nodesIterator(); while(itn->more()) { const SMDS_MeshElement * e=itn->next(); - if(nodes.find(e)!=nodes.end()) setOfChildren.insert(element); + if(nodes.find(e)!=nodes.end()) + { + setOfChildren.insert(element); + break; + } } - delete itn; - } break; + } break; case SMDSAbs_Face: { - SMDS_Iterator * itn=element->nodesIterator(); + SMDS_ElemIteratorPtr itn=element->nodesIterator(); while(itn->more()) { const SMDS_MeshElement * e=itn->next(); - if(nodes.find(e)!=nodes.end()) setOfChildren.insert(element); + if(nodes.find(e)!=nodes.end()) + { + setOfChildren.insert(element); + break; + } } - delete itn; if(hasConstructionEdges()) { - SMDS_Iterator* ite=element->edgesIterator(); + SMDS_ElemIteratorPtr ite=element->edgesIterator(); while(ite->more()) addChildrenWithNodes(setOfChildren, ite->next(), nodes); - delete ite; } } break; case SMDSAbs_Volume: { if(hasConstructionFaces()) { - SMDS_Iterator * ite=element->facesIterator(); + SMDS_ElemIteratorPtr ite=element->facesIterator(); while(ite->more()) addChildrenWithNodes(setOfChildren, ite->next(), nodes); - delete ite; } else if(hasConstructionEdges()) { - SMDS_Iterator * ite=element->edgesIterator(); + SMDS_ElemIteratorPtr ite=element->edgesIterator(); while(ite->more()) addChildrenWithNodes(setOfChildren, ite->next(), nodes); - delete ite; } } } @@ -1523,54 +1656,135 @@ void SMDS_Mesh::addChildrenWithNodes(set& setOfChildren void SMDS_Mesh::RemoveElement(const SMDS_MeshElement * elem, const bool removenodes) { - set * s1=getFinitElements(elem); - - set * s2=getExclusiveNodes(*s1); - set s3; - set::iterator it=s1->begin(); - while(it!=s1->end()) - { - addChildrenWithNodes(s3, *it ,*s2); - s3.insert(*it); - it++; - } - if(elem->GetType()!=SMDSAbs_Node) s3.insert(elem); - it=s3.begin(); - while(it!=s3.end()) - { - switch((*it)->GetType()) - { - case SMDSAbs_Node: - MESSAGE("Internal Error: This should not happen"); - break; - case SMDSAbs_Edge: - myEdges.erase(static_cast( - const_cast(*it))); - break; - case SMDSAbs_Face: - myFaces.erase(static_cast( - const_cast(*it))); - break; - case SMDSAbs_Volume: - myVolumes.erase(static_cast( - const_cast(*it))); - break; - } - delete (*it); - it++; - } - if(removenodes) - { - it=s2->begin(); - while(it!=s2->end()) - { - myNodes.erase(static_cast( - const_cast(*it))); - delete *it; - it++; - } - } - - delete s2; - delete s1; + list removedElems; + list removedNodes; + RemoveElement( elem, removedElems, removedNodes, removenodes ); +} + +/////////////////////////////////////////////////////////////////////////////// +///@param elem The element to delete +///@param removedElems contains all removed elements +///@param removedNodes contains all removed nodes +///@param removenodes if true remaining nodes will be removed +/////////////////////////////////////////////////////////////////////////////// +void SMDS_Mesh::RemoveElement(const SMDS_MeshElement * elem, + list& removedElems, + list& removedNodes, + const bool removenodes) +{ + // get finite elements built on elem + set * s1; + if (!hasConstructionEdges() && elem->GetType() == SMDSAbs_Edge || + !hasConstructionFaces() && elem->GetType() == SMDSAbs_Face) + { + s1 = new set(); + s1->insert(elem); + } + else + s1 = getFinitElements(elem); + + // get exclusive nodes (which would become free afterwards) + set * s2; + if (s1->empty() && elem->GetType() == SMDSAbs_Node) + { + s2 = new set(); + s2->insert(elem); + } + else + s2 = getExclusiveNodes(*s1); + + // form the set of finite and construction elements to remove + set s3; + set::iterator it=s1->begin(); + while(it!=s1->end()) + { + addChildrenWithNodes(s3, *it ,*s2); + s3.insert(*it); + it++; + } + if(elem->GetType()!=SMDSAbs_Node) s3.insert(elem); + + // remove finite and construction elements + it=s3.begin(); + while(it!=s3.end()) + { + // Remove element from of its nodes + SMDS_ElemIteratorPtr itn=(*it)->nodesIterator(); + while(itn->more()) + { + SMDS_MeshNode * n = static_cast + (const_cast(itn->next())); + n->RemoveInverseElement( (*it) ); + } + + switch((*it)->GetType()) + { + case SMDSAbs_Node: + MESSAGE("Internal Error: This should not happen"); + break; + case SMDSAbs_Edge: + myEdges.erase(static_cast + (const_cast(*it))); + break; + case SMDSAbs_Face: + myFaces.erase(static_cast + (const_cast(*it))); + break; + case SMDSAbs_Volume: + myVolumes.erase(static_cast + (const_cast(*it))); + break; + } + //MESSAGE( "SMDS: RM elem " << (*it)->GetID() ); + removedElems.push_back( (*it) ); + myElementIDFactory->ReleaseID((*it)->GetID()); + delete (*it); + it++; + } + + // remove exclusive (free) nodes + if(removenodes) + { + it=s2->begin(); + while(it!=s2->end()) + { + //MESSAGE( "SMDS: RM node " << (*it)->GetID() ); + myNodes.erase(static_cast + (const_cast(*it))); + myNodeIDFactory->ReleaseID((*it)->GetID()); + removedNodes.push_back( (*it) ); + delete *it; + it++; + } + } + + delete s2; + delete s1; +} + +/*! + * Checks if the element is present in mesh. + * Useful to determine dead pointers. + */ +bool SMDS_Mesh::Contains (const SMDS_MeshElement* elem) const +{ + // we should not imply on validity of *elem, so iterate on containers + // of all types in the hope of finding somewhere there + SMDS_NodeIteratorPtr itn = nodesIterator(); + while (itn->more()) + if (elem == itn->next()) + return true; + SMDS_EdgeIteratorPtr ite = edgesIterator(); + while (ite->more()) + if (elem == ite->next()) + return true; + SMDS_FaceIteratorPtr itf = facesIterator(); + while (itf->more()) + if (elem == itf->next()) + return true; + SMDS_VolumeIteratorPtr itv = volumesIterator(); + while (itv->more()) + if (elem == itv->next()) + return true; + return false; } diff --git a/src/SMDS/SMDS_Mesh.hxx b/src/SMDS/SMDS_Mesh.hxx index f869cd705..615071991 100644 --- a/src/SMDS/SMDS_Mesh.hxx +++ b/src/SMDS/SMDS_Mesh.hxx @@ -34,201 +34,281 @@ #include "SMDS_MeshElementIDFactory.hxx" #include "SMDS_Iterator.hxx" +#include #include #include class SMDSControl_BoundaryEdges; -class SMDS_Mesh:public SMDS_MeshObject -{ - - public: - - SMDS_Mesh(); - - SMDS_Iterator * nodesIterator() const; - SMDS_Iterator * edgesIterator() const; - SMDS_Iterator * facesIterator() const; - SMDS_Iterator * volumesIterator() const; - - SMDS_Mesh *AddSubMesh(); - virtual SMDS_MeshNode* AddNode(double x, double y, double z); - virtual SMDS_MeshNode* AddNodeWithID(double x, double y, double z, int ID); - - virtual SMDS_MeshEdge* AddEdge( - const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2); - virtual SMDS_MeshFace* AddFace( - const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3); - virtual SMDS_MeshFace* AddFace( - const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4); - virtual SMDS_MeshVolume* AddVolume( - const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4); - virtual SMDS_MeshVolume* AddVolume( - const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, - const SMDS_MeshNode * n5); - virtual SMDS_MeshVolume* AddVolume( - const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, - const SMDS_MeshNode * n5, - const SMDS_MeshNode * n6); - virtual SMDS_MeshVolume* AddVolume( - const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, - const SMDS_MeshNode * n5, - const SMDS_MeshNode * n6, - const SMDS_MeshNode * n7, - const SMDS_MeshNode * n8); - - SMDS_MeshEdge* AddEdgeWithID(int n1, int n2, int ID); - SMDS_MeshFace* AddFaceWithID(int n1, int n2, int n3, int ID); - SMDS_MeshFace* AddFaceWithID(int n1, int n2, int n3, int n4, - int ID); - SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4, - int ID); - SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4, - int n5, int ID); - SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4, - int n5, int n6, int ID); - SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4, - int n5, int n6, int n7, int n8, int ID); - - SMDS_MeshEdge* AddEdgeWithID( - const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, int ID); - SMDS_MeshFace* AddFaceWithID( - const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, int ID); - SMDS_MeshFace* AddFaceWithID( - const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, int ID); - SMDS_MeshVolume* AddVolumeWithID( - const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, int ID); - 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); - 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); - SMDS_MeshVolume* AddVolumeWithID( - const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, - const SMDS_MeshNode * n5, - const SMDS_MeshNode * n6, - const SMDS_MeshNode * n7, - const SMDS_MeshNode * n8, int ID); - - virtual void RemoveElement(const SMDS_MeshElement * elem, const bool removenodes = - false); - virtual void RemoveNode(const SMDS_MeshNode * node); - virtual void RemoveEdge(const SMDS_MeshEdge * edge); - virtual void RemoveFace(const SMDS_MeshFace * face); - virtual void RemoveVolume(const SMDS_MeshVolume * volume); - - virtual bool RemoveFromParent(); - virtual bool RemoveSubMesh(const SMDS_Mesh * aMesh); - - const SMDS_MeshNode *FindNode(int idnode) const; - const SMDS_MeshEdge *FindEdge(int idnode1, int idnode2) const; - const SMDS_MeshFace *FindFace(int idnode1, int idnode2, int idnode3) const; - const SMDS_MeshFace *FindFace(int idnode1, int idnode2, int idnode3, int idnode4) const; - const SMDS_MeshElement *FindElement(int IDelem) const; +typedef SMDS_Iterator SMDS_NodeIterator; +typedef boost::shared_ptr > SMDS_NodeIteratorPtr; +typedef SMDS_Iterator SMDS_EdgeIterator; +typedef boost::shared_ptr > SMDS_EdgeIteratorPtr; +typedef SMDS_Iterator SMDS_FaceIterator; +typedef boost::shared_ptr > SMDS_FaceIteratorPtr; +typedef SMDS_Iterator SMDS_VolumeIterator; +typedef boost::shared_ptr > SMDS_VolumeIteratorPtr; + +class SMDS_Mesh:public SMDS_MeshObject{ +public: + + SMDS_Mesh(); + + SMDS_NodeIteratorPtr nodesIterator() const; + SMDS_EdgeIteratorPtr edgesIterator() const; + SMDS_FaceIteratorPtr facesIterator() const; + SMDS_VolumeIteratorPtr volumesIterator() const; + + SMDS_Mesh *AddSubMesh(); + + virtual SMDS_MeshNode* AddNodeWithID(double x, double y, double z, int ID); + virtual SMDS_MeshNode* AddNode(double x, double y, double z); + + virtual SMDS_MeshEdge* AddEdgeWithID(int n1, int n2, int ID); + virtual SMDS_MeshEdge* AddEdgeWithID(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2, + int ID); + virtual SMDS_MeshEdge* AddEdge(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2); + + virtual SMDS_MeshFace* AddFaceWithID(int n1, int n2, int n3, int ID); + virtual SMDS_MeshFace* AddFaceWithID(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + int ID); + virtual SMDS_MeshFace* AddFace(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3); + + virtual SMDS_MeshFace* AddFaceWithID(int n1, int n2, int n3, int n4, int ID); + virtual SMDS_MeshFace* AddFaceWithID(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4, + int ID); + virtual SMDS_MeshFace* AddFace(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4); + + virtual SMDS_MeshFace* AddFaceWithID(const SMDS_MeshEdge * e1, + const SMDS_MeshEdge * e2, + const SMDS_MeshEdge * e3, int ID); + virtual SMDS_MeshFace* AddFace(const SMDS_MeshEdge * e1, + const SMDS_MeshEdge * e2, + const SMDS_MeshEdge * e3); + + virtual SMDS_MeshFace* AddFaceWithID(const SMDS_MeshEdge * e1, + const SMDS_MeshEdge * e2, + const SMDS_MeshEdge * e3, + const SMDS_MeshEdge * e4, int ID); + virtual SMDS_MeshFace* AddFace(const SMDS_MeshEdge * e1, + const SMDS_MeshEdge * e2, + const SMDS_MeshEdge * e3, + const SMDS_MeshEdge * e4); + + virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4, int ID); + virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4, + int ID); + virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4); + + virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4, + int n5, int ID); + virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4, + const SMDS_MeshNode * n5, + int ID); + virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4, + const SMDS_MeshNode * n5); + + virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4, + int n5, int n6, int ID); + virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4, + const SMDS_MeshNode * n5, + const SMDS_MeshNode * n6, + int ID); + virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4, + const SMDS_MeshNode * n5, + const SMDS_MeshNode * n6); + + virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4, + int n5, int n6, int n7, int n8, int ID); + virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4, + const SMDS_MeshNode * n5, + const SMDS_MeshNode * n6, + const SMDS_MeshNode * n7, + const SMDS_MeshNode * n8, + int ID); + virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4, + const SMDS_MeshNode * n5, + const SMDS_MeshNode * n6, + const SMDS_MeshNode * n7, + const SMDS_MeshNode * n8); + + virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshFace * f1, + const SMDS_MeshFace * f2, + const SMDS_MeshFace * f3, + const SMDS_MeshFace * f4, int ID); + virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshFace * f1, + const SMDS_MeshFace * f2, + const SMDS_MeshFace * f3, + const SMDS_MeshFace * f4); + + virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshFace * f1, + const SMDS_MeshFace * f2, + const SMDS_MeshFace * f3, + const SMDS_MeshFace * f4, + const SMDS_MeshFace * f5, int ID); + virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshFace * f1, + const SMDS_MeshFace * f2, + const SMDS_MeshFace * f3, + const SMDS_MeshFace * f4, + const SMDS_MeshFace * f5); + + virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshFace * f1, + const SMDS_MeshFace * f2, + const SMDS_MeshFace * f3, + const SMDS_MeshFace * f4, + const SMDS_MeshFace * f5, + const SMDS_MeshFace * f6, int ID); + virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshFace * f1, + const SMDS_MeshFace * f2, + const SMDS_MeshFace * f3, + const SMDS_MeshFace * f4, + const SMDS_MeshFace * f5, + const SMDS_MeshFace * f6); + + virtual void RemoveElement(const SMDS_MeshElement * elem, + list& removedElems, + list& removedNodes, + const bool removenodes = false); + virtual void RemoveElement(const SMDS_MeshElement * elem, const bool removenodes = false); + virtual void RemoveNode(const SMDS_MeshNode * node); + virtual void RemoveEdge(const SMDS_MeshEdge * edge); + virtual void RemoveFace(const SMDS_MeshFace * face); + virtual void RemoveVolume(const SMDS_MeshVolume * volume); + + virtual bool RemoveFromParent(); + virtual bool RemoveSubMesh(const SMDS_Mesh * aMesh); + + const SMDS_MeshNode *FindNode(int idnode) const; + const SMDS_MeshEdge *FindEdge(int idnode1, int idnode2) const; + const SMDS_MeshFace *FindFace(int idnode1, int idnode2, int idnode3) const; + const SMDS_MeshFace *FindFace(int idnode1, int idnode2, int idnode3, int idnode4) const; + const SMDS_MeshElement *FindElement(int IDelem) const; - int NbNodes() const; - int NbEdges() const; - int NbFaces() const; - int NbVolumes() const; - int NbSubMesh() const; - void DumpNodes() const; - void DumpEdges() const; - void DumpFaces() const; - void DumpVolumes() const; - void DebugStats() const; - SMDS_Mesh *boundaryFaces(); - SMDS_Mesh *boundaryEdges(); - virtual ~SMDS_Mesh(); - bool hasConstructionEdges(); - bool hasConstructionFaces(); - bool hasInverseElements(); - void setConstructionEdges(bool); - void setConstructionFaces(bool); - void setInverseElements(bool); - - private: - SMDS_Mesh(SMDS_Mesh * parent); - SMDS_MeshFace * createTriangle(SMDS_MeshNode * node1, - SMDS_MeshNode * node2, SMDS_MeshNode * node3); - SMDS_MeshFace * createQuadrangle(SMDS_MeshNode * node1, - SMDS_MeshNode * node2, SMDS_MeshNode * node3, SMDS_MeshNode * node4); - const SMDS_MeshEdge* FindEdge(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2) const; - SMDS_MeshEdge* FindEdgeOrCreate(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2); - SMDS_MeshFace* FindFaceOrCreate( - const SMDS_MeshNode *n1, - const SMDS_MeshNode *n2, - const SMDS_MeshNode *n3); - const SMDS_MeshFace* FindFace( - const SMDS_MeshNode *n1, - const SMDS_MeshNode *n2, - const SMDS_MeshNode *n3, - const SMDS_MeshNode *n4) const; - SMDS_MeshFace* FindFaceOrCreate( - const SMDS_MeshNode *n1, - const SMDS_MeshNode *n2, - const SMDS_MeshNode *n3, - const SMDS_MeshNode *n4); - void addChildrenWithNodes(set& setOfChildren, - const SMDS_MeshElement * element, set& nodes); - - // Fields PRIVATE - typedef set SetOfNodes; - typedef set SetOfEdges; - typedef set SetOfFaces; - typedef set SetOfVolumes; - - SetOfNodes myNodes; - SetOfEdges myEdges; - SetOfFaces myFaces; - SetOfVolumes myVolumes; - SMDS_Mesh *myParent; - list myChildren; - SMDS_MeshElementIDFactory *myNodeIDFactory; - SMDS_MeshElementIDFactory *myElementIDFactory; - - bool myHasConstructionEdges; - bool myHasConstructionFaces; - bool myHasInverseElements; + int NbNodes() const; + int NbEdges() const; + int NbFaces() const; + int NbVolumes() const; + int NbSubMesh() const; + void DumpNodes() const; + void DumpEdges() const; + void DumpFaces() const; + void DumpVolumes() const; + void DebugStats() const; + SMDS_Mesh *boundaryFaces(); + SMDS_Mesh *boundaryEdges(); + virtual ~SMDS_Mesh(); + bool hasConstructionEdges(); + bool hasConstructionFaces(); + bool hasInverseElements(); + void setConstructionEdges(bool); + void setConstructionFaces(bool); + void setInverseElements(bool); + + /*! + * Checks if the element is present in mesh. + * Useful to determine dead pointers. + * Use this function for debug purpose only! Do not check in the code + * using it even in _DEBUG_ mode + */ + bool Contains (const SMDS_MeshElement* elem) const; + + typedef set SetOfNodes; + typedef set SetOfEdges; + typedef set SetOfFaces; + typedef set SetOfVolumes; + +private: + SMDS_Mesh(SMDS_Mesh * parent); + + SMDS_MeshFace * createTriangle(const SMDS_MeshNode * node1, + const SMDS_MeshNode * node2, + const SMDS_MeshNode * node3); + + SMDS_MeshFace * createQuadrangle(const SMDS_MeshNode * node1, + const SMDS_MeshNode * node2, + const SMDS_MeshNode * node3, + const SMDS_MeshNode * node4); + + bool registerElement(int ID, SMDS_MeshElement * element); + + const SMDS_MeshEdge* FindEdge(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2) const; + + SMDS_MeshEdge* FindEdgeOrCreate(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2); + + const SMDS_MeshFace* FindFace(const SMDS_MeshNode *n1, + const SMDS_MeshNode *n2, + const SMDS_MeshNode *n3) const; + + SMDS_MeshFace* FindFaceOrCreate(const SMDS_MeshNode *n1, + const SMDS_MeshNode *n2, + const SMDS_MeshNode *n3); + + const SMDS_MeshFace* FindFace(const SMDS_MeshNode *n1, + const SMDS_MeshNode *n2, + const SMDS_MeshNode *n3, + const SMDS_MeshNode *n4) const; + + SMDS_MeshFace* FindFaceOrCreate(const SMDS_MeshNode *n1, + const SMDS_MeshNode *n2, + const SMDS_MeshNode *n3, + const SMDS_MeshNode *n4); + + void addChildrenWithNodes(set& setOfChildren, + const SMDS_MeshElement * element, + set& nodes); + + // Fields PRIVATE + + SetOfNodes myNodes; + SetOfEdges myEdges; + SetOfFaces myFaces; + SetOfVolumes myVolumes; + SMDS_Mesh *myParent; + list myChildren; + SMDS_MeshElementIDFactory *myNodeIDFactory; + SMDS_MeshElementIDFactory *myElementIDFactory; + + bool myHasConstructionEdges; + bool myHasConstructionFaces; + bool myHasInverseElements; }; #endif diff --git a/src/SMDS/SMDS_MeshEdge.cxx b/src/SMDS/SMDS_MeshEdge.cxx index 3f7994c1f..484207ba0 100644 --- a/src/SMDS/SMDS_MeshEdge.cxx +++ b/src/SMDS/SMDS_MeshEdge.cxx @@ -36,7 +36,8 @@ //purpose : //======================================================================= -SMDS_MeshEdge::SMDS_MeshEdge(SMDS_MeshNode * node1, SMDS_MeshNode * node2) +SMDS_MeshEdge::SMDS_MeshEdge(const SMDS_MeshNode * node1, + const SMDS_MeshNode * node2) { myNodes[0]=node1; myNodes[1]=node2; @@ -68,36 +69,40 @@ SMDSAbs_ElementType SMDS_MeshEdge::GetType() const return SMDSAbs_Edge; } -SMDS_Iterator * SMDS_MeshEdge:: +class SMDS_MeshEdge_MyNodeIterator:public SMDS_ElemIterator +{ + const SMDS_MeshNode *const* myNodes; + int myIndex; + public: + SMDS_MeshEdge_MyNodeIterator(const SMDS_MeshNode * const* nodes): + myNodes(nodes),myIndex(0) {} + + bool more() + { + return myIndex<2; + } + + const SMDS_MeshElement* next() + { + myIndex++; + return myNodes[myIndex-1]; + } +}; + +SMDS_ElemIteratorPtr SMDS_MeshEdge:: elementsIterator(SMDSAbs_ElementType type) const { - class MyNodeIterator:public SMDS_Iterator - { - SMDS_MeshNode *const* myNodes; - int myIndex; - public: - MyNodeIterator(SMDS_MeshNode * const* nodes):myNodes(nodes),myIndex(0) - {} - - bool more() - { - return myIndex<2; - } - - const SMDS_MeshElement* next() - { - myIndex++; - return myNodes[myIndex-1]; - } - }; - - switch(type) - { - case SMDSAbs_Edge:return SMDS_MeshElement::elementsIterator(SMDSAbs_Edge); - case SMDSAbs_Node:return new MyNodeIterator(myNodes); - default: return new SMDS_IteratorOfElements(this,type, nodesIterator()); - } - + switch(type) + { + case SMDSAbs_Edge: + return SMDS_MeshElement::elementsIterator(SMDSAbs_Edge); + case SMDSAbs_Node: + return SMDS_ElemIteratorPtr(new SMDS_MeshEdge_MyNodeIterator(myNodes)); + default: + return SMDS_ElemIteratorPtr + (new SMDS_IteratorOfElements + (this,type, SMDS_ElemIteratorPtr(new SMDS_MeshEdge_MyNodeIterator(myNodes)))); + } } bool operator<(const SMDS_MeshEdge & e1, const SMDS_MeshEdge & e2) diff --git a/src/SMDS/SMDS_MeshEdge.hxx b/src/SMDS/SMDS_MeshEdge.hxx index cfef08ed7..28621d8e9 100644 --- a/src/SMDS/SMDS_MeshEdge.hxx +++ b/src/SMDS/SMDS_MeshEdge.hxx @@ -34,7 +34,8 @@ class SMDS_MeshEdge:public SMDS_MeshElement { public: - SMDS_MeshEdge(SMDS_MeshNode * node1, SMDS_MeshNode * node2); + SMDS_MeshEdge(const SMDS_MeshNode * node1, + const SMDS_MeshNode * node2); void Print(ostream & OS) const; SMDSAbs_ElementType GetType() const; @@ -42,11 +43,11 @@ class SMDS_MeshEdge:public SMDS_MeshElement int NbEdges() const; friend bool operator<(const SMDS_MeshEdge& e1, const SMDS_MeshEdge& e2); protected: - SMDS_Iterator * + SMDS_ElemIteratorPtr elementsIterator(SMDSAbs_ElementType type) const; private: - SMDS_MeshNode* myNodes[2]; + const SMDS_MeshNode* myNodes[2]; }; #endif diff --git a/src/SMDS/SMDS_MeshElement.cxx b/src/SMDS/SMDS_MeshElement.cxx index 701e6fe97..14c0af4b5 100644 --- a/src/SMDS/SMDS_MeshElement.cxx +++ b/src/SMDS/SMDS_MeshElement.cxx @@ -45,7 +45,7 @@ ostream & operator <<(ostream & OS, const SMDS_MeshElement * ME) /// Create an iterator which iterate on nodes owned by the element. /// This method call elementsIterator(). /////////////////////////////////////////////////////////////////////////////// -SMDS_Iterator * SMDS_MeshElement::nodesIterator() const +SMDS_ElemIteratorPtr SMDS_MeshElement::nodesIterator() const { return elementsIterator(SMDSAbs_Node); } @@ -54,7 +54,7 @@ SMDS_Iterator * SMDS_MeshElement::nodesIterator() cons /// Create an iterator which iterate on edges linked with or owned by the element. /// This method call elementsIterator(). /////////////////////////////////////////////////////////////////////////////// -SMDS_Iterator * SMDS_MeshElement::edgesIterator() const +SMDS_ElemIteratorPtr SMDS_MeshElement::edgesIterator() const { return elementsIterator(SMDSAbs_Edge); } @@ -63,7 +63,7 @@ SMDS_Iterator * SMDS_MeshElement::edgesIterator() cons /// Create an iterator which iterate on faces linked with or owned by the element. /// This method call elementsIterator(). /////////////////////////////////////////////////////////////////////////////// -SMDS_Iterator * SMDS_MeshElement::facesIterator() const +SMDS_ElemIteratorPtr SMDS_MeshElement::facesIterator() const { return elementsIterator(SMDSAbs_Face); } @@ -74,13 +74,12 @@ SMDS_Iterator * SMDS_MeshElement::facesIterator() cons int SMDS_MeshElement::NbNodes() const { int nbnodes=0; - SMDS_Iterator * it=nodesIterator(); + SMDS_ElemIteratorPtr it=nodesIterator(); while(it->more()) { it->next(); nbnodes++; } - delete it; return nbnodes; } @@ -90,13 +89,12 @@ int SMDS_MeshElement::NbNodes() const int SMDS_MeshElement::NbEdges() const { int nbedges=0; - SMDS_Iterator * it=edgesIterator(); + SMDS_ElemIteratorPtr it=edgesIterator(); while(it->more()) { it->next(); nbedges++; } - delete it; return nbedges; } @@ -106,55 +104,52 @@ int SMDS_MeshElement::NbEdges() const int SMDS_MeshElement::NbFaces() const { int nbfaces=0; - SMDS_Iterator * it=facesIterator(); + SMDS_ElemIteratorPtr it=facesIterator(); while(it->more()) { it->next(); nbfaces++; } - delete it; return nbfaces; } /////////////////////////////////////////////////////////////////////////////// -///Create and iterator which iterate on elements linked with the current element. -///The iterator must be free by the caller (call delete myIterator). +///Create an iterator which iterate on elements linked with the current element. ///@param type The of elements on which you want to iterate -///@return An iterator, that you must free when you no longer need it +///@return A smart pointer to iterator, you are not to take care of freeing memory /////////////////////////////////////////////////////////////////////////////// -SMDS_Iterator * SMDS_MeshElement:: +class SMDS_MeshElement_MyIterator:public SMDS_ElemIterator +{ + const SMDS_MeshElement * myElement; + bool myMore; + public: + SMDS_MeshElement_MyIterator(const SMDS_MeshElement * element): + myElement(element),myMore(true) {} + + bool more() + { + return myMore; + } + + const SMDS_MeshElement* next() + { + myMore=false; + return myElement; + } +}; +SMDS_ElemIteratorPtr SMDS_MeshElement:: elementsIterator(SMDSAbs_ElementType type) const { /** @todo Check that iterator in the child classes return elements in the same order for each different implementation (i.e: SMDS_VolumeOfNodes and SMDS_VolumeOfFaces */ - class MyIterator:public SMDS_Iterator - { - const SMDS_MeshElement * myElement; - bool myMore; - public: - MyIterator(const SMDS_MeshElement * element): - myElement(element),myMore(true) - { - } - - bool more() - { - return myMore; - } - - const SMDS_MeshElement* next() - { - myMore=false; - return myElement; - } - }; - if(type==GetType()) return new MyIterator(this); + if(type==GetType()) + return SMDS_ElemIteratorPtr(new SMDS_MeshElement_MyIterator(this)); else { - MESSAGE("Iterator not implemented"); - return NULL; + MESSAGE("Iterator not implemented"); + return SMDS_ElemIteratorPtr((SMDS_ElemIterator*)NULL); } } diff --git a/src/SMDS/SMDS_MeshElement.hxx b/src/SMDS/SMDS_MeshElement.hxx index 86bc6ddb5..5ae8bc1a0 100644 --- a/src/SMDS/SMDS_MeshElement.hxx +++ b/src/SMDS/SMDS_MeshElement.hxx @@ -32,6 +32,7 @@ #include "SMDS_Iterator.hxx" #include "SMDS_MeshElementIDFactory.hxx" +#include #include #include @@ -39,6 +40,10 @@ using namespace std; class SMDS_MeshNode; class SMDS_MeshEdge; class SMDS_MeshFace; +class SMDS_MeshElement; + +typedef SMDS_Iterator SMDS_ElemIterator; +typedef boost::shared_ptr > SMDS_ElemIteratorPtr; /////////////////////////////////////////////////////////////////////////////// /// Base class for elements @@ -47,10 +52,10 @@ class SMDS_MeshElement:public SMDS_MeshObject { public: - SMDS_Iterator * nodesIterator() const; - SMDS_Iterator * edgesIterator() const; - SMDS_Iterator * facesIterator() const; - virtual SMDS_Iterator * + SMDS_ElemIteratorPtr nodesIterator() const; + SMDS_ElemIteratorPtr edgesIterator() const; + SMDS_ElemIteratorPtr facesIterator() const; + virtual SMDS_ElemIteratorPtr elementsIterator(SMDSAbs_ElementType type) const; virtual int NbNodes() const; diff --git a/src/SMDS/SMDS_MeshElementIDFactory.cxx b/src/SMDS/SMDS_MeshElementIDFactory.cxx index d635b0110..43f12c777 100644 --- a/src/SMDS/SMDS_MeshElementIDFactory.cxx +++ b/src/SMDS/SMDS_MeshElementIDFactory.cxx @@ -58,3 +58,27 @@ SMDS_MeshElement* SMDS_MeshElementIDFactory::MeshElement(int ID) map::iterator it=myIDElements.find(ID); if(it==myIDElements.end()) return NULL; else return (*it).second; } + + +//======================================================================= +//function : GetFreeID +//purpose : +//======================================================================= +int SMDS_MeshElementIDFactory::GetFreeID() +{ + int ID; + do { + ID = SMDS_MeshIDFactory::GetFreeID(); + } while (myIDElements.find(ID) != myIDElements.end()); + return ID; +} + +//======================================================================= +//function : ReleaseID +//purpose : +//======================================================================= +void SMDS_MeshElementIDFactory::ReleaseID(const int ID) +{ + myIDElements.erase(ID); + SMDS_MeshIDFactory::ReleaseID(ID); +} diff --git a/src/SMDS/SMDS_MeshElementIDFactory.hxx b/src/SMDS/SMDS_MeshElementIDFactory.hxx index 881467633..f987eaed2 100644 --- a/src/SMDS/SMDS_MeshElementIDFactory.hxx +++ b/src/SMDS/SMDS_MeshElementIDFactory.hxx @@ -28,7 +28,6 @@ #define _SMDS_MeshElementIDFactory_HeaderFile #include "SMDS_MeshIDFactory.hxx" -#include #include using namespace std; @@ -41,6 +40,8 @@ class SMDS_MeshElementIDFactory:public SMDS_MeshIDFactory SMDS_MeshElementIDFactory(); bool BindID(int ID, SMDS_MeshElement * elem); SMDS_MeshElement * MeshElement(int ID); + virtual int GetFreeID(); + virtual void ReleaseID(int ID); private: map myIDElements; diff --git a/src/SMDS/SMDS_MeshGroup.cxx b/src/SMDS/SMDS_MeshGroup.cxx index 25e942abb..25ae25b73 100644 --- a/src/SMDS/SMDS_MeshGroup.cxx +++ b/src/SMDS/SMDS_MeshGroup.cxx @@ -32,8 +32,9 @@ using namespace std; //purpose : //======================================================================= -SMDS_MeshGroup::SMDS_MeshGroup(const SMDS_Mesh * aMesh) - :myMesh(aMesh),myType(SMDSAbs_All), myParent(NULL) +SMDS_MeshGroup::SMDS_MeshGroup(const SMDS_Mesh * theMesh, + const SMDSAbs_ElementType theType) + :myMesh(theMesh),myType(theType), myParent(NULL) { } @@ -42,8 +43,9 @@ SMDS_MeshGroup::SMDS_MeshGroup(const SMDS_Mesh * aMesh) //purpose : //======================================================================= -SMDS_MeshGroup::SMDS_MeshGroup(SMDS_MeshGroup * parent) - :myMesh(parent->myMesh),myType(SMDSAbs_All), myParent(parent) +SMDS_MeshGroup::SMDS_MeshGroup(SMDS_MeshGroup * theParent, + const SMDSAbs_ElementType theType) + :myMesh(theParent->myMesh),myType(theType), myParent(theParent) { } @@ -52,9 +54,10 @@ SMDS_MeshGroup::SMDS_MeshGroup(SMDS_MeshGroup * parent) //purpose : //======================================================================= -const SMDS_MeshGroup *SMDS_MeshGroup::AddSubGroup() +const SMDS_MeshGroup *SMDS_MeshGroup::AddSubGroup + (const SMDSAbs_ElementType theType) { - const SMDS_MeshGroup * subgroup = new SMDS_MeshGroup(this); + const SMDS_MeshGroup * subgroup = new SMDS_MeshGroup(this,theType); myChildren.insert(myChildren.end(),subgroup); return subgroup; } @@ -64,14 +67,14 @@ const SMDS_MeshGroup *SMDS_MeshGroup::AddSubGroup() //purpose : //======================================================================= -bool SMDS_MeshGroup::RemoveSubGroup(const SMDS_MeshGroup * aGroup) +bool SMDS_MeshGroup::RemoveSubGroup(const SMDS_MeshGroup * theGroup) { bool found = false; list::iterator itgroup; for(itgroup=myChildren.begin(); itgroup!=myChildren.end(); itgroup++) { const SMDS_MeshGroup* subgroup=*itgroup; - if (subgroup == aGroup) + if (subgroup == theGroup) { found = true; myChildren.erase(itgroup); @@ -106,39 +109,19 @@ void SMDS_MeshGroup::Clear() myType = SMDSAbs_All; } -//======================================================================= -//function : IsEmpty -//purpose : -//======================================================================= - -bool SMDS_MeshGroup::IsEmpty() const -{ - return myElements.empty(); -} - -//======================================================================= -//function : Extent -//purpose : -//======================================================================= - -int SMDS_MeshGroup::Extent() const -{ - return myElements.size(); -} - //======================================================================= //function : Add //purpose : //======================================================================= -void SMDS_MeshGroup::Add(const SMDS_MeshElement * ME) +void SMDS_MeshGroup::Add(const SMDS_MeshElement * theElem) { // the type of the group is determined by the first element added - if (myElements.empty()) myType = ME->GetType(); - else if (ME->GetType() != myType) + if (myElements.empty()) myType = theElem->GetType(); + else if (theElem->GetType() != myType) MESSAGE("SMDS_MeshGroup::Add : Type Mismatch"); - myElements.insert(ME); + myElements.insert(theElem); } //======================================================================= @@ -146,28 +129,29 @@ void SMDS_MeshGroup::Add(const SMDS_MeshElement * ME) //purpose : //======================================================================= -void SMDS_MeshGroup::Remove(const SMDS_MeshElement * ME) +void SMDS_MeshGroup::Remove(const SMDS_MeshElement * theElem) { - myElements.erase(ME); + myElements.erase(theElem); if (myElements.empty()) myType = SMDSAbs_All; } //======================================================================= -//function : Type +//function : Contains //purpose : //======================================================================= -SMDSAbs_ElementType SMDS_MeshGroup::Type() const +bool SMDS_MeshGroup::Contains(const SMDS_MeshElement * theElem) const { - return myType; + return myElements.find(theElem)!=myElements.end(); } //======================================================================= -//function : Contains +//function : SetType //purpose : //======================================================================= -bool SMDS_MeshGroup::Contains(const SMDS_MeshElement * ME) const +void SMDS_MeshGroup::SetType(const SMDSAbs_ElementType theType) { - return myElements.find(ME)!=myElements.end(); + if (IsEmpty()) + myType = theType; } diff --git a/src/SMDS/SMDS_MeshGroup.hxx b/src/SMDS/SMDS_MeshGroup.hxx index f73c1dd1f..c5bfcb432 100644 --- a/src/SMDS/SMDS_MeshGroup.hxx +++ b/src/SMDS/SMDS_MeshGroup.hxx @@ -33,25 +33,44 @@ using namespace std; class SMDS_MeshGroup:public SMDS_MeshObject { public: - SMDS_MeshGroup(const SMDS_Mesh * aMesh); - const SMDS_MeshGroup * AddSubGroup(); - virtual bool RemoveSubGroup(const SMDS_MeshGroup* aGroup); + SMDS_MeshGroup(const SMDS_Mesh * theMesh, + const SMDSAbs_ElementType theType = SMDSAbs_All); + const SMDS_MeshGroup * AddSubGroup + (const SMDSAbs_ElementType theType = SMDSAbs_All); + virtual bool RemoveSubGroup(const SMDS_MeshGroup* theGroup); virtual bool RemoveFromParent(); - void Clear(); - void Add(const SMDS_MeshElement * ME); - void Remove(const SMDS_MeshElement * ME); - bool IsEmpty() const; - int Extent() const; - SMDSAbs_ElementType Type() const; - bool Contains(const SMDS_MeshElement * ME) const; - - ~SMDS_MeshGroup(); + + const SMDS_Mesh* GetMesh() const { return myMesh; } + + void SetType (const SMDSAbs_ElementType theType); + void Clear(); + void Add(const SMDS_MeshElement * theElem); + void Remove(const SMDS_MeshElement * theElem); + bool IsEmpty() const { return myElements.empty(); } + int Extent() const { return myElements.size(); } + + SMDSAbs_ElementType GetType() const { return myType; } + + bool Contains(const SMDS_MeshElement * theElem) const; + + void InitIterator() const + { const_cast(myIterator) = myElements.begin(); } + + bool More() const { return myIterator != myElements.end(); } + + const SMDS_MeshElement* Next() const + { return *(const_cast(myIterator))++; } + private: - SMDS_MeshGroup(SMDS_MeshGroup* parent); - const SMDS_Mesh *myMesh; - SMDSAbs_ElementType myType; - set myElements; - SMDS_MeshGroup * myParent; - list myChildren; + SMDS_MeshGroup(SMDS_MeshGroup* theParent, + const SMDSAbs_ElementType theType = SMDSAbs_All); + + typedef set::iterator iterator; + const SMDS_Mesh * myMesh; + SMDSAbs_ElementType myType; + set myElements; + SMDS_MeshGroup * myParent; + list myChildren; + iterator myIterator; }; #endif diff --git a/src/SMDS/SMDS_MeshIDFactory.cxx b/src/SMDS/SMDS_MeshIDFactory.cxx index a68ae5ad0..db5df4222 100644 --- a/src/SMDS/SMDS_MeshIDFactory.cxx +++ b/src/SMDS/SMDS_MeshIDFactory.cxx @@ -54,5 +54,5 @@ int SMDS_MeshIDFactory::GetFreeID() //======================================================================= void SMDS_MeshIDFactory::ReleaseID(const int ID) { - if (ID < myMaxID) myPoolOfID.push(ID); + if (ID > 0 && ID < myMaxID) myPoolOfID.push(ID); } diff --git a/src/SMDS/SMDS_MeshNode.cxx b/src/SMDS/SMDS_MeshNode.cxx index 20bce6369..cba7920fa 100644 --- a/src/SMDS/SMDS_MeshNode.cxx +++ b/src/SMDS/SMDS_MeshNode.cxx @@ -61,7 +61,7 @@ void SMDS_MeshNode::Print(ostream & OS) const //purpose : //======================================================================= -void SMDS_MeshNode::SetPosition(SMDS_Position * aPos) +void SMDS_MeshNode::SetPosition(const SMDS_PositionPtr& aPos) { myPosition = aPos; } @@ -71,94 +71,92 @@ void SMDS_MeshNode::SetPosition(SMDS_Position * aPos) //purpose : //======================================================================= -SMDS_Position *SMDS_MeshNode::GetPosition() +const SMDS_PositionPtr& SMDS_MeshNode::GetPosition() const { return myPosition; } -const SMDS_Position *SMDS_MeshNode::GetPosition() const +class SMDS_MeshNode_MyInvIterator:public SMDS_ElemIterator { - return myPosition; -} -/** -*/ -SMDS_Iterator * SMDS_MeshNode:: + const set& mySet; + set::iterator myIterator; + public: + SMDS_MeshNode_MyInvIterator(const set& s): + mySet(s) + { + myIterator=mySet.begin(); + } + + bool more() + { + return myIterator!=mySet.end(); + } + + const SMDS_MeshElement* next() + { + const SMDS_MeshElement* current=*myIterator; + myIterator++; + return current; + } +}; + +SMDS_ElemIteratorPtr SMDS_MeshNode:: GetInverseElementIterator() const { - class SMDS_InverseElementIterator:public SMDS_Iterator - { - const set& mySet; - set::iterator myIterator; - public: - SMDS_InverseElementIterator(const set& s):mySet(s) - { - myIterator=mySet.begin(); - } - - bool more() - { - return myIterator!=mySet.end(); - } - - const SMDS_MeshElement* next() - { - const SMDS_MeshElement* current=*myIterator; - myIterator++; - return current; - } - }; - return new SMDS_InverseElementIterator(myInverseElements); -} - -SMDS_Iterator * SMDS_MeshNode:: + return SMDS_ElemIteratorPtr(new SMDS_MeshNode_MyInvIterator(myInverseElements)); +} + +// Same as GetInverseElementIterator but the create iterator only return +// wanted type elements. +class SMDS_MeshNode_MyIterator:public SMDS_ElemIterator +{ + set mySet; + set::iterator myIterator; + public: + SMDS_MeshNode_MyIterator(SMDSAbs_ElementType type, + const set& s) + { + const SMDS_MeshElement * e; + bool toInsert; + set::iterator it=s.begin(); + while(it!=s.end()) + { + e=*it; + switch(type) + { + case SMDSAbs_Edge: toInsert=true; break; + case SMDSAbs_Face: toInsert=(e->GetType()!=SMDSAbs_Edge); break; + case SMDSAbs_Volume: toInsert=(e->GetType()==SMDSAbs_Volume); break; + } + if(toInsert) mySet.insert(e); + it++; + } + myIterator=mySet.begin(); + } + + bool more() + { + return myIterator!=mySet.end(); + } + + const SMDS_MeshElement* next() + { + const SMDS_MeshElement* current=*myIterator; + myIterator++; + return current; + } +}; + +SMDS_ElemIteratorPtr SMDS_MeshNode:: elementsIterator(SMDSAbs_ElementType type) const { - // Same as GetInverseElementIterator but the create iterator only return - // wanted type elements. - class MyIterator:public SMDS_Iterator - { - set mySet; - set::iterator myIterator; - public: - MyIterator(SMDSAbs_ElementType type, - const set& s) - { - const SMDS_MeshElement * e; - bool toInsert; - set::iterator it=s.begin(); - while(it!=s.end()) - { - e=*it; - switch(type) - { - case SMDSAbs_Edge: toInsert=true; break; - case SMDSAbs_Face: toInsert=(e->GetType()!=SMDSAbs_Edge); break; - case SMDSAbs_Volume: toInsert=(e->GetType()==SMDSAbs_Volume); break; - } - if(toInsert) mySet.insert(e); - it++; - } - myIterator=mySet.begin(); - } - - bool more() - { - return myIterator!=mySet.end(); - } - - const SMDS_MeshElement* next() - { - const SMDS_MeshElement* current=*myIterator; - myIterator++; - return current; - } - }; - - if(type==SMDSAbs_Node) - return SMDS_MeshElement::elementsIterator(SMDSAbs_Node); - else - return new SMDS_IteratorOfElements(this,type, - new MyIterator(type, myInverseElements)); + if(type==SMDSAbs_Node) + return SMDS_MeshElement::elementsIterator(SMDSAbs_Node); + else + return SMDS_ElemIteratorPtr + (new SMDS_IteratorOfElements + (this,type, + SMDS_ElemIteratorPtr(new SMDS_MeshNode_MyIterator(type, myInverseElements)))); } int SMDS_MeshNode::NbNodes() const diff --git a/src/SMDS/SMDS_MeshNode.hxx b/src/SMDS/SMDS_MeshNode.hxx index f53630705..01482f922 100644 --- a/src/SMDS/SMDS_MeshNode.hxx +++ b/src/SMDS/SMDS_MeshNode.hxx @@ -46,22 +46,21 @@ class SMDS_MeshNode:public SMDS_MeshElement void RemoveInverseElement(const SMDS_MeshElement * parent); void ClearInverseElements(); bool emptyInverseElements(); - SMDS_Iterator * GetInverseElementIterator() const; - void SetPosition(SMDS_Position * aPos); - SMDS_Position *GetPosition(); - const SMDS_Position *GetPosition() const; + SMDS_ElemIteratorPtr GetInverseElementIterator() const; + void SetPosition(const SMDS_PositionPtr& aPos); + const SMDS_PositionPtr& GetPosition() const; SMDSAbs_ElementType GetType() const; int NbNodes() const; void setXYZ(double x, double y, double z); friend bool operator<(const SMDS_MeshNode& e1, const SMDS_MeshNode& e2); protected: - SMDS_Iterator * + SMDS_ElemIteratorPtr elementsIterator(SMDSAbs_ElementType type) const; private: double myX, myY, myZ; - SMDS_Position *myPosition; + SMDS_PositionPtr myPosition; set myInverseElements; }; diff --git a/src/SMDS/SMDS_MeshObject.hxx b/src/SMDS/SMDS_MeshObject.hxx index 7e4bcd464..8386f2115 100644 --- a/src/SMDS/SMDS_MeshObject.hxx +++ b/src/SMDS/SMDS_MeshObject.hxx @@ -29,6 +29,7 @@ class SMDS_MeshObject { - public: + public: + virtual ~SMDS_MeshObject() {} }; #endif diff --git a/src/SMDS/SMDS_Position.hxx b/src/SMDS/SMDS_Position.hxx index 29a54d82b..6047c30c3 100644 --- a/src/SMDS/SMDS_Position.hxx +++ b/src/SMDS/SMDS_Position.hxx @@ -28,6 +28,10 @@ #define _SMDS_Position_HeaderFile #include "SMDS_TypeOfPosition.hxx" +#include + +class SMDS_Position; +typedef boost::shared_ptr SMDS_PositionPtr; class SMDS_Position { @@ -37,7 +41,7 @@ class SMDS_Position virtual inline SMDS_TypeOfPosition GetTypeOfPosition() const = 0; void SetShapeId(int aShapeId); int GetShapeId() const; - ~SMDS_Position(); + virtual ~SMDS_Position() {} protected: SMDS_Position(int aShapeId); diff --git a/src/SMDS/SMDS_SpacePosition.cxx b/src/SMDS/SMDS_SpacePosition.cxx index 82ef3d54f..7ce582f91 100644 --- a/src/SMDS/SMDS_SpacePosition.cxx +++ b/src/SMDS/SMDS_SpacePosition.cxx @@ -52,8 +52,8 @@ const double * SMDS_SpacePosition::Coords() const return myCoords; } -SMDS_SpacePosition * SMDS_SpacePosition::originSpacePosition() +SMDS_PositionPtr SMDS_SpacePosition::originSpacePosition() { - static SMDS_SpacePosition * staticpos=new SMDS_SpacePosition(); - return staticpos; + static SMDS_PositionPtr staticpos (new SMDS_SpacePosition()); + return staticpos; } diff --git a/src/SMDS/SMDS_SpacePosition.hxx b/src/SMDS/SMDS_SpacePosition.hxx index af995f175..e4fadd6b1 100644 --- a/src/SMDS/SMDS_SpacePosition.hxx +++ b/src/SMDS/SMDS_SpacePosition.hxx @@ -37,8 +37,7 @@ class SMDS_SpacePosition:public SMDS_Position const virtual double * Coords() const; virtual inline SMDS_TypeOfPosition GetTypeOfPosition() const; inline void SetCoords(const double x, const double y, const double z); - ~SMDS_SpacePosition(); - static SMDS_SpacePosition * originSpacePosition(); + static SMDS_PositionPtr originSpacePosition(); private: double myCoords[3]; }; diff --git a/src/SMDS/SMDS_Tria3OfNodes.cxx b/src/SMDS/SMDS_Tria3OfNodes.cxx index c3a96337d..686e34e24 100644 --- a/src/SMDS/SMDS_Tria3OfNodes.cxx +++ b/src/SMDS/SMDS_Tria3OfNodes.cxx @@ -56,42 +56,48 @@ void SMDS_Tria3OfNodes::Print(ostream & OS) const OS << myNodes[i] << ") " << endl; } -SMDS_Iterator * SMDS_Tria3OfNodes:: - elementsIterator(SMDSAbs_ElementType type) const +class SMDS_Tria3OfNodes_MyIterator:public SMDS_ElemIterator { - class MyIterator:public SMDS_Iterator - { - const SMDS_MeshNode * const* mySet; - int index; - public: - MyIterator(const SMDS_MeshNode * const* s):mySet(s),index(0) - {} + const SMDS_MeshNode * const* mySet; + int index; + public: + SMDS_Tria3OfNodes_MyIterator(const SMDS_MeshNode * const* s): + mySet(s),index(0) {} - bool more() - { - return index<3; - } + bool more() + { + return index<3; + } - const SMDS_MeshElement* next() - { - index++; - return mySet[index-1]; - } - }; + const SMDS_MeshElement* next() + { + index++; + return mySet[index-1]; + } +}; - switch(type) - { - case SMDSAbs_Face:return SMDS_MeshElement::elementsIterator(SMDSAbs_Face); - case SMDSAbs_Node:return new MyIterator(myNodes); - case SMDSAbs_Edge: - MESSAGE("Error : edge iterator for SMDS_FaceOfNodes not implemented"); - break; - default:return new SMDS_IteratorOfElements(this,type,new MyIterator(myNodes)); - } +SMDS_ElemIteratorPtr SMDS_Tria3OfNodes:: + elementsIterator(SMDSAbs_ElementType type) const +{ + switch(type) + { + case SMDSAbs_Face: + return SMDS_MeshElement::elementsIterator(SMDSAbs_Face); + case SMDSAbs_Node: + return SMDS_ElemIteratorPtr(new SMDS_Tria3OfNodes_MyIterator(myNodes)); + case SMDSAbs_Edge: + MESSAGE("Error : edge iterator for SMDS_FaceOfNodes not implemented"); + break; + default: + return SMDS_ElemIteratorPtr + (new SMDS_IteratorOfElements + (this,type,SMDS_ElemIteratorPtr(new SMDS_Tria3OfNodes_MyIterator(myNodes)))); + } } -SMDS_Tria3OfNodes::SMDS_Tria3OfNodes(SMDS_MeshNode* node1, SMDS_MeshNode* node2, - SMDS_MeshNode* node3) +SMDS_Tria3OfNodes::SMDS_Tria3OfNodes(const SMDS_MeshNode* node1, + const SMDS_MeshNode* node2, + const SMDS_MeshNode* node3) { myNodes[0]=node1; myNodes[1]=node2; diff --git a/src/SMDS/SMDS_Tria3OfNodes.hxx b/src/SMDS/SMDS_Tria3OfNodes.hxx index ee4c330da..63552a03d 100644 --- a/src/SMDS/SMDS_Tria3OfNodes.hxx +++ b/src/SMDS/SMDS_Tria3OfNodes.hxx @@ -31,14 +31,15 @@ class SMDS_Tria3OfNodes:public SMDS_MeshFace { public: void Print(ostream & OS) const; - SMDS_Tria3OfNodes(SMDS_MeshNode* node1, SMDS_MeshNode* node2, - SMDS_MeshNode* node3); + SMDS_Tria3OfNodes(const SMDS_MeshNode* node1, + const SMDS_MeshNode* node2, + const SMDS_MeshNode* node3); int NbEdges() const; int NbFaces() const; int NbNodes() const; protected: - SMDS_Iterator * + SMDS_ElemIteratorPtr elementsIterator(SMDSAbs_ElementType type) const; private: diff --git a/src/SMDS/SMDS_VertexPosition.hxx b/src/SMDS/SMDS_VertexPosition.hxx index 6fc5a3c61..52ef05918 100644 --- a/src/SMDS/SMDS_VertexPosition.hxx +++ b/src/SMDS/SMDS_VertexPosition.hxx @@ -36,7 +36,6 @@ class SMDS_VertexPosition:public SMDS_Position SMDS_TypeOfPosition GetTypeOfPosition() const; SMDS_VertexPosition(int aVertexId=0); const double *Coords() const; - ~SMDS_VertexPosition(); }; #endif diff --git a/src/SMDS/SMDS_VolumeOfFaces.cxx b/src/SMDS/SMDS_VolumeOfFaces.cxx index c221452ba..435107fe7 100644 --- a/src/SMDS/SMDS_VolumeOfFaces.cxx +++ b/src/SMDS/SMDS_VolumeOfFaces.cxx @@ -21,7 +21,7 @@ // // // -// File : SMDS_MeshVolume.cxx +// File : SMDS_VolumeOfFaces.cxx // Author : Jean-Michel BOULCOURT // Module : SMESH @@ -46,39 +46,46 @@ int SMDS_VolumeOfFaces::NbFaces() const return myFaces.size(); } -SMDS_Iterator * SMDS_VolumeOfFaces:: - elementsIterator(SMDSAbs_ElementType type) const +class SMDS_VolumeOfFaces_MyIterator:public SMDS_ElemIterator { - class MyIterator:public SMDS_Iterator - { - const vector& mySet; - int index; - public: - MyIterator(const vector& s):mySet(s),index(0) - {} + const vector& mySet; + int index; + public: + SMDS_VolumeOfFaces_MyIterator(const vector& s): + mySet(s),index(0) {} - bool more() - { - return index * + SMDS_ElemIteratorPtr elementsIterator(SMDSAbs_ElementType type) const; - vector myFaces; + vector myFaces; }; #endif diff --git a/src/SMDS/SMDS_VolumeOfNodes.cxx b/src/SMDS/SMDS_VolumeOfNodes.cxx index b2a7a547d..3f4d6a245 100644 --- a/src/SMDS/SMDS_VolumeOfNodes.cxx +++ b/src/SMDS/SMDS_VolumeOfNodes.cxx @@ -28,14 +28,14 @@ /// 5,1 and 7,3 are an edges. /////////////////////////////////////////////////////////////////////////////// SMDS_VolumeOfNodes::SMDS_VolumeOfNodes( - SMDS_MeshNode * node1, - SMDS_MeshNode * node2, - SMDS_MeshNode * node3, - SMDS_MeshNode * node4, - SMDS_MeshNode * node5, - SMDS_MeshNode * node6, - SMDS_MeshNode * node7, - 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) { myNodes.resize(8); myNodes[0]=node1; @@ -49,10 +49,10 @@ SMDS_VolumeOfNodes::SMDS_VolumeOfNodes( } SMDS_VolumeOfNodes::SMDS_VolumeOfNodes( - SMDS_MeshNode * node1, - SMDS_MeshNode * node2, - SMDS_MeshNode * node3, - SMDS_MeshNode * node4) + const SMDS_MeshNode * node1, + const SMDS_MeshNode * node2, + const SMDS_MeshNode * node3, + const SMDS_MeshNode * node4) { myNodes.resize(4); myNodes[0]=node1; @@ -62,11 +62,11 @@ SMDS_VolumeOfNodes::SMDS_VolumeOfNodes( } SMDS_VolumeOfNodes::SMDS_VolumeOfNodes( - SMDS_MeshNode * node1, - SMDS_MeshNode * node2, - SMDS_MeshNode * node3, - SMDS_MeshNode * node4, - SMDS_MeshNode * node5) + const SMDS_MeshNode * node1, + const SMDS_MeshNode * node2, + const SMDS_MeshNode * node3, + const SMDS_MeshNode * node4, + const SMDS_MeshNode * node5) { myNodes.resize(5); myNodes[0]=node1; @@ -77,12 +77,12 @@ SMDS_VolumeOfNodes::SMDS_VolumeOfNodes( } SMDS_VolumeOfNodes::SMDS_VolumeOfNodes( - SMDS_MeshNode * node1, - SMDS_MeshNode * node2, - SMDS_MeshNode * node3, - SMDS_MeshNode * node4, - SMDS_MeshNode * node5, - 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) { myNodes.resize(6); myNodes[0]=node1; @@ -134,34 +134,39 @@ int SMDS_VolumeOfNodes::NbEdges() const } } -SMDS_Iterator * SMDS_VolumeOfNodes:: - elementsIterator(SMDSAbs_ElementType type) const +class SMDS_VolumeOfNodes_MyIterator:public SMDS_ElemIterator { - class MyIterator:public SMDS_Iterator - { - const vector& mySet; - int index; - public: - MyIterator(const vector& s):mySet(s),index(0) - {} + const vector& mySet; + int index; + public: + SMDS_VolumeOfNodes_MyIterator(const vector& s): + mySet(s),index(0) {} - bool more() - { - return index * + SMDS_ElemIteratorPtr elementsIterator(SMDSAbs_ElementType type) const; vector myNodes; }; diff --git a/src/SMESH/Makefile.in b/src/SMESH/Makefile.in index ef442ef40..f8fe6b7fa 100644 --- a/src/SMESH/Makefile.in +++ b/src/SMESH/Makefile.in @@ -29,7 +29,7 @@ top_srcdir=@top_srcdir@ top_builddir=../.. srcdir=@srcdir@ -VPATH=.:@srcdir@:@top_srcdir@/idl:$(top_builddir)/idl:${KERNEL_ROOT_DIR}/idl/salome:${MED_ROOT_DIR}/idl/salome +VPATH=.:@srcdir@:@top_srcdir@/idl:$(top_builddir)/idl @COMMENCE@ @@ -40,22 +40,11 @@ EXPORT_HEADERS= \ SMESH_Mesh.hxx \ SMESH_subMesh.hxx \ SMESH_Hypothesis.hxx \ - SMESH_HypothesisFactory.hxx \ SMESH_Algo.hxx \ SMESH_1D_Algo.hxx \ SMESH_2D_Algo.hxx \ SMESH_3D_Algo.hxx \ - SMESH_NumberOfSegments.hxx \ - SMESH_LocalLength.hxx \ - SMESH_LengthFromEdges.hxx \ - SMESH_MaxElementArea.hxx \ - SMESH_MaxElementVolume.hxx \ - SMESH_Regular_1D.hxx \ - SMESH_Quadrangle_2D.hxx \ - SMESH_MEFISTO_2D.hxx \ - SMESH_Hexa_3D.hxx \ - SMESH_NETGEN_3D.hxx \ - SMESH_HypothesisCreator.hxx + SMESH_Group.hxx EXPORT_PYSCRIPTS = @@ -65,20 +54,11 @@ LIB= libSMESHimpl.la LIB_SRC = SMESH_Gen.cxx SMESH_Mesh.cxx SMESH_subMesh.cxx \ SMESH_Hypothesis.cxx \ - SMESH_HypothesisFactory.cxx \ SMESH_Algo.cxx \ SMESH_1D_Algo.cxx \ SMESH_2D_Algo.cxx \ SMESH_3D_Algo.cxx \ - SMESH_NumberOfSegments.cxx \ - SMESH_LocalLength.cxx \ - SMESH_LengthFromEdges.cxx \ - SMESH_MaxElementArea.cxx \ - SMESH_MaxElementVolume.cxx \ - SMESH_Regular_1D.cxx \ - SMESH_Quadrangle_2D.cxx \ - SMESH_MEFISTO_2D.cxx \ - SMESH_Hexa_3D.cxx + SMESH_Group.cxx LIB_SERVER_IDL = @@ -89,20 +69,13 @@ BIN = BIN_SRC = # additionnal information to compil and link file -CPPFLAGS+= $(OCC_INCLUDES) $(MED2_INCLUDES) $(HDF5_INCLUDES) -I${KERNEL_ROOT_DIR}/include/salome +CPPFLAGS+= $(OCC_INCLUDES) $(MED2_INCLUDES) $(HDF5_INCLUDES) -I${KERNEL_ROOT_DIR}/include/salome \ + $(BOOST_CPPFLAGS) CXXFLAGS+= $(OCC_CXXFLAGS) $(MED2_INCLUDES) $(HDF5_INCLUDES) -I${KERNEL_ROOT_DIR}/include/salome #IDLCXXFLAGS+= -Wbtp -LDFLAGS+= $(HDF5_LIBS) $(MED2_LIBS) -lOpUtil -lSMESHDS -lSMDS -lMEFISTO2D -lMeshDriverDAT -lMeshDriverMED -lMeshDriverUNV -L${KERNEL_ROOT_DIR}/lib/salome - -ifeq (@WITHNETGEN@,yes) - LIB_SRC+= SMESH_NETGEN_3D.cxx - NETGEN_INCLUDES=@NETGEN_INCLUDES@ - CPPFLAGS+= $(NETGEN_INCLUDES) - CXXFLAGS+= $(NETGEN_INCLUDES) - LDFLAGS+= -lNETGEN -endif +LDFLAGS+= $(HDF5_LIBS) $(MED2_LIBS) -lOpUtil -lSMESHDS -lSMDS -lMeshDriverDAT -lMeshDriverMED -lMeshDriverUNV -L${KERNEL_ROOT_DIR}/lib/salome @CONCLUDE@ diff --git a/src/SMESH/SMESH_1D_Algo.cxx b/src/SMESH/SMESH_1D_Algo.cxx index caa3978e9..846f28fb0 100644 --- a/src/SMESH/SMESH_1D_Algo.cxx +++ b/src/SMESH/SMESH_1D_Algo.cxx @@ -26,7 +26,6 @@ // Module : SMESH // $Header$ -using namespace std; using namespace std; #include "SMESH_1D_Algo.hxx" #include "SMESH_Gen.hxx" @@ -55,47 +54,3 @@ SMESH_1D_Algo::~SMESH_1D_Algo() { } -//============================================================================= -/*! - * - */ -//============================================================================= - -ostream & SMESH_1D_Algo::SaveTo(ostream & save) -{ - return save << this; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -istream & SMESH_1D_Algo::LoadFrom(istream & load) -{ - return load >> (*this); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -ostream& operator << (ostream & save, SMESH_1D_Algo & hyp) -{ - return save; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -istream& operator >> (istream & load, SMESH_1D_Algo & hyp) -{ - return load; -} - diff --git a/src/SMESH/SMESH_1D_Algo.hxx b/src/SMESH/SMESH_1D_Algo.hxx index cdacad4ac..378ed7545 100644 --- a/src/SMESH/SMESH_1D_Algo.hxx +++ b/src/SMESH/SMESH_1D_Algo.hxx @@ -37,13 +37,6 @@ class SMESH_1D_Algo: public: SMESH_1D_Algo(int hypId, int studyId, SMESH_Gen* gen); virtual ~SMESH_1D_Algo(); - - virtual ostream & SaveTo(ostream & save); - virtual istream & LoadFrom(istream & load); - friend ostream& operator << (ostream & save, SMESH_1D_Algo & hyp); - friend istream& operator >> (istream & load, SMESH_1D_Algo & hyp); - -protected: }; #endif diff --git a/src/SMESH/SMESH_2D_Algo.cxx b/src/SMESH/SMESH_2D_Algo.cxx index 90102e5ed..c84a35398 100644 --- a/src/SMESH/SMESH_2D_Algo.cxx +++ b/src/SMESH/SMESH_2D_Algo.cxx @@ -26,7 +26,6 @@ // Module : SMESH // $Header$ -using namespace std; using namespace std; #include "SMESH_2D_Algo.hxx" #include "SMESH_Gen.hxx" @@ -63,50 +62,6 @@ SMESH_2D_Algo::~SMESH_2D_Algo() */ //============================================================================= -ostream & SMESH_2D_Algo::SaveTo(ostream & save) -{ - return save << this; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -istream & SMESH_2D_Algo::LoadFrom(istream & load) -{ - return load >> (*this); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -ostream& operator << (ostream & save, SMESH_2D_Algo & hyp) -{ - return save; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -istream& operator >> (istream & load, SMESH_2D_Algo & hyp) -{ - return load; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - int SMESH_2D_Algo::NumberOfWires(const TopoDS_Shape& S) { int i = 0; diff --git a/src/SMESH/SMESH_2D_Algo.hxx b/src/SMESH/SMESH_2D_Algo.hxx index fbf99f60b..5c904e22e 100644 --- a/src/SMESH/SMESH_2D_Algo.hxx +++ b/src/SMESH/SMESH_2D_Algo.hxx @@ -41,13 +41,6 @@ public: int NumberOfWires(const TopoDS_Shape& S); int NumberOfPoints(SMESH_Mesh& aMesh,const TopoDS_Wire& W); - - virtual ostream & SaveTo(ostream & save); - virtual istream & LoadFrom(istream & load); - friend ostream& operator << (ostream & save, SMESH_2D_Algo & hyp); - friend istream& operator >> (istream & load, SMESH_2D_Algo & hyp); - -protected: }; #endif diff --git a/src/SMESH/SMESH_3D_Algo.cxx b/src/SMESH/SMESH_3D_Algo.cxx index 603d80ee6..ce35f66d4 100644 --- a/src/SMESH/SMESH_3D_Algo.cxx +++ b/src/SMESH/SMESH_3D_Algo.cxx @@ -26,7 +26,6 @@ // Module : SMESH // $Header$ -using namespace std; using namespace std; #include "SMESH_3D_Algo.hxx" #include "SMESH_Gen.hxx" @@ -56,47 +55,3 @@ SMESH_3D_Algo::SMESH_3D_Algo(int hypId, int studyId, SMESH_Gen* gen) SMESH_3D_Algo::~SMESH_3D_Algo() { } - -//============================================================================= -/*! - * - */ -//============================================================================= - -ostream & SMESH_3D_Algo::SaveTo(ostream & save) -{ - return save << this; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -istream & SMESH_3D_Algo::LoadFrom(istream & load) -{ - return load >> (*this); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -ostream& operator << (ostream & save, SMESH_3D_Algo & hyp) -{ - return save; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -istream& operator >> (istream & load, SMESH_3D_Algo & hyp) -{ - return load; -} diff --git a/src/SMESH/SMESH_3D_Algo.hxx b/src/SMESH/SMESH_3D_Algo.hxx index 330624693..62621ce3c 100644 --- a/src/SMESH/SMESH_3D_Algo.hxx +++ b/src/SMESH/SMESH_3D_Algo.hxx @@ -37,13 +37,6 @@ class SMESH_3D_Algo: public: SMESH_3D_Algo(int hypId, int studyId, SMESH_Gen* gen); virtual ~SMESH_3D_Algo(); - - virtual ostream & SaveTo(ostream & save); - virtual istream & LoadFrom(istream & load); - friend ostream& operator << (ostream & save, SMESH_3D_Algo & hyp); - friend istream& operator >> (istream & load, SMESH_3D_Algo & hyp); - -protected: }; #endif diff --git a/src/SMESH/SMESH_Algo.cxx b/src/SMESH/SMESH_Algo.cxx index 234b7ecce..cef1ea89c 100644 --- a/src/SMESH/SMESH_Algo.cxx +++ b/src/SMESH/SMESH_Algo.cxx @@ -26,7 +26,6 @@ // Module : SMESH // $Header$ -using namespace std; using namespace std; #include "SMESH_Algo.hxx" #include "SMESH_Gen.hxx" @@ -39,6 +38,8 @@ using namespace std; #include "utilities.h" #include +#include +#include //============================================================================= /*! @@ -52,6 +53,8 @@ SMESH_Algo::SMESH_Algo(int hypId, int studyId, // _compatibleHypothesis.push_back("hypothese_bidon"); _type = ALGO; gen->_mapAlgo[hypId] = this; + + _onlyUnaryInput = _requireDescretBoundary = true; } //============================================================================= @@ -75,77 +78,6 @@ const vector < string > &SMESH_Algo::GetCompatibleHypothesis() return _compatibleHypothesis; } -//============================================================================= -/*! - * - */ -//============================================================================= - -ostream & SMESH_Algo::SaveTo(ostream & save) -{ - return save << this; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -istream & SMESH_Algo::LoadFrom(istream & load) -{ - return load >> (*this); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -ostream & operator <<(ostream & save, SMESH_Algo & hyp) -{ - return save; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -istream & operator >>(istream & load, SMESH_Algo & hyp) -{ - return load; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -bool SMESH_Algo::CheckHypothesis(SMESH_Mesh & aMesh, - const TopoDS_Shape & aShape) -{ - MESSAGE("SMESH_Algo::CheckHypothesis"); - ASSERT(0); // use method from derived classes - return false; -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -bool SMESH_Algo::Compute(SMESH_Mesh & aMesh, const TopoDS_Shape & aShape) -{ - MESSAGE("SMESH_Algo::Compute"); - ASSERT(0); // use method from derived classes - return false; -} - //============================================================================= /*! * List the hypothesis used by the algorithm associated to the shape. @@ -164,12 +96,21 @@ const list & SMESH_Algo::GetUsedHypothesis( int nbHyp = _usedHypList.size(); if (nbHyp == 0) { - TopoDS_Shape mainShape = aMesh.GetMeshDS()->ShapeToMesh(); - if (!mainShape.IsSame(aShape)) - { - _usedHypList = GetAppliedHypothesis(aMesh, mainShape); // copy - nbHyp = _usedHypList.size(); - } + TopTools_ListIteratorOfListOfShape ancIt( aMesh.GetAncestors( aShape )); + for (; ancIt.More(); ancIt.Next()) + { + const TopoDS_Shape& ancestor = ancIt.Value(); + _usedHypList = GetAppliedHypothesis(aMesh, ancestor); // copy + nbHyp = _usedHypList.size(); + if (nbHyp == 1) + break; + } +// TopoDS_Shape mainShape = aMesh.GetMeshDS()->ShapeToMesh(); +// if (!mainShape.IsSame(aShape)) +// { +// _usedHypList = GetAppliedHypothesis(aMesh, mainShape); // copy +// nbHyp = _usedHypList.size(); +// } } if (nbHyp > 1) _usedHypList.clear(); //only one compatible hypothesis allowed diff --git a/src/SMESH/SMESH_Algo.hxx b/src/SMESH/SMESH_Algo.hxx index 53a0fbdde..d19bd94f3 100644 --- a/src/SMESH/SMESH_Algo.hxx +++ b/src/SMESH/SMESH_Algo.hxx @@ -39,7 +39,7 @@ #include using namespace std; -class SMESH_gen; +class SMESH_Gen; class SMESH_Mesh; class SMESH_Algo:public SMESH_Hypothesis @@ -49,10 +49,11 @@ class SMESH_Algo:public SMESH_Hypothesis virtual ~ SMESH_Algo(); const vector < string > &GetCompatibleHypothesis(); - virtual bool CheckHypothesis(SMESH_Mesh & aMesh, - const TopoDS_Shape & aShape); + virtual bool CheckHypothesis(SMESH_Mesh& aMesh, + const TopoDS_Shape& aShape, + SMESH_Hypothesis::Hypothesis_Status& aStatus) = 0; - virtual bool Compute(SMESH_Mesh & aMesh, const TopoDS_Shape & aShape); + virtual bool Compute(SMESH_Mesh & aMesh, const TopoDS_Shape & aShape) = 0; virtual const list & GetUsedHypothesis(SMESH_Mesh & aMesh, const TopoDS_Shape & aShape); @@ -62,15 +63,29 @@ class SMESH_Algo:public SMESH_Hypothesis static double EdgeLength(const TopoDS_Edge & E); - virtual ostream & SaveTo(ostream & save); - virtual istream & LoadFrom(istream & load); - friend ostream & operator <<(ostream & save, SMESH_Algo & hyp); - friend istream & operator >>(istream & load, SMESH_Algo & hyp); + public: + // algo features - protected: - vector _compatibleHypothesis; - list _appliedHypList; - list _usedHypList; + // SMESH_Hypothesis::GetDim(); + // 1 - dimention of target mesh + + bool OnlyUnaryInput() const { return _onlyUnaryInput; } + // 2 - is collection of tesselatable shapes inacceptable as input; + // "collection" means a shape containing shapes of dim equal + // to GetDim(). + // Algo which can process a collection shape should expect + // an input temporary shape that is neither MainShape nor + // its child. + + bool NeedDescretBoundary() const { return _requireDescretBoundary; } + // 3 - is a Dim-1 mesh prerequisite + + protected: + bool _onlyUnaryInput; + bool _requireDescretBoundary; + vector _compatibleHypothesis; + list _appliedHypList; + list _usedHypList; }; #endif diff --git a/src/SMESH/SMESH_Gen.cxx b/src/SMESH/SMESH_Gen.cxx index ec40c71ff..44000dfac 100644 --- a/src/SMESH/SMESH_Gen.cxx +++ b/src/SMESH/SMESH_Gen.cxx @@ -31,11 +31,15 @@ #include "SMDS_MeshElement.hxx" #include "SMDS_MeshNode.hxx" +#include "utilities.h" +#include "OpUtil.hxx" + #include #include +#include +#include +#include "Utils_ExceptHandlers.hxx" -#include "utilities.h" -#include "OpUtil.hxx" //============================================================================= /*! @@ -47,7 +51,7 @@ SMESH_Gen::SMESH_Gen() { MESSAGE("SMESH_Gen::SMESH_Gen"); _localId = 0; - _hypothesisFactory.SetGen(this); + _hypId = 0; } //============================================================================= @@ -67,7 +71,7 @@ SMESH_Gen::~SMESH_Gen() */ //============================================================================= -SMESH_Hypothesis *SMESH_Gen::CreateHypothesis(const char *anHyp, int studyId) +/*SMESH_Hypothesis *SMESH_Gen::CreateHypothesis(const char *anHyp, int studyId) throw(SALOME_Exception) { @@ -88,7 +92,7 @@ SMESH_Hypothesis *SMESH_Gen::CreateHypothesis(const char *anHyp, int studyId) myStudyContext->myDocument->AddHypothesis(myHypothesis); return myHypothesis; -} +}*/ //============================================================================= /*! @@ -96,10 +100,11 @@ SMESH_Hypothesis *SMESH_Gen::CreateHypothesis(const char *anHyp, int studyId) */ //============================================================================= -SMESH_Mesh *SMESH_Gen::Init(int studyId, const TopoDS_Shape & aShape) +SMESH_Mesh* SMESH_Gen::CreateMesh(int studyId) throw(SALOME_Exception) { - MESSAGE("SMESH_Gen::Init"); + Unexpect aCatch(SalomeException); + MESSAGE("SMESH_Gen::CreateMesh"); // if (aShape.ShapeType() == TopAbs_COMPOUND) // { // INFOS("Mesh Compound not yet implemented!"); @@ -120,7 +125,7 @@ throw(SALOME_Exception) // associate a TopoDS_Shape to the mesh - mesh->ShapeToMesh(aShape); +//mesh->ShapeToMesh(aShape); return mesh; } @@ -131,151 +136,604 @@ throw(SALOME_Exception) //============================================================================= bool SMESH_Gen::Compute(SMESH_Mesh & aMesh, const TopoDS_Shape & aShape) -throw(SALOME_Exception) { - MESSAGE("SMESH_Gen::Compute"); -// bool isDone = false; -/* -Algo : s'appuie ou non sur une geometrie -Si geometrie: -Vertex : rien à faire (range le point) -Edge, Wire, collection d'edge et wire : 1D -Face, Shell, collection de Face et Shells : 2D -Solid, Collection de Solid : 3D -*/ -// *** corriger commentaires - // check hypothesis associated to the mesh : - // - only one algo : type compatible with the type of the shape - // - hypothesis = compatible with algo - // - check if hypothesis are applicable to this algo - // - check contradictions within hypothesis - // (test if enough hypothesis is done further) - - bool ret = true; - - SMESH_subMesh *sm = aMesh.GetSubMesh(aShape); -// SCRUTE(sm); - SMESH_subMesh *smToCompute = sm->GetFirstToCompute(); - while (smToCompute) - { - TopoDS_Shape subShape = smToCompute->GetSubShape(); - int dim = GetShapeDim(subShape); - //SCRUTE(dim); - if (dim > 0) - { - bool ret1 = smToCompute->ComputeStateEngine(SMESH_subMesh::COMPUTE); - ret = ret && ret1; - } - else - { - ASSERT(dim == 0); - ASSERT(smToCompute->_vertexSet == false); - TopoDS_Vertex V1 = TopoDS::Vertex(subShape); - gp_Pnt P1 = BRep_Tool::Pnt(V1); - SMESHDS_Mesh * meshDS = aMesh.GetMeshDS(); - //MESSAGE("point "<AddNode(P1.X(), P1.Y(), P1.Z()); - meshDS->SetNodeOnVertex(node, V1); - smToCompute->GetSubMeshDS(); - smToCompute->_vertexSet = true; - smToCompute->ComputeStateEngine(SMESH_subMesh::COMPUTE); - } - smToCompute = sm->GetFirstToCompute(); - } - - return ret; + MESSAGE("SMESH_Gen::Compute"); + // bool isDone = false; + /* + Algo : s'appuie ou non sur une geometrie + Si geometrie: + Vertex : rien à faire (range le point) + Edge, Wire, collection d'edge et wire : 1D + Face, Shell, collection de Face et Shells : 2D + Solid, Collection de Solid : 3D + */ + // *** corriger commentaires + // check hypothesis associated to the mesh : + // - only one algo : type compatible with the type of the shape + // - hypothesis = compatible with algo + // - check if hypothesis are applicable to this algo + // - check contradictions within hypothesis + // (test if enough hypothesis is done further) + + bool ret = true; + + if ( !CheckAlgoState( aMesh, aShape )) + { + INFOS( "ABORT MESHING: some algos or hypothesis are missing"); + return false; + } + + SMESH_subMesh *sm = aMesh.GetSubMesh(aShape); + + // ----------------------------------------------------------------- + // apply algos that do not require descretized boundaries, starting + // from the most complex shapes + // ----------------------------------------------------------------- + + // map containing all subshapes in the order: vertices, edges, faces... + const map& smMap = sm->DependsOn(); + map::const_reverse_iterator revItSub = smMap.rbegin(); + + SMESH_subMesh* smToCompute = sm; + while ( smToCompute ) + { + const TopoDS_Shape& aSubShape = smToCompute->GetSubShape(); + if ( GetShapeDim( aSubShape ) < 1 ) break; + + SMESH_Algo* algo = GetAlgo( aMesh, aSubShape ); + if (algo && + !algo->NeedDescretBoundary() && + smToCompute->GetComputeState() == SMESH_subMesh::READY_TO_COMPUTE ) + { + ret = smToCompute->ComputeStateEngine( SMESH_subMesh::COMPUTE ); + } + if (!ret) + return false; + + // next subMesh + if (revItSub != smMap.rend()) + { + smToCompute = (*revItSub).second; + revItSub++; + } + else + smToCompute = 0; + } + + // ----------------------------------------------- + // mesh the rest subshapes starting from vertices + // ----------------------------------------------- + + smToCompute = sm->GetFirstToCompute(); + while (smToCompute) + { + TopoDS_Shape subShape = smToCompute->GetSubShape(); + int dim = GetShapeDim(subShape); + if (dim > 0) + { + //MESSAGE ( "MESH shape id=" << smToCompute->GetId() << + // " type=" << smToCompute->GetSubShape().ShapeType()); + bool ret1 = smToCompute->ComputeStateEngine(SMESH_subMesh::COMPUTE); + ret = ret && ret1; + } + else + { + ASSERT(dim == 0); + ASSERT(smToCompute->_vertexSet == false); + TopoDS_Vertex V1 = TopoDS::Vertex(subShape); + gp_Pnt P1 = BRep_Tool::Pnt(V1); + SMESHDS_Mesh * meshDS = aMesh.GetMeshDS(); + //MESSAGE("point "<AddNode(P1.X(), P1.Y(), P1.Z()); + if ( node ) { // san - increase robustness + meshDS->SetNodeOnVertex(node, V1); + smToCompute->GetSubMeshDS(); + smToCompute->_vertexSet = true; + smToCompute->ComputeStateEngine(SMESH_subMesh::COMPUTE); + } + } + smToCompute = sm->GetFirstToCompute(); + } + + MESSAGE( "VSR - SMESH_Gen::Compute() finished" ); + return ret; } -//============================================================================= -/*! - * - */ -//============================================================================= -SMESH_Algo *SMESH_Gen::GetAlgo(SMESH_Mesh & aMesh, const TopoDS_Shape & aShape) +//======================================================================= +//function : checkConformIgnoredAlgos +//purpose : +//======================================================================= + +static bool checkConformIgnoredAlgos(SMESH_Mesh& aMesh, + SMESH_subMesh* aSubMesh, + const SMESH_Algo* aGlobIgnoAlgo, + const SMESH_Algo* aLocIgnoAlgo, + bool & checkConform, + map& aCheckedMap) { - //MESSAGE("SMESH_Gen::GetAlgo"); + ASSERT( aSubMesh ); + if ( aSubMesh->GetSubShape().ShapeType() == TopAbs_VERTEX) + return true; + + + bool ret = true; + + const list& listHyp = + aMesh.GetMeshDS()->GetHypothesis( aSubMesh->GetSubShape() ); + list::const_iterator it=listHyp.begin(); + for ( ; it != listHyp.end(); it++) + { + const SMESHDS_Hypothesis * aHyp = *it; + if (aHyp->GetType() == SMESHDS_Hypothesis::PARAM_ALGO) + continue; + + const SMESH_Algo* algo = dynamic_cast (aHyp); + ASSERT ( algo ); + + if ( aLocIgnoAlgo ) // algo is hidden by a local algo of upper dim + { + INFOS( "Local <" << algo->GetName() << "> is hidden by local <" + << aLocIgnoAlgo->GetName() << ">"); + } + else + { + bool isGlobal = (aMesh.IsMainShape( aSubMesh->GetSubShape() )); + int dim = algo->GetDim(); + int aMaxGlobIgnoDim = ( aGlobIgnoAlgo ? aGlobIgnoAlgo->GetDim() : -1 ); + + if ( dim < aMaxGlobIgnoDim ) + { + // algo is hidden by a global algo + INFOS( ( isGlobal ? "Global" : "Local" ) + << " <" << algo->GetName() << "> is hidden by global <" + << aGlobIgnoAlgo->GetName() << ">"); + } + else if ( !algo->NeedDescretBoundary() && !isGlobal) + { + // local algo is not hidden and hides algos on sub-shapes + if (checkConform && !aSubMesh->IsConform( algo )) + { + ret = false; + checkConform = false; // no more check conformity + INFOS( "ERROR: Local <" << algo->GetName() << + "> would produce not conform mesh: " + " hypotesis is missing"); + } + + // sub-algos will be hidden by a local + const map& smMap = aSubMesh->DependsOn(); + map::const_reverse_iterator revItSub; + bool checkConform2 = false; + for ( revItSub = smMap.rbegin(); revItSub != smMap.rend(); revItSub++) + { + checkConformIgnoredAlgos (aMesh, (*revItSub).second, aGlobIgnoAlgo, + algo, checkConform2, aCheckedMap); + int key = (*revItSub).first; + SMESH_subMesh* sm = (*revItSub).second; + if ( aCheckedMap.find( key ) == aCheckedMap.end() ) + { + aCheckedMap[ key ] = sm; + } + } + } + } + } + + return ret; +} - const SMESHDS_Hypothesis *theHyp = NULL; - SMESH_Algo *algo = NULL; - const SMESHDS_Mesh * meshDS = aMesh.GetMeshDS(); - int hypType; - int hypId; - int algoDim; +//======================================================================= +//function : checkMissing +//purpose : notify on missing hypothesis +// Return false if algo or hipothesis is missing +//======================================================================= + +static bool checkMissing(SMESH_Gen* aGen, + SMESH_Mesh& aMesh, + SMESH_subMesh* aSubMesh, + const int aTopAlgoDim, + bool* globalChecked, + const bool checkNoAlgo, + map& aCheckedMap) +{ + if ( aSubMesh->GetSubShape().ShapeType() == TopAbs_VERTEX) + return true; + + //MESSAGE("=====checkMissing"); + + int ret = true; + SMESH_Algo* algo = 0; + + switch (aSubMesh->GetAlgoState()) + { + case SMESH_subMesh::NO_ALGO: { + if (checkNoAlgo) + { + // should there be any algo? + int shapeDim = SMESH_Gen::GetShapeDim( aSubMesh->GetSubShape() ); + if (aTopAlgoDim > shapeDim) + { + INFOS( "ERROR: " << shapeDim << "D algorithm is missing" ); + ret = false; + } + } + return ret; + } + case SMESH_subMesh::MISSING_HYP: { + // notify if an algo missing hyp is attached to aSubMesh + algo = aGen->GetAlgo( aMesh, aSubMesh->GetSubShape() ); + ASSERT( algo ); + bool isGlobalAlgo = aGen->IsGlobalAlgo( algo, aMesh ); + if (!isGlobalAlgo || !globalChecked[ algo->GetDim() ]) + { + INFOS( "ERROR: " << (isGlobalAlgo ? "Global " : "Local ") + << "<" << algo->GetName() << "> misses some hypothesis"); + if (isGlobalAlgo) + globalChecked[ algo->GetDim() ] = true; + } + ret = false; + break; + } + case SMESH_subMesh::HYP_OK: + algo = aGen->GetAlgo( aMesh, aSubMesh->GetSubShape() ); + ret = true; + break; + default: ASSERT(0); + } + + // do not check under algo that hides sub-algos or + // re-start checking NO_ALGO state + ASSERT (algo); + bool isTopLocalAlgo = + ( aTopAlgoDim <= algo->GetDim() && !aGen->IsGlobalAlgo( algo, aMesh )); + 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++) + { + // 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; + + if (isTopLocalAlgo) + { + //check algo on sub-meshes + int aTopAlgoDim2 = algo->GetDim(); + if (!checkMissing (aGen, aMesh, sm, aTopAlgoDim2, + globalChecked, checkNoAlgo2, aCheckedMap)) + { + ret = false; + if (sm->GetAlgoState() == SMESH_subMesh::NO_ALGO ) + checkNoAlgo2 = false; + } + } + } + } + return ret; +} - // try shape first, then main shape +//======================================================================= +//function : CheckAlgoState +//purpose : notify on bad state of attached algos, return false +// if Compute() would fail because of some algo bad state +//======================================================================= - TopoDS_Shape mainShape = meshDS->ShapeToMesh(); - const TopoDS_Shape *shapeToTry[2] = { &aShape, &mainShape }; +bool SMESH_Gen::CheckAlgoState(SMESH_Mesh& aMesh, const TopoDS_Shape& aShape) +{ + //MESSAGE("SMESH_Gen::CheckAlgoState"); + + bool ret = true; + bool hasAlgo = false; + + SMESH_subMesh* sm = aMesh.GetSubMesh(aShape); + const SMESHDS_Mesh* meshDS = aMesh.GetMeshDS(); + TopoDS_Shape mainShape = meshDS->ShapeToMesh(); + + // ----------------- + // get global algos + // ----------------- + + const SMESH_Algo* aGlobAlgoArr[] = {0,0,0,0}; + + const list& listHyp = meshDS->GetHypothesis( mainShape ); + list::const_iterator it=listHyp.begin(); + for ( ; it != listHyp.end(); it++) + { + const SMESHDS_Hypothesis * aHyp = *it; + if (aHyp->GetType() == SMESHDS_Hypothesis::PARAM_ALGO) + continue; + + const SMESH_Algo* algo = dynamic_cast (aHyp); + ASSERT ( algo ); + + int dim = algo->GetDim(); + aGlobAlgoArr[ dim ] = algo; + + hasAlgo = true; + } + + // -------------------------------------------------------- + // info on algos that will be ignored because of ones that + // don't NeedDescretBoundary() attached to super-shapes, + // check that a conform mesh will be produced + // -------------------------------------------------------- + + + // find a global algo possibly hidding sub-algos + int dim; + const SMESH_Algo* aGlobIgnoAlgo = 0; + for (dim = 3; dim > 0; dim--) + { + if (aGlobAlgoArr[ dim ] && + !aGlobAlgoArr[ dim ]->NeedDescretBoundary()) + { + aGlobIgnoAlgo = aGlobAlgoArr[ dim ]; + break; + } + } + + const map& smMap = sm->DependsOn(); + map::const_reverse_iterator revItSub = smMap.rbegin(); + map aCheckedMap; + bool checkConform = ( !aMesh.IsNotConformAllowed() ); + int aKey = 1; + SMESH_subMesh* smToCheck = sm; + + // loop on aShape and its sub-shapes + while ( smToCheck ) + { + if ( smToCheck->GetSubShape().ShapeType() == TopAbs_VERTEX) + break; + + if ( aCheckedMap.find( aKey ) == aCheckedMap.end() ) + if (!checkConformIgnoredAlgos (aMesh, smToCheck, aGlobIgnoAlgo, + 0, checkConform, aCheckedMap)) + 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; + } + + } + + // ---------------------------------------------------------------- + // info on missing hypothesis and find out if all needed algos are + // well defined + // ---------------------------------------------------------------- + + //MESSAGE( "---info on missing hypothesis and find out if all needed algos are"); + + // find max dim of global algo + int aTopAlgoDim = 0; + for (dim = 3; dim > 0; dim--) + { + if (aGlobAlgoArr[ dim ]) + { + aTopAlgoDim = dim; + break; + } + } + aCheckedMap.clear(); + smToCheck = sm; + revItSub = smMap.rbegin(); + bool checkNoAlgo = (bool) aTopAlgoDim; + bool globalChecked[] = { false, false, false, false }; + + // loop on aShape and its sub-shapes + while ( smToCheck ) + { + if ( smToCheck->GetSubShape().ShapeType() == TopAbs_VERTEX) + break; + + if ( aCheckedMap.find( aKey ) == aCheckedMap.end() ) + if (!checkMissing (this, aMesh, smToCheck, aTopAlgoDim, + globalChecked, checkNoAlgo, aCheckedMap)) + { + 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 ) + INFOS( "None algorithm attached" ); + + return ( ret && hasAlgo ); +} - for (int iShape = 0; iShape < 2; iShape++) - { - TopoDS_Shape tryShape = (*shapeToTry[iShape]); +//======================================================================= +//function : IsGlobalAlgo +//purpose : check if theAlgo is attached to the main shape +//======================================================================= - const list& listHyp = - meshDS->GetHypothesis(tryShape); - list::const_iterator it=listHyp.begin(); - - int nb_algo = 0; - int shapeDim = GetShapeDim(aShape); - int typeOfShape = aShape.ShapeType(); - - while (it!=listHyp.end()) - { - const SMESHDS_Hypothesis *anHyp = *it; - hypType = anHyp->GetType(); - //SCRUTE(hypType); - if (hypType > SMESHDS_Hypothesis::PARAM_ALGO) - { - switch (hypType) - { - case SMESHDS_Hypothesis::ALGO_1D: - algoDim = 1; - break; - case SMESHDS_Hypothesis::ALGO_2D: - algoDim = 2; - break; - case SMESHDS_Hypothesis::ALGO_3D: - algoDim = 3; - break; - default: - algoDim = 0; - break; - } - //SCRUTE(algoDim); - //SCRUTE(shapeDim); - //SCRUTE(typeOfShape); - if (shapeDim == algoDim) // count only algos of shape dim. - { // discard algos for subshapes - hypId = anHyp->GetID(); // (of lower dim.) - ASSERT(_mapAlgo.find(hypId) != _mapAlgo.end()); - SMESH_Algo *anAlgo = _mapAlgo[hypId]; - //SCRUTE(anAlgo->GetShapeType()); - //if (anAlgo->GetShapeType() == typeOfShape) - if ((anAlgo->GetShapeType()) & (1 << typeOfShape)) - { // only specific TopoDS_Shape - nb_algo++; - theHyp = anHyp; - } - } - } - if (nb_algo > 1) return NULL; // more than one algo - it++; - } - if (nb_algo == 1) // one algo found : OK - break; // do not try a parent shape - } +bool SMESH_Gen::IsGlobalAlgo(const SMESH_Algo* theAlgo, SMESH_Mesh& aMesh) +{ + const SMESHDS_Mesh* meshDS = aMesh.GetMeshDS(); + TopoDS_Shape mainShape = meshDS->ShapeToMesh(); + const list& listHyp = meshDS->GetHypothesis( mainShape ); + list::const_iterator it=listHyp.begin(); + for ( ; it != listHyp.end(); it++) + if ( *it == theAlgo ) + return true; + + return false; +} - if (!theHyp) - return NULL; // no algo found - hypType = theHyp->GetType(); - hypId = theHyp->GetID(); +//======================================================================= +//function : getAlgoId +//purpose : return algo ID or -1 if not found +//======================================================================= - ASSERT(_mapAlgo.find(hypId) != _mapAlgo.end()); - algo = _mapAlgo[hypId]; - //MESSAGE("Algo found " << algo->GetName() << " Id " << hypId); - return algo; +static int getAlgo(const list& theHypList, + const int theAlgoDim, + const int theAlgoShapeType) +{ + list::const_iterator it = theHypList.begin(); + + int nb_algo = 0; + int algo_id = -1; + + while (it!=theHypList.end()) + { + const SMESH_Hypothesis *anHyp = static_cast< const SMESH_Hypothesis *>( *it ); + if (anHyp->GetType() > SMESHDS_Hypothesis::PARAM_ALGO && + anHyp->GetDim() == theAlgoDim && + ((anHyp->GetShapeType()) & (1 << theAlgoShapeType))) + { + nb_algo++; + algo_id = anHyp->GetID(); + break; + } + + //if (nb_algo > 1) return -1; // more than one algo + it++; + } + + return algo_id; +} + +//============================================================================= +/*! + * + */ +//============================================================================= + +SMESH_Algo *SMESH_Gen::GetAlgo(SMESH_Mesh & aMesh, const TopoDS_Shape & aShape) +{ +// MESSAGE("SMESH_Gen::GetAlgo"); + + const SMESHDS_Mesh * meshDS = aMesh.GetMeshDS(); + int dim = GetShapeDim( aShape ); + int shape_type = aShape.ShapeType(); + int algo_id = -1; + + algo_id = getAlgo( meshDS->GetHypothesis( aShape ), dim, shape_type ); + + if (algo_id < 0) + { + // try ansestors + TopTools_ListIteratorOfListOfShape ancIt( aMesh.GetAncestors( aShape )); + for (; ancIt.More(); ancIt.Next()) + { + const TopoDS_Shape& ancestor = ancIt.Value(); + algo_id = getAlgo( meshDS->GetHypothesis( ancestor ), dim, shape_type ); + if ( algo_id >= 0 ) + break; + } + if (algo_id < 0) return NULL; + } + + ASSERT(_mapAlgo.find(algo_id) != _mapAlgo.end()); + + return _mapAlgo[algo_id]; + +// const SMESHDS_Hypothesis *theHyp = NULL; +// SMESH_Algo *algo = NULL; +// const SMESHDS_Mesh * meshDS = aMesh.GetMeshDS(); +// int hypType; +// int hypId; +// int algoDim; + +// // try shape first, then main shape + +// TopoDS_Shape mainShape = meshDS->ShapeToMesh(); +// const TopoDS_Shape *shapeToTry[2] = { &aShape, &mainShape }; + +// for (int iShape = 0; iShape < 2; iShape++) +// { +// TopoDS_Shape tryShape = (*shapeToTry[iShape]); + +// const list& listHyp = +// meshDS->GetHypothesis(tryShape); +// list::const_iterator it=listHyp.begin(); + +// int nb_algo = 0; +// int shapeDim = GetShapeDim(aShape); +// int typeOfShape = aShape.ShapeType(); + +// while (it!=listHyp.end()) +// { +// const SMESHDS_Hypothesis *anHyp = *it; +// hypType = anHyp->GetType(); +// //SCRUTE(hypType); +// if (hypType > SMESHDS_Hypothesis::PARAM_ALGO) +// { +// switch (hypType) +// { +// case SMESHDS_Hypothesis::ALGO_1D: +// algoDim = 1; +// break; +// case SMESHDS_Hypothesis::ALGO_2D: +// algoDim = 2; +// break; +// case SMESHDS_Hypothesis::ALGO_3D: +// algoDim = 3; +// break; +// default: +// algoDim = 0; +// break; +// } +// //SCRUTE(algoDim); +// //SCRUTE(shapeDim); +// //SCRUTE(typeOfShape); +// if (shapeDim == algoDim) // count only algos of shape dim. +// { // discard algos for subshapes +// hypId = anHyp->GetID(); // (of lower dim.) +// ASSERT(_mapAlgo.find(hypId) != _mapAlgo.end()); +// SMESH_Algo *anAlgo = _mapAlgo[hypId]; +// //SCRUTE(anAlgo->GetShapeType()); +// //if (anAlgo->GetShapeType() == typeOfShape) +// if ((anAlgo->GetShapeType()) & (1 << typeOfShape)) +// { // only specific TopoDS_Shape +// nb_algo++; +// theHyp = anHyp; +// } +// } +// } +// if (nb_algo > 1) return NULL; // more than one algo +// it++; +// } +// if (nb_algo == 1) // one algo found : OK +// break; // do not try a parent shape +// } + +// if (!theHyp) +// return NULL; // no algo found + +// hypType = theHyp->GetType(); +// hypId = theHyp->GetID(); + +// ASSERT(_mapAlgo.find(hypId) != _mapAlgo.end()); +// algo = _mapAlgo[hypId]; +// //MESSAGE("Algo found " << algo->GetName() << " Id " << hypId); +// return algo; } //============================================================================= @@ -365,16 +823,12 @@ const char *SMESH_Gen::LocalPersistentIDToIOR(const char *aLocalPersistentID) */ //============================================================================= -int SMESH_Gen::GetShapeDim(const TopoDS_Shape & aShape) +int SMESH_Gen::GetShapeDim(const TopAbs_ShapeEnum & aShapeType) { int shapeDim = -1; // Shape dimension: 0D, 1D, 2D, 3D - int type = aShape.ShapeType(); + int type = aShapeType;//.ShapeType(); switch (type) { -// case TopAbs_COMPOUND: -// { -// break; -// } case TopAbs_COMPOUND: case TopAbs_COMPSOLID: case TopAbs_SOLID: @@ -401,6 +855,17 @@ int SMESH_Gen::GetShapeDim(const TopoDS_Shape & aShape) break; } } -// SCRUTE(shapeDim); return shapeDim; } + +//============================================================================= +/*! + * + */ +//============================================================================= + +int SMESH_Gen::GetANewId() +{ + //MESSAGE("SMESH_Gen::GetANewId"); + return _hypId++; +} diff --git a/src/SMESH/SMESH_Gen.hxx b/src/SMESH/SMESH_Gen.hxx index 5443c0e4c..3a01de04c 100644 --- a/src/SMESH/SMESH_Gen.hxx +++ b/src/SMESH/SMESH_Gen.hxx @@ -31,7 +31,6 @@ #include "Utils_SALOME_Exception.hxx" -#include "SMESH_HypothesisFactory.hxx" #include "SMESH_Hypothesis.hxx" #include "SMESH_Algo.hxx" #include "SMESH_1D_Algo.hxx" @@ -55,42 +54,53 @@ typedef struct studyContextStruct class SMESH_Gen { - public: - SMESH_Gen(); - ~SMESH_Gen(); - - SMESH_Hypothesis *CreateHypothesis(const char *anHyp, int studyId) - throw(SALOME_Exception); - SMESH_Mesh *Init(int studyId, const TopoDS_Shape & aShape) - throw(SALOME_Exception); - bool Compute(::SMESH_Mesh & aMesh, const TopoDS_Shape & aShape) - throw(SALOME_Exception); - StudyContextStruct *GetStudyContext(int studyId); - - static int GetShapeDim(const TopoDS_Shape & aShape); - SMESH_Algo *GetAlgo(SMESH_Mesh & aMesh, const TopoDS_Shape & aShape); - - // 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); - - SMESH_HypothesisFactory _hypothesisFactory; - - map < int, SMESH_Algo * >_mapAlgo; - map < int, SMESH_1D_Algo * >_map1D_Algo; - map < int, SMESH_2D_Algo * >_map2D_Algo; - map < int, SMESH_3D_Algo * >_map3D_Algo; - - private: - int _localId; // unique Id of created objects, within SMESH_Gen entity - map < int, StudyContextStruct * >_mapStudyContext; - map < int, SMESH_Hypothesis * >_mapHypothesis; + public: + SMESH_Gen(); + ~SMESH_Gen(); + +// SMESH_Hypothesis *CreateHypothesis(const char *anHyp, int studyId) +// throw(SALOME_Exception); + SMESH_Mesh* CreateMesh(int studyId) + throw(SALOME_Exception); + bool Compute(::SMESH_Mesh & aMesh, const TopoDS_Shape & aShape); + + bool CheckAlgoState(SMESH_Mesh& aMesh, const TopoDS_Shape& aShape); + // notify on bad state of attached algos, return false + // if Compute() would fail because of some algo bad state + + + StudyContextStruct *GetStudyContext(int studyId); + + static int GetShapeDim(const TopAbs_ShapeEnum & aShapeType); + static int GetShapeDim(const TopoDS_Shape & aShape) + { return GetShapeDim( aShape.ShapeType() ); } + SMESH_Algo* GetAlgo(SMESH_Mesh & aMesh, const TopoDS_Shape & aShape); + static bool IsGlobalAlgo(const SMESH_Algo* theAlgo, 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(); + + map < int, SMESH_Algo * >_mapAlgo; + map < int, SMESH_1D_Algo * >_map1D_Algo; + map < int, SMESH_2D_Algo * >_map2D_Algo; + map < int, SMESH_3D_Algo * >_map3D_Algo; + + private: + + int _localId; // unique Id of created objects, within SMESH_Gen entity + map < int, StudyContextStruct * >_mapStudyContext; + + // hypotheses managing + int _hypId; }; #endif diff --git a/src/SMESH/SMESH_Hypothesis.cxx b/src/SMESH/SMESH_Hypothesis.cxx index 0d61a5f52..dac1ee325 100644 --- a/src/SMESH/SMESH_Hypothesis.cxx +++ b/src/SMESH/SMESH_Hypothesis.cxx @@ -48,8 +48,8 @@ SMESH_Hypothesis::SMESH_Hypothesis(int hypId, StudyContextStruct* myStudyContext = _gen->GetStudyContext(_studyId); myStudyContext->mapHypothesis[_hypId] = this; _type = PARAM_ALGO; -// _shapeType = -1; // to be set by algo with TopAbs_Enum _shapeType = 0; // to be set by algo with TopAbs_Enum + _param_algo_dim = -1; // to be set by algo parameter } //============================================================================= @@ -69,7 +69,7 @@ SMESH_Hypothesis::~SMESH_Hypothesis() */ //============================================================================= -int SMESH_Hypothesis::GetDim() +int SMESH_Hypothesis::GetDim() const { int dim = -1; switch (_type) @@ -77,6 +77,7 @@ int SMESH_Hypothesis::GetDim() case ALGO_1D: dim = 1; break; case ALGO_2D: dim = 2; break; case ALGO_3D: dim = 3; break; + case PARAM_ALGO: dim = _param_algo_dim; break; } return dim; } @@ -87,7 +88,7 @@ int SMESH_Hypothesis::GetDim() */ //============================================================================= -int SMESH_Hypothesis::GetShapeType() +int SMESH_Hypothesis::GetShapeType() const { return _shapeType; } @@ -98,7 +99,7 @@ int SMESH_Hypothesis::GetShapeType() */ //============================================================================= -int SMESH_Hypothesis::GetStudyId() +int SMESH_Hypothesis::GetStudyId() const { return _studyId; } @@ -133,3 +134,28 @@ void SMESH_Hypothesis::NotifySubMeshesHypothesisModification() } } +//============================================================================= +/*! + * + */ +//============================================================================= + +const char* SMESH_Hypothesis::GetLibName() const +{ +// MESSAGE("SMESHDS_Hypothesis::GetLibName"); +// SCRUTE(_LibName); +// SCRUTE(&_LibName); + return _libName.c_str(); +} + +//============================================================================= +/*! + * + */ +//============================================================================= + +void SMESH_Hypothesis::SetLibName(const char* theLibName) +{ +// MESSAGE("SMESHDS_Hypothesis::SetLibName"); + _libName = string(theLibName); +} diff --git a/src/SMESH/SMESH_Hypothesis.hxx b/src/SMESH/SMESH_Hypothesis.hxx index edcfeba06..9fcea7b25 100644 --- a/src/SMESH/SMESH_Hypothesis.hxx +++ b/src/SMESH/SMESH_Hypothesis.hxx @@ -36,17 +36,39 @@ class SMESH_Gen; class SMESH_Hypothesis: public SMESHDS_Hypothesis { public: + enum Hypothesis_Status // in the order of severity + { + HYP_OK, + HYP_MISSING, // algo misses a hypothesis + HYP_CONCURENT, // several applicable hypotheses + HYP_BAD_PARAMETER,// hypothesis has a bad parameter value + HYP_UNKNOWN_FATAL,// --- all statuses below should be considered as fatal + // for Add/RemoveHypothesis operations + HYP_INCOMPATIBLE, // hypothesis does not fit algo + HYP_NOTCONFORM, // not conform mesh is produced appling a hypothesis + HYP_ALREADY_EXIST,// such hypothesis already exist + HYP_BAD_DIM // bad dimension + }; + static bool IsStatusFatal(Hypothesis_Status theStatus) + { return theStatus >= HYP_UNKNOWN_FATAL; } + SMESH_Hypothesis(int hypId, int studyId, SMESH_Gen* gen); virtual ~SMESH_Hypothesis(); - int GetDim(); - int GetStudyId(); + int GetDim() const; + int GetStudyId() const; void NotifySubMeshesHypothesisModification(); - int GetShapeType(); + int GetShapeType() const; + const char* GetLibName() const; + void SetLibName(const char* theLibName); protected: SMESH_Gen* _gen; int _studyId; int _shapeType; + int _param_algo_dim; + +private: + string _libName; }; #endif diff --git a/src/SMESH/SMESH_Mesh.cxx b/src/SMESH/SMESH_Mesh.cxx index 82f24dddf..6d03700c7 100644 --- a/src/SMESH/SMESH_Mesh.cxx +++ b/src/SMESH/SMESH_Mesh.cxx @@ -30,6 +30,8 @@ #include "SMESH_subMesh.hxx" #include "SMESH_Gen.hxx" #include "SMESH_Hypothesis.hxx" +#include "SMESH_Group.hxx" +#include "SMESHDS_Group.hxx" #include "SMESHDS_Script.hxx" #include "SMDS_MeshVolume.hxx" @@ -40,7 +42,15 @@ #include "DriverDAT_W_SMESHDS_Mesh.h" #include "DriverUNV_W_SMESHDS_Mesh.h" +#include "DriverMED_R_SMESHDS_Mesh.h" + #include +#include +#include +#include +#include +#include "Utils_ExceptHandlers.hxx" + //============================================================================= /*! @@ -61,8 +71,8 @@ SMESH_Mesh::SMESH_Mesh() */ //============================================================================= -SMESH_Mesh::SMESH_Mesh(int localId, - int studyId, SMESH_Gen * gen, SMESHDS_Document * myDocument) +SMESH_Mesh::SMESH_Mesh(int localId, int studyId, SMESH_Gen * gen, SMESHDS_Document * myDocument) +: _groupId( 0 ) { MESSAGE("SMESH_Mesh::SMESH_Mesh(int localId)"); _id = localId; @@ -82,7 +92,14 @@ SMESH_Mesh::SMESH_Mesh(int localId, SMESH_Mesh::~SMESH_Mesh() { - MESSAGE("SMESH_Mesh::~SMESH_Mesh"); + MESSAGE("SMESH_Mesh::~SMESH_Mesh"); + + // delete groups + map < int, SMESH_Group * >::iterator itg; + for (itg = _mapGroup.begin(); itg != _mapGroup.end(); itg++) { + SMESH_Group *aGroup = (*itg).second; + delete aGroup; + } } //============================================================================= @@ -91,9 +108,7 @@ SMESH_Mesh::~SMESH_Mesh() */ //============================================================================= -void SMESH_Mesh::ShapeToMesh(const TopoDS_Shape & aShape) -throw(SALOME_Exception) -{ +void SMESH_Mesh::ShapeToMesh(const TopoDS_Shape & aShape){ MESSAGE("SMESH_Mesh::ShapeToMesh"); if (_isShapeToMesh) throw @@ -106,52 +121,109 @@ throw(SALOME_Exception) TopExp::MapShapes(aShape, _subShapes); } +//======================================================================= +//function : MEDToMesh +//purpose : +//======================================================================= + +int SMESH_Mesh::MEDToMesh(const char* theFileName, const char* theMeshName) +{ + MESSAGE("MEDToMesh - theFileName = "< myReader(new DriverMED_R_SMESHDS_Mesh); + myReader->SetMesh(_myMeshDS); + myReader->SetMeshId(-1); + myReader->SetFile(theFileName); + myReader->SetMeshName(theMeshName); + DriverMED_R_SMESHDS_Mesh::ReadStatus status = myReader->ReadMySelf(); + MESSAGE("MEDToMesh - _myMeshDS->NbNodes() = "<<_myMeshDS->NbNodes()); + MESSAGE("MEDToMesh - _myMeshDS->NbEdges() = "<<_myMeshDS->NbEdges()); + MESSAGE("MEDToMesh - _myMeshDS->NbFaces() = "<<_myMeshDS->NbFaces()); + MESSAGE("MEDToMesh - _myMeshDS->NbVolumes() = "<<_myMeshDS->NbVolumes()); + + // Reading groups (sub-meshes are out of scope of MED import functionality) + list aGroupNames = myReader->GetGroupNames(); + MESSAGE("MEDToMesh - Nb groups = "<::iterator it = aGroupNames.begin(); it != aGroupNames.end(); it++ ) { + SMESH_Group* aGroup = AddGroup( SMDSAbs_All, it->c_str(), anId ); + if ( aGroup ) { + MESSAGE("MEDToMesh - group added: "<c_str()); + SMESHDS_Group* aGroupDS = aGroup->GetGroupDS(); + aGroupDS->SetStoreName( it->c_str() ); + myReader->GetGroup( aGroupDS ); + } + } + return (int) status; +} + //============================================================================= /*! * */ //============================================================================= -bool SMESH_Mesh::AddHypothesis(const TopoDS_Shape & aSubShape, - int anHypId) throw(SALOME_Exception) +SMESH_Hypothesis::Hypothesis_Status + SMESH_Mesh::AddHypothesis(const TopoDS_Shape & aSubShape, + int anHypId) throw(SALOME_Exception) { - MESSAGE("SMESH_Mesh::AddHypothesis"); - - StudyContextStruct *sc = _gen->GetStudyContext(_studyId); - if (sc->mapHypothesis.find(anHypId) == sc->mapHypothesis.end()) - { - MESSAGE("Hypothesis ID does not give an hypothesis"); - SCRUTE(_studyId); - SCRUTE(anHypId); - throw SALOME_Exception(LOCALIZED("hypothesis does not exist")); - } - - SMESH_subMesh *subMesh = GetSubMesh(aSubShape); - SMESH_Hypothesis *anHyp = sc->mapHypothesis[anHypId]; - int event; - - // shape - - if (anHyp->GetType() == SMESHDS_Hypothesis::PARAM_ALGO) - event = SMESH_subMesh::ADD_HYP; - else - event = SMESH_subMesh::ADD_ALGO; - int ret = subMesh->AlgoStateEngine(event, anHyp); - - // subShapes (only when shape is mainShape) - TopoDS_Shape mainShape = _myMeshDS->ShapeToMesh(); - if (aSubShape.IsSame(mainShape)) - { - if (anHyp->GetType() == SMESHDS_Hypothesis::PARAM_ALGO) - event = SMESH_subMesh::ADD_FATHER_HYP; - else - event = SMESH_subMesh::ADD_FATHER_ALGO; - subMesh->SubMeshesAlgoStateEngine(event, anHyp); - } - - subMesh->DumpAlgoState(true); - //SCRUTE(ret); - return ret; + Unexpect aCatch(SalomeException); + MESSAGE("SMESH_Mesh::AddHypothesis"); + + StudyContextStruct *sc = _gen->GetStudyContext(_studyId); + if (sc->mapHypothesis.find(anHypId) == sc->mapHypothesis.end()) + { + MESSAGE("Hypothesis ID does not give an hypothesis"); + SCRUTE(_studyId); + SCRUTE(anHypId); + throw SALOME_Exception(LOCALIZED("hypothesis does not exist")); + } + + SMESH_subMesh *subMesh = GetSubMesh(aSubShape); + SMESH_Hypothesis *anHyp = sc->mapHypothesis[anHypId]; + SCRUTE( anHyp->GetName() ); + int event; + + bool isGlobalHyp = IsMainShape( aSubShape ); + + // NotConformAllowed can be only global + if ( !isGlobalHyp ) + { + string hypName = anHyp->GetName(); + if ( hypName == "NotConformAllowed" ) + { + MESSAGE( "Hypotesis can be only global" ); + return SMESH_Hypothesis::HYP_INCOMPATIBLE; + } + } + + // shape + + if (anHyp->GetType() == SMESHDS_Hypothesis::PARAM_ALGO) + event = SMESH_subMesh::ADD_HYP; + else + event = SMESH_subMesh::ADD_ALGO; + SMESH_Hypothesis::Hypothesis_Status ret = subMesh->AlgoStateEngine(event, anHyp); + + // subShapes + if (!SMESH_Hypothesis::IsStatusFatal(ret) && + !subMesh->IsApplicableHypotesis( anHyp )) // is added on father + { + if (anHyp->GetType() == SMESHDS_Hypothesis::PARAM_ALGO) + event = SMESH_subMesh::ADD_FATHER_HYP; + else + event = SMESH_subMesh::ADD_FATHER_ALGO; + SMESH_Hypothesis::Hypothesis_Status ret2 = + subMesh->SubMeshesAlgoStateEngine(event, anHyp); + if (ret2 > ret) + ret = ret2; + } + + subMesh->DumpAlgoState(true); + SCRUTE(ret); + return ret; } //============================================================================= @@ -160,9 +232,11 @@ bool SMESH_Mesh::AddHypothesis(const TopoDS_Shape & aSubShape, */ //============================================================================= -bool SMESH_Mesh::RemoveHypothesis(const TopoDS_Shape & aSubShape, - int anHypId)throw(SALOME_Exception) +SMESH_Hypothesis::Hypothesis_Status + SMESH_Mesh::RemoveHypothesis(const TopoDS_Shape & aSubShape, + int anHypId)throw(SALOME_Exception) { + Unexpect aCatch(SalomeException); MESSAGE("SMESH_Mesh::RemoveHypothesis"); StudyContextStruct *sc = _gen->GetStudyContext(_studyId); @@ -181,18 +255,20 @@ bool SMESH_Mesh::RemoveHypothesis(const TopoDS_Shape & aSubShape, event = SMESH_subMesh::REMOVE_HYP; else event = SMESH_subMesh::REMOVE_ALGO; - int ret = subMesh->AlgoStateEngine(event, anHyp); + SMESH_Hypothesis::Hypothesis_Status ret = subMesh->AlgoStateEngine(event, anHyp); - // subShapes (only when shape is mainShape) - - TopoDS_Shape mainShape = _myMeshDS->ShapeToMesh(); - if (aSubShape.IsSame(mainShape)) + // subShapes + if (!SMESH_Hypothesis::IsStatusFatal(ret) && + !subMesh->IsApplicableHypotesis( anHyp )) // is removed from father { if (anHyp->GetType() == SMESHDS_Hypothesis::PARAM_ALGO) event = SMESH_subMesh::REMOVE_FATHER_HYP; else event = SMESH_subMesh::REMOVE_FATHER_ALGO; - subMesh->SubMeshesAlgoStateEngine(event, anHyp); + SMESH_Hypothesis::Hypothesis_Status ret2 = + subMesh->SubMeshesAlgoStateEngine(event, anHyp); + if (ret2 > ret) // more severe + ret = ret2; } subMesh->DumpAlgoState(true); @@ -218,22 +294,24 @@ SMESHDS_Mesh * SMESH_Mesh::GetMeshDS() //============================================================================= const list& - SMESH_Mesh::GetHypothesisList(const TopoDS_Shape & aSubShape) + SMESH_Mesh::GetHypothesisList(const TopoDS_Shape & aSubShape) const throw(SALOME_Exception) { - MESSAGE("SMESH_Mesh::GetHypothesisList"); - _subShapeHypothesisList.clear(); - const list& listHyp = - _myMeshDS->GetHypothesis(aSubShape); - - list::const_iterator it=listHyp.begin(); - while (it!=listHyp.end()) - { - const SMESHDS_Hypothesis *anHyp = *it; - _subShapeHypothesisList.push_back(anHyp); - it++; - } - return _subShapeHypothesisList; + Unexpect aCatch(SalomeException); +// MESSAGE("SMESH_Mesh::GetHypothesisList"); +// _subShapeHypothesisList.clear(); +// const list& listHyp = +// _myMeshDS->GetHypothesis(aSubShape); + +// list::const_iterator it=listHyp.begin(); +// while (it!=listHyp.end()) +// { +// const SMESHDS_Hypothesis *anHyp = *it; +// _subShapeHypothesisList.push_back(anHyp); +// it++; +// } +// return _subShapeHypothesisList; + return _myMeshDS->GetHypothesis(aSubShape); } //============================================================================= @@ -244,6 +322,7 @@ const list& const list & SMESH_Mesh::GetLog() throw(SALOME_Exception) { + Unexpect aCatch(SalomeException); MESSAGE("SMESH_Mesh::GetLog"); return _myMeshDS->GetScript()->GetCommands(); } @@ -255,6 +334,7 @@ const list & SMESH_Mesh::GetLog() throw(SALOME_Exception) //============================================================================= void SMESH_Mesh::ClearLog() throw(SALOME_Exception) { + Unexpect aCatch(SalomeException); MESSAGE("SMESH_Mesh::ClearLog"); _myMeshDS->GetScript()->Clear(); } @@ -291,9 +371,11 @@ SMESH_Gen *SMESH_Mesh::GetGen() SMESH_subMesh *SMESH_Mesh::GetSubMesh(const TopoDS_Shape & aSubShape) throw(SALOME_Exception) { + Unexpect aCatch(SalomeException); //MESSAGE("SMESH_Mesh::GetSubMesh"); SMESH_subMesh *aSubMesh; int index = _subShapes.FindIndex(aSubShape); + if (_mapSubMesh.find(index) != _mapSubMesh.end()) { aSubMesh = _mapSubMesh[index]; @@ -343,6 +425,7 @@ throw(SALOME_Exception) SMESH_subMesh *SMESH_Mesh::GetSubMeshContaining(const TopoDS_Shape & aSubShape) throw(SALOME_Exception) { + Unexpect aCatch(SalomeException); //MESSAGE("SMESH_Mesh::GetSubMeshContaining"); bool isFound = false; SMESH_subMesh *aSubMesh = NULL; @@ -379,6 +462,68 @@ throw(SALOME_Exception) return aSubMesh; } +//======================================================================= +//function : IsUsedHypothesis +//purpose : Return True if anHyp is used to mesh aSubShape +//======================================================================= + +bool SMESH_Mesh::IsUsedHypothesis(SMESHDS_Hypothesis * anHyp, + const TopoDS_Shape & aSubShape) +{ + //MESSAGE( "SMESH_Mesh::IsUsedHypothesis" ); + + // check if anHyp is applicable to aSubShape + SMESH_subMesh * subMesh = GetSubMeshContaining( aSubShape ); + if (!subMesh || + !subMesh->IsApplicableHypotesis(static_cast(anHyp))) + return false; + + SMESH_Algo *algo = _gen->GetAlgo(*this, aSubShape); + + // algorithm + if (anHyp->GetType() > SMESHDS_Hypothesis::PARAM_ALGO) + return ( anHyp == algo ); + + // algorithm parameter + if (algo) + { + // look trough hypotheses used by algo + const list &usedHyps = + algo->GetUsedHypothesis(*this, aSubShape); + list ::const_iterator itl; + for (itl = usedHyps.begin(); itl != usedHyps.end(); itl++) + if (anHyp == (*itl)) + return true; + } + else + { + // look through all assigned hypotheses + { + const list &usedHyps = + _myMeshDS->GetHypothesis( aSubShape ); + list ::const_iterator itl; + for (itl = usedHyps.begin(); itl != usedHyps.end(); itl++) + if (anHyp == (*itl)) + return true; + } + + // on ancestors + TopTools_ListIteratorOfListOfShape it( GetAncestors( aSubShape )); + for (; it.More(); it.Next()) + { + const list &usedHyps = + _myMeshDS->GetHypothesis( aSubShape ); + list ::const_iterator itl; + for (itl = usedHyps.begin(); itl != usedHyps.end(); itl++) + if (anHyp == (*itl)) + return true; + } + } + + return false; +} + + //============================================================================= /*! * @@ -389,27 +534,14 @@ const list < SMESH_subMesh * >& SMESH_Mesh::GetSubMeshUsingHypothesis(SMESHDS_Hypothesis * anHyp) throw(SALOME_Exception) { + Unexpect aCatch(SalomeException); MESSAGE("SMESH_Mesh::GetSubMeshUsingHypothesis"); map < int, SMESH_subMesh * >::iterator itsm; _subMeshesUsingHypothesisList.clear(); for (itsm = _mapSubMesh.begin(); itsm != _mapSubMesh.end(); itsm++) { SMESH_subMesh *aSubMesh = (*itsm).second; - bool usesHyp = false; - SMESH_Algo *algo = _gen->GetAlgo(*this, aSubMesh->GetSubShape()); - if (algo != NULL) - { - const list &usedHyps - = algo->GetUsedHypothesis(*this, aSubMesh->GetSubShape()); - list ::const_iterator itl; - for (itl = usedHyps.begin(); itl != usedHyps.end(); itl++) - if (anHyp == (*itl)) - { - usesHyp = true; - break; - } - } - if (usesHyp) + if ( IsUsedHypothesis ( anHyp, aSubMesh->GetSubShape() )) _subMeshesUsingHypothesisList.push_back(aSubMesh); } return _subMeshesUsingHypothesisList; @@ -421,17 +553,39 @@ throw(SALOME_Exception) */ //============================================================================= -void SMESH_Mesh::ExportMED(const char *file) throw(SALOME_Exception) +void SMESH_Mesh::ExportMED(const char *file, const char* theMeshName, bool theAutoGroups) throw(SALOME_Exception) { - Mesh_Writer *myWriter = new DriverMED_W_SMESHDS_Mesh; - myWriter->SetFile(string(file)); - myWriter->SetMesh(_myMeshDS); - MESSAGE(" _idDoc " << _idDoc) myWriter->SetMeshId(_idDoc); - myWriter->Add(); + Unexpect aCatch(SalomeException); + std::auto_ptr myWriter(new DriverMED_W_SMESHDS_Mesh); + myWriter ->SetFile ( file ); + myWriter ->SetMesh ( _myMeshDS ); + if ( !theMeshName ) + myWriter->SetMeshId ( _idDoc ); + else { + myWriter->SetMeshId ( -1 ); + myWriter->SetMeshName( theMeshName ); + } + + if ( theAutoGroups ) { + myWriter->AddGroupOfNodes(); + myWriter->AddGroupOfEdges(); + myWriter->AddGroupOfFaces(); + myWriter->AddGroupOfVolumes(); + } + + for ( map::iterator it = _mapGroup.begin(); it != _mapGroup.end(); it++ ) { + SMESH_Group* aGroup = it->second; + SMESHDS_Group* aGroupDS = aGroup->GetGroupDS(); + aGroupDS->SetStoreName( aGroup->GetName() ); + myWriter->AddGroup( aGroupDS ); + } + + myWriter->Add(); } void SMESH_Mesh::ExportDAT(const char *file) throw(SALOME_Exception) { + Unexpect aCatch(SalomeException); Mesh_Writer *myWriter = new DriverDAT_W_SMESHDS_Mesh; myWriter->SetFile(string(file)); myWriter->SetMesh(_myMeshDS); @@ -441,6 +595,7 @@ void SMESH_Mesh::ExportDAT(const char *file) throw(SALOME_Exception) void SMESH_Mesh::ExportUNV(const char *file) throw(SALOME_Exception) { + Unexpect aCatch(SalomeException); Mesh_Writer *myWriter = new DriverUNV_W_SMESHDS_Mesh; myWriter->SetFile(string(file)); myWriter->SetMesh(_myMeshDS); @@ -455,6 +610,7 @@ void SMESH_Mesh::ExportUNV(const char *file) throw(SALOME_Exception) //============================================================================= int SMESH_Mesh::NbNodes() throw(SALOME_Exception) { + Unexpect aCatch(SalomeException); return _myMeshDS->NbNodes(); } @@ -465,6 +621,7 @@ int SMESH_Mesh::NbNodes() throw(SALOME_Exception) //============================================================================= int SMESH_Mesh::NbEdges() throw(SALOME_Exception) { + Unexpect aCatch(SalomeException); return _myMeshDS->NbEdges(); } @@ -475,6 +632,7 @@ int SMESH_Mesh::NbEdges() throw(SALOME_Exception) //============================================================================= int SMESH_Mesh::NbFaces() throw(SALOME_Exception) { + Unexpect aCatch(SalomeException); return _myMeshDS->NbFaces(); } @@ -483,11 +641,11 @@ int SMESH_Mesh::NbFaces() throw(SALOME_Exception) /////////////////////////////////////////////////////////////////////////////// int SMESH_Mesh::NbTriangles() throw(SALOME_Exception) { + Unexpect aCatch(SalomeException); int Nb = 0; - SMDS_Iterator * itFaces=_myMeshDS->facesIterator(); + SMDS_FaceIteratorPtr itFaces=_myMeshDS->facesIterator(); while(itFaces->more()) if(itFaces->next()->NbNodes()==3) Nb++; - delete itFaces; return Nb; } @@ -496,11 +654,11 @@ int SMESH_Mesh::NbTriangles() throw(SALOME_Exception) /////////////////////////////////////////////////////////////////////////////// int SMESH_Mesh::NbQuadrangles() throw(SALOME_Exception) { + Unexpect aCatch(SalomeException); int Nb = 0; - SMDS_Iterator * itFaces=_myMeshDS->facesIterator(); + SMDS_FaceIteratorPtr itFaces=_myMeshDS->facesIterator(); while(itFaces->more()) if(itFaces->next()->NbNodes()==4) Nb++; - delete itFaces; return Nb; } @@ -511,24 +669,43 @@ int SMESH_Mesh::NbQuadrangles() throw(SALOME_Exception) //============================================================================= int SMESH_Mesh::NbVolumes() throw(SALOME_Exception) { + Unexpect aCatch(SalomeException); return _myMeshDS->NbVolumes(); } int SMESH_Mesh::NbTetras() throw(SALOME_Exception) { + Unexpect aCatch(SalomeException); int Nb = 0; - SMDS_Iterator * itVolumes=_myMeshDS->volumesIterator(); + SMDS_VolumeIteratorPtr itVolumes=_myMeshDS->volumesIterator(); while(itVolumes->more()) if(itVolumes->next()->NbNodes()==4) Nb++; - delete itVolumes; return Nb; } int SMESH_Mesh::NbHexas() throw(SALOME_Exception) { + Unexpect aCatch(SalomeException); int Nb = 0; - SMDS_Iterator * itVolumes=_myMeshDS->volumesIterator(); + SMDS_VolumeIteratorPtr itVolumes=_myMeshDS->volumesIterator(); while(itVolumes->more()) if(itVolumes->next()->NbNodes()==8) Nb++; - delete itVolumes; + return Nb; +} + +int SMESH_Mesh::NbPyramids() throw(SALOME_Exception) +{ + Unexpect aCatch(SalomeException); + int Nb = 0; + SMDS_VolumeIteratorPtr itVolumes=_myMeshDS->volumesIterator(); + while(itVolumes->more()) if(itVolumes->next()->NbNodes()==5) Nb++; + return Nb; +} + +int SMESH_Mesh::NbPrisms() throw(SALOME_Exception) +{ + Unexpect aCatch(SalomeException); + int Nb = 0; + SMDS_VolumeIteratorPtr itVolumes=_myMeshDS->volumesIterator(); + while(itVolumes->more()) if(itVolumes->next()->NbNodes()==6) Nb++; return Nb; } @@ -539,5 +716,187 @@ int SMESH_Mesh::NbHexas() throw(SALOME_Exception) //============================================================================= int SMESH_Mesh::NbSubMesh() throw(SALOME_Exception) { + Unexpect aCatch(SalomeException); return _myMeshDS->NbSubMesh(); } + +//======================================================================= +//function : IsNotConformAllowed +//purpose : check if a hypothesis alowing notconform mesh is present +//======================================================================= + +bool SMESH_Mesh::IsNotConformAllowed() const +{ + MESSAGE("SMESH_Mesh::IsNotConformAllowed"); + + const list& listHyp = + _myMeshDS->GetHypothesis( _myMeshDS->ShapeToMesh() ); + list::const_iterator it=listHyp.begin(); + while (it!=listHyp.end()) + { + const SMESHDS_Hypothesis *aHyp = *it; + string hypName = aHyp->GetName(); + if ( hypName == "NotConformAllowed" ) + return true; + it++; + } + return false; +} + +//======================================================================= +//function : IsMainShape +//purpose : +//======================================================================= + +bool SMESH_Mesh::IsMainShape(const TopoDS_Shape& theShape) const +{ + return theShape.IsSame(_myMeshDS->ShapeToMesh() ); +} + +//============================================================================= +/*! + * + */ +//============================================================================= + +SMESH_Group* SMESH_Mesh::AddGroup (const SMDSAbs_ElementType theType, + const char* theName, + int& theId) +{ + if (_mapGroup.find(_groupId) != _mapGroup.end()) + return NULL; + SMESH_Group* aGroup = new SMESH_Group (this, theType, theName); + theId = _groupId; + _mapGroup[_groupId++] = aGroup; + return aGroup; +} + +//============================================================================= +/*! + * + */ +//============================================================================= + +SMESH_Group* SMESH_Mesh::GetGroup (const int theGroupID) +{ + if (_mapGroup.find(theGroupID) == _mapGroup.end()) + return NULL; + return _mapGroup[theGroupID]; +} + + +//============================================================================= +/*! + * + */ +//============================================================================= + +list SMESH_Mesh::GetGroupIds() +{ + list anIds; + for ( map::const_iterator it = _mapGroup.begin(); it != _mapGroup.end(); it++ ) + anIds.push_back( it->first ); + + return anIds; +} + + +//============================================================================= +/*! + * + */ +//============================================================================= + +void SMESH_Mesh::RemoveGroup (const int theGroupID) +{ + if (_mapGroup.find(theGroupID) == _mapGroup.end()) + return; + delete _mapGroup[theGroupID]; + _mapGroup.erase (theGroupID); +} + +//======================================================================= +//function : GetAncestors +//purpose : return list of ancestors of theSubShape in the order +// that lower dimention shapes come first. +//======================================================================= + +const TopTools_ListOfShape& SMESH_Mesh::GetAncestors(const TopoDS_Shape& theS) +{ + if ( _mapAncestors.IsEmpty() ) + { + // fill _mapAncestors + int desType, ancType; + for ( desType = TopAbs_EDGE; desType > TopAbs_COMPOUND; desType-- ) + for ( ancType = desType - 1; ancType >= TopAbs_COMPOUND; ancType-- ) + TopExp::MapShapesAndAncestors (_myMeshDS->ShapeToMesh(), + (TopAbs_ShapeEnum) desType, + (TopAbs_ShapeEnum) ancType, + _mapAncestors ); + } + + if ( _mapAncestors.Contains( theS ) ) + return _mapAncestors.FindFromKey( theS ); + + static TopTools_ListOfShape emptyList; + return emptyList; +} + +//======================================================================= +//function : Dump +//purpose : dumps contents of mesh to stream [ debug purposes ] +//======================================================================= +ostream& SMESH_Mesh::Dump(ostream& save) +{ + save << "========================== Dump contents of mesh ==========================" << endl; + save << "1) Total number of nodes: " << NbNodes() << endl; + save << "2) Total number of edges: " << NbEdges() << endl; + save << "3) Total number of faces: " << NbFaces() << endl; + if ( NbFaces() > 0 ) { + int nb3 = NbTriangles(); + int nb4 = NbQuadrangles(); + save << "3.1.) Number of triangles: " << nb3 << endl; + save << "3.2.) Number of quadrangles: " << nb4 << endl; + if ( nb3 + nb4 != NbFaces() ) { + map myFaceMap; + SMDS_FaceIteratorPtr itFaces=_myMeshDS->facesIterator(); + while( itFaces->more( ) ) { + int nbNodes = itFaces->next()->NbNodes(); + if ( myFaceMap.find( nbNodes ) == myFaceMap.end() ) + myFaceMap[ nbNodes ] = 0; + myFaceMap[ nbNodes ] = myFaceMap[ nbNodes ] + 1; + } + save << "3.3.) Faces in detail: " << endl; + map ::iterator itF; + for (itF = myFaceMap.begin(); itF != myFaceMap.end(); itF++) + save << "--> nb nodes: " << itF->first << " - nb elemens: " << itF->second << endl; + } + } + save << "4) Total number of volumes: " << NbVolumes() << endl; + if ( NbVolumes() > 0 ) { + int nb8 = NbHexas(); + int nb4 = NbTetras(); + int nb5 = NbPyramids(); + int nb6 = NbPrisms(); + save << "4.1.) Number of hexahedrons: " << nb8 << endl; + save << "4.2.) Number of tetrahedrons: " << nb4 << endl; + save << "4.3.) Number of prisms: " << nb6 << endl; + save << "4.4.) Number of pyramides: " << nb5 << endl; + if ( nb8 + nb4 + nb5 + nb6 != NbVolumes() ) { + map myVolumesMap; + SMDS_VolumeIteratorPtr itVolumes=_myMeshDS->volumesIterator(); + while( itVolumes->more( ) ) { + int nbNodes = itVolumes->next()->NbNodes(); + if ( myVolumesMap.find( nbNodes ) == myVolumesMap.end() ) + myVolumesMap[ nbNodes ] = 0; + myVolumesMap[ nbNodes ] = myVolumesMap[ nbNodes ] + 1; + } + save << "4.5.) Volumes in detail: " << endl; + map ::iterator itV; + for (itV = myVolumesMap.begin(); itV != myVolumesMap.end(); itV++) + save << "--> nb nodes: " << itV->first << " - nb elemens: " << itV->second << endl; + } + } + save << "===========================================================================" << endl; + return save; +} diff --git a/src/SMESH/SMESH_Mesh.hxx b/src/SMESH/SMESH_Mesh.hxx index f179f68dc..2f77fa2e5 100644 --- a/src/SMESH/SMESH_Mesh.hxx +++ b/src/SMESH/SMESH_Mesh.hxx @@ -34,6 +34,7 @@ #include "SMESHDS_Command.hxx" #include "SMESH_Hypothesis.hxx" #include "SMESH_subMesh.hxx" +#include #include "Utils_SALOME_Exception.hxx" #include @@ -50,12 +51,25 @@ #include #include #include +#include #include #include #include +#if (__GNUC__>2) +#include +#include +#include +#else +#include +#include +#include +#endif + class SMESH_Gen; +class SMESH_Group; +class TopTools_ListOfShape; class SMESH_Mesh { @@ -64,18 +78,24 @@ class SMESH_Mesh SMESH_Mesh(int localId, int studyId, SMESH_Gen * gen, SMESHDS_Document * myDocument); - virtual ~ SMESH_Mesh(); + virtual ~SMESH_Mesh(); - void ShapeToMesh(const TopoDS_Shape & aShape) throw(SALOME_Exception); + void ShapeToMesh(const TopoDS_Shape & aShape); + /*! + * consult DriverMED_R_SMESHDS_Mesh::ReadStatus for returned value + */ + int MEDToMesh(const char* theFileName, const char* theMeshName); - bool AddHypothesis(const TopoDS_Shape & aSubShape, int anHypId) + SMESH_Hypothesis::Hypothesis_Status + AddHypothesis(const TopoDS_Shape & aSubShape, int anHypId) throw(SALOME_Exception); - bool RemoveHypothesis(const TopoDS_Shape & aSubShape, int anHypId) + SMESH_Hypothesis::Hypothesis_Status + RemoveHypothesis(const TopoDS_Shape & aSubShape, int anHypId) throw(SALOME_Exception); const list & - GetHypothesisList(const TopoDS_Shape & aSubShape) + GetHypothesisList(const TopoDS_Shape & aSubShape) const throw(SALOME_Exception); const list & GetLog() throw(SALOME_Exception); @@ -101,8 +121,21 @@ class SMESH_Mesh GetSubMeshUsingHypothesis(SMESHDS_Hypothesis * anHyp) throw(SALOME_Exception); + bool IsUsedHypothesis(SMESHDS_Hypothesis * anHyp, + const TopoDS_Shape & aSubShape); + // Return True if anHyp is used to mesh aSubShape + + bool IsNotConformAllowed() const; + // check if a hypothesis alowing notconform mesh is present + + bool IsMainShape(const TopoDS_Shape& theShape) const; + + const TopTools_ListOfShape& GetAncestors(const TopoDS_Shape& theSubShape); + // return list of ancestors of theSubShape in the order + // that lower dimention shapes come first. + void ExportDAT(const char *file) throw(SALOME_Exception); - void ExportMED(const char *file) throw(SALOME_Exception); + void ExportMED(const char *file, const char* theMeshName = NULL, bool theAutoGroups = true) throw(SALOME_Exception); void ExportUNV(const char *file) throw(SALOME_Exception); int NbNodes() throw(SALOME_Exception); @@ -121,21 +154,43 @@ class SMESH_Mesh int NbHexas() throw(SALOME_Exception); + int NbPyramids() throw(SALOME_Exception); + + int NbPrisms() throw(SALOME_Exception); + int NbSubMesh() throw(SALOME_Exception); + int NbGroup() const { return _mapGroup.size(); } + + SMESH_Group* AddGroup (const SMDSAbs_ElementType theType, + const char* theName, + int& theId); + + SMESH_Group* GetGroup (const int theGroupID); + + list GetGroupIds(); + + void RemoveGroup (const int theGroupID); + + ostream& Dump(ostream & save); + private: int _id; // id given by creator (unique within the creator instance) int _studyId; int _idDoc; // id given by SMESHDS_Document - bool _isShapeToMesh; // set to true when a shape is given (only once) + int _groupId; // id generator for group objects + bool _isShapeToMesh; // set to true when a shape is given (only once) list _subShapeHypothesisList; list _subMeshesUsingHypothesisList; SMESHDS_Document * _myDocument; SMESHDS_Mesh * _myMeshDS; TopTools_IndexedMapOfShape _subShapes; - map _mapSubMesh; + map _mapSubMesh; + map _mapGroup; SMESH_Gen *_gen; + + TopTools_IndexedDataMapOfShapeListOfShape _mapAncestors; }; #endif diff --git a/src/SMESH/SMESH_subMesh.cxx b/src/SMESH/SMESH_subMesh.cxx index 2e6799ed2..2b78950b9 100644 --- a/src/SMESH/SMESH_subMesh.cxx +++ b/src/SMESH/SMESH_subMesh.cxx @@ -40,6 +40,8 @@ using namespace std; #include #include #include +#include +#include //============================================================================= /*! @@ -50,7 +52,6 @@ using namespace std; SMESH_subMesh::SMESH_subMesh(int Id, SMESH_Mesh * father, SMESHDS_Mesh * meshDS, const TopoDS_Shape & aSubShape) { - //MESSAGE("SMESH_subMesh::SMESH_subMesh"); _subShape = aSubShape; _meshDS = meshDS; _subMeshDS = meshDS->MeshElements(_subShape); // may be null ... @@ -58,7 +59,6 @@ SMESH_subMesh::SMESH_subMesh(int Id, SMESH_Mesh * father, SMESHDS_Mesh * meshDS, _Id = Id; _vertexSet = false; // only for Vertex subMesh _dependenceAnalysed = false; - _dependantsFound = false; if (_subShape.ShapeType() == TopAbs_VERTEX) { @@ -90,93 +90,19 @@ SMESH_subMesh::~SMESH_subMesh() */ //============================================================================= -int SMESH_subMesh::GetId() +int SMESH_subMesh::GetId() const { //MESSAGE("SMESH_subMesh::GetId"); return _Id; } -//============================================================================= -/*! - * Given a subShape, find the subMesh is associated to this subShape or - * to a collection of shapes containing this subShape. Collection = compsolid, - * shell, wire - */ -//============================================================================= - -// bool SMESH_subMesh::Contains(const TopoDS_Shape & aSubShape) -// throw (SALOME_Exception) -// { -// //MESSAGE("SMESH_subMesh::Contains"); -// bool contains = false; -// int type = _subShape.ShapeType(); -// int typesub = aSubShape.ShapeType(); -// //SCRUTE(type) -// //SCRUTE(typesub) -// switch (type) -// { -// // case TopAbs_COMPOUND: -// // { -// // //MESSAGE("---"); -// // throw SALOME_Exception(LOCALIZED("Compound not yet treated")); -// // break; -// // } -// case TopAbs_COMPSOLID: -// { -// //MESSAGE("---"); -// for (TopExp_Explorer exp(aSubShape,TopAbs_SOLID);exp.More();exp.Next()) -// { -// contains = _subShape.IsSame(exp.Current()); -// if (contains) break; -// } -// break; -// } -// case TopAbs_SHELL: -// { -// //MESSAGE("---"); -// for (TopExp_Explorer exp(aSubShape,TopAbs_FACE);exp.More();exp.Next()) -// { -// contains = _subShape.IsSame(exp.Current()); -// if (contains) break; -// } -// break; -// } -// case TopAbs_WIRE: -// { -// //MESSAGE("---"); -// for (TopExp_Explorer exp(aSubShape,TopAbs_EDGE);exp.More();exp.Next()) -// { -// contains = _subShape.IsSame(exp.Current()); -// if (contains) break; -// } -// break; -// } -// case TopAbs_COMPOUND: -// case TopAbs_SOLID: -// case TopAbs_FACE: -// case TopAbs_EDGE: -// case TopAbs_VERTEX: -// { -// //MESSAGE("---"); -// contains = _subShape.IsSame(aSubShape); -// break; -// } -// default: -// { -// break; -// } -// } -// //SCRUTE(contains); -// return contains; -// } - //============================================================================= /*! * */ //============================================================================= -SMESHDS_SubMesh * SMESH_subMesh::GetSubMeshDS() throw(SALOME_Exception) +SMESHDS_SubMesh * SMESH_subMesh::GetSubMeshDS() { //MESSAGE("SMESH_subMesh::GetSubMeshDS"); if (_subMeshDS==NULL) @@ -199,7 +125,21 @@ SMESHDS_SubMesh * SMESH_subMesh::GetSubMeshDS() throw(SALOME_Exception) */ //============================================================================= -SMESH_subMesh *SMESH_subMesh::GetFirstToCompute() throw(SALOME_Exception) +SMESHDS_SubMesh* SMESH_subMesh::CreateSubMeshDS() +{ + if ( !GetSubMeshDS() ) + _meshDS->NewSubMesh( _meshDS->ShapeToIndex( _subShape ) ); + + return GetSubMeshDS(); +} + +//============================================================================= +/*! + * + */ +//============================================================================= + +SMESH_subMesh *SMESH_subMesh::GetFirstToCompute() { //MESSAGE("SMESH_subMesh::GetFirstToCompute"); const map < int, SMESH_subMesh * >&subMeshes = DependsOn(); @@ -239,7 +179,7 @@ SMESH_subMesh *SMESH_subMesh::GetFirstToCompute() throw(SALOME_Exception) */ //============================================================================= -bool SMESH_subMesh::SubMeshesComputed() throw(SALOME_Exception) +bool SMESH_subMesh::SubMeshesComputed() { //MESSAGE("SMESH_subMesh::SubMeshesComputed"); const map < int, SMESH_subMesh * >&subMeshes = DependsOn(); @@ -526,10 +466,6 @@ const map < int, SMESH_subMesh * >&SMESH_subMesh::DependsOn() void SMESH_subMesh::InsertDependence(const TopoDS_Shape aSubShape) { //MESSAGE("SMESH_subMesh::InsertDependence"); - //SMESH_subMesh* aSubMesh = _father->GetSubMeshContaining(aSubShape); - //SCRUTE(aSubMesh); - //if (! aSubMesh) aSubMesh = _father->GetSubMesh(aSubShape); - SMESH_subMesh *aSubMesh = _father->GetSubMesh(aSubShape); int type = aSubShape.ShapeType(); int ordType = 9 - type; // 2 = Vertex, 8 = CompSolid @@ -551,31 +487,6 @@ void SMESH_subMesh::InsertDependence(const TopoDS_Shape aSubShape) } -//============================================================================= -/*! - * For collection shapes (compsolid, shell, wire). - * Add only subMesh figuring only once in multiset to dependence list - */ -//============================================================================= - -// void SMESH_subMesh::FinalizeDependence(list& shapeList) -// { -// //MESSAGE("SMESH_subMesh::FinalizeDependence"); -// list::iterator it1, it2; -// for(it1 = shapeList.begin(); it1 != shapeList.end(); it1++) -// { -// TopoDS_Shape aSubShape = (*it1); -// int count = 0; -// for(it2 = shapeList.begin(); it2 != shapeList.end(); it2++) -// { -// TopoDS_Shape other = (*it2); -// if (other.IsSame(aSubShape)) count++; -// } -// if (count == 1) InsertDependence(aSubShape); -// SCRUTE(count); -// } -// } - //============================================================================= /*! * @@ -588,420 +499,467 @@ const TopoDS_Shape & SMESH_subMesh::GetSubShape() return _subShape; } + +//======================================================================= +//function : CanAddHypothesis +//purpose : return true if theHypothesis can be attached to me: +// its dimention is checked +//======================================================================= + +bool SMESH_subMesh::CanAddHypothesis(const SMESH_Hypothesis* theHypothesis) const +{ + int aHypDim = theHypothesis->GetDim(); + int aShapeDim = SMESH_Gen::GetShapeDim(_subShape); + if ( aHypDim <= aShapeDim ) + return true; +// if ( aHypDim < aShapeDim ) +// return ( _father->IsMainShape( _subShape )); + + return false; +} + +//======================================================================= +//function : IsApplicableHypotesis +//purpose : return true if theHypothesis can be used to mesh me: +// its shape type is checked +//======================================================================= + +bool SMESH_subMesh::IsApplicableHypotesis(const SMESH_Hypothesis* theHypothesis) const +{ + if ( theHypothesis->GetType() > SMESHDS_Hypothesis::PARAM_ALGO) + // algorithm + return ( theHypothesis->GetShapeType() & (1<< _subShape.ShapeType())); + + // hypothesis + switch ( _subShape.ShapeType() ) { + case TopAbs_EDGE: + case TopAbs_FACE: + case TopAbs_SHELL: + case TopAbs_SOLID: { + int aHypDim = theHypothesis->GetDim(); + int aShapeDim = SMESH_Gen::GetShapeDim(_subShape); + return ( aHypDim == aShapeDim ); + } +// case TopAbs_VERTEX: +// case TopAbs_WIRE: +// case TopAbs_COMPSOLID: +// case TopAbs_COMPOUND: + default:; + } + + return false; +} + //============================================================================= /*! * */ //============================================================================= -bool SMESH_subMesh::AlgoStateEngine(int event, SMESH_Hypothesis * anHyp) -throw(SALOME_Exception) +SMESH_Hypothesis::Hypothesis_Status + SMESH_subMesh::AlgoStateEngine(int event, SMESH_Hypothesis * anHyp) { - // MESSAGE("SMESH_subMesh::AlgoStateEngine"); - //SCRUTE(_algoState); - //SCRUTE(event); - - // **** les retour des evenement shape sont significatifs - // (add ou remove fait ou non) - // le retour des evenement father n'indiquent pas que add ou remove fait - int dim = SMESH_Gen::GetShapeDim(_subShape); - - if (dim < 1) - { - _algoState = HYP_OK; - //SCRUTE(_algoState); - return true; - } - - SMESH_Gen *gen = _father->GetGen(); - bool ret; - _oldAlgoState = _algoState; - bool modifiedHyp = false; // if set to true, force event MODIF_ALGO_STATE - // in ComputeStateEngine - - switch (_algoState) - { - - // ---------------------------------------------------------------------- - - case NO_ALGO: - switch (event) - { - case ADD_HYP: - ASSERT(anHyp->GetType() == SMESHDS_Hypothesis::PARAM_ALGO); - ret = _meshDS->AddHypothesis(_subShape, anHyp); - break; - case ADD_ALGO: - ASSERT(anHyp->GetType() != SMESHDS_Hypothesis::PARAM_ALGO); - if (anHyp->GetDim() <= SMESH_Gen::GetShapeDim(_subShape)) - { - ret = _meshDS->AddHypothesis(_subShape, anHyp); -// if (ret &&(anHyp->GetDim() == SMESH_Gen::GetShapeDim(_subShape))) -// if (ret &&(anHyp->GetShapeType() == _subShape.ShapeType())) - if (ret && - (anHyp->GetShapeType() & (1 << _subShape.ShapeType()))) - { - SMESH_Algo *algo = gen->GetAlgo((*_father), _subShape); - ASSERT(algo); - ret = algo->CheckHypothesis((*_father), _subShape); - if (ret) - SetAlgoState(HYP_OK); - else - SetAlgoState(MISSING_HYP); - } - } - break; - case REMOVE_HYP: - ASSERT(anHyp->GetType() == SMESHDS_Hypothesis::PARAM_ALGO); - ret = _meshDS->RemoveHypothesis(_subShape, anHyp); - break; - case REMOVE_ALGO: - ASSERT(anHyp->GetType() != SMESHDS_Hypothesis::PARAM_ALGO); - ret = _meshDS->RemoveHypothesis(_subShape, anHyp); - break; - case ADD_FATHER_HYP: // nothing to do - break; - case ADD_FATHER_ALGO: // Algo just added in father - ASSERT(anHyp->GetType() != SMESHDS_Hypothesis::PARAM_ALGO); -// if (anHyp->GetDim() == SMESH_Gen::GetShapeDim(_subShape)) -// if (anHyp->GetShapeType() == _subShape.ShapeType()) - if (anHyp->GetShapeType() & (1 << _subShape.ShapeType())) - { - SMESH_Algo *algo = gen->GetAlgo((*_father), _subShape); - ASSERT(algo); - ret = algo->CheckHypothesis((*_father), _subShape); - if (ret) - SetAlgoState(HYP_OK); - else - SetAlgoState(MISSING_HYP); - } - break; - case REMOVE_FATHER_HYP: // nothing to do - break; - case REMOVE_FATHER_ALGO: // nothing to do - break; - default: - ASSERT(0); - break; - } - break; - - // ---------------------------------------------------------------------- - - case MISSING_HYP: - switch (event) - { - case ADD_HYP: - ASSERT(anHyp->GetType() == SMESHDS_Hypothesis::PARAM_ALGO); - ret = _meshDS->AddHypothesis(_subShape, anHyp); - if (ret) - { - SMESH_Algo *algo = gen->GetAlgo((*_father), _subShape); - ASSERT(algo); - ret = algo->CheckHypothesis((*_father), _subShape); - if (ret) - SetAlgoState(HYP_OK); - else - SetAlgoState(MISSING_HYP); - } - break; - case ADD_ALGO: //already existing algo : on father ? - ASSERT(anHyp->GetType() != SMESHDS_Hypothesis::PARAM_ALGO); - if (anHyp->GetDim() <= SMESH_Gen::GetShapeDim(_subShape)) - { - ret = _meshDS->AddHypothesis(_subShape, anHyp); -// if (ret &&(anHyp->GetDim() == SMESH_Gen::GetShapeDim(_subShape))) -// if (ret &&(anHyp->GetShapeType() == _subShape.ShapeType())) - if (ret && - (anHyp->GetShapeType() & (1 << _subShape.ShapeType()))) - { - SMESH_Algo *algo = gen->GetAlgo((*_father), _subShape); - if (algo == NULL) // two algo on the same subShape... - { - MESSAGE("two algo on the same subshape not allowed"); - ret = _meshDS->RemoveHypothesis(_subShape, anHyp); - ret = false; - } - else - { - ret = algo->CheckHypothesis((*_father), _subShape); - if (ret) - SetAlgoState(HYP_OK); - else - SetAlgoState(MISSING_HYP); - } - } - } - break; - case REMOVE_HYP: - ASSERT(anHyp->GetType() == SMESHDS_Hypothesis::PARAM_ALGO); - ret = _meshDS->RemoveHypothesis(_subShape, anHyp); - break; - case REMOVE_ALGO: // perhaps a father algo applies ? - ASSERT(anHyp->GetType() != SMESHDS_Hypothesis::PARAM_ALGO); - ret = _meshDS->RemoveHypothesis(_subShape, anHyp); -// if (ret &&(anHyp->GetDim() == SMESH_Gen::GetShapeDim(_subShape))) -// if (ret &&(anHyp->GetShapeType() == _subShape.ShapeType())) - if (ret && (anHyp->GetShapeType() & (1 << _subShape.ShapeType()))) - { - SMESH_Algo *algo = gen->GetAlgo((*_father), _subShape); - if (algo == NULL) // no more algo applying on subShape... - { - SetAlgoState(NO_ALGO); - } - else - { - ret = algo->CheckHypothesis((*_father), _subShape); - if (ret) - SetAlgoState(HYP_OK); - else - SetAlgoState(MISSING_HYP); - } - } - break; - case ADD_FATHER_HYP: - ASSERT(anHyp->GetType() == SMESHDS_Hypothesis::PARAM_ALGO); - { - SMESH_Algo *algo = gen->GetAlgo((*_father), _subShape); - ASSERT(algo); - ret = algo->CheckHypothesis((*_father), _subShape); - if (ret) - SetAlgoState(HYP_OK); - else - SetAlgoState(MISSING_HYP); - } - break; - case ADD_FATHER_ALGO: // detect if two algo of same dim on father - ASSERT(anHyp->GetType() != SMESHDS_Hypothesis::PARAM_ALGO); -// if (anHyp->GetDim() == SMESH_Gen::GetShapeDim(_subShape)) -// if (anHyp->GetShapeType() == _subShape.ShapeType()) - if (anHyp->GetShapeType() & (1 << _subShape.ShapeType())) - { - SMESH_Algo *algo = gen->GetAlgo((*_father), _subShape); - if (algo == NULL) // two applying algo on father - { - MESSAGE("two applying algo on fatherShape..."); - SetAlgoState(NO_ALGO); - } - else - { - ret = algo->CheckHypothesis((*_father), _subShape); - if (ret) - SetAlgoState(HYP_OK); - else - SetAlgoState(MISSING_HYP); - } - } - break; - case REMOVE_FATHER_HYP: // nothing to do - break; - case REMOVE_FATHER_ALGO: - ASSERT(anHyp->GetType() != SMESHDS_Hypothesis::PARAM_ALGO); -// if (anHyp->GetDim() == SMESH_Gen::GetShapeDim(_subShape)) -// if (anHyp->GetShapeType() == _subShape.ShapeType()) - if (anHyp->GetShapeType() & (1 << _subShape.ShapeType())) - { - SMESH_Algo *algo = gen->GetAlgo((*_father), _subShape); - if (algo == NULL) // no more applying algo on father - { - SetAlgoState(NO_ALGO); - } - else - { - ret = algo->CheckHypothesis((*_father), _subShape); - if (ret) - SetAlgoState(HYP_OK); - else - SetAlgoState(MISSING_HYP); - } - } - break; - default: - ASSERT(0); - break; - } - break; + // MESSAGE("SMESH_subMesh::AlgoStateEngine"); + //SCRUTE(_algoState); + //SCRUTE(event); + + // **** les retour des evenement shape sont significatifs + // (add ou remove fait ou non) + // le retour des evenement father n'indiquent pas que add ou remove fait + int dim = SMESH_Gen::GetShapeDim(_subShape); + + SMESH_Hypothesis::Hypothesis_Status aux_ret, ret = SMESH_Hypothesis::HYP_OK; + if (dim < 1) + { + _algoState = HYP_OK; + return ret; + } + + SMESH_Gen* gen =_father->GetGen(); +// bool ret = false; + int oldAlgoState = _algoState; + bool modifiedHyp = false; // if set to true, force event MODIF_ALGO_STATE + // in ComputeStateEngine + + // ---------------------- + // check mesh conformity + // ---------------------- + if (event == ADD_ALGO) + { + if (IsApplicableHypotesis( anHyp ) && + !_father->IsNotConformAllowed() && + !IsConform( static_cast< SMESH_Algo* >( anHyp ))) + return SMESH_Hypothesis::HYP_NOTCONFORM; + } + + // ---------------------------------- + // add a hypothesis to DS if possible + // ---------------------------------- + if (event == ADD_HYP || event == ADD_ALGO) + { + if ( ! CanAddHypothesis( anHyp )) + return SMESH_Hypothesis::HYP_BAD_DIM; + + if ( GetNbAttached( _subShape, anHyp ) > 0 ) + return SMESH_Hypothesis::HYP_ALREADY_EXIST; + + if ( !_meshDS->AddHypothesis(_subShape, anHyp)) + return SMESH_Hypothesis::HYP_ALREADY_EXIST; + } + + // -------------------------- + // remove a hypothesis from DS + // -------------------------- + if (event == REMOVE_HYP || event == REMOVE_ALGO) + { + if (!_meshDS->RemoveHypothesis(_subShape, anHyp)) + return SMESH_Hypothesis::HYP_OK; // nothing changes + } + + // ------------------ + // analyse algo state + // ------------------ + if (!IsApplicableHypotesis( anHyp )) + return ret; // not applicable hypotheses do not change algo state + + switch (_algoState) + { + + // ---------------------------------------------------------------------- + + case NO_ALGO: + switch (event) { + case ADD_HYP: + break; + case ADD_ALGO: { + SMESH_Algo* algo = gen->GetAlgo((*_father), _subShape); + ASSERT(algo); + if (algo->CheckHypothesis((*_father),_subShape, ret)) + SetAlgoState(HYP_OK); + else + SetAlgoState(MISSING_HYP); + break; + } + case REMOVE_HYP: + break; + case REMOVE_ALGO: + break; + case ADD_FATHER_HYP: + break; + case ADD_FATHER_ALGO: { // Algo just added in father + SMESH_Algo* algo = gen->GetAlgo((*_father), _subShape); + ASSERT(algo); + if ( algo == anHyp ) { + if ( algo->CheckHypothesis((*_father),_subShape, aux_ret)) + SetAlgoState(HYP_OK); + else + SetAlgoState(MISSING_HYP); + } + break; + } + case REMOVE_FATHER_HYP: + break; + case REMOVE_FATHER_ALGO: { + SMESH_Algo* algo = gen->GetAlgo((*_father), _subShape); + if (algo) + { + if ( algo->CheckHypothesis((*_father),_subShape, aux_ret )) + SetAlgoState(HYP_OK); + else + SetAlgoState(MISSING_HYP); + } + break; + } + default: + ASSERT(0); + break; + } + break; + + // ---------------------------------------------------------------------- + + case MISSING_HYP: + switch (event) + { + case ADD_HYP: { + SMESH_Algo* algo = gen->GetAlgo((*_father), _subShape); + ASSERT(algo); + if ( algo->CheckHypothesis((*_father),_subShape, ret )) + SetAlgoState(HYP_OK); + if (SMESH_Hypothesis::IsStatusFatal( ret )) + _meshDS->RemoveHypothesis(_subShape, anHyp); + else if (!_father->IsUsedHypothesis( anHyp, _subShape )) + { + _meshDS->RemoveHypothesis(_subShape, anHyp); + ret = SMESH_Hypothesis::HYP_INCOMPATIBLE; + } + break; + } + case ADD_ALGO: { //already existing algo : on father ? + SMESH_Algo* algo = gen->GetAlgo((*_father), _subShape); + ASSERT(algo); + if ( algo->CheckHypothesis((*_father),_subShape, aux_ret ))// ignore hyp status + SetAlgoState(HYP_OK); + else + SetAlgoState(MISSING_HYP); + break; + } + case REMOVE_HYP: + break; + case REMOVE_ALGO: { // perhaps a father algo applies ? + SMESH_Algo* algo = gen->GetAlgo((*_father), _subShape); + if (algo == NULL) // no more algo applying on subShape... + { + SetAlgoState(NO_ALGO); + } + else + { + if ( algo->CheckHypothesis((*_father),_subShape, aux_ret )) + SetAlgoState(HYP_OK); + else + SetAlgoState(MISSING_HYP); + } + break; + } + case ADD_FATHER_HYP: { + SMESH_Algo* algo = gen->GetAlgo((*_father), _subShape); + ASSERT(algo); + if ( algo->CheckHypothesis((*_father),_subShape, aux_ret )) + SetAlgoState(HYP_OK); + else + SetAlgoState(MISSING_HYP); + } + break; + case ADD_FATHER_ALGO: { // new father algo + SMESH_Algo* algo = gen->GetAlgo((*_father), _subShape); + ASSERT( algo ); + if ( algo == anHyp ) { + if ( algo->CheckHypothesis((*_father),_subShape, aux_ret )) + SetAlgoState(HYP_OK); + else + SetAlgoState(MISSING_HYP); + } + break; + } + case REMOVE_FATHER_HYP: // nothing to do + break; + case REMOVE_FATHER_ALGO: { + SMESH_Algo* algo = gen->GetAlgo((*_father), _subShape); + if (algo == NULL) // no more applying algo on father + { + SetAlgoState(NO_ALGO); + } + else + { + if ( algo->CheckHypothesis((*_father),_subShape , aux_ret )) + SetAlgoState(HYP_OK); + else + SetAlgoState(MISSING_HYP); + } + break; + } + default: + ASSERT(0); + break; + } + break; + + // ---------------------------------------------------------------------- + + case HYP_OK: + switch (event) + { + case ADD_HYP: { + SMESH_Algo* algo = gen->GetAlgo((*_father), _subShape); + ASSERT(algo); + if (!algo->CheckHypothesis((*_father),_subShape, ret )) + { + MESSAGE("two applying algo on the same shape not allowed"); + _meshDS->RemoveHypothesis(_subShape, anHyp); + //ret = SMESH_Hypothesis::HYP_ALREADY_EXIST; + } + else if (SMESH_Hypothesis::IsStatusFatal( ret )) + _meshDS->RemoveHypothesis(_subShape, anHyp); + else if (!_father->IsUsedHypothesis( anHyp, _subShape )) + { + _meshDS->RemoveHypothesis(_subShape, anHyp); + ret = SMESH_Hypothesis::HYP_INCOMPATIBLE; + } + modifiedHyp = _father->IsUsedHypothesis( anHyp, _subShape ); // new Hyp? + break; + } + case ADD_ALGO: { //already existing algo : on father ? + SMESH_Algo* algo = gen->GetAlgo((*_father), _subShape); + if ( algo->CheckHypothesis((*_father),_subShape, aux_ret )) + SetAlgoState(HYP_OK); + else + SetAlgoState(MISSING_HYP); + modifiedHyp = true; + break; + } + case REMOVE_HYP: { + SMESH_Algo* algo = gen->GetAlgo((*_father), _subShape); + ASSERT(algo); + if ( algo->CheckHypothesis((*_father),_subShape, aux_ret )) + SetAlgoState(HYP_OK); + else + SetAlgoState(MISSING_HYP); + modifiedHyp = true; + // report only severe errors + if ( SMESH_Hypothesis::IsStatusFatal( aux_ret )) + ret = aux_ret; + break; + } + case REMOVE_ALGO: { // perhaps a father algo applies ? + SMESH_Algo* algo = gen->GetAlgo((*_father), _subShape); + if (algo == NULL) // no more algo applying on subShape... + { + SetAlgoState(NO_ALGO); + } + else + { + if ( algo->CheckHypothesis((*_father),_subShape, aux_ret )) + SetAlgoState(HYP_OK); + else + SetAlgoState(MISSING_HYP); + modifiedHyp = true; + // report only severe errors + if ( SMESH_Hypothesis::IsStatusFatal( aux_ret )) + ret = aux_ret; + } + break; + } + case ADD_FATHER_HYP: { // new father hypothesis ? + SMESH_Algo* algo = gen->GetAlgo((*_father), _subShape); + ASSERT(algo); + if ( algo->CheckHypothesis((*_father),_subShape, aux_ret )) + { + SetAlgoState(HYP_OK); + if (_father->IsUsedHypothesis( anHyp, _subShape )) // new Hyp + modifiedHyp = true; + } + else + SetAlgoState(MISSING_HYP); + break; + } + case ADD_FATHER_ALGO: { // a new algo on father + SMESH_Algo* algo = gen->GetAlgo((*_father), _subShape); + if ( algo == anHyp ) { + if ( algo->CheckHypothesis((*_father),_subShape, aux_ret )) + SetAlgoState(HYP_OK); + else + SetAlgoState(MISSING_HYP); + modifiedHyp = true; + } + break; + } + case REMOVE_FATHER_HYP: { + SMESH_Algo* algo = gen->GetAlgo((*_father), _subShape); + ASSERT(algo); + if ( algo->CheckHypothesis((*_father),_subShape, aux_ret )) + SetAlgoState(HYP_OK); + else + SetAlgoState(MISSING_HYP); + modifiedHyp = true; + break; + } + case REMOVE_FATHER_ALGO: { + SMESH_Algo* algo = gen->GetAlgo((*_father), _subShape); + if (algo == NULL) // no more applying algo on father + { + SetAlgoState(NO_ALGO); + } + else + { + if ( algo->CheckHypothesis((*_father),_subShape, aux_ret )) + SetAlgoState(HYP_OK); + else + SetAlgoState(MISSING_HYP); + modifiedHyp = true; + } + break; + } + default: + ASSERT(0); + break; + } + break; + + // ---------------------------------------------------------------------- + + default: + ASSERT(0); + break; + } + // ---------------------------------------- + // check concurent hypotheses on ansestors + // ---------------------------------------- + if (ret < SMESH_Hypothesis::HYP_CONCURENT && + (event == ADD_FATHER_HYP || + event == ADD_FATHER_ALGO || + event == REMOVE_FATHER_HYP || + event == REMOVE_FATHER_ALGO || + event == REMOVE_ALGO || + event == REMOVE_HYP)) + { + ret = CheckConcurentHypothesis( anHyp->GetType() ); + } + + if ((_algoState != oldAlgoState) || modifiedHyp) + int retc = ComputeStateEngine(MODIF_ALGO_STATE); + + return ret; +} - // ---------------------------------------------------------------------- - case HYP_OK: - switch (event) - { - case ADD_HYP: - { - ASSERT(anHyp->GetType() == SMESHDS_Hypothesis::PARAM_ALGO); - SMESH_Algo *algo = gen->GetAlgo((*_father), _subShape); - ASSERT(algo); - list originalUsedHyps = algo->GetUsedHypothesis((*_father), _subShape); // copy +//======================================================================= +//function : IsConform +//purpose : check if a conform mesh will be produced by the Algo +//======================================================================= - ret = _meshDS->AddHypothesis(_subShape, anHyp); - if (ret) - { - ret = algo->CheckHypothesis((*_father), _subShape); - if (!ret) - { - INFOS("two applying algo on the same shape not allowed"); - ret = _meshDS->RemoveHypothesis(_subShape, anHyp); - ret = false; - } - else // compare SMESHDS_Hypothesis* lists (order important) - { - MESSAGE("---"); - const list & newUsedHyps - = algo->GetUsedHypothesis((*_father), _subShape); - modifiedHyp = (originalUsedHyps != newUsedHyps); - } - } - } - break; - case ADD_ALGO: //already existing algo : on father ? - ASSERT(anHyp->GetType() != SMESHDS_Hypothesis::PARAM_ALGO); - if (anHyp->GetDim() <= SMESH_Gen::GetShapeDim(_subShape)) - { - ret = _meshDS->AddHypothesis(_subShape, anHyp); -// if (ret &&(anHyp->GetDim() == SMESH_Gen::GetShapeDim(_subShape))) -// if (ret &&(anHyp->GetShapeType() == _subShape.ShapeType())) - if (ret && - (anHyp->GetShapeType() & (1 << _subShape.ShapeType()))) - { - SMESH_Algo *algo = gen->GetAlgo((*_father), _subShape); - if (algo == NULL) // two algo on the same subShape... - { - INFOS("two algo on the same subshape not allowed"); - ret = _meshDS->RemoveHypothesis(_subShape, anHyp); - ret = false; - } - else - { - ret = algo->CheckHypothesis((*_father), _subShape); - if (ret) - SetAlgoState(HYP_OK); - else - SetAlgoState(MISSING_HYP); - } - } - } - break; - case REMOVE_HYP: - ASSERT(anHyp->GetType() == SMESHDS_Hypothesis::PARAM_ALGO); - ret = _meshDS->RemoveHypothesis(_subShape, anHyp); - if (ret) - { - SMESH_Algo *algo = gen->GetAlgo((*_father), _subShape); - ASSERT(algo); - ret = algo->CheckHypothesis((*_father), _subShape); - if (ret) - SetAlgoState(HYP_OK); - else - SetAlgoState(MISSING_HYP); - modifiedHyp = true; - } - break; - case REMOVE_ALGO: // perhaps a father algo applies ? - ASSERT(anHyp->GetType() != SMESHDS_Hypothesis::PARAM_ALGO); - ret = _meshDS->RemoveHypothesis(_subShape, anHyp); -// if (ret &&(anHyp->GetDim() == SMESH_Gen::GetShapeDim(_subShape))) -// if (ret &&(anHyp->GetShapeType() == _subShape.ShapeType())) - if (ret && (anHyp->GetShapeType() & (1 << _subShape.ShapeType()))) - { - SMESH_Algo *algo = gen->GetAlgo((*_father), _subShape); - if (algo == NULL) // no more algo applying on subShape... - { - SetAlgoState(NO_ALGO); - } - else - { - ret = algo->CheckHypothesis((*_father), _subShape); - if (ret) - SetAlgoState(HYP_OK); - else - SetAlgoState(MISSING_HYP); - } - } - break; - case ADD_FATHER_HYP: - ASSERT(anHyp->GetType() == SMESHDS_Hypothesis::PARAM_ALGO); - { - SMESH_Algo *algo = gen->GetAlgo((*_father), _subShape); - ASSERT(algo); - ret = algo->CheckHypothesis((*_father), _subShape); - if (ret) - SetAlgoState(HYP_OK); - else - SetAlgoState(MISSING_HYP); - } - break; - case ADD_FATHER_ALGO: // detect if two algo of same dim on father - ASSERT(anHyp->GetType() != SMESHDS_Hypothesis::PARAM_ALGO); -// if (anHyp->GetDim() == SMESH_Gen::GetShapeDim(_subShape)) -// if (anHyp->GetShapeType() == _subShape.ShapeType()) - if (anHyp->GetShapeType() & (1 << _subShape.ShapeType())) - { - SMESH_Algo *algo = gen->GetAlgo((*_father), _subShape); - if (algo == NULL) // two applying algo on father - { - MESSAGE("two applying algo on fatherShape..."); - SetAlgoState(NO_ALGO); - } - else - { - ret = algo->CheckHypothesis((*_father), _subShape); - if (ret) - SetAlgoState(HYP_OK); - else - SetAlgoState(MISSING_HYP); - } - } - break; - case REMOVE_FATHER_HYP: - ASSERT(anHyp->GetType() == SMESHDS_Hypothesis::PARAM_ALGO); - { - SMESH_Algo *algo = gen->GetAlgo((*_father), _subShape); - ASSERT(algo); - ret = algo->CheckHypothesis((*_father), _subShape); - if (ret) - SetAlgoState(HYP_OK); - else - SetAlgoState(MISSING_HYP); - } - break; - case REMOVE_FATHER_ALGO: - ASSERT(anHyp->GetType() != SMESHDS_Hypothesis::PARAM_ALGO); -// if (anHyp->GetDim() == SMESH_Gen::GetShapeDim(_subShape)) -// if (anHyp->GetShapeType() == _subShape.ShapeType()) - if (anHyp->GetShapeType() & (1 << _subShape.ShapeType())) - { - SMESH_Algo *algo = gen->GetAlgo((*_father), _subShape); - if (algo == NULL) // no more applying algo on father - { - SetAlgoState(NO_ALGO); - } - else - { - ret = algo->CheckHypothesis((*_father), _subShape); - if (ret) - SetAlgoState(HYP_OK); - else - SetAlgoState(MISSING_HYP); - } - } - break; - default: - ASSERT(0); - break; - } - break; - - // ---------------------------------------------------------------------- - - default: - ASSERT(0); - break; - } - //SCRUTE(_algoState); - if ((_algoState != _oldAlgoState) || modifiedHyp) - int retc = ComputeStateEngine(MODIF_ALGO_STATE); - return ret; +bool SMESH_subMesh::IsConform(const SMESH_Algo* theAlgo) +{ + MESSAGE( "SMESH_subMesh::IsConform" ); + + if ( !theAlgo ) return false; + + // check only algo that doesn't NeedDescretBoundary(): because mesh made + // on a sub-shape will be ignored by theAlgo + if ( theAlgo->NeedDescretBoundary() ) + return true; + + SMESH_Gen* gen =_father->GetGen(); + + // only local algo is to be checked + if ( gen->IsGlobalAlgo( theAlgo, *_father )) + return true; + + // check algo attached to adjacent shapes + + // loop on one level down sub-meshes + TopoDS_Iterator itsub( _subShape ); + for (; itsub.More(); itsub.Next()) + { + // loop on adjacent subShapes + TopTools_ListIteratorOfListOfShape it( _father->GetAncestors( itsub.Value() )); + for (; it.More(); it.Next()) + { + const TopoDS_Shape& adjacent = it.Value(); + if ( _subShape.IsSame( adjacent )) continue; + if ( adjacent.ShapeType() != _subShape.ShapeType()) + break; + + // check algo attached to smAdjacent + SMESH_Algo * algo = gen->GetAlgo((*_father), adjacent); + if (algo && + //algo != theAlgo && + !algo->NeedDescretBoundary() /*&& + !gen->IsGlobalAlgo( algo, *_father )*/) + return false; // NOT CONFORM MESH WILL BE PRODUCED + } + } + + return true; } //============================================================================= @@ -1012,7 +970,7 @@ throw(SALOME_Exception) void SMESH_subMesh::SetAlgoState(int state) { - if (state != _oldAlgoState) +// if (state != _oldAlgoState) // int retc = ComputeStateEngine(MODIF_ALGO_STATE); _algoState = state; } @@ -1022,13 +980,15 @@ void SMESH_subMesh::SetAlgoState(int state) * */ //============================================================================= - -void SMESH_subMesh::SubMeshesAlgoStateEngine(int event, - SMESH_Hypothesis * anHyp) throw(SALOME_Exception) +SMESH_Hypothesis::Hypothesis_Status + SMESH_subMesh::SubMeshesAlgoStateEngine(int event, + SMESH_Hypothesis * anHyp) { //MESSAGE("SMESH_subMesh::SubMeshesAlgoStateEngine"); - int dim = SMESH_Gen::GetShapeDim(_subShape); - if (dim > 1) + SMESH_Hypothesis::Hypothesis_Status ret = SMESH_Hypothesis::HYP_OK; + //EAP: a wire (dim==1) should notify edges (dim==1) + //EAP: int dim = SMESH_Gen::GetShapeDim(_subShape); + if (/*EAP:dim > 1*/ _subShape.ShapeType() < TopAbs_EDGE ) { const map < int, SMESH_subMesh * >&subMeshes = DependsOn(); @@ -1036,9 +996,36 @@ void SMESH_subMesh::SubMeshesAlgoStateEngine(int event, for (itsub = subMeshes.begin(); itsub != subMeshes.end(); itsub++) { SMESH_subMesh *sm = (*itsub).second; - sm->AlgoStateEngine(event, anHyp); + SMESH_Hypothesis::Hypothesis_Status ret2 = + sm->AlgoStateEngine(event, anHyp); + if ( ret2 > ret ) + ret = ret2; } } + return ret; +} + +//============================================================================= +/*! + * + */ +//============================================================================= + +void SMESH_subMesh::CleanDependsOn() +{ + MESSAGE("SMESH_subMesh::CleanDependsOn"); + // **** parcourir les ancetres dans l'ordre de dépendance + + ComputeStateEngine(CLEAN); + + const map < int, SMESH_subMesh * >&dependson = DependsOn(); + map < int, SMESH_subMesh * >::const_iterator its; + for (its = dependson.begin(); its != dependson.end(); its++) + { + SMESH_subMesh *sm = (*its).second; + SCRUTE((*its).first); + sm->ComputeStateEngine(CLEAN); + } } //============================================================================= @@ -1099,217 +1086,340 @@ void SMESH_subMesh::DumpAlgoState(bool isMain) */ //============================================================================= -bool SMESH_subMesh::ComputeStateEngine(int event) throw(SALOME_Exception) +bool SMESH_subMesh::ComputeStateEngine(int event) { - //MESSAGE("SMESH_subMesh::ComputeStateEngine"); - //SCRUTE(_computeState); - //SCRUTE(event); - - int dim = SMESH_Gen::GetShapeDim(_subShape); + //MESSAGE("SMESH_subMesh::ComputeStateEngine"); + //SCRUTE(_computeState); + //SCRUTE(event); + + int dim = SMESH_Gen::GetShapeDim(_subShape); + + if (dim < 1) + { + if (_vertexSet) + _computeState = COMPUTE_OK; + else + _computeState = READY_TO_COMPUTE; + //SCRUTE(_computeState); + return true; + } + SMESH_Gen *gen = _father->GetGen(); + SMESH_Algo *algo = 0; + bool ret; + SMESH_Hypothesis::Hypothesis_Status hyp_status; + + switch (_computeState) + { + + // ---------------------------------------------------------------------- + + case NOT_READY: + switch (event) + { + case MODIF_HYP: // nothing to do + break; + case MODIF_ALGO_STATE: + if (_algoState == HYP_OK) + { + _computeState = READY_TO_COMPUTE; + } + break; + case COMPUTE: // nothing to do + break; + case CLEAN: + RemoveSubMeshElementsAndNodes(); + break; + case CLEANDEP: + CleanDependants(); + break; + case SUBMESH_COMPUTED: // nothing to do + break; + case SUBMESH_RESTORED: + ComputeSubMeshStateEngine( SUBMESH_RESTORED ); + break; + default: + ASSERT(0); + break; + } + break; + + // ---------------------------------------------------------------------- + + case READY_TO_COMPUTE: + switch (event) + { + case MODIF_HYP: // nothing to do + break; + case MODIF_ALGO_STATE: + _computeState = NOT_READY; + algo = gen->GetAlgo((*_father), _subShape); + if (algo) + { + ret = algo->CheckHypothesis((*_father), _subShape, hyp_status); + if (ret) + _computeState = READY_TO_COMPUTE; + } + break; + case COMPUTE: + { + algo = gen->GetAlgo((*_father), _subShape); + ASSERT(algo); + ret = algo->CheckHypothesis((*_father), _subShape, hyp_status); + if (!ret) + { + MESSAGE("***** verify compute state *****"); + _computeState = NOT_READY; + break; + } + // check submeshes needed + if (algo->NeedDescretBoundary()) + ret = SubMeshesComputed(); + if (!ret) + { + MESSAGE("Some SubMeshes not computed"); + _computeState = FAILED_TO_COMPUTE; + break; + } + // compute + if (!algo->NeedDescretBoundary() && !algo->OnlyUnaryInput()) + ret = ApplyToCollection( algo, GetCollection( gen, algo ) ); + else + ret = algo->Compute((*_father), _subShape); + + if (!ret) + { + MESSAGE("problem in algo execution: failed to compute"); + _computeState = FAILED_TO_COMPUTE; + if (!algo->NeedDescretBoundary()) + UpdateSubMeshState( FAILED_TO_COMPUTE ); + break; + } + else + { + _computeState = COMPUTE_OK; + UpdateDependantsState( SUBMESH_COMPUTED ); // send event SUBMESH_COMPUTED + if (!algo->NeedDescretBoundary()) + UpdateSubMeshState( COMPUTE_OK ); + } + } + break; + case CLEAN: + RemoveSubMeshElementsAndNodes(); + _computeState = NOT_READY; + algo = gen->GetAlgo((*_father), _subShape); + if (algo) + { + ret = algo->CheckHypothesis((*_father), _subShape, hyp_status); + if (ret) + _computeState = READY_TO_COMPUTE; + } + break; + case CLEANDEP: + CleanDependants(); + break; + case SUBMESH_COMPUTED: // nothing to do + break; + case SUBMESH_RESTORED: + // check if a mesh is already computed that may + // happen after retrieval from a file + if ( IsMeshComputed() ) { + _computeState = COMPUTE_OK; + } + ComputeSubMeshStateEngine( SUBMESH_RESTORED ); + break; + default: + ASSERT(0); + break; + } + break; + + // ---------------------------------------------------------------------- + + case COMPUTE_OK: + switch (event) + { + case MODIF_HYP: + CleanDependants(); // recursive recall with event CLEANDEP + algo = gen->GetAlgo((*_father), _subShape); + if (algo && !algo->NeedDescretBoundary()) + CleanDependsOn(); // remove sub-mesh with event CLEANDEP + break; + case MODIF_ALGO_STATE: + CleanDependants(); // recursive recall with event CLEANDEP + algo = gen->GetAlgo((*_father), _subShape); + if (algo && !algo->NeedDescretBoundary()) + CleanDependsOn(); // remove sub-mesh with event CLEANDEP + break; + case COMPUTE: // nothing to do + break; + case CLEAN: + RemoveSubMeshElementsAndNodes(); + _computeState = NOT_READY; + algo = gen->GetAlgo((*_father), _subShape); + if (algo) + { + ret = algo->CheckHypothesis((*_father), _subShape, hyp_status); + if (ret) + _computeState = READY_TO_COMPUTE; + } + break; + case CLEANDEP: + CleanDependants(); // recursive recall with event CLEANDEP + break; + case SUBMESH_COMPUTED: // nothing to do + break; + case SUBMESH_RESTORED: + ComputeSubMeshStateEngine( SUBMESH_RESTORED ); + break; + default: + ASSERT(0); + break; + } + break; + + // ---------------------------------------------------------------------- + + case FAILED_TO_COMPUTE: + switch (event) + { + case MODIF_HYP: + if (_algoState == HYP_OK) + _computeState = READY_TO_COMPUTE; + else + _computeState = NOT_READY; + break; + case MODIF_ALGO_STATE: + if (_algoState == HYP_OK) + _computeState = READY_TO_COMPUTE; + else + _computeState = NOT_READY; + break; + case COMPUTE: // nothing to do + break; + case CLEAN: + RemoveSubMeshElementsAndNodes(); + if (_algoState == HYP_OK) + _computeState = READY_TO_COMPUTE; + else + _computeState = NOT_READY; + break; + case CLEANDEP: + CleanDependants(); + break; + case SUBMESH_COMPUTED: // allow retry compute + if (_algoState == HYP_OK) + _computeState = READY_TO_COMPUTE; + else + _computeState = NOT_READY; + break; + case SUBMESH_RESTORED: + ComputeSubMeshStateEngine( SUBMESH_RESTORED ); + break; + default: + ASSERT(0); + break; + } + break; + + // ---------------------------------------------------------------------- + default: + ASSERT(0); + break; + } + + //SCRUTE(_computeState); + return ret; +} - if (dim < 1) - { - if (_vertexSet) - _computeState = COMPUTE_OK; - else - _computeState = READY_TO_COMPUTE; - //SCRUTE(_computeState); - return true; - } - SMESH_Gen *gen = _father->GetGen(); - SMESH_Algo *algo = 0; - bool ret; +//======================================================================= +//function : ApplyToCollection +//purpose : Apply theAlgo to all subshapes in theCollection +//======================================================================= - switch (_computeState) - { - - // ---------------------------------------------------------------------- +bool SMESH_subMesh::ApplyToCollection (SMESH_Algo* theAlgo, + const TopoDS_Shape& theCollection) +{ + MESSAGE("SMESH_subMesh::ApplyToCollection"); + ASSERT ( !theAlgo->NeedDescretBoundary() ); + + bool ret = false; + + + ret = theAlgo->Compute( *_father, theCollection ); + + // set _computeState of subshapes + TopExp_Explorer anExplorer( theCollection, _subShape.ShapeType() ); + for ( ; anExplorer.More(); anExplorer.Next() ) + { + const TopoDS_Shape& aSubShape = anExplorer.Current(); + SMESH_subMesh* subMesh = _father->GetSubMeshContaining( aSubShape ); + if ( subMesh ) + { + if (ret) + { + subMesh->_computeState = COMPUTE_OK; + subMesh->UpdateDependantsState( SUBMESH_COMPUTED ); + subMesh->UpdateSubMeshState( COMPUTE_OK ); + } + else + { + subMesh->_computeState = FAILED_TO_COMPUTE; + } + } + } + return ret; +} - case NOT_READY: - switch (event) - { - case MODIF_HYP: // nothing to do - break; - case MODIF_ALGO_STATE: - if (_algoState == HYP_OK) - _computeState = READY_TO_COMPUTE; - break; - case COMPUTE: // nothing to do - break; - case CLEAN: // nothing to do - break; - case CLEANDEP: // nothing to do - RemoveSubMeshElementsAndNodes(); // recursive call... - break; - case SUBMESH_COMPUTED: // nothing to do - break; - default: - ASSERT(0); - break; - } - break; - // ---------------------------------------------------------------------- +//======================================================================= +//function : UpdateSubMeshState +//purpose : +//======================================================================= - case READY_TO_COMPUTE: - switch (event) - { - case MODIF_HYP: // nothing to do - break; - case MODIF_ALGO_STATE: - _computeState = NOT_READY; - algo = gen->GetAlgo((*_father), _subShape); - if (algo) - { - ret = algo->CheckHypothesis((*_father), _subShape); - if (ret) - _computeState = READY_TO_COMPUTE; - } - break; - case COMPUTE: - { - algo = gen->GetAlgo((*_father), _subShape); - ASSERT(algo); - ret = algo->CheckHypothesis((*_father), _subShape); - if (!ret) - { - MESSAGE("***** verify compute state *****"); - _computeState = NOT_READY; - break; - } - ret = SubMeshesComputed(); - if (!ret) - { - MESSAGE("Some SubMeshes not computed"); - _computeState = FAILED_TO_COMPUTE; - break; - } - ret = algo->Compute((*_father), _subShape); - if (!ret) - { - MESSAGE("problem in algo execution: failed to compute"); - _computeState = FAILED_TO_COMPUTE; - break; - } - else - { - _computeState = COMPUTE_OK; - UpdateDependantsState(); // send event SUBMESH_COMPUTED - } - } - break; - case CLEAN: - _computeState = NOT_READY; - algo = gen->GetAlgo((*_father), _subShape); - if (algo) - { - ret = algo->CheckHypothesis((*_father), _subShape); - if (ret) - _computeState = READY_TO_COMPUTE; - } - break; - case CLEANDEP: - RemoveSubMeshElementsAndNodes(); - _computeState = NOT_READY; - algo = gen->GetAlgo((*_father), _subShape); - if (algo) - { - ret = algo->CheckHypothesis((*_father), _subShape); - if (ret) - _computeState = READY_TO_COMPUTE; - } - break; - case SUBMESH_COMPUTED: // nothing to do - break; - default: - ASSERT(0); - break; - } - break; - - // ---------------------------------------------------------------------- - - case COMPUTE_OK: - switch (event) - { - case MODIF_HYP: - CleanDependants(); // recursive recall with event CLEANDEP - break; - case MODIF_ALGO_STATE: - CleanDependants(); // recursive recall with event CLEANDEP - break; - case COMPUTE: // nothing to do - break; - case CLEAN: - CleanDependants(); // recursive recall with event CLEANDEP - break; - case CLEANDEP: - RemoveSubMeshElementsAndNodes(); - _computeState = NOT_READY; - algo = gen->GetAlgo((*_father), _subShape); - if (algo) - { - ret = algo->CheckHypothesis((*_father), _subShape); - if (ret) - _computeState = READY_TO_COMPUTE; - } - break; - case SUBMESH_COMPUTED: // nothing to do - break; - default: - ASSERT(0); - break; - } - break; +void SMESH_subMesh::UpdateSubMeshState(const compute_state theState) +{ + const map& smMap = DependsOn(); + map::const_iterator itsub; + for (itsub = smMap.begin(); itsub != smMap.end(); itsub++) + { + SMESH_subMesh* sm = (*itsub).second; + sm->_computeState = theState; + } +} - // ---------------------------------------------------------------------- +//======================================================================= +//function : ComputeSubMeshStateEngine +//purpose : +//======================================================================= - case FAILED_TO_COMPUTE: - switch (event) - { - case MODIF_HYP: - if (_algoState == HYP_OK) - _computeState = READY_TO_COMPUTE; - else - _computeState = NOT_READY; - break; - case MODIF_ALGO_STATE: - if (_algoState == HYP_OK) - _computeState = READY_TO_COMPUTE; - else - _computeState = NOT_READY; - break; - case COMPUTE: // nothing to do - break; - case CLEAN: - break; - case CLEANDEP: - RemoveSubMeshElementsAndNodes(); - if (_algoState == HYP_OK) - _computeState = READY_TO_COMPUTE; - else - _computeState = NOT_READY; - break; - case SUBMESH_COMPUTED: // allow retry compute - if (_algoState == HYP_OK) - _computeState = READY_TO_COMPUTE; - else - _computeState = NOT_READY; - break; - default: - ASSERT(0); - break; - } - break; +void SMESH_subMesh::ComputeSubMeshStateEngine(int event) +{ + const map& smMap = DependsOn(); + map::const_iterator itsub; + for (itsub = smMap.begin(); itsub != smMap.end(); itsub++) + { + SMESH_subMesh* sm = (*itsub).second; + sm->ComputeStateEngine(event); + } +} - // ---------------------------------------------------------------------- - default: - ASSERT(0); - break; - } +//======================================================================= +//function : UpdateDependantsState +//purpose : +//======================================================================= - //SCRUTE(_computeState); - return ret; +void SMESH_subMesh::UpdateDependantsState(const compute_event theEvent) +{ + //MESSAGE("SMESH_subMesh::UpdateDependantsState"); + TopTools_ListIteratorOfListOfShape it( _father->GetAncestors( _subShape )); + for (; it.More(); it.Next()) + { + const TopoDS_Shape& ancestor = it.Value(); + SMESH_subMesh *aSubMesh = + _father->GetSubMeshContaining(ancestor); + if (aSubMesh) + aSubMesh->ComputeStateEngine( theEvent ); + } } //============================================================================= @@ -1318,40 +1428,49 @@ bool SMESH_subMesh::ComputeStateEngine(int event) throw(SALOME_Exception) */ //============================================================================= -void SMESH_subMesh::UpdateDependantsState() +void SMESH_subMesh::CleanDependants() { - //MESSAGE("SMESH_subMesh::UpdateDependantsState"); - - const map < int, SMESH_subMesh * >&dependants = Dependants(); - map < int, SMESH_subMesh * >::const_iterator its; - for (its = dependants.begin(); its != dependants.end(); its++) - { - SMESH_subMesh *sm = (*its).second; - //SCRUTE((*its).first); - sm->ComputeStateEngine(SUBMESH_COMPUTED); - } + //MESSAGE("SMESH_subMesh::CleanDependants: shape type " << _subShape.ShapeType() ); + + TopTools_ListIteratorOfListOfShape it( _father->GetAncestors( _subShape )); + for (; it.More(); it.Next()) + { + const TopoDS_Shape& ancestor = it.Value(); + //MESSAGE("ancestor shape type " << ancestor.ShapeType() ); + SMESH_subMesh *aSubMesh = _father->GetSubMeshContaining(ancestor); + if (aSubMesh) + aSubMesh->ComputeStateEngine(CLEANDEP); + } + ComputeStateEngine(CLEAN); } + //============================================================================= /*! * */ //============================================================================= -void SMESH_subMesh::CleanDependants() +static void removeSubMesh( SMESHDS_Mesh * meshDS, const TopoDS_Shape& subShape) { - MESSAGE("SMESH_subMesh::CleanDependants"); - // **** parcourir les ancetres dans l'ordre de dépendance - - const map < int, SMESH_subMesh * >&dependants = Dependants(); - map < int, SMESH_subMesh * >::const_iterator its; - for (its = dependants.begin(); its != dependants.end(); its++) - { - SMESH_subMesh *sm = (*its).second; - SCRUTE((*its).first); - sm->ComputeStateEngine(CLEANDEP); - } - ComputeStateEngine(CLEANDEP); + SMESHDS_SubMesh * subMeshDS = meshDS->MeshElements(subShape); + if (subMeshDS!=NULL) + { + SMDS_ElemIteratorPtr ite=subMeshDS->GetElements(); + while(ite->more()) + { + const SMDS_MeshElement * elt = ite->next(); + //MESSAGE( " RM elt: "<GetID()<<" ( "<NbNodes()<<" )" ); + meshDS->RemoveElement(elt); + } + + SMDS_NodeIteratorPtr itn=subMeshDS->GetNodes(); + while(itn->more()) + { + const SMDS_MeshNode * node = itn->next(); + meshDS->RemoveNode(node); + } + } } //============================================================================= @@ -1362,161 +1481,173 @@ void SMESH_subMesh::CleanDependants() void SMESH_subMesh::RemoveSubMeshElementsAndNodes() { - MESSAGE("SMESH_subMesh::RemoveSubMeshElementsAndNodes"); - SCRUTE(_subShape.ShapeType()); - SCRUTE(_Id); - - _subMeshDS = _meshDS->MeshElements(_subShape); - if (_subMeshDS!=NULL) - { - SMDS_Iterator * ite=_subMeshDS->GetElements(); - while(ite->more()) - { - const SMDS_MeshElement * elt = ite->next(); - _subMeshDS->RemoveElement(elt); - _meshDS->RemoveElement(elt); - } - delete ite; - - SMDS_Iterator * itn=_subMeshDS->GetNodes(); - while(itn->more()) - { - const SMDS_MeshNode * node = itn->next(); - _subMeshDS->RemoveNode(node); - _meshDS->RemoveNode(node); - } - delete itn; - } + SCRUTE(_subShape.ShapeType()); + + removeSubMesh( _meshDS, _subShape ); + + // algo may bind a submesh not to _subShape, eg 3D algo + // sets nodes on SHELL while _subShape may be SOLID + + int dim = SMESH_Gen::GetShapeDim( _subShape ); + int type = _subShape.ShapeType() + 1; + for ( ; type <= TopAbs_EDGE; type++) + if ( dim == SMESH_Gen::GetShapeDim( (TopAbs_ShapeEnum) type )) + { + TopExp_Explorer exp( _subShape, (TopAbs_ShapeEnum) type ); + for ( ; exp.More(); exp.Next() ) + removeSubMesh( _meshDS, exp.Current() ); + } + else + break; } -//============================================================================= -/*! - * - */ -//============================================================================= +//======================================================================= +//function : IsMeshComputed +//purpose : check if _subMeshDS contains mesh elements +//======================================================================= -const map < int, SMESH_subMesh * >&SMESH_subMesh::Dependants() +bool SMESH_subMesh::IsMeshComputed() const { - if (_dependantsFound) - return _mapDependants; + // algo may bind a submesh not to _subShape, eg 3D algo + // sets nodes on SHELL while _subShape may be SOLID + + int dim = SMESH_Gen::GetShapeDim( _subShape ); + int type = _subShape.ShapeType(); + for ( ; type <= TopAbs_VERTEX; type++) { + if ( dim == SMESH_Gen::GetShapeDim( (TopAbs_ShapeEnum) type )) + { + TopExp_Explorer exp( _subShape, (TopAbs_ShapeEnum) type ); + for ( ; exp.More(); exp.Next() ) + { + SMESHDS_SubMesh * subMeshDS = _meshDS->MeshElements( exp.Current() ); + if ( subMeshDS != NULL && + (subMeshDS->GetElements()->more() || subMeshDS->GetNodes()->more())) { + return true; + } + } + } + else + break; + } + + return false; +} - //MESSAGE("SMESH_subMesh::Dependants"); - int shapeType = _subShape.ShapeType(); - //SCRUTE(shapeType); - TopTools_IndexedDataMapOfShapeListOfShape M; - TopoDS_Shape mainShape = _meshDS->ShapeToMesh(); +//======================================================================= +//function : GetCollection +//purpose : return a shape containing all sub-shapes of the MainShape that can be +// meshed at once along with _subShape +//======================================================================= - switch (shapeType) - { - case TopAbs_VERTEX: - break; - case TopAbs_EDGE: - case TopAbs_WIRE: - TopExp::MapShapesAndAncestors(mainShape, TopAbs_EDGE, TopAbs_WIRE, M); - TopExp::MapShapesAndAncestors(mainShape, TopAbs_EDGE, TopAbs_FACE, M); - TopExp::MapShapesAndAncestors(mainShape, TopAbs_EDGE, TopAbs_SHELL, M); - TopExp::MapShapesAndAncestors(mainShape, TopAbs_EDGE, TopAbs_SOLID, M); - TopExp::MapShapesAndAncestors(mainShape, TopAbs_EDGE, TopAbs_COMPSOLID, - M); - ExtractDependants(M, TopAbs_EDGE); - break; - case TopAbs_FACE: - case TopAbs_SHELL: - TopExp::MapShapesAndAncestors(mainShape, TopAbs_FACE, TopAbs_SHELL, M); - TopExp::MapShapesAndAncestors(mainShape, TopAbs_FACE, TopAbs_SOLID, M); - TopExp::MapShapesAndAncestors(mainShape, TopAbs_FACE, TopAbs_COMPSOLID, - M); - ExtractDependants(M, TopAbs_FACE); - break; - case TopAbs_SOLID: - case TopAbs_COMPSOLID: - TopExp::MapShapesAndAncestors(mainShape, TopAbs_SOLID, TopAbs_COMPSOLID, - M); - ExtractDependants(M, TopAbs_SOLID); - break; - case TopAbs_COMPOUND: - break; - } - - _dependantsFound = true; - return _mapDependants; +TopoDS_Shape SMESH_subMesh::GetCollection(SMESH_Gen * theGen, SMESH_Algo* theAlgo) +{ + MESSAGE("SMESH_subMesh::GetCollection"); + ASSERT (!theAlgo->NeedDescretBoundary()); + + TopoDS_Shape mainShape = _father->GetMeshDS()->ShapeToMesh(); + + if ( mainShape.IsSame( _subShape )) + return _subShape; + + list aUsedHyp = + theAlgo->GetUsedHypothesis( *_father, _subShape ); // copy + + // put in a compound all shapes with the same hypothesis assigned + // and a good ComputState + + TopoDS_Compound aCompound; + BRep_Builder aBuilder; + aBuilder.MakeCompound( aCompound ); + + TopExp_Explorer anExplorer( mainShape, _subShape.ShapeType() ); + for ( ; anExplorer.More(); anExplorer.Next() ) + { + const TopoDS_Shape& S = anExplorer.Current(); + SMESH_subMesh* subMesh = _father->GetSubMesh( S ); + SMESH_Algo* anAlgo = theGen->GetAlgo( *_father, S ); + + if (subMesh->GetComputeState() == READY_TO_COMPUTE && + anAlgo == theAlgo && + anAlgo->GetUsedHypothesis( *_father, S ) == aUsedHyp) + { + aBuilder.Add( aCompound, S ); + } + } + + return aCompound; } -//============================================================================= -/*! - * - */ -//============================================================================= - -void SMESH_subMesh:: -ExtractDependants(const TopTools_IndexedDataMapOfShapeListOfShape & M, - const TopAbs_ShapeEnum etype) +//======================================================================= +//function : GetNbAttached +//purpose : return nb of hypotheses attached to theShape. +// If theHyp is provided, similar but not same hypotheses +// are countered; else only applicable ones are countered +// depending on theAlgos flag +//======================================================================= + +int SMESH_subMesh::GetNbAttached(const TopoDS_Shape& theShape, + const SMESH_Hypothesis * theHyp, + const bool theAlgos) { - //MESSAGE("SMESH_subMesh::ExtractDependants"); + int nb = 0; + + const list& aHypList = + _father->GetHypothesisList( theShape ); + list::const_iterator it = aHypList.begin(); + while (it!=aHypList.end()) + { + const SMESH_Hypothesis* hyp = static_cast< const SMESH_Hypothesis *>( *it ); + it++; + + if ( theHyp ) + { + // count similar + if (hyp != theHyp && + hyp->GetType() == theHyp->GetType() && + hyp->GetDim() == theHyp->GetDim()) + nb++; + } + else + { + bool isAlgo = ( hyp->GetType() > SMESHDS_Hypothesis::PARAM_ALGO ); + if ( theAlgos == isAlgo && IsApplicableHypotesis( hyp )) + nb++; + } + } + + return nb; +} - TopoDS_Shape mainShape = _meshDS->ShapeToMesh(); - int lg = M.Extent(); - //SCRUTE(lg); +//======================================================================= +//function : CheckConcurentHypothesis +//purpose : check if there are several applicable hypothesis on fathers +//======================================================================= - int shapeType = _subShape.ShapeType(); - switch (shapeType) - { - case TopAbs_VERTEX: - break; - case TopAbs_EDGE: - case TopAbs_FACE: - case TopAbs_SOLID: - { - const TopTools_ListOfShape & ancestors = M.FindFromKey(_subShape); - TopTools_ListIteratorOfListOfShape it(ancestors); - for (; it.More(); it.Next()) - { - TopoDS_Shape ancestor = it.Value(); - SMESH_subMesh *aSubMesh = _father->GetSubMeshContaining(ancestor); - // if (! aSubMesh) aSubMesh = _father->GetSubMesh(ancestor); - if (aSubMesh) - { - int type = aSubMesh->_subShape.ShapeType(); - int cle = aSubMesh->GetId(); - cle += 10000000 * type; // sort map by ordType then index - if (_mapDependants.find(cle) == _mapDependants.end()) - { - _mapDependants[cle] = aSubMesh; - //SCRUTE(cle); - } - } - } - } - break; - case TopAbs_WIRE: - case TopAbs_SHELL: - case TopAbs_COMPSOLID: - for (TopExp_Explorer expE(_subShape, etype); expE.More(); expE.Next()) - { - TopoDS_Shape aShape = expE.Current(); - const TopTools_ListOfShape & ancestors = M.FindFromKey(aShape); - TopTools_ListIteratorOfListOfShape it(ancestors); - for (; it.More(); it.Next()) - { - MESSAGE("---"); - TopoDS_Shape ancestor = it.Value(); - SMESH_subMesh *aSubMesh = - _father->GetSubMeshContaining(ancestor); - if (!aSubMesh) - aSubMesh = _father->GetSubMesh(ancestor); - int type = aSubMesh->_subShape.ShapeType(); - int cle = aSubMesh->GetId(); - cle += 10000000 * type; // sort map by ordType then index - if (_mapDependants.find(cle) == _mapDependants.end()) - { - _mapDependants[cle] = aSubMesh; - SCRUTE(cle); - } - } - } - break; - case TopAbs_COMPOUND: - break; - } +SMESH_Hypothesis::Hypothesis_Status + SMESH_subMesh::CheckConcurentHypothesis (const int theHypType) +{ + MESSAGE ("SMESH_subMesh::CheckConcurentHypothesis"); + + // is there local hypothesis on me? + if ( GetNbAttached( _subShape, 0, theHypType > SMESHDS_Hypothesis::PARAM_ALGO ) > 0 ) + return SMESH_Hypothesis::HYP_OK; + + + TopoDS_Shape aPrevWithHyp; + TopTools_ListIteratorOfListOfShape it( _father->GetAncestors( _subShape )); + for (; it.More(); it.Next()) + { + const TopoDS_Shape& ancestor = it.Value(); + if ( GetNbAttached( ancestor, 0, theHypType > SMESHDS_Hypothesis::PARAM_ALGO ) > 0 ) + { + if ( aPrevWithHyp.IsNull() || aPrevWithHyp.IsSame( ancestor )) + aPrevWithHyp = ancestor; + else if ( aPrevWithHyp.ShapeType() == ancestor.ShapeType() ) + return SMESH_Hypothesis::HYP_CONCURENT; + else + return SMESH_Hypothesis::HYP_OK; + } + } + return SMESH_Hypothesis::HYP_OK; } diff --git a/src/SMESH/SMESH_subMesh.hxx b/src/SMESH/SMESH_subMesh.hxx index f72e4f65b..937479da7 100644 --- a/src/SMESH/SMESH_subMesh.hxx +++ b/src/SMESH/SMESH_subMesh.hxx @@ -31,6 +31,7 @@ #include "SMESHDS_Mesh.hxx" #include "SMESHDS_SubMesh.hxx" +#include "SMESH_Hypothesis.hxx" #include "Utils_SALOME_Exception.hxx" #include #include @@ -42,90 +43,136 @@ class SMESH_Mesh; class SMESH_Hypothesis; +class SMESH_Algo; +class SMESH_Gen; class SMESH_subMesh { - public: - SMESH_subMesh(int Id, SMESH_Mesh * father, SMESHDS_Mesh * meshDS, + public: + SMESH_subMesh(int Id, SMESH_Mesh * father, SMESHDS_Mesh * meshDS, const TopoDS_Shape & aSubShape); - virtual ~ SMESH_subMesh(); + virtual ~ SMESH_subMesh(); - int GetId(); + int GetId() const; -// bool Contains(const TopoDS_Shape & aSubShape) -// throw (SALOME_Exception); + // bool Contains(const TopoDS_Shape & aSubShape) + // throw (SALOME_Exception); - SMESHDS_SubMesh * GetSubMeshDS() throw(SALOME_Exception); + SMESHDS_SubMesh * GetSubMeshDS(); - SMESH_subMesh *GetFirstToCompute() throw(SALOME_Exception); - - const map < int, SMESH_subMesh * >&DependsOn(); - const map < int, SMESH_subMesh * >&Dependants(); - - const TopoDS_Shape & GetSubShape(); - - bool _vertexSet; // only for vertex subMesh, set to false for dim > 0 - - enum compute_state - { NOT_READY, READY_TO_COMPUTE, - COMPUTE_OK, FAILED_TO_COMPUTE - }; - enum algo_state - { NO_ALGO, MISSING_HYP, HYP_OK }; - enum algo_event - { ADD_HYP, ADD_ALGO, - REMOVE_HYP, REMOVE_ALGO, - ADD_FATHER_HYP, ADD_FATHER_ALGO, - REMOVE_FATHER_HYP, REMOVE_FATHER_ALGO - }; - enum compute_event - { MODIF_HYP, MODIF_ALGO_STATE, COMPUTE, - CLEAN, CLEANDEP, SUBMESH_COMPUTED - }; - - bool AlgoStateEngine(int event, SMESH_Hypothesis * anHyp) - throw(SALOME_Exception); - - void SubMeshesAlgoStateEngine(int event, SMESH_Hypothesis * anHyp) - throw(SALOME_Exception); - - void DumpAlgoState(bool isMain); - - bool ComputeStateEngine(int event) throw(SALOME_Exception); - - int GetComputeState() - { - return _computeState; - }; - - protected: - void InsertDependence(const TopoDS_Shape aSubShape); -// void FinalizeDependence(list& shapeList); - - bool SubMeshesComputed() throw(SALOME_Exception); - - bool SubMeshesReady(); - - void RemoveSubMeshElementsAndNodes(); - void UpdateDependantsState(); - void CleanDependants(); - void ExtractDependants(const TopTools_IndexedDataMapOfShapeListOfShape & M, - const TopAbs_ShapeEnum etype); - void SetAlgoState(int state); - - TopoDS_Shape _subShape; - SMESHDS_Mesh * _meshDS; - SMESHDS_SubMesh * _subMeshDS; - int _Id; - SMESH_Mesh *_father; - map < int, SMESH_subMesh * >_mapDepend; - map < int, SMESH_subMesh * >_mapDependants; - bool _dependenceAnalysed; - bool _dependantsFound; - - int _algoState; - int _oldAlgoState; - int _computeState; + SMESHDS_SubMesh* CreateSubMeshDS(); + // Explicit SMESHDS_SubMesh creation method, required for persistence mechanism + + SMESH_subMesh *GetFirstToCompute(); + + const map < int, SMESH_subMesh * >&DependsOn(); + //const map < int, SMESH_subMesh * >&Dependants(); + + const TopoDS_Shape & GetSubShape(); + + bool _vertexSet; // only for vertex subMesh, set to false for dim > 0 + + enum compute_state + { + NOT_READY, READY_TO_COMPUTE, + COMPUTE_OK, FAILED_TO_COMPUTE + }; + enum algo_state + { + NO_ALGO, MISSING_HYP, HYP_OK + }; + enum algo_event + { + ADD_HYP, ADD_ALGO, + REMOVE_HYP, REMOVE_ALGO, + ADD_FATHER_HYP, ADD_FATHER_ALGO, + REMOVE_FATHER_HYP, REMOVE_FATHER_ALGO + }; + enum compute_event + { + MODIF_HYP, MODIF_ALGO_STATE, COMPUTE, + CLEAN, CLEANDEP, SUBMESH_COMPUTED, SUBMESH_RESTORED + }; + + SMESH_Hypothesis::Hypothesis_Status + AlgoStateEngine(int event, SMESH_Hypothesis * anHyp); + + SMESH_Hypothesis::Hypothesis_Status + SubMeshesAlgoStateEngine(int event, SMESH_Hypothesis * anHyp); + + int GetAlgoState() { return _algoState; } + + void DumpAlgoState(bool isMain); + + bool ComputeStateEngine(int event); + + int GetComputeState() + { + return _computeState; + }; + + bool IsConform(const SMESH_Algo* theAlgo); + // check if a conform mesh will be produced by the Algo + + bool CanAddHypothesis(const SMESH_Hypothesis* theHypothesis) const; + // return true if theHypothesis can be attached to me: + // its dimention is checked + + bool IsApplicableHypotesis(const SMESH_Hypothesis* theHypothesis) const; + // return true if theHypothesis can be used to mesh me: + // its shape type is checked + + + protected: + void InsertDependence(const TopoDS_Shape aSubShape); + + bool SubMeshesComputed(); + + bool SubMeshesReady(); + + void RemoveSubMeshElementsAndNodes(); + void UpdateDependantsState(const compute_event theEvent); + void UpdateSubMeshState(const compute_state theState); + void ComputeSubMeshStateEngine(int event); + void CleanDependants(); + void CleanDependsOn(); + void SetAlgoState(int state); + + bool IsMeshComputed() const; + // check if _subMeshDS contains mesh elements + + TopoDS_Shape GetCollection(SMESH_Gen * theGen, SMESH_Algo* theAlgo); + // return a shape containing all sub-shapes of the MainShape that can be + // meshed at once along with _subShape + + bool ApplyToCollection (SMESH_Algo* theAlgo, + const TopoDS_Shape& theCollection); + // Apply theAlgo to all subshapes in theCollection + + SMESH_Hypothesis::Hypothesis_Status CheckConcurentHypothesis (const int theHypType); + // check if there are several applicable hypothesis on fathers + + int GetNbAttached(const TopoDS_Shape& theShape, + const SMESH_Hypothesis * theHyp, + const bool theAlgos = false); + // return nb of hypotheses attached to theShape. + // If theHyp is provided, similar but not same hypotheses + // are countered; else only applicable ones are countered + // depending on theAlgos flag + + TopoDS_Shape _subShape; + SMESHDS_Mesh * _meshDS; + SMESHDS_SubMesh * _subMeshDS; + int _Id; + SMESH_Mesh *_father; + map < int, SMESH_subMesh * >_mapDepend; + //map < int, SMESH_subMesh * >_mapDependants; + bool _dependenceAnalysed; + //bool _dependantsFound; + + int _algoState; + //int _oldAlgoState; + int _computeState; }; diff --git a/src/SMESHDS/Makefile.in b/src/SMESHDS/Makefile.in index bc62fc4ca..2b4d5391e 100644 --- a/src/SMESHDS/Makefile.in +++ b/src/SMESHDS/Makefile.in @@ -42,7 +42,8 @@ LIB_SRC = \ SMESHDS_Script.cxx \ SMESHDS_Command.cxx \ SMESHDS_SubMesh.cxx \ - SMESHDS_Mesh.cxx + SMESHDS_Mesh.cxx \ + SMESHDS_Group.cxx LIB_CLIENT_IDL = LIB_SERVER_IDL = @@ -61,10 +62,11 @@ EXPORT_HEADERS= \ SMESHDS_Script.hxx \ SMESHDS_Command.hxx \ SMESHDS_CommandType.hxx \ - SMESHDS_SubMesh.hxx + SMESHDS_SubMesh.hxx \ + SMESHDS_Group.hxx # additionnal information to compil and link file -CPPFLAGS += $(OCC_INCLUDES) -I${KERNEL_ROOT_DIR}/include/salome +CPPFLAGS += $(OCC_INCLUDES) -I${KERNEL_ROOT_DIR}/include/salome $(BOOST_CPPFLAGS) CXXFLAGS += $(OCC_CXXFLAGS) -I${KERNEL_ROOT_DIR}/include/salome LDFLAGS += $(OCC_KERNEL_LIBS) diff --git a/src/SMESHDS/SMESHDS_Mesh.cxx b/src/SMESHDS/SMESHDS_Mesh.cxx index 0396c6ba7..a6cae5391 100644 --- a/src/SMESHDS/SMESHDS_Mesh.cxx +++ b/src/SMESHDS/SMESHDS_Mesh.cxx @@ -100,11 +100,16 @@ bool SMESHDS_Mesh::RemoveHypothesis(const TopoDS_Shape & S, //function : AddNode //purpose : //======================================================================= -SMDS_MeshNode* SMESHDS_Mesh::AddNode(double x, double y, double z) -{ - SMDS_MeshNode* node = SMDS_Mesh::AddNode(x, y, z); - if(node!=NULL) myScript->AddNode(node->GetID(), x, y, z); - return node; +SMDS_MeshNode* SMESHDS_Mesh::AddNode(double x, double y, double z){ + SMDS_MeshNode* node = SMDS_Mesh::AddNode(x, y, z); + if(node!=NULL) myScript->AddNode(node->GetID(), x, y, z); + return node; +} + +SMDS_MeshNode* SMESHDS_Mesh::AddNodeWithID(double x, double y, double z, int ID){ + SMDS_MeshNode* node = SMDS_Mesh::AddNodeWithID(x,y,z,ID); + if(node!=NULL) myScript->AddNode(node->GetID(), x, y, z); + return node; } //======================================================================= @@ -113,137 +118,345 @@ SMDS_MeshNode* SMESHDS_Mesh::AddNode(double x, double y, double z) //======================================================================= void SMESHDS_Mesh::MoveNode(const SMDS_MeshNode *n, double x, double y, double z) { - SMDS_MeshNode * node=const_cast(n); - node->setXYZ(x,y,z); - myScript->MoveNode(n->GetID(), x, y, z); + SMDS_MeshNode * node=const_cast(n); + node->setXYZ(x,y,z); + myScript->MoveNode(n->GetID(), x, y, z); } //======================================================================= //function : AddEdge //purpose : //======================================================================= +SMDS_MeshEdge* SMESHDS_Mesh::AddEdgeWithID(int n1, int n2, int ID) +{ + SMDS_MeshEdge* anElem = SMDS_Mesh::AddEdgeWithID(n1,n2,ID); + if(anElem) myScript->AddEdge(ID,n1,n2); + return anElem; +} + +SMDS_MeshEdge* SMESHDS_Mesh::AddEdgeWithID(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2, + int ID) +{ + return AddEdgeWithID(n1->GetID(), + n2->GetID(), + ID); +} + SMDS_MeshEdge* SMESHDS_Mesh::AddEdge(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2) + const SMDS_MeshNode * n2) { - SMDS_MeshEdge* e = SMDS_Mesh::AddEdge(n1,n2); - if(e!=NULL) myScript->AddEdge(e->GetID(), n1->GetID(), n2->GetID()); - return e; + SMDS_MeshEdge* anElem = SMDS_Mesh::AddEdge(n1,n2); + if(anElem) myScript->AddEdge(anElem->GetID(), + n1->GetID(), + n2->GetID()); + return anElem; } //======================================================================= //function :AddFace //purpose : //======================================================================= +SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(int n1, int n2, int n3, int ID) +{ + SMDS_MeshFace *anElem = SMDS_Mesh::AddFaceWithID(n1, n2, n3, ID); + if(anElem) myScript->AddFace(ID,n1,n2,n3); + return anElem; +} + +SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + int ID) +{ + return AddFaceWithID(n1->GetID(), + n2->GetID(), + n3->GetID(), + ID); +} + SMDS_MeshFace* SMESHDS_Mesh::AddFace( const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3) + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3) { - SMDS_MeshFace *f = SMDS_Mesh::AddFace(n1, n2, n3); - if(f!=NULL) myScript->AddFace(f->GetID(), n1->GetID(), n2->GetID(), - n3->GetID()); - return f; + SMDS_MeshFace *anElem = SMDS_Mesh::AddFace(n1, n2, n3); + if(anElem) myScript->AddFace(anElem->GetID(), + n1->GetID(), + n2->GetID(), + n3->GetID()); + return anElem; } //======================================================================= //function :AddFace //purpose : //======================================================================= +SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(int n1, int n2, int n3, int n4, int ID) +{ + SMDS_MeshFace *anElem = SMDS_Mesh::AddFaceWithID(n1, n2, n3, n4, ID); + if(anElem) myScript->AddFace(ID, n1, n2, n3, n4); + return anElem; +} + +SMDS_MeshFace* SMESHDS_Mesh::AddFaceWithID(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4, + int ID) +{ + return AddFaceWithID(n1->GetID(), + n2->GetID(), + n3->GetID(), + n4->GetID(), + ID); +} + SMDS_MeshFace* SMESHDS_Mesh::AddFace(const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4) + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4) { - SMDS_MeshFace *f = SMDS_Mesh::AddFace(n1, n2, n3, n4); - if(f!=NULL) - myScript->AddFace(f->GetID(), n1->GetID(), n2->GetID(), n3->GetID(), - n4->GetID()); - return f; + SMDS_MeshFace *anElem = SMDS_Mesh::AddFace(n1, n2, n3, n4); + if(anElem) myScript->AddFace(anElem->GetID(), + n1->GetID(), + n2->GetID(), + n3->GetID(), + n4->GetID()); + return anElem; } //======================================================================= //function :AddVolume //purpose : //======================================================================= -SMDS_MeshVolume* SMESHDS_Mesh::AddVolume( - const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4) +SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(int n1, int n2, int n3, int n4, int ID) +{ + SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolumeWithID(n1, n2, n3, n4, ID); + if(anElem) myScript->AddVolume(ID, n1, n2, n3, n4); + return anElem; +} + +SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4, + int ID) { - SMDS_MeshVolume *f = SMDS_Mesh::AddVolume(n1, n2, n3, n4); - if(f!=NULL) - myScript->AddVolume(f->GetID(), n1->GetID(), n2->GetID(), n3->GetID(), - n4->GetID()); - return f; + return AddVolumeWithID(n1->GetID(), + n2->GetID(), + n3->GetID(), + n4->GetID(), + ID); +} + +SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4) +{ + SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1, n2, n3, n4); + if(anElem) myScript->AddVolume(anElem->GetID(), + n1->GetID(), + n2->GetID(), + n3->GetID(), + n4->GetID()); + return anElem; } //======================================================================= //function :AddVolume //purpose : //======================================================================= -SMDS_MeshVolume* SMESHDS_Mesh::AddVolume( - const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, - const SMDS_MeshNode * n5) +SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(int n1, int n2, int n3, int n4, int n5, int ID) +{ + SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolumeWithID(n1, n2, n3, n4, n5, ID); + if(anElem) myScript->AddVolume(ID, n1, n2, n3, n4, n5); + return anElem; +} + +SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4, + const SMDS_MeshNode * n5, + int ID) +{ + return AddVolumeWithID(n1->GetID(), + n2->GetID(), + n3->GetID(), + n4->GetID(), + n5->GetID(), + ID); +} + +SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4, + const SMDS_MeshNode * n5) { - SMDS_MeshVolume *v = SMDS_Mesh::AddVolume(n1, n2, n3, n4, n5); - if(v!=NULL) - myScript->AddVolume(v->GetID(), n1->GetID(), n2->GetID(), n3->GetID(), - n4->GetID(), n5->GetID()); - return v; + SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1, n2, n3, n4, n5); + if(anElem) myScript->AddVolume(anElem->GetID(), + n1->GetID(), + n2->GetID(), + n3->GetID(), + n4->GetID(), + n5->GetID()); + return anElem; } //======================================================================= //function :AddVolume //purpose : //======================================================================= -SMDS_MeshVolume* SMESHDS_Mesh::AddVolume( - const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, - const SMDS_MeshNode * n5, - const SMDS_MeshNode * n6) +SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(int n1, int n2, int n3, int n4, int n5, int n6, int ID) +{ + SMDS_MeshVolume *anElem= SMDS_Mesh::AddVolumeWithID(n1, n2, n3, n4, n5, n6, ID); + if(anElem) myScript->AddVolume(ID, n1, n2, n3, n4, n5, n6); + return anElem; +} + +SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4, + const SMDS_MeshNode * n5, + const SMDS_MeshNode * n6, + int ID) +{ + return AddVolumeWithID(n1->GetID(), + n2->GetID(), + n3->GetID(), + n4->GetID(), + n5->GetID(), + n6->GetID(), + ID); +} + +SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4, + const SMDS_MeshNode * n5, + const SMDS_MeshNode * n6) { - SMDS_MeshVolume *v= SMDS_Mesh::AddVolume(n1, n2, n3, n4, n5, n6); - if(v!=NULL) - myScript->AddVolume(v->GetID(), n1->GetID(), n2->GetID(), n3->GetID(), - n4->GetID(), n5->GetID(), n6->GetID()); - return v; + SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1, n2, n3, n4, n5, n6); + if(anElem) myScript->AddVolume(anElem->GetID(), + n1->GetID(), + n2->GetID(), + n3->GetID(), + n4->GetID(), + n5->GetID(), + n6->GetID()); + return anElem; } //======================================================================= //function :AddVolume //purpose : //======================================================================= -SMDS_MeshVolume* SMESHDS_Mesh::AddVolume( - const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, - const SMDS_MeshNode * n5, - const SMDS_MeshNode * n6, - const SMDS_MeshNode * n7, - const SMDS_MeshNode * n8) -{ - SMDS_MeshVolume *v= - SMDS_Mesh::AddVolume(n1, n2, n3, n4, n5, n6, n7, n8); - if(v!=NULL) - myScript->AddVolume(v->GetID(), n1->GetID(), n2->GetID(), n3->GetID(), - n4->GetID(), n5->GetID(), n6->GetID(), n7->GetID(), n8->GetID()); - return v; -} - +SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(int n1, int n2, int n3, int n4, int n5, int n6, int n7, int n8, int ID) +{ + SMDS_MeshVolume *anElem= SMDS_Mesh::AddVolumeWithID(n1, n2, n3, n4, n5, n6, n7, n8, ID); + if(anElem) myScript->AddVolume(ID, n1, n2, n3, n4, n5, n6, n7, n8); + return anElem; +} + +SMDS_MeshVolume* SMESHDS_Mesh::AddVolumeWithID(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4, + const SMDS_MeshNode * n5, + const SMDS_MeshNode * n6, + const SMDS_MeshNode * n7, + const SMDS_MeshNode * n8, + int ID) +{ + return AddVolumeWithID(n1->GetID(), + n2->GetID(), + n3->GetID(), + n4->GetID(), + n5->GetID(), + n6->GetID(), + n7->GetID(), + n8->GetID(), + ID); +} + +SMDS_MeshVolume* SMESHDS_Mesh::AddVolume(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4, + const SMDS_MeshNode * n5, + const SMDS_MeshNode * n6, + const SMDS_MeshNode * n7, + const SMDS_MeshNode * n8) +{ + SMDS_MeshVolume *anElem = SMDS_Mesh::AddVolume(n1, n2, n3, n4, n5, n6, n7, n8); + if(anElem) myScript->AddVolume(anElem->GetID(), + n1->GetID(), + n2->GetID(), + n3->GetID(), + n4->GetID(), + n5->GetID(), + n6->GetID(), + n7->GetID(), + n8->GetID()); + return anElem; +} +//======================================================================= +//function : removeFromSubMeshes +//purpose : +//======================================================================= + +static void removeFromSubMeshes (map & theSubMeshes, + list & theElems, + const bool isNode) +{ + if ( theElems.empty() ) + return; + + map::iterator SubIt = theSubMeshes.begin(); + for ( ; SubIt != theSubMeshes.end(); SubIt++ ) + { + list::iterator elIt = theElems.begin(); + while ( elIt != theElems.end() ) + { + bool removed = false; + if ( isNode ) + removed = (*SubIt).second->RemoveNode( static_cast (*elIt) ); + else + removed = (*SubIt).second->RemoveElement( *elIt ); + + if (removed) + { + elIt = theElems.erase( elIt ); + if ( theElems.empty() ) + return; // all elements are found and removed + } + else + { + elIt++ ; + } + } + } +} + //======================================================================= //function : RemoveNode //purpose : //======================================================================= void SMESHDS_Mesh::RemoveNode(const SMDS_MeshNode * n) { - SMDS_Mesh::RemoveNode(n); - myScript->RemoveNode(n->GetID()); + myScript->RemoveNode(n->GetID()); + + list removedElems; + list removedNodes; + + SMDS_Mesh::RemoveElement( n, removedElems, removedNodes, true ); + + removeFromSubMeshes( myShapeIndexToSubMesh, removedElems, false ); + removeFromSubMeshes( myShapeIndexToSubMesh, removedNodes, true ); } //======================================================================= @@ -252,8 +465,20 @@ void SMESHDS_Mesh::RemoveNode(const SMDS_MeshNode * n) //======================================================================== void SMESHDS_Mesh::RemoveElement(const SMDS_MeshElement * elt) { - SMDS_Mesh::RemoveElement(elt); - myScript->RemoveElement(elt->GetID()); + if (elt->GetType() == SMDSAbs_Node) + { + RemoveNode( static_cast( elt )); + return; + } + + myScript->RemoveElement(elt->GetID()); + + list removedElems; + list removedNodes; + + SMDS_Mesh::RemoveElement(elt, removedElems, removedNodes, false); + + removeFromSubMeshes( myShapeIndexToSubMesh, removedElems, false ); } //======================================================================= @@ -291,7 +516,7 @@ void SMESHDS_Mesh::SetNodeOnFace(SMDS_MeshNode * aNode, int Index = myIndexToShape.FindIndex(S); //Set Position on Node - aNode->SetPosition(new SMDS_FacePosition(Index, 0., 0.)); + aNode->SetPosition(SMDS_PositionPtr(new SMDS_FacePosition(Index, 0., 0.))); //Update or build submesh map::iterator it=myShapeIndexToSubMesh.find(Index); @@ -313,7 +538,7 @@ void SMESHDS_Mesh::SetNodeOnEdge(SMDS_MeshNode * aNode, int Index = myIndexToShape.FindIndex(S); //Set Position on Node - aNode->SetPosition(new SMDS_EdgePosition(Index, 0.)); + aNode->SetPosition(SMDS_PositionPtr(new SMDS_EdgePosition(Index, 0.))); //Update or build submesh map::iterator it=myShapeIndexToSubMesh.find(Index); @@ -335,7 +560,7 @@ void SMESHDS_Mesh::SetNodeOnVertex(SMDS_MeshNode * aNode, int Index = myIndexToShape.FindIndex(S); //Set Position on Node - aNode->SetPosition(new SMDS_VertexPosition(Index)); + aNode->SetPosition(SMDS_PositionPtr(new SMDS_VertexPosition(Index))); //Update or build submesh map::iterator it=myShapeIndexToSubMesh.find(Index); @@ -402,13 +627,40 @@ TopoDS_Shape SMESHDS_Mesh::ShapeToMesh() const /////////////////////////////////////////////////////////////////////////////// SMESHDS_SubMesh * SMESHDS_Mesh::MeshElements(const TopoDS_Shape & S) { - if (myShape.IsNull()) MESSAGE("myShape is NULL"); + if (myShape.IsNull()) MESSAGE("myShape is NULL"); - int Index = myIndexToShape.FindIndex(S); - if (myShapeIndexToSubMesh.find(Index)!=myShapeIndexToSubMesh.end()) - return myShapeIndexToSubMesh[Index]; - else - return NULL; + int Index = myIndexToShape.FindIndex(S); + if (myShapeIndexToSubMesh.find(Index)!=myShapeIndexToSubMesh.end()) + return myShapeIndexToSubMesh[Index]; + else + return NULL; +} + +/////////////////////////////////////////////////////////////////////////////// +/// Return the sub mesh by Id of shape it is linked to +/////////////////////////////////////////////////////////////////////////////// +SMESHDS_SubMesh * SMESHDS_Mesh::MeshElements(const int Index) +{ + if (myShape.IsNull()) MESSAGE("myShape is NULL"); + + if (myShapeIndexToSubMesh.find(Index)!=myShapeIndexToSubMesh.end()) + return myShapeIndexToSubMesh[Index]; + else + return NULL; +} + +//======================================================================= +//function : SubMeshIndices +//purpose : +//======================================================================= +list SMESHDS_Mesh::SubMeshIndices() +{ + list anIndices; + std::map::iterator anIter = myShapeIndexToSubMesh.begin(); + for (; anIter != myShapeIndexToSubMesh.end(); anIter++) { + anIndices.push_back((*anIter).first); + } + return anIndices; } //======================================================================= @@ -520,7 +772,7 @@ void SMESHDS_Mesh::SetNodeInVolume(const SMDS_MeshNode* aNode, int Index) void SMESHDS_Mesh::SetNodeOnFace(SMDS_MeshNode* aNode, int Index) { //Set Position on Node - aNode->SetPosition(new SMDS_FacePosition(Index, 0., 0.)); + aNode->SetPosition(SMDS_PositionPtr(new SMDS_FacePosition(Index, 0., 0.))); //Update or build submesh if (myShapeIndexToSubMesh.find(Index)==myShapeIndexToSubMesh.end()) @@ -536,7 +788,7 @@ void SMESHDS_Mesh::SetNodeOnFace(SMDS_MeshNode* aNode, int Index) void SMESHDS_Mesh::SetNodeOnEdge(SMDS_MeshNode* aNode, int Index) { //Set Position on Node - aNode->SetPosition(new SMDS_EdgePosition(Index, 0.)); + aNode->SetPosition(SMDS_PositionPtr(new SMDS_EdgePosition(Index, 0.))); //Update or build submesh if (myShapeIndexToSubMesh.find(Index)==myShapeIndexToSubMesh.end()) @@ -552,7 +804,7 @@ void SMESHDS_Mesh::SetNodeOnEdge(SMDS_MeshNode* aNode, int Index) void SMESHDS_Mesh::SetNodeOnVertex(SMDS_MeshNode* aNode, int Index) { //Set Position on Node - aNode->SetPosition(new SMDS_VertexPosition(Index)); + aNode->SetPosition(SMDS_PositionPtr(new SMDS_VertexPosition(Index))); //Update or build submesh if (myShapeIndexToSubMesh.find(Index)==myShapeIndexToSubMesh.end()) diff --git a/src/SMESHDS/SMESHDS_Mesh.hxx b/src/SMESHDS/SMESHDS_Mesh.hxx index 6159a4fca..7d26b2266 100644 --- a/src/SMESHDS/SMESHDS_Mesh.hxx +++ b/src/SMESHDS/SMESHDS_Mesh.hxx @@ -49,102 +49,158 @@ #include #else #include - using namespace __gnu_cxx; + namespace gstd = __gnu_cxx; #endif #endif -using namespace std; - -class SMESHDS_Mesh:public SMDS_Mesh -{ - - public: - - SMESHDS_Mesh(int MeshID); - void ShapeToMesh(const TopoDS_Shape & S); - bool AddHypothesis(const TopoDS_Shape & SS, const SMESHDS_Hypothesis * H); - bool RemoveHypothesis(const TopoDS_Shape & S, const SMESHDS_Hypothesis * H); - SMDS_MeshNode * AddNode(double x, double y, double z); - void RemoveNode(const SMDS_MeshNode *); - void MoveNode(const SMDS_MeshNode *, double x, double y, double z); - SMDS_MeshEdge* AddEdge( - const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2); - SMDS_MeshFace* AddFace( - const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3); - SMDS_MeshFace* AddFace( - const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4); - SMDS_MeshVolume* AddVolume( - const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4); - SMDS_MeshVolume* AddVolume( - const SMDS_MeshNode * n1, - const SMDS_MeshNode * n2, - const SMDS_MeshNode * n3, - const SMDS_MeshNode * n4, - const SMDS_MeshNode * n5); - 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); - 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); - - void RemoveElement(const SMDS_MeshElement *); - void SetNodeInVolume(SMDS_MeshNode * aNode, const TopoDS_Shell & S); - void SetNodeOnFace(SMDS_MeshNode * aNode, const TopoDS_Face & S); - void SetNodeOnEdge(SMDS_MeshNode * aNode, const TopoDS_Edge & S); - 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); - void UnSetMeshElementOnShape(const SMDS_MeshElement * anElt, - const TopoDS_Shape & S); - TopoDS_Shape ShapeToMesh() const; - bool HasMeshElements(const TopoDS_Shape & S); - SMESHDS_SubMesh * MeshElements(const TopoDS_Shape & S); - bool HasHypothesis(const TopoDS_Shape & S); - const list& GetHypothesis(const TopoDS_Shape & S) const; - SMESHDS_Script * GetScript(); - void ClearScript(); - int ShapeToIndex(const TopoDS_Shape & aShape); - TopoDS_Shape IndexToShape(int ShapeIndex); - void NewSubMesh(int Index); - void SetNodeInVolume(const SMDS_MeshNode * aNode, int Index); - void SetNodeOnFace(SMDS_MeshNode * aNode, int Index); - void SetNodeOnEdge(SMDS_MeshNode * aNode, int Index); - void SetNodeOnVertex(SMDS_MeshNode * aNode, int Index); - void SetMeshElementOnShape(const SMDS_MeshElement * anElt, int Index); - ~SMESHDS_Mesh(); - - private: - struct HashTopoDS_Shape - { - size_t operator()(const TopoDS_Shape& S) const {return S.HashCode(2147483647);} - }; - typedef hash_map,HashTopoDS_Shape > ShapeToHypothesis; - int myMeshID; - TopoDS_Shape myShape; - TopTools_IndexedMapOfShape myIndexToShape; - map myShapeIndexToSubMesh; - ShapeToHypothesis myShapeToHypothesis; - SMESHDS_Script * myScript; +class SMESHDS_Mesh:public SMDS_Mesh{ +public: + SMESHDS_Mesh(int MeshID); + void ShapeToMesh(const TopoDS_Shape & S); + bool AddHypothesis(const TopoDS_Shape & SS, const SMESHDS_Hypothesis * H); + bool RemoveHypothesis(const TopoDS_Shape & S, const SMESHDS_Hypothesis * H); + + virtual SMDS_MeshNode* AddNodeWithID(double x, double y, double z, int ID); + virtual SMDS_MeshNode * AddNode(double x, double y, double z); + + virtual SMDS_MeshEdge* AddEdgeWithID(int n1, int n2, int ID); + virtual SMDS_MeshEdge* AddEdgeWithID(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2, + int ID); + virtual SMDS_MeshEdge* AddEdge(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2); + + virtual SMDS_MeshFace* AddFaceWithID(int n1, int n2, int n3, int ID); + virtual SMDS_MeshFace* AddFaceWithID(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + int ID); + virtual SMDS_MeshFace* AddFace(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3); + + virtual SMDS_MeshFace* AddFaceWithID(int n1, int n2, int n3, int n4, int ID); + virtual SMDS_MeshFace* AddFaceWithID(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4, + int ID); + virtual SMDS_MeshFace* AddFace(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4); + + virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4, int ID); + virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4, + int ID); + virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4); + + virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4, int n5, int ID); + virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4, + const SMDS_MeshNode * n5, + int ID); + virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4, + const SMDS_MeshNode * n5); + + virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4, int n5, int n6, int ID); + virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4, + const SMDS_MeshNode * n5, + const SMDS_MeshNode * n6, + int ID); + virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4, + const SMDS_MeshNode * n5, + const SMDS_MeshNode * n6); + + virtual SMDS_MeshVolume* AddVolumeWithID(int n1, int n2, int n3, int n4, int n5, int n6, int n7, int n8, int ID); + virtual SMDS_MeshVolume* AddVolumeWithID(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4, + const SMDS_MeshNode * n5, + const SMDS_MeshNode * n6, + const SMDS_MeshNode * n7, + const SMDS_MeshNode * n8, + int ID); + virtual SMDS_MeshVolume* AddVolume(const SMDS_MeshNode * n1, + const SMDS_MeshNode * n2, + const SMDS_MeshNode * n3, + const SMDS_MeshNode * n4, + const SMDS_MeshNode * n5, + const SMDS_MeshNode * n6, + const SMDS_MeshNode * n7, + const SMDS_MeshNode * n8); + + void MoveNode(const SMDS_MeshNode *, double x, double y, double z); + virtual void RemoveNode(const SMDS_MeshNode *); + void RemoveElement(const SMDS_MeshElement *); + + void SetNodeInVolume(SMDS_MeshNode * aNode, const TopoDS_Shell & S); + void SetNodeOnFace(SMDS_MeshNode * aNode, const TopoDS_Face & S); + void SetNodeOnEdge(SMDS_MeshNode * aNode, const TopoDS_Edge & S); + 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); + void UnSetMeshElementOnShape(const SMDS_MeshElement * anElt, + const TopoDS_Shape & S); + TopoDS_Shape ShapeToMesh() const; + bool HasMeshElements(const TopoDS_Shape & S); + SMESHDS_SubMesh * MeshElements(const TopoDS_Shape & S); + SMESHDS_SubMesh * MeshElements(const int Index); + list SubMeshIndices(); + const std::map& SubMeshes() + { return myShapeIndexToSubMesh; } + + bool HasHypothesis(const TopoDS_Shape & S); + const list& GetHypothesis(const TopoDS_Shape & S) const; + SMESHDS_Script * GetScript(); + void ClearScript(); + int ShapeToIndex(const TopoDS_Shape & aShape); + TopoDS_Shape IndexToShape(int ShapeIndex); + + void NewSubMesh(int Index); + void SetNodeInVolume(const SMDS_MeshNode * aNode, int Index); + void SetNodeOnFace(SMDS_MeshNode * aNode, int Index); + void SetNodeOnEdge(SMDS_MeshNode * aNode, int Index); + void SetNodeOnVertex(SMDS_MeshNode * aNode, int Index); + void SetMeshElementOnShape(const SMDS_MeshElement * anElt, int Index); + + ~SMESHDS_Mesh(); + +private: + struct HashTopoDS_Shape{ + size_t operator()(const TopoDS_Shape& S) const { + return S.HashCode(2147483647); + } + }; + typedef std::list THypList; + typedef gstd::hash_map ShapeToHypothesis; + ShapeToHypothesis myShapeToHypothesis; + + int myMeshID; + TopoDS_Shape myShape; + TopTools_IndexedMapOfShape myIndexToShape; + std::map myShapeIndexToSubMesh; + SMESHDS_Script* myScript; }; + + #endif diff --git a/src/SMESHDS/SMESHDS_SubMesh.cxx b/src/SMESHDS/SMESHDS_SubMesh.cxx index 31710630d..c7ad4c210 100644 --- a/src/SMESHDS/SMESHDS_SubMesh.cxx +++ b/src/SMESHDS/SMESHDS_SubMesh.cxx @@ -42,9 +42,12 @@ void SMESHDS_SubMesh::AddElement(const SMDS_MeshElement * ME) //function : RemoveElement //purpose : //======================================================================= -void SMESHDS_SubMesh::RemoveElement(const SMDS_MeshElement * ME) +bool SMESHDS_SubMesh::RemoveElement(const SMDS_MeshElement * ME) { - myElements.erase(ME); + if ( NbElements() ) + return myElements.erase(ME); + + return false; } //======================================================================= @@ -60,9 +63,12 @@ void SMESHDS_SubMesh::AddNode(const SMDS_MeshNode * N) //function : RemoveNode //purpose : //======================================================================= -void SMESHDS_SubMesh::RemoveNode(const SMDS_MeshNode * N) +bool SMESHDS_SubMesh::RemoveNode(const SMDS_MeshNode * N) { - myNodes.erase(N); + if ( NbNodes() ) + return myNodes.erase(N); + + return false; } //======================================================================= @@ -85,8 +91,9 @@ int SMESHDS_SubMesh::NbNodes() const template class MySetIterator:public SMDS_Iterator { - const set& mySet; - set::const_iterator myIt; + typedef const set TSet; + typename TSet::const_iterator myIt; + TSet& mySet; public: MySetIterator(const set& s):mySet(s), myIt(s.begin()) @@ -108,17 +115,17 @@ template class MySetIterator:public SMDS_Iterator ///Return an iterator on the elements of submesh ///The created iterator must be free by the caller /////////////////////////////////////////////////////////////////////////////// -SMDS_Iterator * SMESHDS_SubMesh::GetElements() const +SMDS_ElemIteratorPtr SMESHDS_SubMesh::GetElements() const { - return new MySetIterator(myElements); + return SMDS_ElemIteratorPtr(new MySetIterator(myElements)); } /////////////////////////////////////////////////////////////////////////////// ///Return an iterator on the nodes of submesh ///The created iterator must be free by the caller /////////////////////////////////////////////////////////////////////////////// -SMDS_Iterator * SMESHDS_SubMesh::GetNodes() const +SMDS_NodeIteratorPtr SMESHDS_SubMesh::GetNodes() const { - return new MySetIterator(myNodes); + return SMDS_NodeIteratorPtr(new MySetIterator(myNodes)); } diff --git a/src/SMESHDS/SMESHDS_SubMesh.hxx b/src/SMESHDS/SMESHDS_SubMesh.hxx index bda8f04bb..be7e7462a 100644 --- a/src/SMESHDS/SMESHDS_SubMesh.hxx +++ b/src/SMESHDS/SMESHDS_SubMesh.hxx @@ -36,13 +36,13 @@ class SMESHDS_SubMesh { public: void AddElement(const SMDS_MeshElement * ME); - void RemoveElement(const SMDS_MeshElement * ME); + bool RemoveElement(const SMDS_MeshElement * ME); // ret true if ME was in void AddNode(const SMDS_MeshNode * ME); - void RemoveNode(const SMDS_MeshNode * ME); + bool RemoveNode(const SMDS_MeshNode * ME); // ret true if ME was in int NbElements() const; - SMDS_Iterator * GetElements() const; + SMDS_ElemIteratorPtr GetElements() const; int NbNodes() const; - SMDS_Iterator * GetNodes() const; + SMDS_NodeIteratorPtr GetNodes() const; private: const SMDS_Mesh * myMesh; diff --git a/src/SMESHFiltersSelection/SMESH_Type.h b/src/SMESHFiltersSelection/SMESH_Type.h index 7bf427270..a3ba79fa0 100644 --- a/src/SMESHFiltersSelection/SMESH_Type.h +++ b/src/SMESHFiltersSelection/SMESH_Type.h @@ -17,5 +17,6 @@ enum MeshObjectType { SUBMESH_EDGE, SUBMESH_FACE, SUBMESH_SOLID, - SUBMESH_COMPOUND + SUBMESH_COMPOUND, + GROUP }; diff --git a/src/SMESHFiltersSelection/SMESH_TypeFilter.cxx b/src/SMESHFiltersSelection/SMESH_TypeFilter.cxx index 3a14178e5..6514bfd80 100644 --- a/src/SMESHFiltersSelection/SMESH_TypeFilter.cxx +++ b/src/SMESHFiltersSelection/SMESH_TypeFilter.cxx @@ -29,111 +29,92 @@ Standard_Boolean SMESH_TypeFilter::IsOk(const Handle(SALOME_InteractiveObject)& if ( !meshFilter->IsOk(anObj) ) return false; + bool Ok = false; + if ( anObj->hasEntry() ) { QAD_Study* ActiveStudy = QAD_Application::getDesktop()->getActiveStudy(); SALOMEDS::Study_var aStudy = ActiveStudy->getStudyDocument(); SALOMEDS::SObject_var obj = aStudy->FindObjectID( anObj->getEntry() ); - bool Ok = false; + SALOMEDS::SObject_var objFather = obj->GetFather(); + SALOMEDS::SComponent_var objComponent = obj->GetFatherComponent(); + + if ( strlen( obj->GetID() ) <= strlen( objComponent->GetID() ) ) + return false; switch ( myKind ) { case HYPOTHESIS: { - SALOMEDS::SObject_var objFather = obj->GetFather(); - SALOMEDS::SComponent_var objComponent = obj->GetFatherComponent(); if (( objFather->Tag() == 1 ) && (strcmp( objFather->GetID(), objComponent->GetID() ) != 0 ) ) Ok = true; break; } case ALGORITHM: { - SALOMEDS::SObject_var objFather = obj->GetFather(); - SALOMEDS::SComponent_var objComponent = obj->GetFatherComponent(); if (( objFather->Tag() == 2 ) && (strcmp( objFather->GetID(), objComponent->GetID() ) != 0 ) ) Ok = true; break; } case MESH: { - SALOMEDS::SObject_var objFather = obj->GetFather(); - SALOMEDS::SComponent_var objComponent = obj->GetFatherComponent(); - if (( obj->Tag() >= 3 ) && (strcmp( objFather->GetID(), objComponent->GetID() ) == 0 ) ) Ok = true; break; } case SUBMESH: { - SALOMEDS::SObject_var objFather = obj->GetFather(); - SALOMEDS::SComponent_var objComponent = obj->GetFatherComponent(); - - if (( objFather->Tag() >= 4 ) && (strcmp( objFather->GetID(), objComponent->GetID() ) != 0 ) ) + if (( objFather->Tag() >= 4 && objFather->Tag() < 9 ) && (strcmp( objFather->GetID(), objComponent->GetID() ) != 0 ) ) Ok = true; break; } case MESHorSUBMESH: { - SALOMEDS::SObject_var objFather = obj->GetFather(); - SALOMEDS::SComponent_var objComponent = obj->GetFatherComponent(); - if (( obj->Tag() >= 3 ) && (strcmp( objFather->GetID(), objComponent->GetID() ) == 0 ) ) Ok = true; - if (( objFather->Tag() >= 4 ) && (strcmp( objFather->GetID(), objComponent->GetID() ) != 0 ) ) + if (( objFather->Tag() >= 4 && objFather->Tag() < 9 ) && (strcmp( objFather->GetID(), objComponent->GetID() ) != 0 ) ) Ok = true; break; } - case SUBMESH_VERTEX: + case SUBMESH_VERTEX: // Label "SubMeshes on vertexes" { - SALOMEDS::SObject_var objFather = obj->GetFather(); - SALOMEDS::SComponent_var objComponent = obj->GetFatherComponent(); - if (( obj->Tag() == 4 ) && (strcmp( objFather->GetID(), objComponent->GetID() ) != 0 ) && ( objFather->Tag() >= 3 )) Ok = true; break; } case SUBMESH_EDGE: { - SALOMEDS::SObject_var objFather = obj->GetFather(); - SALOMEDS::SComponent_var objComponent = obj->GetFatherComponent(); - if (( obj->Tag() == 5 ) && (strcmp( objFather->GetID(), objComponent->GetID() ) != 0 ) && ( objFather->Tag() >= 3 )) Ok = true; break; } case SUBMESH_FACE: { - SALOMEDS::SObject_var objFather = obj->GetFather(); - SALOMEDS::SComponent_var objComponent = obj->GetFatherComponent(); - if (( obj->Tag() == 6 ) && (strcmp( objFather->GetID(), objComponent->GetID() ) != 0 ) && ( objFather->Tag() >= 3 )) Ok = true; break; } case SUBMESH_SOLID: { - SALOMEDS::SObject_var objFather = obj->GetFather(); - SALOMEDS::SComponent_var objComponent = obj->GetFatherComponent(); - if (( obj->Tag() == 7 ) && (strcmp( objFather->GetID(), objComponent->GetID() ) != 0 ) && ( objFather->Tag() >= 3 )) Ok = true; break; } case SUBMESH_COMPOUND: { - SALOMEDS::SObject_var objFather = obj->GetFather(); - SALOMEDS::SComponent_var objComponent = obj->GetFatherComponent(); - if (( obj->Tag() == 8 ) && (strcmp( objFather->GetID(), objComponent->GetID() ) != 0 ) && ( objFather->Tag() >= 3 )) Ok = true; break; } + case GROUP: + { + if (( objFather->Tag() >= 9 ) && (strcmp( objFather->GetID(), objComponent->GetID() ) != 0 ) ) + Ok = true; + break; + } } - - if ( Ok ) - return true; } - return false; + return Ok; } diff --git a/src/SMESHGUI/Makefile.in b/src/SMESHGUI/Makefile.in index 660789e06..a183879da 100644 --- a/src/SMESHGUI/Makefile.in +++ b/src/SMESHGUI/Makefile.in @@ -29,14 +29,18 @@ top_srcdir=@top_srcdir@ top_builddir=../.. srcdir=@srcdir@ -VPATH=.:@srcdir@:@top_srcdir@/idl:$(top_builddir)/idl:${KERNEL_ROOT_DIR}/idl/salome:${MED_ROOT_DIR}/idl/salome +VPATH=.:@srcdir@:@top_srcdir@/idl:$(top_builddir)/idl @COMMENCE@ # header files EXPORT_HEADERS= SMESHGUI_Swig.hxx \ - SMESHGUI_Swig.i + SMESHGUI_Swig.i \ + SMESHGUI.h \ + SMESHGUI_Hypotheses.h \ + SMESHGUI_SpinBox.h \ + SMESHGUI_StudyAPI.h # .po files to transform in .qm PO_FILES = \ @@ -53,28 +57,28 @@ LIB_SRC = SMESHGUI.cxx \ SMESHGUI_AddAlgorithmDlg.cxx \ SMESHGUI_InitMeshDlg.cxx \ SMESHGUI_AddSubMeshDlg.cxx \ - SMESHGUI_LocalLengthDlg.cxx \ - SMESHGUI_NbSegmentsDlg.cxx \ SMESHGUI_TransparencyDlg.cxx \ + SMESHGUI_GroupDlg.cxx \ SMESHGUI_RemoveNodesDlg.cxx \ SMESHGUI_RemoveElementsDlg.cxx \ SMESHGUI_MeshInfosDlg.cxx \ SMESHGUI_Preferences_ColorDlg.cxx \ - SMESHGUI_MaxElementAreaDlg.cxx \ SMESHGUI_Preferences_ScalarBarDlg.cxx \ - SMESHGUI_EditScalarBarDlg.cxx \ + SMESHGUI_Preferences_SelectionDlg.cxx \ SMESHGUI_aParameterDlg.cxx \ - SMESHGUI_MaxElementVolumeDlg.cxx \ SMESHGUI_Swig.cxx \ SMESHGUI_ComputeScalarValue.cxx \ SMESHGUI_MoveNodesDlg.cxx \ SMESHGUI_OrientationElementsDlg.cxx \ SMESHGUI_DiagonalInversionDlg.cxx \ - SMESHGUI_EdgesConnectivityDlg.cxx \ SMESHGUI_AddFaceDlg.cxx \ SMESHGUI_AddVolumeDlg.cxx \ SMESHGUI_AddEdgeDlg.cxx \ - SMESHGUI_EditHypothesesDlg.cxx + SMESHGUI_EditHypothesesDlg.cxx \ + SMESHGUI_CreateHypothesesDlg.cxx \ + SMESHGUI_XmlHandler.cxx \ + SMESHGUI_Filter.cxx \ + SMESHGUI_FilterDlg.cxx LIB_MOC = \ SMESHGUI.h \ @@ -84,26 +88,24 @@ LIB_MOC = \ SMESHGUI_AddAlgorithmDlg.h \ SMESHGUI_InitMeshDlg.h \ SMESHGUI_AddSubMeshDlg.h \ - SMESHGUI_LocalLengthDlg.h \ - SMESHGUI_NbSegmentsDlg.h \ SMESHGUI_TransparencyDlg.h \ + SMESHGUI_GroupDlg.h \ SMESHGUI_RemoveNodesDlg.h \ SMESHGUI_RemoveElementsDlg.h \ SMESHGUI_MeshInfosDlg.h \ SMESHGUI_Preferences_ColorDlg.h \ - SMESHGUI_MaxElementAreaDlg.h \ SMESHGUI_Preferences_ScalarBarDlg.h \ - SMESHGUI_EditScalarBarDlg.h \ + SMESHGUI_Preferences_SelectionDlg.h \ SMESHGUI_aParameterDlg.h \ - SMESHGUI_MaxElementVolumeDlg.h \ SMESHGUI_MoveNodesDlg.h \ SMESHGUI_OrientationElementsDlg.h \ SMESHGUI_DiagonalInversionDlg.h \ - SMESHGUI_EdgesConnectivityDlg.h \ SMESHGUI_AddEdgeDlg.h \ SMESHGUI_AddVolumeDlg.h \ SMESHGUI_AddFaceDlg.h \ - SMESHGUI_EditHypothesesDlg.h + SMESHGUI_EditHypothesesDlg.h \ + SMESHGUI_CreateHypothesesDlg.h \ + SMESHGUI_FilterDlg.h LIB_CLIENT_IDL = SALOME_Exception.idl \ GEOM_Gen.idl \ @@ -111,21 +113,25 @@ LIB_CLIENT_IDL = SALOME_Exception.idl \ SMESH_Gen.idl \ SMESH_Mesh.idl \ SMESH_Hypothesis.idl \ - SMESH_BasicHypothesis.idl \ + SMESH_Group.idl \ SALOMEDS.idl \ SALOMEDS_Attributes.idl \ SALOME_ModuleCatalog.idl \ SALOME_Component.idl \ - MED.idl + MED.idl \ + SMESH_Filter.idl \ + SALOME_GenericObj.idl LIB_SERVER_IDL = # additionnal information to compil and link file -CPPFLAGS += $(QT_INCLUDES) $(VTK_INCLUDES) $(OGL_INCLUDES) $(OCC_INCLUDES) $(PYTHON_INCLUDES) $(MED2_INCLUDES) -I${KERNEL_ROOT_DIR}/include/salome -I${GEOM_ROOT_DIR}/include/salome +CPPFLAGS += $(QT_INCLUDES) $(VTK_INCLUDES) $(OGL_INCLUDES) $(OCC_INCLUDES) $(PYTHON_INCLUDES) \ + $(MED2_INCLUDES) -I${KERNEL_ROOT_DIR}/include/salome -I${GEOM_ROOT_DIR}/include/salome \ + $(BOOST_CPPFLAGS) CXXFLAGS += -I${KERNEL_ROOT_DIR}/include/salome -I${GEOM_ROOT_DIR}/include/salome #$(OCC_CXXFLAGS) -LDFLAGS += -lOCCViewer -lVTKViewer -lSalomeObject -lSalomeGUI -lSMESHObject -lSMDS -lSMESHDS -lSMESHFiltersSelection -lGEOMClient -lMeshDriverDAT -lMeshDriverMED -lMeshDriverUNV $(OCC_KERNEL_LIBS) -L${KERNEL_ROOT_DIR}/lib/salome -L${GEOM_ROOT_DIR}/lib/salome +LDFLAGS += -lOCCViewer -lVTKViewer -lSalomeObject -lSalomeGUI -lSMESHObject -lSMDS -lSMESHDS -lSMESHFiltersSelection -lGEOMClient -lMeshDriverDAT -lMeshDriverMED -lMeshDriverUNV $(OCC_KERNEL_LIBS) -L${KERNEL_ROOT_DIR}/lib/salome -L${GEOM_ROOT_DIR}/lib/salome -lSalomeGenericObj @CONCLUDE@ diff --git a/src/SMESHGUI/SMESHGUI.cxx b/src/SMESHGUI/SMESHGUI.cxx index 5f56add8f..089f08e06 100644 --- a/src/SMESHGUI/SMESHGUI.cxx +++ b/src/SMESHGUI/SMESHGUI.cxx @@ -17,45 +17,42 @@ // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // -// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org -// -// +// See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org // // File : SMESHGUI.cxx // Author : Nicolas REJNERI // Module : SMESH // $Header$ -using namespace std; #include "SMESHGUI.h" #include "SMESHGUI_AddHypothesisDlg.h" #include "SMESHGUI_AddAlgorithmDlg.h" #include "SMESHGUI_InitMeshDlg.h" -#include "SMESHGUI_LocalLengthDlg.h" -#include "SMESHGUI_NbSegmentsDlg.h" #include "SMESHGUI_AddSubMeshDlg.h" #include "SMESHGUI_NodesDlg.h" #include "SMESHGUI_TransparencyDlg.h" +#include "SMESHGUI_GroupDlg.h" #include "SMESHGUI_RemoveNodesDlg.h" #include "SMESHGUI_RemoveElementsDlg.h" #include "SMESHGUI_MeshInfosDlg.h" #include "SMESHGUI_Preferences_ColorDlg.h" -#include "SMESHGUI_MaxElementAreaDlg.h" -#include "SMESHGUI_MaxElementVolumeDlg.h" #include "SMESHGUI_Preferences_ScalarBarDlg.h" -#include "SMESHGUI_EditScalarBarDlg.h" +#include "SMESHGUI_Preferences_SelectionDlg.h" #include "SMESHGUI_aParameterDlg.h" #include "SMESHGUI_ComputeScalarValue.h" #include "SMESHGUI_MoveNodesDlg.h" #include "SMESHGUI_OrientationElementsDlg.h" #include "SMESHGUI_DiagonalInversionDlg.h" -#include "SMESHGUI_EdgesConnectivityDlg.h" #include "SMESHGUI_AddFaceDlg.h" #include "SMESHGUI_AddEdgeDlg.h" #include "SMESHGUI_AddVolumeDlg.h" #include "SMESHGUI_EditHypothesesDlg.h" +#include "SMESHGUI_CreateHypothesesDlg.h" +#include "SMESHGUI_FilterDlg.h" +#include "SMESHGUI_XmlHandler.h" -#include "SMESH_Grid.h" +#include "SMESH_Actor.h" +#include "SMESH_Object.h" // SALOME Includes #include "Utils_ORB_INIT.hxx" @@ -69,23 +66,27 @@ using namespace std; #include "QAD_MessageBox.h" #include "QAD_Resource.h" #include "QAD_FileDlg.h" -#include "SALOMEGUI_Desktop.h" -#include "SALOMEGUI_NameDlg.h" +#include "QAD_Desktop.h" +#include "QAD_ResourceMgr.h" +#include "QAD_WaitCursor.h" #include "OCCViewer_ViewPort.h" #include "OCCViewer_ViewPort3d.h" #include "OCCViewer_Viewer3d.h" -#include "GEOM_Client.hxx" #include "GEOM_InteractiveObject.hxx" #include "SALOME_NamingService.hxx" #include "SALOME_ListIteratorOfListIO.hxx" #include "SALOME_InteractiveObject.hxx" +#include "SALOMEGUI_Desktop.h" +#include "SALOMEGUI_NameDlg.h" #include "SALOMEGUI_ImportOperation.h" #include "SALOMEGUI_QtCatchCorbaException.hxx" + #include "utilities.h" +#include #include "SMDS_Mesh.hxx" #include "SMESHDS_Document.hxx" @@ -118,7 +119,6 @@ using namespace std; #include #include #include -#include #include #include #include @@ -128,18 +128,367 @@ using namespace std; // VTK Includes #include "VTKViewer_Common.h" #include "VTKViewer_ViewFrame.h" +#include "VTKViewer_InteractorStyleSALOME.h" + +#include #include #include #include +#include // Open CASCADE Includes #include #include -static GEOM_Client ShapeReader; +#include + static SMESHGUI *smeshGUI = 0; static CORBA::ORB_var _orb; +using namespace std; + +typedef pair TKeyOfVisualObj; +typedef boost::shared_ptr TVisualObjPtr; +typedef map TVisualObjCont; +static TVisualObjCont VISUALOBJCONT; + + +TVisualObjPtr GetVisualObj(int theStudyId, const char* theEntry){ + TVisualObjPtr aVisualObj; + try{ + TVisualObjCont::key_type aKey(theStudyId,theEntry); + TVisualObjCont::iterator anIter = VISUALOBJCONT.find(aKey); + if(anIter != VISUALOBJCONT.end()){ + aVisualObj = anIter->second; + }else{ + SALOMEDS::Study_var aStudy = QAD_Application::getDesktop()->getActiveStudy()->getStudyDocument(); + SALOMEDS::SObject_var aSObj = aStudy->FindObjectID(theEntry); + if(!CORBA::is_nil(aSObj)){ + SALOMEDS::GenericAttribute_var anAttr; + if(aSObj->FindAttribute(anAttr,"AttributeIOR")){ + SALOMEDS::AttributeIOR_var anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); + CORBA::String_var aVal = anIOR->Value(); + CORBA::Object_var anObj =_orb->string_to_object(aVal.in()); + if(!CORBA::is_nil(anObj)){ + //Try narrow to SMESH_Mesh interafce + SMESH::SMESH_Mesh_var aMesh = SMESH::SMESH_Mesh::_narrow(anObj); + if(!aMesh->_is_nil()){ + aVisualObj.reset(new SMESH_MeshObj(aMesh)); + aVisualObj->Update(); + TVisualObjCont::value_type aValue(aKey,aVisualObj); + VISUALOBJCONT.insert(aValue); + return aVisualObj; + } + //Try narrow to SMESH_Group interafce + SMESH::SMESH_Group_var aGroup = SMESH::SMESH_Group::_narrow(anObj); + if(!aGroup->_is_nil()){ + SALOMEDS::SObject_var aFatherSObj = aSObj->GetFather(); + if(aFatherSObj->_is_nil()) return aVisualObj; + aFatherSObj = aFatherSObj->GetFather(); + if(aFatherSObj->_is_nil()) return aVisualObj; + CORBA::String_var anEntry = aFatherSObj->GetID(); + TVisualObjPtr aVisObj = GetVisualObj(theStudyId,anEntry.in()); + if(SMESH_MeshObj* aMeshObj = dynamic_cast(aVisObj.get())){ + aVisualObj.reset(new SMESH_GroupObj(aGroup,aMeshObj)); + aVisualObj->Update(); + TVisualObjCont::value_type aValue(aKey,aVisualObj); + VISUALOBJCONT.insert(aValue); + return aVisualObj; + } + } + //Try narrow to SMESH_subMesh interafce + SMESH::SMESH_subMesh_var aSubMesh = SMESH::SMESH_subMesh::_narrow(anObj); + if(!aSubMesh->_is_nil()){ + SALOMEDS::SObject_var aFatherSObj = aSObj->GetFather(); + if(aFatherSObj->_is_nil()) return aVisualObj; + aFatherSObj = aFatherSObj->GetFather(); + if(aFatherSObj->_is_nil()) return aVisualObj; + CORBA::String_var anEntry = aFatherSObj->GetID(); + TVisualObjPtr aVisObj = GetVisualObj(theStudyId,anEntry.in()); + if(SMESH_MeshObj* aMeshObj = dynamic_cast(aVisObj.get())){ + aVisualObj.reset(new SMESH_subMeshObj(aSubMesh,aMeshObj)); + aVisualObj->Update(); + TVisualObjCont::value_type aValue(aKey,aVisualObj); + VISUALOBJCONT.insert(aValue); + return aVisualObj; + } + } + } + } + } + } + }catch(...){ + INFOS("GetMeshObj - There is no SMESH_Mesh object for the SALOMEDS::Strudy and Entry!!!"); + } + return aVisualObj; +} + + +VTKViewer_ViewFrame* GetVtkViewFrame(QAD_StudyFrame* theStudyFrame){ + QAD_ViewFrame* aViewFrame = theStudyFrame->getRightFrame()->getViewFrame(); + return dynamic_cast(aViewFrame); +} + +void UpdateSelectionProp() { + QAD_Study* aStudy = SMESHGUI::GetSMESHGUI()->GetActiveStudy(); + QList aFrameList = aStudy->getStudyFrames(); + + QString SCr, SCg, SCb; + SCr = QAD_CONFIG->getSetting("SMESH:SettingsSelectColorRed"); + SCg = QAD_CONFIG->getSetting("SMESH:SettingsSelectColorGreen"); + SCb = QAD_CONFIG->getSetting("SMESH:SettingsSelectColorBlue"); + QColor aHiColor = Qt::white; + if (!SCr.isEmpty() && !SCg.isEmpty() && !SCb.isEmpty()) + aHiColor = QColor(SCr.toInt(), SCg.toInt(), SCb.toInt()); + + SCr = QAD_CONFIG->getSetting("SMESH:SettingsItemSelectColorRed"); + SCg = QAD_CONFIG->getSetting("SMESH:SettingsItemSelectColorGreen"); + SCb = QAD_CONFIG->getSetting("SMESH:SettingsItemSelectColorBlue"); + QColor aSelColor = Qt::yellow; + if (!SCr.isEmpty() && !SCg.isEmpty() && !SCb.isEmpty()) + aSelColor = QColor(SCr.toInt(), SCg.toInt(), SCb.toInt()); + QString SW = QAD_CONFIG->getSetting("SMESH:SettingsItemSelectWidth"); + if (SW.isEmpty()) SW = "5"; + + SCr = QAD_CONFIG->getSetting("SMESH:SettingsPreSelectColorRed"); + SCg = QAD_CONFIG->getSetting("SMESH:SettingsPreSelectColorGreen"); + SCb = QAD_CONFIG->getSetting("SMESH:SettingsPreSelectColorBlue"); + QColor aPreColor = Qt::cyan; + if (!SCr.isEmpty() && !SCg.isEmpty() && !SCb.isEmpty()) + aPreColor = QColor(SCr.toInt(), SCg.toInt(), SCb.toInt()); + QString PW = QAD_CONFIG->getSetting("SMESH:SettingsPreSelectWidth"); + if (PW.isEmpty()) PW = "5"; + + QString SP1 = QAD_CONFIG->getSetting("SMESH:SettingsNodeSelectTol"); + if (SP1.isEmpty()) SP1 = "0.025"; + QString SP2 = QAD_CONFIG->getSetting("SMESH:SettingsElementsSelectTol"); + if (SP2.isEmpty()) SP2 = "0.001"; + + for (QAD_StudyFrame* aStudyFrame = aFrameList.first(); aStudyFrame; aStudyFrame = aFrameList.next()) { + if (aStudyFrame->getTypeView() == VIEW_VTK) { + VTKViewer_ViewFrame* aVtkViewFrame = GetVtkViewFrame(aStudyFrame); + if (!aVtkViewFrame) continue; + // update VTK viewer properties + VTKViewer_RenderWindowInteractor* anInteractor = aVtkViewFrame->getRWInteractor(); + if (anInteractor) { + // mesh element selection + anInteractor->SetSelectionProp(aSelColor.red()/255., aSelColor.green()/255., + aSelColor.blue()/255., SW.toInt()); + + // tolerances + anInteractor->SetSelectionTolerance(SP1.toDouble(), SP2.toDouble()); + + // pre-selection + VTKViewer_InteractorStyleSALOME* aStyle = anInteractor->GetInteractorStyleSALOME(); + if (aStyle) { + aStyle->setPreselectionProp(aPreColor.red()/255., aPreColor.green()/255., + aPreColor.blue()/255., PW.toInt()); + } + } + // update actors + vtkRenderer* aRenderer = aVtkViewFrame->getRenderer(); + vtkActorCollection *aCollection = aRenderer->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.); + } + } + } + } +} + +VTKViewer_ViewFrame* GetCurrentVtkView(){ + QAD_Study* aStudy = SMESHGUI::GetSMESHGUI()->GetActiveStudy(); + QAD_StudyFrame *aStudyFrame = aStudy->getActiveStudyFrame(); + return GetVtkViewFrame(aStudyFrame); +} + + +SMESH_Actor* FindActorByEntry(QAD_StudyFrame *theStudyFrame, + const char* theEntry) +{ + if(VTKViewer_ViewFrame* aViewFrame = GetVtkViewFrame(theStudyFrame)){ + vtkRenderer *aRenderer = aViewFrame->getRenderer(); + vtkActorCollection *aCollection = aRenderer->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; + } + } + } + } + } + return NULL; +} + + +SMESH_Actor* FindActorByEntry(const char* theEntry){ + QAD_Study* aStudy = SMESHGUI::GetSMESHGUI()->GetActiveStudy(); + QAD_StudyFrame *aStudyFrame = aStudy->getActiveStudyFrame(); + return FindActorByEntry(aStudyFrame,theEntry); +} + + +SMESH_Actor* CreateActor(SALOMEDS::Study_ptr theStudy, + const char* theEntry, + int theIsClear = false) +{ + SMESH_Actor *anActor = NULL; + CORBA::Long anId = theStudy->StudyId(); + if(TVisualObjPtr aVisualObj = GetVisualObj(anId,theEntry)){ + SALOMEDS::SObject_var aSObj = theStudy->FindObjectID(theEntry); + if(!aSObj->_is_nil()){ + SALOMEDS::GenericAttribute_var anAttr; + if(aSObj->FindAttribute(anAttr,"AttributeName")){ + SALOMEDS::AttributeName_var aName = SALOMEDS::AttributeName::_narrow(anAttr); + CORBA::String_var aVal = aName->Value(); + string aNameVal = aVal.in(); + SMESH::FilterManager_ptr aFilterMgr = smeshGUI->GetFilterMgr(); + anActor = SMESH_Actor::New(aVisualObj,aFilterMgr,theEntry,aNameVal.c_str(),theIsClear); + } + } + } + return anActor; +} + + +void DisplayActor(QAD_StudyFrame *theStudyFrame, SMESH_Actor* theActor){ + if(VTKViewer_ViewFrame* aViewFrame = GetVtkViewFrame(theStudyFrame)){ + aViewFrame->AddActor(theActor); + aViewFrame->Repaint(); + } +} + + +void RemoveActor(QAD_StudyFrame *theStudyFrame, SMESH_Actor* theActor){ + if(VTKViewer_ViewFrame* aViewFrame = GetVtkViewFrame(theStudyFrame)){ + aViewFrame->RemoveActor(theActor); + aViewFrame->Repaint(); + } +} + + +void FitAll(){ + if(VTKViewer_ViewFrame* aViewFrame = GetCurrentVtkView()){ + aViewFrame->onViewFitAll(); + aViewFrame->Repaint(); + } +} + +vtkRenderer* GetCurrentRenderer(){ + if(VTKViewer_ViewFrame* aViewFrame = GetCurrentVtkView()) + return aViewFrame->getRenderer(); + return NULL; +} + +void RepaintCurrentView(){ + if(VTKViewer_ViewFrame* aViewFrame = GetCurrentVtkView()) + aViewFrame->Repaint(); +} + + +enum EDisplaing {eDisplayAll, eDisplay, eDisplayOnly, eErase, eEraseAll}; +void UpdateView(QAD_StudyFrame *theStudyFrame, EDisplaing theAction, + const char* theEntry = "") +{ + if(VTKViewer_ViewFrame* aViewFrame = GetVtkViewFrame(theStudyFrame)){ + vtkRenderer *aRenderer = aViewFrame->getRenderer(); + vtkActorCollection *aCollection = aRenderer->GetActors(); + aCollection->InitTraversal(); + switch(theAction){ + case eDisplayAll: { + 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); + } + } + } + default: { + if(SMESH_Actor *anActor = FindActorByEntry(theStudyFrame,theEntry)){ + switch(theAction) { + case eDisplay: + case eDisplayOnly: + anActor->SetVisibility(true); + break; + case eErase: + anActor->SetVisibility(false); + break; + } + } else { + switch(theAction){ + case eDisplay: + case eDisplayOnly:{ + QAD_Study* aStudy = theStudyFrame->getStudy(); + SALOMEDS::Study_var aDocument = aStudy->getStudyDocument(); + if(anActor = CreateActor(aDocument,theEntry,true)) { + DisplayActor(theStudyFrame,anActor); + FitAll(); + } + break; + } + } + } + } + } + } +} + + +void UpdateView(EDisplaing theAction, const char* theEntry = ""){ + QAD_Study* aStudy = SMESHGUI::GetSMESHGUI()->GetActiveStudy(); + QAD_StudyFrame *aStudyFrame = aStudy->getActiveStudyFrame(); + UpdateView(aStudyFrame,theAction,theEntry); +} + +static bool IsReferencedObject( SALOMEDS::SObject_ptr SO ) +{ + if ( !SO->_is_nil() ) { + SALOMEDS::GenericAttribute_var anAttr; + if ( SO->FindAttribute( anAttr, "AttributeTarget" ) ) { + SALOMEDS::AttributeTarget_var aTarget = SALOMEDS::AttributeTarget::_narrow( anAttr ); + SALOMEDS::Study::ListOfSObject_var aList = aTarget->Get(); + if ( aList->length() > 0 ) { + return true; + } + } + } + return false; +} + +void SetPointRepresentation(bool theIsVisible){ + if(VTKViewer_ViewFrame* aViewFrame = GetCurrentVtkView()){ + vtkRenderer *aRenderer = aViewFrame->getRenderer(); + vtkActorCollection *aCollection = aRenderer->GetActors(); + aCollection->InitTraversal(); + while(vtkActor *anAct = aCollection->GetNextActor()){ + if(SMESH_Actor *anActor = dynamic_cast(anAct)){ + if(anActor->GetVisibility()){ + anActor->SetPointRepresentation(theIsVisible); + } + } + } + RepaintCurrentView(); + } +} + + //============================================================================= /*! * @@ -147,30 +496,30 @@ static CORBA::ORB_var _orb; //============================================================================= class CustomItem:public QCustomMenuItem { - public: - CustomItem(const QString & s, const QFont & f):string(s), font(f) - { - }; - ~CustomItem() - { - } - - void paint(QPainter * p, const QColorGroup & /*cg */ , bool /*act */ , - bool /*enabled */ , int x, int y, int w, int h) - { - p->setFont(font); - p->drawText(x, y, w, h, - AlignHCenter | AlignVCenter | ShowPrefix | DontClip, string); - } - - QSize sizeHint() - { - return QFontMetrics(font). - size(AlignHCenter | AlignVCenter | ShowPrefix | DontClip, string); - } - private: - QString string; - QFont font; + public: + CustomItem(const QString & s, const QFont & f):string(s), font(f) + { + }; + ~CustomItem() + { + } + + void paint(QPainter * p, const QColorGroup & /*cg */ , bool /*act */ , + bool /*enabled */ , int x, int y, int w, int h) + { + p->setFont(font); + p->drawText(x, y, w, h, + AlignHCenter | AlignVCenter | ShowPrefix | DontClip, string); + } + + QSize sizeHint() + { + return QFontMetrics(font). + size(AlignHCenter | AlignVCenter | ShowPrefix | DontClip, string); + } + private: + QString string; + QFont font; }; //============================================================================= @@ -197,9 +546,11 @@ SMESHGUI::~SMESHGUI() * */ //============================================================================= -SMESHGUI *SMESHGUI::GetSMESHGUI() +SMESHGUI* SMESHGUI::GetSMESHGUI() { - return smeshGUI; + if ( !smeshGUI ) + GetOrCreateSMESHGUI( QAD_Application::getDesktop() ); + return smeshGUI; } //============================================================================= @@ -207,55 +558,60 @@ SMESHGUI *SMESHGUI::GetSMESHGUI() * */ //============================================================================= -SMESHGUI *SMESHGUI::GetOrCreateSMESHGUI(QAD_Desktop * desktop) +SMESHGUI* SMESHGUI::GetOrCreateSMESHGUI( QAD_Desktop* desktop ) { - if (smeshGUI == 0) - { - setOrb(); - smeshGUI = new SMESHGUI; - smeshGUI->myActiveDialogBox = 0; - smeshGUI->myState = -1; - smeshGUI->myDesktop = desktop; - smeshGUI->myActiveStudy = desktop->getActiveStudy(); - - Engines::Component_var comp = - desktop->getEngine("FactoryServer", "SMESH"); - smeshGUI->myComponentMesh = SMESH::SMESH_Gen::_narrow(comp); - - Engines::Component_var comp1 = - desktop->getEngine("FactoryServer", "GEOM"); - smeshGUI->myComponentGeom = GEOM::GEOM_Gen::_narrow(comp1); - - /* GetCurrentStudy */ - smeshGUI->myStudyId = smeshGUI->myActiveStudy->getStudyId(); - - smeshGUI->myComponentGeom->GetCurrentStudy(smeshGUI->myStudyId); - // smeshGUI->myComponentGeom->NbLabels(); - - smeshGUI->myStudy = smeshGUI->myActiveStudy->getStudyDocument(); - - smeshGUI->myStudyAPI = - SMESHGUI_StudyAPI(smeshGUI->myStudy, smeshGUI->myComponentMesh); - - smeshGUI->myDocument = new SMESHDS_Document(1); //NBU - - smeshGUI->mySimulationActors = vtkActorCollection::New(); - smeshGUI->mySimulationActors2D = vtkActor2DCollection::New(); - } - else - { - /* study may have changed */ - smeshGUI->myActiveStudy = desktop->getActiveStudy(); - smeshGUI->myStudyAPI.Update(smeshGUI->myComponentMesh); - } - - /* Automatic Update */ - if (desktop->menuBar()->isItemChecked(1001)) - smeshGUI->myAutomaticUpdate = true; - else - smeshGUI->myAutomaticUpdate = false; - - return smeshGUI; + if( !smeshGUI ) { + setOrb(); + smeshGUI = new SMESHGUI; + smeshGUI->myActiveDialogBox = 0 ; + smeshGUI->myState = -1 ; + smeshGUI->myDesktop = desktop ; + + /* get smesh engine */ + Engines::Component_var comp = desktop->getEngine("FactoryServer", "SMESH"); + smeshGUI->myComponentMesh = SMESH::SMESH_Gen::_narrow(comp); + + /* get geom engine */ + Engines::Component_var comp1 = desktop->getEngine("FactoryServer", "GEOM"); + smeshGUI->myComponentGeom = GEOM::GEOM_Gen::_narrow(comp1); + + /* set current study */ + smeshGUI->myActiveStudy = desktop->getActiveStudy(); + smeshGUI->myStudyId = smeshGUI->myActiveStudy->getStudyId(); + smeshGUI->myStudy = smeshGUI->myActiveStudy->getStudyDocument(); + smeshGUI->myComponentGeom->GetCurrentStudy( smeshGUI->myStudyId ); + smeshGUI->myComponentMesh->SetCurrentStudy( smeshGUI->myStudy ); + // smeshGUI->myComponentGeom->NbLabels(); + + /* create service object */ + smeshGUI->myStudyAPI = SMESHGUI_StudyAPI(smeshGUI->myStudy, smeshGUI->myComponentMesh); + + smeshGUI->myDocument = new SMESHDS_Document(1);//NBU + + smeshGUI->mySimulationActors = vtkActorCollection::New(); + smeshGUI->mySimulationActors2D = vtkActor2DCollection::New(); + + /*filter manager*/ + smeshGUI->myFilterMgr = smeshGUI->myComponentMesh->CreateFilterManager(); + + /* load resources for all available meshers */ + smeshGUI->InitAvailableHypotheses(); + } else { + /* study may have changed - set current study */ + smeshGUI->myActiveStudy = desktop->getActiveStudy(); + smeshGUI->myStudyId = smeshGUI->myActiveStudy->getStudyId(); + smeshGUI->myStudy = smeshGUI->myActiveStudy->getStudyDocument(); + smeshGUI->myComponentGeom->GetCurrentStudy( smeshGUI->myStudyId ); + smeshGUI->myComponentMesh->SetCurrentStudy( smeshGUI->myStudy ); + + // Set active study to Study API + smeshGUI->myStudyAPI.Update( smeshGUI->myStudy ); + } + + /* Automatic Update flag */ + smeshGUI->myAutomaticUpdate = ( QAD_CONFIG->getSetting( "SMESH:AutomaticUpdate" ).compare( "true" ) == 0 ); + + return smeshGUI; } //============================================================================= @@ -265,8 +621,8 @@ SMESHGUI *SMESHGUI::GetOrCreateSMESHGUI(QAD_Desktop * desktop) //============================================================================= void SMESHGUI::SetState(int aState) { - this->myState = aState; - return; + this->myState = aState; + return; } //============================================================================= @@ -276,8 +632,8 @@ void SMESHGUI::SetState(int aState) //============================================================================= void SMESHGUI::ResetState() { - this->myState = -1; - return; + this->myState = -1; + return; } //============================================================================= @@ -287,8 +643,8 @@ void SMESHGUI::ResetState() //============================================================================= void SMESHGUI::EmitSignalDeactivateDialog() { - emit this->SignalDeactivateActiveDialog(); - return; + emit this->SignalDeactivateActiveDialog(); + return; } //============================================================================= @@ -298,8 +654,8 @@ void SMESHGUI::EmitSignalDeactivateDialog() //============================================================================= void SMESHGUI::EmitSignalCloseAllDialogs() { - emit this->SignalCloseAllDialogs(); - return; + emit SignalCloseAllDialogs(); + return; } //============================================================================= @@ -309,7 +665,7 @@ void SMESHGUI::EmitSignalCloseAllDialogs() //============================================================================= QDialog *SMESHGUI::GetActiveDialogBox() { - return this->myActiveDialogBox; + return this->myActiveDialogBox; } //============================================================================= @@ -319,8 +675,8 @@ QDialog *SMESHGUI::GetActiveDialogBox() //============================================================================= void SMESHGUI::SetActiveDialogBox(QDialog * aDlg) { - this->myActiveDialogBox = (QDialog *) aDlg; - return; + this->myActiveDialogBox = (QDialog *) aDlg; + return; } //============================================================================= @@ -330,7 +686,7 @@ void SMESHGUI::SetActiveDialogBox(QDialog * aDlg) //============================================================================= QAD_Study *SMESHGUI::GetActiveStudy() { - return this->myActiveStudy; + return this->myActiveStudy; } //============================================================================= @@ -340,7 +696,7 @@ QAD_Study *SMESHGUI::GetActiveStudy() //============================================================================= SALOMEDS::Study_ptr SMESHGUI::GetStudy() { - return SALOMEDS::Study::_narrow(myStudy); + return SALOMEDS::Study::_narrow(myStudy); } //============================================================================= @@ -350,7 +706,7 @@ SALOMEDS::Study_ptr SMESHGUI::GetStudy() //============================================================================= SMESHGUI_StudyAPI SMESHGUI::GetStudyAPI() { - return myStudyAPI; + return myStudyAPI; } //============================================================================= @@ -360,7 +716,7 @@ SMESHGUI_StudyAPI SMESHGUI::GetStudyAPI() //============================================================================= QAD_Desktop *SMESHGUI::GetDesktop() { - return this->myDesktop; + return this->myDesktop; } //============================================================================= @@ -368,21 +724,23 @@ QAD_Desktop *SMESHGUI::GetDesktop() * */ //============================================================================= -vtkScalarBarActor *SMESHGUI::GetScalarBar() +void SMESHGUI::activeStudyChanged(QAD_Desktop* parent) { - vtkRenderer *aRenderer = - ((VTKViewer_ViewFrame *) myActiveStudy->getActiveStudyFrame()-> - getRightFrame()->getViewFrame())->getRenderer(); - vtkActor2DCollection *actor2DList = aRenderer->GetActors2D(); - actor2DList->InitTraversal(); - vtkActor2D *aActor2d = actor2DList->GetNextActor2D(); - while (aActor2d != NULL) - { - if (aActor2d->IsA("vtkScalarBarActor")) - return vtkScalarBarActor::SafeDownCast(aActor2d); - actor2DList->GetNextActor2D(); - } - return NULL; + MESSAGE("SMESHGUI::activeStudyChanged init."); + QAD_Study* prevStudy = 0; + if ( smeshGUI ) + prevStudy = smeshGUI->myActiveStudy; + /* Create or retrieve an object SMESHGUI */ + MESSAGE("Active study changed : prev study =" << prevStudy); + SMESHGUI::GetOrCreateSMESHGUI( parent ); + MESSAGE("Active study changed : active study =" << smeshGUI->myActiveStudy); + if ( prevStudy != smeshGUI->myActiveStudy ) { + smeshGUI->EmitSignalCloseAllDialogs(); + MESSAGE("Active study changed : SMESHGUI nullified" << endl); + //smeshGUI = 0; + ::UpdateSelectionProp(); + } + MESSAGE("SMESHGUI::activeStudyChanged done.") return; } //============================================================================= @@ -390,20 +748,15 @@ vtkScalarBarActor *SMESHGUI::GetScalarBar() * */ //============================================================================= -void SMESHGUI::activeStudyChanged(QAD_Desktop * parent) +bool SMESHGUI::DefineDlgPosition(QWidget * aDlg, int &x, int &y) { - MESSAGE("SMESHGUI::activeStudyChanged init.") - /* Create or retrieve an object SMESHGUI */ - SMESHGUI::GetOrCreateSMESHGUI(parent); - if (smeshGUI != 0) - { - smeshGUI->EmitSignalCloseAllDialogs(); - MESSAGE("Active study changed : SMESHGUI nullified" << endl); - smeshGUI = 0; - } - - //smeshGUI->SetSettings( parent ); //DCQ : Pb. Multi-Etudes - MESSAGE("SMESHGUI::activeStudyChanged done.") return; + /* Here the position is on the bottom right corner - 10 */ + // aDlg->resize(QSize().expandedTo(aDlg->minimumSizeHint())); + aDlg->adjustSize(); + QAD_Desktop *PP = QAD_Application::getDesktop(); + x = abs(PP->x() + PP->size().width() - aDlg->size().width() - 10); + y = abs(PP->y() + PP->size().height() - aDlg->size().height() - 10); + return true; } //============================================================================= @@ -411,14 +764,39 @@ void SMESHGUI::activeStudyChanged(QAD_Desktop * parent) * */ //============================================================================= -bool SMESHGUI::DefineDlgPosition(QWidget * aDlg, int &x, int &y) +void SMESHGUI::EraseSimulationActors() { - /* Here the position is on the bottom right corner - 10 */ - aDlg->resize(QSize().expandedTo(aDlg->minimumSizeHint())); - QAD_Desktop *PP = QAD_Application::getDesktop(); - x = abs(PP->x() + PP->size().width() - aDlg->size().width() - 10); - y = abs(PP->y() + PP->size().height() - aDlg->size().height() - 10); - return true; + if (myActiveStudy->getActiveStudyFrame()->getTypeView() == VIEW_VTK) + { //VTK + vtkRenderer *theRenderer = + ((VTKViewer_ViewFrame *) myActiveStudy->getActiveStudyFrame()-> + getRightFrame()->getViewFrame())->getRenderer(); + vtkRenderWindow *renWin = theRenderer->GetRenderWindow(); + + if (mySimulationActors != NULL) + { + mySimulationActors->InitTraversal(); + vtkActor *ac = mySimulationActors->GetNextActor(); + while (!(ac == NULL)) + { + theRenderer->RemoveActor(ac); + ac = mySimulationActors->GetNextActor(); + } + mySimulationActors->RemoveAllItems(); + } + if (mySimulationActors2D != NULL) + { + mySimulationActors2D->InitTraversal(); + vtkActor2D *ac = mySimulationActors2D->GetNextActor2D(); + while (!(ac == NULL)) + { + theRenderer->RemoveActor2D(ac); + ac = mySimulationActors2D->GetNextActor2D(); + } + mySimulationActors2D->RemoveAllItems(); + } + SetPointRepresentation(false); + } } //============================================================================= @@ -426,40 +804,23 @@ bool SMESHGUI::DefineDlgPosition(QWidget * aDlg, int &x, int &y) * */ //============================================================================= -void SMESHGUI::EraseSimulationActors() +SMESH::SMESH_Mesh_ptr SMESHGUI::InitMesh( GEOM::GEOM_Shape_ptr aShape, + QString NameMesh ) { - if (myActiveStudy->getActiveStudyFrame()->getTypeView() == VIEW_VTK) - { //VTK - vtkRenderer *theRenderer = - ((VTKViewer_ViewFrame *) myActiveStudy->getActiveStudyFrame()-> - getRightFrame()->getViewFrame())->getRenderer(); - vtkRenderWindow *renWin = theRenderer->GetRenderWindow(); - - if (mySimulationActors != NULL) - { - - mySimulationActors->InitTraversal(); - vtkActor *ac = mySimulationActors->GetNextActor(); - while (!(ac == NULL)) - { - theRenderer->RemoveActor(ac); - ac = mySimulationActors->GetNextActor(); - } - mySimulationActors->RemoveAllItems(); - } - if (mySimulationActors2D != NULL) - { - mySimulationActors2D->InitTraversal(); - vtkActor2D *ac = mySimulationActors2D->GetNextActor2D(); - while (!(ac == NULL)) - { - theRenderer->RemoveActor2D(ac); - ac = mySimulationActors2D->GetNextActor2D(); - } - mySimulationActors2D->RemoveAllItems(); - } - renWin->Render(); - } + try { + if ( !myComponentMesh->_is_nil() && !aShape->_is_nil() ) { + SMESH::SMESH_Mesh_var aMesh = myComponentMesh->CreateMesh( aShape ); + if ( !aMesh->_is_nil() ) { + SALOMEDS::SObject_var SM = smeshGUI->myStudy->FindObjectIOR( _orb->object_to_string( aMesh ) ); + myStudyAPI.SetName( SM, NameMesh ); + return SMESH::SMESH_Mesh::_narrow(aMesh); + } + } + } + catch( const SALOME::SALOME_Exception& S_ex ) { + QtCatchCorbaException( S_ex ); + } + return SMESH::SMESH_Mesh::_nil(); } //============================================================================= @@ -467,40 +828,21 @@ void SMESHGUI::EraseSimulationActors() * */ //============================================================================= -SMESH::SMESH_Mesh_ptr SMESHGUI::InitMesh(GEOM::GEOM_Shape_ptr aShape, - QString NameMesh) +SMESH::SMESH_subMesh_ptr SMESHGUI::AddSubMesh( SMESH::SMESH_Mesh_ptr aMesh, + GEOM::GEOM_Shape_ptr aShape, + QString NameMesh ) { - try - { - if (!myComponentMesh->_is_nil() && !aShape->_is_nil()) - { - SMESH::SMESH_Mesh_var aMesh = - myComponentMesh->Init(myComponentGeom, myStudyId, aShape); - - if (!aMesh->_is_nil()) - { - SALOMEDS::SObject_var SM = myStudyAPI.AddNewMesh(aMesh); - myStudyAPI.SetName(SM, NameMesh); - - // GEOM::GEOM_Shape has non-empty StudyShapeId only after AddInStudy operation, - // not after loading from file, so let's use more reliable way to retrieve SObject - Standard_CString ShapeIOR = _orb->object_to_string(aShape); - SALOMEDS::SObject_var SObject = - myStudy->FindObjectIOR(ShapeIOR); - if (!SObject->_is_nil() && !SM->_is_nil()) - { - myStudyAPI.SetShape(SM, SObject); - } - return SMESH::SMESH_Mesh::_narrow(aMesh); - } - } - } - catch(const SALOME::SALOME_Exception & S_ex) - { - QtCatchCorbaException(S_ex); - } - myActiveStudy->updateObjBrowser(true); - return SMESH::SMESH_Mesh::_nil(); + SMESH::SMESH_subMesh_var aSubMesh; + try { + if ( !aMesh->_is_nil() && !aShape->_is_nil() ) + // create sub mesh + aSubMesh = SMESH::SMESH_subMesh::_duplicate( aMesh->GetSubMesh( aShape, NameMesh.latin1() ) ); //VSR: published automatically + } + catch( const SALOME::SALOME_Exception& S_ex ) { + QtCatchCorbaException( S_ex ); + aSubMesh = SMESH::SMESH_subMesh::_nil(); + } + return aSubMesh._retn(); } //============================================================================= @@ -508,40 +850,22 @@ SMESH::SMESH_Mesh_ptr SMESHGUI::InitMesh(GEOM::GEOM_Shape_ptr aShape, * */ //============================================================================= -SMESH::SMESH_subMesh_ptr SMESHGUI::AddSubMesh(SMESH::SMESH_Mesh_ptr aMesh, - GEOM::GEOM_Shape_ptr aShape, QString NameMesh) +SMESH::SMESH_Group_ptr SMESHGUI::AddGroup( SMESH::SMESH_Mesh_ptr aMesh, + SMESH::ElementType aType, + QString aName ) { - try - { - SMESH::SMESH_subMesh_var aSubMesh = aMesh->GetElementsOnShape(aShape); - SALOMEDS::SObject_var SO_Mesh = myStudyAPI.FindMesh(aMesh); - Standard_CString ShapeIOR = _orb->object_to_string(aShape); - SALOMEDS::SObject_var SO_GeomShape = myStudy->FindObjectIOR(ShapeIOR); - - if (!SO_GeomShape->_is_nil() && !SO_Mesh->_is_nil() && - !aSubMesh->_is_nil() && !aMesh->_is_nil()) - { - SALOMEDS::SObject_var SO = - myStudyAPI.AddSubMeshOnShape(SO_Mesh, SO_GeomShape, aSubMesh, - aShape->ShapeType()); - myStudyAPI.SetName(SO, NameMesh); - - SMESH_Actor *amesh = SMESH_Actor::New(); - Handle(SALOME_InteractiveObject) IO = - new SALOME_InteractiveObject(SO->GetID(), "MESH", - strdup(NameMesh)); - amesh->setIO(IO); - amesh->setName(strdup(NameMesh)); - DisplayActor(amesh, false); - return SMESH::SMESH_subMesh::_narrow(aSubMesh); - } - } - catch(const SALOME::SALOME_Exception & S_ex) - { - QtCatchCorbaException(S_ex); - } - myActiveStudy->updateObjBrowser(true); - return SMESH::SMESH_subMesh::_nil(); + SMESH::SMESH_Group_var aGroup; + try { + if ( !aMesh->_is_nil() ) + // create group + aGroup = SMESH::SMESH_Group::_duplicate( aMesh->CreateGroup( aType, strdup(aName) ) ); //VSR: published automatically + } + catch( const SALOME::SALOME_Exception& S_ex ) { + QtCatchCorbaException( S_ex ); + aGroup = SMESH::SMESH_Group::_nil(); + } + myActiveStudy->updateObjBrowser( true ); + return aGroup._retn(); } //============================================================================= @@ -549,342 +873,247 @@ SMESH::SMESH_subMesh_ptr SMESHGUI::AddSubMesh(SMESH::SMESH_Mesh_ptr aMesh, * */ //============================================================================= -SMESH::SMESH_Hypothesis_ptr SMESHGUI::CreateHypothesis(QString TypeHypothesis, - QString NameHypothesis) -{ - SMESH::SMESH_Hypothesis_var Hyp; - try - { - Hyp = myComponentMesh->CreateHypothesis(TypeHypothesis, myStudyId); - if (!Hyp->_is_nil()) - { - SALOMEDS::SObject_var SHyp = myStudyAPI.AddNewHypothesis(Hyp); - myStudyAPI.SetName(SHyp, NameHypothesis); - } - } - catch(const SALOME::SALOME_Exception & S_ex) - { - QtCatchCorbaException(S_ex); - } - return SMESH::SMESH_Hypothesis::_narrow(Hyp); +static void addMap( const map& theMap, + map& toMap) +{ + map::const_iterator it; + for ( it = theMap.begin(); it != theMap.end(); it++ ) + toMap.insert( *it ); } + //============================================================================= /*! - * + * InitAvailableHypotheses (read from resource XML file) */ //============================================================================= -void SMESHGUI::AddHypothesisOnMesh(SMESH::SMESH_Mesh_ptr aMesh, - SMESH::SMESH_Hypothesis_ptr aHyp) +void SMESHGUI::InitAvailableHypotheses () { - if (!aMesh->_is_nil()) - { - QApplication::setOverrideCursor(Qt::waitCursor); - SALOMEDS::SObject_var SM = myStudyAPI.FindMesh(aMesh); - GEOM::GEOM_Shape_var aShape = myStudyAPI.GetShapeOnMeshOrSubMesh(SM); - try - { - bool res = aMesh->AddHypothesis(aShape, aHyp); - if (res) - { - SALOMEDS::SObject_var SH = - myStudyAPI.FindHypothesisOrAlgorithms(aHyp); - if (!SM->_is_nil() && !SH->_is_nil()) - { - myStudyAPI.SetHypothesis(SM, SH); - myStudyAPI.ModifiedMesh(SM, false); - } - QApplication::restoreOverrideCursor(); - } - else - { - QApplication::restoreOverrideCursor(); - QAD_MessageBox::warn1(QAD_Application::getDesktop(), - tr("SMESH_WRN_WARNING"), - tr("SMESH_WRN_HYPOTHESIS_ALREADYEXIST"), - tr("SMESH_BUT_YES")); - } - } - catch(const SALOME::SALOME_Exception & S_ex) - { - QtCatchCorbaException(S_ex); - } - } - myActiveStudy->updateObjBrowser(true); - QApplication::restoreOverrideCursor(); + QAD_WaitCursor wc; + if ((myHypothesesMap.begin() == myHypothesesMap.end()) && + (myAlgorithmsMap.begin() == myAlgorithmsMap.end())) + { + // Resource manager + QAD_ResourceMgr* resMgr = QAD_Desktop::createResourceManager(); + if (!resMgr) return; + + // Find name of a resource XML file ("SMESH_Meshers.xml"); + QString HypsXml; + char* cenv = getenv("SMESH_MeshersList"); + if (cenv) + HypsXml.sprintf("%s", cenv); + + QStringList HypsXmlList = QStringList::split( ":", HypsXml, false ); + if (HypsXmlList.count() == 0) + { + QAD_MessageBox::error1(QAD_Application::getDesktop(), + tr("SMESH_WRN_WARNING"), + tr("MESHERS_FILE_NO_VARIABLE"), + tr("SMESH_BUT_OK")); + return; + } + + // loop on files in HypsXml + QString aNoAccessFiles; + for ( int i = 0; i < HypsXmlList.count(); i++ ) { + QString HypsXml = HypsXmlList[ i ]; + + // Find full path to the resource XML file + QString xmlFile = HypsXml + ".xml"; + xmlFile = QAD_Tools::addSlash(resMgr->findFile(xmlFile, HypsXml)) + xmlFile; + + QFile file (QAD_Tools::unix2win(xmlFile)); + if (file.exists() && file.open(IO_ReadOnly)) + { + file.close(); + + SMESHGUI_XmlHandler* myXmlHandler = new SMESHGUI_XmlHandler(); + ASSERT(myXmlHandler); + + QXmlInputSource source (file); + QXmlSimpleReader reader; + reader.setContentHandler(myXmlHandler); + reader.setErrorHandler(myXmlHandler); + bool ok = reader.parse(source); + file.close(); + if (ok) + { + addMap( myXmlHandler->myHypothesesMap, myHypothesesMap ); + addMap( myXmlHandler->myAlgorithmsMap, myAlgorithmsMap ); + } + else + { + QAD_MessageBox::error1(myDesktop, + tr("INF_PARSE_ERROR"), + tr(myXmlHandler->errorProtocol()), + tr("SMESH_BUT_OK")); + } + } + else + { + if (aNoAccessFiles.isEmpty()) + aNoAccessFiles = xmlFile; + else + aNoAccessFiles += ", " + xmlFile; + } + } // end loop + + + if (!aNoAccessFiles.isEmpty()) + { + QString aMess = tr("MESHERS_FILE_CANT_OPEN") + " " + aNoAccessFiles + "\n"; + aMess += tr("MESHERS_FILE_CHECK_VARIABLE"); + wc.stop(); + QAD_MessageBox::warn1(QAD_Application::getDesktop(), + tr("SMESH_WRN_WARNING"), + aMess, + tr("SMESH_BUT_OK")); + wc.start(); + } + } } //============================================================================= /*! - * + * GetAvailableHypotheses (read from resource XML file) */ //============================================================================= -void SMESHGUI:: -RemoveHypothesisOrAlgorithmOnMesh(const Handle(SALOME_InteractiveObject) & - IObject) +QStringList SMESHGUI::GetAvailableHypotheses (const bool isAlgo) { - if (IObject->hasReference()) - { - SMESH::SMESH_Hypothesis_var anHyp; - SALOMEDS::SObject_var SO_Hypothesis = - smeshGUI->myStudy->FindObjectID(IObject->getEntry()); - SALOMEDS::GenericAttribute_var anAttr; - SALOMEDS::AttributeIOR_var anIOR; - - if (!SO_Hypothesis->_is_nil()) - { - QApplication::setOverrideCursor(Qt::waitCursor); - if (SO_Hypothesis->FindAttribute(anAttr, "AttributeIOR")) - { - anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); - anHyp = - SMESH::SMESH_Hypothesis::_narrow(_orb-> - string_to_object(anIOR->Value())); - } - - SALOMEDS::SObject_var SO_Applied_Hypothesis = - smeshGUI->myStudy->FindObjectID(IObject->getReference()); - if (!SO_Applied_Hypothesis->_is_nil()) - { - SALOMEDS::SObject_var MorSM = - smeshGUI->myStudyAPI. - GetMeshOrSubmesh(SO_Applied_Hypothesis); - if (!MorSM->_is_nil()) - { - smeshGUI->myStudyAPI.ModifiedMesh(MorSM, false); - - GEOM::GEOM_Shape_var aShape = - smeshGUI->myStudyAPI.GetShapeOnMeshOrSubMesh(MorSM); - if (!aShape->_is_nil()) - { - if (MorSM->FindAttribute(anAttr, "AttributeIOR")) - { - anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); - SMESH::SMESH_Mesh_var aMesh = - SMESH::SMESH_Mesh::_narrow(_orb-> - string_to_object(anIOR->Value())); - SMESH::SMESH_subMesh_var aSubMesh = - SMESH::SMESH_subMesh::_narrow(_orb-> - string_to_object(anIOR->Value())); - if (!aMesh->_is_nil()) - { - bool res = - aMesh->RemoveHypothesis(aShape, anHyp); - if (!res) - { - QApplication::restoreOverrideCursor(); - QAD_MessageBox::warn1(QAD_Application:: - getDesktop(), tr("SMESH_WRN_WARNING"), - tr("SMESH_WRN_HYPOTHESIS_NOTEXIST"), - tr("SMESH_BUT_YES")); - } - } - else if (!aSubMesh->_is_nil()) - { - aMesh = aSubMesh->GetFather(); - if (!aMesh->_is_nil()) - { - bool res = - aMesh->RemoveHypothesis(aShape, anHyp); - if (!res) - { - QApplication::restoreOverrideCursor(); - QAD_MessageBox::warn1(QAD_Application:: - getDesktop(), - tr("SMESH_WRN_WARNING"), - tr("SMESH_WRN_HYPOTHESIS_NOTEXIST"), - tr("SMESH_BUT_YES")); - } - } - } - if (myAutomaticUpdate) - { - SMESH_Actor *Mesh = smeshGUI->ReadScript(aMesh); - if (Mesh != NULL) - { -#ifdef TRACE - Dump(Mesh); -#endif - DisplayActor(Mesh); - DisplayEdges(Mesh); - smeshGUI->ChangeRepresentation(Mesh, - Mesh->getDisplayMode()); - } - } - } - } - } - smeshGUI->myStudyAPI.UnSetHypothesis(SO_Applied_Hypothesis); - } - } - } - else if (IObject->hasEntry()) - { - MESSAGE("IObject entry " << IObject->getEntry())} - QApplication::restoreOverrideCursor(); + QStringList aHypList; + + // Init list of available hypotheses, if needed + InitAvailableHypotheses(); + + // fill list of hypotheses/algorithms + map::iterator anIter; + if (isAlgo) + { + anIter = myAlgorithmsMap.begin(); + for (; anIter != myAlgorithmsMap.end(); anIter++) + { + aHypList.append(((*anIter).first).c_str()); + } + } + else + { + anIter = myHypothesesMap.begin(); + for (; anIter != myHypothesesMap.end(); anIter++) + { + aHypList.append(((*anIter).first).c_str()); + } + } + + return aHypList; } //============================================================================= /*! - * + * GetHypothesisData */ //============================================================================= -void SMESHGUI::RemoveHypothesisOrAlgorithmOnMesh(SALOMEDS::SObject_ptr MorSM, - SMESH::SMESH_Hypothesis_ptr anHyp) +HypothesisData* SMESHGUI::GetHypothesisData (const char* aHypType) { - SALOMEDS::SObject_var AHR, aRef; - SALOMEDS::GenericAttribute_var anAttr; - SALOMEDS::AttributeIOR_var anIOR; - - if (!MorSM->_is_nil()) - { - GEOM::GEOM_Shape_var aShape = - smeshGUI->myStudyAPI.GetShapeOnMeshOrSubMesh(MorSM); - if (!aShape->_is_nil()) - { - if (MorSM->FindAttribute(anAttr, "AttributeIOR")) - { - anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); - SMESH::SMESH_Mesh_var aMesh = - SMESH::SMESH_Mesh::_narrow(_orb->string_to_object(anIOR-> - Value())); - SMESH::SMESH_subMesh_var aSubMesh = - SMESH::SMESH_subMesh::_narrow(_orb->string_to_object(anIOR-> - Value())); - if (!aMesh->_is_nil()) - { - bool res = aMesh->RemoveHypothesis(aShape, anHyp); - if (!res) - { - QApplication::restoreOverrideCursor(); - QAD_MessageBox::warn1(QAD_Application::getDesktop(), - tr("SMESH_WRN_WARNING"), - tr("SMESH_WRN_HYPOTHESIS_NOTEXIST"), - tr("SMESH_BUT_YES")); - } - } - else if (!aSubMesh->_is_nil()) - { - aMesh = aSubMesh->GetFather(); - if (!aMesh->_is_nil()) - { - bool res = aMesh->RemoveHypothesis(aShape, anHyp); - if (!res) - { - QApplication::restoreOverrideCursor(); - QAD_MessageBox::warn1(QAD_Application::getDesktop(), - tr("SMESH_WRN_WARNING"), - tr("SMESH_WRN_HYPOTHESIS_NOTEXIST"), - tr("SMESH_BUT_YES")); - } - } - } - if (myAutomaticUpdate) - { - SMESH_Actor *Mesh = smeshGUI->ReadScript(aMesh); - if (Mesh != NULL) - { -#ifdef TRACE - Dump(Mesh); -#endif - DisplayActor(Mesh); - DisplayEdges(Mesh); - // smeshGUI->ChangeRepresentation( Mesh, Mesh->getDisplayMode() ); - } - } - } - } - - if (MorSM->FindSubObject(2, AHR)) - { - SALOMEDS::ChildIterator_var it = myStudy->NewChildIterator(AHR); - for (; it->More(); it->Next()) - { - SALOMEDS::SObject_var Obj = it->Value(); - if (Obj->ReferencedObject(aRef)) - { - if (aRef->FindAttribute(anAttr, "AttributeIOR")) - { - anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); - if (strcmp(anIOR->Value(), - _orb->object_to_string(anHyp)) == 0) - { - smeshGUI->myStudyAPI.UnSetHypothesis(Obj); - break; - } - } - } - } - } - if (MorSM->FindSubObject(3, AHR)) - { - SALOMEDS::ChildIterator_var it = myStudy->NewChildIterator(AHR); - for (; it->More(); it->Next()) - { - SALOMEDS::SObject_var Obj = it->Value(); - if (Obj->ReferencedObject(aRef)) - { - if (aRef->FindAttribute(anAttr, "AttributeIOR")) - { - anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); - if (strcmp(anIOR->Value(), - _orb->object_to_string(anHyp)) == 0) - { - smeshGUI->myStudyAPI.UnSetAlgorithm(Obj); - break; - } - } - } - } - } - smeshGUI->myStudyAPI.ModifiedMesh(MorSM, false); - } - QApplication::restoreOverrideCursor(); + HypothesisData* aHypData = 0; + + // Init list of available hypotheses, if needed + InitAvailableHypotheses(); + + if (myHypothesesMap.find(aHypType) == myHypothesesMap.end()) + { + if (myAlgorithmsMap.find(aHypType) != myAlgorithmsMap.end()) + { + aHypData = myAlgorithmsMap[aHypType]; + } + } + else + { + aHypData = myHypothesesMap[aHypType]; + } + return aHypData; } //============================================================================= -/*! - * +/*! + * Get a Hypothesis Creator from a Plugin Library */ //============================================================================= -void SMESHGUI::AddAlgorithmOnMesh(SMESH::SMESH_Mesh_ptr aMesh, - SMESH::SMESH_Hypothesis_ptr aHyp) +SMESHGUI_GenericHypothesisCreator* SMESHGUI::GetHypothesisCreator(const QString& aHypType) { - if (!aMesh->_is_nil()) - { - QApplication::setOverrideCursor(Qt::waitCursor); - SALOMEDS::SObject_var SM = myStudyAPI.FindMesh(aMesh); - GEOM::GEOM_Shape_var aShape = myStudyAPI.GetShapeOnMeshOrSubMesh(SM); - try - { - bool res = aMesh->AddHypothesis(aShape, aHyp); - if (res) - { - SALOMEDS::SObject_var SH = - myStudyAPI.FindHypothesisOrAlgorithms(aHyp); - if (!SM->_is_nil() && !SH->_is_nil()) - { - myStudyAPI.SetAlgorithms(SM, SH); - myStudyAPI.ModifiedMesh(SM, false); - } - } - else - { - QApplication::restoreOverrideCursor(); - QAD_MessageBox::warn1(QAD_Application::getDesktop(), - tr("SMESH_WRN_WARNING"), - tr("SMESH_WRN_ALGORITHM_ALREADYEXIST"), - tr("SMESH_BUT_YES")); - } - } - catch(const SALOME::SALOME_Exception & S_ex) - { - QtCatchCorbaException(S_ex); - } - } - myActiveStudy->updateObjBrowser(true); - QApplication::restoreOverrideCursor(); + char* sHypType = (char*)aHypType.latin1(); + MESSAGE("Get HypothesisCreator for " << sHypType); + + SMESHGUI_GenericHypothesisCreator* aCreator = 0; + + // check, if creator for this hypothesis type already exists + if (myHypCreatorMap.find(sHypType) != myHypCreatorMap.end()) + { + aCreator = myHypCreatorMap[sHypType]; + } + else + { + // 1. Init list of available hypotheses, if needed + InitAvailableHypotheses(); + + // 2. Get names of plugin libraries + HypothesisData* aHypData = GetHypothesisData(sHypType); + if (!aHypData) + { + return aCreator; + } + QString aClientLibName = aHypData->ClientLibName; + QString aServerLibName = aHypData->ServerLibName; + + // 3. Load Client Plugin Library + try + { + // load plugin library + MESSAGE("Loading client meshers plugin library ..."); + void* libHandle = dlopen (aClientLibName, RTLD_LAZY); + if (!libHandle) + { + // report any error, if occured + const char* anError = dlerror(); + MESSAGE(anError); + } + else + { + // get method, returning hypothesis creator + MESSAGE("Find GetHypothesisCreator() method ..."); + typedef SMESHGUI_GenericHypothesisCreator* (*GetHypothesisCreator) \ + (QString aHypType, QString aServerLibName, SMESHGUI* aSMESHGUI); + GetHypothesisCreator procHandle = + (GetHypothesisCreator)dlsym( libHandle, "GetHypothesisCreator" ); + if (!procHandle) + { + MESSAGE("bad hypothesis client plugin library"); + dlclose(libHandle); + } + else + { + // get hypothesis creator + MESSAGE("Get Hypothesis Creator for " << aHypType); + aCreator = procHandle(aHypType, aServerLibName, smeshGUI); + if (!aCreator) + { + MESSAGE("no such a hypothesis in this plugin"); + } + else + { + // map hypothesis creator to a hypothesis name + myHypCreatorMap[sHypType] = aCreator; + } + } + } + } + catch (const SALOME::SALOME_Exception& S_ex) + { + QtCatchCorbaException(S_ex); + } + } + + return aCreator; } //============================================================================= @@ -892,48 +1121,39 @@ void SMESHGUI::AddAlgorithmOnMesh(SMESH::SMESH_Mesh_ptr aMesh, * */ //============================================================================= -void SMESHGUI::AddHypothesisOnSubMesh(SMESH::SMESH_subMesh_ptr aSubMesh, - SMESH::SMESH_Hypothesis_ptr aHyp) +SMESH::SMESH_Hypothesis_ptr SMESHGUI::CreateHypothesis (const QString& aHypType, + const QString& aHypName, + const bool isAlgo) { - if (!aSubMesh->_is_nil()) - { - QApplication::setOverrideCursor(Qt::waitCursor); - try - { - SMESH::SMESH_Mesh_var aMesh = aSubMesh->GetFather(); - SALOMEDS::SObject_var SsubM = myStudyAPI.FindSubMesh(aSubMesh); - GEOM::GEOM_Shape_var aShape = - myStudyAPI.GetShapeOnMeshOrSubMesh(SsubM); - if (!aMesh->_is_nil()) - { - bool res = aMesh->AddHypothesis(aShape, aHyp); - if (res) - { - SALOMEDS::SObject_var SH = - myStudyAPI.FindHypothesisOrAlgorithms(aHyp); - if (!SsubM->_is_nil() && !SH->_is_nil()) - { - myStudyAPI.SetHypothesis(SsubM, SH); - myStudyAPI.ModifiedMesh(SsubM, false); - } - } - else - { - QApplication::restoreOverrideCursor(); - QAD_MessageBox::warn1(QAD_Application::getDesktop(), - tr("SMESH_WRN_WARNING"), - tr("SMESH_WRN_HYPOTHESIS_ALREADYEXIST"), - tr("SMESH_BUT_YES")); - } - } - } - catch(const SALOME::SALOME_Exception & S_ex) - { - QtCatchCorbaException(S_ex); - } - } - myActiveStudy->updateObjBrowser(true); - QApplication::restoreOverrideCursor(); + MESSAGE("Create " << aHypType << " with name " << aHypName); + + SMESH::SMESH_Hypothesis_var Hyp; + + HypothesisData* aHypData = GetHypothesisData((char*)aHypType.latin1()); + QString aServLib = aHypData->ServerLibName; + + try + { + Hyp = myComponentMesh->CreateHypothesis(aHypType, aServLib); + if (!Hyp->_is_nil()) + { + SALOMEDS::SObject_var SHyp = + smeshGUI->myStudy->FindObjectIOR( _orb->object_to_string( Hyp ) ); + if (!SHyp->_is_nil()) + { + if ( !aHypName.isEmpty() ) + myStudyAPI.SetName( SHyp, aHypName ); + myActiveStudy->updateObjBrowser(true); + return Hyp._retn(); + } + } + } + catch (const SALOME::SALOME_Exception & S_ex) + { + QtCatchCorbaException(S_ex); + } + + return SMESH::SMESH_Hypothesis::_nil(); } //============================================================================= @@ -941,48 +1161,48 @@ void SMESHGUI::AddHypothesisOnSubMesh(SMESH::SMESH_subMesh_ptr aSubMesh, * */ //============================================================================= -void SMESHGUI::AddAlgorithmOnSubMesh(SMESH::SMESH_subMesh_ptr aSubMesh, - SMESH::SMESH_Hypothesis_ptr aHyp) +bool SMESHGUI::AddHypothesisOnMesh(SMESH::SMESH_Mesh_ptr aMesh, + SMESH::SMESH_Hypothesis_ptr aHyp) { - if (!aSubMesh->_is_nil()) - { - QApplication::setOverrideCursor(Qt::waitCursor); - try - { - SMESH::SMESH_Mesh_var aMesh = aSubMesh->GetFather(); - SALOMEDS::SObject_var SsubM = myStudyAPI.FindSubMesh(aSubMesh); - GEOM::GEOM_Shape_var aShape = - myStudyAPI.GetShapeOnMeshOrSubMesh(SsubM); - if (!aMesh->_is_nil()) - { - bool res = aMesh->AddHypothesis(aShape, aHyp); - if (res) - { - SALOMEDS::SObject_var SH = - myStudyAPI.FindHypothesisOrAlgorithms(aHyp); - if (!SsubM->_is_nil() && !SH->_is_nil()) - { - myStudyAPI.SetAlgorithms(SsubM, SH); - myStudyAPI.ModifiedMesh(SsubM, false); - } - } - else - { - QApplication::restoreOverrideCursor(); - QAD_MessageBox::warn1(QAD_Application::getDesktop(), - tr("SMESH_WRN_WARNING"), - tr("SMESH_WRN_ALGORITHM_ALREADYEXIST"), - tr("SMESH_BUT_YES")); - } - } - } - catch(const SALOME::SALOME_Exception & S_ex) - { - QtCatchCorbaException(S_ex); - } - } - myActiveStudy->updateObjBrowser(true); - QApplication::restoreOverrideCursor(); + int res = SMESH::HYP_UNKNOWN_FATAL; + QAD_WaitCursor wc; + + if ( !aMesh->_is_nil() ) { + SALOMEDS::SObject_var SM = myStudyAPI.FindObject( aMesh ); + GEOM::GEOM_Shape_var aShape = myStudyAPI.GetShapeOnMeshOrSubMesh(SM); + try { + res = aMesh->AddHypothesis( aShape, aHyp ); + if ( res < SMESH::HYP_UNKNOWN_FATAL ) { + SALOMEDS::SObject_var SH = myStudyAPI.FindObject(aHyp); + if ( !SM->_is_nil() && !SH->_is_nil() ) { + //myStudyAPI.SetHypothesis(SM, SH); // VSR: published automatically by engine + myStudyAPI.ModifiedMesh(SM, false); + } + } + if ( res >= SMESH::HYP_UNKNOWN_FATAL ) { + wc.stop(); + QAD_MessageBox::error1(QAD_Application::getDesktop(), + tr("SMESH_ERROR"), + tr(QString("SMESH_HYP_%1").arg(res)), + tr("SMESH_BUT_OK")); + wc.start(); + } + else if ( res > SMESH::HYP_OK ) { + wc.stop(); + QAD_MessageBox::warn1(QAD_Application::getDesktop(), + tr("SMESH_WRN_WARNING"), + tr(QString("SMESH_HYP_%1").arg(res)), + tr("SMESH_BUT_OK")); + wc.start(); + } + } + catch( const SALOME::SALOME_Exception& S_ex ) { + wc.stop(); + QtCatchCorbaException( S_ex ); + res = SMESH::HYP_UNKNOWN_FATAL; + } + } + return res < SMESH::HYP_UNKNOWN_FATAL; } //============================================================================= @@ -990,33 +1210,76 @@ void SMESHGUI::AddAlgorithmOnSubMesh(SMESH::SMESH_subMesh_ptr aSubMesh, * */ //============================================================================= -void SMESHGUI::CreateAlgorithm(QString TypeAlgo, QString NameAlgo) +bool SMESHGUI::RemoveHypothesisOrAlgorithmOnMesh + (const Handle(SALOME_InteractiveObject)& IObject) { - SMESH::SMESH_Hypothesis_var Hyp; - try - { - if (TypeAlgo.compare("Regular_1D") == 0) - Hyp = myComponentMesh->CreateHypothesis(TypeAlgo, myStudyId); - else if (TypeAlgo.compare("MEFISTO_2D") == 0) - Hyp = myComponentMesh->CreateHypothesis(TypeAlgo, myStudyId); - else if (TypeAlgo.compare("Quadrangle_2D") == 0) - Hyp = myComponentMesh->CreateHypothesis(TypeAlgo, myStudyId); - else if (TypeAlgo.compare("Hexa_3D") == 0) - Hyp = myComponentMesh->CreateHypothesis(TypeAlgo, myStudyId); - else if (TypeAlgo.compare("NETGEN_3D") == 0) - Hyp = myComponentMesh->CreateHypothesis(TypeAlgo, myStudyId); - - if (!Hyp->_is_nil()) - { - SALOMEDS::SObject_var SHyp = myStudyAPI.AddNewAlgorithms(Hyp); - myStudyAPI.SetName(SHyp, NameAlgo); - } - } - catch(const SALOME::SALOME_Exception & S_ex) - { - QtCatchCorbaException(S_ex); - } - myActiveStudy->updateObjBrowser(true); + int res = SMESH::HYP_UNKNOWN_FATAL; + QAD_WaitCursor wc; + + if (IObject->hasReference()) + { + try { + SMESH::SMESH_Hypothesis_var anHyp; + SALOMEDS::SObject_var SO_Hypothesis = + smeshGUI->myStudy->FindObjectID(IObject->getEntry()); + SALOMEDS::GenericAttribute_var anAttr; + SALOMEDS::AttributeIOR_var anIOR; + + if (!SO_Hypothesis->_is_nil()) { + if (SO_Hypothesis->FindAttribute(anAttr, "AttributeIOR")) { + anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); + anHyp = SMESH::SMESH_Hypothesis::_narrow + (_orb->string_to_object(anIOR->Value())); + } + + SALOMEDS::SObject_var SO_Applied_Hypothesis = + smeshGUI->myStudy->FindObjectID(IObject->getReference()); + if (!SO_Applied_Hypothesis->_is_nil()) { + SALOMEDS::SObject_var MorSM = + smeshGUI->myStudyAPI.GetMeshOrSubmesh(SO_Applied_Hypothesis); + if (!MorSM->_is_nil()) { + GEOM::GEOM_Shape_var aShape = + smeshGUI->myStudyAPI.GetShapeOnMeshOrSubMesh(MorSM); + if (!aShape->_is_nil() && MorSM->FindAttribute(anAttr, "AttributeIOR")) { + anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); + SMESH::SMESH_Mesh_var aMesh = + SMESH::SMESH_Mesh::_narrow(_orb->string_to_object(anIOR->Value())); + SMESH::SMESH_subMesh_var aSubMesh = + SMESH::SMESH_subMesh::_narrow(_orb->string_to_object(anIOR->Value())); + + if (!aSubMesh->_is_nil()) + aMesh = aSubMesh->GetFather(); + + if (!aMesh->_is_nil()) + { + res = aMesh->RemoveHypothesis(aShape, anHyp); + if ( res < SMESH::HYP_UNKNOWN_FATAL ) + smeshGUI->myStudyAPI.ModifiedMesh(MorSM, false); + if ( res > SMESH::HYP_OK ) { + wc.stop(); + QAD_MessageBox::warn1(QAD_Application::getDesktop(), + tr("SMESH_WRN_WARNING"), + tr(QString("SMESH_HYP_%1").arg(res)), + tr("SMESH_BUT_OK")); + wc.start(); + } + } + } + } + } + } + } + catch( const SALOME::SALOME_Exception& S_ex ) { + wc.stop(); + QtCatchCorbaException( S_ex ); + res = SMESH::HYP_UNKNOWN_FATAL; + } + } + else if (IObject->hasEntry()) + { + MESSAGE("IObject entry " << IObject->getEntry()); + } + return res < SMESH::HYP_UNKNOWN_FATAL; } //============================================================================= @@ -1024,26 +1287,52 @@ void SMESHGUI::CreateAlgorithm(QString TypeAlgo, QString NameAlgo) * */ //============================================================================= -void SMESHGUI::CreateLocalLength(QString TypeHypothesis, QString NameHypothesis, - double Length) +bool SMESHGUI::RemoveHypothesisOrAlgorithmOnMesh(SALOMEDS::SObject_ptr MorSM, + SMESH::SMESH_Hypothesis_ptr anHyp) { - QApplication::setOverrideCursor(Qt::waitCursor); - try - { - SMESH::SMESH_Hypothesis_var Hyp = - SMESH::SMESH_Hypothesis::_narrow(CreateHypothesis(TypeHypothesis, - NameHypothesis)); - SMESH::SMESH_LocalLength_var LL = - SMESH::SMESH_LocalLength::_narrow(Hyp); - if (!LL->_is_nil()) - LL->SetLength(Length); - } - catch(const SALOME::SALOME_Exception & S_ex) - { - QtCatchCorbaException(S_ex); - } - myActiveStudy->updateObjBrowser(true); - QApplication::restoreOverrideCursor(); + SALOMEDS::SObject_var AHR, aRef; + SALOMEDS::GenericAttribute_var anAttr; + SALOMEDS::AttributeIOR_var anIOR; + int res = SMESH::HYP_UNKNOWN_FATAL; + QAD_WaitCursor wc; + + if (!MorSM->_is_nil()) { + try { + GEOM::GEOM_Shape_var aShape = smeshGUI->myStudyAPI.GetShapeOnMeshOrSubMesh(MorSM); + if (!aShape->_is_nil()) { + if (MorSM->FindAttribute(anAttr, "AttributeIOR")) { + anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); + SMESH::SMESH_Mesh_var aMesh = + SMESH::SMESH_Mesh::_narrow(_orb->string_to_object(anIOR->Value())); + SMESH::SMESH_subMesh_var aSubMesh = + SMESH::SMESH_subMesh::_narrow(_orb->string_to_object(anIOR->Value())); + + if ( !aSubMesh->_is_nil() ) + aMesh = aSubMesh->GetFather(); + + if (!aMesh->_is_nil()) { + res = aMesh->RemoveHypothesis(aShape, anHyp); + if ( res < SMESH::HYP_UNKNOWN_FATAL ) + smeshGUI->myStudyAPI.ModifiedMesh(MorSM, false); + if ( res > SMESH::HYP_OK ) { + wc.stop(); + QAD_MessageBox::warn1(QAD_Application::getDesktop(), + tr("SMESH_WRN_WARNING"), + tr(QString("SMESH_HYP_%1").arg(res)), + tr("SMESH_BUT_OK")); + wc.start(); + } + } + } + } + } + catch( const SALOME::SALOME_Exception& S_ex ) { + wc.stop(); + QtCatchCorbaException( S_ex ); + res = SMESH::HYP_UNKNOWN_FATAL; + } + } + return res < SMESH::HYP_UNKNOWN_FATAL; } //============================================================================= @@ -1051,27 +1340,48 @@ void SMESHGUI::CreateLocalLength(QString TypeHypothesis, QString NameHypothesis, * */ //============================================================================= -void SMESHGUI::CreateMaxElementArea(QString TypeHypothesis, - QString NameHypothesis, double MaxArea) +bool SMESHGUI::AddAlgorithmOnMesh( SMESH::SMESH_Mesh_ptr aMesh, + SMESH::SMESH_Hypothesis_ptr aHyp ) { - QApplication::setOverrideCursor(Qt::waitCursor); - try - { - SMESH::SMESH_Hypothesis_var Hyp = - SMESH::SMESH_Hypothesis::_narrow(CreateHypothesis(TypeHypothesis, - NameHypothesis)); - SMESH::SMESH_MaxElementArea_var MaxElArea = - SMESH::SMESH_MaxElementArea::_narrow(Hyp); - if (!MaxElArea->_is_nil()) - MaxElArea->SetMaxElementArea(MaxArea); - } - catch(SALOME::SALOME_Exception & S_ex) - { - QtCatchCorbaException(S_ex); - } - - myActiveStudy->updateObjBrowser(true); - QApplication::restoreOverrideCursor(); + int res = SMESH::HYP_UNKNOWN_FATAL; + QAD_WaitCursor wc; + + if ( !aMesh->_is_nil() ) { + SALOMEDS::SObject_var SM = myStudyAPI.FindObject( aMesh ); + GEOM::GEOM_Shape_var aShape = myStudyAPI.GetShapeOnMeshOrSubMesh( SM ); + try { + res = aMesh->AddHypothesis( aShape, aHyp ); + if ( res < SMESH::HYP_UNKNOWN_FATAL ) { + //SALOMEDS::SObject_var SH = myStudyAPI.FindObject( aHyp ); + //if ( !SM->_is_nil() && !SH->_is_nil() ) { + //myStudyAPI.SetAlgorithms(SM, SH); + myStudyAPI.ModifiedMesh( SM, false ); + //} + } + if ( res >= SMESH::HYP_UNKNOWN_FATAL ) { + wc.stop(); + QAD_MessageBox::error1(QAD_Application::getDesktop(), + tr("SMESH_ERROR"), + tr(QString("SMESH_HYP_%1").arg(res)), + tr("SMESH_BUT_OK")); + wc.start(); + } + else if ( res > SMESH::HYP_OK ) { + wc.stop(); + QAD_MessageBox::warn1( QAD_Application::getDesktop(), + tr( "SMESH_WRN_WARNING" ), + tr(QString("SMESH_HYP_%1").arg(res)), + tr( "SMESH_BUT_OK" ) ); + wc.start(); + } + } + catch( const SALOME::SALOME_Exception& S_ex ) { + wc.stop(); + QtCatchCorbaException( S_ex ); + res = SMESH::HYP_UNKNOWN_FATAL; + } + } + return res < SMESH::HYP_UNKNOWN_FATAL; } //============================================================================= @@ -1079,26 +1389,52 @@ void SMESHGUI::CreateMaxElementArea(QString TypeHypothesis, * */ //============================================================================= -void SMESHGUI::CreateMaxElementVolume(QString TypeHypothesis, - QString NameHypothesis, double MaxVolume) +bool SMESHGUI::AddHypothesisOnSubMesh( SMESH::SMESH_subMesh_ptr aSubMesh, + SMESH::SMESH_Hypothesis_ptr aHyp ) { - QApplication::setOverrideCursor(Qt::waitCursor); - try - { - SMESH::SMESH_Hypothesis_var Hyp = - SMESH::SMESH_Hypothesis::_narrow(CreateHypothesis(TypeHypothesis, - NameHypothesis)); - SMESH::SMESH_MaxElementVolume_var MaxElVolume = - SMESH::SMESH_MaxElementVolume::_narrow(Hyp); - if (!MaxElVolume->_is_nil()) - MaxElVolume->SetMaxElementVolume(MaxVolume); - } - catch(const SALOME::SALOME_Exception & S_ex) - { - QtCatchCorbaException(S_ex); - } - myActiveStudy->updateObjBrowser(true); - QApplication::restoreOverrideCursor(); + int res = SMESH::HYP_UNKNOWN_FATAL; + QAD_WaitCursor wc; + + if ( !aSubMesh->_is_nil() ) { + try { + SMESH::SMESH_Mesh_var aMesh = aSubMesh->GetFather(); + SALOMEDS::SObject_var SsubM = myStudyAPI.FindObject( aSubMesh ); + GEOM::GEOM_Shape_var aShape = myStudyAPI.GetShapeOnMeshOrSubMesh( SsubM ); + if ( !aMesh->_is_nil() && !SsubM->_is_nil() && !aShape->_is_nil() ) { + res = aMesh->AddHypothesis( aShape, aHyp ); + if ( res < SMESH::HYP_UNKNOWN_FATAL ) { + //SALOMEDS::SObject_var SH = myStudyAPI.FindObject(aHyp); + // if (!SsubM->_is_nil() && !SH->_is_nil()) + // { + // myStudyAPI.SetHypothesis(SsubM, SH); + myStudyAPI.ModifiedMesh( SsubM, false ); + // } + } + if ( res >= SMESH::HYP_UNKNOWN_FATAL ) { + wc.stop(); + QAD_MessageBox::error1(QAD_Application::getDesktop(), + tr("SMESH_ERROR"), + tr(QString("SMESH_HYP_%1").arg(res)), + tr("SMESH_BUT_OK")); + wc.start(); + } + else if ( res > SMESH::HYP_OK ) { + wc.stop(); + QAD_MessageBox::warn1(QAD_Application::getDesktop(), + tr( "SMESH_WRN_WARNING" ), + tr(QString("SMESH_HYP_%1").arg(res)), + tr( "SMESH_BUT_OK" ) ); + wc.start(); + } + } + } + catch( const SALOME::SALOME_Exception& S_ex ) { + wc.stop(); + QtCatchCorbaException( S_ex ); + res = SMESH::HYP_UNKNOWN_FATAL; + } + } + return res < SMESH::HYP_UNKNOWN_FATAL; } //============================================================================= @@ -1106,26 +1442,51 @@ void SMESHGUI::CreateMaxElementVolume(QString TypeHypothesis, * */ //============================================================================= -void SMESHGUI::CreateNbSegments(QString TypeHypothesis, QString NameHypothesis, - int nbSegments) +bool SMESHGUI::AddAlgorithmOnSubMesh( SMESH::SMESH_subMesh_ptr aSubMesh, + SMESH::SMESH_Hypothesis_ptr aHyp ) { - QApplication::setOverrideCursor(Qt::waitCursor); - try - { - SMESH::SMESH_Hypothesis_var Hyp = - SMESH::SMESH_Hypothesis::_narrow(CreateHypothesis(TypeHypothesis, - NameHypothesis)); - SMESH::SMESH_NumberOfSegments_var NbS = - SMESH::SMESH_NumberOfSegments::_narrow(Hyp); - if (!NbS->_is_nil()) - NbS->SetNumberOfSegments(nbSegments); - } - catch(const SALOME::SALOME_Exception & S_ex) - { - QtCatchCorbaException(S_ex); - } - myActiveStudy->updateObjBrowser(true); - QApplication::restoreOverrideCursor(); + int res = SMESH::HYP_UNKNOWN_FATAL; + QAD_WaitCursor wc; + + if ( !aSubMesh->_is_nil() ) { + try { + SMESH::SMESH_Mesh_var aMesh = aSubMesh->GetFather(); + SALOMEDS::SObject_var SsubM = myStudyAPI.FindObject(aSubMesh); + GEOM::GEOM_Shape_var aShape = myStudyAPI.GetShapeOnMeshOrSubMesh(SsubM); + if ( !aMesh->_is_nil() && !SsubM->_is_nil() && !aShape->_is_nil() ) { + res = aMesh->AddHypothesis( aShape, aHyp ); + if ( res < SMESH::HYP_UNKNOWN_FATAL ) { + //SALOMEDS::SObject_var SH = myStudyAPI.FindObject(aHyp); + //if (!SsubM->_is_nil() && !SH->_is_nil()) { + //myStudyAPI.SetAlgorithms(SsubM, SH); + myStudyAPI.ModifiedMesh( SsubM, false ); + //} + } + if ( res >= SMESH::HYP_UNKNOWN_FATAL ) { + wc.stop(); + QAD_MessageBox::error1(QAD_Application::getDesktop(), + tr("SMESH_ERROR"), + tr(QString("SMESH_HYP_%1").arg(res)), + tr("SMESH_BUT_OK")); + wc.start(); + } + else if ( res > SMESH::HYP_OK ) { + wc.stop(); + QAD_MessageBox::warn1(QAD_Application::getDesktop(), + tr( "SMESH_WRN_WARNING" ), + tr(QString("SMESH_HYP_%1").arg(res)), + tr( "SMESH_BUT_OK" ) ); + wc.start(); + } + } + } + catch( const SALOME::SALOME_Exception& S_ex ) { + wc.stop(); + QtCatchCorbaException( S_ex ); + res = SMESH::HYP_UNKNOWN_FATAL; + } + } + return res < SMESH::HYP_UNKNOWN_FATAL; } //============================================================================= @@ -1153,38 +1514,23 @@ int SMESHGUI::GetNameOfSelectedIObjects(SALOME_Selection * Sel, QString & aName) * */ //============================================================================= -int SMESHGUI::GetNameOfSelectedNodes(SALOME_Selection * Sel, QString & aName) -{ - int nbNodes = 0; - int nbSel = Sel->IObjectCount(); - if (nbSel == 1) - { - Handle(SALOME_InteractiveObject) IObject = Sel->firstIObject(); - if (!IObject->hasEntry()) - return -1; - - Standard_Boolean res; - SMESH_Actor *ac = FindActorByEntry(IObject->getEntry(), res, true); - if (!res) - return -1; - - TColStd_MapOfInteger MapIndex; - Sel->GetIndex(IObject, MapIndex); - TColStd_MapIteratorOfMapOfInteger ite(MapIndex); - aName = " "; - nbNodes = MapIndex.Extent(); - for (; ite.More(); ite.Next()) - { - aName = - aName + QString("%1").arg(ac->GetIdSMESHDSNode(ite.Key())) + - " "; - } - } - else - { - aName = ""; - } - return nbNodes; +int SMESHGUI::GetNameOfSelectedNodes(SALOME_Selection * Sel, QString & aName){ + aName = ""; + if(Sel->IObjectCount() == 1){ + Handle(SALOME_InteractiveObject) IObject = Sel->firstIObject(); + if(IObject->hasEntry()){ + if(SMESH_Actor *anActor = ::FindActorByEntry(IObject->getEntry())){ + TColStd_MapOfInteger MapIndex; + Sel->GetIndex(IObject, MapIndex); + TColStd_MapIteratorOfMapOfInteger ite(MapIndex); + for(; ite.More(); ite.Next()){ + aName += QString(" %1").arg(anActor->GetNodeObjId(ite.Key())); + } + return MapIndex.Extent(); + } + } + } + return -1; } //============================================================================= @@ -1192,77 +1538,78 @@ int SMESHGUI::GetNameOfSelectedNodes(SALOME_Selection * Sel, QString & aName) * */ //============================================================================= -int SMESHGUI::GetNameOfSelectedElements(SALOME_Selection * Sel, QString & aName) -{ - int nbElements = 0; - int nbSel = Sel->IObjectCount(); - if (nbSel == 1) - { - Handle(SALOME_InteractiveObject) IObject = Sel->firstIObject(); - if (!IObject->hasEntry()) - return -1; +int SMESHGUI::GetNameOfSelectedElements(SALOME_Selection * Sel, QString & aName){ + aName = ""; + if(Sel->IObjectCount() == 1){ + Handle(SALOME_InteractiveObject) IObject = Sel->firstIObject(); + if(IObject->hasEntry()){ + if(SMESH_Actor *anActor = ::FindActorByEntry(IObject->getEntry())){ + TColStd_MapOfInteger MapIndex; + Sel->GetIndex(IObject, MapIndex); + TColStd_MapIteratorOfMapOfInteger ite(MapIndex); + std::vector aList; + for(; ite.More(); ite.Next()){ + int aVtkId = ite.Key(); + int anObjId = anActor->GetElemObjId(aVtkId); + std::vector::iterator found = find(aList.begin(), aList.end(), anObjId); + // MESSAGE("GetNameOfSelectedElements(): VTK Id = " << aVtkId << ", OBJECT Id = " << anObjId); + if (found == aList.end()) { + aList.push_back(anObjId); + aName += QString(" %1").arg(anObjId); + } + } + return aList.size(); + } + } + } + return -1; +} - Standard_Boolean res; - SMESH_Actor *ac = FindActorByEntry(IObject->getEntry(), res, true); - if (!res) - return -1; - TColStd_MapOfInteger MapIndex; - Sel->GetIndex(IObject, MapIndex); - TColStd_MapIteratorOfMapOfInteger ite(MapIndex); - aName = " "; - nbElements = MapIndex.Extent(); - MESSAGE("GetNameOfSelectedElements(): number = " << nbElements); - for (; ite.More(); ite.Next()) - { - int idVTK = ite.Key(); - MESSAGE("GetNameOfSelectedElements(): VTK Id = " << idVTK); - aName = - aName + QString("%1").arg(ac->GetIdSMESHDSElement(idVTK)) + " "; - } - } - else - { - aName = ""; - } - return nbElements; +//============================================================================= +/*! + * + */ +//============================================================================= +int SMESHGUI::GetNameOfSelectedEdges(SALOME_Selection * Sel, QString & aName){ + aName = ""; + if(Sel->IObjectCount() == 1){ + Handle(SALOME_InteractiveObject) IObject = Sel->firstIObject(); + if(IObject->hasEntry()){ + if(SMESH_Actor *anActor = ::FindActorByEntry(IObject->getEntry())){ + TColStd_MapOfInteger MapIndex; + Sel->GetIndex(IObject, MapIndex); + TColStd_MapIteratorOfMapOfInteger ite(MapIndex); + for(; ite.More(); ite.Next()){ + aName += QString(" %1").arg(ite.Key()); + } + return MapIndex.Extent(); + } + } + } + return -1; } + //============================================================================= /*! * */ //============================================================================= -int SMESHGUI::GetNameOfSelectedEdges(SALOME_Selection * Sel, QString & aName) +SMESH_Actor *SMESHGUI::FindActorByEntry(QString theEntry, + Standard_Boolean & theResult, + bool onlyInActiveView) { - int nbElements = 0; - int nbSel = Sel->IObjectCount(); - if (nbSel == 1) - { - Handle(SALOME_InteractiveObject) IObject = Sel->firstIObject(); - if (!IObject->hasEntry()) - return -1; - - Standard_Boolean res; - SMESH_Actor *ac = FindActorByEntry(IObject->getEntry(), res, true); - if (!res) - return -1; - - TColStd_MapOfInteger MapIndex; - Sel->GetIndex(IObject, MapIndex); - TColStd_MapIteratorOfMapOfInteger ite(MapIndex); - aName = " "; - nbElements = MapIndex.Extent(); - for (; ite.More(); ite.Next()) - { - aName = aName + QString("%1").arg(ite.Key()) + " "; - } - } - else - { - aName = ""; - } - return nbElements; + theResult = false; + int aNbStudyFrames = myActiveStudy->getStudyFramesCount(); + for (int i = 0; i < aNbStudyFrames; i++){ + QAD_StudyFrame *aStudyFrame = myActiveStudy->getStudyFrame(i); + if(SMESH_Actor *anActor = ::FindActorByEntry(aStudyFrame,theEntry.latin1())){ + theResult = true; + return anActor; + } + } + return NULL; } //============================================================================= @@ -1270,54 +1617,20 @@ int SMESHGUI::GetNameOfSelectedEdges(SALOME_Selection * Sel, QString & aName) * */ //============================================================================= -SMESH_Actor *SMESHGUI::FindActorByEntry(QString entry, - Standard_Boolean & testResult, bool onlyInActiveView) +SMESH_Actor* SMESHGUI::FindActor(CORBA::Object_ptr theObj, + Standard_Boolean & theResult, + bool theOnlyInActiveView) { - int nbSf = myActiveStudy->getStudyFramesCount(); - for (int i = 0; i < nbSf; i++) - { - QAD_StudyFrame *sf = myActiveStudy->getStudyFrame(i); - if (sf->getTypeView() == VIEW_VTK) - { - vtkRenderer *Renderer = - ((VTKViewer_ViewFrame *) sf->getRightFrame()->getViewFrame())-> - getRenderer(); - vtkActorCollection *theActors = Renderer->GetActors(); - theActors->InitTraversal(); - vtkActor *ac = theActors->GetNextActor(); - while (!(ac == NULL)) - { - if (ac->IsA("SMESH_Actor")) - { - SMESH_Actor *anActor = SMESH_Actor::SafeDownCast(ac); - if (anActor->hasIO()) - { - Handle(SALOME_InteractiveObject) IO = anActor->getIO(); - if (strcmp(IO->getEntry(), entry) == 0) - { - if (onlyInActiveView) - { - if (sf == myActiveStudy->getActiveStudyFrame()) - { - testResult = true; - return anActor; - } - } - else - { - testResult = true; - return anActor; - } - } - } - } - ac = theActors->GetNextActor(); - } - } - } - - MESSAGE(" Actor Not Found ") testResult = false; - return SMESH_Actor::New(); + theResult = false; + SMESH_Actor* aRes = NULL; + if ( !CORBA::is_nil( theObj ) ) { + SALOMEDS::SObject_var aSObject = SALOMEDS::SObject::_narrow( myStudy->FindObjectIOR( _orb->object_to_string( theObj ) ) ); + if( !aSObject->_is_nil()) { + CORBA::String_var anEntry = aSObject->GetID(); + aRes = FindActorByEntry( anEntry.in(), theResult, theOnlyInActiveView ); + } + } + return aRes; } //============================================================================= @@ -1325,17 +1638,34 @@ SMESH_Actor *SMESHGUI::FindActorByEntry(QString entry, * */ //============================================================================= -SMESH_Actor *SMESHGUI::FindActor(SMESH::SMESH_Mesh_ptr aMesh, - Standard_Boolean & testResult, bool onlyInActiveView) +SMESH::SMESH_Mesh_ptr SMESHGUI::ConvertIOinMesh(const Handle(SALOME_InteractiveObject) & IO, + Standard_Boolean & testResult) { - SALOMEDS::SObject_var SM = myStudyAPI.FindMesh(aMesh); - if (SM->_is_nil()) - { - MESSAGE(" Actor Not Found ") testResult = false; - return SMESH_Actor::New(); - } - - return FindActorByEntry(SM->GetID(), testResult, onlyInActiveView); + SMESH::SMESH_Mesh_var aMesh; + testResult = false; + + /* case SObject */ + if (IO->hasEntry()) + { + SALOMEDS::SObject_var obj = myStudy->FindObjectID(IO->getEntry()); + SALOMEDS::GenericAttribute_var anAttr; + SALOMEDS::AttributeIOR_var anIOR; + if (!obj->_is_nil()) + { + if (obj->FindAttribute(anAttr, "AttributeIOR")) + { + anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); + aMesh = + SMESH::SMESH_Mesh::_narrow(_orb->string_to_object(anIOR->Value())); + if (!aMesh->_is_nil()) + { + testResult = true; + return SMESH::SMESH_Mesh::_duplicate(aMesh); + } + } + } + } + return SMESH::SMESH_Mesh::_nil(); } //============================================================================= @@ -1343,36 +1673,33 @@ SMESH_Actor *SMESHGUI::FindActor(SMESH::SMESH_Mesh_ptr aMesh, * */ //============================================================================= -SMESH::SMESH_Mesh_ptr SMESHGUI:: -ConvertIOinMesh(const Handle(SALOME_InteractiveObject) & IO, - Standard_Boolean & testResult) +SMESH::SMESH_subMesh_ptr SMESHGUI::ConvertIOinSubMesh(const Handle(SALOME_InteractiveObject) & IO, + Standard_Boolean & testResult) { - SMESH::SMESH_Mesh_var aMesh; - testResult = false; - - /* case SObject */ - if (IO->hasEntry()) - { - SALOMEDS::SObject_var obj = myStudy->FindObjectID(IO->getEntry()); - SALOMEDS::GenericAttribute_var anAttr; - SALOMEDS::AttributeIOR_var anIOR; - if (!obj->_is_nil()) - { - if (obj->FindAttribute(anAttr, "AttributeIOR")) - { - anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); - aMesh = - SMESH::SMESH_Mesh::_narrow(_orb->string_to_object(anIOR-> - Value())); - if (!aMesh->_is_nil()) - { - testResult = true; - return SMESH::SMESH_Mesh::_duplicate(aMesh); - } - } - } - } - return SMESH::SMESH_Mesh::_nil(); + SMESH::SMESH_subMesh_var aSubMesh; + testResult = false; + + /* case SObject */ + if (IO->hasEntry()) + { + SALOMEDS::SObject_var obj = myStudy->FindObjectID(IO->getEntry()); + SALOMEDS::GenericAttribute_var anAttr; + SALOMEDS::AttributeIOR_var anIOR; + if (!obj->_is_nil()) + { + if (obj->FindAttribute(anAttr, "AttributeIOR")) + { + anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); + aSubMesh = SMESH::SMESH_subMesh::_narrow(_orb->string_to_object(anIOR->Value())); + if (!aSubMesh->_is_nil()) + { + testResult = true; + return SMESH::SMESH_subMesh::_duplicate(aSubMesh); + } + } + } + } + return SMESH::SMESH_subMesh::_nil(); } //============================================================================= @@ -1380,36 +1707,33 @@ ConvertIOinMesh(const Handle(SALOME_InteractiveObject) & IO, * */ //============================================================================= -SMESH::SMESH_subMesh_ptr SMESHGUI:: -ConvertIOinSubMesh(const Handle(SALOME_InteractiveObject) & IO, - Standard_Boolean & testResult) +SMESH::SMESH_Hypothesis_ptr SMESHGUI::ConvertIOinSMESHHypothesis(const Handle(SALOME_InteractiveObject) & IO, + Standard_Boolean & testResult) { - SMESH::SMESH_subMesh_var aSubMesh; - testResult = false; - - /* case SObject */ - if (IO->hasEntry()) - { - SALOMEDS::SObject_var obj = myStudy->FindObjectID(IO->getEntry()); - SALOMEDS::GenericAttribute_var anAttr; - SALOMEDS::AttributeIOR_var anIOR; - if (!obj->_is_nil()) - { - if (obj->FindAttribute(anAttr, "AttributeIOR")) - { - anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); - aSubMesh = - SMESH::SMESH_subMesh::_narrow(_orb->string_to_object(anIOR-> - Value())); - if (!aSubMesh->_is_nil()) - { - testResult = true; - return SMESH::SMESH_subMesh::_duplicate(aSubMesh); - } - } - } - } - return SMESH::SMESH_subMesh::_nil(); + SMESH::SMESH_Hypothesis_var aHyp; + testResult = false; + + /* case SObject */ + if (IO->hasEntry()) + { + SALOMEDS::SObject_var obj = myStudy->FindObjectID(IO->getEntry()); + SALOMEDS::GenericAttribute_var anAttr; + SALOMEDS::AttributeIOR_var anIOR; + if (!obj->_is_nil()) + { + if (obj->FindAttribute(anAttr, "AttributeIOR")) + { + anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); + aHyp = SMESH::SMESH_Hypothesis::_narrow(_orb->string_to_object(anIOR->Value())); + if (!aHyp->_is_nil()) + { + testResult = true; + return SMESH::SMESH_Hypothesis::_duplicate(aHyp); + } + } + } + } + return SMESH::SMESH_Hypothesis::_nil(); } //============================================================================= @@ -1417,36 +1741,29 @@ ConvertIOinSubMesh(const Handle(SALOME_InteractiveObject) & IO, * */ //============================================================================= -SMESH::SMESH_Hypothesis_ptr SMESHGUI:: -ConvertIOinSMESHHypothesis(const Handle(SALOME_InteractiveObject) & IO, - Standard_Boolean & testResult) +SMESH::SMESH_Group_ptr SMESHGUI::ConvertIOinSMESHGroup(const Handle(SALOME_InteractiveObject) & IO, + Standard_Boolean & testResult) { - SMESH::SMESH_Hypothesis_var aHyp; - testResult = false; - - /* case SObject */ - if (IO->hasEntry()) - { - SALOMEDS::SObject_var obj = myStudy->FindObjectID(IO->getEntry()); - SALOMEDS::GenericAttribute_var anAttr; - SALOMEDS::AttributeIOR_var anIOR; - if (!obj->_is_nil()) - { - if (obj->FindAttribute(anAttr, "AttributeIOR")) - { - anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); - aHyp = - SMESH::SMESH_Hypothesis::_narrow(_orb-> - string_to_object(anIOR->Value())); - if (!aHyp->_is_nil()) - { - testResult = true; - return SMESH::SMESH_Hypothesis::_duplicate(aHyp); - } - } - } - } - return SMESH::SMESH_Hypothesis::_nil(); + SMESH::SMESH_Group_var aGroup; + testResult = false; + + /* case SObject */ + if (IO->hasEntry()) { + SALOMEDS::SObject_var obj = myStudy->FindObjectID(IO->getEntry()); + SALOMEDS::GenericAttribute_var anAttr; + SALOMEDS::AttributeIOR_var anIOR; + if (!obj->_is_nil()) { + if (obj->FindAttribute(anAttr, "AttributeIOR")) { + anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); + aGroup = SMESH::SMESH_Group::_narrow(_orb->string_to_object(anIOR->Value())); + if (!aGroup->_is_nil()) { + testResult = true; + return SMESH::SMESH_Group::_duplicate(aGroup); + } + } + } + } + return SMESH::SMESH_Group::_nil(); } //============================================================================= @@ -1454,34 +1771,29 @@ ConvertIOinSMESHHypothesis(const Handle(SALOME_InteractiveObject) & IO, * */ //============================================================================= -GEOM::GEOM_Shape_ptr SMESHGUI:: -ConvertIOinGEOMShape(const Handle(SALOME_InteractiveObject) & IO, - Standard_Boolean & testResult) +GEOM::GEOM_Shape_ptr SMESHGUI::ConvertIOinGEOMShape(const Handle(SALOME_InteractiveObject) & IO, + Standard_Boolean & testResult) { - GEOM::GEOM_Shape_var aShape; - testResult = false; - - /* case SObject */ - if (IO->hasEntry()) - { - SALOMEDS::SObject_var obj = myStudy->FindObjectID(IO->getEntry()); - SALOMEDS::GenericAttribute_var anAttr; - SALOMEDS::AttributeIOR_var anIOR; - if (!obj->_is_nil()) - { - if (obj->FindAttribute(anAttr, "AttributeIOR")) - { - anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); - aShape = myComponentGeom->GetIORFromString(anIOR->Value()); - if (!aShape->_is_nil()) - { - testResult = true; - return GEOM::GEOM_Shape::_duplicate(aShape); - } - } - } - } - return GEOM::GEOM_Shape::_nil(); + GEOM::GEOM_Shape_var aShape; + testResult = false; + + /* case SObject */ + if (IO->hasEntry()) { + SALOMEDS::SObject_var obj = myStudy->FindObjectID(IO->getEntry()); + SALOMEDS::GenericAttribute_var anAttr; + SALOMEDS::AttributeIOR_var anIOR; + if (!obj->_is_nil()) { + if (obj->FindAttribute(anAttr, "AttributeIOR")) { + anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); + aShape = myComponentGeom->GetIORFromString(anIOR->Value()); + if (!aShape->_is_nil()) { + testResult = true; + return GEOM::GEOM_Shape::_duplicate(aShape); + } + } + } + } + return GEOM::GEOM_Shape::_nil(); } //============================================================================= @@ -1489,55 +1801,37 @@ ConvertIOinGEOMShape(const Handle(SALOME_InteractiveObject) & IO, * */ //============================================================================= -void SMESHGUI::SetViewMode(int commandId) -{ - SALOME_Selection *Sel = - SALOME_Selection::Selection(myActiveStudy->getSelection()); - int nbSel = Sel->IObjectCount(); - if (nbSel >= 1) - { - SALOME_ListIteratorOfListIO It(Sel->StoredIObjects()); - for (; It.More(); It.Next()) - { - Handle(SALOME_InteractiveObject) IObject = It.Value(); - if (IObject->hasEntry()) - { - Standard_Boolean res; - SMESH_Actor *ac = - FindActorByEntry(IObject->getEntry(), res, true); - if (res) - { - switch (commandId) - { - case 211: - { - ChangeRepresentation(ac, 0); - break; - } - case 212: - { - ChangeRepresentation(ac, 1); - break; - } - case 213: - { - ChangeRepresentation(ac, 2); - break; - } - case 1132: - { - ChangeRepresentation(ac, 3); - break; - } - } - } - } - } - if (commandId == 1133) - { - ChangeRepresentation(SMESH_Actor::New(), 4); - } - } +void SMESHGUI::SetViewMode(int commandId){ + SALOME_Selection *Sel = SALOME_Selection::Selection(myActiveStudy->getSelection()); + if(Sel->IObjectCount() >= 1){ + SALOME_ListIteratorOfListIO It(Sel->StoredIObjects()); + for(; It.More(); It.Next()){ + Handle(SALOME_InteractiveObject) IObject = It.Value(); + if(IObject->hasEntry()){ + if(SMESH_Actor *anActor = ::FindActorByEntry(IObject->getEntry())){ + switch(commandId){ + case 211: + ChangeRepresentation(anActor,0); + break; + case 212: + ChangeRepresentation(anActor,1); + break; + case 213: + ChangeRepresentation(anActor,2); + break; + case 215: + ChangeRepresentation(anActor,5); + break; + case 1132: + ChangeRepresentation(anActor,3); + break; + } + } + } + } + if(commandId == 1133) + ChangeRepresentation(NULL,4); + } } //============================================================================= @@ -1545,207 +1839,110 @@ void SMESHGUI::SetViewMode(int commandId) * */ //============================================================================= -void SMESHGUI::ChangeRepresentation(SMESH_Actor * ac, int type) -{ - if (ac->DataSource == NULL && type != 4) - return; - - if (type != 4) - { - if (ac->getMapper() == NULL) - { - return; - } - } - switch (type) - { - case 0: - { - QApplication::setOverrideCursor(Qt::waitCursor); - if (ac->getDisplayMode() == 2) - { - bool isColored = ac->getMapper()->GetScalarVisibility(); //SAL3899 - vtkDataSetMapper *meshMapper = - (vtkDataSetMapper *) (ac->getMapper()); - meshMapper->SetInput(ac->DataSource); - meshMapper->SetScalarVisibility(isColored); //SAL3899 - } - ac->setDisplayMode(0); - ac->GetProperty()->SetRepresentationToWireframe(); - // ac->SetActorProperty( ac->GetProperty() ); - QApplication::restoreOverrideCursor(); - break; - } - case 1: - { - QApplication::setOverrideCursor(Qt::waitCursor); - if (ac->getDisplayMode() == 2) - { - bool isColored = ac->getMapper()->GetScalarVisibility(); //SAL3899 - vtkDataSetMapper *meshMapper = - (vtkDataSetMapper *) (ac->getMapper()); - meshMapper->SetInput(ac->DataSource); - meshMapper->SetScalarVisibility(isColored); //SAL3899 - } - ac->setDisplayMode(1); - ac->GetProperty()->SetRepresentationToSurface(); - QApplication::restoreOverrideCursor(); - // ac->SetActorProperty( ac->GetProperty() ); - break; - } - case 2: - { - // if (!(ac->getDisplayMode()==2)) { - // ChangeRepresentation(ac, 1); - QApplication::setOverrideCursor(Qt::waitCursor); - ac->setDisplayMode(2); - bool isColored = ac->getMapper()->GetScalarVisibility(); //SAL3899 - vtkDataSetMapper *meshMapper = (vtkDataSetMapper *) (ac->getMapper()); - vtkShrinkFilter *shrink = vtkShrinkFilter::New(); - shrink->SetInput(ac->DataSource); - shrink->SetShrinkFactor(ac->GetShrinkFactor()); - - meshMapper->SetInput(shrink->GetOutput()); - meshMapper->SetScalarVisibility(isColored); //SAL3899 - ac->SetMapper(meshMapper); - QApplication::restoreOverrideCursor(); - // } - break; - } - case 3: - { - float color[3]; - float edgecolor[3]; - float backfacecolor[3]; - float nodecolor[3]; - ac->GetColor(color[0], color[1], color[2]); -// QColor c(color[0]*255,color[1]*255,color[2]*255); - int c0 = int (color[0] * 255); - int c1 = int (color[1] * 255); - int c2 = int (color[2] * 255); - QColor c(c0, c1, c2); - ac->GetEdgeColor(edgecolor[0], edgecolor[1], edgecolor[2]); -// QColor e(edgecolor[0]*255,edgecolor[1]*255,edgecolor[2]*255); - c0 = int (edgecolor[0] * 255); - c1 = int (edgecolor[1] * 255); - c2 = int (edgecolor[2] * 255); - QColor e(c0, c1, c2); - ac->GetBackfaceProperty()->GetColor(backfacecolor); -// QColor b(backfacecolor[0]*255,backfacecolor[1]*255,backfacecolor[2]*255); - c0 = int (backfacecolor[0] * 255); - c1 = int (backfacecolor[1] * 255); - c2 = int (backfacecolor[2] * 255); - QColor b(c0, c1, c2); - ac->GetNodeColor(nodecolor[0], nodecolor[1], nodecolor[2]); -// QColor n(nodecolor[0]*255, nodecolor[1]*255, nodecolor[2]*255 ) ; - c0 = int (nodecolor[0] * 255); - c1 = int (nodecolor[1] * 255); - c2 = int (nodecolor[2] * 255); - QColor n(c0, c1, c2); - - int Edgewidth = (int)ac->EdgeDevice->GetProperty()->GetLineWidth(); - if (Edgewidth == 0) - Edgewidth = 1; - int intValue = ac->GetNodeSize(); - float Shrink = ac->GetShrinkFactor(); - - SMESHGUI_Preferences_ColorDlg *aDlg = - new SMESHGUI_Preferences_ColorDlg(QAD_Application::getDesktop(), - ""); - 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()) - { - QApplication::setOverrideCursor(Qt::waitCursor); - 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 */ - ac->GetProperty()->SetColor(float (color.red()) / 255., - float (color.green()) / 255., float (color.blue()) / 255.); - ac->SetColor(float (color.red()) / 255., - float (color.green()) / 255., float (color.blue()) / 255.); - ac->GetBackfaceProperty()->SetColor(float (backfacecolor.red()) / - 255., float (backfacecolor.green()) / 255., - float (backfacecolor.blue()) / 255.); - - /* edge color */ - ac->EdgeDevice->GetProperty()->SetColor(float (edgecolor.red()) / - 255., float (edgecolor.green()) / 255., - float (edgecolor.blue()) / 255.); - ac->EdgeShrinkDevice->GetProperty()->SetColor(float (edgecolor. - red()) / 255., float (edgecolor.green()) / 255., - float (edgecolor.blue()) / 255.); - ac->SetEdgeColor(float (edgecolor.red()) / 255., - float (edgecolor.green()) / 255., - float (edgecolor.blue()) / 255.); - - /* Shrink factor and size edges */ - ac->SetShrinkFactor(aDlg->GetIntValue(3) / 100.); - ac->EdgeDevice->GetProperty()->SetLineWidth(aDlg->GetIntValue(1)); - ac->EdgeShrinkDevice->GetProperty()->SetLineWidth(aDlg-> - GetIntValue(1)); - - /* Nodes color and size */ - ac->SetNodeColor(float (nodecolor.red()) / 255., - float (nodecolor.green()) / 255., - float (nodecolor.blue()) / 255.); - ac->SetNodeSize(aDlg->GetIntValue(2)); - - if (ac->getDisplayMode() == 2) - { - bool isColored = ac->getMapper()->GetScalarVisibility(); //SAL3899 - vtkDataSetMapper *meshMapper = - (vtkDataSetMapper *) (ac->getMapper()); - meshMapper->SetInput(ac->DataSource); - vtkShrinkFilter *shrink = vtkShrinkFilter::New(); - shrink->SetInput(meshMapper->GetInput()); - shrink->SetShrinkFactor(ac->GetShrinkFactor()); - - meshMapper->SetInput(shrink->GetOutput()); - meshMapper->SetScalarVisibility(isColored); //SAL3899 - ac->SetMapper(meshMapper); - } - } - delete aDlg; - QApplication::restoreOverrideCursor(); - break; - } - case 4: - { - EmitSignalDeactivateDialog(); - SALOME_Selection *Sel = - SALOME_Selection::Selection(myActiveStudy->getSelection()); - SMESHGUI_TransparencyDlg *aDlg = - new SMESHGUI_TransparencyDlg(QAD_Application::getDesktop(), "", - Sel); - break; - } - case 5: - { - QApplication::setOverrideCursor(Qt::waitCursor); - ac->GetProperty()->SetRepresentationToPoints(); - QApplication::restoreOverrideCursor(); - break; - } - } - - QApplication::setOverrideCursor(Qt::waitCursor); - if (myActiveStudy->getActiveStudyFrame()->getTypeView() == VIEW_VTK) - { //VTK - vtkRenderer *theRenderer = - ((VTKViewer_ViewFrame *) myActiveStudy->getActiveStudyFrame()-> - getRightFrame()->getViewFrame())->getRenderer(); - theRenderer->Render(); - } - QApplication::restoreOverrideCursor(); +void SMESHGUI::ChangeRepresentation(SMESH_Actor * theActor, int type){ + switch (type){ + case 0:{ + //theActor->UnShrink(); + theActor->SetRepresentation(SMESH_Actor::eEdge); + break; + } + case 1:{ + //theActor->UnShrink(); + theActor->SetRepresentation(SMESH_Actor::eSurface); + break; + } + case 2:{ + theActor->IsShrunk() ? theActor->UnShrink() : theActor->SetShrink(); + //theActor->SetRepresentation(SMESH_Actor::eSurface); + break; + } + case 5:{ + //theActor->UnShrink(); + theActor->SetRepresentation(SMESH_Actor::ePoint); + break; + } + case 3:{ + float color[3]; + theActor->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); + + float edgecolor[3]; + theActor->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); + + float backfacecolor[3]; + theActor->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); + + float nodecolor[3]; + theActor->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)theActor->GetLineWidth(); + if(Edgewidth == 0) + Edgewidth = 1; + int intValue = int(theActor->GetNodeSize()); + float Shrink = theActor->GetShrinkFactor(); + + SMESHGUI_Preferences_ColorDlg *aDlg = new SMESHGUI_Preferences_ColorDlg(QAD_Application::getDesktop(),""); + 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 */ + theActor->SetSufaceColor(float (color.red()) / 255., + float (color.green()) / 255., + float (color.blue()) / 255.); + theActor->SetBackSufaceColor(float (backfacecolor.red()) / 255., + float (backfacecolor.green()) / 255., + float (backfacecolor.blue()) / 255.); + + /* edge color */ + theActor->SetEdgeColor(float (edgecolor.red()) / 255., + float (edgecolor.green()) / 255., + float (edgecolor.blue()) / 255.); + + /* Shrink factor and size edges */ + theActor->SetShrinkFactor(aDlg->GetIntValue(3) / 100.); + theActor->SetLineWidth(aDlg->GetIntValue(1)); + + /* Nodes color and size */ + theActor->SetNodeColor(float (nodecolor.red()) / 255., + float (nodecolor.green()) / 255., + float (nodecolor.blue()) / 255.); + theActor->SetNodeSize(aDlg->GetIntValue(2)); + + delete aDlg; + } + break; + } + case 4:{ + EmitSignalDeactivateDialog(); + SMESHGUI_TransparencyDlg *aDlg = new SMESHGUI_TransparencyDlg(QAD_Application::getDesktop(),"",false); + break; + } + } + UpdateView(); } //============================================================================= @@ -1753,15 +1950,8 @@ void SMESHGUI::ChangeRepresentation(SMESH_Actor * ac, int type) * */ //============================================================================= -void SMESHGUI::UpdateView() -{ - if (myActiveStudy->getActiveStudyFrame()->getTypeView() != VIEW_VTK) - return; - - vtkRenderer *theRenderer = - ((VTKViewer_ViewFrame *) myActiveStudy->getActiveStudyFrame()-> - getRightFrame()->getViewFrame())->getRenderer(); - theRenderer->Render(); +void SMESHGUI::UpdateView(){ + ::RepaintCurrentView(); } //============================================================================= @@ -1769,91 +1959,9 @@ void SMESHGUI::UpdateView() * */ //============================================================================= -void SMESHGUI::DisplayActor(SMESH_Actor * ac, bool visibility) -{ - if (myActiveStudy->getActiveStudyFrame()->getTypeView() != VIEW_VTK) - return; - - MESSAGE("DisplayActor(): DataSource = " << ac->DataSource); - - vtkRenderer *theRenderer = - ((VTKViewer_ViewFrame *) myActiveStudy->getActiveStudyFrame()-> - getRightFrame()->getViewFrame())->getRenderer(); - vtkActorCollection *theActors = theRenderer->GetActors(); - theActors->InitTraversal(); - if (theActors->IsItemPresent(ac) == 0) - { - vtkProperty *prop = vtkProperty::New(); - prop->SetColor(QAD_CONFIG->getSetting("SMESH:SettingsFillColorRed"). - toFloat() / 255., - QAD_CONFIG->getSetting("SMESH:SettingsFillColorGreen").toFloat() / - 255., - QAD_CONFIG->getSetting("SMESH:SettingsFillColorBlue").toFloat() / - 255.); - - prop->SetPointSize(QAD_CONFIG->getSetting("SMESH:SettingsNodesSize"). - toInt()); - prop->SetLineWidth(QAD_CONFIG->getSetting("SMESH:SettingsWidth"). - toInt()); - ac->SetProperty(prop); - ac->SetColor(QAD_CONFIG->getSetting("SMESH:SettingsFillColorRed"). - toFloat() / 255., - QAD_CONFIG->getSetting("SMESH:SettingsFillColorGreen").toFloat() / - 255., - QAD_CONFIG->getSetting("SMESH:SettingsFillColorBlue").toFloat() / - 255.); - - // prop->BackfaceCullingOn(); - vtkProperty *backprop = vtkProperty::New(); - backprop->SetColor(QAD_CONFIG-> - getSetting("SMESH:SettingsBackFaceColorRed").toFloat() / 255., - QAD_CONFIG->getSetting("SMESH:SettingsBackFaceColorGreen"). - toFloat() / 255., - QAD_CONFIG->getSetting("SMESH:SettingsBackFaceColorBlue"). - toFloat() / 255.); - ac->SetBackfaceProperty(backprop); - - int intValue = - QAD_CONFIG->getSetting("SMESH:SettingsShrinkCoeff").toInt(); - if (intValue == 0) - intValue = 80; - ac->SetShrinkFactor(intValue / 100.); - - ac->GetMapper()->SetResolveCoincidentTopologyToShiftZBuffer(); - ac->GetMapper()->SetResolveCoincidentTopologyZShift(0.02); - - QString DisplayMode = QAD_CONFIG->getSetting("SMESH:DisplayMode"); - if (DisplayMode.compare("Wireframe") == 0) - { - ac->setDisplayMode(0); - ChangeRepresentation(ac, 0); - } - else if (DisplayMode.compare("Shading") == 0) - { - ac->setDisplayMode(1); - ChangeRepresentation(ac, 1); - } - else if (DisplayMode.compare("Shrink") == 0) - { - ac->setDisplayMode(2); - ChangeRepresentation(ac, 2); - } - theRenderer->AddActor(ac); - } - else - { - if (ac->GetMapper()) - ac->GetMapper()->Update(); - } - -// if ( visibility ) - ac->SetVisibility(visibility); -// ac->VisibilityOn(); -// else -// ac->VisibilityOff(); - - vtkRenderWindow *renWin = theRenderer->GetRenderWindow(); - renWin->Render(); +void SMESHGUI::DisplayActor(SMESH_Actor * theActor, bool theVisibility){ + theActor->SetVisibility(theVisibility); + ::DisplayActor(myActiveStudy->getActiveStudyFrame(),theActor); } //============================================================================= @@ -1861,22 +1969,8 @@ void SMESHGUI::DisplayActor(SMESH_Actor * ac, bool visibility) * */ //============================================================================= -void SMESHGUI::EraseActor(SMESH_Actor * ac) -{ - if (myActiveStudy->getActiveStudyFrame()->getTypeView() != VIEW_VTK) - return; - - vtkRenderer *theRenderer = - ((VTKViewer_ViewFrame *) myActiveStudy->getActiveStudyFrame()-> - getRightFrame()->getViewFrame())->getRenderer(); - - //NRI- : 02/12/2002 : Fixed bugId 882 - // ac->EdgeDevice->VisibilityOff(); - // ac->EdgeShrinkDevice->VisibilityOff(); - // ac->VisibilityOff(); - ac->SetVisibility(false); - - theRenderer->Render(); +void SMESHGUI::EraseActor(SMESH_Actor * theActor){ + theActor->SetVisibility(false); } //============================================================================= @@ -1942,113 +2036,118 @@ QString SMESHGUI::CheckHomogeneousSelection() //============================================================================= QString SMESHGUI::CheckTypeObject(const Handle(SALOME_InteractiveObject) & IO) { - SALOMEDS::SObject_var sobj = - smeshGUI->myActiveStudy->getStudyDocument()->FindObjectID(IO-> - getEntry()); - if (!sobj->_is_nil()) - { - SALOMEDS::SComponent_var scomp = sobj->GetFatherComponent(); - if (strcmp(scomp->GetID(), IO->getEntry()) == 0) - { // component is selected - return "Component"; - } - } - - SALOME_Selection *Sel = - SALOME_Selection::Selection(smeshGUI->myActiveStudy->getSelection()); - Sel->ClearIObjects(); - - Handle(SMESH_TypeFilter) aHypFilter = new SMESH_TypeFilter(HYPOTHESIS); - Handle(SMESH_TypeFilter) anAlgoFilter = new SMESH_TypeFilter(ALGORITHM); - Handle(SMESH_TypeFilter) aMeshFilter = new SMESH_TypeFilter(MESH); - Handle(SMESH_TypeFilter) aSubMeshFilter = new SMESH_TypeFilter(SUBMESH); - Handle(SMESH_TypeFilter) aMeshOrSubMeshFilter = - new SMESH_TypeFilter(MESHorSUBMESH); - Handle(SMESH_TypeFilter) aSubMeshVextexFilter = - new SMESH_TypeFilter(SUBMESH_VERTEX); - Handle(SMESH_TypeFilter) aSubMeshEdgeFilter = - new SMESH_TypeFilter(SUBMESH_EDGE); - Handle(SMESH_TypeFilter) aSubMeshFaceFilter = - new SMESH_TypeFilter(SUBMESH_FACE); - Handle(SMESH_TypeFilter) aSubMeshSolidFilter = - new SMESH_TypeFilter(SUBMESH_SOLID); - Handle(SMESH_TypeFilter) aSubMeshCompoundFilter = - new SMESH_TypeFilter(SUBMESH_COMPOUND); - - Sel->AddFilter(aHypFilter); - if (Sel->AddIObject(IO) != -1) - { - Sel->ClearFilters(); - return "Hypothesis"; - } - - Sel->ClearFilters(); - Sel->AddFilter(anAlgoFilter); - if (Sel->AddIObject(IO) != -1) - { - Sel->ClearFilters(); - return "Algorithm"; - } - - Sel->ClearFilters(); - Sel->AddFilter(aMeshFilter); - if (Sel->AddIObject(IO) != -1) - { - Sel->ClearFilters(); - return "Mesh"; - } - - Sel->ClearFilters(); - Sel->AddFilter(aSubMeshFilter); - if (Sel->AddIObject(IO) != -1) - { - Sel->ClearFilters(); - return "SubMesh"; - } - - Sel->ClearFilters(); - Sel->AddFilter(aSubMeshVextexFilter); - if (Sel->AddIObject(IO) != -1) - { - Sel->ClearFilters(); - return "SubMeshVertex"; - } - - Sel->ClearFilters(); - Sel->AddFilter(aSubMeshEdgeFilter); - if (Sel->AddIObject(IO) != -1) - { - Sel->ClearFilters(); - return "SubMeshEdge"; - } - - Sel->ClearFilters(); - Sel->AddFilter(aSubMeshFaceFilter); - if (Sel->AddIObject(IO) != -1) - { - Sel->ClearFilters(); - return "SubMeshFace"; - } + SALOMEDS::SObject_var sobj = smeshGUI->myActiveStudy->getStudyDocument()->FindObjectID(IO->getEntry()); + if (!sobj->_is_nil()) { + SALOMEDS::SComponent_var scomp = sobj->GetFatherComponent(); + if (strcmp(scomp->GetID(), IO->getEntry()) == 0) + { // component is selected + return "Component"; + } + } + + SALOME_Selection *Sel = SALOME_Selection::Selection(smeshGUI->myActiveStudy->getSelection()); + Sel->ClearIObjects(); + + Handle(SMESH_TypeFilter) aHypFilter = new SMESH_TypeFilter(HYPOTHESIS); + Handle(SMESH_TypeFilter) anAlgoFilter = new SMESH_TypeFilter(ALGORITHM); + Handle(SMESH_TypeFilter) aMeshFilter = new SMESH_TypeFilter(MESH); + Handle(SMESH_TypeFilter) aSubMeshFilter = new SMESH_TypeFilter(SUBMESH); + Handle(SMESH_TypeFilter) aGroupFilter = new SMESH_TypeFilter(GROUP); + Handle(SMESH_TypeFilter) aMeshOrSubMeshFilter = new SMESH_TypeFilter(MESHorSUBMESH); + Handle(SMESH_TypeFilter) aSubMeshVextexFilter = new SMESH_TypeFilter(SUBMESH_VERTEX); + Handle(SMESH_TypeFilter) aSubMeshEdgeFilter = new SMESH_TypeFilter(SUBMESH_EDGE); + Handle(SMESH_TypeFilter) aSubMeshFaceFilter = new SMESH_TypeFilter(SUBMESH_FACE); + Handle(SMESH_TypeFilter) aSubMeshSolidFilter = new SMESH_TypeFilter(SUBMESH_SOLID); + Handle(SMESH_TypeFilter) aSubMeshCompoundFilter = new SMESH_TypeFilter(SUBMESH_COMPOUND); + + Sel->AddFilter(aHypFilter); + if (Sel->AddIObject(IO) != -1) { + Sel->ClearFilters(); + return "Hypothesis"; + } + + Sel->ClearFilters(); + Sel->AddFilter(anAlgoFilter); + if (Sel->AddIObject(IO) != -1) { + Sel->ClearFilters(); + return "Algorithm"; + } + + Sel->ClearFilters(); + Sel->AddFilter(aMeshFilter); + if (Sel->AddIObject(IO) != -1) { + Sel->ClearFilters(); + return "Mesh"; + } + + Sel->ClearFilters(); + Sel->AddFilter(aSubMeshFilter); + if (Sel->AddIObject(IO) != -1) { + Sel->ClearFilters(); + return "SubMesh"; + } + + Sel->ClearFilters(); + Sel->AddFilter(aGroupFilter); + if (Sel->AddIObject(IO) != -1) { + Sel->ClearFilters(); + return "Group"; + } + + Sel->ClearFilters(); + Sel->AddFilter(aSubMeshVextexFilter); + if (Sel->AddIObject(IO) != -1) { + Sel->ClearFilters(); + return "SubMeshVertex"; + } + + Sel->ClearFilters(); + Sel->AddFilter(aSubMeshEdgeFilter); + if (Sel->AddIObject(IO) != -1) { + Sel->ClearFilters(); + return "SubMeshEdge"; + } + + Sel->ClearFilters(); + Sel->AddFilter(aSubMeshFaceFilter); + if (Sel->AddIObject(IO) != -1) { + Sel->ClearFilters(); + return "SubMeshFace"; + } + + Sel->ClearFilters(); + Sel->AddFilter(aSubMeshSolidFilter); + if (Sel->AddIObject(IO) != -1) { + Sel->ClearFilters(); + return "SubMeshSolid"; + } + + Sel->ClearFilters(); + Sel->AddFilter(aSubMeshCompoundFilter); + if (Sel->AddIObject(IO) != -1) { + Sel->ClearFilters(); + return "SubMeshCompound"; + } + + Sel->ClearFilters(); + Sel->AddIObject(IO); + return "NoType"; +} - Sel->ClearFilters(); - Sel->AddFilter(aSubMeshSolidFilter); - if (Sel->AddIObject(IO) != -1) - { - Sel->ClearFilters(); - return "SubMeshSolid"; - } - Sel->ClearFilters(); - Sel->AddFilter(aSubMeshCompoundFilter); - if (Sel->AddIObject(IO) != -1) - { - Sel->ClearFilters(); - return "SubMeshCompound"; - } +static int isStudyLocked(const SALOMEDS::Study_var& theStudy){ + return theStudy->GetProperties()->IsLocked(); +} - Sel->ClearFilters(); - Sel->AddIObject(IO); - return "NoType"; +static int checkLock(const SALOMEDS::Study_var& theStudy) { + if (isStudyLocked(theStudy)) { + QAD_MessageBox::warn1 ( (QWidget*)QAD_Application::getDesktop(), + QObject::tr("WRN_WARNING"), + QObject::tr("WRN_STUDY_LOCKED"), + QObject::tr("BUT_OK") ); + return true; + } + return false; } //============================================================================= @@ -2058,2437 +2157,948 @@ QString SMESHGUI::CheckTypeObject(const Handle(SALOME_InteractiveObject) & IO) //============================================================================= bool SMESHGUI::OnGUIEvent(int theCommandID, QAD_Desktop * parent) { - /* Create or retrieve an object SMESHGUI */ - SMESHGUI::GetOrCreateSMESHGUI(parent); - - // NRI : Temporary added - if (smeshGUI->myStudy->GetProperties()->IsLocked()) - { - return false; + SALOMEDS::Study_var aStudy = smeshGUI->myActiveStudy->getStudyDocument(); //Document OCAF de l'etude active + // QAD_Viewer3d* v3d; + OCCViewer_Viewer3d *v3d; + + Handle(AIS_InteractiveContext) ic; + vtkRenderer *Renderer; + vtkRenderWindow *RenWin; + + if (smeshGUI->myActiveStudy->getActiveStudyFrame()->getTypeView() == VIEW_OCC) { + v3d = ((OCCViewer_ViewFrame *) smeshGUI->myActiveStudy-> + getActiveStudyFrame()->getRightFrame()->getViewFrame())->getViewer(); + ic = v3d->getAISContext(); + } + else if (smeshGUI->myActiveStudy->getActiveStudyFrame()->getTypeView() == VIEW_VTK) { + Renderer = ((VTKViewer_ViewFrame *) smeshGUI->myActiveStudy-> + getActiveStudyFrame()->getRightFrame()->getViewFrame())->getRenderer(); + RenWin = Renderer->GetRenderWindow(); + } + + switch (theCommandID) { + case 33: // DELETE + if(checkLock(aStudy)) break; + smeshGUI->OnEditDelete(); + break; + + case 113: // IMPORT + case 112: + case 111: + { + if(checkLock(aStudy)) break; + //Import_Document(parent, theCommandID); //NBU + Import_Mesh(parent,theCommandID); + break; + } + + case 122: // EXPORT MED + case 121: + case 123: + { + Export_Mesh(parent, theCommandID); + break; + } + + case 200: // SCALAR BAR + { + SALOME_Selection *Sel = SALOME_Selection::Selection( smeshGUI->myActiveStudy->getSelection() ); + if( Sel && Sel->IObjectCount() ) { + Handle(SALOME_InteractiveObject) anIO = Sel->firstIObject(); + if( anIO->hasEntry() ) { + if( SMESH_Actor* anActor = ::FindActorByEntry( anIO->getEntry() ) ) { + anActor->SetControlMode( SMESH_Actor::eNone ); + } + } + } + break; + } + case 201: + { + SALOME_Selection* Sel = SALOME_Selection::Selection( smeshGUI->myActiveStudy->getSelection() ); + SMESHGUI_Preferences_ScalarBarDlg::ScalarBarProperties( parent, Sel ); + break; + } + + case 1133: // DISPLAY MODE : WireFrame, Surface, Shrink + case 1132: + case 215: + case 213: + case 212: + case 211: + { + smeshGUI->SetViewMode(theCommandID); + break; + } + + case 214: // UPDATE + { + if(checkLock(aStudy)) break; + smeshGUI->Update(); + break; + } + + case 300: // ERASE + case 301: // DISPLAY + case 302: // DISPLAY ONLY + { + EDisplaing anAction; + switch(theCommandID){ + case 300: anAction = eErase; break; + case 301: anAction = eDisplay; break; + case 302: anAction = eDisplayOnly; break; + } + + SALOME_Selection *Sel = SALOME_Selection::Selection(smeshGUI->myActiveStudy->getSelection()); + if (smeshGUI->myActiveStudy->getActiveStudyFrame()->getTypeView() == VIEW_VTK) { + SALOME_ListIteratorOfListIO It(Sel->StoredIObjects()); + for (; It.More(); It.Next()) { + Handle(SALOME_InteractiveObject) IOS = It.Value(); + if (IOS->hasEntry()) { + ::UpdateView(anAction,IOS->getEntry()); + } + } + } + Sel->ClearIObjects(); + break; + } + + case 400: // NODES + { + if(checkLock(aStudy)) break; + if (smeshGUI->myActiveStudy->getActiveStudyFrame()->getTypeView() == VIEW_VTK) { + smeshGUI->EmitSignalDeactivateDialog(); + SALOME_Selection *Sel = SALOME_Selection::Selection(smeshGUI->myActiveStudy->getSelection()); + Sel->ClearIObjects(); + smeshGUI->myDesktop->SetSelectionMode(NodeSelection, true); + smeshGUI->ViewNodes(); + SMESHGUI_NodesDlg *aDlg = new SMESHGUI_NodesDlg(parent, "", Sel); + } + else { + QAD_MessageBox::warn1(QAD_Application::getDesktop(), + tr("SMESH_WRN_WARNING"), + tr("SMESH_WRN_VIEWER_VTK"), + tr("SMESH_BUT_OK")); + } + break; + } + + case 2151: // FILTER + { + if ( smeshGUI->myActiveStudy->getActiveStudyFrame()->getTypeView() == VIEW_VTK ) + { + smeshGUI->EmitSignalDeactivateDialog(); + SMESHGUI_FilterDlg *aDlg = new SMESHGUI_FilterDlg( parent, SMESH::EDGE ); + } + break; + } + + case 405: // MOVE NODE + { + if(checkLock(aStudy)) break; + smeshGUI->myDesktop->SetSelectionMode(NodeSelection, true); + SALOME_Selection *Sel = SALOME_Selection::Selection(smeshGUI->myActiveStudy->getSelection()); + SMESHGUI_MoveNodesDlg *aDlg = new SMESHGUI_MoveNodesDlg(parent, "", Sel); + break; + } + + case 701: // COMPUTE MESH + { + if(checkLock(aStudy)) break; + if (smeshGUI->myActiveStudy->getActiveStudyFrame()->getTypeView() == VIEW_VTK) { + SALOME_Selection *Sel = SALOME_Selection::Selection(smeshGUI->myActiveStudy->getSelection()); + int nbSel = Sel->IObjectCount(); + if (nbSel != 1){ + break; } - //NRI - - // QAD_Viewer3d* v3d; - OCCViewer_Viewer3d *v3d; - - Handle(AIS_InteractiveContext) ic; - vtkRenderer *Renderer; - vtkRenderWindow *RenWin; - if (smeshGUI->myActiveStudy->getActiveStudyFrame()->getTypeView() == - VIEW_OCC) + SMESH::SMESH_Mesh_var aMesh; + SMESH::SMESH_subMesh_var aSubMesh; + Handle(SALOME_InteractiveObject) IObject = Sel->firstIObject(); + if (IObject->hasEntry()){ + SALOMEDS::SObject_var aMeshSObj = smeshGUI->myStudy->FindObjectID(IObject->getEntry()); + GEOM::GEOM_Shape_var aShape = smeshGUI->myStudyAPI.GetShapeOnMeshOrSubMesh( aMeshSObj ); + if ( aShape->_is_nil() ) { + // imported mesh + break; + } + SALOMEDS::GenericAttribute_var anAttr; + if(!aMeshSObj->_is_nil() && aMeshSObj->FindAttribute(anAttr, "AttributeIOR")){ + SALOMEDS::AttributeIOR_var anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); + MESSAGE("SMESHGUI::OnGUIEvent - Compute mesh : IOR = "<< anIOR->Value()); + CORBA::Object_var anObj; + try{ + anObj = _orb->string_to_object(anIOR->Value()); + if (CORBA::is_nil(anObj)){ + MESSAGE("SMESHGUI::OnGUIEvent - Compute mesh : nil object"); + } + }catch(CORBA::COMM_FAILURE & ex){ + INFOS("SMESHGUI::OnGUIEvent - Compute mesh : exception (1)"); + } + aMesh = SMESH::SMESH_Mesh::_narrow(anObj); + aSubMesh = SMESH::SMESH_subMesh::_narrow(anObj); + if (!aMesh->_is_nil()){ + GEOM::GEOM_Shape_var refShape = smeshGUI->myStudyAPI.GetShapeOnMeshOrSubMesh(aMeshSObj); + if (!refShape->_is_nil()) { + if(!smeshGUI->myComponentMesh->IsReadyToCompute(aMesh,refShape)){ + QAD_MessageBox::warn1(QAD_Application::getDesktop(), + tr("SMESH_WRN_WARNING"), + tr("SMESH_WRN_MISSING_PARAMETERS"), + tr("SMESH_BUT_OK")); + break; + } + try{ + if (smeshGUI->myComponentMesh->Compute(aMesh,refShape)) + smeshGUI->myStudyAPI.ModifiedMesh(aMeshSObj,true); + // TO Do : change icon of all submeshes + } + catch(const SALOME::SALOME_Exception & S_ex){ + QtCatchCorbaException(S_ex); + } + } + }else if(!aSubMesh->_is_nil()){ + aMesh = aSubMesh->GetFather(); + GEOM::GEOM_Shape_var refShape = smeshGUI->myStudyAPI.GetShapeOnMeshOrSubMesh(aMeshSObj); + if(!refShape->_is_nil()){ + bool compute = smeshGUI->myComponentMesh->IsReadyToCompute(aMesh,refShape); + if(!compute){ + QAD_MessageBox::warn1(QAD_Application::getDesktop(), + tr("SMESH_WRN_WARNING"), + tr("SMESH_WRN_MISSING_PARAMETERS"), + tr("SMESH_BUT_OK")); + break; + } + try{ + if ( smeshGUI->myComponentMesh->Compute(aMesh,refShape) ) + smeshGUI->myStudyAPI.ModifiedMesh(aMeshSObj,true); + // TO Do : change icon of all submeshes + }catch(const SALOME::SALOME_Exception & S_ex){ + QtCatchCorbaException(S_ex); + } + } + } + } + } + CORBA::Long anId = smeshGUI->myStudy->StudyId(); + TVisualObjPtr aVisualObj = GetVisualObj(anId,IObject->getEntry()); + if(smeshGUI->myAutomaticUpdate && aVisualObj){ + aVisualObj->Update(); + SMESH_Actor* anActor = ::FindActorByEntry(IObject->getEntry()); + if(!anActor){ + anActor = ::CreateActor(smeshGUI->myStudy,IObject->getEntry()); + if(anActor){ + ::DisplayActor(smeshGUI->myActiveStudy->getActiveStudyFrame(),anActor); //apo + ::FitAll(); + } + } + } + }else{ + QAD_MessageBox::warn1(QAD_Application::getDesktop(), + tr("SMESH_WRN_WARNING"), + tr("SMESH_WRN_VIEWER_VTK"), + tr("SMESH_BUT_OK")); + } + break; + } + + case 702: // ADD SUB MESH + { + if(checkLock(aStudy)) break; + if (smeshGUI->myActiveStudy->getActiveStudyFrame()->getTypeView() == VIEW_VTK) { + smeshGUI->EmitSignalDeactivateDialog(); + SALOME_Selection *Sel = SALOME_Selection::Selection(smeshGUI->myActiveStudy->getSelection()); + SMESHGUI_AddSubMeshDlg *aDlg = new SMESHGUI_AddSubMeshDlg(parent, "", Sel); + } + else { + QAD_MessageBox::warn1(QAD_Application::getDesktop(), + tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"), + tr("SMESH_BUT_OK")); + } + break; + } + + case 703: // INIT MESH + { + if(checkLock(aStudy)) break; + smeshGUI->EmitSignalDeactivateDialog(); + SALOME_Selection *Sel = SALOME_Selection::Selection(smeshGUI->myActiveStudy->getSelection()); + SMESHGUI_InitMeshDlg *aDlg = new SMESHGUI_InitMeshDlg(parent, "", Sel); + break; + } + + case 704: // EDIT Hypothesis + { + if(checkLock(aStudy)) break; + smeshGUI->EmitSignalDeactivateDialog(); + SALOME_Selection *Sel = SALOME_Selection::Selection(smeshGUI->myActiveStudy->getSelection()); + SMESHGUI_EditHypothesesDlg *aDlg = new SMESHGUI_EditHypothesesDlg(parent, "", Sel); + break; + } + + case 705: // EDIT Global Hypothesis + { + if(checkLock(aStudy)) break; + smeshGUI->EmitSignalDeactivateDialog(); + SALOME_Selection *Sel = SALOME_Selection::Selection(smeshGUI->myActiveStudy->getSelection()); + SMESHGUI_EditHypothesesDlg *aDlg = new SMESHGUI_EditHypothesesDlg(parent, "", Sel); + break; + } + + case 706: // EDIT Local Hypothesis + { + if(checkLock(aStudy)) break; + smeshGUI->EmitSignalDeactivateDialog(); + SALOME_Selection *Sel = SALOME_Selection::Selection(smeshGUI->myActiveStudy->getSelection()); + SMESHGUI_EditHypothesesDlg *aDlg = new SMESHGUI_EditHypothesesDlg(parent, "", Sel); + break; + } + + case 406: // ORIENTATION ELEMENTS + { + if(checkLock(aStudy)) break; + smeshGUI->EmitSignalDeactivateDialog(); + SALOME_Selection *Sel = SALOME_Selection::Selection(smeshGUI->myActiveStudy->getSelection()); + smeshGUI->myDesktop->SetSelectionMode(FaceSelection, true); + SMESHGUI_OrientationElementsDlg *aDlg = new SMESHGUI_OrientationElementsDlg(parent, "", Sel); + break; + } + + case 407: // DIAGONAL INVERSION + { + if(checkLock(aStudy)) break; + smeshGUI->EmitSignalDeactivateDialog(); + SALOME_Selection *Sel = SALOME_Selection::Selection(smeshGUI->myActiveStudy->getSelection()); + Sel->ClearIObjects(); + smeshGUI->myDesktop->SetSelectionMode(EdgeOfCellSelection, true); + SMESHGUI_DiagonalInversionDlg *aDlg = new SMESHGUI_DiagonalInversionDlg(parent, "", Sel); + break; + } + + case 801: // CREATE GROUP + { + if(checkLock(aStudy)) break; + smeshGUI->EmitSignalDeactivateDialog(); + SALOME_Selection *Sel = SALOME_Selection::Selection(smeshGUI->myActiveStudy->getSelection()); + int nbSel = Sel->IObjectCount(); + if (nbSel == 1) { + // check if mesh is selected + Handle(SALOME_InteractiveObject) IObject = Sel->firstIObject(); + if (IObject->hasEntry()) { + SALOMEDS::SObject_var aMeshSObj = smeshGUI->myStudy->FindObjectID(IObject->getEntry()); + if (!aMeshSObj->_is_nil()) { + CORBA::Object_var anObj = aMeshSObj->GetObject(); + SMESH::SMESH_Mesh_var aMesh = SMESH::SMESH_Mesh::_narrow(anObj); + SMESH::SMESH_subMesh_var aSubMesh = SMESH::SMESH_subMesh::_narrow(anObj); + if (aMesh->_is_nil() && !aSubMesh->_is_nil()) { + aMesh = aSubMesh->GetFather(); + } + if (!aMesh->_is_nil()) { + SMESHGUI_GroupDlg *aDlg = new SMESHGUI_GroupDlg(parent, "", Sel, aMesh); + aDlg->show(); + } + } + } + } + break; + } + + case 802: // CONSTRUCT GROUP + { + if(checkLock(aStudy)) break; + smeshGUI->EmitSignalDeactivateDialog(); + SALOME_Selection *Sel = SALOME_Selection::Selection(smeshGUI->myActiveStudy->getSelection()); + int nbSel = Sel->IObjectCount(); + if (nbSel == 1) { + // check if submesh is selected + Handle(SALOME_InteractiveObject) IObject = Sel->firstIObject(); + if (IObject->hasEntry()) { + SALOMEDS::SObject_var aSObj = smeshGUI->myStudy->FindObjectID(IObject->getEntry()); + if(!aSObj->_is_nil()) { + SMESH::SMESH_subMesh_var aSubMesh = SMESH::SMESH_subMesh::_narrow(aSObj->GetObject()); + 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(); + MESSAGE("SMESHGUI::OnGUIEvent - Construct group on submesh : "<length() << ", edges " << aEdges->length() + << ", faces " << aFaces->length() << ", volumes " << aVolumes->length()); + if (aNodes->length() > 0) { + SMESH::SMESH_Group_var aGroup = smeshGUI->AddGroup(aMesh, SMESH::NODE, aName); + aGroup->Add(aNodes); + } + if (aEdges->length() > 0) { + SMESH::SMESH_Group_var aGroup = smeshGUI->AddGroup(aMesh, SMESH::EDGE, aName); + aGroup->Add(aEdges); + } + if (aFaces->length() > 0) { + SMESH::SMESH_Group_var aGroup = smeshGUI->AddGroup(aMesh, SMESH::FACE, aName); + aGroup->Add(aFaces); + } + if (aVolumes->length() > 0) { + SMESH::SMESH_Group_var aGroup = smeshGUI->AddGroup(aMesh, SMESH::VOLUME, aName); + aGroup->Add(aVolumes); + } + smeshGUI->myActiveStudy->updateObjBrowser(true); + }catch(const SALOME::SALOME_Exception & S_ex){ + QtCatchCorbaException(S_ex); + } + } + } + } + } + break; + } + + case 803: // EDIT GROUP + { + if(checkLock(aStudy)) break; + smeshGUI->EmitSignalDeactivateDialog(); + SALOME_Selection *Sel = SALOME_Selection::Selection(smeshGUI->myActiveStudy->getSelection()); + int nbSel = Sel->IObjectCount(); + if (nbSel == 1) { + // check if group is selected + Handle(SALOME_InteractiveObject) IObject = Sel->firstIObject(); + if (IObject->hasEntry()) { + SALOMEDS::SObject_var aSObj = smeshGUI->myStudy->FindObjectID(IObject->getEntry()); + if(!aSObj->_is_nil()) { + SMESH::SMESH_Group_var aGroup = SMESH::SMESH_Group::_narrow(aSObj->GetObject()); + if (!aGroup->_is_nil()) { + SMESHGUI_GroupDlg *aDlg = new SMESHGUI_GroupDlg(parent, "", Sel, aGroup); + aDlg->show(); + } + } + } + } + break; + } + + case 804: // Add elements to group + { + if(checkLock(aStudy)) break; + if (smeshGUI->myState == 800) { + SMESHGUI_GroupDlg *aDlg = (SMESHGUI_GroupDlg*) smeshGUI->myActiveDialogBox; + if (aDlg) aDlg->onAdd(); + } + break; + } + + case 805: // Remove elements from group + { + if(checkLock(aStudy)) break; + if (smeshGUI->myState == 800) { + SMESHGUI_GroupDlg *aDlg = (SMESHGUI_GroupDlg*) smeshGUI->myActiveDialogBox; + if (aDlg) aDlg->onRemove(); + } + break; + } + + case 900: // MESH INFOS + { + smeshGUI->EmitSignalDeactivateDialog(); + SMESHGUI_MeshInfosDlg *aDlg = new SMESHGUI_MeshInfosDlg(parent, "", false); + break; + } + + case 1001: // AUTOMATIC UPDATE PREFERENCES + { + parent->menuBar()->setItemChecked(1001, !parent->menuBar()->isItemChecked(1001)); + if (parent->menuBar()->isItemChecked(1001)) { + QAD_CONFIG->addSetting("SMESH:AutomaticUpdate", "true"); + smeshGUI->myAutomaticUpdate = true; + } + else { + QAD_CONFIG->addSetting("SMESH:AutomaticUpdate", "false"); + smeshGUI->myAutomaticUpdate = false; + } + break; + } + + case 1003: // MESH PREFERENCES + { + smeshGUI->SetDisplaySettings(); + break; + } + + case 1005: + { + SMESHGUI_Preferences_ScalarBarDlg::ScalarBarPreferences( parent ); + break; + } + + case 1006: + { + SMESHGUI_Preferences_SelectionDlg* aDlg = + new SMESHGUI_Preferences_SelectionDlg(parent); + + QColor aColor; + QString SCr, SCg, SCb; + SCr = QAD_CONFIG->getSetting("SMESH:SettingsPreSelectColorRed"); + SCg = QAD_CONFIG->getSetting("SMESH:SettingsPreSelectColorGreen"); + SCb = QAD_CONFIG->getSetting("SMESH:SettingsPreSelectColorBlue"); + if (!SCr.isEmpty() && !SCg.isEmpty() && !SCb.isEmpty()) + aColor = QColor(SCr.toInt(), SCg.toInt(), SCb.toInt()); + else aColor = Qt::cyan; + aDlg->SetColor(1, aColor); + + SCr = QAD_CONFIG->getSetting("SMESH:SettingsItemSelectColorRed"); + SCg = QAD_CONFIG->getSetting("SMESH:SettingsItemSelectColorGreen"); + SCb = QAD_CONFIG->getSetting("SMESH:SettingsItemSelectColorBlue"); + if (!SCr.isEmpty() && !SCg.isEmpty() && !SCb.isEmpty()) + aColor = QColor(SCr.toInt(), SCg.toInt(), SCb.toInt()); + else aColor = Qt::yellow; + aDlg->SetColor(2, aColor); + + SCr = QAD_CONFIG->getSetting("SMESH:SettingsSelectColorRed"); + SCg = QAD_CONFIG->getSetting("SMESH:SettingsSelectColorGreen"); + SCb = QAD_CONFIG->getSetting("SMESH:SettingsSelectColorBlue"); + if (!SCr.isEmpty() && !SCg.isEmpty() && !SCb.isEmpty()) + aColor = QColor(SCr.toInt(), SCg.toInt(), SCb.toInt()); + else aColor = Qt::white; + aDlg->SetColor(3, aColor); + + QString SW1 = QAD_CONFIG->getSetting("SMESH:SettingsPreSelectWidth"); + if (SW1.isEmpty()) SW1 = "5"; + aDlg->SetWidth(1, SW1.toInt()); + + QString SW2 = QAD_CONFIG->getSetting("SMESH:SettingsItemSelectWidth"); + if (SW2.isEmpty()) SW2 = "5"; + aDlg->SetWidth(2, SW2.toInt()); + + QString SP1 = QAD_CONFIG->getSetting("SMESH:SettingsNodeSelectTol"); + if (SP1.isEmpty()) SP1 = "0.025"; + aDlg->SetPrecision(1, SP1.toDouble()); + + QString SP2 = QAD_CONFIG->getSetting("SMESH:SettingsElementsSelectTol"); + if (SP2.isEmpty()) SP2 = "0.001"; + aDlg->SetPrecision(2, SP2.toDouble()); + + if (aDlg->exec()) { + QColor aPreColor = aDlg->GetColor(1); + QAD_CONFIG->addSetting("SMESH:SettingsPreSelectColorRed", aPreColor.red()); + QAD_CONFIG->addSetting("SMESH:SettingsPreSelectColorGreen", aPreColor.green()); + QAD_CONFIG->addSetting("SMESH:SettingsPreSelectColorBlue", aPreColor.blue()); + + QColor aSelColor = aDlg->GetColor(2); + QAD_CONFIG->addSetting("SMESH:SettingsItemSelectColorRed", aSelColor.red()); + QAD_CONFIG->addSetting("SMESH:SettingsItemSelectColorGreen", aSelColor.green()); + QAD_CONFIG->addSetting("SMESH:SettingsItemSelectColorBlue", aSelColor.blue()); + + QColor aHiColor = aDlg->GetColor(3); + QAD_CONFIG->addSetting("SMESH:SettingsSelectColorRed", aHiColor.red()); + QAD_CONFIG->addSetting("SMESH:SettingsSelectColorGreen", aHiColor.green()); + QAD_CONFIG->addSetting("SMESH:SettingsSelectColorBlue", aHiColor.blue()); + + int aPreWidth = aDlg->GetWidth(1); + QAD_CONFIG->addSetting("SMESH:SettingsPreSelectWidth", aPreWidth); + int aSelWidth = aDlg->GetWidth(2); + QAD_CONFIG->addSetting("SMESH:SettingsItemSelectWidth", aSelWidth); + + double aTolNodes = aDlg->GetPrecision(1); + QAD_CONFIG->addSetting("SMESH:SettingsNodeSelectTol", aTolNodes); + double aTolItems = aDlg->GetPrecision(2); + QAD_CONFIG->addSetting("SMESH:SettingsElementsSelectTol", aTolItems); + + // update current study settings + ::UpdateSelectionProp(); + + QAD_StudyFrame* studyFrame = smeshGUI->myActiveStudy->getActiveStudyFrame(); + if (studyFrame->getTypeView() == VIEW_VTK) { + VTKViewer_ViewFrame* aViewFrame = GetVtkViewFrame(studyFrame); + // update VTK viewer properties + VTKViewer_RenderWindowInteractor* anInteractor = aViewFrame->getRWInteractor(); + if (anInteractor) { + anInteractor->SetSelectionProp(aSelColor.red()/255., aSelColor.green()/255., + aSelColor.blue()/255., aSelWidth); + anInteractor->SetSelectionTolerance(aTolNodes, aTolItems); + VTKViewer_InteractorStyleSALOME* aStyle = anInteractor->GetInteractorStyleSALOME(); + if (aStyle) + aStyle->setPreselectionProp(aPreColor.red()/255., aPreColor.green()/255., + aPreColor.blue()/255., aPreWidth); + } + // update actors + vtkRenderer* aRenderer = aViewFrame->getRenderer(); + vtkActorCollection *aCollection = aRenderer->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.); + } + } + } + } + + break; + } + + case 1100: // EDIT HYPOTHESIS + { + if(checkLock(aStudy)) break; + SALOME_Selection *Sel = + SALOME_Selection::Selection(smeshGUI->myActiveStudy->getSelection()); + int nbSel = Sel->IObjectCount(); + + if (nbSel == 1) { + Standard_Boolean res; + SMESH::SMESH_Hypothesis_var Hyp = + smeshGUI->ConvertIOinSMESHHypothesis(Sel->firstIObject(), res); + + /* 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 */ + /* Warning : however by internal mechanism all subMeshes icons are changed ! */ + if ( res ) + { + char* sName = Hyp->GetName(); + SMESHGUI_GenericHypothesisCreator* aCreator = smeshGUI->GetHypothesisCreator(sName); + if (aCreator) + { + aCreator->EditHypothesis(Hyp); + } + else + { + // report error + } + } + } + break; + } + + case 1101: // RENAME + { + if(checkLock(aStudy)) break; + SALOME_Selection *Sel = SALOME_Selection::Selection(smeshGUI->myActiveStudy->getSelection()); + SALOME_ListIteratorOfListIO It(Sel->StoredIObjects()); + for (; It.More(); It.Next()) { + Handle(SALOME_InteractiveObject) IObject = It.Value(); + + SALOMEDS::SObject_var obj = smeshGUI->myStudy->FindObjectID(IObject->getEntry()); + SALOMEDS::GenericAttribute_var anAttr; + SALOMEDS::AttributeName_var aName; + if (!obj->_is_nil()) { + if (obj->FindAttribute(anAttr, "AttributeName")) { + aName = SALOMEDS::AttributeName::_narrow(anAttr); + QString newName = QString(aName->Value()); + newName = SALOMEGUI_NameDlg::getName(QAD_Application::getDesktop(), newName); + if (!newName.isEmpty()) { + smeshGUI->myActiveStudy->renameIObject(IObject, newName); + } + } + } + } + break; + } + + case 1102: // REMOVE HYPOTHESIS / ALGORITHMS + { + if(checkLock(aStudy)) break; + QAD_WaitCursor wc; + SALOME_Selection *Sel = SALOME_Selection::Selection(smeshGUI->myActiveStudy->getSelection()); + SALOME_ListIteratorOfListIO It(Sel->StoredIObjects()); + for (int i = 0; It.More(); It.Next(), i++) { + Handle(SALOME_InteractiveObject) IObject = It.Value(); + smeshGUI->RemoveHypothesisOrAlgorithmOnMesh(IObject); + } + Sel->ClearIObjects(); + smeshGUI->myActiveStudy->updateObjBrowser(true); + break; + } + + case 401: // GEOM::EDGE + { + if(checkLock(aStudy)) break; + if (smeshGUI->myActiveStudy->getActiveStudyFrame()->getTypeView() == VIEW_VTK) { + smeshGUI->EmitSignalDeactivateDialog(); + SALOME_Selection *Sel = SALOME_Selection::Selection(smeshGUI->myActiveStudy->getSelection()); + Sel->ClearIObjects(); + smeshGUI->myDesktop->SetSelectionMode(NodeSelection, true); + smeshGUI->ViewNodes(); + SMESHGUI_AddEdgeDlg *aDlg = new SMESHGUI_AddEdgeDlg(parent, "", Sel); + } + else { + QAD_MessageBox::warn1(QAD_Application::getDesktop(), + tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"), + tr("SMESH_BUT_OK")); + } + break; + } + case 4021: // TRIANGLE + { + if(checkLock(aStudy)) break; + if (smeshGUI->myActiveStudy->getActiveStudyFrame()->getTypeView() == VIEW_VTK) { + smeshGUI->EmitSignalDeactivateDialog(); + SALOME_Selection *Sel = SALOME_Selection::Selection(smeshGUI->myActiveStudy->getSelection()); + Sel->ClearIObjects(); + smeshGUI->myDesktop->SetSelectionMode(NodeSelection, true); + smeshGUI->ViewNodes(); + SMESHGUI_AddFaceDlg *aDlg = new SMESHGUI_AddFaceDlg(parent, "", Sel, 3); + } + else { + QAD_MessageBox::warn1(QAD_Application::getDesktop(), + tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"), + tr("SMESH_BUT_OK")); + } + break; + } + case 4022: // QUAD + { + if(checkLock(aStudy)) break; + if (smeshGUI->myActiveStudy->getActiveStudyFrame()->getTypeView() == VIEW_VTK) { + smeshGUI->EmitSignalDeactivateDialog(); + SALOME_Selection *Sel = SALOME_Selection::Selection(smeshGUI->myActiveStudy->getSelection()); + Sel->ClearIObjects(); + smeshGUI->myDesktop->SetSelectionMode(NodeSelection, true); + smeshGUI->ViewNodes(); + SMESHGUI_AddFaceDlg *aDlg = new SMESHGUI_AddFaceDlg(parent, "", Sel, 4); + } + else { - v3d = - ((OCCViewer_ViewFrame *) smeshGUI->myActiveStudy-> - getActiveStudyFrame()->getRightFrame()->getViewFrame())-> - getViewer(); - ic = v3d->getAISContext(); - } - else if (smeshGUI->myActiveStudy->getActiveStudyFrame()->getTypeView() == - VIEW_VTK) + QAD_MessageBox::warn1(QAD_Application::getDesktop(), + tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"), + tr("SMESH_BUT_OK")); + } + break; + } + case 4031: // TETRA + { + if(checkLock(aStudy)) break; + if (smeshGUI->myActiveStudy->getActiveStudyFrame()->getTypeView() == VIEW_VTK) { + smeshGUI->EmitSignalDeactivateDialog(); + SALOME_Selection *Sel = SALOME_Selection::Selection(smeshGUI->myActiveStudy->getSelection()); + Sel->ClearIObjects(); + smeshGUI->myDesktop->SetSelectionMode(NodeSelection, true); + smeshGUI->ViewNodes(); + SMESHGUI_AddVolumeDlg *aDlg = new SMESHGUI_AddVolumeDlg(parent, "", Sel, 4); + } + else { + QAD_MessageBox::warn1(QAD_Application::getDesktop(), + tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"), + tr("SMESH_BUT_OK")); + } + break; + } + case 4032: // HEXA + { + if(checkLock(aStudy)) break; + if (smeshGUI->myActiveStudy->getActiveStudyFrame()->getTypeView() == VIEW_VTK) { + smeshGUI->EmitSignalDeactivateDialog(); + SALOME_Selection *Sel = SALOME_Selection::Selection(smeshGUI->myActiveStudy->getSelection()); + Sel->ClearIObjects(); + smeshGUI->myDesktop->SetSelectionMode(NodeSelection, true); + smeshGUI->ViewNodes(); + SMESHGUI_AddVolumeDlg *aDlg = new SMESHGUI_AddVolumeDlg(parent, "", Sel, 8); + } + else { + QAD_MessageBox::warn1(QAD_Application::getDesktop(), + tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"), + tr("SMESH_BUT_OK")); + } + break; + } + + case 4041: // REMOVES NODES + { + if(checkLock(aStudy)) break; + if (smeshGUI->myActiveStudy->getActiveStudyFrame()->getTypeView() == VIEW_VTK) { + smeshGUI->EmitSignalDeactivateDialog(); + SALOME_Selection *Sel = SALOME_Selection::Selection(smeshGUI->myActiveStudy->getSelection()); + Sel->ClearIObjects(); + smeshGUI->myDesktop->SetSelectionMode(NodeSelection, true); + smeshGUI->ViewNodes(); + SMESHGUI_RemoveNodesDlg *aDlg = new SMESHGUI_RemoveNodesDlg(parent, "", Sel); + } + else { + QAD_MessageBox::warn1(QAD_Application::getDesktop(), + tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"), + tr("SMESH_BUT_OK")); + } + break; + } + case 4042: // REMOVES ELEMENTS + { + if(checkLock(aStudy)) break; + if (smeshGUI->myActiveStudy->getActiveStudyFrame()->getTypeView() == VIEW_VTK) { + smeshGUI->EmitSignalDeactivateDialog(); + SALOME_Selection *Sel = SALOME_Selection::Selection(smeshGUI->myActiveStudy->getSelection()); + Sel->ClearIObjects(); + smeshGUI->myDesktop->SetSelectionMode(CellSelection, true); + SMESHGUI_RemoveElementsDlg *aDlg = new SMESHGUI_RemoveElementsDlg(parent, "", Sel); + } + else { - Renderer = - ((VTKViewer_ViewFrame *) smeshGUI->myActiveStudy-> - getActiveStudyFrame()->getRightFrame()->getViewFrame())-> - getRenderer(); - RenWin = Renderer->GetRenderWindow(); - } + QAD_MessageBox::warn1(QAD_Application::getDesktop(), + tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"), + tr("SMESH_BUT_OK")); + } + break; + } + + case 5000: // HYPOTHESIS + { + if(checkLock(aStudy)) break; + smeshGUI->EmitSignalDeactivateDialog(); + SMESHGUI_CreateHypothesesDlg *aDlg = + new SMESHGUI_CreateHypothesesDlg (parent, "", FALSE, false); + break; + } + case 5010: // ALGO + { + if(checkLock(aStudy)) break; + smeshGUI->EmitSignalDeactivateDialog(); + SMESHGUI_CreateHypothesesDlg *aDlg = + new SMESHGUI_CreateHypothesesDlg (parent, "", FALSE, true); + break; + } + + case 6016: // CONTROLS + case 6015: + case 6014: + case 6013: + case 6012: + case 6011: + case 6001: + case 6003: + case 6004: + if ( smeshGUI->myActiveStudy->getActiveStudyFrame()->getTypeView() == VIEW_VTK ) { + SALOME_Selection *Sel = SALOME_Selection::Selection(smeshGUI->myActiveStudy->getSelection()); + if ( Sel->IObjectCount() == 1 && Sel->firstIObject()->hasEntry() ) { + SALOMEDS::SObject_var SO = smeshGUI->myStudy->FindObjectID( Sel->firstIObject()->getEntry() ); + if ( !SO->_is_nil() ) { + CORBA::Object_var aObject = SO->GetObject(); + SMESH::SMESH_Mesh_var aMesh = SMESH::SMESH_Mesh::_narrow( aObject ); + SMESH::SMESH_subMesh_var aSubMesh = SMESH::SMESH_subMesh::_narrow( aObject ); + SMESH::SMESH_Group_var aGroup = SMESH::SMESH_Group::_narrow( aObject ); + if ( !aMesh->_is_nil() || !aSubMesh->_is_nil() || !aGroup->_is_nil() ) { + smeshGUI->Control( theCommandID ); + break; + } + } + } + QAD_MessageBox::warn1(smeshGUI->GetDesktop(), + tr( "SMESH_WRN_WARNING" ), + tr( "SMESH_BAD_SELECTION" ), + tr( "SMESH_BUT_OK" ) ); + break; + } + else { + QAD_MessageBox::warn1(smeshGUI->GetDesktop(), + tr( "SMESH_WRN_WARNING" ), + tr( "NOT_A_VTK_VIEWER" ), + tr( "SMESH_BUT_OK" ) ); + } + break; + case 9010: + { + SALOME_Selection *Sel = SALOME_Selection::Selection(smeshGUI->myActiveStudy->getSelection()); + if (Sel->IObjectCount() == 1) { + Handle(SALOME_InteractiveObject) anIObject = Sel->firstIObject(); + if(anIObject->hasEntry()) + if(SMESH_Actor *anActor = ::FindActorByEntry(anIObject->getEntry())){ + anActor->SetPointsLabeled( !anActor->GetPointsLabeled() ); + } + } + break; + } + case 9011: + { + SALOME_Selection *Sel = SALOME_Selection::Selection(smeshGUI->myActiveStudy->getSelection()); + if (Sel->IObjectCount() == 1) { + Handle(SALOME_InteractiveObject) anIObject = Sel->firstIObject(); + if(anIObject->hasEntry()) + if(SMESH_Actor *anActor = ::FindActorByEntry(anIObject->getEntry())){ + anActor->SetCellsLabeled( !anActor->GetCellsLabeled() ); + } + } + break; + } + case 10001: // DISPLAY MODE PREFERENCE + { + // Wireframe + parent->menuBar()->setItemChecked(10001, true); + parent->menuBar()->setItemChecked(10002, false); + parent->menuBar()->setItemChecked(10004, false); + parent->menuBar()->setItemEnabled(10003, true); + QAD_CONFIG->addSetting("SMESH:DisplayMode", "Wireframe"); + break; + } + case 10002: + { + parent->menuBar()->setItemChecked(10002, true); + parent->menuBar()->setItemChecked(10001, false); + parent->menuBar()->setItemChecked(10004, false); + parent->menuBar()->setItemEnabled(10003, true); + QAD_CONFIG->addSetting("SMESH:DisplayMode", "Shading"); + break; + } + case 10003: + { + parent->menuBar()->setItemChecked(10003,!parent->menuBar()->isItemChecked(10003)); + QAD_CONFIG->addSetting("SMESH:Shrink", parent->menuBar()->isItemChecked(10003) ? "yes" : "no"); + break; + } + case 10004: + { + parent->menuBar()->setItemChecked(10001, false); + parent->menuBar()->setItemChecked(10004, true); + parent->menuBar()->setItemChecked(10002, false); + parent->menuBar()->setItemEnabled(10003, false); + QAD_CONFIG->addSetting("SMESH:DisplayMode", "Nodes"); + break; + } + + } + + smeshGUI->myActiveStudy->updateObjBrowser(true); + return true; +} - switch (theCommandID) - { - case 33: // DELETE - smeshGUI->OnEditDelete(); - break; - - case 113: // IMPORT - case 112: - case 111: - { - Import_Document(parent, theCommandID); //NBU - //Import_Mesh(parent,theCommandID); - break; - } - - case 122: // EXPORT MED - case 121: - case 123: - { - Export_Mesh(parent, theCommandID); - break; - } - - case 200: // SCALAR BAR - { - smeshGUI->DisplayScalarBar(false); - break; - } - case 201: - { - SMESHGUI_EditScalarBarDlg *aDlg = - new SMESHGUI_EditScalarBarDlg(parent, "", false); - aDlg->show(); - break; - } - case 202: - { - smeshGUI->DisplayScalarBar(true); - break; - } - - case 1133: // DISPLAY MODE : WireFrame, Surface, Shrink - case 1132: - case 213: - case 212: - case 211: - { - smeshGUI->SetViewMode(theCommandID); - break; - } - - case 214: // UPDATE - { - smeshGUI->Update(); - break; - } - - case 300: // ERASE - { - SALOME_Selection *Sel = - SALOME_Selection::Selection(smeshGUI->myActiveStudy-> - getSelection()); - if (smeshGUI->myActiveStudy->getActiveStudyFrame()->getTypeView() == - VIEW_VTK) - { - // VTK - SALOME_ListIteratorOfListIO It(Sel->StoredIObjects()); - for (; It.More(); It.Next()) - { - Handle(SALOME_InteractiveObject) IOS = It.Value(); - if (IOS->hasEntry()) - { - Standard_Boolean res; - SMESH_Actor *ac = - smeshGUI->FindActorByEntry(IOS->getEntry(), res, true); - if (res) - smeshGUI->EraseActor(ac); - } - } - } - Sel->ClearIObjects(); - smeshGUI->myActiveStudy->updateObjBrowser(true); - } - - case 301: // DISPLAY - { - if (smeshGUI->myActiveStudy->getActiveStudyFrame()->getTypeView() == - VIEW_VTK) - { - // VTK - QApplication::setOverrideCursor(Qt::waitCursor); - SALOMEDS::SObject_var fatherSF = - smeshGUI->myStudy->FindObjectID(smeshGUI->myActiveStudy-> - getActiveStudyFrame()->entry()); - - SALOME_Selection *Sel = - SALOME_Selection::Selection(smeshGUI->myActiveStudy-> - getSelection()); - SALOME_ListIteratorOfListIO It(Sel->StoredIObjects()); - - for (; It.More(); It.Next()) - { - Handle(SALOME_InteractiveObject) IObject = It.Value(); - if (IObject->hasEntry()) - { - Standard_Boolean res; - SMESH_Actor *ac = - smeshGUI->FindActorByEntry(IObject->getEntry(), res, - false); - if (res) - { - smeshGUI->DisplayActor(ac, true); - smeshGUI->DisplayEdges(ac); - smeshGUI->ChangeRepresentation(ac, - ac->getDisplayMode()); - } - } - } - QApplication::restoreOverrideCursor(); - } - break; - } - - case 302: // DISPLAY ONLY - { - if (smeshGUI->myActiveStudy->getActiveStudyFrame()->getTypeView() == - VIEW_VTK) - { - QApplication::setOverrideCursor(Qt::waitCursor); - vtkActorCollection *theActors = Renderer->GetActors(); - theActors->InitTraversal(); - vtkActor *ac = theActors->GetNextActor(); - while (!(ac == NULL)) - { - if (ac->IsA("SMESH_Actor")) - { - SMESH_Actor *anActor = SMESH_Actor::SafeDownCast(ac); - if (!anActor->isHighlighted()) - { - //anActor->VisibilityOff(); - //NRI- : 02/12/2002 : Fixed bugId 882 - // anActor->EdgeDevice->VisibilityOff(); - // anActor->EdgeShrinkDevice->VisibilityOff(); - anActor->SetVisibility(false); - } - } - ac = theActors->GetNextActor(); - } - - // Display selection - SALOMEDS::SObject_var fatherSF = - smeshGUI->myStudy->FindObjectID(smeshGUI->myActiveStudy-> - getActiveStudyFrame()->entry()); - - SALOME_Selection *Sel = - SALOME_Selection::Selection(smeshGUI->myActiveStudy-> - getSelection()); - SALOME_ListIteratorOfListIO It(Sel->StoredIObjects()); - - for (; It.More(); It.Next()) - { - Handle(SALOME_InteractiveObject) IObject = It.Value(); - SALOMEDS::SObject_var obj = - smeshGUI->myStudy->FindObjectID(IObject->getEntry()); - - VTKViewer_RenderWindowInteractor *myRenderInter = - ((VTKViewer_ViewFrame *) smeshGUI->myActiveStudy-> - getActiveStudyFrame()->getRightFrame()->getViewFrame())-> - getRWInteractor(); - // vtkQGLRenderWindowInteractor* myRenderInter= smeshGUI->myActiveStudy->getActiveStudyFrame()->getRightFrame()->getVTKView()->getRWInteractor(); - - if (myRenderInter->isInViewer(IObject)) - { - if (IObject->hasEntry()) - { - Standard_Boolean res; - SMESH_Actor *ac = - smeshGUI->FindActorByEntry(IObject->getEntry(), res, - true); - if (res) - { - smeshGUI->DisplayActor(ac, true); - smeshGUI->DisplayEdges(ac); - smeshGUI->ChangeRepresentation(ac, - ac->getDisplayMode()); - } - } - } - } - smeshGUI->myActiveStudy->updateObjBrowser(true); - QApplication::restoreOverrideCursor(); - } - break; - } - - case 400: // NODES - { - if (smeshGUI->myActiveStudy->getActiveStudyFrame()->getTypeView() == - VIEW_VTK) - { //VTK - smeshGUI->EmitSignalDeactivateDialog(); - SALOME_Selection *Sel = - SALOME_Selection::Selection(smeshGUI->myActiveStudy-> - getSelection()); - Sel->ClearIObjects(); - smeshGUI->myDesktop->SetSelectionMode(1, true); - parent->menuBar()->setItemChecked(9010, false); - parent->menuBar()->setItemChecked(9011, false); - smeshGUI->ViewNodes(); - SMESHGUI_NodesDlg *aDlg = new SMESHGUI_NodesDlg(parent, "", Sel); - } - else - { - QApplication::restoreOverrideCursor(); - QAD_MessageBox::warn1(QAD_Application::getDesktop(), - tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"), - tr("SMESH_BUT_YES")); - } - break; - } - - case 405: // MOVE NODE - { - smeshGUI->myDesktop->SetSelectionMode(1, true); - SALOME_Selection *Sel = - SALOME_Selection::Selection(smeshGUI->myActiveStudy-> - getSelection()); - SMESHGUI_MoveNodesDlg *aDlg = - new SMESHGUI_MoveNodesDlg(parent, "", Sel); - break; - } - - case 701: // COMPUTE MESH - { - if (smeshGUI->myActiveStudy->getActiveStudyFrame()->getTypeView() == - VIEW_VTK) - { //VTK - SALOME_Selection *Sel = - SALOME_Selection::Selection(smeshGUI->myActiveStudy-> - getSelection()); - int nbSel = Sel->IObjectCount(); - if (nbSel != 1) - { - QApplication::restoreOverrideCursor(); - break; - } - - SMESH::SMESH_Mesh_var aM; - SMESH::SMESH_subMesh_var aSubM; - Handle(SALOME_InteractiveObject) IObject = Sel->firstIObject(); - if (IObject->hasEntry()) - { - SALOMEDS::SObject_var aMorSM = - smeshGUI->myStudy->FindObjectID(IObject->getEntry()); - SALOMEDS::GenericAttribute_var anAttr; - SALOMEDS::AttributeIOR_var anIOR; - if (!aMorSM->_is_nil()) - { - if (aMorSM->FindAttribute(anAttr, "AttributeIOR")) - { - anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); - MESSAGE("SMESHGUI::OnGUIEvent - Compute mesh : IOR = " - << anIOR->Value())CORBA::Object_var cobj; - try - { - cobj = _orb->string_to_object(anIOR->Value()); - if (CORBA::is_nil(cobj)) - { - MESSAGE - ("SMESHGUI::OnGUIEvent - Compute mesh : nil object")} - } - catch(CORBA::COMM_FAILURE & ex) - { - MESSAGE - ("SMESHGUI::OnGUIEvent - Compute mesh : exception (1)")} - aM = SMESH::SMESH_Mesh::_narrow(cobj); - //aM = SMESH::SMESH_Mesh::_narrow( _orb->string_to_object(anIOR->Value()) ); - aSubM = - SMESH::SMESH_subMesh::_narrow(_orb-> - string_to_object(anIOR->Value())); - if (!aM->_is_nil()) - { - GEOM::GEOM_Shape_var refShape = - smeshGUI->myStudyAPI. - GetShapeOnMeshOrSubMesh(aMorSM); - if (!refShape->_is_nil()) - { - bool compute = - smeshGUI->myComponentMesh-> - IsReadyToCompute(aM, refShape); - if (!compute) - { - QApplication::restoreOverrideCursor(); - QAD_MessageBox::warn1(QAD_Application:: - getDesktop(), tr("SMESH_WRN_WARNING"), - tr("SMESH_WRN_MISSING_PARAMETERS"), - tr("SMESH_BUT_YES")); - break; - } - try - { - smeshGUI->myComponentMesh->Compute(aM, - refShape); - smeshGUI->myStudyAPI.ModifiedMesh(aMorSM, - true); - // TO Do : change icon of all submeshes - } - catch(const SALOME::SALOME_Exception & S_ex) - { - QtCatchCorbaException(S_ex); - } - } - } - else if (!aSubM->_is_nil()) - { - aM = aSubM->GetFather(); - GEOM::GEOM_Shape_var refShape = - smeshGUI->myStudyAPI. - GetShapeOnMeshOrSubMesh(aMorSM); - if (!refShape->_is_nil()) - { - bool compute = - smeshGUI->myComponentMesh-> - IsReadyToCompute(aM, refShape); - if (!compute) - { - QApplication::restoreOverrideCursor(); - QAD_MessageBox::warn1(QAD_Application:: - getDesktop(), tr("SMESH_WRN_WARNING"), - tr("SMESH_WRN_MISSING_PARAMETERS"), - tr("SMESH_BUT_YES")); - break; - } - try - { - smeshGUI->myComponentMesh->Compute(aM, - refShape); - smeshGUI->myStudyAPI.ModifiedMesh(aMorSM, - true); - // TO Do : change icon of all submeshes - } - catch(const SALOME::SALOME_Exception & S_ex) - { - QtCatchCorbaException(S_ex); - } - } - } - } - } - } - - // Check whether the actor for the mesh exists at least in one view - Standard_Boolean res; - SMESH_Actor *ac = - smeshGUI->FindActorByEntry(IObject->getEntry(), res, false); - if (!res) - smeshGUI->InitActor(aM); - else - { - // Check whether the actor belongs to the active view - VTKViewer_RenderWindowInteractor *rwInter = - ((VTKViewer_ViewFrame *) smeshGUI->myActiveStudy-> - getActiveStudyFrame()->getRightFrame()->getViewFrame())-> - getRWInteractor(); - - // The actor belongs to inactive view -> create a copy and add it in the active view - if (!rwInter->isInViewer(IObject)) - { - SMESH_Actor *acCopy = SMESH_Actor::New(); - acCopy->ShallowCopy(ac); - - smeshGUI->DisplayActor(acCopy, false); - } - } - - if (smeshGUI->myAutomaticUpdate) - { - SMESH_Actor *Mesh = smeshGUI->ReadScript(aM); - if (Mesh != NULL) - { -#ifdef TRACE - Dump(Mesh); -#endif - smeshGUI->DisplayActor(Mesh, true); - smeshGUI->DisplayEdges(Mesh, true); - smeshGUI->ChangeRepresentation(Mesh, - Mesh->getDisplayMode()); - } - } - } - else - { - QApplication::restoreOverrideCursor(); - QAD_MessageBox::warn1(QAD_Application::getDesktop(), - tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"), - tr("SMESH_BUT_YES")); - } - QApplication::restoreOverrideCursor(); - break; - } - - case 702: // ADD SUB MESH - { - if (smeshGUI->myActiveStudy->getActiveStudyFrame()->getTypeView() == - VIEW_VTK) - { //VTK - smeshGUI->EmitSignalDeactivateDialog(); - SALOME_Selection *Sel = - SALOME_Selection::Selection(smeshGUI->myActiveStudy-> - getSelection()); - SMESHGUI_AddSubMeshDlg *aDlg = - new SMESHGUI_AddSubMeshDlg(parent, "", Sel); - } - else - { - QApplication::restoreOverrideCursor(); - QAD_MessageBox::warn1(QAD_Application::getDesktop(), - tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"), - tr("SMESH_BUT_YES")); - } - break; - } - - case 703: // INIT MESH - { - smeshGUI->EmitSignalDeactivateDialog(); - SALOME_Selection *Sel = - SALOME_Selection::Selection(smeshGUI->myActiveStudy-> - getSelection()); - SMESHGUI_InitMeshDlg *aDlg = new SMESHGUI_InitMeshDlg(parent, "", Sel); - break; - } - - case 704: // EDIT Hypothesis - { - smeshGUI->EmitSignalDeactivateDialog(); - SALOME_Selection *Sel = - SALOME_Selection::Selection(smeshGUI->myActiveStudy-> - getSelection()); - SMESHGUI_EditHypothesesDlg *aDlg = - new SMESHGUI_EditHypothesesDlg(parent, "", Sel); - break; - } - - case 705: // EDIT Global Hypothesis - { - smeshGUI->EmitSignalDeactivateDialog(); - SALOME_Selection *Sel = - SALOME_Selection::Selection(smeshGUI->myActiveStudy-> - getSelection()); - SMESHGUI_EditHypothesesDlg *aDlg = - new SMESHGUI_EditHypothesesDlg(parent, "", Sel); - break; - } - - case 706: // EDIT Local Hypothesis - { - smeshGUI->EmitSignalDeactivateDialog(); - SALOME_Selection *Sel = - SALOME_Selection::Selection(smeshGUI->myActiveStudy-> - getSelection()); - SMESHGUI_EditHypothesesDlg *aDlg = - new SMESHGUI_EditHypothesesDlg(parent, "", Sel); - break; - } - - case 806: // ORIENTATION ELEMENTS - { - smeshGUI->EmitSignalDeactivateDialog(); - SALOME_Selection *Sel = - SALOME_Selection::Selection(smeshGUI->myActiveStudy-> - getSelection()); - smeshGUI->myDesktop->SetSelectionMode(3, true); - SMESHGUI_OrientationElementsDlg *aDlg = - new SMESHGUI_OrientationElementsDlg(parent, "", Sel); - break; - } - - case 807: // DIAGONAL INVERSION - { - smeshGUI->EmitSignalDeactivateDialog(); - SALOME_Selection *Sel = - SALOME_Selection::Selection(smeshGUI->myActiveStudy-> - getSelection()); - Sel->ClearIObjects(); - smeshGUI->myDesktop->SetSelectionMode(2, true); - SMESHGUI_DiagonalInversionDlg *aDlg = - new SMESHGUI_DiagonalInversionDlg(parent, "", Sel); - break; - } - - case 900: // MESH INFOS - { - smeshGUI->EmitSignalDeactivateDialog(); - SALOME_Selection *Sel = - SALOME_Selection::Selection(smeshGUI->myActiveStudy-> - getSelection()); - SMESHGUI_MeshInfosDlg *aDlg = - new SMESHGUI_MeshInfosDlg(parent, "", Sel); - break; - } - - case 1001: // AUTOMATIC UPDATE PREFERENCES - { - parent->menuBar()->setItemChecked(1001, - !parent->menuBar()->isItemChecked(1001)); - if (parent->menuBar()->isItemChecked(1001)) - { - QAD_CONFIG->addSetting("SMESH:AutomaticUpdate", "true"); - smeshGUI->myAutomaticUpdate = true; - } - else - { - QAD_CONFIG->addSetting("SMESH:AutomaticUpdate", "false"); - smeshGUI->myAutomaticUpdate = false; - } - break; - } - - case 1003: // MESH PREFERENCES - { - smeshGUI->SetDisplaySettings(); - break; - } - - case 1005: - { - QString Bold = QAD_CONFIG->getSetting("ScalarBar:Bold"); - QString Italic = QAD_CONFIG->getSetting("ScalarBar:Italic"); - QString Shadow = QAD_CONFIG->getSetting("ScalarBar:Shadow"); - QString FontFamily = QAD_CONFIG->getSetting("ScalarBar:FontFamily"); - QString Orientation = QAD_CONFIG->getSetting("ScalarBar:Orientation"); - float Width = QAD_CONFIG->getSetting("ScalarBar:Width").toFloat(); - float Height = QAD_CONFIG->getSetting("ScalarBar:Height").toFloat(); - int NumberOfLabels = - QAD_CONFIG->getSetting("ScalarBar:NumberOfLabels").toInt(); - int NumberOfColors = - QAD_CONFIG->getSetting("ScalarBar:NumberOfColors").toInt(); - - if (Width == 0) - Width = 0.17; - if (Height == 0) - Height = 0.8; - if (NumberOfLabels == 0) - NumberOfLabels = 5; - if (NumberOfColors == 0) - NumberOfColors = 64; - - SMESHGUI_Preferences_ScalarBarDlg *aDlg = - new SMESHGUI_Preferences_ScalarBarDlg(parent, "", true); - - if (Bold.compare("true") == 0) - aDlg->Bold->setChecked(true); - else - aDlg->Bold->setChecked(false); - if (Italic.compare("true") == 0) - aDlg->Italic->setChecked(true); - else - aDlg->Italic->setChecked(false); - if (Shadow.compare("true") == 0) - aDlg->Shadow->setChecked(true); - else - aDlg->Shadow->setChecked(false); - - if (Orientation.compare("Horizontal") == 0) - aDlg->RadioHoriz->setChecked(true); - else - aDlg->RadioVert->setChecked(true); - - int NbItems = aDlg->ComboBox1->count(); - int i = 0; - aDlg->ComboBox1->setCurrentItem(i); - while (i < NbItems) - { - if (FontFamily.compare(aDlg->ComboBox1->text(i)) == 0) - aDlg->ComboBox1->setCurrentItem(i); - i++; - } - - aDlg->LineEditWidth->setText(QString("%1").arg(Width)); - aDlg->LineEditHeight->setText(QString("%1").arg(Height)); - - aDlg->SpinBoxLabels->setValue(NumberOfLabels); - aDlg->SpinBoxColors->setValue(NumberOfColors); - - aDlg->show(); - if (aDlg->result()) - { - if (aDlg->RadioHoriz->isChecked()) - Orientation = "Horizontal"; - else - Orientation = "Vertical"; - if (aDlg->Bold->isChecked()) - Bold = "true"; - else - Bold = "false"; - if (aDlg->Italic->isChecked()) - Italic = "true"; - else - Italic = "false"; - if (aDlg->Shadow->isChecked()) - Shadow = "true"; - else - Shadow = "false"; - - FontFamily = aDlg->ComboBox1->currentText(); - Width = aDlg->LineEditWidth->text().toFloat(); - Height = aDlg->LineEditHeight->text().toFloat(); - NumberOfColors = aDlg->SpinBoxColors->text().toInt(); - NumberOfLabels = aDlg->SpinBoxLabels->text().toInt(); - - vtkScalarBarActor *aScalarBar = smeshGUI->GetScalarBar(); - if (aScalarBar != NULL) - { - smeshGUI->SetSettingsScalarBar(aScalarBar, Bold, Italic, Shadow, - FontFamily, Orientation, - Width, Height, NumberOfColors, NumberOfLabels); - } - - QAD_CONFIG->addSetting("ScalarBar:Bold", Bold); - QAD_CONFIG->addSetting("ScalarBar:Italic", Italic); - QAD_CONFIG->addSetting("ScalarBar:Shadow", Shadow); - QAD_CONFIG->addSetting("ScalarBar:FontFamily", FontFamily); - QAD_CONFIG->addSetting("ScalarBar:Orientation", Orientation); - QAD_CONFIG->addSetting("ScalarBar:Width", Width); - QAD_CONFIG->addSetting("ScalarBar:Height", Height); - QAD_CONFIG->addSetting("ScalarBar:NumberOfLabels", NumberOfLabels); - QAD_CONFIG->addSetting("ScalarBar:NumberOfColors", NumberOfColors); - } - break; - } - - case 1100: // EDIT HYPOTHESIS - { - SALOME_Selection *Sel = - SALOME_Selection::Selection(smeshGUI->myActiveStudy-> - getSelection()); - int nbSel = Sel->IObjectCount(); - - if (nbSel == 1) - { - Standard_Boolean res; - SMESH::SMESH_Hypothesis_var Hyp = - smeshGUI->ConvertIOinSMESHHypothesis(Sel->firstIObject(), res); - - /* Look for all mesh objects that have this hupothesis affected in order to flag as ModifiedMesh */ - /* At end below '...->updateObjBrowser(true)' will change icon of mesh objects */ - /* Warning : however by internal mechanism all subMeshes icons are changed ! */ - SALOMEDS::Study::ListOfSObject_var listSOmesh = - smeshGUI->GetMeshesUsingAlgoOrHypothesis(Hyp); - - if (res) - { - QString Name = Hyp->GetName(); - - if (Name.compare("LocalLength") == 0) - { - SMESH::SMESH_LocalLength_var LL = - SMESH::SMESH_LocalLength::_narrow(Hyp); - double beforeLength = LL->GetLength(); - double Length = smeshGUI->Parameter(res, - beforeLength, - tr("SMESH_LOCAL_LENGTH_HYPOTHESIS"), - tr("SMESH_VALUE"), - 1.0E-5, 1E6, 6); - if (res && Length != beforeLength) - { - LL->SetLength(Length); - for (int i = 0; i < listSOmesh->length(); i++) - { - smeshGUI->GetStudyAPI().ModifiedMesh(listSOmesh[i], - false); - } - break; - } - - } - else if (Name.compare("NumberOfSegments") == 0) - { - SMESH::SMESH_NumberOfSegments_var NOS = - SMESH::SMESH_NumberOfSegments::_narrow(Hyp); - int beforeNbSeg = NOS->GetNumberOfSegments(); - int NbSeg = smeshGUI->Parameter(res, - beforeNbSeg, - tr("SMESH_NB_SEGMENTS_HYPOTHESIS"), - tr("SMESH_VALUE"), - 1, 1000000); - - if (res && NbSeg != beforeNbSeg) - { - NOS->SetNumberOfSegments(NbSeg); - for (int i = 0; i < listSOmesh->length(); i++) - { - SALOMEDS::SObject_var SO = listSOmesh[i]; - smeshGUI->GetStudyAPI().ModifiedMesh(listSOmesh[i], - false); - } - break; - } - - } - else if (Name.compare("MaxElementArea") == 0) - { - SMESH::SMESH_MaxElementArea_var MEA = - SMESH::SMESH_MaxElementArea::_narrow(Hyp); - double beforeMaxArea = MEA->GetMaxElementArea(); - double MaxArea = smeshGUI->Parameter(res, - beforeMaxArea, - tr("SMESH_MAX_ELEMENT_AREA_HYPOTHESIS"), - tr("SMESH_VALUE"), - 1.0E-5, 1E6, 6); - if (res && MaxArea != beforeMaxArea) - { - MEA->SetMaxElementArea(MaxArea); - for (int i = 0; i < listSOmesh->length(); i++) - { - smeshGUI->GetStudyAPI().ModifiedMesh(listSOmesh[i], - false); - } - break; - } - - } - else if (Name.compare("MaxElementVolume") == 0) - { - SMESH::SMESH_MaxElementVolume_var MEV = - SMESH::SMESH_MaxElementVolume::_narrow(Hyp); - double beforeMaxVolume = MEV->GetMaxElementVolume(); - double MaxVolume = smeshGUI->Parameter(res, - beforeMaxVolume, - tr("SMESH_MAX_ELEMENT_VOLUME_HYPOTHESIS"), - tr("SMESH_VALUE"), - 1.0E-5, 1E6, 6); - if (res && MaxVolume != beforeMaxVolume) - { - MEV->SetMaxElementVolume(MaxVolume); - for (int i = 0; i < listSOmesh->length(); i++) - { - smeshGUI->GetStudyAPI().ModifiedMesh(listSOmesh[i], - false); - } - break; - } - - } - else if (Name.compare("Regular_1D") == 0) - { - } - else if (Name.compare("MEFISTO_2D") == 0) - { - } - else - { - } - - } - } - break; - } - - case 1101: // RENAME - { - SALOME_Selection *Sel = - SALOME_Selection::Selection(smeshGUI->myActiveStudy-> - getSelection()); - SALOME_ListIteratorOfListIO It(Sel->StoredIObjects()); - for (; It.More(); It.Next()) - { - Handle(SALOME_InteractiveObject) IObject = It.Value(); - - SALOMEDS::SObject_var obj = - smeshGUI->myStudy->FindObjectID(IObject->getEntry()); - SALOMEDS::GenericAttribute_var anAttr; - SALOMEDS::AttributeName_var aName; - if (!obj->_is_nil()) - { - if (obj->FindAttribute(anAttr, "AttributeName")) - { - aName = SALOMEDS::AttributeName::_narrow(anAttr); - QString newName = QString(aName->Value()); - newName = - SALOMEGUI_NameDlg::getName(QAD_Application:: - getDesktop(), newName); - if (!newName.isEmpty()) - { - QApplication::setOverrideCursor(Qt::waitCursor); - smeshGUI->myActiveStudy->renameIObject(IObject, - newName); - } - QApplication::restoreOverrideCursor(); - } - } - } - break; - } - - case 1102: // REMOVE HYPOTHESIS / ALGORITHMS - { - QApplication::setOverrideCursor(Qt::waitCursor); - SALOME_Selection *Sel = - SALOME_Selection::Selection(smeshGUI->myActiveStudy-> - getSelection()); - SALOME_ListIteratorOfListIO It(Sel->StoredIObjects()); - for (int i = 0; It.More(); It.Next(), i++) - { - Handle(SALOME_InteractiveObject) IObject = It.Value(); - smeshGUI->RemoveHypothesisOrAlgorithmOnMesh(IObject); - } - Sel->ClearIObjects(); - smeshGUI->myActiveStudy->updateObjBrowser(true); - QApplication::restoreOverrideCursor(); - break; - } - - case 401: // GEOM::EDGE - { - if (smeshGUI->myActiveStudy->getActiveStudyFrame()->getTypeView() == - VIEW_VTK) - { //VTK - smeshGUI->EmitSignalDeactivateDialog(); - SALOME_Selection *Sel = - SALOME_Selection::Selection(smeshGUI->myActiveStudy-> - getSelection()); - Sel->ClearIObjects(); - smeshGUI->myDesktop->SetSelectionMode(1, true); - parent->menuBar()->setItemChecked(9010, false); - parent->menuBar()->setItemChecked(9011, false); - smeshGUI->ViewNodes(); - SMESHGUI_AddEdgeDlg *aDlg = - new SMESHGUI_AddEdgeDlg(parent, "", Sel); - } - else - { - QApplication::restoreOverrideCursor(); - QAD_MessageBox::warn1(QAD_Application::getDesktop(), - tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"), - tr("SMESH_BUT_YES")); - } - break; - } - case 4021: // TRIANGLE - { - if (smeshGUI->myActiveStudy->getActiveStudyFrame()->getTypeView() == - VIEW_VTK) - { //VTK - smeshGUI->EmitSignalDeactivateDialog(); - SALOME_Selection *Sel = - SALOME_Selection::Selection(smeshGUI->myActiveStudy-> - getSelection()); - Sel->ClearIObjects(); - smeshGUI->myDesktop->SetSelectionMode(1, true); - parent->menuBar()->setItemChecked(9010, false); - parent->menuBar()->setItemChecked(9011, false); - smeshGUI->ViewNodes(); - SMESHGUI_AddFaceDlg *aDlg = - new SMESHGUI_AddFaceDlg(parent, "", Sel, 3); - } - else - { - QApplication::restoreOverrideCursor(); - QAD_MessageBox::warn1(QAD_Application::getDesktop(), - tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"), - tr("SMESH_BUT_YES")); - } - break; - } - case 4022: // QUAD - { - if (smeshGUI->myActiveStudy->getActiveStudyFrame()->getTypeView() == - VIEW_VTK) - { //VTK - smeshGUI->EmitSignalDeactivateDialog(); - SALOME_Selection *Sel = - SALOME_Selection::Selection(smeshGUI->myActiveStudy-> - getSelection()); - Sel->ClearIObjects(); - smeshGUI->myDesktop->SetSelectionMode(1, true); - parent->menuBar()->setItemChecked(9010, false); - parent->menuBar()->setItemChecked(9011, false); - smeshGUI->ViewNodes(); - SMESHGUI_AddFaceDlg *aDlg = - new SMESHGUI_AddFaceDlg(parent, "", Sel, 4); - } - else - { - QApplication::restoreOverrideCursor(); - QAD_MessageBox::warn1(QAD_Application::getDesktop(), - tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"), - tr("SMESH_BUT_YES")); - } - break; - } - case 4031: // TETRA - { - if (smeshGUI->myActiveStudy->getActiveStudyFrame()->getTypeView() == - VIEW_VTK) - { //VTK - smeshGUI->EmitSignalDeactivateDialog(); - SALOME_Selection *Sel = - SALOME_Selection::Selection(smeshGUI->myActiveStudy-> - getSelection()); - Sel->ClearIObjects(); - smeshGUI->myDesktop->SetSelectionMode(1, true); - parent->menuBar()->setItemChecked(9010, false); - parent->menuBar()->setItemChecked(9011, false); - smeshGUI->ViewNodes(); - SMESHGUI_AddVolumeDlg *aDlg = - new SMESHGUI_AddVolumeDlg(parent, "", Sel, 4); - } - else - { - QApplication::restoreOverrideCursor(); - QAD_MessageBox::warn1(QAD_Application::getDesktop(), - tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"), - tr("SMESH_BUT_YES")); - } - break; - } - case 4032: // HEXA - { - if (smeshGUI->myActiveStudy->getActiveStudyFrame()->getTypeView() == - VIEW_VTK) - { //VTK - smeshGUI->EmitSignalDeactivateDialog(); - SALOME_Selection *Sel = - SALOME_Selection::Selection(smeshGUI->myActiveStudy-> - getSelection()); - Sel->ClearIObjects(); - smeshGUI->myDesktop->SetSelectionMode(1, true); - parent->menuBar()->setItemChecked(9010, false); - parent->menuBar()->setItemChecked(9011, false); - smeshGUI->ViewNodes(); - SMESHGUI_AddVolumeDlg *aDlg = - new SMESHGUI_AddVolumeDlg(parent, "", Sel, 8); - } - else - { - QApplication::restoreOverrideCursor(); - QAD_MessageBox::warn1(QAD_Application::getDesktop(), - tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"), - tr("SMESH_BUT_YES")); - } - break; - } - - case 4041: // REMOVES NODES - { - if (smeshGUI->myActiveStudy->getActiveStudyFrame()->getTypeView() == - VIEW_VTK) - { //VTK - smeshGUI->EmitSignalDeactivateDialog(); - SALOME_Selection *Sel = - SALOME_Selection::Selection(smeshGUI->myActiveStudy-> - getSelection()); - Sel->ClearIObjects(); - smeshGUI->myDesktop->SetSelectionMode(1, true); - parent->menuBar()->setItemChecked(9010, false); - parent->menuBar()->setItemChecked(9011, false); - smeshGUI->ViewNodes(); - SMESHGUI_RemoveNodesDlg *aDlg = - new SMESHGUI_RemoveNodesDlg(parent, "", Sel); - } - else - { - QApplication::restoreOverrideCursor(); - QAD_MessageBox::warn1(QAD_Application::getDesktop(), - tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"), - tr("SMESH_BUT_YES")); - } - break; - } - case 4042: // REMOVES ELEMENTS - { - if (smeshGUI->myActiveStudy->getActiveStudyFrame()->getTypeView() == - VIEW_VTK) - { //VTK - smeshGUI->EmitSignalDeactivateDialog(); - SALOME_Selection *Sel = - SALOME_Selection::Selection(smeshGUI->myActiveStudy-> - getSelection()); - Sel->ClearIObjects(); - smeshGUI->myDesktop->SetSelectionMode(3, true); - SMESHGUI_RemoveElementsDlg *aDlg = - new SMESHGUI_RemoveElementsDlg(parent, "", Sel); - } - else - { - QApplication::restoreOverrideCursor(); - QAD_MessageBox::warn1(QAD_Application::getDesktop(), - tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"), - tr("SMESH_BUT_YES")); - } - break; - } - - case 5000: // HYPOTHESIS - ALGO - { - smeshGUI->CreateAlgorithm("Regular_1D", "Wire Discretisation"); - break; - } - case 5010: - { - smeshGUI->CreateAlgorithm("MEFISTO_2D", "Triangle (Mefisto)"); - break; - } - case 5011: - { - smeshGUI->CreateAlgorithm("Quadrangle_2D", "Quadrangle (Mapping)"); - break; - } - case 5020: - { - smeshGUI->CreateAlgorithm("Hexa_3D", "Hexahedron (i,j,k)"); - break; - } - case 5021: - { - smeshGUI->CreateAlgorithm("NETGEN_3D", "Tetrahedron (Netgen)"); - break; - } - - case 5030: // HYPOTHESIS - LOCAL LENGTH - { - smeshGUI->EmitSignalDeactivateDialog(); - SALOME_Selection *Sel = - SALOME_Selection::Selection(smeshGUI->myActiveStudy-> - getSelection()); - SMESHGUI_LocalLengthDlg *aDlg = new SMESHGUI_LocalLengthDlg(parent, ""); - break; - } - case 5031: // HYPOTHESIS - NB SEGMENTS - { - smeshGUI->EmitSignalDeactivateDialog(); - SALOME_Selection *Sel = - SALOME_Selection::Selection(smeshGUI->myActiveStudy-> - getSelection()); - SMESHGUI_NbSegmentsDlg *aDlg = new SMESHGUI_NbSegmentsDlg(parent, ""); - break; - } - - case 5032: // HYPOTHESIS - MAX ELEMENT AREA - { - smeshGUI->EmitSignalDeactivateDialog(); - SALOME_Selection *Sel = - SALOME_Selection::Selection(smeshGUI->myActiveStudy-> - getSelection()); - SMESHGUI_MaxElementAreaDlg *aDlg = - new SMESHGUI_MaxElementAreaDlg(parent, ""); - break; - } - - case 5033: // HYPOTHESIS - MAX ELEMENT VOLUME - { - smeshGUI->EmitSignalDeactivateDialog(); - SALOME_Selection *Sel = - SALOME_Selection::Selection(smeshGUI->myActiveStudy-> - getSelection()); - SMESHGUI_MaxElementVolumeDlg *aDlg = - new SMESHGUI_MaxElementVolumeDlg(parent, ""); - break; - } - - case 5034: // HYPOTHESIS - LENGTH FROM EDGES - { - SMESH::SMESH_Hypothesis_var Hyp; - try - { - Hyp = smeshGUI->myComponentMesh->CreateHypothesis("LengthFromEdges", smeshGUI->myStudyId); - - if (!Hyp->_is_nil()) - { - SALOMEDS::SObject_var SHyp = smeshGUI->myStudyAPI.AddNewHypothesis(Hyp); - smeshGUI->myStudyAPI.SetName(SHyp, "LengthFromEdges"); - } - } - catch(const SALOME::SALOME_Exception & S_ex) - { - QtCatchCorbaException(S_ex); - } - smeshGUI->myActiveStudy->updateObjBrowser(true); - - break; - } - - case 6016: // CONTROLS - case 6015: - case 6014: - case 6013: - case 6012: - case 6011: - case 6001: - { - SALOME_Selection *Sel = - SALOME_Selection::Selection(smeshGUI->myActiveStudy-> - getSelection()); - int nbSel = Sel->IObjectCount(); - if (nbSel != 1) - break; - smeshGUI->Control(theCommandID); - break; - } - - case 6002: - { - if (smeshGUI->myActiveStudy->getActiveStudyFrame()->getTypeView() == - VIEW_VTK) - { //VTK - SALOME_Selection *Sel = - SALOME_Selection::Selection(smeshGUI->myActiveStudy-> - getSelection()); - SMESHGUI_EdgesConnectivityDlg *Dlg = - new SMESHGUI_EdgesConnectivityDlg(parent, "", Sel); - } - else - { - QApplication::restoreOverrideCursor(); - QAD_MessageBox::warn1(QAD_Application::getDesktop(), - tr("SMESH_WRN_WARNING"), tr("SMESH_WRN_VIEWER_VTK"), - tr("SMESH_BUT_YES")); - } - break; - } - - case 9010: - { - if (!parent->menuBar()->isItemChecked(9010)) - { - QApplication::setOverrideCursor(Qt::waitCursor); - parent->menuBar()->setItemChecked(9011, false); - - smeshGUI->EraseSimulationActors(); - smeshGUI->mySimulationActors2D = vtkActor2DCollection::New(); - - SALOME_Selection *Sel = - SALOME_Selection::Selection(smeshGUI->myActiveStudy-> - getSelection()); - int nbSel = Sel->IObjectCount(); - if (nbSel == 1) - { - Standard_Boolean res; - SMESH_Actor *MeshActor = - smeshGUI->FindActorByEntry(Sel->firstIObject()->getEntry(), - res, true); - if (res) - { - parent->menuBar()->setItemChecked(9010, - !parent->menuBar()->isItemChecked(9010)); - - // It's necessary to display SMDS IDs instead of VTK ones, so - // vtkIdFilter is unacceptable here. We have to do it manually :( - vtkUnstructuredGrid *ptGrid = vtkUnstructuredGrid::New(); - ptGrid->CopyStructure(MeshActor->DataSource); - - int numPts = MeshActor->DataSource->GetNumberOfPoints(); - - // Loop over points and generate ids - vtkIntArray *ptIds = vtkIntArray::New(); - ptIds->SetNumberOfValues(numPts); - - for (int id = 0; id < numPts; id++) - { - int idSMDS = MeshActor->GetIdSMESHDSNode(id); - ptIds->SetValue(id, idSMDS); - } - -// mpv porting vtk4.2.2 - // vtkScalars* newScalars = vtkScalars::New(); - // newScalars->SetData(ptIds); - // ptGrid->GetPointData()->SetScalars(newScalars); - ptGrid->GetPointData()->SetScalars(ptIds); - // newScalars->Delete(); -// mpv - ptIds->Delete(); - - vtkMaskPoints *mask = vtkMaskPoints::New(); - mask->SetInput(ptGrid); - mask->SetOnRatio(1); - // mask->SetMaximumNumberOfPoints( 50 ); - // mask->RandomModeOn(); - - vtkSelectVisiblePoints *visPts = - vtkSelectVisiblePoints::New(); - visPts->SetInput(mask->GetOutput()); - visPts->SetRenderer(((VTKViewer_ViewFrame *) smeshGUI-> - myActiveStudy->getActiveStudyFrame()-> - getRightFrame()->getViewFrame())->getRenderer()); - //visPts->SetSelectInvisible(1); - visPts->SelectInvisibleOff(); - visPts->SetTolerance(0.1); - - vtkLabeledDataMapper *ldm = vtkLabeledDataMapper::New(); - ldm->SetInput(visPts->GetOutput()); - ldm->SetLabelFormat("%g"); - ldm->SetLabelModeToLabelScalars(); - //ldm->SetLabelModeToLabelFieldData(); - - ldm->SetFontFamilyToTimes(); - ldm->SetFontSize(6 * parent->font().pointSize() / 5); - ldm->SetBold(1); - ldm->SetItalic(0); - ldm->SetShadow(0); - - vtkActor2D *pointLabels = vtkActor2D::New(); - pointLabels->SetMapper(ldm); - pointLabels->GetProperty()->SetColor(0, 1, 0); - - visPts->Delete(); - ldm->Delete(); - smeshGUI->mySimulationActors2D->AddItem(pointLabels); - ((VTKViewer_ViewFrame *) smeshGUI->myActiveStudy-> - getActiveStudyFrame()->getRightFrame()-> - getViewFrame())->getRenderer()->AddActor2D(pointLabels); - } - } - } - else - { - QApplication::setOverrideCursor(Qt::waitCursor); - parent->menuBar()->setItemChecked(9010, - !parent->menuBar()->isItemChecked(9010)); - smeshGUI->EraseSimulationActors(); - smeshGUI->ScalarVisibilityOff(); - } - QApplication::restoreOverrideCursor(); - break; - } - case 9011: - { - if (!parent->menuBar()->isItemChecked(9011)) - { - QApplication::setOverrideCursor(Qt::waitCursor); - parent->menuBar()->setItemChecked(9010, false); - - smeshGUI->EraseSimulationActors(); - smeshGUI->mySimulationActors2D = vtkActor2DCollection::New(); - - SALOME_Selection *Sel = - SALOME_Selection::Selection(smeshGUI->myActiveStudy-> - getSelection()); - int nbSel = Sel->IObjectCount(); - if (nbSel == 1) - { - Standard_Boolean res; - SMESH_Actor *MeshActor = - smeshGUI->FindActorByEntry(Sel->firstIObject()->getEntry(), - res, true); - if (res) - { - parent->menuBar()->setItemChecked(9011, - !parent->menuBar()->isItemChecked(9011)); - - // It's necessary to display SMDS IDs instead of VTK ones, so - // vtkIdFilter is unacceptable here. We have to do it manually :( - vtkUnstructuredGrid *elGrid = vtkUnstructuredGrid::New(); - elGrid->CopyStructure(MeshActor->DataSource); - - int numCells = MeshActor->DataSource->GetNumberOfCells(); - - // Loop over points and generate ids - vtkIntArray *cellIds = vtkIntArray::New(); - cellIds->SetNumberOfValues(numCells); - - for (int id = 0; id < numCells; id++) - { - int idSMDS = MeshActor->GetIdSMESHDSElement(id); - cellIds->SetValue(id, idSMDS); - } - -// mpv porting vk4.2.2 - // vtkScalars* newScalars = vtkScalars::New(); - // newScalars->SetData(cellIds); - elGrid->GetCellData()->SetScalars(cellIds); - // elGrid->GetCellData()->SetScalars(newScalars); - // newScalars->Delete(); -//mpv - - cellIds->Delete(); - - vtkCellCenters *cc = vtkCellCenters::New(); - cc->SetInput(elGrid); - - vtkSelectVisiblePoints *visCells = - vtkSelectVisiblePoints::New(); - visCells->SetInput(cc->GetOutput()); - visCells->SetRenderer(((VTKViewer_ViewFrame *) smeshGUI-> - myActiveStudy->getActiveStudyFrame()-> - getRightFrame()->getViewFrame())->getRenderer()); - visCells->SelectInvisibleOff(); - visCells->SetTolerance(0.1); - // visCells->SetSelectInvisible(1); - - vtkLabeledDataMapper *ldm = vtkLabeledDataMapper::New(); - ldm->SetInput(visCells->GetOutput()); - ldm->SetLabelFormat("%g"); - ldm->SetLabelModeToLabelScalars(); - - ldm->SetFontFamilyToTimes(); - ldm->SetFontSize(6 * parent->font().pointSize() / 5); - ldm->SetBold(1); - ldm->SetItalic(0); - ldm->SetShadow(0); - - vtkActor2D *cellLabels = vtkActor2D::New(); - cellLabels->SetMapper(ldm); - cellLabels->GetProperty()->SetColor(1, 0, 0); - - cc->Delete(); - visCells->Delete(); - ldm->Delete(); - smeshGUI->mySimulationActors2D->AddItem(cellLabels); - ((VTKViewer_ViewFrame *) smeshGUI->myActiveStudy-> - getActiveStudyFrame()->getRightFrame()-> - getViewFrame())->getRenderer()->AddActor2D(cellLabels); - } - } - } - else - { - QApplication::setOverrideCursor(Qt::waitCursor); - parent->menuBar()->setItemChecked(9011, - !parent->menuBar()->isItemChecked(9011)); - smeshGUI->EraseSimulationActors(); - smeshGUI->ScalarVisibilityOff(); - } - QApplication::restoreOverrideCursor(); - break; - } - - case 10001: // DISPLAY MODE PREFERENCE - { - parent->menuBar()->setItemChecked(10001, - !parent->menuBar()->isItemChecked(10001)); - parent->menuBar()->setItemChecked(10002, false); - parent->menuBar()->setItemChecked(10003, false); - QAD_CONFIG->addSetting("SMESH:DisplayMode", "Wireframe"); - break; - } - case 10002: - { - parent->menuBar()->setItemChecked(10002, - !parent->menuBar()->isItemChecked(10002)); - parent->menuBar()->setItemChecked(10001, false); - parent->menuBar()->setItemChecked(10003, false); - QAD_CONFIG->addSetting("SMESH:DisplayMode", "Shading"); - break; - } - case 10003: - { - parent->menuBar()->setItemChecked(10003, - !parent->menuBar()->isItemChecked(10003)); - parent->menuBar()->setItemChecked(10002, false); - parent->menuBar()->setItemChecked(10001, false); - QAD_CONFIG->addSetting("SMESH:DisplayMode", "Shrink"); - break; - } - - } - - smeshGUI->myActiveStudy->updateObjBrowser(true); - return true; -} - -//============================================================================= -/*! function : GetMeshesUsingAlgoOrHypothesis() - * purpose : return a list of Study objects (mesh kind) that have 'AlgoOrHyp' affected. - * : However is supposed here that father of father of an hypothesis is a Mesh Object. - */ -//============================================================================= -SALOMEDS::Study::ListOfSObject * - SMESHGUI::GetMeshesUsingAlgoOrHypothesis(SMESH:: - SMESH_Hypothesis_ptr AlgoOrHyp) -{ - SALOMEDS::Study::ListOfSObject_var listSOmesh = - new SALOMEDS::Study::ListOfSObject; - listSOmesh->length(0); - unsigned int index = 0; - if (!AlgoOrHyp->_is_nil()) - { - SALOMEDS::SObject_var SO_Hypothesis = - smeshGUI->GetStudyAPI().FindHypothesisOrAlgorithms(AlgoOrHyp); - if (!SO_Hypothesis->_is_nil()) - { - SALOMEDS::Study::ListOfSObject_var listSO = - smeshGUI->myStudy->FindDependances(SO_Hypothesis); - for (unsigned int i = 0; i < listSO->length(); i++) - { - SALOMEDS::SObject_var SO = listSO[i]; - if (!SO->_is_nil()) - { - SALOMEDS::SObject_var SOfatherFather = - SO->GetFather()->GetFather(); - if (!SOfatherFather->_is_nil()) - { - index++; - listSOmesh->length(index); - listSOmesh[index - 1] = SOfatherFather; - } - } - } - } - } - return listSOmesh._retn(); -} - -//============================================================================= -/*! - * - */ -//============================================================================= -void SMESHGUI::Import_Mesh(QAD_Desktop * parent, int theCommandID) -{ - QString filter; - string myExtension; - Mesh_Reader *myReader; - - if (theCommandID == 113) - { - filter = tr("MED files (*.med)"); - myExtension = string("MED"); - myReader = new DriverMED_R_SMESHDS_Mesh; - } - else if (theCommandID == 112) - { - filter = tr("IDEAS files (*.unv)"); - myExtension = string("UNV"); - } - else if (theCommandID == 111) - { - filter = tr("DAT files (*.dat)"); - myExtension = string("MED"); - myReader = new DriverDAT_R_SMESHDS_Mesh; - } - - QString filename = QAD_FileDlg::getFileName(parent, - "", - filter, - tr("Import mesh"), - true); - if (!filename.isEmpty()) - { - QApplication::setOverrideCursor(Qt::waitCursor); - string myClass = string("SMESHDS_Mesh"); -// Mesh_Reader* myReader = SMESHDriver::GetMeshReader(myExtension, myClass); - - int myMeshId = (smeshGUI->myDocument)->NewMesh(); - SMDS_Mesh *myMesh = (smeshGUI->myDocument)->GetMesh(myMeshId); - - myReader->SetFile(string(filename.latin1())); - myReader->SetMesh(myMesh); - myReader->SetMeshId(myMeshId); - myReader->Read(); - - QApplication::restoreOverrideCursor(); - } -} - -//============================================================================= -/*! - * - */ -//============================================================================= -void SMESHGUI::Export_Mesh(QAD_Desktop * parent, int theCommandID) -{ - SALOME_Selection *Sel = - SALOME_Selection::Selection(smeshGUI->myActiveStudy->getSelection()); - int nbSel = Sel->IObjectCount(); - if (nbSel == 1) - { - Standard_Boolean res; - Handle(SALOME_InteractiveObject) IObject = Sel->firstIObject(); - SMESH::SMESH_Mesh_var aMesh = smeshGUI->ConvertIOinMesh(IObject, res); - if (res) - { - if (theCommandID == 122) - { // EXPORT MED - QString filename = QAD_FileDlg::getFileName(parent, - "", - tr("MED files (*.med)"), - tr("Export mesh"), - false); - if (!filename.isEmpty()) - { - QApplication::setOverrideCursor(Qt::waitCursor); - aMesh->ExportMED(filename.latin1()); - QApplication::restoreOverrideCursor(); - } - } - else if (theCommandID == 121) - { // EXPORT DAT - QString filename = QAD_FileDlg::getFileName(parent, - "", - tr("DAT files (*.dat)"), - tr("Export mesh"), - false); - if (!filename.isEmpty()) - { - QApplication::setOverrideCursor(Qt::waitCursor); - aMesh->ExportDAT(filename.latin1()); - QApplication::restoreOverrideCursor(); - } - } - else if (theCommandID == 123) - { // EXPORT UNV - QString filename = QAD_FileDlg::getFileName(parent, - "", - tr("IDEAS files (*.unv)"), - tr("Export mesh"), - false); - if (!filename.isEmpty()) - { - QApplication::setOverrideCursor(Qt::waitCursor); - aMesh->ExportUNV(filename.latin1()); - QApplication::restoreOverrideCursor(); - } - else - aMesh->ExportDAT(filename.latin1()); - - QApplication::restoreOverrideCursor(); - - if (IObject->hasEntry()) - { - MESSAGE("---"); - SALOMEDS::SObject_var SO = - smeshGUI->myStudy->FindObjectID(IObject->getEntry()); - SALOMEDS::GenericAttribute_var anAttr; - SALOMEDS::AttributeComment_var aFileName; - SALOMEDS::StudyBuilder_var aStudyBuilder = - smeshGUI->myStudy->NewBuilder(); - anAttr = - aStudyBuilder->FindOrCreateAttribute(SO, - "AttributeComment"); - aFileName = SALOMEDS::AttributeComment::_narrow(anAttr); - aFileName->SetValue(filename.latin1()); - } - } - } - } -} - -//============================================================================= -/*! - * - */ -//============================================================================= -void SMESHGUI::Import_Document(QAD_Desktop * parent, int theCommandID) -{ - QString filter; - string myExtension; - Document_Reader *myReader; - - if (theCommandID == 113) - { - filter = tr("MED files (*.med)"); - myExtension = string("MED"); - myReader = new DriverMED_R_SMESHDS_Document; - } - else if (theCommandID == 112) - { - filter = tr("IDEAS files (*.unv)"); - myExtension = string("UNV"); - myReader = new DriverUNV_R_SMESHDS_Document; - } - else if (theCommandID == 111) - { - filter = tr("DAT files (*.dat)"); - myExtension = string("DAT"); - myReader = new DriverDAT_R_SMESHDS_Document; - } - - QString filename = QAD_FileDlg::getFileName(parent, - "", - filter, - tr("Import document"), - true); - if (!filename.isEmpty()) - { - QApplication::setOverrideCursor(Qt::waitCursor); - string myClass = string("SMESHDS_Document"); -// Document_Reader* myReader = SMESHDriver::GetDocumentReader(myExtension, myClass); - SMESHDS_Document *newDocument = new SMESHDS_Document(1); - - myReader->SetFile(string(filename.latin1())); - myReader->SetDocument(smeshGUI->myDocument); - myReader->Read(); - QApplication::restoreOverrideCursor(); - } -} - -void SMESHGUI::Export_Document(QAD_Desktop * parent, int theCommandID) -{ - QString filter; - Document_Writer *myWriter; - string myExtension; - - if (theCommandID == 122) - { - filter = tr("MED files (*.med)"); - myExtension = string("MED"); - myWriter = new DriverMED_W_SMESHDS_Document; - } - else if (theCommandID == 121) - { - filter = tr("DAT files (*.dat)"); - myExtension = string("DAT"); - myWriter = new DriverDAT_W_SMESHDS_Document; - } - else if (theCommandID == 123) - { - filter = tr("IDEAS files (*.unv)"); - myExtension = string("UNV"); - myWriter = new DriverUNV_W_SMESHDS_Document; - } - - QString filename = QAD_FileDlg::getFileName(parent, - "", - filter, - tr("Export document"), - false); - if (!filename.isEmpty()) - { - QApplication::setOverrideCursor(Qt::waitCursor); - string myClass = string("SMESHDS_Document"); - //Document_Writer* myWriter = SMESHDriver::GetDocumentWriter(myExtension, myClass); - - myWriter->SetFile(string(filename.latin1())); - myWriter->SetDocument(smeshGUI->myDocument); - - //StudyContextStruct* myStudyContext = _impl.GetStudyContext(myStudyId); - //Handle(SMESHDS_Document) myDocument = myStudyContext->myDocument; - //myWriter->SetDocument(myDocument); - - myWriter->Write(); - QApplication::restoreOverrideCursor(); - } -} - -//============================================================================= -/*! - * - */ -//============================================================================= -bool SMESHGUI::OnMousePress(QMouseEvent * pe, QAD_Desktop * parent, - QAD_StudyFrame * studyFrame) -{ - SMESHGUI::GetOrCreateSMESHGUI(parent); - return false; -} - -//============================================================================= -/*! - * - */ -//============================================================================= -bool SMESHGUI::OnMouseMove(QMouseEvent * pe, QAD_Desktop * parent, - QAD_StudyFrame * studyFrame) -{ - SMESHGUI::GetOrCreateSMESHGUI(parent); - - return true; -} - -//============================================================================= -/*! - * - */ -//============================================================================= -bool SMESHGUI::OnKeyPress(QKeyEvent * pe, QAD_Desktop * parent, - QAD_StudyFrame * studyFrame) -{ - SMESHGUI::GetOrCreateSMESHGUI(parent); - - return true; -} - -//============================================================================= -/*! - * - */ -//============================================================================= -bool SMESHGUI::SetSettings(QAD_Desktop * parent) -{ - SMESHGUI::GetOrCreateSMESHGUI(parent); - - /* Display mode */ - QString DisplayMode = QAD_CONFIG->getSetting("SMESH:DisplayMode"); - if (DisplayMode.compare("") == 0) - { - DisplayMode = "Shading"; - QAD_CONFIG->addSetting("SMESH:DisplayMode", "Shading"); - } - - if (DisplayMode.compare("Wireframe") == 0) - { - parent->menuBar()->setItemChecked(10003, false); - parent->menuBar()->setItemChecked(10002, false); - parent->menuBar()->setItemChecked(10001, true); - } - else if (DisplayMode.compare("Shading") == 0) - { - parent->menuBar()->setItemChecked(10003, false); - parent->menuBar()->setItemChecked(10002, true); - parent->menuBar()->setItemChecked(10001, false); - } - else if (DisplayMode.compare("Shrink") == 0) - { - parent->menuBar()->setItemChecked(10003, true); - parent->menuBar()->setItemChecked(10002, false); - parent->menuBar()->setItemChecked(10001, false); - } - - /* Automatic Update */ - QString AutoUpdate = QAD_CONFIG->getSetting("SMESH:AutomaticUpdate"); - if (AutoUpdate.compare("true") == 0) - { - parent->menuBar()->setItemChecked(1001, true); - smeshGUI->myAutomaticUpdate = true; - } - else - { - parent->menuBar()->setItemChecked(1001, false); - smeshGUI->myAutomaticUpdate = false; - } - - /* menus disable */ - parent->menuBar()->setItemEnabled(11, false); // IMPORT - - return true; -} - -//============================================================================= -/*! - * - */ -//============================================================================= -void SMESHGUI::DefinePopup(QString & theContext, QString & theParent, - QString & theObject) -{ - /* Create or retrieve an object SMESHGUI */ - SMESHGUI::GetOrCreateSMESHGUI(QAD_Application::getDesktop()); - - // NRI : Temporary added - // if ( smeshGUI->myStudy->GetProperties()->IsLocked() ) { - // theObject = "NothingSelected"; - // theContext = "NothingSelected"; - // } - // NRI - - SALOME_Selection *Sel = - SALOME_Selection::Selection(smeshGUI->myActiveStudy->getSelection()); - int nbSel = Sel->IObjectCount(); - if (nbSel == 0) - { - if (smeshGUI->myActiveStudy->getActiveStudyFrame()->getTypeView() == - VIEW_VTK) - { - vtkScalarBarActor *aScalarBar = smeshGUI->GetScalarBar(); - if ((aScalarBar != NULL) && (aScalarBar->GetVisibility() == 1)) - { - theObject = "ScalarBar"; - theContext = ""; - } - else - { - theObject = "NothingSelected"; - theContext = "NothingSelected"; - } - } - else - { - theObject = "NothingSelected"; - theContext = "NothingSelected"; - } - } - else if (nbSel == 1) - { - theObject = smeshGUI->CheckTypeObject(Sel->firstIObject()); - theContext = ""; - } - else - { - theObject = smeshGUI->CheckHomogeneousSelection(); - theContext = ""; - } -} - -//============================================================================= -/*! - * - */ -//============================================================================= -bool SMESHGUI::CustomPopup(QAD_Desktop * parent, - QPopupMenu * popup, - const QString & theContext, - const QString & theParent, const QString & theObject) -{ - // Popup should be customized for any viewer since some meaningless commands may be present in the popup - //if (smeshGUI->myActiveStudy->getActiveStudyFrame()->getTypeView() != VIEW_VTK) //Test du type de viewer true=OCC false=VTK - // return false; - /* Create or retrieve an object SMESHGUI */ - SMESHGUI::GetOrCreateSMESHGUI(parent); - - // NRI : Temporary added - // if ( smeshGUI->myStudy->GetProperties()->IsLocked() ) { - // return false; - // } - // NRI - - SALOME_Selection *Sel = - SALOME_Selection::Selection(smeshGUI->myActiveStudy->getSelection()); - QAD_StudyFrame *studyFrame = smeshGUI->myActiveStudy->getActiveStudyFrame(); - int nbSel = Sel->IObjectCount(); - - if (nbSel == 0) - { - if (studyFrame->getTypeView() != VIEW_VTK) - popup->clear(); - return false; - } - else if (nbSel == 1) - { - QString parentComp = - ((SALOMEGUI_Desktop *) parent)->getComponentFromSelection(); - // First check type of active viewer (VTK required) - if ( /*studyFrame->getTypeView() != VIEW_VTK || */ parentComp != - parent->getActiveComponent()) - { - //MESSAGE("CustomPopup(): VTK viewer required, removing all SMESH-specific popup menu items") - while (1) - { - int id = popup->idAt(0); - if (id <= QAD_TopLabel_Popup_ID) - popup->removeItemAt(0); - else - break; - } - if (theObject.compare("Component") == 0) - { - popup->removeItem(QAD_DisplayOnly_Popup_ID); - } - return false; - } - - // Remove common popup items for Submesh, Hypothesis and Algorithm - if (theObject.compare("SubMesh") == 0 || - theObject.compare("Hypothesis") == 0 || - theObject.compare("Algorithm") == 0) - { - popup->removeItem(QAD_Display_Popup_ID); - popup->removeItem(QAD_DisplayOnly_Popup_ID); - popup->removeItem(QAD_Erase_Popup_ID); - int id = popup->idAt(popup->count() - 1); // last item - if (id < 0 && id != -1) - popup->removeItem(id); // separator - } - - if (theObject.compare("Component") == 0) - { - popup->removeItem(QAD_DisplayOnly_Popup_ID); - return true; - } - - int id = QAD_TopLabel_Popup_ID; //popup->idAt(0); - QFont f = QApplication::font(); - f.setBold(TRUE); - - Handle(SALOME_InteractiveObject) IObject = Sel->firstIObject(); - - if (theParent.compare("Viewer") == 0) - { - if (popup->idAt(0) == id) - { - popup->removeItem(id); - popup->insertItem(new CustomItem(QString(IObject->getName()), - f), id, 0); - } - - Standard_Boolean res; - SMESH_Actor *ac = - smeshGUI->FindActorByEntry(IObject->getEntry(), res, false); - if (res && studyFrame->getTypeView() == VIEW_VTK) - { - VTKViewer_RenderWindowInteractor *myRenderInter = - ((VTKViewer_ViewFrame *) studyFrame->getRightFrame()-> - getViewFrame())->getRWInteractor(); - if (myRenderInter->isVisible(IObject)) - { - popup->removeItem(QAD_Display_Popup_ID); - } - else - { - popup->removeItem(QAD_Erase_Popup_ID); - } - } - else - { - popup->removeItem(QAD_Erase_Popup_ID); - if (!res) - { // mesh not computed -> can't display it - popup->removeItem(QAD_Display_Popup_ID); - popup->removeItem(QAD_DisplayOnly_Popup_ID); - popup->removeItemAt(popup->count() - 1); //separator - } - } - } - else if (theParent.compare("ObjectBrowser") == 0) - { - if (theObject.compare("Mesh") == 0 || - theObject.compare("SubMesh") == 0 || - theObject.compare("Hypothesis") == 0 || - theObject.compare("Algorithm") == 0) - { - popup->removeItemAt(0); - } - else - { - if (popup->idAt(0) == id) - { - popup->removeItem(id); - popup->removeItemAt(0); //separator - } - } - - Standard_Boolean res; - SMESH_Actor *ac = - smeshGUI->FindActorByEntry(IObject->getEntry(), res, false); - if (res && studyFrame->getTypeView() == VIEW_VTK) - { - VTKViewer_RenderWindowInteractor *myRenderInter = - ((VTKViewer_ViewFrame *) studyFrame->getRightFrame()-> - getViewFrame())->getRWInteractor(); - if (myRenderInter->isVisible(IObject)) - { - popup->removeItem(QAD_Display_Popup_ID); - } - else - { - popup->removeItem(QAD_Erase_Popup_ID); - } - } - else - { - if (theObject.compare("Mesh") == 0 || - theObject.compare("SubMesh") == 0 || - theObject.compare("Hypothesis") == 0 || - theObject.compare("Algorithm") == 0) - { - } - else - { - popup->removeItem(QAD_Erase_Popup_ID); - if (!res) - { // mesh not computed -> can't display it - popup->removeItem(QAD_Display_Popup_ID); - popup->removeItem(QAD_DisplayOnly_Popup_ID); - popup->removeItemAt(popup->count() - 1); //separator - } - } - } - } - } - else - { - QString parentComp = - ((SALOMEGUI_Desktop *) parent)->getComponentFromSelection(); - QAD_StudyFrame *studyFrame = - smeshGUI->myActiveStudy->getActiveStudyFrame(); - if ( /*studyFrame->getTypeView() != VIEW_VTK || */ parentComp != - parent->getActiveComponent()) - { - //MESSAGE("CustomPopup(): VTK viewer required, removing all SMESH-specific popup menu items") - while (1) - { - int id = popup->idAt(0); - if (id <= QAD_TopLabel_Popup_ID && id != -1) - popup->removeItemAt(0); - else - break; - } - if (parentComp.isNull()) - { // objects from several components are selected - popup->removeItem(QAD_DisplayOnly_Popup_ID); - popup->removeItem(QAD_Display_Popup_ID); - popup->removeItem(QAD_Erase_Popup_ID); - int id = popup->idAt(popup->count() - 1); // last item - if (id < 0 && id != -1) - popup->removeItem(id); // separator - } - return false; - } - - QString type = smeshGUI->CheckHomogeneousSelection(); - if (type.compare("Heterogeneous Selection") != 0) - { - int id = QAD_TopLabel_Popup_ID; //popup->idAt(0); - QFont f = QApplication::font(); - f.setBold(TRUE); - popup->removeItem(id); - popup->insertItem(new CustomItem(QString("%1 ").arg(nbSel) + type + - " (s) ", f), id, 0); - } - } - return false; -} - -//============================================================================= -/*! Method: BuildPresentation(const Handle(SALOME_InteractiveObject)& theIO) - * Purpose: ensures that the actor for the given exists in the active VTK view - */ -//============================================================================= -void SMESHGUI::BuildPresentation(const Handle(SALOME_InteractiveObject) & theIO) -{ - /* Create or retrieve an object SMESHGUI */ - SMESHGUI::GetOrCreateSMESHGUI(QAD_Application::getDesktop()); - - QAD_StudyFrame *activeFrame = - smeshGUI->myActiveStudy->getActiveStudyFrame(); - if (activeFrame->getTypeView() == VIEW_VTK) - { - // VTK - SALOMEDS::SObject_var fatherSF = - smeshGUI->myStudy->FindObjectID(activeFrame->entry()); - - SALOME_Selection *Sel = - SALOME_Selection::Selection(smeshGUI->myActiveStudy-> - getSelection()); - SALOME_ListIteratorOfListIO It(Sel->StoredIObjects()); - -// for(;It.More();It.Next()) { -// Handle(SALOME_InteractiveObject) IObject = It.Value(); - Handle(SALOME_InteractiveObject) IObject = theIO; - if (IObject->hasEntry()) - { - // Look for the actor in all views - Standard_Boolean res; - SMESH_Actor *ac = - smeshGUI->FindActorByEntry(IObject->getEntry(), res, false); - - // Actor not found at all -> mesh is not computed -> do nothing!!! - if (!res) - { - /*SMESH::SMESH_Mesh_var aM; - * SALOMEDS::SObject_var aMorSM = smeshGUI->myStudy->FindObjectID( IObject->getEntry() ); - * SALOMEDS::SObject_var father = aMorSM->GetFather(); - * SALOMEDS::SObject_var fatherComp = aMorSM->GetFatherComponent(); - * - * // Non-displayable objects (Hypo, Algo) have tags < 3 or have a father different from component - * if (aMorSM->Tag() < 3 || strcmp(father->GetID(), fatherComp->GetID()) != 0) - * continue; - * - * SALOMEDS::GenericAttribute_var anAttr; - * SALOMEDS::AttributeIOR_var anIOR; - * if ( !aMorSM->_is_nil() ) { - * if (aMorSM->FindAttribute(anAttr, "AttributeIOR") ) { - * anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); - * aM = SMESH::SMESH_Mesh::_narrow( _orb->string_to_object(anIOR->Value()) ); - * } - * } - * - * if (!aM->_is_nil()) { - * smeshGUI->InitActor(aM); - * ac = smeshGUI->ReadScript(aM); - * } - * - * if (ac) { - * smeshGUI->DisplayActor( ac, true ); - * smeshGUI->DisplayEdges( ac ); - * smeshGUI->ChangeRepresentation( ac, ac->getDisplayMode() ); - * } */ -// continue; - } - else - { // The actor exists in some view - // Check whether the actor belongs to the active view - VTKViewer_RenderWindowInteractor *rwInter = - ((VTKViewer_ViewFrame *) activeFrame->getRightFrame()-> - getViewFrame())->getRWInteractor(); - - // The actor belongs to inactive view -> create a copy and display it in the active view - if (!rwInter->isInViewer(IObject)) - { - if(ac->GetMapper()==NULL) - { - SMESH::SMESH_Mesh_var aMesh = smeshGUI->ConvertIOinMesh(theIO, res); - ac=smeshGUI->ReadScript(aMesh); - } - SMESH_Actor *acCopy = SMESH_Actor::New(); - acCopy->ShallowCopy(ac); - ac = acCopy; - } - smeshGUI->DisplayActor(ac, false); - smeshGUI->DisplayEdges(ac); - smeshGUI->ChangeRepresentation(ac, ac->getDisplayMode()); - } - } -// } - } - else - { - MESSAGE - ("BuildPresentation() must not be called while non-VTK view is active")} -} - -//============================================================================= -/*! - * - */ -//============================================================================= -void SMESHGUI::setOrb() -{ - try - { - ORB_INIT & init = *SINGLETON_ < ORB_INIT >::Instance(); - ASSERT(SINGLETON_ < ORB_INIT >::IsAlreadyExisting()); - _orb = init(0, 0); - } catch(...) - { - INFOS("internal error : orb not found"); - _orb = 0; - } - ASSERT(!CORBA::is_nil(_orb)); -} - -//============================================================================= -/*! - * - */ -//============================================================================= -SMESH_Actor *SMESHGUI::ReadScript(SMESH::SMESH_Mesh_ptr aMesh) -{ - SMESH_Actor *MeshActor; - if (!aMesh->_is_nil()) - { - Standard_Boolean result; - MeshActor = FindActor(aMesh, result, false); - if (result) - { - SMESH::log_array_var aSeq = aMesh->GetLog(true); - - if (aSeq->length() == 0) - { - MESSAGE("ReadScript(): log is empty") return MeshActor; - } - - for (unsigned int ind = 0; ind < aSeq->length(); ind++) - { - switch (aSeq[ind].commandType) - { - case SMESH::ADD_NODE: - { - AddNodes(MeshActor, aSeq[ind].number, aSeq[ind].coords, - aSeq[ind].indexes); - break; - } - case SMESH::ADD_EDGE: - { - // AddEdges( MeshActor, aSeq[ind].number, aSeq[ind].coords, aSeq[ind].indexes ); - break; - } - case SMESH::ADD_TRIANGLE: - { - AddTriangles(MeshActor, aSeq[ind].number, aSeq[ind].coords, - aSeq[ind].indexes); - break; - } - case SMESH::ADD_QUADRANGLE: - { - AddQuadrangles(MeshActor, aSeq[ind].number, - aSeq[ind].coords, aSeq[ind].indexes); - break; - } - case SMESH::ADD_TETRAHEDRON: - { - AddTetras(MeshActor, aSeq[ind].number, aSeq[ind].coords, - aSeq[ind].indexes); - break; - } - case SMESH::ADD_PYRAMID: - { - break; - } - case SMESH::ADD_PRISM: - { - break; - } - case SMESH::ADD_HEXAHEDRON: - { - AddHexaedres(MeshActor, aSeq[ind].number, aSeq[ind].coords, - aSeq[ind].indexes); - break; - } - case SMESH::REMOVE_NODE: - { - RemoveNodes(MeshActor, aSeq[ind].number, aSeq[ind].coords, - aSeq[ind].indexes); - break; - } - case SMESH::REMOVE_ELEMENT: - { - RemoveElements(MeshActor, aSeq[ind].number, - aSeq[ind].coords, aSeq[ind].indexes); - break; - } - } - } - return MeshActor; - } - } - return NULL; -} - -//============================================================================= -/*! - * - */ //============================================================================= -void SMESHGUI::Dump(SMESH_Actor * Mactor) -{ - vtkUnstructuredGrid *ugrid = - vtkUnstructuredGrid::SafeDownCast(Mactor->DataSource); - vtkPoints *Pts = ugrid->GetPoints(); - int nbPts = Pts->GetNumberOfPoints(); - int nbCells = ugrid->GetNumberOfCells(); - - FILE *In; - int i, j; - In = fopen("/tmp/dumpMesh", "w+"); - fprintf(In, "%d %d\n", nbPts, nbCells); - for (int i = 0; i < nbPts; i++) - { - float *p = ugrid->GetPoint(i); - fprintf(In, "%d %e %e %e\n", i, p[0], p[1], p[2]); - } - - for (int i = 0; i < nbCells; i++) - { - fprintf(In, "%d %d", i, ugrid->GetCell(i)->GetCellType()); - vtkIdList *Id = ugrid->GetCell(i)->GetPointIds(); - for (j = 0; j < Id->GetNumberOfIds(); j++) - { - fprintf(In, " %d", Id->GetId(j)); - } - fprintf(In, "\n"); - } - fclose(In); -} - -//============================================================================= -/*! - * - */ -//============================================================================= -void SMESHGUI::AddNodes(SMESH_Actor * Mactor, int number, - const SMESH::double_array & coords, const SMESH::long_array & indexes) -{ - QApplication::setOverrideCursor(Qt::waitCursor); - if (Mactor->GetMapper() == NULL) - { - vtkPoints *Pts = vtkPoints::New(); - SMESH_Grid *ugrid = SMESH_Grid::New(); - ugrid->Allocate(); - - int i = 1; - int j = 1; - while (i <= number) - { - int idVTK = - Pts->InsertNextPoint(coords[j - 1], coords[j], coords[j + 1]); - //Mactor->AddNode( indexes[i-1], idVTK ); - ugrid->AddNode(indexes[i - 1], idVTK); - i++; - j = j + 3; - } - //vtkUnstructuredGrid *ugrid = vtkUnstructuredGrid::New(); - ugrid->SetPoints(Pts); - vtkDataSetMapper *PtsMapper = vtkDataSetMapper::New(); - PtsMapper->SetInput(ugrid); - Mactor->DataSource = PtsMapper->GetInput(); - Mactor->SetMapper(PtsMapper); - } - else - { - //vtkUnstructuredGrid* ugrid = vtkUnstructuredGrid::SafeDownCast( Mactor->DataSource ); - SMESH_Grid *ugrid = SMESH_Grid::SafeDownCast(Mactor->DataSource); - int i = 1; - int j = 1; - while (i <= number) - { - int idVTK = - ugrid->GetPoints()->InsertNextPoint(coords[j - 1], coords[j], - coords[j + 1]); - ugrid->AddNode(indexes[i - 1], idVTK); - i++; - j = j + 3; - } - vtkDataSetMapper *PtsMapper = vtkDataSetMapper::New(); - PtsMapper->SetInput(ugrid); - Mactor->DataSource = PtsMapper->GetInput(); - Mactor->SetMapper(PtsMapper); - } - QApplication::restoreOverrideCursor(); -} - -//============================================================================= -/*! - * +/*! function : GetMeshesUsingAlgoOrHypothesis() + * purpose : return a list of Study objects (mesh kind) that have 'AlgoOrHyp' affected. + * : However is supposed here that father of father of an hypothesis is a Mesh Object. */ -//============================================================================= -void SMESHGUI::AddNode(SMESH_Actor * Mactor, int idnode, float x, float y, - float z) +//============================================================================= +SALOMEDS::Study::ListOfSObject * + SMESHGUI::GetMeshesUsingAlgoOrHypothesis(SMESH:: + SMESH_Hypothesis_ptr AlgoOrHyp) { - QApplication::setOverrideCursor(Qt::waitCursor); - MESSAGE("SMESHGUI::AddNode " << idnode << " : " << x << ";" << y << ";" << - z) if (Mactor->GetMapper() == NULL) - { - vtkPoints *Pts = vtkPoints::New(); - int idVTK = Pts->InsertNextPoint(x, y, z); - //Mactor->AddNode( idnode, idVTK ); - //vtkUnstructuredGrid *ugrid = vtkUnstructuredGrid::New(); - SMESH_Grid *ugrid = SMESH_Grid::New(); - ugrid->Allocate(); - ugrid->AddNode(idnode, idVTK); - ugrid->SetPoints(Pts); - vtkDataSetMapper *PtsMapper = vtkDataSetMapper::New(); - PtsMapper->SetInput(ugrid); - Mactor->DataSource = PtsMapper->GetInput(); - Mactor->SetMapper(PtsMapper); - } - else - { - //vtkUnstructuredGrid* ugrid = vtkUnstructuredGrid::SafeDownCast( Mactor->DataSource ); - SMESH_Grid *ugrid = SMESH_Grid::SafeDownCast(Mactor->DataSource); - int idVTK = ugrid->GetPoints()->InsertNextPoint(x, y, z); - //Mactor->AddNode( idnode, idVTK ); - ugrid->AddNode(idnode, idVTK); - vtkDataSetMapper *PtsMapper = vtkDataSetMapper::New(); - PtsMapper->SetInput(ugrid); - Mactor->DataSource = PtsMapper->GetInput(); - Mactor->SetMapper(PtsMapper); + SALOMEDS::Study::ListOfSObject_var listSOmesh = + new SALOMEDS::Study::ListOfSObject; + listSOmesh->length(0); + unsigned int index = 0; + if (!AlgoOrHyp->_is_nil()) { + SALOMEDS::SObject_var SO_Hypothesis = + smeshGUI->GetStudyAPI().FindObject(AlgoOrHyp); + if (!SO_Hypothesis->_is_nil()) { + SALOMEDS::Study::ListOfSObject_var listSO = + smeshGUI->myStudy->FindDependances(SO_Hypothesis); + MESSAGE("SMESHGUI::GetMeshesUsingAlgoOrHypothesis(): dependency number ="<length()); + for (unsigned int i = 0; i < listSO->length(); i++) { + SALOMEDS::SObject_ptr SO = listSO[i]; + if (!SO->_is_nil()) { + SALOMEDS::SObject_var aFather = SO->GetFather(); + if (!aFather->_is_nil()) { + SALOMEDS::SObject_var SOfatherFather = aFather->GetFather(); + if (!SOfatherFather->_is_nil()) { + MESSAGE("SMESHGUI::GetMeshesUsingAlgoOrHypothesis(): dependency added to list"); + index++; + listSOmesh->length(index); + listSOmesh[index - 1] = SOfatherFather; + } + } } - QApplication::restoreOverrideCursor(); -} - -//============================================================================= -/*! - * - */ -//============================================================================= -void SMESHGUI::RemoveNode(SMESH_Actor * Mactor, int idnode) -{ - MESSAGE(" OLD RemoveNode method ") -// int id = Mactor->GetIdVTKNode( idnode ); -// MESSAGE ( " RemoveNode id VTK " << id ) -// if ( Mactor->GetMapper() != NULL ) { -// vtkUnstructuredGrid* ugrid = vtkUnstructuredGrid::SafeDownCast( Mactor->DataSource ); -// vtkUnstructuredGrid* newUgrid = vtkUnstructuredGrid::New(); -// vtkPoints *Pts = ugrid->GetPoints(); -// vtkPoints *newPts = vtkPoints::New(); -// int nbPts = Pts->GetNumberOfPoints(); -// bool findPt = false; -// for ( int i = 0; i < nbPts; i++ ) { -// if ( id != i ) { -// if ( !findPt) -// newPts->InsertPoint(i, Pts->GetPoint(i) ); -// else -// newPts->InsertPoint(i-1, Pts->GetPoint(i) ); -// } else { -// findPt = true; -// Mactor->RemoveNode( idnode ); -// } -// } -// newUgrid->SetPoints(newPts); -// int nbCells = ugrid->GetNumberOfCells(); -// for ( int i = 0; i < nbCells; i++ ) { -// vtkIdList *Ids = ugrid->GetCell(i)->GetPointIds(); -// vtkIdList *newIds = vtkIdList::New(); -// int nbIds = Ids->GetNumberOfIds(); -// newIds->SetNumberOfIds(nbIds); -// for ( int j = 0; j < nbIds; j++ ) { -// int theid = Ids->GetId(j); -// if ( theid > id ) { -// newIds->SetId( j, theid-1 ); -// } else -// newIds->SetId( j, theid ); -// } -// int idSMDSel = Mactor->GetIdSMESHDSElement( i ); -// Mactor->RemoveElement( idSMDSel, false ); -// int idVTKel = newUgrid->InsertNextCell( ugrid->GetCell(i)->GetCellType(), newIds ); -// Mactor->AddElement( idSMDSel, idVTKel ); -// } -// vtkDataSetMapper *Mapper = vtkDataSetMapper::New(); -// Mapper->SetInput( newUgrid ); -// Mactor->DataSource = Mapper->GetInput(); -// Mactor->SetMapper(Mapper); -// UpdateView(); -// } + } + } + } + MESSAGE("SMESHGUI::GetMeshesUsingAlgoOrHypothesis(): completed"); + return listSOmesh._retn(); } //============================================================================= @@ -4496,103 +3106,54 @@ void SMESHGUI::RemoveNode(SMESH_Actor * Mactor, int idnode) * */ //============================================================================= -void SMESHGUI::RemoveNodes(SMESH_Actor * Mactor, int number, - const SMESH::double_array & coords, const SMESH::long_array & indexes) -{ - QApplication::setOverrideCursor(Qt::waitCursor); - int i = 1; - while (i <= number) - { - Mactor->RemoveNode(indexes[i - 1]); - i++; - } - - TColStd_DataMapOfIntegerInteger newMapVTKNodes; - TColStd_DataMapOfIntegerInteger newMapSMESHDSNodes; - TColStd_DataMapOfIntegerInteger MapOldNodesToNewNodes; - - if (Mactor->GetMapper() != NULL) - { - SMESH_Grid *ugrid = SMESH_Grid::SafeDownCast(Mactor->DataSource); - SMESH_Grid *newUgrid = SMESH_Grid::New(); - newUgrid->CopyMaps(ugrid); - - vtkPoints *Pts = ugrid->GetPoints(); - vtkPoints *newPts = vtkPoints::New(); - int nbPts = Pts->GetNumberOfPoints(); - int j = 0; - for (int i = 0; i < nbPts; i++) - { - int idSMESHDSNode = Mactor->GetIdSMESHDSNode(i); - if (idSMESHDSNode != -1) - { - newPts->InsertPoint(j, Pts->GetPoint(i)); - - newMapVTKNodes.Bind(j, idSMESHDSNode); - newMapSMESHDSNodes.Bind(idSMESHDSNode, j); - - MapOldNodesToNewNodes.Bind(i, j); - j++; - } - } - - newUgrid->SetIdsVTKNode(newMapVTKNodes); - newUgrid->SetIdsSMESHDSNode(newMapSMESHDSNodes); - newUgrid->SetPoints(newPts); - - TColStd_DataMapOfIntegerInteger newMapElementSMDStoVTK; - TColStd_DataMapOfIntegerInteger newMapElementVTKtoSMDS; - - int nbCells = ugrid->GetNumberOfCells(); - for (int i = 0; i < nbCells; i++) - { - vtkIdList *Ids = ugrid->GetCell(i)->GetPointIds(); - vtkIdList *newIds = vtkIdList::New(); - int nbIds = Ids->GetNumberOfIds(); - newIds->SetNumberOfIds(nbIds); - bool isGood = true; - for (int j = 0; j < nbIds; j++) - { - int theid = Ids->GetId(j); - if (MapOldNodesToNewNodes.IsBound(theid)) - { - newIds->SetId(j, MapOldNodesToNewNodes.Find(theid)); - } - else - { - isGood = false; - break; - } - } - - // Filtering out cells based on non-existing nodes - if (isGood) - { - int idSMDSel = Mactor->GetIdSMESHDSElement(i); - int idVTKel = - newUgrid->InsertNextCell(ugrid->GetCell(i)->GetCellType(), - newIds); - - newMapElementSMDStoVTK.Bind(idSMDSel, idVTKel); - newMapElementVTKtoSMDS.Bind(idVTKel, idSMDSel); - } - } - - newUgrid->SetIdsVTKElement(newMapElementVTKtoSMDS); - newUgrid->SetIdsSMESHDSElement(newMapElementSMDStoVTK); - - // Copy new data to the old DatSource: keep the single DataSource for all actors - ugrid->DeepCopy(newUgrid); - - vtkDataSetMapper *Mapper = vtkDataSetMapper::New(); - Mapper->SetInput(ugrid); - Mactor->SetMapper(Mapper); - - // Commented to avoid multiple viewer updates when called by ReadScript() - //UpdateView(); - - } - QApplication::restoreOverrideCursor(); +void SMESHGUI::Import_Mesh(QAD_Desktop * parent, int theCommandID){ + QString filter; + string myExtension; + + if(theCommandID == 113){ + filter = tr("MED files (*.med)"); + }else if (theCommandID == 112){ + filter = tr("IDEAS files (*.unv)"); + }else if (theCommandID == 111){ + filter = tr("DAT files (*.dat)"); + } + QString filename = QAD_FileDlg::getFileName(parent, + "", + filter, + tr("Import mesh"), + true); + if(!filename.isEmpty()){ + QAD_WaitCursor wc; + SMESH::mesh_array_var aMeshes; + try { + SMESH::DriverMED_ReadStatus res; + aMeshes = smeshGUI->myComponentMesh->CreateMeshesFromMED(filename.latin1(), + res); + if ( res > SMESH::DRS_OK ) { + wc.stop(); + QAD_MessageBox::warn1(QAD_Application::getDesktop(), + tr("SMESH_WRN_WARNING"), + tr(QString("SMESH_DRS_%1").arg(res)), + tr("SMESH_BUT_OK")); + wc.start(); + + } + } + catch (const SALOME::SALOME_Exception& S_ex) + { + wc.stop(); + QtCatchCorbaException(S_ex); + wc.start(); + } + for ( int i = 0, n = aMeshes->length(); i < n; i++ ) { + SALOMEDS::SObject_var aMeshSO = smeshGUI->myStudyAPI.FindObject( aMeshes[i] ); + if ( !aMeshSO->_is_nil() ) { + SALOMEDS::StudyBuilder_var aBuilder = smeshGUI->myStudy->NewBuilder(); + SALOMEDS::AttributePixMap_var aPixmap = SALOMEDS::AttributePixMap::_narrow( aBuilder->FindOrCreateAttribute( aMeshSO, "AttributePixMap" ) ); + aPixmap->SetPixMap( "ICON_SMESH_TREE_MESH_IMPORTED" ); + } + } + } } //============================================================================= @@ -4600,40 +3161,61 @@ void SMESHGUI::RemoveNodes(SMESH_Actor * Mactor, int number, * */ //============================================================================= -void SMESHGUI::RemoveNodes(SMESH::SMESH_Mesh_ptr aMesh, - const TColStd_MapOfInteger & MapIndex) -{ - QApplication::setOverrideCursor(Qt::waitCursor); - Standard_Boolean result; - SMESH_Actor *ac = FindActor(aMesh, result, true); - if (result) - { - SMESH::long_array_var anArrayOfIdeces = new SMESH::long_array; - anArrayOfIdeces->length(MapIndex.Extent()); - TColStd_MapIteratorOfMapOfInteger ite(MapIndex); - int i = 0; - for (; ite.More(); ite.Next()) - { - // MESSAGE ( " RemoveNode : id " << ac->GetIdSMESHDSNode(ite.Key()) ) - anArrayOfIdeces[i] = ac->GetIdSMESHDSNode(ite.Key()); - i++; - } - SMESH::SMESH_MeshEditor_var aMeshEditor = aMesh->GetMeshEditor(); - aMeshEditor->RemoveNodes(anArrayOfIdeces); - - } - if (myAutomaticUpdate) - { - SMESH_Actor *Mesh = smeshGUI->ReadScript(aMesh); - if (Mesh != NULL) - { - smeshGUI->DisplayActor(Mesh); - smeshGUI->DisplayEdges(Mesh); - smeshGUI->ChangeRepresentation(Mesh, Mesh->getDisplayMode()); - AddActorInSelection(Mesh); - } - } - QApplication::restoreOverrideCursor(); +void SMESHGUI::Export_Mesh(QAD_Desktop * parent, int theCommandID) +{ + SALOME_Selection *Sel = + SALOME_Selection::Selection(smeshGUI->myActiveStudy->getSelection()); + int nbSel = Sel->IObjectCount(); + if ( !nbSel ) + return; + Standard_Boolean res; + Handle(SALOME_InteractiveObject) IObject = Sel->firstIObject(); + SMESH::SMESH_Mesh_var aMesh = smeshGUI->ConvertIOinMesh(IObject, res); + if ( res && ( nbSel == 1 || theCommandID == 122 ) ) {// MED export supports multiple meshes + QString aFilter, aTitle = tr("Export mesh"); + switch ( theCommandID ) { + case 122: + aFilter = tr("MED files (*.med)"); + break; + case 121: + aFilter = tr("DAT files (*.dat)"); + break; + case 123: + aFilter = tr("IDEAS files (*.unv)"); + break; + default: + break; + } + + QString filename = QAD_FileDlg::getFileName(parent, "", aFilter, aTitle, false); + + if ( !filename.isEmpty() ) { + // Check whether the file already exists and delete it if yes + QFile aFile( filename ); + if ( aFile.exists() ) + aFile.remove(); + + QAD_WaitCursor wc; + for ( SALOME_ListIteratorOfListIO it( Sel->StoredIObjects() ); it.More(); it.Next() ) { + aMesh = smeshGUI->ConvertIOinMesh( it.Value(), res ); + if ( res ) { + switch ( theCommandID ) { + case 122: + aMesh->ExportMED( filename.latin1(), true ); // currently, automatic groups are always created + break; + case 121: + aMesh->ExportDAT( filename.latin1() ); + break; + case 123: + aMesh->ExportUNV( filename.latin1() ); + break; + default: + break; + } + } + } + } + } } //============================================================================= @@ -4641,29 +3223,10 @@ void SMESHGUI::RemoveNodes(SMESH::SMESH_Mesh_ptr aMesh, * */ //============================================================================= -void SMESHGUI::RemoveElement(SMESH_Actor * Mactor, int idelement) +bool SMESHGUI::OnMousePress(QMouseEvent * pe, QAD_Desktop * parent, + QAD_StudyFrame * studyFrame) { - MESSAGE(" OLD RemoveElement method ") -// int id = Mactor->GetIdVTKElement( idelement ); -// MESSAGE ( " RemoveElement id VTK : " << id ) -// if ( Mactor->GetMapper() != NULL ) { -// vtkUnstructuredGrid* ugrid = vtkUnstructuredGrid::SafeDownCast( Mactor->DataSource ); -// vtkUnstructuredGrid* newUgrid = vtkUnstructuredGrid::New(); -// int nbCells = ugrid->GetNumberOfCells(); -// for ( int i = 0; i < nbCells; i++ ) { -// if ( id != i ) { -// newUgrid->InsertNextCell( ugrid->GetCell(i)->GetCellType(), -// ugrid->GetCell(i)->GetPointIds() ); -// } else -// Mactor->RemoveElement( idelement ); -// } -// newUgrid->SetPoints(ugrid->GetPoints()); -// vtkDataSetMapper *Mapper = vtkDataSetMapper::New(); -// Mapper->SetInput( newUgrid ); -// Mactor->DataSource = Mapper->GetInput(); -// Mactor->SetMapper(Mapper); -// UpdateView(); -// } + return false; } //============================================================================= @@ -4671,55 +3234,10 @@ void SMESHGUI::RemoveElement(SMESH_Actor * Mactor, int idelement) * */ //============================================================================= -void SMESHGUI::RemoveElements(SMESH_Actor * Mactor, int number, - const SMESH::double_array & coords, const SMESH::long_array & indexes) +bool SMESHGUI::OnMouseMove(QMouseEvent * pe, QAD_Desktop * parent, + QAD_StudyFrame * studyFrame) { - QApplication::setOverrideCursor(Qt::waitCursor); - int i = 1; - while (i <= number) - { - Mactor->RemoveElement(indexes[i - 1]); - i++; - } - TColStd_DataMapOfIntegerInteger newMapElementSMDStoVTK; - TColStd_DataMapOfIntegerInteger newMapElementVTKtoSMDS; - - if (Mactor->GetMapper() != NULL) - { - SMESH_Grid *ugrid = SMESH_Grid::SafeDownCast(Mactor->DataSource); - SMESH_Grid *newUgrid = SMESH_Grid::New(); - newUgrid->CopyMaps(ugrid); - - int nbCells = ugrid->GetNumberOfCells(); - for (int i = 0; i < nbCells; i++) - { - int idSMESHDSElement = Mactor->GetIdSMESHDSElement(i); - if (idSMESHDSElement != -1) - { - int newId = - newUgrid->InsertNextCell(ugrid->GetCell(i)->GetCellType(), - ugrid->GetCell(i)->GetPointIds()); - newMapElementSMDStoVTK.Bind(idSMESHDSElement, newId); - newMapElementVTKtoSMDS.Bind(newId, idSMESHDSElement); - } - } - - newUgrid->SetIdsVTKElement(newMapElementVTKtoSMDS); - newUgrid->SetIdsSMESHDSElement(newMapElementSMDStoVTK); - - newUgrid->SetPoints(ugrid->GetPoints()); - - // Copy new data to the old DatSource: keep the single DataSource for all actors - ugrid->DeepCopy(newUgrid); - - vtkDataSetMapper *Mapper = vtkDataSetMapper::New(); - Mapper->SetInput(ugrid); - Mactor->SetMapper(Mapper); - - // Commented to avoid multiple viewer updates when called by ReadScript() - //UpdateView(); - } - QApplication::restoreOverrideCursor(); + return true; } //============================================================================= @@ -4727,44 +3245,10 @@ void SMESHGUI::RemoveElements(SMESH_Actor * Mactor, int number, * */ //============================================================================= -void SMESHGUI::RemoveElements(SMESH::SMESH_Mesh_ptr aMesh, - const TColStd_MapOfInteger & MapIndex) +bool SMESHGUI::OnKeyPress(QKeyEvent * pe, QAD_Desktop * parent, + QAD_StudyFrame * studyFrame) { - QApplication::setOverrideCursor(Qt::waitCursor); - Standard_Boolean result; - SMESH_Actor *ac = FindActor(aMesh, result, true); - if (result) - { - SMESH::long_array_var anArrayOfIdeces = new SMESH::long_array; - anArrayOfIdeces->length(MapIndex.Extent()); - TColStd_MapIteratorOfMapOfInteger ite(MapIndex); - int i = 0; - for (; ite.More(); ite.Next()) - { - // MESSAGE ( " RemoveElement : id " << ite.Key() << "," << ac->GetIdSMESHDSElement(ite.Key()) ) - anArrayOfIdeces[i] = ac->GetIdSMESHDSElement(ite.Key()); - i++; - } - - SMESH::SMESH_MeshEditor_var aMeshEditor = aMesh->GetMeshEditor(); - aMeshEditor->RemoveElements(anArrayOfIdeces); - } - - if (myAutomaticUpdate) - { - SMESH_Actor *Mesh = smeshGUI->ReadScript(aMesh); - if (Mesh != NULL) - { - smeshGUI->DisplayActor(Mesh); - smeshGUI->DisplayEdges(Mesh); - smeshGUI->ChangeRepresentation(Mesh, Mesh->getDisplayMode()); - AddActorInSelection(Mesh); -#ifdef TRACE - Dump(Mesh); -#endif - } - } - QApplication::restoreOverrideCursor(); + return true; } //============================================================================= @@ -4772,59 +3256,64 @@ void SMESHGUI::RemoveElements(SMESH::SMESH_Mesh_ptr aMesh, * */ //============================================================================= -void SMESHGUI::OrientationElements(SMESH::SMESH_Mesh_ptr aMesh, - const TColStd_MapOfInteger & MapIndex) +bool SMESHGUI::SetSettings(QAD_Desktop * parent) { - if (myActiveStudy->getActiveStudyFrame()->getTypeView() != VIEW_VTK) - return; - - vtkRenderer *theRenderer = - ((VTKViewer_ViewFrame *) myActiveStudy->getActiveStudyFrame()-> - getRightFrame()->getViewFrame())->getRenderer(); - Standard_Boolean result; - SMESH_Actor *ac = FindActor(aMesh, result, true); - if (result) - { - //vtkUnstructuredGrid* UGrid = vtkUnstructuredGrid::New(); - SMESH_Grid *UGrid = SMESH_Grid::New(); - SMESH_Grid *oldGrid = SMESH_Grid::SafeDownCast(ac->DataSource); - UGrid->CopyMaps(oldGrid); - - vtkGeometryFilter *gf = vtkGeometryFilter::New(); - gf->SetInput(ac->DataSource); - - vtkPolyDataMapper *Mapper = vtkPolyDataMapper::New(); - Mapper->SetInput(gf->GetOutput()); - Mapper->Update(); - - TColStd_MapIteratorOfMapOfInteger ite(MapIndex); - for (; ite.More(); ite.Next()) - { - Mapper->GetInput()->ReverseCell(ite.Key()); - } - - UGrid->SetPoints(Mapper->GetInput()->GetPoints()); - int nbCells = Mapper->GetInput()->GetNumberOfCells(); - for (int i = 0; i < nbCells; i++) - { - UGrid->InsertNextCell(Mapper->GetInput()->GetCellType(i), - Mapper->GetInput()->GetCell(i)->GetPointIds()); - } - - // Copy new data to the old DatSource: keep the single DataSource for all actors - oldGrid->DeepCopy(UGrid); - - vtkDataSetMapper *NewMapper = vtkDataSetMapper::New(); - //NewMapper->SetInput( UGrid ); - NewMapper->SetInput(oldGrid); - NewMapper->Update(); - - //ac->DataSource = NewMapper->GetInput(); - ac->SetMapper(NewMapper); - } - vtkRenderWindow *renWin = theRenderer->GetRenderWindow(); - renWin->Render(); - QApplication::restoreOverrideCursor(); + MESSAGE("SMESHGUI::SetSettings."); + SMESHGUI::GetOrCreateSMESHGUI(parent); + + /* Display mode */ + QString DisplayMode = "Shading"; + if ( QAD_CONFIG->hasSetting("SMESH:DisplayMode") ) + DisplayMode = QAD_CONFIG->getSetting("SMESH:DisplayMode"); + else + QAD_CONFIG->addSetting("SMESH:DisplayMode", "Shading"); + + bool Shrink = false; + if ( QAD_CONFIG->hasSetting("SMESH:Shrink") ) + Shrink = QAD_CONFIG->getSetting("SMESH:Shrink") == "yes"; + + if (DisplayMode == "Wireframe") { + // wireframe + parent->menuBar()->setItemChecked(10004, false); + parent->menuBar()->setItemChecked(10002, false); + parent->menuBar()->setItemChecked(10001, true); + parent->menuBar()->setItemEnabled(10003, true); + } + else if (DisplayMode == "Nodes") { + // poins + parent->menuBar()->setItemChecked(10004, true); + parent->menuBar()->setItemChecked(10002, false); + parent->menuBar()->setItemChecked(10001, false); + parent->menuBar()->setItemEnabled(10003, false); + } + else { + // default is shading + parent->menuBar()->setItemChecked(10004, false); + parent->menuBar()->setItemChecked(10002, true); + parent->menuBar()->setItemChecked(10001, false); + parent->menuBar()->setItemEnabled(10003, true); + } + parent->menuBar()->setItemChecked(10003, Shrink); + + /* Automatic Update */ + QString AutoUpdate = QAD_CONFIG->getSetting("SMESH:AutomaticUpdate"); + if (AutoUpdate.compare("true") == 0) { + parent->menuBar()->setItemChecked(1001, true); + smeshGUI->myAutomaticUpdate = true; + } + else { + parent->menuBar()->setItemChecked(1001, false); + smeshGUI->myAutomaticUpdate = false; + } + + /* Selection */ + ::UpdateSelectionProp(); + + /* menus disable */ + parent->menuBar()->setItemEnabled(111, false); // IMPORT DAT + parent->menuBar()->setItemEnabled(112, false); // IMPORT UNV + + return true; } //============================================================================= @@ -4832,174 +3321,33 @@ void SMESHGUI::OrientationElements(SMESH::SMESH_Mesh_ptr aMesh, * */ //============================================================================= -void SMESHGUI::DiagonalInversion(SMESH::SMESH_Mesh_ptr aMesh, - const TColStd_MapOfInteger & MapIndex) +void SMESHGUI::DefinePopup(QString & theContext, QString & theParent, QString & theObject) { - if (myActiveStudy->getActiveStudyFrame()->getTypeView() != VIEW_VTK) - return; - - QApplication::setOverrideCursor(Qt::waitCursor); - vtkRenderer *theRenderer = - ((VTKViewer_ViewFrame *) myActiveStudy->getActiveStudyFrame()-> - getRightFrame()->getViewFrame())->getRenderer(); - Standard_Boolean result; - - SMESH_Actor *ac = FindActor(aMesh, result, true); - if (result) - { - //vtkUnstructuredGrid* UGrid = vtkUnstructuredGrid::New(); - SMESH_Grid *UGrid = SMESH_Grid::New(); - vtkGeometryFilter *gf = vtkGeometryFilter::New(); - gf->SetInput(ac->DataSource); - - vtkExtractEdges *edges = vtkExtractEdges::New(); - edges->SetInput(ac->DataSource); - - vtkPolyDataMapper *Mapper = vtkPolyDataMapper::New(); - Mapper->SetInput(edges->GetOutput()); - Mapper->Update(); - - int nb = Mapper->GetInput()->GetNumberOfCells(); - //MESSAGE ( "nb : " << nb ) - - TColStd_MapIteratorOfMapOfInteger ite(MapIndex); - for (; ite.More(); ite.Next()) - { - vtkCell *StartEdge = Mapper->GetInput()->GetCell(ite.Key()); - //MESSAGE( "DCQ : Edge Id = " << ite.Key()) - int CellType = StartEdge->GetCellType(); - //MESSAGE( "DCQ : Cell Type = " << CellType) - int nbPoints = StartEdge->GetNumberOfPoints(); - - //MESSAGE( "DCQ : Nb Point = " << nbPoints) - if (nbPoints == 2) - { - vtkUnstructuredGrid *StartUGrid = - vtkUnstructuredGrid::SafeDownCast(ac->DataSource); - - vtkIdList *IdCells = vtkIdList::New(); - vtkIdList *IdPoints = StartEdge->GetPointIds(); - float p1[3]; - float p2[3]; - - Mapper->GetInput()->GetPoints()->GetPoint(IdPoints->GetId(0), - p1); - Mapper->GetInput()->GetPoints()->GetPoint(IdPoints->GetId(1), - p2); - - int idp1 = StartUGrid->FindPoint(p1); - int idp2 = StartUGrid->FindPoint(p2); - - StartUGrid->GetPointCells(idp1, IdCells); - - //MESSAGE ( " pt 0 : " << IdPoints->GetId(0) ) - //MESSAGE ( " pt 1 : " << IdPoints->GetId(1) ) - - //MESSAGE ( " pt 0 : " << idp1 ) - //MESSAGE ( " pt 1 : " << idp2 ) - - vtkIdList *IdPts = vtkIdList::New(); - if (IdCells->GetNumberOfIds() >= 2) - { - int nbCells = IdCells->GetNumberOfIds(); - //MESSAGE ( " nbCells : " << nbCells ) - for (int j = 0; j < nbCells; j++) - { - StartUGrid->GetCellPoints(IdCells->GetId(j), IdPts); - if (IdPts->IsId(idp2) == -1) - { - IdCells->DeleteId(IdCells->GetId(j)); - } - } - - //MESSAGE ( " IdCells " << IdCells->GetNumberOfIds() ) - - vtkIdList *IdPts0 = vtkIdList::New(); - vtkIdList *IdPts1 = vtkIdList::New(); - - if (IdCells->GetNumberOfIds() == 2) - { - StartUGrid->GetCellPoints(IdCells->GetId(0), IdPts0); - StartUGrid->GetCellPoints(IdCells->GetId(1), IdPts1); - - //Create new faces - TColStd_MapOfInteger EndMapIndex; - for (int j = 0; j < 3; j++) - { - if (IdPts0->GetId(j) != idp1 && - IdPts0->GetId(j) != idp2) - { - EndMapIndex.Add(IdPts0->GetId(j)); - } - if (IdPts1->GetId(j) != idp1 && - IdPts1->GetId(j) != idp2) - { - EndMapIndex.Add(IdPts1->GetId(j)); - } - } - - bool MyAU = myAutomaticUpdate; - myAutomaticUpdate = false; - - EndMapIndex.Add(idp1); - TColStd_MapIteratorOfMapOfInteger ite1(EndMapIndex); - int i = 1; - while (ite1.More()) - { - if (ite1.Key() == idp1) - break; - i++; - ite1.Next(); - } - bool reverse1 = (i == 2); - this->AddFace(aMesh, EndMapIndex, reverse1); - - EndMapIndex.Remove(idp1); - EndMapIndex.Add(idp2); - TColStd_MapIteratorOfMapOfInteger ite2(EndMapIndex); - i = 1; - while (ite2.More()) - { - if (ite2.Key() == idp2) - break; - i++; - ite2.Next(); - } - bool reverse2 = (i == 2); - this->AddFace(aMesh, EndMapIndex, - !(reverse1 == reverse2)); - - myAutomaticUpdate = MyAU; - //MESSAGE ( " myAutomaticUpdate = " << MyAU ) - Mapper->Update(); - //Remove old faces - TColStd_MapOfInteger StartMapIndex; - StartMapIndex.Add(IdCells->GetId(0)); - StartMapIndex.Add(IdCells->GetId(1)); - this->RemoveElements(aMesh, StartMapIndex); - - Mapper->Update(); - } - } - } - } - - // UGrid->SetPoints( Mapper->GetInput()->GetPoints() ); - // int nbCells = Mapper->GetInput()->GetNumberOfCells(); - // for ( int i = 0; i < nbCells; i++ ) { - // UGrid->InsertNextCell( Mapper->GetInput()->GetCellType(i), Mapper->GetInput()->GetCell(i)->GetPointIds() ); - // } - - // vtkDataSetMapper *NewMapper = vtkDataSetMapper::New(); - // NewMapper->SetInput( UGrid ); - // NewMapper->Update(); - - // ac->DataSource = NewMapper->GetInput(); - // ac->SetMapper( NewMapper ); - } - vtkRenderWindow *renWin = theRenderer->GetRenderWindow(); - renWin->Render(); - QApplication::restoreOverrideCursor(); + // NRI : Temporary added + // if ( smeshGUI->myStudy->GetProperties()->IsLocked() ) { + // theObject = "NothingSelected"; + // theContext = "NothingSelected"; + // } + // NRI + + SALOME_Selection *Sel = SALOME_Selection::Selection( smeshGUI->myActiveStudy->getSelection() ); + int nbSel = Sel->IObjectCount(); + switch ( nbSel ) { + case 0: + theObject = "NothingSelected"; + theContext = "NothingSelected"; + break; + case 1: + if ( smeshGUI->myState == 800 && Sel->HasIndex( Sel->firstIObject() ) ) + theObject = "Elements"; + else + theObject = smeshGUI->CheckTypeObject( Sel->firstIObject() ); + theContext = ""; + break; + default: + theObject = smeshGUI->CheckHomogeneousSelection(); + theContext = ""; + } } //============================================================================= @@ -5007,56 +3355,250 @@ void SMESHGUI::DiagonalInversion(SMESH::SMESH_Mesh_ptr aMesh, * */ //============================================================================= -void SMESHGUI::AddEdges(SMESH_Actor * Mactor, int number, - const SMESH::double_array & coords, const SMESH::long_array & indexes) +bool SMESHGUI::CustomPopup(QAD_Desktop* parent, QPopupMenu* popup, const QString& theContext, + const QString& theParent, const QString& theObject) { - QApplication::setOverrideCursor(Qt::waitCursor); - //vtkUnstructuredGrid* ugrid = vtkUnstructuredGrid::SafeDownCast( Mactor->DataSource ); - SMESH_Grid *ugrid = SMESH_Grid::SafeDownCast(Mactor->DataSource); - int i = 1; - int j = 1; - while (i <= number) - { - vtkIdList *Ids = vtkIdList::New(); - Ids->InsertNextId(Mactor->GetIdVTKNode(indexes[j])); - Ids->InsertNextId(Mactor->GetIdVTKNode(indexes[j + 1])); - int id = ugrid->InsertNextCell(VTK_LINE, Ids); - Mactor->AddElement(indexes[j - 1], id); - i++; - j = j + 3; - } - vtkDataSetMapper *EdgeMapper = vtkDataSetMapper::New(); - EdgeMapper->SetInput(ugrid); - Mactor->DataSource = EdgeMapper->GetInput(); - Mactor->SetMapper(EdgeMapper); - QApplication::restoreOverrideCursor(); + // get active study frame + QAD_StudyFrame* studyFrame = smeshGUI->myActiveStudy->getActiveStudyFrame(); + + // get parent component which selected object(s) belongs to + QString parentComp = ( (SALOMEGUI_Desktop*)parent )->getComponentFromSelection(); + + // get selection + SALOME_Selection* Sel = SALOME_Selection::Selection( smeshGUI->myActiveStudy->getSelection() ); + int nbSel = Sel->IObjectCount(); + + if ( nbSel == 0 ) { + popup->clear(); + } + else if ( nbSel == 1 ) { + if ( parentComp != parent->getActiveComponent() ) { + // object not belongs to SMESH module - remove all commands except common Display/Erase... + while ( 1 ) { + int id = popup->idAt( 0 ); + if ( id <= QAD_TopLabel_Popup_ID ) + popup->removeItemAt( 0 ); + else + break; + } + } + else { + // get selected interactive object + Handle(SALOME_InteractiveObject) IObject = Sel->firstIObject(); + SALOMEDS::SObject_var SO = smeshGUI->myStudy->FindObjectID( IObject->getEntry() ); + // find popup menu's TopLabel item + int topItem = popup->indexOf( QAD_TopLabel_Popup_ID ); + if ( topItem >= 0 ) { + if ( theParent == "Viewer" ) { + // set bold font for popup menu's TopLabel item (Viewer popup) + QFont fnt = QApplication::font(); fnt.setBold( TRUE ); + popup->removeItem( QAD_TopLabel_Popup_ID ); + popup->insertItem( new CustomItem( QString( IObject->getName() ), fnt ), QAD_TopLabel_Popup_ID, topItem ); + } + else if ( theParent == "ObjectBrowser" ) { + // remove popup menu's TopLabel item (Object Browser popup) + popup->removeItem( QAD_TopLabel_Popup_ID ); + } + } + + // remove "Display only" command for component object + if ( theObject.compare( "Component" ) == 0 ) { + popup->removeItem( QAD_DisplayOnly_Popup_ID ); + } + else if ( theObject == "Hypothesis" || theObject == "Algorithm" ) { + // remove Display/Erase commands + popup->removeItem( QAD_Display_Popup_ID ); + popup->removeItem( QAD_DisplayOnly_Popup_ID ); + popup->removeItem( QAD_Erase_Popup_ID ); + // remove "Unassign ..." command if hyp/algo is not assigned + if ( SO->_is_nil() || !IObject->hasReference()/* !IsReferencedObject( SO ) */) + popup->removeItem( 1102 ); + } + else if ( theObject == "Mesh" || theObject == "SubMesh" || theObject == "Group" ) { + // get actor + GEOM::GEOM_Shape_var aShape = GetSMESHGUI()->GetStudyAPI().GetShapeOnMeshOrSubMesh( SO ); + if ( aShape->_is_nil() ) { + // imported mesh + popup->removeItem( 701 ); // Compute + popup->removeItem( 705 ); // Edit hypothesis + popup->removeItem( 706 ); // ... + } + SMESH_Actor* ac = ::FindActorByEntry(IObject->getEntry()); + // if object has actor + if ( ac && studyFrame->getTypeView() == VIEW_VTK ) { + VTKViewer_RenderWindowInteractor* myRenderInter = + ( ( VTKViewer_ViewFrame* ) studyFrame->getRightFrame()->getViewFrame() )->getRWInteractor(); + if ( myRenderInter->isVisible( IObject ) ) { + popup->removeItem( QAD_Display_Popup_ID ); + popup->setItemChecked( 9010, ac->GetPointsLabeled() ); // Numbering / Display Nodes # + popup->setItemChecked( 9011, ac->GetCellsLabeled() ); // Numbering / Display Elements # + TVisualObjPtr aVisualObj = ac->GetObject(); + int aNbEdges = aVisualObj->GetNbEntities(SMESH::EDGE); + int aNbFaces = aVisualObj->GetNbEntities(SMESH::FACE); + int aNbVolumes = aVisualObj->GetNbEntities(SMESH::VOLUME); + QMenuItem* mi = popup->findItem( 1131 ); + if ( mi && mi->popup() ) { + int prType = ac->GetRepresentation(); + // Display Mode / Wireframe + if(!aNbFaces && !aNbVolumes && !aNbEdges){ + mi->popup()->removeItem( 211 ); + }else{ + mi->popup()->setItemChecked( 211, prType == SMESH_Actor::eEdge ); + } + // Display Mode / Shading + if(!aNbFaces && !aNbVolumes){ + mi->popup()->removeItem( 212 ); + }else{ + mi->popup()->setItemChecked( 212, prType == SMESH_Actor::eSurface ); + } + // Display Mode / Points + mi->popup()->setItemChecked( 215, prType == SMESH_Actor::ePoint ); + // Display Mode / Shrink + bool isShrunk = ac->IsShrunk(); + bool isShrunkable = ac->IsShrunkable(); + mi->popup()->setItemChecked( 213, isShrunk ); + mi->popup()->setItemEnabled( 213, prType != SMESH_Actor::ePoint && isShrunkable); + } + // Scalar Bar + mi = popup->findItem( 2000 ); + if ( mi && mi->popup() ) { + SMESH_Actor::eControl cMode = ac->GetControlMode(); + switch ( cMode ) { + case SMESH_Actor::eLengthEdges: + mi->popup()->setItemChecked( 6001, true ); break; + case SMESH_Actor::eFreeBorders: + mi->popup()->setItemChecked( 6003, true ); + mi->popup()->removeItem( 201 ); + break; + case SMESH_Actor::eMultiConnection: + mi->popup()->setItemChecked( 6004, true ); break; + case SMESH_Actor::eArea: + mi->popup()->setItemChecked( 6011, true ); break; + case SMESH_Actor::eTaper: + mi->popup()->setItemChecked( 6012, true ); break; + case SMESH_Actor::eAspectRatio: + mi->popup()->setItemChecked( 6013, true ); break; + case SMESH_Actor::eMinimumAngle: + mi->popup()->setItemChecked( 6014, true ); break; + case SMESH_Actor::eWarping: + mi->popup()->setItemChecked( 6015, true ); break; + case SMESH_Actor::eSkew: + mi->popup()->setItemChecked( 6016, true ); break; + case SMESH_Actor::eNone: + default: + mi->popup()->removeItem( 200 ); + mi->popup()->removeItem( 201 ); + break; + } + TVisualObjPtr aVisualObj = ac->GetObject(); + SMESH::ElementType aType; + if(!aNbEdges){ + mi->popup()->removeItem( 6001 ); + mi->popup()->removeItem( 6003 ); + mi->popup()->removeItem( 6004 ); + } + if(!aNbFaces){ + mi->popup()->removeItem( 6011 ); + mi->popup()->removeItem( 6012 ); + mi->popup()->removeItem( 6013 ); + mi->popup()->removeItem( 6014 ); + mi->popup()->removeItem( 6015 ); + mi->popup()->removeItem( 6016 ); + } + if(!aNbFaces && !aNbEdges) + popup->removeItem( 2000 ); // Scalar Bar + } + } + else { + popup->removeItem( QAD_Erase_Popup_ID ); + popup->removeItem( 114 ); // Numbering popup menu + popup->removeItem( 1131 ); // Display mode + popup->removeItem( 1132 ); // Color / size + popup->removeItem( 1133 ); // Transparency + popup->removeItem( 2000 ); // Scalar Bar + } + } + else { + // object doesn't have actor + CORBA::Object_var anObject = SO->GetObject(); + bool bDisplay = false; + if ( !CORBA::is_nil( anObject ) ) { + SMESH::SMESH_Mesh_var aMeshObj = SMESH::SMESH_Mesh::_narrow( anObject ); + if ( !aMeshObj->_is_nil() && ( aMeshObj->NbNodes() > 0 || aMeshObj->NbFaces() > 0 || aMeshObj->NbVolumes() > 0 ) ) + bDisplay = true; + SMESH::SMESH_subMesh_var aSubMeshObj = SMESH::SMESH_subMesh::_narrow( anObject ); + if ( !aSubMeshObj->_is_nil() && ( aSubMeshObj->GetNumberOfNodes() > 0 || aSubMeshObj->GetNumberOfElements() > 0 ) ) + bDisplay = true; + SMESH::SMESH_Group_var aGroupObj = SMESH::SMESH_Group::_narrow( anObject ); + if ( !aGroupObj->_is_nil() && aGroupObj->Size() > 0 ) + bDisplay = true; + } + if ( !bDisplay ) { + popup->removeItem( QAD_Display_Popup_ID ); + popup->removeItem( QAD_DisplayOnly_Popup_ID ); + } + popup->removeItem( QAD_Erase_Popup_ID ); + popup->removeItem( 114 ); // Numbering popup menu + popup->removeItem( 1131 ); // Display mode + popup->removeItem( 1132 ); // Color / size + popup->removeItem( 1133 ); // Transparency + popup->removeItem( 2000 ); // Scalar Bar + } + } + else { + // another SMESH object + popup->removeItem( QAD_Display_Popup_ID ); + popup->removeItem( QAD_DisplayOnly_Popup_ID ); + popup->removeItem( QAD_Erase_Popup_ID ); + } + } + } + else { + // multiple selection + if ( parentComp != parent->getActiveComponent() ) { + // object not belongs to SMESH module - remove all commands except common Display/Erase... + while ( 1 ) { + int id = popup->idAt( 0 ); + if ( id <= QAD_TopLabel_Popup_ID ) + popup->removeItemAt( 0 ); + else + break; + } + if ( parentComp.isNull() ) { + // objects from different components are selected + popup->removeItem( QAD_DisplayOnly_Popup_ID ); + popup->removeItem( QAD_Display_Popup_ID ); + popup->removeItem( QAD_Erase_Popup_ID ); + } + } + else { + QString type = smeshGUI->CheckHomogeneousSelection(); + if ( type != "Heterogeneous Selection" ) { + int topItem = popup->indexOf( QAD_TopLabel_Popup_ID ); + if ( topItem >= 0 ) { + // set bold font for popup menu's TopLabel item + QFont fnt = QApplication::font(); fnt.setBold( TRUE ); + popup->removeItem( QAD_TopLabel_Popup_ID ); + popup->insertItem( new CustomItem( QString("%1 ").arg( nbSel ) + type + "(s) ", fnt ), QAD_TopLabel_Popup_ID, topItem ); + } + } + } + } + return false; } //============================================================================= -/*! - * +/*! Method: BuildPresentation(const Handle(SALOME_InteractiveObject)& theIO) + * Purpose: ensures that the actor for the given exists in the active VTK view */ //============================================================================= -void SMESHGUI::AddEdge(SMESH_Actor * Mactor, int idedge, int idnode1, - int idnode2) +void SMESHGUI::BuildPresentation(const Handle(SALOME_InteractiveObject) & theIO) { - QApplication::setOverrideCursor(Qt::waitCursor); - MESSAGE("SMESHGUI::AddEdge " << idedge << " : " << idnode1 << ";" << - idnode2) vtkIdList *Ids = vtkIdList::New(); - Ids->InsertNextId(Mactor->GetIdVTKNode(idnode1)); - Ids->InsertNextId(Mactor->GetIdVTKNode(idnode2)); - - //vtkUnstructuredGrid* ugrid = vtkUnstructuredGrid::SafeDownCast( Mactor->DataSource ); - SMESH_Grid *ugrid = SMESH_Grid::SafeDownCast(Mactor->DataSource); - int id = ugrid->InsertNextCell(VTK_LINE, Ids); - Mactor->AddElement(idedge, id); - - MESSAGE(" Edge VTK id " << id) - vtkDataSetMapper *EdgeMapper = vtkDataSetMapper::New(); - EdgeMapper->SetInput(ugrid); - Mactor->DataSource = EdgeMapper->GetInput(); - Mactor->SetMapper(EdgeMapper); - QApplication::restoreOverrideCursor(); + if(theIO->hasEntry()){ + QAD_Study* aStudy = SMESHGUI::GetSMESHGUI()->GetActiveStudy(); + QAD_StudyFrame *aStudyFrame = aStudy->getActiveStudyFrame(); + ::UpdateView(aStudyFrame,eDisplay,theIO->getEntry()); + } } //============================================================================= @@ -5064,50 +3606,19 @@ void SMESHGUI::AddEdge(SMESH_Actor * Mactor, int idedge, int idnode1, * */ //============================================================================= -void SMESHGUI::AddTriangles(SMESH_Actor * Mactor, int number, - const SMESH::double_array & coords, const SMESH::long_array & indexes) +void SMESHGUI::setOrb() { - QApplication::setOverrideCursor(Qt::waitCursor); - //vtkUnstructuredGrid* ugrid = vtkUnstructuredGrid::SafeDownCast( Mactor->DataSource ); - SMESH_Grid *ugrid = SMESH_Grid::SafeDownCast(Mactor->DataSource); - int i = 1; - int j = 1; - while (i <= number) + try { - vtkIdList *Ids = vtkIdList::New(); - Ids->InsertNextId(Mactor->GetIdVTKNode(indexes[j])); - Ids->InsertNextId(Mactor->GetIdVTKNode(indexes[j + 1])); - Ids->InsertNextId(Mactor->GetIdVTKNode(indexes[j + 2])); - int id = ugrid->InsertNextCell(VTK_TRIANGLE, Ids); - Mactor->AddElement(indexes[j - 1], id); - i++; - j = j + 4; + ORB_INIT & init = *SINGLETON_ < ORB_INIT >::Instance(); + ASSERT(SINGLETON_ < ORB_INIT >::IsAlreadyExisting()); + _orb = init(0, 0); + } catch(...) + { + INFOS("internal error : orb not found"); + _orb = 0; } - vtkDataSetMapper *TriMapper = vtkDataSetMapper::New(); - TriMapper->SetInput(ugrid); - Mactor->DataSource = TriMapper->GetInput(); - Mactor->SetMapper(TriMapper); - QApplication::restoreOverrideCursor(); -} -void SMESHGUI::AddTriangle(SMESH_Actor * Mactor, int idtri, int idnode1, - int idnode2, int idnode3) -{ - QApplication::setOverrideCursor(Qt::waitCursor); - vtkIdList *Ids = vtkIdList::New(); - Ids->InsertNextId(Mactor->GetIdVTKNode(idnode1)); - Ids->InsertNextId(Mactor->GetIdVTKNode(idnode2)); - Ids->InsertNextId(Mactor->GetIdVTKNode(idnode3)); - - //vtkUnstructuredGrid* ugrid = vtkUnstructuredGrid::SafeDownCast( Mactor->DataSource ); - SMESH_Grid *ugrid = SMESH_Grid::SafeDownCast(Mactor->DataSource); - int id = ugrid->InsertNextCell(VTK_TRIANGLE, Ids); - Mactor->AddElement(idtri, id); - - vtkDataSetMapper *TriMapper = vtkDataSetMapper::New(); - TriMapper->SetInput(ugrid); - Mactor->DataSource = TriMapper->GetInput(); - Mactor->SetMapper(TriMapper); - QApplication::restoreOverrideCursor(); + ASSERT(!CORBA::is_nil(_orb)); } //============================================================================= @@ -5115,58 +3626,41 @@ void SMESHGUI::AddTriangle(SMESH_Actor * Mactor, int idtri, int idnode1, * */ //============================================================================= -void SMESHGUI::AddQuadrangles(SMESH_Actor * Mactor, int number, - const SMESH::double_array & coords, const SMESH::long_array & indexes) -{ - QApplication::setOverrideCursor(Qt::waitCursor); - //vtkUnstructuredGrid* ugrid = vtkUnstructuredGrid::SafeDownCast( Mactor->DataSource ); - SMESH_Grid *ugrid = SMESH_Grid::SafeDownCast(Mactor->DataSource); - int i = 1; - int j = 1; - while (i <= number) - { - vtkIdList *Ids = vtkIdList::New(); - Ids->InsertNextId(Mactor->GetIdVTKNode(indexes[j])); - Ids->InsertNextId(Mactor->GetIdVTKNode(indexes[j + 1])); - Ids->InsertNextId(Mactor->GetIdVTKNode(indexes[j + 2])); - Ids->InsertNextId(Mactor->GetIdVTKNode(indexes[j + 3])); - int id = ugrid->InsertNextCell(VTK_QUAD, Ids); - Mactor->AddElement(indexes[j - 1], id); - i++; - j = j + 5; - } - vtkDataSetMapper *QuadMapper = vtkDataSetMapper::New(); - QuadMapper->SetInput(ugrid); - Mactor->DataSource = QuadMapper->GetInput(); - Mactor->SetMapper(QuadMapper); - QApplication::restoreOverrideCursor(); -} +SMESH_Actor *SMESHGUI::ReadScript(SMESH::SMESH_Mesh_ptr theMesh){} //============================================================================= /*! * */ //============================================================================= -void SMESHGUI::AddQuadrangle(SMESH_Actor * Mactor, int idquad, int idnode1, - int idnode2, int idnode3, int idnode4) +void SMESHGUI::Dump(SMESH_Actor * Mactor) { - QApplication::setOverrideCursor(Qt::waitCursor); - vtkIdList *Ids = vtkIdList::New(); - Ids->InsertNextId(Mactor->GetIdVTKNode(idnode1)); - Ids->InsertNextId(Mactor->GetIdVTKNode(idnode2)); - Ids->InsertNextId(Mactor->GetIdVTKNode(idnode3)); - Ids->InsertNextId(Mactor->GetIdVTKNode(idnode4)); - - //vtkUnstructuredGrid* ugrid = vtkUnstructuredGrid::SafeDownCast( Mactor->DataSource ); - SMESH_Grid *ugrid = SMESH_Grid::SafeDownCast(Mactor->DataSource); - int id = ugrid->InsertNextCell(VTK_QUAD, Ids); - Mactor->AddElement(idquad, id); - - vtkDataSetMapper *QuadMapper = vtkDataSetMapper::New(); - QuadMapper->SetInput(ugrid); - Mactor->DataSource = QuadMapper->GetInput(); - Mactor->SetMapper(QuadMapper); - QApplication::restoreOverrideCursor(); + vtkUnstructuredGrid *ugrid = Mactor->GetUnstructuredGrid(); + vtkPoints *Pts = ugrid->GetPoints(); + int nbPts = Pts->GetNumberOfPoints(); + int nbCells = ugrid->GetNumberOfCells(); + + FILE *In; + int i, j; + In = fopen("/tmp/dumpMesh", "w+"); + fprintf(In, "%d %d\n", nbPts, nbCells); + for (int i = 0; i < nbPts; i++) + { + float *p = ugrid->GetPoint(i); + fprintf(In, "%d %e %e %e\n", i, p[0], p[1], p[2]); + } + + for (int i = 0; i < nbCells; i++) + { + fprintf(In, "%d %d", i, ugrid->GetCell(i)->GetCellType()); + vtkIdList *Id = ugrid->GetCell(i)->GetPointIds(); + for (j = 0; j < Id->GetNumberOfIds(); j++) + { + fprintf(In, " %d", Id->GetId(j)); + } + fprintf(In, "\n"); + } + fclose(In); } //============================================================================= @@ -5174,31 +3668,36 @@ void SMESHGUI::AddQuadrangle(SMESH_Actor * Mactor, int idquad, int idnode1, * */ //============================================================================= -void SMESHGUI::AddTetras(SMESH_Actor * Mactor, int number, - const SMESH::double_array & coords, const SMESH::long_array & indexes) +void SMESHGUI::RemoveNodes(SMESH::SMESH_Mesh_ptr theMesh, + const TColStd_MapOfInteger & MapIndex) { - QApplication::setOverrideCursor(Qt::waitCursor); - //vtkUnstructuredGrid* ugrid = vtkUnstructuredGrid::SafeDownCast( Mactor->DataSource ); - SMESH_Grid *ugrid = SMESH_Grid::SafeDownCast(Mactor->DataSource); - int i = 1; - int j = 1; - while (i <= number) - { - vtkIdList *Ids = vtkIdList::New(); - Ids->InsertNextId(Mactor->GetIdVTKNode(indexes[j])); - Ids->InsertNextId(Mactor->GetIdVTKNode(indexes[j + 1])); - Ids->InsertNextId(Mactor->GetIdVTKNode(indexes[j + 2])); - Ids->InsertNextId(Mactor->GetIdVTKNode(indexes[j + 3])); - int id = ugrid->InsertNextCell(VTK_TETRA, Ids); - Mactor->AddElement(indexes[j - 1], id); - i++; - j = j + 5; - } - vtkDataSetMapper *TetraMapper = vtkDataSetMapper::New(); - TetraMapper->SetInput(ugrid); - Mactor->DataSource = TetraMapper->GetInput(); - Mactor->SetMapper(TetraMapper); - QApplication::restoreOverrideCursor(); + QAD_WaitCursor wc; + try{ + SALOMEDS::SObject_var aSobj = myStudyAPI.FindObject(theMesh); + CORBA::String_var anEntry = aSobj->GetID(); + if(SMESH_Actor* anActor = ::FindActorByEntry(anEntry.in())){ + SMESH::long_array_var anArrayOfIdeces = new SMESH::long_array; + anArrayOfIdeces->length(MapIndex.Extent()); + TColStd_MapIteratorOfMapOfInteger ite(MapIndex); + for(int i = 0; ite.More(); ite.Next(), i++){ + anArrayOfIdeces[i] = anActor->GetNodeObjId(ite.Key()); + } + SMESH::SMESH_MeshEditor_var aMeshEditor = theMesh->GetMeshEditor(); + aMeshEditor->RemoveNodes(anArrayOfIdeces); + if(myAutomaticUpdate){ + CORBA::Long anId = smeshGUI->myStudy->StudyId(); + if(TVisualObjPtr aVisualObj = GetVisualObj(anId,anEntry.in())){ + aVisualObj->Update(true); + } + } + } + }catch(SALOME::SALOME_Exception& exc) { + INFOS("Follow exception was cought:\n\t"<InsertNextId(Mactor->GetIdVTKNode(idnode1)); - Ids->InsertNextId(Mactor->GetIdVTKNode(idnode2)); - Ids->InsertNextId(Mactor->GetIdVTKNode(idnode3)); - Ids->InsertNextId(Mactor->GetIdVTKNode(idnode4)); - - //vtkUnstructuredGrid* ugrid = vtkUnstructuredGrid::SafeDownCast( Mactor->DataSource ); - SMESH_Grid *ugrid = SMESH_Grid::SafeDownCast(Mactor->DataSource); - int id = ugrid->InsertNextCell(VTK_TETRA, Ids); - Mactor->AddElement(idtetra, id); - - MESSAGE(" Tetra VTK id " << id) - vtkDataSetMapper *TetraMapper = vtkDataSetMapper::New(); - TetraMapper->SetInput(ugrid); - Mactor->DataSource = TetraMapper->GetInput(); - Mactor->SetMapper(TetraMapper); - QApplication::restoreOverrideCursor(); + QAD_WaitCursor wc; + try{ + SALOMEDS::SObject_var aSobj = myStudyAPI.FindObject(theMesh); + CORBA::String_var anEntry = aSobj->GetID(); + if(SMESH_Actor* anActor = ::FindActorByEntry(anEntry.in())){ + SMESH::long_array_var anArrayOfIdeces = new SMESH::long_array; + anArrayOfIdeces->length(MapIndex.Extent()); + TColStd_MapIteratorOfMapOfInteger ite(MapIndex); + for(int i = 0; ite.More(); ite.Next(), i++){ + anArrayOfIdeces[i] = anActor->GetElemObjId(ite.Key()); + } + SMESH::SMESH_MeshEditor_var aMeshEditor = theMesh->GetMeshEditor(); + aMeshEditor->RemoveElements(anArrayOfIdeces); + if(myAutomaticUpdate){ + CORBA::Long anId = smeshGUI->myStudy->StudyId(); + if(TVisualObjPtr aVisualObj = GetVisualObj(anId,anEntry.in())){ + aVisualObj->Update(true); + } + } + } + }catch(SALOME::SALOME_Exception& exc) { + INFOS("Follow exception was cought:\n\t"<DataSource ); - SMESH_Grid *ugrid = SMESH_Grid::SafeDownCast(Mactor->DataSource); - int i = 1; - int j = 1; - while (i <= number) - { - vtkIdList *Ids = vtkIdList::New(); - Ids->InsertNextId(Mactor->GetIdVTKNode(indexes[j])); - Ids->InsertNextId(Mactor->GetIdVTKNode(indexes[j + 1])); - Ids->InsertNextId(Mactor->GetIdVTKNode(indexes[j + 2])); - Ids->InsertNextId(Mactor->GetIdVTKNode(indexes[j + 3])); - Ids->InsertNextId(Mactor->GetIdVTKNode(indexes[j + 4])); - Ids->InsertNextId(Mactor->GetIdVTKNode(indexes[j + 5])); - Ids->InsertNextId(Mactor->GetIdVTKNode(indexes[j + 6])); - Ids->InsertNextId(Mactor->GetIdVTKNode(indexes[j + 7])); - int id = ugrid->InsertNextCell(VTK_HEXAHEDRON, Ids); - Mactor->AddElement(indexes[j - 1], id); - i++; - j = j + 9; - } - vtkDataSetMapper *HexaMapper = vtkDataSetMapper::New(); - HexaMapper->SetInput(ugrid); - Mactor->DataSource = HexaMapper->GetInput(); - Mactor->SetMapper(HexaMapper); - QApplication::restoreOverrideCursor(); + MESSAGE("OrientationElements - not implemeted yet!"); } //============================================================================= @@ -5272,35 +3753,10 @@ void SMESHGUI::AddHexaedres(SMESH_Actor * Mactor, int number, * */ //============================================================================= -void SMESHGUI::AddHexaedre(SMESH_Actor * Mactor, int idhexa, int idnode1, - int idnode2, int idnode3, int idnode4, int idnode5, int idnode6, - int idnode7, int idnode8) +void SMESHGUI::DiagonalInversion(SMESH::SMESH_Mesh_ptr aMesh, + const TColStd_MapOfInteger & MapIndex) { - QApplication::setOverrideCursor(Qt::waitCursor); - MESSAGE("SMESHGUI::AddHexaedre " << idhexa << " : " << idnode1 << ";" << - idnode2 << ";" << idnode3 << ";" << idnode4 << ";" << idnode5 << ";" << - idnode6 << ";" << idnode7 << ";" << idnode8) vtkIdList *Ids = - vtkIdList::New(); - Ids->InsertNextId(Mactor->GetIdVTKNode(idnode1)); - Ids->InsertNextId(Mactor->GetIdVTKNode(idnode2)); - Ids->InsertNextId(Mactor->GetIdVTKNode(idnode3)); - Ids->InsertNextId(Mactor->GetIdVTKNode(idnode4)); - Ids->InsertNextId(Mactor->GetIdVTKNode(idnode5)); - Ids->InsertNextId(Mactor->GetIdVTKNode(idnode6)); - Ids->InsertNextId(Mactor->GetIdVTKNode(idnode7)); - Ids->InsertNextId(Mactor->GetIdVTKNode(idnode8)); - - //vtkUnstructuredGrid *ugrid = vtkUnstructuredGrid::SafeDownCast( Mactor->DataSource ); - SMESH_Grid *ugrid = SMESH_Grid::SafeDownCast(Mactor->DataSource); - int id = ugrid->InsertNextCell(VTK_HEXAHEDRON, Ids); - Mactor->AddElement(idhexa, id); - - MESSAGE(" Hexa VTK id " << id) - vtkDataSetMapper *HexaMapper = vtkDataSetMapper::New(); - HexaMapper->SetInput(ugrid); - Mactor->DataSource = HexaMapper->GetInput(); - Mactor->SetMapper(HexaMapper); - QApplication::restoreOverrideCursor(); + MESSAGE("OrientationElements - not implemeted yet!"); } //===================================================================================== @@ -5360,218 +3816,20 @@ extern "C" SMESHGUI::BuildPresentation(theIO); } - void supportedViewType(int *buffer, int bufferSize) - { - if (!buffer || !bufferSize) - return; - buffer[0] = (int)VIEW_VTK; - } - -} - -//============================================================================= -/*! - * - */ -//============================================================================= -void SMESHGUI::ViewNodes() -{ - if (myActiveStudy->getActiveStudyFrame()->getTypeView() != VIEW_VTK) - return; - - EraseSimulationActors(); - mySimulationActors = vtkActorCollection::New(); - vtkRenderer *theRenderer = - ((VTKViewer_ViewFrame *) myActiveStudy->getActiveStudyFrame()-> - getRightFrame()->getViewFrame())->getRenderer(); - vtkActorCollection *theActors = theRenderer->GetActors(); - theActors->InitTraversal(); - vtkActor *ac = theActors->GetNextActor(); - while (!(ac == NULL)) - { - if (ac->IsA("SMESH_Actor")) - { - SMESH_Actor *anActor = SMESH_Actor::SafeDownCast(ac); - if (anActor->GetVisibility() == 1) - { - vtkGeometryFilter *gf = vtkGeometryFilter::New(); - gf->SetInput(anActor->DataSource); - vtkMaskPoints *verts = vtkMaskPoints::New(); - verts->SetInput(gf->GetOutput()); - verts->GenerateVerticesOn(); - verts->SetOnRatio(1); - - vtkPolyDataMapper *vertMapper = vtkPolyDataMapper::New(); - vertMapper->SetInput(verts->GetOutput()); - vertMapper->ScalarVisibilityOff(); - - vtkActor *vertActor = vtkActor::New(); - vertActor->SetMapper(vertMapper); - - float r, g, b; - anActor->GetNodeColor(r, g, b); - vertActor->GetProperty()->SetColor(r, g, b); - - vertActor->GetProperty()->SetPointSize(anActor->GetNodeSize()); - - vertActor->PickableOff(); - - mySimulationActors->AddItem(vertActor); - theRenderer->AddActor(vertActor); - } - } - ac = theActors->GetNextActor(); - } - - vtkRenderWindow *renWin = theRenderer->GetRenderWindow(); - renWin->Render(); -} - -//============================================================================= -/*! - * - */ -//============================================================================= -void SMESHGUI::Control(int theCommandID) -{ - if (myActiveStudy->getActiveStudyFrame()->getTypeView() != VIEW_VTK) - return; - - QApplication::setOverrideCursor(Qt::waitCursor); - DisplayScalarBar(false); - - vtkDoubleArray *scalars = vtkDoubleArray::New(); - scalars->SetNumberOfComponents(1); - - vtkDataSetMapper *meshMapper = 0; - SALOME_Selection *Sel = - SALOME_Selection::Selection(myActiveStudy->getSelection()); - int nbSel = Sel->IObjectCount(); - Standard_Boolean result; - Handle(SALOME_InteractiveObject) IObject = Sel->firstIObject(); - SMESH_Actor *MeshActor = - FindActorByEntry(IObject->getEntry(), result, true); - - // Mesh may be not updated after Compute - if (!MeshActor->DataSource || !MeshActor->GetMapper()) - { - QApplication::restoreOverrideCursor(); - return; - } - - vtkDataSet *aDataSet = MeshActor->DataSource; - typedef double (*TScalarFun) (vtkCell * theCell); - TScalarFun aScalarFun; - if (result) - { - QString type; - switch (theCommandID) - { - case 6001: - { - type = tr("SMESH_CONTROL_LENGTH_EDGES"); - aDataSet = MeshActor->EdgeDevice->GetMapper()->GetInput(); - aScalarFun = &(SMESHGUI_ComputeScalarValue::LengthEdges); - MESSAGE(" init minimum length " << aDataSet->GetNumberOfCells()); - if (MeshActor->getDisplayMode() != 0) - ChangeRepresentation(MeshActor, 1); // limitation; in Wireframe, colored edges are not visible - break; - } - case 6011: - { - type = tr("SMESH_CONTROL_AREA_ELEMENTS"); - aScalarFun = &(SMESHGUI_ComputeScalarValue::AreaElements); - if (MeshActor->getDisplayMode() != 1) - ChangeRepresentation(MeshActor, 1); - break; - } - case 6012: - { - type = tr("SMESH_CONTROL_TAPER_ELEMENTS"); - aScalarFun = &(SMESHGUI_ComputeScalarValue::Taper); - break; - } - case 6013: - { - type = tr("SMESH_CONTROL_ASPECTRATIO_ELEMENTS"); - aScalarFun = &(SMESHGUI_ComputeScalarValue::AspectRatio); - if (MeshActor->getDisplayMode() != 1) - ChangeRepresentation(MeshActor, 1); - break; - } - case 6014: - { - type = tr("SMESH_CONTROL_MINIMUMANGLE_ELEMENTS"); - aScalarFun = &(SMESHGUI_ComputeScalarValue::MinimumAngle); - if (MeshActor->getDisplayMode() != 1) - ChangeRepresentation(MeshActor, 1); - break; - } - case 6015: - { - type = tr("SMESH_CONTROL_WARP_ELEMENTS"); - aScalarFun = &(SMESHGUI_ComputeScalarValue::Warp); - break; - } - case 6016: - { - type = tr("SMESH_CONTROL_SKEW_ELEMENTS"); - aScalarFun = &(SMESHGUI_ComputeScalarValue::Skew); - break; - } - } - - for (int i = 0, iEnd = aDataSet->GetNumberOfCells(); i < iEnd; i++) - scalars->InsertTuple1(i, aScalarFun(aDataSet->GetCell(i))); - - float range[2]; - scalars->GetRange(range); - - vtkLookupTable *wat = vtkLookupTable::New(); - wat->SetRange(range); - wat->Build(); - - scalars->SetLookupTable(wat); - - if (!meshMapper) - meshMapper = (vtkDataSetMapper *) (MeshActor->getMapper()); - meshMapper->SetScalarModeToUseCellData(); - MeshActor->DataSource->GetCellData()->SetScalars(scalars); - meshMapper->SetScalarRange(range); - meshMapper->ScalarVisibilityOn(); - - vtkScalarBarActor *aScalarBar = GetScalarBar(); - if (aScalarBar == NULL) - { - aScalarBar = vtkScalarBarActor::New(); - QString Bold = QAD_CONFIG->getSetting("ScalarBar:Bold"); - QString Italic = QAD_CONFIG->getSetting("ScalarBar:Italic"); - QString Shadow = QAD_CONFIG->getSetting("ScalarBar:Shadow"); - QString FontFamily = QAD_CONFIG->getSetting("ScalarBar:FontFamily"); - QString Orientation = - QAD_CONFIG->getSetting("ScalarBar:Orientation"); - float Width = QAD_CONFIG->getSetting("ScalarBar:Width").toFloat(); - float Height = QAD_CONFIG->getSetting("ScalarBar:Height").toFloat(); - int NumberOfLabels = - QAD_CONFIG->getSetting("ScalarBar:NumberOfLabels").toInt(); - int NumberOfColors = - QAD_CONFIG->getSetting("ScalarBar:NumberOfColors").toInt(); - - SetSettingsScalarBar(aScalarBar, Bold, Italic, Shadow, FontFamily, - Orientation, Width, Height, NumberOfColors, NumberOfLabels); - vtkRenderer *theRenderer = - ((VTKViewer_ViewFrame *) myActiveStudy->getActiveStudyFrame()-> - getRightFrame()->getViewFrame())->getRenderer(); - theRenderer->AddActor2D(aScalarBar); - } - aScalarBar->SetLookupTable(wat); - aScalarBar->SetTitle(type.latin1()); - - scalars->Delete(); - // wat->Delete(); - DisplayScalarBar(true); + void supportedViewType(int *buffer, int bufferSize) + { + if (!buffer || !bufferSize) + return; + buffer[0] = (int)VIEW_VTK; + } + + void deactivate() + { + if ( SMESHGUI::GetSMESHGUI() ) { + SMESHGUI::GetSMESHGUI()->EmitSignalCloseAllDialogs(); + } } - QApplication::restoreOverrideCursor(); + } //============================================================================= @@ -5579,46 +3837,29 @@ void SMESHGUI::Control(int theCommandID) * */ //============================================================================= -void SMESHGUI::SetSettingsScalarBar(vtkScalarBarActor * theScalarBar, - QString Bold, QString Italic, - QString Shadow, QString FontFamily, - QString Orientation, float Width, float Height, int NbColors, int NbLabels) -{ - if (Bold.isNull() || Bold.isEmpty() || (Bold.compare("true") == 0)) - theScalarBar->BoldOn(); - else - theScalarBar->BoldOff(); - - if (Italic.isNull() || Italic.isEmpty() || (Italic.compare("true") == 0)) - theScalarBar->ItalicOn(); - else - theScalarBar->ItalicOff(); - - if (Shadow.isNull() || Shadow.isEmpty() || (Shadow.compare("true") == 0)) - theScalarBar->ShadowOn(); - else - theScalarBar->ShadowOff(); - - if (FontFamily.compare("Arial") == 0) - theScalarBar->SetFontFamilyToArial(); - else if (FontFamily.compare("Courier") == 0) - theScalarBar->SetFontFamilyToCourier(); - else if (FontFamily.compare("Times") == 0) - theScalarBar->SetFontFamilyToTimes(); - else - theScalarBar->SetFontFamilyToArial(); - - if (Orientation.isNull() || Orientation.isEmpty() || - (Orientation.compare("Vertical") == 0)) - theScalarBar->SetOrientationToVertical(); - else - theScalarBar->SetOrientationToHorizontal(); +void SMESHGUI::SetPickable(SMESH_Actor* theActor){ + if(VTKViewer_ViewFrame* aViewFrame = GetCurrentVtkView()){ + int anIsAllPickable = (theActor == NULL); + vtkRenderer *aRenderer = aViewFrame->getRenderer(); + vtkActorCollection *aCollection = aRenderer->GetActors(); + aCollection->InitTraversal(); + while(vtkActor *anAct = aCollection->GetNextActor()){ + if(SALOME_Actor *anActor = dynamic_cast(anAct)){ + if(anActor->GetVisibility()){ + anActor->SetPickable(anIsAllPickable); + } + } + } + if(theActor) + theActor->SetPickable(!anIsAllPickable); + RepaintCurrentView(); + } +} - theScalarBar->SetWidth((Width == 0) ? 0.17 : Width); - theScalarBar->SetHeight((Height == 0) ? 0.8 : Height); - theScalarBar->SetNumberOfLabels((NbLabels == 0) ? 5 : NbLabels); - theScalarBar->SetMaximumNumberOfColors((NbColors == 0) ? 64 : NbColors); +void SMESHGUI::ViewNodes(){ + EraseSimulationActors(); + ::SetPointRepresentation(true); } //============================================================================= @@ -5626,58 +3867,57 @@ void SMESHGUI::SetSettingsScalarBar(vtkScalarBarActor * theScalarBar, * */ //============================================================================= -void SMESHGUI::DisplayScalarBar(bool visibility) -{ - if (myActiveStudy->getActiveStudyFrame()->getTypeView() != VIEW_VTK) - return; - - vtkRenderer *theRenderer = - ((VTKViewer_ViewFrame *) myActiveStudy->getActiveStudyFrame()-> - getRightFrame()->getViewFrame())->getRenderer(); - vtkScalarBarActor *aScalarBar = GetScalarBar(); - - if (aScalarBar == NULL) - { - MESSAGE("myScalarBar is NULL"); - return; - } - - if (visibility) - aScalarBar->VisibilityOn(); - else - { - aScalarBar->VisibilityOff(); - //Turn off mesh coloring (influences on all views) - vtkActorCollection *actorList = theRenderer->GetActors(); - actorList->InitTraversal(); - vtkActor *ac = actorList->GetNextActor(); - while (ac != NULL) - { - if (ac->GetMapper() != NULL) - { - ac->GetMapper()->ScalarVisibilityOff(); - } - ac = actorList->GetNextActor(); - } - // Turn off ScalarBar in all views - /*QList aFrames = myActiveStudy->getStudyFrames(); - * for ( QAD_StudyFrame* aFrame = aFrames.first(); aFrame; aFrame = aFrames.next() ) { - * if (aFrame->getTypeView() == VIEW_VTK) { - * vtkRenderer *aRenderer = ((VTKViewer_ViewFrame*) aFrame->getRightFrame()->getViewFrame())->getRenderer(); - * vtkActor2DCollection* actor2DList = aRenderer->GetActors2D(); - * actor2DList->InitTraversal(); - * vtkActor2D* aActor2d = actor2DList->GetNextActor2D(); - * while (aActor2d != NULL) { - * if (aActor2d->IsA("vtkScalarBarActor")) { - * aActor2d->VisibilityOff(); - * break; - * } - * actor2DList->GetNextActor2D(); - * } - * } - * } */ +void SMESHGUI::Control( int theCommandID ){ + SALOME_Selection *Sel = SALOME_Selection::Selection( myActiveStudy->getSelection() ); + if(Sel){ + Handle(SALOME_InteractiveObject) anIO = Sel->firstIObject(); + if(!anIO.IsNull()){ + QString aTitle; + SMESH_Actor::eControl aControl = SMESH_Actor::eNone; + if(SMESH_Actor *anActor = ::FindActorByEntry(anIO->getEntry())){ + switch ( theCommandID ){ + case 6001: + aTitle = tr( "LENGTH_EDGES" ); + aControl = SMESH_Actor::eLengthEdges; + break; + case 6003: + aTitle = tr( "FREE_BORDERS" ); + aControl = SMESH_Actor::eFreeBorders; + break; + case 6004: + aTitle = tr( "MULTI_BORDERS" ); + aControl = SMESH_Actor::eMultiConnection; + break; + case 6011: + aTitle = tr( "AREA_ELEMENTS" ); + aControl = SMESH_Actor::eArea; + break; + case 6012: + aTitle = tr( "TAPER_ELEMENTS" ); + aControl = SMESH_Actor::eTaper; + break; + case 6013: + aTitle = tr( "ASPECTRATIO_ELEMENTS" ); + aControl = SMESH_Actor::eAspectRatio; + break; + case 6014: + aTitle = tr( "MINIMUMANGLE_ELEMENTS" ); + aControl = SMESH_Actor::eMinimumAngle; + break; + case 6015: + aTitle = tr( "WARP_ELEMENTS" ); + aControl = SMESH_Actor::eWarping; + break; + case 6016: + aTitle = tr( "SKEW_ELEMENTS" ); + aControl = SMESH_Actor::eSkew; + break; } - myActiveStudy->update3dViewers(); + anActor->SetControlMode(aControl); + anActor->GetScalarBarActor()->SetTitle(aTitle.latin1()); + } + } + } } //============================================================================= @@ -5685,39 +3925,52 @@ void SMESHGUI::DisplayScalarBar(bool visibility) * */ //============================================================================= -void SMESHGUI::UpdateScalarBar(float MinRange, float MaxRange) +void SMESHGUI::SetSettingsScalarBar(vtkScalarBarActor * theScalarBar, + QString Bold, + QString Italic, + QString Shadow, + QString FontFamily, + QString Orientation, + float Width, + float Height, + int NbColors, + int NbLabels) { - vtkScalarBarActor *aScalarBar = GetScalarBar(); - if (aScalarBar == NULL) - { - MESSAGE("myScalarBar is NULL"); - return; - } - DisplayScalarBar(false); - - aScalarBar->GetLookupTable()->SetRange(MinRange, MaxRange); - vtkRenderer *aRenderer = - ((VTKViewer_ViewFrame *) myActiveStudy->getActiveStudyFrame()-> - getRightFrame()->getViewFrame())->getRenderer(); - vtkActorCollection *aActorList = aRenderer->GetActors(); - aActorList->InitTraversal(); - vtkActor *aActor = aActorList->GetNextActor(); - while (aActor != NULL) - { - if (aActor->IsA("SMESH_Actor")) - { - SMESH_Actor *aMeshActor = SMESH_Actor::SafeDownCast(aActor); - vtkDataSetMapper *aMeshMapper = - (vtkDataSetMapper *) (aMeshActor->getMapper()); - if ((aMeshMapper != NULL)) - { - aMeshMapper->SetScalarRange(MinRange, MaxRange); - aMeshMapper->ScalarVisibilityOn(); - } - } - aActor = aActorList->GetNextActor(); - } - DisplayScalarBar(true); + if (Bold.isNull() || Bold.isEmpty() || (Bold.compare("true") == 0)) + theScalarBar->BoldOn(); + else + theScalarBar->BoldOff(); + + if (Italic.isNull() || Italic.isEmpty() || (Italic.compare("true") == 0)) + theScalarBar->ItalicOn(); + else + theScalarBar->ItalicOff(); + + if (Shadow.isNull() || Shadow.isEmpty() || (Shadow.compare("true") == 0)) + theScalarBar->ShadowOn(); + else + theScalarBar->ShadowOff(); + + if (FontFamily.compare("Arial") == 0) + theScalarBar->SetFontFamilyToArial(); + else if (FontFamily.compare("Courier") == 0) + theScalarBar->SetFontFamilyToCourier(); + else if (FontFamily.compare("Times") == 0) + theScalarBar->SetFontFamilyToTimes(); + else + theScalarBar->SetFontFamilyToArial(); + + if (Orientation.isNull() || Orientation.isEmpty() || + (Orientation.compare("Vertical") == 0)) + theScalarBar->SetOrientationToVertical(); + else + theScalarBar->SetOrientationToHorizontal(); + + theScalarBar->SetWidth((Width == 0) ? 0.17 : Width); + theScalarBar->SetHeight((Height == 0) ? 0.8 : Height); + + theScalarBar->SetNumberOfLabels((NbLabels == 0) ? 5 : NbLabels); + theScalarBar->SetMaximumNumberOfColors((NbColors == 0) ? 64 : NbColors); } //============================================================================= @@ -5727,82 +3980,86 @@ void SMESHGUI::UpdateScalarBar(float MinRange, float MaxRange) //============================================================================= void SMESHGUI::SetDisplaySettings() { - EmitSignalDeactivateDialog(); - SMESHGUI_Preferences_ColorDlg *aDlg = - new SMESHGUI_Preferences_ColorDlg(QAD_Application::getDesktop(), ""); - - QString SCr = QAD_CONFIG->getSetting("SMESH:SettingsFillColorRed"); - QString SCg = QAD_CONFIG->getSetting("SMESH:SettingsFillColorGreen"); - QString SCb = QAD_CONFIG->getSetting("SMESH:SettingsFillColorBlue"); - QColor color = QColor(SCr.toInt(), SCg.toInt(), SCb.toInt()); - aDlg->SetColor(1, color); - - SCr = QAD_CONFIG->getSetting("SMESH:SettingsOutlineColorRed"); - SCg = QAD_CONFIG->getSetting("SMESH:SettingsOutlineColorGreen"); - SCb = QAD_CONFIG->getSetting("SMESH:SettingsOutlineColorBlue"); - color = QColor(SCr.toInt(), SCg.toInt(), SCb.toInt()); - aDlg->SetColor(2, color); - - SCr = QAD_CONFIG->getSetting("SMESH:SettingsNodeColorRed"); - SCg = QAD_CONFIG->getSetting("SMESH:SettingsNodeColorGreen"); - SCb = QAD_CONFIG->getSetting("SMESH:SettingsNodeColorBlue"); - color = QColor(SCr.toInt(), SCg.toInt(), SCb.toInt()); - aDlg->SetColor(3, color); - - QString SBr = QAD_CONFIG->getSetting("SMESH:SettingsBackFaceColorRed"); - QString SBg = QAD_CONFIG->getSetting("SMESH:SettingsBackFaceColorGreen"); - QString SBb = QAD_CONFIG->getSetting("SMESH:SettingsBackFaceColorBlue"); - color = QColor(SBr.toInt(), SBg.toInt(), SBb.toInt()); - aDlg->SetColor(4, color); - - QString intValue = QAD_CONFIG->getSetting("SMESH:SettingsWidth"); - aDlg->SetIntValue(1, intValue.toInt()); - intValue = QAD_CONFIG->getSetting("SMESH:SettingsNodesSize"); - aDlg->SetIntValue(2, intValue.toInt()); - intValue = QAD_CONFIG->getSetting("SMESH:SettingsShrinkCoeff"); - aDlg->SetIntValue(3, intValue.toInt()); - - if (aDlg->exec()) - { - QColor colorFill = aDlg->GetColor(1); - QAD_CONFIG->addSetting("SMESH:SettingsFillColorRed", colorFill.red()); - QAD_CONFIG->addSetting("SMESH:SettingsFillColorGreen", - colorFill.green()); - QAD_CONFIG->addSetting("SMESH:SettingsFillColorBlue", colorFill.blue()); - - QColor colorOutline = aDlg->GetColor(2); - QAD_CONFIG->addSetting("SMESH:SettingsOutlineColorRed", - colorOutline.red()); - QAD_CONFIG->addSetting("SMESH:SettingsOutlineColorGreen", - colorOutline.green()); - QAD_CONFIG->addSetting("SMESH:SettingsOutlineColorBlue", - colorOutline.blue()); - - QColor colorNode = aDlg->GetColor(3); - QAD_CONFIG->addSetting("SMESH:SettingsNodeColorRed", colorNode.red()); - QAD_CONFIG->addSetting("SMESH:SettingsNodeColorGreen", - colorNode.green()); - QAD_CONFIG->addSetting("SMESH:SettingsNodeColorBlue", colorNode.blue()); - - QColor colorBackFace = aDlg->GetColor(4); - QAD_CONFIG->addSetting("SMESH:SettingsBackFaceColorRed", - colorBackFace.red()); - QAD_CONFIG->addSetting("SMESH:SettingsBackFaceColorGreen", - colorBackFace.green()); - QAD_CONFIG->addSetting("SMESH:SettingsBackFaceColorBlue", - colorBackFace.blue()); - - int width = aDlg->GetIntValue(1); - QAD_CONFIG->addSetting("SMESH:SettingsWidth", width); - - int nodes_size = aDlg->GetIntValue(2); - QAD_CONFIG->addSetting("SMESH:SettingsNodesSize", nodes_size); - - int shrink_coeff = aDlg->GetIntValue(3); - QAD_CONFIG->addSetting("SMESH:SettingsShrinkCoeff", shrink_coeff); - } - - delete aDlg; + EmitSignalDeactivateDialog(); + SMESHGUI_Preferences_ColorDlg *aDlg = + new SMESHGUI_Preferences_ColorDlg(QAD_Application::getDesktop(), ""); + + QColor color; + QString SCr, SCg, SCb; + SCr = QAD_CONFIG->getSetting("SMESH:SettingsFillColorRed"); + SCg = QAD_CONFIG->getSetting("SMESH:SettingsFillColorGreen"); + SCb = QAD_CONFIG->getSetting("SMESH:SettingsFillColorBlue"); + if (!SCr.isEmpty() && !SCg.isEmpty() && !SCb.isEmpty()) + color = QColor(SCr.toInt(), SCg.toInt(), SCb.toInt()); + else color = QColor(0, 170, 255); + aDlg->SetColor(1, color); + + SCr = QAD_CONFIG->getSetting("SMESH:SettingsOutlineColorRed"); + SCg = QAD_CONFIG->getSetting("SMESH:SettingsOutlineColorGreen"); + SCb = QAD_CONFIG->getSetting("SMESH:SettingsOutlineColorBlue"); + if (!SCr.isEmpty() && !SCg.isEmpty() && !SCb.isEmpty()) + color = QColor(SCr.toInt(), SCg.toInt(), SCb.toInt()); + else color = QColor(0, 170, 255); + aDlg->SetColor(2, color); + + SCr = QAD_CONFIG->getSetting("SMESH:SettingsNodeColorRed"); + SCg = QAD_CONFIG->getSetting("SMESH:SettingsNodeColorGreen"); + SCb = QAD_CONFIG->getSetting("SMESH:SettingsNodeColorBlue"); + if (!SCr.isEmpty() && !SCg.isEmpty() && !SCb.isEmpty()) + color = QColor(SCr.toInt(), SCg.toInt(), SCb.toInt()); + else color = Qt::red; + aDlg->SetColor(3, color); + + QString SBr = QAD_CONFIG->getSetting("SMESH:SettingsBackFaceColorRed"); + QString SBg = QAD_CONFIG->getSetting("SMESH:SettingsBackFaceColorGreen"); + QString SBb = QAD_CONFIG->getSetting("SMESH:SettingsBackFaceColorBlue"); + if (!SCr.isEmpty() && !SCg.isEmpty() && !SCb.isEmpty()) + color = QColor(SBr.toInt(), SBg.toInt(), SBb.toInt()); + else color = Qt::blue; + aDlg->SetColor(4, color); + + QString intValue = QAD_CONFIG->getSetting("SMESH:SettingsWidth"); + if (intValue.isEmpty()) intValue = "1"; + aDlg->SetIntValue(1, intValue.toInt()); + intValue = QAD_CONFIG->getSetting("SMESH:SettingsNodesSize"); + if (intValue.isEmpty()) intValue = "3"; + aDlg->SetIntValue(2, intValue.toInt()); + intValue = QAD_CONFIG->getSetting("SMESH:SettingsShrinkCoeff"); + if (intValue.isEmpty()) intValue = "75"; + aDlg->SetIntValue(3, intValue.toInt()); + + if (aDlg->exec()) { + QColor colorFill = aDlg->GetColor(1); + QAD_CONFIG->addSetting("SMESH:SettingsFillColorRed", colorFill.red()); + QAD_CONFIG->addSetting("SMESH:SettingsFillColorGreen", colorFill.green()); + QAD_CONFIG->addSetting("SMESH:SettingsFillColorBlue", colorFill.blue()); + + QColor colorOutline = aDlg->GetColor(2); + QAD_CONFIG->addSetting("SMESH:SettingsOutlineColorRed", colorOutline.red()); + QAD_CONFIG->addSetting("SMESH:SettingsOutlineColorGreen", colorOutline.green()); + QAD_CONFIG->addSetting("SMESH:SettingsOutlineColorBlue", colorOutline.blue()); + + QColor colorNode = aDlg->GetColor(3); + QAD_CONFIG->addSetting("SMESH:SettingsNodeColorRed", colorNode.red()); + QAD_CONFIG->addSetting("SMESH:SettingsNodeColorGreen", colorNode.green()); + QAD_CONFIG->addSetting("SMESH:SettingsNodeColorBlue", colorNode.blue()); + + QColor colorBackFace = aDlg->GetColor(4); + QAD_CONFIG->addSetting("SMESH:SettingsBackFaceColorRed", colorBackFace.red()); + QAD_CONFIG->addSetting("SMESH:SettingsBackFaceColorGreen", colorBackFace.green()); + QAD_CONFIG->addSetting("SMESH:SettingsBackFaceColorBlue", colorBackFace.blue()); + + int width = aDlg->GetIntValue(1); + QAD_CONFIG->addSetting("SMESH:SettingsWidth", width); + + int nodes_size = aDlg->GetIntValue(2); + QAD_CONFIG->addSetting("SMESH:SettingsNodesSize", nodes_size); + + int shrink_coeff = aDlg->GetIntValue(3); + QAD_CONFIG->addSetting("SMESH:SettingsShrinkCoeff", shrink_coeff); + } + + delete aDlg; } //======================================================================= @@ -5869,189 +4126,43 @@ int SMESHGUI::Parameter(Standard_Boolean & res, * */ //============================================================================= -void SMESHGUI::DisplayEdges(SMESH_Actor * ac, bool visibility) -{ - if (myActiveStudy->getActiveStudyFrame()->getTypeView() != VIEW_VTK) - return; - if (ac->DataSource == NULL || ac->GetMapper() == NULL) - return; - - vtkGeometryFilter *gf = vtkGeometryFilter::New(); - gf->SetInput(ac->DataSource); - vtkFeatureEdges *edges = vtkFeatureEdges::New(); - edges->SetInput(gf->GetOutput()); - edges->BoundaryEdgesOn(); - edges->ManifoldEdgesOn(); - - vtkPolyDataMapper *edgeMapper = vtkPolyDataMapper::New(); - edgeMapper->SetInput(edges->GetOutput()); - edgeMapper->ScalarVisibilityOff(); - - vtkRenderer *theRenderer = - ((VTKViewer_ViewFrame *) myActiveStudy->getActiveStudyFrame()-> - getRightFrame()->getViewFrame())->getRenderer(); - vtkActorCollection *actorList = theRenderer->GetActors(); - - int test = actorList->IsItemPresent(ac->EdgeDevice); - if (test == 0) - { - vtkProperty *prop = vtkProperty::New(); - prop->SetColor(QAD_CONFIG->getSetting("SMESH:SettingsOutlineColorRed"). - toFloat() / 255., - QAD_CONFIG->getSetting("SMESH:SettingsOutlineColorGreen"). - toFloat() / 255., - QAD_CONFIG->getSetting("SMESH:SettingsOutlineColorBlue").toFloat() / - 255.); - prop->SetPointSize(QAD_CONFIG->getSetting("SMESH:SettingsNodesSize"). - toInt()); - prop->SetLineWidth(QAD_CONFIG->getSetting("SMESH:SettingsWidth"). - toInt()); - ac->EdgeDevice->SetProperty(prop); - ac->SetEdgeColor(QAD_CONFIG-> - getSetting("SMESH:SettingsOutlineColorRed").toFloat() / 255., - QAD_CONFIG->getSetting("SMESH:SettingsOutlineColorGreen"). - toFloat() / 255., - QAD_CONFIG->getSetting("SMESH:SettingsOutlineColorBlue").toFloat() / - 255.); - ac->EdgeDevice->SetMapper(edgeMapper); - - theRenderer->AddActor(ac->EdgeDevice); - } - else - { - ac->EdgeDevice->SetMapper(edgeMapper); - edgeMapper->Update(); - } - - vtkShrinkFilter *shrink = vtkShrinkFilter::New(); - shrink->SetInput(ac->DataSource); - shrink->SetShrinkFactor(ac->GetShrinkFactor()); - vtkGeometryFilter *Shrinkgf = vtkGeometryFilter::New(); - Shrinkgf->SetInput(shrink->GetOutput()); - vtkFeatureEdges *ShrinkEdges = vtkFeatureEdges::New(); - ShrinkEdges->SetInput(Shrinkgf->GetOutput()); - ShrinkEdges->BoundaryEdgesOn(); - ShrinkEdges->ManifoldEdgesOn(); - - vtkPolyDataMapper *ShrinkEdgeMapper = vtkPolyDataMapper::New(); - ShrinkEdgeMapper->SetInput(ShrinkEdges->GetOutput()); - ShrinkEdgeMapper->ScalarVisibilityOff(); - - test = actorList->IsItemPresent(ac->EdgeShrinkDevice); - if (test == 0) - { - vtkProperty *prop = vtkProperty::New(); - prop->SetColor(QAD_CONFIG->getSetting("SMESH:SettingsOutlineColorRed"). - toFloat() / 255., - QAD_CONFIG->getSetting("SMESH:SettingsOutlineColorGreen"). - toFloat() / 255., - QAD_CONFIG->getSetting("SMESH:SettingsOutlineColorBlue").toFloat() / - 255.); - prop->SetPointSize(QAD_CONFIG->getSetting("SMESH:SettingsNodesSize"). - toInt()); - prop->SetLineWidth(QAD_CONFIG->getSetting("SMESH:SettingsWidth"). - toInt()); - ac->EdgeShrinkDevice->SetProperty(prop); - ac->SetEdgeColor(QAD_CONFIG-> - getSetting("SMESH:SettingsOutlineColorRed").toFloat() / 255., - QAD_CONFIG->getSetting("SMESH:SettingsOutlineColorGreen"). - toFloat() / 255., - QAD_CONFIG->getSetting("SMESH:SettingsOutlineColorBlue").toFloat() / - 255.); - ac->EdgeShrinkDevice->SetMapper(ShrinkEdgeMapper); - - theRenderer->AddActor(ac->EdgeShrinkDevice); - } - else - { - ac->EdgeShrinkDevice->SetMapper(ShrinkEdgeMapper); - ShrinkEdgeMapper->Update(); - } - - vtkRenderWindow *renWin = theRenderer->GetRenderWindow(); - renWin->Render(); -} +void SMESHGUI::DisplayEdges(SMESH_Actor * ac, bool visibility){} //============================================================================= /*! * */ //============================================================================= -void SMESHGUI::InitActor(SMESH::SMESH_Mesh_ptr aMesh) -{ - SALOMEDS::SObject_var aSO_M = myStudyAPI.FindMesh(aMesh); - SALOMEDS::GenericAttribute_var anAttr; - SALOMEDS::AttributeName_var aName; - if (!aSO_M->_is_nil()) - { - if (aSO_M->FindAttribute(anAttr, "AttributeName")) - { - aName = SALOMEDS::AttributeName::_narrow(anAttr); - Standard_Boolean result; - SMESH_Actor *MeshActor = - smeshGUI->FindActorByEntry(aSO_M->GetID(), result, true); - if (!result) - { - SMESH_Actor *amesh = SMESH_Actor::New(); - Handle(SALOME_InteractiveObject) IO = - new SALOME_InteractiveObject(aSO_M->GetID(), "MESH", - aName->Value()); - amesh->setIO(IO); - amesh->setName(aName->Value()); - DisplayActor(amesh, false); - } - } - } -} +void SMESHGUI::InitActor(SMESH::SMESH_Mesh_ptr aMesh){} //============================================================================= /*! * */ //============================================================================= -void SMESHGUI::Update() -{ - if (myActiveStudy->getActiveStudyFrame()->getTypeView() == VIEW_VTK) - { //VTK - vtkRenderer *theRenderer = - ((VTKViewer_ViewFrame *) myActiveStudy->getActiveStudyFrame()-> - getRightFrame()->getViewFrame())->getRenderer(); - - SALOME_Selection *Sel = - SALOME_Selection::Selection(myActiveStudy->getSelection()); - int nbSel = Sel->IObjectCount(); - if (nbSel == 0) - { - vtkActorCollection *actorList = theRenderer->GetActors(); - actorList->InitTraversal(); - vtkActor *ac = actorList->GetNextActor(); - while (!(ac == NULL)) - { - if (ac->IsA("SMESH_Actor")) - { - SMESH_Actor *anActor = SMESH_Actor::SafeDownCast(ac); - if (anActor->hasIO()) - { - Handle(SALOME_InteractiveObject) IO = anActor->getIO(); - Update(IO); - } - } - ac = actorList->GetNextActor(); - } - } - else - { - SALOME_ListIteratorOfListIO It(Sel->StoredIObjects()); - for (; It.More(); It.Next()) - { - Handle(SALOME_InteractiveObject) IO = It.Value(); - Update(IO); - } - } - vtkRenderWindow *renWin = theRenderer->GetRenderWindow(); - renWin->Render(); - } - QApplication::restoreOverrideCursor(); +void SMESHGUI::Update(){ + if(VTKViewer_ViewFrame* aViewFrame = GetCurrentVtkView()){ + SALOME_Selection *Sel = SALOME_Selection::Selection(myActiveStudy->getSelection()); + if(Sel->IObjectCount() == 0){ + vtkRenderer* aRenderer = aViewFrame->getRenderer(); + vtkActorCollection *aCollection = aRenderer->GetActors(); + aCollection->InitTraversal(); + while(vtkActor *anAct = aCollection->GetNextActor()){ + if(SMESH_Actor *anActor = dynamic_cast(anAct)){ + if(anActor->hasIO()){ + Update(anActor->getIO()); + } + } + } + }else{ + SALOME_ListIteratorOfListIO It(Sel->StoredIObjects()); + for(; It.More(); It.Next()){ + Handle(SALOME_InteractiveObject) IO = It.Value(); + Update(IO); + } + } + ::RepaintCurrentView(); + } } //============================================================================= @@ -6059,47 +4170,11 @@ void SMESHGUI::Update() * */ //============================================================================= -void SMESHGUI::Update(const Handle(SALOME_InteractiveObject) & IO) -{ - if (myActiveStudy->getActiveStudyFrame()->getTypeView() != VIEW_VTK) - return; - - if (IO->hasEntry()) - { - Standard_Boolean res; - SMESH::SMESH_Mesh_var aMesh = ConvertIOinMesh(IO, res); - if (res) - { - SMESH_Actor *ac = FindActorByEntry(IO->getEntry(), res, false); - if (res) - { - // Check whether the actor belongs to the active view - VTKViewer_RenderWindowInteractor *rwInter = - ((VTKViewer_ViewFrame *) myActiveStudy-> - getActiveStudyFrame()->getRightFrame()->getViewFrame())-> - getRWInteractor(); - - ac = ReadScript(aMesh); - // The actor belongs to inactive view -> create a copy and display it in the active view - if (!rwInter->isInViewer(IO)) - { - SMESH_Actor *acCopy = SMESH_Actor::New(); - acCopy->ShallowCopy(ac); - ac=acCopy; - } - - if (ac != NULL) - { -#ifdef TRACE - Dump(ac); -#endif - DisplayActor(ac); - DisplayEdges(ac); - smeshGUI->ChangeRepresentation(ac, ac->getDisplayMode()); - } - } - } - } +void SMESHGUI::Update(const Handle(SALOME_InteractiveObject) & theIO){ + CORBA::Long anId = smeshGUI->myStudy->StudyId(); + TVisualObjPtr aVisualObj = ::GetVisualObj(anId,theIO->getEntry()); + aVisualObj->Update(); + ::UpdateView(eDisplay,theIO->getEntry()); } //============================================================================= @@ -6118,7 +4193,7 @@ vtkActor *SMESHGUI::SimulationMoveNode(SMESH_Actor * Mactor, int idnode) getRightFrame()->getViewFrame())->getRenderer(); vtkUnstructuredGrid *ugrid = - vtkUnstructuredGrid::SafeDownCast(Mactor->DataSource); + vtkUnstructuredGrid::SafeDownCast(Mactor->GetUnstructuredGrid()); vtkIdList *IdCells = vtkIdList::New(); ugrid->GetPointCells(idnode, IdCells); @@ -6139,7 +4214,7 @@ vtkActor *SMESHGUI::SimulationMoveNode(SMESH_Actor * Mactor, int idnode) prop->SetColor(1., 0., 0.); prop->SetRepresentationToWireframe(); - int Edgewidth = (int)Mactor->EdgeDevice->GetProperty()->GetLineWidth(); + int Edgewidth = (int)Mactor->GetLineWidth(); if (Edgewidth == 0) Edgewidth = 1; prop->SetLineWidth(Edgewidth + 1); @@ -6184,7 +4259,7 @@ void SMESHGUI::DisplaySimulationNode(SMESH::SMESH_Mesh_ptr aMesh, float x, if (result) { vtkUnstructuredGrid *ugrid = - vtkUnstructuredGrid::SafeDownCast(ac->DataSource); + vtkUnstructuredGrid::SafeDownCast(ac->GetUnstructuredGrid()); vtkUnstructuredGrid *newugrid = vtkUnstructuredGrid::New(); vtkPoints *Pts = ugrid->GetPoints(); @@ -6286,36 +4361,17 @@ void SMESHGUI::MoveNode(SMESH::SMESH_Mesh_ptr aMesh, int idnode, float x, * */ //============================================================================= -void SMESHGUI::ScalarVisibilityOff() -{ - if (myActiveStudy->getActiveStudyFrame()->getTypeView() != VIEW_VTK) - return; - - vtkRenderer *theRenderer = - ((VTKViewer_ViewFrame *) myActiveStudy->getActiveStudyFrame()-> - getRightFrame()->getViewFrame())->getRenderer(); - vtkActorCollection *actorList = theRenderer->GetActors(); - - actorList->InitTraversal(); - vtkActor *ac = actorList->GetNextActor(); - while (!(ac == NULL)) - { - if (ac->IsA("SMESH_Actor")) - { - SMESH_Actor *anActor = SMESH_Actor::SafeDownCast(ac); - if (anActor->GetVisibility() == 1) - { - vtkDataSetMapper *meshMapper = - (vtkDataSetMapper *) (anActor->getMapper()); - meshMapper->ScalarVisibilityOff(); - meshMapper->SetInput(anActor->DataSource); - ChangeRepresentation(anActor, anActor->getDisplayMode()); - } - } - ac = actorList->GetNextActor(); - } - - theRenderer->Render(); +void SMESHGUI::ScalarVisibilityOff(){ + if(vtkRenderer *aRenderer = ::GetCurrentRenderer()){ + vtkActorCollection *actorList = aRenderer->GetActors(); + actorList->InitTraversal(); + while(vtkActor *ac = actorList->GetNextActor()){ + if(SMESH_Actor *anActor = SMESH_Actor::SafeDownCast(ac)){ + anActor->GetMapper()->ScalarVisibilityOff(); + } + } + ::RepaintCurrentView(); + } } //============================================================================= @@ -6355,7 +4411,7 @@ void SMESHGUI::DisplaySimulationEdge(SMESH::SMESH_Mesh_ptr aMesh, pts[1] = idNodes[1]; vtkUnstructuredGrid *ugrid = - vtkUnstructuredGrid::SafeDownCast(ac->DataSource); + vtkUnstructuredGrid::SafeDownCast(ac->GetUnstructuredGrid()); vtkUnstructuredGrid *newugrid = vtkUnstructuredGrid::New(); newugrid->SetPoints(ugrid->GetPoints()); newugrid->InsertNextCell(VTK_LINE, 2, pts); @@ -6427,7 +4483,7 @@ void SMESHGUI::DisplaySimulationTriangle(SMESH::SMESH_Mesh_ptr aMesh, pts[2] = idNodes[2]; } vtkUnstructuredGrid *ugrid = - vtkUnstructuredGrid::SafeDownCast(ac->DataSource); + vtkUnstructuredGrid::SafeDownCast(ac->GetUnstructuredGrid()); vtkUnstructuredGrid *newugrid = vtkUnstructuredGrid::New(); newugrid->SetPoints(ugrid->GetPoints()); newugrid->InsertNextCell(VTK_TRIANGLE, 3, pts); @@ -6469,7 +4525,7 @@ void SMESHGUI::DisplaySimulationQuadrangle(SMESH::SMESH_Mesh_ptr aMesh, SMESH_Actor *ac = FindActor(aMesh, result, true); vtkUnstructuredGrid *ugrid = - vtkUnstructuredGrid::SafeDownCast(ac->DataSource); + vtkUnstructuredGrid::SafeDownCast(ac->GetUnstructuredGrid()); if (result) { @@ -6534,7 +4590,7 @@ void SMESHGUI::DisplaySimulationQuadrangle(SMESH::SMESH_Mesh_ptr aMesh, Ids->InsertId(3, idNodes[3]); } - // vtkUnstructuredGrid* ugrid = vtkUnstructuredGrid::SafeDownCast( ac->DataSource ); + // vtkUnstructuredGrid* ugrid = vtkUnstructuredGrid::SafeDownCast( ac->GetUnstructuredGrid() ); vtkUnstructuredGrid *newugrid = vtkUnstructuredGrid::New(); newugrid->SetPoints(ugrid->GetPoints()); newugrid->InsertNextCell(VTK_QUAD, Ids); @@ -6591,7 +4647,7 @@ void SMESHGUI::DisplaySimulationTetra(SMESH::SMESH_Mesh_ptr aMesh, Ids->InsertId(3, idNodes[3]); vtkUnstructuredGrid *ugrid = - vtkUnstructuredGrid::SafeDownCast(ac->DataSource); + vtkUnstructuredGrid::SafeDownCast(ac->GetUnstructuredGrid()); vtkUnstructuredGrid *newugrid = vtkUnstructuredGrid::New(); newugrid->SetPoints(ugrid->GetPoints()); newugrid->InsertNextCell(VTK_TETRA, Ids); @@ -6652,7 +4708,7 @@ void SMESHGUI::DisplaySimulationHexa(SMESH::SMESH_Mesh_ptr aMesh, Ids->InsertId(7, idNodes[7]); vtkUnstructuredGrid *ugrid = - vtkUnstructuredGrid::SafeDownCast(ac->DataSource); + vtkUnstructuredGrid::SafeDownCast(ac->GetUnstructuredGrid()); vtkUnstructuredGrid *newugrid = vtkUnstructuredGrid::New(); newugrid->SetPoints(ugrid->GetPoints()); newugrid->InsertNextCell(VTK_HEXAHEDRON, Ids); @@ -6678,101 +4734,84 @@ void SMESHGUI::DisplaySimulationHexa(SMESH::SMESH_Mesh_ptr aMesh, * */ //============================================================================= -void SMESHGUI::AddFace(SMESH::SMESH_Mesh_ptr aMesh, - const TColStd_MapOfInteger & MapIndex, bool reverse) +void SMESHGUI::AddFace(SMESH::SMESH_Mesh_ptr theMesh, + const TColStd_MapOfInteger & MapIndex, + bool reverse) { - QApplication::setOverrideCursor(Qt::waitCursor); - Standard_Boolean result; - SMESH_Actor *ac = FindActor(aMesh, result, true); - if (result) - { - TColStd_MapIteratorOfMapOfInteger ite(MapIndex); - SMESH::long_array_var anArrayOfIdeces = new SMESH::long_array; - anArrayOfIdeces->length(MapIndex.Extent()); - - int i = 0; - for (; ite.More(); ite.Next()) - { - anArrayOfIdeces[i] = ac->GetIdSMESHDSNode(ite.Key()); - i++; - } - - int tmp; - if (MapIndex.Extent() == 4) - { - int idNodes[4]; - int i = 0; - TColStd_MapIteratorOfMapOfInteger ite1(MapIndex); - for (; ite1.More(); ite1.Next()) - { - idNodes[i] = ite1.Key(); - i++; - } - - vtkUnstructuredGrid *ugrid = - vtkUnstructuredGrid::SafeDownCast(ac->DataSource); - float *p0 = ugrid->GetPoint(idNodes[0]); - float *p1 = ugrid->GetPoint(idNodes[1]); - float *p2 = ugrid->GetPoint(idNodes[2]); - float *p3 = ugrid->GetPoint(idNodes[3]); - - gp_Pnt P0(p0[0], p0[1], p0[2]); - - gp_Vec V1(P0, gp_Pnt(p1[0], p1[1], p1[2])); - gp_Vec V2(P0, gp_Pnt(p2[0], p2[1], p2[2])); - gp_Vec V3(P0, gp_Pnt(p3[0], p3[1], p3[2])); - - gp_Vec Cross1 = V1 ^ V2; - gp_Vec Cross2 = V2 ^ V3; - - if (Cross1.Dot(Cross2) < 0) - { - - V1 = gp_Vec(P0, gp_Pnt(p2[0], p2[1], p2[2])); - V2 = gp_Vec(P0, gp_Pnt(p1[0], p1[1], p1[2])); - Cross1 = V1 ^ V2; - Cross2 = V2 ^ V3; - - if (Cross1.Dot(Cross2) < 0) - { - tmp = anArrayOfIdeces[2]; - anArrayOfIdeces[2] = anArrayOfIdeces[3]; - anArrayOfIdeces[3] = tmp; - } - else - { - tmp = anArrayOfIdeces[1]; - anArrayOfIdeces[1] = anArrayOfIdeces[2]; - anArrayOfIdeces[2] = tmp; - } - } - } - - // int tmp; - if (reverse) - { - for (i = 0; i < (MapIndex.Extent() / 2); i++) - { - tmp = anArrayOfIdeces[i]; - anArrayOfIdeces[i] = anArrayOfIdeces[MapIndex.Extent() - i - 1]; - anArrayOfIdeces[MapIndex.Extent() - i - 1] = tmp; - } - } - SMESH::SMESH_MeshEditor_var aMeshEditor = aMesh->GetMeshEditor(); - aMeshEditor->AddFace(anArrayOfIdeces); - } - if (myAutomaticUpdate) - { - SMESH_Actor *Mesh = smeshGUI->ReadScript(aMesh); - if (Mesh != NULL) - { - smeshGUI->DisplayActor(Mesh); - smeshGUI->DisplayEdges(Mesh); - smeshGUI->ChangeRepresentation(Mesh, Mesh->getDisplayMode()); - AddActorInSelection(Mesh); - } - } - QApplication::restoreOverrideCursor(); + QAD_WaitCursor wc; + try{ + SALOMEDS::SObject_var aSobj = myStudyAPI.FindObject(theMesh); + CORBA::String_var anEntry = aSobj->GetID(); + if(SMESH_Actor* anActor = ::FindActorByEntry(anEntry.in())){ + SMESH::long_array_var anArrayOfIdeces = new SMESH::long_array; + anArrayOfIdeces->length(MapIndex.Extent()); + TColStd_MapIteratorOfMapOfInteger ite(MapIndex); + for(int i = 0; ite.More(); ite.Next(), i++){ + anArrayOfIdeces[i] = anActor->GetNodeObjId(ite.Key()); + } + int tmp; + if(MapIndex.Extent() == 4){ + int idNodes[4]; + TColStd_MapIteratorOfMapOfInteger ite1(MapIndex); + for(int i = 0; ite1.More(); ite1.Next(), i++){ + idNodes[i] = ite1.Key(); + } + vtkUnstructuredGrid *ugrid = anActor->GetUnstructuredGrid(); + float *p0 = ugrid->GetPoint(idNodes[0]); + float *p1 = ugrid->GetPoint(idNodes[1]); + float *p2 = ugrid->GetPoint(idNodes[2]); + float *p3 = ugrid->GetPoint(idNodes[3]); + + gp_Pnt P0(p0[0], p0[1], p0[2]); + + gp_Vec V1(P0, gp_Pnt(p1[0], p1[1], p1[2])); + gp_Vec V2(P0, gp_Pnt(p2[0], p2[1], p2[2])); + gp_Vec V3(P0, gp_Pnt(p3[0], p3[1], p3[2])); + + gp_Vec Cross1 = V1 ^ V2; + gp_Vec Cross2 = V2 ^ V3; + + if(Cross1.Dot(Cross2) < 0){ + V1 = gp_Vec(P0, gp_Pnt(p2[0], p2[1], p2[2])); + V2 = gp_Vec(P0, gp_Pnt(p1[0], p1[1], p1[2])); + Cross1 = V1 ^ V2; + Cross2 = V2 ^ V3; + + if(Cross1.Dot(Cross2) < 0){ + tmp = anArrayOfIdeces[2]; + anArrayOfIdeces[2] = anArrayOfIdeces[3]; + anArrayOfIdeces[3] = tmp; + }else{ + tmp = anArrayOfIdeces[1]; + anArrayOfIdeces[1] = anArrayOfIdeces[2]; + anArrayOfIdeces[2] = tmp; + } + } + } + if(reverse){ + for(int i = 0; i < (MapIndex.Extent() / 2); i++){ + tmp = anArrayOfIdeces[i]; + anArrayOfIdeces[i] = anArrayOfIdeces[MapIndex.Extent() - i - 1]; + anArrayOfIdeces[MapIndex.Extent() - i - 1] = tmp; + } + } + SMESH::SMESH_MeshEditor_var aMeshEditor = theMesh->GetMeshEditor(); + aMeshEditor->AddFace(anArrayOfIdeces); + if(myAutomaticUpdate){ + CORBA::Long anId = smeshGUI->myStudy->StudyId(); + if(TVisualObjPtr aVisualObj = GetVisualObj(anId,anEntry.in())){ + aVisualObj->Update(true); + } + AddActorInSelection(anActor); + } + } + }catch(SALOME::SALOME_Exception& exc) { + INFOS("Follow exception was cought:\n\t"<length(MapIndex.Extent()); - - int i = 0; - for (; ite.More(); ite.Next()) - { - anArrayOfIdeces[i] = ac->GetIdSMESHDSNode(ite.Key()); - i++; - } - - SMESH::SMESH_MeshEditor_var aMeshEditor = aMesh->GetMeshEditor(); - aMeshEditor->AddVolume(anArrayOfIdeces); - } - if (myAutomaticUpdate) - { - SMESH_Actor *Mesh = smeshGUI->ReadScript(aMesh); - if (Mesh != NULL) - { - smeshGUI->DisplayActor(Mesh); - smeshGUI->DisplayEdges(Mesh); - smeshGUI->ChangeRepresentation(Mesh, Mesh->getDisplayMode()); - AddActorInSelection(Mesh); - } - } - QApplication::restoreOverrideCursor(); + QAD_WaitCursor wc; + try{ + SALOMEDS::SObject_var aSobj = myStudyAPI.FindObject(theMesh); + CORBA::String_var anEntry = aSobj->GetID(); + if(SMESH_Actor* anActor = ::FindActorByEntry(anEntry.in())){ + SMESH::long_array_var anArrayOfIdeces = new SMESH::long_array; + anArrayOfIdeces->length(MapIndex.Extent()); + TColStd_MapIteratorOfMapOfInteger ite(MapIndex); + for(int i = 0; ite.More(); ite.Next(), i++){ + anArrayOfIdeces[i] = anActor->GetNodeObjId(ite.Key()); + } + SMESH::SMESH_MeshEditor_var aMeshEditor = theMesh->GetMeshEditor(); + aMeshEditor->AddVolume(anArrayOfIdeces); + if(myAutomaticUpdate){ + CORBA::Long anId = smeshGUI->myStudy->StudyId(); + if(TVisualObjPtr aVisualObj = GetVisualObj(anId,anEntry.in())){ + aVisualObj->Update(true); + } + } + } + }catch(SALOME::SALOME_Exception& exc) { + INFOS("Follow exception was cought:\n\t"<length(MapIndex.Extent()); - - int i = 0; - for (; ite.More(); ite.Next()) - { - anArrayOfIdeces[i] = ac->GetIdSMESHDSNode(ite.Key()); - i++; - } - - SMESH::SMESH_MeshEditor_var aMeshEditor = aMesh->GetMeshEditor(); - aMeshEditor->AddEdge(anArrayOfIdeces); - } - if (myAutomaticUpdate) - { - SMESH_Actor *Mesh = smeshGUI->ReadScript(aMesh); - if (Mesh != NULL) - { - smeshGUI->DisplayActor(Mesh); - smeshGUI->DisplayEdges(Mesh); - smeshGUI->ChangeRepresentation(Mesh, Mesh->getDisplayMode()); - AddActorInSelection(Mesh); - } - } - QApplication::restoreOverrideCursor(); + QAD_WaitCursor wc; + try{ + SALOMEDS::SObject_var aSobj = myStudyAPI.FindObject(theMesh); + CORBA::String_var anEntry = aSobj->GetID(); + if(SMESH_Actor* anActor = ::FindActorByEntry(anEntry.in())){ + SMESH::long_array_var anArrayOfIdeces = new SMESH::long_array; + anArrayOfIdeces->length(MapIndex.Extent()); + TColStd_MapIteratorOfMapOfInteger ite(MapIndex); + for(int i = 0; ite.More(); ite.Next(), i++){ + anArrayOfIdeces[i] = anActor->GetNodeObjId(ite.Key()); + } + SMESH::SMESH_MeshEditor_var aMeshEditor = theMesh->GetMeshEditor(); + aMeshEditor->AddEdge(anArrayOfIdeces); + if(myAutomaticUpdate){ + CORBA::Long anId = smeshGUI->myStudy->StudyId(); + if(TVisualObjPtr aVisualObj = GetVisualObj(anId,anEntry.in())){ + aVisualObj->Update(true); + } + } + } + }catch(SALOME::SALOME_Exception& exc) { + INFOS("Follow exception was cought:\n\t"<GetMeshEditor(); - aMeshEditor->AddNode(x, y, z); - - if (myAutomaticUpdate) - { - SMESH_Actor *Mesh = smeshGUI->ReadScript(aMesh); - if (Mesh != NULL) - { - smeshGUI->DisplayActor(Mesh); - smeshGUI->DisplayEdges(Mesh); - smeshGUI->ChangeRepresentation(Mesh, Mesh->getDisplayMode()); - AddActorInSelection(Mesh); - } - } - } - QApplication::restoreOverrideCursor(); + QAD_WaitCursor wc; + try{ + SALOMEDS::SObject_var aSobj = myStudyAPI.FindObject(theMesh); + CORBA::String_var anEntry = aSobj->GetID(); + if(SMESH_Actor* anActor = ::FindActorByEntry(anEntry.in())){ + SMESH::SMESH_MeshEditor_var aMeshEditor = theMesh->GetMeshEditor(); + aMeshEditor->AddNode(x, y, z); + if(myAutomaticUpdate){ + CORBA::Long anId = smeshGUI->myStudy->StudyId(); + if(TVisualObjPtr aVisualObj = GetVisualObj(anId,anEntry.in())){ + aVisualObj->Update(true); + } + } + } + }catch(SALOME::SALOME_Exception& exc) { + INFOS("Follow exception was cought:\n\t"<getStudyFramesCount(); - - Standard_Boolean found; - SALOMEDS::Study_var aStudy = myActiveStudy->getStudyDocument(); - SALOMEDS::StudyBuilder_var aStudyBuilder = myStudy->NewBuilder(); - SALOMEDS::GenericAttribute_var anAttr; - SALOMEDS::AttributeIOR_var anIOR; - - SALOME_Selection *Sel = - SALOME_Selection::Selection(myActiveStudy->getSelection()); - SALOME_ListIteratorOfListIO It(Sel->StoredIObjects()); - for (; It.More(); It.Next()) - { - Handle(SALOME_InteractiveObject) IObject = It.Value(); - if (IObject->hasEntry()) - { - SALOMEDS::SObject_var SO = - myStudy->FindObjectID(IObject->getEntry()); - - /* Erase child graphical objects */ - SALOMEDS::ChildIterator_var it = aStudy->NewChildIterator(SO); - for (; it->More(); it->Next()) - { - SALOMEDS::SObject_var CSO = it->Value(); - if (CSO->FindAttribute(anAttr, "AttributeIOR")) - { - anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); - - for (int i = 0; i < nbSf; i++) - { - QAD_StudyFrame *sf = myActiveStudy->getStudyFrame(i); - if (sf->getTypeView() == VIEW_VTK) - { - vtkRenderer *Renderer = - ((VTKViewer_ViewFrame *) smeshGUI-> - myActiveStudy->getActiveStudyFrame()-> - getRightFrame()->getViewFrame())->getRenderer(); - SMESH_Actor *ac = - smeshGUI->FindActorByEntry(CSO->GetID(), found, - false); - if (found) - { - Renderer->RemoveActor(ac->EdgeDevice); - Renderer->RemoveActor(ac->EdgeShrinkDevice); - Renderer->RemoveActor(ac); - } - } - } - } - } - - /* Erase main graphical object */ - for (int i = 0; i < nbSf; i++) - { - QAD_StudyFrame *sf = myActiveStudy->getStudyFrame(i); - if (sf->getTypeView() == VIEW_VTK) - { - vtkRenderer *Renderer = - ((VTKViewer_ViewFrame *) smeshGUI->myActiveStudy-> - getActiveStudyFrame()->getRightFrame()-> - getViewFrame())->getRenderer(); - VTKViewer_RenderWindowInteractor *myRenderInter = - ((VTKViewer_ViewFrame *) sf->getRightFrame()-> - getViewFrame())->getRWInteractor(); - SMESH_Actor *ac = - smeshGUI->FindActorByEntry(IObject->getEntry(), found, - false); - if (found) - { - Renderer->RemoveActor(ac->EdgeDevice); - Renderer->RemoveActor(ac->EdgeShrinkDevice); - } - myRenderInter->Remove(IObject); - } - } - - /* Erase objects in Study */ - SALOMEDS::SObject_var obj = - myStudy->FindObjectID(IObject->getEntry()); - if (!obj->_is_nil()) - { - QAD_Operation *op = - new SALOMEGUI_ImportOperation(myActiveStudy); - op->start(); - aStudyBuilder->RemoveObject(obj); - op->finish(); - } - - } /* IObject->hasEntry() */ - } /* more/next */ + if (QAD_MessageBox::warn2 + (QAD_Application::getDesktop(), + tr("SMESH_WRN_WARNING"), + tr("SMESH_REALLY_DELETE"), + tr("SMESH_BUT_YES"), tr("SMESH_BUT_NO"), 1, 0, 0) != 1) + return; + + int nbSf = myActiveStudy->getStudyFramesCount(); + + Standard_Boolean found; + SALOMEDS::Study_var aStudy = myActiveStudy->getStudyDocument(); + SALOMEDS::StudyBuilder_var aStudyBuilder = myStudy->NewBuilder(); + SALOMEDS::GenericAttribute_var anAttr; + SALOMEDS::AttributeIOR_var anIOR; + + SALOME_Selection *Sel = SALOME_Selection::Selection(myActiveStudy->getSelection()); + SALOME_ListIteratorOfListIO It(Sel->StoredIObjects()); + for(; It.More(); It.Next()){ + Handle(SALOME_InteractiveObject) IObject = It.Value(); + if(IObject->hasEntry()){ + SALOMEDS::SObject_var SO = myStudy->FindObjectID(IObject->getEntry()); + + /* Erase child graphical objects */ + SALOMEDS::ChildIterator_var it = aStudy->NewChildIterator(SO); + for(; it->More(); it->Next()){ + SALOMEDS::SObject_var CSO = it->Value(); + if(CSO->FindAttribute(anAttr, "AttributeIOR")){ + anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); + + for(int i = 0; i < nbSf; i++){ + QAD_StudyFrame *sf = myActiveStudy->getStudyFrame(i); + CORBA::String_var anEntry = CSO->GetID(); + if(SMESH_Actor* anActor = ::FindActorByEntry(sf,anEntry.in())){ + RemoveActor(sf,anActor); + } + } + } + } + + /* Erase main graphical object */ + for(int i = 0; i < nbSf; i++){ + QAD_StudyFrame *sf = myActiveStudy->getStudyFrame(i); + if(SMESH_Actor* anActor = ::FindActorByEntry(sf,IObject->getEntry())){ + RemoveActor(sf,anActor); + } + } + + // Remove object(s) from data structures + SALOMEDS::SObject_var obj = myStudy->FindObjectID(IObject->getEntry()); + if(!obj->_is_nil()){ + SMESH::SMESH_Group_var aGroup = SMESH::SMESH_Group ::_narrow(obj->GetObject()); + SMESH::SMESH_subMesh_var aSubMesh = SMESH::SMESH_subMesh::_narrow(obj->GetObject()); + + if ( !aGroup->_is_nil() ) { // DELETE GROUP + SMESH::SMESH_Mesh_var aMesh = aGroup->GetMesh(); + aMesh->RemoveGroup( aGroup ); + } + else if ( !aSubMesh->_is_nil() ) { // DELETE SUBMESH + SMESH::SMESH_Mesh_var aMesh = aSubMesh->GetFather(); + aMesh->RemoveSubMesh( aSubMesh ); + } + else {// default action: remove SObject from the study + // san - it's no use opening a transaction here until UNDO/REDO is provided in SMESH + //QAD_Operation *op = new SALOMEGUI_ImportOperation(myActiveStudy); + //op->start(); + aStudyBuilder->RemoveObjectWithChildren( obj ); + //op->finish(); + } + } + + } /* IObject->hasEntry() */ + } /* more/next */ + + /* Clear any previous selection */ + Sel->ClearIObjects(); + myActiveStudy->updateObjBrowser(); +} - /* Clear any previous selection */ - Sel->ClearIObjects(); - myActiveStudy->updateObjBrowser(); +//======================================================================= +// name : SMESHGUI::GetFilterMgr +// Purpose : Get filter manager +//======================================================================= +SMESH::FilterManager_ptr SMESHGUI::GetFilterMgr() +{ + return myFilterMgr; } diff --git a/src/SMESHGUI/SMESHGUI.h b/src/SMESHGUI/SMESHGUI.h index ee29287bf..da6cb22bb 100644 --- a/src/SMESHGUI/SMESHGUI.h +++ b/src/SMESHGUI/SMESHGUI.h @@ -30,6 +30,7 @@ #define SMESHGUI_HeaderFile #include "TColStd_MapOfInteger.hxx" +#include #include "SMESHDS_Document.hxx" @@ -38,24 +39,30 @@ #include "SALOME_Selection.h" #include "SALOME_InteractiveObject.hxx" -#include "SMESH_Actor.h" - #include "SMESHGUI_StudyAPI.h" +#include "SMESHGUI_Hypotheses.h" // IDL Headers #include #include CORBA_SERVER_HEADER(SMESH_Gen) #include CORBA_SERVER_HEADER(SMESH_Mesh) +#include CORBA_SERVER_HEADER(SMESH_Group) #include CORBA_SERVER_HEADER(SMESH_Hypothesis) -#include CORBA_SERVER_HEADER(SMESH_BasicHypothesis) #include CORBA_SERVER_HEADER(GEOM_Gen) #include CORBA_SERVER_HEADER(SALOMEDS_Attributes) +#include CORBA_SERVER_HEADER(SMESH_Filter) // QT Includes #include -// VTK Inlcudes -#include +// VTK Inlcludes + +class vtkActorCollection; +class vtkActor2DCollection; +class vtkScalarBarActor; +class vtkActor; + +class SMESH_Actor; //================================================================================= // class : SMESHGUI @@ -92,6 +99,13 @@ private : bool myAutomaticUpdate; + SMESH::FilterManager_var myFilterMgr; + + // Hypotheses/algorithms from plugin libraries + map myHypothesesMap; + map myAlgorithmsMap; + map myHypCreatorMap; + public : SMESHGUI(); @@ -105,8 +119,6 @@ public : SALOMEDS::Study_ptr GetStudy(); SMESHGUI_StudyAPI GetStudyAPI(); - vtkScalarBarActor* GetScalarBar(); - QDialog* GetActiveDialogBox() ; void SetActiveDialogBox(QDialog* aDlg) ; @@ -140,79 +152,57 @@ public : /* Mesh Management */ SMESH::SMESH_Mesh_ptr InitMesh( GEOM::GEOM_Shape_ptr aShape, QString NameMesh ); SMESH::SMESH_subMesh_ptr AddSubMesh( SMESH::SMESH_Mesh_ptr aMesh, GEOM::GEOM_Shape_ptr aShape, QString NameMesh ); + SMESH::SMESH_Group_ptr AddGroup( SMESH::SMESH_Mesh_ptr aMesh, SMESH::ElementType aType, QString aName ); + + /* Hypotheses and Algorithms Management */ + void InitAvailableHypotheses (); + QStringList GetAvailableHypotheses (const bool isAlgo); + HypothesisData* GetHypothesisData (const char* aHypType); + SMESHGUI_GenericHypothesisCreator* GetHypothesisCreator (const QString& aHypType); + + SMESH::SMESH_Hypothesis_ptr CreateHypothesis (const QString& aHypType, + const QString& aHypName, + const bool isAlgo = false); - /* Hypothesis Management */ - SMESH::SMESH_Hypothesis_ptr CreateHypothesis( QString TypeHypothesis, QString NameHypothesis ); - void AddHypothesisOnMesh( SMESH::SMESH_Mesh_ptr aMesh, SMESH::SMESH_Hypothesis_ptr aHyp ) ; - void AddHypothesisOnSubMesh( SMESH::SMESH_subMesh_ptr aSubMesh, SMESH::SMESH_Hypothesis_ptr aHyp ) ; + bool AddHypothesisOnMesh (SMESH::SMESH_Mesh_ptr aMesh, SMESH::SMESH_Hypothesis_ptr aHyp); + bool AddAlgorithmOnMesh (SMESH::SMESH_Mesh_ptr aMesh, SMESH::SMESH_Hypothesis_ptr aHyp); - void RemoveHypothesisOrAlgorithmOnMesh( const Handle(SALOME_InteractiveObject)& IObject ) ; - void RemoveHypothesisOrAlgorithmOnMesh( SALOMEDS::SObject_ptr MorSM, SMESH::SMESH_Hypothesis_ptr anHyp ) ; + bool AddHypothesisOnSubMesh (SMESH::SMESH_subMesh_ptr aSubMesh, SMESH::SMESH_Hypothesis_ptr aHyp); + bool AddAlgorithmOnSubMesh (SMESH::SMESH_subMesh_ptr aSubMesh, SMESH::SMESH_Hypothesis_ptr aHyp); - void CreateLocalLength( QString TypeHypothesis, QString NameHypothesis, double Length ); - void CreateNbSegments( QString TypeHypothesis, QString NameHypothesis, int nbSegments ); - void CreateMaxElementArea( QString TypeHypothesis, QString NameHypothesis, double MaxArea ); - void CreateMaxElementVolume( QString TypeHypothesis, QString NameHypothesis, double MaxVolume ); + bool RemoveHypothesisOrAlgorithmOnMesh (const Handle(SALOME_InteractiveObject)& IObject); + bool RemoveHypothesisOrAlgorithmOnMesh (SALOMEDS::SObject_ptr MorSM, + SMESH::SMESH_Hypothesis_ptr anHyp); - /* Algorithms Management */ - void AddAlgorithmOnMesh( SMESH::SMESH_Mesh_ptr aMesh, SMESH::SMESH_Hypothesis_ptr aHyp ); - void AddAlgorithmOnSubMesh( SMESH::SMESH_subMesh_ptr aSubMesh, SMESH::SMESH_Hypothesis_ptr aHyp ); - void CreateAlgorithm( QString TypeAlgo, QString NameAlgo ); + void SetPickable(SMESH_Actor* theActor = NULL); /* NODES */ void ViewNodes(); vtkActor* SimulationMoveNode(SMESH_Actor* Mactor, int idnode); void MoveNode( SMESH::SMESH_Mesh_ptr aMesh, int idnode, float x, float y, float z); - void AddNode(SMESH_Actor*, int idnode, float x, float y, float z) ; - void AddNodes( SMESH_Actor* Mactor, int number, - const SMESH::double_array& coords, const SMESH::long_array& indexes); void DisplaySimulationNode( SMESH::SMESH_Mesh_ptr aMesh, float x, float y, float z); void DisplaySimulationMoveNode( vtkActor* ac, int idnode, float x, float y, float z); - void RemoveNode(SMESH_Actor*, int idnode) ; void RemoveNodes(SMESH::SMESH_Mesh_ptr aMesh, const TColStd_MapOfInteger& MapIndex) ; - void RemoveNodes(SMESH_Actor* Mactor, int number, - const SMESH::double_array& coords, const SMESH::long_array& indexes); /* EDGES */ - void AddEdge(SMESH_Actor*, int idedge, int idnode1, int idnode2) ; - void AddEdges( SMESH_Actor* Mactor, int number, - const SMESH::double_array& coords, const SMESH::long_array& indexes); void DisplayEdges(SMESH_Actor* ac, bool visibility = true); void DisplayEdgesConnectivityLegendBox(vtkActor *ac); void DisplaySimulationEdge( SMESH::SMESH_Mesh_ptr aMesh, const TColStd_MapOfInteger& MapIndex ); /* TRIANGLES */ - void AddTriangle(SMESH_Actor*, int idtri, int idnode1, int idnode2, int idnode3) ; - void AddTriangles( SMESH_Actor* Mactor, int number, - const SMESH::double_array& coords, const SMESH::long_array& indexes); void DisplaySimulationTriangle( SMESH::SMESH_Mesh_ptr aMesh, const TColStd_MapOfInteger& MapIndex, bool reverse ); /* QUADRANGLES */ - void AddQuadrangle(SMESH_Actor*, int idquad, int idnode1, int idnode2, - int idnode3, int idnode4) ; - void AddQuadrangles( SMESH_Actor* Mactor, int number, - const SMESH::double_array& coords, const SMESH::long_array& indexes); void DisplaySimulationQuadrangle( SMESH::SMESH_Mesh_ptr aMesh, const TColStd_MapOfInteger& MapIndex, bool reverse ); /* VOLUMES */ - void AddTetra(SMESH_Actor*, int idtetra, int idnode1, int idnode2, - int idnode3, int idnode4) ; - void AddHexaedre(SMESH_Actor*, int idhexa, int idnode1, int idnode2, - int idnode3, int idnode4, int idnode5, int idnode6, int idnode7, int idnode8) ; - void AddTetras( SMESH_Actor* Mactor, int number, - const SMESH::double_array& coords, const SMESH::long_array& indexes); - void AddHexaedres( SMESH_Actor* Mactor, int number, - const SMESH::double_array& coords, const SMESH::long_array& indexes); void DisplaySimulationTetra( SMESH::SMESH_Mesh_ptr aMesh, const TColStd_MapOfInteger& MapIndex ); void DisplaySimulationHexa( SMESH::SMESH_Mesh_ptr aMesh, const TColStd_MapOfInteger& MapIndex ); /* ELEMENTS */ - void RemoveElement(SMESH_Actor*, int idnode); void RemoveElements(SMESH::SMESH_Mesh_ptr aMesh, const TColStd_MapOfInteger& MapIndex) ; - void RemoveElements(SMESH_Actor* Mactor, int number, - const SMESH::double_array& coords, const SMESH::long_array& indexes); void OrientationElements(SMESH::SMESH_Mesh_ptr aMesh, const TColStd_MapOfInteger& MapIndex); void DiagonalInversion(SMESH::SMESH_Mesh_ptr aMesh, const TColStd_MapOfInteger& MapIndex); @@ -239,6 +229,7 @@ public : SMESH::SMESH_Mesh_ptr ConvertIOinMesh(const Handle(SALOME_InteractiveObject)& IO, Standard_Boolean& testResult) ; SMESH::SMESH_subMesh_ptr ConvertIOinSubMesh(const Handle(SALOME_InteractiveObject)& IO, Standard_Boolean& testResult) ; + SMESH::SMESH_Group_ptr ConvertIOinSMESHGroup(const Handle(SALOME_InteractiveObject)& IO, Standard_Boolean& testResult) ; /* Geometry Client */ GEOM::GEOM_Shape_ptr ConvertIOinGEOMShape( const Handle(SALOME_InteractiveObject)& IO, @@ -257,7 +248,7 @@ public : void SetViewMode(int commandId); void ChangeRepresentation( SMESH_Actor* ac, int type ); - SMESH_Actor* FindActor(SMESH::SMESH_Mesh_ptr aMesh, + SMESH_Actor* FindActor(CORBA::Object_ptr theObj, Standard_Boolean& testResult, bool onlyInActiveView); SMESH_Actor* FindActorByEntry(QString entry, @@ -282,10 +273,7 @@ public : QString Bold, QString Italic, QString Shadow, QString Font, QString Orientation, float Width, float Height, int NbColors, int NbLabels); - void DisplayScalarBar(bool visibility); - void UpdateScalarBar(float MinRange, float MaxRange); - - void SetDisplaySettings(); + void SetDisplaySettings(); SALOMEDS::Study::ListOfSObject* GetMeshesUsingAlgoOrHypothesis( SMESH::SMESH_Hypothesis_ptr AlgoOrHyp ) ; @@ -303,11 +291,12 @@ public : static void setOrb(); /* Import/Export */ //NBU - static void Import_Document(QAD_Desktop* parent, int theCommandID); - static void Export_Document(QAD_Desktop* parent, int theCommandID); static void Import_Mesh(QAD_Desktop* parent, int theCommandID); static void Export_Mesh(QAD_Desktop* parent, int theCommandID); + /* Filter manager */ + SMESH::FilterManager_ptr GetFilterMgr(); + signals: void SignalDeactivateActiveDialog() ; void SignalCloseAllDialogs() ; diff --git a/src/SMESHGUI/SMESHGUI_AddEdgeDlg.cxx b/src/SMESHGUI/SMESHGUI_AddEdgeDlg.cxx index 8fe1cc201..2b40287d0 100644 --- a/src/SMESHGUI/SMESHGUI_AddEdgeDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_AddEdgeDlg.cxx @@ -255,7 +255,7 @@ void SMESHGUI_AddEdgeDlg::ClickOnOk() //================================================================================= void SMESHGUI_AddEdgeDlg::ClickOnCancel() { - QAD_Application::getDesktop()->SetSelectionMode( 4 ); + QAD_Application::getDesktop()->SetSelectionMode( ActorSelection ); disconnect( mySelection, 0, this, 0 ); mySMESHGUI->ResetState() ; mySMESHGUI->EraseSimulationActors(); @@ -282,9 +282,9 @@ void SMESHGUI_AddEdgeDlg::SelectionIntoArgument() if(nbNodes < 1) return ; - if ( mySelection->SelectionMode() != 1 ) { + if ( mySelection->SelectionMode() != NodeSelection ) { QAD_MessageBox::warn1 ( QAD_Application::getDesktop(), tr ("SMESH_WRN_WARNING"), - tr ("SMESH_WRN_SELECTIONMODE_NODES"), tr ("SMESH_BUT_YES") ); + tr ("SMESH_WRN_SELECTIONMODE_NODES"), tr ("SMESH_BUT_OK") ); return; } diff --git a/src/SMESHGUI/SMESHGUI_AddFaceDlg.cxx b/src/SMESHGUI/SMESHGUI_AddFaceDlg.cxx index 168dc1350..b294f9368 100644 --- a/src/SMESHGUI/SMESHGUI_AddFaceDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_AddFaceDlg.cxx @@ -278,7 +278,7 @@ void SMESHGUI_AddFaceDlg::ClickOnOk() //================================================================================= void SMESHGUI_AddFaceDlg::ClickOnCancel() { - QAD_Application::getDesktop()->SetSelectionMode( 4 ); + QAD_Application::getDesktop()->SetSelectionMode( ActorSelection ); disconnect( mySelection, 0, this, 0 ); mySMESHGUI->ResetState() ; mySMESHGUI->EraseSimulationActors(); @@ -305,9 +305,9 @@ void SMESHGUI_AddFaceDlg::SelectionIntoArgument() if(nbNodes < 1) return ; - if ( mySelection->SelectionMode() != 1 ) { + if ( mySelection->SelectionMode() != NodeSelection ) { QAD_MessageBox::warn1 ( QAD_Application::getDesktop(), tr ("SMESH_WRN_WARNING"), - tr ("SMESH_WRN_SELECTIONMODE_NODES"), tr ("SMESH_BUT_YES") ); + tr ("SMESH_WRN_SELECTIONMODE_NODES"), tr ("SMESH_BUT_OK") ); return; } diff --git a/src/SMESHGUI/SMESHGUI_AddSubMeshDlg.cxx b/src/SMESHGUI/SMESHGUI_AddSubMeshDlg.cxx index 91ec96dee..b3ab63dfc 100644 --- a/src/SMESHGUI/SMESHGUI_AddSubMeshDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_AddSubMeshDlg.cxx @@ -33,23 +33,20 @@ using namespace std; #include "QAD_Application.h" #include "QAD_Desktop.h" +#include "QAD_MessageBox.h" +#include "QAD_WaitCursor.h" +#include "QAD_Operation.h" + #include "utilities.h" // QT Includes -#include #include #include #include #include -#include #include -#include -#include -#include -#include #include - //================================================================================= // class : SMESHGUI_AddSubMeshDlg() // purpose : Constructs a SMESHGUI_AddSubMeshDlg which is a child of 'parent', with the @@ -58,149 +55,97 @@ using namespace std; // TRUE to construct a modal dialog. //================================================================================= SMESHGUI_AddSubMeshDlg::SMESHGUI_AddSubMeshDlg( QWidget* parent, const char* name, SALOME_Selection* Sel, bool modal, WFlags fl ) - : QDialog( parent, name, modal, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu ) + : QDialog( parent, name, modal, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu | WDestructiveClose ) { - QPixmap image1(QAD_Desktop::getResourceManager()->loadPixmap( "SMESH",tr("ICON_DLG_ADD_SUBMESH"))); QPixmap image0(QAD_Desktop::getResourceManager()->loadPixmap( "SMESH",tr("ICON_SELECT"))); if ( !name ) setName( "SMESHGUI_AddSubMeshDlg" ); - resize( 303, 175 ); setCaption( tr( "SMESH_ADD_SUBMESH" ) ); setSizeGripEnabled( TRUE ); - SMESHGUI_AddSubMeshDlgLayout = new QGridLayout( this ); + QGridLayout* SMESHGUI_AddSubMeshDlgLayout = new QGridLayout( this ); SMESHGUI_AddSubMeshDlgLayout->setSpacing( 6 ); SMESHGUI_AddSubMeshDlgLayout->setMargin( 11 ); /***************************************************************/ - GroupConstructors = new QButtonGroup( this, "GroupConstructors" ); - GroupConstructors->setTitle( tr( "SMESH_SUBMESH" ) ); - GroupConstructors->setExclusive( TRUE ); - GroupConstructors->setColumnLayout(0, Qt::Vertical ); - GroupConstructors->layout()->setSpacing( 0 ); - GroupConstructors->layout()->setMargin( 0 ); - GroupConstructorsLayout = new QGridLayout( GroupConstructors->layout() ); - GroupConstructorsLayout->setAlignment( Qt::AlignTop ); - GroupConstructorsLayout->setSpacing( 6 ); - GroupConstructorsLayout->setMargin( 11 ); - Constructor1 = new QRadioButton( GroupConstructors, "Constructor1" ); - Constructor1->setText( tr( "" ) ); - Constructor1->setPixmap( image1 ); - Constructor1->setChecked( TRUE ); - Constructor1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)1, (QSizePolicy::SizeType)0, Constructor1->sizePolicy().hasHeightForWidth() ) ); - Constructor1->setMinimumSize( QSize( 50, 0 ) ); - GroupConstructorsLayout->addWidget( Constructor1, 0, 0 ); - QSpacerItem* spacer = new QSpacerItem( 20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum ); - GroupConstructorsLayout->addItem( spacer, 0, 1 ); - SMESHGUI_AddSubMeshDlgLayout->addWidget( GroupConstructors, 0, 0 ); - - /***************************************************************/ - GroupButtons = new QGroupBox( this, "GroupButtons" ); - GroupButtons->setGeometry( QRect( 10, 10, 281, 48 ) ); - GroupButtons->setTitle( tr( "" ) ); - GroupButtons->setColumnLayout(0, Qt::Vertical ); - GroupButtons->layout()->setSpacing( 0 ); - GroupButtons->layout()->setMargin( 0 ); - GroupButtonsLayout = new QGridLayout( GroupButtons->layout() ); - GroupButtonsLayout->setAlignment( Qt::AlignTop ); - GroupButtonsLayout->setSpacing( 6 ); - GroupButtonsLayout->setMargin( 11 ); - buttonCancel = new QPushButton( GroupButtons, "buttonCancel" ); - buttonCancel->setText( tr( "SMESH_BUT_CLOSE" ) ); - buttonCancel->setAutoDefault( TRUE ); - GroupButtonsLayout->addWidget( buttonCancel, 0, 3 ); - buttonApply = new QPushButton( GroupButtons, "buttonApply" ); - buttonApply->setText( tr( "SMESH_BUT_APPLY" ) ); - buttonApply->setAutoDefault( TRUE ); - GroupButtonsLayout->addWidget( buttonApply, 0, 1 ); - QSpacerItem* spacer_9 = new QSpacerItem( 20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum ); - GroupButtonsLayout->addItem( spacer_9, 0, 2 ); - buttonOk = new QPushButton( GroupButtons, "buttonOk" ); - buttonOk->setText( tr( "SMESH_BUT_OK" ) ); - buttonOk->setAutoDefault( TRUE ); - buttonOk->setDefault( TRUE ); - GroupButtonsLayout->addWidget( buttonOk, 0, 0 ); - SMESHGUI_AddSubMeshDlgLayout->addWidget( GroupButtons, 2, 0 ); - - /***************************************************************/ - GroupC1 = new QGroupBox( this, "GroupC1" ); - GroupC1->setTitle( tr( "SMESH_ARGUMENTS" ) ); - GroupC1->setMinimumSize( QSize( 0, 0 ) ); - GroupC1->setFrameShape( QGroupBox::Box ); - GroupC1->setFrameShadow( QGroupBox::Sunken ); + GroupC1 = new QGroupBox( tr( "SMESH_ARGUMENTS" ), this, "GroupC1" ); GroupC1->setColumnLayout(0, Qt::Vertical ); GroupC1->layout()->setSpacing( 0 ); GroupC1->layout()->setMargin( 0 ); - GroupC1Layout = new QGridLayout( GroupC1->layout() ); + QGridLayout* GroupC1Layout = new QGridLayout( GroupC1->layout() ); GroupC1Layout->setAlignment( Qt::AlignTop ); GroupC1Layout->setSpacing( 6 ); GroupC1Layout->setMargin( 11 ); - TextLabelC1A1 = new QLabel( GroupC1, "TextLabelC1A1" ); - TextLabelC1A1->setText( tr( "SMESH_OBJECT_MESH" ) ); - TextLabelC1A1->setMinimumSize( QSize( 50, 0 ) ); - TextLabelC1A1->setFrameShape( QLabel::NoFrame ); - TextLabelC1A1->setFrameShadow( QLabel::Plain ); - GroupC1Layout->addWidget( TextLabelC1A1, 0, 0 ); + TextLabel_NameMesh = new QLabel( tr( "SMESH_NAME" ), GroupC1, "TextLabel_NameMesh" ); + GroupC1Layout->addWidget( TextLabel_NameMesh, 0, 0 ); + LineEdit_NameMesh = new QLineEdit( GroupC1, "LineEdit_NameMesh" ); + GroupC1Layout->addWidget( LineEdit_NameMesh, 0, 2 ); + + TextLabelC1A1 = new QLabel( tr( "SMESH_OBJECT_MESH" ), GroupC1, "TextLabelC1A1" ); + GroupC1Layout->addWidget( TextLabelC1A1, 1, 0 ); SelectButtonC1A1 = new QPushButton( GroupC1, "SelectButtonC1A1" ); - SelectButtonC1A1->setText( tr( "" ) ); SelectButtonC1A1->setPixmap( image0 ); SelectButtonC1A1->setToggleButton( FALSE ); - GroupC1Layout->addWidget( SelectButtonC1A1, 0, 1 ); + GroupC1Layout->addWidget( SelectButtonC1A1, 1, 1 ); LineEditC1A1 = new QLineEdit( GroupC1, "LineEditC1A1" ); - GroupC1Layout->addWidget( LineEditC1A1, 0, 2 ); - - TextLabelC1A2 = new QLabel( GroupC1, "TextLabelC1A2" ); - TextLabelC1A2->setText( tr( "SMESH_OBJECT_GEOM" ) ); - TextLabelC1A2->setMinimumSize( QSize( 50, 0 ) ); - TextLabelC1A2->setFrameShape( QLabel::NoFrame ); - TextLabelC1A2->setFrameShadow( QLabel::Plain ); - GroupC1Layout->addWidget( TextLabelC1A2, 1, 0 ); + GroupC1Layout->addWidget( LineEditC1A1, 1, 2 ); + + TextLabelC1A2 = new QLabel( tr( "SMESH_OBJECT_GEOM" ), GroupC1, "TextLabelC1A2" ); + GroupC1Layout->addWidget( TextLabelC1A2, 2, 0 ); SelectButtonC1A2 = new QPushButton( GroupC1, "SelectButtonC1A2" ); - SelectButtonC1A2->setText( tr( "" ) ); SelectButtonC1A2->setPixmap( image0 ); SelectButtonC1A2->setToggleButton( FALSE ); - GroupC1Layout->addWidget( SelectButtonC1A2, 1, 1 ); + GroupC1Layout->addWidget( SelectButtonC1A2, 2, 1 ); LineEditC1A2 = new QLineEdit( GroupC1, "LineEditC1A2" ); - GroupC1Layout->addWidget( LineEditC1A2, 1, 2 ); - - TextLabel_NameMesh = new QLabel( GroupC1, "TextLabel_NameMesh" ); - TextLabel_NameMesh->setText( tr( "SMESH_NAME" ) ); - GroupC1Layout->addWidget( TextLabel_NameMesh, 2, 0 ); - LineEdit_NameMesh = new QLineEdit( GroupC1, "LineEdit_NameMesh" ); - GroupC1Layout->addWidget( LineEdit_NameMesh, 2, 2 ); + GroupC1Layout->addWidget( LineEditC1A2, 2, 2 ); - TextLabelC1A1Hyp = new QLabel( GroupC1, "TextLabelC1A1Hyp" ); - TextLabelC1A1Hyp->setText( tr( "SMESH_OBJECT_HYPOTHESIS" ) ); - TextLabelC1A1Hyp->setMinimumSize( QSize( 50, 0 ) ); - TextLabelC1A1Hyp->setFrameShape( QLabel::NoFrame ); - TextLabelC1A1Hyp->setFrameShadow( QLabel::Plain ); + TextLabelC1A1Hyp = new QLabel( tr( "SMESH_OBJECT_HYPOTHESIS" ), GroupC1, "TextLabelC1A1Hyp" ); GroupC1Layout->addWidget( TextLabelC1A1Hyp, 3, 0 ); SelectButtonC1A1Hyp = new QPushButton( GroupC1, "SelectButtonC1A1Hyp" ); - SelectButtonC1A1Hyp->setText( tr( "" ) ); SelectButtonC1A1Hyp->setPixmap( image0 ); GroupC1Layout->addWidget( SelectButtonC1A1Hyp, 3, 1 ); LineEditC1A1Hyp = new QLineEdit( GroupC1, "LineEditC1A1Hyp" ); - LineEditC1A1Hyp->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)3, (QSizePolicy::SizeType)0, LineEditC1A1Hyp->sizePolicy().hasHeightForWidth() ) ); GroupC1Layout->addWidget( LineEditC1A1Hyp, 3, 2 ); - TextLabelC1A1Algo = new QLabel( GroupC1, "TextLabelC1A1Algo" ); - TextLabelC1A1Algo->setText( tr( "SMESH_OBJECT_ALGORITHM" ) ); - TextLabelC1A1Algo->setMinimumSize( QSize( 50, 0 ) ); - TextLabelC1A1Algo->setFrameShape( QLabel::NoFrame ); - TextLabelC1A1Algo->setFrameShadow( QLabel::Plain ); + TextLabelC1A1Algo = new QLabel( tr( "SMESH_OBJECT_ALGORITHM" ), GroupC1, "TextLabelC1A1Algo" ); GroupC1Layout->addWidget( TextLabelC1A1Algo, 4, 0 ); SelectButtonC1A1Algo = new QPushButton( GroupC1, "SelectButtonC1A1Algo" ); - SelectButtonC1A1Algo->setText( tr( "" ) ); SelectButtonC1A1Algo->setPixmap( image0 ); GroupC1Layout->addWidget( SelectButtonC1A1Algo, 4, 1 ); LineEditC1A1Algo = new QLineEdit( GroupC1, "LineEditC1A1Algo" ); - LineEditC1A1Algo->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)3, (QSizePolicy::SizeType)0, LineEditC1A1Algo->sizePolicy().hasHeightForWidth() ) ); GroupC1Layout->addWidget( LineEditC1A1Algo, 4, 2 ); SMESHGUI_AddSubMeshDlgLayout->addWidget( GroupC1, 1, 0 ); + /***************************************************************/ + GroupButtons = new QGroupBox( this, "GroupButtons" ); + GroupButtons->setColumnLayout(0, Qt::Vertical ); + GroupButtons->layout()->setSpacing( 0 ); + GroupButtons->layout()->setMargin( 0 ); + QGridLayout* GroupButtonsLayout = new QGridLayout( GroupButtons->layout() ); + GroupButtonsLayout->setAlignment( Qt::AlignTop ); + GroupButtonsLayout->setSpacing( 6 ); + GroupButtonsLayout->setMargin( 11 ); - Init(Sel) ; + buttonOk = new QPushButton( tr( "SMESH_BUT_OK" ), GroupButtons, "buttonOk" ); + buttonOk->setAutoDefault( TRUE ); + buttonOk->setDefault( TRUE ); + GroupButtonsLayout->addWidget( buttonOk, 0, 0 ); + + buttonApply = new QPushButton( tr( "SMESH_BUT_APPLY" ), GroupButtons, "buttonApply" ); + buttonApply->setAutoDefault( TRUE ); + GroupButtonsLayout->addWidget( buttonApply, 0, 1 ); + + GroupButtonsLayout->addItem( new QSpacerItem( 20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum ), 0, 2 ); + + buttonCancel = new QPushButton( tr( "SMESH_BUT_CLOSE" ), GroupButtons, "buttonCancel" ); + buttonCancel->setAutoDefault( TRUE ); + GroupButtonsLayout->addWidget( buttonCancel, 0, 3 ); + + SMESHGUI_AddSubMeshDlgLayout->addWidget( GroupButtons, 2, 0 ); + + /***************************************************************/ + Init( Sel ) ; } @@ -220,60 +165,41 @@ SMESHGUI_AddSubMeshDlg::~SMESHGUI_AddSubMeshDlg() //================================================================================= void SMESHGUI_AddSubMeshDlg::Init( SALOME_Selection* Sel ) { - GroupC1->show(); - myConstructorId = 0 ; - Constructor1->setChecked( TRUE ); - myEditCurrentArgument = LineEditC1A1 ; mySelection = Sel; mySMESHGUI = SMESHGUI::GetSMESHGUI() ; mySMESHGUI->SetActiveDialogBox( (QDialog*)this ) ; - myGeomFilter = new SALOME_TypeFilter( "GEOM" ); - myMeshFilter = new SMESH_TypeFilter( MESH ); - - myAlgorithmFilter = new SMESH_TypeFilter( ALGORITHM ); + myGeomFilter = new SALOME_TypeFilter( "GEOM" ); + myMeshFilter = new SMESH_TypeFilter( MESH ); + myAlgorithmFilter = new SMESH_TypeFilter( ALGORITHM ); myHypothesisFilter = new SMESH_TypeFilter( HYPOTHESIS ); - myNameSubMesh = "SubMesh"; - - myGeomShape = GEOM::GEOM_Shape::_nil(); - myMesh = SMESH::SMESH_Mesh::_nil(); - /* signals and slots connections */ - connect( buttonOk, SIGNAL( clicked() ), this, SLOT( ClickOnOk() ) ); - connect( buttonApply, SIGNAL( clicked() ), this, SLOT(ClickOnApply() ) ); + connect( buttonOk, SIGNAL( clicked() ), this, SLOT( ClickOnOk() ) ); + connect( buttonApply, SIGNAL( clicked() ), this, SLOT( ClickOnApply() ) ); connect( buttonCancel, SIGNAL( clicked() ), this, SLOT( ClickOnCancel() ) ) ; - connect( GroupConstructors, SIGNAL(clicked(int) ), SLOT( ConstructorsClicked(int) ) ); - - connect( SelectButtonC1A1, SIGNAL (clicked() ), this, SLOT( SetEditCurrentArgument() ) ) ; - connect( SelectButtonC1A2, SIGNAL (clicked() ), this, SLOT( SetEditCurrentArgument() ) ) ; - connect( LineEdit_NameMesh, SIGNAL (textChanged(const QString&) ), this, SLOT( TextChangedInLineEdit(const QString&) ) ) ; - connect( SelectButtonC1A1Hyp, SIGNAL (clicked() ), this, SLOT( SetEditCurrentArgument() ) ) ; + connect( SelectButtonC1A1, SIGNAL (clicked() ), this, SLOT( SetEditCurrentArgument() ) ) ; + connect( SelectButtonC1A2, SIGNAL (clicked() ), this, SLOT( SetEditCurrentArgument() ) ) ; + connect( SelectButtonC1A1Hyp, SIGNAL (clicked() ), this, SLOT( SetEditCurrentArgument() ) ) ; connect( SelectButtonC1A1Algo, SIGNAL (clicked() ), this, SLOT( SetEditCurrentArgument() ) ) ; - connect( mySelection, SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) ); - connect( mySMESHGUI, SIGNAL ( SignalDeactivateActiveDialog() ), this, SLOT( DeactivateActiveDialog() ) ) ; - connect( mySMESHGUI, SIGNAL ( SignalCloseAllDialogs() ), this, SLOT( ClickOnCancel() ) ) ; + connect( mySelection, SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) ); + connect( mySMESHGUI, SIGNAL( SignalDeactivateActiveDialog() ), this, SLOT( DeactivateActiveDialog() ) ) ; + connect( mySMESHGUI, SIGNAL( SignalCloseAllDialogs() ), this, SLOT( ClickOnCancel() ) ) ; int x, y ; mySMESHGUI->DefineDlgPosition( this, x, y ) ; this->move( x, y ) ; this->show() ; - SelectionIntoArgument(); - - return ; -} - + LineEdit_NameMesh->setText( tr( "SMESH_SUBMESH" ) ); + LineEdit_NameMesh->setFocus() ; + myEditCurrentArgument = LineEditC1A1 ; + mySelection->ClearFilters() ; + mySelection->AddFilter( myMeshFilter ) ; -//================================================================================= -// function : ConstructorsClicked() -// purpose : Radio button management -//================================================================================= -void SMESHGUI_AddSubMeshDlg::ConstructorsClicked(int constructorId) -{ - return ; + SelectionIntoArgument(); } //================================================================================= @@ -282,50 +208,77 @@ void SMESHGUI_AddSubMeshDlg::ConstructorsClicked(int constructorId) //================================================================================= void SMESHGUI_AddSubMeshDlg::ClickOnOk() { - this->ClickOnApply() ; - this->ClickOnCancel() ; + if ( this->ClickOnApply() ) + this->ClickOnCancel() ; } //================================================================================= // function : ClickOnApply() // purpose : //================================================================================= -void SMESHGUI_AddSubMeshDlg::ClickOnApply() +bool SMESHGUI_AddSubMeshDlg::ClickOnApply() { - switch(myConstructorId) - { - case 0 : - { - if ( !myNameSubMesh.isEmpty() && !myNameSubMesh.isNull() && - !myGeomShape->_is_nil() && !myMesh->_is_nil()) { - mySubMesh = mySMESHGUI->AddSubMesh( myMesh, myGeomShape, myNameSubMesh ) ; - } - - if( myOkHypothesis && !mySubMesh->_is_nil() ) { - SALOME_ListIteratorOfListIO It( HypoList ); - for(;It.More();It.Next()) { - Handle(SALOME_InteractiveObject) IObject = It.Value(); - Standard_Boolean testResult; - myHypothesis = mySMESHGUI->ConvertIOinSMESHHypothesis(IObject, testResult) ; - if( testResult ) - mySMESHGUI->AddHypothesisOnSubMesh(mySubMesh, myHypothesis) ; + QString myNameSubMesh = LineEdit_NameMesh->text().stripWhiteSpace(); + if ( myNameSubMesh.isEmpty() ) { + QAD_MessageBox::warn1( this, tr( "SMESH_WRN_WARNING" ), tr( "SMESH_WRN_EMPTY_NAME" ), tr( "SMESH_BUT_OK" ) ); + return false; + } + + if ( myMesh->_is_nil() || myGeomShape->_is_nil() || ( !HypoList.count() && !AlgoList.count() ) ) + return false; + + SALOMEDS::SObject_var aMeshSO = mySMESHGUI->GetStudyAPI().FindObject( myMesh ); + GEOM::GEOM_Shape_var myMainShape = mySMESHGUI->GetStudyAPI().GetShapeOnMeshOrSubMesh( aMeshSO ); + if ( myMainShape->_is_nil() ) + return false; + + QAD_WaitCursor wc; + + QAD_Operation* op = new QAD_Operation( mySMESHGUI->GetActiveStudy() ); + + // start transaction + op->start(); + + // create submesh + SMESH::SMESH_subMesh_var aSubMesh = mySMESHGUI->AddSubMesh( myMesh, myGeomShape, myNameSubMesh ) ; + + if ( !aSubMesh->_is_nil() ) { + // assign hypotheses + for( int i = 0; i < HypoList.count(); i++ ) { + SALOMEDS::SObject_var aHypSO = mySMESHGUI->GetStudy()->FindObjectID( HypoList[i] ); + if ( !aHypSO->_is_nil() ) { + CORBA::Object_var anObject = aHypSO->GetObject(); + if ( !CORBA::is_nil( anObject ) ) { + SMESH::SMESH_Hypothesis_var aHyp = SMESH::SMESH_Hypothesis::_narrow( anObject ); + if ( !aHyp->_is_nil() ) + if ( !mySMESHGUI->AddHypothesisOnSubMesh( aSubMesh, aHyp ) ) { + // abort transaction + op->abort(); + return false; } } - - if( myOkAlgorithm && !mySubMesh->_is_nil() ) { - SALOME_ListIteratorOfListIO It( AlgoList ); - for(;It.More();It.Next()) { - Handle(SALOME_InteractiveObject) IObject = It.Value(); - Standard_Boolean testResult; - myAlgorithm = mySMESHGUI->ConvertIOinSMESHHypothesis(IObject, testResult) ; - if( testResult ) - mySMESHGUI->AddAlgorithmOnSubMesh(mySubMesh, myAlgorithm) ; + } + } + // assign algorithms + for( int i = 0; i < AlgoList.count(); i++ ) { + SALOMEDS::SObject_var aHypSO = mySMESHGUI->GetStudy()->FindObjectID( AlgoList[i] ); + if ( !aHypSO->_is_nil() ) { + CORBA::Object_var anObject = aHypSO->GetObject(); + if ( !CORBA::is_nil( anObject ) ) { + SMESH::SMESH_Hypothesis_var aHyp = SMESH::SMESH_Hypothesis::_narrow( anObject ); + if ( !aHyp->_is_nil() ) + if ( !mySMESHGUI->AddAlgorithmOnSubMesh( aSubMesh, aHyp ) ) { + // abort transaction + op->abort(); + return false; } } - - break ; } } + } + // commit transaction + op->finish(); + return true; } @@ -335,13 +288,20 @@ void SMESHGUI_AddSubMeshDlg::ClickOnApply() //================================================================================= void SMESHGUI_AddSubMeshDlg::ClickOnCancel() { - disconnect( mySelection, 0, this, 0 ); - mySMESHGUI->ResetState() ; - mySelection->ClearFilters() ; - reject() ; - return ; + close(); } +static bool IsFatherOf( SALOMEDS::SObject_ptr SO, SALOMEDS::SObject_ptr fatherSO ) { + if ( !SO->_is_nil() && !fatherSO->_is_nil() ) { + SALOMEDS::SObject_var aSO = SO->GetFather(); + while( strlen( aSO->GetID() ) >= strlen( fatherSO->GetID() ) ) { + if ( QString( aSO->GetID() ) == QString( fatherSO->GetID() ) ) + return true; + aSO = aSO->GetFather(); + } + } + return false; +} //================================================================================= // function : SelectionIntoArgument() @@ -349,81 +309,88 @@ void SMESHGUI_AddSubMeshDlg::ClickOnCancel() //================================================================================= void SMESHGUI_AddSubMeshDlg::SelectionIntoArgument() { - myEditCurrentArgument->setText("") ; + SMESHGUI_StudyAPI myStudyAPI = mySMESHGUI->GetStudyAPI(); QString aString = ""; int nbSel = mySMESHGUI->GetNameOfSelectedIObjects(mySelection, aString) ; - switch (myConstructorId) - { - case 0: - { - if ( myEditCurrentArgument == LineEditC1A1 ) { - if ( nbSel != 1 ) { - myOkHypothesis = false; - myOkAlgorithm = false; - return ; - } else { - Standard_Boolean testResult ; - Handle(SALOME_InteractiveObject) IO = mySelection->firstIObject() ; - myMesh = mySMESHGUI->ConvertIOinMesh(IO, testResult) ; - if( !testResult ) { - myMesh = SMESH::SMESH_Mesh::_nil(); - return ; - } - } - } else if ( myEditCurrentArgument == LineEditC1A2 ) { - if ( nbSel != 1 ) { - myOkHypothesis = false; - myOkAlgorithm = false; - return ; - } else { - Standard_Boolean testResult ; - Handle(SALOME_InteractiveObject) IO = mySelection->firstIObject() ; - myGeomShape = mySMESHGUI->ConvertIOinGEOMShape(IO, testResult) ; - if( !testResult ) { - myGeomShape = GEOM::GEOM_Shape::_nil(); - return ; - } - } - } else if ( myEditCurrentArgument == LineEditC1A1Hyp ) { - if ( nbSel >= 1 ) { - HypoList.Clear(); - SALOME_ListIteratorOfListIO Itinit( mySelection->StoredIObjects() ); - for (; Itinit.More(); Itinit.Next()) { - HypoList.Append(Itinit.Value()); - } - myOkHypothesis = true ; - if (nbSel > 1) - aString = tr("%1 Hypothesis").arg(nbSel) ; - LineEditC1A1Hyp->setText(aString) ; - } - else { - myOkHypothesis = false ; - return ; - } - } else if ( myEditCurrentArgument == LineEditC1A1Algo ) { - if ( nbSel >= 1 ) { - AlgoList.Clear(); - SALOME_ListIteratorOfListIO Itinit( mySelection->StoredIObjects() ); - for (; Itinit.More(); Itinit.Next()) { - AlgoList.Append(Itinit.Value()); - } - myOkAlgorithm = true ; - if (nbSel > 1) - aString = tr("%1 Algorithms").arg(nbSel) ; - LineEditC1A1Algo->setText(aString) ; - } - else { - myOkAlgorithm = false ; - return ; - } - } - break; + if ( myEditCurrentArgument == LineEditC1A1 ) { + // mesh + if ( nbSel != 1 ) { + myMesh = SMESH::SMESH_Mesh::_nil(); + aString = ""; + } + else { + Standard_Boolean testResult ; + Handle(SALOME_InteractiveObject) IO = mySelection->firstIObject() ; + myMesh = mySMESHGUI->ConvertIOinMesh(IO, testResult) ; + if( !testResult ) { + myMesh = SMESH::SMESH_Mesh::_nil(); + aString = ""; + } + } + myGeomShape = GEOM::GEOM_Shape::_nil(); + LineEditC1A2->setText( "" ); + } + else if ( myEditCurrentArgument == LineEditC1A2 ) { + // geom shape + if ( nbSel != 1 ) { + myGeomShape = GEOM::GEOM_Shape::_nil(); + aString = ""; + } + else { + Standard_Boolean testResult ; + Handle(SALOME_InteractiveObject) IO = mySelection->firstIObject() ; + myGeomShape = mySMESHGUI->ConvertIOinGEOMShape(IO, testResult) ; + if( !testResult ) { + myGeomShape = GEOM::GEOM_Shape::_nil(); + aString = ""; } + if ( !myMesh->_is_nil() ) { + SALOMEDS::SObject_var aMeshSO = myStudyAPI.FindObject( myMesh ); + GEOM::GEOM_Shape_var aMainGeomShape = myStudyAPI.GetShapeOnMeshOrSubMesh( aMeshSO ); + SALOMEDS::SObject_var aMainGeomShapeSO = myStudyAPI.FindObject( aMainGeomShape ); + if ( aMainGeomShapeSO->_is_nil() || !IsFatherOf( mySMESHGUI->GetStudy()->FindObjectID( IO->getEntry() ), aMainGeomShapeSO ) ) { + myGeomShape = GEOM::GEOM_Shape::_nil(); + aString = ""; + } + } + } + } + else if ( myEditCurrentArgument == LineEditC1A1Hyp ) { + // hypotheses + HypoList.clear(); + if ( nbSel >= 1 ) { + SALOME_ListIteratorOfListIO Itinit( mySelection->StoredIObjects() ); + for ( ; Itinit.More(); Itinit.Next() ) { + HypoList.append( Itinit.Value()->getEntry() ); + } + if ( nbSel > 1 ) + aString = tr( "%1 Hypothesis" ).arg( nbSel ) ; + } + else { + aString = ""; } + } + else if ( myEditCurrentArgument == LineEditC1A1Algo ) { + // algorithms + AlgoList.clear(); + if ( nbSel >= 1 ) { + SALOME_ListIteratorOfListIO Itinit( mySelection->StoredIObjects() ); + for ( ; Itinit.More(); Itinit.Next() ) { + AlgoList.append( Itinit.Value()->getEntry() ); + } + if ( nbSel > 1 ) + aString = tr( "%1 Algorithms" ).arg( nbSel ) ; + } + else { + aString = ""; + } + } myEditCurrentArgument->setText(aString) ; + + UpdateControlState(); } @@ -434,36 +401,28 @@ void SMESHGUI_AddSubMeshDlg::SelectionIntoArgument() void SMESHGUI_AddSubMeshDlg::SetEditCurrentArgument() { QPushButton* send = (QPushButton*)sender(); - switch (myConstructorId) - { - case 0: /* default constructor */ - { - if(send == SelectButtonC1A1) { - LineEditC1A1->setFocus() ; - myEditCurrentArgument = LineEditC1A1; - mySelection->ClearFilters() ; - mySelection->AddFilter(myMeshFilter) ; - } else if (send == SelectButtonC1A2) { - LineEditC1A2->setFocus() ; - myEditCurrentArgument = LineEditC1A2; - mySelection->ClearFilters() ; - mySelection->AddFilter(myGeomFilter) ; - } else if( send == SelectButtonC1A1Hyp ) { - LineEditC1A1Hyp->setFocus() ; - myEditCurrentArgument = LineEditC1A1Hyp ; - mySelection->ClearFilters() ; - mySelection->AddFilter(myHypothesisFilter) ; - } else if( send == SelectButtonC1A1Algo ) { - LineEditC1A1Algo->setFocus() ; - myEditCurrentArgument = LineEditC1A1Algo ; - mySelection->ClearFilters() ; - mySelection->AddFilter(myAlgorithmFilter) ; - } - SelectionIntoArgument() ; - break; - } - } - return ; + if(send == SelectButtonC1A1) { + LineEditC1A1->setFocus() ; + myEditCurrentArgument = LineEditC1A1; + mySelection->ClearFilters() ; + mySelection->AddFilter(myMeshFilter) ; + } else if (send == SelectButtonC1A2) { + LineEditC1A2->setFocus() ; + myEditCurrentArgument = LineEditC1A2; + mySelection->ClearFilters() ; + mySelection->AddFilter(myGeomFilter) ; + } else if( send == SelectButtonC1A1Hyp ) { + LineEditC1A1Hyp->setFocus() ; + myEditCurrentArgument = LineEditC1A1Hyp ; + mySelection->ClearFilters() ; + mySelection->AddFilter(myHypothesisFilter) ; + } else if( send == SelectButtonC1A1Algo ) { + LineEditC1A1Algo->setFocus() ; + myEditCurrentArgument = LineEditC1A1Algo ; + mySelection->ClearFilters() ; + mySelection->AddFilter(myAlgorithmFilter) ; + } + SelectionIntoArgument() ; } //================================================================================= @@ -472,9 +431,8 @@ void SMESHGUI_AddSubMeshDlg::SetEditCurrentArgument() //================================================================================= void SMESHGUI_AddSubMeshDlg::DeactivateActiveDialog() { - if ( GroupConstructors->isEnabled() ) { + if ( GroupC1->isEnabled() ) { disconnect( mySelection, 0, this, 0 ); - GroupConstructors->setEnabled(false) ; GroupC1->setEnabled(false) ; GroupButtons->setEnabled(false) ; } @@ -488,11 +446,9 @@ void SMESHGUI_AddSubMeshDlg::DeactivateActiveDialog() void SMESHGUI_AddSubMeshDlg::ActivateThisDialog() { mySMESHGUI->EmitSignalDeactivateDialog() ; - GroupConstructors->setEnabled(true) ; GroupC1->setEnabled(true) ; GroupButtons->setEnabled(true) ; connect ( mySelection, SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) ); - return ; } @@ -502,10 +458,8 @@ void SMESHGUI_AddSubMeshDlg::ActivateThisDialog() //================================================================================= void SMESHGUI_AddSubMeshDlg::enterEvent(QEvent* e) { - if ( GroupConstructors->isEnabled() ) - return ; - ActivateThisDialog() ; - return ; + if ( !GroupC1->isEnabled() ) + ActivateThisDialog() ; } @@ -515,21 +469,31 @@ void SMESHGUI_AddSubMeshDlg::enterEvent(QEvent* e) //================================================================================= void SMESHGUI_AddSubMeshDlg::closeEvent( QCloseEvent* e ) { - this->ClickOnCancel() ; - return ; + disconnect( mySelection, 0, this, 0 ); + mySMESHGUI->ResetState() ; + mySelection->ClearFilters() ; + QDialog::closeEvent( e ); } //================================================================================= -// function : TextChangedInLineEdit() +// function : UpdateControlState() // purpose : //================================================================================= -void SMESHGUI_AddSubMeshDlg::TextChangedInLineEdit(const QString& newText) -{ - QLineEdit* send = (QLineEdit*)sender(); - QString newT = strdup(newText) ; - - if (send == LineEdit_NameMesh) { - myNameSubMesh = newText; +void SMESHGUI_AddSubMeshDlg::UpdateControlState() +{ + bool isEnabled = ( !myMesh->_is_nil() && !myGeomShape->_is_nil() && ( HypoList.count() || AlgoList.count() ) ); + bool isImportedMesh = false; + if ( !myMesh->_is_nil() ) { + SALOMEDS::SObject_var aMeshSO = mySMESHGUI->GetStudyAPI().FindObject( myMesh ); + GEOM::GEOM_Shape_var myGeomShape = mySMESHGUI->GetStudyAPI().GetShapeOnMeshOrSubMesh( aMeshSO ); + isImportedMesh = myGeomShape->_is_nil(); } - return ; + + buttonOk ->setEnabled( isEnabled && !isImportedMesh ); + buttonApply->setEnabled( isEnabled && !isImportedMesh ); } + + + + + diff --git a/src/SMESHGUI/SMESHGUI_AddSubMeshDlg.h b/src/SMESHGUI/SMESHGUI_AddSubMeshDlg.h index 4d26275e0..a9e8d3efa 100644 --- a/src/SMESHGUI/SMESHGUI_AddSubMeshDlg.h +++ b/src/SMESHGUI/SMESHGUI_AddSubMeshDlg.h @@ -34,8 +34,8 @@ #include "SMESH_TypeFilter.hxx" // QT Includes -#include #include +#include // IDL Headers #include @@ -43,18 +43,12 @@ #include CORBA_SERVER_HEADER(GEOM_Shape) #include CORBA_SERVER_HEADER(SMESH_Mesh) -class QVBoxLayout; -class QHBoxLayout; -class QGridLayout; -class QButtonGroup; class QGroupBox; class QLabel; class QLineEdit; class QPushButton; -class QRadioButton; class SMESHGUI; - //================================================================================= // class : SMESHGUI_AddSubMeshDlg // purpose : @@ -67,44 +61,36 @@ public: SMESHGUI_AddSubMeshDlg( QWidget* parent = 0, const char* name = 0, SALOME_Selection* Sel = 0, bool modal = FALSE, WFlags fl = 0 ); ~SMESHGUI_AddSubMeshDlg(); -private: - - void Init( SALOME_Selection* Sel ) ; +protected: void closeEvent( QCloseEvent* e ) ; void enterEvent ( QEvent * ) ; +private: + void Init( SALOME_Selection* Sel ) ; + + void UpdateControlState(); + +private: SMESHGUI* mySMESHGUI ; SALOME_Selection* mySelection ; - GEOM::GEOM_Shape_var myGeomShape ; - int myConstructorId ; - QLineEdit* myEditCurrentArgument; - SMESH::SMESH_Mesh_var myMesh; - SMESH::SMESH_subMesh_var mySubMesh; - - QString myNameSubMesh ; + GEOM::GEOM_Shape_var myGeomShape ; + QLineEdit* myEditCurrentArgument; Handle(SALOME_TypeFilter) myGeomFilter; Handle(SMESH_TypeFilter) myMeshFilter; Handle(SMESH_TypeFilter) myHypothesisFilter; Handle(SMESH_TypeFilter) myAlgorithmFilter; - SALOME_ListIO HypoList; - SALOME_ListIO AlgoList; + QStringList HypoList; + QStringList AlgoList; - bool myOkHypothesis; - bool myOkAlgorithm; - - SMESH::SMESH_Hypothesis_var myHypothesis; - SMESH::SMESH_Hypothesis_var myAlgorithm; - - QButtonGroup* GroupConstructors; - QRadioButton* Constructor1; QGroupBox* GroupButtons; QPushButton* buttonOk; - QPushButton* buttonCancel; QPushButton* buttonApply; + QPushButton* buttonCancel; + QGroupBox* GroupC1; QLabel* TextLabel_NameMesh ; QLineEdit* LineEdit_NameMesh ; @@ -124,22 +110,13 @@ private: QLineEdit* LineEditC1A1Algo; private slots: - - void ConstructorsClicked(int constructorId); void ClickOnOk(); + bool ClickOnApply(); void ClickOnCancel(); - void ClickOnApply(); void SetEditCurrentArgument() ; void SelectionIntoArgument() ; void DeactivateActiveDialog() ; void ActivateThisDialog() ; - void TextChangedInLineEdit(const QString& newText) ; - -protected: - QGridLayout* SMESHGUI_AddSubMeshDlgLayout; - QGridLayout* GroupConstructorsLayout; - QGridLayout* GroupButtonsLayout; - QGridLayout* GroupC1Layout; }; #endif // DIALOGBOX_ADD_SUBMESH_H diff --git a/src/SMESHGUI/SMESHGUI_AddVolumeDlg.cxx b/src/SMESHGUI/SMESHGUI_AddVolumeDlg.cxx index 0ef1e42b0..8953903d5 100644 --- a/src/SMESHGUI/SMESHGUI_AddVolumeDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_AddVolumeDlg.cxx @@ -270,7 +270,7 @@ void SMESHGUI_AddVolumeDlg::ClickOnOk() //================================================================================= void SMESHGUI_AddVolumeDlg::ClickOnCancel() { - QAD_Application::getDesktop()->SetSelectionMode( 4 ); + QAD_Application::getDesktop()->SetSelectionMode( ActorSelection ); disconnect( mySelection, 0, this, 0 ); mySMESHGUI->ResetState() ; mySMESHGUI->EraseSimulationActors(); @@ -297,9 +297,9 @@ void SMESHGUI_AddVolumeDlg::SelectionIntoArgument() if(nbNodes < 1) return ; - if ( mySelection->SelectionMode() != 1 ) { + if ( mySelection->SelectionMode() != NodeSelection ) { QAD_MessageBox::warn1 ( QAD_Application::getDesktop(), tr ("SMESH_WRN_WARNING"), - tr ("SMESH_WRN_SELECTIONMODE_NODES"), tr ("SMESH_BUT_YES") ); + tr ("SMESH_WRN_SELECTIONMODE_NODES"), tr ("SMESH_BUT_OK") ); return; } diff --git a/src/SMESHGUI/SMESHGUI_DiagonalInversionDlg.cxx b/src/SMESHGUI/SMESHGUI_DiagonalInversionDlg.cxx index ad086e43e..bc76e32fb 100644 --- a/src/SMESHGUI/SMESHGUI_DiagonalInversionDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_DiagonalInversionDlg.cxx @@ -247,7 +247,7 @@ void SMESHGUI_DiagonalInversionDlg::ClickOnOk() //================================================================================= void SMESHGUI_DiagonalInversionDlg::ClickOnCancel() { - QAD_Application::getDesktop()->SetSelectionMode( 4 ); + QAD_Application::getDesktop()->SetSelectionMode( ActorSelection ); disconnect( mySelection, 0, this, 0 ); mySMESHGUI->ResetState() ; reject() ; @@ -265,7 +265,7 @@ void SMESHGUI_DiagonalInversionDlg::SelectionIntoArgument() myOkElements = false; QString aString = ""; - if ( mySelection->SelectionMode() != 2 ) { + if ( mySelection->SelectionMode() != EdgeSelection ) { return; } diff --git a/src/SMESHGUI/SMESHGUI_EditHypothesesDlg.cxx b/src/SMESHGUI/SMESHGUI_EditHypothesesDlg.cxx index 13f8197c4..7f8c99250 100644 --- a/src/SMESHGUI/SMESHGUI_EditHypothesesDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_EditHypothesesDlg.cxx @@ -33,20 +33,17 @@ using namespace std; #include "QAD_Application.h" #include "QAD_Desktop.h" +#include "QAD_WaitCursor.h" +#include "QAD_Operation.h" + #include "utilities.h" // QT Includes -#include #include #include #include #include -#include #include -#include -#include -#include -#include #include //VRV: porting on Qt 3.0.5 @@ -55,6 +52,38 @@ using namespace std; #endif //VRV: porting on Qt 3.0.5 +class ListBoxIOR : public QListBoxText +{ +public: + enum { RTTI_IOR = 1000 }; + +public: + ListBoxIOR( QListBox* listbox, + const char* ior, + const QString& text = QString::null) + : QListBoxText( listbox, text ), myIOR( ior ) {} + virtual ~ListBoxIOR() {}; + virtual int rtti() const { return RTTI_IOR; } + const char* GetIOR() { return myIOR.c_str(); } + +private: + string myIOR; +}; + +#define ALLOW_CHANGE_SHAPE 0 + +int findItem( QListBox* listBox, const string& ior ) +{ + for ( int i = 0; i < listBox->count(); i++ ) { + if ( listBox->item( i )->rtti() == ListBoxIOR::RTTI_IOR ) { + ListBoxIOR* anItem = ( ListBoxIOR* )( listBox->item( i ) ); + if ( anItem && ior == string( anItem->GetIOR() ) ) + return i; + } + } + return -1; +} + //================================================================================= // class : SMESHGUI_EditHypothesesDlg() // purpose : Constructs a SMESHGUI_EditHypothesesDlg which is a child of 'parent', with the @@ -63,238 +92,131 @@ using namespace std; // TRUE to construct a modal dialog. //================================================================================= SMESHGUI_EditHypothesesDlg::SMESHGUI_EditHypothesesDlg( QWidget* parent, const char* name, SALOME_Selection* Sel, bool modal, WFlags fl ) - : QDialog( parent, name, modal, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu ) + : QDialog( parent, name, modal, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu | WDestructiveClose ), + myImportedMesh( false ) { - QPixmap image1(QAD_Desktop::getResourceManager()->loadPixmap( "SMESH",tr("ICON_DLG_EDIT_MESH"))); QPixmap image0(QAD_Desktop::getResourceManager()->loadPixmap( "SMESH",tr("ICON_SELECT"))); if ( !name ) - setName( "SMESHGUI_EditHypothesesDlg" ); - resize( 417, 573 ); + setName( "SMESHGUI_EditHypothesesDlg" ); setCaption( tr( "SMESH_EDIT_HYPOTHESES" ) ); setSizeGripEnabled( TRUE ); - SMESHGUI_EditHypothesesDlgLayout = new QGridLayout( this ); + QGridLayout* SMESHGUI_EditHypothesesDlgLayout = new QGridLayout( this ); SMESHGUI_EditHypothesesDlgLayout->setSpacing( 6 ); SMESHGUI_EditHypothesesDlgLayout->setMargin( 11 ); /***************************************************************/ - GroupConstructors = new QButtonGroup( this, "GroupConstructors" ); - GroupConstructors->setTitle( tr( "SMESH_HYPOTHESES" ) ); - GroupConstructors->setExclusive( TRUE ); - GroupConstructors->setColumnLayout(0, Qt::Vertical ); - GroupConstructors->layout()->setSpacing( 0 ); - GroupConstructors->layout()->setMargin( 0 ); - GroupConstructorsLayout = new QGridLayout( GroupConstructors->layout() ); - GroupConstructorsLayout->setAlignment( Qt::AlignTop ); - GroupConstructorsLayout->setSpacing( 6 ); - GroupConstructorsLayout->setMargin( 11 ); - Constructor1 = new QRadioButton( GroupConstructors, "Constructor1" ); - Constructor1->setText( tr( "" ) ); - Constructor1->setPixmap( image1 ); - Constructor1->setChecked( TRUE ); - Constructor1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)1, (QSizePolicy::SizeType)0, Constructor1->sizePolicy().hasHeightForWidth() ) ); - Constructor1->setMinimumSize( QSize( 50, 0 ) ); - GroupConstructorsLayout->addWidget( Constructor1, 0, 0 ); - QSpacerItem* spacer = new QSpacerItem( 20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum ); - GroupConstructorsLayout->addItem( spacer, 0, 1 ); - SMESHGUI_EditHypothesesDlgLayout->addWidget( GroupConstructors, 0, 0 ); - - /***************************************************************/ - GroupButtons = new QGroupBox( this, "GroupButtons" ); - GroupButtons->setGeometry( QRect( 10, 10, 281, 96 ) ); - GroupButtons->setTitle( tr( "" ) ); - GroupButtons->setColumnLayout(0, Qt::Vertical ); - GroupButtons->layout()->setSpacing( 0 ); - GroupButtons->layout()->setMargin( 0 ); - GroupButtonsLayout = new QGridLayout( GroupButtons->layout() ); - GroupButtonsLayout->setAlignment( Qt::AlignTop ); - GroupButtonsLayout->setSpacing( 6 ); - GroupButtonsLayout->setMargin( 11 ); - buttonCancel = new QPushButton( GroupButtons, "buttonCancel" ); - buttonCancel->setText( tr( "SMESH_BUT_CLOSE" ) ); - buttonCancel->setAutoDefault( TRUE ); - buttonCancel->setDefault( TRUE ); - buttonCancel->setEnabled( TRUE ) ; - - GroupButtonsLayout->addWidget( buttonCancel, 0, 3 ); - buttonApply = new QPushButton( GroupButtons, "buttonApply" ); - buttonApply->setText( tr( "SMESH_BUT_APPLY" ) ); - buttonApply->setAutoDefault( TRUE ); - buttonApply->setDefault( FALSE ); - buttonApply->setEnabled( FALSE ) ; - - GroupButtonsLayout->addWidget( buttonApply, 0, 1 ); - QSpacerItem* spacer_9 = new QSpacerItem( 20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum ); - GroupButtonsLayout->addItem( spacer_9, 0, 2 ); - buttonOk = new QPushButton( GroupButtons, "buttonOk" ); - buttonOk->setText( tr( "SMESH_BUT_OK" ) ); - - buttonOk->setAutoDefault( TRUE ); - buttonOk->setDefault( FALSE ); - buttonOk->setEnabled( FALSE ) ; - - GroupButtonsLayout->addWidget( buttonOk, 0, 0 ); - SMESHGUI_EditHypothesesDlgLayout->addWidget( GroupButtons, 5, 0 ); - - /***************************************************************/ - GroupC1 = new QGroupBox( this, "GroupC1" ); - GroupC1->setTitle( tr( "SMESH_ARGUMENTS" ) ); - GroupC1->setMinimumSize( QSize( 0, 0 ) ); - GroupC1->setFrameShape( QGroupBox::Box ); - GroupC1->setFrameShadow( QGroupBox::Sunken ); + GroupC1 = new QGroupBox( tr( "SMESH_ARGUMENTS" ), this, "GroupC1" ); GroupC1->setColumnLayout(0, Qt::Vertical ); GroupC1->layout()->setSpacing( 0 ); GroupC1->layout()->setMargin( 0 ); - GroupC1Layout = new QGridLayout( GroupC1->layout() ); + QGridLayout* GroupC1Layout = new QGridLayout( GroupC1->layout() ); GroupC1Layout->setAlignment( Qt::AlignTop ); GroupC1Layout->setSpacing( 6 ); GroupC1Layout->setMargin( 11 ); - TextLabelC1A1 = new QLabel( GroupC1, "TextLabelC1A1" ); - TextLabelC1A1->setText( tr( "SMESH_OBJECT_MESHorSUBMESH" ) ); - TextLabelC1A1->setMinimumSize( QSize( 50, 0 ) ); - TextLabelC1A1->setFrameShape( QLabel::NoFrame ); - TextLabelC1A1->setFrameShadow( QLabel::Plain ); + TextLabelC1A1 = new QLabel( tr( "SMESH_OBJECT_MESHorSUBMESH" ), GroupC1, "TextLabelC1A1" ); GroupC1Layout->addWidget( TextLabelC1A1, 0, 0 ); SelectButtonC1A1 = new QPushButton( GroupC1, "SelectButtonC1A1" ); - SelectButtonC1A1->setText( tr( "" ) ); SelectButtonC1A1->setPixmap( image0 ); - SelectButtonC1A1->setToggleButton( FALSE ); GroupC1Layout->addWidget( SelectButtonC1A1, 0, 1 ); LineEditC1A1 = new QLineEdit( GroupC1, "LineEditC1A1" ); GroupC1Layout->addWidget( LineEditC1A1, 0, 2 ); - TextLabelC1A2 = new QLabel( GroupC1, "TextLabelC1A2" ); - TextLabelC1A2->setText( tr( "SMESH_OBJECT_GEOM" ) ); - TextLabelC1A2->setMinimumSize( QSize( 50, 0 ) ); - TextLabelC1A2->setFrameShape( QLabel::NoFrame ); - TextLabelC1A2->setFrameShadow( QLabel::Plain ); + TextLabelC1A2 = new QLabel( tr( "SMESH_OBJECT_GEOM" ), GroupC1, "TextLabelC1A2" ); GroupC1Layout->addWidget( TextLabelC1A2, 1, 0 ); SelectButtonC1A2 = new QPushButton( GroupC1, "SelectButtonC1A2" ); - SelectButtonC1A2->setText( tr( "" ) ); SelectButtonC1A2->setPixmap( image0 ); SelectButtonC1A2->setToggleButton( FALSE ); GroupC1Layout->addWidget( SelectButtonC1A2, 1, 1 ); LineEditC1A2 = new QLineEdit( GroupC1, "LineEditC1A2" ); GroupC1Layout->addWidget( LineEditC1A2, 1, 2 ); - GroupHypotheses = new QGroupBox( this, "GroupHypotheses" ); - GroupHypotheses->setTitle( tr( "SMESH_HYPOTHESES" ) ); + SMESHGUI_EditHypothesesDlgLayout->addWidget( GroupC1, 0, 0 ); + + /***************************************************************/ + GroupHypotheses = new QGroupBox( tr( "SMESH_HYPOTHESES" ), this, "GroupHypotheses" ); GroupHypotheses->setColumnLayout(0, Qt::Vertical ); GroupHypotheses->layout()->setSpacing( 0 ); GroupHypotheses->layout()->setMargin( 0 ); - grid_3 = new QGridLayout( GroupHypotheses->layout() ); - grid_3->setGeometry( QRect( 12, 18, 139, 110 ) ); + QGridLayout* grid_3 = new QGridLayout( GroupHypotheses->layout() ); grid_3->setAlignment( Qt::AlignTop ); grid_3->setSpacing( 6 ); grid_3->setMargin( 11 ); - hbox_2 = new QHBoxLayout; - hbox_2->setSpacing( 6 ); - hbox_2->setMargin( 0 ); - - vbox = new QVBoxLayout; - vbox->setSpacing( 6 ); - vbox->setMargin( 0 ); - - TextHypDefinition = new QLabel( GroupHypotheses, "TextHypDefinition" ); - TextHypDefinition->setText( tr( "SMESH_AVAILABLE" ) ); - vbox->addWidget( TextHypDefinition ); + TextHypDefinition = new QLabel( tr( "SMESH_AVAILABLE" ), GroupHypotheses, "TextHypDefinition" ); + grid_3->addWidget( TextHypDefinition, 0, 0 ); ListHypDefinition = new QListBox( GroupHypotheses, "ListHypDefinition" ); - ListHypDefinition->setMinimumSize( 100, 50); -// ListHypDefinition->setRowMode(4); -// ListHypDefinition->setRowMode( QListBox::FixedNumber ); -// ListHypDefinition->setLineWidth( 4 ); -// ListHypDefinition->setColumnMode( QListBox::Variable ); -// ListHypDefinition->setVariableHeight( FALSE ); -// ListHypDefinition->insertItem( tr( "New Item" ) ); - vbox->addWidget( ListHypDefinition ); - hbox_2->addLayout( vbox ); - - vbox_2 = new QVBoxLayout; - vbox_2->setSpacing( 6 ); - vbox_2->setMargin( 0 ); - - TextHypAssignation = new QLabel( GroupHypotheses, "TextHypAssignation" ); - TextHypAssignation->setText( tr( "SMESH_EDIT_USED" ) ); - vbox_2->addWidget( TextHypAssignation ); + ListHypDefinition->setMinimumSize( 100, 100 ); + grid_3->addWidget( ListHypDefinition, 1, 0 ); + + TextHypAssignation = new QLabel( tr( "SMESH_EDIT_USED" ), GroupHypotheses, "TextHypAssignation" ); + grid_3->addWidget( TextHypAssignation, 0, 1 ); ListHypAssignation = new QListBox( GroupHypotheses, "ListHypAssignation" ); - ListHypAssignation->setMinimumSize( 100, 50); -// ListHypAssignation->setRowMode(4); -// ListHypAssignation->setRowMode( QListBox::FixedNumber ); -// ListHypAssignation->setLineWidth( 4 ); -// ListHypAssignation->setColumnMode( QListBox::Variable ); -// ListHypAssignation->setVariableHeight( FALSE ); -// ListHypAssignation->insertItem( tr( "New Item" ) ); - vbox_2->addWidget( ListHypAssignation ); - hbox_2->addLayout( vbox_2 ); - - grid_3->addLayout( hbox_2, 0, 0 ); - - SMESHGUI_EditHypothesesDlgLayout->addWidget( GroupHypotheses, 2, 0 ); - - GroupAlgorithms = new QGroupBox( this, "GroupAlgorithms" ); - GroupAlgorithms->setTitle( tr( "SMESH_ADD_ALGORITHM" ) ); + ListHypAssignation->setMinimumSize( 100, 100 ); + grid_3->addWidget( ListHypAssignation, 1, 1 ); + + SMESHGUI_EditHypothesesDlgLayout->addWidget( GroupHypotheses, 1, 0 ); + + /***************************************************************/ + GroupAlgorithms = new QGroupBox( tr( "SMESH_ADD_ALGORITHM" ), this, "GroupAlgorithms" ); GroupAlgorithms->setColumnLayout(0, Qt::Vertical ); GroupAlgorithms->layout()->setSpacing( 0 ); GroupAlgorithms->layout()->setMargin( 0 ); - grid_4 = new QGridLayout( GroupAlgorithms->layout() ); - grid_4->setGeometry( QRect( 12, 18, 139, 110 ) ); + QGridLayout* grid_4 = new QGridLayout( GroupAlgorithms->layout() ); grid_4->setAlignment( Qt::AlignTop ); grid_4->setSpacing( 6 ); grid_4->setMargin( 11 ); - hbox_3 = new QHBoxLayout; - hbox_3->setSpacing( 6 ); - hbox_3->setMargin( 0 ); - - vbox_3 = new QVBoxLayout; - vbox_3->setSpacing( 6 ); - vbox_3->setMargin( 0 ); - - TextAlgoDefinition = new QLabel( GroupAlgorithms, "TextAlgoDefinition" ); - TextAlgoDefinition->setText( tr( "SMESH_AVAILABLE" ) ); - vbox_3->addWidget( TextAlgoDefinition ); + TextAlgoDefinition = new QLabel( tr( "SMESH_AVAILABLE" ), GroupAlgorithms, "TextAlgoDefinition" ); + grid_4->addWidget( TextAlgoDefinition, 0, 0 ); ListAlgoDefinition = new QListBox( GroupAlgorithms, "ListAlgoDefinition" ); - ListAlgoDefinition->setMinimumSize( 100, 50); -// ListAlgoDefinition->setRowMode(4); -// ListAlgoDefinition->setRowMode( QListBox::FixedNumber ); -// ListAlgoDefinition->setLineWidth( 4 ); -// ListAlgoDefinition->setColumnMode( QListBox::Variable ); -// ListAlgoDefinition->setVariableHeight( FALSE ); -// ListAlgoDefinition->insertItem( tr( "New Item" ) ); - vbox_3->addWidget( ListAlgoDefinition ); - hbox_3->addLayout( vbox_3 ); - - vbox_4 = new QVBoxLayout; - vbox_4->setSpacing( 6 ); - vbox_4->setMargin( 0 ); - - TextAlgoAssignation = new QLabel( GroupAlgorithms, "TextAlgoAssignation" ); - TextAlgoAssignation->setText( tr( "SMESH_EDIT_USED" ) ); - vbox_4->addWidget( TextAlgoAssignation ); + ListAlgoDefinition->setMinimumSize( 100, 100 ); + grid_4->addWidget( ListAlgoDefinition, 1, 0 ); + + TextAlgoAssignation = new QLabel( tr( "SMESH_EDIT_USED" ), GroupAlgorithms, "TextAlgoAssignation" ); + grid_4->addWidget( TextAlgoAssignation, 0, 1 ); ListAlgoAssignation = new QListBox( GroupAlgorithms, "ListAlgoAssignation" ); - ListAlgoAssignation ->setMinimumSize( 100, 50); -// ListAlgoAssignation->setRowMode(4); -// ListAlgoAssignation->setRowMode( QListBox::FixedNumber ); -// ListAlgoAssignation->setLineWidth( 4 ); -// ListAlgoAssignation->setColumnMode( QListBox::Variable ); -// ListAlgoAssignation->setVariableHeight( FALSE ); -// ListAlgoAssignation->insertItem( tr( "New Item" ) ); - vbox_4->addWidget( ListAlgoAssignation ); - hbox_3->addLayout( vbox_4 ); - - grid_4->addLayout( hbox_3, 0, 0 ); - SMESHGUI_EditHypothesesDlgLayout->addWidget( GroupAlgorithms, 3, 0 ); - - SMESHGUI_EditHypothesesDlgLayout->addWidget( GroupC1, 1, 0 ); + ListAlgoAssignation ->setMinimumSize( 100, 100 ); + grid_4->addWidget( ListAlgoAssignation, 1, 1 ); + + SMESHGUI_EditHypothesesDlgLayout->addWidget( GroupAlgorithms, 2, 0 ); + /***************************************************************/ + GroupButtons = new QGroupBox( this, "GroupButtons" ); + GroupButtons->setColumnLayout(0, Qt::Vertical ); + GroupButtons->layout()->setSpacing( 0 ); + GroupButtons->layout()->setMargin( 0 ); + QGridLayout* GroupButtonsLayout = new QGridLayout( GroupButtons->layout() ); + GroupButtonsLayout->setAlignment( Qt::AlignTop ); + GroupButtonsLayout->setSpacing( 6 ); + GroupButtonsLayout->setMargin( 11 ); - Init(Sel) ; + buttonOk = new QPushButton( tr( "SMESH_BUT_OK" ), GroupButtons, "buttonOk" ); + buttonOk->setAutoDefault( TRUE ); + buttonOk->setDefault( FALSE ); + GroupButtonsLayout->addWidget( buttonOk, 0, 0 ); + + buttonApply = new QPushButton( tr( "SMESH_BUT_APPLY" ), GroupButtons, "buttonApply" ); + buttonApply->setAutoDefault( TRUE ); + buttonApply->setDefault( FALSE ); + GroupButtonsLayout->addWidget( buttonApply, 0, 1 ); + + GroupButtonsLayout->addItem( new QSpacerItem( 20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum ), 0, 2 ); + + buttonCancel = new QPushButton( tr( "SMESH_BUT_CLOSE" ), GroupButtons, "buttonCancel" ); + buttonCancel->setAutoDefault( TRUE ); + buttonCancel->setDefault( TRUE ); + buttonCancel->setEnabled( TRUE ) ; + GroupButtonsLayout->addWidget( buttonCancel, 0, 3 ); + + SMESHGUI_EditHypothesesDlgLayout->addWidget( GroupButtons, 4, 0 ); + /***************************************************************/ + Init(Sel) ; } @@ -314,10 +236,6 @@ SMESHGUI_EditHypothesesDlg::~SMESHGUI_EditHypothesesDlg() //================================================================================= void SMESHGUI_EditHypothesesDlg::Init( SALOME_Selection* Sel ) { - GroupC1->show(); - myConstructorId = 0 ; - Constructor1->setChecked( TRUE ); - myEditCurrentArgument = LineEditC1A1 ; mySelection = Sel; mySMESHGUI = SMESHGUI::GetSMESHGUI() ; mySMESHGUI->SetActiveDialogBox( (QDialog*)this ) ; @@ -325,9 +243,6 @@ void SMESHGUI_EditHypothesesDlg::Init( SALOME_Selection* Sel ) InitHypDefinition(); InitAlgoDefinition(); - InitHypAssignation(); - InitAlgoAssignation(); - myGeomFilter = new SALOME_TypeFilter( "GEOM" ); myMeshOrSubMeshFilter = new SMESH_TypeFilter( MESHorSUBMESH ); @@ -336,52 +251,87 @@ void SMESHGUI_EditHypothesesDlg::Init( SALOME_Selection* Sel ) mySubMesh = SMESH::SMESH_subMesh::_nil(); /* signals and slots connections */ - connect( buttonCancel, SIGNAL( clicked() ), this, SLOT( ClickOnCancel() ) ) ; - connect( GroupConstructors, SIGNAL(clicked(int) ), SLOT( ConstructorsClicked(int) ) ); + connect( buttonOk, SIGNAL( clicked() ), this, SLOT( ClickOnOk() ) ); + connect( buttonApply, SIGNAL( clicked() ), this, SLOT( ClickOnApply() ) ); + connect( buttonCancel, SIGNAL( clicked() ), this, SLOT( ClickOnCancel() ) ); - connect( SelectButtonC1A1, SIGNAL (clicked() ), this, SLOT( SetEditCurrentArgument() ) ) ; - connect( SelectButtonC1A2, SIGNAL (clicked() ), this, SLOT( SetEditCurrentArgument() ) ) ; + connect( SelectButtonC1A1, SIGNAL (clicked() ), this, SLOT( SetEditCurrentArgument() ) ) ; + connect( SelectButtonC1A2, SIGNAL (clicked() ), this, SLOT( SetEditCurrentArgument() ) ) ; - connect( mySelection, SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) ); - connect( mySMESHGUI, SIGNAL ( SignalDeactivateActiveDialog() ), this, SLOT( DeactivateActiveDialog() ) ) ; - connect( mySMESHGUI, SIGNAL ( SignalCloseAllDialogs() ), this, SLOT( ClickOnCancel() ) ) ; + connect( mySelection, SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) ); + connect( mySMESHGUI, SIGNAL( SignalDeactivateActiveDialog() ), this, SLOT( DeactivateActiveDialog() ) ) ; + connect( mySMESHGUI, SIGNAL( SignalCloseAllDialogs() ), this, SLOT( ClickOnCancel() ) ) ; - connect( ListHypAssignation, SIGNAL( clicked(QListBoxItem*) ), this, SLOT( removeItem(QListBoxItem*) ) ); - connect( ListAlgoAssignation, SIGNAL( clicked(QListBoxItem*) ), this, SLOT( removeItem(QListBoxItem*) ) ); + connect( ListHypAssignation, SIGNAL( doubleClicked(QListBoxItem*) ), this, SLOT( removeItem(QListBoxItem*) ) ); + connect( ListAlgoAssignation, SIGNAL( doubleClicked(QListBoxItem*) ), this, SLOT( removeItem(QListBoxItem*) ) ); - connect( ListHypDefinition, SIGNAL( clicked(QListBoxItem*) ), this, SLOT( addItem(QListBoxItem*) ) ); - connect( ListAlgoDefinition, SIGNAL( clicked(QListBoxItem*) ), this, SLOT( addItem(QListBoxItem*) ) ); + connect( ListHypDefinition, SIGNAL( doubleClicked(QListBoxItem*) ), this, SLOT( addItem(QListBoxItem*) ) ); + connect( ListAlgoDefinition, SIGNAL( doubleClicked(QListBoxItem*) ), this, SLOT( addItem(QListBoxItem*) ) ); int x, y ; mySMESHGUI->DefineDlgPosition( this, x, y ) ; this->move( x, y ) ; this->show() ; + + LineEditC1A1->setFocus() ; + myEditCurrentArgument = LineEditC1A1; + mySelection->ClearFilters() ; + mySelection->AddFilter(myMeshOrSubMeshFilter) ; + SelectionIntoArgument(); - return ; + UpdateControlState(); } //================================================================================= -// function : ConstructorsClicked() -// purpose : Radio button management +// function : ClickOnOk() +// purpose : //================================================================================= -void SMESHGUI_EditHypothesesDlg::ConstructorsClicked(int constructorId) +void SMESHGUI_EditHypothesesDlg::ClickOnOk() { - return ; + if ( ClickOnApply() ) + ClickOnCancel() ; } +//================================================================================= +// function : ClickOnApply() +// purpose : +//================================================================================= +bool SMESHGUI_EditHypothesesDlg::ClickOnApply() +{ + bool aRes = false; + + QAD_WaitCursor wc; + + QAD_Operation* op = new QAD_Operation( mySMESHGUI->GetActiveStudy() ); + + // start transaction + op->start(); + + if ( !myMesh->_is_nil() ) + aRes = StoreMesh(); + else if ( !mySubMesh->_is_nil() ) + aRes = StoreSubMesh(); + + if ( aRes ) + // commit transaction + op->finish(); + else + // abort transaction + op->abort(); + + return aRes; +} + + //================================================================================= // function : ClickOnCancel() // purpose : //================================================================================= void SMESHGUI_EditHypothesesDlg::ClickOnCancel() { - disconnect( mySelection, 0, this, 0 ); - mySMESHGUI->ResetState() ; - mySelection->ClearFilters() ; - reject() ; - return ; + close(); } @@ -391,75 +341,52 @@ void SMESHGUI_EditHypothesesDlg::ClickOnCancel() //================================================================================= void SMESHGUI_EditHypothesesDlg::SelectionIntoArgument() { - myEditCurrentArgument->setText("") ; QString aString = ""; int nbSel = mySMESHGUI->GetNameOfSelectedIObjects(mySelection, aString) ; - - switch (myConstructorId) - { - case 0: - { - if ( myEditCurrentArgument == LineEditC1A1 ) { - if ( nbSel != 1 ) { - myOkHypothesis = false; - myOkAlgorithm = false; - myMesh = SMESH::SMESH_Mesh::_nil(); - mySubMesh = SMESH::SMESH_subMesh::_nil(); - InitHypAssignation(); - InitAlgoAssignation(); - InitGeom(); - return ; - } else { - Standard_Boolean testResult ; - Handle(SALOME_InteractiveObject) IO = mySelection->firstIObject() ; - myMesh = mySMESHGUI->ConvertIOinMesh(IO, testResult) ; - if( !testResult ) { - myMesh = SMESH::SMESH_Mesh::_nil(); - - mySubMesh = mySMESHGUI->ConvertIOinSubMesh(IO, testResult) ; - if( !testResult ) { - mySubMesh = SMESH::SMESH_subMesh::_nil(); - InitHypAssignation(); - InitAlgoAssignation(); - InitGeom(); - return ; - } - } - InitHypAssignation(); - InitAlgoAssignation(); - InitGeom(); - } - } else if ( myEditCurrentArgument == LineEditC1A2 ) { - if ( nbSel != 1 ) { - myOkHypothesis = false; - myOkAlgorithm = false; - myGeomShape = GEOM::GEOM_Shape::_nil(); - InitHypAssignation(); - InitAlgoAssignation(); - InitGeom(); - return ; - } else { - Standard_Boolean testResult ; - Handle(SALOME_InteractiveObject) IO = mySelection->firstIObject() ; - myGeomShape = mySMESHGUI->ConvertIOinGEOMShape(IO, testResult) ; - if( !testResult ) { - myGeomShape = GEOM::GEOM_Shape::_nil(); - InitHypAssignation(); - InitAlgoAssignation(); - InitGeom(); - return ; - } - InitHypAssignation(); - InitAlgoAssignation(); - InitGeom(); - } - } - break; + + if ( myEditCurrentArgument == LineEditC1A1 ) { + if ( nbSel != 1 ) { + myMesh = SMESH::SMESH_Mesh::_nil(); + mySubMesh = SMESH::SMESH_subMesh::_nil(); + aString = ""; + } else { + Standard_Boolean testResult ; + Handle(SALOME_InteractiveObject) IO = mySelection->firstIObject() ; + myMesh = mySMESHGUI->ConvertIOinMesh(IO, testResult) ; + if( !testResult ) { + myMesh = SMESH::SMESH_Mesh::_nil(); + mySubMesh = mySMESHGUI->ConvertIOinSubMesh(IO, testResult) ; + if( !testResult ) { + mySubMesh = SMESH::SMESH_subMesh::_nil(); + aString = ""; + } } } - - myEditCurrentArgument->setText(aString) ; + myEditCurrentArgument->setText( aString ); + + myGeomShape = GEOM::GEOM_Shape::_nil(); // InitGeom() will try to retrieve a shape from myMesh or mySubMesh + InitGeom(); + + myImportedMesh = myGeomShape->_is_nil(); + + InitHypAssignation(); + InitAlgoAssignation(); + } + else if ( myEditCurrentArgument == LineEditC1A2 ) { + if ( nbSel != 1 ) + myGeomShape = GEOM::GEOM_Shape::_nil(); + else { + Standard_Boolean testResult ; + Handle(SALOME_InteractiveObject) IO = mySelection->firstIObject() ; + myGeomShape = mySMESHGUI->ConvertIOinGEOMShape(IO, testResult) ; + if( !testResult ) + myGeomShape = GEOM::GEOM_Shape::_nil(); + } + InitGeom(); + } + + UpdateControlState(); } @@ -470,26 +397,18 @@ void SMESHGUI_EditHypothesesDlg::SelectionIntoArgument() void SMESHGUI_EditHypothesesDlg::SetEditCurrentArgument() { QPushButton* send = (QPushButton*)sender(); - switch (myConstructorId) - { - case 0: /* default constructor */ - { - if(send == SelectButtonC1A1) { - LineEditC1A1->setFocus() ; - myEditCurrentArgument = LineEditC1A1; - mySelection->ClearFilters() ; - mySelection->AddFilter(myMeshOrSubMeshFilter) ; - } else if (send == SelectButtonC1A2) { - LineEditC1A2->setFocus() ; - myEditCurrentArgument = LineEditC1A2; - mySelection->ClearFilters() ; - mySelection->AddFilter(myGeomFilter) ; - } - SelectionIntoArgument() ; - break; - } - } - return ; + if(send == SelectButtonC1A1) { + LineEditC1A1->setFocus() ; + myEditCurrentArgument = LineEditC1A1; + mySelection->ClearFilters() ; + mySelection->AddFilter(myMeshOrSubMeshFilter) ; + } else if (send == SelectButtonC1A2) { + LineEditC1A2->setFocus() ; + myEditCurrentArgument = LineEditC1A2; + mySelection->ClearFilters() ; + mySelection->AddFilter(myGeomFilter) ; + } + SelectionIntoArgument() ; } //================================================================================= @@ -498,9 +417,8 @@ void SMESHGUI_EditHypothesesDlg::SetEditCurrentArgument() //================================================================================= void SMESHGUI_EditHypothesesDlg::DeactivateActiveDialog() { - if ( GroupConstructors->isEnabled() ) { + if ( GroupC1->isEnabled() ) { disconnect( mySelection, 0, this, 0 ); - GroupConstructors->setEnabled(false) ; GroupC1->setEnabled(false) ; GroupButtons->setEnabled(false) ; } @@ -514,11 +432,9 @@ void SMESHGUI_EditHypothesesDlg::DeactivateActiveDialog() void SMESHGUI_EditHypothesesDlg::ActivateThisDialog() { mySMESHGUI->EmitSignalDeactivateDialog() ; - GroupConstructors->setEnabled(true) ; GroupC1->setEnabled(true) ; GroupButtons->setEnabled(true) ; connect ( mySelection, SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) ); - return ; } @@ -528,10 +444,8 @@ void SMESHGUI_EditHypothesesDlg::ActivateThisDialog() //================================================================================= void SMESHGUI_EditHypothesesDlg::enterEvent(QEvent* e) { - if ( GroupConstructors->isEnabled() ) - return ; - ActivateThisDialog() ; - return ; + if ( !GroupC1->isEnabled() ) + ActivateThisDialog(); } @@ -541,72 +455,31 @@ void SMESHGUI_EditHypothesesDlg::enterEvent(QEvent* e) //================================================================================= void SMESHGUI_EditHypothesesDlg::closeEvent( QCloseEvent* e ) { - this->ClickOnCancel() ; - return ; + disconnect( mySelection, 0, this, 0 ); + mySMESHGUI->ResetState() ; + mySelection->ClearFilters() ; + QDialog::closeEvent( e ); } + //================================================================================= -// function : TextChangedInLineEdit() +// function : removeItem() // purpose : //================================================================================= -void SMESHGUI_EditHypothesesDlg::TextChangedInLineEdit(const QString& newText) -{ - QLineEdit* send = (QLineEdit*)sender(); - QString newT = strdup(newText) ; - - return ; -} - -void SMESHGUI_EditHypothesesDlg::removeItem(QListBoxItem* i) +void SMESHGUI_EditHypothesesDlg::removeItem(QListBoxItem* item) { - if (!i) return; + const QObject* aSender = sender(); - SMESHGUI_StudyAPI myStudyAPI = mySMESHGUI->GetStudyAPI(); - int index = ListHypAssignation->index( i ); - if ( index != -1 ) { - if (mapNameIOR.find( string((const char*)(i->text())) ) != mapNameIOR.end()) { - SMESH::SMESH_Hypothesis_var Hyp = - SMESH::SMESH_Hypothesis::_narrow( myStudyAPI.StringToIOR( mapNameIOR[ string((const char*)(i->text())) ].c_str() ) ); - - if ( !myMesh->_is_nil() ) { - SALOMEDS::SObject_var aMesh = myStudyAPI.FindMesh(myMesh); - mySMESHGUI->RemoveHypothesisOrAlgorithmOnMesh(aMesh, Hyp); - // mySMESHGUI->GetStudyAPI().ModifiedMesh( aMesh, false ); - mySMESHGUI->GetActiveStudy()->updateObjBrowser(); - } - if ( !mySubMesh->_is_nil() ) { - SALOMEDS::SObject_var aSubMesh = myStudyAPI.FindSubMesh(mySubMesh); - mySMESHGUI->RemoveHypothesisOrAlgorithmOnMesh(aSubMesh, Hyp); - // mySMESHGUI->GetStudyAPI().ModifiedMesh( aSubMesh, false ); - mySMESHGUI->GetActiveStudy()->updateObjBrowser(); - } - - ListHypAssignation->removeItem( index ); - } - return; - } - index = ListAlgoAssignation->index( i ); - if ( index != -1 ) { - if (mapNameIOR.find( string((const char*)(i->text())) ) != mapNameIOR.end()) { - SMESH::SMESH_Hypothesis_var Hyp = - SMESH::SMESH_Hypothesis::_narrow( myStudyAPI.StringToIOR(mapNameIOR[ string((const char*)(i->text())) ].c_str()) ); - - if ( !myMesh->_is_nil() ) { - SALOMEDS::SObject_var aMesh = myStudyAPI.FindMesh(myMesh); - mySMESHGUI->RemoveHypothesisOrAlgorithmOnMesh(aMesh, Hyp); - // mySMESHGUI->GetStudyAPI().ModifiedMesh( aMesh, false ); - mySMESHGUI->GetActiveStudy()->updateObjBrowser(); - } - if ( !mySubMesh->_is_nil() ) { - SALOMEDS::SObject_var aSubMesh = myStudyAPI.FindSubMesh(mySubMesh); - mySMESHGUI->RemoveHypothesisOrAlgorithmOnMesh(aSubMesh, Hyp); - // mySMESHGUI->GetStudyAPI().ModifiedMesh( aSubMesh, false ); - mySMESHGUI->GetActiveStudy()->updateObjBrowser(); - } + if (!item) return; - ListAlgoAssignation->removeItem( index ); - } + if ( aSender == ListHypAssignation ) { + ListHypAssignation->removeItem( ListHypAssignation->index( item ) ); + } + else if ( aSender == ListAlgoAssignation ) { + ListAlgoAssignation->removeItem( ListAlgoAssignation->index( item ) ); } + + UpdateControlState(); } @@ -614,43 +487,45 @@ void SMESHGUI_EditHypothesesDlg::removeItem(QListBoxItem* i) // function : addItem() // purpose : //================================================================================= -void SMESHGUI_EditHypothesesDlg::addItem(QListBoxItem* i) +void SMESHGUI_EditHypothesesDlg::addItem(QListBoxItem* item) { + const QObject* aSender = sender(); + + if (!item) return; + + ListBoxIOR* i = 0; + if ( item->rtti() == ListBoxIOR::RTTI_IOR ) + i = (ListBoxIOR*)item; if (!i) return; + + bool isFound = false; - SMESHGUI_StudyAPI myStudyAPI = mySMESHGUI->GetStudyAPI(); - if ( ListHypDefinition->findItem( i->text() ) ) { - if ( !ListHypAssignation->findItem( i->text() ) ) { - ListHypAssignation->insertItem( i->text() ); - - if (mapNameIOR.find( string((const char*)(i->text())) ) != mapNameIOR.end()) { - SMESH::SMESH_Hypothesis_var Hyp = - SMESH::SMESH_Hypothesis::_narrow( myStudyAPI.StringToIOR(mapNameIOR[ string((const char*)(i->text())) ].c_str()) ); - - if ( !myMesh->_is_nil() ) - mySMESHGUI->AddHypothesisOnMesh(myMesh, Hyp); - if ( !mySubMesh->_is_nil() ) - mySMESHGUI->AddHypothesisOnSubMesh(mySubMesh, Hyp); + if ( aSender == ListHypDefinition ) { + for ( int j = 0, n = ListHypAssignation->count(); !isFound && j < n; j++ ) { + if ( ListHypAssignation->item( j )->rtti() == ListBoxIOR::RTTI_IOR ) { + ListBoxIOR* anItem = (ListBoxIOR*)ListHypAssignation->item( j ); + isFound = !strcmp( anItem->GetIOR(), i->GetIOR() ); } } - return; + if ( !isFound ) + ListBoxIOR* anItem = new ListBoxIOR( ListHypAssignation, + strdup( i->GetIOR() ), + strdup( i->text().latin1() ) ); } - if ( ListAlgoDefinition->findItem( i->text() ) ) { - if ( !ListAlgoAssignation->findItem( i->text() ) ) { - ListAlgoAssignation->insertItem( i->text() ); - - if (mapNameIOR.find( string((const char*)(i->text())) ) != mapNameIOR.end()) { - SMESH::SMESH_Hypothesis_var Hyp = - SMESH::SMESH_Hypothesis::_narrow( myStudyAPI.StringToIOR(mapNameIOR[ string((const char*)(i->text())) ].c_str()) ); - - if ( !myMesh->_is_nil() ) - mySMESHGUI->AddAlgorithmOnMesh(myMesh, Hyp); - if ( !mySubMesh->_is_nil() ) - mySMESHGUI->AddAlgorithmOnSubMesh(mySubMesh, Hyp); + else if ( aSender == ListAlgoDefinition ) { + for ( int j = 0, n = ListAlgoAssignation->count(); !isFound && j < n; j++ ) { + if ( ListAlgoAssignation->item( j )->rtti() == ListBoxIOR::RTTI_IOR ) { + ListBoxIOR* anItem = (ListBoxIOR*)ListAlgoAssignation->item( j ); + isFound = !strcmp( anItem->GetIOR(), i->GetIOR() ); } } + if ( !isFound ) + ListBoxIOR* anItem = new ListBoxIOR( ListAlgoAssignation, + strdup( i->GetIOR() ), + strdup( i->text().latin1() ) ); } - mySMESHGUI->GetActiveStudy()->updateObjBrowser(); + + UpdateControlState(); } @@ -660,7 +535,12 @@ void SMESHGUI_EditHypothesesDlg::addItem(QListBoxItem* i) //================================================================================= void SMESHGUI_EditHypothesesDlg::InitHypDefinition() { + ListHypDefinition->clear(); + SALOMEDS::SComponent_var father = mySMESHGUI->GetStudy()->FindComponent("MESH"); + if ( father->_is_nil() ) + return; + SALOMEDS::SObject_var HypothesisRoot; SALOMEDS::GenericAttribute_var anAttr; SALOMEDS::AttributeName_var aName; @@ -672,13 +552,13 @@ void SMESHGUI_EditHypothesesDlg::InitHypDefinition() for (; it->More();it->Next()) { SALOMEDS::SObject_var Obj = it->Value(); if (Obj->FindAttribute(anAttr, "AttributeName") ) { - aName = SALOMEDS::AttributeName::_narrow(anAttr); - ListHypDefinition->insertItem(aName->Value()); - - if (Obj->FindAttribute(anAttr, "AttributeIOR")) { - anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); - mapNameIOR[ aName->Value() ] = anIOR->Value(); - } + aName = SALOMEDS::AttributeName::_narrow(anAttr); + if (Obj->FindAttribute(anAttr, "AttributeIOR")) { + anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); + ListBoxIOR* anItem = new ListBoxIOR( ListHypDefinition, + anIOR->Value(), + aName->Value() ); + } } } } @@ -692,43 +572,41 @@ void SMESHGUI_EditHypothesesDlg::InitHypAssignation() { MESSAGE ( " InitHypAssignation " << myMesh->_is_nil() ) MESSAGE ( " InitHypAssignation " << mySubMesh->_is_nil() ) + + myMapOldHypos.clear(); ListHypAssignation->clear(); - SMESHGUI_StudyAPI myStudyAPI = mySMESHGUI->GetStudyAPI(); - int Tag_RefOnAppliedHypothesis = 2; - SALOMEDS::SObject_var AHR, aRef; + if ( myImportedMesh ) + return; + + SALOMEDS::SObject_var aMorSM, AHR, aRef; SALOMEDS::GenericAttribute_var anAttr; SALOMEDS::AttributeName_var aName; + SALOMEDS::AttributeIOR_var anIOR; + SMESHGUI_StudyAPI myStudyAPI = mySMESHGUI->GetStudyAPI(); - if ( !myMesh->_is_nil() ) { - SALOMEDS::SObject_var aMesh = myStudyAPI.FindMesh( myMesh ); - if ( aMesh->FindSubObject (2, AHR)) { - SALOMEDS::ChildIterator_var it = mySMESHGUI->GetStudy()->NewChildIterator(AHR); - for (; it->More();it->Next()) { - SALOMEDS::SObject_var Obj = it->Value(); - if ( Obj->ReferencedObject(aRef) ) { - if (aRef->FindAttribute(anAttr, "AttributeName") ) { - aName = SALOMEDS::AttributeName::_narrow(anAttr); - ListHypAssignation->insertItem(aName->Value()); + if ( !myMesh->_is_nil() ) + aMorSM = myStudyAPI.FindObject( myMesh ); + else if ( !mySubMesh->_is_nil() ) + aMorSM = myStudyAPI.FindObject( mySubMesh ); + + if ( !aMorSM->_is_nil() && aMorSM->FindSubObject (2, AHR)) { + SALOMEDS::ChildIterator_var it = mySMESHGUI->GetStudy()->NewChildIterator(AHR); + for (; it->More();it->Next()) { + SALOMEDS::SObject_var Obj = it->Value(); + if ( Obj->ReferencedObject(aRef) ) { + if (aRef->FindAttribute(anAttr, "AttributeName") ) { + aName = SALOMEDS::AttributeName::_narrow(anAttr); + if (aRef->FindAttribute(anAttr, "AttributeIOR")) { + anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); + ListBoxIOR* anItem = new ListBoxIOR( ListHypAssignation, + anIOR->Value(), + aName->Value() ); + myMapOldHypos[ anIOR->Value() ] = ListHypAssignation->index( anItem ); } } } } } - if ( !mySubMesh->_is_nil() ) { - SALOMEDS::SObject_var aSubMesh = myStudyAPI.FindSubMesh( mySubMesh ); - if ( aSubMesh->FindSubObject (2, AHR)) { - SALOMEDS::ChildIterator_var it = mySMESHGUI->GetStudy()->NewChildIterator(AHR); - for (; it->More();it->Next()) { - SALOMEDS::SObject_var Obj = it->Value(); - if ( Obj->ReferencedObject(aRef) ) { - if (aRef->FindAttribute(anAttr, "AttributeName") ) { - aName = SALOMEDS::AttributeName::_narrow(anAttr); - ListHypAssignation->insertItem(aName->Value()); - } - } - } - } - } } //================================================================================= @@ -737,25 +615,29 @@ void SMESHGUI_EditHypothesesDlg::InitHypAssignation() //================================================================================= void SMESHGUI_EditHypothesesDlg::InitAlgoDefinition() { + ListAlgoDefinition->clear(); + SALOMEDS::SComponent_var father = mySMESHGUI->GetStudy()->FindComponent("MESH"); + if ( father->_is_nil() ) + return; + SALOMEDS::SObject_var AlgorithmsRoot; SALOMEDS::GenericAttribute_var anAttr; SALOMEDS::AttributeName_var aName; SALOMEDS::AttributeIOR_var anIOR; - int Tag_AlgorithmsRoot = 2; if (father->FindSubObject (2, AlgorithmsRoot)) { SALOMEDS::ChildIterator_var it = mySMESHGUI->GetStudy()->NewChildIterator(AlgorithmsRoot); for (; it->More();it->Next()) { SALOMEDS::SObject_var Obj = it->Value(); if (Obj->FindAttribute(anAttr, "AttributeName") ) { - aName = SALOMEDS::AttributeName::_narrow(anAttr); - ListAlgoDefinition->insertItem(aName->Value()); - - if (Obj->FindAttribute(anAttr, "AttributeIOR")) { - anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); - mapNameIOR[ aName->Value() ] = anIOR->Value(); - } + aName = SALOMEDS::AttributeName::_narrow(anAttr); + if (Obj->FindAttribute(anAttr, "AttributeIOR")) { + anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); + ListBoxIOR* anItem = new ListBoxIOR( ListAlgoDefinition, + anIOR->Value(), + aName->Value() ); + } } } } @@ -770,38 +652,36 @@ void SMESHGUI_EditHypothesesDlg::InitAlgoAssignation() { MESSAGE ( " InitAlgoAssignation " << myMesh->_is_nil() ) MESSAGE ( " InitAlgoAssignation " << mySubMesh->_is_nil() ) + + myMapOldAlgos.clear(); ListAlgoAssignation->clear(); - SMESHGUI_StudyAPI myStudyAPI = mySMESHGUI->GetStudyAPI(); - int Tag_RefOnAppliedAlgorithms = 3; - SALOMEDS::SObject_var AHR, aRef; + if ( myImportedMesh ) + return; + + SALOMEDS::SObject_var aMorSM, AHR, aRef; SALOMEDS::GenericAttribute_var anAttr; SALOMEDS::AttributeName_var aName; - - if ( !myMesh->_is_nil() ) { - SALOMEDS::SObject_var aMesh = myStudyAPI.FindMesh( myMesh ); - if ( aMesh->FindSubObject (3, AHR) ) { - SALOMEDS::ChildIterator_var it = mySMESHGUI->GetStudy()->NewChildIterator(AHR); - for (; it->More();it->Next()) { - SALOMEDS::SObject_var Obj = it->Value(); - if ( Obj->ReferencedObject(aRef) ) { - if (aRef->FindAttribute(anAttr, "AttributeName") ) { - aName = SALOMEDS::AttributeName::_narrow(anAttr); - ListAlgoAssignation->insertItem(aName->Value()); - } - } - } - } - } - if ( !mySubMesh->_is_nil() ) { - SALOMEDS::SObject_var aSubMesh = myStudyAPI.FindSubMesh( mySubMesh ); - if ( aSubMesh->FindSubObject (3, AHR) ) { - SALOMEDS::ChildIterator_var it = mySMESHGUI->GetStudy()->NewChildIterator(AHR); - for (; it->More();it->Next()) { - SALOMEDS::SObject_var Obj = it->Value(); - if ( Obj->ReferencedObject(aRef) ) { - if (aRef->FindAttribute(anAttr, "AttributeName") ) { - aName = SALOMEDS::AttributeName::_narrow(anAttr); - ListAlgoAssignation->insertItem(aName->Value()); + SALOMEDS::AttributeIOR_var anIOR; + SMESHGUI_StudyAPI myStudyAPI = mySMESHGUI->GetStudyAPI(); + + if ( !myMesh->_is_nil() ) + aMorSM = myStudyAPI.FindObject( myMesh ); + else if ( !mySubMesh->_is_nil() ) + aMorSM = myStudyAPI.FindObject( mySubMesh ); + + if ( !aMorSM->_is_nil() && aMorSM->FindSubObject (3, AHR)) { + SALOMEDS::ChildIterator_var it = mySMESHGUI->GetStudy()->NewChildIterator(AHR); + for (; it->More();it->Next()) { + SALOMEDS::SObject_var Obj = it->Value(); + if ( Obj->ReferencedObject(aRef) ) { + if (aRef->FindAttribute(anAttr, "AttributeName") ) { + aName = SALOMEDS::AttributeName::_narrow(anAttr); + if (aRef->FindAttribute(anAttr, "AttributeIOR")) { + anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); + ListBoxIOR* anItem = new ListBoxIOR( ListAlgoAssignation, + anIOR->Value(), + aName->Value() ); + myMapOldAlgos[ anIOR->Value() ] = ListAlgoAssignation->index( anItem ); } } } @@ -818,13 +698,13 @@ void SMESHGUI_EditHypothesesDlg::InitGeom() LineEditC1A2->setText("") ; SMESHGUI_StudyAPI myStudyAPI = mySMESHGUI->GetStudyAPI(); - if ( !myMesh->_is_nil() ) { - SALOMEDS::SObject_var aMesh = myStudyAPI.FindMesh( myMesh ); + if ( myGeomShape->_is_nil() && !myMesh->_is_nil() ) { + SALOMEDS::SObject_var aMesh = myStudyAPI.FindObject( myMesh ); if ( !aMesh->_is_nil() ) myGeomShape = myStudyAPI.GetShapeOnMeshOrSubMesh(aMesh); } - if ( !mySubMesh->_is_nil() ) { - SALOMEDS::SObject_var aSubMesh = myStudyAPI.FindSubMesh( mySubMesh ); + if ( myGeomShape->_is_nil() && !mySubMesh->_is_nil() ) { + SALOMEDS::SObject_var aSubMesh = myStudyAPI.FindObject( mySubMesh ); if ( !aSubMesh->_is_nil() ) myGeomShape = myStudyAPI.GetShapeOnMeshOrSubMesh(aSubMesh); } @@ -835,9 +715,203 @@ void SMESHGUI_EditHypothesesDlg::InitGeom() SALOMEDS::SObject_var aSO = mySMESHGUI->GetStudy()->FindObjectIOR( myGeomShape->Name() ); if ( !aSO->_is_nil() ) { if (aSO->FindAttribute(anAttr, "AttributeName") ) { - aName = SALOMEDS::AttributeName::_narrow(anAttr); - LineEditC1A2->setText( QString(aName->Value()) ) ; + aName = SALOMEDS::AttributeName::_narrow(anAttr); + LineEditC1A2->setText( QString(aName->Value()) ) ; + } + } + } +} + +//================================================================================= +// function : UpdateControlState() +// purpose : +//================================================================================= +void SMESHGUI_EditHypothesesDlg::UpdateControlState() +{ + bool isEnabled = ( !myMesh ->_is_nil() && !myGeomShape->_is_nil() && ListHypAssignation->count() && ListAlgoAssignation->count() ) || + ( !mySubMesh->_is_nil() && !myGeomShape->_is_nil() && ( ListHypAssignation->count() || ListAlgoAssignation->count() ) ); + + buttonOk ->setEnabled( isEnabled && !myImportedMesh ); + buttonApply->setEnabled( isEnabled && !myImportedMesh ); + + SelectButtonC1A2 ->setEnabled( ALLOW_CHANGE_SHAPE && !myImportedMesh ); + LineEditC1A2 ->setEnabled( ALLOW_CHANGE_SHAPE && !myImportedMesh ); + ListHypDefinition ->setEnabled( !myImportedMesh ); + ListHypAssignation ->setEnabled( !myImportedMesh ); + ListAlgoDefinition ->setEnabled( !myImportedMesh ); + ListAlgoAssignation->setEnabled( !myImportedMesh ); +} + +//================================================================================= +// function : StoreMesh() +// purpose : +//================================================================================= +bool SMESHGUI_EditHypothesesDlg::StoreMesh() +{ + SMESHGUI_StudyAPI myStudyAPI = mySMESHGUI->GetStudyAPI(); + MapIOR anOldHypos, aNewHypos; + if ( myGeomShape->_is_nil() ) + return false; + // 1. Check whether the geometric shape has changed + SALOMEDS::SObject_var aMeshSO = myStudyAPI.FindObject( myMesh ); + GEOM::GEOM_Shape_var aIniGeomShape = myStudyAPI.GetShapeOnMeshOrSubMesh( aMeshSO ); + bool bShapeChanged = aIniGeomShape->_is_nil() || !aIniGeomShape->_is_equivalent( myGeomShape ); + if ( bShapeChanged ) { + // VSR : TODO : Set new shape - not supported yet by SMESH engine + // 1) remove all old hypotheses and algorithms and also submeshes + // 2) set new shape + } + MapIOR::iterator it; + // 2. remove not used hypotheses from the mesh + for ( it = myMapOldHypos.begin(); it != myMapOldHypos.end(); ++it ) { + string ior = it->first; + int index = findItem( ListHypAssignation, ior ); + if ( index < 0 ) { + CORBA::Object_var anObject = myStudyAPI.StringToIOR( ior.c_str() ); + if ( !CORBA::is_nil( anObject ) ) { + SMESH::SMESH_Hypothesis_var aHyp = SMESH::SMESH_Hypothesis::_narrow( anObject ); + if ( !aHyp->_is_nil() ) + if ( !mySMESHGUI->RemoveHypothesisOrAlgorithmOnMesh( aMeshSO, aHyp ) ) + return false; + } + } + } + // 3. remove not used algorithms from the mesh + for ( it = myMapOldAlgos.begin(); it != myMapOldAlgos.end(); ++it ) { + string ior = it->first; + int index = findItem( ListAlgoAssignation, ior ); + if ( index < 0 ) { + CORBA::Object_var anObject = myStudyAPI.StringToIOR( ior.c_str() ); + if ( !CORBA::is_nil( anObject ) ) { + SMESH::SMESH_Hypothesis_var aHyp = SMESH::SMESH_Hypothesis::_narrow( anObject ); + if ( !aHyp->_is_nil() ) + if ( !mySMESHGUI->RemoveHypothesisOrAlgorithmOnMesh( aMeshSO, aHyp ) ) + return false; + } + } + } + // 4. Add new hypotheses + for ( int i = 0; i < ListHypAssignation->count(); i++ ) { + if ( ListHypAssignation->item( i )->rtti() == ListBoxIOR::RTTI_IOR ) { + ListBoxIOR* anItem = ( ListBoxIOR* )( ListHypAssignation->item( i ) ); + if ( anItem ) { + string ior = anItem->GetIOR(); + if ( myMapOldHypos.find( ior ) == myMapOldHypos.end() ) { + CORBA::Object_var anObject = myStudyAPI.StringToIOR( ior.c_str() ); + if ( !CORBA::is_nil( anObject ) ) { + SMESH::SMESH_Hypothesis_var aHyp = SMESH::SMESH_Hypothesis::_narrow( anObject ); + if ( !aHyp->_is_nil() ) + if ( !mySMESHGUI->AddHypothesisOnMesh( myMesh, aHyp ) ) + return false; + } + } + } + } + } + // 4. Add new algorithms + for ( int i = 0; i < ListAlgoAssignation->count(); i++ ) { + if ( ListAlgoAssignation->item( i )->rtti() == ListBoxIOR::RTTI_IOR ) { + ListBoxIOR* anItem = ( ListBoxIOR* )( ListAlgoAssignation->item( i ) ); + if ( anItem ) { + string ior = anItem->GetIOR(); + if ( myMapOldAlgos.find( ior ) == myMapOldAlgos.end() ) { + CORBA::Object_var anObject = myStudyAPI.StringToIOR( ior.c_str() ); + if ( !CORBA::is_nil( anObject ) ) { + SMESH::SMESH_Hypothesis_var aHyp = SMESH::SMESH_Hypothesis::_narrow( anObject ); + if ( !aHyp->_is_nil() ) + if ( !mySMESHGUI->AddAlgorithmOnMesh( myMesh, aHyp ) ) + return false; + } + } + } + } + } + return true; +} + +//================================================================================= +// function : StoreSubMesh() +// purpose : +//================================================================================= +bool SMESHGUI_EditHypothesesDlg::StoreSubMesh() +{ + SMESHGUI_StudyAPI myStudyAPI = mySMESHGUI->GetStudyAPI(); + MapIOR anOldHypos, aNewHypos; + if ( myGeomShape->_is_nil() ) + return false; + // 1. Check whether the geometric shape has changed + SALOMEDS::SObject_var aSubMeshSO = myStudyAPI.FindObject( mySubMesh ); + GEOM::GEOM_Shape_var aIniGeomShape = myStudyAPI.GetShapeOnMeshOrSubMesh( aSubMeshSO ); + bool bShapeChanged = aIniGeomShape->_is_nil() || !aIniGeomShape->_is_equivalent( myGeomShape ); + if ( bShapeChanged ) { + // VSR : TODO : Set new shape - not supported yet by engine + // 1) remove all old hypotheses and algorithms + // 2) set new shape + } + MapIOR::iterator it; + // 2. remove not used hypotheses from the submesh + for ( it = myMapOldHypos.begin(); it != myMapOldHypos.end(); ++it ) { + string ior = it->first; + int index = findItem( ListHypAssignation, ior ); + if ( index < 0 ) { + CORBA::Object_var anObject = myStudyAPI.StringToIOR( ior.c_str() ); + if ( !CORBA::is_nil( anObject ) ) { + SMESH::SMESH_Hypothesis_var aHyp = SMESH::SMESH_Hypothesis::_narrow( anObject ); + if ( !aHyp->_is_nil() ) + if ( !mySMESHGUI->RemoveHypothesisOrAlgorithmOnMesh( aSubMeshSO, aHyp ) ) + return false; + } + } + } + // 3. remove not used algorithms from the submesh + for ( it = myMapOldAlgos.begin(); it != myMapOldAlgos.end(); ++it ) { + string ior = it->first; + int index = findItem( ListAlgoAssignation, ior ); + if ( index < 0 ) { + CORBA::Object_var anObject = myStudyAPI.StringToIOR( ior.c_str() ); + if ( !CORBA::is_nil( anObject ) ) { + SMESH::SMESH_Hypothesis_var aHyp = SMESH::SMESH_Hypothesis::_narrow( anObject ); + if ( !aHyp->_is_nil() ) + if ( !mySMESHGUI->RemoveHypothesisOrAlgorithmOnMesh( aSubMeshSO, aHyp ) ) + return false; + } + } + } + // 4. Add new hypotheses + for ( int i = 0; i < ListHypAssignation->count(); i++ ) { + if ( ListHypAssignation->item( i )->rtti() == ListBoxIOR::RTTI_IOR ) { + ListBoxIOR* anItem = ( ListBoxIOR* )( ListHypAssignation->item( i ) ); + if ( anItem ) { + string ior = anItem->GetIOR(); + if ( myMapOldHypos.find( ior ) == myMapOldHypos.end() ) { + CORBA::Object_var anObject = myStudyAPI.StringToIOR( ior.c_str() ); + if ( !CORBA::is_nil( anObject ) ) { + SMESH::SMESH_Hypothesis_var aHyp = SMESH::SMESH_Hypothesis::_narrow( anObject ); + if ( !aHyp->_is_nil() ) + if ( !mySMESHGUI->AddHypothesisOnSubMesh( mySubMesh, aHyp ) ) + return false; + } + } + } + } + } + // 4. Add new algorithms + for ( int i = 0; i < ListAlgoAssignation->count(); i++ ) { + if ( ListAlgoAssignation->item( i )->rtti() == ListBoxIOR::RTTI_IOR ) { + ListBoxIOR* anItem = ( ListBoxIOR* )( ListAlgoAssignation->item( i ) ); + if ( anItem ) { + string ior = anItem->GetIOR(); + if ( myMapOldAlgos.find( ior ) == myMapOldAlgos.end() ) { + CORBA::Object_var anObject = myStudyAPI.StringToIOR( ior.c_str() ); + if ( !CORBA::is_nil( anObject ) ) { + SMESH::SMESH_Hypothesis_var aHyp = SMESH::SMESH_Hypothesis::_narrow( anObject ); + if ( !aHyp->_is_nil() ) + if ( !mySMESHGUI->AddAlgorithmOnSubMesh( mySubMesh, aHyp ) ) + return false; + } + } } } } + return true; } diff --git a/src/SMESHGUI/SMESHGUI_EditHypothesesDlg.h b/src/SMESHGUI/SMESHGUI_EditHypothesesDlg.h index 45bf2c4ba..2e707dd49 100644 --- a/src/SMESHGUI/SMESHGUI_EditHypothesesDlg.h +++ b/src/SMESHGUI/SMESHGUI_EditHypothesesDlg.h @@ -34,7 +34,6 @@ #include "SMESH_TypeFilter.hxx" // QT Includes -#include #include // IDL Headers @@ -46,21 +45,15 @@ #include #include -using namespace std; - -class QVBoxLayout; -class QHBoxLayout; -class QGridLayout; -class QButtonGroup; class QGroupBox; class QLabel; class QLineEdit; class QPushButton; -class QRadioButton; class QListBox; class QListBoxItem; class SMESHGUI; +typedef map MapIOR; //================================================================================= // class : SMESHGUI_EditHypothesesDlg @@ -74,11 +67,12 @@ public: SMESHGUI_EditHypothesesDlg( QWidget* parent = 0, const char* name = 0, SALOME_Selection* Sel = 0, bool modal = FALSE, WFlags fl = 0 ); ~SMESHGUI_EditHypothesesDlg(); -private: +protected: + virtual void closeEvent( QCloseEvent* e ); + virtual void enterEvent ( QEvent* ); +private: void Init( SALOME_Selection* Sel ) ; - void closeEvent( QCloseEvent* e ) ; - void enterEvent ( QEvent * ) ; void InitHypDefinition(); void InitAlgoDefinition(); @@ -87,11 +81,16 @@ private: void InitGeom(); + void UpdateControlState(); + + bool StoreMesh(); + bool StoreSubMesh(); + +private: SMESHGUI* mySMESHGUI ; SALOME_Selection* mySelection ; GEOM::GEOM_Shape_var myGeomShape ; - int myConstructorId ; QLineEdit* myEditCurrentArgument; SMESH::SMESH_Mesh_var myMesh; @@ -100,78 +99,46 @@ private: Handle(SALOME_TypeFilter) myGeomFilter; Handle(SMESH_TypeFilter) myMeshOrSubMeshFilter; - map mapNameIOR; - - SALOME_ListIO HypoList; - SALOME_ListIO AlgoList; - - bool myOkHypothesis; - bool myOkAlgorithm; + MapIOR myMapOldHypos, myMapOldAlgos; - SMESH::SMESH_Hypothesis_var myHypothesis; - SMESH::SMESH_Hypothesis_var myAlgorithm; - - SMESH::ListOfHypothesis_var myLHypothesis; - SMESH::ListOfHypothesis_var myLAlgorithm; + bool myImportedMesh; - QButtonGroup* GroupConstructors; - QRadioButton* Constructor1; QGroupBox* GroupButtons; QPushButton* buttonOk; - QPushButton* buttonCancel; QPushButton* buttonApply; - QGroupBox* GroupC1; + QPushButton* buttonCancel; + QGroupBox* GroupC1; QLabel* TextLabelC1A1; QPushButton* SelectButtonC1A1; QLineEdit* LineEditC1A1; - QLabel* TextLabelC1A2; QPushButton* SelectButtonC1A2; QLineEdit* LineEditC1A2; - QGroupBox* GroupHypotheses; - QLabel* TextHypDefinition; - QListBox* ListHypDefinition; - QLabel* TextHypAssignation; - QListBox* ListHypAssignation; + QGroupBox* GroupHypotheses; + QLabel* TextHypDefinition; + QListBox* ListHypDefinition; + QLabel* TextHypAssignation; + QListBox* ListHypAssignation; - QGroupBox* GroupAlgorithms; - QLabel* TextAlgoDefinition; - QListBox* ListAlgoDefinition; - QLabel* TextAlgoAssignation; - QListBox* ListAlgoAssignation; + QGroupBox* GroupAlgorithms; + QLabel* TextAlgoDefinition; + QListBox* ListAlgoDefinition; + QLabel* TextAlgoAssignation; + QListBox* ListAlgoAssignation; private slots: - - void ConstructorsClicked(int constructorId); + void ClickOnOk(); + bool ClickOnApply(); void ClickOnCancel(); void SetEditCurrentArgument() ; void SelectionIntoArgument() ; void DeactivateActiveDialog() ; void ActivateThisDialog() ; - void TextChangedInLineEdit(const QString& newText) ; void removeItem(QListBoxItem*); void addItem(QListBoxItem*); - -protected: - QGridLayout* SMESHGUI_EditHypothesesDlgLayout; - QGridLayout* GroupConstructorsLayout; - QGridLayout* GroupButtonsLayout; - QGridLayout* GroupC1Layout; - - QGridLayout* grid_3; - QGridLayout* grid_4; - - QHBoxLayout* hbox_2; - QHBoxLayout* hbox_3; - - QVBoxLayout* vbox; - QVBoxLayout* vbox_2; - QVBoxLayout* vbox_3; - QVBoxLayout* vbox_4; - }; #endif // DIALOGBOX_EDIT_HYPOTHESES_H diff --git a/src/SMESHGUI/SMESHGUI_InitMeshDlg.cxx b/src/SMESHGUI/SMESHGUI_InitMeshDlg.cxx index 4261740b3..ac34a76c7 100644 --- a/src/SMESHGUI/SMESHGUI_InitMeshDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_InitMeshDlg.cxx @@ -33,23 +33,20 @@ using namespace std; #include "QAD_Application.h" #include "QAD_Desktop.h" +#include "QAD_MessageBox.h" +#include "QAD_WaitCursor.h" +#include "QAD_Operation.h" + #include "utilities.h" // QT Includes -#include #include #include #include #include -#include #include -#include -#include -#include -#include #include - //================================================================================= // class : SMESHGUI_InitMeshDlg() // purpose : Constructs a SMESHGUI_InitMeshDlg which is a child of 'parent', with the @@ -58,135 +55,88 @@ using namespace std; // TRUE to construct a modal dialog. //================================================================================= SMESHGUI_InitMeshDlg::SMESHGUI_InitMeshDlg( QWidget* parent, const char* name, SALOME_Selection* Sel, bool modal, WFlags fl ) - : QDialog( parent, name, modal, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu ) + : QDialog( parent, name, modal, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu | WDestructiveClose ) { - QPixmap image1(QAD_Desktop::getResourceManager()->loadPixmap( "SMESH",tr("ICON_DLG_INIT_MESH"))); QPixmap image0(QAD_Desktop::getResourceManager()->loadPixmap( "SMESH",tr("ICON_SELECT"))); if ( !name ) setName( "SMESHGUI_InitMeshDlg" ); - resize( 303, 175 ); setCaption( tr( "SMESH_INIT_MESH" ) ); setSizeGripEnabled( TRUE ); - SMESHGUI_InitMeshDlgLayout = new QGridLayout( this ); + QGridLayout* SMESHGUI_InitMeshDlgLayout = new QGridLayout( this ); SMESHGUI_InitMeshDlgLayout->setSpacing( 6 ); SMESHGUI_InitMeshDlgLayout->setMargin( 11 ); /***************************************************************/ - GroupConstructors = new QButtonGroup( this, "GroupConstructors" ); - GroupConstructors->setTitle( tr( "SMESH_INIT" ) ); - GroupConstructors->setExclusive( TRUE ); - GroupConstructors->setColumnLayout(0, Qt::Vertical ); - GroupConstructors->layout()->setSpacing( 0 ); - GroupConstructors->layout()->setMargin( 0 ); - GroupConstructorsLayout = new QGridLayout( GroupConstructors->layout() ); - GroupConstructorsLayout->setAlignment( Qt::AlignTop ); - GroupConstructorsLayout->setSpacing( 6 ); - GroupConstructorsLayout->setMargin( 11 ); - Constructor1 = new QRadioButton( GroupConstructors, "Constructor1" ); - Constructor1->setText( tr( "" ) ); - Constructor1->setPixmap( image1 ); - Constructor1->setChecked( TRUE ); - Constructor1->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)1, (QSizePolicy::SizeType)0, Constructor1->sizePolicy().hasHeightForWidth() ) ); - Constructor1->setMinimumSize( QSize( 50, 0 ) ); - GroupConstructorsLayout->addWidget( Constructor1, 0, 0 ); - QSpacerItem* spacer = new QSpacerItem( 20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum ); - GroupConstructorsLayout->addItem( spacer, 0, 1 ); - SMESHGUI_InitMeshDlgLayout->addWidget( GroupConstructors, 0, 0 ); - - /***************************************************************/ - GroupButtons = new QGroupBox( this, "GroupButtons" ); - GroupButtons->setGeometry( QRect( 10, 10, 281, 48 ) ); - GroupButtons->setTitle( tr( "" ) ); - GroupButtons->setColumnLayout(0, Qt::Vertical ); - GroupButtons->layout()->setSpacing( 0 ); - GroupButtons->layout()->setMargin( 0 ); - GroupButtonsLayout = new QGridLayout( GroupButtons->layout() ); - GroupButtonsLayout->setAlignment( Qt::AlignTop ); - GroupButtonsLayout->setSpacing( 6 ); - GroupButtonsLayout->setMargin( 11 ); - buttonCancel = new QPushButton( GroupButtons, "buttonCancel" ); - buttonCancel->setText( tr( "SMESH_BUT_CLOSE" ) ); - buttonCancel->setAutoDefault( TRUE ); - GroupButtonsLayout->addWidget( buttonCancel, 0, 3 ); - buttonApply = new QPushButton( GroupButtons, "buttonApply" ); - buttonApply->setText( tr( "SMESH_BUT_APPLY" ) ); - buttonApply->setAutoDefault( TRUE ); - GroupButtonsLayout->addWidget( buttonApply, 0, 1 ); - QSpacerItem* spacer_9 = new QSpacerItem( 20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum ); - GroupButtonsLayout->addItem( spacer_9, 0, 2 ); - buttonOk = new QPushButton( GroupButtons, "buttonOk" ); - buttonOk->setText( tr( "SMESH_BUT_OK" ) ); - buttonOk->setAutoDefault( TRUE ); - buttonOk->setDefault( TRUE ); - GroupButtonsLayout->addWidget( buttonOk, 0, 0 ); - SMESHGUI_InitMeshDlgLayout->addWidget( GroupButtons, 2, 0 ); - - /***************************************************************/ - GroupC1 = new QGroupBox( this, "GroupC1" ); - GroupC1->setTitle( tr( "SMESH_ARGUMENTS" ) ); - GroupC1->setMinimumSize( QSize( 0, 0 ) ); - GroupC1->setFrameShape( QGroupBox::Box ); - GroupC1->setFrameShadow( QGroupBox::Sunken ); + GroupC1 = new QGroupBox( tr( "SMESH_ARGUMENTS" ), this, "GroupC1" ); GroupC1->setColumnLayout(0, Qt::Vertical ); GroupC1->layout()->setSpacing( 0 ); GroupC1->layout()->setMargin( 0 ); - GroupC1Layout = new QGridLayout( GroupC1->layout() ); + QGridLayout* GroupC1Layout = new QGridLayout( GroupC1->layout() ); GroupC1Layout->setAlignment( Qt::AlignTop ); GroupC1Layout->setSpacing( 6 ); GroupC1Layout->setMargin( 11 ); - TextLabelC1A1 = new QLabel( GroupC1, "TextLabelC1A1" ); - TextLabelC1A1->setText( tr( "SMESH_OBJECT_GEOM" ) ); - TextLabelC1A1->setMinimumSize( QSize( 50, 0 ) ); - TextLabelC1A1->setFrameShape( QLabel::NoFrame ); - TextLabelC1A1->setFrameShadow( QLabel::Plain ); - GroupC1Layout->addWidget( TextLabelC1A1, 0, 0 ); + TextLabel_NameMesh = new QLabel( tr( "SMESH_NAME" ), GroupC1, "TextLabel_NameMesh" ); + GroupC1Layout->addWidget( TextLabel_NameMesh, 0, 0 ); + LineEdit_NameMesh = new QLineEdit( GroupC1, "LineEdit_NameMesh" ); + GroupC1Layout->addWidget( LineEdit_NameMesh, 0, 2 ); + + TextLabelC1A1 = new QLabel( tr( "SMESH_OBJECT_GEOM" ), GroupC1, "TextLabelC1A1" ); + GroupC1Layout->addWidget( TextLabelC1A1, 1, 0 ); SelectButtonC1A1 = new QPushButton( GroupC1, "SelectButtonC1A1" ); - SelectButtonC1A1->setText( tr( "" ) ); SelectButtonC1A1->setPixmap( image0 ); SelectButtonC1A1->setToggleButton( FALSE ); - GroupC1Layout->addWidget( SelectButtonC1A1, 0, 1 ); + GroupC1Layout->addWidget( SelectButtonC1A1, 1, 1 ); LineEditC1A1 = new QLineEdit( GroupC1, "LineEditC1A1" ); - GroupC1Layout->addWidget( LineEditC1A1, 0, 2 ); + GroupC1Layout->addWidget( LineEditC1A1, 1, 2 ); - TextLabel_NameMesh = new QLabel( GroupC1, "TextLabel_NameMesh" ); - TextLabel_NameMesh->setText( tr( "SMESH_NAME" ) ); - GroupC1Layout->addWidget( TextLabel_NameMesh, 1, 0 ); - LineEdit_NameMesh = new QLineEdit( GroupC1, "LineEdit_NameMesh" ); - GroupC1Layout->addWidget( LineEdit_NameMesh, 1, 2 ); - - TextLabelC1A1Hyp = new QLabel( GroupC1, "TextLabelC1A1Hyp" ); - TextLabelC1A1Hyp->setText( tr( "SMESH_OBJECT_HYPOTHESIS" ) ); - TextLabelC1A1Hyp->setMinimumSize( QSize( 50, 0 ) ); - TextLabelC1A1Hyp->setFrameShape( QLabel::NoFrame ); - TextLabelC1A1Hyp->setFrameShadow( QLabel::Plain ); + TextLabelC1A1Hyp = new QLabel( tr( "SMESH_OBJECT_HYPOTHESIS" ), GroupC1, "TextLabelC1A1Hyp" ); GroupC1Layout->addWidget( TextLabelC1A1Hyp, 2, 0 ); SelectButtonC1A1Hyp = new QPushButton( GroupC1, "SelectButtonC1A1Hyp" ); - SelectButtonC1A1Hyp->setText( tr( "" ) ); SelectButtonC1A1Hyp->setPixmap( image0 ); GroupC1Layout->addWidget( SelectButtonC1A1Hyp, 2, 1 ); LineEditC1A1Hyp = new QLineEdit( GroupC1, "LineEditC1A1Hyp" ); - LineEditC1A1Hyp->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)3, (QSizePolicy::SizeType)0, LineEditC1A1Hyp->sizePolicy().hasHeightForWidth() ) ); GroupC1Layout->addWidget( LineEditC1A1Hyp, 2, 2 ); - TextLabelC1A1Algo = new QLabel( GroupC1, "TextLabelC1A1Algo" ); - TextLabelC1A1Algo->setText( tr( "SMESH_OBJECT_ALGORITHM" ) ); - TextLabelC1A1Algo->setMinimumSize( QSize( 50, 0 ) ); - TextLabelC1A1Algo->setFrameShape( QLabel::NoFrame ); - TextLabelC1A1Algo->setFrameShadow( QLabel::Plain ); + TextLabelC1A1Algo = new QLabel( tr( "SMESH_OBJECT_ALGORITHM" ), GroupC1, "TextLabelC1A1Algo" ); GroupC1Layout->addWidget( TextLabelC1A1Algo, 3, 0 ); SelectButtonC1A1Algo = new QPushButton( GroupC1, "SelectButtonC1A1Algo" ); - SelectButtonC1A1Algo->setText( tr( "" ) ); SelectButtonC1A1Algo->setPixmap( image0 ); GroupC1Layout->addWidget( SelectButtonC1A1Algo, 3, 1 ); LineEditC1A1Algo = new QLineEdit( GroupC1, "LineEditC1A1Algo" ); - LineEditC1A1Algo->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)3, (QSizePolicy::SizeType)0, LineEditC1A1Algo->sizePolicy().hasHeightForWidth() ) ); GroupC1Layout->addWidget( LineEditC1A1Algo, 3, 2 ); SMESHGUI_InitMeshDlgLayout->addWidget( GroupC1, 1, 0 ); + /***************************************************************/ + GroupButtons = new QGroupBox( this, "GroupButtons" ); + GroupButtons->setColumnLayout(0, Qt::Vertical ); + GroupButtons->layout()->setSpacing( 0 ); + GroupButtons->layout()->setMargin( 0 ); + QGridLayout* GroupButtonsLayout = new QGridLayout( GroupButtons->layout() ); + GroupButtonsLayout->setAlignment( Qt::AlignTop ); + GroupButtonsLayout->setSpacing( 6 ); + GroupButtonsLayout->setMargin( 11 ); + + buttonOk = new QPushButton( tr( "SMESH_BUT_OK" ), GroupButtons, "buttonOk" ); + buttonOk->setAutoDefault( TRUE ); + buttonOk->setDefault( TRUE ); + GroupButtonsLayout->addWidget( buttonOk, 0, 0 ); + + buttonApply = new QPushButton( tr( "SMESH_BUT_APPLY" ), GroupButtons, "buttonApply" ); + buttonApply->setAutoDefault( TRUE ); + GroupButtonsLayout->addWidget( buttonApply, 0, 1 ); + + GroupButtonsLayout->addItem( new QSpacerItem( 20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum ), 0, 2 ); + + buttonCancel = new QPushButton( tr( "SMESH_BUT_CLOSE" ), GroupButtons, "buttonCancel" ); + buttonCancel->setAutoDefault( TRUE ); + GroupButtonsLayout->addWidget( buttonCancel, 0, 3 ); + + SMESHGUI_InitMeshDlgLayout->addWidget( GroupButtons, 2, 0 ); - Init(Sel) ; + /***************************************************************/ + Init( Sel ) ; } @@ -206,108 +156,118 @@ SMESHGUI_InitMeshDlg::~SMESHGUI_InitMeshDlg() //================================================================================= void SMESHGUI_InitMeshDlg::Init( SALOME_Selection* Sel ) { - GroupC1->show(); - myConstructorId = 0 ; - Constructor1->setChecked( TRUE ); - myEditCurrentArgument = LineEditC1A1 ; mySelection = Sel; mySMESHGUI = SMESHGUI::GetSMESHGUI() ; mySMESHGUI->SetActiveDialogBox( (QDialog*)this ) ; - myGeomFilter = new SALOME_TypeFilter( "GEOM" ); - myAlgorithmFilter = new SMESH_TypeFilter( ALGORITHM ); + myGeomFilter = new SALOME_TypeFilter( "GEOM" ); + myAlgorithmFilter = new SMESH_TypeFilter( ALGORITHM ); myHypothesisFilter = new SMESH_TypeFilter( HYPOTHESIS ); - myNameMesh = "Mesh"; - /* signals and slots connections */ - connect( buttonOk, SIGNAL( clicked() ), this, SLOT( ClickOnOk() ) ); - connect( buttonApply, SIGNAL( clicked() ), this, SLOT(ClickOnApply() ) ); + connect( buttonOk, SIGNAL( clicked() ), this, SLOT( ClickOnOk() ) ); + connect( buttonApply, SIGNAL( clicked() ), this, SLOT( ClickOnApply() ) ); connect( buttonCancel, SIGNAL( clicked() ), this, SLOT( ClickOnCancel() ) ) ; - connect( GroupConstructors, SIGNAL(clicked(int) ), SLOT( ConstructorsClicked(int) ) ); - connect( SelectButtonC1A1, SIGNAL (clicked() ), this, SLOT( SetEditCurrentArgument() ) ) ; - connect( LineEdit_NameMesh, SIGNAL (textChanged(const QString&) ), this, SLOT( TextChangedInLineEdit(const QString&) ) ) ; - - connect( SelectButtonC1A1Hyp, SIGNAL (clicked() ), this, SLOT( SetEditCurrentArgument() ) ) ; + connect( SelectButtonC1A1, SIGNAL (clicked() ), this, SLOT( SetEditCurrentArgument() ) ) ; + connect( SelectButtonC1A1Hyp, SIGNAL (clicked() ), this, SLOT( SetEditCurrentArgument() ) ) ; connect( SelectButtonC1A1Algo, SIGNAL (clicked() ), this, SLOT( SetEditCurrentArgument() ) ) ; - connect( mySelection, SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) ); - connect( mySMESHGUI, SIGNAL ( SignalDeactivateActiveDialog() ), this, SLOT( DeactivateActiveDialog() ) ) ; - connect( mySMESHGUI, SIGNAL ( SignalCloseAllDialogs() ), this, SLOT( ClickOnCancel() ) ) ; + connect( mySelection, SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) ); + connect( mySMESHGUI, SIGNAL( SignalDeactivateActiveDialog() ), this, SLOT( DeactivateActiveDialog() ) ) ; + connect( mySMESHGUI, SIGNAL( SignalCloseAllDialogs() ), this, SLOT( ClickOnCancel() ) ) ; int x, y ; mySMESHGUI->DefineDlgPosition( this, x, y ) ; this->move( x, y ) ; this->show() ; - return ; -} + LineEdit_NameMesh->setText( tr( "SMESH_OBJECT_MESH" ) ); + LineEdit_NameMesh->setFocus() ; + myEditCurrentArgument = LineEditC1A1 ; + mySelection->ClearFilters() ; + mySelection->AddFilter( myGeomFilter ) ; + SelectionIntoArgument(); -//================================================================================= -// function : ConstructorsClicked() -// purpose : Radio button management -//================================================================================= -void SMESHGUI_InitMeshDlg::ConstructorsClicked(int constructorId) -{ - return ; + UpdateControlState(); } + //================================================================================= // function : ClickOnOk() // purpose : //================================================================================= void SMESHGUI_InitMeshDlg::ClickOnOk() { - this->ClickOnApply() ; - this->ClickOnCancel() ; - - return ; + if ( this->ClickOnApply() ) + this->ClickOnCancel() ; } //================================================================================= // function : ClickOnApply() // purpose : //================================================================================= -void SMESHGUI_InitMeshDlg::ClickOnApply() +bool SMESHGUI_InitMeshDlg::ClickOnApply() { - switch(myConstructorId) - { - case 0 : - { - MESSAGE ( " myNameMesh " << myNameMesh.isEmpty() ) - MESSAGE ( " myGeomShape " << myGeomShape->_is_nil() ) - if ( !myNameMesh.isEmpty() && !myNameMesh.isNull() && !myGeomShape->_is_nil() ) - myMesh = mySMESHGUI->InitMesh( myGeomShape, myNameMesh ) ; - - MESSAGE ( " myMesh " << myMesh->_is_nil() ) - MESSAGE ( " myOkHypothesis " ) - MESSAGE ( " myOkAlgorithm " ) - if( myOkHypothesis && !myMesh->_is_nil() ) { - SALOME_ListIteratorOfListIO It( HypoList ); - for(;It.More();It.Next()) { - Handle(SALOME_InteractiveObject) IObject = It.Value(); - Standard_Boolean testResult; - myHypothesis = mySMESHGUI->ConvertIOinSMESHHypothesis(IObject, testResult) ; - if( testResult ) - mySMESHGUI->AddHypothesisOnMesh(myMesh, myHypothesis) ; + QString myNameMesh = LineEdit_NameMesh->text().stripWhiteSpace(); + if ( myNameMesh.isEmpty() ) { + QAD_MessageBox::warn1( this, tr( "SMESH_WRN_WARNING" ), tr( "SMESH_WRN_EMPTY_NAME" ), tr( "SMESH_BUT_OK" ) ); + return false; + } + + if ( myGeomShape->_is_nil() || !HypoList.count() || !AlgoList.count() ) + return false; + + QAD_WaitCursor wc; + + QAD_Operation* op = new QAD_Operation( mySMESHGUI->GetActiveStudy() ); + + // start transaction + op->start(); + + // create mesh + SMESH::SMESH_Mesh_var aMesh = mySMESHGUI->InitMesh( myGeomShape, myNameMesh ) ; + + if ( !aMesh->_is_nil() ) { + // assign hypotheses + for( int i = 0; i < HypoList.count(); i++ ) { + SALOMEDS::SObject_var aHypSO = mySMESHGUI->GetStudy()->FindObjectID( HypoList[i] ); + if ( !aHypSO->_is_nil() ) { + CORBA::Object_var anObject = aHypSO->GetObject(); + if ( !CORBA::is_nil( anObject ) ) { + SMESH::SMESH_Hypothesis_var aHyp = SMESH::SMESH_Hypothesis::_narrow( anObject ); + if ( !aHyp->_is_nil() ) { + if ( !mySMESHGUI->AddHypothesisOnMesh( aMesh, aHyp ) ) { + // abort transaction + op->abort(); + return false; + } } } - - if( myOkAlgorithm && !myMesh->_is_nil() ) { - SALOME_ListIteratorOfListIO It( AlgoList ); - for(;It.More();It.Next()) { - Handle(SALOME_InteractiveObject) IObject = It.Value(); - Standard_Boolean testResult; - myAlgorithm = mySMESHGUI->ConvertIOinSMESHHypothesis(IObject, testResult) ; - if( testResult ) - mySMESHGUI->AddAlgorithmOnMesh(myMesh, myAlgorithm) ; + } + } + // assign algorithms + for( int i = 0; i < AlgoList.count(); i++ ) { + SALOMEDS::SObject_var aHypSO = mySMESHGUI->GetStudy()->FindObjectID( AlgoList[i] ); + if ( !aHypSO->_is_nil() ) { + CORBA::Object_var anObject = aHypSO->GetObject(); + if ( !CORBA::is_nil( anObject ) ) { + SMESH::SMESH_Hypothesis_var aHyp = SMESH::SMESH_Hypothesis::_narrow( anObject ); + if ( !aHyp->_is_nil() ) { + if ( !mySMESHGUI->AddAlgorithmOnMesh( aMesh, aHyp ) ) { + // abort transaction + op->abort(); + return false; + } } } - break ; } } + } + // commit transaction + op->finish(); + return true; } @@ -317,11 +277,7 @@ void SMESHGUI_InitMeshDlg::ClickOnApply() //================================================================================= void SMESHGUI_InitMeshDlg::ClickOnCancel() { - mySelection->ClearFilters() ; - disconnect( mySelection, 0, this, 0 ); - mySMESHGUI->ResetState() ; - reject() ; - return ; + close(); } @@ -331,61 +287,60 @@ void SMESHGUI_InitMeshDlg::ClickOnCancel() //================================================================================= void SMESHGUI_InitMeshDlg::SelectionIntoArgument() { - myEditCurrentArgument->setText("") ; QString aString = ""; + int nbSel = mySMESHGUI->GetNameOfSelectedIObjects(mySelection, aString) ; + if ( myEditCurrentArgument == LineEditC1A1 ) { + // geom shape if ( nbSel != 1 ) { - myOkHypothesis = false; - myOkAlgorithm = false; myGeomShape = GEOM::GEOM_Shape::_nil(); - return ; - } else { + aString = ""; + } + else { Standard_Boolean testResult ; Handle(SALOME_InteractiveObject) IO = mySelection->firstIObject() ; myGeomShape = mySMESHGUI->ConvertIOinGEOMShape(IO, testResult) ; if( !testResult ) { - myOkHypothesis = false; - myOkAlgorithm = false; - return ; + myGeomShape = GEOM::GEOM_Shape::_nil(); + aString = ""; } } } else if ( myEditCurrentArgument == LineEditC1A1Hyp ) { + // hypotheses + HypoList.clear(); if ( nbSel >= 1 ) { - HypoList.Clear(); SALOME_ListIteratorOfListIO Itinit( mySelection->StoredIObjects() ); - for (; Itinit.More(); Itinit.Next()) { - HypoList.Append(Itinit.Value()); + for ( ; Itinit.More(); Itinit.Next() ) { + HypoList.append( Itinit.Value()->getEntry() ); } - myOkHypothesis = true ; - if (nbSel > 1) - aString = tr("%1 Hypothesis").arg(nbSel) ; - LineEditC1A1Hyp->setText(aString) ; + if ( nbSel > 1 ) + aString = tr( "%1 Hypothesis" ).arg( nbSel ) ; } else { - myOkHypothesis = false ; - return ; + aString = ""; } - } else if ( myEditCurrentArgument == LineEditC1A1Algo ) { + } + else if ( myEditCurrentArgument == LineEditC1A1Algo ) { + // algorithms + AlgoList.clear(); if ( nbSel >= 1 ) { - AlgoList.Clear(); SALOME_ListIteratorOfListIO Itinit( mySelection->StoredIObjects() ); - for (; Itinit.More(); Itinit.Next()) { - AlgoList.Append(Itinit.Value()); + for ( ; Itinit.More(); Itinit.Next() ) { + AlgoList.append( Itinit.Value()->getEntry() ); } - myOkAlgorithm = true ; - if (nbSel > 1) - aString = tr("%1 Algorithms").arg(nbSel) ; - LineEditC1A1Algo->setText(aString) ; + if ( nbSel > 1 ) + aString = tr( "%1 Algorithms" ).arg( nbSel ) ; } else { - myOkAlgorithm = false ; - return ; + aString = ""; } } myEditCurrentArgument->setText(aString) ; + + UpdateControlState(); } @@ -396,31 +351,23 @@ void SMESHGUI_InitMeshDlg::SelectionIntoArgument() void SMESHGUI_InitMeshDlg::SetEditCurrentArgument() { QPushButton* send = (QPushButton*)sender(); - switch (myConstructorId) - { - case 0: /* default constructor */ - { - if(send == SelectButtonC1A1) { - LineEditC1A1->setFocus() ; - myEditCurrentArgument = LineEditC1A1; - mySelection->ClearFilters() ; - mySelection->AddFilter(myGeomFilter) ; - } else if( send == SelectButtonC1A1Hyp ) { - LineEditC1A1Hyp->setFocus() ; - myEditCurrentArgument = LineEditC1A1Hyp ; - mySelection->ClearFilters() ; - mySelection->AddFilter(myHypothesisFilter) ; - } else if( send == SelectButtonC1A1Algo ) { - LineEditC1A1Algo->setFocus() ; - myEditCurrentArgument = LineEditC1A1Algo ; - mySelection->ClearFilters() ; - mySelection->AddFilter(myAlgorithmFilter) ; - } - SelectionIntoArgument() ; - break; - } - } - return ; + if(send == SelectButtonC1A1) { + LineEditC1A1->setFocus() ; + myEditCurrentArgument = LineEditC1A1; + mySelection->ClearFilters() ; + mySelection->AddFilter(myGeomFilter) ; + } else if( send == SelectButtonC1A1Hyp ) { + LineEditC1A1Hyp->setFocus() ; + myEditCurrentArgument = LineEditC1A1Hyp ; + mySelection->ClearFilters() ; + mySelection->AddFilter(myHypothesisFilter) ; + } else if( send == SelectButtonC1A1Algo ) { + LineEditC1A1Algo->setFocus() ; + myEditCurrentArgument = LineEditC1A1Algo ; + mySelection->ClearFilters() ; + mySelection->AddFilter(myAlgorithmFilter) ; + } + SelectionIntoArgument() ; } //================================================================================= @@ -429,9 +376,8 @@ void SMESHGUI_InitMeshDlg::SetEditCurrentArgument() //================================================================================= void SMESHGUI_InitMeshDlg::DeactivateActiveDialog() { - if ( GroupConstructors->isEnabled() ) { + if ( GroupC1->isEnabled() ) { disconnect( mySelection, 0, this, 0 ); - GroupConstructors->setEnabled(false) ; GroupC1->setEnabled(false) ; GroupButtons->setEnabled(false) ; } @@ -445,11 +391,9 @@ void SMESHGUI_InitMeshDlg::DeactivateActiveDialog() void SMESHGUI_InitMeshDlg::ActivateThisDialog() { mySMESHGUI->EmitSignalDeactivateDialog() ; - GroupConstructors->setEnabled(true) ; GroupC1->setEnabled(true) ; GroupButtons->setEnabled(true) ; connect ( mySelection, SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) ); - return ; } @@ -459,10 +403,8 @@ void SMESHGUI_InitMeshDlg::ActivateThisDialog() //================================================================================= void SMESHGUI_InitMeshDlg::enterEvent(QEvent* e) { - if ( GroupConstructors->isEnabled() ) - return ; - ActivateThisDialog() ; - return ; + if ( !GroupC1->isEnabled() ) + ActivateThisDialog() ; } @@ -472,21 +414,25 @@ void SMESHGUI_InitMeshDlg::enterEvent(QEvent* e) //================================================================================= void SMESHGUI_InitMeshDlg::closeEvent( QCloseEvent* e ) { - this->ClickOnCancel() ; - return ; + disconnect( mySelection, 0, this, 0 ); + mySMESHGUI->ResetState() ; + mySelection->ClearFilters() ; + QDialog::closeEvent( e ); } //================================================================================= -// function : TextChangedInLineEdit() +// function : UpdateControlState() // purpose : //================================================================================= -void SMESHGUI_InitMeshDlg::TextChangedInLineEdit(const QString& newText) -{ - QLineEdit* send = (QLineEdit*)sender(); - QString newT = strdup(newText) ; - - if (send == LineEdit_NameMesh) { - myNameMesh = newText; - } - return ; +void SMESHGUI_InitMeshDlg::UpdateControlState() +{ + bool isEnabled = ( !myGeomShape->_is_nil() && HypoList.count() && AlgoList.count() ); + + buttonOk ->setEnabled( isEnabled ); + buttonApply->setEnabled( isEnabled ); } + + + + + diff --git a/src/SMESHGUI/SMESHGUI_InitMeshDlg.h b/src/SMESHGUI/SMESHGUI_InitMeshDlg.h index 9d934183a..ec04b7942 100644 --- a/src/SMESHGUI/SMESHGUI_InitMeshDlg.h +++ b/src/SMESHGUI/SMESHGUI_InitMeshDlg.h @@ -34,8 +34,8 @@ #include "SMESH_TypeFilter.hxx" // QT Includes -#include #include +#include // IDL Headers #include @@ -43,18 +43,12 @@ #include CORBA_SERVER_HEADER(GEOM_Shape) #include CORBA_SERVER_HEADER(SMESH_Gen) -class QVBoxLayout; -class QHBoxLayout; -class QGridLayout; -class QButtonGroup; class QGroupBox; class QLabel; class QLineEdit; class QPushButton; -class QRadioButton; class SMESHGUI; - //================================================================================= // class : SMESHGUI_InitMeshDlg // purpose : @@ -67,42 +61,34 @@ public: SMESHGUI_InitMeshDlg( QWidget* parent = 0, const char* name = 0, SALOME_Selection* Sel = 0, bool modal = FALSE, WFlags fl = 0 ); ~SMESHGUI_InitMeshDlg(); -private: - - void Init( SALOME_Selection* Sel ) ; +protected: void closeEvent( QCloseEvent* e ) ; void enterEvent ( QEvent * ) ; +private: + void Init( SALOME_Selection* Sel ) ; + + void UpdateControlState(); + +private: SMESHGUI* mySMESHGUI ; SALOME_Selection* mySelection ; - GEOM::GEOM_Shape_var myGeomShape ; - int myConstructorId ; + GEOM::GEOM_Shape_var myGeomShape ; QLineEdit* myEditCurrentArgument; - QString myNameMesh ; - Handle(SALOME_TypeFilter) myGeomFilter; Handle(SMESH_TypeFilter) myHypothesisFilter; Handle(SMESH_TypeFilter) myAlgorithmFilter; - SALOME_ListIO HypoList; - SALOME_ListIO AlgoList; - - bool myOkHypothesis; - bool myOkAlgorithm; - - SMESH::SMESH_Hypothesis_var myHypothesis; - SMESH::SMESH_Hypothesis_var myAlgorithm; - - SMESH::SMESH_Mesh_var myMesh; + QStringList HypoList; + QStringList AlgoList; - QButtonGroup* GroupConstructors; - QRadioButton* Constructor1; QGroupBox* GroupButtons; QPushButton* buttonOk; QPushButton* buttonCancel; QPushButton* buttonApply; + QGroupBox* GroupC1; QLabel* TextLabel_NameMesh ; QLineEdit* LineEdit_NameMesh ; @@ -119,22 +105,13 @@ private: QLineEdit* LineEditC1A1Algo; private slots: - - void ConstructorsClicked(int constructorId); void ClickOnOk(); + bool ClickOnApply(); void ClickOnCancel(); - void ClickOnApply(); void SetEditCurrentArgument() ; void SelectionIntoArgument() ; void DeactivateActiveDialog() ; void ActivateThisDialog() ; - void TextChangedInLineEdit(const QString& newText) ; - -protected: - QGridLayout* SMESHGUI_InitMeshDlgLayout; - QGridLayout* GroupConstructorsLayout; - QGridLayout* GroupButtonsLayout; - QGridLayout* GroupC1Layout; }; #endif // DIALOGBOX_INIT_MESH_H diff --git a/src/SMESHGUI/SMESHGUI_MeshInfosDlg.cxx b/src/SMESHGUI/SMESHGUI_MeshInfosDlg.cxx index 473d2ab45..c85e86c50 100644 --- a/src/SMESHGUI/SMESHGUI_MeshInfosDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_MeshInfosDlg.cxx @@ -32,369 +32,412 @@ using namespace std; #include "SMESHGUI.h" #include "QAD_Application.h" #include "QAD_Desktop.h" +#include "QAD_WaitCursor.h" #include "utilities.h" // QT Includes #include #include +#include +#include #include -#include -#include -#include #include -/* - * Constructs a SMESHGUI_MeshInfosDlg which is a child of 'parent', with the - * name 'name' and widget flags set to 'f' - * - * The dialog will by default be modeless, unless you set 'modal' to - * TRUE to construct a modal dialog. - */ -SMESHGUI_MeshInfosDlg::SMESHGUI_MeshInfosDlg( QWidget* parent, const char* name, SALOME_Selection* Sel, bool modal, WFlags fl ) - : QDialog( parent, name, modal, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu ) -{ - if ( !name ) - setName( "SMESHGUI_MeshInfosDlg" ); - setCaption( tr( "SMESH_MESHINFO_TITLE" ) ); - setSizeGripEnabled( TRUE ); - - SMESHGUI_MeshInfosDlgLayout = new QVBoxLayout( this ); - SMESHGUI_MeshInfosDlgLayout->setSpacing( 6 ); - SMESHGUI_MeshInfosDlgLayout->setMargin( 11 ); - - /****************************************************************/ - GroupBox1 = new QGroupBox( this, "GroupBox1" ); - GroupBox1->setTitle( tr( "SMESH_MESHINFO_NB1D" ) ); - GroupBox1->setColumnLayout(0, Qt::Vertical ); - GroupBox1->layout()->setSpacing( 0 ); - GroupBox1->layout()->setMargin( 0 ); - QGridLayout* GroupBox1Layout = new QGridLayout( GroupBox1->layout() ); - GroupBox1Layout->setAlignment( Qt::AlignTop ); - GroupBox1Layout->setSpacing( 6 ); - GroupBox1Layout->setMargin( 11 ); - - TextLabel11 = new QLabel( GroupBox1, "TextLabel11" ); - TextLabel11->setMinimumWidth( 100 ); - TextLabel11->setText( tr( "SMESH_MESHINFO_NODES" ) ); - GroupBox1Layout->addWidget( TextLabel11, 0, 0 ); - - TextLabel12 = new QLabel( GroupBox1, "TextLabel12" ); - TextLabel12->setMinimumWidth( 100 ); - TextLabel12->setText( tr( "SMESH_MESHINFO_EDGES" ) ); - GroupBox1Layout->addWidget( TextLabel12, 1, 0 ); - - TextLabel13 = new QLabel( GroupBox1, "TextLabel13" ); - TextLabel13->setMinimumWidth( 100 ); - GroupBox1Layout->addWidget( TextLabel13, 0, 1 ); - - TextLabel14 = new QLabel( GroupBox1, "TextLabel14" ); - TextLabel14->setMinimumWidth( 100 ); - GroupBox1Layout->addWidget( TextLabel14, 1, 1 ); - SMESHGUI_MeshInfosDlgLayout->addWidget( GroupBox1 ); - - /****************************************************************/ - GroupBox2 = new QGroupBox( this, "GroupBox2" ); - GroupBox2->setTitle( tr( "SMESH_MESHINFO_NB2D" ) ); - GroupBox2->setColumnLayout(0, Qt::Vertical ); - GroupBox2->layout()->setSpacing( 0 ); - GroupBox2->layout()->setMargin( 0 ); - QGridLayout* GroupBox2Layout = new QGridLayout( GroupBox2->layout() ); - GroupBox2Layout->setAlignment( Qt::AlignTop ); - GroupBox2Layout->setSpacing( 6 ); - GroupBox2Layout->setMargin( 11 ); - - TextLabel21 = new QLabel( GroupBox2, "TextLabel21" ); - TextLabel21->setMinimumWidth( 100 ); - TextLabel21->setText( tr( "SMESH_MESHINFO_TRIANGLES" ) ); - GroupBox2Layout->addWidget( TextLabel21, 0, 0 ); - - TextLabel22 = new QLabel( GroupBox2, "TextLabel22" ); - TextLabel22->setMinimumWidth( 100 ); - TextLabel22->setText( tr( "SMESH_MESHINFO_QUADRANGLES" ) ); - GroupBox2Layout->addWidget( TextLabel22, 1, 0 ); - - TextLabel23 = new QLabel( GroupBox2, "TextLabel23" ); - TextLabel23->setMinimumWidth( 100 ); - GroupBox2Layout->addWidget( TextLabel23, 0, 1 ); - - TextLabel24 = new QLabel( GroupBox2, "TextLabel24" ); - TextLabel24->setMinimumWidth( 100 ); - GroupBox2Layout->addWidget( TextLabel24, 1, 1 ); - SMESHGUI_MeshInfosDlgLayout->addWidget( GroupBox2 ); - - /****************************************************************/ - GroupBox3 = new QGroupBox( this, "GroupBox3" ); - GroupBox3->setTitle( tr( "SMESH_MESHINFO_NB3D" ) ); - GroupBox3->setColumnLayout(0, Qt::Vertical ); - GroupBox3->layout()->setSpacing( 0 ); - GroupBox3->layout()->setMargin( 0 ); - QGridLayout* GroupBox3Layout = new QGridLayout( GroupBox3->layout() ); - GroupBox3Layout->setAlignment( Qt::AlignTop ); - GroupBox3Layout->setSpacing( 6 ); - GroupBox3Layout->setMargin( 11 ); - - TextLabel31 = new QLabel( GroupBox3, "TextLabel31" ); - TextLabel31->setMinimumWidth( 100 ); - TextLabel31->setText( tr( "SMESH_MESHINFO_TETRAS" ) ); - GroupBox3Layout->addWidget( TextLabel31, 0, 0 ); - - TextLabel32 = new QLabel( GroupBox3, "TextLabel32" ); - TextLabel32->setMinimumWidth( 100 ); - TextLabel32->setText( tr( "SMESH_MESHINFO_HEXAS" ) ); - GroupBox3Layout->addWidget( TextLabel32, 1, 0 ); - - TextLabel33 = new QLabel( GroupBox3, "TextLabel33" ); - TextLabel33->setMinimumWidth( 100 ); - GroupBox3Layout->addWidget( TextLabel33, 0, 1 ); - - TextLabel34 = new QLabel( GroupBox3, "TextLabel34" ); - TextLabel34->setMinimumWidth( 100 ); - GroupBox3Layout->addWidget( TextLabel34, 1, 1 ); - SMESHGUI_MeshInfosDlgLayout->addWidget( GroupBox3 ); - - /****************************************************************/ - QGroupBox* GroupButtons = new QGroupBox( this, "GroupButtons" ); - GroupButtons->setColumnLayout(0, Qt::Vertical ); - GroupButtons->layout()->setSpacing( 0 ); - GroupButtons->layout()->setMargin( 0 ); - QGridLayout* GroupButtonsLayout = new QGridLayout( GroupButtons->layout() ); - GroupButtonsLayout->setAlignment( Qt::AlignTop ); - GroupButtonsLayout->setSpacing( 6 ); - GroupButtonsLayout->setMargin( 11 ); - - GroupButtonsLayout->addItem( new QSpacerItem( 20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum ), 0, 0 ); - buttonOk = new QPushButton( GroupButtons, "buttonOk" ); - buttonOk->setText( tr( "SMESH_BUT_OK" ) ); - buttonOk->setAutoDefault( TRUE ); - buttonOk->setDefault( TRUE ); - GroupButtonsLayout->addWidget( buttonOk, 0, 1 ); - GroupButtonsLayout->addItem( new QSpacerItem( 20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum ), 0, 2 ); - SMESHGUI_MeshInfosDlgLayout->addWidget( GroupButtons ); - /****************************************************************/ - - Init( Sel ) ; -} - -/* - * Destroys the object and frees any allocated resources - */ -SMESHGUI_MeshInfosDlg::~SMESHGUI_MeshInfosDlg() -{ - // no need to delete child widgets, Qt does it all for us -} +#define COLONIZE( str ) ( QString( str ).contains( ":" ) > 0 ? QString( str ) : QString( str ) + " :" ) //================================================================================= -// function : Init() -// purpose : +/*! + * SMESHGUI_MeshInfosDlg::SMESHGUI_MeshInfosDlg + * + * Constructor + */ //================================================================================= -void SMESHGUI_MeshInfosDlg::Init( SALOME_Selection* Sel ) -{ - mySelection = Sel ; - - mySMESHGUI = SMESHGUI::GetSMESHGUI() ; - myStudy = mySMESHGUI->GetActiveStudy()->getStudyDocument(); - - Engines::Component_var comp = QAD_Application::getDesktop()->getEngine("FactoryServer", "SMESH"); - myCompMesh = SMESH::SMESH_Gen::_narrow(comp); - - int nbSel = mySelection->IObjectCount(); - - TextLabel13->setText( "0" ); - TextLabel14->setText( "0" ); - TextLabel23->setText( "0" ); - TextLabel24->setText( "0" ); - TextLabel33->setText( "0" ); - TextLabel34->setText( "0" ); - - //gets the selected mesh - if ( nbSel == 1 ) { - Handle(SALOME_InteractiveObject) IObject = mySelection->firstIObject(); - Standard_Boolean res; - myMesh = mySMESHGUI->ConvertIOinMesh( IObject, res ); - if ( res ) - DumpMeshInfos(); - } - - mySMESHGUI->SetActiveDialogBox( (QDialog*)this ) ; - - /* signals and slots connections */ - connect( buttonOk, SIGNAL( clicked() ), this, SLOT( ClickOnOk() ) ); - connect( mySMESHGUI, SIGNAL( SignalDeactivateActiveDialog() ), this, SLOT( DeactivateActiveDialog() ) ) ; - connect( mySelection, SIGNAL( currentSelectionChanged() ), this, SLOT( SelectionIntoArgument() ) ); - /* to close dialog if study change */ - connect( mySMESHGUI, SIGNAL ( SignalCloseAllDialogs() ), this, SLOT( ClickOnOk() ) ) ; - - /* Move widget on the botton right corner of main widget */ - int x, y ; - mySMESHGUI->DefineDlgPosition( this, x, y ) ; - this->move( x, y ) ; - this->show() ; /* Displays Dialog */ - - return ; +SMESHGUI_MeshInfosDlg::SMESHGUI_MeshInfosDlg( QWidget* parent, const char* name, bool modal, WFlags fl ) + : QDialog( parent, name, modal, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu | WDestructiveClose ) +{ + if ( !name ) + setName( "SMESHGUI_MeshInfosDlg" ); + setCaption( tr( "SMESH_MESHINFO_TITLE" ) ); + setSizeGripEnabled( TRUE ); + + myStartSelection = true; + myIsActiveWindow = true; + + QVBoxLayout* aTopLayout = new QVBoxLayout( this ); + aTopLayout->setSpacing( 6 ); aTopLayout->setMargin( 11 ); + + // select button & label + QPixmap image0( QAD_Desktop::getResourceManager()->loadPixmap( "SMESH",tr( "ICON_SELECT" ) ) ); + mySelectBtn = new QPushButton( this, "mySelectBtn" ); + mySelectBtn->setPixmap( image0 ); + mySelectBtn->setSizePolicy( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed ) ); + + mySelectLab = new QLabel( this, "mySelectLab" ); + mySelectLab->setAlignment( AlignCenter ); + QFont fnt = mySelectLab->font(); fnt.setBold( true ); + mySelectLab->setFont( fnt ); + + QHBoxLayout* aSelectLayout = new QHBoxLayout; + aSelectLayout->setMargin( 0 ); aSelectLayout->setSpacing( 0 ); + aSelectLayout->addWidget( mySelectBtn ); + aSelectLayout->addWidget( mySelectLab ); + + // top widget stack + myWGStack = new QWidgetStack( this ); + + // no valid selection + QWidget* myBadWidget = new QWidget( myWGStack ); + QVBoxLayout* aBadLayout = new QVBoxLayout( myBadWidget ); + QLabel* myBadLab = new QLabel( tr( "SMESH_BAD_SELECTION" ), myBadWidget, "myBadLab" ); + myBadLab->setAlignment( Qt::AlignCenter ); + myBadLab->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ) ); + aBadLayout->addWidget( myBadLab ); + myWGStack->addWidget( myBadWidget, 0 ); + + // mesh + myMeshWidget = new QWidget( myWGStack ); + QGridLayout* aMeshLayout = new QGridLayout( myMeshWidget ); + aMeshLayout->setSpacing( 6 ); aMeshLayout->setMargin( 0 ); + myWGStack->addWidget( myMeshWidget ); + + // --> name + QLabel* myMeshNameLab = new QLabel( COLONIZE( tr( "SMESH_MESHINFO_NAME" ) ), myMeshWidget, "myMeshNameLab" ); + myMeshName = new QLabel( myMeshWidget, "myMeshName" ); + myMeshName->setMinimumWidth( 100 ); + QFrame* line1 = new QFrame( myMeshWidget ); + line1->setFrameStyle( QFrame::HLine | QFrame::Sunken ); + + // --> nodes + QLabel* myMeshNbNodesLab = new QLabel( COLONIZE( tr( "SMESH_MESHINFO_NODES" ) ), myMeshWidget, "myMeshNbNodesLab" ); + myMeshNbNodes = new QLabel( myMeshWidget, "myMeshNbNodes" ); + myMeshNbNodes->setMinimumWidth( 100 ); + + // --> edges + QLabel* myMeshNbEdgesLab = new QLabel( COLONIZE( tr( "SMESH_MESHINFO_EDGES" ) ), myMeshWidget, "myMeshNbEdgesLab" ); + myMeshNbEdges = new QLabel( myMeshWidget, "myMeshNbEdges" ); + myMeshNbEdges->setMinimumWidth( 100 ); + + // --> faces + myMeshFacesGroup = new QGroupBox( tr( "SMESH_MESHINFO_FACES" ), myMeshWidget, "myMeshFacesGroup" ); + myMeshFacesGroup->setColumnLayout(0, Qt::Vertical ); + myMeshFacesGroup->layout()->setSpacing( 0 ); myMeshFacesGroup->layout()->setMargin( 0 ); + QGridLayout* myMeshFacesGroupLayout = new QGridLayout( myMeshFacesGroup->layout() ); + myMeshFacesGroupLayout->setAlignment( Qt::AlignTop ); + myMeshFacesGroupLayout->setSpacing( 6 ); myMeshFacesGroupLayout->setMargin( 11 ); + + // --> faces --> total + QLabel* myMeshNbFacesLab = new QLabel( COLONIZE( tr( "SMESH_MESHINFO_TOTAL" ) ), myMeshFacesGroup, "myMeshNbFacesLab" ); + myMeshNbFacesLab->setFont( fnt ); + myMeshNbFaces = new QLabel( myMeshFacesGroup, "myMeshNbFaces" ); + myMeshNbFaces->setMinimumWidth( 100 ); + myMeshNbFaces->setFont( fnt ); + + // --> faces --> triangles + QLabel* myMeshNbTrianglesLab = new QLabel( COLONIZE( tr( "SMESH_MESHINFO_TRIANGLES" ) ), myMeshFacesGroup, "myMeshNbTrianglesLab" ); + myMeshNbTriangles = new QLabel( myMeshFacesGroup, "myMeshNbTriangles" ); + myMeshNbTriangles->setMinimumWidth( 100 ); + + // --> faces --> quadrangles + QLabel* myMeshNbQuadranglesLab = new QLabel( COLONIZE( tr( "SMESH_MESHINFO_QUADRANGLES" ) ), myMeshFacesGroup, "myMeshNbQuadranglesLab" ); + myMeshNbQuadrangles = new QLabel( myMeshFacesGroup, "myMeshNbQuadrangles" ); + myMeshNbQuadrangles->setMinimumWidth( 100 ); + + myMeshFacesGroupLayout->addWidget( myMeshNbFacesLab, 0, 0 ); + myMeshFacesGroupLayout->addWidget( myMeshNbFaces, 0, 1 ); + myMeshFacesGroupLayout->addWidget( myMeshNbTrianglesLab, 1, 0 ); + myMeshFacesGroupLayout->addWidget( myMeshNbTriangles, 1, 1 ); + myMeshFacesGroupLayout->addWidget( myMeshNbQuadranglesLab, 2, 0 ); + myMeshFacesGroupLayout->addWidget( myMeshNbQuadrangles, 2, 1 ); + + // --> volumes + myMeshVolumesGroup = new QGroupBox( tr( "SMESH_MESHINFO_VOLUMES" ), myMeshWidget, "myMeshVolumesGroup" ); + myMeshVolumesGroup->setColumnLayout(0, Qt::Vertical ); + myMeshVolumesGroup->layout()->setSpacing( 0 ); myMeshVolumesGroup->layout()->setMargin( 0 ); + QGridLayout* myMeshVolumesGroupLayout = new QGridLayout( myMeshVolumesGroup->layout() ); + myMeshVolumesGroupLayout->setAlignment( Qt::AlignTop ); + myMeshVolumesGroupLayout->setSpacing( 6 ); myMeshVolumesGroupLayout->setMargin( 11 ); + + // --> volumes --> total + QLabel* myMeshNbVolumesLab = new QLabel( COLONIZE( tr( "SMESH_MESHINFO_TOTAL" ) ), myMeshVolumesGroup, "myMeshNbVolumesLab" ); + myMeshNbVolumesLab->setFont( fnt ); + myMeshNbVolumes = new QLabel( myMeshVolumesGroup, "myMeshNbVolumes" ); + myMeshNbVolumes->setMinimumWidth( 100 ); + myMeshNbVolumes->setFont( fnt ); + + // --> volumes --> tetrahedrons + QLabel* myMeshNbTetraLab = new QLabel( COLONIZE( tr( "SMESH_MESHINFO_TETRAS" ) ), myMeshVolumesGroup, "myMeshNbTetraLab" ); + myMeshNbTetra = new QLabel( myMeshVolumesGroup, "myMeshNbTetra" ); + myMeshNbTetra->setMinimumWidth( 100 ); + + // --> volumes --> hexahedrons + QLabel* myMeshNbHexaLab = new QLabel( COLONIZE( tr( "SMESH_MESHINFO_HEXAS" ) ), myMeshVolumesGroup, "myMeshNbHexaLab" ); + myMeshNbHexa = new QLabel( myMeshVolumesGroup, "myMeshNbHexa" ); + myMeshNbHexaLab->setMinimumWidth( 100 ); + + // --> volumes --> prisms + QLabel* myMeshNbPrismLab = new QLabel( COLONIZE( tr( "SMESH_MESHINFO_PRISMS" ) ), myMeshVolumesGroup, "myMeshNbPrismLab" ); + myMeshNbPrism = new QLabel( myMeshVolumesGroup, "myMeshNbPrism" ); + myMeshNbPrism->setMinimumWidth( 100 ); + + // --> volumes --> pyramids + QLabel* myMeshNbPyraLab = new QLabel( COLONIZE( tr( "SMESH_MESHINFO_PYRAS" ) ), myMeshVolumesGroup, "myMeshNbPyraLab" ); + myMeshNbPyra = new QLabel( myMeshVolumesGroup, "myMeshNbPyra" ); + myMeshNbPyra->setMinimumWidth( 100 ); + + myMeshVolumesGroupLayout->addWidget( myMeshNbVolumesLab, 0, 0 ); + myMeshVolumesGroupLayout->addWidget( myMeshNbVolumes, 0, 1 ); + myMeshVolumesGroupLayout->addWidget( myMeshNbTetraLab, 1, 0 ); + myMeshVolumesGroupLayout->addWidget( myMeshNbTetra, 1, 1 ); + myMeshVolumesGroupLayout->addWidget( myMeshNbHexaLab, 2, 0 ); + myMeshVolumesGroupLayout->addWidget( myMeshNbHexa, 2, 1 ); + myMeshVolumesGroupLayout->addWidget( myMeshNbPrismLab, 3, 0 ); + myMeshVolumesGroupLayout->addWidget( myMeshNbPrism, 3, 1 ); + myMeshVolumesGroupLayout->addWidget( myMeshNbPyraLab, 4, 0 ); + myMeshVolumesGroupLayout->addWidget( myMeshNbPyra, 4, 1 ); + + aMeshLayout->addWidget( myMeshNameLab, 0, 0 ); + aMeshLayout->addWidget( myMeshName, 0, 1 ); + aMeshLayout->addMultiCellWidget( line1, 1, 1, 0, 1 ); + aMeshLayout->addWidget( myMeshNbNodesLab, 2, 0 ); + aMeshLayout->addWidget( myMeshNbNodes, 2, 1 ); + aMeshLayout->addWidget( myMeshNbEdgesLab, 3, 0 ); + aMeshLayout->addWidget( myMeshNbEdges, 3, 1 ); + aMeshLayout->addMultiCellWidget( myMeshFacesGroup, 4, 4, 0, 1 ); + aMeshLayout->addMultiCellWidget( myMeshVolumesGroup, 5, 5, 0, 1 ); + aMeshLayout->addItem( new QSpacerItem( 5, 5, QSizePolicy::Minimum, QSizePolicy::Expanding ), 6, 0 ); + + // submesh + mySubMeshWidget = new QWidget( myWGStack ); + QGridLayout* aSubMeshLayout = new QGridLayout( mySubMeshWidget ); + aSubMeshLayout->setSpacing( 6 ); aSubMeshLayout->setMargin( 0 ); + myWGStack->addWidget( mySubMeshWidget ); + + // --> name + QLabel* mySubMeshNameLab = new QLabel( COLONIZE( tr( "SMESH_MESHINFO_NAME" ) ), mySubMeshWidget, "mySubMeshNameLab" ); + mySubMeshName = new QLabel( mySubMeshWidget, "mySubMeshName" ); + mySubMeshName->setMinimumWidth( 100 ); + QFrame* line2 = new QFrame( mySubMeshWidget ); + line2->setFrameStyle( QFrame::HLine | QFrame::Sunken ); + + // --> nodes + QLabel* mySubMeshNbNodesLab = new QLabel( COLONIZE( tr( "SMESH_MESHINFO_NODES" ) ), mySubMeshWidget, "mySubMeshNbNodesLab" ); + mySubMeshNbNodes = new QLabel( mySubMeshWidget, "mySubMeshNbNodes" ); + mySubMeshNbNodes->setMinimumWidth( 100 ); + + // --> elements + mySubMeshElementsGroup = new QGroupBox( tr( "SMESH_MESHINFO_ELEMENTS" ), mySubMeshWidget, "mySubMeshElementsGroup" ); + mySubMeshElementsGroup->setColumnLayout(0, Qt::Vertical ); + mySubMeshElementsGroup->layout()->setSpacing( 0 ); mySubMeshElementsGroup->layout()->setMargin( 0 ); + QGridLayout* mySubMeshElementsGroupLayout = new QGridLayout( mySubMeshElementsGroup->layout() ); + mySubMeshElementsGroupLayout->setAlignment( Qt::AlignTop ); + mySubMeshElementsGroupLayout->setSpacing( 6 ); mySubMeshElementsGroupLayout->setMargin( 11 ); + + // --> elements --> total + QLabel* mySubMeshNbElementsLab = new QLabel( COLONIZE( tr( "SMESH_MESHINFO_TOTAL" ) ), mySubMeshElementsGroup, "mySubMeshNbElementsLab" ); + mySubMeshNbElementsLab->setFont( fnt ); + mySubMeshNbElements = new QLabel( mySubMeshElementsGroup, "mySubMeshNbElements" ); + mySubMeshNbElements->setMinimumWidth( 100 ); + mySubMeshNbElements->setFont( fnt ); + + // --> elements --> edges + QLabel* mySubMeshNbEdgesLab = new QLabel( COLONIZE( tr( "SMESH_MESHINFO_EDGES" ) ), mySubMeshElementsGroup, "mySubMeshNbEdgesLab" ); + mySubMeshNbEdges = new QLabel( mySubMeshElementsGroup, "mySubMeshNbEdges" ); + mySubMeshNbEdges->setMinimumWidth( 100 ); + + // --> elements --> faces + QLabel* mySubMeshNbFacesLab = new QLabel( COLONIZE( tr( "SMESH_MESHINFO_FACES" ) ), mySubMeshElementsGroup, "mySubMeshNbFacesLab" ); + mySubMeshNbFaces = new QLabel( mySubMeshElementsGroup, "mySubMeshNbFaces" ); + mySubMeshNbFaces->setMinimumWidth( 100 ); + + // --> elements --> volumes + QLabel* mySubMeshNbVolumesLab = new QLabel( COLONIZE( tr( "SMESH_MESHINFO_VOLUMES" ) ), mySubMeshElementsGroup, "mySubMeshNbVolumesLab" ); + mySubMeshNbVolumes = new QLabel( mySubMeshElementsGroup, "mySubMeshNbVolumes" ); + mySubMeshNbVolumes->setMinimumWidth( 100 ); + + mySubMeshElementsGroupLayout->addWidget( mySubMeshNbElementsLab, 0, 0 ); + mySubMeshElementsGroupLayout->addWidget( mySubMeshNbElements, 0, 1 ); + mySubMeshElementsGroupLayout->addWidget( mySubMeshNbEdgesLab, 1, 0 ); + mySubMeshElementsGroupLayout->addWidget( mySubMeshNbEdges, 1, 1 ); + mySubMeshElementsGroupLayout->addWidget( mySubMeshNbFacesLab, 2, 0 ); + mySubMeshElementsGroupLayout->addWidget( mySubMeshNbFaces, 2, 1 ); + mySubMeshElementsGroupLayout->addWidget( mySubMeshNbVolumesLab, 3, 0 ); + mySubMeshElementsGroupLayout->addWidget( mySubMeshNbVolumes, 3, 1 ); + + aSubMeshLayout->addWidget( mySubMeshNameLab, 0, 0 ); + aSubMeshLayout->addWidget( mySubMeshName, 0, 1 ); + aSubMeshLayout->addMultiCellWidget( line2, 1, 1, 0, 1 ); + aSubMeshLayout->addWidget( mySubMeshNbNodesLab, 2, 0 ); + aSubMeshLayout->addWidget( mySubMeshNbNodes, 2, 1 ); + aSubMeshLayout->addMultiCellWidget( mySubMeshElementsGroup, 3, 3, 0, 1 ); + aSubMeshLayout->addItem( new QSpacerItem( 5, 5, QSizePolicy::Minimum, QSizePolicy::Expanding ), 4, 0 ); + + // group + myGroupWidget = new QWidget( myWGStack ); + QGridLayout* myGroupWidgetLayout = new QGridLayout( myGroupWidget ); + myGroupWidgetLayout->setSpacing( 6 ); myGroupWidgetLayout->setMargin( 0 ); + myWGStack->addWidget( myGroupWidget ); + + // --> name + QLabel* myGroupNameLab = new QLabel( COLONIZE( tr( "SMESH_MESHINFO_NAME" ) ), myGroupWidget, "myGroupNameLab" ); + myGroupName = new QLabel( myGroupWidget, "myGroupName" ); + myGroupName->setMinimumWidth( 100 ); + QFrame* line3 = new QFrame( myGroupWidget ); + line3->setFrameStyle( QFrame::HLine | QFrame::Sunken ); + + // --> type + QLabel* myGroupTypeLab = new QLabel( COLONIZE( tr( "SMESH_MESHINFO_TYPE" ) ), myGroupWidget, "myGroupTypeLab" ); + myGroupType = new QLabel( myGroupWidget, "myGroupType" ); + myGroupType->setMinimumWidth( 100 ); + + // --> number of entities + QLabel* myGroupNbLab = new QLabel( COLONIZE( tr( "SMESH_MESHINFO_ENTITIES" ) ), myGroupWidget, "myGroupNbLab" ); + myGroupNb = new QLabel( myGroupWidget, "myGroupNb" ); + myGroupNb->setMinimumWidth( 100 ); + + myGroupWidgetLayout->addWidget( myGroupNameLab, 0, 0 ); + myGroupWidgetLayout->addWidget( myGroupName, 0, 1 ); + myGroupWidgetLayout->addMultiCellWidget( line3, 1, 1, 0, 1 ); + myGroupWidgetLayout->addWidget( myGroupTypeLab, 2, 0 ); + myGroupWidgetLayout->addWidget( myGroupType, 2, 1 ); + myGroupWidgetLayout->addWidget( myGroupNbLab, 3, 0 ); + myGroupWidgetLayout->addWidget( myGroupNb, 3, 1 ); + myGroupWidgetLayout->addItem( new QSpacerItem( 5, 5, QSizePolicy::Minimum, QSizePolicy::Expanding ), 4, 0 ); + + // buttons + myButtonsGroup = new QGroupBox( this, "myButtonsGroup" ); + myButtonsGroup->setColumnLayout(0, Qt::Vertical ); + myButtonsGroup->layout()->setSpacing( 0 ); myButtonsGroup->layout()->setMargin( 0 ); + QHBoxLayout* myButtonsGroupLayout = new QHBoxLayout( myButtonsGroup->layout() ); + myButtonsGroupLayout->setAlignment( Qt::AlignTop ); + myButtonsGroupLayout->setSpacing( 6 ); myButtonsGroupLayout->setMargin( 11 ); + + // buttons --> OK button + myOkBtn = new QPushButton( tr( "SMESH_BUT_OK" ), myButtonsGroup, "myOkBtn" ); + myOkBtn->setAutoDefault( TRUE ); myOkBtn->setDefault( TRUE ); + myButtonsGroupLayout->addStretch(); + myButtonsGroupLayout->addWidget( myOkBtn ); + myButtonsGroupLayout->addStretch(); + + aTopLayout->addLayout( aSelectLayout ); + aTopLayout->addWidget( myWGStack ); + aTopLayout->addWidget( myButtonsGroup ); + + mySelection = SALOME_Selection::Selection( SMESHGUI::GetSMESHGUI()->GetActiveStudy()->getSelection() ); + SMESHGUI::GetSMESHGUI()->SetActiveDialogBox( this ) ; + + // connect signals + connect( myOkBtn, SIGNAL( clicked() ), this, SLOT( close() ) ); + connect( mySelectBtn, SIGNAL( clicked() ), this, SLOT( onStartSelection() ) ); + connect( SMESHGUI::GetSMESHGUI(), SIGNAL( SignalCloseAllDialogs() ), this, SLOT( close() ) ) ; + connect( SMESHGUI::GetSMESHGUI(), SIGNAL( SignalDeactivateActiveDialog() ), this, SLOT( DeactivateActiveDialog() ) ) ; + connect( mySelection, SIGNAL( currentSelectionChanged() ), this, SLOT( onSelectionChanged() ) ); + + // resize and move dialog, then show + int x, y; + SMESHGUI::GetSMESHGUI()->DefineDlgPosition( this, x, y ); + this->move( x, y ); + this->show(); + + // init dialog with current selection + onSelectionChanged(); } //================================================================================= -// function : genEdgeKey -// purpose : edge counting helper; -// packs two long integers into one 8-byte value (treated as double by the caller); -// the order of arguments is insignificant +/*! + * SMESHGUI_MeshInfosDlg::~SMESHGUI_MeshInfosDlg + * + * Destructor + */ //================================================================================= -void genEdgeKey(long a, long b, void* key) +SMESHGUI_MeshInfosDlg::~SMESHGUI_MeshInfosDlg() { - long* lKey = (long*)key; - *lKey = (a < b) ? a : b; - *(++lKey) = (a < b) ? b : a; } //================================================================================= -// function : DumpMeshInfos() -// purpose : +/*! + * SMESHGUI_MeshInfosDlg::DumpMeshInfos + */ //================================================================================= void SMESHGUI_MeshInfosDlg::DumpMeshInfos() { - int nbOfNodes = myMesh->NbNodes(); - int nbOfEdges = myMesh->NbEdges(); - int nbOfTriangles = myMesh->NbTriangles(); - int nbOfQuadrangles = myMesh->NbQuadrangles(); - int nbOfTetras = myMesh->NbTetras(); - int nbOfHexas = myMesh->NbHexas(); - - /* - int nbOfNodes = 0 ; - int nbOfEdges = 0 ; - int nbOfTriangles = 0 ; - int nbOfQuadrangles = 0 ; - int nbOfTetras = 0 ; - int nbOfHexas = 0 ; - int nbCells = 0 ; - int CellType = 0 ; - QMap aMapOfEdges; - - Standard_Boolean result; - SMESH_Actor* MeshActor = mySMESHGUI->FindActor(myMesh, result, true); - - if ( result ) { - vtkUnstructuredGrid* ugrid = vtkUnstructuredGrid::SafeDownCast( MeshActor->DataSource ); - vtkPoints *Pts = ugrid->GetPoints(); - nbOfNodes = Pts->GetNumberOfPoints(); - int nbCells = ugrid->GetNumberOfCells(); - - for ( int i = 0; i < nbCells; i++ ) { - vtkCell* cellPtr = ugrid->GetCell(i); - CellType = cellPtr->GetCellType(); - switch (CellType) - { - case 3: //Edges - { - nbOfEdges++; - break; - } - case 5: //Triangles - { - nbOfTriangles++; - - for (int edgeNum = 0; edgeNum < 3; edgeNum++) { - vtkCell* edgePtr = cellPtr->GetEdge(edgeNum); - double anEdgeKey; - genEdgeKey(edgePtr->GetPointId(0), edgePtr->GetPointId(1), &anEdgeKey); - if (!aMapOfEdges.contains(anEdgeKey)) { - nbOfEdges++; - aMapOfEdges.insert(anEdgeKey, 0); - } - } - break; - } - case 9: //Quadrangles - { - nbOfQuadrangles++; - - for (int edgeNum = 0; edgeNum < 4; edgeNum++) { - vtkCell* edgePtr = cellPtr->GetEdge(edgeNum); - double anEdgeKey; - genEdgeKey(edgePtr->GetPointId(0), edgePtr->GetPointId(1), &anEdgeKey); - if (!aMapOfEdges.contains(anEdgeKey)) { - nbOfEdges++; - aMapOfEdges.insert(anEdgeKey, 0); - } - } - break; - } - case 10: //Tetraedras - { - nbOfTetras++; - - for (int edgeNum = 0; edgeNum < 6; edgeNum++) { - vtkCell* edgePtr = cellPtr->GetEdge(edgeNum); - double anEdgeKey; - genEdgeKey(edgePtr->GetPointId(0), edgePtr->GetPointId(1), &anEdgeKey); - if (!aMapOfEdges.contains(anEdgeKey)) { - nbOfEdges++; - aMapOfEdges.insert(anEdgeKey, 0); - } - } - break; - } - case 12: //Hexahedras - { - nbOfHexas++; - - for (int edgeNum = 0; edgeNum < 12; edgeNum++) { - vtkCell* edgePtr = cellPtr->GetEdge(edgeNum); - double anEdgeKey; - genEdgeKey(edgePtr->GetPointId(0), edgePtr->GetPointId(1), &anEdgeKey); - if (!aMapOfEdges.contains(anEdgeKey)) { - nbOfEdges++; - aMapOfEdges.insert(anEdgeKey, 0); - } - } - break; + QAD_WaitCursor wc; + int nbSel = mySelection->IObjectCount(); + if ( nbSel == 1 ) { + myStartSelection = false; + mySelectLab->setText( "" ); + Handle(SALOME_InteractiveObject) IObject = mySelection->firstIObject(); + SALOMEDS::SObject_var aSO = SMESHGUI::GetSMESHGUI()->GetStudy()->FindObjectID( IObject->getEntry() ); + if ( !aSO->_is_nil() ) { + CORBA::Object_var anObject = aSO->GetObject(); + if ( !CORBA::is_nil( anObject ) ) { + SMESH::SMESH_Mesh_var aMesh = SMESH::SMESH_Mesh::_narrow( anObject ); + if ( !aMesh->_is_nil() ) { + myWGStack->raiseWidget( myMeshWidget ); + setCaption( tr( "SMESH_MESHINFO_TITLE" ) + " [" + tr("SMESH_OBJECT_MESH") +"]" ); + myMeshName->setText( aSO->GetName() ); + myMeshNbNodes->setNum( (int)aMesh->NbNodes() ); + myMeshNbEdges->setNum( (int)aMesh->NbEdges() ); + myMeshNbFaces->setNum( (int)aMesh->NbFaces() ); + myMeshNbTriangles->setNum( (int)aMesh->NbTriangles() ); + myMeshNbQuadrangles->setNum( (int)aMesh->NbQuadrangles() ); + myMeshNbVolumes->setNum( (int)aMesh->NbVolumes() ); + myMeshNbTetra->setNum( (int)aMesh->NbTetras() ); + myMeshNbHexa->setNum( (int)aMesh->NbHexas() ); + myMeshNbPrism->setNum( (int)aMesh->NbPrisms() ); + myMeshNbPyra->setNum( (int)aMesh->NbPyramids() ); + return; + } + SMESH::SMESH_subMesh_var aSubMesh = SMESH::SMESH_subMesh::_narrow( anObject ); + if ( !aSubMesh->_is_nil() ) { + myWGStack->raiseWidget( mySubMeshWidget ); + setCaption( tr( "SMESH_MESHINFO_TITLE" ) + " [" + tr("SMESH_SUBMESH") +"]" ); + mySubMeshName->setText( aSO->GetName() ); + mySubMeshNbNodes->setNum( (int)aSubMesh->GetNumberOfNodes() ); + mySubMeshNbElements->setNum( (int)aSubMesh->GetNumberOfElements() ); + mySubMeshNbEdges->setNum( (int)( aSubMesh->GetElementsByType( SMESH::EDGE )->length() ) ); + mySubMeshNbFaces->setNum( (int)( aSubMesh->GetElementsByType( SMESH::FACE )->length() ) ); + mySubMeshNbVolumes->setNum( (int)( aSubMesh->GetElementsByType( SMESH::VOLUME )->length() ) ); + return; + } + SMESH::SMESH_Group_var aGroup = SMESH::SMESH_Group::_narrow( anObject ); + if ( !aGroup->_is_nil() ) { + myWGStack->raiseWidget( myGroupWidget ); + setCaption( tr( "SMESH_MESHINFO_TITLE" ) + " [" + tr("SMESH_GROUP") +"]" ); + myGroupName->setText( aSO->GetName() ); + int aType = aGroup->GetType(); + QString strType; + switch ( aType ) { + case SMESH::NODE: + strType = "SMESH_MESHINFO_NODES"; break; + case SMESH::EDGE: + strType = "SMESH_MESHINFO_EDGES"; break; + case SMESH::FACE: + strType = "SMESH_MESHINFO_FACES"; break; + case SMESH::VOLUME: + strType = "SMESH_MESHINFO_VOLUMES"; break; + default: + strType = "SMESH_MESHINFO_ALL_TYPES"; break; } + + myGroupType->setText( tr( strType ) ); + myGroupNb->setNum( (int)aGroup->Size() ); + return; } + } } } - */ - TextLabel13->setText( tr( "%1" ).arg(nbOfNodes) ); - TextLabel14->setText( tr( "%1" ).arg(nbOfEdges) ); - TextLabel23->setText( tr( "%1" ).arg(nbOfTriangles) ); - TextLabel24->setText( tr( "%1" ).arg(nbOfQuadrangles) ); - TextLabel33->setText( tr( "%1" ).arg(nbOfTetras) ); - TextLabel34->setText( tr( "%1" ).arg(nbOfHexas) ); -} - -//================================================================================= -// function : ClickOnOk() -// purpose : -//================================================================================= -void SMESHGUI_MeshInfosDlg::ClickOnOk() -{ - disconnect( mySelection, 0, this, 0 ); - mySMESHGUI->ResetState() ; - reject() ; - return ; + myWGStack->raiseWidget( 0 ); + setCaption( tr( "SMESH_MESHINFO_TITLE" ) ); } //================================================================================= // function : SelectionIntoArgument() // purpose : Called when selection has changed //================================================================================= -void SMESHGUI_MeshInfosDlg::SelectionIntoArgument() +void SMESHGUI_MeshInfosDlg::onSelectionChanged() { - TextLabel13->setText( "0" ); - TextLabel14->setText( "0" ); - TextLabel23->setText( "0" ); - TextLabel24->setText( "0" ); - TextLabel33->setText( "0" ); - TextLabel34->setText( "0" ); - - int nbSel = mySelection->IObjectCount(); - if ( nbSel == 1 ) { - Handle(SALOME_InteractiveObject) IObject = mySelection->firstIObject(); - Standard_Boolean res; - myMesh = mySMESHGUI->ConvertIOinMesh( IObject, res ); - if ( res ) - DumpMeshInfos(); - } - return ; + if ( myStartSelection ) + DumpMeshInfos(); } @@ -404,20 +447,21 @@ void SMESHGUI_MeshInfosDlg::SelectionIntoArgument() //================================================================================= void SMESHGUI_MeshInfosDlg::closeEvent( QCloseEvent* e ) { - disconnect( mySelection, 0, this, 0 ); - mySMESHGUI->ResetState() ; - reject() ; - return ; + SMESHGUI::GetSMESHGUI()->ResetState(); + QDialog::closeEvent( e ); } //================================================================================= -// function : enterEvent() -// purpose : when mouse enter onto the QWidget +// function : windowActivationChange() +// purpose : called when window is activated/deactivated //================================================================================= -void SMESHGUI_MeshInfosDlg::enterEvent( QEvent * ) +void SMESHGUI_MeshInfosDlg::windowActivationChange( bool oldActive ) { - ActivateThisDialog() ; + QDialog::windowActivationChange( oldActive ); + if ( isActiveWindow() && myIsActiveWindow != isActiveWindow() ) + ActivateThisDialog() ; + myIsActiveWindow = isActiveWindow(); } @@ -428,8 +472,6 @@ void SMESHGUI_MeshInfosDlg::enterEvent( QEvent * ) void SMESHGUI_MeshInfosDlg::DeactivateActiveDialog() { disconnect( mySelection, 0, this, 0 ); - - return ; } @@ -440,8 +482,18 @@ void SMESHGUI_MeshInfosDlg::DeactivateActiveDialog() void SMESHGUI_MeshInfosDlg::ActivateThisDialog() { /* Emit a signal to deactivate any active dialog */ - mySMESHGUI->EmitSignalDeactivateDialog() ; - - return ; + SMESHGUI::GetSMESHGUI()->EmitSignalDeactivateDialog() ; + connect( mySelection, SIGNAL( currentSelectionChanged() ), this, SLOT( onSelectionChanged() ) ); } +//================================================================================= +// function : onStartSelection() +// purpose : starts selection +//================================================================================= +void SMESHGUI_MeshInfosDlg::onStartSelection() +{ + myStartSelection = true; + onSelectionChanged(); + myStartSelection = true; + mySelectLab->setText( tr( "INF_SELECT_OBJECT" ) ); +} diff --git a/src/SMESHGUI/SMESHGUI_MeshInfosDlg.h b/src/SMESHGUI/SMESHGUI_MeshInfosDlg.h index bef45b9b2..c5f65073d 100644 --- a/src/SMESHGUI/SMESHGUI_MeshInfosDlg.h +++ b/src/SMESHGUI/SMESHGUI_MeshInfosDlg.h @@ -29,74 +29,80 @@ #ifndef SMESHGUI_MESHINFOSDLG_H #define SMESHGUI_MESHINFOSDLG_H -#include "SALOME_Selection.h" -#include "QAD_Study.h" - // IDL Headers #include #include CORBA_SERVER_HEADER(SMESH_Gen) #include CORBA_SERVER_HEADER(SMESH_Mesh) // QT Includes -#include #include -class QVBoxLayout; -class QHBoxLayout; -class QGridLayout; + class QGroupBox; class QLabel; class QPushButton; -class SMESHGUI; +class SALOME_Selection; +class QWidgetStack; class SMESHGUI_MeshInfosDlg : public QDialog { Q_OBJECT public: - SMESHGUI_MeshInfosDlg( QWidget* parent = 0, const char* name = 0, SALOME_Selection* Sel = 0, bool modal = FALSE, WFlags fl = 0 ); + SMESHGUI_MeshInfosDlg( QWidget* parent = 0, const char* name = 0, bool modal = FALSE, WFlags fl = 0 ); ~SMESHGUI_MeshInfosDlg(); -private: - - void Init( SALOME_Selection* Sel ) ; - void closeEvent( QCloseEvent* e ) ; - void enterEvent ( QEvent * ) ; /* mouse enter the QWidget */ +protected: + void closeEvent( QCloseEvent* e ); + void windowActivationChange( bool oldActive ); void DumpMeshInfos(); - SMESH::SMESH_Gen_var myCompMesh ; - SMESHGUI* mySMESHGUI ; - SMESH::SMESH_Mesh_var myMesh ; - SALOME_Selection* mySelection ; - SALOMEDS::Study_var myStudy; +private slots: + void onSelectionChanged(); + void DeactivateActiveDialog() ; + void ActivateThisDialog(); + void onStartSelection(); - QGroupBox* GroupBox1; - QLabel* TextLabel12; - QLabel* TextLabel11; - QLabel* TextLabel13; - QLabel* TextLabel14; - QGroupBox* GroupBox2; - QLabel* TextLabel21; - QLabel* TextLabel22; - QLabel* TextLabel23; - QLabel* TextLabel24; - QGroupBox* GroupBox3; - QLabel* TextLabel31; - QLabel* TextLabel32; - QLabel* TextLabel33; - QLabel* TextLabel34; - QPushButton* buttonOk; +private: + SALOME_Selection* mySelection; + bool myStartSelection; + bool myIsActiveWindow; + + QPushButton* mySelectBtn; + QLabel* mySelectLab; -private slots: + QWidgetStack* myWGStack; - void ClickOnOk(); - void SelectionIntoArgument() ; - void DeactivateActiveDialog() ; - void ActivateThisDialog() ; + QWidget* myMeshWidget; + QLabel* myMeshName; + QLabel* myMeshNbNodes; + QLabel* myMeshNbEdges; + QGroupBox* myMeshFacesGroup; + QLabel* myMeshNbFaces; + QLabel* myMeshNbTriangles; + QLabel* myMeshNbQuadrangles; + QGroupBox* myMeshVolumesGroup; + QLabel* myMeshNbVolumes; + QLabel* myMeshNbTetra; + QLabel* myMeshNbHexa; + QLabel* myMeshNbPyra; + QLabel* myMeshNbPrism; + + QWidget* mySubMeshWidget; + QLabel* mySubMeshName; + QLabel* mySubMeshNbNodes; + QGroupBox* mySubMeshElementsGroup; + QLabel* mySubMeshNbElements; + QLabel* mySubMeshNbEdges; + QLabel* mySubMeshNbFaces; + QLabel* mySubMeshNbVolumes; -protected: - QVBoxLayout* SMESHGUI_MeshInfosDlgLayout; - QHBoxLayout* Layout1; + QWidget* myGroupWidget; + QLabel* myGroupName; + QLabel* myGroupType; + QLabel* myGroupNb; + QGroupBox* myButtonsGroup; + QPushButton* myOkBtn; }; #endif // SMESHGUI_MESHINFOSDLG_H diff --git a/src/SMESHGUI/SMESHGUI_MoveNodesDlg.cxx b/src/SMESHGUI/SMESHGUI_MoveNodesDlg.cxx index 72c2f95e7..f44ffac11 100644 --- a/src/SMESHGUI/SMESHGUI_MoveNodesDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_MoveNodesDlg.cxx @@ -26,10 +26,10 @@ // Module : SMESH // $Header$ -using namespace std; #include "SMESHGUI_MoveNodesDlg.h" -#include "SMESHGUI.h" #include "SMESHGUI_SpinBox.h" +#include "SMESH_Actor.h" +#include "SMESHGUI.h" #include "QAD_Application.h" #include "QAD_Desktop.h" @@ -53,8 +53,7 @@ using namespace std; // Open CASCADE Include #include -// VTK Include -#include +using namespace std; //================================================================================= // class : SMESHGUI_MoveNodesDlg() @@ -309,7 +308,7 @@ void SMESHGUI_MoveNodesDlg::ClickOnOk() //================================================================================= void SMESHGUI_MoveNodesDlg::ClickOnCancel() { - QAD_Application::getDesktop()->SetSelectionMode( 4 ); + QAD_Application::getDesktop()->SetSelectionMode( ActorSelection ); disconnect( mySelection, 0, this, 0 ); mySMESHGUI->ResetState() ; mySMESHGUI->EraseSimulationActors(); @@ -347,9 +346,9 @@ void SMESHGUI_MoveNodesDlg::SelectionIntoArgument() return ; } - if ( mySelection->SelectionMode() != 1 ){ + if ( mySelection->SelectionMode() != NodeSelection ){ QAD_MessageBox::warn1 ( QAD_Application::getDesktop(), tr ("SMESH_WRN_WARNING"), - tr ("SMESH_WRN_SELECTIONMODE_NODES"), tr ("SMESH_BUT_YES") ); + tr ("SMESH_WRN_SELECTIONMODE_NODES"), tr ("SMESH_BUT_OK") ); return; } diff --git a/src/SMESHGUI/SMESHGUI_NodesDlg.cxx b/src/SMESHGUI/SMESHGUI_NodesDlg.cxx index 8a757402e..5ae62afc1 100644 --- a/src/SMESHGUI/SMESHGUI_NodesDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_NodesDlg.cxx @@ -284,7 +284,7 @@ void SMESHGUI_NodesDlg::ClickOnApply() //======================================================================= void SMESHGUI_NodesDlg::ClickOnCancel() { - QAD_Application::getDesktop()->SetSelectionMode( 4 ); + QAD_Application::getDesktop()->SetSelectionMode( ActorSelection ); disconnect( mySelection, 0, this, 0 ); myMeshGUI->ResetState() ; myMeshGUI->EraseSimulationActors() ; @@ -316,12 +316,12 @@ void SMESHGUI_NodesDlg::SelectionIntoArgument() return ; } - if ( mySelection->SelectionMode() != 1 ) { + if ( mySelection->SelectionMode() != NodeSelection ) { SpinBox_X->SetValue(0.0) ; SpinBox_Y->SetValue(0.0) ; SpinBox_Z->SetValue(0.0) ; QAD_MessageBox::warn1 ( QAD_Application::getDesktop(), tr ("SMESH_WRN_WARNING"), - tr ("SMESH_WRN_SELECTIONMODE_NODES"), tr ("SMESH_BUT_YES") ); + tr ("SMESH_WRN_SELECTIONMODE_NODES"), tr ("SMESH_BUT_OK") ); return; } @@ -345,7 +345,7 @@ void SMESHGUI_NodesDlg::SelectionIntoArgument() Standard_Boolean result; SMESH_Actor* ac = myMeshGUI->FindActor( myMesh, result, true ); - vtkUnstructuredGrid* ugrid = vtkUnstructuredGrid::SafeDownCast( ac->DataSource ); + vtkUnstructuredGrid* ugrid = vtkUnstructuredGrid::SafeDownCast( ac->GetUnstructuredGrid() ); float *p0 = ugrid->GetPoint(idNodes[0]); SpinBox_X->SetValue( p0[0] ) ; diff --git a/src/SMESHGUI/SMESHGUI_OrientationElementsDlg.cxx b/src/SMESHGUI/SMESHGUI_OrientationElementsDlg.cxx index dbcc09c75..92b7101a5 100644 --- a/src/SMESHGUI/SMESHGUI_OrientationElementsDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_OrientationElementsDlg.cxx @@ -249,7 +249,7 @@ void SMESHGUI_OrientationElementsDlg::ClickOnOk() //================================================================================= void SMESHGUI_OrientationElementsDlg::ClickOnCancel() { - QAD_Application::getDesktop()->SetSelectionMode( 4 ); + QAD_Application::getDesktop()->SetSelectionMode( ActorSelection ); disconnect( mySelection, 0, this, 0 ); mySMESHGUI->ResetState() ; reject() ; @@ -275,9 +275,9 @@ void SMESHGUI_OrientationElementsDlg::SelectionIntoArgument() if(nbElements < 1) return ; - if ( mySelection->SelectionMode() != 3 ) { + if ( mySelection->SelectionMode() != FaceSelection ) { QAD_MessageBox::warn1 ( QAD_Application::getDesktop(), tr ("SMESH_WRN_WARNING"), - tr ("SMESH_WRN_SELECTIONMODE_ELEMENTS"), tr ("SMESH_BUT_YES") ); + tr ("SMESH_WRN_SELECTIONMODE_ELEMENTS"), tr ("SMESH_BUT_OK") ); return; } diff --git a/src/SMESHGUI/SMESHGUI_Preferences_ScalarBarDlg.cxx b/src/SMESHGUI/SMESHGUI_Preferences_ScalarBarDlg.cxx index 060834165..1989d2c14 100644 --- a/src/SMESHGUI/SMESHGUI_Preferences_ScalarBarDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_Preferences_ScalarBarDlg.cxx @@ -28,6 +28,7 @@ using namespace std; #include "SMESHGUI_Preferences_ScalarBarDlg.h" +#include "SMESHGUI.h" #include #include @@ -36,171 +37,695 @@ using namespace std; #include #include #include +#include #include #include #include -#include -#include -#include +#include +#include -/* - * Constructs a SMESHGUI_Preferences_ScalarBarDlg which is a child of 'parent', with the - * name 'name' and widget flags set to 'f' +#include +#include + +#include "QAD_SpinBoxDbl.h" +#include "QAD_Config.h" +#include "SALOME_Selection.h" +#include "SMESHGUI.h" +#include "SMESH_Actor.h" + +#define MINIMUM_WIDTH 70 +#define MARGIN_SIZE 11 +#define SPACING_SIZE 6 + +#define DEF_VER_X 0.01 +#define DEF_VER_Y 0.10 +#define DEF_VER_H 0.80 +#define DEF_VER_W 0.10 +#define DEF_HOR_X 0.20 +#define DEF_HOR_Y 0.01 +#define DEF_HOR_H 0.12 +#define DEF_HOR_W 0.60 + +// Only one instance is allowed +SMESHGUI_Preferences_ScalarBarDlg* SMESHGUI_Preferences_ScalarBarDlg::myDlg = 0; + +//================================================================================================= +/*! + * SMESHGUI_Preferences_ScalarBarDlg::ScalarBarProperties + * + * Gets the only instance of "Scalar Bar Properties" dialog box + */ +//================================================================================================= +void SMESHGUI_Preferences_ScalarBarDlg::ScalarBarProperties(QWidget* parent, + SALOME_Selection* Sel) +{ + if ( !myDlg ) { + myDlg = new SMESHGUI_Preferences_ScalarBarDlg( parent, Sel, false ); + myDlg->show(); + } + else { + myDlg->show(); + myDlg->setActiveWindow(); + myDlg->raise(); + myDlg->setFocus(); + } +} + +//================================================================================================= +/*! + * SMESHGUI_Preferences_ScalarBarDlg::ScalarBarPreferences + * + * Opens "Scalar Bar Preferences" dialog box + */ +//================================================================================================= +void SMESHGUI_Preferences_ScalarBarDlg::ScalarBarPreferences( QWidget* parent ) +{ + SMESHGUI_Preferences_ScalarBarDlg* aDlg = new SMESHGUI_Preferences_ScalarBarDlg( parent, 0, true ); + aDlg->exec(); +} + +//================================================================================================= +/*! + * SMESHGUI_Preferences_ScalarBarDlg::SMESHGUI_Preferences_ScalarBarDlg * - * The dialog will by default be modeless, unless you set 'modal' to - * TRUE to construct a modal dialog. + * Constructor */ -SMESHGUI_Preferences_ScalarBarDlg::SMESHGUI_Preferences_ScalarBarDlg( QWidget* parent, const char* name, bool modal, WFlags fl ) - : QDialog( parent, name, modal, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu ) +//================================================================================================= +SMESHGUI_Preferences_ScalarBarDlg::SMESHGUI_Preferences_ScalarBarDlg(QWidget* parent, + SALOME_Selection* Sel, + bool modal) + : QDialog( parent, 0, modal, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu | WDestructiveClose ) { - if ( !name ) - setName( "SMESHGUI_Preferences_ScalarBarDlg" ); - setCaption( tr( "SMESH_PREFERENCES_SCALARBAR" ) ); - setSizeGripEnabled( TRUE ); - - grid = new QGridLayout( this ); - grid->setSpacing( 6 ); - grid->setMargin( 11 ); - - /******************************************************************************/ - Properties = new QGroupBox( this, "Properties" ); - Properties->setTitle( tr( "SMESH_PROPERTIES" ) ); - Properties->setColumnLayout(0, Qt::Vertical ); - Properties->layout()->setSpacing( 0 ); - Properties->layout()->setMargin( 0 ); - grid_4 = new QGridLayout( Properties->layout() ); - grid_4->setAlignment( Qt::AlignTop ); - grid_4->setSpacing( 6 ); - grid_4->setMargin( 11 ); - - /* Font */ - grid_5 = new QGridLayout; - grid_5->setSpacing( 6 ); - grid_5->setMargin( 0 ); - TextLabel2 = new QLabel( Properties, "TextLabel2" ); - TextLabel2->setText( tr( "SMESH_FONT" ) ); - grid_5->addWidget( TextLabel2, 0, 0 ); - ComboBox1 = new QComboBox( FALSE, Properties, "ComboBox1" ); - ComboBox1->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); - ComboBox1->insertItem( tr( "SMESH_FONT_ARIAL" ) ); - ComboBox1->insertItem( tr( "SMESH_FONT_COURIER" ) ); - ComboBox1->insertItem( tr( "SMESH_FONT_TIMES" ) ); - grid_5->addWidget( ComboBox1, 0, 1 ); - grid_4->addLayout( grid_5, 0, 0 ); + setName( "SMESHGUI_Preferences_ScalarBarDlg" ); + setCaption( Sel ? tr( "SMESH_PROPERTIES_SCALARBAR" ) : tr( "SMESH_PREFERENCES_SCALARBAR" ) ); + setSizeGripEnabled( TRUE ); + + mySelection = Sel; + myActor = 0; + + /******************************************************************************/ + // Top layout + QGridLayout* aTopLayout = new QGridLayout( this ); + aTopLayout->setSpacing( SPACING_SIZE ); aTopLayout->setMargin( MARGIN_SIZE ); + int aRow = 0; + + /******************************************************************************/ + // Scalar range + if ( mySelection ) { + myRangeGrp = new QGroupBox ( tr( "SMESH_RANGE_SCALARBAR" ), this, "myRangeGrp" ); + myRangeGrp->setColumnLayout( 0, Qt::Vertical ); + myRangeGrp->layout()->setSpacing( 0 ); myRangeGrp->layout()->setMargin( 0 ); + QGridLayout* myRangeGrpLayout = new QGridLayout( myRangeGrp->layout() ); + myRangeGrpLayout->setAlignment( Qt::AlignTop ); + myRangeGrpLayout->setSpacing( SPACING_SIZE ); myRangeGrpLayout->setMargin( MARGIN_SIZE ); + + myMinEdit = new QLineEdit( myRangeGrp, "myMinEdit" ); + myMinEdit->setMinimumWidth( MINIMUM_WIDTH ); + myMinEdit->setValidator( new QDoubleValidator( this ) ); + + myMaxEdit = new QLineEdit( myRangeGrp, "myMaxEdit" ); + myMaxEdit->setMinimumWidth( MINIMUM_WIDTH ); + myMaxEdit->setValidator( new QDoubleValidator( this ) ); + + myRangeGrpLayout->addWidget( new QLabel( tr( "SMESH_RANGE_MIN" ), myRangeGrp, "myMinLab" ), 0, 0 ); + myRangeGrpLayout->addWidget( myMinEdit, 0, 1 ); + myRangeGrpLayout->addWidget( new QLabel( tr( "SMESH_RANGE_MAX" ), myRangeGrp, "myMaxLab" ), 0, 2 ); + myRangeGrpLayout->addWidget( myMaxEdit, 0, 3 ); + + aTopLayout->addWidget( myRangeGrp, aRow, 0 ); + aRow++; + } + + /******************************************************************************/ + // Text properties + myFontGrp = new QGroupBox ( tr( "SMESH_FONT_SCALARBAR" ), this, "myFontGrp" ); + myFontGrp->setColumnLayout( 0, Qt::Vertical ); + myFontGrp->layout()->setSpacing( 0 ); myFontGrp->layout()->setMargin( 0 ); + QGridLayout* myFontGrpLayout = new QGridLayout( myFontGrp->layout() ); + myFontGrpLayout->setAlignment( Qt::AlignTop ); + myFontGrpLayout->setSpacing( SPACING_SIZE ); myFontGrpLayout->setMargin( MARGIN_SIZE ); + + myTitleColorBtn = new QToolButton( myFontGrp, "myTitleColorBtn" ); + + myTitleFontCombo = new QComboBox( false, myFontGrp, "myTitleFontCombo" ); + myTitleFontCombo->setMinimumWidth( MINIMUM_WIDTH ); + myTitleFontCombo->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); + myTitleFontCombo->insertItem( tr( "SMESH_FONT_ARIAL" ) ); + myTitleFontCombo->insertItem( tr( "SMESH_FONT_COURIER" ) ); + myTitleFontCombo->insertItem( tr( "SMESH_FONT_TIMES" ) ); + + myTitleBoldCheck = new QCheckBox( tr( "SMESH_FONT_BOLD" ), myFontGrp, "myTitleBoldCheck" ); + myTitleItalicCheck = new QCheckBox( tr( "SMESH_FONT_ITALIC" ), myFontGrp, "myTitleItalicCheck" ); + myTitleShadowCheck = new QCheckBox( tr( "SMESH_FONT_SHADOW" ), myFontGrp, "myTitleShadowCheck" ); + + myLabelsColorBtn = new QToolButton( myFontGrp, "myLabelsColorBtn" ); + + myLabelsFontCombo = new QComboBox( false, myFontGrp, "myLabelsFontCombo" ); + myLabelsFontCombo->setMinimumWidth( MINIMUM_WIDTH ); + myLabelsFontCombo->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); + myLabelsFontCombo->insertItem( tr( "SMESH_FONT_ARIAL" ) ); + myLabelsFontCombo->insertItem( tr( "SMESH_FONT_COURIER" ) ); + myLabelsFontCombo->insertItem( tr( "SMESH_FONT_TIMES" ) ); + + myLabelsBoldCheck = new QCheckBox( tr( "SMESH_FONT_BOLD" ), myFontGrp, "myLabelsBoldCheck" ); + myLabelsItalicCheck = new QCheckBox( tr( "SMESH_FONT_ITALIC" ), myFontGrp, "myLabelsItalicCheck" ); + myLabelsShadowCheck = new QCheckBox( tr( "SMESH_FONT_SHADOW" ), myFontGrp, "myLabelsShadowCheck" ); + + myFontGrpLayout->addWidget( new QLabel( tr( "SMESH_TITLE" ), myFontGrp, "myFontTitleLab" ), 0, 0 ); + myFontGrpLayout->addWidget( myTitleColorBtn, 0, 1 ); + myFontGrpLayout->addWidget( myTitleFontCombo, 0, 2 ); + myFontGrpLayout->addWidget( myTitleBoldCheck, 0, 3 ); + myFontGrpLayout->addWidget( myTitleItalicCheck, 0, 4 ); + myFontGrpLayout->addWidget( myTitleShadowCheck, 0, 5 ); + + myFontGrpLayout->addWidget( new QLabel( tr( "SMESH_LABELS" ), myFontGrp, "myFontLabelsLab" ), 1, 0 ); + myFontGrpLayout->addWidget( myLabelsColorBtn, 1, 1 ); + myFontGrpLayout->addWidget( myLabelsFontCombo, 1, 2 ); + myFontGrpLayout->addWidget( myLabelsBoldCheck, 1, 3 ); + myFontGrpLayout->addWidget( myLabelsItalicCheck, 1, 4 ); + myFontGrpLayout->addWidget( myLabelsShadowCheck, 1, 5 ); + + aTopLayout->addWidget( myFontGrp, aRow, 0 ); + aRow++; + + /******************************************************************************/ + // Labels & Colors + myLabColorGrp = new QGroupBox ( tr( "SMESH_LABELS_COLORS_SCALARBAR" ), this, "myLabColorGrp" ); + myLabColorGrp->setColumnLayout( 0, Qt::Vertical ); + myLabColorGrp->layout()->setSpacing( 0 ); myLabColorGrp->layout()->setMargin( 0 ); + QGridLayout* myLabColorGrpLayout = new QGridLayout( myLabColorGrp->layout() ); + myLabColorGrpLayout->setAlignment( Qt::AlignTop ); + myLabColorGrpLayout->setSpacing( SPACING_SIZE ); myLabColorGrpLayout->setMargin( MARGIN_SIZE ); + + myColorsSpin = new QSpinBox( 2, 256, 1, myLabColorGrp, "myColorsSpin" ); + myColorsSpin->setMinimumWidth( MINIMUM_WIDTH ); + myColorsSpin->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); + + myLabelsSpin = new QSpinBox( 2, 65, 1, myLabColorGrp, "myLabelsSpin" ); + myLabelsSpin->setMinimumWidth( MINIMUM_WIDTH ); + myLabelsSpin->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); + + myLabColorGrpLayout->addWidget( new QLabel( tr( "SMESH_NUMBEROFCOLORS" ), myLabColorGrp, "myNbColorLab" ), 0, 0 ); + myLabColorGrpLayout->addWidget( myColorsSpin, 0, 1 ); + myLabColorGrpLayout->addWidget( new QLabel( tr( "SMESH_NUMBEROFLABELS" ), myLabColorGrp, "myNbLabsLab" ), 0, 2 ); + myLabColorGrpLayout->addWidget( myLabelsSpin, 0, 3 ); + + aTopLayout->addWidget( myLabColorGrp, aRow, 0 ); + aRow++; + + /******************************************************************************/ + // Orientation + myOrientationGrp = new QButtonGroup ( tr( "SMESH_ORIENTATION" ), this, "myOrientationGrp" ); + myOrientationGrp->setColumnLayout( 0, Qt::Vertical ); + myOrientationGrp->layout()->setSpacing( 0 ); myOrientationGrp->layout()->setMargin( 0 ); + QGridLayout* myOrientationGrpLayout = new QGridLayout( myOrientationGrp->layout() ); + myOrientationGrpLayout->setAlignment( Qt::AlignTop ); + myOrientationGrpLayout->setSpacing( SPACING_SIZE ); myOrientationGrpLayout->setMargin( MARGIN_SIZE ); + + myVertRadioBtn = new QRadioButton( tr( "SMESH_VERTICAL" ), myOrientationGrp, "myVertRadioBtn" ); + myHorizRadioBtn = new QRadioButton( tr( "SMESH_HORIZONTAL" ), myOrientationGrp, "myHorizRadioBtn" ); + myVertRadioBtn->setChecked( true ); + + myOrientationGrpLayout->addWidget( myVertRadioBtn, 0, 0 ); + myOrientationGrpLayout->addWidget( myHorizRadioBtn, 0, 1 ); + + aTopLayout->addWidget( myOrientationGrp, aRow, 0 ); + aRow++; + + /******************************************************************************/ + // Position & Size + myOriginDimGrp = new QGroupBox ( tr( "SMESH_POSITION_SIZE_SCALARBAR" ), this, "myOriginDimGrp" ); + myOriginDimGrp->setColumnLayout( 0, Qt::Vertical ); + myOriginDimGrp->layout()->setSpacing( 0 ); myOriginDimGrp->layout()->setMargin( 0 ); + QGridLayout* myOriginDimGrpLayout = new QGridLayout( myOriginDimGrp->layout() ); + myOriginDimGrpLayout->setAlignment( Qt::AlignTop ); + myOriginDimGrpLayout->setSpacing( SPACING_SIZE ); myOriginDimGrpLayout->setMargin( MARGIN_SIZE ); - /* Font attributes */ - grid_6 = new QGridLayout; - grid_6->setSpacing( 6 ); - grid_6->setMargin( 0 ); - Bold = new QCheckBox( Properties, "Bold" ); - Bold->setText( tr( "SMESH_FONT_BOLD" ) ); - grid_6->addWidget( Bold, 0, 0 ); - Italic = new QCheckBox( Properties, "Italic" ); - Italic->setText( tr( "SMESH_FONT_ITALIC" ) ); - grid_6->addWidget( Italic, 0, 1 ); - Shadow = new QCheckBox( Properties, "Shadow" ); - Shadow->setText( tr( "SMESH_FONT_SHADOW" ) ); - grid_6->addWidget( Shadow, 0, 2 ); - grid_4->addLayout( grid_6, 1, 0 ); - - grid_7 = new QGridLayout; - grid_7->setSpacing( 6 ); - grid_7->setMargin( 0 ); - NumberColors = new QLabel( Properties, "NumberColors" ); - NumberColors->setText( tr( "SMESH_NUMBEROFCOLORS" ) ); - grid_7->addWidget( NumberColors, 0, 0 ); - SpinBoxColors = new QSpinBox( Properties, "SpinBoxColors" ); - SpinBoxColors->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); - SpinBoxColors->setMinValue( 1 ); - grid_7->addWidget( SpinBoxColors, 0, 1 ); - NumberLabels = new QLabel( Properties, "NumberLabels" ); - NumberLabels->setText( tr( "SMESH_NUMBEROFLABELS" ) ); - grid_7->addWidget( NumberLabels, 1, 0 ); - SpinBoxLabels = new QSpinBox( Properties, "SpinBoxLabels" ); - SpinBoxLabels->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); - SpinBoxLabels->setMinValue( 1 ); - grid_7->addWidget( SpinBoxLabels, 1, 1 ); - grid_4->addLayout( grid_7, 2, 0 ); - - grid->addWidget( Properties, 0, 0 ); - - /******************************************************************************/ - ButtonGroup_Orientation = new QButtonGroup( this, "ButtonGroup_Orientation" ); - ButtonGroup_Orientation->setTitle( tr( "SMESH_ORIENTATION" ) ); - ButtonGroup_Orientation->setColumnLayout(0, Qt::Vertical ); - ButtonGroup_Orientation->layout()->setSpacing( 0 ); - ButtonGroup_Orientation->layout()->setMargin( 0 ); - grid_2 = new QGridLayout( ButtonGroup_Orientation->layout() ); - grid_2->setAlignment( Qt::AlignTop ); - grid_2->setSpacing( 6 ); - grid_2->setMargin( 11 ); - RadioVert = new QRadioButton( ButtonGroup_Orientation, "RadioVert" ); - RadioVert->setText( tr( "SMESH_VERTICAL" ) ); - RadioHoriz = new QRadioButton( ButtonGroup_Orientation, "RadioHoriz" ); - RadioHoriz->setText( tr( "SMESH_HORIZONTAL" ) ); - grid_2->addWidget( RadioVert, 0, 0 ); - grid_2->addWidget( RadioHoriz, 0, 1 ); - - grid->addWidget( ButtonGroup_Orientation, 1, 0 ); - - /******************************************************************************/ - GroupBox5 = new QGroupBox( this, "GroupBox5" ); - GroupBox5->setTitle( tr( "SMESH_DIMENSIONS" ) ); - GroupBox5->setColumnLayout(0, Qt::Vertical ); - GroupBox5->layout()->setSpacing( 0 ); - GroupBox5->layout()->setMargin( 0 ); - grid_11 = new QGridLayout( GroupBox5->layout() ); - grid_11->setAlignment( Qt::AlignTop ); - grid_11->setSpacing( 6 ); - grid_11->setMargin( 11 ); - - LineEditWidth = new QLineEdit( GroupBox5, "LineEditWidth" ); - grid_11->addWidget( LineEditWidth, 0, 0 ); - Width = new QLabel( GroupBox5, "Width" ); - Width->setText( tr( "SMESH_WIDTH" ) ); - grid_11->addWidget( Width, 0, 1 ); - LineEditHeight = new QLineEdit( GroupBox5, "LineEditHeight" ); - grid_11->addWidget( LineEditHeight, 1, 0 ); - Height = new QLabel( GroupBox5, "Height" ); - Height->setText( tr( "SMESH_HEIGHT" ) ); - grid_11->addWidget( Height, 1, 1 ); - - grid->addWidget( GroupBox5, 2, 0 ); - - /***************************************************************/ - QGroupBox* GroupButtons = new QGroupBox( this, "GroupButtons" ); - GroupButtons->setGeometry( QRect( 10, 10, 281, 48 ) ); - GroupButtons->setTitle( tr( "" ) ); - GroupButtons->setColumnLayout(0, Qt::Vertical ); - GroupButtons->layout()->setSpacing( 0 ); - GroupButtons->layout()->setMargin( 0 ); - grid_15 = new QGridLayout( GroupButtons->layout() ); - grid_15->setAlignment( Qt::AlignTop ); - grid_15->setSpacing( 6 ); - grid_15->setMargin( 11 ); - buttonOk = new QPushButton( GroupButtons, "buttonOk" ); - buttonOk->setText( tr( "SMESH_BUT_OK" ) ); - buttonOk->setAutoDefault( TRUE ); - buttonOk->setDefault( TRUE ); - grid_15->addWidget( buttonOk, 0, 0 ); - grid_15->addItem( new QSpacerItem( 20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum ), 0, 1 ); - buttonCancel = new QPushButton( GroupButtons, "buttonCancel" ); - buttonCancel->setText( tr( "SMESH_BUT_CANCEL" ) ); - buttonCancel->setAutoDefault( TRUE ); - grid_15->addWidget( buttonCancel, 0, 2 ); - - grid->addWidget( GroupButtons, 3, 0 ); - - // signals and slots connections - connect( buttonOk, SIGNAL( clicked() ), this, SLOT( accept() ) ); - connect( buttonCancel, SIGNAL( clicked() ), this, SLOT( reject() ) ); + myXSpin = new QAD_SpinBoxDbl( myOriginDimGrp, 0.0, 1.0, 0.1 ); + myXSpin->setMinimumWidth( MINIMUM_WIDTH ); + myXSpin->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); + + myYSpin = new QAD_SpinBoxDbl( myOriginDimGrp, 0.0, 1.0, 0.1 ); + myYSpin->setMinimumWidth( MINIMUM_WIDTH ); + myYSpin->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); + + myWidthSpin = new QAD_SpinBoxDbl( myOriginDimGrp, 0.0, 1.0, 0.1 ); + myWidthSpin->setMinimumWidth( MINIMUM_WIDTH ); + myWidthSpin->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); + + myHeightSpin = new QAD_SpinBoxDbl( myOriginDimGrp, 0.0, 1.0, 0.1 ); + myHeightSpin->setMinimumWidth( MINIMUM_WIDTH ); + myHeightSpin->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); + + myOriginDimGrpLayout->addWidget( new QLabel( tr( "SMESH_X_SCALARBAR" ), myOriginDimGrp, "myXLab" ), 0, 0 ); + myOriginDimGrpLayout->addWidget( myXSpin, 0, 1 ); + myOriginDimGrpLayout->addWidget( new QLabel( tr( "SMESH_Y_SCALARBAR" ), myOriginDimGrp, "myYLab" ), 0, 2 ); + myOriginDimGrpLayout->addWidget( myYSpin, 0, 3 ); + myOriginDimGrpLayout->addWidget( new QLabel( tr( "SMESH_WIDTH" ), myOriginDimGrp, "myWidthLab" ), 1, 0 ); + myOriginDimGrpLayout->addWidget( myWidthSpin, 1, 1 ); + myOriginDimGrpLayout->addWidget( new QLabel( tr( "SMESH_HEIGHT" ), myOriginDimGrp, "myHeightLab" ), 1, 2 ); + myOriginDimGrpLayout->addWidget( myHeightSpin, 1, 3 ); + + aTopLayout->addWidget( myOriginDimGrp, aRow, 0 ); + aRow++; + + /***************************************************************/ + // Common buttons + myButtonGrp = new QGroupBox( this, "myButtonGrp" ); + myButtonGrp->setColumnLayout(0, Qt::Vertical ); + myButtonGrp->layout()->setSpacing( 0 ); myButtonGrp->layout()->setMargin( 0 ); + QHBoxLayout* myButtonGrpLayout = new QHBoxLayout( myButtonGrp->layout() ); + myButtonGrpLayout->setAlignment( Qt::AlignTop ); + myButtonGrpLayout->setSpacing( SPACING_SIZE ); myButtonGrpLayout->setMargin( MARGIN_SIZE ); + + myOkBtn = new QPushButton( tr( "SMESH_BUT_OK" ), myButtonGrp, "myOkBtn" ); + myOkBtn->setAutoDefault( TRUE ); myOkBtn->setDefault( TRUE ); + myButtonGrpLayout->addWidget( myOkBtn ); + if ( mySelection ) { + myApplyBtn = new QPushButton( tr( "SMESH_BUT_APPLY" ), myButtonGrp, "myApplyBtn" ); + myApplyBtn->setAutoDefault( TRUE ); + myButtonGrpLayout->addWidget( myApplyBtn ); + } + myButtonGrpLayout->addStretch(); + myCancelBtn = new QPushButton( tr( "SMESH_BUT_CANCEL" ), myButtonGrp, "myCancelBtn" ); + if ( mySelection ) + myCancelBtn->setText( tr( "SMESH_BUT_CLOSE" ) ); + myCancelBtn->setAutoDefault( TRUE ); + myButtonGrpLayout->addWidget( myCancelBtn ); + + aTopLayout->addWidget( myButtonGrp, aRow, 0 ); + + /***************************************************************/ + // Init + // --> first init from preferences + QColor titleColor( 255, 255, 255 ); + if ( QAD_CONFIG->hasSetting( "SMESH:ScalarBarTitleColor" ) ) { + QStringList aTColor = QStringList::split( ":", QAD_CONFIG->getSetting( "SMESH:ScalarBarTitleColor" ), false ); + titleColor = QColor( ( aTColor.count() > 0 ? aTColor[0].toInt() : 255 ), + ( aTColor.count() > 1 ? aTColor[1].toInt() : 255 ), + ( aTColor.count() > 2 ? aTColor[2].toInt() : 255 ) ); + } + myTitleColorBtn->setPaletteBackgroundColor( titleColor ); + myTitleFontCombo->setCurrentItem( 0 ); + if ( QAD_CONFIG->hasSetting( "SMESH:ScalarBarTitleFont" ) ) { + if ( QAD_CONFIG->getSetting( "SMESH:ScalarBarTitleFont" ) == "Arial" ) + myTitleFontCombo->setCurrentItem( 0 ); + if ( QAD_CONFIG->getSetting( "SMESH:ScalarBarTitleFont" ) == "Courier" ) + myTitleFontCombo->setCurrentItem( 1 ); + if ( QAD_CONFIG->getSetting( "SMESH:ScalarBarTitleFont" ) == "Times" ) + myTitleFontCombo->setCurrentItem( 2 ); + } + myTitleBoldCheck->setChecked( QAD_CONFIG->getSetting( "SMESH:ScalarBarTitleBold" ) == "true" ); + myTitleItalicCheck->setChecked( QAD_CONFIG->getSetting( "SMESH:ScalarBarTitleItalic" ) == "true" ); + myTitleShadowCheck->setChecked( QAD_CONFIG->getSetting( "SMESH:ScalarBarTitleShadow" ) == "true" ); + + QColor labelColor( 255, 255, 255 ); + if ( QAD_CONFIG->hasSetting( "SMESH:ScalarBarLabelColor" ) ) { + QStringList aLColor = QStringList::split( ":", QAD_CONFIG->getSetting( "SMESH:ScalarBarLabelColor" ), false ); + labelColor = QColor( ( aLColor.count() > 0 ? aLColor[0].toInt() : 255 ), + ( aLColor.count() > 1 ? aLColor[1].toInt() : 255 ), + ( aLColor.count() > 2 ? aLColor[2].toInt() : 255 ) ); + } + myLabelsColorBtn->setPaletteBackgroundColor( labelColor ); + myLabelsFontCombo->setCurrentItem( 0 ); + if ( QAD_CONFIG->hasSetting( "SMESH:ScalarBarLabelFont" ) ) { + if ( QAD_CONFIG->getSetting( "SMESH:ScalarBarLabelFont" ) == "Arial" ) + myLabelsFontCombo->setCurrentItem( 0 ); + if ( QAD_CONFIG->getSetting( "SMESH:ScalarBarLabelFont" ) == "Courier" ) + myLabelsFontCombo->setCurrentItem( 1 ); + if ( QAD_CONFIG->getSetting( "SMESH:ScalarBarLabelFont" ) == "Times" ) + myLabelsFontCombo->setCurrentItem( 2 ); + } + myLabelsBoldCheck->setChecked( QAD_CONFIG->getSetting( "SMESH:ScalarBarLabelBold" ) == "true" ); + myLabelsItalicCheck->setChecked( QAD_CONFIG->getSetting( "SMESH:ScalarBarLabelItalic" ) == "true" ); + myLabelsShadowCheck->setChecked( QAD_CONFIG->getSetting( "SMESH:ScalarBarLabelShadow" ) == "true" ); + + int aNbColors = 64; + if ( QAD_CONFIG->hasSetting( "SMESH:ScalarBarNbOfColors" ) ) + aNbColors = QAD_CONFIG->getSetting( "SMESH:ScalarBarNbOfColors" ).toInt(); + myColorsSpin->setValue( aNbColors ); + int aNbLabels = 5; + if ( QAD_CONFIG->hasSetting( "SMESH:ScalarBarNbOfLabels" ) ) + aNbLabels = QAD_CONFIG->getSetting( "SMESH:ScalarBarNbOfLabels" ).toInt(); + myLabelsSpin->setValue( aNbLabels ); + + QString aOrientation = QAD_CONFIG->getSetting( "SMESH:ScalarBarOrientation" ); + if ( aOrientation == "Horizontal" ) + myHorizRadioBtn->setChecked( true ); + else + myVertRadioBtn->setChecked( true ); + myIniOrientation = myVertRadioBtn->isChecked(); + + if ( QAD_CONFIG->hasSetting( "SMESH:ScalarBarXPosition" ) ) + myIniX = QAD_CONFIG->getSetting( "SMESH:ScalarBarXPosition" ).toDouble(); + else + myIniX = myHorizRadioBtn->isChecked() ? DEF_HOR_X : DEF_VER_X; + if ( QAD_CONFIG->hasSetting( "SMESH:ScalarBarYPosition" ) ) + myIniY = QAD_CONFIG->getSetting( "SMESH:ScalarBarYPosition" ).toDouble(); + else + myIniY = myHorizRadioBtn->isChecked() ? DEF_HOR_Y : DEF_VER_Y; + if ( QAD_CONFIG->hasSetting( "SMESH:ScalarBarWidth" ) ) + myIniW = QAD_CONFIG->getSetting( "SMESH:ScalarBarWidth" ).toDouble(); + else + myIniW = myHorizRadioBtn->isChecked() ? DEF_HOR_W : DEF_VER_W; + if ( QAD_CONFIG->hasSetting( "SMESH:ScalarBarHeight" ) ) + myIniH = QAD_CONFIG->getSetting( "SMESH:ScalarBarHeight" ).toDouble(); + else + myIniH = myHorizRadioBtn->isChecked() ? DEF_HOR_H : DEF_VER_H; + setOriginAndSize( myIniX, myIniY, myIniW, myIniH ); + + if ( mySelection ) { + // --> then init from selection if necessary + onSelectionChanged(); + } + + /***************************************************************/ + // Connect section + connect( myTitleColorBtn, SIGNAL( clicked() ), this, SLOT( onTitleColor() ) ); + connect( myLabelsColorBtn, SIGNAL( clicked() ), this, SLOT( onLabelsColor() ) ); + connect( myOkBtn, SIGNAL( clicked() ), this, SLOT( onOk() ) ); + connect( myCancelBtn, SIGNAL( clicked() ), this, SLOT( onCancel() ) ); + connect( myXSpin, SIGNAL( valueChanged( double ) ), this, SLOT( onXYChanged() ) ); + connect( myYSpin, SIGNAL( valueChanged( double ) ), this, SLOT( onXYChanged() ) ); + connect( myOrientationGrp, SIGNAL( clicked( int ) ), this, SLOT( onOrientationChanged() ) ); + if ( mySelection ) { + connect( myApplyBtn, SIGNAL( clicked() ), this, SLOT( onApply() ) ); + connect( mySelection, SIGNAL( currentSelectionChanged() ), this, SLOT( onSelectionChanged() ) ); + } + connect( SMESHGUI::GetSMESHGUI(), SIGNAL( SignalCloseAllDialogs() ), this, SLOT( onCancel() ) ) ; } -/* - * Destroys the object and frees any allocated resources +//================================================================================================= +/*! + * SMESHGUI_Preferences_ScalarBarDlg::~SMESHGUI_Preferences_ScalarBarDlg + * + * Destructor */ +//================================================================================================= SMESHGUI_Preferences_ScalarBarDlg::~SMESHGUI_Preferences_ScalarBarDlg() { - // no need to delete child widgets, Qt does it all for us } +//================================================================================================= +/*! + * SMESHGUI_Preferences_ScalarBarDlg::onOk + * + * OK button slot + */ +//================================================================================================= +void SMESHGUI_Preferences_ScalarBarDlg::onOk() +{ + if ( onApply() ) + onCancel(); +} + +//================================================================================================= +/*! + * SMESHGUI_Preferences_ScalarBarDlg::onApply + * + * Apply button slot + */ +//================================================================================================= +bool SMESHGUI_Preferences_ScalarBarDlg::onApply() +{ + if ( mySelection ) { + // Scalar Bar properties + if ( !myActor ) + return false; + vtkScalarBarActor* myScalarBarActor = myActor->GetScalarBarActor(); + + vtkTextProperty* aTitleTextPrp = myScalarBarActor->GetTitleTextProperty(); + QColor aTColor = myTitleColorBtn->paletteBackgroundColor(); + aTitleTextPrp->SetColor( aTColor.red()/255., aTColor.green()/255., aTColor.blue()/255. ); + if ( myTitleFontCombo->currentItem() == 0 ) + aTitleTextPrp->SetFontFamilyToArial(); + else if ( myTitleFontCombo->currentItem() == 1 ) + aTitleTextPrp->SetFontFamilyToCourier(); + else + aTitleTextPrp->SetFontFamilyToTimes(); + aTitleTextPrp->SetBold( myTitleBoldCheck->isChecked() ); + aTitleTextPrp->SetItalic( myTitleItalicCheck->isChecked() ); + aTitleTextPrp->SetShadow( myTitleShadowCheck->isChecked() ); + myScalarBarActor->SetTitleTextProperty( aTitleTextPrp ); + + vtkTextProperty* aLabelsTextPrp = myScalarBarActor->GetLabelTextProperty(); + QColor aLColor = myLabelsColorBtn->paletteBackgroundColor(); + aLabelsTextPrp->SetColor( aLColor.red()/255., aLColor.green()/255., aLColor.blue()/255. ); + if ( myLabelsFontCombo->currentItem() == 0 ) + aLabelsTextPrp->SetFontFamilyToArial(); + else if ( myLabelsFontCombo->currentItem() == 1 ) + aLabelsTextPrp->SetFontFamilyToCourier(); + else + aLabelsTextPrp->SetFontFamilyToTimes(); + aLabelsTextPrp->SetBold( myLabelsBoldCheck->isChecked() ); + aLabelsTextPrp->SetItalic( myLabelsItalicCheck->isChecked() ); + aLabelsTextPrp->SetShadow( myLabelsShadowCheck->isChecked() ); + myScalarBarActor->SetLabelTextProperty( aLabelsTextPrp ); + + myScalarBarActor->SetNumberOfLabels( myLabelsSpin->value() ); + myScalarBarActor->SetMaximumNumberOfColors( myColorsSpin->value() ); + + if ( myHorizRadioBtn->isChecked() ) + myScalarBarActor->SetOrientationToHorizontal(); + else + myScalarBarActor->SetOrientationToVertical(); + + myScalarBarActor->SetPosition( myXSpin->value(), myYSpin->value() ); + myScalarBarActor->SetWidth( myWidthSpin->value() ); + myScalarBarActor->SetHeight( myHeightSpin->value() ); + + double aMin = myMinEdit->text().toDouble(); + double aMax = myMaxEdit->text().toDouble(); + myScalarBarActor->GetLookupTable()->SetRange( aMin, aMax ); + SMESHGUI::GetSMESHGUI()->UpdateView(); + } + else { + // Scalar Bar preferences + QColor titleColor = myTitleColorBtn->paletteBackgroundColor(); + QAD_CONFIG->addSetting( "SMESH:ScalarBarTitleColor", QString().sprintf( "%d:%d:%d", titleColor.red(), titleColor.green(), titleColor.blue() ) ); + if ( myTitleFontCombo->currentItem() == 0 ) + QAD_CONFIG->addSetting( "SMESH:ScalarBarTitleFont", "Arial" ); + else if ( myTitleFontCombo->currentItem() == 1 ) + QAD_CONFIG->addSetting( "SMESH:ScalarBarTitleFont", "Courier" ); + else + QAD_CONFIG->addSetting( "SMESH:ScalarBarTitleFont", "Times" ); + QAD_CONFIG->addSetting( "SMESH:ScalarBarTitleBold", myTitleBoldCheck->isChecked() ? "true" : "false" ); + QAD_CONFIG->addSetting( "SMESH:ScalarBarTitleItalic", myTitleItalicCheck->isChecked() ? "true" : "false" ); + QAD_CONFIG->addSetting( "SMESH:ScalarBarTitleShadow", myTitleShadowCheck->isChecked() ? "true" : "false" ); + + QColor labelColor = myLabelsColorBtn->paletteBackgroundColor(); + QAD_CONFIG->addSetting( "SMESH:ScalarBarLabelColor", QString().sprintf( "%d:%d:%d", labelColor.red(), labelColor.green(),labelColor. blue() ) ); + if ( myLabelsFontCombo->currentItem() == 0 ) + QAD_CONFIG->addSetting( "SMESH:ScalarBarLabelFont", "Arial" ); + else if ( myLabelsFontCombo->currentItem() == 1 ) + QAD_CONFIG->addSetting( "SMESH:ScalarBarLabelFont", "Courier" ); + else + QAD_CONFIG->addSetting( "SMESH:ScalarBarLabelFont", "Times" ); + QAD_CONFIG->addSetting( "SMESH:ScalarBarLabelBold", myLabelsBoldCheck->isChecked() ? "true" : "false" ); + QAD_CONFIG->addSetting( "SMESH:ScalarBarLabelItalic", myLabelsItalicCheck->isChecked() ? "true" : "false" ); + QAD_CONFIG->addSetting( "SMESH:ScalarBarLabelShadow", myLabelsShadowCheck->isChecked() ? "true" : "false" ); + + QAD_CONFIG->addSetting( "SMESH:ScalarBarNbOfColors", myColorsSpin->value() ); + QAD_CONFIG->addSetting( "SMESH:ScalarBarNbOfLabels", myLabelsSpin->value() ); + + QAD_CONFIG->addSetting( "SMESH:ScalarBarOrientation", myHorizRadioBtn->isChecked() ? "Horizontal" : "Vertical" ); + + QAD_CONFIG->addSetting( "SMESH:ScalarBarXPosition", myXSpin->value() ); + QAD_CONFIG->addSetting( "SMESH:ScalarBarYPosition", myYSpin->value() ); + QAD_CONFIG->addSetting( "SMESH:ScalarBarWidth", myWidthSpin->value() ); + QAD_CONFIG->addSetting( "SMESH:ScalarBarHeight", myHeightSpin->value() ); + } + return true; +} + +//================================================================================================= +/*! + * SMESHGUI_Preferences_ScalarBarDlg::onCancel + * + * Cancel button slot + */ +//================================================================================================= +void SMESHGUI_Preferences_ScalarBarDlg::onCancel() +{ + close(); +} + +//================================================================================================= +/*! + * SMESHGUI_Preferences_ScalarBarDlg::onTitleColor + * + * Change Title color button slot + */ +//================================================================================================= +void SMESHGUI_Preferences_ScalarBarDlg::onTitleColor() +{ + QColor aColor = myTitleColorBtn->paletteBackgroundColor(); + aColor = QColorDialog::getColor( aColor, this ); + if ( aColor.isValid() ) + myTitleColorBtn->setPaletteBackgroundColor( aColor ); +} + +//================================================================================================= +/*! + * SMESHGUI_Preferences_ScalarBarDlg::onLabelsColor + * + * Change Labels color button slot + */ +//================================================================================================= +void SMESHGUI_Preferences_ScalarBarDlg::onLabelsColor() +{ + QColor aColor = myLabelsColorBtn->paletteBackgroundColor(); + aColor = QColorDialog::getColor( aColor, this ); + if ( aColor.isValid() ) + myLabelsColorBtn->setPaletteBackgroundColor( aColor ); +} + +//================================================================================================= +/*! + * SMESHGUI_Preferences_ScalarBarDlg::onSelectionChanged + * + * Called when selection changed + */ +//================================================================================================= +void SMESHGUI_Preferences_ScalarBarDlg::onSelectionChanged() +{ + if( mySelection ) { + if ( mySelection->IObjectCount() == 1 ) { + Handle(SALOME_InteractiveObject) anIO = mySelection->firstIObject(); + if( anIO->hasEntry() ) { + Standard_Boolean isOk; + SMESH_Actor* anActor = SMESHGUI::GetSMESHGUI()->FindActorByEntry( anIO->getEntry(), isOk, true ); + if ( isOk && anActor->GetScalarBarActor() && anActor->GetControlMode() != SMESH_Actor::eNone ) { + myActor = anActor; + vtkScalarBarActor* myScalarBarActor = myActor->GetScalarBarActor(); + + double aMin = 0.0, aMax = 0.0; + if ( myScalarBarActor->GetLookupTable() ) { + float *range = myScalarBarActor->GetLookupTable()->GetRange(); + myMinEdit->setText( QString::number( range[0] ) ); + myMaxEdit->setText( QString::number( range[1] ) ); + } + + vtkTextProperty* aTitleTextPrp = myScalarBarActor->GetTitleTextProperty(); + float aTColor[3]; + aTitleTextPrp->GetColor( aTColor ); + myTitleColorBtn->setPaletteBackgroundColor( QColor( (int)( aTColor[0]*255 ), (int)( aTColor[1]*255 ), (int)( aTColor[2]*255 ) ) ); + myTitleFontCombo->setCurrentItem( aTitleTextPrp->GetFontFamily() ); + myTitleBoldCheck->setChecked( aTitleTextPrp->GetBold() ); + myTitleItalicCheck->setChecked( aTitleTextPrp->GetItalic() ); + myTitleShadowCheck->setChecked( aTitleTextPrp->GetShadow() ); + + vtkTextProperty* aLabelsTextPrp = myScalarBarActor->GetLabelTextProperty(); + float aLColor[3]; + aLabelsTextPrp->GetColor( aLColor ); + myLabelsColorBtn->setPaletteBackgroundColor( QColor( (int)( aLColor[0]*255 ), (int)( aLColor[1]*255 ), (int)( aLColor[2]*255 ) ) ); + myLabelsFontCombo->setCurrentItem( 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 = 0; + myRangeGrp->setEnabled( false ); + myFontGrp->setEnabled( false ); + myLabColorGrp->setEnabled( false ); + myOrientationGrp->setEnabled( false ); + myOriginDimGrp->setEnabled( false ); + myOkBtn->setEnabled( false ); + myApplyBtn->setEnabled( false ); + } +} + +//================================================================================================= +/*! + * SMESHGUI_Preferences_ScalarBarDlg::closeEvent + * + * Close event handler + */ +//================================================================================================= +void SMESHGUI_Preferences_ScalarBarDlg::closeEvent( QCloseEvent* e ) +{ + if ( mySelection ) // "Properties" dialog box + myDlg = 0; + QDialog::closeEvent( e ); +} + +//================================================================================================= +/*! + * SMESHGUI_Preferences_ScalarBarDlg::onXYChanged + * + * Called when X, Y values are changed + */ +//================================================================================================= +void SMESHGUI_Preferences_ScalarBarDlg::onXYChanged() +{ + myWidthSpin->setMaxValue( 1.0 - myXSpin->value() ); + myHeightSpin->setMaxValue( 1.0 - myYSpin->value() ); +} + +//================================================================================================= +/*! + * SMESHGUI_Preferences_ScalarBarDlg::setOriginAndSize + * + * Called when X, Y values are changed + */ +//================================================================================================= +void SMESHGUI_Preferences_ScalarBarDlg::setOriginAndSize( const double x, + const double y, + const double w, + const double h ) +{ + blockSignals( true ); + myXSpin->setValue( x ); + myYSpin->setValue( y ); + myWidthSpin->setMaxValue( 1.0 ); + myWidthSpin->setValue( w ); + myHeightSpin->setMaxValue( 1.0 ); + myHeightSpin->setValue( h ); + blockSignals( false ); + onXYChanged(); +} + +//================================================================================================= +/*! + * SMESHGUI_Preferences_ScalarBarDlg::onOrientationChanged + * + * Called when orientation is changed + */ +//================================================================================================= +void SMESHGUI_Preferences_ScalarBarDlg::onOrientationChanged() +{ + int aOrientation = myVertRadioBtn->isChecked(); + if ( aOrientation == myIniOrientation ) + 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 ); +} diff --git a/src/SMESHGUI/SMESHGUI_Preferences_ScalarBarDlg.h b/src/SMESHGUI/SMESHGUI_Preferences_ScalarBarDlg.h index 777d24aff..bde914a36 100644 --- a/src/SMESHGUI/SMESHGUI_Preferences_ScalarBarDlg.h +++ b/src/SMESHGUI/SMESHGUI_Preferences_ScalarBarDlg.h @@ -29,11 +29,8 @@ #ifndef SMESHGUI_PREFERENCES_SCALARBARDLG_H #define SMESHGUI_PREFERENCES_SCALARBARDLG_H -#include #include -class QVBoxLayout; -class QHBoxLayout; -class QGridLayout; + class QButtonGroup; class QCheckBox; class QComboBox; @@ -41,54 +38,78 @@ class QGroupBox; class QLabel; class QLineEdit; class QPushButton; +class QToolButton; class QRadioButton; class QSpinBox; +class QAD_SpinBoxDbl; +class SALOME_Selection; +class SMESH_Actor; class SMESHGUI_Preferences_ScalarBarDlg : public QDialog { - Q_OBJECT + Q_OBJECT public: - SMESHGUI_Preferences_ScalarBarDlg( QWidget* parent = 0, const char* name = 0, bool modal = FALSE, WFlags fl = 0 ); - ~SMESHGUI_Preferences_ScalarBarDlg(); - - QButtonGroup* ButtonGroup_Orientation; - QRadioButton* RadioHoriz; - QRadioButton* RadioVert; - QGroupBox* Properties; - QLabel* NumberLabels; - QLabel* NumberColors; - QSpinBox* SpinBoxLabels; - QSpinBox* SpinBoxColors; - QLabel* TextLabel2; - QComboBox* ComboBox1; - QCheckBox* Shadow; - QCheckBox* Italic; - QCheckBox* Bold; - QGroupBox* GroupBox5; - QLineEdit* LineEditWidth; - QLineEdit* LineEditHeight; - QLabel* Height; - QLabel* Width; - QPushButton* buttonCancel; - QPushButton* buttonOk; + ~SMESHGUI_Preferences_ScalarBarDlg(); + static void ScalarBarPreferences( QWidget* parent ); + static void ScalarBarProperties ( QWidget* parent, SALOME_Selection* Sel ); protected: - QGridLayout* grid; - QGridLayout* grid_2; - QGridLayout* grid_3; - QGridLayout* grid_4; - QGridLayout* grid_5; - QGridLayout* grid_6; - QGridLayout* grid_7; - QGridLayout* grid_8; - QGridLayout* grid_9; - QGridLayout* grid_10; - QGridLayout* grid_11; - QGridLayout* grid_12; - QGridLayout* grid_13; - QGridLayout* grid_14; - QGridLayout* grid_15; + SMESHGUI_Preferences_ScalarBarDlg( QWidget* parent = 0, SALOME_Selection* Sel = 0, bool modal = FALSE ); + static SMESHGUI_Preferences_ScalarBarDlg* myDlg; + void closeEvent( QCloseEvent* e ); + void setOriginAndSize( const double x, const double y, const double w, const double h ); + +protected slots: + void onOk(); + bool onApply(); + void onCancel(); + void onTitleColor(); + void onLabelsColor(); + void onSelectionChanged(); + void onXYChanged(); + void onOrientationChanged(); + +private: + SALOME_Selection* mySelection; + SMESH_Actor* myActor; + double myIniX, myIniY, myIniW, myIniH; + int myIniOrientation; + + QGroupBox* myRangeGrp; + QLineEdit* myMinEdit; + QLineEdit* myMaxEdit; + + QGroupBox* myFontGrp; + QToolButton* myTitleColorBtn; + QComboBox* myTitleFontCombo; + QCheckBox* myTitleBoldCheck; + QCheckBox* myTitleItalicCheck; + QCheckBox* myTitleShadowCheck; + QToolButton* myLabelsColorBtn; + QComboBox* myLabelsFontCombo; + QCheckBox* myLabelsBoldCheck; + QCheckBox* myLabelsItalicCheck; + QCheckBox* myLabelsShadowCheck; + + QGroupBox* myLabColorGrp; + QSpinBox* myColorsSpin; + QSpinBox* myLabelsSpin; + + QButtonGroup* myOrientationGrp; + QRadioButton* myVertRadioBtn; + QRadioButton* myHorizRadioBtn; + + QGroupBox* myOriginDimGrp; + QAD_SpinBoxDbl* myXSpin; + QAD_SpinBoxDbl* myYSpin; + QAD_SpinBoxDbl* myWidthSpin; + QAD_SpinBoxDbl* myHeightSpin; + + QGroupBox* myButtonGrp; + QPushButton* myOkBtn; + QPushButton* myApplyBtn; + QPushButton* myCancelBtn; }; #endif // SMESHGUI_PREFERENCES_SCALARBARDLG_H diff --git a/src/SMESHGUI/SMESHGUI_RemoveElementsDlg.cxx b/src/SMESHGUI/SMESHGUI_RemoveElementsDlg.cxx index b15ea1b80..fd3e5e427 100644 --- a/src/SMESHGUI/SMESHGUI_RemoveElementsDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_RemoveElementsDlg.cxx @@ -247,7 +247,7 @@ void SMESHGUI_RemoveElementsDlg::ClickOnOk() //================================================================================= void SMESHGUI_RemoveElementsDlg::ClickOnCancel() { - QAD_Application::getDesktop()->SetSelectionMode( 4 ); + QAD_Application::getDesktop()->SetSelectionMode( ActorSelection ); disconnect( mySelection, 0, this, 0 ); mySMESHGUI->ResetState() ; reject() ; @@ -273,9 +273,9 @@ void SMESHGUI_RemoveElementsDlg::SelectionIntoArgument() if(nbElements < 1) return ; - if ( mySelection->SelectionMode() != 3 ) { + if ( mySelection->SelectionMode() != CellSelection ) { QAD_MessageBox::warn1 ( QAD_Application::getDesktop(), tr ("SMESH_WRN_WARNING"), - tr ("SMESH_WRN_SELECTIONMODE_ELEMENTS"), tr ("SMESH_BUT_YES") ); + tr ("SMESH_WRN_SELECTIONMODE_ELEMENTS"), tr ("SMESH_BUT_OK") ); return; } diff --git a/src/SMESHGUI/SMESHGUI_RemoveNodesDlg.cxx b/src/SMESHGUI/SMESHGUI_RemoveNodesDlg.cxx index 373cfbc51..68ba6b863 100644 --- a/src/SMESHGUI/SMESHGUI_RemoveNodesDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_RemoveNodesDlg.cxx @@ -251,7 +251,7 @@ void SMESHGUI_RemoveNodesDlg::ClickOnOk() //================================================================================= void SMESHGUI_RemoveNodesDlg::ClickOnCancel() { - QAD_Application::getDesktop()->SetSelectionMode( 4 ); + QAD_Application::getDesktop()->SetSelectionMode( ActorSelection ); disconnect( mySelection, 0, this, 0 ); mySMESHGUI->ResetState() ; mySMESHGUI->EraseSimulationActors(); @@ -278,9 +278,9 @@ void SMESHGUI_RemoveNodesDlg::SelectionIntoArgument() if(nbNodes < 1) return ; - if ( mySelection->SelectionMode() != 1 ){ + if ( mySelection->SelectionMode() != NodeSelection ){ QAD_MessageBox::warn1 ( QAD_Application::getDesktop(), tr ("SMESH_WRN_WARNING"), - tr ("SMESH_WRN_SELECTIONMODE_NODES"), tr ("SMESH_BUT_YES") ); + tr ("SMESH_WRN_SELECTIONMODE_NODES"), tr ("SMESH_BUT_OK") ); return; } diff --git a/src/SMESHGUI/SMESHGUI_StudyAPI.cxx b/src/SMESHGUI/SMESHGUI_StudyAPI.cxx index 42e2724d9..65605ad92 100644 --- a/src/SMESHGUI/SMESHGUI_StudyAPI.cxx +++ b/src/SMESHGUI/SMESHGUI_StudyAPI.cxx @@ -82,40 +82,8 @@ SMESHGUI_StudyAPI::SMESHGUI_StudyAPI () SMESHGUI_StudyAPI::SMESHGUI_StudyAPI ( SALOMEDS::Study_ptr aStudy, SMESH::SMESH_Gen_ptr CompMesh) { - myStudy = aStudy; - myStudyBuilder = aStudy->NewBuilder(); - setOrb(); - - // NRI : Temporary added - if ( myStudy->GetProperties()->IsLocked() ) { -// QAD_MessageBox::warn1 ( (QWidget*)QAD_Application::getDesktop(), -// QObject::tr("WARNING"), -// QObject::tr("WRN_STUDY_LOCKED"), -// QObject::tr("BUT_OK") ); - - return; - } - // NRI - - SALOMEDS::SComponent_var father = aStudy->FindComponent("MESH"); - SALOMEDS::GenericAttribute_var anAttr; - SALOMEDS::AttributeName_var aName; - SALOMEDS::AttributePixMap_var aPixmap; - - if (father->_is_nil()) { - father = myStudyBuilder->NewComponent("MESH"); - } - anAttr = myStudyBuilder->FindOrCreateAttribute(father, "AttributeName"); - aName = SALOMEDS::AttributeName::_narrow(anAttr); - //NRI aName->SetValue(QObject::tr("SMESH_MEN_COMPONENT")); - aName->SetValue( QAD_Application::getDesktop()->getComponentUserName( "SMESH" ) ); - anAttr = myStudyBuilder->FindOrCreateAttribute(father, "AttributePixMap"); - aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr); - aPixmap->SetPixMap( "ICON_OBJBROWSER_SMESH" ); - - myStudyBuilder->DefineComponentInstance(father, CompMesh ); - mySComponentMesh = SALOMEDS::SComponent::_narrow( father ); + Update( aStudy ); } //======================================================================= @@ -130,93 +98,12 @@ SMESHGUI_StudyAPI::~SMESHGUI_StudyAPI () // function : // purpose : Update //======================================================================= -void SMESHGUI_StudyAPI::Update(SMESH::SMESH_Gen_ptr CompMesh) -{ - // NRI : Temporary added - if ( myStudy->GetProperties()->IsLocked() ) { - return; - } - // NRI - - SALOMEDS::SComponent_var father = myStudy->FindComponent("MESH"); - SALOMEDS::GenericAttribute_var anAttr; - SALOMEDS::AttributeName_var aName; - SALOMEDS::AttributePixMap_var aPixmap; - - if (father->_is_nil()) { - father = myStudyBuilder->NewComponent("MESH"); - anAttr = myStudyBuilder->FindOrCreateAttribute(father, "AttributeName"); - aName = SALOMEDS::AttributeName::_narrow(anAttr); - //NRI aName->SetValue(QObject::tr("SMESH_MEN_COMPONENT")); - aName->SetValue( QAD_Application::getDesktop()->getComponentUserName( "SMESH" ) ); - anAttr = myStudyBuilder->FindOrCreateAttribute(father, "AttributePixMap"); - aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr); - aPixmap->SetPixMap( "ICON_OBJBROWSER_SMESH" ); - } - myStudyBuilder->DefineComponentInstance(father, CompMesh ); - mySComponentMesh = SALOMEDS::SComponent::_narrow( father ); -} - -//======================================================================= -// function : AddNewMesh -// purpose : -//======================================================================= - -SALOMEDS::SObject_ptr SMESHGUI_StudyAPI::AddNewMesh (SMESH::SMESH_Mesh_ptr M) +void SMESHGUI_StudyAPI::Update(SALOMEDS::Study_ptr aStudy) { - // NRI : Temporary added - if ( myStudy->GetProperties()->IsLocked() ) { - return SALOMEDS::SObject::_nil(); - } - // NRI - - //Find or Create Hypothesis root - SALOMEDS::SObject_var HypothesisRoot; - SALOMEDS::GenericAttribute_var anAttr; - SALOMEDS::AttributeName_var aName; - SALOMEDS::AttributeIOR_var anIOR; - SALOMEDS::AttributeSelectable_var aSelAttr; - SALOMEDS::AttributePixMap_var aPixmap; - - if (!mySComponentMesh->FindSubObject (Tag_HypothesisRoot, HypothesisRoot)) { - HypothesisRoot = myStudyBuilder->NewObjectToTag (mySComponentMesh, Tag_HypothesisRoot); - anAttr = myStudyBuilder->FindOrCreateAttribute(HypothesisRoot, "AttributeName"); - aName = SALOMEDS::AttributeName::_narrow(anAttr); - aName->SetValue(QObject::tr("SMESH_MEN_HYPOTHESIS")); - anAttr = myStudyBuilder->FindOrCreateAttribute(HypothesisRoot, "AttributePixMap"); - aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr); - aPixmap->SetPixMap( "ICON_SMESH_TREE_HYPO" ); - anAttr = myStudyBuilder->FindOrCreateAttribute(HypothesisRoot, "AttributeSelectable"); - aSelAttr = SALOMEDS::AttributeSelectable::_narrow(anAttr); - aSelAttr->SetSelectable(false); - } - - SALOMEDS::SObject_var AlgorithmsRoot; - if (!mySComponentMesh->FindSubObject (Tag_AlgorithmsRoot, AlgorithmsRoot)) { - AlgorithmsRoot = myStudyBuilder->NewObjectToTag (mySComponentMesh, Tag_AlgorithmsRoot); - anAttr = myStudyBuilder->FindOrCreateAttribute(AlgorithmsRoot, "AttributeName"); - aName = SALOMEDS::AttributeName::_narrow(anAttr); - aName->SetValue(QObject::tr("SMESH_MEN_ALGORITHMS")); - anAttr = myStudyBuilder->FindOrCreateAttribute(AlgorithmsRoot, "AttributePixMap"); - aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr); - aPixmap->SetPixMap( "ICON_SMESH_TREE_ALGO" ); - anAttr = myStudyBuilder->FindOrCreateAttribute(AlgorithmsRoot, "AttributeSelectable"); - aSelAttr = SALOMEDS::AttributeSelectable::_narrow(anAttr); - aSelAttr->SetSelectable(false); - } - - // Add New Mesh - SALOMEDS::SObject_var newMesh = myStudyBuilder->NewObject(mySComponentMesh); - anAttr = myStudyBuilder->FindOrCreateAttribute(newMesh, "AttributePixMap"); - aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr); - aPixmap->SetPixMap( "ICON_SMESH_TREE_MESH" ); - anAttr = myStudyBuilder->FindOrCreateAttribute(newMesh, "AttributeIOR"); - anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); - anIOR->SetValue(IORToString(M)); - return SALOMEDS::SObject::_narrow( newMesh ); + myStudy = SALOMEDS::Study::_duplicate( aStudy ); + myStudyBuilder = aStudy->NewBuilder(); } - //======================================================================= // function : SetShape // purpose : @@ -245,6 +132,9 @@ GEOM::GEOM_Shape_ptr SMESHGUI_StudyAPI::GetShapeOnMeshOrSubMesh(SALOMEDS::SObjec } // NRI + if ( SO_Mesh_Or_SubMesh->_is_nil() ) + return GEOM::GEOM_Shape::_nil(); + GEOM::GEOM_Shape_var Shape; SALOMEDS::SObject_var aSO, aGeom; SALOMEDS::GenericAttribute_var anAttr; @@ -260,112 +150,6 @@ GEOM::GEOM_Shape_ptr SMESHGUI_StudyAPI::GetShapeOnMeshOrSubMesh(SALOMEDS::SObjec return GEOM::GEOM_Shape::_nil(); } -//======================================================================= -// function : AddNewHypothesis -// purpose : -//======================================================================= -SALOMEDS::SObject_ptr SMESHGUI_StudyAPI::AddNewHypothesis (SMESH::SMESH_Hypothesis_ptr H) -{ - // NRI : Temporary added - if ( myStudy->GetProperties()->IsLocked() ) { - return SALOMEDS::SObject::_nil(); - } - // NRI - - //Find or Create Hypothesis root - SALOMEDS::SObject_var HypothesisRoot; - SALOMEDS::GenericAttribute_var anAttr; - SALOMEDS::AttributeName_var aName; - SALOMEDS::AttributeIOR_var anIOR; - SALOMEDS::AttributeSelectable_var aSelAttr; - SALOMEDS::AttributePixMap_var aPixmap; - - if (!mySComponentMesh->FindSubObject (Tag_HypothesisRoot, HypothesisRoot)) { - HypothesisRoot = myStudyBuilder->NewObjectToTag (mySComponentMesh, Tag_HypothesisRoot); - anAttr = myStudyBuilder->FindOrCreateAttribute(HypothesisRoot, "AttributeName"); - aName = SALOMEDS::AttributeName::_narrow(anAttr); - aName->SetValue(QObject::tr("SMESH_MEN_HYPOTHESIS")); - anAttr = myStudyBuilder->FindOrCreateAttribute(HypothesisRoot, "AttributeSelectable"); - aSelAttr = SALOMEDS::AttributeSelectable::_narrow(anAttr); - aSelAttr->SetSelectable(false); - anAttr = myStudyBuilder->FindOrCreateAttribute(HypothesisRoot, "AttributePixMap"); - aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr); - aPixmap->SetPixMap( "ICON_SMESH_TREE_HYPO" ); - } - // Add New Hypothesis - SALOMEDS::SObject_var newHypo = myStudyBuilder->NewObject(HypothesisRoot); - anAttr = myStudyBuilder->FindOrCreateAttribute(newHypo, "AttributePixMap"); - aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr); - QString aType = H->GetName(); - MESSAGE ( " aType " << aType ) - aPixmap->SetPixMap( "ICON_SMESH_TREE_HYPO_" + aType ); - // if ( aType.compare("LocalLength") == 0 ) - // aPixmap->SetPixMap( "ICON_SMESH_TREE_HYPO_LENGTH" ); - // else if ( aType.compare("NumberOfSegments") == 0 ) - // aPixmap->SetPixMap( "ICON_SMESH_TREE_HYPO_SEGMENT" ); - // else if ( aType.compare("MaxElementArea") == 0 ) - // aPixmap->SetPixMap( "ICON_SMESH_TREE_HYPO_AREA" ); - // else if ( aType.compare("MaxElementVolume") == 0 ) - // aPixmap->SetPixMap( "ICON_SMESH_TREE_HYPO_VOLUME" ); - anAttr = myStudyBuilder->FindOrCreateAttribute(newHypo, "AttributeIOR"); - anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); - anIOR->SetValue(IORToString(H)); - return SALOMEDS::SObject::_narrow(newHypo); -} - -//======================================================================= -// function : AddNewAlgorithms -// purpose : -//======================================================================= -SALOMEDS::SObject_ptr SMESHGUI_StudyAPI::AddNewAlgorithms (SMESH::SMESH_Hypothesis_ptr H) -{ - // NRI : Temporary added - if ( myStudy->GetProperties()->IsLocked() ) { - return SALOMEDS::SObject::_nil(); - } - // NRI - - //Find or Create Algorithms root - SALOMEDS::SObject_var AlgorithmsRoot; - SALOMEDS::GenericAttribute_var anAttr; - SALOMEDS::AttributeName_var aName; - SALOMEDS::AttributeIOR_var anIOR; - SALOMEDS::AttributeSelectable_var aSelAttr; - SALOMEDS::AttributePixMap_var aPixmap; - - if (!mySComponentMesh->FindSubObject (Tag_AlgorithmsRoot, AlgorithmsRoot)) { - AlgorithmsRoot = myStudyBuilder->NewObjectToTag (mySComponentMesh, Tag_AlgorithmsRoot); - anAttr = myStudyBuilder->FindOrCreateAttribute(AlgorithmsRoot, "AttributeName"); - aName = SALOMEDS::AttributeName::_narrow(anAttr); - aName->SetValue(QObject::tr("SMESH_MEN_ALGORITHMS")); - anAttr = myStudyBuilder->FindOrCreateAttribute(AlgorithmsRoot, "AttributeSelectable"); - aSelAttr = SALOMEDS::AttributeSelectable::_narrow(anAttr); - aSelAttr->SetSelectable(false); - anAttr = myStudyBuilder->FindOrCreateAttribute(AlgorithmsRoot, "AttributePixMap"); - aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr); - aPixmap->SetPixMap( "ICON_SMESH_TREE_ALGO" ); - } - // Add New Algorithms - SALOMEDS::SObject_var newHypo = myStudyBuilder->NewObject(AlgorithmsRoot); - anAttr = myStudyBuilder->FindOrCreateAttribute(newHypo, "AttributePixMap"); - aPixmap = SALOMEDS::AttributePixMap::_narrow(anAttr); - QString aType = H->GetName(); - // if ( aType.compare("Regular_1D") == 0 ) - aPixmap->SetPixMap( "ICON_SMESH_TREE_ALGO_" + aType ); - // aPixmap->SetPixMap( "ICON_SMESH_TREE_ALGO_REGULAR" ); - // else if ( aType.compare("MEFISTO_2D") == 0 ) - // aPixmap->SetPixMap( "ICON_SMESH_TREE_ALGO_MEFISTO" ); - // else if ( aType.compare("Quadrangle_2D") == 0 ) - // aPixmap->SetPixMap( "ICON_SMESH_TREE_ALGO_QUAD" ); - // else if ( aType.compare("Hexa_3D") == 0 ) - // aPixmap->SetPixMap( "ICON_SMESH_TREE_ALGO_HEXA" ); - anAttr = myStudyBuilder->FindOrCreateAttribute(newHypo, "AttributeIOR"); - anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); - anIOR->SetValue(IORToString(H)); - return SALOMEDS::SObject::_narrow(newHypo); -} - - //======================================================================= // function : AddSubMeshOnShape // purpose : @@ -512,46 +296,25 @@ void SMESHGUI_StudyAPI::SetAlgorithms (SALOMEDS::SObject_ptr SO_MorSM, // function : // purpose : //======================================================================= -SALOMEDS::SObject_ptr SMESHGUI_StudyAPI::FindMesh (SMESH::SMESH_Mesh_ptr M) +SALOMEDS::SObject_ptr SMESHGUI_StudyAPI::FindObject( CORBA::Object_ptr theObject ) { // NRI : Temporary added if ( myStudy->GetProperties()->IsLocked() ) { return SALOMEDS::SObject::_nil(); } // NRI - return SALOMEDS::SObject::_narrow( myStudy->FindObjectIOR (IORToString(M)) ); -} - -//======================================================================= -// function : -// purpose : -//======================================================================= -SALOMEDS::SObject_ptr SMESHGUI_StudyAPI::FindHypothesisOrAlgorithms (SMESH::SMESH_Hypothesis_ptr H) -{ - // NRI : Temporary added - if ( myStudy->GetProperties()->IsLocked() ) { - return SALOMEDS::SObject::_nil(); + if ( !CORBA::is_nil ( theObject ) ) { + string anIOR = IORToString( theObject ); + if ( anIOR != "" ) + return myStudy->FindObjectIOR( anIOR.c_str() ); } - // NRI - return SALOMEDS::SObject::_narrow( myStudy->FindObjectIOR (IORToString(H)) ); -} - + return SALOMEDS::SObject::_nil(); +} //======================================================================= // function : // purpose : //======================================================================= -SALOMEDS::SObject_ptr SMESHGUI_StudyAPI::FindSubMesh (SMESH::SMESH_subMesh_ptr SM) -{ - // NRI : Temporary added - if ( myStudy->GetProperties()->IsLocked() ) { - return SALOMEDS::SObject::_nil(); - } - // NRI - return SALOMEDS::SObject::_narrow( myStudy->FindObjectIOR (IORToString(SM)) ); -} - - void SMESHGUI_StudyAPI::setOrb() { try { @@ -565,25 +328,6 @@ void SMESHGUI_StudyAPI::setOrb() ASSERT(! CORBA::is_nil(_orb)); } -//======================================================================= -// function : -// purpose : -//======================================================================= -void SMESHGUI_StudyAPI::SetTagHypothesisRoot() -{ - // NRI : Temporary added - if ( myStudy->GetProperties()->IsLocked() ) { - return; - } - // NRI - SALOMEDS::ChildIterator_var it = myStudy->NewChildIterator(mySComponentMesh); - int i = 0; - for (; it->More();it->Next()) { - i++; - } - Tag_HypothesisRoot = i++; -} - //======================================================================= // function : // purpose : diff --git a/src/SMESHGUI/SMESHGUI_StudyAPI.h b/src/SMESHGUI/SMESHGUI_StudyAPI.h index 5224c22e0..8cbb56f2b 100644 --- a/src/SMESHGUI/SMESHGUI_StudyAPI.h +++ b/src/SMESHGUI/SMESHGUI_StudyAPI.h @@ -37,6 +37,7 @@ #include CORBA_SERVER_HEADER(GEOM_Shape) #include CORBA_SERVER_HEADER(SALOMEDS) #include CORBA_SERVER_HEADER(SALOMEDS_Attributes) +#include CORBA_SERVER_HEADER(SALOME_GenericObj) class SMESH_subMesh_ptr; @@ -62,7 +63,7 @@ class SMESHGUI_StudyAPI { SALOMEDS::SObject_ptr AddSubMeshOnShape (SALOMEDS::SObject_ptr SO_Mesh, SALOMEDS::SObject_ptr SO_GeomShape, SMESH::SMESH_subMesh_ptr SM, GEOM::shape_type ST); - void Update(SMESH::SMESH_Gen_ptr Gen); + void Update(SALOMEDS::Study_ptr aStudy); void ModifiedMesh( SALOMEDS::SObject_ptr MorSM, bool right); @@ -84,23 +85,14 @@ class SMESHGUI_StudyAPI { SALOMEDS::SObject_ptr GetMeshOrSubmesh (SALOMEDS::SObject_ptr SO); - SALOMEDS::SObject_ptr FindMesh (SMESH::SMESH_Mesh_ptr M); + SALOMEDS::SObject_ptr FindObject(CORBA::Object_ptr theObject); - SALOMEDS::SObject_ptr FindHypothesisOrAlgorithms (SMESH::SMESH_Hypothesis_ptr H); - - SALOMEDS::SObject_ptr FindSubMesh (SMESH::SMESH_subMesh_ptr SM); - - //SALOMEDS::ListOfSObject_ptr FindMesh (SALOMEDS_SObject_ptr SO_GeomShape); - //SALOMEDS_SObject_ptr FindSubMesh (SALOMEDS_SObject_ptr SO_Mesh, SALOMEDS_SObject_ptr SO_GeomShape); - static void setOrb(); private: //fields SALOMEDS::Study_var myStudy; SALOMEDS::StudyBuilder_var myStudyBuilder; - SALOMEDS::SComponent_var mySComponentMesh; - }; #endif diff --git a/src/SMESHGUI/SMESHGUI_Swig.cxx b/src/SMESHGUI/SMESHGUI_Swig.cxx index 2eace0798..1ab1cea6b 100644 --- a/src/SMESHGUI/SMESHGUI_Swig.cxx +++ b/src/SMESHGUI/SMESHGUI_Swig.cxx @@ -73,6 +73,9 @@ void SMESH_Swig::Init(int studyID) Engines::Component_var comp = QAD_Application::getDesktop()->getEngine("FactoryServer", "SMESH"); SMESH::SMESH_Gen_var CompMesh = SMESH::SMESH_Gen::_narrow(comp); + Engines::Component_var comp1 = QAD_Application::getDesktop()->getEngine("FactoryServer", "GEOM"); + GEOM::GEOM_Gen_var CompGeom = GEOM::GEOM_Gen::_narrow(comp1); + QAD_ResourceMgr* resMgr = QAD_Desktop::createResourceManager(); if ( resMgr ) { QString msg; @@ -83,6 +86,9 @@ void SMESH_Swig::Init(int studyID) CORBA::Object_var obj = QAD_Application::getDesktop()->getNameService()->Resolve("/myStudyManager"); SALOMEDS::StudyManager_var myStudyMgr = SALOMEDS::StudyManager::_narrow(obj); myStudy = myStudyMgr->GetStudyByID(studyID); + + CompMesh->SetCurrentStudy( myStudy.in() ); + myStudyBuilder = myStudy->NewBuilder(); SALOMEDS::GenericAttribute_var anAttr; SALOMEDS::AttributeName_var aName; @@ -104,6 +110,8 @@ void SMESH_Swig::Init(int studyID) myStudyBuilder->DefineComponentInstance(father, CompMesh ); if (aLocked) myStudy->GetProperties()->SetLocked(true); } + mySComponentMesh = SALOMEDS::SComponent::_narrow( father ); + // Tags definition Tag_HypothesisRoot = 1; Tag_AlgorithmsRoot = 2; @@ -128,6 +136,12 @@ SMESH_Swig::~SMESH_Swig() const char* SMESH_Swig::AddNewMesh(const char* IOR) { MESSAGE("AddNewMesh"); + + // VSR: added temporarily - to be removed - objects are published automatically by engine + SALOMEDS::SObject_var SO = myStudy->FindObjectIOR( IOR ); + if ( !SO->_is_nil() ) + return SO->GetID(); + //Find or Create Hypothesis root SALOMEDS::GenericAttribute_var anAttr; SALOMEDS::AttributeName_var aName; @@ -177,6 +191,12 @@ const char* SMESH_Swig::AddNewMesh(const char* IOR) const char* SMESH_Swig::AddNewHypothesis(const char* IOR) { MESSAGE("AddNewHypothesis"); + + // VSR: added temporarily - to be removed - objects are published automatically by engine + SALOMEDS::SObject_var SO = myStudy->FindObjectIOR( IOR ); + if ( !SO->_is_nil() ) + return SO->GetID(); + //Find or Create Hypothesis root SALOMEDS::SObject_var HypothesisRoot; SALOMEDS::GenericAttribute_var anAttr; @@ -221,6 +241,12 @@ const char* SMESH_Swig::AddNewHypothesis(const char* IOR) const char* SMESH_Swig::AddNewAlgorithms(const char* IOR) { MESSAGE("AddNewAlgorithms"); + + // VSR: added temporarily - to be removed - objects are published automatically by engine + SALOMEDS::SObject_var SO = myStudy->FindObjectIOR( IOR ); + if ( !SO->_is_nil() ) + return SO->GetID(); + //Find or Create Algorithms root SALOMEDS::SObject_var AlgorithmsRoot; SALOMEDS::GenericAttribute_var anAttr; diff --git a/src/SMESHGUI/SMESHGUI_TransparencyDlg.cxx b/src/SMESHGUI/SMESHGUI_TransparencyDlg.cxx index 0ab482433..f42405abc 100644 --- a/src/SMESHGUI/SMESHGUI_TransparencyDlg.cxx +++ b/src/SMESHGUI/SMESHGUI_TransparencyDlg.cxx @@ -31,21 +31,44 @@ using namespace std; #include "SMESHGUI.h" // QT Includes -#include #include #include #include #include -#include -#include -#include -#include #include #include "VTKViewer_ViewFrame.h" #include "VTKViewer_RenderWindowInteractor.h" #include "QAD_RightFrame.h" +#include "QAD_WaitCursor.h" #include "SALOME_ListIteratorOfListIO.hxx" +#include "SMESH_Actor.h" +#include "SALOME_Selection.h" +#include "SALOME_InteractiveObject.hxx" + +static SMESH_Actor* FindActorByEntry(const char* theEntry) +{ + QAD_Study* aStudy = SMESHGUI::GetSMESHGUI()->GetActiveStudy(); + QAD_StudyFrame *aStudyFrame = aStudy->getActiveStudyFrame(); + VTKViewer_ViewFrame* aViewFrame = dynamic_cast( aStudyFrame->getRightFrame()->getViewFrame() ); + + if(aViewFrame){ + vtkRenderer *aRenderer = aViewFrame->getRenderer(); + vtkActorCollection *aCollection = aRenderer->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; + } + } + } + } + } + return NULL; +} //================================================================================= // class : SMESHGUI_TransparencyDlg() @@ -54,38 +77,18 @@ using namespace std; //================================================================================= SMESHGUI_TransparencyDlg::SMESHGUI_TransparencyDlg( QWidget* parent, const char* name, - SALOME_Selection* Sel, bool modal, WFlags fl ) - : QDialog( parent, name, modal, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu ) + : QDialog( parent, name, modal, WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu | WDestructiveClose ) { if ( !name ) setName( "SMESHGUI_TransparencyDlg" ); - resize( 152, 107 ); setCaption( tr( "SMESH_TRANSPARENCY_TITLE" ) ); setSizeGripEnabled( TRUE ); - SMESHGUI_TransparencyDlgLayout = new QGridLayout( this ); + QGridLayout* SMESHGUI_TransparencyDlgLayout = new QGridLayout( this ); SMESHGUI_TransparencyDlgLayout->setSpacing( 6 ); SMESHGUI_TransparencyDlgLayout->setMargin( 11 ); - /*************************************************************************/ - QGroupBox* GroupButtons = new QGroupBox( this, "GroupButtons" ); - GroupButtons->setColumnLayout(0, Qt::Vertical ); - GroupButtons->layout()->setSpacing( 0 ); - GroupButtons->layout()->setMargin( 0 ); - QGridLayout* GroupButtonsLayout = new QGridLayout( GroupButtons->layout() ); - GroupButtonsLayout->setAlignment( Qt::AlignTop ); - GroupButtonsLayout->setSpacing( 6 ); - GroupButtonsLayout->setMargin( 11 ); - - buttonOk = new QPushButton( GroupButtons, "buttonOk" ); - buttonOk->setText( tr( "GEOM_BUT_OK" ) ); - buttonOk->setAutoDefault( TRUE ); - buttonOk->setDefault( TRUE ); - GroupButtonsLayout->addItem( new QSpacerItem( 20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum), 0, 0 ); - GroupButtonsLayout->addWidget( buttonOk, 0, 1 ); - GroupButtonsLayout->addItem( new QSpacerItem( 20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum), 0, 2 ); - /*************************************************************************/ QGroupBox* GroupC1 = new QGroupBox( this, "GroupC1" ); GroupC1->setColumnLayout(0, Qt::Vertical ); @@ -96,59 +99,82 @@ SMESHGUI_TransparencyDlg::SMESHGUI_TransparencyDlg( QWidget* parent, GroupC1Layout->setSpacing( 6 ); GroupC1Layout->setMargin( 11 ); - TextLabelOpaque = new QLabel( GroupC1, "TextLabelOpaque" ); - TextLabelOpaque->setText( tr( "SMESH_TRANSPARENCY_OPAQUE" ) ); - TextLabelOpaque->setAlignment( int( QLabel::AlignLeft ) ); - GroupC1Layout->addWidget( TextLabelOpaque, 0, 0 ); - GroupC1Layout->addItem( new QSpacerItem( 20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum ), 0, 1 ); - TextLabelTransparent = new QLabel( GroupC1, "TextLabelTransparent" ); TextLabelTransparent->setText( tr( "SMESH_TRANSPARENCY_TRANSPARENT" ) ); - TextLabelTransparent->setAlignment( int( QLabel::AlignRight ) ); - GroupC1Layout->addWidget( TextLabelTransparent, 0, 2 ); + TextLabelTransparent->setAlignment( AlignLeft ); + GroupC1Layout->addWidget( TextLabelTransparent, 0, 0 ); + + ValueLab = new QLabel( GroupC1, "ValueLab" ); + ValueLab->setAlignment( AlignCenter ); + ValueLab->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); + QFont fnt = ValueLab->font(); fnt.setBold( true ); ValueLab->setFont( fnt ); + GroupC1Layout->addWidget( ValueLab, 0, 1 ); + + TextLabelOpaque = new QLabel( GroupC1, "TextLabelOpaque" ); + TextLabelOpaque->setText( tr( "SMESH_TRANSPARENCY_OPAQUE" ) ); + TextLabelOpaque->setAlignment( AlignRight ); + GroupC1Layout->addWidget( TextLabelOpaque, 0, 2 ); Slider1 = new QSlider( 0, 10, 1, 5, Horizontal, GroupC1, "Slider1" ); + Slider1->setFocusPolicy( QWidget::NoFocus ); Slider1->setMinimumSize( 300, 0 ); - Slider1->setTickmarks( QSlider::Left ); + Slider1->setTickmarks( QSlider::Above ); + Slider1->setTickInterval( 10 ); + Slider1->setTracking( true ); + Slider1->setMinValue( 0 ) ; + Slider1->setMaxValue( 100 ); + Slider1->setLineStep( 1 ); + Slider1->setPageStep( 10 ); GroupC1Layout->addMultiCellWidget( Slider1, 1, 1, 0, 2 ); + /*************************************************************************/ + QGroupBox* GroupButtons = new QGroupBox( this, "GroupButtons" ); + GroupButtons->setColumnLayout(0, Qt::Vertical ); + GroupButtons->layout()->setSpacing( 0 ); + GroupButtons->layout()->setMargin( 0 ); + QGridLayout* GroupButtonsLayout = new QGridLayout( GroupButtons->layout() ); + GroupButtonsLayout->setAlignment( Qt::AlignTop ); + GroupButtonsLayout->setSpacing( 6 ); + GroupButtonsLayout->setMargin( 11 ); + + buttonOk = new QPushButton( GroupButtons, "buttonOk" ); + buttonOk->setText( tr( "SMESH_BUT_CLOSE" ) ); + buttonOk->setAutoDefault( TRUE ); + buttonOk->setDefault( TRUE ); + GroupButtonsLayout->addItem( new QSpacerItem( 20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum), 0, 0 ); + GroupButtonsLayout->addWidget( buttonOk, 0, 1 ); + GroupButtonsLayout->addItem( new QSpacerItem( 20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum), 0, 2 ); + SMESHGUI_TransparencyDlgLayout->addWidget( GroupC1, 0, 0 ); SMESHGUI_TransparencyDlgLayout->addWidget( GroupButtons, 1, 0 ); - /* Initialisations */ - this->mySMESHGUI = SMESHGUI::GetSMESHGUI() ; - this->mySel = Sel ; - - /* First call valueChanged() method for initialisation */ - /* The default value of transparency will change with the selection */ - this->myFirstInit = true ; -// Slider1->setMaxValue( 10 ); -// Slider1->setValue( 5 ) ; + mySelection = SALOME_Selection::Selection( SMESHGUI::GetSMESHGUI()->GetActiveStudy()->getSelection()); - - this->ValueHasChanged( Slider1->value() ) ; + // Initial state + this->onSelectionChanged() ; // signals and slots connections : after ValueHasChanged() connect( buttonOk, SIGNAL( clicked() ), this, SLOT( ClickOnOk() ) ); - connect( Slider1, SIGNAL( valueChanged(int) ), this, SLOT( ValueHasChanged(int) ) ); + connect( Slider1, SIGNAL( valueChanged(int) ), this, SLOT( SetTransparency() ) ); + connect( Slider1, SIGNAL( sliderMoved(int) ), this, SLOT( ValueHasChanged() ) ); + connect( SMESHGUI::GetSMESHGUI(), SIGNAL ( SignalCloseAllDialogs() ), this, SLOT( ClickOnOk() ) ) ; + connect( mySelection, SIGNAL( currentSelectionChanged() ), this, SLOT( onSelectionChanged() ) ); /* Move widget on the botton right corner of main widget */ int x, y ; - mySMESHGUI->DefineDlgPosition( this, x, y ) ; + SMESHGUI::GetSMESHGUI()->DefineDlgPosition( this, x, y ) ; this->move( x, y ) ; - this->show() ; /* Displays this Dialog */ + this->show(); } - - //================================================================================= // function : ~SMESHGUI_TransparencyDlg() // purpose : //================================================================================= SMESHGUI_TransparencyDlg::~SMESHGUI_TransparencyDlg() { - // no need to delete child widgets, Qt does it all for us + // no need to delete child widgets, Qt does it all for us } @@ -158,51 +184,79 @@ SMESHGUI_TransparencyDlg::~SMESHGUI_TransparencyDlg() //======================================================================= void SMESHGUI_TransparencyDlg::ClickOnOk() { - accept() ; - return ; + close(); } -//======================================================================= -// function : ClickOnClose() -// purpose : -//======================================================================= -void SMESHGUI_TransparencyDlg::ClickOnClose() +//================================================================================= +// function : SetTransparency() +// purpose : Called when value of slider change +// : or the first time as initilisation +//================================================================================= +void SMESHGUI_TransparencyDlg::SetTransparency() { - accept() ; - return ; + if ( SMESHGUI::GetSMESHGUI()->GetActiveStudy()->getActiveStudyFrame()->getTypeView() == VIEW_VTK ) { + QAD_WaitCursor wc; + float opacity = this->Slider1->value() / 100. ; + SALOME_ListIteratorOfListIO It( mySelection->StoredIObjects() ); + for( ;It.More(); It.Next() ) { + Handle(SALOME_InteractiveObject) IOS = It.Value(); + SMESH_Actor* anActor = FindActorByEntry(IOS->getEntry()); + if ( anActor ) + anActor->SetOpacity( opacity ); + } + SMESHGUI::GetSMESHGUI()->GetActiveStudy()->getActiveStudyFrame()->getRightFrame()->getViewFrame()->Repaint(); + } + ValueHasChanged(); } - //================================================================================= // function : ValueHasChanged() -// purpose : Called when value of slider change -// : or the first time as initilisation +// purpose : Called when user moves a slider //================================================================================= -void SMESHGUI_TransparencyDlg::ValueHasChanged( int newValue ) +void SMESHGUI_TransparencyDlg::ValueHasChanged() { + ValueLab->setText( QString::number( this->Slider1->value() ) + "%" ); +} - if ( mySMESHGUI->GetActiveStudy()->getActiveStudyFrame()->getTypeView() == VIEW_VTK ) { - VTKViewer_RenderWindowInteractor* myRenderInter= ((VTKViewer_ViewFrame*)mySMESHGUI->GetActiveStudy()->getActiveStudyFrame()->getRightFrame()->getViewFrame())->getRWInteractor(); - SALOME_ListIteratorOfListIO It( this->mySel->StoredIObjects() ); - Handle(SALOME_InteractiveObject) FirstIOS = mySel->firstIObject(); - if( !FirstIOS.IsNull() ) { - /* The first time as initialisation */ - if( this->myFirstInit ) { - this->myFirstInit = false ; - float transp = ( myRenderInter->GetTransparency(FirstIOS))*10.0 ; - this->Slider1->setValue( int(transp) ) ; - return; +//================================================================================= +// function : onSelectionChanged() +// purpose : Called when selection is changed +//================================================================================= +void SMESHGUI_TransparencyDlg::onSelectionChanged() +{ + if ( SMESHGUI::GetSMESHGUI()->GetActiveStudy()->getActiveStudyFrame()->getTypeView() == VIEW_VTK ) { + int opacity = 100; + if ( mySelection->IObjectCount() == 1 ) { + Handle(SALOME_InteractiveObject) FirstIOS = mySelection->firstIObject(); + if( !FirstIOS.IsNull() ) { + SMESH_Actor* anActor = FindActorByEntry( FirstIOS->getEntry() ); + if ( anActor ) + opacity = int( anActor->GetOpacity() * 100. + 0.5 ); } } - - QApplication::setOverrideCursor( Qt::waitCursor ); - for( ;It.More(); It.Next() ) { - Handle(SALOME_InteractiveObject) IOS = It.Value(); - myRenderInter->SetTransparency( IOS, newValue/10.0 ); + else if ( mySelection->IObjectCount() > 1 ) { + SALOME_ListIteratorOfListIO It( mySelection->StoredIObjects() ); + int setOp = -1; + for ( ; It.More(); It.Next() ) { + Handle(SALOME_InteractiveObject) IO = It.Value(); + if( !IO.IsNull() ) { + SMESH_Actor* anActor = 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; } - QApplication::restoreOverrideCursor(); + Slider1->setValue( opacity ) ; } - QApplication::restoreOverrideCursor(); - return ; + ValueHasChanged(); } diff --git a/src/SMESHGUI/SMESHGUI_TransparencyDlg.h b/src/SMESHGUI/SMESHGUI_TransparencyDlg.h index 215abe832..2bc7767fa 100644 --- a/src/SMESHGUI/SMESHGUI_TransparencyDlg.h +++ b/src/SMESHGUI/SMESHGUI_TransparencyDlg.h @@ -29,21 +29,13 @@ #ifndef DIALOGBOX_TRANSPARENCYDLG_H #define DIALOGBOX_TRANSPARENCYDLG_H -#include "SALOME_Selection.h" -#include "SALOME_InteractiveObject.hxx" - // QT Includes -#include #include -class QVBoxLayout; -class QHBoxLayout; -class QGridLayout; -class QFrame; class QLabel; class QPushButton; class QSlider; -class SMESHGUI; +class SALOME_Selection; //================================================================================= // class : SMESHGUI_TransparencyDlg @@ -55,34 +47,28 @@ class SMESHGUI_TransparencyDlg : public QDialog public: SMESHGUI_TransparencyDlg( QWidget* parent = 0, - const char* name = 0, - SALOME_Selection* Sel = 0, - bool modal = TRUE, - WFlags fl = 0 ); + const char* name = 0, + bool modal = false, + WFlags fl = 0 ); ~SMESHGUI_TransparencyDlg(); private : - SMESHGUI* mySMESHGUI ; /* Current GeomGUI object */ - bool myFirstInit ; /* Inform for the first init */ - SALOME_Selection* mySel; /* User selection */ - - QPushButton* buttonOk; - QLabel* TextLabelOpaque; - QLabel* TextLabelTransparent; - QSlider* Slider1; + SALOME_Selection* mySelection; + + QPushButton* buttonOk; + QLabel* TextLabelOpaque; + QLabel* ValueLab; + QLabel* TextLabelTransparent; + QSlider* Slider1; public slots: void ClickOnOk(); - void ClickOnClose(); - void ValueHasChanged( int newValue ) ; - -protected: - QGridLayout* SMESHGUI_TransparencyDlgLayout; - QHBoxLayout* Layout1; - QHBoxLayout* Layout2; + void ValueHasChanged() ; + void SetTransparency(); + void onSelectionChanged(); }; #endif // DIALOGBOX_TRANSPARENCYDLG_H diff --git a/src/SMESHGUI/SMESH_icons.po b/src/SMESHGUI/SMESH_icons.po index 60f92f2d7..741477620 100644 --- a/src/SMESHGUI/SMESH_icons.po +++ b/src/SMESHGUI/SMESH_icons.po @@ -59,22 +59,6 @@ msgstr "mesh_connectivity.png" # Hypothesis #----------------------------------------------------------- -#Hypo Local Length -msgid "ICON_DLG_LOCAL_LENGTH" -msgstr "mesh_hypo_length.png" - -#Hypo Nb Segments -msgid "ICON_DLG_NB_SEGMENTS" -msgstr "mesh_hypo_segment.png" - -#Hypo Max Area -msgid "ICON_DLG_MAX_ELEMENT_AREA" -msgstr "mesh_hypo_area.png" - -#Hypo Max Volume -msgid "ICON_DLG_MAX_ELEMENT_VOLUME" -msgstr "mesh_hypo_volume.png" - #Set Algo msgid "ICON_DLG_ADD_ALGORITHM" msgstr "mesh_set_algo.png" @@ -118,53 +102,40 @@ msgstr "mesh_hexa.png" #----------------------------------------------------------- -# ObjectBrother +# ObjectBrowser #----------------------------------------------------------- #mesh_tree_mesh msgid "ICON_SMESH_TREE_MESH" msgstr "mesh_tree_mesh.png" +#mesh_tree_group +msgid "ICON_SMESH_TREE_GROUP" +msgstr "mesh_tree_group.png" + #mesh_tree_algo msgid "ICON_SMESH_TREE_ALGO" msgstr "mesh_tree_algo.png" -#mesh_tree_algo_regular -msgid "ICON_SMESH_TREE_ALGO_Regular_1D" -msgstr "mesh_tree_algo_regular.png" - -#mesh_tree_algo_hexa -msgid "ICON_SMESH_TREE_ALGO_Hexa_3D" -msgstr "mesh_tree_algo_hexa.png" - -#mesh_tree_algo_mefisto -msgid "ICON_SMESH_TREE_ALGO_MEFISTO_2D" -msgstr "mesh_tree_algo_mefisto.png" - -#mesh_tree_algo_quad -msgid "ICON_SMESH_TREE_ALGO_Quadrangle_2D" -msgstr "mesh_tree_algo_quad.png" - #mesh_tree_hypo msgid "ICON_SMESH_TREE_HYPO" msgstr "mesh_tree_hypo.png" -#mesh_tree_hypo_area -msgid "ICON_SMESH_TREE_HYPO_MaxElementArea" -msgstr "mesh_tree_hypo_area.png" +#mesh_tree_mesh_warn +msgid "ICON_SMESH_TREE_MESH_WARN" +msgstr "mesh_tree_mesh_warn.png" -#mesh_tree_hypo_length -msgid "ICON_SMESH_TREE_HYPO_LocalLength" -msgstr "mesh_tree_hypo_length.png" +#mesh_tree_mesh +msgid "ICON_SMESH_TREE_MESH_IMPORTED" +msgstr "mesh_tree_importedmesh.png" -#mesh_tree_hypo_segment -msgid "ICON_SMESH_TREE_HYPO_NumberOfSegments" -msgstr "mesh_tree_hypo_segment.png" -#mesh_tree_hypo_volume -msgid "ICON_SMESH_TREE_HYPO_MaxElementVolume" -msgstr "mesh_tree_hypo_volume.png" +#----------------------------------------------------------- +# Group +#----------------------------------------------------------- -#mesh_tree_mesh_warn -msgid "ICON_SMESH_TREE_MESH_WARN" -msgstr "mesh_tree_mesh_warn.png" +msgid "ICON_EDIT_GROUP" +msgstr "mesh_edit_group.png" + +msgid "ICON_CONSTRUCT_GROUP" +msgstr "mesh_make_group.png" diff --git a/src/SMESHGUI/SMESH_msg_en.po b/src/SMESHGUI/SMESH_msg_en.po index c593f9571..38d6f37ed 100644 --- a/src/SMESHGUI/SMESH_msg_en.po +++ b/src/SMESHGUI/SMESH_msg_en.po @@ -38,11 +38,34 @@ msgstr "&No" msgid "SMESH_BUT_CANCEL" msgstr "&Cancel" +#Add +msgid "SMESH_BUT_ADD" +msgstr "A&dd" + +#Remove +msgid "SMESH_BUT_REMOVE" +msgstr "&Remove" + +#Set Filters +msgid "SMESH_BUT_FILTER" +msgstr "Set &Filters" + +#Sort +msgid "SMESH_BUT_SORT" +msgstr "&Sort List" + +#Create +msgid "SMESH_BUT_CREATE" +msgstr "Create" #------------------------------------------------------------------------- # WARNING #------------------------------------------------------------------------- +#Error +msgid "SMESH_ERROR" +msgstr "Error" + #Warning msgid "SMESH_WRN_WARNING" msgstr "Warning" @@ -83,6 +106,9 @@ msgstr "Activate Nodes Selection Mode" msgid "SMESH_WRN_SELECTIONMODE_DIAGONAL" msgstr "Activate Link Selection Mode" +#Empty name +msgid "SMESH_WRN_EMPTY_NAME" +msgstr "Empty name is not valid" #------------------------------------------------------------------------- # MEN @@ -114,19 +140,19 @@ msgstr "SubMeshes On Compound" #Applied Algorithm msgid "SMESH_MEN_APPLIED_ALGORIHTMS" -msgstr "Applied Algorithm" +msgstr "Applied Algorithms" #Applied Hypothesis msgid "SMESH_MEN_APPLIED_HYPOTHESIS" -msgstr "Applied Hypothesis" +msgstr "Applied Hypotheses" #Hypothesis Definition msgid "SMESH_MEN_HYPOTHESIS" -msgstr "Hypothesis Definition" +msgstr "Hypotheses" #Algorithms Definition msgid "SMESH_MEN_ALGORITHMS" -msgstr "Algorithms Definition" +msgstr "Algorithms" #------------------------------------------------------------------------- @@ -207,6 +233,18 @@ msgstr "SubMesh" # -------------- Hypothesis / Algorithm -------------- +#Meshers file +msgid "MESHERS_FILE_NO_VARIABLE" +msgstr "Environment variable SMESH_MeshersList is not defined" + +#Meshers file +msgid "MESHERS_FILE_CANT_OPEN" +msgstr "Can not open resource file" + +#Meshers file +msgid "MESHERS_FILE_CHECK_VARIABLE" +msgstr "Check environment variable SMESH_MeshersList" + #Hypothesis msgid "SMESH_ADD_HYPOTHESIS" msgstr "Hypothesis" @@ -219,14 +257,6 @@ msgstr "Hypothesis Assignation" msgid "SMESH_OBJECT_HYPOTHESIS" msgstr "Hypothesis" -#Local Length -msgid "SMESH_LOCAL_LENGTH_HYPOTHESIS" -msgstr "Local Length" - -#Hypothesis Construction -msgid "SMESH_LOCAL_LENGTH_TITLE" -msgstr "Hypothesis Construction" - #Algorithms msgid "SMESH_ADD_ALGORITHM" msgstr "Algorithms" @@ -239,38 +269,6 @@ msgstr "Algorithms Assignation" msgid "SMESH_OBJECT_ALGORITHM" msgstr "Algorithm" -#Number of Segments -msgid "SMESH_NB_SEGMENTS_HYPOTHESIS" -msgstr "Number of Segments" - -#Hypothesis Construction -msgid "SMESH_NB_SEGMENTS_TITLE" -msgstr "Hypothesis Construction" - -#Max. Area -msgid "SMESH_MAX_ELEMENT_AREA" -msgstr "Max. Area" - -#Max. Element Area -msgid "SMESH_MAX_ELEMENT_AREA_HYPOTHESIS" -msgstr "Max. Element Area" - -#Hypothesis Construction -msgid "SMESH_MAX_ELEMENT_AREA_TITLE" -msgstr "Hypothesis Construction" - -#Max. Volume -msgid "SMESH_MAX_ELEMENT_VOLUME" -msgstr "Max. Volume" - -#Max. Element Volume -msgid "SMESH_MAX_ELEMENT_VOLUME_HYPOTHESIS" -msgstr "Max. Element Volume" - -#Hypothesis Construction -msgid "SMESH_MAX_ELEMENT_VOLUME_TITLE" -msgstr "Hypothesis Construction" - # -------------- Nodes / Segments / Elements -------------- @@ -391,87 +389,118 @@ msgstr "Add Hexahedron" #Opacity msgid "SMESH_TRANSPARENCY_OPAQUE" -msgstr "Opacity" +msgstr "---> Opaque" #Transparency msgid "SMESH_TRANSPARENCY_TITLE" -msgstr "Transparency" +msgstr "Change Transparency" #Fully Transparency msgid "SMESH_TRANSPARENCY_TRANSPARENT" -msgstr "Fully Transparency" +msgstr "Transparent <---" # -------------- Preferences ----------- +#Scalar Bar Preferences +msgid "SMESH_PROPERTIES_SCALARBAR" +msgstr "Scalar Bar Properties" + +#Scalar Bar Properties +msgid "SMESH_PREFERENCES_SCALARBAR" +msgstr "Scalar Bar Preferences" + +#Scalar Bar Range +msgid "SMESH_RANGE_SCALARBAR" +msgstr "Scalar Range" + +#Scalar Bar Range Min Value +msgid "SMESH_RANGE_MIN" +msgstr "Min value:" + +#Scalar Bar Range Max Value +msgid "SMESH_RANGE_MAX" +msgstr "Max value:" + +#Scalar Bar Font +msgid "SMESH_FONT_SCALARBAR" +msgstr "Font" + #Arial msgid "SMESH_FONT_ARIAL" msgstr "Arial" -#Bold -msgid "SMESH_FONT_BOLD" -msgstr "Bold" - #Courier msgid "SMESH_FONT_COURIER" msgstr "Courier" -#Dimensions -msgid "SMESH_DIMENSIONS" -msgstr "Dimensions" - -#Font -msgid "SMESH_FONT" -msgstr "Font" - -#Height -msgid "SMESH_HEIGHT" -msgstr "Height" +#Times +msgid "SMESH_FONT_TIMES" +msgstr "Times" -#Horizontal -msgid "SMESH_HORIZONTAL" -msgstr "Horizontal" +#Bold +msgid "SMESH_FONT_BOLD" +msgstr "Bold" #Italic msgid "SMESH_FONT_ITALIC" msgstr "Italic" -#Scalar Bar Preferences -msgid "SMESH_PREFERENCES_SCALARBAR" -msgstr "Scalar Bar Preferences" +#Shadow +msgid "SMESH_FONT_SHADOW" +msgstr "Shadow" + +#Title +msgid "SMESH_TITLE" +msgstr "Title:" + +#Labels +msgid "SMESH_LABELS" +msgstr "Labels:" + +#Colors & Labels +msgid "SMESH_LABELS_COLORS_SCALARBAR" +msgstr "Colors && Labels" #Number Of Colors msgid "SMESH_NUMBEROFCOLORS" -msgstr "Number Of Colors" +msgstr "Nb of colors:" #Number Of Labels msgid "SMESH_NUMBEROFLABELS" -msgstr "Number Of Labels" +msgstr "Nb of labels:" #Orientation msgid "SMESH_ORIENTATION" msgstr "Orientation" -#Properties -msgid "SMESH_PROPERTIES" -msgstr "Properties" - -#Shadow -msgid "SMESH_FONT_SHADOW" -msgstr "Shadow" - -#Times -msgid "SMESH_FONT_TIMES" -msgstr "Times" - #Vertical msgid "SMESH_VERTICAL" msgstr "Vertical" +#Horizontal +msgid "SMESH_HORIZONTAL" +msgstr "Horizontal" + +#Position & Size +msgid "SMESH_POSITION_SIZE_SCALARBAR" +msgstr "Origin && Size" + +#X +msgid "SMESH_X_SCALARBAR" +msgstr "X:" + +#Y +msgid "SMESH_Y_SCALARBAR" +msgstr "Y:" + #Width msgid "SMESH_WIDTH" -msgstr "Width" +msgstr "Width:" +#Height +msgid "SMESH_HEIGHT" +msgstr "Height:" # -------------- ScalarBar -------------- @@ -485,7 +514,7 @@ msgstr "Min" #ScalarBar msgid "SMESH_SCALARBAR" -msgstr "ScalarBar" +msgstr "Scalar Bar" #Update View msgid "SMESH_UPDATEVIEW" @@ -510,10 +539,6 @@ msgstr "Manifold Edges" msgid "SMESH_NONMANIFOLDEDGES" msgstr "Non Manifold Edges" -#Edges Connectivity -msgid "SMESH_EDGES_CONNECTIVITY" -msgstr "Edges Connectivity" - #Edges Connectivity msgid "SMESH_EDGES_CONNECTIVITY_TITLE" msgstr "Edges Connectivity" @@ -551,72 +576,87 @@ msgstr "Diagonal Inversion" msgid "SMESH_MESHINFO_TITLE" msgstr "Mesh Infos" -#Number Of 1D Elements -msgid "SMESH_MESHINFO_NB1D" -msgstr "Number Of 1D Elements" - -#Number Of 2D Elements -msgid "SMESH_MESHINFO_NB2D" -msgstr "Number Of 2D Elements" +#Mesh Infos +msgid "SMESH_MESHINFO_NAME" +msgstr "Name" -#Number Of 3D Elements -msgid "SMESH_MESHINFO_NB3D" -msgstr "Number Of 3D Elements" +#Faces : +msgid "SMESH_MESHINFO_ELEMENTS" +msgstr "Elements" #Edges : msgid "SMESH_MESHINFO_EDGES" -msgstr "Edges :" +msgstr "Edges" #Nodes : msgid "SMESH_MESHINFO_NODES" -msgstr "Nodes :" +msgstr "Nodes" + +#Faces : +msgid "SMESH_MESHINFO_FACES" +msgstr "Faces" + +#Total : +msgid "SMESH_MESHINFO_TOTAL" +msgstr "Total" #Triangles : msgid "SMESH_MESHINFO_TRIANGLES" -msgstr "Triangles :" +msgstr "Triangles" #Quadrangles : msgid "SMESH_MESHINFO_QUADRANGLES" -msgstr "Quadrangles :" +msgstr "Quadrangles" + +#Volumes : +msgid "SMESH_MESHINFO_VOLUMES" +msgstr "Volumes" #Tetrahedrons : msgid "SMESH_MESHINFO_TETRAS" -msgstr "Tetrahedrons :" +msgstr "Tetrahedrons" #Hexahedrons : msgid "SMESH_MESHINFO_HEXAS" -msgstr "Hexahedrons :" +msgstr "Hexahedrons" +#Pyramids : +msgid "SMESH_MESHINFO_PYRAS" +msgstr "Pyramids" -# -------------- Controls -------------- +#Prisms : +msgid "SMESH_MESHINFO_PRISMS" +msgstr "Prisms" -#Length -msgid "SMESH_CONTROL_LENGTH_EDGES" -msgstr "Length" +#Type : +msgid "SMESH_MESHINFO_TYPE" +msgstr "Type" -#Area -msgid "SMESH_CONTROL_AREA_ELEMENTS" -msgstr "Area" +#Entities : +msgid "SMESH_MESHINFO_ENTITIES" +msgstr "Entities" -#Taper -msgid "SMESH_CONTROL_TAPER_ELEMENTS" -msgstr "Taper" +#All types : +msgid "SMESH_MESHINFO_ALL_TYPES" +msgstr "Heterogenous" -#Aspect Ratio -msgid "SMESH_CONTROL_ASPECTRATIO_ELEMENTS" -msgstr "Aspect Ratio" +#No valid selection : +msgid "SMESH_BAD_SELECTION" +msgstr "No valid selection" -#Minimum Angle -msgid "SMESH_CONTROL_MINIMUMANGLE_ELEMENTS" -msgstr "Minimum Angle" +# --------- Create hypotheses/algorithms --------- -#Warp -msgid "SMESH_CONTROL_WARP_ELEMENTS" -msgstr "Warp" +msgid "SMESH_CREATE_HYPOTHESES" +msgstr "Create hypotheses" -#Skew -msgid "SMESH_CONTROL_SKEW_ELEMENTS" -msgstr "Skew" +msgid "SMESH_CREATE_ALGORITHMS" +msgstr "Create algorithms" + +msgid "SMESH_AVAILABLE_ALGORITHMS" +msgstr "Available algorithms" + +msgid "SMESH_AVAILABLE_HYPOTHESES" +msgstr "Available hypotheses" # -------------- Edit -------------- @@ -636,3 +676,247 @@ msgstr "Available" msgid "SMESH_EDIT_USED" msgstr "Used" +# -------------- Group -------------- + +#Create Group +msgid "SMESH_CREATE_GROUP_TITLE" +msgstr "Create Group" + +#Edit Group +msgid "SMESH_EDIT_GROUP_TITLE" +msgstr "Edit Group" + +#Elements Type +msgid "SMESH_ELEMENTS_TYPE" +msgstr "Elements Type" + +#Face +msgid "SMESH_FACE" +msgstr "Face" + +#Volume +msgid "SMESH_VOLUME" +msgstr "Volume" + +#Content +msgid "SMESH_CONTENT" +msgstr "Content" + +#Select rom +msgid "SMESH_SELECT_FROM" +msgstr "Select From" + +#Group +msgid "SMESH_GROUP" +msgstr "Group" + +#%1 SubMeshes +msgid "SMESH_SUBMESH_SELECTED" +msgstr "%1 SubMeshes" + +#%1 Groups +msgid "SMESH_GROUP_SELECTED" +msgstr "%1 Groups" + + +# -------------- Preferences - Selection -------------- +msgid "SMESH_PREF_SELECTION" +msgstr "Preferences - Selection" + +msgid "SMESH_SELECTION" +msgstr "Selection" + +msgid "SMESH_PRESELECTION" +msgstr "Preselection" + +msgid "SMESH_HILIGHT_COLOR" +msgstr "Highlight Color" + +msgid "SMESH_ELEMENTS_COLOR" +msgstr "Mesh Element Color" + +msgid "SMESH_PRECISION" +msgstr "Precision" + +msgid "SMESH_OUTLINE_COLOR" +msgstr "Mesh Object Color" + + +# -------------- SMESHGUI_FilterDlg -------------- +msgid "SMESHGUI_FilterDlg::FACES_TLT" +msgstr "Filter for Faces" + +msgid "SMESHGUI_FilterDlg::EDGES_TLT" +msgstr "Filter for Edges" + +msgid "SMESHGUI_FilterDlg::ADD" +msgstr "Add" + +msgid "SMESHGUI_FilterDlg::REMOVE" +msgstr "Remove" + +msgid "SMESHGUI_FilterDlg::CRITERION" +msgstr "Criterion" + +msgid "SMESHGUI_FilterDlg::COMPARE" +msgstr "Compare" + +msgid "SMESHGUI_FilterDlg::THRESHOLD_VALUE" +msgstr "Threshold value" + +msgid "SMESHGUI_FilterDlg::UNARY" +msgstr "Unary" + +msgid "SMESHGUI_FilterDlg::BINARY" +msgstr "Binary" + +msgid "SMESHGUI_FilterDlg::FREE_BORDERS" +msgstr "Free borders" + +msgid "SMESHGUI_FilterDlg::MULTI_BORDERS" +msgstr "Borders at multi-connections" + +msgid "SMESHGUI_FilterDlg::LENGTH" +msgstr "Length" + +msgid "SMESHGUI_FilterDlg::ASPECT_RATIO" +msgstr "Aspect ratio" + +msgid "SMESHGUI_FilterDlg::WARPING" +msgstr "Warping" + +msgid "SMESHGUI_FilterDlg::MINIMUM_ANGLE" +msgstr "Minimum angle" + +msgid "SMESHGUI_FilterDlg::TAPER" +msgstr "Taper" + +msgid "SMESHGUI_FilterDlg::SKEW" +msgstr "Skew" + +msgid "SMESHGUI_FilterDlg::AREA" +msgstr "Area" + +msgid "SMESHGUI_FilterDlg::LESS_THAN" +msgstr "Less than" + +msgid "SMESHGUI_FilterDlg::MORE_THAN" +msgstr "More than" + +msgid "SMESHGUI_FilterDlg::EQUAL_TO" +msgstr "Equal to" + +msgid "SMESHGUI_FilterDlg::NOT" +msgstr "Not" + +msgid "SMESHGUI_FilterDlg::AND" +msgstr "And" + +msgid "SMESHGUI_FilterDlg::OR" +msgstr "Or" + +msgid "SMESHGUI_FilterDlg::ERROR" +msgstr "Threshold value is not correctly specified\nPlease enter correct value and try again" + +msgid "SMESHGUI_FilterDlg::MULTIEDGES_ERROR" +msgstr "Threshold value of borders at multi-connections can not be equal 1\nPlease enter correct value and try again" + +msgid "SMESHGUI_FilterDlg::SOURCE" +msgstr "Source" + +msgid "SMESHGUI_FilterDlg::MESH" +msgstr "Mesh" + +msgid "SMESHGUI_FilterDlg::SELECTION" +msgstr "Current Selection" + +msgid "SMESHGUI_FilterDlg::CURRENT_GROUP" +msgstr "Current Group" + +msgid "SMESHGUI_FilterDlg::NONE" +msgstr "None" + +msgid "SMESHGUI_FilterDlg::SET_IN_VIEWER" +msgstr "Insert filter in viewer" + +msgid "SMESHGUI_FilterDlg::CLEAR" +msgstr "Clear" + +# -------------- SMESHGUI -------------- +msgid "SMESHGUI::MESH_IS_NOT_SELECTED" +msgstr "There is no selected mesh\nPlease, select a mesh and try again" + +msgid "SMESHGUI::NOT_A_VTK_VIEWER" +msgstr "This command is available in VTK viewer only\nPlease, create VTK viewer and try again" + +msgid "SMESHGUI::LENGTH_EDGES" +msgstr "Length" + +msgid "SMESHGUI::FREE_BORDERS" +msgstr "Free borders" + +msgid "SMESHGUI::MULTI_BORDERS" +msgstr "Borders at multi-connections" + +msgid "SMESHGUI::AREA_ELEMENTS" +msgstr "Area" + +msgid "SMESHGUI::TAPER_ELEMENTS" +msgstr "Taper" + +msgid "SMESHGUI::ASPECTRATIO_ELEMENTS" +msgstr "Aspect Ratio" + +msgid "SMESHGUI::MINIMUMANGLE_ELEMENTS" +msgstr "Minimum Angle" + +msgid "SMESHGUI::WARP_ELEMENTS" +msgstr "Warp" + +msgid "SMESHGUI::SKEW_ELEMENTS" +msgstr "Skew" + +msgid "SMESH_INSUFFICIENT_DATA" +msgstr "Insufficient input value" + +msgid "SMESH_HYP_1" +msgstr "Algorithm misses a hypothesis" + +msgid "SMESH_HYP_2" +msgstr "Concurrent hypotheses on a shape" + +msgid "SMESH_HYP_3" +msgstr "Hypothesis has a bad parameter value" + +msgid "SMESH_HYP_4" +msgstr "Unknown fatal error while assigning hypothesis" + +msgid "SMESH_HYP_5" +msgstr "Hypothesis is not suitable in the current context" + +msgid "SMESH_HYP_6" +msgstr "Non-conform mesh is produced using applied hypotheses" + +msgid "SMESH_HYP_7" +msgstr "Such hypothesis is already assigned to the shape" + +msgid "SMESH_HYP_8" +msgstr "Hypothesis and submesh dimensions mismatch" + +msgid "SMESH_DRS_1" +msgstr "MED file contains no mesh with the given name" + +msgid "SMESH_DRS_2" +msgstr "" +"MED file has overlapped ranges of element numbers,\n" +" the numbers from the file are ignored" + +msgid "SMESH_DRS_3" +msgstr "Some elements were skipped due to incorrect file data" + +msgid "SMESH_DRS_4" +msgstr " The file is incorrect,\n" + "some information will be missed" + +msgid "INF_SELECT_OBJECT" +msgstr "Select an object" \ No newline at end of file diff --git a/src/SMESH_I/Makefile.in b/src/SMESH_I/Makefile.in index 44991ebde..2f38fc04e 100644 --- a/src/SMESH_I/Makefile.in +++ b/src/SMESH_I/Makefile.in @@ -30,59 +30,64 @@ top_srcdir=@top_srcdir@ top_builddir=../.. srcdir=@srcdir@ -VPATH=.:@srcdir@:@top_srcdir@/idl:$(top_builddir)/idl:${KERNEL_ROOT_DIR}/idl/salome:${MED_ROOT_DIR}/idl/salome +VPATH=.:@srcdir@:@top_srcdir@/idl:$(top_builddir)/idl: @COMMENCE@ +# header files +EXPORT_HEADERS= \ + SMESH_Gen_i.hxx \ + SMESH_Algo_i.hxx \ + SMESH_1D_Algo_i.hxx \ + SMESH_2D_Algo_i.hxx \ + SMESH_3D_Algo_i.hxx \ + SMESH_subMesh_i.hxx \ + SMESH_topo.hxx \ + SMESH_Mesh_i.hxx \ + SMESH_Hypothesis_i.hxx + EXPORT_PYSCRIPTS = smeshpy.py SMESH_test.py # Libraries targets LIB= libSMESHEngine.la -LIB_SRC = SMESH_Gen_i.cxx SMESH_Mesh_i.cxx SMESH_MEDMesh_i.cxx \ - SMESH_MEDFamily_i.cxx SMESH_MEDSupport_i.cxx \ - SMESH_subMesh_i.cxx \ - SMESH_MeshEditor_i.cxx \ - SMESH_Hypothesis_i.cxx \ - SMESH_topo.cxx SMESH_HypothesisFactory_i.cxx \ - SMESH_Algo_i.cxx \ - SMESH_1D_Algo_i.cxx \ - SMESH_2D_Algo_i.cxx \ - SMESH_3D_Algo_i.cxx \ - SMESH_NumberOfSegments_i.cxx \ - SMESH_LocalLength_i.cxx \ - SMESH_MaxElementArea_i.cxx \ - SMESH_LengthFromEdges_i.cxx \ - SMESH_MaxElementVolume_i.cxx \ - SMESH_Regular_1D_i.cxx \ - SMESH_Quadrangle_2D_i.cxx \ - SMESH_MEFISTO_2D_i.cxx \ - SMESH_Hexa_3D_i.cxx +LIB_SRC = \ + SMESH_Gen_i.cxx \ + SMESH_Mesh_i.cxx \ + SMESH_MEDMesh_i.cxx \ + SMESH_MEDFamily_i.cxx \ + SMESH_MEDSupport_i.cxx \ + SMESH_subMesh_i.cxx \ + SMESH_MeshEditor_i.cxx \ + SMESH_Hypothesis_i.cxx \ + SMESH_topo.cxx \ + SMESH_Algo_i.cxx \ + SMESH_1D_Algo_i.cxx \ + SMESH_2D_Algo_i.cxx \ + SMESH_3D_Algo_i.cxx \ + SMESH_Filter_i.cxx \ + SMESH_Group_i.cxx LIB_SERVER_IDL = SMESH_Gen.idl SMESH_Hypothesis.idl SMESH_Mesh.idl \ SALOME_Component.idl SALOME_Exception.idl \ - SMESH_BasicHypothesis.idl + SMESH_Filter.idl SMESH_Group.idl -LIB_CLIENT_IDL = SALOMEDS.idl GEOM_Gen.idl GEOM_Shape.idl MED.idl SALOMEDS_Attributes.idl +LIB_CLIENT_IDL = SALOMEDS.idl GEOM_Gen.idl GEOM_Shape.idl MED.idl SALOMEDS_Attributes.idl SALOME_GenericObj.idl # Executables targets BIN = BIN_SRC = # additionnal information to compil and link file -CPPFLAGS+= $(OCC_INCLUDES) $(MED2_INCLUDES) $(HDF5_INCLUDES) -I${KERNEL_ROOT_DIR}/include/salome -I${GEOM_ROOT_DIR}/include/salome -CXXFLAGS+= $(OCC_CXXFLAGS) $(MED2_INCLUDES) $(HDF5_INCLUDES) -I${KERNEL_ROOT_DIR}/include/salome -I${GEOM_ROOT_DIR}/include/salome +CPPFLAGS+= $(OCC_INCLUDES) $(MED2_INCLUDES) $(HDF5_INCLUDES) -I${KERNEL_ROOT_DIR}/include/salome \ + -I${GEOM_ROOT_DIR}/include/salome $(BOOST_CPPFLAGS) +CXXFLAGS+= $(OCC_CXXFLAGS) $(MED2_INCLUDES) $(HDF5_INCLUDES) -I${KERNEL_ROOT_DIR}/include/salome \ + -I${GEOM_ROOT_DIR}/include/salome #IDLCXXFLAGS+= -Wbtp -LDFLAGS+= $(HDF5_LIBS) $(MED2_LIBS) -lSMESHimpl -lSalomeContainer -lSalomeNS -lSalomeDS -lRegistry -lSalomeHDFPersist -lOpUtil -lGEOMClient -lSMESHDS -lSMDS -lMEFISTO2D -lMeshDriverMED -lSalomeLifeCycleCORBA -L${KERNEL_ROOT_DIR}/lib/salome -L${GEOM_ROOT_DIR}/lib/salome - -ifeq (@WITHNETGEN@,yes) - LIB_SRC += SMESH_NETGEN_3D_i.cxx - LDFLAGS += -lNETGEN -endif +LDFLAGS+= $(HDF5_LIBS) $(MED2_LIBS) -lSMESHimpl -lSalomeContainer -lSalomeNS -lSalomeDS -lRegistry -lSalomeHDFPersist -lOpUtil -lGEOMClient -lSMESHDS -lSMDS -lMeshDriverMED -lSalomeLifeCycleCORBA -L${KERNEL_ROOT_DIR}/lib/salome -L${GEOM_ROOT_DIR}/lib/salome -lSalomeGenericObj @CONCLUDE@ - diff --git a/src/SMESH_I/SMESH_1D_Algo_i.cxx b/src/SMESH_I/SMESH_1D_Algo_i.cxx index ae37c9435..a792ec287 100644 --- a/src/SMESH_I/SMESH_1D_Algo_i.cxx +++ b/src/SMESH_I/SMESH_1D_Algo_i.cxx @@ -26,46 +26,36 @@ // Module : SMESH // $Header$ -using namespace std; using namespace std; #include "SMESH_1D_Algo_i.hxx" -#include "SMESH_Gen.hxx" -#include "SMESH_HypothesisFactory.hxx" -#include "Utils_CorbaException.hxx" #include "utilities.h" //============================================================================= /*! - * + * SMESH_1D_Algo_i::SMESH_1D_Algo_i + * + * Constructor */ //============================================================================= -SMESH_1D_Algo_i::SMESH_1D_Algo_i() +SMESH_1D_Algo_i::SMESH_1D_Algo_i( PortableServer::POA_ptr thePOA ) + : SALOME::GenericObj_i( thePOA ), + SMESH_Hypothesis_i( thePOA ), + SMESH_Algo_i( thePOA ) { - MESSAGE("SMESH_1D_Algo_i::SMESH_1D_Algo_i"); + MESSAGE( "SMESH_1D_Algo_i::SMESH_1D_Algo_i" ); } //============================================================================= /*! - * + * SMESH_1D_Algo_i::~SMESH_1D_Algo_i + * + * Destructor */ //============================================================================= SMESH_1D_Algo_i::~SMESH_1D_Algo_i() { - MESSAGE("SMESH_1D_Algo_i::~SMESH_1D_Algo_i"); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -void SMESH_1D_Algo_i::SetImpl(::SMESH_1D_Algo* impl) -{ - MESSAGE("SMESH_1D_Algo_i::SetImpl"); - SMESH_Algo_i::SetImpl(impl); - _impl = impl; + MESSAGE( "SMESH_1D_Algo_i::~SMESH_1D_Algo_i" ); } diff --git a/src/SMESH_I/SMESH_1D_Algo_i.hxx b/src/SMESH_I/SMESH_1D_Algo_i.hxx index 4f619ea99..16ab9b441 100644 --- a/src/SMESH_I/SMESH_1D_Algo_i.hxx +++ b/src/SMESH_I/SMESH_1D_Algo_i.hxx @@ -34,21 +34,20 @@ #include "SMESH_Algo_i.hxx" -#include "SMESH_1D_Algo.hxx" - +// ====================================================== +// Generic 1D algorithm +// ====================================================== class SMESH_1D_Algo_i: - public POA_SMESH::SMESH_1D_Algo, - public SMESH_Algo_i + public virtual POA_SMESH::SMESH_1D_Algo, + public virtual SMESH_Algo_i { -public: - SMESH_1D_Algo_i(); - - virtual ~SMESH_1D_Algo_i(); - protected: - virtual void SetImpl(::SMESH_1D_Algo* impl); + // Constructor : placed in protected section to prohibit creation of generic class instance + SMESH_1D_Algo_i( PortableServer::POA_ptr thePOA ); - ::SMESH_1D_Algo* _impl; +public: + // Destructor + virtual ~SMESH_1D_Algo_i(); }; #endif diff --git a/src/SMESH_I/SMESH_2D_Algo_i.cxx b/src/SMESH_I/SMESH_2D_Algo_i.cxx index 4114c0d77..833be2ac9 100644 --- a/src/SMESH_I/SMESH_2D_Algo_i.cxx +++ b/src/SMESH_I/SMESH_2D_Algo_i.cxx @@ -26,46 +26,36 @@ // Module : SMESH // $Header$ -using namespace std; using namespace std; #include "SMESH_2D_Algo_i.hxx" -#include "SMESH_Gen.hxx" -#include "SMESH_HypothesisFactory.hxx" -#include "Utils_CorbaException.hxx" #include "utilities.h" //============================================================================= /*! - * + * SMESH_2D_Algo_i::SMESH_2D_Algo_i + * + * Constructor */ //============================================================================= -SMESH_2D_Algo_i::SMESH_2D_Algo_i() +SMESH_2D_Algo_i::SMESH_2D_Algo_i( PortableServer::POA_ptr thePOA ) + : SALOME::GenericObj_i( thePOA ), + SMESH_Hypothesis_i( thePOA ), + SMESH_Algo_i( thePOA ) { - MESSAGE("SMESH_2D_Algo_i::SMESH_2D_Algo_i"); + MESSAGE( "SMESH_2D_Algo_i::SMESH_2D_Algo_i" ); } //============================================================================= /*! - * + * SMESH_2D_Algo_i::~SMESH_2D_Algo_i + * + * Destructor */ //============================================================================= SMESH_2D_Algo_i::~SMESH_2D_Algo_i() { - MESSAGE("SMESH_2D_Algo_i::~SMESH_2D_Algo_i"); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -void SMESH_2D_Algo_i::SetImpl(::SMESH_2D_Algo* impl) -{ - MESSAGE("SMESH_2D_Algo_i::SetImpl"); - SMESH_Algo_i::SetImpl(impl); - _impl = impl; + MESSAGE( "SMESH_2D_Algo_i::~SMESH_2D_Algo_i" ); } diff --git a/src/SMESH_I/SMESH_2D_Algo_i.hxx b/src/SMESH_I/SMESH_2D_Algo_i.hxx index 3143aa431..cebda6197 100644 --- a/src/SMESH_I/SMESH_2D_Algo_i.hxx +++ b/src/SMESH_I/SMESH_2D_Algo_i.hxx @@ -34,21 +34,20 @@ #include "SMESH_Algo_i.hxx" -#include "SMESH_2D_Algo.hxx" - +// ====================================================== +// Generic 2D algorithm +// ====================================================== class SMESH_2D_Algo_i: - public POA_SMESH::SMESH_2D_Algo, - public SMESH_Algo_i + public virtual POA_SMESH::SMESH_2D_Algo, + public virtual SMESH_Algo_i { -public: - SMESH_2D_Algo_i(); - - virtual ~SMESH_2D_Algo_i(); - protected: - virtual void SetImpl(::SMESH_2D_Algo* impl); + // Constructor : placed in protected section to prohibit creation of generic class instance + SMESH_2D_Algo_i( PortableServer::POA_ptr thePOA ); - ::SMESH_2D_Algo* _impl; +public: + // Destructor + virtual ~SMESH_2D_Algo_i(); }; #endif diff --git a/src/SMESH_I/SMESH_3D_Algo_i.cxx b/src/SMESH_I/SMESH_3D_Algo_i.cxx index e28872c77..197fc4448 100644 --- a/src/SMESH_I/SMESH_3D_Algo_i.cxx +++ b/src/SMESH_I/SMESH_3D_Algo_i.cxx @@ -26,46 +26,36 @@ // Module : SMESH // $Header$ -using namespace std; using namespace std; #include "SMESH_3D_Algo_i.hxx" -#include "SMESH_Gen.hxx" -#include "SMESH_HypothesisFactory.hxx" -#include "Utils_CorbaException.hxx" #include "utilities.h" //============================================================================= /*! - * + * SMESH_3D_Algo_i::SMESH_3D_Algo_i + * + * Constructor */ //============================================================================= -SMESH_3D_Algo_i::SMESH_3D_Algo_i() +SMESH_3D_Algo_i::SMESH_3D_Algo_i( PortableServer::POA_ptr thePOA ) + : SALOME::GenericObj_i( thePOA ), + SMESH_Hypothesis_i( thePOA ), + SMESH_Algo_i( thePOA ) { - MESSAGE("SMESH_3D_Algo_i::SMESH_3D_Algo_i"); + MESSAGE( "SMESH_3D_Algo_i::SMESH_3D_Algo_i" ); } //============================================================================= /*! - * + * SMESH_3D_Algo_i::~SMESH_3D_Algo_i + * + * Destructor */ //============================================================================= SMESH_3D_Algo_i::~SMESH_3D_Algo_i() { - MESSAGE("SMESH_3D_Algo_i::~SMESH_3D_Algo_i"); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -void SMESH_3D_Algo_i::SetImpl(::SMESH_3D_Algo* impl) -{ - MESSAGE("SMESH_3D_Algo_i::SetImpl"); - SMESH_Algo_i::SetImpl(impl); - _impl = impl; + MESSAGE( "SMESH_3D_Algo_i::~SMESH_3D_Algo_i" ); } diff --git a/src/SMESH_I/SMESH_3D_Algo_i.hxx b/src/SMESH_I/SMESH_3D_Algo_i.hxx index aa75717a2..a45336a39 100644 --- a/src/SMESH_I/SMESH_3D_Algo_i.hxx +++ b/src/SMESH_I/SMESH_3D_Algo_i.hxx @@ -34,21 +34,20 @@ #include "SMESH_Algo_i.hxx" -class SMESH_3D_Algo; - +// ====================================================== +// Generic 3D algorithm +// ====================================================== class SMESH_3D_Algo_i: - public POA_SMESH::SMESH_3D_Algo, - public SMESH_Algo_i + public virtual POA_SMESH::SMESH_3D_Algo, + public virtual SMESH_Algo_i { -public: - SMESH_3D_Algo_i(); - - virtual ~SMESH_3D_Algo_i(); - protected: - virtual void SetImpl(::SMESH_3D_Algo* impl); + // Constructor : placed in protected section to prohibit creation of generic class instance + SMESH_3D_Algo_i( PortableServer::POA_ptr thePOA ); - ::SMESH_3D_Algo* _impl; +public: + // Destructor + virtual ~SMESH_3D_Algo_i(); }; #endif diff --git a/src/SMESH_I/SMESH_Algo_i.cxx b/src/SMESH_I/SMESH_Algo_i.cxx index d5f747bb2..17995f4b7 100644 --- a/src/SMESH_I/SMESH_Algo_i.cxx +++ b/src/SMESH_I/SMESH_Algo_i.cxx @@ -26,13 +26,10 @@ // Module : SMESH // $Header$ -using namespace std; using namespace std; #include "SMESH_Algo_i.hxx" -#include "SMESH_Gen.hxx" -#include "SMESH_HypothesisFactory.hxx" +#include "SMESH_Algo.hxx" -#include "Utils_CorbaException.hxx" #include "utilities.h" #include @@ -40,56 +37,49 @@ using namespace std; //============================================================================= /*! - * + * SMESH_Algo_i::SMESH_Algo_i + * + * Constructor */ //============================================================================= -SMESH_Algo_i::SMESH_Algo_i() +SMESH_Algo_i::SMESH_Algo_i( PortableServer::POA_ptr thePOA ) + : SALOME::GenericObj_i( thePOA ), + SMESH_Hypothesis_i( thePOA ) { - MESSAGE("SMESH_Algo_i::SMESH_Algo_i"); + MESSAGE( "SMESH_Algo_i::SMESH_Algo_i" ); } //============================================================================= /*! - * + * SMESH_Algo_i::~SMESH_Algo_i + * + * Destructor */ //============================================================================= SMESH_Algo_i::~SMESH_Algo_i() { - MESSAGE("SMESH_Algo_i::~SMESH_Algo_i"); + MESSAGE( "SMESH_Algo_i::~SMESH_Algo_i" ); } //============================================================================= /*! - * + * SMESH_Algo_i::GetCompatibleHypothesis + * + * Gets list of compatible hypotheses */ //============================================================================= SMESH::ListOfHypothesisName* SMESH_Algo_i::GetCompatibleHypothesis() { - MESSAGE("SMESH_Algo_i::GetCompatibleHypothesis"); - SMESH::ListOfHypothesisName_var listOfHypothesis - = new SMESH::ListOfHypothesisName; - const vector & hypList = _impl->GetCompatibleHypothesis(); + MESSAGE( "SMESH_Algo_i::GetCompatibleHypothesis" ); + SMESH::ListOfHypothesisName_var listOfHypothesis = new SMESH::ListOfHypothesisName; + const vector& hypList = ( ( ::SMESH_Algo* )myBaseImpl )->GetCompatibleHypothesis(); int nbHyp = hypList.size(); - listOfHypothesis->length(nbHyp); - for (int i=0; ilength( nbHyp ); + for ( int i = 0; i < nbHyp; i++ ) { + listOfHypothesis[ i ] = strdup( hypList[ i ].c_str() ); + } return listOfHypothesis._retn(); } - -//============================================================================= -/*! - * - */ -//============================================================================= - -void SMESH_Algo_i::SetImpl(::SMESH_Algo* impl) -{ - MESSAGE("SMESH_Algo_i::SetImpl"); - //SMESH_Algo_i::SetImpl(impl); - _impl = impl; -} diff --git a/src/SMESH_I/SMESH_Algo_i.hxx b/src/SMESH_I/SMESH_Algo_i.hxx index c5427f753..21630ec8a 100644 --- a/src/SMESH_I/SMESH_Algo_i.hxx +++ b/src/SMESH_I/SMESH_Algo_i.hxx @@ -34,23 +34,23 @@ #include "SMESH_Hypothesis_i.hxx" -#include "SMESH_Algo.hxx" - +// ====================================================== +// Generic algorithm +// ====================================================== class SMESH_Algo_i: - public POA_SMESH::SMESH_Algo, - public SMESH_Hypothesis_i + public virtual POA_SMESH::SMESH_Algo, + public virtual SMESH_Hypothesis_i { public: - SMESH_Algo_i(); + // Constructor : placed in protected section to prohibit creation of generic class instance + SMESH_Algo_i( PortableServer::POA_ptr thePOA ); +public: + // Destructor virtual ~SMESH_Algo_i(); - + + // Gets list of compatible hypotheses SMESH::ListOfHypothesisName* GetCompatibleHypothesis(); - -protected: - virtual void SetImpl(::SMESH_Algo* impl); - - ::SMESH_Algo* _impl; }; #endif diff --git a/src/SMESH_I/SMESH_Gen_i.cxx b/src/SMESH_I/SMESH_Gen_i.cxx index b55ed358b..44cbd411e 100644 --- a/src/SMESH_I/SMESH_Gen_i.cxx +++ b/src/SMESH_I/SMESH_Gen_i.cxx @@ -41,21 +41,34 @@ using namespace std; #include #include #include +#include #include #include #include +#include "Utils_CorbaException.hxx" + +#include "utilities.h" #include #include +#include + +#include #include "SMESH_Gen_i.hxx" #include "SMESH_Mesh_i.hxx" -#include "SMESH_LocalLength_i.hxx" -#include "SMESH_NumberOfSegments_i.hxx" -#include "SMESH_MaxElementArea_i.hxx" -#include "SMESH_MaxElementVolume_i.hxx" +#include "SMESH_Hypothesis_i.hxx" +#include "SMESH_Algo_i.hxx" +#include "SMESH_Group_i.hxx" #include "SMESHDS_Document.hxx" +#include "SMESHDS_Group.hxx" +#include "SMESH_topo.hxx" +#include "SMESH_Group.hxx" + +#include CORBA_SERVER_HEADER(SMESH_Group) +#include CORBA_SERVER_HEADER(SMESH_Filter) +#include "SMESH_Filter_i.hxx" #include "Document_Reader.h" #include "DriverMED_W_SMESHDS_Mesh.h" @@ -64,246 +77,700 @@ using namespace std; #include "DriverUNV_R_SMESHDS_Document.h" #include "DriverDAT_R_SMESHDS_Document.h" -#include "Utils_CorbaException.hxx" -#include "utilities.h" - #include "SALOMEDS_Tool.hxx" #include "SALOME_NamingService.hxx" #include "SALOME_LifeCycleCORBA.hxx" #include "Utils_SINGLETON.hxx" #include "OpUtil.hxx" -//#include +#include CORBA_CLIENT_HEADER(SALOME_ModuleCatalog) #include "GEOM_Client.hxx" +#include "Utils_ExceptHandlers.hxx" #include -#define NUM_TMP_FILES 4 +#define NUM_TMP_FILES 2 + +// Tags definition =========================================================== +// Top level +long Tag_HypothesisRoot = 1; // hypotheses root +long Tag_AlgorithmsRoot = 2; // algorithms root +// Mesh/Submesh +long Tag_RefOnShape = 1; // references to shape +long Tag_RefOnAppliedHypothesis = 2; // applied hypotheses root +long Tag_RefOnAppliedAlgorithms = 3; // applied algorithms root +// Mesh only +long Tag_SubMeshOnVertex = 4; // sub-meshes roots by type +long Tag_SubMeshOnEdge = 5; // ... +long Tag_SubMeshOnFace = 6; // ... +long Tag_SubMeshOnSolid = 7; // ... +long Tag_SubMeshOnCompound = 8; // ... +long Tag_NodeGroups = 9; // Group roots by type +long Tag_EdgeGroups = 10; // ... +long Tag_FaceGroups = 11; // ... +long Tag_VolumeGroups = 12; // ... +// =========================================================================== + +// Static variables definition +CORBA::ORB_var SMESH_Gen_i::myOrb; +PortableServer::POA_var SMESH_Gen_i::myPoa; +SALOME_NamingService* SMESH_Gen_i::myNS = NULL; +SALOME_LifeCycleCORBA* SMESH_Gen_i::myLCC = NULL; + +//============================================================================= +/*! + * FindMaxChildTag [ static internal ] + * + * Finds maximum child tag for the given object + */ +//============================================================================= + +static long FindMaxChildTag( SALOMEDS::SObject_ptr theSObject ) +{ + long aTag = 0; + if ( !theSObject->_is_nil() ) { + SALOMEDS::Study_var aStudy = theSObject->GetStudy(); + if ( !aStudy->_is_nil() ) { + SALOMEDS::ChildIterator_var anIter = aStudy->NewChildIterator( theSObject ); + for ( ; anIter->More(); anIter->Next() ) { + long nTag = anIter->Value()->Tag(); + if ( nTag > aTag ) + aTag = nTag; + } + } + } + return aTag; +} + +//============================================================================= +/*! + * Get...Tag [ static ] + * + * Methods which determine SMESH data model structure + */ +//============================================================================= + +long SMESH_Gen_i::GetHypothesisRootTag() +{ + return Tag_HypothesisRoot; +} + +long SMESH_Gen_i::GetAlgorithmsRootTag() +{ + return Tag_AlgorithmsRoot; +} + +long SMESH_Gen_i::GetRefOnShapeTag() +{ + return Tag_RefOnShape; +} + +long SMESH_Gen_i::GetRefOnAppliedHypothesisTag() +{ + return Tag_RefOnAppliedHypothesis; +} + +long SMESH_Gen_i::GetRefOnAppliedAlgorithmsTag() +{ + return Tag_RefOnAppliedAlgorithms; +} + +long SMESH_Gen_i::GetSubMeshOnVertexTag() +{ + return Tag_SubMeshOnVertex; +} + +long SMESH_Gen_i::GetSubMeshOnEdgeTag() +{ + return Tag_SubMeshOnEdge; +} + +long SMESH_Gen_i::GetSubMeshOnFaceTag() +{ + return Tag_SubMeshOnFace; +} + +long SMESH_Gen_i::GetSubMeshOnSolidTag() +{ + return Tag_SubMeshOnSolid; +} + +long SMESH_Gen_i::GetSubMeshOnCompoundTag() +{ + return Tag_SubMeshOnCompound; +} -// Tags definition -long Tag_HypothesisRoot = 1; -long Tag_AlgorithmsRoot = 2; +long SMESH_Gen_i::GetNodeGroupsTag() +{ + return Tag_NodeGroups; +} -long Tag_RefOnShape = 1; -long Tag_RefOnAppliedHypothesis = 2; -long Tag_RefOnAppliedAlgorithms = 3; +long SMESH_Gen_i::GetEdgeGroupsTag() +{ + return Tag_EdgeGroups; +} -long Tag_SubMeshOnVertex = 4; -long Tag_SubMeshOnEdge = 5; -long Tag_SubMeshOnFace = 6; -long Tag_SubMeshOnSolid = 7; -long Tag_SubMeshOnCompound = 8; +long SMESH_Gen_i::GetFaceGroupsTag() +{ + return Tag_FaceGroups; +} +long SMESH_Gen_i::GetVolumeGroupsTag() +{ + return Tag_VolumeGroups; +} //============================================================================= /*! - * default constructor: not for use + * GetServant [ static ] + * + * Get servant of the CORBA object */ //============================================================================= -SMESH_Gen_i::SMESH_Gen_i() +PortableServer::ServantBase_var SMESH_Gen_i::GetServant( CORBA::Object_ptr theObject ) +{ + if( CORBA::is_nil( theObject ) || CORBA::is_nil( GetPOA() ) ) + return NULL; + try { + PortableServer::Servant aServant = GetPOA()->reference_to_servant( theObject ); + return aServant; + } + catch (...) { + MESSAGE( "GetServant - Unknown exception was caught!!!" ); + return NULL; + } +} + +//============================================================================= +/*! + * SObjectToObject [ static ] + * + * Get CORBA object corresponding to the SALOMEDS::SObject + */ +//============================================================================= + +CORBA::Object_var SMESH_Gen_i::SObjectToObject( SALOMEDS::SObject_ptr theSObject ) { - MESSAGE("SMESH_Gen_i default constructor"); - // **** + SALOMEDS::GenericAttribute_var anAttr; + CORBA::Object_var anObj; + 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 ); + } + } + catch( ... ) { + MESSAGE( "SObjectToObject - Unknown exception was caught!!!" ); + } + } + return anObj; } //============================================================================= /*! - * Standard constructor, used with Container. + * GetNS [ static ] + * + * Get SALOME_NamingService object */ //============================================================================= -SMESH_Gen_i::SMESH_Gen_i(CORBA::ORB_ptr orb, - PortableServer::POA_ptr poa, - PortableServer::ObjectId * contId, - const char *instanceName, - const char *interfaceName) : - Engines_Component_i(orb, poa, contId, instanceName, interfaceName) +SALOME_NamingService* SMESH_Gen_i::GetNS() { - MESSAGE("activate object"); - _thisObj = this ; - _id = _poa->activate_object(_thisObj); + if ( myNS == NULL ) { + myNS = SINGLETON_::Instance(); + ASSERT(SINGLETON_::IsAlreadyExisting()); + myNS->init_orb( GetORB() ); + } + return myNS; +} + +//============================================================================= +/*! + * GetLCC [ static ] + * + * Get SALOME_LifeCycleCORBA object + */ +//============================================================================= +SALOME_LifeCycleCORBA* SMESH_Gen_i::GetLCC() { + if ( myLCC == NULL ) { + myLCC = new SALOME_LifeCycleCORBA( GetNS() ); + } + return myLCC; +} + + +//============================================================================= +/*! + * GetGeomEngine [ static ] + * + * Get GEOM::GEOM_Gen reference + */ +//============================================================================= +GEOM::GEOM_Gen_ptr SMESH_Gen_i::GetGeomEngine() { + GEOM::GEOM_Gen_var aGeomEngine = + GEOM::GEOM_Gen::_narrow( GetLCC()->FindOrLoad_Component("FactoryServer","GEOM") ); + return aGeomEngine._retn(); +} + +//============================================================================= +/*! + * SMESH_Gen_i::SMESH_Gen_i + * + * Default constructor: not for use + */ +//============================================================================= + +SMESH_Gen_i::SMESH_Gen_i() +{ + MESSAGE( "SMESH_Gen_i::SMESH_Gen_i : default constructor" ); +} + +//============================================================================= +/*! + * SMESH_Gen_i::SMESH_Gen_i + * + * Standard constructor, used with Container + */ +//============================================================================= - _ShapeReader = NULL; - _localId = 0; // number of created objects & local id +SMESH_Gen_i::SMESH_Gen_i( CORBA::ORB_ptr orb, + PortableServer::POA_ptr poa, + PortableServer::ObjectId* contId, + const char* instanceName, + const char* interfaceName ) + : Engines_Component_i( orb, poa, contId, instanceName, interfaceName ) +{ + MESSAGE( "SMESH_Gen_i::SMESH_Gen_i : standard constructor" ); + myOrb = CORBA::ORB::_duplicate(orb); + myPoa = PortableServer::POA::_duplicate(poa); + + _thisObj = this ; + _id = myPoa->activate_object( _thisObj ); + + myShapeReader = NULL; // shape reader } //============================================================================= /*! - * Standard destructor + * SMESH_Gen_i::~SMESH_Gen_i + * + * Destructor */ //============================================================================= SMESH_Gen_i::~SMESH_Gen_i() { - MESSAGE("~SMESH_Gen_i"); - // **** + MESSAGE( "SMESH_Gen_i::~SMESH_Gen_i" ); + + // delete hypothesis creators + map::iterator itHyp; + for (itHyp = myHypCreatorMap.begin(); itHyp != myHypCreatorMap.end(); itHyp++) + { + delete (*itHyp).second; + } + myHypCreatorMap.clear(); + + // Clear study contexts data + map::iterator it; + for ( it = myStudyContextMap.begin(); it != myStudyContextMap.end(); ++it ) { + delete it->second; + } + myStudyContextMap.clear(); + // delete shape reader + if ( !myShapeReader ) + delete myShapeReader; } //============================================================================= /*! - * + * SMESH_Gen_i::CreateFilterManager + * + * Create filter manager */ //============================================================================= -SMESH::SMESH_Hypothesis_ptr SMESH_Gen_i::CreateHypothesis(const char* anHyp, - CORBA::Long studyId) - throw (SALOME::SALOME_Exception) +SMESH::FilterManager_ptr SMESH_Gen_i::CreateFilterManager() { - MESSAGE("CreateHypothesis"); + SMESH::FilterManager_i* aFilter = new SMESH::FilterManager_i(); + SMESH::FilterManager_var anObj = aFilter->_this(); + return anObj._retn(); +} - // create a new hypothesis object servant +//============================================================================= +/*! + * SMESH_Gen_i::createHypothesis + * + * Create hypothesis of given type + */ +//============================================================================= +SMESH::SMESH_Hypothesis_ptr SMESH_Gen_i::createHypothesis(const char* theHypName, + const char* theLibName) + throw (SALOME::SALOME_Exception) +{ + Unexpect aCatch(SALOME_SalomeException); + MESSAGE( "Create Hypothesis <" << theHypName << "> from " << theLibName); + // get study context + StudyContext* myStudyContext = GetCurrentStudyContext(); + + // create a new hypothesis object servant SMESH_Hypothesis_i* myHypothesis_i = 0; + SMESH::SMESH_Hypothesis_var hypothesis_i; + try + { + // check, if creator for this hypothesis type already exists + if (myHypCreatorMap.find(string(theHypName)) == myHypCreatorMap.end()) { - myHypothesis_i = _hypothesisFactory_i.Create(anHyp, - studyId, - &_impl); + // load plugin library + MESSAGE("Loading server meshers plugin library ..."); + void* libHandle = dlopen (theLibName, RTLD_LAZY); + if (!libHandle) + { + // report any error, if occured + const char* anError = dlerror(); + throw(SALOME_Exception(anError)); + } + + // get method, returning hypothesis creator + MESSAGE("Find GetHypothesisCreator() method ..."); + typedef GenericHypothesisCreator_i* (*GetHypothesisCreator)(const char* theHypName); + GetHypothesisCreator procHandle = + (GetHypothesisCreator)dlsym( libHandle, "GetHypothesisCreator" ); + if (!procHandle) + { + throw(SALOME_Exception(LOCALIZED("bad hypothesis plugin library"))); + dlclose(libHandle); + } + + // get hypothesis creator + MESSAGE("Get Hypothesis Creator for " << theHypName); + GenericHypothesisCreator_i* aCreator = procHandle(theHypName); + if (!aCreator) + { + throw(SALOME_Exception(LOCALIZED("no such a hypothesis in this plugin"))); + } + + // map hypothesis creator to a hypothesis name + myHypCreatorMap[string(theHypName)] = aCreator; } + + // create a new hypothesis object, store its ref. in studyContext + MESSAGE("Create Hypothesis " << theHypName); + myHypothesis_i = + myHypCreatorMap[string(theHypName)]->Create + (myPoa, myCurrentStudy->StudyId(), &myGen); + myHypothesis_i->SetLibName(theLibName); // for persistency assurance + } catch (SALOME_Exception& S_ex) - { - THROW_SALOME_CORBA_EXCEPTION(S_ex.what(), SALOME::BAD_PARAM); - } + { + THROW_SALOME_CORBA_EXCEPTION(S_ex.what(), SALOME::BAD_PARAM); + } + + if (!myHypothesis_i) + return hypothesis_i._retn(); // activate the CORBA servant of hypothesis + hypothesis_i = SMESH::SMESH_Hypothesis::_narrow( myHypothesis_i->_this() ); + string iorString = GetORB()->object_to_string( hypothesis_i ); + int nextId = myStudyContext->addObject( iorString ); + MESSAGE( "Add hypo to map with id = "<< nextId << " and IOR = " << iorString.c_str() ); - SMESH::SMESH_Hypothesis_var hypothesis_i - = SMESH::SMESH_Hypothesis::_narrow(myHypothesis_i->_this()); - return SMESH::SMESH_Hypothesis::_duplicate(hypothesis_i); + return hypothesis_i._retn(); } //============================================================================= /*! - * + * SMESH_Gen_i::createMesh + * + * Create empty mesh on shape */ //============================================================================= - -SMESH::SMESH_Mesh_ptr SMESH_Gen_i::Init(GEOM::GEOM_Gen_ptr geomEngine, - CORBA::Long studyId, - GEOM::GEOM_Shape_ptr aShape) - throw (SALOME::SALOME_Exception) +SMESH::SMESH_Mesh_ptr SMESH_Gen_i::createMesh() + throw ( SALOME::SALOME_Exception ) { - MESSAGE("Init"); - // _narrow() duplicates the reference and checks the type - GEOM::GEOM_Gen_var geom = GEOM::GEOM_Gen::_narrow(geomEngine); - GEOM::GEOM_Shape_var myShape = GEOM::GEOM_Shape::_narrow(aShape); - - if (CORBA::is_nil(geom)) - THROW_SALOME_CORBA_EXCEPTION("bad geom reference", \ - SALOME::BAD_PARAM); - if (CORBA::is_nil(myShape)) - THROW_SALOME_CORBA_EXCEPTION("bad shape reference", \ - SALOME::BAD_PARAM); + Unexpect aCatch(SALOME_SalomeException); + MESSAGE( "SMESH_Gen_i::createMesh" ); + + // get current study + StudyContext* myStudyContext = GetCurrentStudyContext(); // Get or create the GEOM_Client instance + try { + // create a new mesh object servant, store it in a map in study context + SMESH_Mesh_i* meshServant = new SMESH_Mesh_i( GetPOA(), + this, + myCurrentStudy->StudyId() ); + // create a new mesh object + meshServant->SetImpl( myGen.CreateMesh( myCurrentStudy->StudyId() ) ); + + // activate the CORBA servant of Mesh + SMESH::SMESH_Mesh_var mesh = meshServant->_this(); + string iorString = GetORB()->object_to_string( mesh ); + int nextId = myStudyContext->addObject( iorString ); + MESSAGE( "Add mesh to map with id = "<< nextId << " and IOR = " << iorString.c_str() ); + return mesh._retn(); + } + catch (SALOME_Exception& S_ex) { + THROW_SALOME_CORBA_EXCEPTION( S_ex.what(), SALOME::BAD_PARAM ); + } + return SMESH::SMESH_Mesh::_nil(); +} - SMESH_Mesh_i* meshServant = 0; - try - { - if (! _ShapeReader) _ShapeReader = new GEOM_Client(); - ASSERT(_ShapeReader); - - // explore main Shape, get local TopoDS_Shapes of all subShapes - // SMESH_topo* myTopo = ExploreMainShape(geom, studyId, myShape); - - // Get studyContext_i, create it if it does'nt exist - - if (_mapStudyContext_i.find(studyId) == _mapStudyContext_i.end()) - { - _mapStudyContext_i[studyId] = new StudyContext_iStruct; - } - StudyContext_iStruct* myStudyContext = _mapStudyContext_i[studyId]; - - // create a new mesh object servant, store it in a map in study context - - meshServant = new SMESH_Mesh_i(this, - geom, - studyId, - _localId); - myStudyContext->mapMesh_i[_localId] = meshServant; - _localId++; - - // create a new mesh object - - TopoDS_Shape myLocShape = _ShapeReader->GetShape(geom,myShape); - meshServant->SetImpl(_impl.Init(studyId, myLocShape)); - } - catch (SALOME_Exception& S_ex) - { - THROW_SALOME_CORBA_EXCEPTION(S_ex.what(), SALOME::BAD_PARAM); - } +//============================================================================= +/*! + * SMESH_Gen_i::GetShapeReader + * + * Get shape reader + */ +//============================================================================= +GEOM_Client* SMESH_Gen_i::GetShapeReader() +{ + // create shape reader if necessary + if ( !myShapeReader ) + myShapeReader = new GEOM_Client(GetContainerRef()); + ASSERT( myShapeReader ); + return myShapeReader; +} - // activate the CORBA servant of Mesh - - SMESH::SMESH_Mesh_var mesh - = SMESH::SMESH_Mesh::_narrow(meshServant->_this()); +//============================================================================= +/*! + * SMESH_Gen_i::SetCurrentStudy + * + * Set current study + */ +//============================================================================= + +void SMESH_Gen_i::SetCurrentStudy( SALOMEDS::Study_ptr theStudy ) +{ + MESSAGE( "SMESH_Gen_i::SetCurrentStudy" ); + myCurrentStudy = SALOMEDS::Study::_duplicate( theStudy ); + // create study context, if it doesn't exist and set current study + int studyId = myCurrentStudy->StudyId(); + MESSAGE( "SMESH_Gen_i::SetCurrentStudy: study Id = " << studyId ); + if ( myStudyContextMap.find( studyId ) == myStudyContextMap.end() ) { + myStudyContextMap[ studyId ] = new StudyContext; + } + // set current study for geom engine + if ( !CORBA::is_nil( GetGeomEngine() ) ) + GetGeomEngine()->GetCurrentStudy( myCurrentStudy->StudyId() ); +} + +//============================================================================= +/*! + * SMESH_Gen_i::GetCurrentStudy + * + * Get current study + */ +//============================================================================= + +SALOMEDS::Study_ptr SMESH_Gen_i::GetCurrentStudy() +{ + MESSAGE( "SMESH_Gen_i::GetCurrentStudy: study Id = " << myCurrentStudy->StudyId() ); + return SALOMEDS::Study::_duplicate( myCurrentStudy ); +} + +//============================================================================= +/*! + * SMESH_Gen_i::GetCurrentStudyContext + * + * Get current study context + */ +//============================================================================= +StudyContext* SMESH_Gen_i::GetCurrentStudyContext() +{ + ASSERT( !CORBA::is_nil( myCurrentStudy ) ) + ASSERT( myStudyContextMap.find( myCurrentStudy->StudyId() ) != myStudyContextMap.end() ); + return myStudyContextMap[ myCurrentStudy->StudyId() ]; +} + +//============================================================================= +/*! + * SMESH_Gen_i::CreateHypothesis + * + * Create hypothesis/algorothm of given type and publish it in the study + */ +//============================================================================= + +SMESH::SMESH_Hypothesis_ptr SMESH_Gen_i::CreateHypothesis( const char* theHypName, + const char* theLibName ) + throw ( SALOME::SALOME_Exception ) +{ + Unexpect aCatch(SALOME_SalomeException); + ASSERT( !CORBA::is_nil( myCurrentStudy ) ); + // Create hypothesis/algorithm + SMESH::SMESH_Hypothesis_var hyp = this->createHypothesis( theHypName, theLibName ); + + // Publish hypothesis/algorithm in the study + if ( this->CanPublishInStudy( hyp ) ) { + this->PublishInStudy( myCurrentStudy, SALOMEDS::SObject::_nil(), hyp, "" ); + } + return hyp._retn(); +} - meshServant->SetIor(mesh); +//============================================================================= +/*! + * SMESH_Gen_i::CreateMesh + * + * Create empty mesh on a shape and publish it in the study + */ +//============================================================================= - return SMESH::SMESH_Mesh::_duplicate(mesh); +SMESH::SMESH_Mesh_ptr SMESH_Gen_i::CreateMesh( GEOM::GEOM_Shape_ptr theShape ) + throw ( SALOME::SALOME_Exception ) +{ + Unexpect aCatch(SALOME_SalomeException); + MESSAGE( "SMESH_Gen_i::CreateMesh" ); + ASSERT( !CORBA::is_nil( myCurrentStudy ) ); + // create mesh + SMESH::SMESH_Mesh_var mesh = this->createMesh(); + // publish mesh in the study + if ( this->CanPublishInStudy( mesh ) ) { + this->PublishInStudy( myCurrentStudy, SALOMEDS::SObject::_nil(), mesh.in(), "" ); + } + // set shape + SMESH_Mesh_i* meshServant = dynamic_cast( GetServant( mesh ).in() ); + ASSERT( meshServant ); + meshServant->SetShape( theShape ); + return mesh._retn(); } +//============================================================================= +/*! + * SMESH_Gen_i::CreateMeshFromMED + * + * Create mesh and import data from MED file + */ +//============================================================================= + +SMESH::mesh_array* SMESH_Gen_i::CreateMeshesFromMED( const char* theFileName, + SMESH::DriverMED_ReadStatus& theStatus) + throw ( SALOME::SALOME_Exception ) +{ + Unexpect aCatch(SALOME_SalomeException); + MESSAGE( "SMESH_Gen_i::CreateMeshFromMED" ); + ASSERT( !CORBA::is_nil( myCurrentStudy ) ); + + // Retrieve mesh names from the file + DriverMED_R_SMESHDS_Mesh myReader; + myReader.SetFile( theFileName ); + myReader.SetMeshId( -1 ); + list aNames = myReader.GetMeshNames(); + + SMESH::mesh_array_var aResult = new SMESH::mesh_array(); + aResult->length( aNames.size() ); + int i = 0; + + // Iterate through all meshes and create mesh objects + theStatus = SMESH::DRS_OK; + for ( list::iterator it = aNames.begin(); it != aNames.end(); it++ ) { + // create mesh + SMESH::SMESH_Mesh_var mesh = createMesh(); + + // publish mesh in the study + if ( CanPublishInStudy( mesh ) ) { + PublishInStudy( myCurrentStudy, SALOMEDS::SObject::_nil(), mesh.in(), (*it).c_str() ); + } + + // Read mesh data (groups are published automatically by ImportMEDFile()) + SMESH_Mesh_i* meshServant = dynamic_cast( GetServant( mesh ).in() ); + ASSERT( meshServant ); + SMESH::DriverMED_ReadStatus status1 = + meshServant->ImportMEDFile( theFileName, (*it).c_str() ); + if (status1 > theStatus) + theStatus = status1; + + aResult[i++] = SMESH::SMESH_Mesh::_duplicate( mesh ); + } + + return aResult._retn(); +} //============================================================================= /*! - * + * SMESH_Gen_i::IsReadyToCompute + * + * Returns true if mesh contains enough data to be computed */ //============================================================================= -CORBA::Boolean SMESH_Gen_i::IsReadyToCompute(SMESH::SMESH_Mesh_ptr aMesh, - GEOM::GEOM_Shape_ptr aShape) - throw (SALOME::SALOME_Exception) +CORBA::Boolean SMESH_Gen_i::IsReadyToCompute( SMESH::SMESH_Mesh_ptr theMesh, + GEOM::GEOM_Shape_ptr theShape ) + throw ( SALOME::SALOME_Exception ) { - MESSAGE("SMESH_Gen_i::IsReadyToCompute"); - return true; + Unexpect aCatch(SALOME_SalomeException); + MESSAGE( "SMESH_Gen_i::IsReadyToCompute" ); + + if ( CORBA::is_nil( theShape ) ) + THROW_SALOME_CORBA_EXCEPTION( "bad shape reference", + SALOME::BAD_PARAM ); + + if ( CORBA::is_nil( theMesh ) ) + THROW_SALOME_CORBA_EXCEPTION( "bad Mesh reference", + SALOME::BAD_PARAM ); + + try { + // get mesh servant + SMESH_Mesh_i* meshServant = dynamic_cast( GetServant( theMesh ).in() ); + ASSERT( meshServant ); + if ( meshServant ) { + // get local TopoDS_Shape + TopoDS_Shape myLocShape = GetShapeReader()->GetShape( GetGeomEngine(), theShape ); + // call implementation + ::SMESH_Mesh& myLocMesh = meshServant->GetImpl(); + return myGen.CheckAlgoState( myLocMesh, myLocShape ); + } + } + catch ( SALOME_Exception& S_ex ) { + MESSAGE( "catch exception "<< S_ex.what() ); + } + return false; } //============================================================================= /*! - * + * SMESH_Gen_i::GetSubShapesId + * + * Get sub-shapes unique ID's list */ //============================================================================= - SMESH::long_array* - SMESH_Gen_i::GetSubShapesId(GEOM::GEOM_Gen_ptr geomEngine, - CORBA::Long studyId, - GEOM::GEOM_Shape_ptr mainShape, - const SMESH::shape_array& listOfSubShape) - throw (SALOME::SALOME_Exception) +SMESH::long_array* SMESH_Gen_i::GetSubShapesId( GEOM::GEOM_Shape_ptr theMainShape, + const SMESH::shape_array& theListOfSubShape ) + throw ( SALOME::SALOME_Exception ) { - MESSAGE("SMESH_Gen_i::GetSubShapesId"); + Unexpect aCatch(SALOME_SalomeException); + MESSAGE( "SMESH_Gen_i::GetSubShapesId" ); + SMESH::long_array_var shapesId = new SMESH::long_array; set setId; - GEOM::GEOM_Gen_var geom = GEOM::GEOM_Gen::_narrow(geomEngine); - GEOM::GEOM_Shape_var myShape = GEOM::GEOM_Shape::_narrow(mainShape); - - if (CORBA::is_nil(geom)) - THROW_SALOME_CORBA_EXCEPTION("bad geom reference", \ - SALOME::BAD_PARAM); - if (CORBA::is_nil(myShape)) - THROW_SALOME_CORBA_EXCEPTION("bad shape reference", \ - SALOME::BAD_PARAM); + if ( CORBA::is_nil( theMainShape ) ) + THROW_SALOME_CORBA_EXCEPTION( "bad shape reference", + SALOME::BAD_PARAM ); try { - if (! _ShapeReader) _ShapeReader = new GEOM_Client(); - ASSERT(_ShapeReader); - TopoDS_Shape myMainShape = _ShapeReader->GetShape(geom,myShape); + if (! myShapeReader) myShapeReader = new GEOM_Client(GetContainerRef()); + ASSERT(myShapeReader); + TopoDS_Shape myMainShape = GetShapeReader()->GetShape(GetGeomEngine(),theMainShape); TopTools_IndexedMapOfShape myIndexToShape; TopExp::MapShapes(myMainShape,myIndexToShape); - for (int i=0; iGetShape(geom,aShape); + TopoDS_Shape locShape = GetShapeReader()->GetShape(GetGeomEngine(),aShape); for (TopExp_Explorer exp(locShape,TopAbs_FACE); exp.More(); exp.Next()) { const TopoDS_Face& F = TopoDS::Face(exp.Current()); @@ -344,1413 +811,1693 @@ CORBA::Boolean SMESH_Gen_i::IsReadyToCompute(SMESH::SMESH_Mesh_ptr aMesh, //============================================================================= /*! - * + * SMESH_Gen_i::Compute + * + * Compute mesh on a shape */ //============================================================================= -CORBA::Boolean SMESH_Gen_i::Compute(SMESH::SMESH_Mesh_ptr aMesh, - GEOM::GEOM_Shape_ptr aShape) - throw (SALOME::SALOME_Exception) +CORBA::Boolean SMESH_Gen_i::Compute( SMESH::SMESH_Mesh_ptr theMesh, + GEOM::GEOM_Shape_ptr theShape ) + throw ( SALOME::SALOME_Exception ) { - MESSAGE("SMESH_Gen_i::Compute"); - GEOM::GEOM_Shape_var myShape = GEOM::GEOM_Shape::_narrow(aShape); - if (CORBA::is_nil(myShape)) - THROW_SALOME_CORBA_EXCEPTION("bad shape reference", \ - SALOME::BAD_PARAM); - - SMESH::SMESH_Mesh_var myMesh = SMESH::SMESH_Mesh::_narrow(aMesh); - if (CORBA::is_nil(myMesh)) - THROW_SALOME_CORBA_EXCEPTION("bad Mesh reference", \ - SALOME::BAD_PARAM); - - bool ret = false; - try - { - - // get study context from studyId given by CORBA mesh object - - int studyId = myMesh->GetStudyId(); - ASSERT(_mapStudyContext_i.find(studyId) != _mapStudyContext_i.end()); - StudyContext_iStruct* myStudyContext = _mapStudyContext_i[studyId]; - - // get local Mesh_i object with Id and study context - - int meshId = myMesh->GetId(); - ASSERT(myStudyContext->mapMesh_i.find(meshId) != myStudyContext->mapMesh_i.end()); - SMESH_Mesh_i* meshServant = myStudyContext->mapMesh_i[meshId]; - ASSERT(meshServant); - - // get local TopoDS_Shape - - GEOM::GEOM_Gen_var geom = meshServant->GetGeomEngine(); - TopoDS_Shape myLocShape = _ShapeReader->GetShape(geom,myShape); + Unexpect aCatch(SALOME_SalomeException); + MESSAGE( "SMESH_Gen_i::Compute" ); - // implementation compute - - ::SMESH_Mesh& myLocMesh = meshServant->GetImpl(); - ret = _impl.Compute(myLocMesh, myLocShape); - } - catch (SALOME_Exception& S_ex) - { - MESSAGE("catch exception "<< S_ex.what()); - return false; -// THROW_SALOME_CORBA_EXCEPTION(S_ex.what(), SALOME::BAD_PARAM); - } - - return ret; -} + if ( CORBA::is_nil( theShape ) ) + THROW_SALOME_CORBA_EXCEPTION( "bad shape reference", + SALOME::BAD_PARAM ); + if ( CORBA::is_nil( theMesh ) ) + THROW_SALOME_CORBA_EXCEPTION( "bad Mesh reference", + SALOME::BAD_PARAM ); + + try { + // get mesh servant + SMESH_Mesh_i* meshServant = dynamic_cast( GetServant( theMesh ).in() ); + ASSERT( meshServant ); + if ( meshServant ) { + // get local TopoDS_Shape + TopoDS_Shape myLocShape = GetShapeReader()->GetShape( GetGeomEngine(), theShape ); + // call implementarion compute + ::SMESH_Mesh& myLocMesh = meshServant->GetImpl(); + return myGen.Compute( myLocMesh, myLocShape); + } + } + catch ( SALOME_Exception& S_ex ) { + MESSAGE( "Compute(): catch exception "<< S_ex.what() ); + } + catch ( ... ) { + MESSAGE( "Compute(): unknown exception " ); + } + return false; +} //============================================================================= /*! - * + * SMESH_Gen_i::Save + * + * Save SMESH module's data */ //============================================================================= - -SALOMEDS::TMPFile* SMESH_Gen_i::Save(SALOMEDS::SComponent_ptr theComponent, - const char* theURL, - bool isMultiFile) +SALOMEDS::TMPFile* SMESH_Gen_i::Save( SALOMEDS::SComponent_ptr theComponent, + const char* theURL, + bool isMultiFile ) { - MESSAGE("SMESH_Gen_i::SAVE"); - SALOMEDS::Study_var Study = theComponent->GetStudy(); - int studyId; + INFOS( "SMESH_Gen_i::Save" ); + + ASSERT( theComponent->GetStudy()->StudyId() == myCurrentStudy->StudyId() ) + StudyContext* myStudyContext = GetCurrentStudyContext(); // Declare a byte stream SALOMEDS::TMPFile_var aStreamFile; // Obtain a temporary dir - TCollection_AsciiString tmpDir = (isMultiFile)?TCollection_AsciiString((char*)theURL):SALOMEDS_Tool::GetTmpDir(); + TCollection_AsciiString tmpDir = + ( isMultiFile ) ? TCollection_AsciiString( ( char* )theURL ) : SALOMEDS_Tool::GetTmpDir(); // Create a sequence of files processed SALOMEDS::ListOfFileNames_var aFileSeq = new SALOMEDS::ListOfFileNames; - aFileSeq->length(NUM_TMP_FILES); + aFileSeq->length( NUM_TMP_FILES ); - TCollection_AsciiString aStudyName(""); + TCollection_AsciiString aStudyName( "" ); + if ( isMultiFile ) + aStudyName = ( SALOMEDS_Tool::GetNameFromPath( myCurrentStudy->URL() ) ); // Set names of temporary files - TCollection_AsciiString filename = aStudyName + TCollection_AsciiString("_SMESH.hdf"); - TCollection_AsciiString hypofile = aStudyName + TCollection_AsciiString("_SMESH_Hypo.txt"); - TCollection_AsciiString algofile = aStudyName + TCollection_AsciiString("_SMESH_Algo.txt"); - TCollection_AsciiString meshfile = aStudyName + TCollection_AsciiString("_SMESH_Mesh.med"); - aFileSeq[0] = CORBA::string_dup(filename.ToCString()); - aFileSeq[1] = CORBA::string_dup(hypofile.ToCString()); - aFileSeq[2] = CORBA::string_dup(algofile.ToCString()); - aFileSeq[3] = CORBA::string_dup(meshfile.ToCString()); + TCollection_AsciiString filename = + aStudyName + TCollection_AsciiString( "_SMESH.hdf" ); // for SMESH data itself + TCollection_AsciiString meshfile = + aStudyName + TCollection_AsciiString( "_SMESH_Mesh.med" ); // for mesh data to be stored in MED file + aFileSeq[ 0 ] = CORBA::string_dup( filename.ToCString() ); + aFileSeq[ 1 ] = CORBA::string_dup( meshfile.ToCString() ); filename = tmpDir + filename; - hypofile = tmpDir + hypofile; - algofile = tmpDir + algofile; meshfile = tmpDir + meshfile; - HDFfile * hdf_file; - map hdf_group, hdf_subgroup; - map hdf_dataset; - FILE* destFile; - - SALOMEDS::ChildIterator_var itBig,it,itSM; - SALOMEDS::SObject_var mySObject,myBranch,mySObjectChild; - hdf_size size[1]; - int longueur,cmpt_ds = 0,cmpt_it; - char *name_group,name_dataset[30],name_meshgroup[30]; - bool ok,_found; - int cmpt_sm = 0, myTag; - -//************* HDF file creation - hdf_file = new HDFfile(filename.ToCString()); - hdf_file->CreateOnDisk(); -//**************************** - - itBig = Study->NewChildIterator(theComponent); - for (; itBig->More();itBig->Next()) { - SALOMEDS::SObject_var gotBranch = itBig->Value(); - -//************branch 1 : hypothesis - if (gotBranch->Tag()==Tag_HypothesisRoot) { //hypothesis = tag 1 - - double length,maxElementsArea,maxElementsVolume; - int numberOfSegments; - - destFile = fopen( hypofile.ToCString() ,"w"); - it = Study->NewChildIterator(gotBranch); - for (; it->More();it->Next()) { - mySObject = it->Value(); - SALOMEDS::GenericAttribute_var anAttr; - SALOMEDS::AttributeIOR_var anIOR; - if ( mySObject->FindAttribute(anAttr, "AttributeIOR")) { - anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); - - SMESH::SMESH_Hypothesis_var myHyp = SMESH::SMESH_Hypothesis::_narrow(_orb->string_to_object(anIOR->Value())); - fprintf(destFile,"%s\n",myHyp->GetName()); - - if (strcmp(myHyp->GetName(),"LocalLength")==0) { - SMESH::SMESH_LocalLength_var LL = SMESH::SMESH_LocalLength::_narrow( myHyp ); - length = LL->GetLength(); - fprintf(destFile,"%f\n",length); - } - else if (strcmp(myHyp->GetName(),"NumberOfSegments")==0) { - SMESH::SMESH_NumberOfSegments_var NOS = SMESH::SMESH_NumberOfSegments::_narrow( myHyp ); - numberOfSegments = NOS->GetNumberOfSegments(); - fprintf(destFile,"%d\n",numberOfSegments); - } - else if (strcmp(myHyp->GetName(),"MaxElementArea")==0) { - SMESH::SMESH_MaxElementArea_var MEA = SMESH::SMESH_MaxElementArea::_narrow( myHyp ); - maxElementsArea = MEA->GetMaxElementArea(); - fprintf(destFile,"%f\n",maxElementsArea); - } - else if (strcmp(myHyp->GetName(),"MaxElementVolume")==0) { - SMESH::SMESH_MaxElementVolume_var MEV = SMESH::SMESH_MaxElementVolume::_narrow( myHyp ); - maxElementsVolume = MEV->GetMaxElementVolume(); - fprintf(destFile,"%f\n",maxElementsVolume); - } - } - } - fclose(destFile); - -//writes the file name in the hdf file - longueur = hypofile.Length() +1; - name_group="Hypothesis"; - //SCRUTE(name_group); - - size[0]=longueur; - hdf_group[1] = new HDFgroup(name_group,hdf_file); - hdf_group[1]->CreateOnDisk(); - - hdf_dataset[cmpt_ds]=new HDFdataset(name_group,hdf_group[1],HDF_STRING,size,1); - hdf_dataset[cmpt_ds]->CreateOnDisk(); - hdf_dataset[cmpt_ds]->WriteOnDisk(hypofile.ToCString()); - hdf_dataset[cmpt_ds]->CloseOnDisk(); - cmpt_ds++; - - hdf_group[1]->CloseOnDisk(); - MESSAGE("End of Hypothesis Save"); - - } -//************branch 2 : algorithms - else if (gotBranch->Tag()==Tag_AlgorithmsRoot) {//algos = tag 2 - - destFile = fopen( algofile.ToCString() ,"w"); - it = Study->NewChildIterator(gotBranch); - for (; it->More();it->Next()) { - mySObject = it->Value(); - SALOMEDS::GenericAttribute_var anAttr; - SALOMEDS::AttributeIOR_var anIOR; - if (mySObject->FindAttribute(anAttr, "AttributeIOR")) { - anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); - SMESH::SMESH_Algo_var myAlgo = SMESH::SMESH_Algo::_narrow(_orb->string_to_object(anIOR->Value())); - fprintf(destFile,"%s\n",myAlgo->GetName()); - } - } - - fclose(destFile); + HDFfile* aFile; + HDFdataset* aDataset; + HDFgroup* aTopGroup; + HDFgroup* aGroup; + HDFgroup* aSubGroup; + HDFgroup* aSubSubGroup; + hdf_size aSize[ 1 ]; + + // MED writer to be used by storage process + DriverMED_W_SMESHDS_Mesh myWriter; + myWriter.SetFile( meshfile.ToCString() ); + + // Write data + // ---> create HDF file + aFile = new HDFfile( filename.ToCString() ); + aFile->CreateOnDisk(); -//writes the file name in the hdf file - longueur = algofile.Length() +1; - name_group="Algorithms"; - //SCRUTE(name_group); - - size[0]=longueur; - hdf_group[2] = new HDFgroup(name_group,hdf_file); - hdf_group[2]->CreateOnDisk(); - - hdf_dataset[cmpt_ds]=new HDFdataset(name_group,hdf_group[2],HDF_STRING,size,1); - hdf_dataset[cmpt_ds]->CreateOnDisk(); - hdf_dataset[cmpt_ds]->WriteOnDisk(algofile.ToCString()); - hdf_dataset[cmpt_ds]->CloseOnDisk(); - cmpt_ds++; - - hdf_group[2]->CloseOnDisk(); - MESSAGE("End of Algos Save"); - - } -//************branch 3 : meshes - else if (gotBranch->Tag()>=3) {//meshes = tag > 3 + // --> iterator for top-level objects + SALOMEDS::ChildIterator_var itBig = myCurrentStudy->NewChildIterator( theComponent ); + for ( ; itBig->More(); itBig->Next() ) { + SALOMEDS::SObject_var gotBranch = itBig->Value(); - SALOMEDS::GenericAttribute_var anAttr; - SALOMEDS::AttributeIOR_var anIOR; - if (gotBranch->FindAttribute(anAttr, "AttributeIOR")) { - anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); - - SMESH::SMESH_Mesh_var myMesh = SMESH::SMESH_Mesh::_narrow(_orb->string_to_object(anIOR->Value())) ; - studyId = myMesh->GetStudyId(); - SCRUTE(studyId); - - StudyContext_iStruct* myStudyContext = _mapStudyContext_i[studyId]; - int meshId = myMesh->GetId(); - SMESH_Mesh_i* meshServant = myStudyContext->mapMesh_i[meshId]; - ::SMESH_Mesh& myLocMesh = meshServant->GetImpl(); - SMESHDS_Mesh* mySMESHDSMesh = myLocMesh.GetMeshDS(); - - SCRUTE(mySMESHDSMesh->NbNodes()); - if (mySMESHDSMesh->NbNodes()>0) {//checks if the mesh is not empty - - DriverMED_W_SMESHDS_Mesh* myWriter = new DriverMED_W_SMESHDS_Mesh; - myWriter->SetFile(meshfile.ToCString()); - - myWriter->SetMesh(mySMESHDSMesh); - myWriter->SetMeshId(gotBranch->Tag()); - myWriter->Add(); - } - else meshfile = "No data"; - - //********** opening of the HDF group - sprintf(name_meshgroup,"Mesh %d",gotBranch->Tag()); - SCRUTE(name_meshgroup); - hdf_group[gotBranch->Tag()] = new HDFgroup(name_meshgroup,hdf_file); - hdf_group[gotBranch->Tag()]->CreateOnDisk(); - //********** - - //********** file where the data are stored - longueur = strlen(meshfile.ToCString()) +1; - size[0]=longueur; - strcpy(name_dataset,"Mesh data"); - hdf_dataset[cmpt_ds]=new HDFdataset(name_dataset,hdf_group[gotBranch->Tag()],HDF_STRING,size,1); - hdf_dataset[cmpt_ds]->CreateOnDisk(); - hdf_dataset[cmpt_ds]->WriteOnDisk(meshfile.ToCString()); - hdf_dataset[cmpt_ds]->CloseOnDisk(); - cmpt_ds++; - //********** - - //********** ref on shape - Standard_CString myRefOnObject="" ; - SALOMEDS::SObject_var myRef,myShape; - _found = gotBranch->FindSubObject(Tag_RefOnShape,myRef); - if (_found) { - ok = myRef->ReferencedObject(myShape); - myRefOnObject = myShape->GetID(); - SCRUTE(myRefOnObject); - - longueur = strlen(myRefOnObject) +1; - if (longueur>1) { - size[0]=longueur; - strcpy(name_dataset,"Ref on shape"); - hdf_dataset[cmpt_ds]=new HDFdataset(name_dataset,hdf_group[gotBranch->Tag()],HDF_STRING,size,1); - hdf_dataset[cmpt_ds]->CreateOnDisk(); - hdf_dataset[cmpt_ds]->WriteOnDisk(myRefOnObject); - hdf_dataset[cmpt_ds]->CloseOnDisk(); - cmpt_ds++; - - } - } - //********** - - //********** ref on applied hypothesis - _found = gotBranch->FindSubObject(Tag_RefOnAppliedHypothesis,myBranch); - if (_found) { - - strcpy(name_meshgroup,"Applied Hypothesis"); - hdf_subgroup[Tag_RefOnAppliedHypothesis] = new HDFgroup(name_meshgroup,hdf_group[gotBranch->Tag()]); - hdf_subgroup[Tag_RefOnAppliedHypothesis]->CreateOnDisk(); - - it = Study->NewChildIterator(myBranch); - cmpt_it = 0; - for (; it->More();it->Next()) { - mySObject = it->Value(); - ok = mySObject->ReferencedObject(myRef); - myRefOnObject = myRef->GetID(); - - longueur = strlen(myRefOnObject) +1; - if (longueur>1) { - size[0]=longueur; - sprintf(name_dataset,"Hyp %d",cmpt_it); - hdf_dataset[cmpt_ds]=new HDFdataset(name_dataset,hdf_subgroup[Tag_RefOnAppliedHypothesis],HDF_STRING,size,1); - hdf_dataset[cmpt_ds]->CreateOnDisk(); - hdf_dataset[cmpt_ds]->WriteOnDisk(myRefOnObject); - hdf_dataset[cmpt_ds]->CloseOnDisk(); + // --> hypotheses root branch (only one for the study) + if ( gotBranch->Tag() == GetHypothesisRootTag() ) { + // create hypotheses root HDF group + aTopGroup = new HDFgroup( "Hypotheses", aFile ); + aTopGroup->CreateOnDisk(); + + // iterator for all hypotheses + SALOMEDS::ChildIterator_var it = myCurrentStudy->NewChildIterator( gotBranch ); + for ( ; it->More(); it->Next() ) { + SALOMEDS::SObject_var mySObject = it->Value(); + CORBA::Object_var anObject = SObjectToObject( mySObject ); + if ( !CORBA::is_nil( anObject ) ) { + SMESH::SMESH_Hypothesis_var myHyp = SMESH::SMESH_Hypothesis::_narrow( anObject ); + if ( !myHyp->_is_nil() ) { + SMESH_Hypothesis_i* myImpl = dynamic_cast( GetServant( myHyp ).in() ); + if ( myImpl ) { + string hypname = string( myHyp->GetName() ); + string libname = string( myHyp->GetLibName() ); + int id = myStudyContext->findId( string( GetORB()->object_to_string( anObject ) ) ); + string hypdata = string( myImpl->SaveTo() ); + + // for each hypothesis create HDF group basing on its id + char hypGrpName[30]; + sprintf( hypGrpName, "Hypothesis %d", id ); + aGroup = new HDFgroup( hypGrpName, aTopGroup ); + aGroup->CreateOnDisk(); + // --> type name of hypothesis + aSize[ 0 ] = hypname.length() + 1; + aDataset = new HDFdataset( "Name", aGroup, HDF_STRING, aSize, 1 ); + aDataset->CreateOnDisk(); + aDataset->WriteOnDisk( ( char* )( hypname.c_str() ) ); + aDataset->CloseOnDisk(); + // --> server plugin library name of hypothesis + aSize[ 0 ] = libname.length() + 1; + aDataset = new HDFdataset( "LibName", aGroup, HDF_STRING, aSize, 1 ); + aDataset->CreateOnDisk(); + aDataset->WriteOnDisk( ( char* )( libname.c_str() ) ); + aDataset->CloseOnDisk(); + // --> persistent data of hypothesis + aSize[ 0 ] = hypdata.length() + 1; + aDataset = new HDFdataset( "Data", aGroup, HDF_STRING, aSize, 1 ); + aDataset->CreateOnDisk(); + aDataset->WriteOnDisk( ( char* )( hypdata.c_str() ) ); + aDataset->CloseOnDisk(); + // close hypothesis HDF group + aGroup->CloseOnDisk(); } - cmpt_ds++; - cmpt_it++; } - hdf_subgroup[Tag_RefOnAppliedHypothesis]->CloseOnDisk(); } - //********** - - //********** ref on applied algorithms - _found = gotBranch->FindSubObject(Tag_RefOnAppliedAlgorithms,myBranch); - if (_found) { - - strcpy(name_meshgroup,"Applied Algorithms"); - hdf_subgroup[Tag_RefOnAppliedAlgorithms] = new HDFgroup(name_meshgroup,hdf_group[gotBranch->Tag()]); - hdf_subgroup[Tag_RefOnAppliedAlgorithms]->CreateOnDisk(); - - it = Study->NewChildIterator(myBranch); - cmpt_it = 0; - for (; it->More();it->Next()) { - mySObject = it->Value(); - ok = mySObject->ReferencedObject(myRef); - myRefOnObject = myRef->GetID(); - - longueur = strlen(myRefOnObject) +1; - if (longueur>1) { - size[0]=longueur; - sprintf(name_dataset,"Algo %d",cmpt_it); - hdf_dataset[cmpt_ds]=new HDFdataset(name_dataset,hdf_subgroup[Tag_RefOnAppliedAlgorithms],HDF_STRING,size,1); - hdf_dataset[cmpt_ds]->CreateOnDisk(); - hdf_dataset[cmpt_ds]->WriteOnDisk(myRefOnObject); - hdf_dataset[cmpt_ds]->CloseOnDisk(); + } + // close hypotheses root HDF group + aTopGroup->CloseOnDisk(); + } + // --> algorithms root branch (only one for the study) + else if ( gotBranch->Tag() == GetAlgorithmsRootTag() ) { + // create algorithms root HDF group + aTopGroup = new HDFgroup( "Algorithms", aFile ); + aTopGroup->CreateOnDisk(); + + // iterator for all algorithms + SALOMEDS::ChildIterator_var it = myCurrentStudy->NewChildIterator( gotBranch ); + for ( ; it->More(); it->Next() ) { + SALOMEDS::SObject_var mySObject = it->Value(); + CORBA::Object_var anObject = SObjectToObject( mySObject ); + if ( !CORBA::is_nil( anObject ) ) { + SMESH::SMESH_Hypothesis_var myHyp = SMESH::SMESH_Hypothesis::_narrow( anObject ); + if ( !myHyp->_is_nil() ) { + SMESH_Hypothesis_i* myImpl = dynamic_cast( GetServant( myHyp ).in() ); + if ( myImpl ) { + string hypname = string( myHyp->GetName() ); + string libname = string( myHyp->GetLibName() ); + int id = myStudyContext->findId( string( GetORB()->object_to_string( anObject ) ) ); + string hypdata = string( myImpl->SaveTo() ); + + // for each algorithm create HDF group basing on its id + char hypGrpName[30]; + sprintf( hypGrpName, "Algorithm %d", id ); + aGroup = new HDFgroup( hypGrpName, aTopGroup ); + aGroup->CreateOnDisk(); + // --> type name of algorithm + aSize[0] = hypname.length() + 1; + aDataset = new HDFdataset( "Name", aGroup, HDF_STRING, aSize, 1 ); + aDataset->CreateOnDisk(); + aDataset->WriteOnDisk( ( char* )( hypname.c_str() ) ); + aDataset->CloseOnDisk(); + // --> server plugin library name of hypothesis + aSize[0] = libname.length() + 1; + aDataset = new HDFdataset( "LibName", aGroup, HDF_STRING, aSize, 1 ); + aDataset->CreateOnDisk(); + aDataset->WriteOnDisk( ( char* )( libname.c_str() ) ); + aDataset->CloseOnDisk(); + // --> persistent data of algorithm + aSize[0] = hypdata.length() + 1; + aDataset = new HDFdataset( "Data", aGroup, HDF_STRING, aSize, 1 ); + aDataset->CreateOnDisk(); + aDataset->WriteOnDisk( ( char* )( hypdata.c_str() ) ); + aDataset->CloseOnDisk(); + // close algorithm HDF group + aGroup->CloseOnDisk(); } - cmpt_ds++; - cmpt_it++; } - hdf_subgroup[Tag_RefOnAppliedAlgorithms]->CloseOnDisk(); } - MESSAGE("end of algo applied"); - //********** - - //********** submeshes on subshapes - int myLevel1Tag; - for (int i=Tag_SubMeshOnVertex;i<=Tag_SubMeshOnCompound;i++) { - _found = gotBranch->FindSubObject(i,myBranch); - if (_found) { - if (i==Tag_SubMeshOnVertex) - strcpy(name_meshgroup,"SubMeshes On Vertex"); - else if (i==Tag_SubMeshOnEdge) - strcpy(name_meshgroup,"SubMeshes On Edge"); - else if (i==Tag_SubMeshOnFace) - strcpy(name_meshgroup,"SubMeshes On Face"); - else if (i==Tag_SubMeshOnSolid) - strcpy(name_meshgroup,"SubMeshes On Solid"); - else if (i==Tag_SubMeshOnCompound) - strcpy(name_meshgroup,"SubMeshes On Compound"); - - cmpt_sm++; - myLevel1Tag = 10+cmpt_sm; - hdf_subgroup[myLevel1Tag] = new HDFgroup(name_meshgroup,hdf_group[gotBranch->Tag()]); - hdf_subgroup[myLevel1Tag]->CreateOnDisk(); + } + // close algorithms root HDF group + aTopGroup->CloseOnDisk(); + } + // --> mesh objects roots branches + else if ( gotBranch->Tag() > GetAlgorithmsRootTag() ) { + CORBA::Object_var anObject = SObjectToObject( gotBranch ); + if ( !CORBA::is_nil( anObject ) ) { + SMESH::SMESH_Mesh_var myMesh = SMESH::SMESH_Mesh::_narrow( anObject ) ; + if ( !myMesh->_is_nil() ) { + SMESH_Mesh_i* myImpl = dynamic_cast( GetServant( myMesh ).in() ); + if ( myImpl ) { + int id = myStudyContext->findId( string( GetORB()->object_to_string( anObject ) ) ); + ::SMESH_Mesh& myLocMesh = myImpl->GetImpl(); + SMESHDS_Mesh* mySMESHDSMesh = myLocMesh.GetMeshDS(); + + // for each mesh open the HDF group basing on its id + char meshGrpName[ 30 ]; + sprintf( meshGrpName, "Mesh %d", id ); + aTopGroup = new HDFgroup( meshGrpName, aFile ); + aTopGroup->CreateOnDisk(); + + // --> put dataset to hdf file which is a flag that mesh has data + string strHasData = "0"; + // check if the mesh is not empty + if ( mySMESHDSMesh->NbNodes() > 0 ) { + // write mesh data to med file + myWriter.SetMesh( mySMESHDSMesh ); + myWriter.SetMeshId( id ); + strHasData = "1"; + } + aSize[ 0 ] = strHasData.length() + 1; + aDataset = new HDFdataset( "Has data", aTopGroup, HDF_STRING, aSize, 1 ); + aDataset->CreateOnDisk(); + aDataset->WriteOnDisk( ( char* )( strHasData.c_str() ) ); + aDataset->CloseOnDisk(); - itSM = Study->NewChildIterator(myBranch); - for (; itSM->More();itSM->Next()) {//Loop on all submeshes - mySObject = itSM->Value(); - cmpt_sm++; - myTag = 10+cmpt_sm; - mySObject->FindAttribute(anAttr, "AttributeIOR"); - anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); - SMESH::SMESH_subMesh_var mySubMesh = SMESH::SMESH_subMesh::_narrow(_orb->string_to_object(anIOR->Value())) ; - - //sprintf(name_meshgroup,"SubMesh %d",myTag); - sprintf(name_meshgroup,"SubMesh %d",mySubMesh->GetId()); - SCRUTE(name_meshgroup); - - hdf_subgroup[myTag] = new HDFgroup(name_meshgroup,hdf_subgroup[myLevel1Tag]); - hdf_subgroup[myTag]->CreateOnDisk(); - - //********** ref on shape - Standard_CString myRefOnObject="" ; - SALOMEDS::SObject_var myRef,myShape; - bool _found2; - _found2 = mySObject->FindSubObject(Tag_RefOnShape,myRef); - if (_found2) { - ok = myRef->ReferencedObject(myShape); - myRefOnObject = myShape->GetID(); - SCRUTE(myRefOnObject); - - longueur = strlen(myRefOnObject) +1; - if (longueur>1) { - size[0]=longueur; - strcpy(name_dataset,"Ref on shape"); - hdf_dataset[cmpt_ds]=new HDFdataset(name_dataset,hdf_subgroup[myTag],HDF_STRING,size,1); - hdf_dataset[cmpt_ds]->CreateOnDisk(); - hdf_dataset[cmpt_ds]->WriteOnDisk(myRefOnObject); - hdf_dataset[cmpt_ds]->CloseOnDisk(); - cmpt_ds++; + // write reference on a shape if exists + SALOMEDS::SObject_var myRef; + bool found = gotBranch->FindSubObject( GetRefOnShapeTag(), myRef ); + if ( found ) { + SALOMEDS::SObject_var myShape; + bool ok = myRef->ReferencedObject( myShape ); + if ( ok ) { + string myRefOnObject = myShape->GetID(); + if ( myRefOnObject.length() > 0 ) { + aSize[ 0 ] = myRefOnObject.length() + 1; + aDataset = new HDFdataset( "Ref on shape", aTopGroup, HDF_STRING, aSize, 1 ); + aDataset->CreateOnDisk(); + aDataset->WriteOnDisk( ( char* )( myRefOnObject.c_str() ) ); + aDataset->CloseOnDisk(); } } - //********** - - //********** ref on applied hypothesis - _found2 = mySObject->FindSubObject(Tag_RefOnAppliedHypothesis,myBranch); - if (_found2) { - - strcpy(name_meshgroup,"Applied Hypothesis"); - cmpt_sm++; - hdf_subgroup[10+cmpt_sm] = new HDFgroup(name_meshgroup,hdf_subgroup[myTag]); - hdf_subgroup[10+cmpt_sm]->CreateOnDisk(); + } + + // write applied hypotheses if exist + SALOMEDS::SObject_var myHypBranch; + found = gotBranch->FindSubObject( GetRefOnAppliedHypothesisTag(), myHypBranch ); + if ( found ) { + aGroup = new HDFgroup( "Applied Hypotheses", aTopGroup ); + aGroup->CreateOnDisk(); + + SALOMEDS::ChildIterator_var it = myCurrentStudy->NewChildIterator( myHypBranch ); + int hypNb = 0; + for ( ; it->More(); it->Next() ) { + SALOMEDS::SObject_var mySObject = it->Value(); + SALOMEDS::SObject_var myRefOnHyp; + bool ok = mySObject->ReferencedObject( myRefOnHyp ); + if ( ok ) { + // san - it is impossible to recover applied hypotheses + // using their entries within Load() method, + // for there are no AttributeIORs in the study when Load() is working. + // Hence, it is better to store persistent IDs of hypotheses as references to them + + //string myRefOnObject = myRefOnHyp->GetID(); + CORBA::Object_var anObject = SObjectToObject( myRefOnHyp ); + int id = myStudyContext->findId( string( GetORB()->object_to_string( anObject ) ) ); + //if ( myRefOnObject.length() > 0 ) { + //aSize[ 0 ] = myRefOnObject.length() + 1; + char hypName[ 30 ], hypId[ 30 ]; + sprintf( hypName, "Hyp %d", ++hypNb ); + sprintf( hypId, "%d", id ); + aSize[ 0 ] = strlen( hypId ) + 1; + aDataset = new HDFdataset( hypName, aGroup, HDF_STRING, aSize, 1 ); + aDataset->CreateOnDisk(); + //aDataset->WriteOnDisk( ( char* )( myRefOnObject.c_str() ) ); + aDataset->WriteOnDisk( hypId ); + aDataset->CloseOnDisk(); + //} + } + } + aGroup->CloseOnDisk(); + } + + // write applied algorithms if exist + SALOMEDS::SObject_var myAlgoBranch; + found = gotBranch->FindSubObject( GetRefOnAppliedAlgorithmsTag(), myAlgoBranch ); + if ( found ) { + aGroup = new HDFgroup( "Applied Algorithms", aTopGroup ); + aGroup->CreateOnDisk(); + + SALOMEDS::ChildIterator_var it = myCurrentStudy->NewChildIterator( myAlgoBranch ); + int algoNb = 0; + for ( ; it->More(); it->Next() ) { + SALOMEDS::SObject_var mySObject = it->Value(); + SALOMEDS::SObject_var myRefOnAlgo; + bool ok = mySObject->ReferencedObject( myRefOnAlgo ); + if ( ok ) { + // san - it is impossible to recover applied algorithms + // using their entries within Load() method, + // for there are no AttributeIORs in the study when Load() is working. + // Hence, it is better to store persistent IDs of algorithms as references to them + + //string myRefOnObject = myRefOnAlgo->GetID(); + CORBA::Object_var anObject = SObjectToObject( myRefOnAlgo ); + int id = myStudyContext->findId( string( GetORB()->object_to_string( anObject ) ) ); + //if ( myRefOnObject.length() > 0 ) { + //aSize[ 0 ] = myRefOnObject.length() + 1; + char algoName[ 30 ], algoId[ 30 ]; + sprintf( algoName, "Algo %d", ++algoNb ); + sprintf( algoId, "%d", id ); + aSize[ 0 ] = strlen( algoId ) + 1; + aDataset = new HDFdataset( algoName, aGroup, HDF_STRING, aSize, 1 ); + aDataset->CreateOnDisk(); + //aDataset->WriteOnDisk( ( char* )( myRefOnObject.c_str() ) ); + aDataset->WriteOnDisk( algoId ); + aDataset->CloseOnDisk(); + //} + } + } + aGroup->CloseOnDisk(); + } + + // --> submesh objects sub-branches + for ( int i = GetSubMeshOnVertexTag(); i <= GetSubMeshOnCompoundTag(); i++ ) { + SALOMEDS::SObject_var mySubmeshBranch; + found = gotBranch->FindSubObject( i, mySubmeshBranch ); + if ( found ) { + char name_meshgroup[ 30 ]; + if ( i == GetSubMeshOnVertexTag() ) + strcpy( name_meshgroup, "SubMeshes On Vertex" ); + else if ( i == GetSubMeshOnEdgeTag() ) + strcpy( name_meshgroup, "SubMeshes On Edge" ); + else if ( i == GetSubMeshOnFaceTag() ) + strcpy( name_meshgroup, "SubMeshes On Face" ); + else if ( i == GetSubMeshOnSolidTag() ) + strcpy( name_meshgroup, "SubMeshes On Solid" ); + else if ( i == GetSubMeshOnCompoundTag() ) + strcpy( name_meshgroup, "SubMeshes On Compound" ); - it = Study->NewChildIterator(myBranch); - cmpt_it = 0; - for (; it->More();it->Next()) { - mySObjectChild = it->Value(); - ok = mySObjectChild->ReferencedObject(myRef); - myRefOnObject = myRef->GetID(); - - longueur = strlen(myRefOnObject) +1; - if (longueur>1) { - size[0]=longueur; - sprintf(name_dataset,"Hyp %d",cmpt_it); - SCRUTE(cmpt_it); - hdf_dataset[cmpt_ds]=new HDFdataset(name_dataset,hdf_subgroup[10+cmpt_sm],HDF_STRING,size,1); - hdf_dataset[cmpt_ds]->CreateOnDisk(); - hdf_dataset[cmpt_ds]->WriteOnDisk(myRefOnObject); - hdf_dataset[cmpt_ds]->CloseOnDisk(); + // for each type of submeshes create container HDF group + aGroup = new HDFgroup( name_meshgroup, aTopGroup ); + aGroup->CreateOnDisk(); + + // iterator for all submeshes of given type + SALOMEDS::ChildIterator_var itSM = myCurrentStudy->NewChildIterator( mySubmeshBranch ); + for ( ; itSM->More(); itSM->Next() ) { + SALOMEDS::SObject_var mySObject = itSM->Value(); + CORBA::Object_var anSubObject = SObjectToObject( mySObject ); + if ( !CORBA::is_nil( anSubObject ) ) { + SMESH::SMESH_subMesh_var mySubMesh = SMESH::SMESH_subMesh::_narrow( anSubObject ) ; + int subid = myStudyContext->findId( string( GetORB()->object_to_string( anSubObject ) ) ); + + // for each mesh open the HDF group basing on its id + char submeshGrpName[ 30 ]; + sprintf( submeshGrpName, "SubMesh %d", subid ); + aSubGroup = new HDFgroup( submeshGrpName, aGroup ); + aSubGroup->CreateOnDisk(); + +// // Put submesh data to MED convertor +// if ( myImpl->_mapSubMesh.find( mySubMesh->GetId() ) != myImpl->_mapSubMesh.end() ) { +// MESSAGE( "VSR - SMESH_Gen_i::Save(): saving submesh with ID = " +// << mySubMesh->GetId() << " to MED file" ); +// ::SMESH_subMesh* aLocalSubmesh = myImpl->_mapSubMesh[mySubMesh->GetId()]; +// myWriter.AddSubMesh( aLocalSubmesh->GetSubMeshDS(), subid ); +// } + + // write reference on a shape if exists + SALOMEDS::SObject_var mySubRef; + found = mySObject->FindSubObject( GetRefOnShapeTag(), mySubRef ); + if ( found ) { + SALOMEDS::SObject_var myShape; + bool ok = mySubRef->ReferencedObject( myShape ); + if ( ok ) { + string myRefOnObject = myShape->GetID(); + if ( myRefOnObject.length() > 0 ) { + aSize[ 0 ] = myRefOnObject.length() + 1; + aDataset = new HDFdataset( "Ref on shape", aSubGroup, HDF_STRING, aSize, 1 ); + aDataset->CreateOnDisk(); + aDataset->WriteOnDisk( ( char* )( myRefOnObject.c_str() ) ); + aDataset->CloseOnDisk(); + } + } + } + + // write applied hypotheses if exist + SALOMEDS::SObject_var mySubHypBranch; + found = mySObject->FindSubObject( GetRefOnAppliedHypothesisTag(), mySubHypBranch ); + if ( found ) { + aSubSubGroup = new HDFgroup( "Applied Hypotheses", aSubGroup ); + aSubSubGroup->CreateOnDisk(); + + SALOMEDS::ChildIterator_var it = myCurrentStudy->NewChildIterator( mySubHypBranch ); + int hypNb = 0; + for ( ; it->More(); it->Next() ) { + SALOMEDS::SObject_var mySubSObject = it->Value(); + SALOMEDS::SObject_var myRefOnHyp; + bool ok = mySubSObject->ReferencedObject( myRefOnHyp ); + if ( ok ) { + //string myRefOnObject = myRefOnHyp->GetID(); + CORBA::Object_var anObject = SObjectToObject( myRefOnHyp ); + int id = myStudyContext->findId( string( GetORB()->object_to_string( anObject ) ) ); + //if ( myRefOnObject.length() > 0 ) { + //aSize[ 0 ] = myRefOnObject.length() + 1; + char hypName[ 30 ], hypId[ 30 ]; + sprintf( hypName, "Hyp %d", ++hypNb ); + sprintf( hypId, "%d", id ); + aSize[ 0 ] = strlen( hypId ) + 1; + aDataset = new HDFdataset( hypName, aSubSubGroup, HDF_STRING, aSize, 1 ); + aDataset->CreateOnDisk(); + //aDataset->WriteOnDisk( ( char* )( myRefOnObject.c_str() ) ); + aDataset->WriteOnDisk( hypId ); + aDataset->CloseOnDisk(); + //} + } + } + aSubSubGroup->CloseOnDisk(); + } + + // write applied algorithms if exist + SALOMEDS::SObject_var mySubAlgoBranch; + found = mySObject->FindSubObject( GetRefOnAppliedAlgorithmsTag(), mySubAlgoBranch ); + if ( found ) { + aSubSubGroup = new HDFgroup( "Applied Algorithms", aSubGroup ); + aSubSubGroup->CreateOnDisk(); + + SALOMEDS::ChildIterator_var it = myCurrentStudy->NewChildIterator( mySubAlgoBranch ); + int algoNb = 0; + for ( ; it->More(); it->Next() ) { + SALOMEDS::SObject_var mySubSObject = it->Value(); + SALOMEDS::SObject_var myRefOnAlgo; + bool ok = mySubSObject->ReferencedObject( myRefOnAlgo ); + if ( ok ) { + //string myRefOnObject = myRefOnAlgo->GetID(); + CORBA::Object_var anObject = SObjectToObject( myRefOnAlgo ); + int id = myStudyContext->findId( string( GetORB()->object_to_string( anObject ) ) ); + //if ( myRefOnObject.length() > 0 ) { + //aSize[ 0 ] = myRefOnObject.length() + 1; + char algoName[ 30 ], algoId[ 30 ]; + sprintf( algoName, "Algo %d", ++algoNb ); + sprintf( algoId, "%d", id ); + aSize[ 0 ] = strlen( algoId ) + 1; + aDataset = new HDFdataset( algoName, aSubSubGroup, HDF_STRING, aSize, 1 ); + aDataset->CreateOnDisk(); + //aDataset->WriteOnDisk( ( char* )( myRefOnObject.c_str() ) ); + aDataset->WriteOnDisk( algoId ); + aDataset->CloseOnDisk(); + //} + } + } + aSubSubGroup->CloseOnDisk(); + } + // close submesh HDF group + aSubGroup->CloseOnDisk(); } - cmpt_ds++; - cmpt_it++; } - hdf_subgroup[10+cmpt_sm]->CloseOnDisk(); + // close container of submeshes by type HDF group + aGroup->CloseOnDisk(); } - //********** - - //********** ref on applied algorithms - _found2 = mySObject->FindSubObject(Tag_RefOnAppliedAlgorithms,myBranch); - SCRUTE(_found2); - if (_found2) { - - strcpy(name_meshgroup,"Applied Algorithms"); - cmpt_sm++; - hdf_subgroup[10+cmpt_sm] = new HDFgroup(name_meshgroup,hdf_subgroup[myTag]); - hdf_subgroup[10+cmpt_sm]->CreateOnDisk(); - - it = Study->NewChildIterator(myBranch); - cmpt_it = 0; - for (; it->More();it->Next()) { - mySObjectChild = it->Value(); - ok = mySObjectChild->ReferencedObject(myRef); - myRefOnObject = myRef->GetID(); - - longueur = strlen(myRefOnObject) +1; - if (longueur>1) { - size[0]=longueur; - sprintf(name_dataset,"Algo %d",cmpt_it); - hdf_dataset[cmpt_ds]=new HDFdataset(name_dataset,hdf_subgroup[10+cmpt_sm],HDF_STRING,size,1); - hdf_dataset[cmpt_ds]->CreateOnDisk(); - hdf_dataset[cmpt_ds]->WriteOnDisk(myRefOnObject); - hdf_dataset[cmpt_ds]->CloseOnDisk(); + } + // All sub-meshes will be stored in MED file + 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 ); + int grpNb = 0; + for ( ; it->More(); it->Next() ) { + SALOMEDS::SObject_var mySObject = it->Value(); + CORBA::Object_var aSubObject = SObjectToObject( mySObject ); + if ( !CORBA::is_nil( aSubObject ) ) { + SMESH_Group_i* myGroupImpl = dynamic_cast( GetServant( aSubObject ).in() ); + if ( !myGroupImpl ) + continue; + + int anId = myStudyContext->findId( string( GetORB()->object_to_string( aSubObject ) ) ); + + // 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(); + + // Store the group contents into MED file + if ( myLocMesh.GetGroup( myGroupImpl->GetLocalID() ) ) { + MESSAGE( "VSR - SMESH_Gen_i::Save(): saving group with StoreName = " + << grpName << " to MED file" ); + SMESHDS_Group* aGrpDS = myLocMesh.GetGroup( myGroupImpl->GetLocalID() )->GetGroupDS(); + aGrpDS->SetStoreName( grpName ); + + // Pass SMESHDS_Group to MED writer + myWriter.AddGroup( aGrpDS ); + } } - cmpt_ds++; - cmpt_it++; } - hdf_subgroup[10+cmpt_sm]->CloseOnDisk(); + aGroup->CloseOnDisk(); } - //MESSAGE("end of algo applied"); - //********** - - hdf_subgroup[myTag]->CloseOnDisk(); } - - hdf_subgroup[myLevel1Tag]->CloseOnDisk(); + + // Flush current mesh information into MED file + if ( strcmp( strHasData.c_str(), "1" ) == 0 ) + myWriter.Add(); + + // close mesh HDF group + aTopGroup->CloseOnDisk(); } - } - //********** - - //********** closing of the HDF group - hdf_group[gotBranch->Tag()]->CloseOnDisk(); - MESSAGE("End of Mesh Save"); - //********** - } + } } - MESSAGE("End of Meshes Save"); } - hdf_file->CloseOnDisk(); - delete hdf_file; - hdf_file = 0; + // close HDF file + aFile->CloseOnDisk(); + delete aFile; // Convert temporary files to stream - aStreamFile = SALOMEDS_Tool::PutFilesToStream(tmpDir.ToCString(), aFileSeq.in(), isMultiFile); + aStreamFile = SALOMEDS_Tool::PutFilesToStream( tmpDir.ToCString(), aFileSeq.in(), isMultiFile ); // Remove temporary files and directory - if (!isMultiFile) SALOMEDS_Tool::RemoveTemporaryFiles(tmpDir.ToCString(), aFileSeq.in(), true); - - MESSAGE("End SMESH_Gen_i::Save"); + if ( !isMultiFile ) + SALOMEDS_Tool::RemoveTemporaryFiles( tmpDir.ToCString(), aFileSeq.in(), true ); + INFOS( "SMESH_Gen_i::Save() completed" ); return aStreamFile._retn(); } -SALOMEDS::TMPFile* SMESH_Gen_i::SaveASCII(SALOMEDS::SComponent_ptr theComponent, - const char* theURL, - bool isMultiFile) { - SALOMEDS::TMPFile_var aStreamFile = Save(theComponent, theURL, isMultiFile); +//============================================================================= +/*! + * SMESH_Gen_i::SaveASCII + * + * Save SMESH module's data in ASCII format (not implemented yet) + */ +//============================================================================= + +SALOMEDS::TMPFile* SMESH_Gen_i::SaveASCII( SALOMEDS::SComponent_ptr theComponent, + const char* theURL, + bool isMultiFile ) { + MESSAGE( "SMESH_Gen_i::SaveASCII" ); + SALOMEDS::TMPFile_var aStreamFile = Save( theComponent, theURL, isMultiFile ); return aStreamFile._retn(); } //============================================================================= /*! - * + * SMESH_Gen_i::loadGeomData + * + * Load GEOM module data */ //============================================================================= -bool SMESH_Gen_i::Load(SALOMEDS::SComponent_ptr theComponent, - const SALOMEDS::TMPFile& theStream, - const char* theURL, - bool isMultiFile) +void SMESH_Gen_i::loadGeomData( SALOMEDS::SComponent_ptr theCompRoot ) { - MESSAGE("SMESH_Gen_i::Load\n"); + if ( theCompRoot->_is_nil() ) + return; - // Get temporary files location - TCollection_AsciiString tmpDir = isMultiFile?TCollection_AsciiString((char*)theURL):SALOMEDS_Tool::GetTmpDir(); + SALOMEDS::Study_var aStudy = SALOMEDS::Study::_narrow( theCompRoot->GetStudy() ); + if ( aStudy->_is_nil() ) + return; - // Convert the stream into sequence of files to process - SALOMEDS::ListOfFileNames_var aFileSeq = SALOMEDS_Tool::PutStreamToFiles(theStream, - tmpDir.ToCString(), - isMultiFile); + SALOMEDS::StudyBuilder_var aStudyBuilder = aStudy->NewBuilder(); + aStudyBuilder->LoadWith( theCompRoot, GetGeomEngine() ); +} - TCollection_AsciiString aStudyName(""); - if (isMultiFile) aStudyName = (SALOMEDS_Tool::GetNameFromPath(theComponent->GetStudy()->URL())); +//============================================================================= +/*! + * SMESH_Gen_i::Load + * + * Load SMESH module's data + */ +//============================================================================= - // Set names of temporary files - TCollection_AsciiString filename = tmpDir + aStudyName + TCollection_AsciiString("_SMESH.hdf"); - TCollection_AsciiString hypofile = tmpDir + aStudyName + TCollection_AsciiString("_SMESH_Hypo.txt"); - TCollection_AsciiString algofile = tmpDir + aStudyName + TCollection_AsciiString("_SMESH_Algo.txt"); - TCollection_AsciiString meshfile = tmpDir + aStudyName + TCollection_AsciiString("_SMESH_Mesh.med"); +bool SMESH_Gen_i::Load( SALOMEDS::SComponent_ptr theComponent, + const SALOMEDS::TMPFile& theStream, + const char* theURL, + bool isMultiFile ) +{ + INFOS( "SMESH_Gen_i::Load" ); - SALOMEDS::Study_var Study = theComponent->GetStudy(); - int studyId = Study->StudyId(); - SCRUTE(studyId); + ASSERT( theComponent->GetStudy()->StudyId() == myCurrentStudy->StudyId() ) + StudyContext* myStudyContext = GetCurrentStudyContext(); + + // Get temporary files location + TCollection_AsciiString tmpDir = + isMultiFile ? TCollection_AsciiString( ( char* )theURL ) : SALOMEDS_Tool::GetTmpDir(); - SALOMEDS::GenericAttribute_var anAttr; - SALOMEDS::AttributeName_var aName; - SALOMEDS::AttributeIOR_var anIOR; - - SALOMEDS::SComponent_var fathergeom = Study->FindComponent("GEOM"); - SALOMEDS::SComponent_var myGeomSComp = SALOMEDS::SComponent::_narrow( fathergeom ); - SCRUTE(fathergeom); - - //to get the geom engine !!! - //useful to define our new mesh - SALOME_NamingService* _NS = SINGLETON_::Instance() ; - ASSERT(SINGLETON_::IsAlreadyExisting()) ; - _NS->init_orb( _orb ) ; - SALOME_LifeCycleCORBA* myEnginesLifeCycle = new SALOME_LifeCycleCORBA(_NS); - Engines::Component_var geomEngine = - myEnginesLifeCycle->FindOrLoad_Component("FactoryServer","GEOM"); - GEOM::GEOM_Gen_var myGeomEngine = GEOM::GEOM_Gen::_narrow(geomEngine); - - - char* aLine; - bool ok; - char objectId[10],name_dataset[10]; - int nb_datasets,size,cmpt_ds=0; - int cmpt_sm = 0; - - char name[HDF_NAME_MAX_LEN+1]; - char sgname[HDF_NAME_MAX_LEN+1]; - char msgname[HDF_NAME_MAX_LEN+1]; - char name_of_group[HDF_NAME_MAX_LEN+1]; - char *name_meshgroup; - map hdf_group, hdf_subgroup; - map hdf_dataset; - FILE *loadedFile; - - //************* HDF file opening - HDFfile * hdf_file = new HDFfile(filename.ToCString()); + // Convert the stream into sequence of files to process + SALOMEDS::ListOfFileNames_var aFileSeq = SALOMEDS_Tool::PutStreamToFiles( theStream, + tmpDir.ToCString(), + isMultiFile ); + TCollection_AsciiString aStudyName( "" ); + if ( isMultiFile ) + aStudyName = ( SALOMEDS_Tool::GetNameFromPath( myCurrentStudy->URL() ) ); + + // Set names of temporary files + TCollection_AsciiString filename = tmpDir + aStudyName + TCollection_AsciiString( "_SMESH.hdf" ); + TCollection_AsciiString meshfile = tmpDir + aStudyName + TCollection_AsciiString( "_SMESH_Mesh.med" ); + + int size; + HDFfile* aFile; + HDFdataset* aDataset; + HDFgroup* aTopGroup; + HDFgroup* aGroup; + HDFgroup* aSubGroup; + HDFgroup* aSubSubGroup; + + // Read data + // ---> open HDF file + aFile = new HDFfile( filename.ToCString() ); try { - hdf_file->OpenOnDisk(HDF_RDONLY); + aFile->OpenOnDisk( HDF_RDONLY ); } - catch (HDFexception) { - MESSAGE("Load(): " << filename << " not found!"); + catch ( HDFexception ) { + MESSAGE( "Load(): " << filename << " not found!" ); return false; } - //**************************** + DriverMED_R_SMESHDS_Mesh myReader; + myReader.SetFile( meshfile.ToCString() ); + + // get total number of top-level groups + int aNbGroups = aFile->nInternalObjects(); + if ( aNbGroups > 0 ) { + // --> in first turn we should read&create hypotheses + if ( aFile->ExistInternalObject( "Hypotheses" ) ) { + // open hypotheses root HDF group + aTopGroup = new HDFgroup( "Hypotheses", aFile ); + aTopGroup->OpenOnDisk(); + + // 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 ]; + 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 ); + 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 + 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 (...) { + MESSAGE( "Exception during hypothesis creation" ); + } - int nb_group = hdf_file->nInternalObjects(); - SCRUTE(nb_group); - for (int i=0;iInternalObjectIndentify(i,name); - //SCRUTE(name); - -//*************** -// Loading of the Hypothesis Branch -//*************** - if (strcmp(name,"Hypothesis")==0) { - - double length,maxElementsArea,maxElementsVolume; - int numberOfSegments; - - hdf_group[Tag_HypothesisRoot] = new HDFgroup(name,hdf_file); - hdf_group[Tag_HypothesisRoot]->OpenOnDisk(); - - hdf_group[Tag_HypothesisRoot]->InternalObjectIndentify(0,name_of_group); - hdf_dataset[cmpt_ds]=new HDFdataset(name_of_group,hdf_group[Tag_HypothesisRoot]); - hdf_dataset[cmpt_ds]->OpenOnDisk(); - size=hdf_dataset[cmpt_ds]->GetSize(); - - char * name_of_file =new char[size]; - hdf_dataset[cmpt_ds]->ReadFromDisk(name_of_file); - SCRUTE(name_of_file); - hdf_dataset[cmpt_ds]->CloseOnDisk(); - hdf_group[Tag_HypothesisRoot]->CloseOnDisk(); - cmpt_ds++; - delete[] name_of_file; - name_of_file = 0; - - aLine = new char[100]; - loadedFile = fopen( hypofile.ToCString() ,"r"); - while (!feof(loadedFile)) { - fscanf(loadedFile,"%s",aLine); - //SCRUTE(aLine); - if (strcmp(aLine,"LocalLength")==0) { - SMESH::SMESH_Hypothesis_var myHyp = this->CreateHypothesis(aLine,studyId); - SMESH::SMESH_LocalLength_var LL = SMESH::SMESH_LocalLength::_narrow( myHyp ); - fscanf(loadedFile,"%s",aLine); - length = atof(aLine); - LL->SetLength(length); - string iorString = _orb->object_to_string(LL); - sprintf(objectId,"%d",LL->GetId()); - _SMESHCorbaObj[string("Hypo_")+string(objectId)] = iorString; - } - else if (strcmp(aLine,"NumberOfSegments")==0) { - SMESH::SMESH_Hypothesis_var myHyp = this->CreateHypothesis(aLine,studyId); - SMESH::SMESH_NumberOfSegments_var NOS = SMESH::SMESH_NumberOfSegments::_narrow( myHyp ); - fscanf(loadedFile,"%s",aLine); - numberOfSegments = atoi(aLine); - NOS->SetNumberOfSegments(numberOfSegments); - string iorString = _orb->object_to_string(NOS); - sprintf(objectId,"%d",NOS->GetId()); - _SMESHCorbaObj[string("Hypo_")+string(objectId)] = iorString; - } - else if (strcmp(aLine,"MaxElementArea")==0) { - SMESH::SMESH_Hypothesis_var myHyp = this->CreateHypothesis(aLine,studyId); - SMESH::SMESH_MaxElementArea_var MEA = SMESH::SMESH_MaxElementArea::_narrow( myHyp ); - fscanf(loadedFile,"%s",aLine); - maxElementsArea = atof(aLine); - MEA->SetMaxElementArea(maxElementsArea); - string iorString = _orb->object_to_string(MEA); - sprintf(objectId,"%d",MEA->GetId()); - _SMESHCorbaObj[string("Hypo_")+string(objectId)] = iorString; - } - else if (strcmp(aLine,"MaxElementVolume")==0) { - SMESH::SMESH_Hypothesis_var myHyp = this->CreateHypothesis(aLine,studyId); - SMESH::SMESH_MaxElementVolume_var MEV = SMESH::SMESH_MaxElementVolume::_narrow( myHyp ); - fscanf(loadedFile,"%s",aLine); - maxElementsVolume = atof(aLine); - MEV->SetMaxElementVolume(maxElementsVolume); - string iorString = _orb->object_to_string(MEV); - sprintf(objectId,"%d",MEV->GetId()); - _SMESHCorbaObj[string("Hypo_")+string(objectId)] = iorString; + SMESH_Hypothesis_i* myImpl = dynamic_cast( GetServant( myHyp ).in() ); + if ( myImpl ) { + myImpl->LoadFrom( hypdata.c_str() ); + string iorString = GetORB()->object_to_string( myHyp ); + int newId = myStudyContext->findId( iorString ); + myStudyContext->mapOldToNew( id, newId ); + } + else + MESSAGE( "VSR - SMESH_Gen::Load - can't get servant" ); } - - } - fclose(loadedFile); - delete[] aLine; - aLine = 0; - MESSAGE("End of Hypos Load"); - } -//*************** -// Loading of the Algorithms Branch -//*************** - else if (strcmp(name,"Algorithms")==0) { - - hdf_group[Tag_AlgorithmsRoot] = new HDFgroup(name,hdf_file); - hdf_group[Tag_AlgorithmsRoot]->OpenOnDisk(); - - hdf_group[Tag_AlgorithmsRoot]->InternalObjectIndentify(0,name_of_group); - hdf_dataset[cmpt_ds] = new HDFdataset(name_of_group,hdf_group[Tag_AlgorithmsRoot]); - hdf_dataset[cmpt_ds]->OpenOnDisk(); - size=hdf_dataset[cmpt_ds]->GetSize(); - - char * name_of_file =new char[size]; - hdf_dataset[cmpt_ds]->ReadFromDisk(name_of_file); - hdf_dataset[cmpt_ds]->CloseOnDisk(); - hdf_group[Tag_AlgorithmsRoot]->CloseOnDisk(); - cmpt_ds++; - delete[] name_of_file; - name_of_file = 0; - - aLine = new char[100]; - loadedFile = fopen( algofile.ToCString(),"r"); - while (!feof(loadedFile)) { - fscanf(loadedFile,"%s\n",aLine); - //SCRUTE(aLine); - if (strcmp(aLine,"")!=0) { - SMESH::SMESH_Hypothesis_var myHyp = this->CreateHypothesis(aLine,studyId); - SMESH::SMESH_Algo_var myAlgo = SMESH::SMESH_Algo::_narrow(myHyp); - string iorString = _orb->object_to_string(myAlgo); - sprintf(objectId,"%d",myAlgo->GetId()); - _SMESHCorbaObj[string("Hypo_")+string(objectId)] = iorString; + // close hypotheses root HDF group + aTopGroup->CloseOnDisk(); + } + + // --> then we should read&create algorithms + if ( aFile->ExistInternalObject( "Algorithms" ) ) { + // open algorithms root HDF group + aTopGroup = new HDFgroup( "Algorithms", aFile ); + aTopGroup->OpenOnDisk(); + + // 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 ]; + 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 ); + 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 ); + 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 + 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 (...) { + MESSAGE( "Exception during hypothesis creation" ); + } + + SMESH_Hypothesis_i* myImpl = dynamic_cast( GetServant( myHyp ).in() ); + if ( myImpl ) { + myImpl->LoadFrom( hypdata.c_str() ); + string iorString = GetORB()->object_to_string( myHyp ); + int newId = myStudyContext->findId( iorString ); + myStudyContext->mapOldToNew( id, newId ); + } + else + MESSAGE( "VSR - SMESH_Gen::Load - can't get servant" ); } } - fclose(loadedFile); - delete[] aLine; - aLine = 0; - MESSAGE("End of Algos Load"); - } + // close algorithms root HDF group + aTopGroup->CloseOnDisk(); + } -//*************** -// Loading of the Mesh Branch -//*************** - else if (string(name).substr(0,4)==string("Mesh")) { - MESSAGE("in mesh load"); - - Standard_Integer myMeshId = atoi((string(name).substr(5,5)).c_str()); - SCRUTE(myMeshId); + // --> the rest groups should be meshes + for ( int i = 0; i < aNbGroups; i++ ) { + // identify next group + char meshName[ HDF_NAME_MAX_LEN+1 ]; + 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; + + bool hasData = false; + + // 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 + 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; + string iorString = GetORB()->object_to_string( myNewMesh ); + int newId = myStudyContext->findId( iorString ); + myStudyContext->mapOldToNew( id, newId ); + + ::SMESH_Mesh& myLocMesh = myNewMeshImpl->GetImpl(); + SMESHDS_Mesh* mySMESHDSMesh = myLocMesh.GetMeshDS(); + + // try to find mesh data dataset + if ( aTopGroup->ExistInternalObject( "Has data" ) ) { + // load mesh "has data" flag + aDataset = new HDFdataset( "Has data", aTopGroup ); + aDataset->OpenOnDisk(); + size = aDataset->GetSize(); + char* strHasData = new char[ size ]; + aDataset->ReadFromDisk( strHasData ); + aDataset->CloseOnDisk(); + if ( strcmp( strHasData, "1") == 0 ) { + // read mesh data from MED file + myReader.SetMesh( mySMESHDSMesh ); + myReader.SetMeshId( id ); + myReader.ReadMySelf(); + hasData = true; + } + } - hdf_group[myMeshId] = new HDFgroup(name,hdf_file); - hdf_group[myMeshId]->OpenOnDisk(); + // try to read and set reference to shape + GEOM::GEOM_Shape_var aShape; + if ( aTopGroup->ExistInternalObject( "Ref on shape" ) ) { + // load mesh "Ref on shape" - it's an entry to SObject + aDataset = new HDFdataset( "Ref on shape", aTopGroup ); + aDataset->OpenOnDisk(); + size = aDataset->GetSize(); + char* refFromFile = new char[ size ]; + aDataset->ReadFromDisk( refFromFile ); + aDataset->CloseOnDisk(); + if ( strlen( refFromFile ) > 0 ) { + SALOMEDS::SObject_var shapeSO = myCurrentStudy->FindObjectID( refFromFile ); + + // Make sure GEOM data are loaded first + loadGeomData( shapeSO->GetFatherComponent() ); + + CORBA::Object_var shapeObject = SObjectToObject( shapeSO ); + if ( !CORBA::is_nil( shapeObject ) ) { + aShape = GEOM::GEOM_Shape::_narrow( shapeObject ); + if ( !aShape->_is_nil() ) + myNewMeshImpl->setShape( aShape ); + } + } + } - int nb_meshsubgroup = hdf_group[myMeshId]->nInternalObjects(); - SCRUTE(nb_meshsubgroup); - - //********** Loading of the file name where the data are stored - MESSAGE("Mesh data file"); - strcpy(name_of_group,"Mesh data"); - hdf_dataset[cmpt_ds]=new HDFdataset(name_of_group,hdf_group[myMeshId]); - hdf_dataset[cmpt_ds]->OpenOnDisk(); - size=hdf_dataset[cmpt_ds]->GetSize(); - - char * datafilename =new char[size]; - hdf_dataset[cmpt_ds]->ReadFromDisk(datafilename); - hdf_dataset[cmpt_ds]->CloseOnDisk(); - cmpt_ds++; - - //********** - //} - //else if (strcmp(msgname,"Ref on shape")==0) { - - //********** Loading of the reference on the shape - //********** and mesh initialization - MESSAGE("Ref on shape"); - strcpy(name_of_group,"Ref on shape"); - hdf_dataset[cmpt_ds] = new HDFdataset(name_of_group,hdf_group[myMeshId]); - hdf_dataset[cmpt_ds]->OpenOnDisk(); - size=hdf_dataset[cmpt_ds]->GetSize(); - - char * refFromFile =new char[size]; - hdf_dataset[cmpt_ds]->ReadFromDisk(refFromFile); - hdf_dataset[cmpt_ds]->CloseOnDisk(); - cmpt_ds++; - - Standard_CString myRefOnShape=""; //look for ref on shape - - bool _found = false; - SALOMEDS::SObject_var CSO = Study->FindObjectID(refFromFile); - SMESH::SMESH_Mesh_var myNewMesh; - GEOM::GEOM_Shape_var aShape; - - if (!CORBA::is_nil(CSO)) { - _found = true; - CSO->FindAttribute(anAttr, "AttributeIOR"); - anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); - char* ShapeIOR = anIOR->Value(); - aShape = GEOM::GEOM_Shape::_narrow(_orb->string_to_object(ShapeIOR)); + // try to get applied hypotheses + if ( aTopGroup->ExistInternalObject( "Applied Hypotheses" ) ) { + aGroup = new HDFgroup( "Applied Hypotheses", aTopGroup ); + aGroup->OpenOnDisk(); + // get number of applied hypotheses + int aNbSubObjects = aGroup->nInternalObjects(); + MESSAGE( "VSR - number of applied hypotheses = " << aNbSubObjects ); + for ( int j = 0; j < aNbSubObjects; j++ ) { + char name_dataset[ HDF_NAME_MAX_LEN+1 ]; + aGroup->InternalObjectIndentify( j, name_dataset ); + // check if it is a hypothesis + if ( string( name_dataset ).substr( 0, 3 ) == string( "Hyp" ) ) { + aDataset = new HDFdataset( name_dataset, aGroup ); + aDataset->OpenOnDisk(); + size = aDataset->GetSize(); + char* refFromFile = new char[ size ]; + aDataset->ReadFromDisk( refFromFile ); + aDataset->CloseOnDisk(); + + // san - it is impossible to recover applied hypotheses using their entries within Load() method - myNewMesh = this->Init(myGeomEngine,studyId,aShape); - string iorString = _orb->object_to_string(myNewMesh); - sprintf(objectId,"%d",myNewMesh->GetId()); - _SMESHCorbaObj[string("Mesh_")+string(objectId)] = iorString; - - //********** - //********** Loading of mesh data - if (strcmp(datafilename,"No data")!=0) { - - med_idt fid; - int ret; - - //**************************************************************************** - //* OUVERTURE DU FICHIER EN LECTURE * - //**************************************************************************** - - fid = MEDouvrir(datafilename,MED_LECT); - if (fid < 0) - { - printf(">> ERREUR : ouverture du fichier %s \n",datafilename); - exit(EXIT_FAILURE); + //SALOMEDS::SObject_var hypSO = myCurrentStudy->FindObjectID( refFromFile ); + //CORBA::Object_var hypObject = SObjectToObject( hypSO ); + int id = atoi( refFromFile ); + string anIOR = myStudyContext->getIORbyOldId( id ); + if ( !anIOR.empty() ) { + CORBA::Object_var hypObject = GetORB()->string_to_object( anIOR.c_str() ); + if ( !CORBA::is_nil( hypObject ) ) { + SMESH::SMESH_Hypothesis_var anHyp = SMESH::SMESH_Hypothesis::_narrow( hypObject ); + if ( !anHyp->_is_nil() && !aShape->_is_nil() ) + myNewMeshImpl->addHypothesis( aShape, anHyp ); + } + } } - else { - - StudyContext_iStruct* myStudyContext = _mapStudyContext_i[studyId]; - int meshId = myNewMesh->GetId(); - SMESH_Mesh_i* meshServant = myStudyContext->mapMesh_i[meshId]; - ::SMESH_Mesh& myLocMesh = meshServant->GetImpl(); - SMESHDS_Mesh* mySMESHDSMesh = myLocMesh.GetMeshDS(); - - DriverMED_R_SMESHDS_Mesh* myReader = new DriverMED_R_SMESHDS_Mesh; - - myReader->SetMesh(mySMESHDSMesh); - myReader->SetMeshId(myMeshId); - myReader->SetFileId(fid); - myReader->ReadMySelf(); - //SCRUTE(mySMESHDSMesh->NbNodes()); - //myNewMesh->ExportUNV("/tmp/test.unv");//only to check out - - //**************************************************************************** - //* FERMETURE DU FICHIER * - //**************************************************************************** - ret = MEDfermer(fid); - - if (ret != 0) - printf(">> ERREUR : erreur a la fermeture du fichier %s\n",datafilename); - } + aGroup->CloseOnDisk(); } - } - //********** - //} - //else if (strcmp(msgname,"Applied Hypothesis")==0) { - for (int ii=0;iiInternalObjectIndentify(ii,msgname); - if (strcmp(msgname,"Mesh data")==0) { - //nothing - } - else if (strcmp(msgname,"Ref on shape")==0) { - //nothing - } - else if (strcmp(msgname,"Applied Hypothesis")==0) { - //********** Loading of the applied hypothesis - strcpy(name_of_group,"Applied Hypothesis"); - hdf_subgroup[Tag_RefOnAppliedHypothesis] = new HDFgroup(name_of_group,hdf_group[myMeshId]); - hdf_subgroup[Tag_RefOnAppliedHypothesis]->OpenOnDisk(); - - nb_datasets = hdf_subgroup[Tag_RefOnAppliedHypothesis]->nInternalObjects(); - SCRUTE(nb_datasets); - - for (int j=0;jOpenOnDisk(); - size=hdf_dataset[cmpt_ds]->GetSize(); + + // try to get applied algorithms + if ( aTopGroup->ExistInternalObject( "Applied Algorithms" ) ) { + aGroup = new HDFgroup( "Applied Algorithms", aTopGroup ); + aGroup->OpenOnDisk(); + // get number of applied algorithms + int aNbSubObjects = aGroup->nInternalObjects(); + MESSAGE( "VSR - number of applied algos " << aNbSubObjects ); + for ( int j = 0; j < aNbSubObjects; j++ ) { + char name_dataset[ HDF_NAME_MAX_LEN+1 ]; + aGroup->InternalObjectIndentify( j, name_dataset ); + // check if it is an algorithm + if ( string( name_dataset ).substr( 0, 4 ) == string( "Algo" ) ) { + aDataset = new HDFdataset( name_dataset, aGroup ); + aDataset->OpenOnDisk(); + size = aDataset->GetSize(); + char* refFromFile = new char[ size ]; + aDataset->ReadFromDisk( refFromFile ); + aDataset->CloseOnDisk(); + + // san - it is impossible to recover applied algorithms using their entries within Load() method - char * refFromFile =new char[size]; - hdf_dataset[cmpt_ds]->ReadFromDisk(refFromFile); - //SCRUTE(refFromFile); - hdf_dataset[cmpt_ds]->CloseOnDisk(); - cmpt_ds++; - if (_found) { - SALOMEDS::SObject_var HypSO = Study->FindObjectID(refFromFile); - if (!CORBA::is_nil(HypSO)) { - HypSO->FindAttribute(anAttr, "AttributeIOR"); - anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); - if (!CORBA::is_nil(anIOR)) { - char* HypIOR = anIOR->Value(); - SMESH::SMESH_Hypothesis_var anHyp = SMESH::SMESH_Hypothesis::_narrow(_orb->string_to_object(HypIOR)); - if (!CORBA::is_nil(anHyp)) { - myNewMesh->AddHypothesis(aShape,anHyp); - MESSAGE("Hypothesis added ..."); - } - } + //SALOMEDS::SObject_var hypSO = myCurrentStudy->FindObjectID( refFromFile ); + //CORBA::Object_var hypObject = SObjectToObject( hypSO ); + int id = atoi( refFromFile ); + string anIOR = myStudyContext->getIORbyOldId( id ); + if ( !anIOR.empty() ) { + CORBA::Object_var hypObject = GetORB()->string_to_object( anIOR.c_str() ); + if ( !CORBA::is_nil( hypObject ) ) { + SMESH::SMESH_Hypothesis_var anHyp = SMESH::SMESH_Hypothesis::_narrow( hypObject ); + if ( !anHyp->_is_nil() && !aShape->_is_nil() ) + myNewMeshImpl->addHypothesis( aShape, anHyp ); } } - } - - hdf_subgroup[Tag_RefOnAppliedHypothesis]->CloseOnDisk(); - //********** + } } - else if (strcmp(msgname,"Applied Algorithms")==0) { + aGroup->CloseOnDisk(); + } - //********** Loading of the applied algorithms - strcpy(name_of_group,"Applied Algorithms"); - hdf_subgroup[Tag_RefOnAppliedAlgorithms] = new HDFgroup(name_of_group,hdf_group[myMeshId]); - hdf_subgroup[Tag_RefOnAppliedAlgorithms]->OpenOnDisk(); - - nb_datasets = hdf_subgroup[Tag_RefOnAppliedAlgorithms]->nInternalObjects(); - SCRUTE(nb_datasets); + // --> try to find submeshes containers for each type of submesh + for ( int j = GetSubMeshOnVertexTag(); j <= GetSubMeshOnCompoundTag(); j++ ) { + char name_meshgroup[ 30 ]; + if ( j == GetSubMeshOnVertexTag() ) + strcpy( name_meshgroup, "SubMeshes On Vertex" ); + else if ( j == GetSubMeshOnEdgeTag() ) + strcpy( name_meshgroup, "SubMeshes On Edge" ); + else if ( j == GetSubMeshOnFaceTag() ) + strcpy( name_meshgroup, "SubMeshes On Face" ); + else if ( j == GetSubMeshOnSolidTag() ) + strcpy( name_meshgroup, "SubMeshes On Solid" ); + else if ( j == GetSubMeshOnCompoundTag() ) + strcpy( name_meshgroup, "SubMeshes On Compound" ); + + // try to get submeshes container HDF group + if ( aTopGroup->ExistInternalObject( name_meshgroup ) ) { + // open submeshes containers HDF group + aGroup = new HDFgroup( name_meshgroup, aTopGroup ); + aGroup->OpenOnDisk(); - for (int j=0;jOpenOnDisk(); - size=hdf_dataset[cmpt_ds]->GetSize(); - - char * refFromFile =new char[size]; - hdf_dataset[cmpt_ds]->ReadFromDisk(refFromFile); - hdf_dataset[cmpt_ds]->CloseOnDisk(); - cmpt_ds++; - - if (_found) { - SALOMEDS::SObject_var AlgoSO = Study->FindObjectID(refFromFile); - if (!CORBA::is_nil(AlgoSO)) { - AlgoSO->FindAttribute(anAttr, "AttributeIOR"); - anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); - if (!CORBA::is_nil(anIOR)) { - char* AlgoIOR = anIOR->Value(); - //SCRUTE(AlgoIOR); - SMESH::SMESH_Hypothesis_var myHyp = SMESH::SMESH_Hypothesis::_narrow(_orb->string_to_object(AlgoIOR)); - SMESH::SMESH_Algo_var anAlgo = SMESH::SMESH_Algo::_narrow(myHyp); - //SMESH::SMESH_Algo_var anAlgo = SMESH::SMESH_Algo::_narrow(_orb->string_to_object(AlgoIOR)); - if (!CORBA::is_nil(anAlgo)) { - myNewMesh->AddHypothesis(aShape,anAlgo);//essayer avec _SMESHCorbaObj - MESSAGE("Algorithms added ..."); + // get number of submeshes + int aNbSubMeshes = aGroup->nInternalObjects(); + for ( int k = 0; k < aNbSubMeshes; k++ ) { + // identify submesh + char name_submeshgroup[ HDF_NAME_MAX_LEN+1 ]; + aGroup->InternalObjectIndentify( k, name_submeshgroup ); + if ( string( name_submeshgroup ).substr( 0, 7 ) == string( "SubMesh" ) ) { + // --> get submesh id + int subid = atoi( string( name_submeshgroup ).substr( 7 ).c_str() ); + if ( subid <= 0 ) + continue; + // open submesh HDF group + aSubGroup = new HDFgroup( name_submeshgroup, aGroup ); + aSubGroup->OpenOnDisk(); + + // try to read and set reference to subshape + GEOM::GEOM_Shape_var aSubShape; + SMESH::SMESH_subMesh_var aSubMesh; + + if ( aSubGroup->ExistInternalObject( "Ref on shape" ) ) { + // load submesh "Ref on shape" - it's an entry to SObject + aDataset = new HDFdataset( "Ref on shape", aSubGroup ); + aDataset->OpenOnDisk(); + size = aDataset->GetSize(); + char* refFromFile = new char[ size ]; + aDataset->ReadFromDisk( refFromFile ); + aDataset->CloseOnDisk(); + if ( strlen( refFromFile ) > 0 ) { + SALOMEDS::SObject_var subShapeSO = myCurrentStudy->FindObjectID( refFromFile ); + CORBA::Object_var subShapeObject = SObjectToObject( subShapeSO ); + if ( !CORBA::is_nil( subShapeObject ) ) { + aSubShape = GEOM::GEOM_Shape::_narrow( subShapeObject ); + if ( !aSubShape->_is_nil() ) + aSubMesh = SMESH::SMESH_subMesh::_duplicate + ( myNewMeshImpl->createSubMesh( aSubShape ) ); + if ( aSubMesh->_is_nil() ) + continue; + string iorSubString = GetORB()->object_to_string( aSubMesh ); + int newSubId = myStudyContext->findId( iorSubString ); + myStudyContext->mapOldToNew( subid, newSubId ); } } } - } - } - - hdf_subgroup[Tag_RefOnAppliedAlgorithms]->CloseOnDisk(); - - //********** - } - else if (string(msgname).substr(0,9)==string("SubMeshes")) { - - - //********** Loading of the submeshes on subshapes - int myLevel1Tag, myTag; - SCRUTE(msgname); - cmpt_sm++; - myLevel1Tag = 10+cmpt_sm; - hdf_subgroup[myLevel1Tag] = new HDFgroup(name_of_group,hdf_group[myMeshId]); - hdf_subgroup[myLevel1Tag] = new HDFgroup(msgname,hdf_group[myMeshId]); - hdf_subgroup[myLevel1Tag]->OpenOnDisk(); - - int nb_submeshes = hdf_subgroup[myLevel1Tag]->nInternalObjects(); - SCRUTE(nb_submeshes); - - for (int j=0;jInternalObjectIndentify(j,name_meshgroup); - SCRUTE(name_meshgroup); - - hdf_subgroup[myTag] = new HDFgroup(name_meshgroup,hdf_subgroup[myLevel1Tag]); - hdf_subgroup[myTag]->OpenOnDisk(); - int subMeshId = atoi((string(name_meshgroup).substr(8,18)).c_str()); - - MESSAGE("Ref on shape"); - //********** ref on shape - sprintf(name_dataset,"Ref on shape"); - hdf_dataset[cmpt_ds] = new HDFdataset(name_dataset,hdf_subgroup[myTag]); - hdf_dataset[cmpt_ds]->OpenOnDisk(); - size=hdf_dataset[cmpt_ds]->GetSize(); - - char * refFromFile =new char[size]; - hdf_dataset[cmpt_ds]->ReadFromDisk(refFromFile); - hdf_dataset[cmpt_ds]->CloseOnDisk(); - cmpt_ds++; - - bool _found3 = false; - SALOMEDS::SObject_var GSO = Study->FindObjectID(refFromFile); - SMESH::SMESH_subMesh_var aSubMesh; - GEOM::GEOM_Shape_var aSubShape; - - if (!CORBA::is_nil(GSO)) { - GSO->FindAttribute(anAttr, "AttributeIOR"); - anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); - char* SubShapeIOR = anIOR->Value(); - aSubShape = GEOM::GEOM_Shape::_narrow(_orb->string_to_object(SubShapeIOR)); - if (!CORBA::is_nil(aSubShape)) { - aSubMesh = myNewMesh->GetElementsOnShape(aSubShape); - string iorString = _orb->object_to_string(aSubMesh); - sprintf(objectId,"%d",subMeshId); - _SMESHCorbaObj[string("SubMesh_")+string(objectId)] = iorString; - _found3 = true; - //SCRUTE(aSubMesh->GetNumberOfNodes()); - //MESSAGE("yes"); - //SCRUTE(aSubMesh->GetNumberOfElements()); - } - } + if ( aSubMesh->_is_nil() ) + continue; + + // VSR: Get submesh data from MED convertor +// int anInternalSubmeshId = aSubMesh->GetId(); // this is not a persistent ID, it's an internal one computed from sub-shape +// if (myNewMeshImpl->_mapSubMesh.find(anInternalSubmeshId) != myNewMeshImpl->_mapSubMesh.end()) { +// MESSAGE("VSR - SMESH_Gen_i::Load(): loading from MED file submesh with ID = " << +// subid << " for subshape # " << anInternalSubmeshId); +// SMESHDS_SubMesh* aSubMeshDS = +// myNewMeshImpl->_mapSubMesh[anInternalSubmeshId]->CreateSubMeshDS(); +// if ( !aSubMeshDS ) { +// MESSAGE("VSR - SMESH_Gen_i::Load(): FAILED to create a submesh for subshape # " << +// anInternalSubmeshId << " in current mesh!"); +// } +// else +// myReader.GetSubMesh( aSubMeshDS, subid ); +// } - int nb_subgroup = hdf_subgroup[myTag]->nInternalObjects(); - SCRUTE(nb_subgroup); - for (int k=0;kInternalObjectIndentify(k,sgname); - if (strcmp(sgname,"Ref on shape")==0) { - //nothing - } - else if (strcmp(sgname,"Applied Hypothesis")==0) { - //********** ref on applied hypothesis - MESSAGE("Applied Hypothesis"); - strcpy(name_meshgroup,"Applied Hypothesis"); - cmpt_sm++; - hdf_subgroup[10+cmpt_sm] = new HDFgroup(name_meshgroup,hdf_subgroup[myTag]); - hdf_subgroup[10+cmpt_sm]->OpenOnDisk(); - nb_datasets = hdf_subgroup[10+cmpt_sm]->nInternalObjects(); - SCRUTE(nb_datasets); - - for (int l=0;lOpenOnDisk(); - size=hdf_dataset[cmpt_ds]->GetSize(); + // try to get applied hypotheses + if ( aSubGroup->ExistInternalObject( "Applied Hypotheses" ) ) { + // open "applied hypotheses" HDF group + aSubSubGroup = new HDFgroup( "Applied Hypotheses", aSubGroup ); + aSubSubGroup->OpenOnDisk(); + // get number of applied hypotheses + int aNbSubObjects = aSubSubGroup->nInternalObjects(); + for ( int l = 0; l < aNbSubObjects; l++ ) { + char name_dataset[ HDF_NAME_MAX_LEN+1 ]; + aSubSubGroup->InternalObjectIndentify( l, name_dataset ); + // check if it is a hypothesis + if ( string( name_dataset ).substr( 0, 3 ) == string( "Hyp" ) ) { + aDataset = new HDFdataset( name_dataset, aSubSubGroup ); + aDataset->OpenOnDisk(); + size = aDataset->GetSize(); + char* refFromFile = new char[ size ]; + aDataset->ReadFromDisk( refFromFile ); + aDataset->CloseOnDisk(); - char * refFromFile =new char[size]; - hdf_dataset[cmpt_ds]->ReadFromDisk(refFromFile); - hdf_dataset[cmpt_ds]->CloseOnDisk(); - cmpt_ds++; - - if (_found3) { - SALOMEDS::SObject_var HypSO = Study->FindObjectID(refFromFile); - if (!CORBA::is_nil(HypSO)) { - HypSO->FindAttribute(anAttr, "AttributeIOR"); - anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); - if (!CORBA::is_nil(anIOR)) { - char* HypIOR = anIOR->Value(); - SMESH::SMESH_Hypothesis_var anHyp = SMESH::SMESH_Hypothesis::_narrow(_orb->string_to_object(HypIOR)); - if (!CORBA::is_nil(anHyp)) { - SMESH::SMESH_Mesh_var aMesh = aSubMesh->GetFather(); - aMesh->AddHypothesis(aSubShape,anHyp);//essayer avec _SMESHCorbaObj - MESSAGE("Hypothesis added ..."); - } - } + //SALOMEDS::SObject_var hypSO = myCurrentStudy->FindObjectID( refFromFile ); + //CORBA::Object_var hypObject = SObjectToObject( hypSO ); + int id = atoi( refFromFile ); + string anIOR = myStudyContext->getIORbyOldId( id ); + if ( !anIOR.empty() ) { + CORBA::Object_var hypObject = GetORB()->string_to_object( anIOR.c_str() ); + if ( !CORBA::is_nil( hypObject ) ) { + SMESH::SMESH_Hypothesis_var anHyp = SMESH::SMESH_Hypothesis::_narrow( hypObject ); + if ( !anHyp->_is_nil() && !aShape->_is_nil() ) + myNewMeshImpl->addHypothesis( aSubShape, anHyp ); } } - } + } } - else if (strcmp(sgname,"Applied Algorithms")==0) { - //********** ref on applied algorithms - MESSAGE("Applied Algorithms"); - strcpy(name_meshgroup,"Applied Algorithms"); - cmpt_sm++; - hdf_subgroup[10+cmpt_sm] = new HDFgroup(name_meshgroup,hdf_subgroup[myTag]); - hdf_subgroup[10+cmpt_sm]->OpenOnDisk(); - nb_datasets = hdf_subgroup[10+cmpt_sm]->nInternalObjects(); - SCRUTE(nb_datasets); - - for (int l=0;lOpenOnDisk(); - size=hdf_dataset[cmpt_ds]->GetSize(); - - char * refFromFile =new char[size]; - hdf_dataset[cmpt_ds]->ReadFromDisk(refFromFile); - hdf_dataset[cmpt_ds]->CloseOnDisk(); - cmpt_ds++; - - if (_found3) { - SALOMEDS::SObject_var AlgoSO = Study->FindObjectID(refFromFile); - if (!CORBA::is_nil(AlgoSO)) { - AlgoSO->FindAttribute(anAttr, "AttributeIOR"); - anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); - if (!CORBA::is_nil(anIOR)) { - char* AlgoIOR = anIOR->Value(); - //SCRUTE(AlgoIOR); - SMESH::SMESH_Hypothesis_var myHyp = SMESH::SMESH_Hypothesis::_narrow(_orb->string_to_object(AlgoIOR)); - SMESH::SMESH_Algo_var anAlgo = SMESH::SMESH_Algo::_narrow(myHyp); - //SMESH::SMESH_Algo_var anAlgo = SMESH::SMESH_Algo::_narrow(_orb->string_to_object(AlgoIOR)); - if (!CORBA::is_nil(anAlgo)) { - SMESH::SMESH_Mesh_var aMesh = aSubMesh->GetFather(); - aMesh->AddHypothesis(aSubShape,anAlgo);//essayer avec _SMESHCorbaObj - MESSAGE("Algorithms added ..."); - } - } + // close "applied hypotheses" HDF group + aSubSubGroup->CloseOnDisk(); + } + + // try to get applied algorithms + if ( aSubGroup->ExistInternalObject( "Applied Algorithms" ) ) { + // open "applied algorithms" HDF group + aSubSubGroup = new HDFgroup( "Applied Algorithms", aSubGroup ); + aSubSubGroup->OpenOnDisk(); + // get number of applied algorithms + int aNbSubObjects = aSubSubGroup->nInternalObjects(); + for ( int l = 0; l < aNbSubObjects; l++ ) { + char name_dataset[ HDF_NAME_MAX_LEN+1 ]; + aSubSubGroup->InternalObjectIndentify( l, name_dataset ); + // check if it is an algorithm + if ( string( name_dataset ).substr( 0, 4 ) == string( "Algo" ) ) { + aDataset = new HDFdataset( name_dataset, aSubSubGroup ); + aDataset->OpenOnDisk(); + size = aDataset->GetSize(); + char* refFromFile = new char[ size ]; + aDataset->ReadFromDisk( refFromFile ); + aDataset->CloseOnDisk(); + + //SALOMEDS::SObject_var hypSO = myCurrentStudy->FindObjectID( refFromFile ); + //CORBA::Object_var hypObject = SObjectToObject( hypSO ); + int id = atoi( refFromFile ); + string anIOR = myStudyContext->getIORbyOldId( id ); + if ( !anIOR.empty() ) { + CORBA::Object_var hypObject = GetORB()->string_to_object( anIOR.c_str() ); + if ( !CORBA::is_nil( hypObject ) ) { + SMESH::SMESH_Hypothesis_var anHyp = SMESH::SMESH_Hypothesis::_narrow( hypObject ); + if ( !anHyp->_is_nil() && !aShape->_is_nil() ) + myNewMeshImpl->addHypothesis( aSubShape, anHyp ); } } - - } + } } + // close "applied algorithms" HDF group + aSubSubGroup->CloseOnDisk(); } - hdf_subgroup[myTag]->CloseOnDisk(); + + // close submesh HDF group + aSubGroup->CloseOnDisk(); + } } - hdf_subgroup[myLevel1Tag]->CloseOnDisk(); + // close submeshes containers HDF group + aGroup->CloseOnDisk(); } } - hdf_group[myMeshId]->CloseOnDisk(); - - MESSAGE("End of Meshes Load"); + + if(hasData){ + // Read sub-meshes from MED + MESSAGE("JFA - Create all sub-meshes"); + myReader.CreateAllSubMeshes(); + } + + // Recompute State (as computed sub-meshes are restored from MED) + if ( !aShape->_is_nil() ) { + MESSAGE("JFA - Compute State Engine ..."); +// map::iterator anAllSubMeshes = myNewMeshImpl->_mapSubMesh.begin(); +// for (; anAllSubMeshes != myNewMeshImpl->_mapSubMesh.end(); anAllSubMeshes++) +// { +// (*anAllSubMeshes).second->GetSubMeshDS(); // init SMESH_subMesh::_meshDS +// (*anAllSubMeshes).second->ComputeStateEngine(SMESH_subMesh::SUBMESH_RESTORED); +// } + TopoDS_Shape myLocShape = GetShapeReader()->GetShape( GetGeomEngine(), aShape ); + myNewMeshImpl->GetImpl().GetSubMesh(myLocShape)->ComputeStateEngine(SMESH_subMesh::SUBMESH_RESTORED); + MESSAGE("JFA - Compute State Engine finished"); + } + + // try to get groups + for ( int ii = GetNodeGroupsTag(); ii <= GetVolumeGroupsTag(); ii++ ) { + char name_group[ 30 ]; + if ( ii == GetNodeGroupsTag() ) + strcpy( name_group, "Groups of Nodes" ); + else if ( ii == GetEdgeGroupsTag() ) + strcpy( name_group, "Groups of Edges" ); + else if ( ii == GetFaceGroupsTag() ) + strcpy( name_group, "Groups of Faces" ); + else if ( ii == GetVolumeGroupsTag() ) + strcpy( name_group, "Groups of Volumes" ); + + if ( aTopGroup->ExistInternalObject( name_group ) ) { + aGroup = new HDFgroup( name_group, aTopGroup ); + aGroup->OpenOnDisk(); + // get number of groups + int aNbSubObjects = aGroup->nInternalObjects(); + for ( int j = 0; j < aNbSubObjects; j++ ) { + char name_dataset[ HDF_NAME_MAX_LEN+1 ]; + aGroup->InternalObjectIndentify( j, name_dataset ); + // check if it is an group + if ( string( name_dataset ).substr( 0, 5 ) == string( "Group" ) ) { + // --> get group id + int subid = atoi( string( name_dataset ).substr( 5 ).c_str() ); + if ( subid <= 0 ) + continue; + aDataset = new HDFdataset( name_dataset, aGroup ); + aDataset->OpenOnDisk(); + + // Retrieve actual group name + size = aDataset->GetSize(); + char* nameFromFile = new char[ size ]; + aDataset->ReadFromDisk( nameFromFile ); + aDataset->CloseOnDisk(); + + // Create group servant + SMESH::SMESH_Group_var aNewGroup = SMESH::SMESH_Group::_duplicate + ( myNewMeshImpl->createGroup( (SMESH::ElementType)(ii - GetNodeGroupsTag() + 1), + nameFromFile ) ); + // Obtain a SMESHDS_Group object + if ( aNewGroup->_is_nil() ) + continue; + + string iorSubString = GetORB()->object_to_string( aNewGroup ); + int newSubId = myStudyContext->findId( iorSubString ); + myStudyContext->mapOldToNew( subid, newSubId ); + + SMESH_Group_i* aGroupImpl = dynamic_cast( GetServant( aNewGroup ).in() ); + if ( !aGroupImpl ) + continue; + + SMESH_Group* aLocalGroup = myLocMesh.GetGroup( aGroupImpl->GetLocalID() ); + if ( !aLocalGroup ) + continue; + + SMESHDS_Group* aGroupDS = aLocalGroup->GetGroupDS(); + aGroupDS->SetStoreName( name_dataset ); + + // Fill group with contents from MED file + myReader.GetGroup( aGroupDS ); + } + } + aGroup->CloseOnDisk(); + } + } + } + // close mesh group + aTopGroup->CloseOnDisk(); } } - - MESSAGE("End of SMESH_Gen::Load"); - - hdf_file->CloseOnDisk(); - delete hdf_file; - hdf_file=0; + } + // close HDF file + aFile->CloseOnDisk(); + delete aFile; // Remove temporary files created from the stream - if (isMultiFile) SALOMEDS_Tool::RemoveTemporaryFiles(tmpDir.ToCString(), aFileSeq.in(), true); + if ( !isMultiFile ) + SALOMEDS_Tool::RemoveTemporaryFiles( tmpDir.ToCString(), aFileSeq.in(), true ); + INFOS( "SMESH_Gen_i::Load completed" ); return true; } -bool SMESH_Gen_i::LoadASCII(SALOMEDS::SComponent_ptr theComponent, - const SALOMEDS::TMPFile& theStream, - const char* theURL, - bool isMultiFile) { - return Load(theComponent, theStream, theURL, isMultiFile); +//============================================================================= +/*! + * SMESH_Gen_i::LoadASCII + * + * Load SMESH module's data in ASCII format (not implemented yet) + */ +//============================================================================= + +bool SMESH_Gen_i::LoadASCII( SALOMEDS::SComponent_ptr theComponent, + const SALOMEDS::TMPFile& theStream, + const char* theURL, + bool isMultiFile ) { + MESSAGE( "SMESH_Gen_i::LoadASCII" ); + return Load( theComponent, theStream, theURL, isMultiFile ); } //============================================================================= /*! - * + * SMESH_Gen_i::Close + * + * Clears study-connected data when it is closed */ //============================================================================= -void SMESH_Gen_i::Close(SALOMEDS::SComponent_ptr theComponent) +void SMESH_Gen_i::Close( SALOMEDS::SComponent_ptr theComponent ) { - MESSAGE("Close"); - SALOMEDS::Study_var aStudy = theComponent->GetStudy(); - SALOMEDS::ChildIterator_var itBig = aStudy->NewChildIterator(theComponent); - for (; itBig->More();itBig->Next()) { - SALOMEDS::SObject_var gotBranch = itBig->Value(); - - // branch 1 : hypothesis - if (gotBranch->Tag()==Tag_HypothesisRoot || gotBranch->Tag()==Tag_AlgorithmsRoot) { - SALOMEDS::ChildIterator_var it = aStudy->NewChildIterator(gotBranch); - for (; it->More();it->Next()) { - SALOMEDS::SObject_var mySObject = it->Value(); - SALOMEDS::GenericAttribute_var anAttr; - SALOMEDS::AttributeIOR_var anIOR; - if ( mySObject->FindAttribute(anAttr, "AttributeIOR")) { - anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); - SMESH::SMESH_Hypothesis_var myHyp = - SMESH::SMESH_Hypothesis::_narrow(_orb->string_to_object(anIOR->Value())); - char objectId[10]; - sprintf(objectId,"%d",myHyp->GetId()); -// cout<<"********** delete Hyp "<string_to_object(anIOR->Value())); - } - } - } - // branch 2 : algorithms - else if (gotBranch->Tag()>=3) { - SALOMEDS::ChildIterator_var it = aStudy->NewChildIterator(gotBranch); - for (; it->More();it->Next()) { - SALOMEDS::SObject_var mySObject = it->Value(); - SALOMEDS::GenericAttribute_var anAttr; - SALOMEDS::AttributeIOR_var anIOR; - if ( mySObject->FindAttribute(anAttr, "AttributeIOR")) { - anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); - SMESH::SMESH_Mesh_var myMesh = - SMESH::SMESH_Mesh::_narrow(_orb->string_to_object(anIOR->Value())); - if (!myMesh->_is_nil()) { - char objectId[10]; - sprintf(objectId,"%d",myMesh->GetId()); -// cout<<"********** delete Mesh "<string_to_object(anIOR->Value())); - if (!mySubMesh->_is_nil()) { - char objectId[10]; - sprintf(objectId,"%d",mySubMesh->GetId()); -// cout<<"********** delete SubMesh "<StudyId(); + if ( myStudyContextMap.find( studyId ) != myStudyContextMap.end() ) { + delete myStudyContextMap[ studyId ]; + myStudyContextMap.erase( studyId ); } + return; } //============================================================================= /*! - * + * SMESH_Gen_i::ComponentDataType + * + * Get component data type */ //============================================================================= char* SMESH_Gen_i::ComponentDataType() { - MESSAGE("SMESH_Gen_i::ComponentDataType"); - return strdup("SMESH"); + MESSAGE( "SMESH_Gen_i::ComponentDataType" ); + return strdup( "SMESH" ); } //============================================================================= /*! + * SMESH_Gen_i::IORToLocalPersistentID * + * Transform data from transient form to persistent */ //============================================================================= -char* SMESH_Gen_i::IORToLocalPersistentID(SALOMEDS::SObject_ptr theSObject, - const char* IORString, - CORBA::Boolean isMultiFile, - CORBA::Boolean isASCII) +char* SMESH_Gen_i::IORToLocalPersistentID( SALOMEDS::SObject_ptr theSObject, + const char* IORString, + CORBA::Boolean isMultiFile, + CORBA::Boolean isASCII ) { - MESSAGE("SMESH_Gen_i::IORToLocalPersistentID"); + MESSAGE( "SMESH_Gen_i::IORToLocalPersistentID" ); + StudyContext* myStudyContext = GetCurrentStudyContext(); + + if ( strcmp( IORString, "" ) != 0 ) { + int anId = myStudyContext->findId( IORString ); + if ( anId ) { + MESSAGE( "VSR " << anId ) + char strId[ 20 ]; + sprintf( strId, "%d", anId ); + return CORBA::string_dup( strId ); + } + } + return strdup( "" ); +} - char objectId[10]; +//============================================================================= +/*! + * SMESH_Gen_i::LocalPersistentIDToIOR + * + * Transform data from persistent form to transient + */ +//============================================================================= - SMESH::SMESH_Algo_var myAlgo = SMESH::SMESH_Algo::_narrow(_orb->string_to_object(IORString)); - if (! CORBA::is_nil(myAlgo)) - { - string prefix = "Hypo_"; - sprintf(objectId,"%d",myAlgo->GetId()); - string lpID = prefix + string(objectId); - return CORBA::string_dup(lpID.c_str()); - } - else { - SMESH::SMESH_Hypothesis_var myHypo = SMESH::SMESH_Hypothesis::_narrow(_orb->string_to_object(IORString)); - if (! CORBA::is_nil(myHypo)) - { - string prefix = "Hypo_"; - sprintf(objectId,"%d",myHypo->GetId()); - string lpID = prefix + string(objectId); - return CORBA::string_dup(lpID.c_str()); - } - else { - SMESH::SMESH_Mesh_var myMesh = SMESH::SMESH_Mesh::_narrow(_orb->string_to_object(IORString)); - if (! CORBA::is_nil(myMesh)) - { - string prefix = "Mesh_"; - sprintf(objectId,"%d",myMesh->GetId()); - string lpID = prefix + string(objectId); - return CORBA::string_dup(lpID.c_str()); - } - else { - SMESH::SMESH_subMesh_var mySubMesh = SMESH::SMESH_subMesh::_narrow(_orb->string_to_object(IORString)); - if (! CORBA::is_nil(mySubMesh)) - { - string prefix = "SubMesh_"; - sprintf(objectId,"%d",mySubMesh->GetId()); - string lpID = prefix + string(objectId); - return CORBA::string_dup(lpID.c_str()); - } - else return (strdup("no object")); - } - } +char* SMESH_Gen_i::LocalPersistentIDToIOR( SALOMEDS::SObject_ptr theSObject, + const char* aLocalPersistentID, + CORBA::Boolean isMultiFile, + CORBA::Boolean isASCII ) +{ + MESSAGE( "SMESH_Gen_i::LocalPersistentIDToIOR(): id = " << aLocalPersistentID ); + StudyContext* myStudyContext = GetCurrentStudyContext(); + + if ( strcmp( aLocalPersistentID, "" ) != 0 ) { + int anId = atoi( aLocalPersistentID ); + return CORBA::string_dup( myStudyContext->getIORbyOldId( anId ).c_str() ); } + return strdup( "" ); } //============================================================================= /*! - * + * SMESH_Gen_i::CanPublishInStudy + * + * Returns true if object can be published in the study */ //============================================================================= -char* SMESH_Gen_i::LocalPersistentIDToIOR(SALOMEDS::SObject_ptr theSObject, - const char* aLocalPersistentID, - CORBA::Boolean isMultiFile, - CORBA::Boolean isASCII) +bool SMESH_Gen_i::CanPublishInStudy(CORBA::Object_ptr theIOR) { - MESSAGE("SMESH_Gen_i::LocalPersistentIDToIOR"); - SCRUTE(aLocalPersistentID); - string clef = string(aLocalPersistentID); - SCRUTE(_SMESHCorbaObj[clef].c_str()); - return CORBA::string_dup(_SMESHCorbaObj[clef].c_str()); + SMESH::SMESH_Mesh_var aMesh = SMESH::SMESH_Mesh::_narrow(theIOR); + if( !aMesh->_is_nil() ) + return true; + + SMESH::SMESH_subMesh_var aSubMesh = SMESH::SMESH_subMesh::_narrow(theIOR); + if( !aSubMesh->_is_nil() ) + return true; + + SMESH::SMESH_Hypothesis_var aHyp = SMESH::SMESH_Hypothesis::_narrow(theIOR); + if( !aHyp->_is_nil() ) + return true; + + SMESH::SMESH_Group_var aGroup = SMESH::SMESH_Group::_narrow(theIOR); + if( !aGroup->_is_nil() ) + return true; + + return false; } //============================================================================= /*! - * + * SMESH_Gen_i::PublishInStudy + * + * Publish object in the study */ //============================================================================= -SMESH_topo* SMESH_Gen_i::ExploreMainShape(GEOM::GEOM_Gen_ptr geomEngine, - CORBA::Long studyId, - GEOM::GEOM_Shape_ptr aShape) +SALOMEDS::SObject_ptr SMESH_Gen_i::PublishInStudy(SALOMEDS::Study_ptr theStudy, + SALOMEDS::SObject_ptr theSObject, + CORBA::Object_ptr theIOR, + const char* theName) +throw (SALOME::SALOME_Exception) { - MESSAGE("SMESH_Mesh_i::ExploreMainShape"); - // _narrow() duplicates the reference and check the type - GEOM::GEOM_Gen_var geom = GEOM::GEOM_Gen::_narrow(geomEngine); - GEOM::GEOM_Shape_var myShape = GEOM::GEOM_Shape::_narrow(aShape); - - if (CORBA::is_nil(geom)) - THROW_SALOME_CORBA_EXCEPTION("bad geom reference", \ - SALOME::BAD_PARAM); - if (CORBA::is_nil(myShape)) - THROW_SALOME_CORBA_EXCEPTION("bad shape reference", \ - SALOME::BAD_PARAM); - MESSAGE("---"); - SCRUTE(myShape->Name()); - geom->GetCurrentStudy(studyId); - SCRUTE(studyId); - TopoDS_Shape mainShape = _ShapeReader->GetShape(geom,myShape); - MESSAGE("---"); - - // create an SMESH_topo object for the mainShape - - SMESH_topo* myTopo = new SMESH_topo(); - MESSAGE("---"); - - // explore local TopoDS_Shape, store reference of local TopoDS subShapes - - for (TopExp_Explorer exp(mainShape,TopAbs_COMPOUND); exp.More(); exp.Next()) - { - const TopoDS_Compound& E = TopoDS::Compound(exp.Current()); - int i = myTopo->_myShapes[TopAbs_COMPOUND].Add(E); - SCRUTE(i); - } - for (TopExp_Explorer exp(mainShape,TopAbs_COMPSOLID); exp.More(); exp.Next()) - { - const TopoDS_CompSolid& E = TopoDS::CompSolid(exp.Current()); - int i = myTopo->_myShapes[TopAbs_COMPSOLID].Add(E); - SCRUTE(i); - } - for (TopExp_Explorer exp(mainShape,TopAbs_SOLID); exp.More(); exp.Next()) - { - const TopoDS_Solid& E = TopoDS::Solid(exp.Current()); - int i = myTopo->_myShapes[TopAbs_SOLID].Add(E); - SCRUTE(i); - } - for (TopExp_Explorer exp(mainShape,TopAbs_SHELL); exp.More(); exp.Next()) - { - const TopoDS_Shell& E = TopoDS::Shell(exp.Current()); - int i = myTopo->_myShapes[TopAbs_SHELL].Add(E); - SCRUTE(i); - } - for (TopExp_Explorer exp(mainShape,TopAbs_FACE); exp.More(); exp.Next()) - { - const TopoDS_Face& E = TopoDS::Face(exp.Current()); - int i = myTopo->_myShapes[TopAbs_FACE].Add(E); - SCRUTE(i); + Unexpect aCatch(SALOME_SalomeException); + MESSAGE( "********** SMESH_Gen_i::PublishInStudy()" ); + SALOMEDS::SObject_var aSO; + + // san - first try to find SObject corresponding to SMESH component in theStudy + // It is dangerous to use FindComponent("MESH") for this, as some other component + // of type "MESH" might be present in theStudy. + // So component's user name obtained from ModuleCatalog is passed to FindObject()... + SALOME_ModuleCatalog::ModuleCatalog_var aCat = + SALOME_ModuleCatalog::ModuleCatalog::_narrow( GetNS()->Resolve("/Kernel/ModulCatalog") ); + if ( CORBA::is_nil( aCat ) ) + return aSO._retn(); + + SALOME_ModuleCatalog::Acomponent_var aComp = aCat->GetComponent( "SMESH" ); + if ( CORBA::is_nil( aComp ) ) + return aSO._retn(); + + SALOMEDS::SComponent_var father = + SALOMEDS::SComponent::_narrow( theStudy->FindObject( strdup( aComp->componentusername() ) ) ); + SALOMEDS::StudyBuilder_var aStudyBuilder = theStudy->NewBuilder(); + + SALOMEDS::GenericAttribute_var anAttr; + SALOMEDS::AttributeName_var aName; + SALOMEDS::AttributePixMap_var aPixmap; + + if ( father->_is_nil() ) { + father = aStudyBuilder->NewComponent( "MESH" ); + anAttr = aStudyBuilder->FindOrCreateAttribute( father, "AttributeName" ); + aName = SALOMEDS::AttributeName::_narrow( anAttr ); + aName ->SetValue( strdup( aComp->componentusername() ) ); + anAttr = aStudyBuilder->FindOrCreateAttribute( father, "AttributePixMap" ); + aPixmap = SALOMEDS::AttributePixMap::_narrow( anAttr ); + aPixmap ->SetPixMap( "ICON_OBJBROWSER_SMESH" ); + aStudyBuilder->DefineComponentInstance( father, SMESH_Gen::_this() ); + } + + if ( father->_is_nil() ) + return aSO._retn(); + + SALOMEDS::AttributeIOR_var anIOR; + SALOMEDS::AttributeSelectable_var aSelAttr; + TCollection_AsciiString anObjName("obj"); + + // Publishing a mesh + SMESH::SMESH_Mesh_var aMesh = SMESH::SMESH_Mesh::_narrow( theIOR ); + if( !aMesh->_is_nil() ) { + // Find correct free tag + long aTag = FindMaxChildTag( father.in() ); + if ( aTag <= GetAlgorithmsRootTag() ) + aTag = GetAlgorithmsRootTag() + 1; + else + aTag++; + // Add New Mesh + SALOMEDS::SObject_var newMesh = aStudyBuilder->NewObjectToTag( father, aTag ); + anAttr = aStudyBuilder->FindOrCreateAttribute( newMesh, "AttributePixMap" ); + aPixmap = SALOMEDS::AttributePixMap::_narrow( anAttr ); + aPixmap ->SetPixMap( "ICON_SMESH_TREE_MESH" ); + anAttr = aStudyBuilder->FindOrCreateAttribute( newMesh, "AttributeIOR" ); + anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); + anIOR ->SetValue( GetORB()->object_to_string( aMesh ) ); + aSO = SALOMEDS::SObject::_narrow( newMesh ); + anObjName = TCollection_AsciiString( "Mesh" ); + } + + // Publishing a sub-mesh + SMESH::SMESH_subMesh_var aSubMesh = SMESH::SMESH_subMesh::_narrow( theIOR ); + if( aSO->_is_nil() && !aSubMesh->_is_nil() ) { + // try to obtain a parent mesh's SObject + MESSAGE( "********** SMESH_Gen_i::PublishInStudy(): publishing submesh..." ); + SALOMEDS::SObject_var aParentSO; + SMESH::SMESH_Mesh_var aParentMesh; + SMESH_subMesh_i* aServant = dynamic_cast( GetServant( aSubMesh ).in() ); + if ( aServant != NULL ) { + aParentMesh = aServant->_mesh_i->_this(); + if ( !aParentMesh->_is_nil() ) { + aParentSO = theStudy->FindObjectIOR( GetORB()->object_to_string( aParentMesh ) ); + } } - for (TopExp_Explorer exp(mainShape,TopAbs_WIRE); exp.More(); exp.Next()) - { - const TopoDS_Wire& E = TopoDS::Wire(exp.Current()); - int i = myTopo->_myShapes[TopAbs_WIRE].Add(E); - SCRUTE(i); + + // Find submesh sub-tree tag + if ( !aParentSO->_is_nil() ) { + long aRootTag = GetSubMeshOnVertexTag(); + char* aRootName = ""; + + SMESH_Mesh_i* aMeshServant = aServant->_mesh_i; + if ( aMeshServant->_mapSubMesh.find( aServant->GetId() ) != aMeshServant->_mapSubMesh.end() ) { + MESSAGE( "********** SMESH_Gen_i::PublishInStudy(): local submesh found" ) + SMESH_subMesh* aLocalSubMesh = aMeshServant->_mapSubMesh[aServant->GetId()]; + switch ( aLocalSubMesh->GetSubShape().ShapeType() ) { + case TopAbs_VERTEX: + aRootTag = GetSubMeshOnVertexTag(); + aRootName = "SubMeshes on Vertex"; + break; + case TopAbs_EDGE: + aRootTag = GetSubMeshOnEdgeTag(); + aRootName = "SubMeshes on Edge"; + break; + case TopAbs_FACE: + aRootTag = GetSubMeshOnFaceTag(); + aRootName = "SubMeshes on Face"; + break; + case TopAbs_SOLID: + aRootTag = GetSubMeshOnSolidTag(); + aRootName = "SubMeshes on Solid"; + break; + default: + aRootTag = GetSubMeshOnCompoundTag(); + aRootName = "SubMeshes on Compound"; + break; + } + } + + // Find or create submesh root + SALOMEDS::SObject_var aRootSO; + if ( !aParentSO->FindSubObject ( aRootTag, aRootSO ) ) { + MESSAGE( "********** SMESH_Gen_i::PublishInStudy(): creating submesh root..." ) + aRootSO = aStudyBuilder->NewObjectToTag( aParentSO, aRootTag ); + anAttr = aStudyBuilder->FindOrCreateAttribute( aRootSO, "AttributeName" ); + aName = SALOMEDS::AttributeName::_narrow( anAttr ); + aName ->SetValue( aRootName ); + anAttr = aStudyBuilder->FindOrCreateAttribute( aRootSO, "AttributeSelectable" ); + aSelAttr = SALOMEDS::AttributeSelectable::_narrow( anAttr ); + aSelAttr ->SetSelectable( false ); + } + + // Add new submesh to corresponding sub-tree + MESSAGE( "********** SMESH_Gen_i::PublishInStudy(): adding submesh to study..." ) + SALOMEDS::SObject_var newMesh = aStudyBuilder->NewObject( aRootSO ); + anAttr = aStudyBuilder->FindOrCreateAttribute( newMesh, "AttributePixMap" ); + aPixmap = SALOMEDS::AttributePixMap::_narrow( anAttr ); + aPixmap ->SetPixMap( "ICON_SMESH_TREE_MESH" ); + anAttr = aStudyBuilder->FindOrCreateAttribute( newMesh, "AttributeIOR" ); + anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); + anIOR ->SetValue( GetORB()->object_to_string( aSubMesh ) ); + aSO = SALOMEDS::SObject::_narrow( newMesh ); + anObjName = TCollection_AsciiString( "SubMesh" ); } - for (TopExp_Explorer exp(mainShape,TopAbs_EDGE); exp.More(); exp.Next()) - { - const TopoDS_Edge& E = TopoDS::Edge(exp.Current()); - int i = myTopo->_myShapes[TopAbs_EDGE].Add(E); - SCRUTE(i); + } + + // Publishing a hypothesis or algorithm + SMESH::SMESH_Hypothesis_var aHyp = SMESH::SMESH_Hypothesis::_narrow( theIOR ); + if( aSO->_is_nil() && !aHyp->_is_nil() ) { + //Find or Create Hypothesis root + SALOMEDS::SObject_var HypothesisRoot; + Standard_Integer aRootTag = + SMESH::SMESH_Algo::_narrow( theIOR )->_is_nil() ? GetHypothesisRootTag() : GetAlgorithmsRootTag(); + + if ( !father->FindSubObject ( aRootTag, HypothesisRoot ) ) { + HypothesisRoot = aStudyBuilder->NewObjectToTag( father, aRootTag ); + anAttr = aStudyBuilder->FindOrCreateAttribute( HypothesisRoot, "AttributeName" ); + aName = SALOMEDS::AttributeName::_narrow( anAttr ); + aName ->SetValue( aRootTag == GetHypothesisRootTag() ? "Hypotheses" : "Algorithms" ); + anAttr = aStudyBuilder->FindOrCreateAttribute( HypothesisRoot, "AttributeSelectable" ); + aSelAttr = SALOMEDS::AttributeSelectable::_narrow( anAttr ); + aSelAttr ->SetSelectable( false ); + anAttr = aStudyBuilder->FindOrCreateAttribute( HypothesisRoot, "AttributePixMap" ); + aPixmap = SALOMEDS::AttributePixMap::_narrow( anAttr ); + aPixmap ->SetPixMap( aRootTag == GetHypothesisRootTag() ? "ICON_SMESH_TREE_HYPO" : "ICON_SMESH_TREE_ALGO" ); } - for (TopExp_Explorer exp(mainShape,TopAbs_VERTEX); exp.More(); exp.Next()) - { - const TopoDS_Vertex& E = TopoDS::Vertex(exp.Current()); - int i = myTopo->_myShapes[TopAbs_VERTEX].Add(E); - SCRUTE(i); + + // Add New Hypothesis + string aPmName; + SALOMEDS::SObject_var newHypo = aStudyBuilder->NewObject( HypothesisRoot ); + anAttr = aStudyBuilder->FindOrCreateAttribute( newHypo, "AttributePixMap" ); + aPixmap = SALOMEDS::AttributePixMap::_narrow( anAttr ); + aPmName = ( aRootTag == GetHypothesisRootTag() ? "ICON_SMESH_TREE_HYPO_" : "ICON_SMESH_TREE_ALGO_" ); + aPmName += aHyp->GetName(); + aPixmap ->SetPixMap( aPmName.c_str() ); + anAttr = aStudyBuilder->FindOrCreateAttribute( newHypo, "AttributeIOR" ); + anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); + anIOR ->SetValue( GetORB()->object_to_string( aHyp ) ); + aSO = SALOMEDS::SObject::_narrow( newHypo ); + anObjName = TCollection_AsciiString( aHyp->GetName() ); + } + + // Publishing a group + SMESH::SMESH_Group_var aGroup = SMESH::SMESH_Group::_narrow(theIOR); + if( aSO->_is_nil() && !aGroup->_is_nil() ) { + // try to obtain a parent mesh's SObject + MESSAGE( "********** SMESH_Gen_i::PublishInStudy(): publishing group..." ); + SALOMEDS::SObject_var aParentSO; + SMESH::SMESH_Mesh_var aParentMesh; + SMESH_Group_i* aServant = dynamic_cast( GetServant( aGroup ).in() ); + if ( aServant != NULL ) { + aParentMesh = SMESH::SMESH_Mesh::_narrow( GetPOA()->servant_to_reference( aServant->GetMeshServant() ) ); + if ( !aParentMesh->_is_nil() ) { + MESSAGE( "********** SMESH_Gen_i::PublishInStudy(): publishing group: refernce to mesh is OK" ); + string anIOR = GetORB()->object_to_string( aParentMesh ); + MESSAGE( "********** SMESH_Gen_i::PublishInStudy(): publishing group: mesh IOR = "<FindObjectIOR( anIOR.c_str() ); + } } - - // explore subShapes of distant CORBA object, - // associate distant CORBA subShape references - // with local reference to local TopoDS subShape - string filenode = "toposhape.txt"; - ofstream fic(filenode.c_str()); + // Find proper group sub-tree tag + if ( !aParentSO->_is_nil() ) { + MESSAGE( "********** SMESH_Gen_i::PublishInStudy(): publishing group: parent mesh found" ); + int aType = (int)aGroup->GetType(); + const char* aRootNames[] = { "Compound Groups", "Groups of Nodes", "Groups of Edges", "Groups of Faces", "Groups of Volumes" }; + + // Currently, groups with heterogenous content are not supported + if ( aType != SMESH::ALL ) { + MESSAGE( "********** SMESH_Gen_i::PublishInStudy(): publishing group: group type OK" ); + long aRootTag = GetNodeGroupsTag() + aType - 1; + + // Find or create groups root + SALOMEDS::SObject_var aRootSO; + if ( !aParentSO->FindSubObject ( aRootTag, aRootSO ) ) { + MESSAGE( "********** SMESH_Gen_i::PublishInStudy(): creating groups root..." ) + aRootSO = aStudyBuilder->NewObjectToTag( aParentSO, aRootTag ); + anAttr = aStudyBuilder->FindOrCreateAttribute( aRootSO, "AttributeName" ); + aName = SALOMEDS::AttributeName::_narrow( anAttr ); + aName ->SetValue( aRootNames[aType] ); + anAttr = aStudyBuilder->FindOrCreateAttribute( aRootSO, "AttributeSelectable" ); + aSelAttr = SALOMEDS::AttributeSelectable::_narrow( anAttr ); + aSelAttr ->SetSelectable( false ); + } - for (int shapeType = TopAbs_COMPOUND; shapeType < TopAbs_SHAPE; shapeType++) - { - fic << "shape type : " << SMESH_shapeTypeNames[shapeType]; - - GEOM::GEOM_Gen::ListOfGeomShapes_var subShapes - = geom->SubShapeAll(myShape,shapeType); - int nbSubShapes = subShapes->length(); - int nbLocal = myTopo->_myShapes[shapeType].Extent(); - fic << " - number of elements: " << nbSubShapes << endl; - ASSERT(nbSubShapes == nbLocal); - - for (int i=0; i< nbSubShapes; i++) - { - GEOM::GEOM_Shape_var aSubShape = subShapes[i]; - string idShape = SMESH_topo::GetShapeLocalId(aSubShape); - fic << " " << idShape; - SCRUTE(idShape); - TopoDS_Shape aLocShape = _ShapeReader->GetShape(geom,aSubShape); - for (int j=1; j <= nbLocal; j++) - if (aLocShape.IsSame(myTopo->_myShapes[shapeType].FindKey(j))) - { - MESSAGE(" --- trouve = " << j); - myTopo->_mapIndShapes[shapeType][idShape] = j; - fic << " --- trouve = " << j; - break; - } - fic << endl; - } + // Add new group to corresponding sub-tree + MESSAGE( "********** SMESH_Gen_i::PublishInStudy(): adding group to study..." ) + SALOMEDS::SObject_var aGroupSO = aStudyBuilder->NewObject( aRootSO ); + anAttr = aStudyBuilder->FindOrCreateAttribute( aGroupSO, "AttributePixMap" ); + aPixmap = SALOMEDS::AttributePixMap::_narrow( anAttr ); + aPixmap ->SetPixMap( "ICON_SMESH_TREE_GROUP" ); + anAttr = aStudyBuilder->FindOrCreateAttribute( aGroupSO, "AttributeIOR" ); + anIOR = SALOMEDS::AttributeIOR::_narrow( anAttr ); + anIOR ->SetValue( GetORB()->object_to_string( aGroup ) ); + aSO = SALOMEDS::SObject::_narrow( aGroupSO ); + anObjName = TCollection_AsciiString( "Group" ); + } } - fic.close(); + } + + // Setting SObject's name + if ( !aSO->_is_nil() ) { + if ( strlen( theName ) == 0 ) + anObjName += TCollection_AsciiString( "_" ) + TCollection_AsciiString( aSO->Tag() ); + else + anObjName = TCollection_AsciiString( strdup( theName ) ); + anAttr = aStudyBuilder->FindOrCreateAttribute( aSO, "AttributeName" ); + aName = SALOMEDS::AttributeName::_narrow( anAttr ); + aName ->SetValue( anObjName.ToCString() ); + } - return myTopo; + MESSAGE( "********** SMESH_Gen_i::PublishInStudy(): COMPLETED" ) + return aSO._retn(); } //============================================================================= /*! - * C factory, accessible with dlsym, after dlopen + * SMESHEngine_factory + * + * C factory, accessible with dlsym, after dlopen */ //============================================================================= extern "C" { - PortableServer::ObjectId * SMESHEngine_factory( - CORBA::ORB_ptr orb, - PortableServer::POA_ptr poa, - PortableServer::ObjectId * contId, - const char *instanceName, - const char *interfaceName) + PortableServer::ObjectId* SMESHEngine_factory( CORBA::ORB_ptr orb, + PortableServer::POA_ptr poa, + PortableServer::ObjectId* contId, + const char* instanceName, + const char* interfaceName ) { - MESSAGE("PortableServer::ObjectId * SMESHEngine_factory()"); + MESSAGE( "PortableServer::ObjectId* SMESHEngine_factory()" ); SCRUTE(interfaceName); SMESH_Gen_i * mySMESH_Gen = new SMESH_Gen_i(orb, poa, contId, instanceName, interfaceName); diff --git a/src/SMESH_I/SMESH_Gen_i.hxx b/src/SMESH_I/SMESH_Gen_i.hxx index 1a0453285..77e3adf43 100644 --- a/src/SMESH_I/SMESH_Gen_i.hxx +++ b/src/SMESH_I/SMESH_Gen_i.hxx @@ -38,11 +38,8 @@ #include CORBA_CLIENT_HEADER(SALOMEDS) #include CORBA_CLIENT_HEADER(SALOMEDS_Attributes) - -class SMESH_Mesh_i; - -#include "SMESH_HypothesisFactory_i.hxx" #include "SMESH_Mesh_i.hxx" +#include "SMESH_Hypothesis_i.hxx" #include "SALOME_Component_i.hxx" #include "SALOME_NamingService.hxx" @@ -50,115 +47,268 @@ class SMESH_Mesh_i; #include "SMESH_topo.hxx" #include "GEOM_Client.hxx" -#include - #include -typedef struct studyContext_iStruct +class SMESH_Mesh_i; +class SALOME_LifeCycleCORBA; + +// =========================================================== +// Study context - stores study-connected objects references +// ========================================================== +class StudyContext { - map mapMesh_i; -} StudyContext_iStruct; +public: + // constructor + StudyContext() {} + // destructor + ~StudyContext() + { + mapIdToIOR.clear(); + mapIdToId.clear(); + } + // register object in the internal map and return its id + int addObject( string theIOR ) + { + int nextId = getNextId(); + mapIdToIOR[ nextId ] = theIOR; + return nextId; + } + // find the object id in the internal map by the IOR + int findId( string theIOR ) + { + map::iterator imap; + for ( imap = mapIdToIOR.begin(); imap != mapIdToIOR.end(); ++imap ) { + if ( imap->second == theIOR ) + return imap->first; + } + return 0; + } + // get object's IOR by id + string getIORbyId( const int theId ) + { + if ( mapIdToIOR.find( theId ) != mapIdToIOR.end() ) + return mapIdToIOR[ theId ]; + return string( "" ); + } + // get object's IOR by old id + string getIORbyOldId( const int theOldId ) + { + if ( mapIdToId.find( theOldId ) != mapIdToId.end() ) + return getIORbyId( mapIdToId[ theOldId ] ); + return string( "" ); + } + // maps old object id to the new one (used when restoring data) + void mapOldToNew( const int oldId, const int newId ) { + mapIdToId[ oldId ] = newId; + } + +private: + // get next free object identifier + int getNextId() + { + int id = 1; + while( mapIdToIOR.find( id ) != mapIdToIOR.end() ) + id++; + return id; + } + + map mapIdToIOR; // persistent-to-transient map + map mapIdToId; // used to translate object from persistent to transient form +}; +// =========================================================== +// SMESH module's engine +// ========================================================== class SMESH_Gen_i: - public POA_SMESH::SMESH_Gen, - public Engines_Component_i + public virtual POA_SMESH::SMESH_Gen, + public virtual Engines_Component_i { public: + // Get ORB object + static CORBA::ORB_var GetORB() { return myOrb;} + // Get SMESH module's POA object + static PortableServer::POA_var GetPOA() { return myPoa;} + // Get Naming Service object + static SALOME_NamingService* GetNS(); + // Get SALOME_LifeCycleCORBA object + static SALOME_LifeCycleCORBA* GetLCC(); + // Retrieve and get GEOM engine reference + static GEOM::GEOM_Gen_ptr GetGeomEngine(); + // Get object of the CORBA reference + static PortableServer::ServantBase_var GetServant( CORBA::Object_ptr theObject ); + // Get CORBA object corresponding to the SALOMEDS::SObject + static CORBA::Object_var SObjectToObject( SALOMEDS::SObject_ptr theSObject ); + // Default constructor SMESH_Gen_i(); - SMESH_Gen_i(CORBA::ORB_ptr orb, - PortableServer::POA_ptr poa, - PortableServer::ObjectId * contId, - const char *instanceName, - const char *interfaceName); + // Standard constructor + SMESH_Gen_i( CORBA::ORB_ptr orb, + PortableServer::POA_ptr poa, + PortableServer::ObjectId* contId, + const char* instanceName, + const char* interfaceName ); + // Destructor virtual ~SMESH_Gen_i(); - SMESH::SMESH_Hypothesis_ptr CreateHypothesis(const char* anHyp, - CORBA::Long studyId) - throw (SALOME::SALOME_Exception); + // ***************************************** + // Interface methods + // ***************************************** + + // Set current study + void SetCurrentStudy( SALOMEDS::Study_ptr theStudy ); + // Get current study + SALOMEDS::Study_ptr GetCurrentStudy(); + + // Create hypothesis/algorothm of given type + SMESH::SMESH_Hypothesis_ptr CreateHypothesis (const char* theHypType, + const char* theLibName) + throw ( SALOME::SALOME_Exception ); - SMESH::SMESH_Mesh_ptr Init(GEOM::GEOM_Gen_ptr geomEngine, - CORBA::Long studyId, - GEOM::GEOM_Shape_ptr aShape) - throw (SALOME::SALOME_Exception); - - CORBA::Boolean Compute(SMESH::SMESH_Mesh_ptr aMesh, - GEOM::GEOM_Shape_ptr aShape) - throw (SALOME::SALOME_Exception); - - CORBA::Boolean IsReadyToCompute(SMESH::SMESH_Mesh_ptr aMesh, - GEOM::GEOM_Shape_ptr aShape) - throw (SALOME::SALOME_Exception); - - SMESH::long_array* GetSubShapesId(GEOM::GEOM_Gen_ptr geomEngine, - CORBA::Long studyId, - GEOM::GEOM_Shape_ptr mainShape, - const SMESH::shape_array& listOfSubShape) - throw (SALOME::SALOME_Exception); - - - // inherited methods from SALOMEDS::Driver - - SALOMEDS::TMPFile* Save(SALOMEDS::SComponent_ptr theComponent, - const char* theURL, - bool isMultiFile); - bool Load(SALOMEDS::SComponent_ptr theComponent, - const SALOMEDS::TMPFile& theStream, - const char* theURL, - bool isMultiFile); - - SALOMEDS::TMPFile* SaveASCII(SALOMEDS::SComponent_ptr theComponent, - const char* theURL, - bool isMultiFile); - bool LoadASCII(SALOMEDS::SComponent_ptr theComponent, - const SALOMEDS::TMPFile& theStream, - const char* theURL, - bool isMultiFile); - - void Close(SALOMEDS::SComponent_ptr theComponent); + // Create empty mesh on a shape + SMESH::SMESH_Mesh_ptr CreateMesh( GEOM::GEOM_Shape_ptr theShape ) + throw ( SALOME::SALOME_Exception ); + + // Create mesh(es) and import data from MED file + SMESH::mesh_array* CreateMeshesFromMED( const char* theFileName, + SMESH::DriverMED_ReadStatus& theStatus ) + throw ( SALOME::SALOME_Exception ); + + // Compute mesh on a shape + CORBA::Boolean Compute( SMESH::SMESH_Mesh_ptr theMesh, + GEOM::GEOM_Shape_ptr theShape ) + throw ( SALOME::SALOME_Exception ); + + // Returns true if mesh contains enough data to be computed + CORBA::Boolean IsReadyToCompute( SMESH::SMESH_Mesh_ptr theMesh, + GEOM::GEOM_Shape_ptr theShape ) + throw ( SALOME::SALOME_Exception ); + + // Get sub-shapes unique ID's list + SMESH::long_array* GetSubShapesId( GEOM::GEOM_Shape_ptr theMainShape, + const SMESH::shape_array& theListOfSubShape ) + throw ( SALOME::SALOME_Exception ); + + + // **************************************************** + // Interface inherited methods (from SALOMEDS::Driver) + // **************************************************** + + // Save SMESH data + SALOMEDS::TMPFile* Save( SALOMEDS::SComponent_ptr theComponent, + const char* theURL, + bool isMultiFile ); + // Load SMESH data + bool Load( SALOMEDS::SComponent_ptr theComponent, + 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 ); + // Load SMESH data in ASCII format + bool LoadASCII( SALOMEDS::SComponent_ptr theComponent, + const SALOMEDS::TMPFile& theStream, + const char* theURL, + bool isMultiFile ); + + // Create filter manager + SMESH::FilterManager_ptr CreateFilterManager(); + + // Clears study-connected data when it is closed + void Close( SALOMEDS::SComponent_ptr theComponent ); + + // Get component data type char* ComponentDataType(); - char* IORToLocalPersistentID(SALOMEDS::SObject_ptr theSObject, - const char* IORString, - CORBA::Boolean isMultiFile, - CORBA::Boolean isASCII); - char* LocalPersistentIDToIOR(SALOMEDS::SObject_ptr theSObject, - const char* aLocalPersistentID, - CORBA::Boolean isMultiFile, - CORBA::Boolean isASCII); - - bool CanPublishInStudy(CORBA::Object_ptr theIOR) { return false; } - SALOMEDS::SObject_ptr PublishInStudy(SALOMEDS::Study_ptr theStudy, - SALOMEDS::SObject_ptr theSObject, - CORBA::Object_ptr theObject, - const char* theName) throw (SALOME::SALOME_Exception) { - SALOMEDS::SObject_var aResultSO; - return aResultSO._retn(); - } + // Transform data from transient form to persistent + char* IORToLocalPersistentID( SALOMEDS::SObject_ptr theSObject, + 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 ); + + // 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 ) + throw ( SALOME::SALOME_Exception ); - CORBA::Boolean CanCopy(SALOMEDS::SObject_ptr theObject) {return false;} - SALOMEDS::TMPFile* CopyFrom(SALOMEDS::SObject_ptr theObject, CORBA::Long& theObjectID) {return false;} - CORBA::Boolean CanPaste(const char* theComponentName, CORBA::Long theObjectID) {return false;} - SALOMEDS::SObject_ptr PasteInto(const SALOMEDS::TMPFile& theStream, - CORBA::Long theObjectID, - SALOMEDS::SObject_ptr theObject) { + // Copy-paste methods - returns true if object can be copied to the clipboard + CORBA::Boolean CanCopy( SALOMEDS::SObject_ptr theObject ) { return false; } + // Copy-paste methods - copy object to the clipboard + SALOMEDS::TMPFile* CopyFrom( SALOMEDS::SObject_ptr theObject, CORBA::Long& theObjectID ) { return false; } + // Copy-paste methods - returns true if object can be pasted from the clipboard + 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 ) { SALOMEDS::SObject_var aResultSO; return aResultSO._retn(); } - GEOM_Client* _ShapeReader; -protected: - SMESH_topo* ExploreMainShape(GEOM::GEOM_Gen_ptr geomEngine, - CORBA::Long studyId, - GEOM::GEOM_Shape_ptr aShape); + // ***************************************** + // Internal methods + // ***************************************** +public: + // Get shape reader + GEOM_Client* GetShapeReader(); + + // Tags definition + static long GetHypothesisRootTag(); + static long GetAlgorithmsRootTag(); + static long GetRefOnShapeTag(); + static long GetRefOnAppliedHypothesisTag(); + static long GetRefOnAppliedAlgorithmsTag(); + static long GetSubMeshOnVertexTag(); + static long GetSubMeshOnEdgeTag(); + static long GetSubMeshOnFaceTag(); + static long GetSubMeshOnSolidTag(); + static long GetSubMeshOnCompoundTag(); + static long GetNodeGroupsTag(); + static long GetEdgeGroupsTag(); + static long GetFaceGroupsTag(); + static long GetVolumeGroupsTag(); + + // Get study context + StudyContext* GetCurrentStudyContext(); private: - SMESH_HypothesisFactory_i _hypothesisFactory_i; - ::SMESH_Gen _impl; // no namespace here - int _localId; // unique Id of created objects, within SMESH_Gen_i entity + // Create hypothesis of given type + SMESH::SMESH_Hypothesis_ptr createHypothesis( const char* theHypName, + const char* theLibName) + throw ( SALOME::SALOME_Exception ); + + // Create empty mesh on shape + SMESH::SMESH_Mesh_ptr createMesh() + throw ( SALOME::SALOME_Exception ); + + static void loadGeomData( SALOMEDS::SComponent_ptr theCompRoot ); + +private: + + static CORBA::ORB_var myOrb; // ORB reference + static PortableServer::POA_var myPoa; // POA reference + static SALOME_NamingService* myNS; // Naming Service + static SALOME_LifeCycleCORBA* myLCC; // Life Cycle CORBA + + ::SMESH_Gen myGen; // SMESH_Gen local implementation + + // hypotheses managing + map myHypCreatorMap; + + map myStudyContextMap; // Map of study context objects - map _mapStudyContext_i; - map _SMESHCorbaObj; + GEOM_Client* myShapeReader; // Shape reader + SALOMEDS::Study_var myCurrentStudy; // Current study }; #endif diff --git a/src/SMESH_I/SMESH_Hypothesis_i.cxx b/src/SMESH_I/SMESH_Hypothesis_i.cxx index 2c86f6af0..87c16ee4e 100644 --- a/src/SMESH_I/SMESH_Hypothesis_i.cxx +++ b/src/SMESH_I/SMESH_Hypothesis_i.cxx @@ -27,57 +27,139 @@ // $Header$ using namespace std; -using namespace std; +#include +#include #include "SMESH_Hypothesis_i.hxx" -#include "SMESH_Hypothesis.hxx" -#include "SMESH_Gen.hxx" #include "utilities.h" //============================================================================= /*! - * + * SMESH_Hypothesis_i::SMESH_Hypothesis_i + * + * Constructor */ //============================================================================= -SMESH_Hypothesis_i::SMESH_Hypothesis_i() +SMESH_Hypothesis_i::SMESH_Hypothesis_i( PortableServer::POA_ptr thePOA ) + : SALOME::GenericObj_i( thePOA ) { - MESSAGE("SMESH_Hypothesis_i"); + MESSAGE( "SMESH_Hypothesis_i::SMESH_Hypothesis_i" ); + myBaseImpl = 0; + thePOA->activate_object( this ); }; //============================================================================= /*! - * + * SMESH_Hypothesis_i::~SMESH_Hypothesis_i + * + * Destructor */ //============================================================================= SMESH_Hypothesis_i::~SMESH_Hypothesis_i() { - MESSAGE("~SMESH_Hypothesis_i"); + MESSAGE( "SMESH_Hypothesis_i::~SMESH_Hypothesis_i" ); + if ( myBaseImpl ) + delete myBaseImpl; }; //============================================================================= /*! - * + * SMESH_Hypothesis_i::GetName + * + * Get type name of hypothesis */ //============================================================================= char* SMESH_Hypothesis_i::GetName() { - MESSAGE("GetName"); - return CORBA::string_dup(_baseImpl->GetName()); -// const char* name = _baseImpl->GetName(); -// SCRUTE(name); -// return CORBA::string_dup(name); + MESSAGE( "SMESH_Hypothesis_i::GetName" ); + return CORBA::string_dup( myBaseImpl->GetName() ); +}; + +//============================================================================= +/*! + * SMESH_Hypothesis_i::GetLibName + * + * Get plugin library name of hypothesis (required by persistency mechanism) + */ +//============================================================================= + +char* SMESH_Hypothesis_i::GetLibName() +{ + MESSAGE( "SMESH_Hypothesis_i::GetLibName" ); + return CORBA::string_dup( myBaseImpl->GetLibName() ); +}; + +//============================================================================= +/*! + * SMESH_Hypothesis_i::SetLibName + * + * Set plugin library name of hypothesis (required by persistency mechanism) + */ +//============================================================================= + +void SMESH_Hypothesis_i::SetLibName(const char* theLibName) +{ + MESSAGE( "SMESH_Hypothesis_i::SetLibName" ); + myBaseImpl->SetLibName( theLibName ); }; //============================================================================= /*! - * + * SMESH_Hypothesis_i::GetId + * + * Get unique id of hypothesis */ //============================================================================= CORBA::Long SMESH_Hypothesis_i::GetId() { - MESSAGE("GetId"); - return _baseImpl->GetID(); + MESSAGE( "SMESH_Hypothesis_i::GetId" ); + return myBaseImpl->GetID(); +} + +//============================================================================= +/*! + * SMESH_Hypothesis_i::GetImpl + * + * Get implementation + */ +//============================================================================= + +::SMESH_Hypothesis* SMESH_Hypothesis_i::GetImpl() +{ + MESSAGE( "SMESH_Hypothesis_i::GetImpl" ); + return myBaseImpl; +} + +//============================================================================= +/*! + * SMESH_Hypothesis_i::SaveTo + * + * Persistence: Dumps parameters to the string stream + */ +//============================================================================= + +char* SMESH_Hypothesis_i::SaveTo() +{ + MESSAGE( "SMESH_Hypothesis_i::SaveTo" ); + std::ostringstream os; + myBaseImpl->SaveTo( os ); + return CORBA::string_dup( os.str().c_str() ); +} + +//============================================================================= +/*! +* SMESH_Hypothesis_i::LoadFrom +* +* Persistence: Restores parameters from string +*/ +//============================================================================= + +void SMESH_Hypothesis_i::LoadFrom( const char* theStream ) +{ + MESSAGE( "SMESH_Hypothesis_i::LoadFrom" ); + std::istringstream is( theStream ); + myBaseImpl->LoadFrom( is ); } diff --git a/src/SMESH_I/SMESH_Hypothesis_i.hxx b/src/SMESH_I/SMESH_Hypothesis_i.hxx index 9277426d3..5a03bfa44 100644 --- a/src/SMESH_I/SMESH_Hypothesis_i.hxx +++ b/src/SMESH_I/SMESH_Hypothesis_i.hxx @@ -32,23 +32,77 @@ #include #include CORBA_SERVER_HEADER(SMESH_Hypothesis) -class SMESH_Gen; -class SMESH_Hypothesis; +#include "SMESH_Hypothesis.hxx" +#include "SALOME_GenericObj_i.hh" +#include "SMESH_Gen.hxx" + +// ====================================================== +// Generic hypothesis +// ====================================================== class SMESH_Hypothesis_i: - public POA_SMESH::SMESH_Hypothesis + public virtual POA_SMESH::SMESH_Hypothesis, + public virtual SALOME::GenericObj_i { public: - SMESH_Hypothesis_i(); + // Constructor : placed in protected section to prohibit creation of generic class instance + SMESH_Hypothesis_i( PortableServer::POA_ptr thePOA ); + +public: + // Destructor virtual ~SMESH_Hypothesis_i(); + // Get type name of hypothesis char* GetName(); + + // Get plugin library name of hypothesis + char* GetLibName(); + + // Set plugin library name of hypothesis + void SetLibName( const char* theLibName ); + + // Get unique id of hypothesis CORBA::Long GetId(); + // Get implementation + ::SMESH_Hypothesis* GetImpl(); + + // Persistence + virtual char* SaveTo(); + virtual void LoadFrom( const char* theStream ); + protected: - ::SMESH_Hypothesis* _baseImpl; - ::SMESH_Gen* _genImpl; - int _id; + ::SMESH_Hypothesis* myBaseImpl; // base hypothesis implementation +}; + +// ====================================================== +// Generic hypothesis creator +// ====================================================== +class GenericHypothesisCreator_i +{ +public: + // Create a hypothesis + virtual SMESH_Hypothesis_i* Create(PortableServer::POA_ptr thePOA, + int theStudyId, + ::SMESH_Gen* theGenImpl) = 0; +}; + +//============================================================================= +// +// Specific Hypothesis Creators are generated with a template which inherits a +// generic hypothesis creator. Each creator returns an hypothesis of the type +// given in the template. +// +//============================================================================= +template class HypothesisCreator_i: public GenericHypothesisCreator_i +{ +public: + virtual SMESH_Hypothesis_i* Create (PortableServer::POA_ptr thePOA, + int theStudyId, + ::SMESH_Gen* theGenImpl) + { + return new T (thePOA, theStudyId, theGenImpl); + }; }; #endif diff --git a/src/SMESH_I/SMESH_MEDMesh_i.cxx b/src/SMESH_I/SMESH_MEDMesh_i.cxx index 25ce55bfe..82917f4ad 100644 --- a/src/SMESH_I/SMESH_MEDMesh_i.cxx +++ b/src/SMESH_I/SMESH_MEDMesh_i.cxx @@ -54,6 +54,8 @@ using namespace std; # include "Utils_ORB_INIT.hxx" # include "Utils_SINGLETON.hxx" +# include "Utils_ExceptHandlers.hxx" + extern "C" { #include @@ -254,7 +256,7 @@ SALOME_MED::double_array * SMESH_MEDMesh_i::getCoordinates( myseq->length(nbNodes * spaceDimension); int i = 0; - SMDS_Iterator * itNodes=_meshDS->nodesIterator(); + SMDS_NodeIteratorPtr itNodes=_meshDS->nodesIterator(); while(itNodes->more()) { const SMDS_MeshNode* node = itNodes->next(); @@ -280,7 +282,6 @@ SALOME_MED::double_array * SMESH_MEDMesh_i::getCoordinates( } i++; } - delete itNodes; } catch(...) { @@ -949,7 +950,7 @@ void SMESH_MEDMesh_i::calculeNbElts() throw(SALOME::SALOME_Exception) int trouveSeg3 = 0; SALOME_MED::medGeometryElement medElement; - SMDS_Iterator * itEdges=_meshDS->edgesIterator(); + SMDS_EdgeIteratorPtr itEdges=_meshDS->edgesIterator(); while(itEdges->more()) { const SMDS_MeshEdge* elem = itEdges->next(); @@ -987,13 +988,11 @@ void SMESH_MEDMesh_i::calculeNbElts() throw(SALOME::SALOME_Exception) int longueur = _seq_elemId[index]->length(); _seq_elemId[index]->length(longueur + nb_of_nodes); - SMDS_Iterator * itn=_meshDS->nodesIterator(); + SMDS_NodeIteratorPtr itn=_meshDS->nodesIterator(); for(int k=0; itn->more(); k++) _seq_elemId[index][longueur + k] = itn->next()->GetID()+1; - delete itn; } - delete itEdges; _mapNbTypes[SALOME_MED::MED_EDGE] = trouveSeg2 + trouveSeg3; @@ -1008,7 +1007,7 @@ void SMESH_MEDMesh_i::calculeNbElts() throw(SALOME::SALOME_Exception) _mapIndToSeqElts[SALOME_MED::MED_QUAD4] = _indexElts++; _mapIndToVectTypes[SALOME_MED::MED_FACE] = _indexEnts++; - SMDS_Iterator * itFaces=_meshDS->facesIterator(); + SMDS_FaceIteratorPtr itFaces=_meshDS->facesIterator(); while(itFaces->more()) { const SMDS_MeshFace * elem = itFaces->next(); @@ -1059,13 +1058,11 @@ void SMESH_MEDMesh_i::calculeNbElts() throw(SALOME::SALOME_Exception) int longueur = _seq_elemId[index]->length(); _seq_elemId[index]->length(longueur + nb_of_nodes); - SMDS_Iterator * itn=_meshDS->nodesIterator(); + SMDS_NodeIteratorPtr itn=_meshDS->nodesIterator(); for(int k=0; itn->more(); k++) _seq_elemId[index][longueur + k] = itn->next()->GetID()+1; - delete itn; } //itFaces - delete itFaces; _mapNbTypes[SALOME_MED::MED_FACE] = trouveTria3 + trouveTria6 + trouveQuad4; @@ -1076,7 +1073,7 @@ void SMESH_MEDMesh_i::calculeNbElts() throw(SALOME::SALOME_Exception) int trouveHexa8 = 0; - SMDS_Iterator * itVolumes=_meshDS->volumesIterator(); + SMDS_VolumeIteratorPtr itVolumes=_meshDS->volumesIterator(); while(itVolumes->more()) { const SMDS_MeshVolume * elem = itVolumes->next(); @@ -1094,12 +1091,10 @@ void SMESH_MEDMesh_i::calculeNbElts() throw(SALOME::SALOME_Exception) int longueur = _seq_elemId[index]->length(); _seq_elemId[index]->length(longueur + nb_of_nodes); - SMDS_Iterator * itn=_meshDS->nodesIterator(); + SMDS_NodeIteratorPtr itn=_meshDS->nodesIterator(); for(int k=0; itn->more(); k++) _seq_elemId[index][longueur + k] = itn->next()->GetID()+1; - delete itn; } - delete itVolumes; _mapNbTypes[SALOME_MED::MED_CELL] = trouveHexa8; _mapNbTypes[SALOME_MED::MED_ALL_ENTITIES] @@ -1116,6 +1111,7 @@ 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; diff --git a/src/SMESH_I/SMESH_MEDSupport_i.cxx b/src/SMESH_I/SMESH_MEDSupport_i.cxx index ba72f1973..7b5289ebb 100644 --- a/src/SMESH_I/SMESH_MEDSupport_i.cxx +++ b/src/SMESH_I/SMESH_MEDSupport_i.cxx @@ -28,6 +28,7 @@ using namespace std; #include "SMESH_MEDSupport_i.hxx" #include "utilities.h" #include "Utils_CorbaException.hxx" +#include "Utils_ExceptHandlers.hxx" #include #include "SMESHDS_Mesh.hxx" @@ -36,6 +37,7 @@ using namespace std; #include "SMESH_Mesh_i.hxx" #include "SMESH_subMesh_i.hxx" + //============================================================================= /*! * Default constructor @@ -296,6 +298,7 @@ CORBA::Long SMESH_MEDSupport_i::getNumberOfElements(SALOME_MED:: SALOME_MED::long_array * SMESH_MEDSupport_i::getNumber( SALOME_MED::medGeometryElement geomElement) throw(SALOME::SALOME_Exception) { + Unexpect aCatch(SALOME_SalomeException); if (_subMeshDS==NULL) THROW_SALOME_CORBA_EXCEPTION("No associated Support", SALOME::INTERNAL_ERROR); @@ -309,13 +312,12 @@ SALOME_MED::long_array * SMESH_MEDSupport_i::getNumber( int i = 0; myseq->length(_subMeshDS->NbNodes()); - SMDS_Iterator * it = _subMeshDS->GetNodes(); + SMDS_NodeIteratorPtr it = _subMeshDS->GetNodes(); while(it->more()) { myseq[i] = it->next()->GetID(); i++; }; - delete it; SCRUTE(myseq->length()); MESSAGE("End of SMESH_MEDSupport_i::getNumber"); diff --git a/src/SMESH_I/SMESH_MeshEditor_i.cxx b/src/SMESH_I/SMESH_MeshEditor_i.cxx index 89088d3f6..99b27b0bb 100644 --- a/src/SMESH_I/SMESH_MeshEditor_i.cxx +++ b/src/SMESH_I/SMESH_MeshEditor_i.cxx @@ -61,8 +61,14 @@ CORBA::Boolean SMESH_MeshEditor_i::RemoveElements(const SMESH:: for (int i = 0; i < IDsOfElements.length(); i++) { CORBA::Long index = IDsOfElements[i]; - _myMeshDS->RemoveElement(_myMeshDS->FindElement(index)); - MESSAGE("Element " << index << " was removed") + const SMDS_MeshElement * elem = _myMeshDS->FindElement(index); + // an element may be removed as a result of preceding + // loop removal + if ( elem ) + { + _myMeshDS->RemoveElement( elem ); + MESSAGE("Element " << index << " was removed"); + } } return true; }; diff --git a/src/SMESH_I/SMESH_Mesh_i.cxx b/src/SMESH_I/SMESH_Mesh_i.cxx index 9dee0f562..9ca6f208a 100644 --- a/src/SMESH_I/SMESH_Mesh_i.cxx +++ b/src/SMESH_I/SMESH_Mesh_i.cxx @@ -30,8 +30,10 @@ using namespace std; #include "SMESH_Mesh_i.hxx" #include "SMESH_subMesh_i.hxx" #include "SMESH_MEDMesh_i.hxx" +#include "SMESH_Group_i.hxx" #include "Utils_CorbaException.hxx" +#include "Utils_ExceptHandlers.hxx" #include "utilities.h" #include "SALOME_NamingService.hxx" @@ -42,12 +44,17 @@ using namespace std; #include "SMESHDS_Command.hxx" #include "SMESHDS_CommandType.hxx" #include "SMESH_MeshEditor_i.hxx" +#include "SMESH_Gen_i.hxx" +#include "DriverMED_R_SMESHDS_Mesh.h" #include #include + //**** SMESHDS en champ +int SMESH_Mesh_i::myIdGenerator = 0; + //============================================================================= /*! * @@ -55,10 +62,11 @@ using namespace std; //============================================================================= SMESH_Mesh_i::SMESH_Mesh_i() + : SALOME::GenericObj_i( PortableServer::POA::_nil() ) { MESSAGE("SMESH_Mesh_i: default constructor, not for use"); ASSERT(0); -}; +} //============================================================================= /*! @@ -66,16 +74,28 @@ SMESH_Mesh_i::SMESH_Mesh_i() */ //============================================================================= -SMESH_Mesh_i::SMESH_Mesh_i(SMESH_Gen_i * gen_i, - GEOM::GEOM_Gen_ptr geomEngine, CORBA::Long studyId, int localId) +SMESH_Mesh_i::SMESH_Mesh_i( PortableServer::POA_ptr thePOA, + SMESH_Gen_i* gen_i, + CORBA::Long studyId ) +: SALOME::GenericObj_i( thePOA ) { - MESSAGE("SMESH_Mesh_i"); - _gen_i = gen_i; - _id = localId; - _geom = GEOM::GEOM_Gen::_narrow(geomEngine); - _studyId = studyId; + MESSAGE("SMESH_Mesh_i"); + _gen_i = gen_i; + _id = myIdGenerator++; + _studyId = studyId; + thePOA->activate_object( this ); } - +/* +SMESH_Mesh_i::SMESH_Mesh_i(SMESH_Gen_i* gen_i, + CORBA::Long studyId, + int localId) +{ + MESSAGE("SMESH_Mesh_i"); + _gen_i = gen_i; + _id = localId; + _studyId = studyId; +} +*/ //============================================================================= /*! * Destructor @@ -84,9 +104,287 @@ SMESH_Mesh_i::SMESH_Mesh_i(SMESH_Gen_i * gen_i, SMESH_Mesh_i::~SMESH_Mesh_i() { - MESSAGE("~SMESH_Mesh_i"); - // **** -}; + MESSAGE("~SMESH_Mesh_i"); + map::iterator it; + for ( it = _mapGroups.begin(); it != _mapGroups.end(); it++ ) { + SMESH_Group_i* aGroup = dynamic_cast( SMESH_Gen_i::GetServant( it->second ).in() ); + if ( aGroup ) { + _impl->RemoveGroup( aGroup->GetLocalID() ); + aGroup->Destroy(); + } + } + _mapGroups.clear(); +} + +//============================================================================= +/*! + * SetShape + * + * Associates mesh with and puts a reference + * to into the current study; + * the previous shape is substituted by the new one. + */ +//============================================================================= + +void SMESH_Mesh_i::SetShape( GEOM::GEOM_Shape_ptr theShape ) + throw (SALOME::SALOME_Exception) +{ + Unexpect aCatch(SALOME_SalomeException); + try { + setShape( theShape ); + } + catch(SALOME_Exception & S_ex) { + THROW_SALOME_CORBA_EXCEPTION(S_ex.what(), SALOME::BAD_PARAM); + } + + SALOMEDS::Study_ptr aStudy = _gen_i->GetCurrentStudy(); + if ( aStudy->_is_nil() ) + return; + + // Create a reference to + SALOMEDS::SObject_var aMeshSO = SALOMEDS::SObject::_narrow( aStudy->FindObjectIOR( ( SMESH_Gen_i::GetORB()->object_to_string( _this() ) ) ) ); + SALOMEDS::SObject_var aShapeSO = aStudy->FindObjectIOR( SMESH_Gen_i::GetORB()->object_to_string( theShape ) ); + + SALOMEDS::SObject_var anObj, aRef; + SALOMEDS::GenericAttribute_var anAttr; + SALOMEDS::AttributeIOR_var anIOR; + SALOMEDS::StudyBuilder_var aBuilder = aStudy->NewBuilder(); + long aTag = SMESH_Gen_i::GetRefOnShapeTag(); + + if ( aMeshSO->FindSubObject( aTag, anObj ) ) { + if ( anObj->ReferencedObject( aRef ) ) { + if ( strcmp( aRef->GetID(), aShapeSO->GetID() ) == 0 ) { + // Setting the same shape twice forbidden + return; + } + } + } + else { + anObj = aBuilder->NewObjectToTag( aMeshSO, aTag ); + } + aBuilder->Addreference( anObj, aShapeSO ); +} + +//============================================================================= +/*! + * setShape + * + * Sets shape to the mesh implementation + */ +//============================================================================= + +bool SMESH_Mesh_i::setShape( GEOM::GEOM_Shape_ptr theShape ) +{ + TopoDS_Shape aLocShape = _gen_i->GetShapeReader()->GetShape( SMESH_Gen_i::GetGeomEngine(), theShape ); + _impl->ShapeToMesh( aLocShape ); + return true; +} + +//============================================================================= +/*! + * + */ +//============================================================================= + +static SMESH::DriverMED_ReadStatus ConvertDriverMEDReadStatus (int theStatus) +{ + SMESH::DriverMED_ReadStatus res; + switch (theStatus) + { + case DriverMED_R_SMESHDS_Mesh::DRS_OK: + res = SMESH::DRS_OK; break; + case DriverMED_R_SMESHDS_Mesh::DRS_EMPTY: + res = SMESH::DRS_EMPTY; break; + case DriverMED_R_SMESHDS_Mesh::DRS_WARN_RENUMBER: + res = SMESH::DRS_WARN_RENUMBER; break; + case DriverMED_R_SMESHDS_Mesh::DRS_WARN_SKIP_ELEM: + res = SMESH::DRS_WARN_SKIP_ELEM; break; + case DriverMED_R_SMESHDS_Mesh::DRS_FAIL: + default: + res = SMESH::DRS_FAIL; break; + } + return res; +} + +//============================================================================= +/*! + * ImportMEDFile + * + * Imports mesh data from MED file + */ +//============================================================================= + +SMESH::DriverMED_ReadStatus + SMESH_Mesh_i::ImportMEDFile( const char* theFileName, const char* theMeshName ) + throw ( SALOME::SALOME_Exception ) +{ + Unexpect aCatch(SALOME_SalomeException); + int status; + try { + status = importMEDFile( theFileName, theMeshName ); + } + catch( SALOME_Exception& S_ex ) { + THROW_SALOME_CORBA_EXCEPTION(S_ex.what(), SALOME::BAD_PARAM); + } + catch ( ... ) { + THROW_SALOME_CORBA_EXCEPTION("ImportMEDFile(): unknown exception", SALOME::BAD_PARAM); + } + + SALOMEDS::Study_ptr aStudy = _gen_i->GetCurrentStudy(); + if ( aStudy->_is_nil() ) + return ConvertDriverMEDReadStatus(status); + + // publishing of the groups in the study (sub-meshes are out of scope of MED import) + map::iterator it = _mapGroups.begin(); + for (; it != _mapGroups.end(); it++ ) { + SMESH::SMESH_Group_var aGroup = SMESH::SMESH_Group::_duplicate( it->second ); + if ( _gen_i->CanPublishInStudy( aGroup ) ) + _gen_i->PublishInStudy( aStudy, + SALOMEDS::SObject::_nil(), + aGroup, + aGroup->GetName() ); + } + return ConvertDriverMEDReadStatus(status); +} + +//============================================================================= +/*! + * importMEDFile + * + * Imports mesh data from MED file + */ +//============================================================================= + +int SMESH_Mesh_i::importMEDFile( const char* theFileName, const char* theMeshName ) +{ + // Read mesh with name = and all its groups into SMESH_Mesh + int status = _impl->MEDToMesh( theFileName, theMeshName ); + + // Create group servants, if any groups were imported + list aGroupIds = _impl->GetGroupIds(); + for ( list::iterator it = aGroupIds.begin(); it != aGroupIds.end(); it++ ) { + SMESH_Group_i* aGroupImpl = new SMESH_Group_i( SMESH_Gen_i::GetPOA(), this, *it ); + SMESH::SMESH_Group_var aGroup = SMESH::SMESH_Group::_narrow( aGroupImpl->_this() ); + _mapGroups[*it] = SMESH::SMESH_Group::_duplicate( aGroup ); + + // register CORBA object for persistence + StudyContext* myStudyContext = _gen_i->GetCurrentStudyContext(); + string iorString = SMESH_Gen_i::GetORB()->object_to_string( aGroup ); + int nextId = myStudyContext->addObject( iorString ); + MESSAGE( "Add group to map with id = "<< nextId << " and IOR = " << iorString.c_str() ); + } + + return status; +} + +//============================================================================= +/*! + * + */ +//============================================================================= + +static SMESH::Hypothesis_Status ConvertHypothesisStatus + (SMESH_Hypothesis::Hypothesis_Status theStatus) +{ + SMESH::Hypothesis_Status res; + switch (theStatus) + { + case SMESH_Hypothesis::HYP_OK: + res = SMESH::HYP_OK; break; + case SMESH_Hypothesis::HYP_MISSING: + res = SMESH::HYP_MISSING; break; + case SMESH_Hypothesis::HYP_CONCURENT: + res = SMESH::HYP_CONCURENT; break; + case SMESH_Hypothesis::HYP_BAD_PARAMETER: + res = SMESH::HYP_BAD_PARAMETER; break; + case SMESH_Hypothesis::HYP_INCOMPATIBLE: + res = SMESH::HYP_INCOMPATIBLE; break; + case SMESH_Hypothesis::HYP_NOTCONFORM: + res = SMESH::HYP_NOTCONFORM; break; + case SMESH_Hypothesis::HYP_ALREADY_EXIST: + res = SMESH::HYP_ALREADY_EXIST; break; + case SMESH_Hypothesis::HYP_BAD_DIM: + res = SMESH::HYP_BAD_DIM; break; + default: + res = SMESH::HYP_UNKNOWN_FATAL; + } + return res; +} + +//============================================================================= +/*! + * AddHypothesis + * + * calls internal addHypothesis() and then adds a reference to under + * the SObject actually having a reference to . + * NB: For this method to work, it is necessary to add a reference to sub-shape first. + */ +//============================================================================= + +SMESH::Hypothesis_Status SMESH_Mesh_i::AddHypothesis(GEOM::GEOM_Shape_ptr aSubShape, + SMESH::SMESH_Hypothesis_ptr anHyp) + throw(SALOME::SALOME_Exception) +{ + Unexpect aCatch(SALOME_SalomeException); + SMESH_Hypothesis::Hypothesis_Status status = addHypothesis( aSubShape, anHyp ); + + if ( !SMESH_Hypothesis::IsStatusFatal(status) ) { + SALOMEDS::Study_ptr aStudy = _gen_i->GetCurrentStudy(); + + if ( !aStudy->_is_nil() ) { + // Detect whether refers to this mesh or its sub-mesh + SALOMEDS::GenericAttribute_var anAttr; + SALOMEDS::AttributeIOR_var anIOR; + SALOMEDS::SObject_var aMeshSO = SALOMEDS::SObject::_narrow( aStudy->FindObjectIOR( ( SMESH_Gen_i::GetORB()->object_to_string( _this() ) ) ) ); + SALOMEDS::SObject_var aMorSM, aRef; + CORBA::String_var aShapeIOR = CORBA::string_dup( SMESH_Gen_i::GetORB()->object_to_string( aSubShape ) ); + SALOMEDS::ChildIterator_var it = aStudy->NewChildIterator( aMeshSO ); + + for ( it->InitEx( true ); it->More(); it->Next() ) { + SALOMEDS::SObject_var anObj = it->Value(); + if ( anObj->ReferencedObject( aRef ) ) { + if ( aRef->FindAttribute( anAttr, "AttributeIOR" ) ) { + anIOR = SALOMEDS::AttributeIOR::_narrow( anAttr ); + if ( strcmp( anIOR->Value(), aShapeIOR ) == 0 ) { + aMorSM = anObj->GetFather(); + break; + } + } + } + } + + bool aIsAlgo = !SMESH::SMESH_Algo::_narrow( anHyp )->_is_nil(); + SALOMEDS::SObject_var aHypSO = SALOMEDS::SObject::_narrow( aStudy->FindObjectIOR( ( SMESH_Gen_i::GetORB()->object_to_string( anHyp ) ) ) ); + if ( !aMorSM->_is_nil() && !aHypSO->_is_nil() ) { + //Find or Create Applied Hypothesis root + SALOMEDS::SObject_var AHR; + SALOMEDS::AttributeName_var aName; + SALOMEDS::AttributeSelectable_var aSelAttr; + SALOMEDS::AttributePixMap_var aPixmap; + SALOMEDS::StudyBuilder_var aBuilder = aStudy->NewBuilder(); + long aTag = aIsAlgo ? SMESH_Gen_i::GetRefOnAppliedAlgorithmsTag() : SMESH_Gen_i::GetRefOnAppliedHypothesisTag(); + + if ( !aMorSM->FindSubObject( aTag, AHR ) ) { + AHR = aBuilder->NewObjectToTag( aMorSM, aTag ); + anAttr = aBuilder->FindOrCreateAttribute( AHR, "AttributeName" ); + aName = SALOMEDS::AttributeName::_narrow( anAttr ); + aName ->SetValue( aIsAlgo ? "Applied algorithms" : "Applied hypotheses" ); + anAttr = aBuilder->FindOrCreateAttribute( AHR, "AttributeSelectable" ); + aSelAttr = SALOMEDS::AttributeSelectable::_narrow( anAttr ); + aSelAttr ->SetSelectable( false ); + anAttr = aBuilder->FindOrCreateAttribute( AHR, "AttributePixMap" ); + aPixmap = SALOMEDS::AttributePixMap::_narrow( anAttr ); + aPixmap ->SetPixMap( aIsAlgo ? "ICON_SMESH_TREE_ALGO" : "ICON_SMESH_TREE_HYPO" ); + } + + SALOMEDS::SObject_var SO = aBuilder->NewObject( AHR ); + aBuilder->Addreference( SO, aHypSO ); + } + } + } + + return ConvertHypothesisStatus(status); +} //============================================================================= /*! @@ -94,10 +392,11 @@ SMESH_Mesh_i::~SMESH_Mesh_i() */ //============================================================================= -CORBA::Boolean SMESH_Mesh_i::AddHypothesis(GEOM::GEOM_Shape_ptr aSubShape, - SMESH::SMESH_Hypothesis_ptr anHyp) throw(SALOME::SALOME_Exception) +SMESH_Hypothesis::Hypothesis_Status + SMESH_Mesh_i::addHypothesis(GEOM::GEOM_Shape_ptr aSubShape, + SMESH::SMESH_Hypothesis_ptr anHyp) { - MESSAGE("AddHypothesis"); + MESSAGE("addHypothesis"); // **** proposer liste de subShape (selection multiple) GEOM::GEOM_Shape_var mySubShape = GEOM::GEOM_Shape::_narrow(aSubShape); @@ -109,20 +408,99 @@ CORBA::Boolean SMESH_Mesh_i::AddHypothesis(GEOM::GEOM_Shape_ptr aSubShape, if (CORBA::is_nil(myHyp)) THROW_SALOME_CORBA_EXCEPTION("bad hypothesis reference", SALOME::BAD_PARAM); - bool ret = false; + + SMESH_Hypothesis::Hypothesis_Status status = SMESH_Hypothesis::HYP_OK; try { TopoDS_Shape myLocSubShape = - _gen_i->_ShapeReader->GetShape(_geom, mySubShape); + _gen_i->GetShapeReader()->GetShape(SMESH_Gen_i::GetGeomEngine(), mySubShape); int hypId = myHyp->GetId(); - ret = _impl->AddHypothesis(myLocSubShape, hypId); + status = _impl->AddHypothesis(myLocSubShape, hypId); + if ( !SMESH_Hypothesis::IsStatusFatal(status) ) + _mapHypo[hypId] = myHyp; } catch(SALOME_Exception & S_ex) { THROW_SALOME_CORBA_EXCEPTION(S_ex.what(), SALOME::BAD_PARAM); } - return ret; -}; + return status; +} + +//============================================================================= +/*! + * + */ +//============================================================================= + +SMESH::Hypothesis_Status SMESH_Mesh_i::RemoveHypothesis(GEOM::GEOM_Shape_ptr aSubShape, + SMESH::SMESH_Hypothesis_ptr anHyp) + throw(SALOME::SALOME_Exception) +{ + Unexpect aCatch(SALOME_SalomeException); + SMESH_Hypothesis::Hypothesis_Status status = removeHypothesis( aSubShape, anHyp ); + + if ( !SMESH_Hypothesis::IsStatusFatal(status) ) { + SALOMEDS::Study_ptr aStudy = _gen_i->GetCurrentStudy(); + + if ( !aStudy->_is_nil() ) { + // Detect whether refers to this mesh or its sub-mesh + SALOMEDS::GenericAttribute_var anAttr; + SALOMEDS::AttributeIOR_var anIOR; + SALOMEDS::SObject_var aMeshSO = SALOMEDS::SObject::_narrow( aStudy->FindObjectIOR( ( SMESH_Gen_i::GetORB()->object_to_string( _this() ) ) ) ); + if ( aMeshSO->_is_nil() ) + return SMESH::HYP_UNKNOWN_FATAL; + + SALOMEDS::SObject_var aMorSM, aRef; + CORBA::String_var aShapeIOR = CORBA::string_dup( SMESH_Gen_i::GetORB()->object_to_string( aSubShape ) ); + SALOMEDS::ChildIterator_var it = aStudy->NewChildIterator( aMeshSO ); + + for ( it->InitEx( true ); it->More(); it->Next() ) { + SALOMEDS::SObject_var anObj = it->Value(); + if ( anObj->ReferencedObject( aRef ) ) { + if ( aRef->FindAttribute( anAttr, "AttributeIOR" ) ) { + anIOR = SALOMEDS::AttributeIOR::_narrow( anAttr ); + if ( strcmp( anIOR->Value(), aShapeIOR ) == 0 ) { + aMorSM = anObj->GetFather(); + break; + } + } + } + } + + bool aIsAlgo = !SMESH::SMESH_Algo::_narrow( anHyp )->_is_nil(); + SALOMEDS::SObject_var aHypSO = SALOMEDS::SObject::_narrow( aStudy->FindObjectIOR( ( SMESH_Gen_i::GetORB()->object_to_string( anHyp ) ) ) ); + if ( !aMorSM->_is_nil() && !aHypSO->_is_nil() ) { + // Remove a refernce to hypothesis or algorithm + SALOMEDS::SObject_var AHR; + SALOMEDS::AttributeName_var aName; + SALOMEDS::AttributeSelectable_var aSelAttr; + SALOMEDS::AttributePixMap_var aPixmap; + SALOMEDS::StudyBuilder_var aBuilder = aStudy->NewBuilder(); + CORBA::String_var aHypIOR = CORBA::string_dup( SMESH_Gen_i::GetORB()->object_to_string( anHyp ) ); + long aTag = aIsAlgo ? SMESH_Gen_i::GetRefOnAppliedAlgorithmsTag() : SMESH_Gen_i::GetRefOnAppliedHypothesisTag(); + + if ( aMorSM->FindSubObject( aTag, AHR ) ) { + SALOMEDS::ChildIterator_var it = aStudy->NewChildIterator( AHR ); + for ( ; it->More(); it->Next() ) { + SALOMEDS::SObject_var anObj = it->Value(); + if ( anObj->ReferencedObject( aRef ) ) { + if ( aRef->FindAttribute( anAttr, "AttributeIOR" ) ) { + anIOR = SALOMEDS::AttributeIOR::_narrow(anAttr); + if ( strcmp( anIOR->Value(), aHypIOR ) == 0 ) { + aBuilder->RemoveObject( anObj ); + break; + } + } + } + } + } + } + } + } + + return ConvertHypothesisStatus(status); +} + //============================================================================= /*! @@ -130,11 +508,11 @@ CORBA::Boolean SMESH_Mesh_i::AddHypothesis(GEOM::GEOM_Shape_ptr aSubShape, */ //============================================================================= -CORBA::Boolean - SMESH_Mesh_i::RemoveHypothesis(GEOM::GEOM_Shape_ptr aSubShape, - SMESH::SMESH_Hypothesis_ptr anHyp) throw(SALOME::SALOME_Exception) +SMESH_Hypothesis::Hypothesis_Status + SMESH_Mesh_i::removeHypothesis(GEOM::GEOM_Shape_ptr aSubShape, + SMESH::SMESH_Hypothesis_ptr anHyp) { - MESSAGE("RemoveHypothesis"); + MESSAGE("removeHypothesis()"); // **** proposer liste de subShape (selection multiple) GEOM::GEOM_Shape_var mySubShape = GEOM::GEOM_Shape::_narrow(aSubShape); @@ -144,23 +522,25 @@ CORBA::Boolean SMESH::SMESH_Hypothesis_var myHyp = SMESH::SMESH_Hypothesis::_narrow(anHyp); if (CORBA::is_nil(myHyp)) - THROW_SALOME_CORBA_EXCEPTION("bad hypothesis reference", + THROW_SALOME_CORBA_EXCEPTION("bad hypothesis reference", SALOME::BAD_PARAM); - bool ret = false; + SMESH_Hypothesis::Hypothesis_Status status = SMESH_Hypothesis::HYP_OK; try { TopoDS_Shape myLocSubShape = - _gen_i->_ShapeReader->GetShape(_geom, mySubShape); + _gen_i->GetShapeReader()->GetShape(SMESH_Gen_i::GetGeomEngine(), mySubShape); int hypId = myHyp->GetId(); - ret = _impl->RemoveHypothesis(myLocSubShape, hypId); + 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 ret; -}; + return status; +} //============================================================================= /*! @@ -172,64 +552,286 @@ SMESH::ListOfHypothesis * SMESH_Mesh_i::GetHypothesisList(GEOM::GEOM_Shape_ptr aSubShape) throw(SALOME::SALOME_Exception) { - MESSAGE("GetHypothesisList"); - // **** -}; + Unexpect aCatch(SALOME_SalomeException); + MESSAGE("GetHypothesisList"); + GEOM::GEOM_Shape_var mySubShape = GEOM::GEOM_Shape::_narrow(aSubShape); + if (CORBA::is_nil(mySubShape)) + THROW_SALOME_CORBA_EXCEPTION("bad subShape reference", + SALOME::BAD_PARAM); + + SMESH::ListOfHypothesis_var aList = new SMESH::ListOfHypothesis(); + + try { + TopoDS_Shape myLocSubShape + = _gen_i->GetShapeReader()->GetShape(SMESH_Gen_i::GetGeomEngine(), mySubShape); + + const list& aLocalList = _impl->GetHypothesisList( myLocSubShape ); + int i = 0, n = aLocalList.size(); + aList->length( n ); + + 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->length( i ); + } + catch(SALOME_Exception & S_ex) { + THROW_SALOME_CORBA_EXCEPTION(S_ex.what(), SALOME::BAD_PARAM); + } + + return aList._retn(); +} //============================================================================= /*! * */ //============================================================================= -SMESH::SMESH_subMesh_ptr SMESH_Mesh_i::GetElementsOnShape(GEOM:: - GEOM_Shape_ptr aSubShape) throw(SALOME::SALOME_Exception) +SMESH::SMESH_subMesh_ptr SMESH_Mesh_i::GetSubMesh(GEOM::GEOM_Shape_ptr aSubShape, + const char* theName ) + throw(SALOME::SALOME_Exception) { - MESSAGE("SMESH_Mesh_i::GetElementsOnShape"); - GEOM::GEOM_Shape_var mySubShape = GEOM::GEOM_Shape::_narrow(aSubShape); - if (CORBA::is_nil(mySubShape)) - THROW_SALOME_CORBA_EXCEPTION("bad subShape reference", - SALOME::BAD_PARAM); + Unexpect aCatch(SALOME_SalomeException); + MESSAGE("SMESH_Mesh_i::GetElementsOnShape"); + GEOM::GEOM_Shape_var mySubShape = GEOM::GEOM_Shape::_narrow(aSubShape); + if (CORBA::is_nil(mySubShape)) + THROW_SALOME_CORBA_EXCEPTION("bad subShape reference", + SALOME::BAD_PARAM); + + int subMeshId = 0; + try { + TopoDS_Shape myLocSubShape + = _gen_i->GetShapeReader()->GetShape(SMESH_Gen_i::GetGeomEngine(), mySubShape); + + //Get or Create the SMESH_subMesh object implementation + + ::SMESH_subMesh * mySubMesh = _impl->GetSubMesh(myLocSubShape); + subMeshId = mySubMesh->GetId(); + + // create a new subMesh object servant if there is none for the shape + + if (_mapSubMesh.find(subMeshId) == _mapSubMesh.end()) { + SMESH::SMESH_subMesh_var subMesh = createSubMesh( aSubShape ); + if ( _gen_i->CanPublishInStudy( subMesh ) ) { + SALOMEDS::SObject_var aSubmeshSO = _gen_i->PublishInStudy( _gen_i->GetCurrentStudy(), + SALOMEDS::SObject::_nil(), + subMesh, + theName ); + + // Add reference to to the study + SALOMEDS::Study_var aStudy = _gen_i->GetCurrentStudy(); + SALOMEDS::SObject_var aShapeSO = aStudy->FindObjectIOR( SMESH_Gen_i::GetORB()->object_to_string( aSubShape ) ); + if ( !aSubmeshSO->_is_nil() && !aShapeSO->_is_nil() ) { + MESSAGE( "********** SMESH_Mesh_i::GetSubMesh(): adding shape reference..." ) + SALOMEDS::StudyBuilder_var aBuilder = aStudy->NewBuilder(); + SALOMEDS::SObject_var SO = aBuilder->NewObjectToTag( aSubmeshSO, SMESH_Gen_i::GetRefOnShapeTag() ); + aBuilder->Addreference( SO, aShapeSO ); + MESSAGE( "********** SMESH_Mesh_i::GetSubMesh(): shape reference added" ) + } + } + } + } + catch(SALOME_Exception & S_ex) { + THROW_SALOME_CORBA_EXCEPTION(S_ex.what(), SALOME::BAD_PARAM); + } + + ASSERT(_mapSubMeshIor.find(subMeshId) != _mapSubMeshIor.end()); + return SMESH::SMESH_subMesh::_duplicate(_mapSubMeshIor[subMeshId]); +} - int subMeshId = 0; - try - { - SMESH_subMesh_i *subMeshServant; - TopoDS_Shape myLocSubShape - = _gen_i->_ShapeReader->GetShape(_geom, mySubShape); - //Get or Create the SMESH_subMesh object implementation +//============================================================================= +/*! + * + */ +//============================================================================= - ::SMESH_subMesh * mySubMesh = _impl->GetSubMesh(myLocSubShape); - subMeshId = mySubMesh->GetId(); +void SMESH_Mesh_i::RemoveSubMesh( SMESH::SMESH_subMesh_ptr theSubMesh ) + throw (SALOME::SALOME_Exception) +{ + MESSAGE("SMESH_Mesh_i::RemoveSubMesh"); + if ( theSubMesh->_is_nil() ) + return; + + GEOM::GEOM_Shape_var aSubShape; + SALOMEDS::Study_ptr aStudy = _gen_i->GetCurrentStudy(); + if ( !aStudy->_is_nil() ) { + // Remove submesh's SObject + SALOMEDS::SObject_var anSO = SALOMEDS::SObject::_narrow( aStudy->FindObjectIOR( ( SMESH_Gen_i::GetORB()->object_to_string( theSubMesh ) ) ) ); + if ( !anSO->_is_nil() ) { + long aTag = SMESH_Gen_i::GetRefOnShapeTag(); + SALOMEDS::SObject_var anObj, aRef; + if ( anSO->FindSubObject( aTag, anObj ) && anObj->ReferencedObject( aRef ) ) + aSubShape = GEOM::GEOM_Shape::_narrow( aRef->GetObject() ); + + aStudy->NewBuilder()->RemoveObjectWithChildren( anSO ); + } + } + + removeSubMesh( theSubMesh, aSubShape.in() ); +} - // create a new subMesh object servant if there is none for the shape - if (_mapSubMesh.find(subMeshId) != _mapSubMesh.end()) - { - ASSERT(_mapSubMesh_i.find(subMeshId) != _mapSubMesh_i.end()); - subMeshServant = _mapSubMesh_i[subMeshId]; - } - else - { - // create and activate the CORBA servant of Mesh - subMeshServant = new SMESH_subMesh_i(_gen_i, this, subMeshId); - SMESH::SMESH_subMesh_var subMesh - = SMESH::SMESH_subMesh::_narrow(subMeshServant->_this()); - _mapSubMesh[subMeshId] = mySubMesh; - _mapSubMesh_i[subMeshId] = subMeshServant; - _mapSubMeshIor[subMeshId] - = SMESH::SMESH_subMesh::_duplicate(subMesh); - } - } - catch(SALOME_Exception & S_ex) - { - THROW_SALOME_CORBA_EXCEPTION(S_ex.what(), SALOME::BAD_PARAM); - } +//============================================================================= +/*! + * + */ +//============================================================================= + +SMESH::SMESH_Group_ptr SMESH_Mesh_i::CreateGroup( SMESH::ElementType theElemType, + const char* theName ) + throw(SALOME::SALOME_Exception) +{ + Unexpect aCatch(SALOME_SalomeException); + SMESH::SMESH_Group_var aNewGroup = createGroup( theElemType, theName ); + + // Groups should be put under separate roots according to their type (nodes, edges, faces, volumes) + if ( _gen_i->CanPublishInStudy( aNewGroup ) ) { + SALOMEDS::SObject_var aGroupSO = _gen_i->PublishInStudy( _gen_i->GetCurrentStudy(), + SALOMEDS::SObject::_nil(), + aNewGroup, + theName ); + } + + return aNewGroup._retn(); +} + + +//============================================================================= +/*! + * + */ +//============================================================================= + +void SMESH_Mesh_i::RemoveGroup( SMESH::SMESH_Group_ptr theGroup ) + throw (SALOME::SALOME_Exception) +{ + if ( theGroup->_is_nil() ) + return; + + SMESH_Group_i* aGroup = dynamic_cast( SMESH_Gen_i::GetServant( theGroup ).in() ); + if ( !aGroup ) + return; + + SALOMEDS::Study_ptr aStudy = _gen_i->GetCurrentStudy(); + if ( !aStudy->_is_nil() ) { + // Remove group's SObject + SALOMEDS::SObject_var aGroupSO = SALOMEDS::SObject::_narrow( aStudy->FindObjectIOR( ( SMESH_Gen_i::GetORB()->object_to_string( theGroup ) ) ) ); + if ( !aGroupSO->_is_nil() ) + aStudy->NewBuilder()->RemoveObject( aGroupSO ); + } + + // Remove the group from SMESH data structures + removeGroup( aGroup->GetLocalID() ); +} + + +//============================================================================= +/*! + * + */ +//============================================================================= + +SMESH::SMESH_subMesh_ptr SMESH_Mesh_i::createSubMesh( GEOM::GEOM_Shape_ptr theSubShape ) { + + TopoDS_Shape myLocSubShape = _gen_i->GetShapeReader()->GetShape(SMESH_Gen_i::GetGeomEngine(), theSubShape); + + ::SMESH_subMesh * mySubMesh = _impl->GetSubMesh(myLocSubShape); + int subMeshId = mySubMesh->GetId(); + SMESH_subMesh_i *subMeshServant = new SMESH_subMesh_i(myPOA, _gen_i, this, subMeshId); + SMESH::SMESH_subMesh_var subMesh + = SMESH::SMESH_subMesh::_narrow(subMeshServant->_this()); + + _mapSubMesh[subMeshId] = mySubMesh; + _mapSubMesh_i[subMeshId] = subMeshServant; + _mapSubMeshIor[subMeshId] + = SMESH::SMESH_subMesh::_duplicate(subMesh); - ASSERT(_mapSubMeshIor.find(subMeshId) != _mapSubMeshIor.end()); - return SMESH::SMESH_subMesh::_duplicate(_mapSubMeshIor[subMeshId]); + // register CORBA object for persistence + StudyContext* myStudyContext = _gen_i->GetCurrentStudyContext(); + string iorString = SMESH_Gen_i::GetORB()->object_to_string( subMesh ); + int nextId = myStudyContext->addObject( iorString ); + MESSAGE( "Add submesh to map with id = "<< nextId << " and IOR = " << iorString.c_str() ); + + return subMesh._retn(); } + +//============================================================================= +/*! + * + */ +//============================================================================= + +void SMESH_Mesh_i::removeSubMesh( SMESH::SMESH_subMesh_ptr theSubMesh, GEOM::GEOM_Shape_ptr theSubShape ) +{ + MESSAGE("SMESH_Mesh_i::removeSubMesh()"); + if ( theSubMesh->_is_nil() || theSubShape->_is_nil() ) + return; + + try { + SMESH::ListOfHypothesis_var aHypList = GetHypothesisList( theSubShape ); + for ( int i = 0, n = aHypList->length(); i < n; i++ ) { + removeHypothesis( theSubShape, aHypList[i] ); + } + } + catch( const SALOME::SALOME_Exception& ) { + MESSAGE("SMESH_Mesh_i::removeSubMesh(): exception caught!"); + } + + int subMeshId = theSubMesh->GetId(); + + _mapSubMesh.erase(subMeshId); + _mapSubMesh_i.erase(subMeshId); + _mapSubMeshIor.erase(subMeshId); + MESSAGE("SMESH_Mesh_i::removeSubMesh() completed"); +} + +//============================================================================= +/*! + * + */ +//============================================================================= + +SMESH::SMESH_Group_ptr SMESH_Mesh_i::createGroup( SMESH::ElementType theElemType, const char* theName ) +{ + int anId; + SMESH::SMESH_Group_var aGroup; + if ( _impl->AddGroup( (SMDSAbs_ElementType)theElemType, theName, anId ) ) { + SMESH_Group_i* aGroupImpl = new SMESH_Group_i( SMESH_Gen_i::GetPOA(), this, anId ); + aGroup = SMESH::SMESH_Group::_narrow( aGroupImpl->_this() ); + _mapGroups[anId] = SMESH::SMESH_Group::_duplicate( aGroup ); + + // register CORBA object for persistence + StudyContext* myStudyContext = _gen_i->GetCurrentStudyContext(); + string iorString = SMESH_Gen_i::GetORB()->object_to_string( aGroup ); + int nextId = myStudyContext->addObject( iorString ); + MESSAGE( "Add group to map with id = "<< nextId << " and IOR = " << iorString.c_str() ); + } + return aGroup._retn(); +} + + +//============================================================================= +/*! + * SMESH_Mesh_i::removeGroup + * + * Should be called by ~SMESH_Group_i() + */ +//============================================================================= + +void SMESH_Mesh_i::removeGroup( const int theId ) +{ + MESSAGE("SMESH_Mesh_i::removeGroup()" ); + if ( _mapGroups.find( theId ) != _mapGroups.end() ) { + _mapGroups.erase( theId ); + _impl->RemoveGroup( theId ); + } +} + + //============================================================================= /*! * @@ -472,43 +1074,6 @@ void SMESH_Mesh_i::SetImpl(::SMESH_Mesh * impl) return *_impl; } -//============================================================================= -/*! - * - */ -//============================================================================= - -GEOM::GEOM_Gen_ptr SMESH_Mesh_i::GetGeomEngine() -{ - MESSAGE("SMESH_Mesh_i::GetGeomEngine"); - return GEOM::GEOM_Gen::_duplicate(_geom); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -void SMESH_Mesh_i::SetIor(SMESH::SMESH_Mesh_ptr myIor) -{ - MESSAGE("SMESH_Mesh_i::SetIor"); - _myIor = SMESH::SMESH_Mesh::_duplicate(myIor); - ASSERT(!CORBA::is_nil(_myIor)); -} - -//============================================================================= -/*! - * - */ -//============================================================================= - -SMESH::SMESH_Mesh_ptr SMESH_Mesh_i::GetIor() -{ - MESSAGE("SMESH_Mesh_i::GetIor"); - ASSERT(!CORBA::is_nil(_myIor)); - return SMESH::SMESH_Mesh::_duplicate(_myIor); -} //============================================================================= /*! @@ -530,16 +1095,29 @@ SMESH::SMESH_MeshEditor_ptr SMESH_Mesh_i::GetMeshEditor() */ //============================================================================= -void SMESH_Mesh_i::ExportMED(const char *file) throw(SALOME::SALOME_Exception) +void SMESH_Mesh_i::ExportMED(const char *file, CORBA::Boolean auto_groups) throw(SALOME::SALOME_Exception) { - _impl->ExportMED(file); + Unexpect aCatch(SALOME_SalomeException); + SALOMEDS::Study_ptr aStudy = _gen_i->GetCurrentStudy(); + if ( aStudy->_is_nil() ) + return; + + char* aMeshName = NULL; + SALOMEDS::SObject_var aMeshSO = SALOMEDS::SObject::_narrow( aStudy->FindObjectIOR( ( SMESH_Gen_i::GetORB()->object_to_string( _this() ) ) ) ); + if ( !aMeshSO->_is_nil() ) + aMeshName = aMeshSO->GetName(); + + _impl->ExportMED( file, aMeshName, auto_groups ); } + void SMESH_Mesh_i::ExportDAT(const char *file) throw(SALOME::SALOME_Exception) { + Unexpect aCatch(SALOME_SalomeException); _impl->ExportDAT(file); } void SMESH_Mesh_i::ExportUNV(const char *file) throw(SALOME::SALOME_Exception) { + Unexpect aCatch(SALOME_SalomeException); _impl->ExportUNV(file); } @@ -551,6 +1129,7 @@ void SMESH_Mesh_i::ExportUNV(const char *file) throw(SALOME::SALOME_Exception) SALOME_MED::MESH_ptr SMESH_Mesh_i::GetMEDMesh()throw(SALOME::SALOME_Exception) { + Unexpect aCatch(SALOME_SalomeException); SMESH_MEDMesh_i *aMedMesh = new SMESH_MEDMesh_i(this); SALOME_MED::MESH_var aMesh = aMedMesh->_this(); return aMesh._retn(); @@ -563,6 +1142,7 @@ SALOME_MED::MESH_ptr SMESH_Mesh_i::GetMEDMesh()throw(SALOME::SALOME_Exception) //============================================================================= CORBA::Long SMESH_Mesh_i::NbNodes()throw(SALOME::SALOME_Exception) { + Unexpect aCatch(SALOME_SalomeException); return _impl->NbNodes(); } @@ -573,6 +1153,7 @@ CORBA::Long SMESH_Mesh_i::NbNodes()throw(SALOME::SALOME_Exception) //============================================================================= CORBA::Long SMESH_Mesh_i::NbEdges()throw(SALOME::SALOME_Exception) { + Unexpect aCatch(SALOME_SalomeException); return _impl->NbEdges(); } @@ -583,16 +1164,19 @@ CORBA::Long SMESH_Mesh_i::NbEdges()throw(SALOME::SALOME_Exception) //============================================================================= CORBA::Long SMESH_Mesh_i::NbFaces()throw(SALOME::SALOME_Exception) { + Unexpect aCatch(SALOME_SalomeException); return _impl->NbFaces(); } CORBA::Long SMESH_Mesh_i::NbTriangles()throw(SALOME::SALOME_Exception) { + Unexpect aCatch(SALOME_SalomeException); return _impl->NbTriangles(); } CORBA::Long SMESH_Mesh_i::NbQuadrangles()throw(SALOME::SALOME_Exception) { + Unexpect aCatch(SALOME_SalomeException); return _impl->NbQuadrangles(); } @@ -603,19 +1187,34 @@ CORBA::Long SMESH_Mesh_i::NbQuadrangles()throw(SALOME::SALOME_Exception) //============================================================================= CORBA::Long SMESH_Mesh_i::NbVolumes()throw(SALOME::SALOME_Exception) { + Unexpect aCatch(SALOME_SalomeException); return _impl->NbVolumes(); } CORBA::Long SMESH_Mesh_i::NbTetras()throw(SALOME::SALOME_Exception) { + Unexpect aCatch(SALOME_SalomeException); return _impl->NbTetras(); } CORBA::Long SMESH_Mesh_i::NbHexas()throw(SALOME::SALOME_Exception) { + Unexpect aCatch(SALOME_SalomeException); return _impl->NbHexas(); } +CORBA::Long SMESH_Mesh_i::NbPyramids()throw(SALOME::SALOME_Exception) +{ + Unexpect aCatch(SALOME_SalomeException); + return _impl->NbPyramids(); +} + +CORBA::Long SMESH_Mesh_i::NbPrisms()throw(SALOME::SALOME_Exception) +{ + Unexpect aCatch(SALOME_SalomeException); + return _impl->NbPrisms(); +} + //============================================================================= /*! * @@ -623,5 +1222,18 @@ CORBA::Long SMESH_Mesh_i::NbHexas()throw(SALOME::SALOME_Exception) //============================================================================= CORBA::Long SMESH_Mesh_i::NbSubMesh()throw(SALOME::SALOME_Exception) { + Unexpect aCatch(SALOME_SalomeException); return _impl->NbSubMesh(); } + +//============================================================================= +/*! + * + */ +//============================================================================= +char* SMESH_Mesh_i::Dump() +{ + std::ostringstream os; + _impl->Dump( os ); + return CORBA::string_dup( os.str().c_str() ); +} diff --git a/src/SMESH_I/SMESH_Mesh_i.hxx b/src/SMESH_I/SMESH_Mesh_i.hxx index ca631431e..48243c177 100644 --- a/src/SMESH_I/SMESH_Mesh_i.hxx +++ b/src/SMESH_I/SMESH_Mesh_i.hxx @@ -31,47 +31,62 @@ #include #include CORBA_SERVER_HEADER(SMESH_Mesh) +#include CORBA_SERVER_HEADER(SMESH_Group) #include CORBA_SERVER_HEADER(SMESH_Hypothesis) #include CORBA_CLIENT_HEADER(GEOM_Gen) #include CORBA_CLIENT_HEADER(GEOM_Shape) #include CORBA_CLIENT_HEADER(MED) class SMESH_Gen_i; +class SMESH_Group_i; +#include "SMESH_Hypothesis.hxx" #include "SMESH_Mesh.hxx" -#include "SMESH_Gen_i.hxx" #include "SMESH_subMesh_i.hxx" #include "SMESH_subMesh.hxx" #include "SMESH_topo.hxx" #include +#include "SALOME_GenericObj_i.hh" + class SMESH_Mesh_i: - public POA_SMESH::SMESH_Mesh + public virtual POA_SMESH::SMESH_Mesh, + public virtual SALOME::GenericObj_i { public: SMESH_Mesh_i(); - SMESH_Mesh_i(SMESH_Gen_i* myGen_i, - GEOM::GEOM_Gen_ptr geomEngine, - CORBA::Long studyId, - int localId); + SMESH_Mesh_i( PortableServer::POA_ptr thePOA, + SMESH_Gen_i* myGen_i, + CORBA::Long studyId ); virtual ~SMESH_Mesh_i(); // --- CORBA + void SetShape( GEOM::GEOM_Shape_ptr theShape ) + throw (SALOME::SALOME_Exception); - CORBA::Boolean AddHypothesis(GEOM::GEOM_Shape_ptr aSubShape, - SMESH::SMESH_Hypothesis_ptr anHyp) + SMESH::Hypothesis_Status AddHypothesis(GEOM::GEOM_Shape_ptr aSubShape, + SMESH::SMESH_Hypothesis_ptr anHyp) throw (SALOME::SALOME_Exception); - CORBA::Boolean RemoveHypothesis(GEOM::GEOM_Shape_ptr aSubShape, - SMESH::SMESH_Hypothesis_ptr anHyp) + SMESH::Hypothesis_Status RemoveHypothesis(GEOM::GEOM_Shape_ptr aSubShape, + SMESH::SMESH_Hypothesis_ptr anHyp) throw (SALOME::SALOME_Exception); SMESH::ListOfHypothesis* GetHypothesisList(GEOM::GEOM_Shape_ptr aSubShape) throw (SALOME::SALOME_Exception); - SMESH::SMESH_subMesh_ptr GetElementsOnShape(GEOM::GEOM_Shape_ptr aSubShape) + SMESH::SMESH_subMesh_ptr GetSubMesh(GEOM::GEOM_Shape_ptr aSubShape, const char* theName) + throw (SALOME::SALOME_Exception); + + void RemoveSubMesh( SMESH::SMESH_subMesh_ptr theSubMesh ) + throw (SALOME::SALOME_Exception); + + SMESH::SMESH_Group_ptr CreateGroup( SMESH::ElementType theElemType, const char* theName ) + throw (SALOME::SALOME_Exception); + + void RemoveGroup( SMESH::SMESH_Group_ptr theGroup ) throw (SALOME::SALOME_Exception); // SMESH::string_array* GetLog(CORBA::Boolean clearAfterGet) @@ -94,13 +109,17 @@ public: // --- C++ interface void SetImpl(::SMESH_Mesh* impl); - ::SMESH_Mesh& GetImpl(); // :: force no namespace here - GEOM::GEOM_Gen_ptr GetGeomEngine(); - void SetIor(SMESH::SMESH_Mesh_ptr myIor); - SMESH::SMESH_Mesh_ptr GetIor(); - void ExportMED( const char* file ) + SMESH_Gen_i* GetGen() { return _gen_i; } + + /*! + * consult DriverMED_R_SMESHDS_Mesh::ReadStatus for returned value + */ + SMESH::DriverMED_ReadStatus ImportMEDFile( const char* theFileName, const char* theMeshName ) + throw (SALOME::SALOME_Exception); + + void ExportMED( const char* file, CORBA::Boolean auto_groups ) throw (SALOME::SALOME_Exception); void ExportDAT( const char* file ) throw (SALOME::SALOME_Exception); @@ -134,25 +153,49 @@ public: CORBA::Long NbHexas() throw (SALOME::SALOME_Exception); + CORBA::Long NbPyramids() + throw (SALOME::SALOME_Exception); + + CORBA::Long NbPrisms() + throw (SALOME::SALOME_Exception); + CORBA::Long NbSubMesh() throw (SALOME::SALOME_Exception); + + char* Dump(); + + // Internal methods not available through CORBA + // They are called by corresponding interface methods + SMESH_Hypothesis::Hypothesis_Status addHypothesis(GEOM::GEOM_Shape_ptr aSubShape, + SMESH::SMESH_Hypothesis_ptr anHyp); + + SMESH_Hypothesis::Hypothesis_Status removeHypothesis(GEOM::GEOM_Shape_ptr aSubShape, + SMESH::SMESH_Hypothesis_ptr anHyp); + bool setShape( GEOM::GEOM_Shape_ptr theShape ); + + int importMEDFile( const char* theFileName, const char* theMeshName ); + + SMESH::SMESH_subMesh_ptr createSubMesh( GEOM::GEOM_Shape_ptr theSubShape ); + + void removeSubMesh( SMESH::SMESH_subMesh_ptr theSubMesh, GEOM::GEOM_Shape_ptr theSubShape ); + + SMESH::SMESH_Group_ptr createGroup( SMESH::ElementType theElemType, const char* theName ); + + void removeGroup( const int theId ); map _mapSubMesh_i; //NRI map _mapSubMesh; //NRI private: - + static int myIdGenerator; ::SMESH_Mesh* _impl; // :: force no namespace here SMESH_Gen_i* _gen_i; - // CORBA::ORB_ptr _orb; -// SMESH_topo* _topo; // all local TopoDS_Shape of subShapes int _id; // id given by creator (unique within the creator instance) - GEOM::GEOM_Gen_var _geom; int _studyId; - // int _localId; // id attributed to all objects created by Mesh_i - map _mapSubMeshIor; - SMESH::SMESH_Mesh_var _myIor; + map _mapSubMeshIor; + map _mapGroups; + map _mapHypo; }; #endif diff --git a/src/SMESH_I/SMESH_subMesh_i.cxx b/src/SMESH_I/SMESH_subMesh_i.cxx index 3ed4d2965..8c6563ffd 100644 --- a/src/SMESH_I/SMESH_subMesh_i.cxx +++ b/src/SMESH_I/SMESH_subMesh_i.cxx @@ -35,6 +35,7 @@ using namespace std; #include "Utils_CorbaException.hxx" #include "utilities.h" #include "OpUtil.hxx" +#include "Utils_ExceptHandlers.hxx" //============================================================================= /*! @@ -43,6 +44,7 @@ using namespace std; //============================================================================= SMESH_subMesh_i::SMESH_subMesh_i() + : SALOME::GenericObj_i( PortableServer::POA::_nil() ) { MESSAGE("SMESH_subMesh_i::SMESH_subMesh_i default, not for use"); ASSERT(0); @@ -54,14 +56,17 @@ SMESH_subMesh_i::SMESH_subMesh_i() */ //============================================================================= -SMESH_subMesh_i::SMESH_subMesh_i(SMESH_Gen_i* gen_i, - SMESH_Mesh_i* mesh_i, - int localId) +SMESH_subMesh_i::SMESH_subMesh_i( PortableServer::POA_ptr thePOA, + SMESH_Gen_i* gen_i, + SMESH_Mesh_i* mesh_i, + int localId ) + : SALOME::GenericObj_i( thePOA ) { MESSAGE("SMESH_subMesh_i::SMESH_subMesh_i"); _gen_i = gen_i; _mesh_i = mesh_i; _localId = localId; + thePOA->activate_object( this ); // **** } //============================================================================= @@ -85,8 +90,16 @@ SMESH_subMesh_i::~SMESH_subMesh_i() CORBA::Long SMESH_subMesh_i::GetNumberOfElements() throw (SALOME::SALOME_Exception) { + Unexpect aCatch(SALOME_SalomeException); MESSAGE("SMESH_subMesh_i::GetNumberOfElements"); - // **** + if ( _mesh_i->_mapSubMesh.find( _localId ) == _mesh_i->_mapSubMesh.end() ) + return 0; + + SMESHDS_SubMesh* aSubMeshDS = _mesh_i->_mapSubMesh[_localId]->GetSubMeshDS(); + if ( aSubMeshDS == NULL ) + return 0; + + return aSubMeshDS->NbElements(); } //============================================================================= @@ -98,8 +111,16 @@ CORBA::Long SMESH_subMesh_i::GetNumberOfElements() CORBA::Long SMESH_subMesh_i::GetNumberOfNodes() throw (SALOME::SALOME_Exception) { + Unexpect aCatch(SALOME_SalomeException); MESSAGE("SMESH_subMesh_i::GetNumberOfNodes"); - // **** + if ( _mesh_i->_mapSubMesh.find( _localId ) == _mesh_i->_mapSubMesh.end() ) + return 0; + + SMESHDS_SubMesh* aSubMeshDS = _mesh_i->_mapSubMesh[_localId]->GetSubMeshDS(); + if ( aSubMeshDS == NULL ) + return 0; + + return aSubMeshDS->NbNodes(); } //============================================================================= @@ -111,8 +132,74 @@ CORBA::Long SMESH_subMesh_i::GetNumberOfNodes() SMESH::long_array* SMESH_subMesh_i::GetElementsId() throw (SALOME::SALOME_Exception) { + Unexpect aCatch(SALOME_SalomeException); MESSAGE("SMESH_subMesh_i::GetElementsId"); - // **** + SMESH::long_array_var aResult = new SMESH::long_array(); + + if ( _mesh_i->_mapSubMesh.find( _localId ) == _mesh_i->_mapSubMesh.end() ) + return aResult._retn(); + + SMESHDS_SubMesh* aSubMeshDS = _mesh_i->_mapSubMesh[_localId]->GetSubMeshDS(); + if ( aSubMeshDS == NULL ) + return aResult._retn(); + + aResult->length( aSubMeshDS->NbElements() ); + SMDS_ElemIteratorPtr anIt = aSubMeshDS->GetElements(); + for ( int i = 0, n = aSubMeshDS->NbElements(); i < n && anIt->more(); i++ ) + aResult[i] = anIt->next()->GetID(); + + return aResult._retn(); +} + + +//============================================================================= +/*! + * + */ +//============================================================================= + +SMESH::long_array* SMESH_subMesh_i::GetElementsByType( SMESH::ElementType theElemType ) + throw (SALOME::SALOME_Exception) +{ + Unexpect aCatch(SALOME_SalomeException); + MESSAGE("SMESH_subMesh_i::GetElementsByType"); + SMESH::long_array_var aResult = new SMESH::long_array(); + + if ( _mesh_i->_mapSubMesh.find( _localId ) == _mesh_i->_mapSubMesh.end() ) + return aResult._retn(); + + SMESHDS_SubMesh* aSubMeshDS = _mesh_i->_mapSubMesh[_localId]->GetSubMeshDS(); + if ( aSubMeshDS == NULL ) + return aResult._retn(); + + int i = 0; + if ( theElemType == SMESH::ALL ) + aResult->length( aSubMeshDS->NbElements() + aSubMeshDS->NbNodes() ); + else if ( theElemType == SMESH::NODE ) + aResult->length( aSubMeshDS->NbNodes() ); + else + aResult->length( aSubMeshDS->NbElements() ); + + int n = aResult->length(); + + if ( theElemType == SMESH::ALL || theElemType == SMESH::NODE ) { + SMDS_NodeIteratorPtr anIt = aSubMeshDS->GetNodes(); + while ( i < n && anIt->more() ) + aResult[i++] = anIt->next()->GetID(); + } + + if ( theElemType == SMESH::ALL || theElemType != SMESH::NODE ) { + SMDS_ElemIteratorPtr anIt = aSubMeshDS->GetElements(); + while ( i < n && anIt->more() ) { + const SMDS_MeshElement* anElem = anIt->next(); + if ( theElemType == SMESH::ALL || anElem->GetType() == (SMDSAbs_ElementType)theElemType ) + aResult[i++] = anElem->GetID(); + } + } + + aResult->length( i ); + + return aResult._retn(); } //============================================================================= @@ -124,8 +211,23 @@ SMESH::long_array* SMESH_subMesh_i::GetElementsId() SMESH::long_array* SMESH_subMesh_i::GetNodesId() throw (SALOME::SALOME_Exception) { + Unexpect aCatch(SALOME_SalomeException); MESSAGE("SMESH_subMesh_i::GetNodesId"); - // **** + SMESH::long_array_var aResult = new SMESH::long_array(); + + if ( _mesh_i->_mapSubMesh.find( _localId ) == _mesh_i->_mapSubMesh.end() ) + return aResult._retn(); + + SMESHDS_SubMesh* aSubMeshDS = _mesh_i->_mapSubMesh[_localId]->GetSubMeshDS(); + if ( aSubMeshDS == NULL ) + return aResult._retn(); + + aResult->length( aSubMeshDS->NbNodes() ); + SMDS_NodeIteratorPtr anIt = aSubMeshDS->GetNodes(); + for ( int i = 0, n = aSubMeshDS->NbNodes(); i < n && anIt->more(); i++ ) + aResult[i] = anIt->next()->GetID(); + + return aResult._retn(); } //============================================================================= @@ -137,9 +239,9 @@ SMESH::long_array* SMESH_subMesh_i::GetNodesId() SMESH::SMESH_Mesh_ptr SMESH_subMesh_i::GetFather() throw (SALOME::SALOME_Exception) { + Unexpect aCatch(SALOME_SalomeException); MESSAGE("SMESH_subMesh_i::GetFather"); - SMESH::SMESH_Mesh_var meshIor = _mesh_i->GetIor(); - return SMESH::SMESH_Mesh::_duplicate(meshIor); + return _mesh_i->_this(); } //============================================================================= @@ -162,6 +264,7 @@ CORBA::Long SMESH_subMesh_i::GetId() SALOME_MED::FAMILY_ptr SMESH_subMesh_i::GetFamily() throw (SALOME::SALOME_Exception) { + Unexpect aCatch(SALOME_SalomeException); SALOME_MED::MESH_var MEDMesh = GetFather()->GetMEDMesh(); SALOME_MED::Family_array_var families = diff --git a/src/SMESH_I/SMESH_subMesh_i.hxx b/src/SMESH_I/SMESH_subMesh_i.hxx index 0708405e5..9b456af4b 100644 --- a/src/SMESH_I/SMESH_subMesh_i.hxx +++ b/src/SMESH_I/SMESH_subMesh_i.hxx @@ -36,17 +36,21 @@ #include CORBA_CLIENT_HEADER(GEOM_Shape) #include CORBA_CLIENT_HEADER(MED) +#include "SALOME_GenericObj_i.hh" + class SMESH_Gen_i; class SMESH_Mesh_i; class SMESH_subMesh_i: - public POA_SMESH::SMESH_subMesh + public virtual POA_SMESH::SMESH_subMesh, + public virtual SALOME::GenericObj_i { public: SMESH_subMesh_i(); - SMESH_subMesh_i(SMESH_Gen_i* gen_i, - SMESH_Mesh_i* mesh_i, - int localId); + SMESH_subMesh_i( PortableServer::POA_ptr thePOA, + SMESH_Gen_i* gen_i, + SMESH_Mesh_i* mesh_i, + int localId ); ~SMESH_subMesh_i(); CORBA::Long GetNumberOfElements() @@ -57,6 +61,9 @@ public: SMESH::long_array* GetElementsId() throw (SALOME::SALOME_Exception); + + SMESH::long_array* GetElementsByType( SMESH::ElementType theElemType ) + throw (SALOME::SALOME_Exception); SMESH::long_array* GetNodesId() throw (SALOME::SALOME_Exception); diff --git a/src/SMESH_I/SMESH_test.py b/src/SMESH_I/SMESH_test.py index 3023a28d0..e823f9028 100644 --- a/src/SMESH_I/SMESH_test.py +++ b/src/SMESH_I/SMESH_test.py @@ -25,6 +25,8 @@ # Module : SMESH import SMESH +import StdMeshers + import smeshpy import salome from salome import sg @@ -76,41 +78,41 @@ ide=geompy.addToStudyInFather(face,edge,name) # ---- launch SMESH, init a Mesh with the box gen=smeshpy.smeshpy() -mesh=gen.Init(idb) +mesh=gen.CreateMesh(idb) # ---- create Hypothesis print "-------------------------- create Hypothesis" print "-------------------------- LocalLength" -hyp1=gen.CreateHypothesis("LocalLength") +hyp1=gen.CreateHypothesis("LocalLength","libStdMeshersEngine.so") print hyp1.GetName() print hyp1.GetId() -hypo1 = hyp1._narrow(SMESH.SMESH_LocalLength) +hypo1 = hyp1._narrow(StdMeshers.StdMeshers_LocalLength) print hypo1.GetLength() hypo1.SetLength(100) print hypo1.GetLength() print "-------------------------- bidon" -hyp3=gen.CreateHypothesis("bidon") +hyp3=gen.CreateHypothesis("bidon","") print "-------------------------- NumberOfSegments" -hyp3=gen.CreateHypothesis("NumberOfSegments") -hypo3=hyp3._narrow(SMESH.SMESH_NumberOfSegments) +hyp3=gen.CreateHypothesis("NumberOfSegments","libStdMeshersEngine.so") +hypo3=hyp3._narrow(StdMeshers.StdMeshers_NumberOfSegments) hypo3.SetNumberOfSegments(7) print hypo3.GetName() print hypo3.GetNumberOfSegments() print hypo3.GetId() print "-------------------------- MaxElementArea" -hyp4=gen.CreateHypothesis("MaxElementArea") -hypo4=hyp4._narrow(SMESH.SMESH_MaxElementArea) +hyp4=gen.CreateHypothesis("MaxElementArea","libStdMeshersEngine.so") +hypo4=hyp4._narrow(StdMeshers.StdMeshers_MaxElementArea) hypo4.SetMaxElementArea(5000) print hypo4.GetName() print hypo4.GetMaxElementArea() print hypo4.GetId() print "-------------------------- Regular_1D" -alg1=gen.CreateHypothesis("Regular_1D") +alg1=gen.CreateHypothesis("Regular_1D","libStdMeshersEngine.so") print alg1.GetName() print alg1.GetId() algo1=alg1._narrow(SMESH.SMESH_Algo) @@ -118,18 +120,18 @@ listHyp=algo1.GetCompatibleHypothesis() for hyp in listHyp: print hyp -algo_1=alg1._narrow(SMESH.SMESH_Regular_1D) +algo_1=alg1._narrow(StdMeshers.StdMeshers_Regular_1D) print algo_1.GetId() print "-------------------------- MEFISTO_2D" -alg2=gen.CreateHypothesis("MEFISTO_2D") +alg2=gen.CreateHypothesis("MEFISTO_2D","libStdMeshersEngine.so") print alg2.GetName() print alg2.GetId() algo2=alg2._narrow(SMESH.SMESH_Algo) listHyp=algo2.GetCompatibleHypothesis() for hyp in listHyp: print hyp -algo_2=alg2._narrow(SMESH.SMESH_MEFISTO_2D) +algo_2=alg2._narrow(StdMeshers.StdMeshers_MEFISTO_2D) print algo_2.GetId() # ---- add hypothesis to edge diff --git a/src/SMESH_I/smeshpy.py b/src/SMESH_I/smeshpy.py index ccc54cacf..9fb4709e7 100644 --- a/src/SMESH_I/smeshpy.py +++ b/src/SMESH_I/smeshpy.py @@ -44,14 +44,15 @@ class smeshpy: self._smesh = salome.lcc.FindOrLoadComponent("FactoryServer","SMESH") except: MESSAGE( "exception in smeshpy:__init__" ) - self._studyId = salome.myStudyId + self._study = salome.myStudy + self._smesh.SetCurrentStudy(self._study) #-------------------------------------------------------------------------- - def Init(self, shapeId): + def CreateMesh(self, shapeId): try: shape = salome.IDToObject(shapeId) - aMesh = self._smesh.Init(self._geom, self._studyId, shape) + aMesh = self._smesh.CreateMesh(shape) return aMesh except: MESSAGE( "exception in smeshpy:Init" ) @@ -59,9 +60,9 @@ class smeshpy: #-------------------------------------------------------------------------- - def CreateHypothesis(self, name): + def CreateHypothesis(self, name, libname): try: - hyp = self._smesh.CreateHypothesis(name,self._studyId) + hyp = self._smesh.CreateHypothesis(name, libname) return hyp except: MESSAGE( "exception in smeshpy:CreateHypothesis" ) diff --git a/src/SMESH_SWIG/Makefile.in b/src/SMESH_SWIG/Makefile.in index 2965e0403..343100a93 100644 --- a/src/SMESH_SWIG/Makefile.in +++ b/src/SMESH_SWIG/Makefile.in @@ -43,6 +43,7 @@ EXPORT_PYSCRIPTS = libSMESH_Swig.py \ SMESH_test1.py \ SMESH_test2.py \ SMESH_test3.py \ + SMESH_test4.py \ SMESH_mechanic.py \ SMESH_mechanic_tetra.py \ SMESH_fixation.py \ @@ -53,7 +54,10 @@ EXPORT_PYSCRIPTS = libSMESH_Swig.py \ SMESH_box2_tetra.py \ SMESH_box3_tetra.py \ SMESH_flight_skin.py \ - SMESH_Partition1_tetra.py + SMESH_Partition1_tetra.py\ + batchmode_mefisto.py \ + SMESH_controls.py \ + SMESH_freebord.py LIB_CLIENT_IDL = SALOMEDS.idl \ SALOME_Exception.idl \ @@ -63,14 +67,16 @@ LIB_CLIENT_IDL = SALOMEDS.idl \ SMESH_Mesh.idl \ SMESH_Hypothesis.idl \ SMESH_BasicHypothesis.idl \ + SMESH_Group.idl \ SALOME_ModuleCatalog.idl \ SALOME_Component.idl \ + SALOME_GenericObj.idl \ MED.idl EXPORT_SHAREDPYSCRIPTS=SMESH_shared_modules.py CPPFLAGS+=$(QT_INCLUDES) $(PYTHON_INCLUDES) $(OCC_INCLUDES) $(VTK_INCLUDES) $(OGL_INCLUDES) -DHAVE_CONFIG_H LIBS+= $(PYTHON_LIBS) -LDFLAGS+= -lSMESHGUI +LDFLAGS+= -lSMESHGUI -L${KERNEL_ROOT_DIR}/lib/salome -lSalomeGenericObj @CONCLUDE@ diff --git a/src/SMESH_SWIG/SMESH_Partition1_tetra.py b/src/SMESH_SWIG/SMESH_Partition1_tetra.py index 1478f01b7..fd72c8e18 100644 --- a/src/SMESH_SWIG/SMESH_Partition1_tetra.py +++ b/src/SMESH_SWIG/SMESH_Partition1_tetra.py @@ -1,245 +1,227 @@ -# -# Tetrahedrization of the geometry generated by the Python script GEOM_Partition1.py -# Hypothesis and algorithms for the mesh generation are global -# -#%Make geometry (like CEA script (A1)) using Partition algorithm% from OCC -# -- Rayon de la bariere - -barier_height = 7.0 -barier_radius = 5.6 / 2 # Rayon de la bariere -colis_radius = 1.0 / 2 # Rayon du colis -colis_step = 2.0 # Distance s‰parant deux colis -cc_width = 0.11 # Epaisseur du complement de colisage - -# -- - -cc_radius = colis_radius + cc_width -from math import sqrt -colis_center = sqrt(2.0)*colis_step/2 - -# -- - -import geompy -geom = geompy.geom - -boolean_common = 1 -boolean_cut = 2 -boolean_fuse = 3 -boolean_section = 4 - -# -- - -barier = geompy.MakeCylinder( - geom.MakePointStruct(0.,0.,0.), - geom.MakeDirection(geom.MakePointStruct(0.,0.,1.)), - barier_radius, - barier_height) - -# -- - -colis = geompy.MakeCylinder( - geom.MakePointStruct(0.,0.,0.), - geom.MakeDirection(geom.MakePointStruct(0.,0.,1.)), - colis_radius, - barier_height) - -cc = geompy.MakeCylinder( - geom.MakePointStruct(0.,0.,0.), - geom.MakeDirection(geom.MakePointStruct(0.,0.,1.)), - cc_radius, - barier_height) - -colis_cc = geompy.MakeCompound( - [colis._get_Name(), cc._get_Name()]) - -colis_cc = geompy.MakeTranslation( - colis_cc, colis_center, 0.0, 0.0) - -colis_cc_multi = geompy.MakeMultiRotation1D( - colis_cc, - geom.MakeDirection(geom.MakePointStruct(0.,0.,1.)), - geom.MakePointStruct(0.,0.,0.), - 4) - -# -- - -alveole = geompy.Partition( - [colis_cc_multi._get_Name(), barier._get_Name()]) - -ShapeTypeShell = 3 -ShapeTypeFace = 4 -ShapeTypeEdge = 6 - -print "Analysis of the geometry to mesh (right after the Partition) :" - -subShellList=geompy.SubShapeAll(alveole,ShapeTypeShell) -subFaceList=geompy.SubShapeAll(alveole,ShapeTypeFace) -subEdgeList=geompy.SubShapeAll(alveole,ShapeTypeEdge) - -print "number of Shells in alveole : ",len(subShellList) -print "number of Faces in alveole : ",len(subFaceList) -print "number of Edges in alveole : ",len(subEdgeList) - -subshapes = geompy.SubShapeAll( alveole, geompy.ShapeType["SHAPE"] ) - -## there are 9 subshapes - -comp1 = geompy.MakeCompound( [ subshapes[0]._get_Name(), subshapes[1]._get_Name() ] ); -comp2 = geompy.MakeCompound( [ subshapes[2]._get_Name(), subshapes[3]._get_Name() ] ); -comp3 = geompy.MakeCompound( [ subshapes[4]._get_Name(), subshapes[5]._get_Name() ] ); -comp4 = geompy.MakeCompound( [ subshapes[6]._get_Name(), subshapes[7]._get_Name() ] ); - -compIORs = [] -compIORs.append( comp1._get_Name() ); -compIORs.append( comp2._get_Name() ); -compIORs.append( comp3._get_Name() ); -compIORs.append( comp4._get_Name() ); -comp = geompy.MakeCompound( compIORs ); - -alveole = geompy.MakeCompound( [ comp._get_Name(), subshapes[8]._get_Name() ]); - -idalveole= geompy.addToStudy(alveole, "alveole") - -print "Analysis of the geometry to mesh (right after the MakeCompound) :" - -subShellList=geompy.SubShapeAll(alveole,ShapeTypeShell) -subFaceList=geompy.SubShapeAll(alveole,ShapeTypeFace) -subEdgeList=geompy.SubShapeAll(alveole,ShapeTypeEdge) - -print "number of Shells in alveole : ",len(subShellList) -print "number of Faces in alveole : ",len(subFaceList) -print "number of Edges in alveole : ",len(subEdgeList) - -status=geompy.CheckShape(alveole) -print " check status ", status - -# ---- launch SMESH - -import salome -from salome import sg - -import SMESH -import smeshpy - -smeshgui = salome.ImportComponentGUI("SMESH") -smeshgui.Init(salome.myStudyId) - -gen=smeshpy.smeshpy() - -# ---- create Hypothesis - -print "-------------------------- create Hypothesis (In this case global hypothesis are used)" - -print "-------------------------- NumberOfSegments" - -numberOfSegments = 10 - -hyp1=gen.CreateHypothesis("NumberOfSegments") -hypNbSeg=hyp1._narrow(SMESH.SMESH_NumberOfSegments) -hypNbSeg.SetNumberOfSegments(numberOfSegments) -hypNbSegID = hypNbSeg.GetId() -print hypNbSeg.GetName() -print hypNbSegID -print hypNbSeg.GetNumberOfSegments() - -idseg = smeshgui.AddNewHypothesis( salome.orb.object_to_string(hypNbSeg) ) -smeshgui.SetName(idseg, "NumberOfSegments") - -print "-------------------------- MaxElementArea" - -maxElementArea = 0.1 - -hyp2=gen.CreateHypothesis("MaxElementArea") -hypArea=hyp2._narrow(SMESH.SMESH_MaxElementArea) -hypArea.SetMaxElementArea(maxElementArea) -print hypArea.GetName() -print hypArea.GetId() -print hypArea.GetMaxElementArea() - -idarea = smeshgui.AddNewHypothesis( salome.orb.object_to_string(hypArea) ) -smeshgui.SetName(idarea, "MaxElementArea") - -print "-------------------------- MaxElementVolume" - -maxElementVolume = 0.5 - -hyp3=gen.CreateHypothesis("MaxElementVolume") -hypVolume=hyp3._narrow(SMESH.SMESH_MaxElementVolume) -hypVolume.SetMaxElementVolume(maxElementVolume) -print hypVolume.GetName() -print hypVolume.GetId() -print hypVolume.GetMaxElementVolume() - -idvolume = smeshgui.AddNewHypothesis( salome.orb.object_to_string(hypVolume) ) -smeshgui.SetName(idvolume, "MaxElementVolume") - -# ---- create Algorithms - -print "-------------------------- create Algorithms" - -print "-------------------------- Regular_1D" - -hypothesis=gen.CreateHypothesis("Regular_1D") -regular1D = hypothesis._narrow(SMESH.SMESH_Regular_1D) -regularID = smeshgui.AddNewAlgorithms( salome.orb.object_to_string(regular1D) ) -smeshgui.SetName(regularID, "Wire Discretisation") - -print "-------------------------- MEFISTO_2D" - -hypothesis=gen.CreateHypothesis("MEFISTO_2D") -mefisto2D = hypothesis._narrow(SMESH.SMESH_MEFISTO_2D) -mefistoID = smeshgui.AddNewAlgorithms( salome.orb.object_to_string(mefisto2D) ) -smeshgui.SetName(mefistoID, "MEFISTO_2D") - -print "-------------------------- NETGEN_3D" - -hypothesis=gen.CreateHypothesis("NETGEN_3D") -netgen3D = hypothesis._narrow(SMESH.SMESH_NETGEN_3D) -netgenID = smeshgui.AddNewAlgorithms( salome.orb.object_to_string(netgen3D) ) -smeshgui.SetName(netgenID, "NETGEN_3D") - -# ---- init a Mesh with the alveole - -mesh=gen.Init(idalveole) -idmesh = smeshgui.AddNewMesh( salome.orb.object_to_string(mesh) ) -smeshgui.SetName(idmesh, "MeshAlveole") -smeshgui.SetShape(idalveole, idmesh) - -# ---- add hypothesis to alveole - -print "-------------------------- add hypothesis to alveole" - -ret=mesh.AddHypothesis(alveole,regular1D) -print ret -ret=mesh.AddHypothesis(alveole,hypNbSeg) -print ret -ret=mesh.AddHypothesis(alveole,mefisto2D) -print ret -ret=mesh.AddHypothesis(alveole,hypArea) -print ret -ret=mesh.AddHypothesis(alveole,netgen3D) -print ret -ret=mesh.AddHypothesis(alveole,hypVolume) -print ret - -smeshgui.SetAlgorithms( idmesh, regularID) -smeshgui.SetHypothesis( idmesh, idseg ) -smeshgui.SetAlgorithms( idmesh, mefistoID ) -smeshgui.SetHypothesis( idmesh, idarea ) -smeshgui.SetAlgorithms( idmesh, netgenID ) -smeshgui.SetHypothesis( idmesh, idvolume ) - -sg.updateObjBrowser(1) - - -print "-------------------------- compute the mesh of alveole " -ret=gen.Compute(mesh,idalveole) -print ret -if ret != 0: - log=mesh.GetLog(0) # no erase trace - for linelog in log: - print linelog -else: - print "problem when computing the mesh" - -sg.updateObjBrowser(1) +# +# Tetrahedrization of the geometry generated by the Python script GEOM_Partition1.py +# Hypothesis and algorithms for the mesh generation are global +# +#%Make geometry (like CEA script (A1)) using Partition algorithm% from OCC +# -- Rayon de la bariere + +import salome +import geompy + +import StdMeshers +import NETGENPlugin + +geom = salome.lcc.FindOrLoadComponent("FactoryServer", "GEOM") +smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH") + +geom.GetCurrentStudy(salome.myStudy._get_StudyId()) +smesh.SetCurrentStudy(salome.myStudy) + +smeshgui = salome.ImportComponentGUI("SMESH") +smeshgui.Init(salome.myStudyId); + +#--------------------------------------------------------------- + +barier_height = 7.0 +barier_radius = 5.6 / 2 # Rayon de la bariere +colis_radius = 1.0 / 2 # Rayon du colis +colis_step = 2.0 # Distance s‰parant deux colis +cc_width = 0.11 # Epaisseur du complement de colisage + +# -- + +cc_radius = colis_radius + cc_width +from math import sqrt +colis_center = sqrt(2.0)*colis_step/2 + +# -- + +boolean_common = 1 +boolean_cut = 2 +boolean_fuse = 3 +boolean_section = 4 + +# -- + +barier = geompy.MakeCylinder( + geom.MakePointStruct(0.,0.,0.), + geom.MakeDirection(geom.MakePointStruct(0.,0.,1.)), + barier_radius, + barier_height) + +# -- + +colis = geompy.MakeCylinder( + geom.MakePointStruct(0.,0.,0.), + geom.MakeDirection(geom.MakePointStruct(0.,0.,1.)), + colis_radius, + barier_height) + +cc = geompy.MakeCylinder( + geom.MakePointStruct(0.,0.,0.), + geom.MakeDirection(geom.MakePointStruct(0.,0.,1.)), + cc_radius, + barier_height) + +colis_cc = geompy.MakeCompound( + [colis._get_Name(), cc._get_Name()]) + +colis_cc = geompy.MakeTranslation( + colis_cc, colis_center, 0.0, 0.0) + +colis_cc_multi = geompy.MakeMultiRotation1D( + colis_cc, + geom.MakeDirection(geom.MakePointStruct(0.,0.,1.)), + geom.MakePointStruct(0.,0.,0.), + 4) + +# -- + +alveole = geompy.Partition( + [colis_cc_multi._get_Name(), barier._get_Name()]) + +ShapeTypeShell = 3 +ShapeTypeFace = 4 +ShapeTypeEdge = 6 + +print "Analysis of the geometry to mesh (right after the Partition) :" + +subShellList=geompy.SubShapeAll(alveole,ShapeTypeShell) +subFaceList=geompy.SubShapeAll(alveole,ShapeTypeFace) +subEdgeList=geompy.SubShapeAll(alveole,ShapeTypeEdge) + +print "number of Shells in alveole : ",len(subShellList) +print "number of Faces in alveole : ",len(subFaceList) +print "number of Edges in alveole : ",len(subEdgeList) + +subshapes = geompy.SubShapeAll( alveole, geompy.ShapeType["SHAPE"] ) + +## there are 9 subshapes + +comp1 = geompy.MakeCompound( [ subshapes[0]._get_Name(), subshapes[1]._get_Name() ] ); +comp2 = geompy.MakeCompound( [ subshapes[2]._get_Name(), subshapes[3]._get_Name() ] ); +comp3 = geompy.MakeCompound( [ subshapes[4]._get_Name(), subshapes[5]._get_Name() ] ); +comp4 = geompy.MakeCompound( [ subshapes[6]._get_Name(), subshapes[7]._get_Name() ] ); + +compIORs = [] +compIORs.append( comp1._get_Name() ); +compIORs.append( comp2._get_Name() ); +compIORs.append( comp3._get_Name() ); +compIORs.append( comp4._get_Name() ); +comp = geompy.MakeCompound( compIORs ); + +alveole = geompy.MakeCompound( [ comp._get_Name(), subshapes[8]._get_Name() ]); + +idalveole= geompy.addToStudy(alveole, "alveole") + +print "Analysis of the geometry to mesh (right after the MakeCompound) :" + +subShellList=geompy.SubShapeAll(alveole,ShapeTypeShell) +subFaceList=geompy.SubShapeAll(alveole,ShapeTypeFace) +subEdgeList=geompy.SubShapeAll(alveole,ShapeTypeEdge) + +print "number of Shells in alveole : ",len(subShellList) +print "number of Faces in alveole : ",len(subFaceList) +print "number of Edges in alveole : ",len(subEdgeList) + +status=geompy.CheckShape(alveole) +print " check status ", status + +# ---- launch SMESH + +# ---- create Hypothesis + +print "-------------------------- create Hypothesis (In this case global hypothesis are used)" + +print "-------------------------- NumberOfSegments" + +numberOfSegments = 10 + +hypNbSeg=smesh.CreateHypothesis("NumberOfSegments", "libStdMeshersEngine.so") +hypNbSeg.SetNumberOfSegments(numberOfSegments) +print hypNbSeg.GetName() +print hypNbSeg.GetId() +print hypNbSeg.GetNumberOfSegments() + +smeshgui.SetName(salome.ObjectToID(hypNbSeg), "NumberOfSegments_10") + +print "-------------------------- MaxElementArea" + +maxElementArea = 0.1 + +hypArea=smesh.CreateHypothesis("MaxElementArea", "libStdMeshersEngine.so") +hypArea.SetMaxElementArea(maxElementArea) +print hypArea.GetName() +print hypArea.GetId() +print hypArea.GetMaxElementArea() + +smeshgui.SetName(salome.ObjectToID(hypArea), "MaxElementArea_0.1") + +print "-------------------------- MaxElementVolume" + +maxElementVolume = 0.5 + +hypVolume=smesh.CreateHypothesis("MaxElementVolume", "libStdMeshersEngine.so") +hypVolume.SetMaxElementVolume(maxElementVolume) +print hypVolume.GetName() +print hypVolume.GetId() +print hypVolume.GetMaxElementVolume() + +smeshgui.SetName(salome.ObjectToID(hypVolume), "MaxElementVolume_0.5") + +# ---- create Algorithms + +print "-------------------------- create Algorithms" + +print "-------------------------- Regular_1D" + +regular1D = smesh.CreateHypothesis("Regular_1D", "libStdMeshersEngine.so") +smeshgui.SetName(salome.ObjectToID(regular1D), "Wire Discretisation") + +print "-------------------------- MEFISTO_2D" + +mefisto2D=smesh.CreateHypothesis("MEFISTO_2D", "libStdMeshersEngine.so") +smeshgui.SetName(salome.ObjectToID(mefisto2D), "MEFISTO_2D") + +print "-------------------------- NETGEN_3D" + +netgen3D=smesh.CreateHypothesis("NETGEN_3D", "libNETGENEngine.so") +smeshgui.SetName(salome.ObjectToID(netgen3D), "NETGEN_3D") + +# ---- init a Mesh with the alveole +shape_mesh = salome.IDToObject( idalveole ) + +mesh=smesh.CreateMesh(shape_mesh) +smeshgui.SetName(salome.ObjectToID(mesh), "MeshAlveole") + +# ---- add hypothesis to alveole + +print "-------------------------- add hypothesis to alveole" + +mesh.AddHypothesis(shape_mesh,regular1D) +mesh.AddHypothesis(shape_mesh,hypNbSeg) + +mesh.AddHypothesis(shape_mesh,mefisto2D) +mesh.AddHypothesis(shape_mesh,hypArea) + +mesh.AddHypothesis(shape_mesh,netgen3D) +mesh.AddHypothesis(shape_mesh,hypVolume) + +print "-------------------------- compute the mesh of alveole " +ret=smesh.Compute(mesh,shape_mesh) + +if ret != 0: + log=mesh.GetLog(0) # no erase trace + for linelog in log: + print linelog + print "Information about the Mesh_mechanic:" + print "Number of nodes : ", mesh.NbNodes() + print "Number of edges : ", mesh.NbEdges() + print "Number of faces : ", mesh.NbFaces() + print "Number of triangles : ", mesh.NbTriangles() + print "Number of volumes: ", mesh.NbVolumes() + print "Number of tetrahedrons: ", mesh.NbTetras() +else: + print "problem when computing the mesh" + +salome.sg.updateObjBrowser(1) diff --git a/src/SMESH_SWIG/SMESH_box2_tetra.py b/src/SMESH_SWIG/SMESH_box2_tetra.py index 6db29ba29..d5e6979f6 100644 --- a/src/SMESH_SWIG/SMESH_box2_tetra.py +++ b/src/SMESH_SWIG/SMESH_box2_tetra.py @@ -4,15 +4,16 @@ # import salome -from salome import sg - import geompy -import SMESH -import smeshpy +import StdMeshers +import NETGENPlugin + +geom = salome.lcc.FindOrLoadComponent("FactoryServer", "GEOM") +smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH") -geom = geompy.geom -myBuilder = geompy.myBuilder +smeshgui = salome.ImportComponentGUI("SMESH") +smeshgui.Init(salome.myStudyId); ShapeTypeShell = 3 ShapeTypeFace = 4 @@ -65,12 +66,8 @@ print "number of Shells in shell : ",len(subShellList) print "number of Faces in shell : ",len(subFaceList) print "number of Edges in shell : ",len(subEdgeList) -# ---- launch SMESH - -smeshgui = salome.ImportComponentGUI("SMESH") -smeshgui.Init(salome.myStudyId) -gen=smeshpy.smeshpy() +### ---------------------------- SMESH -------------------------------------- # ---- create Hypothesis @@ -80,44 +77,40 @@ print "-------------------------- NumberOfSegments" numberOfSegments = 10 -hyp1=gen.CreateHypothesis("NumberOfSegments") -hypNbSeg=hyp1._narrow(SMESH.SMESH_NumberOfSegments) +hypNbSeg=smesh.CreateHypothesis("NumberOfSegments", "libStdMeshersEngine.so") hypNbSeg.SetNumberOfSegments(numberOfSegments) -hypNbSegID = hypNbSeg.GetId() + print hypNbSeg.GetName() -print hypNbSegID +print hypNbSeg.GetId() print hypNbSeg.GetNumberOfSegments() -idseg = smeshgui.AddNewHypothesis( salome.orb.object_to_string(hypNbSeg) ) -smeshgui.SetName(idseg, "NumberOfSegments") +smeshgui.SetName(salome.ObjectToID(hypNbSeg), "NumberOfSegments_10") print "-------------------------- MaxElementArea" maxElementArea = 500 -hyp2=gen.CreateHypothesis("MaxElementArea") -hypArea=hyp2._narrow(SMESH.SMESH_MaxElementArea) +hypArea=smesh.CreateHypothesis("MaxElementArea", "libStdMeshersEngine.so") hypArea.SetMaxElementArea(maxElementArea) + print hypArea.GetName() print hypArea.GetId() print hypArea.GetMaxElementArea() -idarea = smeshgui.AddNewHypothesis( salome.orb.object_to_string(hypArea) ) -smeshgui.SetName(idarea, "MaxElementArea") +smeshgui.SetName(salome.ObjectToID(hypArea), "MaxElementArea_500") print "-------------------------- MaxElementVolume" maxElementVolume = 500 -hyp3=gen.CreateHypothesis("MaxElementVolume") -hypVolume=hyp3._narrow(SMESH.SMESH_MaxElementVolume) +hypVolume=smesh.CreateHypothesis("MaxElementVolume", "libStdMeshersEngine.so") hypVolume.SetMaxElementVolume(maxElementVolume) + print hypVolume.GetName() print hypVolume.GetId() print hypVolume.GetMaxElementVolume() -idvolume = smeshgui.AddNewHypothesis( salome.orb.object_to_string(hypVolume) ) -smeshgui.SetName(idvolume, "MaxElementVolume") +smeshgui.SetName(salome.ObjectToID(hypVolume), "MaxElementVolume_500") # ---- create Algorithms @@ -125,65 +118,52 @@ print "-------------------------- create Algorithms" print "-------------------------- Regular_1D" -hypothesis=gen.CreateHypothesis("Regular_1D") -regular1D = hypothesis._narrow(SMESH.SMESH_Regular_1D) -regularID = smeshgui.AddNewAlgorithms( salome.orb.object_to_string(regular1D) ) -smeshgui.SetName(regularID, "Wire Discretisation") +regular1D=smesh.CreateHypothesis("Regular_1D", "libStdMeshersEngine.so") +smeshgui.SetName(salome.ObjectToID(regular1D), "Wire Discretisation") print "-------------------------- MEFISTO_2D" -hypothesis=gen.CreateHypothesis("MEFISTO_2D") -mefisto2D = hypothesis._narrow(SMESH.SMESH_MEFISTO_2D) -mefistoID = smeshgui.AddNewAlgorithms( salome.orb.object_to_string(mefisto2D) ) -smeshgui.SetName(mefistoID, "MEFISTO_2D") +mefisto2D=smesh.CreateHypothesis("MEFISTO_2D", "libStdMeshersEngine.so") +smeshgui.SetName(salome.ObjectToID(mefisto2D), "MEFISTO_2D") print "-------------------------- NETGEN_3D" -hypothesis=gen.CreateHypothesis("NETGEN_3D") -netgen3D = hypothesis._narrow(SMESH.SMESH_NETGEN_3D) -netgenID = smeshgui.AddNewAlgorithms( salome.orb.object_to_string(netgen3D) ) -smeshgui.SetName(netgenID, "NETGEN_3D") +netgen3D=smesh.CreateHypothesis("NETGEN_3D", "libNETGENEngine.so") +smeshgui.SetName(salome.ObjectToID(netgen3D), "NETGEN_3D") # ---- init a Mesh with the shell -mesh=gen.Init(idshell) -idmesh = smeshgui.AddNewMesh( salome.orb.object_to_string(mesh) ) -smeshgui.SetName(idmesh, "MeshBox2") -smeshgui.SetShape(idshell, idmesh) +mesh = smesh.CreateMesh(shell) +smeshgui.SetName(salome.ObjectToID(mesh), "MeshBox2") # ---- add hypothesis to shell print "-------------------------- add hypothesis to shell" -ret=mesh.AddHypothesis(shell,regular1D) -print ret -ret=mesh.AddHypothesis(shell,hypNbSeg) -print ret -ret=mesh.AddHypothesis(shell,mefisto2D) -print ret -ret=mesh.AddHypothesis(shell,hypArea) -print ret -ret=mesh.AddHypothesis(shell,netgen3D) -print ret -ret=mesh.AddHypothesis(shell,hypVolume) -print ret +mesh.AddHypothesis(shell,regular1D) +mesh.AddHypothesis(shell,hypNbSeg) -smeshgui.SetAlgorithms( idmesh, regularID) -smeshgui.SetHypothesis( idmesh, idseg ) -smeshgui.SetAlgorithms( idmesh, mefistoID ) -smeshgui.SetHypothesis( idmesh, idarea ) -smeshgui.SetAlgorithms( idmesh, netgenID ) -smeshgui.SetHypothesis( idmesh, idvolume ) +mesh.AddHypothesis(shell,mefisto2D) +mesh.AddHypothesis(shell,hypArea) -sg.updateObjBrowser(1) +mesh.AddHypothesis(shell,netgen3D) +mesh.AddHypothesis(shell,hypVolume) +salome.sg.updateObjBrowser(1) print "-------------------------- compute shell" -ret=gen.Compute(mesh,idshell) +ret= smesh.Compute(mesh,shell) print ret -log=mesh.GetLog(0) # no erase trace -for linelog in log: - print linelog - - -sg.updateObjBrowser(1) +if ret != 0: + log=mesh.GetLog(0) # no erase trace + for linelog in log: + print linelog + print "Information about the MeshBox2:" + print "Number of nodes : ", mesh.NbNodes() + print "Number of edges : ", mesh.NbEdges() + print "Number of faces : ", mesh.NbFaces() + print "Number of triangles : ", mesh.NbTriangles() + print "Number of volumes : ", mesh.NbVolumes() + print "Number of tetrahedrons: ", mesh.NbTetras() +else: + print "probleme when computing the mesh" diff --git a/src/SMESH_SWIG/SMESH_box3_tetra.py b/src/SMESH_SWIG/SMESH_box3_tetra.py index 000a2611b..adb7d4944 100644 --- a/src/SMESH_SWIG/SMESH_box3_tetra.py +++ b/src/SMESH_SWIG/SMESH_box3_tetra.py @@ -5,15 +5,16 @@ # import salome -from salome import sg - import geompy -import SMESH -import smeshpy +import StdMeshers +import NETGENPlugin + +geom = salome.lcc.FindOrLoadComponent("FactoryServer", "GEOM") +smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH") -geom = geompy.geom -myBuilder = geompy.myBuilder +smeshgui = salome.ImportComponentGUI("SMESH") +smeshgui.Init(salome.myStudyId); ShapeTypeShell = 3 ShapeTypeFace = 4 @@ -77,12 +78,8 @@ print "number of Shells in shell : ",len(subShellList) print "number of Faces in shell : ",len(subFaceList) print "number of Edges in shell : ",len(subEdgeList) -# ---- launch SMESH - -smeshgui = salome.ImportComponentGUI("SMESH") -smeshgui.Init(salome.myStudyId) -gen=smeshpy.smeshpy() +### ---------------------------- SMESH -------------------------------------- # ---- create Hypothesis @@ -92,44 +89,40 @@ print "-------------------------- NumberOfSegments" numberOfSegments = 10 -hyp1=gen.CreateHypothesis("NumberOfSegments") -hypNbSeg=hyp1._narrow(SMESH.SMESH_NumberOfSegments) +hypNbSeg=smesh.CreateHypothesis("NumberOfSegments", "libStdMeshersEngine.so") hypNbSeg.SetNumberOfSegments(numberOfSegments) -hypNbSegID = hypNbSeg.GetId() + print hypNbSeg.GetName() -print hypNbSegID +print hypNbSeg.GetId() print hypNbSeg.GetNumberOfSegments() -idseg = smeshgui.AddNewHypothesis( salome.orb.object_to_string(hypNbSeg) ) -smeshgui.SetName(idseg, "NumberOfSegments") +smeshgui.SetName(salome.ObjectToID(hypNbSeg), "NumberOfSegments_10") print "-------------------------- MaxElementArea" maxElementArea = 500 -hyp2=gen.CreateHypothesis("MaxElementArea") -hypArea=hyp2._narrow(SMESH.SMESH_MaxElementArea) +hypArea=smesh.CreateHypothesis("MaxElementArea", "libStdMeshersEngine.so") hypArea.SetMaxElementArea(maxElementArea) + print hypArea.GetName() print hypArea.GetId() print hypArea.GetMaxElementArea() -idarea = smeshgui.AddNewHypothesis( salome.orb.object_to_string(hypArea) ) -smeshgui.SetName(idarea, "MaxElementArea") +smeshgui.SetName(salome.ObjectToID(hypArea), "MaxElementArea_500") print "-------------------------- MaxElementVolume" maxElementVolume = 500 -hyp3=gen.CreateHypothesis("MaxElementVolume") -hypVolume=hyp3._narrow(SMESH.SMESH_MaxElementVolume) +hypVolume=smesh.CreateHypothesis("MaxElementVolume", "libStdMeshersEngine.so") hypVolume.SetMaxElementVolume(maxElementVolume) + print hypVolume.GetName() print hypVolume.GetId() print hypVolume.GetMaxElementVolume() -idvolume = smeshgui.AddNewHypothesis( salome.orb.object_to_string(hypVolume) ) -smeshgui.SetName(idvolume, "MaxElementVolume") +smeshgui.SetName(salome.ObjectToID(hypVolume), "MaxElementVolume_500") # ---- create Algorithms @@ -137,65 +130,52 @@ print "-------------------------- create Algorithms" print "-------------------------- Regular_1D" -hypothesis=gen.CreateHypothesis("Regular_1D") -regular1D = hypothesis._narrow(SMESH.SMESH_Regular_1D) -regularID = smeshgui.AddNewAlgorithms( salome.orb.object_to_string(regular1D) ) -smeshgui.SetName(regularID, "Wire Discretisation") +regular1D=smesh.CreateHypothesis("Regular_1D", "libStdMeshersEngine.so") +smeshgui.SetName(salome.ObjectToID(regular1D), "Wire Discretisation") print "-------------------------- MEFISTO_2D" -hypothesis=gen.CreateHypothesis("MEFISTO_2D") -mefisto2D = hypothesis._narrow(SMESH.SMESH_MEFISTO_2D) -mefistoID = smeshgui.AddNewAlgorithms( salome.orb.object_to_string(mefisto2D) ) -smeshgui.SetName(mefistoID, "MEFISTO_2D") +mefisto2D=smesh.CreateHypothesis("MEFISTO_2D", "libStdMeshersEngine.so") +smeshgui.SetName(salome.ObjectToID(mefisto2D), "MEFISTO_2D") print "-------------------------- NETGEN_3D" -hypothesis=gen.CreateHypothesis("NETGEN_3D") -netgen3D = hypothesis._narrow(SMESH.SMESH_NETGEN_3D) -netgenID = smeshgui.AddNewAlgorithms( salome.orb.object_to_string(netgen3D) ) -smeshgui.SetName(netgenID, "NETGEN_3D") +netgen3D=smesh.CreateHypothesis("NETGEN_3D", "libNETGENEngine.so") +smeshgui.SetName(salome.ObjectToID(netgen3D), "NETGEN_3D") # ---- init a Mesh with the shell -mesh=gen.Init(idshell) -idmesh = smeshgui.AddNewMesh( salome.orb.object_to_string(mesh) ) -smeshgui.SetName(idmesh, "MeshBox2") -smeshgui.SetShape(idshell, idmesh) +mesh = smesh.CreateMesh(shell) +smeshgui.SetName(salome.ObjectToID(mesh), "MeshBox3") # ---- add hypothesis to shell print "-------------------------- add hypothesis to shell" -ret=mesh.AddHypothesis(shell,regular1D) -print ret -ret=mesh.AddHypothesis(shell,hypNbSeg) -print ret -ret=mesh.AddHypothesis(shell,mefisto2D) -print ret -ret=mesh.AddHypothesis(shell,hypArea) -print ret -ret=mesh.AddHypothesis(shell,netgen3D) -print ret -ret=mesh.AddHypothesis(shell,hypVolume) -print ret +mesh.AddHypothesis(shell,regular1D) +mesh.AddHypothesis(shell,hypNbSeg) -smeshgui.SetAlgorithms( idmesh, regularID) -smeshgui.SetHypothesis( idmesh, idseg ) -smeshgui.SetAlgorithms( idmesh, mefistoID ) -smeshgui.SetHypothesis( idmesh, idarea ) -smeshgui.SetAlgorithms( idmesh, netgenID ) -smeshgui.SetHypothesis( idmesh, idvolume ) +mesh.AddHypothesis(shell,mefisto2D) +mesh.AddHypothesis(shell,hypArea) -sg.updateObjBrowser(1) +mesh.AddHypothesis(shell,netgen3D) +mesh.AddHypothesis(shell,hypVolume) +salome.sg.updateObjBrowser(1) print "-------------------------- compute shell" -ret=gen.Compute(mesh,idshell) +ret= smesh.Compute(mesh,shell) print ret -log=mesh.GetLog(0) # no erase trace -for linelog in log: - print linelog - - -sg.updateObjBrowser(1) +if ret != 0: + log=mesh.GetLog(0) # no erase trace + for linelog in log: + print linelog + print "Information about the MeshBox3:" + print "Number of nodes : ", mesh.NbNodes() + print "Number of edges : ", mesh.NbEdges() + print "Number of faces : ", mesh.NbFaces() + print "Number of triangles : ", mesh.NbTriangles() + print "Number of volumes : ", mesh.NbVolumes() + print "Number of tetrahedrons: ", mesh.NbTetras() +else: + print "probleme when computing the mesh" diff --git a/src/SMESH_SWIG/SMESH_box_tetra.py b/src/SMESH_SWIG/SMESH_box_tetra.py index 99744949e..38effb777 100644 --- a/src/SMESH_SWIG/SMESH_box_tetra.py +++ b/src/SMESH_SWIG/SMESH_box_tetra.py @@ -4,21 +4,18 @@ # import salome -from salome import sg - import geompy -import SMESH -import smeshpy - -# ----------------------------------------------------------------------------- +import StdMeshers +import NETGENPlugin -##geom = salome.lcc.FindOrLoadComponent("FactoryServer", "Geometry") -##myBuilder = salome.myStudy.NewBuilder() +geom = salome.lcc.FindOrLoadComponent("FactoryServer", "GEOM") +smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH") -geom = geompy.geom -myBuilder = geompy.myBuilder +smeshgui = salome.ImportComponentGUI("SMESH") +smeshgui.Init(salome.myStudyId); +# ----------------------------------------------------------------------------- ShapeTypeShell = 3 ShapeTypeFace = 4 ShapeTypeEdge = 6 @@ -38,12 +35,8 @@ print "number of Shells in box : ",len(subShellList) print "number of Faces in box : ",len(subFaceList) print "number of Edges in box : ",len(subEdgeList) -# ---- launch SMESH -smeshgui = salome.ImportComponentGUI("SMESH") -smeshgui.Init(salome.myStudyId) - -gen=smeshpy.smeshpy() +### ---------------------------- SMESH -------------------------------------- # ---- create Hypothesis @@ -53,44 +46,40 @@ print "-------------------------- NumberOfSegments" numberOfSegments = 10 -hyp1=gen.CreateHypothesis("NumberOfSegments") -hypNbSeg=hyp1._narrow(SMESH.SMESH_NumberOfSegments) +hypNbSeg=smesh.CreateHypothesis("NumberOfSegments", "libStdMeshersEngine.so") hypNbSeg.SetNumberOfSegments(numberOfSegments) -hypNbSegID = hypNbSeg.GetId() + print hypNbSeg.GetName() -print hypNbSegID +print hypNbSeg.GetId() print hypNbSeg.GetNumberOfSegments() -idseg = smeshgui.AddNewHypothesis( salome.orb.object_to_string(hypNbSeg) ) -smeshgui.SetName(idseg, "NumberOfSegments") +smeshgui.SetName(salome.ObjectToID(hypNbSeg), "NumberOfSegments_10") print "-------------------------- MaxElementArea" maxElementArea = 500 -hyp2=gen.CreateHypothesis("MaxElementArea") -hypArea=hyp2._narrow(SMESH.SMESH_MaxElementArea) +hypArea=smesh.CreateHypothesis("MaxElementArea", "libStdMeshersEngine.so") hypArea.SetMaxElementArea(maxElementArea) + print hypArea.GetName() print hypArea.GetId() print hypArea.GetMaxElementArea() -idarea = smeshgui.AddNewHypothesis( salome.orb.object_to_string(hypArea) ) -smeshgui.SetName(idarea, "MaxElementArea") +smeshgui.SetName(salome.ObjectToID(hypArea), "MaxElementArea_500") print "-------------------------- MaxElementVolume" maxElementVolume = 500 -hyp3=gen.CreateHypothesis("MaxElementVolume") -hypVolume=hyp3._narrow(SMESH.SMESH_MaxElementVolume) +hypVolume=smesh.CreateHypothesis("MaxElementVolume", "libStdMeshersEngine.so") hypVolume.SetMaxElementVolume(maxElementVolume) + print hypVolume.GetName() print hypVolume.GetId() print hypVolume.GetMaxElementVolume() -idvolume = smeshgui.AddNewHypothesis( salome.orb.object_to_string(hypVolume) ) -smeshgui.SetName(idvolume, "MaxElementVolume") +smeshgui.SetName(salome.ObjectToID(hypVolume), "MaxElementVolume_500") # ---- create Algorithms @@ -98,65 +87,52 @@ print "-------------------------- create Algorithms" print "-------------------------- Regular_1D" -hypothesis=gen.CreateHypothesis("Regular_1D") -regular1D = hypothesis._narrow(SMESH.SMESH_Regular_1D) -regularID = smeshgui.AddNewAlgorithms( salome.orb.object_to_string(regular1D) ) -smeshgui.SetName(regularID, "Wire Discretisation") +regular1D=smesh.CreateHypothesis("Regular_1D", "libStdMeshersEngine.so") +smeshgui.SetName(salome.ObjectToID(regular1D), "Wire Discretisation") print "-------------------------- MEFISTO_2D" -hypothesis=gen.CreateHypothesis("MEFISTO_2D") -mefisto2D = hypothesis._narrow(SMESH.SMESH_MEFISTO_2D) -mefistoID = smeshgui.AddNewAlgorithms( salome.orb.object_to_string(mefisto2D) ) -smeshgui.SetName(mefistoID, "MEFISTO_2D") +mefisto2D=smesh.CreateHypothesis("MEFISTO_2D", "libStdMeshersEngine.so") +smeshgui.SetName(salome.ObjectToID(mefisto2D), "MEFISTO_2D") print "-------------------------- NETGEN_3D" -hypothesis=gen.CreateHypothesis("NETGEN_3D") -netgen3D = hypothesis._narrow(SMESH.SMESH_NETGEN_3D) -netgenID = smeshgui.AddNewAlgorithms( salome.orb.object_to_string(netgen3D) ) -smeshgui.SetName(netgenID, "NETGEN_3D") +netgen3D=smesh.CreateHypothesis("NETGEN_3D", "libNETGENEngine.so") +smeshgui.SetName(salome.ObjectToID(netgen3D), "NETGEN_3D") # ---- init a Mesh with the boxe -mesh=gen.Init(idbox) -idmesh = smeshgui.AddNewMesh( salome.orb.object_to_string(mesh) ) -smeshgui.SetName(idmesh, "MeshBox") -smeshgui.SetShape(idbox, idmesh) +mesh = smesh.CreateMesh(box) +smeshgui.SetName(salome.ObjectToID(mesh), "MeshBox") # ---- add hypothesis to the boxe -print "-------------------------- add hypothesis to the boxe" +print "-------------------------- add hypothesis to the box" -ret=mesh.AddHypothesis(box,regular1D) -print ret -ret=mesh.AddHypothesis(box,hypNbSeg) -print ret -ret=mesh.AddHypothesis(box,mefisto2D) -print ret -ret=mesh.AddHypothesis(box,hypArea) -print ret -ret=mesh.AddHypothesis(box,netgen3D) -print ret -ret=mesh.AddHypothesis(box,hypVolume) -print ret +mesh.AddHypothesis(box,regular1D) +mesh.AddHypothesis(box,hypNbSeg) -smeshgui.SetAlgorithms( idmesh, regularID) -smeshgui.SetHypothesis( idmesh, idseg ) -smeshgui.SetAlgorithms( idmesh, mefistoID ) -smeshgui.SetHypothesis( idmesh, idarea ) -smeshgui.SetAlgorithms( idmesh, netgenID ) -smeshgui.SetHypothesis( idmesh, idvolume ) +mesh.AddHypothesis(box,mefisto2D) +mesh.AddHypothesis(box,hypArea) -sg.updateObjBrowser(1) +mesh.AddHypothesis(box,netgen3D) +mesh.AddHypothesis(box,hypVolume) +salome.sg.updateObjBrowser(1) print "-------------------------- compute the mesh of the boxe" -ret=gen.Compute(mesh,idbox) +ret=smesh.Compute(mesh,box) print ret -log=mesh.GetLog(0) # no erase trace -for linelog in log: - print linelog - - -sg.updateObjBrowser(1) +if ret != 0: + log=mesh.GetLog(0) # no erase trace + for linelog in log: + print linelog + print "Information about the MeshBox:" + print "Number of nodes : ", mesh.NbNodes() + print "Number of edges : ", mesh.NbEdges() + print "Number of faces : ", mesh.NbFaces() + print "Number of triangles : ", mesh.NbTriangles() + print "Number of volumes : ", mesh.NbVolumes() + print "Number of tetrahedrons: ", mesh.NbTetras() +else: + print "probleme when computing the mesh" diff --git a/src/SMESH_SWIG/SMESH_fixation.py b/src/SMESH_SWIG/SMESH_fixation.py index 93accf52e..9158ee567 100644 --- a/src/SMESH_SWIG/SMESH_fixation.py +++ b/src/SMESH_SWIG/SMESH_fixation.py @@ -25,14 +25,10 @@ # $Header$ import salome -from salome import sg - import geompy - import math geom = salome.lcc.FindOrLoadComponent("FactoryServer", "GEOM") -myBuilder = salome.myStudy.NewBuilder() ShapeTypeCompSolid = 1 ShapeTypeSolid = 2 @@ -290,9 +286,10 @@ cylcongy0 = geom.MakeCylinder(pcyly0, vx, rayonConge, longueurPlq +2*marge) bcong1=geom.MakeBoolean(bcong1,cylcongx0,2) bcong2=geom.MakeBoolean(bcong2,cylcongx0,2) bcong1=geom.MakeBoolean(bcong1,cylcongy0,2) +#NRI : inverse order of BOP +bcong3=geom.MakeBoolean(bcong3,cylcongy0,2) bcong3=geom.MakeBoolean(bcong3,cylcongx3,2) bcong4=geom.MakeBoolean(bcong4,cylcongx3,2) -bcong3=geom.MakeBoolean(bcong3,cylcongy0,2) pf1 = geom.MakePointStruct(0., y0h, z3) pf2 = geom.MakePointStruct(0., y1, z3) diff --git a/src/SMESH_SWIG/SMESH_fixation_hexa.py b/src/SMESH_SWIG/SMESH_fixation_hexa.py index 2916e6a09..2d12c7f47 100644 --- a/src/SMESH_SWIG/SMESH_fixation_hexa.py +++ b/src/SMESH_SWIG/SMESH_fixation_hexa.py @@ -5,14 +5,13 @@ # import SMESH_fixation -import SMESH -import smeshpy + +import StdMeshers compshell = SMESH_fixation.compshell idcomp = SMESH_fixation.idcomp geompy = SMESH_fixation.geompy salome = SMESH_fixation.salome -sg = SMESH_fixation.sg ShapeTypeShell = 3 ShapeTypeFace = 4 @@ -30,13 +29,12 @@ print "number of Edges in compshell : ",len(subEdgeList) status=geompy.CheckShape(compshell) print " check status ", status -### ---- launch SMESH +### ---------------------------- SMESH -------------------------------------- +smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH") smeshgui = salome.ImportComponentGUI("SMESH") smeshgui.Init(salome.myStudyId) -gen=smeshpy.smeshpy() - ### ---- create Hypothesis print "-------------------------- create Hypothesis" @@ -45,16 +43,14 @@ print "-------------------------- NumberOfSegments" numberOfSegments = 5 -hyp1=gen.CreateHypothesis("NumberOfSegments") -hypNbSeg=hyp1._narrow(SMESH.SMESH_NumberOfSegments) +hypNbSeg=smesh.CreateHypothesis("NumberOfSegments", "libStdMeshersEngine.so") hypNbSeg.SetNumberOfSegments(numberOfSegments) -hypNbSegID = hypNbSeg.GetId() + print hypNbSeg.GetName() -print hypNbSegID +print hypNbSeg.GetId() print hypNbSeg.GetNumberOfSegments() -idseg = smeshgui.AddNewHypothesis( salome.orb.object_to_string(hypNbSeg) ) -smeshgui.SetName(idseg, "NumberOfSegments") +smeshgui.SetName(salome.ObjectToID(hypNbSeg), "NumberOfSegments_5") # ---- create Algorithms @@ -62,61 +58,54 @@ print "-------------------------- create Algorithms" print "-------------------------- Regular_1D" -hypothesis=gen.CreateHypothesis("Regular_1D") -regular1D = hypothesis._narrow(SMESH.SMESH_Regular_1D) -regularID = smeshgui.AddNewAlgorithms( salome.orb.object_to_string(regular1D) ) -smeshgui.SetName(regularID, "Wire Discretisation") +regular1D=smesh.CreateHypothesis("Regular_1D", "libStdMeshersEngine.so") + +smeshgui.SetName(salome.ObjectToID(regular1D), "Wire Discretisation") print "-------------------------- Quadrangle_2D" -hypothesis=gen.CreateHypothesis("Quadrangle_2D") -quad2D = hypothesis._narrow(SMESH.SMESH_Quadrangle_2D) -quadID = smeshgui.AddNewAlgorithms( salome.orb.object_to_string(quad2D) ) -smeshgui.SetName(quadID, "Quadrangle_2D") +quad2D=smesh.CreateHypothesis("Quadrangle_2D", "libStdMeshersEngine.so") + +smeshgui.SetName(salome.ObjectToID(quad2D), "Quadrangle_2D") print "-------------------------- Hexa_3D" -hypothesis=gen.CreateHypothesis("Hexa_3D") -hexa3D = hypothesis._narrow(SMESH.SMESH_Hexa_3D) -hexaID = smeshgui.AddNewAlgorithms( salome.orb.object_to_string(hexa3D) ) -smeshgui.SetName(hexaID, "Hexa_3D") +hexa3D=smesh.CreateHypothesis("Hexa_3D", "libStdMeshersEngine.so") + +smeshgui.SetName(salome.ObjectToID(hexa3D), "Hexa_3D") # ---- init a Mesh with the compshell +shape_mesh = salome.IDToObject( idcomp ) + +mesh=smesh.CreateMesh(shape_mesh) +smeshgui.SetName(salome.ObjectToID(mesh), "MeshCompShell") -mesh=gen.Init(idcomp) -idmesh = smeshgui.AddNewMesh( salome.orb.object_to_string(mesh) ) -smeshgui.SetName(idmesh, "MeshcompShel") -smeshgui.SetShape(idcomp, idmesh) # ---- add hypothesis to compshell print "-------------------------- add hypothesis to compshell" -ret=mesh.AddHypothesis(compshell,regular1D) -print ret -ret=mesh.AddHypothesis(compshell,hypNbSeg) -print ret -ret=mesh.AddHypothesis(compshell,quad2D) -print ret -ret=mesh.AddHypothesis(compshell,hexa3D) -print ret - -smeshgui.SetAlgorithms( idmesh, regularID) -smeshgui.SetHypothesis( idmesh, idseg ) -smeshgui.SetAlgorithms( idmesh, quadID ) -smeshgui.SetAlgorithms( idmesh, hexaID ) +mesh.AddHypothesis(shape_mesh,regular1D) +mesh.AddHypothesis(shape_mesh,hypNbSeg) -sg.updateObjBrowser(1) +mesh.AddHypothesis(shape_mesh,quad2D) +mesh.AddHypothesis(shape_mesh,hexa3D) +salome.sg.updateObjBrowser(1) print "-------------------------- compute compshell" -ret=gen.Compute(mesh,idcomp) +ret=smesh.Compute(mesh, shape_mesh) print ret if ret != 0: log=mesh.GetLog(0) # no erase trace for linelog in log: print linelog + print "Information about the MeshcompShel:" + print "Number of nodes : ", mesh.NbNodes() + print "Number of edges : ", mesh.NbEdges() + print "Number of faces : ", mesh.NbFaces() + print "Number of quadrangles : ", mesh.NbQuadrangles() + print "Number of volumes : ", mesh.NbVolumes() + print "Number of hexahedrons : ", mesh.NbHexas() else: print "problem when Computing the mesh" - -sg.updateObjBrowser(1) diff --git a/src/SMESH_SWIG/SMESH_fixation_tetra.py b/src/SMESH_SWIG/SMESH_fixation_tetra.py index 57e9c913d..d429fe958 100644 --- a/src/SMESH_SWIG/SMESH_fixation_tetra.py +++ b/src/SMESH_SWIG/SMESH_fixation_tetra.py @@ -4,15 +4,14 @@ # Hypothesis and algorithms for the mesh generation are global # +import StdMeshers +import NETGENPlugin import SMESH_fixation -import SMESH -import smeshpy compshell = SMESH_fixation.compshell idcomp = SMESH_fixation.idcomp geompy = SMESH_fixation.geompy salome = SMESH_fixation.salome -sg = SMESH_fixation.sg ShapeTypeShell = 3 ShapeTypeFace = 4 @@ -30,13 +29,12 @@ print "number of Edges in compshell : ",len(subEdgeList) status=geompy.CheckShape(compshell) print " check status ", status -### ---- launch SMESH +### ---------------------------- SMESH -------------------------------------- +smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH") smeshgui = salome.ImportComponentGUI("SMESH") smeshgui.Init(salome.myStudyId) -gen=smeshpy.smeshpy() - ### ---- create Hypothesis print "-------------------------- create Hypothesis" @@ -45,44 +43,41 @@ print "-------------------------- NumberOfSegments" numberOfSegments = 5 -hypothesis=gen.CreateHypothesis("NumberOfSegments") -hypNbSeg=hypothesis._narrow(SMESH.SMESH_NumberOfSegments) +hypNbSeg=smesh.CreateHypothesis("NumberOfSegments", "libStdMeshersEngine.so") hypNbSeg.SetNumberOfSegments(numberOfSegments) -hypNbSegID = hypNbSeg.GetId() + print hypNbSeg.GetName() -print hypNbSegID +print hypNbSeg.GetId() print hypNbSeg.GetNumberOfSegments() -idseg = smeshgui.AddNewHypothesis( salome.orb.object_to_string(hypNbSeg) ) -smeshgui.SetName(idseg, "NumberOfSegments") +smeshgui.SetName(salome.ObjectToID(hypNbSeg), "NumberOfSegments_5") print "-------------------------- MaxElementArea" -maxElementArea = 80 +## maxElementArea = 80 -hypothesis=gen.CreateHypothesis("MaxElementArea") -hypArea=hypothesis._narrow(SMESH.SMESH_MaxElementArea) -hypArea.SetMaxElementArea(maxElementArea) -print hypArea.GetName() -print hypArea.GetId() -print hypArea.GetMaxElementArea() +## hypArea=smesh.CreateHypothesis("MaxElementArea") +## hypArea.SetMaxElementArea(maxElementArea) +## print hypArea.GetName() +## print hypArea.GetId() +## print hypArea.GetMaxElementArea() +## smeshgui.SetName(salome.ObjectToID(hypArea), "MaxElementArea_160") +hypLengthFromEdges=smesh.CreateHypothesis("LengthFromEdges", "libStdMeshersEngine.so") +smeshgui.SetName(salome.ObjectToID(hypLengthFromEdges), "LengthFromEdges") -idarea = smeshgui.AddNewHypothesis( salome.orb.object_to_string(hypArea) ) -smeshgui.SetName(idarea, "MaxElementArea") print "-------------------------- MaxElementVolume" -maxElementVolume = 150 +maxElementVolume = 1000 -hypothesis=gen.CreateHypothesis("MaxElementVolume") -hypVolume=hypothesis._narrow(SMESH.SMESH_MaxElementVolume) +hypVolume=smesh.CreateHypothesis("MaxElementVolume", "libStdMeshersEngine.so") hypVolume.SetMaxElementVolume(maxElementVolume) + print hypVolume.GetName() print hypVolume.GetId() print hypVolume.GetMaxElementVolume() -idvolume = smeshgui.AddNewHypothesis( salome.orb.object_to_string(hypVolume) ) -smeshgui.SetName(idvolume, "MaxElementVolume") +smeshgui.SetName(salome.ObjectToID(hypVolume), "MaxElementVolume_1000") # ---- create Algorithms @@ -90,66 +85,56 @@ print "-------------------------- create Algorithms" print "-------------------------- Regular_1D" -hypothesis=gen.CreateHypothesis("Regular_1D") -regular1D = hypothesis._narrow(SMESH.SMESH_Regular_1D) -regularID = smeshgui.AddNewAlgorithms( salome.orb.object_to_string(regular1D) ) -smeshgui.SetName(regularID, "Wire Discretisation") +regular1D=smesh.CreateHypothesis("Regular_1D", "libStdMeshersEngine.so") + +smeshgui.SetName(salome.ObjectToID(regular1D), "Wire Discretisation") print "-------------------------- MEFISTO_2D" -hypothesis=gen.CreateHypothesis("MEFISTO_2D") -mefisto2D = hypothesis._narrow(SMESH.SMESH_MEFISTO_2D) -mefistoID = smeshgui.AddNewAlgorithms( salome.orb.object_to_string(mefisto2D) ) -smeshgui.SetName(mefistoID, "MEFISTO_2D") +mefisto2D=smesh.CreateHypothesis("MEFISTO_2D", "libStdMeshersEngine.so") + +smeshgui.SetName(salome.ObjectToID(mefisto2D), "MEFISTO_2D") print "-------------------------- NETGEN_3D" -hypothesis=gen.CreateHypothesis("NETGEN_3D") -netgen3D = hypothesis._narrow(SMESH.SMESH_NETGEN_3D) -netgenID = smeshgui.AddNewAlgorithms( salome.orb.object_to_string(netgen3D) ) -smeshgui.SetName(netgenID, "NETGEN_3D") +netgen3D=smesh.CreateHypothesis("NETGEN_3D", "libNETGENEngine.so") + +smeshgui.SetName(salome.ObjectToID(netgen3D), "NETGEN_3D") # ---- init a Mesh with the compshell -mesh=gen.Init(idcomp) -idmesh = smeshgui.AddNewMesh( salome.orb.object_to_string(mesh) ) -smeshgui.SetName(idmesh, "MeshcompShell") -smeshgui.SetShape(idcomp, idmesh) +mesh=smesh.CreateMesh(compshell) +smeshgui.SetName(salome.ObjectToID(mesh), "MeshcompShel") # ---- add hypothesis to compshell print "-------------------------- add hypothesis to compshell" -ret=mesh.AddHypothesis(compshell,regular1D) -print ret -ret=mesh.AddHypothesis(compshell,hypNbSeg) -print ret -ret=mesh.AddHypothesis(compshell,mefisto2D) -print ret -ret=mesh.AddHypothesis(compshell,hypArea) -print ret -ret=mesh.AddHypothesis(compshell,netgen3D) -print ret -ret=mesh.AddHypothesis(compshell,hypVolume) -print ret +mesh.AddHypothesis(compshell,regular1D) +mesh.AddHypothesis(compshell,hypNbSeg) + +mesh.AddHypothesis(compshell,mefisto2D) +mesh.AddHypothesis(compshell,hypLengthFromEdges) -smeshgui.SetAlgorithms( idmesh, regularID) -smeshgui.SetHypothesis( idmesh, idseg ) -smeshgui.SetAlgorithms( idmesh, mefistoID ) -smeshgui.SetHypothesis( idmesh, idarea ) -smeshgui.SetAlgorithms( idmesh, netgenID ) -smeshgui.SetHypothesis( idmesh, idvolume ) +mesh.AddHypothesis(compshell,netgen3D) +mesh.AddHypothesis(compshell,hypVolume) -sg.updateObjBrowser(1) +salome.sg.updateObjBrowser(1) print "-------------------------- compute compshell" -ret=gen.Compute(mesh,idcomp) +ret=smesh.Compute(mesh,compshell) print ret if ret != 0: log=mesh.GetLog(0) # no erase trace for linelog in log: print linelog + print "Information about the MeshcompShel:" + print "Number of nodes : ", mesh.NbNodes() + print "Number of edges : ", mesh.NbEdges() + print "Number of faces : ", mesh.NbFaces() + print "Number of triangles : ", mesh.NbTriangles() + print "Number of volumes : ", mesh.NbVolumes() + print "Number of tetrahedrons : ", mesh.NbTetras() + else: print "problem when computing the mesh" - -sg.updateObjBrowser(1) diff --git a/src/SMESH_SWIG/SMESH_flight_skin.py b/src/SMESH_SWIG/SMESH_flight_skin.py index b352355b8..6165621b9 100644 --- a/src/SMESH_SWIG/SMESH_flight_skin.py +++ b/src/SMESH_SWIG/SMESH_flight_skin.py @@ -4,23 +4,25 @@ # Hypothesis and algorithms for the mesh generation are global # +import os import salome -from salome import sg - import geompy -import SMESH -import smeshpy +import StdMeshers + +geom = salome.lcc.FindOrLoadComponent("FactoryServer", "GEOM") +smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH") + +smeshgui = salome.ImportComponentGUI("SMESH") +smeshgui.Init(salome.myStudyId); + -geom = geompy.geom -myBuilder = geompy.myBuilder +# ---------------------------- GEOM -------------------------------------- ShapeTypeShell = 3 ShapeTypeFace = 4 ShapeTypeEdge = 6 -import os - # import a BRep #before running this script, please be sure about #the path the file fileName @@ -43,12 +45,8 @@ print "number of Shells in flight : ",len(subShellList) print "number of Faces in flight : ",len(subFaceList) print "number of Edges in flight : ",len(subEdgeList) -# ---- launch SMESH - -smeshgui = salome.ImportComponentGUI("SMESH") -smeshgui.Init(salome.myStudyId) -gen=smeshpy.smeshpy() +### ---------------------------- SMESH -------------------------------------- # ---- create Hypothesis @@ -58,27 +56,23 @@ print "-------------------------- LocalLength" lengthOfSegments = 0.3 -hypothesis=gen.CreateHypothesis("LocalLength") -hypLength=hypothesis._narrow(SMESH.SMESH_LocalLength) +hypLength=smesh.CreateHypothesis("LocalLength", "libStdMeshersEngine.so") hypLength.SetLength(lengthOfSegments) -hypLengthID = hypLength.GetId() + print hypLength.GetName() -print hypLengthID +print hypLength.GetId() print hypLength.GetLength() -idlen = smeshgui.AddNewHypothesis( salome.orb.object_to_string(hypLength) ) -smeshgui.SetName(idlen, "LocalLength") +smeshgui.SetName(salome.ObjectToID(hypLength), "LocalLength_0.3") print "-------------------------- LengthFromEdges" -hypothesis=gen.CreateHypothesis("LengthFromEdges") -hypLengthFromEdge=hypothesis._narrow(SMESH.SMESH_LengthFromEdges) -hypLengthFromEdgeID = hypLengthFromEdge.GetId() +hypLengthFromEdge=smesh.CreateHypothesis("LengthFromEdges", "libStdMeshersEngine.so") + print hypLengthFromEdge.GetName() -print hypLengthFromEdgeID +print hypLengthFromEdge.GetId() -idlenfromedge = smeshgui.AddNewHypothesis( salome.orb.object_to_string(hypLengthFromEdge) ) -smeshgui.SetName(idlenfromedge, "LengthFromEdge") +smeshgui.SetName(salome.ObjectToID(hypLengthFromEdge), "LengthFromEdge") # ---- create Algorithms @@ -86,54 +80,46 @@ print "-------------------------- create Algorithms" print "-------------------------- Regular_1D" -hypothesis=gen.CreateHypothesis("Regular_1D") -regular1D = hypothesis._narrow(SMESH.SMESH_Regular_1D) -regularID = smeshgui.AddNewAlgorithms( salome.orb.object_to_string(regular1D) ) -smeshgui.SetName(regularID, "Wire Discretisation") +regular1D=smesh.CreateHypothesis("Regular_1D", "libStdMeshersEngine.so") + +smeshgui.SetName(salome.ObjectToID(regular1D), "Wire Discretisation") print "-------------------------- MEFISTO_2D" -hypothesis=gen.CreateHypothesis("MEFISTO_2D") -mefisto2D = hypothesis._narrow(SMESH.SMESH_MEFISTO_2D) -mefistoID = smeshgui.AddNewAlgorithms( salome.orb.object_to_string(mefisto2D) ) -smeshgui.SetName(mefistoID, "MEFISTO_2D") +mefisto2D=smesh.CreateHypothesis("MEFISTO_2D", "libStdMeshersEngine.so") + +smeshgui.SetName(salome.ObjectToID(mefisto2D), "MEFISTO_2D") # ---- init a Mesh with the shell +shape_mesh = salome.IDToObject( idShape ) -mesh=gen.Init(idShape) -idmesh = smeshgui.AddNewMesh( salome.orb.object_to_string(mesh) ) -smeshgui.SetName(idmesh, "MeshFlight") -smeshgui.SetShape(idShape, idmesh) +mesh=smesh.CreateMesh(shape_mesh) +smeshgui.SetName(salome.ObjectToID(mesh), "MeshFlight") # ---- add hypothesis to flight print "-------------------------- add hypothesis to flight" -ret=mesh.AddHypothesis(shape,regular1D) -print ret -ret=mesh.AddHypothesis(shape,hypLength) -print ret -ret=mesh.AddHypothesis(shape,mefisto2D) -print ret -ret=mesh.AddHypothesis(shape,hypLengthFromEdge) -print ret - -smeshgui.SetAlgorithms( idmesh, regularID) -smeshgui.SetHypothesis( idmesh, idlen ) -smeshgui.SetAlgorithms( idmesh, mefistoID ) -smeshgui.SetHypothesis( idmesh, idlenfromedge) +mesh.AddHypothesis(shape_mesh,regular1D) +mesh.AddHypothesis(shape_mesh,hypLength) +mesh.AddHypothesis(shape_mesh,mefisto2D) +mesh.AddHypothesis(shape_mesh,hypLengthFromEdge) -sg.updateObjBrowser(1) +salome.sg.updateObjBrowser(1) print "-------------------------- compute the skin flight" -ret=gen.Compute(mesh,idShape) +ret=smesh.Compute(mesh,shape_mesh) print ret if ret != 0: log=mesh.GetLog(0) # no erase trace for linelog in log: print linelog + print "Information about the Mesh_mechanic_tetra:" + print "Number of nodes : ", mesh.NbNodes() + print "Number of edges : ", mesh.NbEdges() + print "Number of faces : ", mesh.NbFaces() + print "Number of triangles : ", mesh.NbTriangles() + print "Number of volumes : ", mesh.NbVolumes() else: print "probleme when computing the mesh" - -sg.updateObjBrowser(1) diff --git a/src/SMESH_SWIG/SMESH_mechanic.py b/src/SMESH_SWIG/SMESH_mechanic.py index 8a0a3a339..3011c0c82 100644 --- a/src/SMESH_SWIG/SMESH_mechanic.py +++ b/src/SMESH_SWIG/SMESH_mechanic.py @@ -24,25 +24,21 @@ # Module : SMESH # $Header$ -import SMESH -import smeshpy import salome -from salome import sg -import math -#import SMESH_BasicHypothesis_idl - import geompy +geom = salome.lcc.FindOrLoadComponent("FactoryServer", "GEOM") +smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH") - -# ---------------------------- GEOM -------------------------------------- -geom = salome.lcc.FindOrLoadComponent("FactoryServer", "GEOM") -myBuilder = salome.myStudy.NewBuilder() -#from geompy import gg +geom.GetCurrentStudy(salome.myStudy._get_StudyId()) +smesh.SetCurrentStudy(salome.myStudy) smeshgui = salome.ImportComponentGUI("SMESH") smeshgui.Init(salome.myStudyId); +import StdMeshers + +# ---------------------------- GEOM -------------------------------------- ShapeTypeCompSolid = 1 ShapeTypeSolid = 2 ShapeTypeShell = 3 @@ -51,9 +47,7 @@ ShapeTypeWire = 5 ShapeTypeEdge = 6 ShapeTypeVertex = 7 - # ---- define contigous arcs and segment to define a closed wire - p1 = geom.MakePointStruct( 100.0, 0.0, 0.0 ) p2 = geom.MakePointStruct( 50.0, 50.0, 0.0 ) p3 = geom.MakePointStruct( 100.0, 100.0, 0.0 ) @@ -69,9 +63,7 @@ arc2 = geom.MakeArc( p4, p5, p6 ) p7 = geom.MakePointStruct( 120.0, 30.0, 0.0 ) arc3 = geom.MakeArc( p6, p7, p1 ) - # ---- define a closed wire with arcs and segment - List1 = [] List1.append( arc1 ) List1.append( seg1 ) @@ -85,13 +77,11 @@ wire1 = geom.MakeWire( ListIOR1 ) Id_wire1 = geompy.addToStudy( wire1, "wire1") - # ---- define a planar face with wire WantPlanarFace = 1 #True face1 = geom.MakeFace( wire1, WantPlanarFace ) Id_face1 = geompy.addToStudy( face1, "face1") - # ---- create a shape by extrusion pO = geom.MakePointStruct( 0.0, 0.0, 0.0 ) pz = geom.MakePointStruct( 0.0, 0.0, 100.0 ) @@ -99,8 +89,6 @@ pz = geom.MakePointStruct( 0.0, 0.0, 100.0 ) prism1 = geom.MakePrism( face1, pO, pz ) Id_prism1 = geompy.addToStudy( prism1, "prism1") - - # ---- create two cylinders pc1 = geom.MakePointStruct( 90.0, 50.0, -40.0 ) @@ -114,7 +102,6 @@ cyl2 = geom.MakeCylinder( pc2, vz, radius, height ) Id_Cyl1 = geompy.addToStudy( cyl1, "cyl1" ) Id_Cyl2 = geompy.addToStudy( cyl2, "cyl2" ) - # ---- cut with cyl1 shape = geom.MakeBoolean( prism1, cyl1, 2 ) @@ -123,203 +110,185 @@ shape1 = geom.MakeBoolean( shape, cyl2, 3 ) Id_shape1 = geompy.addToStudy( shape1, "shape1") - +#faces = geompy.SubShapeAllSorted( shape1, ShapeTypeFace) +#i = 0 +#for face in faces: +# geompy.addToStudy(face,"face_" + str(i)) +# i = i+1 + # ---- add a face sub shape in study to be meshed different IdSubFaceList = [] -IdSubFaceList.append(10) +IdSubFaceList.append(1) sub_face = geompy.SubShapeSorted( shape1, ShapeTypeFace, IdSubFaceList ) name = geompy.SubShapeName( sub_face._get_Name(), shape1._get_Name() ) Id_SubFace = geompy.addToStudyInFather( shape1, sub_face, name ) - # ---- add a face sub shape in study to be meshed different IdSubFaceL = [] -IdSubFaceL.append(7) +IdSubFaceL.append(2) sub_face2 = geompy.SubShapeSorted( shape1, ShapeTypeFace, IdSubFaceL ) name = geompy.SubShapeName( sub_face2._get_Name(), shape1._get_Name() ) Id_SubFace2 = geompy.addToStudyInFather( shape1, sub_face2, name ) +# ---- add a face sub shape in study to be meshed different +IdSubFaceL = [] +IdSubFaceL.append(3) +sub_face3 = geompy.SubShapeSorted( shape1, ShapeTypeFace, IdSubFaceL ) +name = geompy.SubShapeName( sub_face3._get_Name(), shape1._get_Name() ) +Id_SubFace3 = geompy.addToStudyInFather( shape1, sub_face3, name ) +# ---- add a face sub shape in study to be meshed different +IdSubFaceL = [] +IdSubFaceL.append(6) +sub_face4 = geompy.SubShapeSorted( shape1, ShapeTypeFace, IdSubFaceL ) +name = geompy.SubShapeName( sub_face4._get_Name(), shape1._get_Name() ) -# ---------------------------- SMESH -------------------------------------- - -# ---- launch SMESH, init a Mesh with shape 'shape1' -gen = smeshpy.smeshpy() -mesh = gen.Init( Id_shape1 ) +Id_SubFace4 = geompy.addToStudyInFather( shape1, sub_face4, name ) -idmesh = smeshgui.AddNewMesh( salome.orb.object_to_string(mesh) ) -smeshgui.SetName( idmesh, "Mesh_meca" ); -smeshgui.SetShape( Id_shape1, idmesh ); +# ---------------------------- SMESH -------------------------------------- # ------------------------------ Length Hypothesis print "-------------------------- create Hypothesis" print "-------------------------- LocalLength" -hyp1 = gen.CreateHypothesis( "LocalLength" ) -hypLen1 = hyp1._narrow( SMESH.SMESH_LocalLength ) -hypLen1.SetLength( 100.0 ) -print hypLen1.GetName() -print hypLen1.GetId() -print hypLen1.GetLength() - -idlength = smeshgui.AddNewHypothesis( salome.orb.object_to_string(hypLen1) ); -smeshgui.SetName(idlength, "Local_Length_100"); +hyp1 = smesh.CreateHypothesis("LocalLength", "libStdMeshersEngine.so") +hyp1.SetLength( 100.0 ) +print hyp1.GetName() +print hyp1.GetId() +print hyp1.GetLength() +idlength = salome.ObjectToID(hyp1) +smeshgui.SetName(idlength, "Local_Length_100"); print "-------------------------- NumberOfSegments" -hyp2 = gen.CreateHypothesis( "NumberOfSegments" ) -hypNbSeg1 = hyp2._narrow( SMESH.SMESH_NumberOfSegments ) -hypNbSeg1.SetNumberOfSegments( 10 ) -print hypNbSeg1.GetName() -print hypNbSeg1.GetId() -print hypNbSeg1.GetNumberOfSegments() +hyp2 = smesh.CreateHypothesis("NumberOfSegments", "libStdMeshersEngine.so") +hyp2.SetNumberOfSegments( 10 ) +print hyp2.GetName() +print hyp2.GetId() +print hyp2.GetNumberOfSegments() -idseg = smeshgui.AddNewHypothesis( salome.orb.object_to_string(hypNbSeg1) ); +idseg = salome.ObjectToID(hyp2) smeshgui.SetName(idseg, "NumberOfSegments_12"); - print "-------------------------- MaxElementArea" -hyp3 = gen.CreateHypothesis( "MaxElementArea" ) -hypArea1 = hyp3._narrow( SMESH.SMESH_MaxElementArea ) -hypArea1.SetMaxElementArea( 25 ) -print hypArea1.GetName() -print hypArea1.GetId() -print hypArea1.GetMaxElementArea() +hyp3 = smesh.CreateHypothesis( "MaxElementArea", "libStdMeshersEngine.so" ) +hyp3.SetMaxElementArea( 25 ) +print hyp3.GetName() +print hyp3.GetId() +print hyp3.GetMaxElementArea() -idarea1 = smeshgui.AddNewHypothesis( salome.orb.object_to_string(hypArea1) ); +idarea1 = salome.ObjectToID(hyp3) smeshgui.SetName(idarea1, "MaxElementArea_20"); - - print "-------------------------- MaxElementArea" -hyp4 = gen.CreateHypothesis( "MaxElementArea" ) -hypArea2 = hyp4._narrow( SMESH.SMESH_MaxElementArea ) -hypArea2.SetMaxElementArea( 35 ) -print hypArea2. GetName() -print hypArea2.GetId() -print hypArea2.GetMaxElementArea() +hyp4 = smesh.CreateHypothesis("MaxElementArea", "libStdMeshersEngine.so") +hyp4.SetMaxElementArea( 35 ) +print hyp4.GetName() +print hyp4.GetId() +print hyp4.GetMaxElementArea() -idarea2 = smeshgui.AddNewHypothesis( salome.orb.object_to_string(hypArea2) ); +idarea2 = salome.ObjectToID(hyp4) smeshgui.SetName(idarea2, "MaxElementArea_30"); print "-------------------------- Regular_1D" -alg1 = gen.CreateHypothesis( "Regular_1D" ) -algo1 = alg1._narrow( SMESH.SMESH_Algo ) -listHyp =algo1.GetCompatibleHypothesis() +alg1 = smesh.CreateHypothesis("Regular_1D", "libStdMeshersEngine.so") +listHyp =alg1.GetCompatibleHypothesis() for hyp in listHyp: print hyp -algoReg1d = alg1._narrow( SMESH.SMESH_Regular_1D ) -print algoReg1d.GetName() -print algoReg1d.GetId() +print alg1.GetName() +print alg1.GetId() -idreg1d = smeshgui.AddNewAlgorithms( salome.orb.object_to_string(algoReg1d) ); +idreg1d = salome.ObjectToID(alg1) smeshgui.SetName( idreg1d, "Regular_1D" ); - - print "-------------------------- MEFISTO_2D" -alg2 = gen.CreateHypothesis( "MEFISTO_2D" ) -algo2 = alg2._narrow( SMESH.SMESH_Algo ) -listHyp = algo2.GetCompatibleHypothesis() +alg2 = smesh.CreateHypothesis("MEFISTO_2D", "libStdMeshersEngine.so") +listHyp = alg2.GetCompatibleHypothesis() for hyp in listHyp: print hyp -algoMef = alg2._narrow( SMESH.SMESH_MEFISTO_2D ) -print algoMef.GetName() -print algoMef.GetId() +print alg2.GetName() +print alg2.GetId() -idmef = smeshgui.AddNewAlgorithms( salome.orb.object_to_string(algoMef) ); +idmef = salome.ObjectToID(alg2) smeshgui.SetName( idmef, "MEFISTO_2D" ); - - print "-------------------------- SMESH_Quadrangle_2D" -alg3 = gen.CreateHypothesis( "Quadrangle_2D" ) -algo3 = alg3._narrow( SMESH.SMESH_2D_Algo ) -listHyp = algo3.GetCompatibleHypothesis() +alg3 = smesh.CreateHypothesis( "Quadrangle_2D", "libStdMeshersEngine.so" ) +listHyp = alg3.GetCompatibleHypothesis() for hyp in listHyp: print hyp -algoQad2 = alg3._narrow( SMESH.SMESH_Quadrangle_2D ) -print algoQad2.GetName() -print algoQad2.GetId() +print alg3.GetName() +print alg3.GetId() -idqad2 = smeshgui.AddNewAlgorithms( salome.orb.object_to_string(algoQad2) ); +idqad2 = salome.ObjectToID(alg3) smeshgui.SetName( idqad2, "SMESH_Quadrangle_2D" ); - print "-------------------------- add hypothesis to main shape1" shape_mesh = salome.IDToObject( Id_shape1 ) -submesh = mesh.GetElementsOnShape( shape_mesh ) - -ret = mesh.AddHypothesis( shape_mesh, algoReg1d ) # Regular 1D/wire discretisation -print ret -ret = mesh.AddHypothesis( shape_mesh, algoMef ) # MEFISTO 2D -print ret -ret = mesh.AddHypothesis( shape_mesh, hypNbSeg1 ) # nb segments -print ret -ret = mesh.AddHypothesis( shape_mesh, hypArea1 ) # max area -print ret -smeshgui.SetAlgorithms( idmesh, idreg1d ); # Regular 1D/wire discretisation -smeshgui.SetAlgorithms( idmesh, idmef ); # MEFISTO 2D -smeshgui.SetHypothesis( idmesh, idseg ); # nb segments -smeshgui.SetHypothesis( idmesh, idarea1 ); # max area +mesh = smesh.CreateMesh(shape_mesh) +idmesh = salome.ObjectToID(mesh) +smeshgui.SetName( idmesh, "Mesh_mechanic" ); +mesh.AddHypothesis( shape_mesh, alg1 ) # Regular 1D/wire discretisation +mesh.AddHypothesis( shape_mesh, alg2 ) # MEFISTO 2D -print "-------------------------- add hypothesis and algorith to sub face" +ret = mesh.AddHypothesis( shape_mesh, hyp2 ) # nb segments +ret = mesh.AddHypothesis( shape_mesh, hyp3 ) # max area -sub_face = salome.IDToObject( Id_SubFace ) -submesh = mesh.GetElementsOnShape( sub_face ) +print "--------Add hypothesis and algorith to sub face" -ret = mesh.AddHypothesis( sub_face, algoQad2 ) # Quadrangle 2D -print ret -ret = mesh.AddHypothesis( sub_face, hypArea2 ) # max area -print ret +#sub_face = salome.IDToObject( Id_SubFace ) +submesh = mesh.GetSubMesh(sub_face, "SubMeshFace") -idsm2 = smeshgui.AddSubMeshOnShape( idmesh, - Id_SubFace, - salome.orb.object_to_string(submesh), - ShapeTypeFace ) +mesh.AddHypothesis( sub_face, alg3 ) # Quadrangle 2D +mesh.AddHypothesis( sub_face, hyp4 ) # max area -smeshgui.SetName(idsm2, "SubMeshFace") -smeshgui.SetAlgorithms( idsm2, idqad2 ); # Quadrangle 2D -smeshgui.SetHypothesis( idsm2, idarea2 ); # max area +print "--------Add hypothesis and algorith to sub face 2" +#sub_face2 = salome.IDToObject( Id_SubFace2 ) +submesh = mesh.GetSubMesh(sub_face2, "SubMeshFace2") +mesh.AddHypothesis( sub_face2, alg3 ) # Quadrangle 2D +ret = mesh.AddHypothesis( sub_face2, hyp4 ) # max area -print "-------------------------- add hypothesis and algorith to sub face" +print "--------Add hypothesis and algorith to sub face 3" -sub_face2 = salome.IDToObject( Id_SubFace2 ) -submesh = mesh.GetElementsOnShape( sub_face2 ) +#sub_face3 = salome.IDToObject( Id_SubFace3 ) +submesh = mesh.GetSubMesh(sub_face3, "SubMeshFace3") -ret = mesh.AddHypothesis( sub_face2, algoQad2 ) # Quadrangle 2D -print ret -ret = mesh.AddHypothesis( sub_face2, hypArea2 ) # max area -print ret +mesh.AddHypothesis( sub_face3, alg3 ) # Quadrangle 2D +ret = mesh.AddHypothesis( sub_face3, hyp4 ) # max area -idsm3 = smeshgui.AddSubMeshOnShape( idmesh, - Id_SubFace2, - salome.orb.object_to_string(submesh), - ShapeTypeFace ) +print "--------Add hypothesis and algorith to sub face 4" -smeshgui.SetName(idsm3, "SubMeshFace2") -smeshgui.SetAlgorithms( idsm3, idqad2 ); # Quadrangle 2D -smeshgui.SetHypothesis( idsm3, idarea2 ); # max area +#sub_face4 = salome.IDToObject( Id_SubFace4 ) +submesh = mesh.GetSubMesh(sub_face4, "SubMeshFace4") +mesh.AddHypothesis( sub_face4, alg3 ) # Quadrangle 2D +ret = mesh.AddHypothesis( sub_face4, hyp4 ) # max area +smesh.Compute(mesh,shape_mesh) +print "Information about the Mesh_mechanic:" +print "Number of nodes : ", mesh.NbNodes() +print "Number of edges : ", mesh.NbEdges() +print "Number of faces : ", mesh.NbFaces() +print "Number of triangles : ", mesh.NbTriangles() +print "Number of quadrangles: ", mesh.NbQuadrangles() -sg.updateObjBrowser(1); +salome.sg.updateObjBrowser(1); diff --git a/src/SMESH_SWIG/SMESH_mechanic_tetra.py b/src/SMESH_SWIG/SMESH_mechanic_tetra.py index 2446828a9..689614891 100644 --- a/src/SMESH_SWIG/SMESH_mechanic_tetra.py +++ b/src/SMESH_SWIG/SMESH_mechanic_tetra.py @@ -24,22 +24,19 @@ # Module : SMESH # $Header$ -import SMESH -import smeshpy import salome -from salome import sg -import math - import geompy -# ---------------------------- GEOM -------------------------------------- -geom = salome.lcc.FindOrLoadComponent("FactoryServer", "GEOM") -myBuilder = salome.myStudy.NewBuilder() -#from geompy import gg +import StdMeshers +import NETGENPlugin + +geom = salome.lcc.FindOrLoadComponent("FactoryServer", "GEOM") +smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH") smeshgui = salome.ImportComponentGUI("SMESH") -smeshgui.Init(salome.myStudyId) +smeshgui.Init(salome.myStudyId); +# ---------------------------- GEOM -------------------------------------- ShapeTypeCompSolid = 1 ShapeTypeSolid = 2 ShapeTypeShell = 3 @@ -124,131 +121,100 @@ print "number of Edges in mechanic : ",len(subEdgeList) ### ---------------------------- SMESH -------------------------------------- -# ---- launch SMESH, init a Mesh with shape 'mechanic' - -gen = smeshpy.smeshpy() -mesh = gen.Init( idMechanic ) - -idmesh = smeshgui.AddNewMesh( salome.orb.object_to_string(mesh) ) -smeshgui.SetName( idmesh, "Mesh_mechanic" ) -smeshgui.SetShape( idMechanic, idmesh ) - print "-------------------------- NumberOfSegments" numberOfSegment = 10 -hypNumberOfSegment = gen.CreateHypothesis( "NumberOfSegments" ) -hypNbSeg = hypNumberOfSegment._narrow( SMESH.SMESH_NumberOfSegments ) +hypNbSeg = smesh.CreateHypothesis( "NumberOfSegments", "libStdMeshersEngine.so" ) hypNbSeg.SetNumberOfSegments(numberOfSegment) print hypNbSeg.GetName() print hypNbSeg.GetId() print hypNbSeg.GetNumberOfSegments() -idSeg = smeshgui.AddNewHypothesis( salome.orb.object_to_string(hypNbSeg) ) -smeshgui.SetName(idSeg, "NumberOfSegments") +smeshgui.SetName(salome.ObjectToID(hypNbSeg), "NumberOfSegments_10") print "-------------------------- MaxElementArea" maxElementArea = 20 -hypMaxElementArea = gen.CreateHypothesis( "MaxElementArea" ) -hypArea = hypMaxElementArea._narrow( SMESH.SMESH_MaxElementArea ) +hypArea = smesh.CreateHypothesis( "MaxElementArea", "libStdMeshersEngine.so" ) hypArea.SetMaxElementArea(maxElementArea) print hypArea.GetName() print hypArea.GetId() print hypArea.GetMaxElementArea() -idArea = smeshgui.AddNewHypothesis( salome.orb.object_to_string(hypArea) ) -smeshgui.SetName(idArea, "MaxElementArea") +smeshgui.SetName(salome.ObjectToID(hypArea), "MaxElementArea_20") print "-------------------------- MaxElementVolume" maxElementVolume = 20 -hypMaxElementVolume = gen.CreateHypothesis( "MaxElementVolume" ) -hypVolume = hypMaxElementVolume._narrow( SMESH.SMESH_MaxElementVolume ) +hypVolume = smesh.CreateHypothesis( "MaxElementVolume", "libStdMeshersEngine.so" ) hypVolume.SetMaxElementVolume(maxElementVolume) print hypVolume.GetName() print hypVolume.GetId() print hypVolume.GetMaxElementVolume() -idVolume = smeshgui.AddNewHypothesis( salome.orb.object_to_string(hypVolume) ) -smeshgui.SetName(idVolume, "MaxElementArea") +smeshgui.SetName(salome.ObjectToID(hypVolume), "MaxElementVolume_20") print "-------------------------- Regular_1D" -alg1D = gen.CreateHypothesis( "Regular_1D" ) -algo1D = alg1D._narrow( SMESH.SMESH_Algo ) -listHyp =algo1D.GetCompatibleHypothesis() +algoReg1D = smesh.CreateHypothesis( "Regular_1D", "libStdMeshersEngine.so" ) +listHyp =algoReg1D.GetCompatibleHypothesis() for hyp in listHyp: print hyp -algoReg1D = alg1D._narrow( SMESH.SMESH_Regular_1D ) print algoReg1D.GetName() print algoReg1D.GetId() -idReg1D = smeshgui.AddNewAlgorithms( salome.orb.object_to_string(algoReg1D) ) -smeshgui.SetName( idReg1D, "Regular_1D" ) +smeshgui.SetName(salome.ObjectToID(algoReg1D), "Regular_1D" ) print "-------------------------- MEFISTO_2D" -alg2D = gen.CreateHypothesis( "MEFISTO_2D" ) -algo2D = alg2D._narrow( SMESH.SMESH_Algo ) -listHyp = algo2D.GetCompatibleHypothesis() +algoMef = smesh.CreateHypothesis( "MEFISTO_2D", "libStdMeshersEngine.so" ) +listHyp = algoMef.GetCompatibleHypothesis() for hyp in listHyp: print hyp -algoMef = alg2D._narrow( SMESH.SMESH_MEFISTO_2D ) print algoMef.GetName() print algoMef.GetId() -idMef = smeshgui.AddNewAlgorithms( salome.orb.object_to_string(algoMef) ) -smeshgui.SetName( idMef, "MEFISTO_2D" ) +smeshgui.SetName(salome.ObjectToID(algoMef), "MEFISTO_2D" ) print "-------------------------- NETGEN_3D" -alg3D = gen.CreateHypothesis( "NETGEN_3D" ) -algo3D = alg3D._narrow( SMESH.SMESH_Algo ) -listHyp = algo3D.GetCompatibleHypothesis() +algoNg = smesh.CreateHypothesis( "NETGEN_3D", "libNETGENEngine.so" ) +listHyp = algoNg.GetCompatibleHypothesis() for hyp in listHyp: print hyp -algoNg = alg3D._narrow( SMESH.SMESH_NETGEN_3D ) print algoNg.GetName() print algoNg.GetId() -idNg = smeshgui.AddNewAlgorithms( salome.orb.object_to_string(algoNg) ) -smeshgui.SetName( idNg, "NETGEN_2D" ) +smeshgui.SetName(salome.ObjectToID(algoNg), "NETGEN_3D" ) print "-------------------------- add hypothesis to main mechanic" shape_mesh = salome.IDToObject( idMechanic ) -submesh = mesh.GetElementsOnShape( shape_mesh ) - -ret = mesh.AddHypothesis( shape_mesh, algoReg1D ) # Regular 1D/wire discretisation -print ret -ret = mesh.AddHypothesis( shape_mesh, algoMef ) # MEFISTO 2D -print ret -ret = mesh.AddHypothesis( shape_mesh, algoNg ) # NETGEN 3D -print ret -ret = mesh.AddHypothesis( shape_mesh, hypNbSeg ) # nb segments -print ret -ret = mesh.AddHypothesis( shape_mesh, hypArea ) # max area -print ret -ret = mesh.AddHypothesis( shape_mesh, hypVolume ) # max volume -print ret - -smeshgui.SetAlgorithms( idmesh, idReg1D ); # Regular 1D/wire discretisation -smeshgui.SetAlgorithms( idmesh, idMef ); # MEFISTO 2D -smeshgui.SetAlgorithms( idmesh, idNg ); # NETGEN 3D -smeshgui.SetHypothesis( idmesh, idSeg ); # nb segments -smeshgui.SetHypothesis( idmesh, idArea ); # max area -smeshgui.SetHypothesis( idmesh, idVolume ); # max volume - -sg.updateObjBrowser(1); + +mesh = smesh.CreateMesh(shape_mesh) +smeshgui.SetName(salome.ObjectToID(mesh), "Mesh_mechanic_tetra" ); + +mesh.AddHypothesis( shape_mesh, algoReg1D ) # Regular 1D/wire discretisation +mesh.AddHypothesis( shape_mesh, algoMef ) # MEFISTO 2D +mesh.AddHypothesis( shape_mesh, algoNg ) # NETGEN 3D + +mesh.AddHypothesis( shape_mesh, hypNbSeg ) # nb segments +mesh.AddHypothesis( shape_mesh, hypArea ) # max area +mesh.AddHypothesis( shape_mesh, hypVolume ) # max volume print "-------------------------- compute the mesh of the mechanic piece" -ret=gen.Compute(mesh,idMechanic) -print ret -log=mesh.GetLog(0) # no erase trace -for linelog in log: - print linelog +smesh.Compute(mesh,shape_mesh) + +print "Information about the Mesh_mechanic_tetra:" +print "Number of nodes : ", mesh.NbNodes() +print "Number of edges : ", mesh.NbEdges() +print "Number of faces : ", mesh.NbFaces() +print "Number of triangles : ", mesh.NbTriangles() +print "Number of volumes: ", mesh.NbVolumes() +print "Number of tetrahedrons: ", mesh.NbTetras() + +salome.sg.updateObjBrowser(1); -sg.updateObjBrowser(1) diff --git a/src/SMESH_SWIG/SMESH_test0.py b/src/SMESH_SWIG/SMESH_test0.py index bce99c6e9..ce717fdde 100644 --- a/src/SMESH_SWIG/SMESH_test0.py +++ b/src/SMESH_SWIG/SMESH_test0.py @@ -35,9 +35,6 @@ geom = salome.lcc.FindOrLoadComponent("FactoryServer", "GEOM") myBuilder = salome.myStudy.NewBuilder() from geompy import gg -smeshgui = salome.ImportComponentGUI("SMESH") -smeshgui.Init(salome.myStudyId); - ShapeTypeCompSolid = 1 ShapeTypeSolid = 2 ShapeTypeShell = 3 diff --git a/src/SMESH_SWIG/SMESH_test1.py b/src/SMESH_SWIG/SMESH_test1.py index 35a3ef00b..a16b63d5a 100644 --- a/src/SMESH_SWIG/SMESH_test1.py +++ b/src/SMESH_SWIG/SMESH_test1.py @@ -22,21 +22,16 @@ # File : SMESH_test1.py # Module : SMESH -import SMESH -import smeshpy import salome -from salome import sg -import math -#import SMESH_BasicHypothesis_idl - import geompy -geom = salome.lcc.FindOrLoadComponent("FactoryServer", "GEOM") -myBuilder = salome.myStudy.NewBuilder() -from geompy import gg +import StdMeshers -smeshgui = salome.ImportComponentGUI("SMESH") -smeshgui.Init(salome.myStudyId); +geom = salome.lcc.FindOrLoadComponent("FactoryServer", "GEOM") +smesh = salome.lcc.FindOrLoadComponent("FactoryServer", "SMESH") + +geom.GetCurrentStudy(salome.myStudy._get_StudyId()) +smesh.SetCurrentStudy(salome.myStudy) ShapeTypeCompSolid = 1 ShapeTypeSolid = 2 @@ -75,135 +70,102 @@ name = geompy.SubShapeName( edge._get_Name(), face._get_Name() ) print name idedge=geompy.addToStudyInFather(face,edge,name) -# ---- launch SMESH, init a Mesh with the box -gen=smeshpy.smeshpy() -mesh=gen.Init(idbox) - -idmesh = smeshgui.AddNewMesh( salome.orb.object_to_string(mesh) ) -smeshgui.SetName(idmesh, "Meshbox"); -smeshgui.SetShape(idbox, idmesh); +# ---- launch SMESH +smeshgui = salome.ImportComponentGUI("SMESH") +smeshgui.Init(salome.myStudyId); # ---- create Hypothesis print "-------------------------- create Hypothesis" print "-------------------------- LocalLength" -hyp1=gen.CreateHypothesis("LocalLength") -hypLen1 = hyp1._narrow(SMESH.SMESH_LocalLength) + +hypLen1 = smesh.CreateHypothesis("LocalLength", "libStdMeshersEngine.so") hypLen1.SetLength(100) print hypLen1.GetName() print hypLen1.GetId() print hypLen1.GetLength() -idlength = smeshgui.AddNewHypothesis( salome.orb.object_to_string(hypLen1) ); +idlength = salome.ObjectToID(hypLen1) smeshgui.SetName(idlength, "Local_Length_100"); print "-------------------------- NumberOfSegments" -hyp2=gen.CreateHypothesis("NumberOfSegments") -hypNbSeg1=hyp2._narrow(SMESH.SMESH_NumberOfSegments) +hypNbSeg1 = smesh.CreateHypothesis("NumberOfSegments", "libStdMeshersEngine.so") hypNbSeg1.SetNumberOfSegments(7) print hypNbSeg1.GetName() print hypNbSeg1.GetId() print hypNbSeg1.GetNumberOfSegments() -idseg = smeshgui.AddNewHypothesis( salome.orb.object_to_string(hypNbSeg1) ); +idseg = salome.ObjectToID(hypNbSeg1) smeshgui.SetName(idseg, "NumberOfSegments_7"); print "-------------------------- MaxElementArea" -hyp3=gen.CreateHypothesis("MaxElementArea") -hypArea1=hyp3._narrow(SMESH.SMESH_MaxElementArea) +hypArea1 = smesh.CreateHypothesis("MaxElementArea", "libStdMeshersEngine.so") hypArea1.SetMaxElementArea(2500) print hypArea1.GetName() print hypArea1.GetId() print hypArea1.GetMaxElementArea() -idarea1 = smeshgui.AddNewHypothesis( salome.orb.object_to_string(hypArea1) ); +idarea1 = salome.ObjectToID(hypArea1) smeshgui.SetName(idarea1, "MaxElementArea_2500"); print "-------------------------- MaxElementArea" -hyp3=gen.CreateHypothesis("MaxElementArea") -hypArea2=hyp3._narrow(SMESH.SMESH_MaxElementArea) +hypArea2 = smesh.CreateHypothesis("MaxElementArea", "libStdMeshersEngine.so") hypArea2.SetMaxElementArea(500) print hypArea2.GetName() print hypArea2.GetId() print hypArea2.GetMaxElementArea() -idarea2 = smeshgui.AddNewHypothesis( salome.orb.object_to_string(hypArea2) ); +idarea2 = salome.ObjectToID(hypArea2) smeshgui.SetName(idarea2, "MaxElementArea_500"); print "-------------------------- Regular_1D" -alg1=gen.CreateHypothesis("Regular_1D") -algo1=alg1._narrow(SMESH.SMESH_Algo) -listHyp=algo1.GetCompatibleHypothesis() +algoReg = smesh.CreateHypothesis("Regular_1D", "libStdMeshersEngine.so") +listHyp=algoReg.GetCompatibleHypothesis() for hyp in listHyp: print hyp -algoReg=alg1._narrow(SMESH.SMESH_Regular_1D) print algoReg.GetName() print algoReg.GetId() -idreg = smeshgui.AddNewAlgorithms( salome.orb.object_to_string(algoReg) ); +idreg = salome.ObjectToID(algoReg) smeshgui.SetName(idreg, "Regular_1D"); print "-------------------------- MEFISTO_2D" -alg2=gen.CreateHypothesis("MEFISTO_2D") -algo2=alg2._narrow(SMESH.SMESH_Algo) -listHyp=algo2.GetCompatibleHypothesis() +algoMef = smesh.CreateHypothesis("MEFISTO_2D", "libStdMeshersEngine.so") +listHyp=algoMef.GetCompatibleHypothesis() for hyp in listHyp: print hyp -algoMef=alg2._narrow(SMESH.SMESH_MEFISTO_2D) print algoMef.GetName() print algoMef.GetId() -idmef = smeshgui.AddNewAlgorithms( salome.orb.object_to_string(algoMef) ); +idmef = salome.ObjectToID(algoMef) smeshgui.SetName(idmef, "MEFISTO_2D"); +# ---- Init a Mesh with the box + +box=salome.IDToObject(idbox) +mesh=smesh.CreateMesh(box) + +idmesh = salome.ObjectToID(mesh) +smeshgui.SetName(idmesh, "Meshbox"); + +# ---- add hypothesis to box +print "-------------------------- add hypothesis to box" +mesh.AddHypothesis(box,algoReg) +mesh.AddHypothesis(box,hypNbSeg1) +mesh.AddHypothesis(box,algoMef) +mesh.AddHypothesis(box,hypArea1) + # ---- add hypothesis to edge print "-------------------------- add hypothesis to edge" edge=salome.IDToObject(idedge) -submesh=mesh.GetElementsOnShape(edge) -ret=mesh.AddHypothesis(edge,algoReg) -print ret -ret=mesh.AddHypothesis(edge,hypLen1) -print ret - -idsm1 = smeshgui.AddSubMeshOnShape( idmesh, - idedge, - salome.orb.object_to_string(submesh), - ShapeTypeEdge ) -smeshgui.SetName(idsm1, "SubMeshEdge") -smeshgui.SetAlgorithms( idsm1, idreg ); -smeshgui.SetHypothesis( idsm1, idlength ); +submesh = mesh.GetSubMesh(edge, "SubMeshEdge") +mesh.AddHypothesis(edge , algoReg) +mesh.AddHypothesis(edge, hypLen1) print "-------------------------- add hypothesis to face" -face=salome.IDToObject(idface) -submesh=mesh.GetElementsOnShape(face) -ret=mesh.AddHypothesis(face,hypArea2) -print ret - -idsm2 = smeshgui.AddSubMeshOnShape( idmesh, - idface, - salome.orb.object_to_string(submesh), - ShapeTypeFace ) -smeshgui.SetName(idsm2, "SubMeshFace") -smeshgui.SetHypothesis( idsm2, idarea2 ); - -# ---- add hypothesis to box +face = salome.IDToObject(idface) +submesh =mesh.GetSubMesh(face, "SubMeshFace") +mesh.AddHypothesis(face,hypArea2) -print "-------------------------- add hypothesis to box" -box=salome.IDToObject(idbox) -submesh=mesh.GetElementsOnShape(box) -ret=mesh.AddHypothesis(box,algoReg) -print ret -ret=mesh.AddHypothesis(box,hypNbSeg1) -print ret -ret=mesh.AddHypothesis(box,algoMef) -print ret -ret=mesh.AddHypothesis(box,hypArea1) -print ret - -smeshgui.SetAlgorithms( idmesh, idreg ); -smeshgui.SetHypothesis( idmesh, idseg ); -smeshgui.SetAlgorithms( idmesh, idmef ); -smeshgui.SetHypothesis( idmesh, idarea1 ); - -sg.updateObjBrowser(1); +salome.sg.updateObjBrowser(1); diff --git a/src/SMESH_SWIG/SMESH_test2.py b/src/SMESH_SWIG/SMESH_test2.py index dd58a63aa..1c58f73da 100644 --- a/src/SMESH_SWIG/SMESH_test2.py +++ b/src/SMESH_SWIG/SMESH_test2.py @@ -27,14 +27,14 @@ from SMESH_test1 import * # ---- compute box print "-------------------------- compute box" -ret=gen.Compute(mesh,idbox) +ret=smesh.Compute(mesh,box) print ret log=mesh.GetLog(0); # no erase trace for linelog in log: print linelog -sg.updateObjBrowser(1); +salome.sg.updateObjBrowser(1); # ---- compute edge diff --git a/src/SMESH_SWIG/SMESH_test3.py b/src/SMESH_SWIG/SMESH_test3.py index 4154040ce..65d7129e6 100644 --- a/src/SMESH_SWIG/SMESH_test3.py +++ b/src/SMESH_SWIG/SMESH_test3.py @@ -34,9 +34,6 @@ geom = salome.lcc.FindOrLoadComponent("FactoryServer", "GEOM") myBuilder = salome.myStudy.NewBuilder() from geompy import gg -smeshgui = salome.ImportComponentGUI("SMESH") -smeshgui.Init(salome.myStudyId); - ShapeTypeCompSolid = 1 ShapeTypeSolid = 2 ShapeTypeShell = 3 diff --git a/src/SMESH_SWIG/batchmode_smesh.py b/src/SMESH_SWIG/batchmode_smesh.py index eef9e1d50..899dc59af 100644 --- a/src/SMESH_SWIG/batchmode_smesh.py +++ b/src/SMESH_SWIG/batchmode_smesh.py @@ -22,13 +22,10 @@ if myStudyBuilder is None: father = myStudy.FindComponent("MESH") if father is None: father = myStudyBuilder.NewComponent("MESH") - A1 = myStudyBuilder.FindOrCreateAttribute(father, "AttributeName"); - FName = A1._narrow(SALOMEDS.AttributeName) - #FName.SetValue("Mesh") + FName = myStudyBuilder.FindOrCreateAttribute(father, "AttributeName"); Comp = modulecatalog.GetComponent( "SMESH" ) FName.SetValue( Comp._get_componentusername() ) - A2 = myStudyBuilder.FindOrCreateAttribute(father, "AttributePixMap"); - aPixmap = A2._narrow(SALOMEDS.AttributePixMap); + aPixmap = myStudyBuilder.FindOrCreateAttribute(father, "AttributePixMap"); aPixmap.SetPixMap( "ICON_OBJBROWSER_Mesh" ); myStudyBuilder.DefineComponentInstance(father,smesh) @@ -67,113 +64,111 @@ def Init(): pass #------------------------------------------------------------ def AddNewMesh(IOR): + # VSR: added temporarily - objects are published automatically by the engine + aSO = myStudy.FindObjectIOR( IOR ) + if aSO is not None: + return aSO.GetID() + # VSR ###################################################################### + res,HypothesisRoot = mySComponentMesh.FindSubObject ( Tag_HypothesisRoot ) if HypothesisRoot is None or res == 0: HypothesisRoot = myStudyBuilder.NewObjectToTag(mySComponentMesh, Tag_HypothesisRoot) - anAttr = myStudyBuilder.FindOrCreateAttribute(HypothesisRoot, "AttributeName") - aName = anAttr._narrow(SALOMEDS.AttributeName) - aName.SetValue("Hypothesis Definition") - anAttr = myStudyBuilder.FindOrCreateAttribute(HypothesisRoot, "AttributePixMap") - aPixmap = anAttr._narrow(SALOMEDS.AttributePixMap) + aName = myStudyBuilder.FindOrCreateAttribute(HypothesisRoot, "AttributeName") + aName.SetValue("Hypotheses") + aPixmap = myStudyBuilder.FindOrCreateAttribute(HypothesisRoot, "AttributePixMap") aPixmap.SetPixMap( "mesh_tree_hypo.png" ) - anAttr = myStudyBuilder.FindOrCreateAttribute(HypothesisRoot, "AttributeSelectable") - aSelAttr = anAttr._narrow(SALOMEDS.AttributeSelectable) + aSelAttr = myStudyBuilder.FindOrCreateAttribute(HypothesisRoot, "AttributeSelectable") aSelAttr.SetSelectable(0); res, AlgorithmsRoot = mySComponentMesh.FindSubObject (Tag_AlgorithmsRoot) if AlgorithmsRoot is None or res == 0: AlgorithmsRoot = myStudyBuilder.NewObjectToTag (mySComponentMesh, Tag_AlgorithmsRoot) - anAttr = myStudyBuilder.FindOrCreateAttribute(AlgorithmsRoot, "AttributeName") - aName = anAttr._narrow(SALOMEDS.AttributeName) - aName.SetValue("Algorithms Definition"); - anAttr = myStudyBuilder.FindOrCreateAttribute(AlgorithmsRoot, "AttributePixMap"); - aPixmap = anAttr._narrow(SALOMEDS.AttributePixMap); + aName = myStudyBuilder.FindOrCreateAttribute(AlgorithmsRoot, "AttributeName") + aName.SetValue("Algorithms"); + aPixmap = myStudyBuilder.FindOrCreateAttribute(AlgorithmsRoot, "AttributePixMap"); aPixmap.SetPixMap( "mesh_tree_algo.png" ); - anAttr = myStudyBuilder.FindOrCreateAttribute(AlgorithmsRoot, "AttributeSelectable"); - aSelAttr = anAttr._narrow(SALOMEDS.AttributeSelectable); + aSelAttr = myStudyBuilder.FindOrCreateAttribute(AlgorithmsRoot, "AttributeSelectable"); aSelAttr.SetSelectable(0); HypothesisRoot = HypothesisRoot._narrow(SALOMEDS.SObject) newMesh = myStudyBuilder.NewObject(mySComponentMesh) - newMesh = newMesh._narrow(SALOMEDS.SObject) - anAttr = myStudyBuilder.FindOrCreateAttribute(newMesh, "AttributePixMap") - aPixmap = anAttr._narrow(SALOMEDS.AttributePixMap) + aPixmap = myStudyBuilder.FindOrCreateAttribute(newMesh, "AttributePixMap") aPixmap.SetPixMap( "mesh_tree_mesh.png" ) - anAttr = myStudyBuilder.FindOrCreateAttribute(newMesh, "AttributeIOR") - anIOR = anAttr._narrow(SALOMEDS.AttributeIOR) + anIOR = myStudyBuilder.FindOrCreateAttribute(newMesh, "AttributeIOR") anIOR.SetValue(IOR) return newMesh.GetID() #------------------------------------------------------------ def AddNewHypothesis(IOR): + # VSR: added temporarily - objects are published automatically by the engine + aSO = myStudy.FindObjectIOR( IOR ) + if aSO is not None: + return aSO.GetID() + # VSR ###################################################################### + res, HypothesisRoot = mySComponentMesh.FindSubObject (Tag_HypothesisRoot) if HypothesisRoot is None or res == 0: HypothesisRoot = myStudyBuilder.NewObjectToTag (mySComponentMesh, Tag_HypothesisRoot) - anAttr = myStudyBuilder.FindOrCreateAttribute(HypothesisRoot, "AttributeName"); - aName = anAttr._narrow(SALOMEDS.AttributeName); - aName.SetValue("Hypothesis Definition"); - anAttr = myStudyBuilder.FindOrCreateAttribute(HypothesisRoot, "AttributeSelectable"); - aSelAttr = anAttr._narrow(SALOMEDS.AttributeSelectable); + aName = myStudyBuilder.FindOrCreateAttribute(HypothesisRoot, "AttributeName"); + aName.SetValue("Hypotheses"); + aSelAttr = myStudyBuilder.FindOrCreateAttribute(HypothesisRoot, "AttributeSelectable"); aSelAttr.SetSelectable(0); - anAttr = myStudyBuilder.FindOrCreateAttribute(HypothesisRoot, "AttributePixMap"); - aPixmap = anAttr._narrow(SALOMEDS.AttributePixMap); + aPixmap = myStudyBuilder.FindOrCreateAttribute(HypothesisRoot, "AttributePixMap"); aPixmap.SetPixMap( "mesh_tree_hypo.png" ); # Add New Hypothesis newHypo = myStudyBuilder.NewObject(HypothesisRoot) - newHypo = newHypo._narrow(SALOMEDS.SObject) - anAttr = myStudyBuilder.FindOrCreateAttribute(newHypo, "AttributePixMap") - aPixmap = anAttr._narrow(SALOMEDS.AttributePixMap) + aPixmap = myStudyBuilder.FindOrCreateAttribute(newHypo, "AttributePixMap") H = orb.string_to_object(IOR) - H = H._narrow( SMESH.SMESH_Hypothesis ); aType = H.GetName(); aPixmap.SetPixMap( "mesh_tree_hypo.png_" + aType ); - anAttr = myStudyBuilder.FindOrCreateAttribute(newHypo, "AttributeIOR"); - anIOR = anAttr._narrow(SALOMEDS.AttributeIOR); + anIOR = myStudyBuilder.FindOrCreateAttribute(newHypo, "AttributeIOR"); anIOR.SetValue(IOR); return newHypo.GetID(); #------------------------------------------------------------ def AddNewAlgorithms(IOR): + # VSR: added temporarily - objects are published automatically by the engine + aSO = myStudy.FindObjectIOR( IOR ) + if aSO is not None: + return aSO.GetID() + # VSR ###################################################################### + res, AlgorithmsRoot = mySComponentMesh.FindSubObject (Tag_AlgorithmsRoot) if AlgorithmsRoot is None or res == 0: AlgorithmsRoot = myStudyBuilde.NewObjectToTag (mySComponentMesh, Tag_AlgorithmsRoot) - anAttr = myStudyBuilder.FindOrCreateAttribute(AlgorithmsRoot, "AttributeName") - aName = anAttr._narrow(SALOMEDS.AttributeName); - aName.SetValue("Algorithms Definition"); - anAttr = myStudyBuilder.FindOrCreateAttribute(AlgorithmsRoot, "AttributeSelectable") - aSelAttr = anAttr._narrow(SALOMEDS.AttributeSelectable); + aName = myStudyBuilder.FindOrCreateAttribute(AlgorithmsRoot, "AttributeName") + aName.SetValue("Algorithms"); + aSelAttr = myStudyBuilder.FindOrCreateAttribute(AlgorithmsRoot, "AttributeSelectable") aSelAttr.SetSelectable(0); - anAttr = myStudyBuilder.FindOrCreateAttribute(AlgorithmsRoot, "AttributePixMap"); - aPixmap = anAttr._narrow(SALOMEDS.AttributePixMap); + aPixmap = myStudyBuilder.FindOrCreateAttribute(AlgorithmsRoot, "AttributePixMap"); aPixmap.SetPixMap( "mesh_tree_algo.png" ); # Add New Algorithms newHypo = myStudyBuilder.NewObject(AlgorithmsRoot) - newHypo = newHypo._narrow(SALOMEDS.SObject) - anAttr = myStudyBuilder.FindOrCreateAttribute(newHypo, "AttributePixMap"); + aPixmap = myStudyBuilder.FindOrCreateAttribute(newHypo, "AttributePixMap"); aPixmap = anAttr._narrow(SALOMEDS.AttributePixMap); H = orb.string_to_object(IOR) - H = H._narrow( SMESH.SMESH_Hypothesis); aType = H.GetName(); #QString in fact aPixmap.SetPixMap( "mesh_tree_algo.png_" + aType ); - anAttr = myStudyBuilder.FindOrCreateAttribute(newHypo, "AttributeIOR"); - anIOR = anAttr._narrow(SALOMEDS.AttributeIOR); + anIOR = myStudyBuilder.FindOrCreateAttribute(newHypo, "AttributeIOR"); anIOR.SetValue(IOR); return newHypo.GetID(); #------------------------------------------------------------ def SetShape(ShapeEntry, MeshEntry): - SO_MorSM = myStudy.FindObjectID( MeshEntry ) - SO_MorSM = SO_MorSM._narrow(SALOMEDS.SObject) SO_GeomShape = myStudy.FindObjectID( ShapeEntry ); - SO_GeomShape = SO_GeomShape._narrow(SALOMEDS.SObject) if SO_MorSM is not None and SO_GeomShape is not None : + # VSR: added temporarily - shape reference is published automatically by the engine + res, Ref = SO_MorSM.FindSubObject( Tag_RefOnShape ); + if res == 1 : + return; + # VSR ###################################################################### + SO = myStudyBuilder.NewObjectToTag (SO_MorSM, Tag_RefOnShape); - SO = SO._narrow(SALOMEDS.SObject) myStudyBuilder.Addreference (SO,SO_GeomShape); @@ -188,19 +183,28 @@ def SetHypothesis(Mesh_Or_SubMesh_Entry, Hypothesis_Entry): res, AHR = SO_MorSM.FindSubObject (Tag_RefOnAppliedHypothesis) if AHR is None or res == 0: AHR = myStudyBuilder.NewObjectToTag (SO_MorSM, Tag_RefOnAppliedHypothesis); - anAttr = myStudyBuilder.FindOrCreateAttribute(AHR, "AttributeName"); - aName = anAttr._narrow(SALOMEDS.AttributeName); - aName.SetValue("Applied Hypothesis"); - anAttr = myStudyBuilder.FindOrCreateAttribute(AHR, "AttributeSelectable"); - aSelAttr = anAttr._narrow(SALOMEDS.AttributeSelectable); + aName = myStudyBuilder.FindOrCreateAttribute(AHR, "AttributeName"); + + # The same name as in SMESH_Mesh_i::AddHypothesis() ################## + aName.SetValue("Applied hypotheses"); + + aSelAttr = myStudyBuilder.FindOrCreateAttribute(AHR, "AttributeSelectable"); aSelAttr.SetSelectable(0); - anAttr = myStudyBuilder.FindOrCreateAttribute(AHR, "AttributePixMap"); - aPixmap = anAttr._narrow(SALOMEDS.AttributePixMap); + aPixmap = myStudyBuilder.FindOrCreateAttribute(AHR, "AttributePixMap"); aPixmap.SetPixMap( "mesh_tree_hypo.png" ); - - SO = myStudyBuilder.NewObject(AHR); - SO = SO._narrow(SALOMEDS.SObject) - myStudyBuilder.Addreference (SO,SO_Hypothesis); + + # VSR: added temporarily - reference to applied hypothesis is published automatically by the engine + else : + it = myStudy.NewChildIterator(AHR); + while it.More() : + res, Ref = it.Value().ReferencedObject(); + if res and Ref is not None and Ref.GetID() == Hypothesis_Entry : + return; + it.Next(); + # VSR ###################################################################### + + SO = myStudyBuilder.NewObject(AHR); + myStudyBuilder.Addreference (SO,SO_Hypothesis); #------------------------------------------------------------ def SetAlgorithms(Mesh_Or_SubMesh_Entry, Algorithms_Entry): @@ -211,16 +215,26 @@ def SetAlgorithms(Mesh_Or_SubMesh_Entry, Algorithms_Entry): res, AHR = SO_MorSM.FindSubObject (Tag_RefOnAppliedAlgorithms); if AHR is None or res == 0: AHR = myStudyBuilder.NewObjectToTag (SO_MorSM, Tag_RefOnAppliedAlgorithms); - anAttr = myStudyBuilder.FindOrCreateAttribute(AHR, "AttributeName"); - aName = anAttr._narrow(SALOMEDS.AttributeName); - aName.SetValue("Applied Algorithm"); - anAttr = myStudyBuilder.FindOrCreateAttribute(AHR, "AttributeSelectable"); - aSelAttr = anAttr._narrow(SALOMEDS.AttributeSelectable); + aName = myStudyBuilder.FindOrCreateAttribute(AHR, "AttributeName"); + + # The same name as in SMESH_Mesh_i::AddHypothesis() ################## + aName.SetValue("Applied algorithms"); + + aSelAttr = myStudyBuilder.FindOrCreateAttribute(AHR, "AttributeSelectable"); aSelAttr.SetSelectable(0); - anAttr = myStudyBuilder.FindOrCreateAttribute(AHR, "AttributePixMap"); - aPixmap = anAttr._narrow(SALOMEDS.AttributePixMap); + aPixmap = myStudyBuilder.FindOrCreateAttribute(AHR, "AttributePixMap"); aPixmap.SetPixMap( "mesh_tree_algo.png" ); - + + # VSR: added temporarily - reference to applied hypothesis is published automatically by the engine + else : + it = myStudy.NewChildIterator(AHR); + while it.More() : + res, Ref = it.Value().ReferencedObject(); + if res and Ref is not None and Ref.GetID() == Algorithms_Entry : + return; + it.Next(); + # VSR ###################################################################### + SO = myStudyBuilder.NewObject(AHR); myStudyBuilder.Addreference (SO,SO_Algorithms); @@ -234,40 +248,41 @@ def UnSetHypothesis( Applied_Hypothesis_Entry ): #------------------------------------------------------------ def AddSubMesh ( SO_Mesh_Entry, SM_IOR, ST): + # VSR: added temporarily - objects are published automatically by the engine + aSO = myStudy.FindObjectIOR( SM_IOR ) + if aSO is not None: + return aSO.GetID() + # VSR ###################################################################### + SO_Mesh = myStudy.FindObjectID( SO_Mesh_Entry ) if ( SO_Mesh ) : if ST == ShapeTypeCompSolid : Tag_Shape = Tag_SubMeshOnSolid; - Name = "SubMeshes On Solid"; + Name = "SubMeshes on Solid"; elif ST == ShapeTypeFace : Tag_Shape = Tag_SubMeshOnFace; - Name = "SubMeshes On Face"; + Name = "SubMeshes on Face"; elif ST == ShapeTypeEdge : Tag_Shape = Tag_SubMeshOnEdge; - Name = "SubMeshes On Edge"; + Name = "SubMeshes on Edge"; elif ST == ShapeTypeVertex : Tag_Shape = Tag_SubMeshOnVertex; - Name = "SubMeshes On Vertex"; + Name = "SubMeshes on Vertex"; else : Tag_Shape = Tag_SubMeshOnCompound; - Name = "SubMeshes On Compound"; + Name = "SubMeshes on Compound"; res, SubmeshesRoot = SO_Mesh.FindSubObject (Tag_Shape) if SubmeshesRoot is None or res == 0: SubmeshesRoot = myStudyBuilder.NewObjectToTag (SO_Mesh, Tag_Shape); - anAttr = myStudyBuilder.FindOrCreateAttribute(SubmeshesRoot, "AttributeName"); - - aName = anAttr._narrow(SALOMEDS.AttributeName); + aName = myStudyBuilder.FindOrCreateAttribute(SubmeshesRoot, "AttributeName"); aName.SetValue(Name); - anAttr = myStudyBuilder.FindOrCreateAttribute(SubmeshesRoot, "AttributeSelectable"); - aSelAttr = anAttr._narrow(SALOMEDS.AttributeSelectable); + aSelAttr = myStudyBuilder.FindOrCreateAttribute(SubmeshesRoot, "AttributeSelectable"); aSelAttr.SetSelectable(0); SO = myStudyBuilder.NewObject (SubmeshesRoot); - SO = SO._narrow(SALOMEDS.SObject) - anAttr = myStudyBuilder.FindOrCreateAttribute(SO, "AttributeIOR"); - anIOR = anAttr._narrow(SALOMEDS.AttributeIOR); + anIOR = myStudyBuilder.FindOrCreateAttribute(SO, "AttributeIOR"); anIOR.SetValue(SM_IOR); return SO.GetID(); @@ -275,24 +290,28 @@ def AddSubMesh ( SO_Mesh_Entry, SM_IOR, ST): #------------------------------------------------------------ def AddSubMeshOnShape (Mesh_Entry, GeomShape_Entry, SM_IOR, ST) : - SO_GeomShape = myStudy.FindObjectID( GeomShape_Entry ); - if SO_GeomShape != None : - SM_Entry = AddSubMesh (Mesh_Entry,SM_IOR,ST); - SO_SM = myStudy.FindObjectID( SM_Entry ); - - if SO_SM != None : - SetShape (GeomShape_Entry, SM_Entry); - return SO_SM.GetID(); + # VSR: added temporarily - objects are published automatically by the engine + aSO = myStudy.FindObjectIOR( SM_IOR ) + if aSO is not None: + return aSO.GetID() + # VSR ###################################################################### + SO_GeomShape = myStudy.FindObjectID( GeomShape_Entry ); + if SO_GeomShape != None : + SM_Entry = AddSubMesh (Mesh_Entry,SM_IOR,ST); + SO_SM = myStudy.FindObjectID( SM_Entry ); + + if SO_SM != None : + SetShape (GeomShape_Entry, SM_Entry); + return SM_Entry; - return None; + return None; #------------------------------------------------------------ def SetName(Entry, Name): SO = myStudy.FindObjectID( Entry ); if SO != None : - anAttr = myStudyBuilder.FindOrCreateAttribute(SO, "AttributeName"); - aName = anAttr._narrow(SALOMEDS.AttributeName); + aName = myStudyBuilder.FindOrCreateAttribute(SO, "AttributeName"); aName.SetValue(Name); -- 2.30.2