1 # -*- coding: iso-8859-1 -*-
2 # Copyright (C) 2011-2012 EDF R&D
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.
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.
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
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
20 # Author : Guillaume Boulant (EDF)
26 from salome.kernel import studyedit
27 from salome.gui.genericdialog import GenericDialog
28 from salome.gui import helper as guihelper
29 from salome.smesh.smeshstudytools import SMeshStudyTools
31 from omniORB import CORBA
33 from PyQt4.QtCore import QObject, SIGNAL, SLOT
34 from PyQt4.QtGui import QIcon, QStandardItemModel, QStandardItem, QMessageBox
36 from inputframe_ui import Ui_InputFrame
37 from inputdata import InputData
42 class InputDialog(GenericDialog):
44 TBL_HEADER_LABEL=["Input Mesh", "Output group name"]
46 def __init__(self, parent=None, name="InputDialog", modal=0):
48 This initializes a dialog windows to define the input data of
49 the plugin function. The input data consist in a list of
50 meshes characterizes each by a name, a pointer to the smesh
51 servant object, a type and a group name (see data model in the
54 GenericDialog.__init__(self, parent, name, modal)
55 # Set up the user interface from Designer.
56 self.__ui = Ui_InputFrame()
57 # BE CAREFULL HERE, the ui form is NOT drawn in the global
58 # dialog (already containing some generic widgets) but in the
59 # center panel created in the GenericDialog as a void
60 # container for the form. The InputFrame form is supposed
61 # here to create only the widgets to be placed in the center
62 # panel. Then, the setupUi function of this form draws itself
63 # in the specified panel, i.e. the panel returned by
65 self.__ui.setupUi(self.getPanel())
67 self.setWindowTitle("Specification of input files")
69 # The icon are supposed to be located in the plugin folder,
70 # i.e. in the same folder than this python module file
71 iconfolder=os.path.dirname(os.path.abspath(__file__))
73 icon.addFile(os.path.join(iconfolder,"select.png"))
74 self.__ui.btnSmeshObject.setIcon(icon)
76 icon.addFile(os.path.join(iconfolder,"addinput.png"))
77 self.__ui.btnAddInput.setIcon(icon)
79 icon.addFile(os.path.join(iconfolder,"deleteinput.png"))
80 self.__ui.btnDeleteInput.setIcon(icon)
82 # We specify here the items in the combo box (even if already
83 # defined in the designer) so that we can be sure of the item
85 self.MESHTYPE_ICONS = {}
86 meshTypeIndex = InputData.MESHTYPES.CONCRETE
87 self.__ui.cmbMeshType.setItemText(meshTypeIndex, "Béton")
89 icon.addFile(os.path.join(iconfolder,"concrete.png"))
90 self.__ui.cmbMeshType.setItemIcon(meshTypeIndex, icon)
91 self.MESHTYPE_ICONS[meshTypeIndex] = icon
93 meshTypeIndex = InputData.MESHTYPES.STEELBAR
94 self.__ui.cmbMeshType.setItemText(meshTypeIndex, "Acier")
96 icon.addFile(os.path.join(iconfolder,"steelbar.png"))
97 self.__ui.cmbMeshType.setItemIcon(meshTypeIndex, icon)
98 self.MESHTYPE_ICONS[meshTypeIndex] = icon
100 # The click on btnSmeshObject (signal clicked() emitted by the
101 # button btnSmeshObject) is connected to the slot
102 # onSelectSmeshObject, etc ...
103 self.connect(self.__ui.btnSmeshObject, SIGNAL('clicked()'), self.onSelectSmeshObject )
104 self.connect(self.__ui.btnAddInput, SIGNAL('clicked()'), self.onAddInput )
105 self.connect(self.__ui.btnDeleteInput, SIGNAL('clicked()'), self.onDeleteInput )
107 # Set up the model of the Qt table list
108 self.__inputModel = QStandardItemModel(0,2)
109 self.__inputModel.setHorizontalHeaderLabels(InputDialog.TBL_HEADER_LABEL)
110 self.__ui.tblListInput.setModel(self.__inputModel)
111 self.__ui.tblListInput.verticalHeader().hide()
112 self.__ui.tblListInput.horizontalHeader().setStretchLastSection(True)
113 # Note that the type is not display explicitly in the Qt table
114 # because it is specified using an icon on the text of the
117 # Note that PADDER does not support group name longer than 8
118 # characters. We apply then this limit in the gui field.
119 self.__ui.txtGroupName.setMaxLength(GROUPNAME_MAXLENGTH)
123 self.smeshStudyTool = SMeshStudyTools()
127 This function clears the data gui area and associated values.
129 self.__ui.txtSmeshObject.setText("")
130 self.__ui.txtGroupName.setText("")
131 self.__inputModel.clear()
132 self.__inputModel.setHorizontalHeaderLabels(InputDialog.TBL_HEADER_LABEL)
134 self.__ui.txtSmeshObject.setEnabled(False)
135 self.__ui.btnAddInput.setEnabled(False)
136 self.__selectedMesh = None
137 self.__dictInputData = {}
138 self.__nbConcreteMesh = 0
139 self.__nbSteelbarMesh = 0
143 This function is the slot connected to the button OK
145 # The dialog is raised in a non modal mode to get
146 # interactivity with the parents windows. Then we have to emit
147 # a signal to warn the parent observer that the dialog has
148 # been validated so that it can process the event
149 GenericDialog.accept(self)
151 self.emit(SIGNAL('inputValidated()'))
153 def onSelectSmeshObject(self):
155 This function is the slot connected on the mesh selection
156 button. It memorizes the selected mesh and put its name in the
157 text field of the dialog box.
159 mySObject, myEntry = guihelper.getSObjectSelected()
160 if CORBA.is_nil(mySObject):
161 self.__ui.txtSmeshObject.setText("You must choose a mesh")
162 self.__ui.txtGroupName.setText("")
163 self.__ui.txtSmeshObject.setEnabled(False)
164 self.__ui.btnAddInput.setEnabled(False)
165 self.__selectedMesh = None
168 self.smeshStudyTool.updateStudy(studyedit.getActiveStudyId())
169 self.__selectedMesh = self.smeshStudyTool.getMeshObjectFromSObject(mySObject)
170 if CORBA.is_nil(self.__selectedMesh):
171 self.__ui.txtSmeshObject.setText("The selected object is not a mesh")
172 self.__ui.txtGroupName.setText("")
173 self.__ui.txtSmeshObject.setEnabled(False)
174 self.__ui.btnAddInput.setEnabled(False)
175 self.__selectedMesh = None
177 myName = mySObject.GetName()
178 self.__ui.txtSmeshObject.setText(myName)
179 self.__ui.txtSmeshObject.setEnabled(True)
180 self.__ui.btnAddInput.setEnabled(True)
182 # We can suggest a default group name from the mesh name
183 self.__ui.txtGroupName.setText(myName)
185 def onAddInput(self):
187 This function is the slot connected to the Add button. It
188 creates a new entry in the list of input data, or updates this
189 entry if it already exists.
191 meshName = str(self.__ui.txtSmeshObject.text().trimmed())
192 meshObject = self.__selectedMesh
193 meshType = self.__ui.cmbMeshType.currentIndex()
194 groupName = str(self.__ui.txtGroupName.text().trimmed())
196 self.__addInputInGui(meshName, meshObject, meshType, groupName)
197 self.__addInputInMap(meshName, meshObject, meshType, groupName)
199 def __addInputInGui(self, meshName, meshObject, meshType, groupName):
201 This function adds an entry with the specified data int the
202 GUI table (for data visualization purpose).
204 # The mesh name is used as the key index in the model. We have
205 # to check first if this item already exists in the list.
206 tblItems = self.__inputModel.findItems(meshName)
207 row = self.__inputModel.rowCount()
210 tblItems.append(QStandardItem()) # input mesh name
211 tblItems.append(QStandardItem()) # output group name
213 row = tblItems[0].index().row()
214 tblItems.append(self.__inputModel.item(row,1))
216 tblItems[0].setText(meshName)
217 tblItems[0].setIcon(self.MESHTYPE_ICONS[meshType])
218 tblItems[1].setText(groupName)
219 self.__inputModel.setItem(row,0,tblItems[0])
220 self.__inputModel.setItem(row,1,tblItems[1])
221 self.__ui.tblListInput.setCurrentIndex(tblItems[0].index())
223 def __addInputInMap(self, meshName, meshObject, meshType, groupName):
225 This function adds an entry with the specified data in the
226 internal map (for data management purpose).
228 # if the entry already exists, we remove it to replace by a
230 if self.__dictInputData.has_key(meshName):
231 self.__delInputFromMap(meshName)
233 inputData = InputData()
234 inputData.meshName = meshName
235 inputData.meshObject = meshObject
236 inputData.meshType = meshType
237 inputData.groupName = groupName
238 # The key of the map is the mesh name
239 self.__dictInputData[meshName] = inputData
240 if inputData.meshType == InputData.MESHTYPES.CONCRETE:
241 self.__nbConcreteMesh += 1
243 self.__nbSteelbarMesh += 1
246 print "meshType = ",inputData.meshType
247 print "nb concrete mesh ",self.__nbConcreteMesh
248 print "nb steelbar mesh ",self.__nbSteelbarMesh
251 def onDeleteInput(self):
253 This function is the slot connected to the Delete button. It
254 remove from the data list the entry selected in the Qt table.
256 selectedIdx = self.__ui.tblListInput.selectedIndexes()
258 row = selectedIdx[0].row()
259 tblItem = self.__inputModel.item(row,0)
260 meshName = str(tblItem.text())
261 self.__inputModel.takeRow(row)
262 # Don't forget to remove this entry from the mesh object
263 # internal dictionnary
264 self.__delInputFromMap(meshName)
266 def __delInputFromMap(self, meshName):
268 This function removes the specified entry from the internal
269 map (for data management purpose)
271 inputData = self.__dictInputData.pop(meshName)
272 if inputData.meshType == InputData.MESHTYPES.CONCRETE:
273 self.__nbConcreteMesh -= 1
275 self.__nbSteelbarMesh -= 1
278 print "nb concrete mesh ",self.__nbConcreteMesh
279 print "nb steelbar mesh ",self.__nbSteelbarMesh
282 def setData(self, listInputData=[]):
284 This function fills the dialog widgets with values provided by
285 the specified data list.
288 for inputData in listInputData:
290 meshName = inputData.meshName
291 meshObject = inputData.meshObject
292 meshType = inputData.meshType
293 groupName = inputData.groupName
295 self.__addInputInGui(meshName, meshObject, meshType, groupName)
296 self.__addInputInMap(meshName, meshObject, meshType, groupName)
299 self.onSelectSmeshObject()
303 This function returns a list of InputData that corresponds to
304 the data in the dialog widgets of the current dialog.
306 # Note that the values() function returns a copy of the list
308 return self.__dictInputData.values()
312 This function checks if the data are valid, from the dialog
313 window point of view.
315 if self.__nbConcreteMesh < 1:
316 self.checkDataMessage = "You must define at least one CONCRETE mesh"
318 if self.__nbConcreteMesh > 1:
319 self.checkDataMessage = "You define multiple CONCRETE meshes."
320 self.checkDataMessage += "You should verify first that your version of PADDER support this configuration."
321 # just warn the user, but don't block
322 QMessageBox.information(self, "Info", self.checkDataMessage)
324 if self.__nbSteelbarMesh < 1:
325 self.checkDataMessage = "You must define at least one STEELBAR mesh"
330 # ==============================================================================
332 # ==============================================================================
334 def TEST_InputDialog():
336 from PyQt4.QtCore import QObject, SIGNAL, SLOT
337 from PyQt4.QtGui import QApplication
338 app = QApplication(sys.argv)
339 QObject.connect(app, SIGNAL("lastWindowClosed()"), app, SLOT("quit()"))
344 print "OK has been pressed"
346 def TEST_InputDialog_setData():
348 from PyQt4.QtCore import QObject, SIGNAL, SLOT
349 from PyQt4.QtGui import QApplication
350 app = QApplication(sys.argv)
351 QObject.connect(app, SIGNAL("lastWindowClosed()"), app, SLOT("quit()"))
355 from inputdata import InputData
356 inputData = InputData()
357 inputData.meshName = "myMesh"
358 inputData.meshObject = None
359 inputData.meshType = InputData.MESHTYPES.CONCRETE
360 inputData.groupName = "myGroup"
362 listInputData.append(inputData)
364 dlg.setData2(listInputData)
368 print "OK has been pressed"
369 outputListInputData = dlg.getData2()
370 print outputListInputData
373 if __name__ == "__main__":
375 TEST_InputDialog_setData()