__main__.py 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. import json
  2. import xml.etree.ElementTree as ET
  3. import re
  4. import os
  5. # 钉子的图片名-ID映射表
  6. screw_pic_to_id_map = {"sg_screw1.png":1,"sg_screw2.png":2,"sg_screw3.png":3}
  7. # 盘子的图片名-ID映射表
  8. plate_pic_to_id_map = {"sg_plant1.png":1,"sg_plant0.png":2}
  9. # 目标盒子的图片名-ID映射表
  10. target_pic_to_id_map = {"sg-目标容器-1.png":1,"sg-目标容器-2.png":2}
  11. def xml_to_dict(root: ET.Element):
  12. """将XML文件解析为python dict"""
  13. ret_arr = []
  14. ret_dict = {}
  15. if root.tag == "dict":
  16. idx = 0
  17. while idx < len(root):
  18. if root[idx].tag == "key":
  19. ret_dict[root[idx].text] = xml_to_dict(root[idx + 1])
  20. idx += 1
  21. idx += 1
  22. return ret_dict
  23. elif root.tag == "array":
  24. idx = 0
  25. while idx < len(root):
  26. ret_arr.append(xml_to_dict(root[idx]))
  27. idx += 1
  28. return ret_arr
  29. elif root.tag == "plist":
  30. for child in root:
  31. ret_dict["plist"] = xml_to_dict(child)
  32. break
  33. return ret_dict
  34. else:
  35. return root.text
  36. def get_target_and_elem_list(conf_dict: dict):
  37. """从node_graph字典下获取target(任务目标)和element(元素)的list"""
  38. node_graph_dict = conf_dict["plist"]["nodeGraph"]["children"]
  39. return node_graph_dict[0]["children"], node_graph_dict[1]["children"]
  40. def get_all_target(target_list: list):
  41. """获取所有target的list"""
  42. all_target_list = []
  43. for dic in target_list:
  44. propertieIdx = 0
  45. while True:
  46. propertie = dic["properties"][propertieIdx]
  47. if propertie["name"] == "displayFrame":
  48. displayFrame = propertie["value"][1]
  49. break
  50. propertieIdx = propertieIdx+1
  51. displayFrame = os.path.basename(displayFrame)
  52. resTagrgetId = target_pic_to_id_map[displayFrame]
  53. screwIds = []
  54. for target_dict in dic["children"]:
  55. # 展示的目标名称可能和采用的图片不一样 所以先不用这个
  56. # display_name_str = target_dict["displayName"]
  57. target_properties_list = target_dict["properties"]
  58. propertieIdx = 0
  59. while True:
  60. propertie = target_properties_list[propertieIdx]
  61. if propertie["name"] == "displayFrame":
  62. target_pic_name = propertie["value"][1]
  63. break
  64. propertieIdx = propertieIdx+1
  65. target_pic_name = os.path.basename(target_pic_name)
  66. # print (target_pic_name)
  67. if target_pic_name not in screw_pic_to_id_map.keys():
  68. screw_pic_to_id_map[target_pic_name] = len(screw_pic_to_id_map) + 1
  69. screwIds.append(screw_pic_to_id_map[target_pic_name])
  70. all_target_list.append({"targetResId":resTagrgetId, "screwIds":screwIds})
  71. return all_target_list
  72. def get_plate_data_list(elem_list: list):
  73. """获取盘子信息列表"""
  74. plate_data = []
  75. for dic in elem_list:
  76. plate_property = []
  77. screw_properties = []
  78. for elem_dict in dic["children"]:
  79. propertieIdx = 0
  80. while True:
  81. propertie = elem_dict["properties"][propertieIdx]
  82. if propertie["name"] == "displayFrame":
  83. displayFrame = propertie["value"][1]
  84. break
  85. propertieIdx = propertieIdx+1
  86. displayFrame = os.path.basename(displayFrame)
  87. # print (displayFrame)
  88. if displayFrame in plate_pic_to_id_map:
  89. plate_property.append(elem_dict["properties"])
  90. else:
  91. screw_properties.append(elem_dict["properties"])
  92. plate_property = plate_property[0]
  93. # 处理盘子的信息
  94. one_plate_data = {}
  95. one_plate_data["rotate"] = 0
  96. one_plate_data["scale"] = 1
  97. plate_pic_name = ""
  98. for ele in plate_property:
  99. dict_values = ele.values()
  100. if "displayFrame" in dict_values:
  101. plate_pic_name = ele["value"][1]
  102. plate_pic_name = os.path.basename(plate_pic_name)
  103. elif "rotation" in dict_values:
  104. one_plate_data["rotate"] = round(float(ele["value"]), 1)
  105. elif "scale" in dict_values:
  106. one_plate_data["scale"] = round(float(ele["value"][0]), 1)
  107. elif "position" in dict_values:
  108. one_plate_data["position"] = [round(float(ele["value"][0])), round(float(ele["value"][1]), 1)]
  109. if plate_pic_name not in plate_pic_to_id_map:
  110. plate_pic_to_id_map[plate_pic_name] = len(one_plate_data) + 1
  111. one_plate_data["plateId"] = plate_pic_to_id_map[plate_pic_name]
  112. one_plate_data["zorder"] = len(plate_data) + 1
  113. # 处理钉子的信息
  114. screws_data = []
  115. for screw in screw_properties:
  116. data_dict = {}
  117. for property_dict in screw:
  118. dict_values = property_dict.values()
  119. if "displayFrame" in dict_values:
  120. picName = os.path.basename(property_dict["value"][1])
  121. # print(picName)
  122. data_dict["screwId"] = screw_pic_to_id_map[picName]
  123. break
  124. data_dict["scale"] = 1.0
  125. data_dict["rotate"] = 0.0
  126. data_dict["position"] = [round(float(screw[0]["value"][0]), 1), round(float(screw[0]["value"][1]), 1)]
  127. screws_data.append(data_dict)
  128. one_plate_data["screws"] = screws_data
  129. plate_data.append(one_plate_data)
  130. return plate_data
  131. def py_dict_to_json_file(py_dict: dict, xml_path: str):
  132. """将python dict写到JSON文件中"""
  133. file_name = re.findall(r"(?=/).*(?=.red)", xml_path)[0]
  134. file_name = re.findall(r"[^/]+$", file_name)[0]
  135. file_name += ".json"
  136. j_data = json.dumps(py_dict)
  137. with open("../config/" + file_name, "w") as file:
  138. file.write(j_data)
  139. if __name__ == "__main__":
  140. xml_path = "../关卡/关卡2.red"
  141. element_tree = ET.parse(xml_path)
  142. conf_dict = xml_to_dict(element_tree.getroot())
  143. target_list, elem_list = get_target_and_elem_list(conf_dict)
  144. target_and_plateData_dict = {
  145. "target": get_all_target(target_list),
  146. "plateData": get_plate_data_list(elem_list)
  147. }
  148. py_dict_to_json_file(target_and_plateData_dict, xml_path)