dict_manager_3d.py 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. from tqdm import tqdm
  2. import core
  3. from dict.dict_manager import DictManager
  4. from entity.Line import Plg, Line
  5. from entity.Node import Node
  6. from entity.primitives import Tun3d, TunText, TunGap, AirFlow, Fan, Window, Gate
  7. standard_width = 0.5
  8. class DictManger3D(DictManager):
  9. def __init__(self, original_data):
  10. super().__init__(original_data)
  11. self.gaps_list = []
  12. self.get_tun_gap()
  13. self.get_tun3d_dict()
  14. self.get_tun_text()
  15. self.get_air_flow()
  16. self.get_windows_3d()
  17. self.get_gates_3d()
  18. self.get_fans_3d()
  19. def get_tun3d_dict(self):
  20. node_list = self.original_data["tunsMap"]
  21. for node in tqdm(node_list, desc=' 【巷道读取中】'):
  22. obj = node[1]
  23. vec_l_series = [
  24. (obj['vecL1']['x'], obj['vecL1']['z']),
  25. (obj['vecL2']['x'], obj['vecL2']['z']),
  26. (obj['vecL3']['x'], obj['vecL3']['z']),
  27. (obj['vecL4']['x'], obj['vecL4']['z'])
  28. ]
  29. vec_r_series = [
  30. (obj['vecR1']['x'], obj['vecR1']['z']),
  31. (obj['vecR2']['x'], obj['vecR2']['z']),
  32. (obj['vecR3']['x'], obj['vecR3']['z']),
  33. (obj['vecR4']['x'], obj['vecR4']['z'])
  34. ]
  35. vec_b_series = [
  36. (obj['vec1']['x'], obj['vec1']['z']),
  37. (obj['vec2']['x'], obj['vec2']['z']),
  38. (obj['vec3']['x'], obj['vec3']['z']),
  39. (obj['vec4']['x'], obj['vec4']['z'])
  40. ]
  41. from_ = (obj["nfrom"]["x"], obj["nfrom"]["z"])
  42. to_ = (obj["nto"]["x"], obj["nto"]["z"])
  43. vec_middle = from_, to_
  44. center = core.find_point_on_line(from_, to_, 1 / 2)
  45. center = Node(center, '3d', 0)
  46. middle_line = Line(vec_middle, '3d', 0)
  47. color = self.layer_map[obj['nlayerid']]['ncolor']
  48. color = core.hex_to_rgb(color)
  49. width = core.min_distance_between_segments(vec_b_series[:2], vec_b_series[2:])
  50. t3d = Tun3d(obj['ntunid'], obj["nlayerid"], obj["strname"], center, middle_line, Plg(vec_l_series),
  51. Plg(vec_r_series), Plg(vec_b_series), obj['fq'], color, width, obj['arrowShow'],
  52. obj['nairtype'])
  53. self.tun_dict[obj['ntunid']] = t3d
  54. def get_tun_text(self):
  55. node_list = self.original_data["tunsMap"]
  56. tun_text_dict = {}
  57. for node in tqdm(node_list, desc=' 【巷道文字读取中】'):
  58. node = node[1]
  59. if node["tunType"] == '1': continue
  60. tun = self.tun_dict.get(node["ntunid"])
  61. tun_key = node["strname"] + f'{ core.calculate_angle_with_x_axis(tun.middle_line.original_line[0], tun.middle_line.original_line[1]):.7f}'
  62. if tun_key not in tun_text_dict:
  63. # 如果不在,则初始化一个新的空列表作为值
  64. tun_text_dict[tun_key] = {
  65. "id": tun.id,
  66. "text": node["strname"],
  67. "name": tun.name,
  68. "layer_id": tun.layer_id,
  69. "width": standard_width,
  70. "color": tun.color,
  71. "tun_middle_lines": []
  72. }
  73. from_ = (node["nfrom"]["x"], node["nfrom"]["z"])
  74. to_ = (node["nto"]["x"], node["nto"]["z"])
  75. # 将 from_ 和 to_ 坐标添加到 tun_text 对应的列表中
  76. tun_text_dict[tun_key]['tun_middle_lines'].extend([from_, to_])
  77. for tun_text in tqdm(tun_text_dict.values(), desc=' 【巷道文字读取中】'):
  78. tun_middle_lines = tun_text['tun_middle_lines']
  79. farthest = core.farthest_points(tun_middle_lines)
  80. divIndex = self.layer_map[tun_text['layer_id']]['divIndex']
  81. middle_line = Line(farthest, '3d', divIndex)
  82. center = core.find_point_on_line(farthest[0], farthest[1], 1 / 2)
  83. #
  84. center_node = Node(center, '3d', divIndex)
  85. tt = TunText(tun_text['id'], tun_text['layer_id'], tun_text['text'], center_node, middle_line,
  86. tun_text['width'], tun_text['color'], 0)
  87. tun_length = core.distance(middle_line.agg_line[0], middle_line.agg_line[1])
  88. text_len = len(tun_text['text']) * 0.7
  89. if tun_length * 0.5 > text_len:
  90. self.tun_text_list.append(tt)
  91. def get_tun_gap(self):
  92. for node in self.original_data['nodeFaceMap']:
  93. plg = []
  94. for n in node:
  95. if 'screenX' in n:
  96. plg.append((n['screenX'], n['screenY']))
  97. plg_obj = Plg(plg)
  98. self.gaps_list.append(TunGap(plg_obj))
  99. def get_air_flow(self):
  100. for tun in tqdm(self.tun_dict.values(), '【风流读取中】'):
  101. if tun.arrow_show == 0: continue;
  102. if tun.fq < 0.3: continue
  103. tun_len = core.distance(tun.middle_line.original_line[0],tun.middle_line.original_line[1])
  104. if tun_len < 7 * tun.width: continue
  105. divIndex = self.layer_map[tun.layer_id]['divIndex']
  106. if tun_len < 50 * tun.width:
  107. center = tun.center
  108. air_flow = AirFlow(core.get_random_id(),tun.layer_id,'',center,tun.middle_line,tun.width,tun.color,tun.air_type)
  109. self.air_flow_list.append(air_flow)
  110. else:
  111. space = int(tun_len // (50 * tun.width))
  112. points = core.divide_segment(tun.middle_line.original_line[0], tun.middle_line.original_line[1], space)[1:-1]
  113. for i in range(len(points)):
  114. center = Node(points[i],'3d',divIndex)
  115. air_flow = AirFlow(core.get_random_id(), tun.layer_id, '', center, tun.middle_line, standard_width, tun.color,
  116. tun.air_type)
  117. self.air_flow_list.append(air_flow)
  118. def get_fans_3d(self):
  119. layer_map = self.original_data["layerMap"]
  120. for layer in tqdm(layer_map, desc='【风扇读取中】'):
  121. items = layer[1]['fans']
  122. for item in items:
  123. tun = self.tun_dict.get(item["ntunid"])
  124. if tun is None:
  125. continue
  126. divIndex = self.layer_map[item['nlayerid']]['divIndex']
  127. center = Node((item['screenX'], item['screenY']), '3d', divIndex)
  128. color = core.hex_to_rgb(self.layer_map[item['nlayerid']]['ncolor'])
  129. fan = Fan(item['id'],item['nlayerid'],item['strname'],center,tun.middle_line,standard_width,color,item['strtype'])
  130. self.fan_list.append(fan)
  131. def get_windows_3d(self):
  132. layer_map = self.original_data["layerMap"]
  133. for layer in tqdm(layer_map, desc='【风窗读取中】'):
  134. items = layer[1]['windows']
  135. for item in items:
  136. tun = self.tun_dict.get(item["ntunid"])
  137. if tun is None:
  138. continue
  139. divIndex = self.layer_map[item['nlayerid']]['divIndex']
  140. center = Node((item['screenX'], item['screenY']), '3d', divIndex)
  141. color = core.hex_to_rgb(self.layer_map[item['nlayerid']]['ncolor'])
  142. window = Window(item['id'],item['nlayerid'],item['strname'],center,tun.middle_line,standard_width,color)
  143. self.window_list.append(window)
  144. def get_gates_3d(self):
  145. layer_map = self.original_data["layerMap"]
  146. for layer in tqdm(layer_map, desc='【风门读取中】'):
  147. items = layer[1]['gates']
  148. for item in items:
  149. tun = self.tun_dict.get(item["ntunid"])
  150. if tun is None:
  151. continue
  152. divIndex = self.layer_map[item['nlayerid']]['divIndex']
  153. center = Node((item['screenX'], item['screenY']), '3d', divIndex)
  154. color = core.hex_to_rgb(self.layer_map[item['nlayerid']]['ncolor'])
  155. gate = Gate(item['id'],item['nlayerid'],item['strname'],center,tun.middle_line,standard_width,color)
  156. self.gate_list.append(gate)