Salome HOME
PR: synchro V6_main tag mergeto_V7_main_11Feb13
[modules/smesh.git] / src / Tools / YamsPlug / monYamsPlugDialog.py
1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2007-2012   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 # Modules Python
21 # Modules Eficas
22
23 import os, subprocess
24 from YamsPlugDialog import Ui_YamsPlugDialog
25 from monViewText import MonViewText
26 from PyQt4.QtGui import *
27 from PyQt4.QtCore import *
28
29
30 class MonYamsPlugDialog(Ui_YamsPlugDialog,QWidget):
31   """
32   """
33   def __init__(self):
34         QWidget.__init__(self)
35         self.setupUi(self)
36         self.connecterSignaux()
37         self.fichierIn=""
38         self.fichierOut=""
39         self.MeshIn="" 
40         self.num=1
41
42 #       Ces parametres ne sont pas remis à rien par le clean
43         self.paramsFile= os.path.abspath(os.path.join(os.environ['HOME'],'.yams.dat'))
44         self.LE_ParamsFile.setText(self.paramsFile)
45         self.LE_MeshFile.setText("")
46         self.LE_MeshSmesh.setText("")
47
48   def connecterSignaux(self) :
49         self.connect(self.PB_Cancel,SIGNAL("clicked()"),self.PBCancelPressed)
50         self.connect(self.PB_Default,SIGNAL("clicked()"),self.clean)
51         self.connect(self.PB_Help,SIGNAL("clicked()"),self.PBHelpPressed)
52         self.connect(self.PB_Load,SIGNAL("clicked()"),self.PBLoadPressed)
53         self.connect(self.PB_OK,SIGNAL("clicked()"),self.PBOKPressed)
54         self.connect(self.PB_Save,SIGNAL("clicked()"),self.PBSavePressed)
55         self.connect(self.PB_MeshFile,SIGNAL("clicked()"),self.PBMeshFilePressed)
56         self.connect(self.PB_MeshSmesh,SIGNAL("clicked()"),self.PBMeshSmeshPressed)
57         self.connect(self.PB_ParamsFileExplorer,SIGNAL("clicked()"),self.setParamsFileName)
58         self.connect(self.LE_MeshFile,SIGNAL("returnPressed()"),self.meshFileNameChanged)
59         self.connect(self.LE_ParamsFile,SIGNAL("returnPressed()"),self.paramsFileNameChanged)
60
61
62   def PBHelpPressed(self):
63         try :
64           maDoc=os.environ['DISTENE_YAMS_DOC_PDF']
65         except Exception:
66           QMessageBox.warning( self, "Help unavailable", str(maDoc) + " not found")
67         command="xdg-open "+maDoc+";"
68         subprocess.call(command, shell=True)
69
70
71   def PBOKPressed(self):
72         if not(self.PrepareLigneCommande()) : return
73         self.PBSavePressed(NomHypo=True)
74         maFenetre=MonViewText(self,self.commande)
75         if os.path.isfile(self.fichierOut) :self.enregistreResultat()
76
77   def enregistreResultat(self):
78         import smesh
79         import SMESH
80         import salome
81         from salome.kernel import studyedit
82
83         maStudy=studyedit.getActiveStudy()
84         smesh.SetCurrentStudy(maStudy)
85         (outputMesh, status) = smesh.CreateMeshesFromGMF(self.fichierOut)
86         meshname = 'yams'+str(self.num)
87         smesh.SetName(outputMesh.GetMesh(), meshname)
88         outputMesh.Compute()
89
90
91         self.editor = studyedit.getStudyEditor()    # 
92         moduleEntry=self.editor.findOrCreateComponent("SMESH","SMESH")
93         HypReMeshEntry = self.editor.findOrCreateItem( moduleEntry, name = 'HypoForRemesh',
94                                            comment = 'HypoForRemshing')
95         monStudyBuilder=maStudy.NewBuilder();
96         monStudyBuilder.NewCommand();
97         newStudyIter=monStudyBuilder.NewObject(HypReMeshEntry)
98         aNameAttrib=monStudyBuilder.FindOrCreateAttribute(newStudyIter,"AttributeName")
99         hypoName = 'monHypo_Yams_'+str(self.num)
100         aNameAttrib.SetValue(hypoName)
101         aCommentAttrib=monStudyBuilder.FindOrCreateAttribute(newStudyIter,"AttributeComment")
102         aCommentAttrib.SetValue(str(self.commande))
103         
104         SOMesh=maStudy.FindObjectByName(meshname ,"SMESH")[0]
105         newLink=monStudyBuilder.NewObject(SOMesh)
106         monStudyBuilder.Addreference(newLink, newStudyIter);
107         if salome.sg.hasDesktop(): salome.sg.updateObjBrowser(0)
108         self.num+=1
109         return True
110
111   def PBSavePressed(self,NomHypo=False):
112         if NomHypo : text = '# Params for Hypothese : monHypo_Yams_'+str(self.num - 1)+"\n"
113         else :       text = '# Save intermediate params \n' 
114         text += "# Params for mesh : " +  self.LE_MeshSmesh.text() +'\n'
115         for RB in self.GBOptim.findChildren(QRadioButton,):
116             if RB.isChecked()==True:
117                text+="Optimisation ='"+RB.text()+"'\n"
118                break
119         for RB in self.GBUnit.findChildren(QRadioButton,):
120             if RB.isChecked()==True:
121                text+="Units ='"+RB.text()+"'\n"
122         text+='Chordal_Tolerance_Deviation='+str(self.SP_Tolerance.value())+'\n'
123
124         text+='Ridge_Detection=' + str(self.CB_Ridge.isChecked())+'\n'
125         text+='Split_Edge='      + str(self.CB_SplitEdge.isChecked())+'\n'
126         text+='Point_Smoothing=' + str(self.CB_Point.isChecked())+'\n'
127         text+='Geometrical_Approximation='+ str(self.SP_Geomapp.value())  +'\n'
128         text+='Ridge_Angle='              + str(self.SP_Ridge.value())    +'\n'
129         text+='Maximum_Size='             + str(self.SP_MaxSize.value())  +'\n'
130         text+='Minimum_Size='             + str(self.SP_MaxSize.value())  +'\n'
131         text+='Mesh_Gradation='           + str(self.SP_Gradation.value())+'\n'
132
133         text+='Verbosity='                + str(self.SP_Verbosity.value())+'\n'
134         text+='Memory='                   + str(self.SP_Memory.value())+'\n'
135         text+='\n\n'
136
137         try :
138            f=open(self.paramsFile,'a')
139         except :
140            QMessageBox.warning( self, "File", "Unable to open "+self.paramsFile)
141            return
142         try :
143            f.write(text)
144         except :
145            QMessageBox.warning( self, "File", "Unable to write "+self.paramsFile)
146            return
147         f.close()
148
149   def PBLoadPressed(self):
150         try :
151            f=open(self.paramsFile,'r')
152         except :
153            QMessageBox.warning( self, "File", "Unable to open "+self.paramsFile)
154            return
155         try :
156            text=f.read()
157         except :
158            QMessageBox.warning( self, "File", "Unable to read "+self.paramsFile)
159            return
160         f.close()
161         d={}
162         exec text in d
163         for RB in self.GBOptim.findChildren(QRadioButton,):
164             if d['Optimisation']== RB.text():
165                RB.setChecked(True)
166                break
167         for RB in self.GBUnit.findChildren(QRadioButton,):
168             if d['Units']== RB.text():
169                RB.setChecked(True)
170                break
171         self.SP_Tolerance.setValue(d['Chordal_Tolerance_Deviation'])
172
173         self.CB_Ridge.setChecked(d['Ridge_Detection'])
174         self.CB_Point.setChecked(d['Point_Smoothing'])
175         self.CB_SplitEdge.setChecked(d['Split_Edge'])
176         self.SP_Geomapp.setValue(d['Geometrical_Approximation'])
177         self.SP_Ridge.setValue(d['Ridge_Angle'])
178         self.SP_MaxSize.setValue(d['Maximum_Size'])
179         self.SP_MinSize.setValue(d['Minimum_Size'])
180         self.SP_Gradation.setValue(d['Mesh_Gradation'])
181
182         self.SP_Verbosity.setValue(d['Verbosity'])
183         self.SP_Memory.setValue(d['Memory'])
184
185
186   def PBCancelPressed(self):
187         self.close()
188
189   def PBMeshFilePressed(self):
190        fd = QFileDialog(self, "select an existing Mesh file", self.LE_MeshFile.text(), "Mesh-Files (*.mesh);;All Files (*)")
191        if fd.exec_():
192           infile = fd.selectedFiles()[0]
193           self.LE_MeshFile.setText(infile)
194           self.fichierIn=infile.toLatin1()
195
196   def setParamsFileName(self):
197        fd = QFileDialog(self, "select a file", self.LE_ParamsFile.text(), "dat Files (*.dat);;All Files (*)")
198        if fd.exec_():
199           infile = fd.selectedFiles()[0]
200           self.LE_ParamsFile.setText(infile)
201           self.paramsFile=infile.toLatin1()
202
203
204   def meshFileNameChanged(self):
205       self.fichierIn=self.LE_MeshFile.text()
206       if os.path.exists(self.fichierIn): return
207       QMessageBox.warning( self, "Unknown File", "File doesn't exist")
208
209   def paramsFileNameChanged(self):
210       self.paramsFile=self.LE_ParamsFile.text()
211
212   def PBMeshSmeshPressed(self):
213       import salome
214       import smesh
215       from salome.kernel import studyedit
216       from salome.smesh.smeshstudytools import SMeshStudyTools
217       from salome.gui import helper as guihelper
218       from omniORB import CORBA
219
220       mySObject, myEntry = guihelper.getSObjectSelected()
221       if CORBA.is_nil(mySObject) or mySObject==None:
222          QMessageBox.critical(self, "Mesh", "select an input mesh")
223          return
224       self.smeshStudyTool = SMeshStudyTools()
225       self.__selectedMesh = self.smeshStudyTool.getMeshObjectFromSObject(mySObject)
226       if CORBA.is_nil(self.__selectedMesh):
227          QMessageBox.critical(self, "Mesh", "select an input mesh")
228          return
229       myName = mySObject.GetName()
230       self.MeshIn=myName
231       self.LE_MeshSmesh.setText(myName)
232
233   def prepareFichier(self):
234       self.fichierIn="/tmp/PourYam_"+str(self.num)+".mesh"
235       import SMESH
236       self.__selectedMesh.ExportGMF(self.__selectedMesh,self.fichierIn, True)
237
238   def PrepareLigneCommande(self):
239       self.commande="yams "
240       verbosity=str(self.SP_Verbosity.value())
241       self.commande+="-v "+verbosity
242       for obj in self.mesRB.children():
243           try :
244            if obj.isChecked():
245               self.style=obj.objectName().remove(0,3)
246               self.style.replace("_","-")
247               break
248           except :
249               pass
250       self.commande+=" -O "+self.style.toLatin1()
251       if self.fichierIn=="" and self.MeshIn=="" :
252          QMessageBox.critical(self, "Mesh", "select an input mesh")
253          return False
254       if self.MeshIn!="" : self.prepareFichier()
255       if not (os.path.isfile(self.fichierIn)):
256          QMessageBox.critical(self, "File", "unable to read GMF Mesh in "+str(self.fichierIn))
257          return False
258
259       deb=os.path.splitext(self.fichierIn)
260       self.fichierOut=deb[0]+'.d.meshb'
261
262       if self.RB_Absolute.isChecked()==True :
263          self.commande+=' -Dabsolute'
264       else :
265          self.commande+=' -Drelative'
266       self.commande+=',tolerance=%f'%self.SP_Tolerance.value()
267       if self.CB_Ridge.isChecked()==False : self.commande+=',nr'
268       if self.CB_Point.isChecked()==False : self.commande+=',ns'
269       if self.SP_Geomapp.value()!=0.04 : self.commande+=',geomapp=%f'%self.SP_Geomapp.value()
270       if self.SP_Ridge.value()!=45.0 : self.commande+=',ridge=%f'%self.SP_Ridge.value()
271       if self.SP_MaxSize.value()!=100 : self.commande+=',maxsize=%f'%self.SP_MaxSize.value()
272       if self.SP_MinSize.value()!=5 : self.commande+=',minsize=%f'%self.SP_MinSize.value()
273       if self.SP_Gradation.value()!=1.3 : self.commande+=',gradation=%f'%self.SP_MaxSize.value()
274       if self.CB_SplitEdge.isChecked()==True : self.commande+=',splitedge=1'
275
276       if self.SP_Verbosity.value()!=3 : self.commande+=' -v %d'%self.SP_Verbosity.value()
277       if self.SP_Memory.value()!=0 : self.commande+=' -m %d'%self.SP_Memory.value()
278
279       self.commande+=" "+self.fichierIn
280       return True
281
282   def clean(self):
283         self.RB_0.setChecked(True)
284         self.RB_G.setChecked(False)
285         self.RB_U.setChecked(False)
286         self.RB_S.setChecked(False)
287         self.RB_2.setChecked(False)
288         self.RB_1.setChecked(False)
289         self.RB_Absolute.setChecked(False)
290         self.RB_Relative.setChecked(True)
291         self.SP_Tolerance.setProperty("value", 0.1)
292         self.SP_Geomapp.setProperty("value", 0.04)
293         self.SP_Ridge.setProperty("value", 45.0)
294         self.SP_Gradation.setProperty("value", 1.3)
295         self.CB_Ridge.setChecked(True)
296         self.CB_Point.setChecked(True)
297         self.CB_SplitEdge.setChecked(False)
298         self.SP_MaxSize.setProperty("value", -2.0)
299         self.SP_MinSize.setProperty("value", -2.0)
300         self.SP_Verbosity.setProperty("value", 3)
301         self.SP_Memory.setProperty("value", 0)
302
303
304 __dialog=None
305 def getDialog():
306     """
307     This function returns a singleton instance of the plugin dialog.
308     c est obligatoire pour faire un show sans parent...
309     """
310     global __dialog
311     if __dialog is None:
312         __dialog = MonYamsPlugDialog()
313     #else :
314     #   __dialog.clean()
315     return __dialog
316