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