import math import ezdxf import core from core import rotate_point_around_another from drawer.BaseDrawer import VentGraphDrawer from entity.primitives import AirFlow class AirFlowDrawer(VentGraphDrawer): def __init__(self, obj, msp, style): self.air_flow_drawers = { 0: self.draw_air_flow_0, 1: self.draw_air_flow_1, } super().__init__(obj, msp, style) def draw_obj(self, center, route): assert isinstance(self.obj, AirFlow) self.air_flow_drawers[self.style](center, route) def draw_air_flow_0(self, center, route): assert isinstance(self.obj, AirFlow) point_end = center[0] - self.obj.width * 5 / 2, center[1] point_arrow = center[0] + self.obj.width * 5 / 2, center[1] point_s_end = center[0] - self.obj.width * 5 / 2.5, center[1] point_s_arrow = center[0] + self.obj.width * 5 / 5, center[1] arrow = ezdxf.ARROWS.closed_filled point_end = rotate_point_around_another(point_end, center, route) point_arrow = rotate_point_around_another(point_arrow, center, route) point_s_end = rotate_point_around_another(point_s_end, center, route) point_s_arrow = rotate_point_around_another(point_s_arrow, center, route) angle = math.degrees(route) # 用风类型 0:未指定 1:进风 2: 用风 3:回风 # 0、1 是绿色箭头, 2、3是红色箭头 if self.obj.air_type in ('2', '3'): d1 = core.find_point_on_line(point_s_arrow, point_s_end, 1 / 4) d2 = core.find_point_on_line(point_s_arrow, point_s_end, 3 / 4) p1, p2 = core.find_vector_on_d(d1, self.obj.width * 4 / 10, route) p3, p4 = core.find_vector_on_d(d2, self.obj.width * 4 / 10, route) color = (255, 0, 0) spline = self.msp.add_spline([point_s_arrow, p1, p4, point_s_end], dxfattribs={ "layer": f"图层{self.obj.layer_id}", }) spline.rgb = color else: color = (0, 255, 0) line = self.msp.add_line(point_end, point_arrow, { "layer": f"图层{self.obj.layer_id}" }) line.rgb = color # 2d 6 arrow = self.msp.add_arrow(arrow, point_arrow, self.obj.width, angle, { "layer": f"图层{self.obj.layer_id}" }) def draw_air_flow_1(self, center, route): assert isinstance(self.obj, AirFlow) point_end = center[0] - self.obj.width * 5 / 2, center[1] point_arrow = center[0] + self.obj.width * 5 / 2, center[1] point_s_end = center[0] - self.obj.width * 5 / 2.5, center[1] point_s_arrow = center[0] + self.obj.width * 5 / 3.25, center[1] arrow = ezdxf.ARROWS.closed_filled point_end = rotate_point_around_another(point_end, center, route) point_arrow = rotate_point_around_another(point_arrow, center, route) point_s_end = rotate_point_around_another(point_s_end, center, route) point_s_arrow = rotate_point_around_another(point_s_arrow, center, route) angle = math.degrees(route) # 用风类型 0:未指定 1:进风 2: 用风 3:回风 # 0、1 是蓝色箭头, 2、3是红色箭头 if self.obj.air_type in ('2', '3'): d1 = core.find_point_on_line(point_s_arrow, point_s_end, 1 / 4) d2 = core.find_point_on_line(point_s_arrow, point_s_end, 3 / 4) p1, p2 = core.find_vector_on_d(d1, self.obj.width * 4 / 10, route) p3, p4 = core.find_vector_on_d(d2, self.obj.width * 4 / 10, route) color = 1 spline = self.msp.add_spline([point_s_arrow, p1, p4, point_end], dxfattribs={ "layer": f"图层{self.obj.layer_id}", "lineweight": 50, "color": color }) else: color = 5 line = self.msp.add_line(point_end, point_s_arrow, { "layer": f"图层{self.obj.layer_id}", "lineweight": 50, "color": color }) # 2d 6 arrow = self.msp.add_arrow(arrow, point_arrow, self.obj.width, angle, { "layer": f"图层{self.obj.layer_id}", "color": color }) def initialize_data(self): assert isinstance(self.obj, AirFlow)