kopia lustrzana https://github.com/NanoVNA-Saver/nanovna-saver
chart refactoring
rodzic
faf983c196
commit
91baa22a14
|
@ -16,71 +16,81 @@
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
# along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
import math
|
|
||||||
from typing import List, Set, Tuple
|
|
||||||
import logging
|
import logging
|
||||||
|
import math
|
||||||
|
|
||||||
|
from dataclasses import dataclass
|
||||||
|
from typing import List, Set, Tuple, ClassVar
|
||||||
|
|
||||||
from PyQt5 import QtWidgets, QtGui, QtCore
|
from PyQt5 import QtWidgets, QtGui, QtCore
|
||||||
from PyQt5.QtCore import pyqtSignal
|
from PyQt5.QtCore import pyqtSignal
|
||||||
|
|
||||||
from NanoVNASaver.RFTools import Datapoint
|
from NanoVNASaver.RFTools import Datapoint
|
||||||
from NanoVNASaver.Marker import Marker
|
from NanoVNASaver.Marker import Marker
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
@dataclass
|
||||||
class Chart(QtWidgets.QWidget):
|
class Chart(QtWidgets.QWidget):
|
||||||
sweepColor = QtCore.Qt.darkYellow
|
|
||||||
secondarySweepColor = QtCore.Qt.darkMagenta
|
|
||||||
referenceColor: QtGui.QColor = QtGui.QColor(QtCore.Qt.blue)
|
|
||||||
referenceColor.setAlpha(64)
|
|
||||||
secondaryReferenceColor: QtGui.QColor = QtGui.QColor(QtCore.Qt.blue)
|
|
||||||
secondaryReferenceColor.setAlpha(64)
|
|
||||||
backgroundColor: QtGui.QColor = QtGui.QColor(QtCore.Qt.white)
|
backgroundColor: QtGui.QColor = QtGui.QColor(QtCore.Qt.white)
|
||||||
foregroundColor: QtGui.QColor = QtGui.QColor(QtCore.Qt.lightGray)
|
foregroundColor: QtGui.QColor = QtGui.QColor(QtCore.Qt.lightGray)
|
||||||
|
referenceColor: QtGui.QColor = QtGui.QColor(QtCore.Qt.blue).setAlpha(64)
|
||||||
|
secondaryReferenceColor: QtGui.QColor = QtGui.QColor(QtCore.Qt.blue).setAlpha(64)
|
||||||
|
secondarySweepColor: QtGui.QColor = QtCore.Qt.darkMagenta
|
||||||
|
sweepColor: QtGui.QColor = QtCore.Qt.darkYellow
|
||||||
|
swrColor: QtGui.QColor = QtGui.QColor(QtCore.Qt.red).setAlpha(128)
|
||||||
textColor: QtGui.QColor = QtGui.QColor(QtCore.Qt.black)
|
textColor: QtGui.QColor = QtGui.QColor(QtCore.Qt.black)
|
||||||
swrColor: QtGui.QColor = QtGui.QColor(QtCore.Qt.red)
|
|
||||||
swrColor.setAlpha(128)
|
|
||||||
data: List[Datapoint] = []
|
|
||||||
reference: List[Datapoint] = []
|
|
||||||
markers: List[Marker] = []
|
|
||||||
swrMarkers: Set[float] = set()
|
|
||||||
bands = None
|
|
||||||
draggedMarker: Marker = None
|
|
||||||
name = ""
|
|
||||||
sweepTitle = ""
|
|
||||||
drawLines = False
|
|
||||||
minChartHeight = 200
|
|
||||||
minChartWidth = 200
|
|
||||||
chartWidth = minChartWidth
|
|
||||||
chartHeight = minChartHeight
|
|
||||||
lineThickness = 1
|
|
||||||
pointSize = 2
|
|
||||||
markerSize = 3
|
|
||||||
drawMarkerNumbers = False
|
|
||||||
markerAtTip = False
|
|
||||||
filledMarkers = False
|
|
||||||
draggedBox = False
|
|
||||||
draggedBoxStart = (0, 0)
|
|
||||||
draggedBoxCurrent = (-1, -1)
|
|
||||||
moveStartX = -1
|
|
||||||
moveStartY = -1
|
|
||||||
|
|
||||||
isPopout = False
|
name: str = ""
|
||||||
popoutRequested = pyqtSignal(object)
|
sweepTitle: str = ""
|
||||||
|
|
||||||
|
minChartHeight: int = 200
|
||||||
|
minChartWidth: int = 200
|
||||||
|
chartHeight: int = 200
|
||||||
|
chartWidth: int = 200
|
||||||
|
|
||||||
|
|
||||||
|
draggedMarker: Marker = None
|
||||||
|
drawMarkerNumbers: bool = False
|
||||||
|
filledMarkers: bool = False
|
||||||
|
markerAtTip: bool = False
|
||||||
|
markerSize: int = 3
|
||||||
|
|
||||||
|
draggedBoxCurrent: Tuple[int] = (-1, -1)
|
||||||
|
draggedBoxStart: Tuple[int] = (0, 0)
|
||||||
|
draggedBox: bool = False
|
||||||
|
|
||||||
|
drawLines: bool = False
|
||||||
|
isPopout: bool = False
|
||||||
|
|
||||||
|
lineThickness: int = 1
|
||||||
|
moveStartX: int = -1
|
||||||
|
moveStartY: int = -1
|
||||||
|
pointSize: int = 2
|
||||||
|
|
||||||
|
bands: ClassVar = None
|
||||||
|
popoutRequested: ClassVar = pyqtSignal(object)
|
||||||
|
|
||||||
def __init__(self, name):
|
def __init__(self, name):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
self.name = name
|
self.name = name
|
||||||
|
|
||||||
self.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu)
|
self.data: List[Datapoint] = []
|
||||||
self.action_save_screenshot = QtWidgets.QAction("Save image")
|
self.reference: List[Datapoint] = []
|
||||||
self.action_save_screenshot.triggered.connect(self.saveScreenshot)
|
self.markers: List[Marker] = []
|
||||||
self.addAction(self.action_save_screenshot)
|
self.swrMarkers: Set[float] = set()
|
||||||
|
|
||||||
|
|
||||||
self.action_popout = QtWidgets.QAction("Popout chart")
|
self.action_popout = QtWidgets.QAction("Popout chart")
|
||||||
self.action_popout.triggered.connect(lambda: self.popoutRequested.emit(self))
|
self.action_popout.triggered.connect(lambda: self.popoutRequested.emit(self))
|
||||||
self.addAction(self.action_popout)
|
self.addAction(self.action_popout)
|
||||||
|
|
||||||
self.swrMarkers = set()
|
self.action_save_screenshot = QtWidgets.QAction("Save image")
|
||||||
|
self.action_save_screenshot.triggered.connect(self.saveScreenshot)
|
||||||
|
self.addAction(self.action_save_screenshot)
|
||||||
|
|
||||||
|
self.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu)
|
||||||
|
|
||||||
def setSweepColor(self, color: QtGui.QColor):
|
def setSweepColor(self, color: QtGui.QColor):
|
||||||
self.sweepColor = color
|
self.sweepColor = color
|
||||||
|
@ -195,16 +205,6 @@ class Chart(QtWidgets.QWidget):
|
||||||
self.filledMarkers = filled_markers
|
self.filledMarkers = filled_markers
|
||||||
self.update()
|
self.update()
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def shortenFrequency(frequency: int) -> str:
|
|
||||||
if frequency < 50000:
|
|
||||||
return str(frequency)
|
|
||||||
if frequency < 5000000:
|
|
||||||
return str(round(frequency / 1000)) + "k"
|
|
||||||
if frequency < 50000000:
|
|
||||||
return str(round(frequency / 1000000, 2)) + "M"
|
|
||||||
return str(round(frequency / 1000000, 1)) + "M"
|
|
||||||
|
|
||||||
def mousePressEvent(self, event: QtGui.QMouseEvent) -> None:
|
def mousePressEvent(self, event: QtGui.QMouseEvent) -> None:
|
||||||
if event.buttons() == QtCore.Qt.RightButton:
|
if event.buttons() == QtCore.Qt.RightButton:
|
||||||
event.ignore()
|
event.ignore()
|
||||||
|
|
|
@ -23,7 +23,7 @@ from typing import List
|
||||||
import numpy as np
|
import numpy as np
|
||||||
from PyQt5 import QtWidgets, QtGui, QtCore
|
from PyQt5 import QtWidgets, QtGui, QtCore
|
||||||
|
|
||||||
from NanoVNASaver.Formatting import parse_frequency
|
from NanoVNASaver.Formatting import parse_frequency, format_frequency_chart
|
||||||
from NanoVNASaver.RFTools import Datapoint
|
from NanoVNASaver.RFTools import Datapoint
|
||||||
from .Chart import Chart
|
from .Chart import Chart
|
||||||
|
|
||||||
|
@ -84,11 +84,11 @@ class FrequencyChart(Chart):
|
||||||
self.x_menu.addSeparator()
|
self.x_menu.addSeparator()
|
||||||
|
|
||||||
self.action_set_fixed_start = QtWidgets.QAction(
|
self.action_set_fixed_start = QtWidgets.QAction(
|
||||||
"Start (" + Chart.shortenFrequency(self.minFrequency) + ")")
|
"Start (" + format_frequency_chart(self.minFrequency) + ")")
|
||||||
self.action_set_fixed_start.triggered.connect(self.setMinimumFrequency)
|
self.action_set_fixed_start.triggered.connect(self.setMinimumFrequency)
|
||||||
|
|
||||||
self.action_set_fixed_stop = QtWidgets.QAction(
|
self.action_set_fixed_stop = QtWidgets.QAction(
|
||||||
"Stop (" + Chart.shortenFrequency(self.maxFrequency) + ")")
|
"Stop (" + format_frequency_chart(self.maxFrequency) + ")")
|
||||||
self.action_set_fixed_stop.triggered.connect(self.setMaximumFrequency)
|
self.action_set_fixed_stop.triggered.connect(self.setMaximumFrequency)
|
||||||
|
|
||||||
self.x_menu.addAction(self.action_set_fixed_start)
|
self.x_menu.addAction(self.action_set_fixed_start)
|
||||||
|
@ -167,9 +167,9 @@ class FrequencyChart(Chart):
|
||||||
|
|
||||||
def contextMenuEvent(self, event):
|
def contextMenuEvent(self, event):
|
||||||
self.action_set_fixed_start.setText(
|
self.action_set_fixed_start.setText(
|
||||||
f"Start ({Chart.shortenFrequency(self.minFrequency)})")
|
f"Start ({format_frequency_chart(self.minFrequency)})")
|
||||||
self.action_set_fixed_stop.setText(
|
self.action_set_fixed_stop.setText(
|
||||||
f"Stop ({Chart.shortenFrequency(self.maxFrequency)})")
|
f"Stop ({format_frequency_chart(self.maxFrequency)})")
|
||||||
self.action_set_fixed_minimum.setText(
|
self.action_set_fixed_minimum.setText(
|
||||||
f"Minimum ({self.minDisplayValue})")
|
f"Minimum ({self.minDisplayValue})")
|
||||||
self.action_set_fixed_maximum.setText(
|
self.action_set_fixed_maximum.setText(
|
||||||
|
@ -496,7 +496,7 @@ class FrequencyChart(Chart):
|
||||||
qp.setPen(self.textColor)
|
qp.setPen(self.textColor)
|
||||||
qp.drawText(self.leftMargin - 20,
|
qp.drawText(self.leftMargin - 20,
|
||||||
self.topMargin + self.chartHeight + 15,
|
self.topMargin + self.chartHeight + 15,
|
||||||
Chart.shortenFrequency(self.fstart))
|
format_frequency_chart(self.fstart))
|
||||||
ticks = math.floor(self.chartWidth / 100) # Number of ticks does not include the origin
|
ticks = math.floor(self.chartWidth / 100) # Number of ticks does not include the origin
|
||||||
for i in range(ticks):
|
for i in range(ticks):
|
||||||
x = self.leftMargin + round((i + 1) * self.chartWidth / ticks)
|
x = self.leftMargin + round((i + 1) * self.chartWidth / ticks)
|
||||||
|
@ -510,7 +510,7 @@ class FrequencyChart(Chart):
|
||||||
qp.setPen(self.textColor)
|
qp.setPen(self.textColor)
|
||||||
qp.drawText(x - 20,
|
qp.drawText(x - 20,
|
||||||
self.topMargin + self.chartHeight + 15,
|
self.topMargin + self.chartHeight + 15,
|
||||||
Chart.shortenFrequency(freq))
|
format_frequency_chart(freq))
|
||||||
|
|
||||||
def drawBands(self, qp, fstart, fstop):
|
def drawBands(self, qp, fstart, fstop):
|
||||||
qp.setBrush(self.bands.color)
|
qp.setBrush(self.bands.color)
|
||||||
|
|
|
@ -22,6 +22,7 @@ from typing import List
|
||||||
|
|
||||||
from PyQt5 import QtWidgets, QtGui
|
from PyQt5 import QtWidgets, QtGui
|
||||||
|
|
||||||
|
from NanoVNASaver.Formatting import format_frequency_chart
|
||||||
from NanoVNASaver.Marker import Marker
|
from NanoVNASaver.Marker import Marker
|
||||||
from NanoVNASaver.RFTools import Datapoint
|
from NanoVNASaver.RFTools import Datapoint
|
||||||
from NanoVNASaver.SITools import Format, Value
|
from NanoVNASaver.SITools import Format, Value
|
||||||
|
@ -517,9 +518,9 @@ class RealImaginaryChart(FrequencyChart):
|
||||||
|
|
||||||
def contextMenuEvent(self, event):
|
def contextMenuEvent(self, event):
|
||||||
self.action_set_fixed_start.setText(
|
self.action_set_fixed_start.setText(
|
||||||
f"Start ({Chart.shortenFrequency(self.minFrequency)})")
|
f"Start ({format_frequency_chart(self.minFrequency)})")
|
||||||
self.action_set_fixed_stop.setText(
|
self.action_set_fixed_stop.setText(
|
||||||
f"Stop ({Chart.shortenFrequency(self.maxFrequency)})")
|
f"Stop ({format_frequency_chart(self.maxFrequency)})")
|
||||||
self.action_set_fixed_minimum_real.setText(
|
self.action_set_fixed_minimum_real.setText(
|
||||||
f"Minimum R ({self.minDisplayReal})")
|
f"Minimum R ({self.minDisplayReal})")
|
||||||
self.action_set_fixed_maximum_real.setText(
|
self.action_set_fixed_maximum_real.setText(
|
||||||
|
|
Ładowanie…
Reference in New Issue