gate_drawer.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  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. }
  13. def initialize_data(self):
  14. self.obj.color = (255, 255, 255)
  15. def draw_obj(self, center, route):
  16. self.gate_drawers[self.style](center, route)
  17. def add_gate_part(self, start_point, end_point, def_point):
  18. carc = mt.arc.ConstructionArc()
  19. b = carc.from_3p(start_point=start_point, def_point=def_point, end_point=end_point)
  20. arc = self.msp.add_arc(center=b.center, radius=b.radius, start_angle=b.start_angle, end_angle=b.end_angle,
  21. dxfattribs={"layer": f"图层{self.obj.layer_id}", })
  22. arc.rgb = self.obj.color
  23. # 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}"})
  24. line = self.msp.add_line(start_point, end_point, dxfattribs={"layer": f"图层{self.obj.layer_id}"})
  25. line.rgb = self.obj.color
  26. def draw_gate_style_0(self, center, route):
  27. assert isinstance(self.obj, Gate)
  28. grid = 0.8 * self.obj.width
  29. rad = self.obj.width * 0.8
  30. point_center = center
  31. # 计算第一个门的三个点
  32. gate1_circle_a = (point_center[0] - grid, point_center[1] + rad)
  33. gate1_circle_b = (point_center[0] - grid, point_center[1] - rad)
  34. gate1_circle_c = (point_center[0] - grid + rad, point_center[1])
  35. # 旋转这些点
  36. gate1_a = rotate_point_around_another(gate1_circle_a, point_center, route)
  37. gate1_b = rotate_point_around_another(gate1_circle_b, point_center, route)
  38. gate1_c = rotate_point_around_another(gate1_circle_c, point_center, route)
  39. # 创建和添加第一个门的弧和线
  40. self.add_gate_part(gate1_a, gate1_b, gate1_c)
  41. # 计算第二个门的三个点
  42. gate2_circle_a = (point_center[0] + grid, point_center[1] + rad)
  43. gate2_circle_b = (point_center[0] + grid, point_center[1] - rad)
  44. gate2_circle_c = (point_center[0] + grid - rad, point_center[1])
  45. # 旋转这些点
  46. gate2_a = rotate_point_around_another(gate2_circle_a, point_center, route)
  47. gate2_b = rotate_point_around_another(gate2_circle_b, point_center, route)
  48. gate2_c = rotate_point_around_another(gate2_circle_c, point_center, route)
  49. # 创建和添加第二个门的弧和线
  50. self.add_gate_part(gate2_a, gate2_b, gate2_c)
  51. def draw_gate_style_1(self, center, route):
  52. rad = self.obj.width * 0.8
  53. small_circle_rad = self.obj.width*0.1
  54. gate1_circle_a = (center[0], center[1] + rad)
  55. gate1_circle_b = (center[0], center[1] - rad)
  56. gate1_circle_c = (center[0] + rad, center[1])
  57. gate1_a = rotate_point_around_another(gate1_circle_a, center, route)
  58. gate1_b = rotate_point_around_another(gate1_circle_b, center, route)
  59. gate1_c = rotate_point_around_another(gate1_circle_c, center, route)
  60. carc = mt.arc.ConstructionArc()
  61. b = carc.from_3p(start_point=gate1_a, def_point=gate1_c, end_point=gate1_b)
  62. arc = self.msp.add_arc(center=b.center, radius=b.radius, start_angle=b.start_angle, end_angle=b.end_angle,
  63. dxfattribs={"layer": f"图层{self.obj.layer_id}", "lineweight": 50})
  64. arc.rgb = self.obj.color
  65. line = self.msp.add_line(gate1_a, gate1_b,
  66. dxfattribs={"layer": f"图层{self.obj.layer_id}", "lineweight": 50})
  67. line.rgb = self.obj.color
  68. self.msp.add_circle(center=gate1_a, radius=small_circle_rad, dxfattribs={"layer": f"图层{self.obj.layer_id}"})
  69. self.msp.add_circle(center=gate1_b, radius=small_circle_rad, dxfattribs={"layer": f"图层{self.obj.layer_id}"})