import math
class PureDXFWriter:
def __init__(self, filename):
self.filename = filename
self.entities = []
def add_line(self, x1, y1, x2, y2, layer="0"):
self.entities.append(
f"0\nLINE\n8\n{layer}\n10\n{x1:.3f}\n20\n{y1:.3f}\n30\n0.0\n11\n{x2:.3f}\n21\n{y2:.3f}\n31\n0.0\n"
)
def add_circle(self, cx, cy, r, layer="0"):
self.entities.append(
f"0\nCIRCLE\n8\n{layer}\n10\n{cx:.3f}\n20\n{cy:.3f}\n30\n0.0\n40\n{r:.3f}\n"
)
def add_arc(self, cx, cy, r, start_deg, end_deg, layer="0"):
self.entities.append(
f"0\nARC\n8\n{layer}\n10\n{cx:.3f}\n20\n{cy:.3f}\n30\n0.0\n40\n{r:.3f}\n50\n{start_deg:.3f}\n51\n{end_deg:.3f}\n"
)
def save(self):
with open(self.filename, "w", encoding="utf-8") as f:
f.write("0\nSECTION\n2\nENTITIES\n")
for e in self.entities:
f.write(e)
f.write("0\nENDSEC\n0\nEOF\n")
# ГЕНЕРАЦИЯ ЧЕРТЕЖА
dxf = PureDXFWriter("чертеж_детали.dxf")
# ==========================================
# 1. ДЕТАЛЬ "РЕУЛЯТОР" (Центр в [0, 0])
# ==========================================
c1_x, c1_y = 0, 0
# Основная окружность Ф80 (R40) и осевая Ф60 (R30)
dxf.add_circle(c1_x, c1_y, 40)
dxf.add_circle(c1_x, c1_y, 30)
# 5 отверстий Ф10 (R5) по окружности
for i in range(5):
angle_rad = math.radians(180 + i * 72)
hx = c1_x + 30 * math.cos(angle_rad)
hy = c1_y + 30 * math.sin(angle_rad)
dxf.add_circle(hx, hy, 5)
# Дуги пазов
dxf.add_arc(c1_x, c1_y, 75, 45, 135) # Верхний R75
dxf.add_arc(c1_x, c1_y, 77, 225, 315) # Нижний R77
# ==========================================
# 2. ДЕТАЛЬ "РЫЧАГ" (Смещение x = 250)
# ==========================================
ox, oy = 250, 0
# Отверстия в пазу 2x Ф26 (R13)
dxf.add_circle(ox + 0, oy + 0, 13)
dxf.add_circle(ox + 46, oy + 0, 13)
# Внешний контур паза R24
dxf.add_arc(ox + 0, oy + 0, 24, 90, 270)
dxf.add_arc(ox + 46, oy + 0, 24, 270, 90)
dxf.add_line(ox + 0, oy + 24, ox + 46, oy + 24)
dxf.add_line(ox + 0, oy - 24, ox + 46, oy - 24)
# Центральный корпус Ф80 (R40)
dxf.add_circle(ox + 0, oy + 0, 40)
# Верхняя головка: (55, 56) -> Ф18 (R9) и Ф36 (R18)
dxf.add_circle(ox + 55, oy + 56, 9)
dxf.add_circle(ox + 55, oy + 56, 18)
# Нижняя головка: (0, -75) -> Ф14 (R7) и Ф30 (R15)
dxf.add_circle(ox + 0, oy - 75, 7)
dxf.add_circle(ox + 0, oy - 75, 15)
# Сохраняем результат
dxf.save()
print("Готово! Файл 'чертеж_детали.dxf' успешно сгенерирован.")