From d83b63b2c3a2defe15dec30687b0cc92476497e1 Mon Sep 17 00:00:00 2001 From: Nabil Ghodbane Date: Sat, 12 Feb 2022 14:20:21 +0100 Subject: [PATCH] spns #19079: top-ii-vol integration in SMESH --- doc/salome/gui/SMESH/input/tools.rst | 1 + src/Tools/CMakeLists.txt | 1 + src/Tools/TopIIVolMeshPlug/CMakeLists.txt | 60 +++ src/Tools/TopIIVolMeshPlug/README | 37 ++ .../TopIIVolMeshPlug/TopIIVolMeshMonitor.py | 97 ++++ .../TopIIVolMeshPlug/TopIIVolMeshMonitor.ui | 38 ++ .../TopIIVolMeshPlug/TopIIVolMeshPlugin.py | 36 ++ .../TopIIVolMeshPluginDialog.py | 164 ++++++ .../TopIIVolMeshPluginDialog.ui | 474 ++++++++++++++++++ .../TopIIVolMeshPlugin_plugin.py | 36 ++ src/Tools/TopIIVolMeshPlug/doc/CMakeLists.txt | 30 ++ .../TopIIVolMeshPlug/doc/TopIIVolMesh.rst | 63 +++ src/Tools/TopIIVolMeshPlug/doc/conf.py.in | 187 +++++++ .../doc/images/callTopIIVolMesh.png | Bin 0 -> 30670 bytes src/Tools/TopIIVolMeshPlug/doc/index.rst | 22 + src/Tools/smesh_plugins.py | 11 + 16 files changed, 1257 insertions(+) create mode 100644 src/Tools/TopIIVolMeshPlug/CMakeLists.txt create mode 100644 src/Tools/TopIIVolMeshPlug/README create mode 100644 src/Tools/TopIIVolMeshPlug/TopIIVolMeshMonitor.py create mode 100644 src/Tools/TopIIVolMeshPlug/TopIIVolMeshMonitor.ui create mode 100644 src/Tools/TopIIVolMeshPlug/TopIIVolMeshPlugin.py create mode 100644 src/Tools/TopIIVolMeshPlug/TopIIVolMeshPluginDialog.py create mode 100644 src/Tools/TopIIVolMeshPlug/TopIIVolMeshPluginDialog.ui create mode 100644 src/Tools/TopIIVolMeshPlug/TopIIVolMeshPlugin_plugin.py create mode 100644 src/Tools/TopIIVolMeshPlug/doc/CMakeLists.txt create mode 100644 src/Tools/TopIIVolMeshPlug/doc/TopIIVolMesh.rst create mode 100644 src/Tools/TopIIVolMeshPlug/doc/conf.py.in create mode 100644 src/Tools/TopIIVolMeshPlug/doc/images/callTopIIVolMesh.png create mode 100644 src/Tools/TopIIVolMeshPlug/doc/index.rst diff --git a/doc/salome/gui/SMESH/input/tools.rst b/doc/salome/gui/SMESH/input/tools.rst index f9b53c046..0812a8e92 100644 --- a/doc/salome/gui/SMESH/input/tools.rst +++ b/doc/salome/gui/SMESH/input/tools.rst @@ -9,6 +9,7 @@ The following plugins are accessible via **Mesh > SMESH plugins** menu: * `SpherePadder plugin `_ * `MGSurfOpt plugin `_ * `MGCleaner plugin `_ +* `topIIVolMesh plugin `_ * `Z-cracks plugin `_ * `MacMesh plugin `_ * `blocFissure plugin `_ diff --git a/src/Tools/CMakeLists.txt b/src/Tools/CMakeLists.txt index 2c8c20781..ca7f5a1ff 100644 --- a/src/Tools/CMakeLists.txt +++ b/src/Tools/CMakeLists.txt @@ -26,6 +26,7 @@ ADD_SUBDIRECTORY(MacMesh) IF(SALOME_BUILD_GUI) ADD_SUBDIRECTORY(MGCleanerPlug) ADD_SUBDIRECTORY(YamsPlug) + ADD_SUBDIRECTORY(TopIIVolMeshPlug) # ADD_SUBDIRECTORY(ZCracksPlug) ENDIF(SALOME_BUILD_GUI) diff --git a/src/Tools/TopIIVolMeshPlug/CMakeLists.txt b/src/Tools/TopIIVolMeshPlug/CMakeLists.txt new file mode 100644 index 000000000..7edc1b5ad --- /dev/null +++ b/src/Tools/TopIIVolMeshPlug/CMakeLists.txt @@ -0,0 +1,60 @@ +# Copyright (C) 2013-2021 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +IF(SALOME_BUILD_DOC) + ADD_SUBDIRECTORY(doc) +ENDIF(SALOME_BUILD_DOC) + +IF(SALOME_BUILD_GUI) + INCLUDE(UsePyQt) +ENDIF(SALOME_BUILD_GUI) + +# --- scripts --- + +# scripts / static +SET(_plugin_SCRIPTS + TopIIVolMeshPluginDialog.py + TopIIVolMeshPlugin.py + TopIIVolMeshPlugin_plugin.py + TopIIVolMeshMonitor.py + README +) + +IF(SALOME_BUILD_GUI) + # uic files / to be processed by pyuic + SET(_pyuic_FILES + TopIIVolMeshPluginDialog.ui + TopIIVolMeshMonitor.ui + ) + # scripts / pyuic wrappings + PYQT_WRAP_UIC(_pyuic_SCRIPTS ${_pyuic_FILES} TARGET_NAME _target_name_pyuic) +ENDIF(SALOME_BUILD_GUI) + +# --- rules --- + +SALOME_INSTALL_SCRIPTS("${_plugin_SCRIPTS}" ${SALOME_SMESH_INSTALL_PLUGINS}) +MESSAGE(VERBOSE "iNSTALLATION FOLDER ${SALOME_SMESH_INSTALL_PLUGINS}") +IF(SALOME_BUILD_GUI) + SALOME_INSTALL_SCRIPTS("${_pyuic_SCRIPTS}" ${SALOME_SMESH_INSTALL_PLUGINS} TARGET_NAME _target_name_pyuic_py) + # add dependency of compiled py files on uic files in order + # to avoid races problems when compiling in parallel + ADD_DEPENDENCIES(${_target_name_pyuic_py} ${_target_name_pyuic}) + # Install the CMake configuration files: + INSTALL(FILES "${PROJECT_SOURCE_DIR}/README" DESTINATION "${SALOME_INSTALL_CMAKE_LOCAL}") +ENDIF(SALOME_BUILD_GUI) diff --git a/src/Tools/TopIIVolMeshPlug/README b/src/Tools/TopIIVolMeshPlug/README new file mode 100644 index 000000000..fbcad999b --- /dev/null +++ b/src/Tools/TopIIVolMeshPlug/README @@ -0,0 +1,37 @@ +****************************** +About SALOME TopIIVolMesh plug-in +****************************** + +SALOME TopIIVolMesh plug-in implements an interface to the topIIvol meshing tool. + +SALOME TopIIVolMesh plug-in is integrated into SALOME platform via the SALOME Mesh +module. + +For more information please visit the SALOME platform web site: + + + +======= +License +======= + +SALOME platform is distributed under the GNU Lesser General Public License. +See COPYING file for more details. + +Also, additional information can be found at SALOME platform web site: + + + +============ +Installation +============ + +============= +Documentation +============= + +=============== +Troubleshooting +=============== + +Please, send a mail to webmaster.salome@opencascade.com. diff --git a/src/Tools/TopIIVolMeshPlug/TopIIVolMeshMonitor.py b/src/Tools/TopIIVolMeshPlug/TopIIVolMeshMonitor.py new file mode 100644 index 000000000..119aba9b0 --- /dev/null +++ b/src/Tools/TopIIVolMeshPlug/TopIIVolMeshMonitor.py @@ -0,0 +1,97 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2013-2020 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +import os +import sys +import string +import types +import tempfile +import traceback +import pprint as PP #pretty print + +from qtsalome import * + +# Import des panels + +from TopIIVolMeshMonitor_ui import Ui_qdLogger + +verbose = True + +class TopIIVolMeshMonitor(Ui_qdLogger, QDialog): + def __init__(self, parent, txt): + QDialog.__init__(self,parent) + self.setupUi(self) + self.resize( QSize(1000,600).expandedTo(self.minimumSizeHint()) ) + self.qpbOK.clicked.connect( self.OnQpbOKClicked ) + # Button OK is disabled until computation is finished + self.qpbOK.setEnabled(False) + self.qpbSave.clicked.connect( self.OnQpbSaveClicked ) + self.qpbSave.setToolTip("Save trace in log file") + self.qpbOK.setToolTip("Close view") + self.myExecutable=QProcess(self) + self.myExecutable.readyReadStandardOutput.connect( self.readFromStdOut ) + self.myExecutable.readyReadStandardError.connect( self.readFromStdErr ) + self.myExecutable.finished.connect( self.computationFinished ) + self.myExecutable.errorOccurred.connect( self.computationOnError ) + if os.path.exists(self.parent().outputMesh): + os.remove(self.parent().outputMesh) + self.myExecutable.start(txt) + self.myExecutable.closeWriteChannel() + self.show() + + def OnQpbOKClicked(self): + self.close() + + def OnQpbSaveClicked(self): + outputDirectory=os.path.expanduser("~") + fn, mask = QFileDialog.getSaveFileName(None,"Save File",outputDirectory) + if not fn: + return + ulfile = os.path.abspath(str(fn)) + try: + f = open(fn, 'wb') + f.write(self.qtbLogWindow.toPlainText().encode("utf-8")) + f.close() + except IOError as why: + QMessageBox.critical(self, 'Save File', + 'The file %s could not be saved.
Reason: %s'%(str(fn), str(why))) + + def readFromStdErr(self): + a=self.myExecutable.readAllStandardError() + aa=a.data().decode(errors='ignore') + self.qtbLogWindow.append(aa) + + def readFromStdOut(self) : + a=self.myExecutable.readAllStandardOutput() + aa=a.data().decode(errors='ignore') + self.qtbLogWindow.append(aa) + + def computationFinished(self): + self.qpbOK.setEnabled(True) + if self.myExecutable.exitCode() == 0: + self.parent().saveOutputMesh() + else: + QMessageBox.critical(self, 'Computation failed', + 'The computation has failed.
Please, check the log message.') + + def computationOnError(self): + self.qpbOK.setEnabled(True) + QMessageBox.critical(self, 'Computation failed', + 'The computation has failed.
Please, check the log message.') diff --git a/src/Tools/TopIIVolMeshPlug/TopIIVolMeshMonitor.ui b/src/Tools/TopIIVolMeshPlug/TopIIVolMeshMonitor.ui new file mode 100644 index 000000000..5bded345b --- /dev/null +++ b/src/Tools/TopIIVolMeshPlug/TopIIVolMeshMonitor.ui @@ -0,0 +1,38 @@ + + + qdLogger + + + + 0 + 0 + 469 + 489 + + + + Run TopIIVolMesh + + + + + + Save log + + + + + + + + + + Ok + + + + + + + + diff --git a/src/Tools/TopIIVolMeshPlug/TopIIVolMeshPlugin.py b/src/Tools/TopIIVolMeshPlug/TopIIVolMeshPlugin.py new file mode 100644 index 000000000..e53b61699 --- /dev/null +++ b/src/Tools/TopIIVolMeshPlug/TopIIVolMeshPlugin.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2013-2020 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# if you already have plugins defined in a salome_plugins.py file, add this file at the end. +# if not, copy this file as ${HOME}/Plugins/smesh_plugins.py or ${APPLI}/Plugins/smesh_plugins.py + +def TopIIVolMeshLct(context): + # get context study, salomeGui + study = context.study + sg = context.sg + + import os + import subprocess + import tempfile + from qtsalome import QFileDialog, QMessageBox + + import TopIIVolMeshPluginDialog + window = TopIIVolMeshPluginDialog.getInstance() + window.show() diff --git a/src/Tools/TopIIVolMeshPlug/TopIIVolMeshPluginDialog.py b/src/Tools/TopIIVolMeshPlug/TopIIVolMeshPluginDialog.py new file mode 100644 index 000000000..91988c1ee --- /dev/null +++ b/src/Tools/TopIIVolMeshPlug/TopIIVolMeshPluginDialog.py @@ -0,0 +1,164 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2013-2020 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + + +import os, subprocess +import random +import getpass +import time +import pathlib + +# set seed +from datetime import datetime +random.seed(datetime.now()) + +import platform +import tempfile +from TopIIVolMeshPluginDialog_ui import Ui_TopIIVolMeshMainFrame +from TopIIVolMeshMonitor import TopIIVolMeshMonitor +from qtsalome import * + +verbose = True + +class TopIIVolMeshPluginDialog(Ui_TopIIVolMeshMainFrame,QWidget): + """ + """ + def __init__(self): + QWidget.__init__(self) + self.setupUi(self) + self.qpbHelp.clicked.connect(self.OnQpbHelpClicked) + self.qpbCompute.clicked.connect(self.OnQpbComputeClicked) + self.qpbMeshFile.clicked.connect(self.OnQpbMeshFileClicked) + self.qpbMeshFile.setToolTip("Select input DEM file") + self.qpbClose.clicked.connect(self.OnQpbCloseClicked) + self.qcbDistributed.stateChanged[int].connect(self.OnqcbDistributedClicked) + self.qlbXParts.setVisible(False) + self.qlbYParts.setVisible(False) + self.qlbZParts.setVisible(False) + self.qsbXParts.setVisible(False) + self.qsbYParts.setVisible(False) + self.qsbZParts.setVisible(False) + self.SALOME_TMP_DIR = None + try: + self.qleTmpDir.setText(os.path.join('/tmp',getpass.getuser(),'top-ii-vol')) + except: + self.qleTmpDir.setText('/tmp') + self.resize(800, 500) + self.outputMesh = '' + + def OnQpbHelpClicked(self): + import SalomePyQt + sgPyQt = SalomePyQt.SalomePyQt() + try: + mydir=os.environ["SMESH_ROOT_DIR"] + except Exception: + QMessageBox.warning(self, "Help", "Help unavailable $SMESH_ROOT_DIR not found") + return + + myDoc=mydir + "/share/doc/salome/gui/SMESH/TopIIVolMesh/index.html" + sgPyQt.helpContext(myDoc,"") + + def OnQpbMeshFileClicked(self): + fd = QFileDialog(self, "select an existing Mesh file", self.qleMeshFile.text(), "Mesh-Files (*.xyz);;All Files (*)") + if fd.exec_(): + infile = fd.selectedFiles()[0] + self.qleMeshFile.setText(infile) + + def OnQpbComputeClicked(self): + if self.qleMeshFile.text() == '': + QMessageBox.critical(self, "Mesh", "select an input mesh") + return + inputMesh = self.qleMeshFile.text() + # retrieve x,y,z and depth parameters + xPoints = self.qsbXPoints.value() + yPoints = self.qsbYPoints.value() + zPoints = self.qsbZPoints.value() + depth = self.qsbDepth.value() + nProcs = self.qsbNBprocs.value() + if not self.qcbDistributed.isChecked(): + if nProcs == 1: + shellCmd = "topIIvol_Mesher" + else: + shellCmd = "mpirun -np {} topIIvol_ParMesher".format(nProcs) + shellCmd+= " --xpoints " + str(xPoints) + shellCmd+= " --ypoints " + str(yPoints) + shellCmd+= " --zpoints " + str(zPoints) + shellCmd+= " --depth " + str(depth) + shellCmd+= " --in " + inputMesh + else: + xParts = self.qsbXParts.value() + yParts = self.qsbYParts.value() + zParts = self.qsbZParts.value() + shellCmd = "mpirun -np {} topIIvol_DistMesher".format(nProcs) + shellCmd+= " --xpoints " + str(xPoints) + shellCmd+= " --ypoints " + str(yPoints) + shellCmd+= " --zpoints " + str(zPoints) + shellCmd+= " --depth " + str(depth) + shellCmd+= " --partition_x " + str(xParts) + shellCmd+= " --partition_y " + str(xParts) + shellCmd+= " --partition_z " + str(xParts) + shellCmd+= " --in " + inputMesh + if platform.system()=="Windows" : + self.SALOME_TMP_DIR = os.getenv("SALOME_TMP_DIR") + else: + self.SALOME_TMP_DIR = os.path.join(self.qleTmpDir.text(), time.strftime("%Y-%m-%d-%H-%M-%S")) + pathlib.Path(self.SALOME_TMP_DIR).mkdir(parents=True, exist_ok=True) + self.outputMesh= os.path.join(self.SALOME_TMP_DIR, inputMesh.split('/').pop().replace('.xyz','.mesh')) + shellCmd+= " --out " + self.outputMesh + print("INFO: ", shellCmd) + myMonitorView=TopIIVolMeshMonitor(self, shellCmd) + + def OnqcbDistributedClicked(self): + state = self.qcbDistributed.isChecked() + self.qlbXParts.setVisible(state) + self.qlbYParts.setVisible(state) + self.qlbZParts.setVisible(state) + self.qsbXParts.setVisible(state) + self.qsbYParts.setVisible(state) + self.qsbZParts.setVisible(state) + + def OnQpbCloseClicked(self): + self.close() + + def saveOutputMesh(self): + if not self.qcbDisplayMesh.isChecked(): + return True + import salome + import SMESH, SALOMEDS + from salome.smesh import smeshBuilder + smesh = smeshBuilder.New() + self.outputMesh.split('/') + for mesh in pathlib.Path(self.SALOME_TMP_DIR).glob('*.mesh'): + (outputMesh, status) = smesh.CreateMeshesFromGMF(os.path.join(self.SALOME_TMP_DIR, mesh)) + if salome.sg.hasDesktop(): + salome.sg.updateObjBrowser() + return True + +__instance = None + +def getInstance(): + """ + This function returns a singleton instance of the plugin dialog. + It is mandatory in order to call show without a parent ... + """ + global __instance + if __instance is None: + __instance = TopIIVolMeshPluginDialog() + return __instance diff --git a/src/Tools/TopIIVolMeshPlug/TopIIVolMeshPluginDialog.ui b/src/Tools/TopIIVolMeshPlug/TopIIVolMeshPluginDialog.ui new file mode 100644 index 000000000..c148582f6 --- /dev/null +++ b/src/Tools/TopIIVolMeshPlug/TopIIVolMeshPluginDialog.ui @@ -0,0 +1,474 @@ + + + TopIIVolMeshMainFrame + + + + 0 + 0 + 780 + 411 + + + + Tetra Mesh from cloud of xyz points mesh generator + + + + + 10 + 10 + 761 + 101 + + + + + 10 + + + + Input Mesh + + + + + 10 + 50 + 151 + 31 + + + + + 10 + + + + DEM input file + + + + 18 + 18 + + + + + + + 170 + 50 + 531 + 31 + + + + + 10 + + + + + + + + 10 + 120 + 761 + 231 + + + + Options + + + + + 10 + 30 + 62 + 22 + + + + 0 + + + 999999999 + + + 10 + + + + + + 80 + 30 + 201 + 20 + + + + Number of points in X direction + + + + + + 10 + 70 + 62 + 22 + + + + 0 + + + 999999999 + + + 10 + + + + + + 10 + 110 + 62 + 22 + + + + 0 + + + 999999999 + + + 10 + + + + + + 80 + 70 + 211 + 20 + + + + Number of points in Y direction + + + + + + 80 + 110 + 211 + 20 + + + + Number of points in Z direction + + + + + + 10 + 150 + 62 + 22 + + + + -999999999 + + + 999999999 + + + 0 + + + + + + 80 + 150 + 201 + 20 + + + + Depth in Z direction + + + + + + 630 + 30 + 91 + 21 + + + + + + + + + + 370 + 30 + 151 + 16 + + + + Number of processors + + + + + + 660 + 30 + 101 + 16 + + + + Distributed + + + + + + 370 + 70 + 261 + 16 + + + + Number of partitions in X direction + + + + + + 370 + 110 + 251 + 16 + + + + Number of partitions in Y direction + + + + + + 370 + 150 + 251 + 16 + + + + Number of partitions in Z direction + + + + + + 300 + 30 + 62 + 22 + + + + 0 + + + 999999999 + + + 1 + + + + + + 300 + 70 + 62 + 22 + + + + 0 + + + 999999999 + + + 1 + + + + + + 300 + 110 + 62 + 22 + + + + 0 + + + 999999999 + + + 1 + + + + + + 300 + 150 + 62 + 22 + + + + 0 + + + 999999999 + + + 1 + + + + + + 10 + 200 + 611 + 23 + + + + + + + + + + 10 + 180 + 391 + 16 + + + + Workspace + + + + + + 630 + 70 + 91 + 21 + + + + + + + + + + 660 + 70 + 101 + 16 + + + + Display mesh + + + + + + + 10 + 370 + 761 + 27 + + + + + + + Compute + + + + + + + Close + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 10 + + + + Help + + + + + + + + + diff --git a/src/Tools/TopIIVolMeshPlug/TopIIVolMeshPlugin_plugin.py b/src/Tools/TopIIVolMeshPlug/TopIIVolMeshPlugin_plugin.py new file mode 100644 index 000000000..2468401a8 --- /dev/null +++ b/src/Tools/TopIIVolMeshPlug/TopIIVolMeshPlugin_plugin.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2013-2020 EDF R&D +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +# if you already have plugins defined in a salome_plugins.py file, add this file at the end. +# if not, copy this file as ${HOME}/Plugins/smesh_plugins.py or ${APPLI}/Plugins/smesh_plugins.py + +def TopIIVolMeshLct(context): + # get context study, salomeGui + study = context.study + sg = context.sg + + import os + import subprocess + import tempfile + from qtsalome import QFileDialog, QMessageBox + + import TopIIVolMeshPluginDialog + window = TopIIVolMeshPluginDialog.getDialog() + window.show() diff --git a/src/Tools/TopIIVolMeshPlug/doc/CMakeLists.txt b/src/Tools/TopIIVolMeshPlug/doc/CMakeLists.txt new file mode 100644 index 000000000..b7649123e --- /dev/null +++ b/src/Tools/TopIIVolMeshPlug/doc/CMakeLists.txt @@ -0,0 +1,30 @@ +# Copyright (C) 2012-2021 CEA +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com +# + +SALOME_CONFIGURE_FILE(conf.py.in conf.py) + +SET(_cmd_options -c ${CMAKE_CURRENT_BINARY_DIR} -b html -d doctrees ${CMAKE_CURRENT_SOURCE_DIR} docutils) +SALOME_GENERATE_ENVIRONMENT_SCRIPT(_cmd env_script "${SPHINX_EXECUTABLE}" "${_cmd_options}" CONTEXT TopIIVolMeshPlug_DOC) +ADD_CUSTOM_TARGET(html_docs_TopIIVolMeshPlug COMMAND ${_cmd}) + +INSTALL(CODE "EXECUTE_PROCESS(COMMAND \"${CMAKE_COMMAND}\" --build ${PROJECT_BINARY_DIR} --target html_docs_TopIIVolMeshPlug)") +INSTALL(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/docutils/ DESTINATION ${SALOME_INSTALL_DOC}/gui/SMESH/TopIIVolMesh) + +SET(make_clean_files docutils doctrees) +SET_DIRECTORY_PROPERTIES(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${make_clean_files}") diff --git a/src/Tools/TopIIVolMeshPlug/doc/TopIIVolMesh.rst b/src/Tools/TopIIVolMeshPlug/doc/TopIIVolMesh.rst new file mode 100644 index 000000000..48e3f873a --- /dev/null +++ b/src/Tools/TopIIVolMeshPlug/doc/TopIIVolMesh.rst @@ -0,0 +1,63 @@ +Introduction +============ + +**topIIvol** meshing tool provides sequential/parallel tools for creating volumetric tetrahedral meshes from a given topology (point-cloud `*.xyz`). + +Running topIIvol Plug-in +======================== + +**topIIVolMesh** plug-in can be invoked via SMESH Plugin item in Mesh menu bar + +.. image:: images/callTopIIVolMesh.png + :align: center + + +**topIIVolMesh** Options +======================== + + +Sequential mode +--------------- +If the number of processors is set to 1, **topIIvol_Mesher** sequential tool is called for creating volumetric tetrahedral meshes from a given topology. The volumetric mesh can be displayed in SALOME by ticking the "Display mesh" check-box. + +The list of input parameters are: + +- DEM input file: input point cloud file; +- Number of X points present in the input point cloud; +- Number of Y points present in the input point cloud; +- Number of Z points intended in the z direction; +- Depth of the mesh needed; +- temporary directory for calculation. + +Parallel mode +--------------- +If the number of processors is greater than one, **topIIvol_ParMesher** parallel computing tool is called for creating volumetric tetrahedral meshes from a given topology. The volumetric mesh can be displayed in SALOME by ticking the "Display mesh" check-box. + +The list of input parameters are: + +- DEM input file: input point cloud file; +- Number of X points present in the input point cloud; +- Number of Y points present in the input point cloud; +- Number of Z points intended in the z direction; +- Depth of the mesh needed; +- Number of MPI ranks +- temporary directory for calculation. + + +Distributed mode +----------------- +If the check-box **Distributed** is ticked, **topIIvol_DistMesher** computing tool is called for creating embarassingly parallel distributed meshes from a given topology. + +The list of input parameters are: + +- DEM input file: input point cloud file; +- Number of X points present in the input point cloud; +- Number of Y points present in the input point cloud; +- Number of Z points intended in the z direction; +- Number of partitions in X direction; +- Number of partitions in Y direction; +- Number of partitions in Z direction; +- Depth of the mesh needed; +- Number of MPI ranks +- temporary directory for calculation. + diff --git a/src/Tools/TopIIVolMeshPlug/doc/conf.py.in b/src/Tools/TopIIVolMeshPlug/doc/conf.py.in new file mode 100644 index 000000000..56b7819ba --- /dev/null +++ b/src/Tools/TopIIVolMeshPlug/doc/conf.py.in @@ -0,0 +1,187 @@ +# -*- coding: utf-8 -*- +# +# TopIIVolMesh PlugIn documentation build configuration file +# + +import sys, os +import sphinx + +# If your extensions are in another directory, add it here. If the directory +# is relative to the documentation root, use os.path.abspath to make it +# absolute, like shown here. +#sys.path.append(os.path.abspath('some/directory')) + +# General configuration +# --------------------- + +# Add any Sphinx extension module names here, as strings. They can be extensions +# coming with Sphinx (named 'sphinx.ext.*') or your custom ones. +extensions = ['sphinx.ext.autodoc'] +try: + import sphinx_rtd_theme + extensions += ['sphinx_rtd_theme'] + use_rtd_theme = True +except: + use_rtd_theme = False + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['.templates'] + +# The suffix of source filenames. +source_suffix = '.rst' + +# The master toctree document. +master_doc = 'index' + +# General substitutions. +project = 'topIIvol Plug-in' +copyright = '2007-2021 CEA' + +# The default replacements for |version| and |release|, also used in various +# other places throughout the built documents. +# +# The short X.Y version. +version = '@SALOMESMESH_VERSION@' +# The full version, including alpha/beta/rc tags. +release = '@SALOMESMESH_VERSION@' + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +#today = '' +# Else, today_fmt is used as the format for a strftime call. +#today_fmt = '%B %d, %Y' + +# List of documents that shouldn't be included in the build. +#unused_docs = [] + +# List of directories, relative to source directories, that shouldn't be searched +# for source files. +#exclude_dirs = [] + +# The reST default role (used for this markup: `text`) to use for all documents. +#default_role = None + +# If true, '()' will be appended to :func: etc. cross-reference text. +#add_function_parentheses = True + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +#add_module_names = True + +# If true, sectionauthor and moduleauthor directives will be shown in the +# output. They are ignored by default. +#show_authors = False + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + + +# Options for HTML output +# ----------------------- + +# The theme to use for HTML and HTML Help pages. Major themes that come with +# Sphinx are currently 'default' and 'sphinxdoc'. +if use_rtd_theme: + html_theme = 'sphinx_rtd_theme' +else: + html_theme = 'default' if sphinx.version_info[:2] < (1,3) else 'classic' + +themes_options = {} +themes_options['classic'] = { + 'body_max_width':'none', + 'body_min_width':0, +} +html_theme_options = themes_options.get(html_theme, {}) + +# The name for this set of Sphinx documents. If None, it defaults to +# " v documentation". +#html_title = None + +# A shorter title for the navigation bar. Default is the same as html_title. +#html_short_title = None + +# The name of an image file (within the static path) to place at the top of +# the sidebar. +#html_logo = None + +# The name of an image file (within the static path) to use as favicon of the +# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +#html_favicon = None + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +#html_static_path = ['.static'] + +# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, +# using the given strftime format. +#html_last_updated_fmt = '%b %d, %Y' + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +#html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +#html_sidebars = {} + +# Additional templates that should be rendered to pages, maps page names to +# template names. +#html_additional_pages = {} + +# If false, no module index is generated. +#html_use_modindex = True + +# If false, no index is generated. +#html_use_index = True + +# If true, the index is split into individual pages for each letter. +#html_split_index = False + +# If true, the reST sources are included in the HTML build as _sources/. +#html_copy_source = True + +# If true, an OpenSearch description file will be output, and all pages will +# contain a tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +#html_use_opensearch = '' + +# If nonempty, this is the file name suffix for HTML files (e.g. ".xhtml"). +#html_file_suffix = '' + +# Output file base name for HTML help builder. +htmlhelp_basename = 'TopIIVolMeshPlug-in doc' + + +# Options for LaTeX output +# ------------------------ + +# The paper size ('letter' or 'a4'). +#latex_paper_size = 'letter' + +# The font size ('10pt', '11pt' or '12pt'). +#latex_font_size = '10pt' + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, author, document class [howto/manual]). +latex_documents = [ + ('index', 'TopIIVolMeshPlugIn.tex', 'TopIIVolMesh PlugIn Documentation', + 'CEA', 'manual'), +] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +#latex_logo = None + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +#latex_use_parts = False + +# Additional stuff for the LaTeX preamble. +#latex_preamble = '' + +# Documents to append as an appendix to all manuals. +#latex_appendices = [] + +# If false, no module index is generated. +#latex_use_modindex = True diff --git a/src/Tools/TopIIVolMeshPlug/doc/images/callTopIIVolMesh.png b/src/Tools/TopIIVolMeshPlug/doc/images/callTopIIVolMesh.png new file mode 100644 index 0000000000000000000000000000000000000000..72a9d5d943588e8ebcd428e986df54e48f6fc7b0 GIT binary patch literal 30670 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 MKA(4T?w8yC7uHuBb^rhX literal 0 HcmV?d00001 diff --git a/src/Tools/TopIIVolMeshPlug/doc/index.rst b/src/Tools/TopIIVolMeshPlug/doc/index.rst new file mode 100644 index 000000000..3cd237947 --- /dev/null +++ b/src/Tools/TopIIVolMeshPlug/doc/index.rst @@ -0,0 +1,22 @@ +.. TopIIVolMesh documentation master file, created by sphinx-quickstart. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +topIIvol plugin documentation +===================================== + +This documentation covers the usage of **top-ii-vol** as plug-in in SALOME that can be used within the SALOME +Mesh module. + +TopIIVolMesh plug-in uses CEA **top-ii-Vol** meshing tool,which provides sequential/parallel tools for creating volumetric tetrahedral meshes from a given topology. +This plug-in offers only the most common functionalities of the tool. + +Contents: + +.. toctree:: + :maxdepth: 2 + + TopIIVolMesh.rst + + + diff --git a/src/Tools/smesh_plugins.py b/src/Tools/smesh_plugins.py index 7c726820a..66aa07bd9 100644 --- a/src/Tools/smesh_plugins.py +++ b/src/Tools/smesh_plugins.py @@ -91,3 +91,14 @@ except Exception as e: #print 'probleme zcracks' salome_pluginsmanager.logger.info('ERROR: Zcrack plug-in is unavailable: {}'.format(e)) pass + +# Topological to volumic mesh plugin +try: + from TopIIVolMeshPlugin import TopIIVolMeshLct + salome_pluginsmanager.AddFunction('Run Topological Volumic mesher', + 'run topological volumic mesher', + TopIIVolMeshLct) +except Exception as e: + #print 'probleme zcracks' + salome_pluginsmanager.logger.info('ERROR: TopIIVolMesh plug-in is unavailable: {}'.format(e)) + pass