盘子位置情况RED转JSON.py 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import json
  2. import math
  3. import xml.etree.ElementTree as ET
  4. import re
  5. import os
  6. import plistlib
  7. # 2024-11-12 增加从情况文件读取盘子和钉子的scale参数
  8. # 转换盘子显示名称到sprite名称
  9. # ‘plate_wh_03_8_三角圆弧’ 转换成sprite名称 plate_wh_03_8.png
  10. def tranformDName2SName(displayName):
  11. startpos = 0
  12. for i in [1,2,3,4]:
  13. startpos = displayName.index('_', startpos) + 1
  14. if startpos == -1:
  15. break
  16. if startpos == -1:
  17. return displayName
  18. else:
  19. return displayName[0:startpos-1]+".png"
  20. # 文件名转换 plate_wh_01_1_ 小方形_盘子情况.red 转换为 plate_wh_01_1_H.json
  21. def fnameTransform2(displayName):
  22. startpos = 0
  23. for i in [1,2,3,4]:
  24. startpos = displayName.index('_', startpos) + 1
  25. if startpos == -1:
  26. break
  27. if startpos == -1:
  28. return displayName
  29. else:
  30. return displayName[0:startpos-1]+"_H.json"
  31. def getPropertyValues(obj,pptname,defaultValues):
  32. for ppt1 in obj["properties"]:
  33. if ppt1["name"] == pptname:
  34. return ppt1["value"]
  35. return defaultValues
  36. # 盘子情况(孔位)转JSON
  37. def readOnePlateWithHoles( name ):
  38. redfilename = "../ccb/盘子上位置情况/" + name
  39. plate_obj = {} # position always 0,0 in center and no size property!
  40. with open(redfilename,'rb') as fileobject:
  41. plist_root = plistlib.load(fileobject,fmt=plistlib.FMT_XML)
  42. children = plist_root['nodeGraph']['children']
  43. ichild = 0
  44. plate_obj["holes"] = []
  45. for child in children:
  46. ichild = ichild + 1
  47. if ichild==1:
  48. name1 = child["displayName"]
  49. # 把显示名称 ‘plate_wh_03_8_三角圆弧’ 转换成sprite名称 plate_wh_03_8.png
  50. name2 = tranformDName2SName(name1)
  51. plate_obj["name"] = name2
  52. scale_arr = getPropertyValues(child,"scale",[1.0,1.0])
  53. plate_obj["scale_x"] = scale_arr[0]
  54. plate_obj["scale_y"] = scale_arr[1]
  55. else:
  56. hole1 = {}
  57. hole1["x"] = child["properties"][0]["value"][0]
  58. hole1["y"] = child["properties"][0]["value"][1]
  59. scale_arr = getPropertyValues(child, "scale", [1.0, 1.0])
  60. hole1["scale_x"] = scale_arr[0]
  61. hole1["scale_y"] = scale_arr[1]
  62. plate_obj["holes"].append(hole1)
  63. return plate_obj
  64. # 写入JSON文件
  65. def writeJsonFile( obj, jsonbasename ):
  66. fullname = "../config/盘子孔位JSON/" + jsonbasename
  67. with open(fullname,'w') as fileobject:
  68. fileobject.write(json.dumps(obj,ensure_ascii=False))
  69. ## 程序入口 --------------------------------------
  70. #读取 ../ccb/盘子上位置情况/ 下面全部red文件,转换成json写入 盘子孔位JSON 文件夹。
  71. for (root,dirs,files) in os.walk('../ccb/盘子上位置情况',topdown=True):
  72. for fname in files:
  73. if( "情况" in fname and ".red" in fname ):
  74. kongwei_filename = fname
  75. out_name = fnameTransform2(kongwei_filename)
  76. print("read ", kongwei_filename)
  77. holes_obj = readOnePlateWithHoles(kongwei_filename)
  78. print("write ", out_name)
  79. writeJsonFile(holes_obj, out_name)
  80. print("done")