Add logic which transfers values when switching input fields
This commit is contained in:
@@ -114,9 +114,9 @@ class Graph(metaclass=ABCMeta):
|
|||||||
getattr(self, yDef.eosGraph).clearCache(key=key)
|
getattr(self, yDef.eosGraph).clearCache(key=key)
|
||||||
|
|
||||||
|
|
||||||
XDef = namedtuple('XDef', ('handle', 'unit', 'label', 'mainInput'))
|
|
||||||
YDef = namedtuple('YDef', ('handle', 'unit', 'label', 'eosGraph'))
|
YDef = namedtuple('YDef', ('handle', 'unit', 'label', 'eosGraph'))
|
||||||
Input = namedtuple('Input', ('handle', 'unit', 'label', 'iconID', 'defaultValue', 'defaultRange', 'mainOnly'))
|
XDef = namedtuple('XDef', ('handle', 'unit', 'label', 'mainInput'))
|
||||||
|
Input = namedtuple('Input', ('handle', 'unit', 'label', 'iconID', 'defaultValue', 'defaultRange', 'limits', 'mainOnly'))
|
||||||
VectorDef = namedtuple('VectorDef', ('lengthHandle', 'lengthUnit', 'angleHandle', 'angleUnit', 'label'))
|
VectorDef = namedtuple('VectorDef', ('lengthHandle', 'lengthUnit', 'angleHandle', 'angleUnit', 'label'))
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -18,6 +18,8 @@
|
|||||||
# =============================================================================
|
# =============================================================================
|
||||||
|
|
||||||
|
|
||||||
|
import math
|
||||||
|
|
||||||
from eos.graph.fitDpsVsRange import FitDpsVsRangeGraph as EosGraph
|
from eos.graph.fitDpsVsRange import FitDpsVsRangeGraph as EosGraph
|
||||||
from .base import Graph, XDef, YDef, Input, VectorDef
|
from .base import Graph, XDef, YDef, Input, VectorDef
|
||||||
|
|
||||||
@@ -50,10 +52,10 @@ class FitDamageStatsGraph(Graph):
|
|||||||
@property
|
@property
|
||||||
def inputs(self):
|
def inputs(self):
|
||||||
return [
|
return [
|
||||||
Input(handle='time', unit='s', label='Time', iconID=1392, defaultValue=None, defaultRange=(0, 80), mainOnly=False),
|
Input(handle='time', unit='s', label='Time', iconID=1392, defaultValue=None, defaultRange=(0, 80), limits=(0, math.inf), mainOnly=False),
|
||||||
Input(handle='distance', unit='km', label='Distance', iconID=1391, defaultValue=50, defaultRange=(0, 100), mainOnly=False),
|
Input(handle='distance', unit='km', label='Distance', iconID=1391, defaultValue=50, defaultRange=(0, 100), limits=(0, math.inf), mainOnly=False),
|
||||||
Input(handle='tgtSpeed', unit='%', label='Target speed', iconID=1389, defaultValue=100, defaultRange=(0, 100), mainOnly=False),
|
Input(handle='tgtSpeed', unit='%', label='Target speed', iconID=1389, defaultValue=100, defaultRange=(0, 100), limits=(0, math.inf), mainOnly=False),
|
||||||
Input(handle='tgtSigRad', unit='%', label='Target signature', iconID=1390, defaultValue=100, defaultRange=(100, 200), mainOnly=True)]
|
Input(handle='tgtSigRad', unit='%', label='Target signature', iconID=1390, defaultValue=100, defaultRange=(100, 200), limits=(0, math.inf), mainOnly=True)]
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def srcVectorDef(self):
|
def srcVectorDef(self):
|
||||||
|
|||||||
@@ -68,11 +68,11 @@ class ConstantBox(wx.TextCtrl):
|
|||||||
|
|
||||||
class RangeBox(wx.TextCtrl):
|
class RangeBox(wx.TextCtrl):
|
||||||
|
|
||||||
def __init__(self, parent, initialLow, initialHigh):
|
def __init__(self, parent, initRange):
|
||||||
super().__init__(parent, wx.ID_ANY, style=0)
|
super().__init__(parent, wx.ID_ANY, style=0)
|
||||||
self.Bind(wx.EVT_TEXT, self.OnText)
|
self.Bind(wx.EVT_TEXT, self.OnText)
|
||||||
self._storedValue = ''
|
self._storedValue = ''
|
||||||
self.ChangeValue('{}-{}'.format(valToStr(initialLow), valToStr(initialHigh)))
|
self.ChangeValue('{}-{}'.format(valToStr(min(initRange)), valToStr(max(initRange))))
|
||||||
|
|
||||||
def ChangeValue(self, value):
|
def ChangeValue(self, value):
|
||||||
self._storedValue = value
|
self._storedValue = value
|
||||||
@@ -92,7 +92,7 @@ class RangeBox(wx.TextCtrl):
|
|||||||
def GetValueRange(self):
|
def GetValueRange(self):
|
||||||
parts = self.GetValue().split('-')
|
parts = self.GetValue().split('-')
|
||||||
if len(parts) == 1:
|
if len(parts) == 1:
|
||||||
val = strToFloat(parts)
|
val = strToFloat(parts[0])
|
||||||
return (val, val)
|
return (val, val)
|
||||||
else:
|
else:
|
||||||
return (strToFloat(parts[0]), strToFloat(parts[1]))
|
return (strToFloat(parts[0]), strToFloat(parts[1]))
|
||||||
|
|||||||
@@ -33,6 +33,8 @@ def range2Const(defConst, defRange, limits, oldRange):
|
|||||||
return defConst
|
return defConst
|
||||||
if oldRange[0] == oldRange[1]:
|
if oldRange[0] == oldRange[1]:
|
||||||
return oldRange[0]
|
return oldRange[0]
|
||||||
|
if defConst is None:
|
||||||
|
defConst = 0
|
||||||
defPos = (defConst - min(defRange)) / (max(defRange) - min(defRange))
|
defPos = (defConst - min(defRange)) / (max(defRange) - min(defRange))
|
||||||
newConst = min(oldRange) + (max(oldRange) - min(oldRange)) * defPos
|
newConst = min(oldRange) + (max(oldRange) - min(oldRange)) * defPos
|
||||||
newConst = max(newConst, min(limits))
|
newConst = max(newConst, min(limits))
|
||||||
@@ -44,6 +46,8 @@ def range2Const(defConst, defRange, limits, oldRange):
|
|||||||
def const2Range(defConst, defRange, limits, oldConst):
|
def const2Range(defConst, defRange, limits, oldConst):
|
||||||
if oldConst is None:
|
if oldConst is None:
|
||||||
return defRange
|
return defRange
|
||||||
|
if defConst is None:
|
||||||
|
defConst = 0
|
||||||
newMin = oldConst - defConst + min(defRange)
|
newMin = oldConst - defConst + min(defRange)
|
||||||
newMax = oldConst - defConst + max(defRange)
|
newMax = oldConst - defConst + max(defRange)
|
||||||
# Fits into limits
|
# Fits into limits
|
||||||
@@ -72,6 +76,7 @@ class GraphControlPanel(wx.Panel):
|
|||||||
super().__init__(parent)
|
super().__init__(parent)
|
||||||
self.graphFrame = graphFrame
|
self.graphFrame = graphFrame
|
||||||
self.inputs = {}
|
self.inputs = {}
|
||||||
|
self.storedValues = {}
|
||||||
|
|
||||||
mainSizer = wx.BoxSizer(wx.VERTICAL)
|
mainSizer = wx.BoxSizer(wx.VERTICAL)
|
||||||
optsSizer = wx.BoxSizer(wx.HORIZONTAL)
|
optsSizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||||
@@ -139,6 +144,12 @@ class GraphControlPanel(wx.Panel):
|
|||||||
self.Bind(wx.EVT_TIMER, self.OnDrawTimer, self.drawTimer)
|
self.Bind(wx.EVT_TIMER, self.OnDrawTimer, self.drawTimer)
|
||||||
self.setVectorDefaults()
|
self.setVectorDefaults()
|
||||||
|
|
||||||
|
def storeCurrentValues(self):
|
||||||
|
for k, v in self.getValues().items():
|
||||||
|
handle = k
|
||||||
|
value, unit = v
|
||||||
|
self.storedValues[(handle, unit)] = value
|
||||||
|
|
||||||
def setVectorDefaults(self):
|
def setVectorDefaults(self):
|
||||||
self.srcVector.SetValue(length=0, angle=0)
|
self.srcVector.SetValue(length=0, angle=0)
|
||||||
self.tgtVector.SetValue(length=1, angle=90)
|
self.tgtVector.SetValue(length=1, angle=90)
|
||||||
@@ -182,6 +193,7 @@ class GraphControlPanel(wx.Panel):
|
|||||||
self.graphFrame.UpdateWindowSize()
|
self.graphFrame.UpdateWindowSize()
|
||||||
|
|
||||||
def updateInputs(self):
|
def updateInputs(self):
|
||||||
|
self.storeCurrentValues()
|
||||||
# Clean up old inputs
|
# Clean up old inputs
|
||||||
for children in self.inputs.values():
|
for children in self.inputs.values():
|
||||||
for child in children:
|
for child in children:
|
||||||
@@ -194,9 +206,23 @@ class GraphControlPanel(wx.Panel):
|
|||||||
handledHandles.add(inputDef.handle)
|
handledHandles.add(inputDef.handle)
|
||||||
fieldSizer = wx.BoxSizer(wx.HORIZONTAL)
|
fieldSizer = wx.BoxSizer(wx.HORIZONTAL)
|
||||||
if mainInput:
|
if mainInput:
|
||||||
fieldTextBox = RangeBox(self, *inputDef.defaultRange)
|
initRange = self.storedValues.get((inputDef.handle, inputDef.unit), inputDef.defaultRange)
|
||||||
|
if not isinstance(initRange, (tuple, list)):
|
||||||
|
initRange = const2Range(
|
||||||
|
defConst=inputDef.defaultValue,
|
||||||
|
defRange=inputDef.defaultRange,
|
||||||
|
limits=inputDef.limits,
|
||||||
|
oldConst=initRange)
|
||||||
|
fieldTextBox = RangeBox(self, initRange)
|
||||||
else:
|
else:
|
||||||
fieldTextBox = ConstantBox(self, inputDef.defaultValue)
|
initConst = self.storedValues.get((inputDef.handle, inputDef.unit), inputDef.defaultValue)
|
||||||
|
if isinstance(initConst, (tuple, list)):
|
||||||
|
initConst = range2Const(
|
||||||
|
defConst=inputDef.defaultValue,
|
||||||
|
defRange=inputDef.defaultRange,
|
||||||
|
limits=inputDef.limits,
|
||||||
|
oldRange=initConst)
|
||||||
|
fieldTextBox = ConstantBox(self, initConst)
|
||||||
fieldTextBox.Bind(wx.EVT_TEXT, self.OnFieldChanged)
|
fieldTextBox.Bind(wx.EVT_TEXT, self.OnFieldChanged)
|
||||||
fieldSizer.Add(fieldTextBox, 0, wx.EXPAND | wx.ALIGN_CENTER_VERTICAL | wx.RIGHT, 5)
|
fieldSizer.Add(fieldTextBox, 0, wx.EXPAND | wx.ALIGN_CENTER_VERTICAL | wx.RIGHT, 5)
|
||||||
fieldIcon = None
|
fieldIcon = None
|
||||||
@@ -211,7 +237,6 @@ class GraphControlPanel(wx.Panel):
|
|||||||
self.inputs[(inputDef.handle, inputDef.unit)] = (fieldTextBox, fieldIcon, fieldLabel)
|
self.inputs[(inputDef.handle, inputDef.unit)] = (fieldTextBox, fieldIcon, fieldLabel)
|
||||||
self.inputsSizer.Add(fieldSizer, 0, wx.EXPAND | wx.BOTTOM, 5)
|
self.inputsSizer.Add(fieldSizer, 0, wx.EXPAND | wx.BOTTOM, 5)
|
||||||
|
|
||||||
# Set up inputs
|
|
||||||
view = self.graphFrame.getView()
|
view = self.graphFrame.getView()
|
||||||
handledHandles = set()
|
handledHandles = set()
|
||||||
srcVectorDef = view.srcVectorDef
|
srcVectorDef = view.srcVectorDef
|
||||||
|
|||||||
Reference in New Issue
Block a user