import math from ezdxf.enums import TextEntityAlignment import core class AirDuctDrawer: def __init__(self,msp,layer,from_,to,width): self.msp = msp self.layer = layer self.from_ = from_ self.to = to self.width = width # a1 b1 # c1----------c2|F|c3 # center a2 b2 def draw_air_duct_list(self): distance = core.distance(self.from_,self.to) ad_len = self.get_draw_air_duct_len() from_ = self.from_ route_ = core.calculate_angle_with_x_axis(self.from_,self.to) while distance > ad_len: to_ = core.find_point_on_segment(from_,self.to,ad_len) center_ = core.find_point_on_line(from_,to_,1/2) self.draw_air_duct(center_,route_) from_ = to_ distance = distance - ad_len self.msp.add_line(from_, self.to, dxfattribs={"layer": f"图层{self.layer}", "color": core.get_color_by_layer(self.layer)}) def get_draw_air_duct_len(self): return self.width * 3 def draw_air_duct(self,center,route): c1 = center[0]-self.width*1.5,center[1] c2 = center[0]+self.width*1,center[1] c1 = core.rotate_point_around_another(c1,center,route) c2 = core.rotate_point_around_another(c2,center,route) self.msp.add_line(c1, c2, dxfattribs={"layer": f"图层{self.layer}", "color": core.get_color_by_layer(self.layer)}) a1 = center[0]+self.width*1,center[1]+self.width*1/6 a2 = center[0]+self.width*1,center[1]-self.width*1/6 a1 = core.rotate_point_around_another(a1,center,route) a2 = core.rotate_point_around_another(a2,center,route) self.msp.add_line(a1, a2, dxfattribs={"layer": f"图层{self.layer}", "color": core.get_color_by_layer(self.layer)}) f = center[0]+self.width*1.25,center[1] f = core.rotate_point_around_another(f, center, route) angle = math.degrees(route+math.pi) dxfattribs = { 'insert': f, 'style': 'msyh', 'color': core.get_color_by_layer(self.layer), "layer": f"图层{self.layer}", } self.msp.add_text("F", rotation=angle, dxfattribs=dxfattribs, height=self.width/6).set_placement(f, align=TextEntityAlignment.MIDDLE_CENTER) b1 = center[0]+self.width*1.5,center[1]+self.width*1/6 b2 = center[0]+self.width*1.5,center[1]-self.width*1/6 b1 = core.rotate_point_around_another(b1,center,route) b2 = core.rotate_point_around_another(b2,center,route) self.msp.add_line(b1, b2, dxfattribs={"layer": f"图层{self.layer}", "color": core.get_color_by_layer(self.layer)})