Ниже приведены три простые программы на Python, которые демонстрируют задачи, встречающиеся в САПР (CAD): 2D черчение в SVG, 3D-моделирование в OBJ и формат DXF. Каждая программа автономна и не требует внешних библиотек.
- Программа для 2D черчения и экспорта в SVG
- Что делает: строит полилинию по точкам и сохраняет в файл drawing.svg.
- Подойдет для набросков 2D схем, планировок и т. п.
# drawing_svg.py
# Простая программа: создаёт SVG-документ из заданных точек.
def generate_svg(points, filename="drawing.svg", width=400, height=400, stroke="black"):
# Простейшее масштабирование по минимальным и максимальным значениям точек
minx = min(p[0] for p in points)
maxx = max(p[0] for p in points)
miny = min(p[1] for p in points)
maxy = max(p[1] for p in points)
pad = 10
dx = maxx - minx if maxx != minx else 1.0
dy = maxy - miny if maxy != miny else 1.0
scale = min((width - 2*pad) / dx, (height - 2*pad) / dy)
def to_screen(p):
x = pad + (p[0] - minx) * scale
y = height - (pad + (p[1] - miny) * scale)
return x, y
path = " ".join(f"{to_screen(p)[0]},{to_screen(p)[1]}" for p in points)
svg = f'''<svg xmlns="http://www.w3.org/2000/svg" width="{width}" height="{height}" viewBox="0 0 {width} {height}">
<polyline points="{path}" fill="none" stroke="{stroke}" stroke-width="2"/>
</svg>'''
with open(filename, "w") as f:
f.write(svg)
def main():
# Пример: прямоугольник
points = [(50, 50), (350, 50), (350, 200), (50, 200), (50, 50)]
generate_svg(points, "drawing.svg")
if __name__ == "__main__":
main()
Как запустить:
- python3 drawing_svg.py
- В текущей папке появится drawing.svg.
- Программа для простого 3D-моделя: экспорт куба в OBJ
- Что делает: генерирует вершины куба и треугольные faces, сохраняет в cube.obj.
- Подойдет для базового 3D-моделирования и проверки импорта в другие ПО (Blender, MESHMAGIC и т. п.).
# cube_obj.py
# Генерация простого куба и экспорт в OBJ
def write_cube_obj(side=1.0, filename="cube.obj"):
s = side / 2.0 # полубоковая ширина
verts = [
(-s, -s, -s), ( s, -s, -s), ( s, s, -s), (-s, s, -s), # задняя грань
(-s, -s, s), ( s, -s, s), ( s, s, s), (-s, s, s), # передняя грань
]
faces = [
(1, 2, 3), (1, 3, 4), # задняя грань
(5, 6, 7), (5, 7, 8), # передняя грань
(1, 2, 6), (1, 6, 5), # нижняя грань
(2, 3, 7), (2, 7, 6), # правая грань
(3, 4, 8), (3, 8, 7), # верхняя грань
(4, 1, 5), (4, 5, 8), # левая грань
]
with open(filename, "w") as f:
for v in verts:
f.write(f"v {v[0]} {v[1]} {v[2]}\n")
f.write("s off\n")
for a, b, c in faces:
f.write(f"f {a} {b} {c}\n")
if __name__ == "__main__":
write_cube_obj(2.0, "cube.obj")
Как запустить:
- python3 cube_obj.py
- В текущей папке появится cube.obj, которую можно открыть в любом 3D-редакторе.
- Проба DXF-генератора: минимальная запись LINE и CIRCLE
- Что делает: создаёт минимальный DXF-файл с двумя примитивами: линией и окружностью.
- Подойдет для демонстрации базового формата CAD-вида данного стандарта.
# dxf_writer.py
# Минимальный DXF-файл с примитивами LINE и CIRCLE
def write_dxf(filename="scene.dxf"):
parts = []
parts.append("0\nSECTION\n2\nHEADER\n0\nENDSEC\n")
parts.append("0\nSECTION\n2\nENTITIES\n")
# Линия: от (0,0,0) до (100,0,0)
parts.append("0\nLINE\n8\n0\n10\n0.0\n20\n0.0\n30\n0.0\n11\n100.0\n21\n0.0\n31\n0.0\n")
# Окружность: центр (200,200,0), радиус 50
parts.append("0\nCIRCLE\n8\n0\n10\n200.0\n20\n200.0\n30\n0.0\n40\n50.0\n")
parts.append("0\nENDSEC\n0\nEOF\n")
with open(filename, "w") as f:
f.write("".join(parts))
if __name__ == "__main__":
write_dxf()
Как запустить:
- python3 dxf_writer.py
- В текущей папке появится scene.dxf, который можно открыть в CAD-программе и проверить примитивы.
Советы и варианты расширения
- Язык: если нужен другой язык (C++, Java, C#) — скажите, могу переписать.
- Расширение: можно сделать параметры через ввод пользователя, или чтение сцен из файлов (CSV/JSON).
- Расширение 2D: можно добавить экспорт в формат DXF напрямую из SVG-дрыв, или добавить поддержку полилиний, кругов и дуг.
- Расширение 3D: можно добавить сетку и нормали, сохранить в STL илиPLY, добавить плавную топологию.
Если нужно, могу адаптировать эти примеры под конкретный язык, IDE или требования вашего курса (например, добавить обработку ошибок, командную строку, тесты).