Move shield regen graph to new infrastructure
This commit is contained in:
@@ -1,27 +0,0 @@
|
|||||||
import math
|
|
||||||
from logbook import Logger
|
|
||||||
|
|
||||||
from .base import SmoothGraph
|
|
||||||
|
|
||||||
|
|
||||||
pyfalog = Logger(__name__)
|
|
||||||
|
|
||||||
|
|
||||||
class FitShieldAmountVsTimeGraph(SmoothGraph):
|
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
super().__init__()
|
|
||||||
import gui.mainFrame
|
|
||||||
self.mainFrame = gui.mainFrame.MainFrame.getInstance()
|
|
||||||
|
|
||||||
def getYForX(self, fit, extraData, time):
|
|
||||||
if time < 0:
|
|
||||||
return 0
|
|
||||||
maxShield = fit.ship.getModifiedItemAttr('shieldCapacity')
|
|
||||||
regenTime = fit.ship.getModifiedItemAttr('shieldRechargeRate') / 1000
|
|
||||||
# https://wiki.eveuniversity.org/Capacitor#Capacitor_recharge_rate (shield is similar to cap)
|
|
||||||
shield = maxShield * (1 + math.exp(5 * -time / regenTime) * -1) ** 2
|
|
||||||
useEhp = self.mainFrame.statsPane.nameViewMap["resistancesViewFull"].showEffective
|
|
||||||
if fit.damagePattern is not None and useEhp:
|
|
||||||
shield = fit.damagePattern.effectivify(fit, shield, 'shield')
|
|
||||||
return shield
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
import math
|
|
||||||
|
|
||||||
from .base import SmoothGraph
|
|
||||||
|
|
||||||
|
|
||||||
class FitShieldRegenVsShieldPercGraph(SmoothGraph):
|
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
super().__init__()
|
|
||||||
import gui.mainFrame
|
|
||||||
self.mainFrame = gui.mainFrame.MainFrame.getInstance()
|
|
||||||
|
|
||||||
def getYForX(self, fit, extraData, perc):
|
|
||||||
maxShield = fit.ship.getModifiedItemAttr('shieldCapacity')
|
|
||||||
regenTime = fit.ship.getModifiedItemAttr('shieldRechargeRate') / 1000
|
|
||||||
currentShield = maxShield * perc / 100
|
|
||||||
# https://wiki.eveuniversity.org/Capacitor#Capacitor_recharge_rate (shield is similar to cap)
|
|
||||||
regen = 10 * maxShield / regenTime * (math.sqrt(currentShield / maxShield) - currentShield / maxShield)
|
|
||||||
useEhp = self.mainFrame.statsPane.nameViewMap["resistancesViewFull"].showEffective
|
|
||||||
if fit.damagePattern is not None and useEhp:
|
|
||||||
regen = fit.damagePattern.effectivify(fit, regen, 'shield')
|
|
||||||
return regen
|
|
||||||
@@ -2,8 +2,7 @@
|
|||||||
from gui.builtinGraphs import ( # noqa: E402,F401
|
from gui.builtinGraphs import ( # noqa: E402,F401
|
||||||
fitDamageStats,
|
fitDamageStats,
|
||||||
# fitDmgVsTime,
|
# fitDmgVsTime,
|
||||||
# fitShieldRegenVsShieldPerc,
|
fitShieldRegen,
|
||||||
# fitShieldAmountVsTime,
|
|
||||||
fitCapRegen,
|
fitCapRegen,
|
||||||
fitMobility,
|
fitMobility,
|
||||||
fitWarpTime
|
fitWarpTime
|
||||||
|
|||||||
@@ -72,21 +72,9 @@ class FitGraph(metaclass=ABCMeta):
|
|||||||
def inputMap(self):
|
def inputMap(self):
|
||||||
return OrderedDict(((i.handle, i.unit), i) for i in self.inputs)
|
return OrderedDict(((i.handle, i.unit), i) for i in self.inputs)
|
||||||
|
|
||||||
@property
|
srcVectorDef = None
|
||||||
def srcVectorDef(self):
|
tgtVectorDef = None
|
||||||
return None
|
hasTargets = False
|
||||||
|
|
||||||
@property
|
|
||||||
def tgtVectorDef(self):
|
|
||||||
return None
|
|
||||||
|
|
||||||
@property
|
|
||||||
def hasTargets(self):
|
|
||||||
return False
|
|
||||||
|
|
||||||
@property
|
|
||||||
def redrawOnEffectiveChange(self):
|
|
||||||
return False
|
|
||||||
|
|
||||||
def getPlotPoints(self, mainInput, miscInputs, xSpec, ySpec, fit, tgt=None):
|
def getPlotPoints(self, mainInput, miscInputs, xSpec, ySpec, fit, tgt=None):
|
||||||
try:
|
try:
|
||||||
@@ -182,7 +170,7 @@ class FitGraph(metaclass=ABCMeta):
|
|||||||
values = [denormalizer(v, fit, tgt) for v in values]
|
values = [denormalizer(v, fit, tgt) for v in values]
|
||||||
return values
|
return values
|
||||||
|
|
||||||
def _iterLinear(self, valRange, resolution=100):
|
def _iterLinear(self, valRange, resolution=200):
|
||||||
rangeLow = min(valRange)
|
rangeLow = min(valRange)
|
||||||
rangeHigh = max(valRange)
|
rangeHigh = max(valRange)
|
||||||
# Amount is amount of ranges between points here, not amount of points
|
# Amount is amount of ranges between points here, not amount of points
|
||||||
|
|||||||
@@ -25,35 +25,24 @@ from .base import FitGraph, XDef, YDef, Input
|
|||||||
|
|
||||||
class FitCapRegenGraph(FitGraph):
|
class FitCapRegenGraph(FitGraph):
|
||||||
|
|
||||||
name = 'Capacitor Regeneration'
|
|
||||||
|
|
||||||
# UI stuff
|
# UI stuff
|
||||||
@property
|
name = 'Capacitor Regeneration'
|
||||||
def xDefs(self):
|
xDefs = [
|
||||||
return [
|
XDef(handle='time', unit='s', label='Time', mainInput=('time', 's')),
|
||||||
XDef(handle='time', unit='s', label='Time', mainInput=('time', 's')),
|
XDef(handle='capAmount', unit='GJ', label='Cap amount', mainInput=('capAmount', '%')),
|
||||||
XDef(handle='capAmount', unit='GJ', label='Cap amount', mainInput=('capAmount', '%')),
|
XDef(handle='capAmount', unit='%', label='Cap amount', mainInput=('capAmount', '%'))]
|
||||||
XDef(handle='capAmount', unit='%', label='Cap amount', mainInput=('capAmount', '%'))]
|
yDefs = [
|
||||||
|
YDef(handle='capAmount', unit='GJ', label='Cap amount'),
|
||||||
@property
|
YDef(handle='capRegen', unit='GJ/s', label='Cap regen')]
|
||||||
def yDefs(self):
|
inputs = [
|
||||||
return [
|
Input(handle='time', unit='s', label='Time', iconID=1392, defaultValue=120, defaultRange=(0, 300), mainOnly=True),
|
||||||
YDef(handle='capAmount', unit='GJ', label='Cap amount'),
|
Input(handle='capAmount', unit='%', label='Cap amount', iconID=1668, defaultValue=25, defaultRange=(0, 100), mainOnly=True)]
|
||||||
YDef(handle='capRegen', unit='GJ/s', label='Cap regen')]
|
|
||||||
|
|
||||||
@property
|
|
||||||
def inputs(self):
|
|
||||||
return [
|
|
||||||
Input(handle='time', unit='s', label='Time', iconID=1392, defaultValue=120, defaultRange=(0, 300), mainOnly=True),
|
|
||||||
Input(handle='capAmount', unit='%', label='Cap amount', iconID=1668, defaultValue=25, defaultRange=(0, 100), mainOnly=True)]
|
|
||||||
|
|
||||||
# Calculation stuff
|
# Calculation stuff
|
||||||
_normalizers = {
|
_normalizers = {
|
||||||
('capAmount', '%'): lambda v, fit, tgt: v / 100 * fit.ship.getModifiedItemAttr('capacitorCapacity')}
|
('capAmount', '%'): lambda v, fit, tgt: v / 100 * fit.ship.getModifiedItemAttr('capacitorCapacity')}
|
||||||
|
|
||||||
_limiters = {
|
_limiters = {
|
||||||
'capAmount': lambda fit, tgt: (0, fit.ship.getModifiedItemAttr('capacitorCapacity'))}
|
'capAmount': lambda fit, tgt: (0, fit.ship.getModifiedItemAttr('capacitorCapacity'))}
|
||||||
|
|
||||||
_denormalizers = {
|
_denormalizers = {
|
||||||
('capAmount', '%'): lambda v, fit, tgt: v * 100 / fit.ship.getModifiedItemAttr('capacitorCapacity')}
|
('capAmount', '%'): lambda v, fit, tgt: v * 100 / fit.ship.getModifiedItemAttr('capacitorCapacity')}
|
||||||
|
|
||||||
@@ -75,9 +64,9 @@ class FitCapRegenGraph(FitGraph):
|
|||||||
capRegenTime = fit.ship.getModifiedItemAttr('rechargeRate') / 1000
|
capRegenTime = fit.ship.getModifiedItemAttr('rechargeRate') / 1000
|
||||||
for time in self._iterLinear(mainInput[1]):
|
for time in self._iterLinear(mainInput[1]):
|
||||||
currentCapAmount = calculateCapAmount(maxCapAmount=maxCapAmount, capRegenTime=capRegenTime, time=time)
|
currentCapAmount = calculateCapAmount(maxCapAmount=maxCapAmount, capRegenTime=capRegenTime, time=time)
|
||||||
currentRegen = calculateCapRegen(maxCapAmount=maxCapAmount, capRegenTime=capRegenTime, currentCapAmount=currentCapAmount)
|
currentCapRegen = calculateCapRegen(maxCapAmount=maxCapAmount, capRegenTime=capRegenTime, currentCapAmount=currentCapAmount)
|
||||||
xs.append(time)
|
xs.append(time)
|
||||||
ys.append(currentRegen)
|
ys.append(currentCapRegen)
|
||||||
return xs, ys
|
return xs, ys
|
||||||
|
|
||||||
def _capAmount2capAmount(self, mainInput, miscInputs, fit, tgt):
|
def _capAmount2capAmount(self, mainInput, miscInputs, fit, tgt):
|
||||||
@@ -95,9 +84,9 @@ class FitCapRegenGraph(FitGraph):
|
|||||||
maxCapAmount = fit.ship.getModifiedItemAttr('capacitorCapacity')
|
maxCapAmount = fit.ship.getModifiedItemAttr('capacitorCapacity')
|
||||||
capRegenTime = fit.ship.getModifiedItemAttr('rechargeRate') / 1000
|
capRegenTime = fit.ship.getModifiedItemAttr('rechargeRate') / 1000
|
||||||
for currentCapAmount in self._iterLinear(mainInput[1]):
|
for currentCapAmount in self._iterLinear(mainInput[1]):
|
||||||
currentRegen = calculateCapRegen(maxCapAmount=maxCapAmount, capRegenTime=capRegenTime, currentCapAmount=currentCapAmount)
|
currentCapRegen = calculateCapRegen(maxCapAmount=maxCapAmount, capRegenTime=capRegenTime, currentCapAmount=currentCapAmount)
|
||||||
xs.append(currentCapAmount)
|
xs.append(currentCapAmount)
|
||||||
ys.append(currentRegen)
|
ys.append(currentCapRegen)
|
||||||
return xs, ys
|
return xs, ys
|
||||||
|
|
||||||
_getters = {
|
_getters = {
|
||||||
|
|||||||
@@ -23,45 +23,27 @@ from .base import FitGraph, XDef, YDef, Input, VectorDef
|
|||||||
|
|
||||||
class FitDamageStatsGraph(FitGraph):
|
class FitDamageStatsGraph(FitGraph):
|
||||||
|
|
||||||
name = 'Damage Stats'
|
|
||||||
|
|
||||||
# UI stuff
|
# UI stuff
|
||||||
@property
|
name = 'Damage Stats'
|
||||||
def xDefs(self):
|
xDefs = [
|
||||||
return [
|
XDef(handle='distance', unit='km', label='Distance', mainInput=('distance', 'km')),
|
||||||
XDef(handle='distance', unit='km', label='Distance', mainInput=('distance', 'km')),
|
XDef(handle='time', unit='s', label='Time', mainInput=('time', 's')),
|
||||||
XDef(handle='time', unit='s', label='Time', mainInput=('time', 's')),
|
XDef(handle='tgtSpeed', unit='m/s', label='Target speed', mainInput=('tgtSpeed', '%')),
|
||||||
XDef(handle='tgtSpeed', unit='m/s', label='Target speed', mainInput=('tgtSpeed', '%')),
|
XDef(handle='tgtSpeed', unit='%', label='Target speed', mainInput=('tgtSpeed', '%')),
|
||||||
XDef(handle='tgtSpeed', unit='%', label='Target speed', mainInput=('tgtSpeed', '%')),
|
XDef(handle='tgtSigRad', unit='m', label='Target signature radius', mainInput=('tgtSigRad', '%')),
|
||||||
XDef(handle='tgtSigRad', unit='m', label='Target signature radius', mainInput=('tgtSigRad', '%')),
|
XDef(handle='tgtSigRad', unit='%', label='Target signature radius', mainInput=('tgtSigRad', '%'))]
|
||||||
XDef(handle='tgtSigRad', unit='%', label='Target signature radius', mainInput=('tgtSigRad', '%'))]
|
yDefs = [
|
||||||
|
YDef(handle='dps', unit=None, label='DPS'),
|
||||||
@property
|
YDef(handle='volley', unit=None, label='Volley'),
|
||||||
def yDefs(self):
|
YDef(handle='damage', unit=None, label='Damage inflicted')]
|
||||||
return [
|
inputs = [
|
||||||
YDef(handle='dps', unit=None, label='DPS'),
|
Input(handle='time', unit='s', label='Time', iconID=1392, defaultValue=None, defaultRange=(0, 80), mainOnly=False),
|
||||||
YDef(handle='volley', unit=None, label='Volley'),
|
Input(handle='distance', unit='km', label='Distance', iconID=1391, defaultValue=50, defaultRange=(0, 100), mainOnly=False),
|
||||||
YDef(handle='damage', unit=None, label='Damage inflicted')]
|
Input(handle='tgtSpeed', unit='%', label='Target speed', iconID=1389, defaultValue=100, defaultRange=(0, 100), mainOnly=False),
|
||||||
|
Input(handle='tgtSigRad', unit='%', label='Target signature', iconID=1390, defaultValue=100, defaultRange=(100, 200), mainOnly=True)]
|
||||||
@property
|
srcVectorDef = VectorDef(lengthHandle='atkSpeed', lengthUnit='%', angleHandle='atkAngle', angleUnit='degrees', label='Attacker')
|
||||||
def inputs(self):
|
tgtVectorDef = VectorDef(lengthHandle='tgtSpeed', lengthUnit='%', angleHandle='tgtAngle', angleUnit='degrees', label='Target')
|
||||||
return [
|
hasTargets = True
|
||||||
Input(handle='time', unit='s', label='Time', iconID=1392, defaultValue=None, defaultRange=(0, 80), mainOnly=False),
|
|
||||||
Input(handle='distance', unit='km', label='Distance', iconID=1391, defaultValue=50, defaultRange=(0, 100), mainOnly=False),
|
|
||||||
Input(handle='tgtSpeed', unit='%', label='Target speed', iconID=1389, defaultValue=100, defaultRange=(0, 100), mainOnly=False),
|
|
||||||
Input(handle='tgtSigRad', unit='%', label='Target signature', iconID=1390, defaultValue=100, defaultRange=(100, 200), mainOnly=True)]
|
|
||||||
|
|
||||||
@property
|
|
||||||
def srcVectorDef(self):
|
|
||||||
return VectorDef(lengthHandle='atkSpeed', lengthUnit='%', angleHandle='atkAngle', angleUnit='degrees', label='Attacker')
|
|
||||||
|
|
||||||
@property
|
|
||||||
def tgtVectorDef(self):
|
|
||||||
return VectorDef(lengthHandle='tgtSpeed', lengthUnit='%', angleHandle='tgtAngle', angleUnit='degrees', label='Target')
|
|
||||||
|
|
||||||
@property
|
|
||||||
def hasTargets(self):
|
|
||||||
return True
|
|
||||||
|
|
||||||
# Calculation stuff
|
# Calculation stuff
|
||||||
_normalizers = {
|
_normalizers = {
|
||||||
@@ -69,10 +51,8 @@ class FitDamageStatsGraph(FitGraph):
|
|||||||
('atkSpeed', '%'): lambda v, fit, tgt: v / 100 * fit.ship.getModifiedItemAttr('maxVelocity'),
|
('atkSpeed', '%'): lambda v, fit, tgt: v / 100 * fit.ship.getModifiedItemAttr('maxVelocity'),
|
||||||
('tgtSpeed', '%'): lambda v, fit, tgt: v / 100 * tgt.ship.getModifiedItemAttr('maxVelocity'),
|
('tgtSpeed', '%'): lambda v, fit, tgt: v / 100 * tgt.ship.getModifiedItemAttr('maxVelocity'),
|
||||||
('tgtSigRad', '%'): lambda v, fit, tgt: v / 100 * fit.ship.getModifiedItemAttr('signatureRadius')}
|
('tgtSigRad', '%'): lambda v, fit, tgt: v / 100 * fit.ship.getModifiedItemAttr('signatureRadius')}
|
||||||
|
|
||||||
_limiters = {
|
_limiters = {
|
||||||
'time': lambda fit, tgt: (0, 2500)}
|
'time': lambda fit, tgt: (0, 2500)}
|
||||||
|
|
||||||
_denormalizers = {
|
_denormalizers = {
|
||||||
('distance', 'km'): lambda v, fit, tgt: v / 1000,
|
('distance', 'km'): lambda v, fit, tgt: v / 1000,
|
||||||
('tgtSpeed', '%'): lambda v, fit, tgt: v * 100 / tgt.ship.getModifiedItemAttr('maxVelocity'),
|
('tgtSpeed', '%'): lambda v, fit, tgt: v * 100 / tgt.ship.getModifiedItemAttr('maxVelocity'),
|
||||||
|
|||||||
@@ -25,29 +25,15 @@ from .base import FitGraph, XDef, YDef, Input
|
|||||||
|
|
||||||
class FitMobilityVsTimeGraph(FitGraph):
|
class FitMobilityVsTimeGraph(FitGraph):
|
||||||
|
|
||||||
name = 'Mobility'
|
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
super().__init__()
|
|
||||||
|
|
||||||
# UI stuff
|
# UI stuff
|
||||||
@property
|
name = 'Mobility'
|
||||||
def xDefs(self):
|
xDefs = [
|
||||||
return [XDef(handle='time', unit='s', label='Time', mainInput=('time', 's'))]
|
XDef(handle='time', unit='s', label='Time', mainInput=('time', 's'))]
|
||||||
|
yDefs = [
|
||||||
@property
|
YDef(handle='speed', unit='m/s', label='Speed'),
|
||||||
def yDefs(self):
|
YDef(handle='distance', unit='km', label='Distance')]
|
||||||
return [
|
inputs = [
|
||||||
YDef(handle='speed', unit='m/s', label='Speed'),
|
Input(handle='time', unit='s', label='Time', iconID=1392, defaultValue=10, defaultRange=(0, 30), mainOnly=False)]
|
||||||
YDef(handle='distance', unit='km', label='Distance')]
|
|
||||||
|
|
||||||
@property
|
|
||||||
def inputs(self):
|
|
||||||
return [Input(handle='time', unit='s', label='Time', iconID=1392, defaultValue=10, defaultRange=(0, 30), mainOnly=False)]
|
|
||||||
|
|
||||||
@property
|
|
||||||
def xDef(self):
|
|
||||||
return XDef(inputDefault='0-80', inputLabel='Time (seconds)', inputIconID=1392, axisLabel='Time, s')
|
|
||||||
|
|
||||||
# Calculation stuff
|
# Calculation stuff
|
||||||
_denormalizers = {
|
_denormalizers = {
|
||||||
|
|||||||
@@ -1,50 +0,0 @@
|
|||||||
# =============================================================================
|
|
||||||
# Copyright (C) 2010 Diego Duclos
|
|
||||||
#
|
|
||||||
# This file is part of pyfa.
|
|
||||||
#
|
|
||||||
# pyfa is free software: you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation, either version 3 of the License, or
|
|
||||||
# (at your option) any later version.
|
|
||||||
#
|
|
||||||
# pyfa is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with pyfa. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
# =============================================================================
|
|
||||||
|
|
||||||
|
|
||||||
from collections import OrderedDict
|
|
||||||
|
|
||||||
import gui.mainFrame
|
|
||||||
from eos.graph.fitShieldAmountVsTime import FitShieldAmountVsTimeGraph as EosGraph
|
|
||||||
from .base import FitGraph, XDef, YDef
|
|
||||||
|
|
||||||
|
|
||||||
class FitShieldAmountVsTimeGraph(FitGraph):
|
|
||||||
|
|
||||||
name = 'Shield Amount vs Time'
|
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
super().__init__()
|
|
||||||
self.eosGraph = EosGraph()
|
|
||||||
self.mainFrame = gui.mainFrame.MainFrame.getInstance()
|
|
||||||
|
|
||||||
@property
|
|
||||||
def xDef(self):
|
|
||||||
return XDef(inputDefault='0-300', inputLabel='Time (seconds)', inputIconID=1392, axisLabel='Time, s')
|
|
||||||
|
|
||||||
@property
|
|
||||||
def yDefs(self):
|
|
||||||
axisLabel = 'Shield amount, {}'.format('EHP' if self.mainFrame.statsPane.nameViewMap["resistancesViewFull"].showEffective else 'HP')
|
|
||||||
return OrderedDict([('shieldAmount', YDef(switchLabel='Shield amount', axisLabel=axisLabel, eosGraph='eosGraph'))])
|
|
||||||
|
|
||||||
def redrawOnEffectiveChange(self):
|
|
||||||
return True
|
|
||||||
|
|
||||||
|
|
||||||
FitShieldAmountVsTimeGraph.register()
|
|
||||||
117
gui/builtinGraphs/fitShieldRegen.py
Normal file
117
gui/builtinGraphs/fitShieldRegen.py
Normal file
@@ -0,0 +1,117 @@
|
|||||||
|
# =============================================================================
|
||||||
|
# Copyright (C) 2010 Diego Duclos
|
||||||
|
#
|
||||||
|
# This file is part of pyfa.
|
||||||
|
#
|
||||||
|
# pyfa is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# pyfa is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with pyfa. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
|
||||||
|
import math
|
||||||
|
|
||||||
|
import gui.mainFrame
|
||||||
|
from .base import FitGraph, XDef, YDef, Input
|
||||||
|
|
||||||
|
|
||||||
|
class FitShieldRegenGraph(FitGraph):
|
||||||
|
|
||||||
|
# UI stuff
|
||||||
|
name = 'Shield Regeneration'
|
||||||
|
xDefs = [
|
||||||
|
XDef(handle='time', unit='s', label='Time', mainInput=('time', 's')),
|
||||||
|
XDef(handle='shieldAmount', unit='EHP', label='Shield amount', mainInput=('shieldAmount', '%')),
|
||||||
|
XDef(handle='shieldAmount', unit='HP', label='Shield amount', mainInput=('shieldAmount', '%')),
|
||||||
|
XDef(handle='shieldAmount', unit='%', label='Shield amount', mainInput=('shieldAmount', '%'))]
|
||||||
|
yDefs = [
|
||||||
|
YDef(handle='shieldAmount', unit='EHP', label='Shield amount'),
|
||||||
|
YDef(handle='shieldAmount', unit='HP', label='Shield amount'),
|
||||||
|
YDef(handle='shieldRegen', unit='EHP/s', label='Shield regen'),
|
||||||
|
YDef(handle='shieldRegen', unit='HP/s', label='Shield regen')]
|
||||||
|
inputs = [
|
||||||
|
Input(handle='time', unit='s', label='Time', iconID=1392, defaultValue=120, defaultRange=(0, 300), mainOnly=True),
|
||||||
|
Input(handle='shieldAmount', unit='%', label='Shield amount', iconID=1384, defaultValue=25, defaultRange=(0, 100), mainOnly=True)]
|
||||||
|
|
||||||
|
# Calculation stuff
|
||||||
|
_normalizers = {
|
||||||
|
('shieldAmount', '%'): lambda v, fit, tgt: v / 100 * fit.ship.getModifiedItemAttr('shieldCapacity')}
|
||||||
|
_limiters = {
|
||||||
|
'shieldAmount': lambda fit, tgt: (0, fit.ship.getModifiedItemAttr('shieldCapacity'))}
|
||||||
|
_denormalizers = {
|
||||||
|
('shieldAmount', '%'): lambda v, fit, tgt: v * 100 / fit.ship.getModifiedItemAttr('shieldCapacity'),
|
||||||
|
('shieldAmount', 'EHP'): lambda v, fit, tgt: fit.damagePattern.effectivify(fit, v, 'shield'),
|
||||||
|
('shieldRegen', 'EHP/s'): lambda v, fit, tgt: fit.damagePattern.effectivify(fit, v, 'shield')}
|
||||||
|
|
||||||
|
def _time2shieldAmount(self, mainInput, miscInputs, fit, tgt):
|
||||||
|
xs = []
|
||||||
|
ys = []
|
||||||
|
maxShieldAmount = fit.ship.getModifiedItemAttr('shieldCapacity')
|
||||||
|
shieldRegenTime = fit.ship.getModifiedItemAttr('shieldRechargeRate') / 1000
|
||||||
|
for time in self._iterLinear(mainInput[1]):
|
||||||
|
currentShieldAmount = calculateShieldAmount(maxShieldAmount=maxShieldAmount, shieldRegenTime=shieldRegenTime, time=time)
|
||||||
|
xs.append(time)
|
||||||
|
ys.append(currentShieldAmount)
|
||||||
|
return xs, ys
|
||||||
|
|
||||||
|
def _time2shieldRegen(self, mainInput, miscInputs, fit, tgt):
|
||||||
|
xs = []
|
||||||
|
ys = []
|
||||||
|
maxShieldAmount = fit.ship.getModifiedItemAttr('shieldCapacity')
|
||||||
|
shieldRegenTime = fit.ship.getModifiedItemAttr('shieldRechargeRate') / 1000
|
||||||
|
for time in self._iterLinear(mainInput[1]):
|
||||||
|
currentShieldAmount = calculateShieldAmount(maxShieldAmount=maxShieldAmount, shieldRegenTime=shieldRegenTime, time=time)
|
||||||
|
currentShieldRegen = calculateShieldRegen(maxShieldAmount=maxShieldAmount, shieldRegenTime=shieldRegenTime, currentShieldAmount=currentShieldAmount)
|
||||||
|
xs.append(time)
|
||||||
|
ys.append(currentShieldRegen)
|
||||||
|
return xs, ys
|
||||||
|
|
||||||
|
def _shieldAmount2shieldAmount(self, mainInput, miscInputs, fit, tgt):
|
||||||
|
# Useless, but valid combination of x and y
|
||||||
|
xs = []
|
||||||
|
ys = []
|
||||||
|
for currentShieldAmount in self._iterLinear(mainInput[1]):
|
||||||
|
xs.append(currentShieldAmount)
|
||||||
|
ys.append(currentShieldAmount)
|
||||||
|
return xs, ys
|
||||||
|
|
||||||
|
def _shieldAmount2shieldRegen(self, mainInput, miscInputs, fit, tgt):
|
||||||
|
xs = []
|
||||||
|
ys = []
|
||||||
|
maxShieldAmount = fit.ship.getModifiedItemAttr('shieldCapacity')
|
||||||
|
shieldRegenTime = fit.ship.getModifiedItemAttr('shieldRechargeRate') / 1000
|
||||||
|
for currentShieldAmount in self._iterLinear(mainInput[1]):
|
||||||
|
currentShieldRegen = calculateShieldRegen(maxShieldAmount=maxShieldAmount, shieldRegenTime=shieldRegenTime, currentShieldAmount=currentShieldAmount)
|
||||||
|
xs.append(currentShieldAmount)
|
||||||
|
ys.append(currentShieldRegen)
|
||||||
|
return xs, ys
|
||||||
|
|
||||||
|
_getters = {
|
||||||
|
('time', 'shieldAmount'): _time2shieldAmount,
|
||||||
|
('time', 'shieldRegen'): _time2shieldRegen,
|
||||||
|
('shieldAmount', 'shieldAmount'): _shieldAmount2shieldAmount,
|
||||||
|
('shieldAmount', 'shieldRegen'): _shieldAmount2shieldRegen}
|
||||||
|
|
||||||
|
|
||||||
|
def calculateShieldAmount(maxShieldAmount, shieldRegenTime, time):
|
||||||
|
# The same formula as for cap
|
||||||
|
# https://wiki.eveuniversity.org/Capacitor#Capacitor_recharge_rate
|
||||||
|
return maxShieldAmount * (1 + math.exp(5 * -time / shieldRegenTime) * -1) ** 2
|
||||||
|
|
||||||
|
|
||||||
|
def calculateShieldRegen(maxShieldAmount, shieldRegenTime, currentShieldAmount):
|
||||||
|
# The same formula as for cap
|
||||||
|
# https://wiki.eveuniversity.org/Capacitor#Capacitor_recharge_rate
|
||||||
|
return 10 * maxShieldAmount / shieldRegenTime * (math.sqrt(currentShieldAmount / maxShieldAmount) - currentShieldAmount / maxShieldAmount)
|
||||||
|
|
||||||
|
|
||||||
|
FitShieldRegenGraph.register()
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
# =============================================================================
|
|
||||||
# Copyright (C) 2010 Diego Duclos
|
|
||||||
#
|
|
||||||
# This file is part of pyfa.
|
|
||||||
#
|
|
||||||
# pyfa is free software: you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation, either version 3 of the License, or
|
|
||||||
# (at your option) any later version.
|
|
||||||
#
|
|
||||||
# pyfa is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with pyfa. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
# =============================================================================
|
|
||||||
|
|
||||||
|
|
||||||
from collections import OrderedDict
|
|
||||||
|
|
||||||
import gui.mainFrame
|
|
||||||
from eos.graph.fitShieldRegenVsShieldPerc import FitShieldRegenVsShieldPercGraph as EosGraph
|
|
||||||
from .base import FitGraph, XDef, YDef
|
|
||||||
|
|
||||||
|
|
||||||
class FitShieldRegenVsShieldPercGraph(FitGraph):
|
|
||||||
|
|
||||||
name = 'Shield Regen vs Shield Amount'
|
|
||||||
|
|
||||||
def __init__(self):
|
|
||||||
super().__init__()
|
|
||||||
self.eosGraph = EosGraph()
|
|
||||||
self.mainFrame = gui.mainFrame.MainFrame.getInstance()
|
|
||||||
|
|
||||||
@property
|
|
||||||
def xDef(self):
|
|
||||||
return XDef(inputDefault='0-100', inputLabel='Shield amount (percent)', inputIconID=1384, axisLabel='Shield amount, %')
|
|
||||||
|
|
||||||
@property
|
|
||||||
def yDefs(self):
|
|
||||||
axisLabel = 'Shield regen, {}/s'.format('EHP' if self.mainFrame.statsPane.nameViewMap["resistancesViewFull"].showEffective else 'HP')
|
|
||||||
return OrderedDict([('shieldRegen', YDef(switchLabel='Shield regen', axisLabel=axisLabel, eosGraph='eosGraph'))])
|
|
||||||
|
|
||||||
@property
|
|
||||||
def redrawOnEffectiveChange(self):
|
|
||||||
return True
|
|
||||||
|
|
||||||
|
|
||||||
FitShieldRegenVsShieldPercGraph.register()
|
|
||||||
@@ -29,33 +29,23 @@ AU_METERS = 149597870700
|
|||||||
|
|
||||||
class FitWarpTimeGraph(FitGraph):
|
class FitWarpTimeGraph(FitGraph):
|
||||||
|
|
||||||
name = 'Warp Time'
|
|
||||||
|
|
||||||
# UI stuff
|
# UI stuff
|
||||||
@property
|
name = 'Warp Time'
|
||||||
def xDefs(self):
|
xDefs = [
|
||||||
return [
|
XDef(handle='distance', unit='AU', label='Distance', mainInput=('distance', 'AU')),
|
||||||
XDef(handle='distance', unit='AU', label='Distance', mainInput=('distance', 'AU')),
|
XDef(handle='distance', unit='km', label='Distance', mainInput=('distance', 'km'))]
|
||||||
XDef(handle='distance', unit='km', label='Distance', mainInput=('distance', 'km'))]
|
yDefs = [
|
||||||
|
YDef(handle='time', unit='s', label='Warp time')]
|
||||||
@property
|
inputs = [
|
||||||
def yDefs(self):
|
Input(handle='distance', unit='AU', label='Distance', iconID=1391, defaultValue=20, defaultRange=(0, 50), mainOnly=False),
|
||||||
return [YDef(handle='time', unit='s', label='Warp time')]
|
Input(handle='distance', unit='km', label='Distance', iconID=1391, defaultValue=1000, defaultRange=(150, 5000), mainOnly=False)]
|
||||||
|
|
||||||
@property
|
|
||||||
def inputs(self):
|
|
||||||
return [
|
|
||||||
Input(handle='distance', unit='AU', label='Distance', iconID=1391, defaultValue=50, defaultRange=(0, 50), mainOnly=False),
|
|
||||||
Input(handle='distance', unit='km', label='Distance', iconID=1391, defaultValue=10000, defaultRange=(150, 5000), mainOnly=False)]
|
|
||||||
|
|
||||||
# Calculation stuff
|
# Calculation stuff
|
||||||
_normalizers = {
|
_normalizers = {
|
||||||
('distance', 'AU'): lambda v, fit, tgt: v * AU_METERS,
|
('distance', 'AU'): lambda v, fit, tgt: v * AU_METERS,
|
||||||
('distance', 'km'): lambda v, fit, tgt: v * 1000}
|
('distance', 'km'): lambda v, fit, tgt: v * 1000}
|
||||||
|
|
||||||
_limiters = {
|
_limiters = {
|
||||||
'distance': lambda fit, tgt: (0, fit.maxWarpDistance * AU_METERS)}
|
'distance': lambda fit, tgt: (0, fit.maxWarpDistance * AU_METERS)}
|
||||||
|
|
||||||
_denormalizers = {
|
_denormalizers = {
|
||||||
('distance', 'AU'): lambda v, fit, tgt: v / AU_METERS,
|
('distance', 'AU'): lambda v, fit, tgt: v / AU_METERS,
|
||||||
('distance', 'km'): lambda v, fit, tgt: v / 1000}
|
('distance', 'km'): lambda v, fit, tgt: v / 1000}
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ import gui.mainFrame
|
|||||||
import gui.globalEvents as GE
|
import gui.globalEvents as GE
|
||||||
from gui.utils import fonts
|
from gui.utils import fonts
|
||||||
|
|
||||||
|
|
||||||
EffectiveHpToggled, EFFECTIVE_HP_TOGGLED = wx.lib.newevent.NewEvent()
|
EffectiveHpToggled, EFFECTIVE_HP_TOGGLED = wx.lib.newevent.NewEvent()
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -121,8 +121,6 @@ class GraphFrame(wx.Frame):
|
|||||||
self.Bind(wx.EVT_CHAR_HOOK, self.kbEvent)
|
self.Bind(wx.EVT_CHAR_HOOK, self.kbEvent)
|
||||||
# Event bindings - external events
|
# Event bindings - external events
|
||||||
self.mainFrame.Bind(GE.FIT_CHANGED, self.OnFitChanged)
|
self.mainFrame.Bind(GE.FIT_CHANGED, self.OnFitChanged)
|
||||||
from gui.builtinStatsViews.resistancesViewFull import EFFECTIVE_HP_TOGGLED # Grr crclar gons
|
|
||||||
self.mainFrame.Bind(EFFECTIVE_HP_TOGGLED, self.OnEhpToggled)
|
|
||||||
|
|
||||||
self.Layout()
|
self.Layout()
|
||||||
self.UpdateWindowSize()
|
self.UpdateWindowSize()
|
||||||
@@ -150,13 +148,6 @@ class GraphFrame(wx.Frame):
|
|||||||
return
|
return
|
||||||
event.Skip()
|
event.Skip()
|
||||||
|
|
||||||
def OnEhpToggled(self, event):
|
|
||||||
event.Skip()
|
|
||||||
view = self.getView()
|
|
||||||
if view.redrawOnEffectiveChange:
|
|
||||||
view.clearCache()
|
|
||||||
self.draw()
|
|
||||||
|
|
||||||
def OnFitChanged(self, event):
|
def OnFitChanged(self, event):
|
||||||
event.Skip()
|
event.Skip()
|
||||||
self.getView().clearCache(key=event.fitID)
|
self.getView().clearCache(key=event.fitID)
|
||||||
@@ -171,7 +162,6 @@ class GraphFrame(wx.Frame):
|
|||||||
def closeWindow(self):
|
def closeWindow(self):
|
||||||
from gui.builtinStatsViews.resistancesViewFull import EFFECTIVE_HP_TOGGLED
|
from gui.builtinStatsViews.resistancesViewFull import EFFECTIVE_HP_TOGGLED
|
||||||
self.mainFrame.Unbind(GE.FIT_CHANGED, handler=self.OnFitChanged)
|
self.mainFrame.Unbind(GE.FIT_CHANGED, handler=self.OnFitChanged)
|
||||||
self.mainFrame.Unbind(EFFECTIVE_HP_TOGGLED, handler=self.OnEhpToggled)
|
|
||||||
self.ctrlPanel.unbindExternalEvents()
|
self.ctrlPanel.unbindExternalEvents()
|
||||||
self.Destroy()
|
self.Destroy()
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user