gate_drawer.py 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. from core import rotate_point_around_another
  2. from drawer.BaseDrawer import BaseDrawer, VentGraphDrawer
  3. from entity.primitives import Gate
  4. from ezdxf import math as mt
  5. from dict.model_config import _get_app_name, _global_model_configs
  6. class GateDrawer(VentGraphDrawer):
  7. def __init__(self, obj, msp, style):
  8. super().__init__(obj, msp, style)
  9. self.gate_drawers = {
  10. 0: self.draw_gate_style_0,
  11. 1: self.draw_gate_style_1,
  12. 2:self.draw_gate_style_2
  13. }
  14. def initialize_data(self):
  15. self.obj.color = (255, 255, 255)
  16. def draw_obj(self, center, route):
  17. self.gate_drawers[self.style](center, route)
  18. def add_gate_part(self, start_point, end_point, def_point):
  19. carc = mt.arc.ConstructionArc()
  20. b = carc.from_3p(start_point=start_point, def_point=def_point, end_point=end_point)
  21. arc = self.msp.add_arc(center=b.center, radius=b.radius, start_angle=b.start_angle, end_angle=b.end_angle,
  22. dxfattribs={"layer": f"图层{self.obj.layer_id}", })
  23. arc.rgb = self.obj.color
  24. # self.msp.add_lwpolyline([(start_point[0], start_point[1], 1), (end_point[0], end_point[1], 0)], format="xyb", dxfattribs={"layer": f"图层{self.layer}"})
  25. line = self.msp.add_line(start_point, end_point, dxfattribs={"layer": f"图层{self.obj.layer_id}"})
  26. line.rgb = self.obj.color
  27. def draw_gate_style_0(self, center, route):
  28. assert isinstance(self.obj, Gate)
  29. grid = 0.8 * self.obj.width
  30. rad = self.obj.width * 0.8
  31. point_center = center
  32. # 计算第一个门的三个点
  33. gate1_circle_a = (point_center[0] - grid, point_center[1] + rad)
  34. gate1_circle_b = (point_center[0] - grid, point_center[1] - rad)
  35. gate1_circle_c = (point_center[0] - grid + rad, point_center[1])
  36. # 旋转这些点
  37. gate1_a = rotate_point_around_another(gate1_circle_a, point_center, route)
  38. gate1_b = rotate_point_around_another(gate1_circle_b, point_center, route)
  39. gate1_c = rotate_point_around_another(gate1_circle_c, point_center, route)
  40. # 创建和添加第一个门的弧和线
  41. self.add_gate_part(gate1_a, gate1_b, gate1_c)
  42. # 计算第二个门的三个点
  43. gate2_circle_a = (point_center[0] + grid, point_center[1] + rad)
  44. gate2_circle_b = (point_center[0] + grid, point_center[1] - rad)
  45. gate2_circle_c = (point_center[0] + grid - rad, point_center[1])
  46. # 旋转这些点
  47. gate2_a = rotate_point_around_another(gate2_circle_a, point_center, route)
  48. gate2_b = rotate_point_around_another(gate2_circle_b, point_center, route)
  49. gate2_c = rotate_point_around_another(gate2_circle_c, point_center, route)
  50. # 创建和添加第二个门的弧和线
  51. self.add_gate_part(gate2_a, gate2_b, gate2_c)
  52. def draw_gate_style_1(self, center, route):
  53. rad = self.obj.width * 0.8
  54. small_circle_rad = self.obj.width * 0.1
  55. gate1_circle_a = (center[0], center[1] + rad)
  56. gate1_circle_b = (center[0], center[1] - rad)
  57. gate1_circle_c = (center[0] + rad, center[1])
  58. gate1_a = rotate_point_around_another(gate1_circle_a, center, route)
  59. gate1_b = rotate_point_around_another(gate1_circle_b, center, route)
  60. gate1_c = rotate_point_around_another(gate1_circle_c, center, route)
  61. carc = mt.arc.ConstructionArc()
  62. b = carc.from_3p(start_point=gate1_a, def_point=gate1_c, end_point=gate1_b)
  63. arc = self.msp.add_arc(center=b.center, radius=b.radius, start_angle=b.start_angle, end_angle=b.end_angle,
  64. dxfattribs={"layer": f"图层{self.obj.layer_id}", "lineweight": 50})
  65. arc.rgb = self.obj.color
  66. line = self.msp.add_line(gate1_a, gate1_b,
  67. dxfattribs={"layer": f"图层{self.obj.layer_id}", "lineweight": 50})
  68. line.rgb = self.obj.color
  69. self.msp.add_circle(center=gate1_a, radius=small_circle_rad, dxfattribs={"layer": f"图层{self.obj.layer_id}"})
  70. self.msp.add_circle(center=gate1_b, radius=small_circle_rad, dxfattribs={"layer": f"图层{self.obj.layer_id}"})
  71. # b1 a1 c1
  72. # a3(| | |)a4
  73. # b2 a2 c2
  74. def draw_gate_style_2(self, center, route):
  75. a1 = center[0], center[1] + self.obj.width
  76. a2 = center[0], center[1] - self.obj.width
  77. a3 = center[0] - self.obj.width, center[1]
  78. a4 = center[0] + self.obj.width, center[1]
  79. b1 = a1[0] - 1/2*self.obj.width,a1[1]
  80. b2 = a2[0] - 1/2*self.obj.width,a2[1]
  81. c1 = a1[0] + 1/2*self.obj.width,a1[1]
  82. c2 = a2[0] + 1/2*self.obj.width,a2[1]
  83. a1 = rotate_point_around_another(a1,center,route)
  84. a2 = rotate_point_around_another(a2,center,route)
  85. a3 = rotate_point_around_another(a3,center,route)
  86. a4 = rotate_point_around_another(a4,center,route)
  87. b1 = rotate_point_around_another(b1,center,route)
  88. b2 = rotate_point_around_another(b2,center,route)
  89. c1 = rotate_point_around_another(c1,center,route)
  90. c2 = rotate_point_around_another(c2,center,route)
  91. line = self.msp.add_line(a1, a2,
  92. dxfattribs={"layer": f"图层{self.obj.layer_id}", "lineweight": 50})
  93. line.rgb = self.obj.color
  94. line = self.msp.add_line(b1, b2,
  95. dxfattribs={"layer": f"图层{self.obj.layer_id}", "lineweight": 50})
  96. line.rgb = self.obj.color
  97. line = self.msp.add_line(c1, c2,
  98. dxfattribs={"layer": f"图层{self.obj.layer_id}", "lineweight": 50})
  99. line.rgb = self.obj.color
  100. mt_carc = mt.arc.ConstructionArc()
  101. arc_1 = mt_carc.from_3p(start_point=c2, def_point=a4, end_point=c1)
  102. # b1 a1 c1
  103. # a3(| | |)a4
  104. # b2 a2 c2
  105. arc = self.msp.add_arc(center=arc_1.center, radius=arc_1.radius, start_angle=arc_1.start_angle, end_angle=arc_1.end_angle,
  106. dxfattribs={"layer": f"图层{self.obj.layer_id}", "lineweight": 50})
  107. arc.rgb = self.obj.color
  108. arc_2 = mt_carc.from_3p(start_point=b1, def_point=a3, end_point=b2)
  109. arc = self.msp.add_arc(center=arc_2.center, radius=arc_2.radius, start_angle=arc_2.start_angle, end_angle=arc_2.end_angle,
  110. dxfattribs={"layer": f"图层{self.obj.layer_id}", "lineweight": 50})
  111. arc.rgb = self.obj.color