diff --git a/korman/exporter/__init__.py b/korman/exporter/__init__.py index 3eb954d..0ec72c5 100644 --- a/korman/exporter/__init__.py +++ b/korman/exporter/__init__.py @@ -14,7 +14,6 @@ # along with Korman. If not, see . import bpy -import os.path from PyHSPlasma import * from .convert import * diff --git a/korman/exporter/convert.py b/korman/exporter/convert.py index 67525dd..bf84a4b 100644 --- a/korman/exporter/convert.py +++ b/korman/exporter/convert.py @@ -14,7 +14,7 @@ # along with Korman. If not, see . import bpy -import os.path +from pathlib import Path from PyHSPlasma import * import time @@ -38,7 +38,7 @@ class Exporter: @property def age_name(self): - return os.path.splitext(os.path.split(self._op.filepath)[1])[0] + return Path(self._op.filepath).stem def run(self): with logger.ExportLogger(self._op.filepath) as _log: @@ -80,7 +80,7 @@ class Exporter: self.mesh.finalize() # Step 5: FINALLY. Let's write the PRPs and crap. - self.mgr.save_age(self._op.filepath) + self.mgr.save_age(Path(self._op.filepath)) # Step 5.1: Save out the export report. # If the export fails and this doesn't save, we have bigger problems than diff --git a/korman/exporter/logger.py b/korman/exporter/logger.py index 3059342..e8dc566 100644 --- a/korman/exporter/logger.py +++ b/korman/exporter/logger.py @@ -13,7 +13,7 @@ # You should have received a copy of the GNU General Public License # along with Korman. If not, see . -import os.path +from pathlib import Path import sys class ExportAnalysis: @@ -46,10 +46,9 @@ class ExportLogger: def __init__(self, ageFile): # Make the log file name from the age file path -- this ensures we're not trying to write # the log file to the same directory Blender.exe is in, which might be a permission error - path, ageFile = os.path.split(ageFile) - ageName, _crap = os.path.splitext(ageFile) - fn = os.path.join(path, "{}_export.log".format(ageName)) - self._file = open(fn, "w") + my_path = Path(ageFile) + my_path = my_path.with_name("{}_export".format(my_path.stem)).with_suffix(".log") + self._file = open(str(my_path), "w") for i in dir(self._file): if not hasattr(self, i): diff --git a/korman/exporter/manager.py b/korman/exporter/manager.py index ab1d605..42ebce5 100644 --- a/korman/exporter/manager.py +++ b/korman/exporter/manager.py @@ -14,7 +14,7 @@ # along with Korman. If not, see . import bpy -import os.path +from pathlib import Path from PyHSPlasma import * import weakref @@ -221,27 +221,26 @@ class ExportManager: return key.location def save_age(self, path): - relpath, ageFile = os.path.split(path) - ageName = os.path.splitext(ageFile)[0] + ageName = path.stem sumfile = self._exporter().sumfile sumfile.append(path) - self.mgr.WriteAge(path, self._age_info) - self._write_fni(relpath, ageName) - self._write_pages(relpath, ageName) + self.mgr.WriteAge(str(path), self._age_info) + self._write_fni(path) + self._write_pages(path) if self.getVer() != pvMoul: - sumpath = os.path.join(relpath, "{}.sum".format(ageName)) + sumpath = path.with_suffix(".sum") sumfile.write(sumpath, self.getVer()) - def _write_fni(self, path, ageName): + def _write_fni(self, path): if self.mgr.getVer() <= pvMoul: enc = plEncryptedStream.kEncXtea else: enc = plEncryptedStream.kEncAES - fname = os.path.join(path, "{}.fni".format(ageName)) + fname = path.with_suffix(".fni") - with plEncryptedStream(self.mgr.getVer()).open(fname, fmWrite, enc) as stream: + with plEncryptedStream(self.mgr.getVer()).open(str(fname), fmWrite, enc) as stream: fni = bpy.context.scene.world.plasma_fni stream.writeLine("Graphics.Renderer.SetClearColor {} {} {}".format(*fni.clear_color)) if fni.fog_method != "none": @@ -253,7 +252,7 @@ class ExportManager: stream.writeLine("Graphics.Renderer.SetYon {}".format(fni.yon)) self._exporter().sumfile.append(fname) - def _write_pages(self, path, ageName): + def _write_pages(self, path): for loc in self._pages.values(): page = self.mgr.FindPage(loc) # not cached because it's C++ owned # I know that plAgeInfo has its own way of doing this, but we'd have @@ -262,6 +261,6 @@ class ExportManager: chapter = "_District_" else: chapter = "_" - f = os.path.join(path, "{}{}{}.prp".format(ageName, chapter, page.page)) - self.mgr.WritePage(f, page) + f = path.with_name("{}{}{}".format(path.stem, chapter, page.page)).with_suffix(".prp") + self.mgr.WritePage(str(f), page) self._exporter().sumfile.append(f) diff --git a/korman/exporter/material.py b/korman/exporter/material.py index bb8ba84..2cb2eac 100644 --- a/korman/exporter/material.py +++ b/korman/exporter/material.py @@ -15,7 +15,7 @@ import bpy import math -import os.path +from pathlib import Path from PyHSPlasma import * import weakref @@ -61,20 +61,13 @@ class _Texture: def __str__(self): if self.mipmap: - name = self._change_extension(self.image.name, ".dds") + name = str(Path(self.image.name).with_suffix(".dds")) else: - name = self._change_extension(self.image.name, ".bmp") + name = str(Path(self.image.name).with_suffix(".bmp")) if self.calc_alpha: name = "ALPHAGEN_{}".format(name) return name - def _change_extension(self, name, newext): - # Blender likes to add faux extensions such as .001 :( - if name.find(".") == -1: - return "{}{}".format(name, newext) - name, end = os.path.splitext(name) - return "{}{}".format(name, newext) - def _update(self, other): """Update myself with any props that might be overridable from another copy of myself""" if other.use_alpha: diff --git a/korman/exporter/sumfile.py b/korman/exporter/sumfile.py index 7bdb013..0bd84c8 100644 --- a/korman/exporter/sumfile.py +++ b/korman/exporter/sumfile.py @@ -14,11 +14,11 @@ # along with Korman. If not, see . import hashlib -import os.path +from pathlib import Path from PyHSPlasma import * def _hashfile(filename, hasher, block=0xFFFF): - with open(filename, "rb") as handle: + with open(str(filename), "rb") as handle: h = hasher() data = handle.read(block) while data: @@ -36,26 +36,25 @@ class SumFile: def _collect_files(self, version): files = [] for file in self._files: - filename = os.path.split(file)[1] - extension = os.path.splitext(filename)[1].lower() + filename, extension = file.name, file.suffix.lower() if extension in {".age", ".csv", ".fni", ".loc", ".node", ".p2f", ".pfp", ".sub"}: - filename = os.path.join("dat", filename) + filename = Path("dat") / filename elif extension == ".prp" and version > pvPrime: # ABM and UU don't want the directory for PRPs... Bug? - filename = os.path.join("dat", filename) + filename = Path("dat") / filename elif extension in {".pak", ".py"}: - filename = os.path.join("Python", filename) + filename = Path("Python") / filename elif extension in {".avi", ".bik", ".oggv", ".webm"}: - filename = os.path.join("avi", filename) + filename = Path("avi") / filename elif extension in {".ogg", ".opus", ".wav"}: - filename = os.path.join("sfx", filename) + filename = Path("sfx") / filename elif extension == ".sdl": - filename = os.path.join("SDL", filename) + filename = Path("SDL") / filename # else the filename has no directory prefix... oh well md5 = _hashfile(file, hashlib.md5) - timestamp = os.path.getmtime(file) - files.append((filename, md5, int(timestamp))) + timestamp = file.stat().st_mtime + files.append((str(filename), md5, int(timestamp))) return files @@ -64,11 +63,11 @@ class SumFile: files = self._collect_files(version) enc = plEncryptedStream.kEncAes if version >= pvEoa else plEncryptedStream.kEncXtea - with plEncryptedStream(version).open(sumpath, fmWrite, enc) as stream: + with plEncryptedStream(version).open(str(sumpath), fmWrite, enc) as stream: stream.writeInt(len(files)) stream.writeInt(0) for file in files: - stream.writeSafeStr(file[0]) + stream.writeSafeStr(str(file[0])) stream.write(file[1]) stream.writeInt(file[2]) stream.writeInt(0) diff --git a/korman/nodes/node_python.py b/korman/nodes/node_python.py index e924580..ccfbc3a 100644 --- a/korman/nodes/node_python.py +++ b/korman/nodes/node_python.py @@ -15,7 +15,7 @@ import bpy from bpy.props import * -import os.path +from pathlib import Path from PyHSPlasma import * from .node_core import * @@ -149,7 +149,7 @@ class PlasmaPythonFileNode(PlasmaNodeBase, bpy.types.Node): row = layout.row(align=True) if self.filename: row.prop(self, "filename") - if os.path.isfile(self.filepath): + if Path(self.filepath).exists(): operator = row.operator("node.plasma_attributes_to_node", icon="FILE_REFRESH", text="") operator.python_path = self.filepath operator.node_path = self.node_path @@ -166,7 +166,7 @@ class PlasmaPythonFileNode(PlasmaNodeBase, bpy.types.Node): def export(self, exporter, bo, so): pfm = self.get_key(exporter, so).object - pfm.filename = os.path.splitext(self.filename)[0] + pfm.filename = Path(self.filename).stem attrib_sockets = (i for i in self.inputs if i.is_linked) for socket in attrib_sockets: attrib = socket.attribute_type diff --git a/korman/operators/op_export.py b/korman/operators/op_export.py index 9b8df8f..6fac605 100644 --- a/korman/operators/op_export.py +++ b/korman/operators/op_export.py @@ -16,7 +16,7 @@ import bpy from bpy.props import * import cProfile -import os, os.path +from pathlib import Path import pstats from .. import exporter @@ -80,15 +80,15 @@ class ExportOperator(bpy.types.Operator): def execute(self, context): # Before we begin, do some basic sanity checking... + path = Path(self.filepath) if not self.filepath: self.error = "No file specified" return {"CANCELLED"} else: - dir = os.path.split(self.filepath)[0] - if not os.path.exists(dir): + if not path.exists: try: - os.mkdirs(dir) - except os.error: + path.mkdir(parents=True) + except: self.report({"ERROR"}, "Failed to create export directory") return {"CANCELLED"} @@ -97,11 +97,12 @@ class ExportOperator(bpy.types.Operator): bpy.ops.object.mode_set(mode="OBJECT") # Separate blender operator and actual export logic for my sanity + ageName = path.stem with _UiHelper() as _ui: e = exporter.Exporter(self) try: if self.profile_export: - profile = "{}_cProfile".format(os.path.splitext(self.filepath)[0]) + profile = "{}_cProfile".format(ageName) cProfile.runctx("e.run()", globals(), locals(), profile) else: e.run() @@ -110,7 +111,7 @@ class ExportOperator(bpy.types.Operator): return {"CANCELLED"} else: if self.profile_export: - stats_out = "{}_profile.log".format(os.path.splitext(self.filepath)[0]) + stats_out = "{}_profile.log".format(ageName) with open(stats_out, "w") as out: stats = pstats.Stats(profile, stream=out) stats = stats.sort_stats("time", "calls") diff --git a/korman/plasma_attributes.py b/korman/plasma_attributes.py index a647ff2..9cf651c 100644 --- a/korman/plasma_attributes.py +++ b/korman/plasma_attributes.py @@ -93,7 +93,7 @@ def get_attributes(scriptFile): """Scan the file for assignments matching our regex, let our visitor parse them, and return the file's ptAttribs, if any.""" attribs = None - with open(scriptFile) as script: + with open(str(scriptFile)) as script: results = funcregex.findall(script.read()) if results: # We'll fake the ptAttribs being all alone in a module... @@ -105,21 +105,20 @@ def get_attributes(scriptFile): return attribs if __name__ == "__main__": - import glob import json - import os + from pathlib import Path import sys if len(sys.argv) != 2: print("Specify a path containing Plasma Python!") else: readpath = sys.argv[1] - files = glob.glob(os.path.join(readpath, "*.py")) + files = Path(readpath).glob("*.py") ptAttribs = {} for scriptFile in files: attribs = get_attributes(scriptFile) if attribs: - ptAttribs[os.path.basename(scriptFile)] = attribs + ptAttribs[scriptFile.stem] = attribs jsonout = open("attribs.json", "w") jsonout.write(json.dumps(ptAttribs, sort_keys=True, indent=2))