]> SALOME platform Git repositories - modules/smesh.git/blob - src/Tools/YamsPlug/monYamsPlugDialog.py
Salome HOME
first step modification compilation ok
[modules/smesh.git] / src / Tools / YamsPlug / monYamsPlugDialog.py
1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2007-2013  EDF R&D
3 #
4 # This library is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU Lesser General Public
6 # License as published by the Free Software Foundation; either
7 # version 2.1 of the License.
8 #
9 # This library is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12 # Lesser General Public License for more details.
13 #
14 # You should have received a copy of the GNU Lesser General Public
15 # License along with this library; if not, write to the Free Software
16 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
17 #
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
19 #
20
21 # Modules Python
22 # Modules Eficas
23
24 import os, subprocess
25 from YamsPlugDialog import Ui_YamsPlugDialog
26 from monViewText import MonViewText
27 from PyQt4.QtGui import *
28 from PyQt4.QtCore import *
29
30
31 class MonYamsPlugDialog(Ui_YamsPlugDialog,QWidget):
32   """
33   """
34   def __init__(self):
35         QWidget.__init__(self)
36         self.setupUi(self)
37         self.connecterSignaux()
38         self.fichierIn=""
39         self.fichierOut=""
40         self.MeshIn="" 
41         self.num=1
42
43         # complex whith QResources: not used
44         # The icon are supposed to be located in the $SMESH_ROOT_DIR/share/salome/resources/smesh folder,
45         # other solution could be in the same folder than this python module file:
46         # iconfolder=os.path.dirname(os.path.abspath(__file__))
47
48         iconfolder=os.environ['SMESH_ROOT_DIR']+'/share/salome/resources/smesh'
49         #print "monYamsPlugDialog iconfolder",iconfolder
50         icon = QIcon()
51         icon.addFile(os.path.join(iconfolder,"select1.png"))
52         self.PB_MeshSmesh.setIcon(icon)
53         icon = QIcon()
54         icon.addFile(os.path.join(iconfolder,"open.png"))
55         self.PB_ParamsFileExplorer.setIcon(icon)
56
57         #Ces parametres ne sont pas remis à rien par le clean
58         self.paramsFile= os.path.abspath(os.path.join(os.environ['HOME'],'.yams.dat'))
59         self.LE_ParamsFile.setText(self.paramsFile)
60         self.LE_MeshFile.setText("")
61         self.LE_MeshSmesh.setText("")
62
63   def connecterSignaux(self) :
64         self.connect(self.PB_Cancel,SIGNAL("clicked()"),self.PBCancelPressed)
65         self.connect(self.PB_Default,SIGNAL("clicked()"),self.clean)
66         self.connect(self.PB_Help,SIGNAL("clicked()"),self.PBHelpPressed)
67         self.connect(self.PB_Load,SIGNAL("clicked()"),self.PBLoadPressed)
68         self.connect(self.PB_OK,SIGNAL("clicked()"),self.PBOKPressed)
69         self.connect(self.PB_Save,SIGNAL("clicked()"),self.PBSavePressed)
70         self.connect(self.PB_MeshFile,SIGNAL("clicked()"),self.PBMeshFilePressed)
71         self.connect(self.PB_MeshSmesh,SIGNAL("clicked()"),self.PBMeshSmeshPressed)
72         self.connect(self.PB_ParamsFileExplorer,SIGNAL("clicked()"),self.setParamsFileName)
73         self.connect(self.LE_MeshFile,SIGNAL("returnPressed()"),self.meshFileNameChanged)
74         self.connect(self.LE_ParamsFile,SIGNAL("returnPressed()"),self.paramsFileNameChanged)
75
76
77   def PBHelpPressed(self):
78         try :
79           mydir=os.environ['SMESH_ROOT_DIR']
80         except Exception:
81           QMessageBox.warning( self, "Help unavailable $SMESH_ROOT_DIR not found")
82         maDoc=mydir+"/share/doc/salome/gui/SMESH/yams/_downloads/YamsWhitePaper_3.2.pdf"
83         command="xdg-open "+maDoc+";"
84         subprocess.call(command, shell=True)
85
86
87   def PBOKPressed(self):
88         if not(self.PrepareLigneCommande()) : return
89         self.PBSavePressed(NomHypo=True)
90         maFenetre=MonViewText(self,self.commande)
91         if os.path.isfile(self.fichierOut) :self.enregistreResultat()
92
93   def enregistreResultat(self):
94         import smesh
95         import SMESH
96         import salome
97         from salome.kernel import studyedit
98
99         maStudy=studyedit.getActiveStudy()
100         smesh.SetCurrentStudy(maStudy)
101         (outputMesh, status) = smesh.CreateMeshesFromGMF(self.fichierOut)
102         meshname = 'yams'+str(self.num)
103         smesh.SetName(outputMesh.GetMesh(), meshname)
104         outputMesh.Compute()
105
106
107         self.editor = studyedit.getStudyEditor()    # 
108         moduleEntry=self.editor.findOrCreateComponent("SMESH","SMESH")
109         HypReMeshEntry = self.editor.findOrCreateItem( moduleEntry, name = 'HypoForRemesh',
110                                            comment = 'HypoForRemeshing')
111         monStudyBuilder=maStudy.NewBuilder();
112         monStudyBuilder.NewCommand();
113         newStudyIter=monStudyBuilder.NewObject(HypReMeshEntry)
114         aNameAttrib=monStudyBuilder.FindOrCreateAttribute(newStudyIter,"AttributeName")
115         hypoName = 'anHypo_Yams_'+str(self.num)
116         aNameAttrib.SetValue(hypoName)
117         aCommentAttrib=monStudyBuilder.FindOrCreateAttribute(newStudyIter,"AttributeComment")
118         aCommentAttrib.SetValue(str(self.commande))
119         
120         SOMesh=maStudy.FindObjectByName(meshname ,"SMESH")[0]
121         newLink=monStudyBuilder.NewObject(SOMesh)
122         monStudyBuilder.Addreference(newLink, newStudyIter);
123         if salome.sg.hasDesktop(): salome.sg.updateObjBrowser(0)
124         self.num+=1
125         return True
126
127   def PBSavePressed(self,NomHypo=False):
128         if NomHypo : text = '# Params for Hypothese : anHypo_Yams_'+str(self.num - 1)+"\n"
129         else :       text = '# Save intermediate params \n' 
130         text += "# Params for mesh : " +  self.LE_MeshSmesh.text() +'\n'
131         for RB in self.GBOptim.findChildren(QRadioButton,):
132             if RB.isChecked()==True:
133                text+="Optimisation ='"+RB.text()+"'\n"
134                break
135         for RB in self.GBUnit.findChildren(QRadioButton,):
136             if RB.isChecked()==True:
137                text+="Units ='"+RB.text()+"'\n"
138         text+='Chordal_Tolerance_Deviation='+str(self.SP_Tolerance.value())+'\n'
139
140         text+='Ridge_Detection=' + str(self.CB_Ridge.isChecked())+'\n'
141         text+='Split_Edge='      + str(self.CB_SplitEdge.isChecked())+'\n'
142         text+='Point_Smoothing=' + str(self.CB_Point.isChecked())+'\n'
143         text+='Geometrical_Approximation='+ str(self.SP_Geomapp.value())  +'\n'
144         text+='Ridge_Angle='              + str(self.SP_Ridge.value())    +'\n'
145         text+='Maximum_Size='             + str(self.SP_MaxSize.value())  +'\n'
146         text+='Minimum_Size='             + str(self.SP_MaxSize.value())  +'\n'
147         text+='Mesh_Gradation='           + str(self.SP_Gradation.value())+'\n'
148
149         text+='Verbosity='                + str(self.SP_Verbosity.value())+'\n'
150         text+='Memory='                   + str(self.SP_Memory.value())+'\n'
151         text+='\n\n'
152
153         try :
154            f=open(self.paramsFile,'a')
155         except :
156            QMessageBox.warning( self, "File", "Unable to open "+self.paramsFile)
157            return
158         try :
159            f.write(text)
160         except :
161            QMessageBox.warning( self, "File", "Unable to write "+self.paramsFile)
162            return
163         f.close()
164
165   def PBLoadPressed(self):
166         try :
167            f=open(self.paramsFile,'r')
168         except :
169            QMessageBox.warning( self, "File", "Unable to open "+self.paramsFile)
170            return
171         try :
172            text=f.read()
173         except :
174            QMessageBox.warning( self, "File", "Unable to read "+self.paramsFile)
175            return
176         f.close()
177         d={}
178         exec text in d
179         for RB in self.GBOptim.findChildren(QRadioButton,):
180             if d['Optimisation']== RB.text():
181                RB.setChecked(True)
182                break
183         for RB in self.GBUnit.findChildren(QRadioButton,):
184             if d['Units']== RB.text():
185                RB.setChecked(True)
186                break
187         self.SP_Tolerance.setValue(d['Chordal_Tolerance_Deviation'])
188
189         self.CB_Ridge.setChecked(d['Ridge_Detection'])
190         self.CB_Point.setChecked(d['Point_Smoothing'])
191         self.CB_SplitEdge.setChecked(d['Split_Edge'])
192         self.SP_Geomapp.setValue(d['Geometrical_Approximation'])
193         self.SP_Ridge.setValue(d['Ridge_Angle'])
194         self.SP_MaxSize.setValue(d['Maximum_Size'])
195         self.SP_MinSize.setValue(d['Minimum_Size'])
196         self.SP_Gradation.setValue(d['Mesh_Gradation'])
197
198         self.SP_Verbosity.setValue(d['Verbosity'])
199         self.SP_Memory.setValue(d['Memory'])
200
201
202   def PBCancelPressed(self):
203         self.close()
204
205   def PBMeshFilePressed(self):
206        fd = QFileDialog(self, "select an existing Mesh file", self.LE_MeshFile.text(), "Mesh-Files (*.mesh);;All Files (*)")
207        if fd.exec_():
208           infile = fd.selectedFiles()[0]
209           self.LE_MeshFile.setText(infile)
210           self.fichierIn=infile.toLatin1()
211
212   def setParamsFileName(self):
213        fd = QFileDialog(self, "select a file", self.LE_ParamsFile.text(), "dat Files (*.dat);;All Files (*)")
214        if fd.exec_():
215           infile = fd.selectedFiles()[0]
216           self.LE_ParamsFile.setText(infile)
217           self.paramsFile=infile.toLatin1()
218
219
220   def meshFileNameChanged(self):
221       self.fichierIn=self.LE_MeshFile.text()
222       if os.path.exists(self.fichierIn): return
223       QMessageBox.warning( self, "Unknown File", "File doesn't exist")
224
225   def paramsFileNameChanged(self):
226       self.paramsFile=self.LE_ParamsFile.text()
227
228   def PBMeshSmeshPressed(self):
229       import salome
230       import smesh
231       from salome.kernel import studyedit
232       from salome.smesh.smeshstudytools import SMeshStudyTools
233       from salome.gui import helper as guihelper
234       from omniORB import CORBA
235
236       mySObject, myEntry = guihelper.getSObjectSelected()
237       if CORBA.is_nil(mySObject) or mySObject==None:
238          QMessageBox.critical(self, "Mesh", "select an input mesh")
239          return
240       self.smeshStudyTool = SMeshStudyTools()
241       self.__selectedMesh = self.smeshStudyTool.getMeshObjectFromSObject(mySObject)
242       if CORBA.is_nil(self.__selectedMesh):
243          QMessageBox.critical(self, "Mesh", "select an input mesh")
244          return
245       myName = mySObject.GetName()
246       self.MeshIn=myName
247       self.LE_MeshSmesh.setText(myName)
248
249   def prepareFichier(self):
250       self.fichierIn="/tmp/PourYam_"+str(self.num)+".mesh"
251       import SMESH
252       self.__selectedMesh.ExportGMF(self.__selectedMesh,self.fichierIn, True)
253
254   def PrepareLigneCommande(self):
255       self.commande="yams "
256       verbosity=str(self.SP_Verbosity.value())
257       self.commande+="-v "+verbosity
258       for obj in self.mesRB.children():
259           try :
260            if obj.isChecked():
261               self.style=obj.objectName().remove(0,3)
262               self.style.replace("_","-")
263               break
264           except :
265               pass
266       self.commande+=" -O "+self.style.toLatin1()
267       if self.fichierIn=="" and self.MeshIn=="" :
268          QMessageBox.critical(self, "Mesh", "select an input mesh")
269          return False
270       if self.MeshIn!="" : self.prepareFichier()
271       if not (os.path.isfile(self.fichierIn)):
272          QMessageBox.critical(self, "File", "unable to read GMF Mesh in "+str(self.fichierIn))
273          return False
274
275       deb=os.path.splitext(self.fichierIn)
276       self.fichierOut=deb[0]+'.d.meshb'
277
278       if self.RB_Absolute.isChecked()==True :
279          self.commande+=' -Dabsolute'
280       else :
281          self.commande+=' -Drelative'
282       self.commande+=',tolerance=%f'%self.SP_Tolerance.value()
283       if self.CB_Ridge.isChecked()==False : self.commande+=',nr'
284       if self.CB_Point.isChecked()==False : self.commande+=',ns'
285       if self.SP_Geomapp.value()!=0.04 : self.commande+=',geomapp=%f'%self.SP_Geomapp.value()
286       if self.SP_Ridge.value()!=45.0 : self.commande+=',ridge=%f'%self.SP_Ridge.value()
287       if self.SP_MaxSize.value()!=100 : self.commande+=',maxsize=%f'%self.SP_MaxSize.value()
288       if self.SP_MinSize.value()!=5 : self.commande+=',minsize=%f'%self.SP_MinSize.value()
289       if self.SP_Gradation.value()!=1.3 : self.commande+=',gradation=%f'%self.SP_MaxSize.value()
290       if self.CB_SplitEdge.isChecked()==True : self.commande+=',splitedge=1'
291
292       if self.SP_Verbosity.value()!=3 : self.commande+=' -v %d'%self.SP_Verbosity.value()
293       if self.SP_Memory.value()!=0 : self.commande+=' -m %d'%self.SP_Memory.value()
294
295       self.commande+=" "+self.fichierIn
296       return True
297
298   def clean(self):
299         self.RB_0.setChecked(True)
300         self.RB_G.setChecked(False)
301         self.RB_U.setChecked(False)
302         self.RB_S.setChecked(False)
303         self.RB_2.setChecked(False)
304         self.RB_1.setChecked(False)
305         self.RB_Absolute.setChecked(False)
306         self.RB_Relative.setChecked(True)
307         self.SP_Tolerance.setProperty("value", 0.1)
308         self.SP_Geomapp.setProperty("value", 0.04)
309         self.SP_Ridge.setProperty("value", 45.0)
310         self.SP_Gradation.setProperty("value", 1.3)
311         self.CB_Ridge.setChecked(True)
312         self.CB_Point.setChecked(True)
313         self.CB_SplitEdge.setChecked(False)
314         self.SP_MaxSize.setProperty("value", -2.0)
315         self.SP_MinSize.setProperty("value", -2.0)
316         self.SP_Verbosity.setProperty("value", 3)
317         self.SP_Memory.setProperty("value", 0)
318
319
320 __dialog=None
321 def getDialog():
322     """
323     This function returns a singleton instance of the plugin dialog.
324     c est obligatoire pour faire un show sans parent...
325     """
326     global __dialog
327     if __dialog is None:
328         __dialog = MonYamsPlugDialog()
329     #else :
330     #   __dialog.clean()
331     return __dialog
332