Able to export XML that works with EVEMon
This commit is contained in:
@@ -109,25 +109,33 @@ class CharacterSelection(wx.Panel):
|
||||
|
||||
def fitChanged(self, event):
|
||||
self.charChoice.Enable(event.fitID != None)
|
||||
|
||||
choice = self.charChoice
|
||||
cFit = service.Fit.getInstance()
|
||||
currCharID = choice.GetClientData(choice.GetCurrentSelection())
|
||||
fit = cFit.getFit(event.fitID)
|
||||
newCharID = fit.character.ID if fit is not None else None
|
||||
print newCharID
|
||||
if event.fitID is None:
|
||||
print "** No active fit **"
|
||||
self.skillReqsStaticBitmap.SetBitmap(self.cleanSkills)
|
||||
self.skillReqsStaticBitmap.SetToolTipString("No active fit.")
|
||||
self.skillReqsStaticBitmap.SetToolTipString("No active fit")
|
||||
else:
|
||||
sCharacter = service.Character.getInstance()
|
||||
reqs = sCharacter.checkRequirements(fit)
|
||||
sCharacter.skillReqsDict = {'charname':fit.character.name, 'skills':[]}
|
||||
print "-- Skills required for character \"%s\":" % (fit.character.name,)
|
||||
if len(reqs) == 0:
|
||||
tip = "All prerequisites have been met"
|
||||
print " -- ** All skill prerequisites have been met **"
|
||||
tip = "All skill prerequisites have been met"
|
||||
self.skillReqsStaticBitmap.SetBitmap(self.greenSkills)
|
||||
else:
|
||||
tip = self._buildSkillsTooltip(reqs)
|
||||
tip = "Skills required:\n"
|
||||
tip += self._buildSkillsTooltip(reqs)
|
||||
self.skillReqsStaticBitmap.SetBitmap(self.redSkills)
|
||||
self.skillReqsStaticBitmap.SetToolTipString(tip.strip())
|
||||
print ""
|
||||
print sCharacter.skillReqsDict
|
||||
print ""
|
||||
|
||||
if newCharID == None:
|
||||
cChar = service.Character.getInstance()
|
||||
@@ -139,14 +147,19 @@ class CharacterSelection(wx.Panel):
|
||||
|
||||
def _buildSkillsTooltip(self, reqs, tabulationLevel = 0):
|
||||
tip = ""
|
||||
sCharacter = service.Character.getInstance()
|
||||
if tabulationLevel == 0:
|
||||
for item, subReqs in reqs.iteritems():
|
||||
tip += "%s:\n" % item.name
|
||||
print " -- {%5d} %s" % (item.ID, item.name)
|
||||
tip += " %s:\n" % item.name
|
||||
tip += self._buildSkillsTooltip(subReqs, 1)
|
||||
else:
|
||||
for name, info in reqs.iteritems():
|
||||
level, more = info
|
||||
tip += "%s%s: %d\n" % (" " * tabulationLevel, name, level)
|
||||
level, ID, more = info
|
||||
print " %s{%5d} %s: %d" % (" " * tabulationLevel, ID, name, level)
|
||||
sCharacter.skillReqsDict['skills'].append(
|
||||
{'skillID' : ID, 'skill' : name, 'level' : int(level)})
|
||||
tip += " %s%s: %d\n" % (" " * tabulationLevel, name, level)
|
||||
tip += self._buildSkillsTooltip(more, tabulationLevel + 1)
|
||||
|
||||
return tip
|
||||
|
||||
@@ -335,6 +335,8 @@ class MainFrame(wx.Frame):
|
||||
self.Bind(wx.EVT_MENU, self.importFromClipboard, id=wx.ID_PASTE)
|
||||
# Backup fits
|
||||
self.Bind(wx.EVT_MENU, self.backupToXml, id=menuBar.backupFitsId)
|
||||
# Export skills needed
|
||||
self.Bind(wx.EVT_MENU, self.exportSkillsNeeded, id=menuBar.exportSkillsNeededId)
|
||||
# Preference dialog
|
||||
self.Bind(wx.EVT_MENU, self.showPreferenceDialog, id = menuBar.preferencesId)
|
||||
|
||||
@@ -475,6 +477,28 @@ class MainFrame(wx.Frame):
|
||||
|
||||
saveDialog.Destroy()
|
||||
|
||||
def exportSkillsNeeded(self, event):
|
||||
sCharacter = service.Character.getInstance()
|
||||
saveDialog = wx.FileDialog(
|
||||
self,
|
||||
"Export Skills Needed As...",
|
||||
wildcard = "EVEMon skills training file (*.xml)|*.xml|Text skills training file (*.txt)|*.txt",
|
||||
style = wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT)
|
||||
if (saveDialog.ShowModal() == wx.ID_OK):
|
||||
saveFmtInt = saveDialog.GetFilterIndex()
|
||||
saveFmt = ""
|
||||
if saveFmtInt == 0: # Per ordering of wildcards above
|
||||
saveFmt = "xml"
|
||||
else:
|
||||
saveFmt = "txt"
|
||||
print("User selected format %d \'%s\'" % (saveFmtInt, saveFmt))
|
||||
filePath = saveDialog.GetPath()
|
||||
self.waitDialog = animUtils.WaitDialog(self)
|
||||
sCharacter.backupSkills(filePath, saveFmt, self.closeWaitDialog)
|
||||
self.waitDialog.ShowModal()
|
||||
|
||||
saveDialog.Destroy()
|
||||
|
||||
def closeWaitDialog(self):
|
||||
self.waitDialog.Destroy()
|
||||
|
||||
|
||||
@@ -30,6 +30,7 @@ class MainMenuBar(wx.MenuBar):
|
||||
self.damagePatternEditorId = wx.NewId()
|
||||
self.graphFrameId = wx.NewId()
|
||||
self.backupFitsId = wx.NewId()
|
||||
self.exportSkillsNeededId = wx.NewId()
|
||||
self.preferencesId = wx.NewId()
|
||||
|
||||
self.mainFrame = gui.mainFrame.MainFrame.getInstance()
|
||||
@@ -47,6 +48,7 @@ class MainMenuBar(wx.MenuBar):
|
||||
fileMenu.Append(self.backupFitsId, "&Backup fits", "Backup all fittings to a XML file")
|
||||
fileMenu.Append(wx.ID_OPEN, "&Import\tCTRL+O", "Import a fit into pyfa.")
|
||||
fileMenu.Append(wx.ID_SAVEAS, "&Export\tCTRL+S", "Export the fit to another format.")
|
||||
fileMenu.Append(self.exportSkillsNeededId, "Export &Skills Needed", "Export skills needed for this fitting")
|
||||
fileMenu.AppendSeparator()
|
||||
|
||||
fileMenu.Append(wx.ID_EXIT)
|
||||
@@ -105,5 +107,6 @@ class MainMenuBar(wx.MenuBar):
|
||||
enable = event.fitID is not None
|
||||
self.Enable(wx.ID_SAVEAS, enable)
|
||||
self.Enable(wx.ID_COPY, enable)
|
||||
self.Enable(self.exportSkillsNeededId, enable)
|
||||
event.Skip()
|
||||
|
||||
|
||||
@@ -23,8 +23,48 @@ import copy
|
||||
import service
|
||||
import itertools
|
||||
|
||||
import os.path
|
||||
import locale
|
||||
import threading
|
||||
import wx
|
||||
from codecs import open
|
||||
|
||||
from xml.etree import ElementTree
|
||||
from xml.dom import minidom
|
||||
|
||||
import gui.mainFrame
|
||||
|
||||
EVEMON_COMPATIBLE_VERSION = "4081"
|
||||
|
||||
class SkillBackupThread(threading.Thread):
|
||||
def __init__(self, path, saveFmt, callback):
|
||||
threading.Thread.__init__(self)
|
||||
self.path = path
|
||||
self.saveFmt = saveFmt
|
||||
self.callback = callback
|
||||
|
||||
def run(self):
|
||||
path = self.path
|
||||
mainFrame = gui.mainFrame.MainFrame.getInstance()
|
||||
sCharacter = Character.getInstance()
|
||||
sFit = service.Fit.getInstance()
|
||||
fit = sFit.getFit(mainFrame.getActiveFit())
|
||||
backupFile = open(path, "w", encoding="utf-8")
|
||||
backupData = "";
|
||||
if self.saveFmt == "xml":
|
||||
backupData = sCharacter.exportXml()
|
||||
elif self.saveFmt == "txt":
|
||||
backupData = sCharacter.exportText()
|
||||
else:
|
||||
backupData = sCharacter.exportText()
|
||||
backupFile.write(backupData)
|
||||
backupFile.close()
|
||||
wx.CallAfter(self.callback)
|
||||
|
||||
class Character():
|
||||
instance = None
|
||||
skillReqsDict = {}
|
||||
|
||||
@classmethod
|
||||
def getInstance(cls):
|
||||
if cls.instance is None:
|
||||
@@ -32,6 +72,49 @@ class Character():
|
||||
|
||||
return cls.instance
|
||||
|
||||
def exportText(self):
|
||||
data = ""
|
||||
|
||||
mySkills = repr(self.skillReqsDict)
|
||||
data += "-" * 79
|
||||
data += '\n'
|
||||
data += repr(self.skillReqsDict)
|
||||
data += '\n'
|
||||
data += "-" * 79
|
||||
data += '\n'
|
||||
|
||||
return data
|
||||
|
||||
def exportXml(self):
|
||||
root = ElementTree.Element("plan")
|
||||
root.attrib["name"] = "Pyfa exported plan for "+self.skillReqsDict['charname']
|
||||
root.attrib["revision"] = EVEMON_COMPATIBLE_VERSION
|
||||
|
||||
sorts = ElementTree.SubElement(root, "sorting")
|
||||
sorts.attrib["criteria"] = "None"
|
||||
sorts.attrib["order"] = "None"
|
||||
sorts.attrib["groupByPriority"] = "false"
|
||||
|
||||
for s in self.skillReqsDict['skills']:
|
||||
entry = ElementTree.SubElement(root, "entry")
|
||||
entry.attrib["skillID"] = str(s["skillID"])
|
||||
entry.attrib["skill"] = s["skill"]
|
||||
entry.attrib["level"] = str(s["level"])
|
||||
entry.attrib["priority"] = "3"
|
||||
entry.attrib["type"] = "Prerequisite"
|
||||
notes = ElementTree.SubElement(entry, "notes")
|
||||
notes.text = entry.attrib["skill"]
|
||||
|
||||
tree = ElementTree.ElementTree(root)
|
||||
data = ElementTree.tostring(root, 'utf-8')
|
||||
prettydata = minidom.parseString(data).toprettyxml(indent=" ")
|
||||
|
||||
return prettydata
|
||||
|
||||
def backupSkills(self, path, saveFmt, callback):
|
||||
thread = SkillBackupThread(path, saveFmt, callback)
|
||||
thread.start()
|
||||
|
||||
def all0(self):
|
||||
all0 = eos.types.Character.getAll0()
|
||||
eos.db.commit()
|
||||
@@ -169,10 +252,11 @@ class Character():
|
||||
def _checkRequirements(self, fit, char, subThing, reqs):
|
||||
for req, level in subThing.requiredSkills.iteritems():
|
||||
name = req.name
|
||||
ID = req.ID
|
||||
info = reqs.get(name)
|
||||
currLevel, subs = info if info is not None else 0, {}
|
||||
if level > currLevel and (char is None or char.getSkill(req).level < level):
|
||||
reqs[name] = (level, subs)
|
||||
reqs[name] = (level, ID, subs)
|
||||
self._checkRequirements(fit, char, req, subs)
|
||||
|
||||
return reqs
|
||||
|
||||
Reference in New Issue
Block a user