123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- import math
- import time
- from core import rotate_point_around_another
- from ezdxf import math as mt
- import ezdxf
- class ShaftDrawer:
- def __init__(self, msp, gap, center, route, color):
- self.msp = msp
- self.gap = gap
- self.center = center
- self.route = route
- self.color = color
- def calculate_dodecagon_points(self):
- # 存储结果的列表
- points = []
- points_rotated = []
- Cx, Cy = self.center
- r = 1 / 2 * self.gap
- # 正十二边形有12个顶点,每个顶点间隔30度
- for i in range(12):
- # 将角度从度转换为弧度
- theta = math.radians(30 * i)
- # 计算x和y坐标
- x = Cx + r * math.cos(theta)
- y = Cy + r * math.sin(theta)
- # 将坐标添加到列表中
- points.append((x, y))
- return points
- def calculate_outside_octagon_points(self):
- # 存储结果的列表
- points = []
- Cx, Cy = self.center
- r = 1 / 4 * self.gap
- # 正八边形有8个顶点,每个顶点间隔45度
- for i in range(8):
- # 将角度从度转换为弧度
- theta = math.radians(45 * i)
- # 计算x和y坐标
- x = Cx + r * math.cos(theta)
- y = Cy + r * math.sin(theta)
- x_y_ = rotate_point_around_another((x, y), self.center, math.radians(12.5))
- # 将坐标添加到列表中
- points.append(x_y_)
- return points
- def calculate_inner_octagon_points(self):
- # 存储结果的列表
- points = []
- Cx, Cy = self.center
- r = 1 / 8 * self.gap
- # 正八边形有8个顶点,每个顶点间隔45度
- for i in range(8):
- # 将角度从度转换为弧度
- theta = math.radians(45 * i)
- # 计算x和y坐标
- x = Cx + r * math.cos(theta)
- y = Cy + r * math.sin(theta)
- # 将坐标添加到列表中
- points.append((x, y))
- return points
- def draw_polygon(self, points):
- i = 0
- while i < len(points) - 1:
- self.msp.add_line(points[i], points[i + 1], {"color": self.color})
- i = i + 1
- self.msp.add_line(points[-1], points[0], {
- "color": self.color,
- })
- def draw_shaft_drawer(self):
- points12 = self.calculate_dodecagon_points()
- self.draw_polygon(points12)
- points8_out = self.calculate_outside_octagon_points()
- self.draw_polygon(points8_out)
- points8_in = self.calculate_inner_octagon_points()
- self.draw_polygon(points8_in)
- # for i,points8 in enumerate(points8_in):
- # msp.add_text(text=str(i),dxfattribs={'insert':points8})
- carc = mt.arc.ConstructionArc()
- b = carc.from_3p(start_point=points8_in[1], def_point=points8_in[3], end_point=points8_in[5])
- self.msp.add_arc(center=b.center, radius=b.radius, start_angle=b.start_angle, end_angle=b.end_angle)
- hatch = self.msp.add_hatch(color=self.color)
- edge_path = hatch.paths.add_edge_path()
- edge_path.add_arc(center=b.center, radius=b.radius, start_angle=b.start_angle, end_angle=b.end_angle)
- if __name__ == '__main__':
- doc = ezdxf.new()
- msp = doc.modelspace()
- sd = ShaftDrawer(msp, 1000, (10, 10), 10)
- sd.draw_shaft_drawer()
- doc.saveas(f'shaft{str(time.time())}.dxf')
|