diff --git a/gui/builtinGraphs/fitCapRegen/graph.py b/gui/builtinGraphs/fitCapRegen/graph.py index 6a7afe690..8f3807a91 100644 --- a/gui/builtinGraphs/fitCapRegen/graph.py +++ b/gui/builtinGraphs/fitCapRegen/graph.py @@ -46,7 +46,6 @@ class FitCapRegenGraph(FitGraph): 'capAmount': lambda fit, tgt: (0, fit.ship.getModifiedItemAttr('capacitorCapacity'))} _denormalizers = { ('capAmount', '%'): lambda v, fit, tgt: v * 100 / fit.ship.getModifiedItemAttr('capacitorCapacity')} - _getters = { ('time', 'capAmount'): Time2CapAmountGetter, ('time', 'capRegen'): Time2CapRegenGetter, diff --git a/gui/builtinGraphs/fitMobility/graph.py b/gui/builtinGraphs/fitMobility/graph.py index b37b7c8d9..e4b0078ea 100644 --- a/gui/builtinGraphs/fitMobility/graph.py +++ b/gui/builtinGraphs/fitMobility/graph.py @@ -39,7 +39,6 @@ class FitMobilityVsTimeGraph(FitGraph): # Calculation stuff _denormalizers = { ('distance', 'km'): lambda v, fit, tgt: v / 1000} - _getters = { ('time', 'speed'): Time2SpeedGetter, ('time', 'distance'): Time2DistanceGetter} diff --git a/gui/builtinGraphs/fitShieldRegen.py b/gui/builtinGraphs/fitShieldRegen.py deleted file mode 100644 index 7bdde003f..000000000 --- a/gui/builtinGraphs/fitShieldRegen.py +++ /dev/null @@ -1,118 +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 . -# ============================================================================= - - -import math - -from .base import FitGraph, XDef, YDef, Input - - -class FitShieldRegenGraph(FitGraph): - - # UI stuff - internalName = 'shieldRegenGraph' - 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)] - srcExtraCols = ('ShieldAmount', 'ShieldTime') - - # 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 _time2shieldAmountFull(self, mainParam, miscParams, fit, tgt): - xs = [] - ys = [] - maxShieldAmount = fit.ship.getModifiedItemAttr('shieldCapacity') - shieldRegenTime = fit.ship.getModifiedItemAttr('shieldRechargeRate') / 1000 - for time in self._iterLinear(mainParam[1]): - currentShieldAmount = calculateShieldAmount(maxShieldAmount=maxShieldAmount, shieldRegenTime=shieldRegenTime, time=time) - xs.append(time) - ys.append(currentShieldAmount) - return xs, ys - - def _time2shieldRegenFull(self, mainParam, miscParams, fit, tgt): - xs = [] - ys = [] - maxShieldAmount = fit.ship.getModifiedItemAttr('shieldCapacity') - shieldRegenTime = fit.ship.getModifiedItemAttr('shieldRechargeRate') / 1000 - for time in self._iterLinear(mainParam[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 _shieldAmount2shieldAmountFull(self, mainParam, miscParams, fit, tgt): - # Useless, but valid combination of x and y - xs = [] - ys = [] - for currentShieldAmount in self._iterLinear(mainParam[1]): - xs.append(currentShieldAmount) - ys.append(currentShieldAmount) - return xs, ys - - def _shieldAmount2shieldRegenFull(self, mainParam, miscParams, fit, tgt): - xs = [] - ys = [] - maxShieldAmount = fit.ship.getModifiedItemAttr('shieldCapacity') - shieldRegenTime = fit.ship.getModifiedItemAttr('shieldRechargeRate') / 1000 - for currentShieldAmount in self._iterLinear(mainParam[1]): - currentShieldRegen = calculateShieldRegen(maxShieldAmount=maxShieldAmount, shieldRegenTime=shieldRegenTime, currentShieldAmount=currentShieldAmount) - xs.append(currentShieldAmount) - ys.append(currentShieldRegen) - return xs, ys - - _getters = { - ('time', 'shieldAmount'): _time2shieldAmountFull, - ('time', 'shieldRegen'): _time2shieldRegenFull, - ('shieldAmount', 'shieldAmount'): _shieldAmount2shieldAmountFull, - ('shieldAmount', 'shieldRegen'): _shieldAmount2shieldRegenFull} - - -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() diff --git a/gui/builtinGraphs/fitShieldRegen/__init__.py b/gui/builtinGraphs/fitShieldRegen/__init__.py new file mode 100644 index 000000000..7d3c26546 --- /dev/null +++ b/gui/builtinGraphs/fitShieldRegen/__init__.py @@ -0,0 +1 @@ +import gui.builtinGraphs.fitShieldRegen.graph # noqa: E402,F401 diff --git a/gui/builtinGraphs/fitShieldRegen/getter.py b/gui/builtinGraphs/fitShieldRegen/getter.py new file mode 100644 index 000000000..faf723e58 --- /dev/null +++ b/gui/builtinGraphs/fitShieldRegen/getter.py @@ -0,0 +1,91 @@ +# ============================================================================= +# 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 . +# ============================================================================= + + +import math + +from gui.builtinGraphs.base import SmoothPointGetter + + +class Time2ShieldAmountGetter(SmoothPointGetter): + + def _getCommonData(self, miscParams, fit, tgt): + return { + 'maxShieldAmount': fit.ship.getModifiedItemAttr('shieldCapacity'), + 'shieldRegenTime': fit.ship.getModifiedItemAttr('shieldRechargeRate') / 1000} + + def _calculatePoint(self, x, miscParams, fit, tgt, commonData): + y = calculateShieldAmount( + maxShieldAmount=commonData['maxShieldAmount'], + shieldRegenTime=commonData['shieldRegenTime'], + time=x) + return y + + +class Time2ShieldRegenGetter(SmoothPointGetter): + + def _getCommonData(self, miscParams, fit, tgt): + return { + 'maxShieldAmount': fit.ship.getModifiedItemAttr('shieldCapacity'), + 'shieldRegenTime': fit.ship.getModifiedItemAttr('shieldRechargeRate') / 1000} + + def _calculatePoint(self, x, miscParams, fit, tgt, commonData): + currentShieldAmount = calculateShieldAmount( + maxShieldAmount=commonData['maxShieldAmount'], + shieldRegenTime=commonData['shieldRegenTime'], + time=x) + y = calculateShieldRegen( + maxShieldAmount=commonData['maxShieldAmount'], + shieldRegenTime=commonData['shieldRegenTime'], + currentShieldAmount=currentShieldAmount) + return y + + +# Useless, but valid combination of x and y +class ShieldAmount2ShieldAmountGetter(SmoothPointGetter): + + def _calculatePoint(self, x, miscParams, fit, tgt, commonData): + return x + + +class ShieldAmount2ShieldRegenGetter(SmoothPointGetter): + + def _getCommonData(self, miscParams, fit, tgt): + return { + 'maxShieldAmount': fit.ship.getModifiedItemAttr('shieldCapacity'), + 'shieldRegenTime': fit.ship.getModifiedItemAttr('shieldRechargeRate') / 1000} + + def _calculatePoint(self, x, miscParams, fit, tgt, commonData): + y = calculateShieldRegen( + maxShieldAmount=commonData['maxShieldAmount'], + shieldRegenTime=commonData['shieldRegenTime'], + currentShieldAmount=x) + return y + + +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) diff --git a/gui/builtinGraphs/fitShieldRegen/graph.py b/gui/builtinGraphs/fitShieldRegen/graph.py new file mode 100644 index 000000000..3f8e6432a --- /dev/null +++ b/gui/builtinGraphs/fitShieldRegen/graph.py @@ -0,0 +1,63 @@ +# ============================================================================= +# 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 . +# ============================================================================= + + +from gui.builtinGraphs.base import FitGraph, XDef, YDef, Input +from .getter import ( + Time2ShieldAmountGetter, Time2ShieldRegenGetter, + ShieldAmount2ShieldAmountGetter, ShieldAmount2ShieldRegenGetter) + + +class FitShieldRegenGraph(FitGraph): + + # UI stuff + internalName = 'shieldRegenGraph' + 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)] + srcExtraCols = ('ShieldAmount', 'ShieldTime') + + # 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')} + _getters = { + ('time', 'shieldAmount'): Time2ShieldAmountGetter, + ('time', 'shieldRegen'): Time2ShieldRegenGetter, + ('shieldAmount', 'shieldAmount'): ShieldAmount2ShieldAmountGetter, + ('shieldAmount', 'shieldRegen'): ShieldAmount2ShieldRegenGetter} + + +FitShieldRegenGraph.register() diff --git a/gui/builtinGraphs/fitWarpTime/graph.py b/gui/builtinGraphs/fitWarpTime/graph.py index 986c6da0a..a3068509e 100644 --- a/gui/builtinGraphs/fitWarpTime/graph.py +++ b/gui/builtinGraphs/fitWarpTime/graph.py @@ -58,7 +58,6 @@ class FitWarpTimeGraph(FitGraph): _denormalizers = { ('distance', 'AU'): lambda v, fit, tgt: v / AU_METERS, ('distance', 'km'): lambda v, fit, tgt: v / 1000} - _getters = { ('distance', 'time'): Distance2TimeGetter}