qt.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. # -*- coding: utf-8 -*-
  2. import logging
  3. import math
  4. from PyQt4 import QtGui, QtCore
  5. import numpy as np
  6. class QTLoggingHandler(logging.Handler):
  7. def __init__(self, signal):
  8. logging.Handler.__init__(self)
  9. self.level = logging.DEBUG
  10. formatter = logging.Formatter("%(asctime)s.%(msecs)03d "
  11. "%(name)s %(levelname)s %(message)s",
  12. "%H:%M:%S")
  13. self.setFormatter(formatter)
  14. self.signal = signal
  15. def emit(self, record):
  16. msg = self.format(record)
  17. self.signal.emit(msg)
  18. class MaterialModel(QtCore.QAbstractTableModel):
  19. def __init__(self, materials, parent=None):
  20. QtCore.QAbstractTableModel.__init__(self, parent)
  21. self.materials = materials.values()
  22. self.matnames = materials.keys()
  23. self.onChange = None
  24. def rowCount(self, parent=None):
  25. return len(self.materials)
  26. def columnCount(self, parent=None):
  27. return 4
  28. def flags(self, idx):
  29. baseflags = QtCore.QAbstractTableModel.flags(self, idx)
  30. if idx.column() in (1, 2):
  31. return baseflags | QtCore.Qt.ItemIsEditable
  32. else:
  33. return baseflags
  34. def headerData(self, section, orientation, role=QtCore.Qt.DisplayRole):
  35. if role == QtCore.Qt.DisplayRole:
  36. if orientation == QtCore.Qt.Horizontal:
  37. if section == 0:
  38. return 'name'
  39. elif section == 1:
  40. return 'reflection'
  41. elif section == 2:
  42. return 'refraction'
  43. elif section == 3:
  44. return 'ior'
  45. def data(self, index, role=QtCore.Qt.DisplayRole):
  46. if index.isValid() and role == QtCore.Qt.DisplayRole:
  47. row = index.row()
  48. col = index.column()
  49. v = None
  50. if col == 0:
  51. v = self.matnames[row]
  52. elif col == 1:
  53. v = self.materials[row].reflect
  54. elif col == 2:
  55. v = self.materials[row].alpha
  56. elif col == 3:
  57. v = self.materials[row].ior
  58. if v is not None:
  59. return QtCore.QVariant(v)
  60. return QtCore.QVariant()
  61. def setData(self, index, value, role=QtCore.Qt.DisplayRole):
  62. if index.isValid():
  63. row = index.row()
  64. col = index.column()
  65. value = float(value.toString())
  66. if col == 1:
  67. self.materials[row].reflect = value
  68. elif col == 2:
  69. self.materials[row].alpha = value
  70. self.onChange()
  71. return True
  72. class NumpyModel(QtCore.QAbstractTableModel):
  73. def __init__(self, narray, offset, mode, parent=None):
  74. QtCore.QAbstractTableModel.__init__(self, parent)
  75. self._array = narray
  76. self._offset = offset
  77. # either 'raw' for raw data in milliwatt? (very small doubles, unsmothed
  78. # or 'descibel' for
  79. self.mode = mode
  80. self.SOURCE_POWER = 1.0
  81. def rowCount(self, parent=None):
  82. return self._array.shape[0]
  83. def columnCount(self, parent=None):
  84. return self._array.shape[1]
  85. def headerData(self, section, orientation, role=QtCore.Qt.DisplayRole):
  86. if role == QtCore.Qt.DisplayRole:
  87. if orientation == QtCore.Qt.Horizontal:
  88. s = "%d" % (self._offset[0] + section)
  89. else:
  90. s = "%d" % (self._offset[1] + section)
  91. return QtCore.QVariant(s)
  92. else:
  93. return QtCore.QVariant()
  94. def _format(self, v):
  95. if np.isnan(v):
  96. return ''
  97. elif v == 0:
  98. return '0'
  99. if self.mode == 'decibel_from_raw':
  100. return '%.1f' % v
  101. elif self.mode == 'raw':
  102. return '%.1e' % v
  103. elif self.mode == 'smoothed':
  104. return str(v)
  105. else:
  106. return self.mode
  107. def data(self, index, role=QtCore.Qt.DisplayRole):
  108. if index.isValid():
  109. if role == QtCore.Qt.DisplayRole:
  110. row = index.row()
  111. col = index.column()
  112. v = self._array[row, col]
  113. #~ return QtCore.QVariant("%.5f" %self._array[row, col])
  114. if self.mode == 'decibel_from_raw':
  115. if v > 0:
  116. v = 10 * math.log10(v / self.SOURCE_POWER)
  117. else:
  118. v = -200
  119. return QtCore.QVariant(self._format(v))
  120. return QtCore.QVariant()