123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 |
- import json
- import os
- import xml.etree.ElementTree as ET
- """ FileUtils """
- """ 文件操作 """
- class FileUtils:
- # 初始化 configs.json 读取要用到的路径
- def __init__(self):
- print("init FileUtils...")
- self.__configsChanged = False
- try:
- with open("configs.json", "r") as config_file:
- configs = json.load(config_file)
- paths = configs['paths']
- # 关卡red文件夹
- self.__redLevelConfigDir = paths["redreamLevelConfigDir"]
- # 关卡模板red文件夹
- self.__redLevelTemplateDir = paths["redreamLevelTemplateDir"]
- # 盘子位置情况red文件夹
- self.__plateConfigDir = paths["plateConfigDir"]
- # 关卡json文件夹
- self.__jsonLevelConfigDir = paths["jsonLevelConfigDir"]
- except FileNotFoundError:
- print(f"文件{"configs.json"}不存在, 使用默认相关路径...")
- # 关卡red文件夹
- self.__redLevelConfigDir = "/Users/red/ScrewGame/Resources/res_ScrewGame/关卡/"
- # 关卡模板red文件夹
- self.__redLevelTemplateDir = "/Users/red/ScrewGame/Resources/res_ScrewGame/关卡/关卡模板/"
- # 盘子位置情况red文件夹
- self.__plateConfigDir = "/Users/red/ScrewGame/Resources/res_ScrewGame/ccb/盘子上位置情况/"
- # 关卡json文件夹
- self.__jsonLevelConfigDir = "/Users/red/ScrewGame/Resources/res_ScrewGame/config/最终关卡配置/"
- """ 展示当前默认路径和设置 提供修改的选项 """
- def greet(self):
- print("Hello!")
- print(f"关卡red文件目录为{self.__redLevelConfigDir}")
- print(f"模板red文件目录为{self.__redLevelTemplateDir}")
- print(f"盘子位置情况red文件目录为{self.__plateConfigDir}")
- print(f"关卡json文件目录为{self.__jsonLevelConfigDir}")
- # TODO: 提供修改的选项
- """ 将xml文件转化为python内置数据结构 """
- def xml_to_py_object(self, root: ET.Element) -> str | dict | list | None:
- if root is None:
- return None
- root_tag = root.tag
- # print(root_tag)
- res_list = []
- res_dict = {}
- if root_tag == 'dict':
- idx = 0
- while idx < len(root):
- if root[idx].tag == 'key':
- next_tag = root[idx + 1].tag
- if next_tag == 'true':
- res_dict[root[idx].text] = True
- elif next_tag == 'false':
- res_dict[root[idx].text] = False
- else:
- res_dict[root[idx].text] = self.xml_to_py_object(root[idx + 1])
- idx += 1
- idx += 1
- return res_dict
- elif root_tag == 'array':
- for child in root:
- res_list.append(self.xml_to_py_object(child))
- return res_list
- else:
- return root.text
- """ 获得red(xml)文件的根 """
- def get_root_of_red_file(self, file_path: str) -> ET.Element | None:
- if os.path.exists(file_path):
- return ET.parse(file_path).getroot()[0]
- else:
- print(f"{file_path}不存在!")
- return None
- """ 将字典写为json文件 """
- def write_dict_to_json(self, dic: dict, path: str) -> None:
- with open(path, "w") as file:
- json.dump(dic, file)
- """ 退出时如果修改了默认相关参数 写入到文件中 """
- def update_config_file(self):
- if self.__configsChanged:
- print("update config file...")
- configs = {
- "paths": {
- "redreamLevelConfigDir": self.__redLevelConfigDir,
- "redreamLevelTemplateDir": self.__redLevelTemplateDir,
- "plateConfigDir": self.__plateConfigDir,
- "jsonLevelConfigDir": self.__jsonLevelConfigDir
- },
- "nScrewTypes": self.__nScrewTypes
- }
- self.write_dict_to_json(configs, "./configs.json")
- else:
- print("configs未被改变, 不做update")
- """ 将目录路径与关卡号组合在一起得到完整路径 """
- def get_template_file_full_path(self, template_id_list: list) -> list:
- ret = [f"{self.__redLevelTemplateDir}{"模板"}{ID}{".red"}" for ID in template_id_list]
- return ret
- """ 将盘子ID和盘子上位置情况目录组合在一起得到完整路径 """
- def get_plate_file_full_path(self, plate_configs_of_this_level: list) -> list:
- plate_id_list = [plate_config['plateId'] for plate_config in plate_configs_of_this_level]
- ret = [f"{self.__plateConfigDir}{"SG-盘子"}{ID}{"情况.red"}" for ID in plate_id_list]
- return ret
- """ 根据关卡号生成json文件的完整路径 """
- def generate_level_json_file_full_path(self, level_id: str) -> str:
- ret = self.__jsonLevelConfigDir + f"关卡{level_id}.json"
- return ret
- """ 根据关卡red文件目录组合出文件的完整地址 """
- def get_all_level_red_file_full_paths(self):
- ret = []
- for file_name in os.listdir(self.__redLevelConfigDir):
- if file_name[-3:] == "red":
- ret.append(self.__redLevelConfigDir + file_name)
- return ret
|