nixview-python/nixview/data_models/table_model.py

124 lines
5.1 KiB
Python

from IPython.terminal.embed import embed
from nixview.util.file_handler import FileHandler
from PyQt5.QtCore import QAbstractTableModel, Qt
import numpy as np
from nixview.util.enums import NodeType
from IPython import embed
class TableModel (QAbstractTableModel):
def __init__(self, file_handler, data_view, page=0, parent=None) -> None:
super(TableModel, self).__init__(parent)
self._file_handler = file_handler
self._data_view = data_view
self._page = page
self._dim_count = data_view.dimension_count
self._item = self._data_view.item
self._dimension_descriptors = self._file_handler.request_dimensions(self._data_view.item.block_id, self._data_view.item.id)
self._dimension_tooltips = [self.dimension_tool_tip(i) for i in range(self._dim_count)]
self._data_tooltip = self.create_data_tooltip()
self._cols = self._data_view.full_shape[1] if len(self._data_view.full_shape) > 1 else 1
self._rows = self._data_view.full_shape[0]
self.insertColumns(0, self._cols)
self.insertRows(0, self._rows)
self._slice = [0 for i in range(len(self._data_view.full_shape))]
if len(self._data_view.full_shape) > 2:
self._slice[-1] = self._page
self.createHeader()
def create_data_tooltip(self):
label = self._item.label if self._item.label is not None else ""
unit = "[%s]" % self._item.unit if self._item.unit is not None else ""
return "%s %s" % (label, unit)
def rowCount(self, parent):
return self._rows
def columnCount(self, parent):
return self._cols
def dimension_tool_tip(self, index):
label = self._dimension_descriptors[index].label if self._dimension_descriptors[index].label is not None else ""
unit = "[%s]" % self._dimension_descriptors[index].unit if self._dimension_descriptors[index].unit is not None else ""
return "%s %s" % (label, unit)
def convert_axis_to_string(self, axis):
is_numeric = False
try:
float(axis[0])
is_numeric = True
except:
pass
if is_numeric:
axis = np.round(np.asarray(axis, dtype=float), 5)
return list(map(str, axis))
else:
return axis
def createHeaderDataArray(self):
if self._dim_count == 1:
temp = self._file_handler.request_axis(self._data_view.item.block_id,
self._data_view.item.id, 0,
self.rowCount(None))
self._vheader = self.convert_axis_to_string(temp)
self._hheader = ["1"]
elif self._dim_count > 1:
temp = self._file_handler.request_axis(self._data_view.item.block_id,
self._data_view.item.id, 0,
self.rowCount(None))
self._vheader = self.convert_axis_to_string(temp)
temp = self._file_handler.request_axis(self._data_view.item.block_id,
self._data_view.item.id, 1,
self.columnCount(None))
self._hheader = self.convert_axis_to_string(temp)
def createHeader(self):
if self._data_view.item.entity_type == NodeType.DataArray:
self.createHeaderDataArray()
else:
self._vheader = np.arange(self.rowCount(None))
self._hheader = np.arange(self.columnCount(None))
"""
if (array.getDimension(1).dimensionType() == nix::DimensionType::Set) {
v_labels = array.getDimension(1).asSetDimension().labels();
}
if (shape.size() > 1) {
if (array.getDimension(2).dimensionType() == nix::DimensionType::Set) {
h_labels = array.getDimension(2).asSetDimension().labels();
}
}
"""
def data(self, index, role):
if not index.isValid() or (role != Qt.DisplayRole and role != Qt.ToolTipRole):
return None
if role == Qt.ToolTipRole:
return self._data_tooltip
d = ""
if (index.row() < self._rows) and (index.column() < self._cols):
self._slice[0] = index.row()
if len(self._slice) == 2:
self._slice[1] = index.column()
d = self._data_view._buffer[tuple(self._slice)]
return str(np.round(d, 5))
def headerData(self, section, orientation, role=Qt.DisplayRole):
if role != Qt.DisplayRole and role != Qt.ToolTipRole:
return super().headerData(section, orientation, role)
if role == Qt.DisplayRole:
if orientation == Qt.Vertical:
return self._vheader[section]
else:
return self._hheader[section]
if role == Qt.ToolTipRole:
if orientation == Qt.Vertical:
return self._dimension_tooltips[0]
else:
return self._dimension_tooltips[1] if self._dim_count > 1 else self._data_tooltip