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