1 """Copyright (C) 2016 Joakim A. Taby 3 This program is free software: you can redistribute it and/or modify 4 it under the terms of the GNU General Public License as published by 5 the Free Software Foundation, either version 3 of the License. 7 This program is distributed in the hope that it will be useful, 8 but WITHOUT ANY WARRANTY; without even the implied warranty of 9 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 10 GNU General Public License for more details. 12 You should have received a copy of the GNU General Public License 13 along with this program. If not, see <http://www.gnu.org/licenses/>.""" 17 from PySide
import QtGui, QtCore
19 from ui_mainwindow
import Ui_MainWindow, GenericTreeModel
32 Parent class for Pyflex. Data flow and Gui. 34 setupFullCalcResultsSignal = QtCore.Signal()
44 mainbox = QtGui.QHBoxLayout()
48 rightwidget = QtGui.QWidget()
50 leftwidget = QtGui.QWidget()
52 rightlayout = QtGui.QVBoxLayout()
54 leftlayout = QtGui.QVBoxLayout()
60 self.rightsplitter.setOrientation(QtCore.Qt.Vertical)
64 self.graphictab.setTabsClosable(tmp)
66 self.graphictab.hide()
67 self.graphictab.hid =
'yes' 70 self.edittab.setTabsClosable(tmp)
73 self.edittab.hid =
'yes' 75 self.leftsplitter.setOrientation(QtCore.Qt.Vertical)
83 self.rightsplitter.addWidget(self.
edittab)
84 self.mainsplitter.addWidget(leftwidget)
85 self.mainsplitter.addWidget(rightwidget)
86 rightwidget.setLayout(rightlayout)
87 leftwidget.setLayout(leftlayout)
90 self.main_frame.setLayout(mainbox)
123 if not os.path.exists(
'tmp'):
127 for f
in os.listdir(
'tmp'):
128 if fnmatch.fnmatch(f,
'fullresult*.h5'):
129 os.remove(os.path.join(
'tmp', f))
132 has_selection =
not self.view.selectionModel().selection().isEmpty()
133 self.removeRowAction.setEnabled(has_selection)
134 self.removeColumnAction.setEnabled(has_selection)
136 has_current = self.view.selectionModel().currentIndex().isValid()
137 self.insertRowAction.setEnabled(has_current)
138 self.insertColumnAction.setEnabled(has_current)
141 self.view.closePersistentEditor(self.view.selectionModel().currentIndex())
143 row = self.view.selectionModel().currentIndex().row()
144 column = self.view.selectionModel().currentIndex().column()
145 if self.view.selectionModel().currentIndex().parent().isValid():
146 self.statusBar().showMessage(
"Position: (%d,%d)" % (row, column))
148 self.statusBar().showMessage(
"Position: (%d,%d) in top level" % (row, column))
152 Method for context menu. Should allow for inserting context based info. 153 Need to be rewritten when first item is working. 154 :param position: self. mainWindow class containing a treeview and a model 156 self.tree_model.layoutChanged.emit()
158 indexes = self.view.selectedIndexes()
161 item = self.tree_model.getItem(index)
162 if index.column() == 0:
163 if item.itemData[0] ==
'Model data':
164 add_layer_action = menu.addAction(self.tr(
"Add layer"))
165 action = menu.exec_(self.view.viewport().mapToGlobal(position))
166 if action == add_layer_action:
168 self.tree_model.addLayer()
169 self.tree_model.updateModel()
170 elif item.itemData[0] ==
'Time history package':
171 plot_action = menu.addAction(self.tr(
"Plot the time histories"))
172 action = menu.exec_(self.view.viewport().mapToGlobal(position))
173 if action == plot_action:
174 item = self.tree_model.getItem(index)
175 for timehistInstance
in self.tree_model.timehists:
176 if item.itemData[1] == timehistInstance.name:
177 if self.graphictab.hid ==
'yes':
178 self.graphictab.show()
179 self.graphictab.hid =
'no' 181 elif item.itemData[0] ==
'Time history file':
182 plot_action = menu.addAction(self.tr(
"Plot the time histories"))
183 action = menu.exec_(self.view.viewport().mapToGlobal(position))
184 if action == plot_action:
185 item = self.tree_model.getItem(index)
186 for timehistInstance
in self.tree_model.timehists:
187 if item.itemData[1] == timehistInstance.name:
188 if self.graphictab.hid ==
'yes':
189 self.graphictab.show()
191 elif item.itemData[0] ==
'Calculations':
192 friction_action = menu.addAction(self.tr(
'Calculate friction importance'))
193 full_calc_action = menu.addAction(self.tr(
'Calculate stresses, including the friction effect'))
194 action = menu.exec_(self.view.viewport().mapToGlobal(position))
195 if action == friction_action:
197 if action == full_calc_action:
200 elif item.itemData[0] ==
'Friction calculation':
206 if hasattr(self.
friccalc,
'bendMax'):
209 edit_action = menu.addAction(self.tr(
'Edit'))
211 view_action = menu.addAction(self.tr(
'View resulttable'))
212 plot_action = menu.addAction(self.tr(
'View plot'))
213 action = menu.exec_(self.view.viewport().mapToGlobal(position))
214 if action == edit_action:
216 elif action == view_action:
218 elif action == plot_action:
221 elif item.itemData[0] ==
'Full stress calculation':
227 edit_action = menu.addAction(self.tr(
'Edit'))
229 view_action = menu.addAction(self.tr(
'View results'))
231 action = menu.exec_(self.view.viewport().mapToGlobal(position))
233 if action == edit_action:
235 elif action == view_action:
240 self.tree_model.addCalc(key=
'full')
249 self.fullstress.setup_tab(self)
250 self.edittab.addTab(self.fullstress.mainwidget,
'Full stress calc')
256 self.setupFullCalcResultsSignal.emit()
258 self.fullstress.calculate(self.tree_model.slenderdata)
259 for i
in self.fullstress.analyses:
261 self.fullstress.fullcalcShow =
'yes' 265 tabs = self.graphictab.count()
267 for index
in range(tabs):
268 text = self.graphictab.tabText(index)
269 if text ==
'Full calculation results':
278 for i
in self.fullstress.timehists:
280 if self.fullstress.canvas:
281 self.fullstress.deleteplot()
289 selection = self.fullResultView.selectionModel()
293 self.fullResultsExportButton.clicked.connect(self.fullstress.export_all_results)
299 self.graphictab.setCurrentIndex(tabs)
303 self.graphictab.setCurrentIndex(0)
306 self.graphictab.insertTab(index, self.
fullResultWidget,
'Full calculation results')
307 self.graphictab.setCurrentIndex(index)
310 tabs = self.graphictab.count()
311 for index
in range(tabs):
312 text = self.graphictab.tabText(index)
313 if text ==
'Full calculation results':
319 index = selected.indexes()
320 self.fullResultTree.toggle(index[0])
324 self.fullResultTree.add_result(number)
328 self.tree_model.addCalc(key=
'friction')
337 self.friccalc.setup_tab(self)
339 self.edittab.addTab(self.friccalc.mainwidget,
'Friction')
345 self.friccalc.calculate(self.tree_model.slenderdata)
351 tabs = self.graphictab.count()
353 for index
in range(tabs):
354 text = self.graphictab.tabText(index)
355 if text ==
'Friction calcs':
361 main_widget = QtGui.QWidget()
362 main_layout = QtGui.QVBoxLayout()
363 main_widget.setLayout(main_layout)
364 title = QtGui.QLabel(
'<H1> Friction calculations </H1>')
365 main_layout.addWidget(title)
366 table = self.friccalc.table()
367 main_layout.addWidget(table)
368 plot_button = QtGui.QPushButton(
'Plot the stress components')
369 plot_button.clicked.connect(self.
fricplot)
370 main_layout.addWidget(plot_button)
372 self.graphictab.addTab(main_widget,
'Friction calcs')
373 self.graphictab.setCurrentIndex(tabs)
376 self.graphictab.addTab(main_widget,
'Friction calcs')
377 self.graphictab.setCurrentIndex(0)
380 self.graphictab.insertTab(index, main_widget,
'Friction calcs')
381 self.graphictab.setCurrentIndex(index)
385 tabs = self.graphictab.count()
387 for index
in range(tabs):
388 text = self.graphictab.tabText(index)
389 if text ==
'Full calculation results':
397 self.graphictab.setCurrentIndex(index)
409 if hasattr(self.tree_model.slenderdata,
'lay_angle'):
411 for i
in self.tree_model.slenderdata.lay_angle:
413 if i > np.pi / 2
or i < -np.pi / 2:
414 print(
'The lay angle of layer %d needs to be in the range ' 415 '-pi/2<=layang <=pi/2' % count)
416 if hasattr(self.tree_model.slenderdata,
'layer_radii'):
417 for i
in range(len(self.tree_model.slenderdata.layer_radii) - 1):
418 if self.tree_model.slenderdata.layer_radii[i + 1] >= self.tree_model.slenderdata.layer_radii[i]:
419 print(
'In Pyflex we model from the outside inwards')
420 for i
in self.tree_model.slenderdata.layer_radii:
422 print(
'The radius of layer %d needs to be positive' % i)
423 if hasattr(self.tree_model.slenderdata,
'comp_number'):
425 for i
in self.tree_model.slenderdata.comp_number:
428 print(
'The number of tendons in layer %d must be more then 0.' 432 parentindex = self.tree_model.index(0, 0, QtCore.QModelIndex())
433 rows = self.tree_model.rowCount(parentindex)
434 for row
in range(rows):
435 index = self.tree_model.index(row, 0, parentindex)
437 itemtext = self.tree_model.data(index, QtCore.Qt.DisplayRole)
438 dataindex = self.tree_model.index(row, 1, parentindex)
439 itemdata = self.tree_model.data(dataindex, QtCore.Qt.DisplayRole)
440 if itemtext ==
'Data for layer':
441 subindex = int(itemdata) - 1
443 if itemtext ==
'Internal pressure layer':
444 self.tree_model.slenderdata.intpresslayer = int(float(itemdata))
445 if itemtext ==
'External pressure layer':
446 self.tree_model.slenderdata.extpresslayer = int(float(itemdata))
449 self.tree_model.updateModel()
450 self.tree_model.layoutChanged.emit()
454 rows = self.tree_model.rowCount(parentindex)
455 for row
in range(rows):
456 index = self.tree_model.index(row, 0, parentindex)
457 itemtext = self.tree_model.data(index, QtCore.Qt.DisplayRole)
458 dataindex = self.tree_model.index(row, 1, parentindex)
459 itemdata = self.tree_model.data(dataindex, QtCore.Qt.DisplayRole)
460 if itemtext ==
'Type':
461 if len(self.tree_model.slenderdata.layer_type) >= subindex + 1:
462 self.tree_model.slenderdata.layer_type[subindex] = itemdata
464 self.tree_model.slenderdata.layer_type.append(itemdata)
465 if itemtext ==
'Radius':
468 print(
'Only one radius allowed for a layer')
471 elif hasattr(item,
"__iter__"):
473 print(
"Only one radius allowed for a layer")
476 if len(self.tree_model.slenderdata.layer_radii) >= subindex + 1:
477 self.tree_model.slenderdata.layer_radii[subindex] = float(item)
479 self.tree_model.slenderdata.layer_radii.append(float(item))
481 if itemtext ==
'Thickness':
483 if hasattr(item,
"__iter__"):
485 print(
'Only one thickness allowed for a layer')
488 if len(self.tree_model.slenderdata.thickness) >= subindex + 1:
489 self.tree_model.slenderdata.thickness[subindex] = float(item)
491 self.tree_model.slenderdata.thickness.append(float(item))
493 if itemtext ==
'Initial gap':
494 item =
itemcheck(itemdata,
'Initial gap')
495 if hasattr(item,
"__iter__"):
497 print(
'Only one initial gap allowed for a layer')
500 if len(self.tree_model.slenderdata.gap_ini) >= subindex + 1:
501 self.tree_model.slenderdata.gap_ini[subindex] = float(item)
503 self.tree_model.slenderdata.gap_ini.append(float(item))
505 if itemtext ==
'Youngs modulus':
506 item =
itemcheck(itemdata,
'Youngs Modulus')
507 if hasattr(item,
"__iter__"):
509 print(
'Only one Youngs modulus allowed for a layer')
512 if len(self.tree_model.slenderdata.youngs_modulus) >= subindex + 1:
513 self.tree_model.slenderdata.youngs_modulus[subindex] = float(item)
515 self.tree_model.slenderdata.youngs_modulus.append(float(item))
517 if itemtext ==
"Poisson's ratio":
518 item =
itemcheck(itemdata,
"Poisson's ratio")
519 if hasattr(item,
"__iter__"):
521 print(
"Only one Poisson's ratio allowed for a layer")
524 if len(self.tree_model.slenderdata.poisson) >= subindex + 1:
525 self.tree_model.slenderdata.poisson[subindex] = float(item)
527 self.tree_model.slenderdata.poisson.append(float(item))
529 if itemtext ==
'Friction factor':
530 item =
itemcheck(itemdata,
'Friction factor')
531 if hasattr(item,
"__iter__"):
533 print(
'Only one friction factor allowed for a layer')
536 if len(self.tree_model.slenderdata.fricfac) >= subindex + 1:
537 self.tree_model.slenderdata.fricfac[subindex] = float(item)
539 self.tree_model.slenderdata.fricfac.append(float(item))
541 if itemtext ==
'Width':
543 if hasattr(item,
"__iter__"):
545 print(
'Only one width allowed for a layer')
548 if len(self.tree_model.slenderdata.width) >= subindex + 1:
549 self.tree_model.slenderdata.width[subindex] = float(item)
551 self.tree_model.slenderdata.width.append(float(item))
553 if itemtext ==
'Lay angle':
555 if hasattr(item,
"__iter__"):
557 print(
'Only one lay angle allowed for a layer')
560 if len(self.tree_model.slenderdata.lay_angle) >= subindex + 1:
561 self.tree_model.slenderdata.lay_angle[subindex] = float(item)
563 self.tree_model.slenderdata.lay_angle.append(float(item))
565 if itemtext ==
'Number of tendons':
566 item =
itemcheck(itemdata,
'Number of tendons')
567 if hasattr(item,
"__iter__"):
569 print(
'Only one number of tendons allowed for a layer')
572 if len(self.tree_model.slenderdata.comp_number) >= subindex + 1:
573 self.tree_model.slenderdata.comp_number[subindex] = float(item)
575 self.tree_model.slenderdata.comp_number.append(float(item))
578 parentindex = self.tree_model.index(1, 0, QtCore.QModelIndex())
579 rows = self.tree_model.rowCount(parentindex)
580 for row
in range(rows):
581 index = self.tree_model.index(row, 0, parentindex)
582 itemtext = self.tree_model.data(index, QtCore.Qt.DisplayRole)
583 dataindex = self.tree_model.index(row, 1, parentindex)
584 itemdata = self.tree_model.data(dataindex, QtCore.Qt.DisplayRole)
585 if itemtext ==
'Typical curvature':
586 item =
itemcheck(itemdata,
'Typical curvature')
587 if hasattr(item,
"__iter__"):
592 self.tree_model.slenderdata.typical_curvature = item
593 if itemtext ==
'Typical tension':
594 item =
itemcheck(itemdata,
'Typical tension')
595 if hasattr(item,
"__iter__"):
599 self.tree_model.slenderdata.typical_tension = item
600 if itemtext ==
'Internal pressure':
601 item =
itemcheck(itemdata,
'Internal pressure')
602 if hasattr(item,
"__iter__"):
606 self.tree_model.slenderdata.internal_pressure = item
609 foundglobaldata =
None 610 parentindex = QtCore.QModelIndex()
611 rows = self.tree_model.rowCount(parentindex)
612 for row
in range(rows):
613 index = self.tree_model.index(row, 0, parentindex)
614 itemtext = self.tree_model.data(index, QtCore.Qt.DisplayRole)
615 if itemtext ==
'Global results':
620 rows = self.tree_model.rowCount(index)
622 for row
in range(rows):
623 textindex = self.tree_model.index(row, 0, index)
624 dataindex = self.tree_model.index(row, 1, index)
625 itemtext = self.tree_model.data(textindex, QtCore.Qt.DisplayRole)
626 itemdata = self.tree_model.data(dataindex, QtCore.Qt.DisplayRole)
627 if itemtext ==
'Timehistories from directory':
628 subrows = self.tree_model.rowCount(textindex)
629 for subrow
in range(subrows):
630 sub_data_index = self.tree_model.index(subrow, 1, textindex)
631 itemdata = self.tree_model.data(sub_data_index, QtCore.Qt.DisplayRole)
632 self.tree_model.timehists[count].name = itemdata
635 self.tree_model.timehists[count].name = itemdata
641 managing menu selection. 643 self.exitAction.triggered.connect(QtGui.qApp.quit)
644 self.openAction.triggered.connect(self.
open)
646 self.importAction.triggered.connect(self.
import_ts)
648 self.aboutAction.triggered.connect(self.
license)
653 Setting up the left menu with its tree model. 654 Further items in left menu should be added here. 656 if hasattr(self,
'tree_model'):
660 self.leftsplitter.insertWidget(0, self.
view)
664 """Controls what is happening when opening a file. Reads it, parses it, and puts the data in a tree model""" 666 tmp = QtGui.QFileDialog.getOpenFileName(self, caption=
'Open File',
667 filter=
"PyFlex input files (*.dat);; Any files (*)",
668 selectedFilter=
"PyFlex input files (*.dat)")
679 '''Popup a box with about message.''' 680 QtGui.QMessageBox.about(self,
"About Pyflex v1.0",
681 """<p>Copyright © 2016 Joakim A Taby. 682 All rights reserved in accordance with 683 GPL v3 - NO WARRANTIES! 684 For full license click <a href='../docs/License/license.md'>here</a>""")
687 """Putting the input from input file into where it belongs""" 688 self.tree_model.updateModel()
691 """Controls what is happening when opening a file. Reads it, parses it, and puts the data in a tree model""" 693 tmp = QtGui.QFileDialog.getOpenFileName(self, caption=
'Open File',
694 filter=
"PyFlex time series files (*.tim);; Any files (*)",
695 selectedFilter=
"PyFlex time series files (*.tim)")
696 time_file_name = tmp[0]
697 file_name = re.split(
'[/\\\\]', time_file_name)[-1]
700 self.tree_model.timehists = []
702 self.tree_model.addTimeHist(file_name)
703 self.tree_model.layoutChanged.emit()
707 dialog = QtGui.QFileDialog()
708 dialog.setFileMode(QtGui.QFileDialog.Directory)
709 dialog.setOption(QtGui.QFileDialog.ShowDirsOnly)
710 directory = dialog.getExistingDirectory(self,
'Choose Directory', os.path.curdir)
712 filelist = os.listdir(directory)
716 self.tree_model.timehists = []
718 global_result_item = self.tree_model.addGlobalResults()
720 directory_parent = self.tree_model.addGlobalDirectory(global_result_item, directory)
721 for file
in filelist:
722 if file.endswith(
".tim"):
724 self.tree_model.timehists.append(
timehist.TimeHist(file, file, directory=directory))
725 self.tree_model.addTimeHist(file, parent=directory_parent)
726 self.tree_model.layoutChanged.emit()
730 Append red text to the QTextEdit. 731 :param text: text to write 733 text = text.replace(
"\r",
"")
734 text = text.replace(
"\n",
"")
737 self.message_pane.append(str(
'<font color="red">' + text +
'</font>'))
741 Append text to the QTextEdit. 742 :param text: text to add to QTextEdit 744 text = text.replace(
"\r",
"")
745 text = text.replace(
"\n",
"")
748 self.message_pane.append(self.message_pane.append(str(
'<font color="black">' + text +
'</font>')))
752 if self.graphictab.hid ==
'yes':
753 self.graphictab.show()
754 self.graphictab.hid =
'no' 757 widget = self.graphictab.widget(index)
758 self.graphictab.removeTab(index)
759 text = self.graphictab.tabText(index)
760 if text
in (
'Friction calcs',
'Plot of stresses from friction calculations'):
763 widget = self.graphictab.widget(0)
765 self.graphictab.hide()
766 self.graphictab.hid =
'yes' 769 widget = self.edittab.widget(index)
770 text = self.edittab.tabText(index)
771 if text ==
'Friction':
772 self.edittab.removeTab(index)
774 elif text ==
'Full stress calc':
775 self.edittab.removeTab(index)
777 self.edittab.removeTab(index)
781 widget = self.edittab.widget(0)
784 self.edittab.hid =
'yes' 789 if obj
is self.fullstress.mainwidget:
790 if event.type() == QtCore.QEvent.DragEnter:
791 if event.mimeData().hasFormat(
'text/plain'):
792 text = event.mimeData().data(
'text/plain')
794 text = text.split(
',')
795 if text[0]
in (
'singlefile',
'directory',
'singlefilefromdirectory'):
797 if event.type() == QtCore.QEvent.Drop:
798 if event.mimeData().hasFormat(
'text/plain'):
799 text = event.mimeData().data(
'text/plain')
800 text = text.split(
',')
801 dragdrop = self.fullstress.mainwidget.findChild(QtGui.QLabel,
'dragdrop')
802 if text[0]
in (
'singlefile',
'directory'):
803 self.
add_ts(text[0], text[1],
None, ts_type=
'full')
805 elif text[0] ==
'singlefilefromdirectory':
806 self.
add_ts(text[0], text[1], text[2], ts_type=
'full')
810 if obj
is self.friccalc.mainwidget:
811 if event.type() == QtCore.QEvent.DragEnter:
812 if event.mimeData().hasFormat(
'text/plain'):
813 text = event.mimeData().data(
'text/plain')
815 text = text.split(
',')
816 if text[0]
in (
'singlefile',
'singlefilefromdirectory'):
818 if event.type() == QtCore.QEvent.Drop:
819 if event.mimeData().hasFormat(
'text/plain'):
820 text = event.mimeData().data(
'text/plain')
821 text = text.split(
',')
822 dragdrop = self.friccalc.mainwidget.findChild(QtGui.QLabel,
'dragdrop')
823 if text[0] ==
'singlefilefromdirectory':
824 self.
add_ts(text[0], text[1], text[2], ts_type=
'friction')
826 elif text[0] ==
'singlefile':
827 self.
add_ts(text[0], text[1],
None, ts_type=
'friction')
832 def add_ts(self, import_type, info, directory, ts_type='full'):
835 import_type = str(import_type)
836 if import_type ==
'singlefile':
838 if import_type ==
'directory':
839 for i
in self.tree_model.timehists:
840 if hasattr(i,
'directory'):
841 if i.directory == info:
842 self.
append_ts(i.name, i.directory, ts_type)
844 if import_type ==
'singlefilefromdirectory':
846 if ts_type ==
'full':
847 self.fullstress.setup_ts_edit()
848 if ts_type ==
'friction':
849 self.friccalc.setup_ts_edit()
856 for i
in self.tree_model.timehists:
858 if ts_type ==
'full':
860 self.fullstress.add_ts(i)
863 elif hasattr(i,
'directory'):
864 if directory == i.directory:
865 self.fullstress.add_ts(i)
868 elif ts_type ==
'friction':
869 self.friccalc.add_ts(i)
872 print(
'Could not transfer data. Try again.')
877 """ class for making the items that constitutes the tree model. The items carries the data""" 879 def __init__(self, data, parent=None, finalRow=None, color=None):
893 if position < 0
or position > len(self.
childItems):
896 for row
in range(count):
898 data = [
None for v
in range(columns)]
900 item =
TreeItem(data, self, finalRow=finalRow + row - range(count)[0])
903 self.childItems.insert(position, item)
908 self.childItems.append(item)
929 if position < 0
or position + count > len(self.
childItems):
932 for row
in range(count):
933 self.childItems.pop(position)
939 return self.parentItem.childItems.index(self)
944 Method for setting data into given column. Should be used when setting data in model. 945 :param value: The value of the data to be written 946 :param column: Which column the data is to be written to 948 if column < 0
or column >= len(self.
itemData):
956 """ Special items for model data""" 957 def __init__(self, data, parent=None, finalRow=None, color=None,type=None,nopt=None):
958 super(ModelTreeItem, self).
__init__(data,parent=parent,finalRow=finalRow,color=color)
962 if type==
'presslayer':
964 self.
options=list(map(str, list(range(1,nopt+1))))
970 """Function for checking an item. returning something 971 Returning float of the input if one input. Returning a list if more inputs 972 :param item:The data to be checked 973 :param inputstring: The type of data to be checked. For output to user. 976 if isinstance(item, float):
978 elif (
not hasattr(item,
"strip")
and 979 hasattr(item,
"__getitem__")
or 980 hasattr(item,
"__iter__")):
983 for i
in range(len(item)):
989 except (TypeError, ValueError):
993 for t
in re.split(
',| ', item):
999 print(
'Cannot parse the ', inputstring,
' given')
1006 elif item[0]
is None:
1010 return float(item[0])
1013 print(
'Cannot parse the ', inputstring,
' given')
1022 print(
'Cannot parse the ', inputstring,
' given')
1025 if tab_widget.hid ==
'yes':
1026 tab_widget.hid =
'no' 1028 tabs = tab_widget.count()
1029 for index
in range(tabs):
1030 text = tab_widget.tabText(index)
1032 tab_widget.setCurrentIndex(index)
1038 """The model holding the connection between the items.""" 1041 super(TreeModel, self).
__init__(parent)
1048 Used to select the way each cell works 1049 :param index: the index of the item queried 1050 :return: view get info on items "Type" 1052 if not index.isValid():
1054 if index.column() > 0:
1056 itemtext = item.itemData[0]
1058 if itemtext
in (
'Calculations',
'Data for layer',
'Model data',
'Scenario definition'):
1059 return QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable
1061 return QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable
1065 return QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable
1067 return QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable
1071 return QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsDragEnabled
1073 return QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled
1078 return [
'text/plain']
1081 item = self.
getItem(indexes[0])
1082 if item.itemData[0] ==
'Time history package':
1083 mimedata = QtCore.QMimeData()
1084 mimedata.setData(
'text/plain',
'singlefile,%s' % item.itemData[1])
1085 elif item.itemData[0] ==
'Timehistories from directory':
1086 mimedata = QtCore.QMimeData()
1087 mimedata.setData(
'text/plain',
'directory,%s' % item.itemData[1])
1088 elif item.itemData[0] ==
'Time history file':
1089 mimedata = QtCore.QMimeData()
1090 mimedata.setData(
'text/plain',
'singlefilefromdirectory,%s,%s' 1091 % (item.itemData[1], item.parent().itemData[1]))
1098 """Model for updating the model with new slenderdata""" 1099 parentindex = self.
index(0, 0, QtCore.QModelIndex())
1108 self.
setSlenderData(self.slenderdata.intpresslayer, parentindex,
'Internal pressure layer')
1116 self.
setSlenderData(self.slenderdata.extpresslayer, parentindex,
'External pressure layer')
1120 if hasattr(self,
'timehists'):
1122 self.layoutChanged.emit()
1128 layers = self.slenderdata.num_layers()
1129 parentItem = self.
getItem(parentindex)
1132 for row
in range(rows):
1133 item = parentItem.child(row)
1135 if item.itemData[0] ==
'Data for layer':
1136 layerrows.append(row)
1138 if len(layerrows) > layers:
1140 for i
in range(len(layerrows) - 1, layers - 1, -1):
1141 self.
removeRows(layerrows[i], 1, parentindex)
1142 elif len(layerrows) < layers:
1144 row = layerrows[-1] + 1
1145 self.
insertRows(row, layers - len(layerrows), parentindex)
1147 for i
in range(layers - len(layerrows)):
1149 item = parentItem.child(row)
1150 item.setData(0,
'Data for layer')
1151 item.setData(1, len(layerrows) + i + 1)
1154 for i
in range(layers):
1155 layerparent = self.
index(layerrows[0] + i, 0, parentindex)
1157 if len(self.slenderdata.layer_type) >= i + 1:
1158 self.
setSlenderData(self.slenderdata.layer_type[i], layerparent,
'Type')
1162 if len(self.slenderdata.layer_radii) >= i + 1:
1163 self.
setSlenderData(self.slenderdata.layer_radii[i], layerparent,
'Radius')
1167 if len(self.slenderdata.layer_radii) >= i + 1:
1168 self.
setSlenderData(self.slenderdata.thickness[i], layerparent,
'Thickness')
1173 if len(self.slenderdata.gap_ini) >= i + 1:
1174 self.
setSlenderData(self.slenderdata.gap_ini[i], layerparent,
'Initial gap')
1178 if len(self.slenderdata.youngs_modulus) >= i + 1:
1179 self.
setSlenderData(self.slenderdata.youngs_modulus[i], layerparent,
'Youngs modulus')
1183 if len(self.slenderdata.poisson) >= i + 1:
1184 self.
setSlenderData(self.slenderdata.poisson[i], layerparent,
"Poisson's ratio")
1189 if len(self.slenderdata.fricfac) >= i + 1:
1190 self.
setSlenderData(self.slenderdata.fricfac[i], layerparent,
'Friction factor')
1194 if self.slenderdata.layer_type[i]==
'wires':
1195 if len(self.slenderdata.lay_angle) >= i + 1:
1196 self.
setSlenderData(self.slenderdata.lay_angle[i], layerparent,
'Lay angle')
1199 elif self.slenderdata.layer_type[i]==
'sheath':
1202 if self.slenderdata.layer_type[i]==
'wires':
1203 if len(self.slenderdata.comp_number) >= i + 1:
1204 self.
setSlenderData(self.slenderdata.comp_number[i], layerparent,
'Number of tendons')
1207 elif self.slenderdata.layer_type[i]==
'sheath':
1210 if self.slenderdata.layer_type[i]==
'wires':
1211 if len(self.slenderdata.lay_angle) >= i + 1:
1212 self.
setSlenderData(self.slenderdata.width[i], layerparent,
'Width')
1215 elif self.slenderdata.layer_type[i]==
'sheath':
1221 parentindex = self.
index(1, 0, QtCore.QModelIndex())
1222 if hasattr(self.
slenderdata,
'typical_curvature'):
1223 self.
setSlenderData(self.slenderdata.typical_curvature, parentindex,
'Typical curvature')
1225 self.
setSlenderData(self.slenderdata.typical_tension, parentindex,
'Typical tension')
1226 if hasattr(self.
slenderdata,
'internal_pressure'):
1227 self.
setSlenderData(self.slenderdata.internal_pressure, parentindex,
'Internal pressure')
1230 parentindex = QtCore.QModelIndex()
1232 for i
in range(rows):
1233 index = self.
index(i, 0, parentindex)
1234 itemtext = self.
data(index, QtCore.Qt.DisplayRole)
1235 if itemtext ==
'Global results':
1237 subParentItem = self.
getItem(subindex)
1242 except UnboundLocalError:
1243 parentItem = self.
getItem(parentindex)
1244 parentItem.appendChild(
TreeItem([
'Global results',
'' 1246 nchildren = parentItem.childCount()
1247 subParentItem = parentItem.child(nchildren - 1)
1248 subindex = self.
index(nchildren + 1, 0, parentindex)
1250 nchildren = subParentItem.childCount()
1252 for timehistory
in self.timehists:
1253 if hasattr(timehistory,
'directory'):
1254 nchildren = subParentItem.childCount()
1255 for i
in range(nchildren):
1256 tmp = subParentItem.child(i)
1257 if timehistory.directory == tmp.data(1):
1258 subSubParentItem = subParentItem.child(i)
1261 except UnboundLocalError:
1262 subParentItem.appendChild(
1263 TreeItem([
'Timehistories from directory', timehistory.directory], subParentItem))
1264 nchildren = subParentItem.childCount()
1265 subSubParentItem = subParentItem.child(nchildren - 1)
1267 for i
in range(subSubParentItem.childCount()):
1268 if timehistory.name == subSubParentItem.child(i).
data(1):
1271 subSubParentItem.appendChild(
TreeItem([
'Time history file', timehistory.name], subSubParentItem))
1276 for i
in range(subParentItem.childCount()):
1277 if timehistory.name == subParentItem.child(i).
data(1):
1280 subParentItem.appendChild(
TreeItem([
'Time history package', timehistory.name]
1286 :param data: the data to be inserted in the model 1287 :param parentindex: The index of the parent under which the data is to be put 1288 :param tag: The text that belongs to the data 1292 for row
in range(rows):
1293 index = self.
index(row, 0, parentindex)
1294 itemtext = self.
data(index, QtCore.Qt.DisplayRole)
1296 dataindex = self.
index(row, 1, parentindex)
1298 self.
setData(dataindex, str(data))
1299 elif isinstance(data, float):
1300 self.
setData(dataindex, str(data))
1301 elif isinstance(data, int):
1302 self.
setData(dataindex, str(data))
1303 elif isinstance(data, str):
1306 for i
in range(len(data)):
1308 datastr = str(data[i])
1311 datastr = datastr +
',' + str(data[i])
1313 self.
setData(dataindex, datastr)
1314 if tag ==
"Internal pressure layer" or tag ==
"External pressure layer":
1316 item.updateitemoptions(list(map(str, list(range(1,len(self.slenderdata.layer_radii)+1)))))
1321 parentItem = self.
getItem(parentindex)
1322 if data
is None or data ==
'None':
1323 dataindex = self.
index(rows + 1, 1, parentindex)
1326 elif isinstance(data, float):
1328 elif isinstance(data, str):
1330 elif isinstance(data, int):
1333 for i
in range(len(data)):
1335 datastr = str(data[i])
1338 datastr = datastr +
',' + str(data[i])
1342 parentItem.appendChild(
ModelTreeItem([tag, datastr], parentItem,type=
'combo'))
1343 elif tag ==
"Internal pressure layer":
1344 parentItem.appendChild(
ModelTreeItem([tag, datastr], parentItem,type=
'presslayer',
1345 nopt=len(self.slenderdata.layer_radii)))
1346 elif tag ==
"External pressure layer":
1347 parentItem.appendChild(
ModelTreeItem([tag, datastr], parentItem,type=
'presslayer',
1348 nopt=len(self.slenderdata.layer_radii)))
1350 parentItem.appendChild(
ModelTreeItem([tag, datastr], parentItem))
1352 dataindex = self.
index(rows + 1, 1, parentindex)
1357 for row
in range(rows):
1358 index = self.
index(row, 0, parentindex)
1359 itemtext = self.
data(index, QtCore.Qt.DisplayRole)
1361 self.
getItem(parentindex).removeChildren(row,1)
1366 self.slenderdata.layer_type.append(
'wires')
1367 self.slenderdata.layer_radii.append(0.0)
1368 self.slenderdata.thickness.append([0.0])
1369 self.slenderdata.gap_ini.append([0.0])
1370 self.slenderdata.youngs_modulus.append(0.0)
1371 self.slenderdata.poisson.append(0.0)
1372 self.slenderdata.fricfac.append(0.0)
1373 self.slenderdata.lay_angle.append(0.0)
1374 self.slenderdata.comp_number.append(0.0)
1375 self.slenderdata.width.append(0.0)
1380 subParentItem.appendChild(
TreeItem([
'Time history package', name]
1383 parent.appendChild(
TreeItem([
'Time history file', name]
1387 parentindex = QtCore.QModelIndex()
1390 for row
in range(rows):
1391 index = self.
index(row, 0, parentindex)
1392 itemtext = self.
data(index, QtCore.Qt.DisplayRole)
1393 if itemtext ==
'Global results':
1395 subParentItem = self.
getItem(subindex)
1400 except UnboundLocalError:
1401 parentItem = self.
getItem(parentindex)
1402 parentItem.appendChild(
TreeItem([
'Global results',
'' 1404 nchildren = parentItem.childCount()
1405 subParentItem = parentItem.child(nchildren - 1)
1407 return subParentItem
1411 :param name: Nema of the timehist 1412 :return: the index in which has the same name, None is returned if not found 1414 for i
in range(len(self.timehists)):
1415 if self.timehists[i].name == name:
1421 parentItem.appendChild(
TreeItem([
'Timehistories from directory', directory
1423 nchildren = parentItem.childCount()
1424 return parentItem.child(nchildren - 1)
1427 if key ==
'friction':
1428 text =
"Friction calculation" 1429 data =
"To check importance of friction" 1431 text =
'Full stress calculation' 1434 print(
'Error adding calculation to tree model')
1435 parentindex = QtCore.QModelIndex()
1438 for row
in range(rows):
1439 index = self.
index(row, 0, parentindex)
1440 itemtext = self.
data(index, QtCore.Qt.DisplayRole)
1441 if itemtext ==
'Calculations':
1443 subrows = self.
rowCount(parentindex)
1444 for subrow
in range(subrows):
1445 index = self.
index(subrow, 0, parentindex)
1446 itemtext = self.
data(index, QtCore.Qt.DisplayRole)
1448 if itemtext == text:
1452 parentItem = self.
getItem(parentindex)
1454 parentItem.appendChild(
TreeItem([text, data]
1456 self.layoutChanged.emit()
1459 """ method that find out is any forefather has the given text in its first column 1460 :param index: The index of the item in question. 1461 :param parenttext: the text to be searched for in forefathers""" 1463 parentIndex = self.
parent(index)
1464 if parentIndex == QtCore.QModelIndex():
1466 item = self.
getItem(parentIndex)
1467 itemtext = item.itemData[0]
1468 if itemtext == parenttext:
1476 """ used to set up the model. should be rewritten to use data or setdata to avoid duplication. 1477 :param parent: The root item in all cases 1482 parents[0].appendChild(
TreeItem([
'Model data',
'Containing the model'], parents[0]))
1483 parents.append(parents[-1].child(parents[-1].childCount() - 1))
1486 for i
in range(len(self.slenderdata.layer_radii)):
1489 parents[1].appendChild(
TreeItem([
'Data for layer', i + 1], parents[1]))
1490 parents.append(parents[-1].child(parents[-1].childCount() - 1))
1492 parents[2].appendChild(
ModelTreeItem([
'Type', str(self.slenderdata.layer_type[i])], parents[2],type=
'combo'))
1495 parents[2].appendChild(
TreeItem([
'Radius', str(self.slenderdata.layer_radii[i])], parents[2]))
1498 parents[2].appendChild(
TreeItem([
'Thickness', str(self.slenderdata.thickness[i])], parents[2]))
1501 parents[2].appendChild(
TreeItem([
'Initial gap', str(self.slenderdata.thickness[i])], parents[2]))
1504 parents[2].appendChild(
1505 TreeItem([
'Youngs modulus', str(self.slenderdata.youngs_modulus[i])], parents[2]))
1508 parents[2].appendChild(
1509 TreeItem([
"Poisson's ratio", str(self.slenderdata.poisson[i])], parents[2]))
1512 parents[2].appendChild(
TreeItem([
'Friction factor', str(self.slenderdata.fricfac[i])], parents[2]))
1515 if self.slenderdata.layer_type[i]==
'wires':
1518 parents[2].appendChild(
TreeItem([
'Lay angle', str(self.slenderdata.lay_angle[i])], parents[2]))
1521 parents[2].appendChild(
1522 TreeItem([
'Number of tendons', str(self.slenderdata.comp_number[i])], parents[2]))
1525 parents[2].appendChild(
TreeItem([
'Width', str(self.slenderdata.thickness[i])], parents[2]))
1530 parents[1].appendChild(
ModelTreeItem([
'Internal pressure layer', str(self.slenderdata.intpresslayer)],
1531 parents[1],type=
'presslayer',nopt=len(self.slenderdata.layer_radii)))
1532 parents[1].appendChild(
ModelTreeItem([
'External pressure layer', str(self.slenderdata.extpresslayer)],
1533 parents[1],type=
'presslayer',nopt=len(self.slenderdata.layer_radii)))
1536 parents[0].appendChild(
TreeItem([
'Scenario definition',
'Used for checking assumptions'], parents[0]))
1537 parents.append(parents[0].child(parents[0].childCount() - 1))
1539 parents[1].appendChild(
TreeItem([
'Typical tension', str(self.slenderdata.typical_tension)], parents[1]))
1540 if hasattr(self.
slenderdata,
'typical_curvature'):
1541 parents[1].appendChild(
TreeItem([
'Typical curvature', str(self.slenderdata.typical_curvature)], parents[1]))
1542 if hasattr(self.
slenderdata,
'internal_pressure'):
1543 parents[1].appendChild(
TreeItem([
'Internal pressure', str(self.slenderdata.internal_pressure)], parents[1]))
1544 parents[0].appendChild(
TreeItem([
'Calculations',
''], parents[0]))
1548 super(FullResultTreeModel, self).
__init__(parent)
1558 item = self.rootItem.child(number)
1559 fname =
'tmp/fullresult_' + str(number) +
'.h5' 1560 f = h5py.File(fname,
'r') 1561 layer_groups = f[self.names[number] + '/AxialStress']
1562 layers = len(layer_groups)
1564 for i
in range(layers):
1565 item.appendChild(
TreeItem([
'No',
'Layer number %d' % (i + 1)], item))
1566 subitem = item.child(i)
1567 subitem.appendChild(
TreeItem([
'No',
'Axial stress'], subitem))
1569 subitem.appendChild(
TreeItem([
'No',
'Local bending stress'], subitem))
1570 subsubitem = subitem.child(-1)
1571 ntheta = f[self.
names[number] +
'/LocalBendingStress'][str(i)].shape[1]
1572 for j
in range(ntheta):
1574 subsubitem.appendChild(
TreeItem([
'No',
'Theta = %f' % float(float(j) * 2 * np.pi /
1575 float(ntheta))], subsubitem))
1576 if f[self.
names[number] +
'/LocalBendingStress'][str(i)].ndim==3:
1577 subsubsubitem = subsubitem.child(j)
1578 nphi = f[self.
names[number] +
'/LocalBendingStress'][str(i)].shape[2]
1579 for k
in range(nphi):
1582 subsubsubitem.appendChild(
TreeItem([
'No',
'Corner number = %d' % (k + 1)], subsubsubitem))
1586 subsubsubitem.appendChild(
TreeItem([
'No',
'Phi = %f' % float(float(k) * 2 * np.pi /
1587 float(nphi))], subsubsubitem))
1589 if f[self.
names[number] +
'/LocalBendingStress'][str(i)].ndim==3:
1590 subitem.appendChild(
TreeItem([
'No',
'Friction stress'], subitem))
1591 subsubitem = subitem.child(-1)
1593 for j
in range(ntheta):
1594 subsubitem.appendChild(
TreeItem([
'No',
'Theta = %f' % float(float(j) * 2 * np.pi /
1595 float(ntheta))], subsubitem))
1597 subitem.appendChild(
TreeItem([
'No',
'Stress resultant'], subitem))
1599 subsubitem = subitem.child(-1)
1600 ntheta = f[self.
names[number] +
'/StressResultant'][str(i)].shape[1]
1601 for j
in range(ntheta):
1603 subsubitem.appendChild(
TreeItem([
'No',
'Theta2 = %f' % float(float(j) * 2 * np.pi /
1604 float(ntheta))], subsubitem))
1605 if f[self.
names[number] +
'/LocalBendingStress'][str(i)].ndim==3:
1606 subsubsubitem = subsubitem.child(j)
1607 nphi = f[self.
names[number] +
'/StressResultant'][str(i)].shape[2]
1608 for k
in range(nphi):
1611 subsubsubitem.appendChild(
TreeItem([
'No',
'Corner number = %d' % (k + 1)], subsubsubitem))
1615 subsubsubitem.appendChild(
TreeItem([
'No',
'Phi = %f' % float(float(k) * 2 * np.pi /
1616 float(nphi))], subsubsubitem))
1618 if f[self.
names[number] +
'/LocalBendingStress'][str(i)].ndim==3:
1619 subitem.appendChild(
TreeItem([
'No',
'Critical curvature'], subitem))
1620 subitem.appendChild(
TreeItem([
'No',
'Stick stress'], subitem))
1622 self.layoutChanged.emit()
1627 Used to select the way each cell works 1628 :param index: the index of the item queried 1629 :return: view get info on items "Type" 1631 if not index.isValid():
1633 if index.column() == 0:
1634 return QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEnabled
1639 """method for toggling, changing color of the recursive selection and reporting back which lines that are, 1640 added removed and the color of the added lines 1641 :param index: the index of the item being toggled 1648 if item.itemData[0] ==
'No':
1650 elif item.itemData[0] ==
'Yes':
1652 elif item.itemData[0] ==
'Partly':
1655 print(
'Internal error, unknown toggle state in result tree.')
1658 for i
in range(len(colorlist)):
1659 self.colorIndexTaken.append(0)
1661 self.
toggler(index, finalstate, colorlist)
1664 """toggles index including children, and build info for plotting 1665 :param colorlist: list of colors applied in plot and tree_model 1666 :param finalstate: The selected items final state (Yes or No) 1667 :param index: the index of the item selected 1674 item.setData(0, finalstate)
1675 siblingnumber = [item.row()]
1677 item = item.parent()
1678 if hasattr(self,
'plotData'):
1682 while item.parent():
1684 siblingnumber.append(item.row())
1687 for i
in range(item.childCount()):
1688 if item.child(i).itemData[0] ==
'No':
1690 elif item.child(i).itemData[0] ==
'Yes':
1692 elif item.child(i).itemData[0] ==
'Partly':
1697 item.setData(0,
'Partly')
1699 item.setData(0,
'Yes')
1701 item.setData(0,
'No')
1702 item = item.parent()
1706 treedata = [item.itemData[1]]
1707 for i
in range(len(siblingnumber) - 1):
1708 item = item.child(siblingnumber[-(i + 2)])
1709 treedata.append(item.itemData[1])
1711 level = len(treedata)
1712 print(
'children', item.childCount())
1713 if item.childCount() > 0:
1714 self.
recursiveplot(item, colorlist, treedata, level, finalstate)
1716 self.
singleplot(treedata, colorlist, finalstate, item)
1718 self.layoutChanged.emit()
1721 print(
'len(treeData', len(treedata))
1722 if len(treedata) == 3:
1723 if finalstate ==
'Yes':
1726 elif finalstate ==
'No':
1729 if len(treedata) == 4:
1730 if finalstate ==
'Yes':
1733 elif finalstate ==
'No':
1736 if len(treedata) == 5:
1737 if finalstate ==
'Yes':
1741 elif finalstate ==
'No':
1744 if finalstate ==
'Yes':
1745 item.setColor(self.
plotData[-1].color)
1746 elif finalstate ==
'No':
1752 children = item.childCount()
1753 for i
in range(children):
1755 data = treedata[0:level]
1758 subitem = item.child(i)
1759 data.append(subitem.itemData[1])
1760 subitem.setData(0, finalstate)
1761 if subitem.childCount() > 0:
1762 self.
recursiveplot(subitem, colorlist, data, level, finalstate)
1764 self.
singleplot(data, colorlist, finalstate, subitem)
1768 return [(103, 0, 13), (63, 0, 125), (127, 39, 4), (0, 68, 27), (8, 48, 107), (165, 15, 21), (84, 39, 143),
1769 (166, 54, 3), (0, 109, 44), (8, 81, 156), (203, 24, 29), (106, 81, 163), (217, 72, 1),
1770 (35, 139, 69), (33, 113, 181), (239, 59, 44), (128, 125, 186), (241, 105, 19), (65, 171, 93),
1771 (66, 146, 198), (251, 106, 74), (158, 154, 200), (253, 141, 60), (116, 196, 118), (107, 174, 214),
1772 (252, 146, 114), (188, 189, 220), (253, 174, 107), (161, 217, 155), (158, 202, 225)]
1775 """ Do not know. called by the view to get hold of the data I believe 1776 :param index: the index 1777 :param role: the role 1778 :return:the data in display friendly mode 1780 if not index.isValid():
1782 if role == QtCore.Qt.DisplayRole:
1783 item = index.internalPointer()
1784 return item.data(index.column())
1786 if role == QtCore.Qt.ForegroundRole:
1787 item = index.internalPointer()
1789 color = item.Color()
1791 return QtGui.QColor.fromRgb(int(color[0]), int(color[1]), int(color[2]))
1794 if role == QtCore.Qt.TextColorRole:
1795 return QtCore.Qt.blue
1802 app = QtGui.QApplication(sys.argv)
1805 sys.exit(app.exec_())
1807 if __name__ ==
'__main__':
def setupUi(self, MainWindow)
def close_edittab(self, index)
def recParentValidate(self, index, parenttext)
def data(self, index, role)
def setData(self, column, value)
def eventFilter(self, obj, event)
def __init__(self, parent=None)
def treemodel_setup(self)
def analytical_input(inputfile, delimiter, commentchar)
def add_frictioncalc(self)
def toggler(self, index, finalstate, colorlist)
def calculate_friction(self)
def remove_fullcalc_result(self)
def findTimehist(self, name)
def __init__(self, parent=None)
def errorhandling(self, text)
def removeRows(self, position, rows, parent=QtCore.QModelIndex())
def messagehandling(self, text)
def setup_fullcalc_results(self)
def updateTimehistoryModel(self)
def removeChildren(self, position, count)
def add_result(self, number)
def update_globaldata(self)
def mimeData(self, indexes)
def singleplot(self, treedata, colorlist, finalstate, item)
def setupModelData(self, parent)
def __init__(self, data, parent=None, finalRow=None, color=None)
def setColor(self, color)
def addCalc(self, key='friction')
def itemcheck(item, inputstring)
def import_ts_folder(self)
def rowCount(self, parent)
def close_graphictab(self, index)
def add_ts(self, import_type, info, directory, ts_type='full')
def setSlenderData(self, data, parentindex, tag)
def update_scenariodata(self)
def updateitemoptions(self, options)
def open_context_menu(self, position)
def data(self, index, role)
def append_ts(self, name, directory, ts_type='full')
def show_graphictab(self)
def addGlobalDirectory(parentItem, directory)
def addGlobalResults(self)
def setData(self, index, value, role=QtCore.Qt.EditRole)
def add_fullcalc_results(self, number)
def index(self, row, column, parent)
def recursiveplot(self, item, colorlist, treedata, level, finalstate)
def addTimeHist(self, name, parent=None)
def removeSlenderData(self, parentindex, tag)
def update_slenderdata(self)
def insertRows(self, position, rows, parent=QtCore.QModelIndex())
def insertChildren(self, position, count, columns, finalRow=None)
def update_layerdata(self, subindex, parentindex)
def show_full_results(self)
def update_fullplot(self, selected)
def __init__(self, names, parent=None)
def updateLayermodel(self, parentindex)
def __init__(self, data, parent=None, finalRow=None, color=None, type=None, nopt=None)
def appendChild(self, item)
def open_tab(tab_widget, intext)
def updateScenarioModel(self)
def show_friction_results(self)