mirror of
https://git.salome-platform.org/gitpub/modules/smesh.git
synced 2025-03-13 03:44:34 +05:00
165 lines
5.7 KiB
Python
165 lines
5.7 KiB
Python
# -*- 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(yParts)
|
|
shellCmd+= " --partition_z " + str(zParts)
|
|
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
|