generate_monitor_configure.py 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. import sys
  2. from lxml import etree
  3. node_project = {
  4. "name": "project",
  5. "attr": {
  6. "name": "测试",
  7. "version": "V1.0.0",
  8. "description": "自动化生成测试画面监控配置文件"
  9. }
  10. }
  11. node_canvas = {
  12. "name": "canvas",
  13. "attr": {
  14. "width": "1280",
  15. "height": "720",
  16. "backgroundColor": "#000000",
  17. "name": "",
  18. "version": "V1.0.0",
  19. "description": "",
  20. "lastModified": "",
  21. "lastModifiedBy": "",
  22. "default": "0"
  23. }
  24. }
  25. label = {
  26. "name": "Label",
  27. "property": {
  28. "x": 0,
  29. "y": 0,
  30. "width": 800,
  31. "height": 20,
  32. "text": "",
  33. "font": "SimSun,9,-1,5,50,0,0,0,0,0",
  34. "fontColor": "#a0a0a4",
  35. "backgroundColor": "#00000000",
  36. "borderVisiable": "true",
  37. "borderColor": "#a0a0a4",
  38. "borderWidth": 1
  39. },
  40. "parameter": {
  41. "parameterName": [
  42. ]
  43. }
  44. }
  45. number = {
  46. "name": "Number",
  47. "property": {
  48. "x": 0,
  49. "y": 0,
  50. "width": 400,
  51. "height": 20,
  52. "rangeFirst": "[0, 1)",
  53. "rangeSecond": "[1, 2)",
  54. "rangeThird": "[2, 3)",
  55. "rangeFourth": "[3, 4)",
  56. "rangeFifth": "[4, 5]",
  57. "colorFirst": "#ff0000",
  58. "colorSecond": "#ffff00",
  59. "colorThird": "#00ff00",
  60. "colorFourth": "#ffff00",
  61. "colorFifth": "#ff0000",
  62. "oorColor": "#ffffff",
  63. "currentValue": 0,
  64. "backgroundColor": "#00000000",
  65. "unit": None,
  66. "borderVisible": True,
  67. "borderWidth": 2,
  68. "font": "SimSum,10,-1,5,50,0,0,0,0,0",
  69. "decimals": 8
  70. },
  71. "parameter": {
  72. "parameterName": [
  73. ]
  74. }
  75. }
  76. binary = {
  77. "name": "Binary",
  78. "property": {
  79. "x": 0,
  80. "y": 0,
  81. "width": 400,
  82. "height": 20,
  83. "backgroundColor": "#00000000",
  84. "borderVisiable": True,
  85. "borderWidth": 1,
  86. "font": "SimSun,9,-1,5,50,0,0,0,0,0",
  87. "rangeFirst": "[0, 1)",
  88. "rangeSecond": "[1, 2]",
  89. "colorFirst": "#ff0000",
  90. "colorSecond": "#ffff00",
  91. "oorColor": "#ffffff",
  92. "currentBinary": "0b0"
  93. },
  94. "parameter": {
  95. "parameterName": [
  96. ]
  97. }
  98. }
  99. def control_dict_to_node(control_dict, parent=None):
  100. control_node = etree.Element(control_dict["name"])
  101. if parent is not None:
  102. parent.append(control_node)
  103. # property
  104. if "property" in control_dict:
  105. prop_node = etree.SubElement(control_node, "property")
  106. for k, v in control_dict["property"].items():
  107. child = etree.SubElement(prop_node, k)
  108. if v is None:
  109. continue
  110. elif isinstance(v, bool):
  111. child.text = "true" if v else "false"
  112. else:
  113. child.text = str(v)
  114. # parameter
  115. if "parameter" in control_dict:
  116. param_node = etree.SubElement(control_node, "parameter")
  117. for k, v in control_dict["parameter"].items():
  118. # 多个 parameterName
  119. if isinstance(v, list):
  120. for item in v:
  121. etree.SubElement(param_node, k).text = str(item)
  122. else:
  123. etree.SubElement(param_node, k).text = str(v)
  124. return control_node
  125. def get_parameters(filename: str) -> dict:
  126. # 读取 XML 文件
  127. tree = etree.parse(filename) # 替换为你的文件路径
  128. root = tree.getroot()
  129. # 将结果转为字典
  130. parameters = {msg.get('ParameterName'): msg.get('NormalizedDataType')
  131. for msg in root.xpath('//Message')}
  132. # 打印字典
  133. # for param, dtype in parameters.items():
  134. # print(f"{param}: {dtype}")
  135. for idx, (param, dtype) in enumerate(parameters.items(), start = 0):
  136. print(f"{idx}: param = {param}, dtype = {dtype}")
  137. return parameters
  138. def generate_monitor_xml(filename: str, cal_parameters: list):
  139. parameters = get_parameters(filename)
  140. # ========= project 根节点 =========
  141. project = etree.Element(
  142. node_project["name"],
  143. **node_project.get("attr", {})
  144. )
  145. canvas_index = 0
  146. for idx, (param, dtype) in enumerate(parameters.items(), start = 0):
  147. # 如果当前 canvas 已满 36 组,则创建新 canvas
  148. if idx % 36 == 0:
  149. node_canvas["attr"]["name"] = f"canvas-{canvas_index}"
  150. canvas = etree.SubElement(
  151. project,
  152. node_canvas["name"],
  153. **node_canvas.get("attr", {})
  154. )
  155. canvas_index += 1
  156. y_offset = (idx % 36) * 20
  157. # Label
  158. lbl_ctrl = label.copy()
  159. lbl_ctrl["property"] = label["property"].copy()
  160. lbl_ctrl["property"]["y"] = y_offset
  161. lbl_ctrl["property"]["text"] = param
  162. control_dict_to_node(lbl_ctrl, canvas)
  163. # 数据控件
  164. if dtype == "BINARY":
  165. bin_ctrl = binary.copy()
  166. bin_ctrl["property"] = binary["property"].copy()
  167. bin_ctrl["property"]["x"] = lbl_ctrl["property"]["width"] + 80
  168. bin_ctrl["property"]["y"] = y_offset
  169. bin_ctrl["parameter"]["parameterName"] = [param]
  170. control_dict_to_node(bin_ctrl, canvas)
  171. else:
  172. num_ctrl = number.copy()
  173. num_ctrl["property"] = number["property"].copy()
  174. num_ctrl["property"]["x"] = lbl_ctrl["property"]["width"] + 80
  175. num_ctrl["property"]["y"] = y_offset
  176. num_ctrl["parameter"]["parameterName"] = [param]
  177. control_dict_to_node(num_ctrl, canvas)
  178. for idx, param in enumerate(cal_parameters, start = 0):
  179. if idx % 36 == 0:
  180. node_canvas["attr"]["name"] = f"canvas-{canvas_index}"
  181. canvas = etree.SubElement(
  182. project,
  183. node_canvas["name"],
  184. **node_canvas.get("attr", {})
  185. )
  186. canvas_index += 1
  187. y_offset = (idx % 36) * 20
  188. # Label
  189. lbl_ctrl = label.copy()
  190. lbl_ctrl["property"] = label["property"].copy()
  191. lbl_ctrl["property"]["y"] = y_offset
  192. lbl_ctrl["property"]["text"] = param
  193. control_dict_to_node(lbl_ctrl, canvas)
  194. num_ctrl = number.copy()
  195. num_ctrl["property"] = number["property"].copy()
  196. num_ctrl["property"]["x"] = lbl_ctrl["property"]["width"] + 80
  197. num_ctrl["property"]["y"] = y_offset
  198. num_ctrl["parameter"]["parameterName"] = [param]
  199. control_dict_to_node(num_ctrl, canvas)
  200. # ========= 写入文件 =========
  201. tree = etree.ElementTree(project)
  202. tree.write(
  203. "monitor.xml",
  204. encoding="UTF-8",
  205. xml_declaration=True,
  206. pretty_print=True
  207. )
  208. print("canvas count: ", canvas_index)
  209. if __name__ == "__main__":
  210. if(len(sys.argv) <= 1):
  211. print("Missing data process XML file name")
  212. print("Try run \'python generate_monitor_configure.py dataprocess.xml\'")
  213. sys.exit(1)
  214. cal_parameters = [
  215. "cal_parameter1",
  216. "cal_parameter2"
  217. ]
  218. filename = sys.argv[1]
  219. generate_monitor_xml(filename, cal_parameters)