air_flow_drawer.py 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. import math
  2. import ezdxf
  3. import core
  4. from core import rotate_point_around_another
  5. from drawer.BaseDrawer import VentGraphDrawer
  6. from entity.primitives import AirFlow
  7. class AirFlowDrawer(VentGraphDrawer):
  8. def __init__(self, obj, msp, style):
  9. self.air_flow_drawers = {
  10. 0: self.draw_air_flow_0,
  11. 1: self.draw_air_flow_1,
  12. 2: self.draw_air_flow_2,
  13. }
  14. super().__init__(obj, msp, style)
  15. def draw_obj(self, center, route):
  16. assert isinstance(self.obj, AirFlow)
  17. self.air_flow_drawers[self.style](center, route)
  18. def draw_air_flow_0(self, center, route):
  19. assert isinstance(self.obj, AirFlow)
  20. point_end = center[0] - self.obj.width * 5 / 2, center[1]
  21. point_arrow = center[0] + self.obj.width * 5 / 2, center[1]
  22. point_s_end = center[0] - self.obj.width * 5 / 2.5, center[1]
  23. point_s_arrow = center[0] + self.obj.width * 5 / 5, center[1]
  24. arrow = ezdxf.ARROWS.closed_filled
  25. point_end = rotate_point_around_another(point_end, center, route)
  26. point_arrow = rotate_point_around_another(point_arrow, center, route)
  27. point_s_end = rotate_point_around_another(point_s_end, center, route)
  28. point_s_arrow = rotate_point_around_another(point_s_arrow, center, route)
  29. angle = math.degrees(route)
  30. # 用风类型 0:未指定 1:进风 2: 用风 3:回风
  31. # 0、1 是绿色箭头, 2、3是红色箭头
  32. if self.obj.air_type in ('2', '3'):
  33. d1 = core.find_point_on_line(point_s_arrow, point_s_end, 1 / 4)
  34. d2 = core.find_point_on_line(point_s_arrow, point_s_end, 3 / 4)
  35. p1, p2 = core.find_vector_on_d(d1, self.obj.width * 4 / 10, route)
  36. p3, p4 = core.find_vector_on_d(d2, self.obj.width * 4 / 10, route)
  37. color = 1
  38. spline = self.msp.add_spline([point_s_arrow, p1, p4, point_s_end], dxfattribs={
  39. "layer": f"图层{self.obj.layer_id}","color":color
  40. })
  41. else:
  42. color = 3
  43. line = self.msp.add_line(point_end, point_arrow, {
  44. "layer": f"图层{self.obj.layer_id}","color":color
  45. })
  46. # 2d 6
  47. arrow = self.msp.add_arrow(arrow, point_arrow, self.obj.width, angle, {
  48. "layer": f"图层{self.obj.layer_id}","color":color
  49. })
  50. def draw_air_flow_1(self, center, route):
  51. assert isinstance(self.obj, AirFlow)
  52. point_end = center[0] - self.obj.width * 5 / 2, center[1]
  53. point_arrow = center[0] + self.obj.width * 5 / 2, center[1]
  54. point_s_end = center[0] - self.obj.width * 5 / 2.5, center[1]
  55. point_s_arrow = center[0] + self.obj.width * 5 / 3.25, center[1]
  56. arrow = ezdxf.ARROWS.closed_filled
  57. point_end = rotate_point_around_another(point_end, center, route)
  58. point_arrow = rotate_point_around_another(point_arrow, center, route)
  59. point_s_end = rotate_point_around_another(point_s_end, center, route)
  60. point_s_arrow = rotate_point_around_another(point_s_arrow, center, route)
  61. angle = math.degrees(route)
  62. # 用风类型 0:未指定 1:进风 2: 用风 3:回风
  63. # 0、1 是蓝色箭头, 2、3是红色箭头
  64. if self.obj.air_type in ('2', '3'):
  65. d1 = core.find_point_on_line(point_s_arrow, point_s_end, 1 / 4)
  66. d2 = core.find_point_on_line(point_s_arrow, point_s_end, 3 / 4)
  67. p1, p2 = core.find_vector_on_d(d1, self.obj.width * 4 / 10, route)
  68. p3, p4 = core.find_vector_on_d(d2, self.obj.width * 4 / 10, route)
  69. color = 1
  70. spline = self.msp.add_spline([point_s_arrow, p1, p4, point_end], dxfattribs={
  71. "layer": f"图层{self.obj.layer_id}", "lineweight": 50, "color": color
  72. })
  73. else:
  74. color = 5
  75. line = self.msp.add_line(point_end, point_s_arrow, {
  76. "layer": f"图层{self.obj.layer_id}",
  77. "lineweight": 50,
  78. "color": color
  79. })
  80. # 2d 6
  81. arrow = self.msp.add_arrow(arrow, point_arrow, self.obj.width, angle, {
  82. "layer": f"图层{self.obj.layer_id}", "color": color
  83. })
  84. def draw_air_flow_2(self, center, route):
  85. assert isinstance(self.obj, AirFlow)
  86. point_end = center[0] - self.obj.width * 5 / 2, center[1]
  87. point_arrow = center[0] + self.obj.width * 5 / 2, center[1]
  88. point_s_end = center[0] - self.obj.width * 5 / 2.5, center[1]
  89. point_s_arrow = center[0] + self.obj.width * 5 / 3.25, center[1]
  90. arrow = ezdxf.ARROWS.closed_filled
  91. point_end = rotate_point_around_another(point_end, center, route)
  92. point_arrow = rotate_point_around_another(point_arrow, center, route)
  93. point_s_end = rotate_point_around_another(point_s_end, center, route)
  94. point_s_arrow = rotate_point_around_another(point_s_arrow, center, route)
  95. angle = math.degrees(route)
  96. # 用风类型 0:未指定 1:进风 2: 用风 3:回风
  97. # 0、1 是蓝色箭头, 2、3是红色箭头
  98. if self.obj.air_type in ('2', '3'):
  99. d1 = core.find_point_on_line(point_s_end, point_s_arrow, 1 / 10)
  100. d2 = core.find_point_on_line(point_s_end, point_s_arrow, 3 / 10)
  101. d3 = core.find_point_on_line(point_s_end, point_s_arrow, 5 / 10)
  102. d4 = core.find_point_on_line(point_s_end, point_s_arrow, 7 / 10)
  103. p1, p2 = core.find_vector_on_d(d1, self.obj.width * 4 / 10, route)
  104. p3, p4 = core.find_vector_on_d(d2, self.obj.width * 4 / 10, route)
  105. p5, p6 = core.find_vector_on_d(d3, self.obj.width * 4 / 10, route)
  106. p7, p8 = core.find_vector_on_d(d4, self.obj.width * 4 / 10, route)
  107. color = 1
  108. spline = self.msp.add_spline([p1, p4, p5, p8], dxfattribs={
  109. "layer": f"图层{self.obj.layer_id}", "lineweight": 50, "color": color
  110. })
  111. else:
  112. color = 5
  113. line = self.msp.add_line(point_end, point_s_arrow, {
  114. "layer": f"图层{self.obj.layer_id}",
  115. "lineweight": 50,
  116. "color": color
  117. })
  118. # 2d 6
  119. arrow = self.msp.add_arrow(arrow, point_arrow, self.obj.width, angle, {
  120. "layer": f"图层{self.obj.layer_id}", "color": color
  121. })
  122. def initialize_data(self):
  123. assert isinstance(self.obj, AirFlow)