import math
class KompasDXFWriter:
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:.4f}\n20\n{y1:.4f}\n30\n0.0\n11\n{x2:.4f}\n21\n{y2:.4f}\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:.4f}\n20\n{cy:.4f}\n30\n0.0\n40\n{r:.4f}\n"
)
def add_arc(self, cx, cy, r, start_deg, end_deg, layer="0"):
start_deg = start_deg % 360
end_deg = end_deg % 360
self.entities.append(
f"0\nARC\n8\n{layer}\n10\n{cx:.4f}\n20\n{cy:.4f}\n30\n0.0\n40\n{r:.4f}\n50\n{start_deg:.4f}\n51\n{end_deg:.4f}\n"
)
def save(self):
# Заголовок AC1009 (AutoCAD R12), гарантированно читаемый КОМПАС v25
header = "0\nSECTION\n2\nHEADER\n9\n$ACADVER\n1\nAC1009\n0\nENDSEC\n0\nSECTION\n2\nENTITIES\n"
footer = "0\nENDSEC\n0\nEOF\n"
with open(self.filename, "w", encoding="ascii") as f:
f.write(header)
for e in self.entities:
f.write(e)
f.write(footer)
# Генерация геометрии
dxf = KompasDXFWriter("chertezh_v25.dxf")
# 1. ДЕТАЛЬ "РЕГУЛЯТОР"
c1_x, c1_y = 0, 0
dxf.add_circle(c1_x, c1_y, 40) # Ф80
dxf.add_circle(c1_x, c1_y, 30) # Ф60
# 5 отверстий Ф10
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 = 200)
ox, oy = 200, 0
dxf.add_circle(ox + 0, oy + 0, 13) # Ф26
dxf.add_circle(ox + 46, oy + 0, 13) # Ф26
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)
dxf.add_circle(ox + 0, oy + 0, 40) # Ф80
# Головки рычага
dxf.add_circle(ox + 55, oy + 56, 9) # Ф18
dxf.add_circle(ox + 55, oy + 56, 18) # Ф36
dxf.add_circle(ox + 0, oy - 75, 7) # Ф14
dxf.add_circle(ox + 0, oy - 75, 15) # Ф30
dxf.save()
print("Файл 'chertezh_v25.dxf' успешно создан!")