From 2a0ff88cf124a67aaf24a217b3a52d1b2414dbc5 Mon Sep 17 00:00:00 2001 From: rnc Date: Mon, 2 Sep 2013 12:20:44 +0000 Subject: [PATCH] Merge from V7_main --- Makefile.am | 2 - build_configure | 10 +- configure.ac | 14 +- doc/salome/gui/GHS3DPLUGIN/CMakeLists.txt | 6 +- doc/salome/gui/GHS3DPLUGIN/Makefile.am | 4 +- .../images/ghs3d_parameters_basic.png | Bin 20489 -> 20318 bytes .../gui/GHS3DPLUGIN/input/ghs3d_hypo.doc | 4 + idl/GHS3DPlugin_Algorithm.idl | 8 +- idl/Makefile.am | 7 +- resources/GHS3DPlugin.xml | 1 + src/GHS3DPlugin/GHS3DPluginBuilder.py | 8 + src/GHS3DPlugin/GHS3DPlugin_GHS3D.cxx | 327 ++++++++++++------ src/GHS3DPlugin/GHS3DPlugin_GHS3D.hxx | 26 +- src/GHS3DPlugin/GHS3DPlugin_Hypothesis.cxx | 70 +++- src/GHS3DPlugin/GHS3DPlugin_Hypothesis.hxx | 16 +- src/GHS3DPlugin/GHS3DPlugin_Hypothesis_i.cxx | 49 ++- src/GHS3DPlugin/GHS3DPlugin_Hypothesis_i.hxx | 7 + src/GHS3DPlugin/Makefile.am | 2 - src/GUI/GHS3DPluginGUI_HypothesisCreator.cxx | 24 +- src/GUI/GHS3DPluginGUI_HypothesisCreator.h | 4 +- src/GUI/GHS3DPlugin_msg_en.ts | 4 + src/GUI/GHS3DPlugin_msg_fr.ts | 4 + src/GUI/GHS3DPlugin_msg_ja.ts | 211 +++++++++++ src/GUI/Makefile.am | 5 +- 24 files changed, 631 insertions(+), 182 deletions(-) create mode 100644 src/GUI/GHS3DPlugin_msg_ja.ts diff --git a/Makefile.am b/Makefile.am index 91c9c4f..ec3f2d1 100644 --- a/Makefile.am +++ b/Makefile.am @@ -29,13 +29,11 @@ if GHS3DPLUGIN_ENABLE_GUI ACLOCAL_AMFLAGS = -I adm_local/unix/config_files \ -I ${KERNEL_ROOT_DIR}/salome_adm/unix/config_files \ -I ${GUI_ROOT_DIR}/adm_local/unix/config_files \ - -I ${MED_ROOT_DIR}/adm_local/unix/config_files \ -I ${GEOM_ROOT_DIR}/adm_local/unix/config_files \ -I ${SMESH_ROOT_DIR}/adm_local/unix/config_files else !GHS3DPLUGIN_ENABLE_GUI ACLOCAL_AMFLAGS = -I adm_local/unix/config_files \ -I ${KERNEL_ROOT_DIR}/salome_adm/unix/config_files \ - -I ${MED_ROOT_DIR}/adm_local/unix/config_files \ -I ${GEOM_ROOT_DIR}/adm_local/unix/config_files \ -I ${SMESH_ROOT_DIR}/adm_local/unix/config_files endif diff --git a/build_configure b/build_configure index ef04e8c..c532a52 100755 --- a/build_configure +++ b/build_configure @@ -53,10 +53,10 @@ fi ######################################################################## # Test if the MED_ROOT_DIR is set correctly -if test ! -d "${MED_ROOT_DIR}"; then - echo "failed : MED_ROOT_DIR variable is not correct !" - exit -fi +# if test ! -d "${MED_ROOT_DIR}"; then +# echo "failed : MED_ROOT_DIR variable is not correct !" +# exit +# fi ######################################################################## # Test if the SMESH_ROOT_DIR is set correctly @@ -84,13 +84,11 @@ if test -d "${GUI_ROOT_DIR}"; then aclocal -I adm_local/unix/config_files \ -I ${KERNEL_ROOT_DIR}/salome_adm/unix/config_files \ -I ${GUI_ROOT_DIR}/adm_local/unix/config_files \ - -I ${MED_ROOT_DIR}/adm_local/unix/config_files \ -I ${GEOM_ROOT_DIR}/adm_local/unix/config_files \ -I ${SMESH_ROOT_DIR}/adm_local/unix/config_files || exit 1 else aclocal -I adm_local/unix/config_files \ -I ${KERNEL_ROOT_DIR}/salome_adm/unix/config_files \ - -I ${MED_ROOT_DIR}/adm_local/unix/config_files \ -I ${GEOM_ROOT_DIR}/adm_local/unix/config_files \ -I ${SMESH_ROOT_DIR}/adm_local/unix/config_files || exit 1 fi diff --git a/configure.ac b/configure.ac index 8f57e4a..b561e46 100644 --- a/configure.ac +++ b/configure.ac @@ -331,14 +331,6 @@ echo CHECK_GEOM -echo -echo --------------------------------------------- -echo Testing Med -echo --------------------------------------------- -echo - -CHECK_MED - echo echo --------------------------------------------- echo Testing SMesh @@ -363,11 +355,11 @@ echo echo Configure if test "${gui_ok}" = "yes"; then - variables="cc_ok boost_ok threads_ok omniORB_ok occ_ok doxygen_ok Kernel_ok gui_ok Geom_ok Med_ok SMesh_ok MeshGems_Tetra_ok OpenGL_ok qt_ok vtk_ok" + variables="cc_ok boost_ok threads_ok omniORB_ok occ_ok doxygen_ok Kernel_ok gui_ok Geom_ok SMesh_ok MeshGems_Tetra_ok OpenGL_ok qt_ok vtk_ok" elif test "${SalomeGUI_need}" != "no"; then - variables="cc_ok boost_ok threads_ok omniORB_ok occ_ok doxygen_ok Kernel_ok gui_ok Geom_ok Med_ok SMesh_ok MeshGems_Tetra_ok vtk_ok" + variables="cc_ok boost_ok threads_ok omniORB_ok occ_ok doxygen_ok Kernel_ok gui_ok Geom_ok SMesh_ok MeshGems_Tetra_ok vtk_ok" else - variables="cc_ok boost_ok threads_ok omniORB_ok occ_ok doxygen_ok Kernel_ok Geom_ok Med_ok SMesh_ok MeshGems_Tetra_ok vtk_ok" + variables="cc_ok boost_ok threads_ok omniORB_ok occ_ok doxygen_ok Kernel_ok Geom_ok SMesh_ok MeshGems_Tetra_ok vtk_ok" fi for var in $variables diff --git a/doc/salome/gui/GHS3DPLUGIN/CMakeLists.txt b/doc/salome/gui/GHS3DPLUGIN/CMakeLists.txt index 13068c9..94dad40 100755 --- a/doc/salome/gui/GHS3DPLUGIN/CMakeLists.txt +++ b/doc/salome/gui/GHS3DPLUGIN/CMakeLists.txt @@ -44,8 +44,6 @@ IF(WINDOWS) @SET PATH=$ENV{KERNEL_ROOT_DIR}/lib/salome\;%PATH% @SET PYTHONPATH=$ENV{KERNEL_ROOT_DIR}/bin/salome\;%PYTHONPATH% @SET PYTHONPATH=$ENV{KERNEL_ROOT_DIR}/lib/python${PYTHON_VERSION}/site-packages/salome\;%PYTHONPATH% - @SET PYTHONPATH=$ENV{MED_ROOT_DIR}/lib/python${PYTHON_VERSION}/site-packages/salome\;%PYTHONPATH% - @SET PYTHONPATH=$ENV{MED_ROOT_DIR}/bin/salome\;%PYTHONPATH% @SET PYTHONPATH=$ENV{GEOM_ROOT_DIR}/lib/python${PYTHON_VERSION}/site-packages/salome\;%PYTHONPATH% @SET PYTHONPATH=$ENV{GEOM_ROOT_DIR}/bin/salome\;%PYTHONPATH% @SET PYTHONPATH=$ENV{SMESH_ROOT_DIR}/lib/python${PYTHON_VERSION}/site-packages/salome\;%PYTHONPATH% @@ -57,8 +55,8 @@ IF(WINDOWS) SET(EXT "bat") SET(CALL_STR "call") ELSE(WINDOWS) - SET(DOC_PYTHONPATH ${CMAKE_INSTALL_PREFIX}/bin/salome:${CMAKE_INSTALL_PREFIX}/lib/python${PYTHON_VERSION}/site-packages/salome:${SMESH_ROOT_DIR}/bin/salome:${SMESH_ROOT_DIR}/lib/python${PYTHON_VERSION}/site-packages/salome:${MED_ROOT_DIR}/lib/python${PYTHON_VERSION}/site-packages/salome:${GEOM_ROOT_DIR}/bin/salome:${GEOM_ROOT_DIR}/lib/python${PYTHON_VERSION}/site-packages/salome:${KERNEL_ROOT_DIR}/bin/salome:${KERNEL_ROOT_DIR}/lib/python${PYTHON_VERSION}/site-packages/salome:${OMNIORB_ROOT_USER}/lib/python${PYTHON_VERSION}/site-packages:${OMNIORB_ROOT_USER}/lib64/python${PYTHON_VERSION}/site-packages) - SET(DOC_LD_LIBRARY_PATH "${CMAKE_INSTALL_PREFIX}/lib/salome:${SMESH_ROOT_DIR}/lib/salome:${MED_ROOT_DIR}/lib/salome:${GEOM_ROOT_DIR}/lib/salome:${KERNEL_ROOT_DIR}/lib/salome") + SET(DOC_PYTHONPATH ${CMAKE_INSTALL_PREFIX}/bin/salome:${CMAKE_INSTALL_PREFIX}/lib/python${PYTHON_VERSION}/site-packages/salome:${SMESH_ROOT_DIR}/bin/salome:${SMESH_ROOT_DIR}/lib/python${PYTHON_VERSION}/site-packages/salome:${GEOM_ROOT_DIR}/bin/salome:${GEOM_ROOT_DIR}/lib/python${PYTHON_VERSION}/site-packages/salome:${KERNEL_ROOT_DIR}/bin/salome:${KERNEL_ROOT_DIR}/lib/python${PYTHON_VERSION}/site-packages/salome:${OMNIORB_ROOT_USER}/lib/python${PYTHON_VERSION}/site-packages:${OMNIORB_ROOT_USER}/lib64/python${PYTHON_VERSION}/site-packages) + SET(DOC_LD_LIBRARY_PATH "${CMAKE_INSTALL_PREFIX}/lib/salome:${SMESH_ROOT_DIR}/lib/salome:${GEOM_ROOT_DIR}/lib/salome:${KERNEL_ROOT_DIR}/lib/salome") SET(SCR "export PYTHONPATH=${DOC_PYTHONPATH}:\${PYTHONPATH} export LD_LIBRARY_PATH=${DOC_LD_LIBRARY_PATH}:\${LD_LIBRARY_PATH} export SMESH_MeshersList=${DOC_SMESH_MeshersList} diff --git a/doc/salome/gui/GHS3DPLUGIN/Makefile.am b/doc/salome/gui/GHS3DPLUGIN/Makefile.am index b7dd89a..4250603 100755 --- a/doc/salome/gui/GHS3DPLUGIN/Makefile.am +++ b/doc/salome/gui/GHS3DPLUGIN/Makefile.am @@ -23,8 +23,8 @@ EXTRA_DIST += images input static/footer.html static/salome_extra.css guidocdir = $(docdir)/gui/GHS3DPLUGIN guidoc_DATA = images/head.png -DOC_PYTHONPATH=$(prefix)/bin/salome:$(prefix)/lib/python$(PYTHON_VERSION)/site-packages/salome:$(SMESH_ROOT_DIR)/bin/salome:$(SMESH_ROOT_DIR)/lib/python$(PYTHON_VERSION)/site-packages/salome:$(MED_ROOT_DIR)/lib/python$(PYTHON_VERSION)/site-packages/salome:$(GEOM_ROOT_DIR)/bin/salome:$(GEOM_ROOT_DIR)/lib/python$(PYTHON_VERSION)/site-packages/salome:$(KERNEL_ROOT_DIR)/bin/salome:$(KERNEL_ROOT_DIR)/lib/python$(PYTHON_VERSION)/site-packages/salome:$(OMNIORB_ROOT)/lib/python$(PYTHON_VERSION)/site-packages:$(OMNIORB_ROOT)/lib64/python$(PYTHON_VERSION)/site-packages -DOC_LD_LIBRARY_PATH=$(prefix)/lib/salome:$(SMESH_ROOT_DIR)/lib/salome:$(MED_ROOT_DIR)/lib/salome:$(GEOM_ROOT_DIR)/lib/salome:$(KERNEL_ROOT_DIR)/lib/salome +DOC_PYTHONPATH=$(prefix)/bin/salome:$(prefix)/lib/python$(PYTHON_VERSION)/site-packages/salome:$(SMESH_ROOT_DIR)/bin/salome:$(SMESH_ROOT_DIR)/lib/python$(PYTHON_VERSION)/site-packages/salome:$(GEOM_ROOT_DIR)/bin/salome:$(GEOM_ROOT_DIR)/lib/python$(PYTHON_VERSION)/site-packages/salome:$(KERNEL_ROOT_DIR)/bin/salome:$(KERNEL_ROOT_DIR)/lib/python$(PYTHON_VERSION)/site-packages/salome:$(OMNIORB_ROOT)/lib/python$(PYTHON_VERSION)/site-packages:$(OMNIORB_ROOT)/lib64/python$(PYTHON_VERSION)/site-packages +DOC_LD_LIBRARY_PATH=$(prefix)/lib/salome:$(SMESH_ROOT_DIR)/lib/salome:$(GEOM_ROOT_DIR)/lib/salome:$(KERNEL_ROOT_DIR)/lib/salome DOC_SMESH_MeshersList=GHS3DPlugin tmp/smeshBuilder.py: $(top_srcdir)/src/GHS3DPlugin/GHS3DPluginBuilder.py diff --git a/doc/salome/gui/GHS3DPLUGIN/images/ghs3d_parameters_basic.png b/doc/salome/gui/GHS3DPLUGIN/images/ghs3d_parameters_basic.png index e272cefdd0ba5f5bc8e99c25749cf4423fca8751..e71688edaae24fe3806061178a7beaab3aa6c0a2 100644 GIT binary patch literal 20318 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 wMn(o+UbPATo make groups of domains - if checked, the algorithm will +create groups of just generated elements corresponding to each mesh +domain.
+ - Optimization level - allows choosing the required optimization level (higher level of optimisation provides better mesh, but can be time-consuming): diff --git a/idl/GHS3DPlugin_Algorithm.idl b/idl/GHS3DPlugin_Algorithm.idl index 2a608dd..01be915 100644 --- a/idl/GHS3DPlugin_Algorithm.idl +++ b/idl/GHS3DPlugin_Algorithm.idl @@ -19,7 +19,6 @@ // File : GHS3D_Algorithm.idl // Author : Julia DOROVSKIKH -// $Header$ // #ifndef _GHS3D_Algorithm_IDL_ #define _GHS3D_Algorithm_IDL_ @@ -72,6 +71,13 @@ module GHS3DPlugin */ void SetToMeshHoles(in boolean toMesh); boolean GetToMeshHoles(); + /*! + * To make groups of volumes of different domains when mesh is generated from skin. + * Default is to make groups. + * This option works only (1) for the mesh w/o shape and (2) if GetToMeshHoles() == true + */ + void SetToMakeGroupsOfDomains(in boolean toMakeGroups); + boolean GetToMakeGroupsOfDomains(); /*! * Maximal size of memory to be used by the algorithm (in Megabytes). * Negative value means not to use this option diff --git a/idl/Makefile.am b/idl/Makefile.am index 723911d..638da85 100644 --- a/idl/Makefile.am +++ b/idl/Makefile.am @@ -49,14 +49,12 @@ libSalomeIDLGHS3DPLUGIN_la_CPPFLAGS = \ $(CORBA_INCLUDES) \ $(KERNEL_CXXFLAGS) \ $(GEOM_CXXFLAGS) \ - $(MED_CXXFLAGS) \ $(SMESH_CXXFLAGS) libSalomeIDLGHS3DPLUGIN_la_LDFLAGS = -no-undefined -version-info=0:0:0 libSalomeIDLGHS3DPLUGIN_la_LIBADD = \ $(KERNEL_LDFLAGS) -lSalomeIDLKernel \ $(GEOM_LDFLAGS) -lSalomeIDLGEOM \ - $(MED_LDFLAGS) -lSalomeIDLMED \ $(SMESH_LDFLAGS) -lSalomeIDLSMESH \ @CORBA_LIBS@ @@ -68,7 +66,6 @@ OMNIORB_IDLPYFLAGS = \ -I$(top_builddir)/idl/salome \ -I$(KERNEL_ROOT_DIR)/idl/salome \ -I$(GEOM_ROOT_DIR)/idl/salome \ - -I$(MED_ROOT_DIR)/idl/salome \ -I$(SMESH_ROOT_DIR)/idl/salome IDLCXXFLAGS = \ @@ -77,13 +74,11 @@ IDLCXXFLAGS = \ -I$(top_builddir)/idl/salome \ -I$(KERNEL_ROOT_DIR)/idl/salome \ -I$(GEOM_ROOT_DIR)/idl/salome \ - -I$(MED_ROOT_DIR)/idl/salome \ -I$(SMESH_ROOT_DIR)/idl/salome IDLPYFLAGS = \ @IDLPYFLAGS@ \ -I$(KERNEL_ROOT_DIR)/idl/salome \ -I$(GEOM_ROOT_DIR)/idl/salome \ - -I$(MED_ROOT_DIR)/idl/salome \ -I$(SMESH_ROOT_DIR)/idl/salome # potential problem on parallel make on the following - multiple outputs @@ -121,7 +116,7 @@ mostlyclean-local: @for dep in $^ dummy; do \ if [ $$dep != "dummy" ]; then \ echo Building dependencies for $$dep; \ - $(CPP) $(C_DEPEND_FLAG) -x c -I$(srcdir) -I$(KERNEL_ROOT_DIR)/idl/salome -I$(GEOM_ROOT_DIR)/idl/salome -I$(MED_ROOT_DIR)/idl/salome -I$(SMESH_ROOT_DIR)/idl/salome $$dep 2>/dev/null | \ + $(CPP) $(C_DEPEND_FLAG) -x c -I$(srcdir) -I$(KERNEL_ROOT_DIR)/idl/salome -I$(GEOM_ROOT_DIR)/idl/salome -I$(SMESH_ROOT_DIR)/idl/salome $$dep 2>/dev/null | \ sed 's/\.o/\SK.cc/' >>$@; \ fi; \ done ; diff --git a/resources/GHS3DPlugin.xml b/resources/GHS3DPlugin.xml index 144cb6d..8d0ac36 100644 --- a/resources/GHS3DPlugin.xml +++ b/resources/GHS3DPlugin.xml @@ -27,6 +27,7 @@ diff --git a/src/GHS3DPlugin/GHS3DPluginBuilder.py b/src/GHS3DPlugin/GHS3DPluginBuilder.py index 4e07a2e..08dfb09 100644 --- a/src/GHS3DPlugin/GHS3DPluginBuilder.py +++ b/src/GHS3DPlugin/GHS3DPluginBuilder.py @@ -86,6 +86,14 @@ class GHS3D_Algorithm(Mesh_Algorithm): self.Parameters().SetToMeshHoles(toMesh) pass + ## To make groups of volumes of different domains when mesh is generated from skin. + # Default is to make groups. + # This option works only (1) for the mesh w/o shape and (2) if GetToMeshHoles() == true + # @param toMesh "mesh holes" flag value + def SetToMakeGroupsOfDomains(self, toMakeGroups): + self.Parameters().SetToMakeGroupsOfDomains(toMakeGroups) + pass + ## Set Optimization level: # @param level optimization level, one of the following values # - None_Optimization diff --git a/src/GHS3DPlugin/GHS3DPlugin_GHS3D.cxx b/src/GHS3DPlugin/GHS3DPlugin_GHS3D.cxx index 87588cb..0ff403a 100644 --- a/src/GHS3DPlugin/GHS3DPlugin_GHS3D.cxx +++ b/src/GHS3DPlugin/GHS3DPlugin_GHS3D.cxx @@ -29,23 +29,24 @@ #include -//#include "SMESH_Gen.hxx" +//#include #include -#include "SMESH_Mesh.hxx" -#include "SMESH_Comment.hxx" -#include "SMESH_MesherHelper.hxx" -#include "SMESH_MeshEditor.hxx" -#include "SMESH_OctreeNode.hxx" -#include "SMESH_Group.hxx" +#include +#include +#include +#include +#include +#include #include #include +#include -#include "SMDS_MeshElement.hxx" -#include "SMDS_MeshNode.hxx" -#include "SMDS_FaceOfNodes.hxx" -#include "SMDS_VolumeOfNodes.hxx" +#include +#include +#include +#include -#include "SMESHDS_Group.hxx" +#include #include #include @@ -76,7 +77,7 @@ #include #include -#include "utilities.h" +#include #ifdef WIN32 #include @@ -111,6 +112,8 @@ extern "C" typedef const list TTriaList; +static const char theDomainGroupNamePrefix[] = "Domain_"; + static void removeFile( const TCollection_AsciiString& fileName ) { try { @@ -131,7 +134,7 @@ GHS3DPlugin_GHS3D::GHS3DPlugin_GHS3D(int hypId, int studyId, SMESH_Gen* gen) : SMESH_3D_Algo(hypId, studyId, gen) { MESSAGE("GHS3DPlugin_GHS3D::GHS3DPlugin_GHS3D"); - _name = "GHS3D_3D"; + _name = Name(); _shapeType = (1 << TopAbs_SHELL) | (1 << TopAbs_SOLID);// 1 bit /shape type _onlyUnaryInput = false; // Compute() will be called on a compound of solids _iShape=0; @@ -151,9 +154,7 @@ GHS3DPlugin_GHS3D::GHS3DPlugin_GHS3D(int hypId, int studyId, SMESH_Gen* gen) if (myStudy) MESSAGE("myStudy->StudyId() = " << myStudy->StudyId()); -#ifdef WITH_SMESH_CANCEL_COMPUTE _compute_canceled = false; -#endif } //============================================================================= @@ -1054,15 +1055,94 @@ static void updateMeshGroups(SMESH_Mesh* theMesh, std::set groupsTo } } +//======================================================================= +//function : removeEmptyGroupsOfDomains +//purpose : remove empty groups named "Domain_nb" created due to +// "To make groups of domains" option. +//======================================================================= + +static void removeEmptyGroupsOfDomains(SMESH_Mesh* mesh, + bool notEmptyAsWell = false) +{ + const char* refName = theDomainGroupNamePrefix; + const size_t refLen = strlen( theDomainGroupNamePrefix ); + + std::list groupIDs = mesh->GetGroupIds(); + std::list::const_iterator id = groupIDs.begin(); + for ( ; id != groupIDs.end(); ++id ) + { + SMESH_Group* group = mesh->GetGroup( *id ); + if ( !group || ( !group->GetGroupDS()->IsEmpty() && !notEmptyAsWell )) + continue; + const char* name = group->GetName(); + char* end; + // check the name + if ( strncmp( name, refName, refLen ) == 0 && // starts from refName; + isdigit( *( name + refLen )) && // refName is followed by a digit; + strtol( name + refLen, &end, 10) >= 0 && // there are only digits ... + *end == '\0') // ... till a string end. + { + mesh->RemoveGroup( *id ); + } + } +} + +//================================================================================ +/*! + * \brief Create the groups corresponding to domains + */ +//================================================================================ + +static void makeDomainGroups( std::vector< std::vector< const SMDS_MeshElement* > >& elemsOfDomain, + SMESH_MesherHelper* theHelper) +{ + // int nbDomains = 0; + // for ( size_t i = 0; i < elemsOfDomain.size(); ++i ) + // nbDomains += ( elemsOfDomain[i].size() > 0 ); + + // if ( nbDomains > 1 ) + for ( size_t iDomain = 0; iDomain < elemsOfDomain.size(); ++iDomain ) + { + std::vector< const SMDS_MeshElement* > & elems = elemsOfDomain[ iDomain ]; + if ( elems.empty() ) continue; + + // find existing groups + std::vector< SMESH_Group* > groupOfType( SMDSAbs_NbElementTypes, (SMESH_Group*)NULL ); + const std::string domainName = ( SMESH_Comment( theDomainGroupNamePrefix ) << iDomain ); + SMESH_Mesh::GroupIteratorPtr groupIt = theHelper->GetMesh()->GetGroups(); + while ( groupIt->more() ) + { + SMESH_Group* group = groupIt->next(); + if ( domainName == group->GetName() && + dynamic_cast< SMESHDS_Group* >( group->GetGroupDS()) ) + groupOfType[ group->GetGroupDS()->GetType() ] = group; + } + // create and fill the groups + size_t iElem = 0; + int groupID; + do + { + SMESH_Group* group = groupOfType[ elems[ iElem ]->GetType() ]; + if ( !group ) + group = theHelper->GetMesh()->AddGroup( elems[ iElem ]->GetType(), + domainName.c_str(), groupID ); + SMDS_MeshGroup& groupDS = + static_cast< SMESHDS_Group* >( group->GetGroupDS() )->SMDSGroup(); + + while ( iElem < elems.size() && groupDS.Add( elems[iElem] )) + ++iElem; + + } while ( iElem < elems.size() ); + } +} + //======================================================================= //function : readGMFFile //purpose : read GMF file w/o geometry associated to mesh //======================================================================= static bool readGMFFile(const char* theFile, -#ifdef WITH_SMESH_CANCEL_COMPUTE GHS3DPlugin_GHS3D* theAlgo, -#endif SMESH_MesherHelper* theHelper, TopoDS_Shape theSolid, vector & theNodeByGhs3dId, @@ -1070,8 +1150,8 @@ static bool readGMFFile(const char* theFile, std::vector & aNodeGroupByGhs3dId, std::vector & anEdgeGroupByGhs3dId, std::vector & aFaceGroupByGhs3dId, - std::set & groupsToRemove - ) + std::set & groupsToRemove, + bool toMakeGroupsOfDomains=false) { std::string tmpStr; SMESHDS_Mesh* theMeshDS = theHelper->GetMeshDS(); @@ -1098,13 +1178,14 @@ static bool readGMFFile(const char* theFile, // --------------------------------- int nbElem = 0, nbRef = 0; - int aGMFNodeID = 0/*, shapeID*/; - //int *nodeAssigne; + int aGMFNodeID = 0; const SMDS_MeshNode** GMFNode; #ifdef _DEBUG_ std::map > subdomainId2tetraId; #endif std::map tabRef; + const bool force3d = true; // since there is no geometry + const int noID = 0; tabRef[GmfVertices] = 3; // for new nodes and enforced nodes tabRef[GmfCorners] = 1; @@ -1125,28 +1206,27 @@ static bool readGMFFile(const char* theFile, // Issue 0020682. Avoid creating nodes and tetras at place where // volumic elements already exist SMESH_ElementSearcher* elemSearcher = 0; - vector< const SMDS_MeshElement* > foundVolumes; + std::vector< const SMDS_MeshElement* > foundVolumes; if ( theHelper->GetMesh()->NbVolumes() > 0 ) - elemSearcher = SMESH_MeshEditor( theHelper->GetMesh() ).GetElementSearcher(); + elemSearcher = SMESH_MeshAlgos::GetElementSearcher( *theHelper->GetMeshDS() ); + + // IMP 0022172: [CEA 790] create the groups corresponding to domains + std::vector< std::vector< const SMDS_MeshElement* > > elemsOfDomain; int nbVertices = GmfStatKwd(InpMsh, GmfVertices) - nbInitialNodes; GMFNode = new const SMDS_MeshNode*[ nbVertices + 1 ]; - //nodeAssigne = new int[ nbVertices + 1 ]; std::map ::const_iterator it = tabRef.begin(); for ( ; it != tabRef.end() ; ++it) { -#ifdef WITH_SMESH_CANCEL_COMPUTE if(theAlgo->computeCanceled()) { GmfCloseMesh(InpMsh); delete [] GMFNode; - //delete [] nodeAssigne; return false; } -#endif int dummy; GmfKwdCod token = it->first; - nbRef = it->second; + nbRef = it->second; nbElem = GmfStatKwd(InpMsh, token); if (nbElem > 0) { @@ -1157,6 +1237,7 @@ static bool readGMFFile(const char* theFile, continue; std::vector id (nbElem*tabRef[token]); // node ids + std::vector domainID( nbElem ); // domain if (token == GmfVertices) { (nbElem <= 1) ? tmpStr = " vertex" : tmpStr = " vertices"; @@ -1181,16 +1262,12 @@ static bool readGMFFile(const char* theFile, double x, y, z; const SMDS_MeshNode * aGMFNode; - //shapeID = theMeshDS->ShapeToIndex( theSolid ); for ( int iElem = 0; iElem < nbElem; iElem++ ) { -#ifdef WITH_SMESH_CANCEL_COMPUTE if(theAlgo->computeCanceled()) { GmfCloseMesh(InpMsh); delete [] GMFNode; - //delete [] nodeAssigne; return false; } -#endif if (ver == GmfFloat) { GmfGetLin(InpMsh, token, &VerTab_f[0], &VerTab_f[1], &VerTab_f[2], &dummy); x = VerTab_f[0]; @@ -1209,7 +1286,6 @@ static bool readGMFFile(const char* theFile, aGMFID = iElem -nbInitialNodes +1; GMFNode[ aGMFID ] = aGMFNode; - //nodeAssigne[ aGMFID ] = 0; if (aGMFID-1 < aNodeGroupByGhs3dId.size() && !aNodeGroupByGhs3dId.at(aGMFID-1).empty()) addElemInMeshGroup(theHelper->GetMesh(), aGMFNode, aNodeGroupByGhs3dId.at(aGMFID-1), groupsToRemove); } @@ -1228,22 +1304,22 @@ static bool readGMFFile(const char* theFile, else if (token == GmfEdges && nbElem > 0) { (nbElem <= 1) ? tmpStr = " edge" : tmpStr = " edges"; for ( int iElem = 0; iElem < nbElem; iElem++ ) - GmfGetLin(InpMsh, token, &id[iElem*tabRef[token]], &id[iElem*tabRef[token]+1], &dummy); + GmfGetLin(InpMsh, token, &id[iElem*tabRef[token]], &id[iElem*tabRef[token]+1], &domainID[iElem]); } else if (token == GmfTriangles && nbElem > 0) { (nbElem <= 1) ? tmpStr = " triangle" : tmpStr = " triangles"; for ( int iElem = 0; iElem < nbElem; iElem++ ) - GmfGetLin(InpMsh, token, &id[iElem*tabRef[token]], &id[iElem*tabRef[token]+1], &id[iElem*tabRef[token]+2], &dummy); + GmfGetLin(InpMsh, token, &id[iElem*tabRef[token]], &id[iElem*tabRef[token]+1], &id[iElem*tabRef[token]+2], &domainID[iElem]); } else if (token == GmfQuadrilaterals && nbElem > 0) { (nbElem <= 1) ? tmpStr = " Quadrilateral" : tmpStr = " Quadrilaterals"; for ( int iElem = 0; iElem < nbElem; iElem++ ) - GmfGetLin(InpMsh, token, &id[iElem*tabRef[token]], &id[iElem*tabRef[token]+1], &id[iElem*tabRef[token]+2], &id[iElem*tabRef[token]+3], &dummy); + GmfGetLin(InpMsh, token, &id[iElem*tabRef[token]], &id[iElem*tabRef[token]+1], &id[iElem*tabRef[token]+2], &id[iElem*tabRef[token]+3], &domainID[iElem]); } else if (token == GmfTetrahedra && nbElem > 0) { (nbElem <= 1) ? tmpStr = " Tetrahedron" : tmpStr = " Tetrahedra"; for ( int iElem = 0; iElem < nbElem; iElem++ ) { - GmfGetLin(InpMsh, token, &id[iElem*tabRef[token]], &id[iElem*tabRef[token]+1], &id[iElem*tabRef[token]+2], &id[iElem*tabRef[token]+3], &dummy); + GmfGetLin(InpMsh, token, &id[iElem*tabRef[token]], &id[iElem*tabRef[token]+1], &id[iElem*tabRef[token]+2], &id[iElem*tabRef[token]+3], &domainID[iElem]); #ifdef _DEBUG_ subdomainId2tetraId[dummy].insert(iElem+1); // MESSAGE("subdomainId2tetraId["<computeCanceled()) { GmfCloseMesh(InpMsh); delete [] GMFNode; - //delete [] nodeAssigne; return false; } -#endif // Check if elem is already in input mesh. If yes => skip bool fullyCreatedElement = false; // if at least one of the nodes was created for ( int iRef = 0; iRef < nbRef; iRef++ ) @@ -1301,30 +1374,26 @@ static bool readGMFFile(const char* theFile, node [ iRef ] = GMFNode[ aGMFNodeID ]; } } - + aCreatedElem = 0; switch (token) { case GmfEdges: if (fullyCreatedElement) { - aCreatedElem = theHelper->AddEdge( node[0], node[1], /*id =*/0, /*force3d =*/false ); + aCreatedElem = theHelper->AddEdge( node[0], node[1], noID, force3d ); if (anEdgeGroupByGhs3dId.size() && !anEdgeGroupByGhs3dId[iElem].empty()) addElemInMeshGroup(theHelper->GetMesh(), aCreatedElem, anEdgeGroupByGhs3dId[iElem], groupsToRemove); } break; case GmfTriangles: if (fullyCreatedElement) { - aCreatedElem = theHelper->AddFace( node[0], node[1], node[2], /*id =*/0, /*force3d =*/false ); - // for ( int iRef = 0; iRef < nbRef; iRef++ ) - // nodeAssigne[ nodeID[ iRef ]] = 1; + aCreatedElem = theHelper->AddFace( node[0], node[1], node[2], noID, force3d ); if (aFaceGroupByGhs3dId.size() && !aFaceGroupByGhs3dId[iElem].empty()) addElemInMeshGroup(theHelper->GetMesh(), aCreatedElem, aFaceGroupByGhs3dId[iElem], groupsToRemove); } break; case GmfQuadrilaterals: if (fullyCreatedElement) { - theHelper->AddFace( node[0], node[1], node[2], node[3], /*id =*/0, /*force3d =*/false ); - // for ( int iRef = 0; iRef < nbRef; iRef++ ) - // nodeAssigne[ nodeID[ iRef ]] = 1; + aCreatedElem = theHelper->AddFace( node[0], node[1], node[2], node[3], noID, force3d ); } break; case GmfTetrahedra: @@ -1340,8 +1409,7 @@ static bool readGMFFile(const char* theFile, SMDSAbs_Volume, foundVolumes )) break; } - theHelper->AddVolume( node[1], node[0], node[2], node[3], /*id =*/0, /*force3d =*/false ); -// theMeshDS->SetMeshElementOnShape( aTet, shapeID ); + aCreatedElem = theHelper->AddVolume( node[1], node[0], node[2], node[3], noID, force3d ); break; case GmfHexahedra: if ( elemSearcher ) { @@ -1360,27 +1428,31 @@ static bool readGMFFile(const char* theFile, SMDSAbs_Volume, foundVolumes )) break; } - theHelper->AddVolume( node[0], node[3], node[2], node[1], - node[4], node[7], node[6], node[5], /*id =*/0, /*force3d =*/false ); -// theMeshDS->SetMeshElementOnShape( aTet, shapeID ); + aCreatedElem = theHelper->AddVolume( node[0], node[3], node[2], node[1], + node[4], node[7], node[6], node[5], noID, force3d ); break; default: continue; } - } + if ( aCreatedElem && toMakeGroupsOfDomains ) + { + if ( domainID[iElem] >= (int) elemsOfDomain.size() ) + elemsOfDomain.resize( domainID[iElem] + 1 ); + elemsOfDomain[ domainID[iElem] ].push_back( aCreatedElem ); + } + } // loop on elements of one type break; - } - } - } - - // for ( int i = 0; i < nbVertices; ++i ) { - // if ( !nodeAssigne[ i+1 ]) - // theMeshDS->SetNodeInVolume( GMFNode[ i+1 ], shapeID ); - // } + } // case ... + } // switch (token) + } // loop on tabRef GmfCloseMesh(InpMsh); delete [] GMFNode; - //delete [] nodeAssigne; -#ifdef _DEBUG_ + + // 0022172: [CEA 790] create the groups corresponding to domains + if ( toMakeGroupsOfDomains ) + makeDomainGroups( elemsOfDomain, theHelper ); + +#ifdef _DEBUG_ MESSAGE("Nb subdomains " << subdomainId2tetraId.size()); std::map >::const_iterator subdomainIt = subdomainId2tetraId.begin(); TCollection_AsciiString aSubdomainFileName = theFile; @@ -1444,7 +1516,8 @@ static bool writeGMFFile(const char* theMesh GHS3DPlugin_Hypothesis::TIDSortedElemGroupMap::iterator elemIt; TIDSortedElemSet::iterator elemSetIt; bool isOK; - auto_ptr< SMESH_ElementSearcher > pntCls ( SMESH_MeshEditor( theMesh ).GetElementSearcher()); + auto_ptr< SMESH_ElementSearcher > pntCls + ( SMESH_MeshAlgos::GetElementSearcher(*theMesh->GetMeshDS())); int nbEnforcedVertices = theEnforcedVertices.size(); @@ -2811,9 +2884,7 @@ static bool readResultFile(const int fileOpen, #ifdef WNT const char* fileName, #endif -#ifdef WITH_SMESH_CANCEL_COMPUTE GHS3DPlugin_GHS3D* theAlgo, -#endif SMESH_MesherHelper& theHelper, TopoDS_Shape tabShape[], double** tabBox, @@ -2824,7 +2895,8 @@ static bool readResultFile(const int fileOpen, int nbEnforcedVertices, int nbEnforcedNodes, GHS3DPlugin_Hypothesis::TIDSortedElemGroupMap & theEnforcedEdges, - GHS3DPlugin_Hypothesis::TIDSortedElemGroupMap & theEnforcedTriangles) + GHS3DPlugin_Hypothesis::TIDSortedElemGroupMap & theEnforcedTriangles, + bool toMakeGroupsOfDomains) { MESSAGE("GHS3DPlugin_GHS3D::readResultFile()"); Kernel_Utils::Localizer loc; @@ -2900,10 +2972,8 @@ static bool readResultFile(const int fileOpen, MESSAGE("nbEnforcedNodes: "<computeCanceled()) return false; -#endif for (int iCoor=0; iCoor < 3; iCoor++) coord[ iCoor ] = strtod(ptr, &ptr); nodeAssigne[ iNode ] = 1; @@ -2923,10 +2993,8 @@ static bool readResultFile(const int fileOpen, tabID = new int[nbTriangle]; for (int i=0; i < nbTriangle; i++) { -#ifdef WITH_SMESH_CANCEL_COMPUTE if(theAlgo->computeCanceled()) return false; -#endif tabID[i] = 0; // find the solid corresponding to GHS3D sub-domain following // the technique proposed in GHS3D manual in chapter @@ -2980,13 +3048,14 @@ static bool readResultFile(const int fileOpen, if ( nbTriangle <= nbShape ) // no holes toMeshHoles = true; // not avoid creating tetras in holes + // IMP 0022172: [CEA 790] create the groups corresponding to domains + std::vector< std::vector< const SMDS_MeshElement* > > elemsOfDomain( Max( nbTriangle, nbShape )); + // Associating the tetrahedrons to the shapes shapeID = compoundID; for (int iElem = 0; iElem < nbElems; iElem++) { -#ifdef WITH_SMESH_CANCEL_COMPUTE if(theAlgo->computeCanceled()) return false; -#endif for (int iNode = 0; iNode < 4; iNode++) { ID = strtol(tetraPtr, &tetraPtr, 10); itOnNode = theGhs3dIdToNodeMap.find(ID); @@ -2997,6 +3066,7 @@ static bool readResultFile(const int fileOpen, // tetras within holes depending on hypo option, // so we first check if aTet is inside a hole and then create it //aTet = theMeshDS->AddVolume( node[1], node[0], node[2], node[3] ); + ghs3dShapeID = 0; // domain ID if ( nbTriangle > 1 ) { shapeID = HOLE_ID; // negative shapeID means not to create tetras if !toMeshHoles ghs3dShapeID = strtol(shapePtr, &shapePtr, 10) - IdShapeRef; @@ -3041,11 +3111,19 @@ static bool readResultFile(const int fileOpen, aTet = theHelper.AddVolume( node[1], node[0], node[2], node[3], /*id=*/0, /*force3d=*/false); theMeshDS->SetMeshElementOnShape( aTet, shapeID ); + if ( toMakeGroupsOfDomains ) + { + if ( int( elemsOfDomain.size() ) < ghs3dShapeID+1 ) + elemsOfDomain.resize( ghs3dShapeID+1 ); + elemsOfDomain[ ghs3dShapeID ].push_back( aTet ); + } } #ifdef _DEBUG_ shapeIDs.insert( shapeID ); #endif } + if ( toMakeGroupsOfDomains ) + makeDomainGroups( elemsOfDomain, &theHelper ); // Add enforced elements GHS3DPlugin_Hypothesis::TIDSortedElemGroupMap::const_iterator elemIt; @@ -3209,8 +3287,8 @@ bool GHS3DPlugin_GHS3D::Compute(SMESH_Mesh& theMesh, // a unique working file name // to avoid access to the same files by eg different users - TCollection_AsciiString aGenericName - = (char*) GHS3DPlugin_Hypothesis::GetFileName(_hyp).c_str(); + _genericName = GHS3DPlugin_Hypothesis::GetFileName(_hyp); + TCollection_AsciiString aGenericName((char*) _genericName.c_str() ); TCollection_AsciiString aResultFileName; TCollection_AsciiString aLogFileName = aGenericName + ".log"; // log @@ -3354,7 +3432,7 @@ bool GHS3DPlugin_GHS3D::Compute(SMESH_Mesh& theMesh, // run ghs3d mesher // ----------------- - TCollection_AsciiString cmd = TCollection_AsciiString((char*)GHS3DPlugin_Hypothesis::CommandToRun( _hyp ).c_str() ); + TCollection_AsciiString cmd( (char*)GHS3DPlugin_Hypothesis::CommandToRun( _hyp ).c_str() ); cmd += TCollection_AsciiString(" -f ") + aGenericName; // file to read cmd += TCollection_AsciiString(" 1>" ) + aLogFileName; // dump into file // The output .mesh file does not contain yet the subdomain-info (Ghs3D 4.2) @@ -3367,9 +3445,7 @@ bool GHS3DPlugin_GHS3D::Compute(SMESH_Mesh& theMesh, std::cout << "Ghs3d execution..." << std::endl; std::cout << cmd << std::endl; -#ifdef WITH_SMESH_CANCEL_COMPUTE _compute_canceled = false; -#endif system( cmd.ToCString() ); // run @@ -3393,6 +3469,7 @@ bool GHS3DPlugin_GHS3D::Compute(SMESH_Mesh& theMesh, else { bool toMeshHoles = _hyp ? _hyp->GetToMeshHoles(true) : GHS3DPlugin_Hypothesis::DefaultMeshHoles(); + const bool toMakeGroupsOfDomains = GHS3DPlugin_Hypothesis::GetToMakeGroupsOfDomains( _hyp ); helper.IsQuadraticSubMesh( theShape ); helper.SetElementsOnShape( false ); @@ -3401,14 +3478,13 @@ bool GHS3DPlugin_GHS3D::Compute(SMESH_Mesh& theMesh, #ifdef WNT aResultFileName.ToCString(), #endif -#ifdef WITH_SMESH_CANCEL_COMPUTE this, -#endif /*theMesh, */helper, tabShape, tabBox, _nbShape, aGhs3dIdToNodeMap, aNodeId2NodeIndexMap, toMeshHoles, nbEnforcedVertices, nbEnforcedNodes, - enforcedEdges, enforcedTriangles ); + enforcedEdges, enforcedTriangles, + toMakeGroupsOfDomains ); // Ok = readGMFFile( // #ifndef GMF_HAS_SUBDOMAIN_INFO @@ -3418,6 +3494,8 @@ bool GHS3DPlugin_GHS3D::Compute(SMESH_Mesh& theMesh, // _nbShape, tabShape, tabBox, // aGhs3dIdToNodeMap, toMeshHoles, // nbEnforcedVertices, nbEnforcedNodes); + + removeEmptyGroupsOfDomains( helper.GetMesh(), /*notEmptyAsWell =*/ !toMakeGroupsOfDomains ); } @@ -3431,6 +3509,9 @@ bool GHS3DPlugin_GHS3D::Compute(SMESH_Mesh& theMesh, { if ( !_keepFiles ) removeFile( aLogFileName ); + + // if ( _hyp && _hyp->GetToMakeGroupsOfDomains() ) + // error( COMPERR_WARNING, "'toMakeGroupsOfDomains' is ignored since the mesh is on shape" ); } else if ( OSD_File( aLogFileName ).Size() > 0 ) { @@ -3447,11 +3528,9 @@ bool GHS3DPlugin_GHS3D::Compute(SMESH_Mesh& theMesh, } if ( !_keepFiles ) { -#ifdef WITH_SMESH_CANCEL_COMPUTE if (! Ok) if(_compute_canceled) removeFile( aLogFileName ); -#endif removeFile( aFacesFileName ); removeFile( aPointsFileName ); removeFile( aResultFileName ); @@ -3487,8 +3566,8 @@ bool GHS3DPlugin_GHS3D::Compute(SMESH_Mesh& theMesh, // a unique working file name // to avoid access to the same files by eg different users - TCollection_AsciiString aGenericName - = (char*) GHS3DPlugin_Hypothesis::GetFileName(_hyp).c_str(); + _genericName = GHS3DPlugin_Hypothesis::GetFileName(_hyp); + TCollection_AsciiString aGenericName((char*) _genericName.c_str() ); TCollection_AsciiString aGenericNameRequired = aGenericName + "_required"; TCollection_AsciiString aLogFileName = aGenericName + ".log"; // log @@ -3633,9 +3712,7 @@ bool GHS3DPlugin_GHS3D::Compute(SMESH_Mesh& theMesh, std::cout << "Ghs3d execution..." << std::endl; std::cout << cmd << std::endl; -#ifdef WITH_SMESH_CANCEL_COMPUTE _compute_canceled = false; -#endif system( cmd.ToCString() ); // run @@ -3646,16 +3723,16 @@ bool GHS3DPlugin_GHS3D::Compute(SMESH_Mesh& theMesh, // read a result // -------------- GHS3DPlugin_Hypothesis::TSetStrings groupsToRemove = GHS3DPlugin_Hypothesis::GetGroupsToRemove(_hyp); + const bool toMakeGroupsOfDomains = GHS3DPlugin_Hypothesis::GetToMakeGroupsOfDomains( _hyp ); Ok = readGMFFile(aResultFileName.ToCString(), -#ifdef WITH_SMESH_CANCEL_COMPUTE this, -#endif theHelper, theShape, aNodeByGhs3dId, aNodeToGhs3dIdMap, aNodeGroupByGhs3dId, anEdgeGroupByGhs3dId, aFaceGroupByGhs3dId, - groupsToRemove); + groupsToRemove, toMakeGroupsOfDomains); updateMeshGroups(theHelper->GetMesh(), groupsToRemove); + removeEmptyGroupsOfDomains( theHelper->GetMesh(), /*notEmptyAsWell =*/ !toMakeGroupsOfDomains ); if ( Ok ) { GHS3DPlugin_Hypothesis* that = (GHS3DPlugin_Hypothesis*)this->_hyp; @@ -3670,6 +3747,9 @@ bool GHS3DPlugin_GHS3D::Compute(SMESH_Mesh& theMesh, { if ( !_keepFiles ) removeFile( aLogFileName ); + + //if ( !toMakeGroupsOfDomains && _hyp && _hyp->GetToMakeGroupsOfDomains() ) + //error( COMPERR_WARNING, "'toMakeGroupsOfDomains' is ignored since 'toMeshHoles' is OFF." ); } else if ( OSD_File( aLogFileName ).Size() > 0 ) { @@ -3686,11 +3766,9 @@ bool GHS3DPlugin_GHS3D::Compute(SMESH_Mesh& theMesh, if ( !_keepFiles ) { -#ifdef WITH_SMESH_CANCEL_COMPUTE if (! Ok) if(_compute_canceled) removeFile( aLogFileName ); -#endif removeFile( aGMFFileName ); removeFile( aResultFileName ); removeFile( aRequiredVerticesFileName ); @@ -3699,21 +3777,17 @@ bool GHS3DPlugin_GHS3D::Compute(SMESH_Mesh& theMesh, return Ok; } -#ifdef WITH_SMESH_CANCEL_COMPUTE void GHS3DPlugin_GHS3D::CancelCompute() { _compute_canceled = true; #ifdef WNT #else - TCollection_AsciiString aGenericName - = (char*) GHS3DPlugin_Hypothesis::GetFileName(_hyp).c_str(); - TCollection_AsciiString cmd = - TCollection_AsciiString("ps ux | grep ") + aGenericName; - cmd += TCollection_AsciiString(" | grep -v grep | awk '{print $2}' | xargs kill -9 > /dev/null 2>&1"); - system( cmd.ToCString() ); + std::string cmd = "ps xo pid,args | grep " + _genericName; + //cmd += " | grep -e \"^ *[0-9]\\+ \\+" + GHS3DPlugin_Hypothesis::GetExeName() + "\""; + cmd += " | awk '{print $1}' | xargs kill -9 > /dev/null 2>&1"; + system( cmd.c_str() ); #endif } -#endif //================================================================================ /*! @@ -3900,10 +3974,8 @@ static char* getIds( char* ptr, int nbIds, vector& ids ) bool GHS3DPlugin_GHS3D::storeErrorDescription(const TCollection_AsciiString& logFile, const _Ghs2smdsConvertor & toSmdsConvertor ) { -#ifdef WITH_SMESH_CANCEL_COMPUTE if(_compute_canceled) return error(SMESH_Comment("interruption initiated by user")); -#endif // open file #ifdef WNT int file = ::_open (logFile.ToCString(), _O_RDONLY|_O_BINARY); @@ -4308,9 +4380,7 @@ bool GHS3DPlugin_GHS3D::importGMFMesh(const char* theGMFFileName, SMESH_Mesh& th std::set dummyGroupsToRemove; bool ok = readGMFFile(theGMFFileName, -#ifdef WITH_SMESH_CANCEL_COMPUTE this, -#endif helper, theMesh.GetShapeToMesh(), dummyNodeVector, dummyNodeMap, dummyElemGroup, dummyElemGroup, dummyElemGroup, dummyGroupsToRemove); theMesh.GetMeshDS()->Modified(); return ok; @@ -4368,6 +4438,33 @@ namespace /*visitAncestors=*/true); } }; + + //================================================================================ + /*! + * \brief Sub-mesh event listener removing empty groups created due to "To make + * groups of domains". + */ + struct _GroupsOfDomainsRemover : public SMESH_subMeshEventListener + { + _GroupsOfDomainsRemover(): + SMESH_subMeshEventListener( /*isDeletable = */true, + "GHS3DPlugin_GHS3D::_GroupsOfDomainsRemover" ) {} + /*! + * \brief Treat events of the subMesh + */ + void ProcessEvent(const int event, + const int eventType, + SMESH_subMesh* subMesh, + SMESH_subMeshEventListenerData* data, + const SMESH_Hypothesis* hyp) + { + if (SMESH_subMesh::ALGO_EVENT == eventType && + !subMesh->GetAlgo() ) + { + removeEmptyGroupsOfDomains( subMesh->GetFather(), /*notEmptyAsWell=*/true ); + } + } + }; } //================================================================================ @@ -4396,3 +4493,19 @@ void GHS3DPlugin_GHS3D::SubmeshRestored(SMESH_subMesh* subMesh) } } } + +//================================================================================ +/*! + * \brief Sets an event listener removing empty groups created due to "To make + * groups of domains". + * \param subMesh - submesh where algo is set + * + * This method is called when a submesh gets HYP_OK algo_state. + * After being set, event listener is notified on each event of a submesh. + */ +//================================================================================ + +void GHS3DPlugin_GHS3D::SetEventListener(SMESH_subMesh* subMesh) +{ + subMesh->SetEventListener( new _GroupsOfDomainsRemover(), 0, subMesh ); +} diff --git a/src/GHS3DPlugin/GHS3DPlugin_GHS3D.hxx b/src/GHS3DPlugin/GHS3DPlugin_GHS3D.hxx index 285acd8..232c16e 100644 --- a/src/GHS3DPlugin/GHS3DPlugin_GHS3D.hxx +++ b/src/GHS3DPlugin/GHS3DPlugin_GHS3D.hxx @@ -64,10 +64,8 @@ public: virtual bool Compute(SMESH_Mesh& aMesh, const TopoDS_Shape& aShape); -#ifdef WITH_SMESH_CANCEL_COMPUTE - virtual void CancelCompute(); - bool computeCanceled() { return _compute_canceled;}; -#endif + virtual void CancelCompute(); + bool computeCanceled() { return _compute_canceled;}; virtual bool Evaluate(SMESH_Mesh& aMesh, const TopoDS_Shape& aShape, MapShapeNbElems& aResMap); @@ -77,26 +75,30 @@ public: virtual void SubmeshRestored(SMESH_subMesh* subMesh); - bool importGMFMesh(const char* aGMFFileName, SMESH_Mesh& aMesh); + virtual void SetEventListener(SMESH_subMesh* subMesh); + + bool importGMFMesh(const char* aGMFFileName, SMESH_Mesh& aMesh); + static const char* Name() { return "GHS3D_3D"; } + +protected: + const GHS3DPlugin_Hypothesis* _hyp; + const StdMeshers_ViscousLayers* _viscousLayersHyp; + std::string _genericName; + private: - bool storeErrorDescription(const TCollection_AsciiString& logFile, - const _Ghs2smdsConvertor & toSmdsConvertor ); + bool storeErrorDescription(const TCollection_AsciiString& logFile, + const _Ghs2smdsConvertor & toSmdsConvertor ); TopoDS_Shape entryToShape(std::string entry); int _iShape; int _nbShape; bool _keepFiles; - const GHS3DPlugin_Hypothesis* _hyp; - const StdMeshers_ViscousLayers* _viscousLayersHyp; SALOMEDS::Study_var myStudy; SMESH_Gen_i* smeshGen_i; -#ifdef WITH_SMESH_CANCEL_COMPUTE volatile bool _compute_canceled; -#endif - }; /*! diff --git a/src/GHS3DPlugin/GHS3DPlugin_Hypothesis.cxx b/src/GHS3DPlugin/GHS3DPlugin_Hypothesis.cxx index a5001ae..3ec070f 100644 --- a/src/GHS3DPlugin/GHS3DPlugin_Hypothesis.cxx +++ b/src/GHS3DPlugin/GHS3DPlugin_Hypothesis.cxx @@ -42,6 +42,7 @@ GHS3DPlugin_Hypothesis::GHS3DPlugin_Hypothesis(int hypId, int studyId, SMESH_Gen * gen) : SMESH_Hypothesis(hypId, studyId, gen), myToMeshHoles(DefaultMeshHoles()), + myToMakeGroupsOfDomains(DefaultToMakeGroupsOfDomains()), myMaximumMemory(-1), myInitialMemory(-1), myOptimizationLevel(DefaultOptimizationLevel()), @@ -97,6 +98,39 @@ bool GHS3DPlugin_Hypothesis::GetToMeshHoles(bool checkFreeOption) const return myToMeshHoles; } +//======================================================================= +//function : SetToMakeGroupsOfDomains +//======================================================================= + +void GHS3DPlugin_Hypothesis::SetToMakeGroupsOfDomains(bool toMakeGroups) +{ + if ( myToMakeGroupsOfDomains != toMakeGroups ) { + myToMakeGroupsOfDomains = toMakeGroups; + NotifySubMeshesHypothesisModification(); + } +} + +//======================================================================= +//function : GetToMakeGroupsOfDomains +//======================================================================= + +bool GHS3DPlugin_Hypothesis::GetToMakeGroupsOfDomains() const +{ + return myToMakeGroupsOfDomains; +} + +//======================================================================= +//function : GetToMakeGroupsOfDomains +//======================================================================= + +bool GHS3DPlugin_Hypothesis::GetToMakeGroupsOfDomains(const GHS3DPlugin_Hypothesis* hyp) +{ + bool res; + if ( hyp ) res = /*hyp->GetToMeshHoles(true) &&*/ hyp->GetToMakeGroupsOfDomains(); + else res = /*DefaultMeshHoles() &&*/ DefaultToMakeGroupsOfDomains(); + return res; +} + //======================================================================= //function : SetMaximumMemory //======================================================================= @@ -756,6 +790,15 @@ bool GHS3DPlugin_Hypothesis::DefaultMeshHoles() return false; // PAL19680 } +//======================================================================= +//function : DefaultToMakeGroupsOfDomains +//======================================================================= + +bool GHS3DPlugin_Hypothesis::DefaultToMakeGroupsOfDomains() +{ + return true; // issue 0022172 +} + //======================================================================= //function : DefaultMaximumMemory //======================================================================= @@ -922,6 +965,7 @@ std::ostream & GHS3DPlugin_Hypothesis::SaveTo(std::ostream & save) save << (int)myToUseFemCorrection << " "; save << (int)myToRemoveCentralPoint << " "; save << myGradation << " "; + save << myToMakeGroupsOfDomains << " "; if (!myTextOption.empty()) { save << "__OPTIONS_BEGIN__ "; save << myTextOption << " "; @@ -1097,6 +1141,12 @@ std::istream & GHS3DPlugin_Hypothesis::LoadFrom(std::istream & load) bool hasEnforcedMeshes = false; isOK = (load >> separator); + if ( isOK && ( separator == "0" || separator == "1" )) + { + myToMakeGroupsOfDomains = ( separator == "1" ); + isOK = (load >> separator); + } + if (isOK) { if (separator == "__OPTIONS_BEGIN__") hasOptions = true; @@ -1326,14 +1376,15 @@ bool GHS3DPlugin_Hypothesis::SetParametersByMesh(const SMESH_Mesh* ,const TopoDS //================================================================================ /*! - * \brief Return false + * \brief Sets myToMakeGroupsOfDomains depending on whether theMesh is on shape or not */ //================================================================================ -bool GHS3DPlugin_Hypothesis::SetParametersByDefaults(const TDefaults& /*dflts*/, +bool GHS3DPlugin_Hypothesis::SetParametersByDefaults(const TDefaults& dflts, const SMESH_Mesh* /*theMesh*/) { - return false; + myToMakeGroupsOfDomains = ( !dflts._shape || dflts._shape->IsNull() ); + return true; } //================================================================================ @@ -1345,8 +1396,7 @@ bool GHS3DPlugin_Hypothesis::SetParametersByDefaults(const TDefaults& /*dflts*/ std::string GHS3DPlugin_Hypothesis::CommandToRun(const GHS3DPlugin_Hypothesis* hyp, const bool hasShapeToMesh) { - TCollection_AsciiString cmd; - cmd = "mg-tetra.exe"; + TCollection_AsciiString cmd = GetExeName().c_str(); // check if any option is overridden by hyp->myTextOption bool m = hyp ? ( hyp->myTextOption.find("-m") == std::string::npos ) : true; bool M = hyp ? ( hyp->myTextOption.find("-M") == std::string::npos ) : true; @@ -1478,6 +1528,16 @@ std::string GHS3DPlugin_Hypothesis::GetFileName(const GHS3DPlugin_Hypothesis* hy return aGenericName.ToCString(); } +//================================================================================ +/* + * Return the name of executable + */ +//================================================================================ + +std::string GHS3DPlugin_Hypothesis::GetExeName() +{ + return "mg-tetra.exe"; +} //================================================================================ /*! diff --git a/src/GHS3DPlugin/GHS3DPlugin_Hypothesis.hxx b/src/GHS3DPlugin/GHS3DPlugin_Hypothesis.hxx index 348b149..15ccbc2 100644 --- a/src/GHS3DPlugin/GHS3DPlugin_Hypothesis.hxx +++ b/src/GHS3DPlugin/GHS3DPlugin_Hypothesis.hxx @@ -124,6 +124,13 @@ public: */ void SetToMeshHoles(bool toMesh); bool GetToMeshHoles(bool checkFreeOption = false) const; + /*! + * To make groups of volumes of different domains when mesh is generated from skin. + * Default is to make groups. + * This option works only (1) for the mesh w/o shape and (2) if GetToMeshHoles() == true + */ + void SetToMakeGroupsOfDomains(bool toMakeGroups); + bool GetToMakeGroupsOfDomains() const; /*! * Maximal size of memory to be used by the algorithm (in Megabytes) */ @@ -216,6 +223,10 @@ public: * \brief Return a unique file name */ static std::string GetFileName(const GHS3DPlugin_Hypothesis* hyp); + /*! + * \brief Return the name of executable + */ + static std::string GetExeName(); /*! * To set an enforced vertex @@ -263,9 +274,11 @@ public: static TIDSortedElemGroupMap GetEnforcedTriangles(const GHS3DPlugin_Hypothesis* hyp); static TID2SizeMap GetNodeIDToSizeMap(const GHS3DPlugin_Hypothesis* hyp); static TSetStrings GetGroupsToRemove(const GHS3DPlugin_Hypothesis* hyp); + static bool GetToMakeGroupsOfDomains(const GHS3DPlugin_Hypothesis* hyp); void ClearGroupsToRemove(); static bool DefaultMeshHoles(); + static bool DefaultToMakeGroupsOfDomains(); static int DefaultMaximumMemory(); static int DefaultInitialMemory(); static short DefaultOptimizationLevel(); @@ -306,13 +319,14 @@ public: virtual bool SetParametersByMesh(const SMESH_Mesh* theMesh, const TopoDS_Shape& theShape); /*! - * \brief Does nothing + * \brief Sets myToMakeGroupsOfDomains depending on whether theMesh is on shape or not */ virtual bool SetParametersByDefaults(const TDefaults& dflts, const SMESH_Mesh* theMesh=0); private: bool myToMeshHoles; + bool myToMakeGroupsOfDomains; int myMaximumMemory; int myInitialMemory; short myOptimizationLevel; diff --git a/src/GHS3DPlugin/GHS3DPlugin_Hypothesis_i.cxx b/src/GHS3DPlugin/GHS3DPlugin_Hypothesis_i.cxx index 7915661..eb3eeb3 100644 --- a/src/GHS3DPlugin/GHS3DPlugin_Hypothesis_i.cxx +++ b/src/GHS3DPlugin/GHS3DPlugin_Hypothesis_i.cxx @@ -90,6 +90,27 @@ CORBA::Boolean GHS3DPlugin_Hypothesis_i::GetToMeshHoles() return this->GetImpl()->GetToMeshHoles(); } +//======================================================================= +//function : SetToMakeGroupsOfDomains +//======================================================================= + +void GHS3DPlugin_Hypothesis_i::SetToMakeGroupsOfDomains(CORBA::Boolean toMakeGroups) +{ + ASSERT(myBaseImpl); + this->GetImpl()->SetToMakeGroupsOfDomains(toMakeGroups); + SMESH::TPythonDump() << _this() << ".SetToMakeGroupsOfDomains( " << toMakeGroups << " )"; +} + +//======================================================================= +//function : GetToMakeGroupsOfDomains +//======================================================================= + +CORBA::Boolean GHS3DPlugin_Hypothesis_i::GetToMakeGroupsOfDomains() +{ + ASSERT(myBaseImpl); + return this->GetImpl()->GetToMakeGroupsOfDomains(); +} + //======================================================================= //function : SetMaximumMemory //======================================================================= @@ -930,8 +951,8 @@ bool GHS3DPlugin_Hypothesis_i::p_SetEnforcedMesh(SMESH::SMESH_IDSource_ptr theSo MESSAGE("Required type is FACE"); break; default: - MESSAGE("Incompatible required type: " << theType); - return false; + MESSAGE("Incompatible required type: " << theType); + return false; } // MESSAGE("Required type is "<GetTypes(); @@ -959,20 +980,20 @@ bool GHS3DPlugin_Hypothesis_i::p_SetEnforcedMesh(SMESH::SMESH_IDSource_ptr theSo string enfMeshName = theName; if (enfMeshName.empty()) - enfMeshName = SObj->GetName(); + enfMeshName = SObj->GetName(); if (theMesh_i) { try { - bool res = this->GetImpl()->SetEnforcedMesh(theMesh_i->GetImpl(), theType, enfMeshName , SObj->GetID(), theGroupName); - if (theGroupName != "") { - SMESH::TPythonDump () << "isDone = " << _this() << ".SetEnforcedMeshWithGroup( " - << theSource << ".GetMesh(), " << theType << ", \"" << theGroupName << "\" )"; - } - else { - SMESH::TPythonDump () << "isDone = " << _this() << ".SetEnforcedMesh( " - << theSource << ".GetMesh(), " << theType << " )"; - } + bool res = this->GetImpl()->SetEnforcedMesh(theMesh_i->GetImpl(), theType, enfMeshName , SObj->GetID(), theGroupName); + if (theGroupName != "") { + SMESH::TPythonDump () << "isDone = " << _this() << ".SetEnforcedMeshWithGroup( " + << theSource << ".GetMesh(), " << theType << ", \"" << theGroupName << "\" )"; + } + else { + SMESH::TPythonDump () << "isDone = " << _this() << ".SetEnforcedMesh( " + << theSource << ".GetMesh(), " << theType << " )"; + } return res; } @@ -992,7 +1013,7 @@ bool GHS3DPlugin_Hypothesis_i::p_SetEnforcedMesh(SMESH::SMESH_IDSource_ptr theSo { MESSAGE("The source is a group") try { - bool res = this->GetImpl()->SetEnforcedGroup(theGroup_i->GetGroupDS()->GetMesh(), theGroup_i->GetListOfID(), theType, enfMeshName , SObj->GetID(), theGroupName); + bool res = this->GetImpl()->SetEnforcedGroup(theGroup_i->GetGroupDS()->GetMesh(), theGroup_i->GetListOfID(), theType, enfMeshName , SObj->GetID(), theGroupName); if (theGroupName != "") { SMESH::TPythonDump () << "isDone = " << _this() << ".SetEnforcedMeshWithGroup( " << theSource << ", " << theType << ", \"" << theGroupName << "\" )"; @@ -1019,7 +1040,7 @@ bool GHS3DPlugin_Hypothesis_i::p_SetEnforcedMesh(SMESH::SMESH_IDSource_ptr theSo { MESSAGE("The source is a group on geom") try { - bool res = this->GetImpl()->SetEnforcedGroup(theGroupOnGeom_i->GetGroupDS()->GetMesh(),theGroupOnGeom_i->GetListOfID(), theType, enfMeshName , SObj->GetID(), theGroupName); + bool res = this->GetImpl()->SetEnforcedGroup(theGroupOnGeom_i->GetGroupDS()->GetMesh(),theGroupOnGeom_i->GetListOfID(), theType, enfMeshName , SObj->GetID(), theGroupName); if (theGroupName != "") { SMESH::TPythonDump () << "isDone = " << _this() << ".SetEnforcedMeshWithGroup( " << theSource << ", " << theType << ", \"" << theGroupName << "\" )"; diff --git a/src/GHS3DPlugin/GHS3DPlugin_Hypothesis_i.hxx b/src/GHS3DPlugin/GHS3DPlugin_Hypothesis_i.hxx index 4ac8b6f..81c12dd 100644 --- a/src/GHS3DPlugin/GHS3DPlugin_Hypothesis_i.hxx +++ b/src/GHS3DPlugin/GHS3DPlugin_Hypothesis_i.hxx @@ -55,6 +55,13 @@ class GHS3DPLUGIN_EXPORT GHS3DPlugin_Hypothesis_i: */ void SetToMeshHoles(CORBA::Boolean toMesh); CORBA::Boolean GetToMeshHoles(); + /*! + * To make groups of volumes of different domains when mesh is generated from skin. + * Default is to make groups. + * This option works only (1) for the mesh w/o shape and (2) if GetToMeshHoles() == true + */ + void SetToMakeGroupsOfDomains(CORBA::Boolean toMakeGroups); + CORBA::Boolean GetToMakeGroupsOfDomains(); /*! * Maximal size of memory to be used by the algorithm (in Megabytes) */ diff --git a/src/GHS3DPlugin/Makefile.am b/src/GHS3DPlugin/Makefile.am index 4af27ab..0103d4e 100644 --- a/src/GHS3DPlugin/Makefile.am +++ b/src/GHS3DPlugin/Makefile.am @@ -47,7 +47,6 @@ libGHS3DEngine_la_CPPFLAGS = \ $(KERNEL_CXXFLAGS) \ $(CAS_CPPFLAGS) \ $(GEOM_CXXFLAGS) \ - $(MED_CXXFLAGS) \ $(SMESH_CXXFLAGS) \ $(VTK_INCLUDES) \ $(BOOST_CPPFLAGS) \ @@ -58,7 +57,6 @@ libGHS3DEngine_la_CPPFLAGS = \ libGHS3DEngine_la_LDFLAGS = \ ../../idl/libSalomeIDLGHS3DPLUGIN.la \ $(CAS_KERNEL) -lTKBRep -lTKG2d -lTKG3d -lTKTopAlgo -lTKGeomBase -lTKGeomAlgo -lTKCDF \ - $(MED_LDFLAGS) -lSalomeIDLMED \ $(SMESH_LDFLAGS) -lSMESHimpl -lSMESHEngine -lSMESHDS -lSMDS -lStdMeshers -lMeshDriverGMF \ $(KERNEL_LDFLAGS) -lSalomeGenericObj -lSALOMELocalTrace -lSALOMEBasics -lSalomeNS -lOpUtil diff --git a/src/GUI/GHS3DPluginGUI_HypothesisCreator.cxx b/src/GUI/GHS3DPluginGUI_HypothesisCreator.cxx index 78cb1fa..25d7101 100644 --- a/src/GUI/GHS3DPluginGUI_HypothesisCreator.cxx +++ b/src/GUI/GHS3DPluginGUI_HypothesisCreator.cxx @@ -21,13 +21,11 @@ // File : GHS3DPluginGUI_HypothesisCreator.cxx // Author : Michael Zorin // Module : GHS3DPlugin -// $Header: // #include "GHS3DPluginGUI_HypothesisCreator.h" -// #include "GHS3DPluginGUI_EnforcedDelegates.h" #include "GHS3DPluginGUI_Enums.h" -#include "GeometryGUI.h" +#include #include #include @@ -294,7 +292,7 @@ QWidget *EnforcedMeshTableWidgetDelegate::createEditor(QWidget *parent, void EnforcedMeshTableWidgetDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const { - QItemDelegate::setEditorData(editor, index); + QItemDelegate::setEditorData(editor, index); } void EnforcedMeshTableWidgetDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, @@ -392,7 +390,9 @@ QFrame* GHS3DPluginGUI_HypothesisCreator::buildFrame() } myToMeshHolesCheck = new QCheckBox( tr( "GHS3D_TO_MESH_HOLES" ), myStdGroup ); - aStdLayout->addWidget( myToMeshHolesCheck, row++, 0, 1, 2 ); + aStdLayout->addWidget( myToMeshHolesCheck, row, 0, 1, 1 ); + myToMakeGroupsOfDomains = new QCheckBox( tr( "GHS3D_TO_MAKE_DOMAIN_GROUPS" ), myStdGroup ); + aStdLayout->addWidget( myToMakeGroupsOfDomains, row++, 1, 1, 1 ); aStdLayout->addWidget( new QLabel( tr( "GHS3D_OPTIMIZATIOL_LEVEL" ), myStdGroup ), row, 0, 1, 1 ); myOptimizationLevelCombo = new QComboBox( myStdGroup ); @@ -645,6 +645,7 @@ QFrame* GHS3DPluginGUI_HypothesisCreator::buildFrame() tab->setCurrentIndex( STD_TAB ); // connections + //connect( myToMeshHolesCheck, SIGNAL( toggled( bool ) ), this, SLOT( onToMeshHoles(bool))); connect( myMaximumMemoryCheck, SIGNAL( toggled( bool ) ), this, SLOT( updateWidgets() ) ); connect( myInitialMemoryCheck, SIGNAL( toggled( bool ) ), this, SLOT( updateWidgets() ) ); connect( myBoundaryRecoveryCheck, SIGNAL( toggled( bool ) ), this, SLOT( updateWidgets() ) ); @@ -1384,6 +1385,13 @@ void GHS3DPluginGUI_HypothesisCreator::onRemoveEnforcedVertex() myEnforcedTableWidget->selectionModel()->clearSelection(); } +void GHS3DPluginGUI_HypothesisCreator::onToMeshHoles(bool isOn) +{ + // myToMakeGroupsOfDomains->setEnabled( isOn ); + // if ( !isOn ) + // myToMakeGroupsOfDomains->setChecked( false ); +} + void GHS3DPluginGUI_HypothesisCreator::onDirBtnClicked() { QString dir = SUIT_FileDlg::getExistingDirectory( dlg(), myWorkingDir->text(), QString() ); @@ -1393,6 +1401,7 @@ void GHS3DPluginGUI_HypothesisCreator::onDirBtnClicked() void GHS3DPluginGUI_HypothesisCreator::updateWidgets() { + //myToMakeGroupsOfDomains->setEnabled( myToMeshHolesCheck->isChecked() ); myMaximumMemorySpin->setEnabled( myMaximumMemoryCheck->isChecked() ); myInitialMemoryCheck->setEnabled( !myBoundaryRecoveryCheck->isChecked() ); myInitialMemorySpin->setEnabled( myInitialMemoryCheck->isChecked() && !myBoundaryRecoveryCheck->isChecked() ); @@ -1424,6 +1433,7 @@ void GHS3DPluginGUI_HypothesisCreator::retrieveParams() const myName->setText( data.myName ); myToMeshHolesCheck ->setChecked ( data.myToMeshHoles ); + myToMakeGroupsOfDomains ->setChecked ( data.myToMakeGroupsOfDomains ); myOptimizationLevelCombo ->setCurrentIndex( data.myOptimizationLevel ); myMaximumMemoryCheck ->setChecked ( data.myMaximumMemory > 0 ); myMaximumMemorySpin ->setValue ( qMax( data.myMaximumMemory, @@ -1668,6 +1678,7 @@ bool GHS3DPluginGUI_HypothesisCreator::readParamsFromHypo( GHS3DHypothesisData& h_data.myName = isCreation() && data ? hypName() : ""; h_data.myToMeshHoles = h->GetToMeshHoles(); + h_data.myToMakeGroupsOfDomains = /*h->GetToMeshHoles() &&*/ h->GetToMakeGroupsOfDomains(); h_data.myMaximumMemory = h->GetMaximumMemory(); h_data.myInitialMemory = h->GetInitialMemory(); h_data.myInitialMemory = h->GetInitialMemory(); @@ -1741,6 +1752,8 @@ bool GHS3DPluginGUI_HypothesisCreator::storeParamsToHypo( const GHS3DHypothesisD if ( h->GetToMeshHoles() != h_data.myToMeshHoles ) // avoid duplication of DumpPython commands h->SetToMeshHoles ( h_data.myToMeshHoles ); + if ( h->GetToMakeGroupsOfDomains() != h_data.myToMakeGroupsOfDomains ) + h->SetToMakeGroupsOfDomains( h_data.myToMakeGroupsOfDomains ); if ( h->GetMaximumMemory() != h_data.myMaximumMemory ) h->SetMaximumMemory ( h_data.myMaximumMemory ); if ( h->GetInitialMemory() != h_data.myInitialMemory ) @@ -1854,6 +1867,7 @@ bool GHS3DPluginGUI_HypothesisCreator::readParamsFromWidgets( GHS3DHypothesisDat MESSAGE("GHS3DPluginGUI_HypothesisCreator::readParamsFromWidgets"); h_data.myName = myName ? myName->text() : ""; h_data.myToMeshHoles = myToMeshHolesCheck->isChecked(); + h_data.myToMakeGroupsOfDomains = myToMakeGroupsOfDomains->isChecked(); h_data.myMaximumMemory = myMaximumMemoryCheck->isChecked() ? myMaximumMemorySpin->value() : -1; h_data.myInitialMemory = myInitialMemoryCheck->isChecked() ? myInitialMemorySpin->value() : -1; h_data.myOptimizationLevel = myOptimizationLevelCombo->currentIndex(); diff --git a/src/GUI/GHS3DPluginGUI_HypothesisCreator.h b/src/GUI/GHS3DPluginGUI_HypothesisCreator.h index 44641a5..a9830d9 100644 --- a/src/GUI/GHS3DPluginGUI_HypothesisCreator.h +++ b/src/GUI/GHS3DPluginGUI_HypothesisCreator.h @@ -140,7 +140,7 @@ typedef std::set< TEnfMesh*, CompareEnfMeshes > TEnfMeshList; typedef struct { - bool myToMeshHoles,myKeepFiles,myToCreateNewNodes,myBoundaryRecovery,myFEMCorrection,myRemoveInitialCentralPoint; + bool myToMeshHoles,myToMakeGroupsOfDomains,myKeepFiles,myToCreateNewNodes,myBoundaryRecovery,myFEMCorrection,myRemoveInitialCentralPoint; int myMaximumMemory,myInitialMemory,myOptimizationLevel; QString myName,myWorkingDir,myTextOption; double myGradation; @@ -173,6 +173,7 @@ protected: virtual QString type() const; protected slots: + void onToMeshHoles(bool); void onDirBtnClicked(); void updateWidgets(); @@ -209,6 +210,7 @@ private: QWidget* myStdGroup; QLineEdit* myName; QCheckBox* myToMeshHolesCheck; + QCheckBox* myToMakeGroupsOfDomains; QComboBox* myOptimizationLevelCombo; QWidget* myAdvGroup; diff --git a/src/GUI/GHS3DPlugin_msg_en.ts b/src/GUI/GHS3DPlugin_msg_en.ts index 9c8884b..b77bcb3 100644 --- a/src/GUI/GHS3DPlugin_msg_en.ts +++ b/src/GUI/GHS3DPlugin_msg_en.ts @@ -31,6 +31,10 @@ GHS3D_TO_MESH_HOLES To mesh holes + + GHS3D_TO_MAKE_DOMAIN_GROUPS + To make groups of domains + INIT_MEMORY_SIZE Initial memory size diff --git a/src/GUI/GHS3DPlugin_msg_fr.ts b/src/GUI/GHS3DPlugin_msg_fr.ts index 922e2cc..c2291bd 100755 --- a/src/GUI/GHS3DPlugin_msg_fr.ts +++ b/src/GUI/GHS3DPlugin_msg_fr.ts @@ -3,6 +3,10 @@ @default + + GHS3D_TO_MAKE_DOMAIN_GROUPS + To make groups of domains + GHS3D_ADV_ARGS Avancé diff --git a/src/GUI/GHS3DPlugin_msg_ja.ts b/src/GUI/GHS3DPlugin_msg_ja.ts new file mode 100644 index 0000000..659e85f --- /dev/null +++ b/src/GUI/GHS3DPlugin_msg_ja.ts @@ -0,0 +1,211 @@ + + + + + @default + + GHS3D_ADV_ARGS + 高度な + + + GHS3D_HYPOTHESIS + GHS3D + + + GHS3D_OPTIMIZATIOL_LEVEL + 最適化のレベル + + + GHS3D_PERMISSION_DENIED + 作業ディレクトリが書き込み可能ではないです。 + + + GHS3D_STD_ARGS + パラメーター + + + GHS3D_TITLE + 仮説構築 + + + GHS3D_TO_MESH_HOLES + メッシュに穴します。 + + + INIT_MEMORY_SIZE + 初期メモリのサイズ + + + KEEP_WORKING_FILES + 作業ファイルを維持するには + + + LEVEL_NONE + なし + + + LEVEL_LIGHT + 光 + + + LEVEL_MEDIUM + 中 (標準) + + + LEVEL_STANDARDPLUS + 標準的です + + + + LEVEL_STRONG + 強力な + + + MAX_MEMORY_SIZE + 最大メモリ サイズ + + + MEGABYTE + メガバイト + + + NO_INITIAL_CENTRAL_POINT + 初期の中心点を削除するには + + + RECOVERY_VERSION + 境界の回復のバージョンを使用するには + + + FEM_CORRECTION + 有限要素法による補正を使用するには + + + GHS3D_GRADATION + Volumic グラデーション + + + SELECT_DIR + ... + + + TEXT_OPTION + オプション テキストとして + + + TO_ADD_NODES + 新しいノードを作成するには + + + VERBOSE_LEVEL + 詳細レベル + + + WORKING_DIR + 作業ディレクトリ + + + GHS3D_ENFORCED_VERTICES + 適用された頂点 + + + GHS3D_ENFORCED_MESHES + 強制メッシュ + + + GHS3D_ENF_NAME_COLUMN + 名前 + + + GHS3D_ENF_VER_X_COLUMN + X + + + GHS3D_ENF_VER_Y_COLUMN + Y + + + GHS3D_ENF_VER_Z_COLUMN + Z + + + GHS3D_ENF_SIZE_COLUMN + サイズ + + + GHS3D_ENF_ENTRY_COLUMN + 頂点のエントリ + + + GHS3D_ENF_MESH_CONSTRAINT_COLUMN + 制約 + + + GHS3D_ENF_VER_COMPOUND_COLUMN + 化合物 + + + GHS3D_ENF_GROUP_COLUMN + グループ + + + GHS3D_ENF_SELECT_VERTEX + 頂点を選択します + + + GHS3D_ENF_SELECT_MESH + メッシュを選択します。 + + + GHS3D_ENF_VER_X_LABEL + X: + + + GHS3D_ENF_VER_Y_LABEL + Y: + + + GHS3D_ENF_VER_Z_LABEL + Z: + + + GHS3D_ENF_MESH_CONSTRAINT_LABEL + 制約: + + + GHS3D_ENF_MESH_CONSTRAINT_NODE + ノード + + + GHS3D_ENF_MESH_CONSTRAINT_EDGE + エッジ + + + GHS3D_ENF_MESH_CONSTRAINT_FACE + 直面しています。 + + + GHS3D_ENF_SIZE_LABEL + サイズ: + + + GHS3D_ENF_GROUP_LABEL + グループ: + + + GHS3D_ENF_ADD + 追加 + + + GHS3D_ENF_REMOVE + 削除 + + + GHS3D_ENF_VER_INFO + <b>警告</b>: 強制頂点は現在関連付けられているジオメトリ w/o メッシュののみ考慮します。 + + + GHS3D_ENF_MESH_INFO + <b>警告</b>: 現在適用されたメッシュはメッシュ関連付けられたジオメトリなしののみ考慮します。 + + + diff --git a/src/GUI/Makefile.am b/src/GUI/Makefile.am index 5d912bb..6d70baa 100644 --- a/src/GUI/Makefile.am +++ b/src/GUI/Makefile.am @@ -49,7 +49,6 @@ libGHS3DPluginGUI_la_CPPFLAGS = \ $(KERNEL_CXXFLAGS) \ $(GUI_CXXFLAGS) \ $(GEOM_CXXFLAGS) \ - $(MED_CXXFLAGS) \ $(SMESH_CXXFLAGS) \ $(BOOST_CPPFLAGS) \ $(CORBA_CXXFLAGS) \ @@ -61,7 +60,6 @@ libGHS3DPluginGUI_la_LDFLAGS = \ ../../idl/libSalomeIDLGHS3DPLUGIN.la \ $(QT_LIBS) \ $(KERNEL_LDFLAGS) -lSALOMELocalTrace \ - $(MED_LDFLAGS) -lSalomeIDLMED \ $(GEOM_LDFLAGS) -lGEOM \ $(SMESH_LDFLAGS) -lSMESH -lGeomSelectionTools -lStdMeshersGUI -lSMESHFiltersSelection \ $(GUI_LDFLAGS) -lsuit -lqtx -lSalomeApp \ @@ -71,4 +69,5 @@ libGHS3DPluginGUI_la_LDFLAGS = \ nodist_salomeres_DATA= \ GHS3DPlugin_images.qm \ GHS3DPlugin_msg_en.qm \ - GHS3DPlugin_msg_fr.qm + GHS3DPlugin_msg_fr.qm \ + GHS3DPlugin_msg_ja.qm -- 2.39.2