cadcode

CAD для тех, кто пишет код: деталь — это модуль на JavaScript, превью обновляется на каждое сохранение, STL уходит в слайсер.

Изометрический рендер примера с ракетой: красный оживальный обтекатель на сером корпусе с двумя синими иллюминаторами и четыре красных стреловидных стабилизатора, на светло-сером фоне.

cadcode — это CAD для тех, кто и так пишет код. Деталь описывается модулем на JavaScript, пересобирается в браузере на каждое сохранение, а STL уходит в слайсер. Если у вас есть 3D-принтер и вы знаете JavaScript, кронштейн не должен стоить недели изучения того, где в программе какие меню.

Деталь — это функция. Она принимает размеры и возвращает тело:

import { cube } from 'cadcode';

export const params = { width: 60, depth: 40, height: 25, wall: 2 };

export default (p) =>
  cube([p.width, p.depth, p.height]).subtract(
    cube([p.width - 2 * p.wall, p.depth - 2 * p.wall, p.height]).translate([p.wall, p.wall, p.wall]),
  );

Всё, что у программиста уже есть, приходит вместе с ней бесплатно. Переменные вместо диалогов с размерами, циклы вместо инструментов массива, функция вместо скопированного эскиза. Модель — это текстовый файл, поэтому она живёт в git: её можно сравнить, отвести в ветку и откатить тот коммит, после которого крышка перестала налезать. Она импортирует свои хелперы и любой пакет из npm, TypeScript тоже работает.

Вариант — это флаг, а не перерисовка. Размеры лежат в params, и cadcode stl box.js --set width=80 печатает ту, что шире. --set принимает только то, что программа объявила, — так что опечатка останавливает экспорт, а не тихо печатает значение по умолчанию:

cadcode: Unknown parameter "widht". Declared: width, depth, height, wall

Ещё программа может экспортировать именованные части — assembly, box, lid, print, — и CLI выгрузит одну или все, по файлу на каждую.

Основное время уходит в cadcode dev. Он следит за программой и за каждым файлом, который она импортирует, пересобирает на сохранение и подменяет модель на странице, не трогая камеру: ракурс и зум остаются на месте, пока вы правите, а вид запоминается для каждого файла и переживает перезапуски. Ошибка показывается со строкой в вашем файле, и последняя удачная модель висит на экране, пока её не исправят. У params есть панель — потяните имя числа вбок, и оно покрутится. А тот же рендер работает и без браузера: у cadcode png свой маленький программный растеризатор, так что лист превью получается в CI — или у агента, который проверяет собственную работу. Для этого в пакете лежит готовый скилл.

Геометрию считает manifold — движок булевых операций, на котором работает свежий OpenSCAD. Ровно поэтому STL всегда герметичный: ни неманифолдных рёбер, ни слайсера, который молча чинит вашу сетку.

Тем, кто пришёл из OpenSCAD, учить нечего. cube, cylinder, hull, difference, $fn — всё на месте, и модель переносится строка в строку. Переучиваться придётся только в порядке чтения: translate(t) rotate(r) child из OpenSCAD превращается в child.rotate(r).translate(t) — преобразования читаются изнутри наружу.

Есть песочница с 32 примерами, которые можно открыть и править, — от шкатулки на петлях, которая печатается сразу собранной и раскрытой, до шахматного набора.

Node 20 или новее, MIT: npm install cadcode.