diff --git a/_development/helpers.py b/_development/helpers.py
index 3f4635891..2ba4811ed 100644
--- a/_development/helpers.py
+++ b/_development/helpers.py
@@ -72,7 +72,7 @@ def DBInMemory_test():
# noinspection PyPep8
#from eos.db.gamedata import alphaClones, attribute, category, effect, group, icon, item, marketGroup, metaData, metaGroup, queries, traits, unit
# noinspection PyPep8
- #from eos.db.saveddata import booster, cargo, character, crest, damagePattern, databaseRepair, drone, fighter, fit, implant, implantSet, loadDefaultDatabaseValues, miscData, module, override, price, queries, skill, targetResists, user
+ #from eos.db.saveddata import booster, cargo, character, crest, damagePattern, databaseRepair, drone, fighter, fit, implant, implantSet, loadDefaultDatabaseValues, miscData, module, override, price, queries, skill, targetProfile, user
# If using in memory saveddata, you'll want to reflect it so the data structure is good.
if saveddata_connectionstring == "sqlite:///:memory:":
diff --git a/eos/db/__init__.py b/eos/db/__init__.py
index f02e9d944..ee2248f42 100644
--- a/eos/db/__init__.py
+++ b/eos/db/__init__.py
@@ -81,7 +81,7 @@ sd_lock = threading.RLock()
from eos.db.gamedata import alphaClones, attribute, category, effect, group, item, marketGroup, metaData, metaGroup, queries, traits, unit, dynamicAttributes
# noinspection PyPep8
from eos.db.saveddata import booster, cargo, character, damagePattern, databaseRepair, drone, fighter, fit, implant, implantSet, loadDefaultDatabaseValues, \
- miscData, mutator, module, override, price, queries, skill, targetResists, user
+ miscData, mutator, module, override, price, queries, skill, targetProfile, user
# Import queries
# noinspection PyPep8
diff --git a/eos/db/saveddata/__init__.py b/eos/db/saveddata/__init__.py
index c36517623..04d454283 100644
--- a/eos/db/saveddata/__init__.py
+++ b/eos/db/saveddata/__init__.py
@@ -11,7 +11,7 @@ __all__ = [
"implant",
"damagePattern",
"miscData",
- "targetResists",
+ "targetProfile",
"override",
"implantSet",
"loadDefaultDatabaseValues"
diff --git a/eos/db/saveddata/fit.py b/eos/db/saveddata/fit.py
index 57426815f..28e15b1ab 100644
--- a/eos/db/saveddata/fit.py
+++ b/eos/db/saveddata/fit.py
@@ -41,7 +41,7 @@ from eos.saveddata.fighter import Fighter
from eos.saveddata.fit import Fit as es_Fit
from eos.saveddata.implant import Implant
from eos.saveddata.module import Module
-from eos.saveddata.targetResists import TargetResists
+from eos.saveddata.targetProfile import TargetProfile
from eos.saveddata.user import User
@@ -232,7 +232,7 @@ mapper(es_Fit, fits_table,
Character,
backref="fits"),
"_Fit__damagePattern": relation(DamagePattern),
- "_Fit__targetResists": relation(TargetResists),
+ "_Fit__targetProfile": relation(TargetProfile),
"projectedOnto": projectedFitSourceRel,
"victimOf": relationship(
ProjectedFit,
diff --git a/eos/db/saveddata/loadDefaultDatabaseValues.py b/eos/db/saveddata/loadDefaultDatabaseValues.py
index f329ab2d6..fbaa35acf 100644
--- a/eos/db/saveddata/loadDefaultDatabaseValues.py
+++ b/eos/db/saveddata/loadDefaultDatabaseValues.py
@@ -19,7 +19,7 @@
import eos.db
from eos.saveddata.damagePattern import DamagePattern as es_DamagePattern
-from eos.saveddata.targetResists import TargetResists as es_TargetResists
+from eos.saveddata.targetProfile import TargetProfile as es_TargetProfile
class ImportError(Exception):
@@ -188,9 +188,9 @@ class DefaultDatabaseValues:
for targetResistProfileRow in targetResistProfileList:
name, em, therm, kin, exp = targetResistProfileRow
- resistsProfile = eos.db.eos.db.getTargetResists(name)
+ resistsProfile = eos.db.eos.db.getTargetProfile(name)
if resistsProfile is None:
- resistsProfile = es_TargetResists(em, therm, kin, exp)
+ resistsProfile = es_TargetProfile(em, therm, kin, exp)
resistsProfile.name = name
eos.db.save(resistsProfile)
diff --git a/eos/db/saveddata/queries.py b/eos/db/saveddata/queries.py
index ae66e9285..122c3fe66 100644
--- a/eos/db/saveddata/queries.py
+++ b/eos/db/saveddata/queries.py
@@ -30,7 +30,7 @@ from eos.saveddata.price import Price
from eos.saveddata.user import User
from eos.saveddata.ssocharacter import SsoCharacter
from eos.saveddata.damagePattern import DamagePattern
-from eos.saveddata.targetResists import TargetResists
+from eos.saveddata.targetProfile import TargetProfile
from eos.saveddata.character import Character
from eos.saveddata.implantSet import ImplantSet
from eos.saveddata.fit import Fit
@@ -366,16 +366,16 @@ def clearDamagePatterns():
return deleted_rows
-def getTargetResistsList(eager=None):
+def getTargetProfileList(eager=None):
eager = processEager(eager)
with sd_lock:
- patterns = saveddata_session.query(TargetResists).options(*eager).all()
+ patterns = saveddata_session.query(TargetProfile).options(*eager).all()
return patterns
-def clearTargetResists():
+def clearTargetProfiles():
with sd_lock:
- deleted_rows = saveddata_session.query(TargetResists).delete()
+ deleted_rows = saveddata_session.query(TargetProfile).delete()
commit()
return deleted_rows
@@ -408,22 +408,22 @@ def getDamagePattern(lookfor, eager=None):
return pattern
-@cachedQuery(TargetResists, 1, "lookfor")
-def getTargetResists(lookfor, eager=None):
+@cachedQuery(TargetProfile, 1, "lookfor")
+def getTargetProfile(lookfor, eager=None):
if isinstance(lookfor, int):
if eager is None:
with sd_lock:
- pattern = saveddata_session.query(TargetResists).get(lookfor)
+ pattern = saveddata_session.query(TargetProfile).get(lookfor)
else:
eager = processEager(eager)
with sd_lock:
- pattern = saveddata_session.query(TargetResists).options(*eager).filter(
- TargetResists.ID == lookfor).first()
+ pattern = saveddata_session.query(TargetProfile).options(*eager).filter(
+ TargetProfile.ID == lookfor).first()
elif isinstance(lookfor, str):
eager = processEager(eager)
with sd_lock:
- pattern = saveddata_session.query(TargetResists).options(*eager).filter(
- TargetResists.name == lookfor).first()
+ pattern = saveddata_session.query(TargetProfile).options(*eager).filter(
+ TargetProfile.name == lookfor).first()
else:
raise TypeError("Need integer or string as argument")
return pattern
@@ -439,11 +439,11 @@ def getImplantSet(lookfor, eager=None):
eager = processEager(eager)
with sd_lock:
pattern = saveddata_session.query(ImplantSet).options(*eager).filter(
- TargetResists.ID == lookfor).first()
+ TargetProfile.ID == lookfor).first()
elif isinstance(lookfor, str):
eager = processEager(eager)
with sd_lock:
- pattern = saveddata_session.query(ImplantSet).options(*eager).filter(TargetResists.name == lookfor).first()
+ pattern = saveddata_session.query(ImplantSet).options(*eager).filter(TargetProfile.name == lookfor).first()
else:
raise TypeError("Improper argument")
return pattern
diff --git a/eos/db/saveddata/targetProfile.py b/eos/db/saveddata/targetProfile.py
new file mode 100644
index 000000000..0f1ba836c
--- /dev/null
+++ b/eos/db/saveddata/targetProfile.py
@@ -0,0 +1,42 @@
+# ===============================================================================
+# Copyright (C) 2014 Ryan Holmes
+#
+# This file is part of eos.
+#
+# eos is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 2 of the License, or
+# (at your option) any later version.
+#
+# eos 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 Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with eos. If not, see .
+# ===============================================================================
+
+from sqlalchemy import Table, Column, Integer, Float, ForeignKey, String, DateTime
+from sqlalchemy.orm import mapper
+import datetime
+
+from eos.db import saveddata_meta
+from eos.saveddata.targetProfile import TargetProfile
+
+targetProfiles_table = Table("targetResists", saveddata_meta,
+ Column("ID", Integer, primary_key=True),
+ Column("name", String),
+ Column("emAmount", Float),
+ Column("thermalAmount", Float),
+ Column("kineticAmount", Float),
+ Column("explosiveAmount", Float),
+ Column("maxVelocity", Float, nullable=True),
+ Column("signatureRadius", Float, nullable=True),
+ Column("radius", Float, nullable=True),
+ Column("ownerID", ForeignKey("users.ID"), nullable=True),
+ Column("created", DateTime, nullable=True, default=datetime.datetime.now),
+ Column("modified", DateTime, nullable=True, onupdate=datetime.datetime.now)
+ )
+
+mapper(TargetProfile, targetProfiles_table)
diff --git a/eos/db/saveddata/targetResists.py b/eos/db/saveddata/targetResists.py
deleted file mode 100644
index 9e38382bd..000000000
--- a/eos/db/saveddata/targetResists.py
+++ /dev/null
@@ -1,42 +0,0 @@
-# ===============================================================================
-# Copyright (C) 2014 Ryan Holmes
-#
-# This file is part of eos.
-#
-# eos is free software: you can redistribute it and/or modify
-# it under the terms of the GNU Lesser General Public License as published by
-# the Free Software Foundation, either version 2 of the License, or
-# (at your option) any later version.
-#
-# eos 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 Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public License
-# along with eos. If not, see .
-# ===============================================================================
-
-from sqlalchemy import Table, Column, Integer, Float, ForeignKey, String, DateTime
-from sqlalchemy.orm import mapper
-import datetime
-
-from eos.db import saveddata_meta
-from eos.saveddata.targetResists import TargetResists
-
-targetResists_table = Table("targetResists", saveddata_meta,
- Column("ID", Integer, primary_key=True),
- Column("name", String),
- Column("emAmount", Float),
- Column("thermalAmount", Float),
- Column("kineticAmount", Float),
- Column("explosiveAmount", Float),
- Column("maxVelocity", Float, nullable=True),
- Column("signatureRadius", Float, nullable=True),
- Column("radius", Float, nullable=True),
- Column("ownerID", ForeignKey("users.ID"), nullable=True),
- Column("created", DateTime, nullable=True, default=datetime.datetime.now),
- Column("modified", DateTime, nullable=True, onupdate=datetime.datetime.now)
- )
-
-mapper(TargetResists, targetResists_table)
diff --git a/eos/saveddata/drone.py b/eos/saveddata/drone.py
index 98d193a6a..21f876b98 100644
--- a/eos/saveddata/drone.py
+++ b/eos/saveddata/drone.py
@@ -138,7 +138,7 @@ class Drone(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut):
return True
return False
- def getVolleyParameters(self, targetResists=None):
+ def getVolleyParameters(self, targetProfile=None):
if not self.dealsDamage or self.amountActive <= 0:
return {0: DmgTypes(0, 0, 0, 0)}
if self.__baseVolley is None:
@@ -150,17 +150,17 @@ class Drone(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut):
kinetic=(dmgGetter("kineticDamage", 0)) * dmgMult,
explosive=(dmgGetter("explosiveDamage", 0)) * dmgMult)
volley = DmgTypes(
- em=self.__baseVolley.em * (1 - getattr(targetResists, "emAmount", 0)),
- thermal=self.__baseVolley.thermal * (1 - getattr(targetResists, "thermalAmount", 0)),
- kinetic=self.__baseVolley.kinetic * (1 - getattr(targetResists, "kineticAmount", 0)),
- explosive=self.__baseVolley.explosive * (1 - getattr(targetResists, "explosiveAmount", 0)))
+ em=self.__baseVolley.em * (1 - getattr(targetProfile, "emAmount", 0)),
+ thermal=self.__baseVolley.thermal * (1 - getattr(targetProfile, "thermalAmount", 0)),
+ kinetic=self.__baseVolley.kinetic * (1 - getattr(targetProfile, "kineticAmount", 0)),
+ explosive=self.__baseVolley.explosive * (1 - getattr(targetProfile, "explosiveAmount", 0)))
return {0: volley}
- def getVolley(self, targetResists=None):
- return self.getVolleyParameters(targetResists=targetResists)[0]
+ def getVolley(self, targetProfile=None):
+ return self.getVolleyParameters(targetProfile=targetProfile)[0]
- def getDps(self, targetResists=None):
- volley = self.getVolley(targetResists=targetResists)
+ def getDps(self, targetProfile=None):
+ volley = self.getVolley(targetProfile=targetProfile)
if not volley:
return DmgTypes(0, 0, 0, 0)
cycleParams = self.getCycleParameters()
diff --git a/eos/saveddata/fighter.py b/eos/saveddata/fighter.py
index 96d5e8a9d..c9dbffe0c 100644
--- a/eos/saveddata/fighter.py
+++ b/eos/saveddata/fighter.py
@@ -183,7 +183,7 @@ class Fighter(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut):
return True
return False
- def getVolleyParametersPerEffect(self, targetResists=None):
+ def getVolleyParametersPerEffect(self, targetProfile=None):
if not self.active or self.amountActive <= 0:
return {}
if self.__baseVolley is None:
@@ -196,21 +196,21 @@ class Fighter(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut):
adjustedVolley[effectID] = {}
for volleyTime, volleyValue in effectData.items():
adjustedVolley[effectID][volleyTime] = DmgTypes(
- em=volleyValue.em * (1 - getattr(targetResists, "emAmount", 0)),
- thermal=volleyValue.thermal * (1 - getattr(targetResists, "thermalAmount", 0)),
- kinetic=volleyValue.kinetic * (1 - getattr(targetResists, "kineticAmount", 0)),
- explosive=volleyValue.explosive * (1 - getattr(targetResists, "explosiveAmount", 0)))
+ em=volleyValue.em * (1 - getattr(targetProfile, "emAmount", 0)),
+ thermal=volleyValue.thermal * (1 - getattr(targetProfile, "thermalAmount", 0)),
+ kinetic=volleyValue.kinetic * (1 - getattr(targetProfile, "kineticAmount", 0)),
+ explosive=volleyValue.explosive * (1 - getattr(targetProfile, "explosiveAmount", 0)))
return adjustedVolley
- def getVolleyPerEffect(self, targetResists=None):
- volleyParams = self.getVolleyParametersPerEffect(targetResists=targetResists)
+ def getVolleyPerEffect(self, targetProfile=None):
+ volleyParams = self.getVolleyParametersPerEffect(targetProfile=targetProfile)
volleyMap = {}
for effectID, volleyData in volleyParams.items():
volleyMap[effectID] = volleyData[0]
return volleyMap
- def getVolley(self, targetResists=None):
- volleyParams = self.getVolleyParametersPerEffect(targetResists=targetResists)
+ def getVolley(self, targetProfile=None):
+ volleyParams = self.getVolleyParametersPerEffect(targetProfile=targetProfile)
em = 0
therm = 0
kin = 0
@@ -222,30 +222,30 @@ class Fighter(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut):
exp += volleyData[0].explosive
return DmgTypes(em, therm, kin, exp)
- def getDps(self, targetResists=None):
+ def getDps(self, targetProfile=None):
em = 0
thermal = 0
kinetic = 0
explosive = 0
- for dps in self.getDpsPerEffect(targetResists=targetResists).values():
+ for dps in self.getDpsPerEffect(targetProfile=targetProfile).values():
em += dps.em
thermal += dps.thermal
kinetic += dps.kinetic
explosive += dps.explosive
return DmgTypes(em=em, thermal=thermal, kinetic=kinetic, explosive=explosive)
- def getDpsPerEffect(self, targetResists=None):
+ def getDpsPerEffect(self, targetProfile=None):
if not self.active or self.amountActive <= 0:
return {}
- cycleParams = self.getCycleParametersPerEffectOptimizedDps(targetResists=targetResists)
+ cycleParams = self.getCycleParametersPerEffectOptimizedDps(targetProfile=targetProfile)
dpsMap = {}
for ability in self.abilities:
if ability.effectID in cycleParams:
cycleTime = cycleParams[ability.effectID].averageTime
- dpsMap[ability.effectID] = ability.getDps(targetResists=targetResists, cycleTimeOverride=cycleTime)
+ dpsMap[ability.effectID] = ability.getDps(targetProfile=targetProfile, cycleTimeOverride=cycleTime)
return dpsMap
- def getCycleParametersPerEffectOptimizedDps(self, targetResists=None, reloadOverride=None):
+ def getCycleParametersPerEffectOptimizedDps(self, targetProfile=None, reloadOverride=None):
cycleParamsInfinite = self.getCycleParametersPerEffectInfinite()
cycleParamsReload = self.getCycleParametersPerEffect(reloadOverride=reloadOverride)
dpsMapOnlyInfinite = {}
@@ -254,10 +254,10 @@ class Fighter(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut):
for ability in self.abilities:
if ability.effectID in cycleParamsInfinite:
cycleTime = cycleParamsInfinite[ability.effectID].averageTime
- dpsMapOnlyInfinite[ability.effectID] = ability.getDps(targetResists=targetResists, cycleTimeOverride=cycleTime)
+ dpsMapOnlyInfinite[ability.effectID] = ability.getDps(targetProfile=targetProfile, cycleTimeOverride=cycleTime)
if ability.effectID in cycleParamsReload:
cycleTime = cycleParamsReload[ability.effectID].averageTime
- dpsMapAllWithReloads[ability.effectID] = ability.getDps(targetResists=targetResists, cycleTimeOverride=cycleTime)
+ dpsMapAllWithReloads[ability.effectID] = ability.getDps(targetProfile=targetProfile, cycleTimeOverride=cycleTime)
totalOnlyInfinite = sum(i.total for i in dpsMapOnlyInfinite.values())
totalAllWithReloads = sum(i.total for i in dpsMapAllWithReloads.values())
return cycleParamsInfinite if totalOnlyInfinite >= totalAllWithReloads else cycleParamsReload
diff --git a/eos/saveddata/fighterAbility.py b/eos/saveddata/fighterAbility.py
index b0640bccd..ea1a1e31a 100644
--- a/eos/saveddata/fighterAbility.py
+++ b/eos/saveddata/fighterAbility.py
@@ -114,7 +114,7 @@ class FighterAbility:
speed = self.fighter.getModifiedItemAttr("{}Duration".format(self.attrPrefix))
return speed
- def getVolley(self, targetResists=None):
+ def getVolley(self, targetProfile=None):
if not self.dealsDamage or not self.active:
return DmgTypes(0, 0, 0, 0)
if self.attrPrefix == "fighterAbilityLaunchBomb":
@@ -129,14 +129,14 @@ class FighterAbility:
exp = self.fighter.getModifiedItemAttr("{}DamageExp".format(self.attrPrefix), 0)
dmgMult = self.fighter.amountActive * self.fighter.getModifiedItemAttr("{}DamageMultiplier".format(self.attrPrefix), 1)
volley = DmgTypes(
- em=em * dmgMult * (1 - getattr(targetResists, "emAmount", 0)),
- thermal=therm * dmgMult * (1 - getattr(targetResists, "thermalAmount", 0)),
- kinetic=kin * dmgMult * (1 - getattr(targetResists, "kineticAmount", 0)),
- explosive=exp * dmgMult * (1 - getattr(targetResists, "explosiveAmount", 0)))
+ em=em * dmgMult * (1 - getattr(targetProfile, "emAmount", 0)),
+ thermal=therm * dmgMult * (1 - getattr(targetProfile, "thermalAmount", 0)),
+ kinetic=kin * dmgMult * (1 - getattr(targetProfile, "kineticAmount", 0)),
+ explosive=exp * dmgMult * (1 - getattr(targetProfile, "explosiveAmount", 0)))
return volley
- def getDps(self, targetResists=None, cycleTimeOverride=None):
- volley = self.getVolley(targetResists=targetResists)
+ def getDps(self, targetProfile=None, cycleTimeOverride=None):
+ volley = self.getVolley(targetProfile=targetProfile)
if not volley:
return DmgTypes(0, 0, 0, 0)
cycleTime = cycleTimeOverride if cycleTimeOverride is not None else self.cycleTime
diff --git a/eos/saveddata/fit.py b/eos/saveddata/fit.py
index e786543e7..c548e1b04 100644
--- a/eos/saveddata/fit.py
+++ b/eos/saveddata/fit.py
@@ -149,12 +149,12 @@ class Fit:
self.__capRecharge = None
@property
- def targetResists(self):
- return self.__targetResists
+ def targetProfile(self):
+ return self.__targetProfile
- @targetResists.setter
- def targetResists(self, targetResists):
- self.__targetResists = targetResists
+ @targetProfile.setter
+ def targetProfile(self, targetProfile):
+ self.__targetProfile = targetProfile
self.__weaponDpsMap = {}
self.__weaponVolleyMap = {}
self.__droneDps = None
@@ -1497,8 +1497,8 @@ class Fit:
weaponDps = DmgTypes(0, 0, 0, 0)
for mod in self.modules:
- weaponVolley += mod.getVolley(spoolOptions=spoolOptions, targetResists=self.targetResists)
- weaponDps += mod.getDps(spoolOptions=spoolOptions, targetResists=self.targetResists)
+ weaponVolley += mod.getVolley(spoolOptions=spoolOptions, targetProfile=self.targetProfile)
+ weaponDps += mod.getDps(spoolOptions=spoolOptions, targetProfile=self.targetProfile)
self.__weaponVolleyMap[spoolOptions] = weaponVolley
self.__weaponDpsMap[spoolOptions] = weaponDps
@@ -1508,12 +1508,12 @@ class Fit:
droneDps = DmgTypes(0, 0, 0, 0)
for drone in self.drones:
- droneVolley += drone.getVolley(targetResists=self.targetResists)
- droneDps += drone.getDps(targetResists=self.targetResists)
+ droneVolley += drone.getVolley(targetProfile=self.targetProfile)
+ droneDps += drone.getDps(targetProfile=self.targetProfile)
for fighter in self.fighters:
- droneVolley += fighter.getVolley(targetResists=self.targetResists)
- droneDps += fighter.getDps(targetResists=self.targetResists)
+ droneVolley += fighter.getVolley(targetProfile=self.targetProfile)
+ droneDps += fighter.getDps(targetProfile=self.targetProfile)
self.__droneDps = droneDps
self.__droneVolley = droneVolley
@@ -1557,7 +1557,7 @@ class Fit:
fitCopy.mode = deepcopy(self.mode)
fitCopy.name = "%s copy" % self.name
fitCopy.damagePattern = self.damagePattern
- fitCopy.targetResists = self.targetResists
+ fitCopy.targetProfile = self.targetProfile
fitCopy.implantLocation = self.implantLocation
fitCopy.systemSecurity = self.systemSecurity
fitCopy.notes = self.notes
diff --git a/eos/saveddata/module.py b/eos/saveddata/module.py
index b690d203a..5831bbe1a 100644
--- a/eos/saveddata/module.py
+++ b/eos/saveddata/module.py
@@ -421,7 +421,7 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut):
return True
return False
- def getVolleyParameters(self, spoolOptions=None, targetResists=None, ignoreState=False):
+ def getVolleyParameters(self, spoolOptions=None, targetProfile=None, ignoreState=False):
if self.isEmpty or (self.state < FittingModuleState.ACTIVE and not ignoreState):
return {0: DmgTypes(0, 0, 0, 0)}
if self.__baseVolley is None:
@@ -451,24 +451,24 @@ class Module(HandledItem, HandledCharge, ItemAttrShortcut, ChargeAttrShortcut):
adjustedVolley = {}
for volleyTime, volleyValue in self.__baseVolley.items():
adjustedVolley[volleyTime] = DmgTypes(
- em=volleyValue.em * spoolMultiplier * (1 - getattr(targetResists, "emAmount", 0)),
- thermal=volleyValue.thermal * spoolMultiplier * (1 - getattr(targetResists, "thermalAmount", 0)),
- kinetic=volleyValue.kinetic * spoolMultiplier * (1 - getattr(targetResists, "kineticAmount", 0)),
- explosive=volleyValue.explosive * spoolMultiplier * (1 - getattr(targetResists, "explosiveAmount", 0)))
+ em=volleyValue.em * spoolMultiplier * (1 - getattr(targetProfile, "emAmount", 0)),
+ thermal=volleyValue.thermal * spoolMultiplier * (1 - getattr(targetProfile, "thermalAmount", 0)),
+ kinetic=volleyValue.kinetic * spoolMultiplier * (1 - getattr(targetProfile, "kineticAmount", 0)),
+ explosive=volleyValue.explosive * spoolMultiplier * (1 - getattr(targetProfile, "explosiveAmount", 0)))
return adjustedVolley
- def getVolley(self, spoolOptions=None, targetResists=None, ignoreState=False):
- volleyParams = self.getVolleyParameters(spoolOptions=spoolOptions, targetResists=targetResists, ignoreState=ignoreState)
+ def getVolley(self, spoolOptions=None, targetProfile=None, ignoreState=False):
+ volleyParams = self.getVolleyParameters(spoolOptions=spoolOptions, targetProfile=targetProfile, ignoreState=ignoreState)
if len(volleyParams) == 0:
return DmgTypes(0, 0, 0, 0)
return volleyParams[min(volleyParams)]
- def getDps(self, spoolOptions=None, targetResists=None, ignoreState=False):
+ def getDps(self, spoolOptions=None, targetProfile=None, ignoreState=False):
dmgDuringCycle = DmgTypes(0, 0, 0, 0)
cycleParams = self.getCycleParameters()
if cycleParams is None:
return dmgDuringCycle
- volleyParams = self.getVolleyParameters(spoolOptions=spoolOptions, targetResists=targetResists, ignoreState=ignoreState)
+ volleyParams = self.getVolleyParameters(spoolOptions=spoolOptions, targetProfile=targetProfile, ignoreState=ignoreState)
avgCycleTime = cycleParams.averageTime
if len(volleyParams) == 0 or avgCycleTime == 0:
return dmgDuringCycle
diff --git a/eos/saveddata/targetResists.py b/eos/saveddata/targetProfile.py
similarity index 92%
rename from eos/saveddata/targetResists.py
rename to eos/saveddata/targetProfile.py
index 8b364e06e..5e13b2ffe 100644
--- a/eos/saveddata/targetResists.py
+++ b/eos/saveddata/targetProfile.py
@@ -24,7 +24,7 @@ import eos.db
pyfalog = Logger(__name__)
-class TargetResists:
+class TargetProfile:
# also determined import/export order - VERY IMPORTANT
DAMAGE_TYPES = ("em", "thermal", "kinetic", "explosive")
@@ -49,7 +49,7 @@ class TargetResists:
# When we import damage profiles, we create new ones and update old ones. To do this, get a list of current
# patterns to allow lookup
lookup = {}
- current = eos.db.getTargetResistsList()
+ current = eos.db.getTargetProfileList()
for pattern in current:
lookup[pattern.name] = pattern
@@ -64,7 +64,7 @@ class TargetResists:
pyfalog.warning("Data isn't in correct format, continue to next line.")
continue
- if type != "TargetResists":
+ if type not in ("TargetProfile", "TargetResists"):
continue
numPatterns += 1
@@ -86,7 +86,7 @@ class TargetResists:
pattern.update(**fields)
eos.db.save(pattern)
else:
- pattern = TargetResists(**fields)
+ pattern = TargetProfile(**fields)
pattern.name = name.strip()
eos.db.save(pattern)
patterns.append(pattern)
@@ -95,13 +95,13 @@ class TargetResists:
return patterns, numPatterns
- EXPORT_FORMAT = "TargetResists = %s,%.1f,%.1f,%.1f,%.1f\n"
+ EXPORT_FORMAT = "TargetProfile = %s,%.1f,%.1f,%.1f,%.1f\n"
@classmethod
def exportPatterns(cls, *patterns):
out = "# Exported from pyfa\n#\n"
out += "# Values are in following format:\n"
- out += "# TargetResists = [name],[EM %],[Thermal %],[Kinetic %],[Explosive %]\n\n"
+ out += "# TargetProfile = [name],[EM %],[Thermal %],[Kinetic %],[Explosive %]\n\n"
for dp in patterns:
out += cls.EXPORT_FORMAT % (
dp.name,
@@ -114,7 +114,7 @@ class TargetResists:
return out.strip()
def __deepcopy__(self, memo):
- p = TargetResists(
+ p = TargetProfile(
self.emAmount, self.thermalAmount, self.kineticAmount, self.explosiveAmount,
self.maxVelocity, self.signatureRadius, self.radius)
p.name = "%s copy" % self.name
diff --git a/gui/builtinContextMenus/__init__.py b/gui/builtinContextMenus/__init__.py
index af0e5e4ca..ee56a8191 100644
--- a/gui/builtinContextMenus/__init__.py
+++ b/gui/builtinContextMenus/__init__.py
@@ -39,7 +39,7 @@ from gui.builtinContextMenus import ( # noqa: E402,F401
damagePatternChange,
# Firepower panel
factorReload,
- targetResists,
+ targetProfile,
# Graph extra options
graphDmgIgnoreResists,
graphDmgApplyProjected,
diff --git a/gui/builtinContextMenus/targetResists.py b/gui/builtinContextMenus/targetProfile.py
similarity index 89%
rename from gui/builtinContextMenus/targetResists.py
rename to gui/builtinContextMenus/targetProfile.py
index b27c4ceef..7a578f250 100644
--- a/gui/builtinContextMenus/targetResists.py
+++ b/gui/builtinContextMenus/targetProfile.py
@@ -8,10 +8,10 @@ import gui.mainFrame
from gui.bitmap_loader import BitmapLoader
from gui.contextMenu import ContextMenuUnconditional
from service.fit import Fit
-from service.targetResists import TargetResists as svc_TargetResists
+from service.targetProfile import TargetProfile as svc_TargetProfile
-class TargetResists(ContextMenuUnconditional):
+class TargetProfile(ContextMenuUnconditional):
def __init__(self):
self.mainFrame = gui.mainFrame.MainFrame.getInstance()
@@ -20,13 +20,14 @@ class TargetResists(ContextMenuUnconditional):
if self.mainFrame.getActiveFit() is None or srcContext != "firepowerViewFull":
return False
- sTR = svc_TargetResists.getInstance()
- self.patterns = sTR.getTargetResistsList()
+ sTR = svc_TargetProfile.getInstance()
+ self.patterns = sTR.getTargetProfileList()
self.patterns.sort(key=lambda p: (p.name in ["None"], p.name))
return len(self.patterns) > 0
def getText(self, itmContext):
+ # We take into consideration just target resists, so call menu item accordingly
return "Target Resists"
def handleResistSwitch(self, event):
@@ -37,7 +38,7 @@ class TargetResists(ContextMenuUnconditional):
sFit = Fit.getInstance()
fitID = self.mainFrame.getActiveFit()
- sFit.setTargetResists(fitID, pattern)
+ sFit.setTargetProfile(fitID, pattern)
wx.PostEvent(self.mainFrame, GE.FitChanged(fitIDs=(fitID,)))
def addPattern(self, rootMenu, pattern):
@@ -55,7 +56,7 @@ class TargetResists(ContextMenuUnconditional):
sFit = Fit.getInstance()
fitID = self.mainFrame.getActiveFit()
f = sFit.getFit(fitID)
- tr = f.targetResists
+ tr = f.targetProfile
if tr == pattern:
bitmap = BitmapLoader.getBitmap("state_active_small", "gui")
@@ -108,4 +109,4 @@ class TargetResists(ContextMenuUnconditional):
return sub
-TargetResists.register()
+TargetProfile.register()
diff --git a/gui/builtinPreferenceViews/pyfaDatabasePreferences.py b/gui/builtinPreferenceViews/pyfaDatabasePreferences.py
index a55009f52..8494e68a7 100644
--- a/gui/builtinPreferenceViews/pyfaDatabasePreferences.py
+++ b/gui/builtinPreferenceViews/pyfaDatabasePreferences.py
@@ -2,7 +2,7 @@ import wx
import config
from eos.db.saveddata.loadDefaultDatabaseValues import DefaultDatabaseValues
-from eos.db.saveddata.queries import clearPrices, clearDamagePatterns, clearTargetResists
+from eos.db.saveddata.queries import clearPrices, clearDamagePatterns, clearTargetProfiles
from gui.bitmap_loader import BitmapLoader
from gui.preferenceView import PreferenceView
from gui.utils import helpers_wxPython as wxHelpers
@@ -83,9 +83,9 @@ class PFGeneralPref(PreferenceView):
btnSizer.Add(self.btnDeleteDamagePatterns, 0, wx.ALL, 5)
self.btnDeleteDamagePatterns.Bind(wx.EVT_BUTTON, self.DeleteDamagePatterns)
- self.btnDeleteTargetResists = wx.Button(panel, wx.ID_ANY, "Delete All Target Resist Profiles", wx.DefaultPosition, wx.DefaultSize, 0)
- btnSizer.Add(self.btnDeleteTargetResists, 0, wx.ALL, 5)
- self.btnDeleteTargetResists.Bind(wx.EVT_BUTTON, self.DeleteTargetResists)
+ self.btnDeleteTargetProfiles = wx.Button(panel, wx.ID_ANY, "Delete All Target Resist Profiles", wx.DefaultPosition, wx.DefaultSize, 0)
+ btnSizer.Add(self.btnDeleteTargetProfiles, 0, wx.ALL, 5)
+ self.btnDeleteTargetProfiles.Bind(wx.EVT_BUTTON, self.DeleteTargetProfiles)
self.btnPrices = wx.Button(panel, wx.ID_ANY, "Delete All Prices", wx.DefaultPosition, wx.DefaultSize, 0)
btnSizer.Add(self.btnPrices, 0, wx.ALL, 5)
@@ -110,10 +110,10 @@ class PFGeneralPref(PreferenceView):
if wxHelpers.YesNoDialog(question, "Confirm"):
clearDamagePatterns()
- def DeleteTargetResists(self, event):
+ def DeleteTargetProfiles(self, event):
question = "This is a destructive action that will delete all target resist profiles.\nAre you sure you want to do this?"
if wxHelpers.YesNoDialog(question, "Confirm"):
- clearTargetResists()
+ clearTargetProfiles()
def DeletePrices(self, event):
question = "This is a destructive action that will delete all cached prices out of the database.\nAre you sure you want to do this?"
diff --git a/gui/builtinStatsViews/firepowerViewFull.py b/gui/builtinStatsViews/firepowerViewFull.py
index 05e82eabc..2414b032d 100644
--- a/gui/builtinStatsViews/firepowerViewFull.py
+++ b/gui/builtinStatsViews/firepowerViewFull.py
@@ -146,7 +146,7 @@ class FirepowerViewFull(StatsView):
def refreshPanel(self, fit):
# If we did anything intresting, we'd update our labels to reflect the new fit's stats here
- if fit is not None and fit.targetResists is not None:
+ if fit is not None and fit.targetProfile is not None:
self.stEff.Show()
else:
self.stEff.Hide()
diff --git a/gui/builtinViewColumns/attributeDisplayGraph.py b/gui/builtinViewColumns/attributeDisplayGraph.py
index 6ac59a8f0..1f204bbe9 100644
--- a/gui/builtinViewColumns/attributeDisplayGraph.py
+++ b/gui/builtinViewColumns/attributeDisplayGraph.py
@@ -63,6 +63,7 @@ class GraphColumn(ViewColumn, metaclass=ABCMeta):
return self._getFitTooltip()
return ''
+
class DpsColumn(GraphColumn):
name = 'Dps'
diff --git a/gui/mainFrame.py b/gui/mainFrame.py
index 5c4251d6c..dc81bdbfc 100644
--- a/gui/mainFrame.py
+++ b/gui/mainFrame.py
@@ -57,7 +57,7 @@ from gui.marketBrowser import MarketBrowser
from gui.multiSwitch import MultiSwitch
from gui.patternEditor import DmgPatternEditorDlg
from gui.preferenceDialog import PreferenceDialog
-from gui.resistsEditor import ResistsEditorDlg
+from gui.targetProfileEditor import ResistsEditorDlg
from gui.setEditor import ImplantSetEditorDlg
from gui.shipBrowser import ShipBrowser
from gui.statsPane import StatsPane
@@ -397,7 +397,7 @@ class MainFrame(wx.Frame):
dlg = AttributeEditor(self)
dlg.Show()
- def showTargetResistsEditor(self, event):
+ def showTargetProfileEditor(self, event):
ResistsEditorDlg(self)
def showDamagePatternEditor(self, event):
@@ -472,8 +472,8 @@ class MainFrame(wx.Frame):
self.Bind(wx.EVT_MENU, self.showCharacterEditor, id=menuBar.characterEditorId)
# Damage pattern editor
self.Bind(wx.EVT_MENU, self.showDamagePatternEditor, id=menuBar.damagePatternEditorId)
- # Target Resists editor
- self.Bind(wx.EVT_MENU, self.showTargetResistsEditor, id=menuBar.targetResistsEditorId)
+ # Target Profile editor
+ self.Bind(wx.EVT_MENU, self.showTargetProfileEditor, id=menuBar.targetProfileEditorId)
# Implant Set editor
self.Bind(wx.EVT_MENU, self.showImplantSetEditor, id=menuBar.implantSetEditorId)
# Import dialog
diff --git a/gui/mainMenuBar.py b/gui/mainMenuBar.py
index 763120e69..625c6a740 100644
--- a/gui/mainMenuBar.py
+++ b/gui/mainMenuBar.py
@@ -38,7 +38,7 @@ class MainMenuBar(wx.MenuBar):
pyfalog.debug("Initialize MainMenuBar")
self.characterEditorId = wx.NewId()
self.damagePatternEditorId = wx.NewId()
- self.targetResistsEditorId = wx.NewId()
+ self.targetProfileEditorId = wx.NewId()
self.implantSetEditorId = wx.NewId()
self.graphFrameId = wx.NewId()
self.backupFitsId = wx.NewId()
@@ -156,9 +156,9 @@ class MainMenuBar(wx.MenuBar):
damagePatternEditItem = wx.MenuItem(editorsMenu, self.damagePatternEditorId, "&Damage Pattern Editor")
damagePatternEditItem.SetBitmap(BitmapLoader.getBitmap("damagePattern_small", "gui"))
editorsMenu.Append(damagePatternEditItem)
- targetResistsEditItem = wx.MenuItem(editorsMenu, self.targetResistsEditorId, "&Target Resists Editor")
- targetResistsEditItem.SetBitmap(BitmapLoader.getBitmap("explosive_small", "gui"))
- editorsMenu.Append(targetResistsEditItem)
+ targetProfileEditItem = wx.MenuItem(editorsMenu, self.targetProfileEditorId, "&Target Profile Editor")
+ targetProfileEditItem.SetBitmap(BitmapLoader.getBitmap("explosive_small", "gui"))
+ editorsMenu.Append(targetProfileEditItem)
# Help menu
helpMenu = wx.Menu()
diff --git a/gui/resistsEditor.py b/gui/targetProfileEditor.py
similarity index 91%
rename from gui/resistsEditor.py
rename to gui/targetProfileEditor.py
index 911349639..43c0f1e93 100644
--- a/gui/resistsEditor.py
+++ b/gui/targetProfileEditor.py
@@ -19,7 +19,7 @@
# noinspection PyPackageRequirements
import wx
-from service.targetResists import TargetResists
+from service.targetProfile import TargetProfile
from gui.bitmap_loader import BitmapLoader
from gui.utils.clipboard import toClipboard, fromClipboard
from gui.builtinViews.entityEditor import EntityEditor, BaseValidator
@@ -28,12 +28,12 @@ from logbook import Logger
pyfalog = Logger(__name__)
-class TargetResistsTextValidor(BaseValidator):
+class TargetProfileTextValidor(BaseValidator):
def __init__(self):
BaseValidator.__init__(self)
def Clone(self):
- return TargetResistsTextValidor()
+ return TargetProfileTextValidor()
def Validate(self, win):
entityEditor = win.parent
@@ -42,9 +42,9 @@ class TargetResistsTextValidor(BaseValidator):
try:
if len(text) == 0:
- raise ValueError("You must supply a name for your Target Resist Profile!")
+ raise ValueError("You must supply a name for your Target Profile!")
elif text in [x.name for x in entityEditor.choices]:
- raise ValueError("Target Resist Profile name already in use, please choose another.")
+ raise ValueError("Target Profile name already in use, please choose another.")
return True
except ValueError as e:
@@ -54,32 +54,32 @@ class TargetResistsTextValidor(BaseValidator):
return False
-class TargetResistsEntityEditor(EntityEditor):
+class TargetProfileEntityEditor(EntityEditor):
def __init__(self, parent):
- EntityEditor.__init__(self, parent, "Target Resist Profile")
- self.SetEditorValidator(TargetResistsTextValidor)
+ EntityEditor.__init__(self, parent, "Target Profile")
+ self.SetEditorValidator(TargetProfileTextValidor)
def getEntitiesFromContext(self):
- sTR = TargetResists.getInstance()
- choices = sorted(sTR.getTargetResistsList(), key=lambda p: p.name)
+ sTR = TargetProfile.getInstance()
+ choices = sorted(sTR.getTargetProfileList(), key=lambda p: p.name)
return choices
def DoNew(self, name):
- sTR = TargetResists.getInstance()
+ sTR = TargetProfile.getInstance()
return sTR.newPattern(name)
def DoRename(self, entity, name):
- sTR = TargetResists.getInstance()
+ sTR = TargetProfile.getInstance()
sTR.renamePattern(entity, name)
def DoCopy(self, entity, name):
- sTR = TargetResists.getInstance()
+ sTR = TargetProfile.getInstance()
copy = sTR.copyPattern(entity)
sTR.renamePattern(copy, name)
return copy
def DoDelete(self, entity):
- sTR = TargetResists.getInstance()
+ sTR = TargetProfile.getInstance()
sTR.deletePattern(entity)
@@ -90,7 +90,7 @@ class ResistsEditorDlg(wx.Dialog):
wx.Dialog.__init__(
self, parent, id=wx.ID_ANY,
# Dropdown list widget is scaled to its longest content line on GTK, adapt to that
- title="Target Resists Editor",
+ title="Target Profile Editor",
size=wx.Size(500, 240) if "wxGTK" in wx.PlatformInfo else wx.Size(350, 240))
self.block = False
@@ -98,7 +98,7 @@ class ResistsEditorDlg(wx.Dialog):
mainSizer = wx.BoxSizer(wx.VERTICAL)
- self.entityEditor = TargetResistsEntityEditor(self)
+ self.entityEditor = TargetProfileEntityEditor(self)
mainSizer.Add(self.entityEditor, 0, wx.ALL | wx.EXPAND, 2)
self.sl = wx.StaticLine(self)
@@ -227,7 +227,7 @@ class ResistsEditorDlg(wx.Dialog):
if event is not None:
event.Skip()
- TargetResists.getInstance().saveChanges(p)
+ TargetProfile.getInstance().saveChanges(p)
except ValueError:
editObj.SetForegroundColour(wx.RED)
@@ -271,7 +271,7 @@ class ResistsEditorDlg(wx.Dialog):
text = fromClipboard()
if text:
- sTR = TargetResists.getInstance()
+ sTR = TargetProfile.getInstance()
try:
sTR.importPatterns(text)
self.stNotice.SetLabel("Patterns successfully imported from clipboard")
@@ -290,7 +290,7 @@ class ResistsEditorDlg(wx.Dialog):
def exportPatterns(self, event):
"""Event fired when export to clipboard button is clicked"""
- sTR = TargetResists.getInstance()
+ sTR = TargetProfile.getInstance()
toClipboard(sTR.exportPatterns())
self.stNotice.SetLabel("Patterns exported to clipboard")
diff --git a/service/fit.py b/service/fit.py
index 0f6e31bf2..1c01d95d6 100644
--- a/service/fit.py
+++ b/service/fit.py
@@ -69,7 +69,7 @@ class Fit:
def __init__(self):
pyfalog.debug("Initialize Fit class")
self.pattern = DamagePattern.getInstance().getDamagePattern("Uniform")
- self.targetResists = None
+ self.targetProfile = None
self.character = saveddata_Character.getAll5()
self.booster = False
self._loadedFits = WeakSet()
@@ -170,7 +170,7 @@ class Fit:
fit = FitType(ship)
fit.name = name if name is not None else "New %s" % fit.ship.item.name
fit.damagePattern = self.pattern
- fit.targetResists = self.targetResists
+ fit.targetProfile = self.targetProfile
fit.character = self.character
fit.booster = self.booster
useCharImplants = self.serviceFittingOptions["useCharacterImplantsByDefault"]
@@ -358,21 +358,21 @@ class Fit:
self.fill(fit)
@staticmethod
- def getTargetResists(fitID):
- pyfalog.debug("Get target resists for fit ID: {0}", fitID)
+ def getTargetProfile(fitID):
+ pyfalog.debug("Get target profile for fit ID: {0}", fitID)
if fitID is None:
return
fit = eos.db.getFit(fitID)
- return fit.targetResists
+ return fit.targetProfile
- def setTargetResists(self, fitID, pattern):
+ def setTargetProfile(self, fitID, pattern):
pyfalog.debug("Set target resist for fit ID: {0}", fitID)
if fitID is None:
return
fit = eos.db.getFit(fitID)
- fit.targetResists = pattern
+ fit.targetProfile = pattern
eos.db.commit()
self.recalc(fit)
diff --git a/service/port/port.py b/service/port/port.py
index d1468b9fb..38c687c3e 100644
--- a/service/port/port.py
+++ b/service/port/port.py
@@ -156,7 +156,7 @@ class Port:
# Set some more fit attributes and save
fit.character = sFit.character
fit.damagePattern = sFit.pattern
- fit.targetResists = sFit.targetResists
+ fit.targetProfile = sFit.targetProfile
if len(fit.implants) > 0:
fit.implantLocation = ImplantLocation.FIT
else:
@@ -194,7 +194,7 @@ class Port:
for fit in importData:
fit.character = sFit.character
fit.damagePattern = sFit.pattern
- fit.targetResists = sFit.targetResists
+ fit.targetProfile = sFit.targetProfile
if len(fit.implants) > 0:
fit.implantLocation = ImplantLocation.FIT
else:
diff --git a/service/targetResists.py b/service/targetProfile.py
similarity index 79%
rename from service/targetResists.py
rename to service/targetProfile.py
index fe907f14b..445820d0a 100644
--- a/service/targetResists.py
+++ b/service/targetProfile.py
@@ -20,34 +20,34 @@
import copy
from eos import db
-from eos.saveddata.targetResists import TargetResists as es_TargetResists
+from eos.saveddata.targetProfile import TargetProfile as es_TargetProfile
class ImportError(Exception):
pass
-class TargetResists:
+class TargetProfile:
instance = None
@classmethod
def getInstance(cls):
if cls.instance is None:
- cls.instance = TargetResists()
+ cls.instance = TargetProfile()
return cls.instance
@staticmethod
- def getTargetResistsList():
- return db.getTargetResistsList()
+ def getTargetProfileList():
+ return db.getTargetProfileList()
@staticmethod
- def getTargetResists(name):
- return db.getTargetResists(name)
+ def getTargetProfile(name):
+ return db.getTargetProfile(name)
@staticmethod
def newPattern(name):
- p = es_TargetResists(0.0, 0.0, 0.0, 0.0)
+ p = es_TargetProfile(0.0, 0.0, 0.0, 0.0)
p.name = name
db.save(p)
return p
@@ -72,7 +72,7 @@ class TargetResists:
db.save(p)
def importPatterns(self, text):
- imports, num = es_TargetResists.importPatterns(text)
+ imports, num = es_TargetProfile.importPatterns(text)
lenImports = len(imports)
if lenImports == 0:
@@ -81,6 +81,6 @@ class TargetResists:
raise ImportError("%d patterns imported from clipboard; %d had errors" % (num, num - lenImports))
def exportPatterns(self):
- patterns = self.getTargetResistsList()
+ patterns = self.getTargetProfileList()
patterns.sort(key=lambda p: p.name)
- return es_TargetResists.exportPatterns(*patterns)
+ return es_TargetProfile.exportPatterns(*patterns)