Справочник по DSL
Геометрия, граничные условия, сетка и настройки решателя в WebCAE проходят через единый командный слой — доступный из UI, из скрипта и из вызова MCP-инструмента. Этот справочник документирует каждую команду по актуальному состоянию кода: синтаксис, аргументы, единицы измерения и честные оговорки о том, что пока не реализовано.
Введение
В основе WebCAE лежит единый командный слой: каждое действие, доступное из интерфейса — построение геометрии, задание граничных условий, генерация сетки, расчёт, чтение результатов — это одновременно и команда небольшого скриптового языка (DSL). Панели визарда и лента вызывают ровно те же обработчики команд, что и скрипт. Значит, скрипт может воспроизвести всё, что вы делаете руками, а всё, что делает скрипт, можно повторить, сравнить и версионировать как обычный текст.
Запустить скрипт можно двумя способами:
- В приложении — открыть панель терминала в UI и вставить или ввести команды. Каждая команда исполняется немедленно над текущей моделью — так же, как нажатие соответствующей кнопки.
- Через MCP — инструмент
cae_run_scriptпринимает DSL-скрипт строкой и возвращает выводprint, записанные черезrecordзначения и ошибку, если она была. Так внешний агент или автоматизация управляют WebCAE без интерфейса.
Скрипт — обычный текст, одна инструкция на строку (циклы и блоки — в { }). Комментарии начинаются с # или //.
Быстрый старт: консольная балка от начала до результата
Это реальный, проверенный пример (из собственного набора тестов проекта) — прямоугольный брус, заделанный с одного торца, нагруженный с другого, сверенный с балочной теорией:
units mm
material E=200000000000 nu=0.3 density=0
primitive box dx=20 dy=20 dz=100
mesh tet size=6
fix face z-
load face z+ force=5000 component=z
solve
reactionsЧто происходит по шагам:
1. units mm — объявляет единицу длины скрипта миллиметрами (влияет только на процедурные команды вроде beam/shell/mass, а не на OCCT-геометрию — см. раздел «Единицы и допуски» ниже).
2. material — задаёт модуль Юнга (200 ГПа, в паскалях) и коэффициент Пуассона напрямую, в единицах СИ.
3. primitive box dx=20 dy=20 dz=100 — брус 20×20×100 мм.
4. mesh tet size=6 — тетраэдральная сетка с целевым размером элемента 6 мм.
5. fix face z- — защемляет грань на торце z- габаритного параллелепипеда тела (встроенный короткий идентификатор грани — индекс грани искать не нужно).
6. load face z+ force=5000 component=z — прикладывает 5000 Н вдоль +z к противоположной грани.
7. solve — запускает линейный статический расчёт.
8. reactions — извлекает реакции опор.
Ожидаемый результат: реакция в заделке R_z ≈ −5000 Н (уравновешивает приложенную нагрузку) в пределах стандартного для проекта допуска 5%. Поперечные компоненты реакции остаются ниже 5% от приложенной силы, как и ожидается для нагрузки вдоль оси балки.
Основы языка
Единицы
units <m|mm|in> задаёт единицу длины, которую используют процедурные команды (beam, shell, mass, зоны сгущения сетки). Без объявления по умолчанию для этих команд действуют метры. Команды OCCT-геометрии (box, primitive, sketch, импортированный CAD) уже несут собственные координаты — units их не пересчитывает. Полная картина — в разделе «Единицы и допуски».
Переменные, управляющие конструкции, функции
let x = 10
let faces = list faces of body1
if x > 5 {
print "large"
} else {
print "small"
}
for i in [0..3] {
print i
}
let n = 0
while n < 3 {
n = n + 1
}
func square(v) {
return v * v
}
print square(4)let name = exprобъявляет/присваивает переменную.if / else,for x in <диапазон или список>,while— стандартные управляющие конструкции. Диапазонforзаписывается как[from..to]или[from..to:step].func name(params) { ... return expr }определяет переиспользуемую функцию.- Циклы ограничены 1 000 000 итераций суммарно, глубина рекурсии — 64, как предохранитель.
- Значения: числа, строки, булевы, массивы, объекты (например, каждый элемент из
list faces of ...— объект с полями.id,.area,.centroid,.normal) иnull.
Встроенные функции
abs, sqrt, min, max, floor, ceil, round, len, str, num, basename.
print / record
print <значение...> пишет в лог скрипта. record <значение...> сохраняет значение в записанный вывод скрипта (пригодится, чтобы забрать числа обратно через MCP).
Векторные аргументы
Ряд именованных аргументов принимает вектор как тройку чисел через запятую, например origin=0,0,10 или force=1000,0,0. Полный список: origin, normal, axisZ, point, node, delta, vector, pull, neutral_at, neutral_dir, axis, at, step, points, center, faces, edges, openFaces, force, moment, translate, rotate, uaxes, raxes. Если передано только одно число, оно трактуется как обычный скаляр, а не вектор из одного элемента — поэтому load ... force=100 (скалярная величина вдоль оси через component=) по-прежнему работает как ожидается.
Справочник команд
Команды сгруппированы по назначению. Для каждой указаны синтаксис, аргументы, единицы измерения (где уместно), короткий пример и честная оговорка об ограничениях, если они есть.
Единицы и базовая геометрия
`units [length=]<m|mm|in>` — единица длины для процедурных команд. По умолчанию mm, если не объявлена.
``dsl
units mm
``
`box dx dy dz` — параллелепипед, угол в начале координат. Позиционно или через dx=/dy=/dz=.
``dsl
box dx=20 dy=20 dz=100
``
`primitive <shape> [params...]` — прочие примитивные тела: box, cylinder, sphere, cone, torus, wedge, hollowHemisphere (dome), solidHemisphere (hemisphere). Параметры зависят от формы.
``dsl
primitive cylinder r=10 h=50
``
`import "<path>" [format=step|iges]` — импорт CAD-файла. Путь обязательно в кавычках (одиночный / в языке — деление, // — комментарий).
``dsl
import "part.step"
``
Трансформации тел
`body translate [dx= dy= dz=]` — сдвигает последнее созданное тело.
`move <target> dx dy dz` (или delta=x,y,z) — сдвигает именованное тело.
`rotate <target> angle= [axis=] [at=]` — поворачивает тело вокруг оси через точку (по умолчанию — начало координат / ось Z, если не заданы).
`mirror <target> [normal=] [at=]` — зеркалит тело относительно плоскости.
`scale <target> factor= [at=]` — равномерное масштабирование относительно точки.
`pattern <linear|circular> <target> count= [step=] [axis=] [at=] [angle=]` — создаёт линейный или круговой массив копий.
rotate body1 angle=90 axis=0,0,1 at=0,0,0Булевы операции и сборка
`boolean <union|cut|intersect> target= tool=` — объединяет два тела.
`sew <a> <b>`, `union <a> <b>`, `imprint <a> <b>` — низкоуровневые операции сборки/топологии.
`split target=<тело> plane=<имя>` или `split target=<тело> point= normal=` — разрезает тело по датум-плоскости или по произвольным точке/нормали.
`remove <target...>` / `delete <target...>` — удаляет тела.
`unstitch <target>`, `stitch <target> [tolerance=]` — расшивает/сшивает оболочки.
boolean cut target=body1 tool=body2Фичи и подготовка к расчёту
`fillet <target> radius= [edges=i,j]` — скругляет рёбра (все рёбра, если edges= не задан).
`chamfer <target> distance= [edges=]` — фаски на рёбрах.
`hollow <target> thickness= [openFaces=]` — делает тело полым с заданной толщиной стенки, опционально оставляя грани открытыми.
`defeature <target> [maxHoleRadius=] [maxFaceArea=] [faces=i,j,k]` — убирает мелкие фичи ниже заданных порогов; нужен хотя бы один критерий.
`repair <target> [merge] [heal] [tolerance=]` — лечит геометрию; без флагов выполняются оба действия (merge и heal).
`autofix [on|off] [element=<mm>] [<тело>]` — запускает автоматическое лечение геометрии, используемое перед построением сетки.
`simplify <target> [min_volume=] [min_diag=] [keep_fraction=]` — убирает мелкие тела/фичи из сборки ради более лёгкой сетки.
`shrinkwrap <target> [min_volume=] [tol=]` — оборачивает тело упрощённой внешней оболочкой.
fillet body1 radius=2 edges=3,7Генеративная геометрия (на основе эскиза)
`sketch points=x0,y0,z0,x1,y1,z1,... [as=face|wire] [closed=true]` — строит плоский профиль минимум из двух точек.
`extrude <target> [delta=x,y,z | dx= dy= dz=]` — вытягивает профиль в тело.
`revolve <target> angle= [axis=x,y,z] [at=x,y,z]` — вращает профиль вокруг оси.
`sweep <profile> path=<body>` — протягивает профиль вдоль тела-траектории.
`loft <section1> <section2> [...]` — строит лофт через два и более сечений.
sketch points=0,0,0, 10,0,0, 10,10,0, 0,10,0 as=face closed=true
extrude body1 dz=5Прямое моделирование (direct modeling)
`offset_face <target> faces=i,j distance=` — смещает выбранные грани.
`pull <target> faces=i,j distance=` — псевдоним offset_face.
`move_face <target> faces=i,j vector=x,y,z` — переносит выбранные грани.
`draft_face <target> faces=i,j angle= pull=x,y,z neutral_at=x,y,z neutral_dir=x,y,z` — применяет уклон к выбранным граням относительно нейтральной плоскости.
Датумы
`plane [<name>] origin=x,y,z normal=x,y,z` или `plane [<name>] global=XY|YZ|ZX [offset=]` — создаёт датум-плоскость.
`cs [<name>] origin=x,y,z [axisZ=] [axisX=]` — создаёт локальную систему координат. Задайте и axisX, если нужен полностью определённый поворот, а не только ось Z.
cs turned origin=0,0,0 axisZ=0,0,1 axisX=1,0,0Сетка
`mesh [all|build|hex|tet|shell] [nx ny nz|size=] [order=1|2] [surface=tri|quad] [quad=0|1|2] [bonding=0|1] [bondtol=] [interference=cut|split|ignore] [glue=auto|contact|full] [fuzzy=]` — строит сетку. tet и shell — поддерживаемые типы в браузерной сборке (про hex — см. «Известные ограничения»).
``dsl
mesh tet size=6 order=1
``
`refine zone at=x,y,z radius=r size=h [name=] [body=|face=]` — локальная зона сгущения (сфера влияния).
`refine clear` — очищает все зоны сгущения.
`weld [tol=]` — сваривает совпадающие узлы оболочечной сетки, до solve.
Материал и сечение
`material [preset=steel|aluminum|titanium|copper] | E= nu= [density=] [model=linear|neo-hookean] [alpha=] [kappa=]` — задаёт материал. Пресеты: steel (E=200 ГПа, ν=0.3, ρ=7850 кг/м³), aluminum (E=70 ГПа, ν=0.33, ρ=2700), titanium (E=110 ГПа, ν=0.34, ρ=4500), copper (E=120 ГПа, ν=0.34, ρ=8900) — каждый пресет также задаёт тепловое расширение alpha и теплопроводность kappa.
``dsl
material preset=aluminum
``
`section shell t=<thickness>` — задаёт толщину оболочки для shell-элементов.
Контакт
`contact <mode> [mu=]` — задаёт глобальный контактный режим по умолчанию.
`contact <a> <b> <mode> [mu=]` — задаёт режим для конкретной пары.
`contact pairs <all|visible> <mode>` — автоматически находит соприкасающиеся пары граней и назначает им режим. Требует UI-хоста визарда — из headless/MCP-скрипта без открытого проекта команда недоступна (бросает ошибку contact pairs: requires wizard host).
Режимы: tied, bonded, rigid, penalty, frictionless, frictional. rigid — исторический псевдоним tied. `frictionless` и `frictional` всегда отказывают — нелинейный контакт пока не реализован; команда существует, чтобы скрипт явно падал, а не молча получал линейное приближение.
contact bodyA bodyB bondedГраничные условия и нагрузки
`fix [kind=face] <target> [component=all|x|y|z|normal] [value=]` — ограничение перемещения/поворота.
``dsl
fix face z-
``
`load [kind=face] <target> [pressure=|force=|distributed_force=|accel=] [component=x|y|z|normal] [cs=] [fx= fy= fz=]` — прикладывает нагрузку. Либо скалярная величина с component=, либо векторная форма через fx=/fy=/fz= (не сочетается с element=pressure). cs= прикладывает нагрузку в именованной локальной системе координат.
``dsl
load face z+ force=5000 component=z
load face x+ fx=1000 fy=0 fz=0 cs=turned
``
Удалённые нагрузки и удалённые перемещения
Прикладывает нагрузку или заданное перемещение в точке, вынесенной от целевой грани/тела, связанной жёсткой или распределяющей связью — удобно, чтобы представить кронштейн, штифт или крепление, которое не смоделировано явно.
`remote load <kind> <target> point=x,y,z force=fx,fy,fz [moment=mx,my,mz] [cs=]`
``dsl
remote load face x+ point=150,5,5 force=1000,0,0 moment=0,0,5 cs=turned
``
`remote motion <kind> <target> point=x,y,z [translate=ux,uy,uz] [rotate=rx,ry,rz] [uaxes=1,1,1] [raxes=0,0,1] [cs=]` — translate в метрах, rotate в радианах (СИ, независимо от объявления units); uaxes/raxes маскируют, какие оси перемещения/поворота реально накладываются.
``dsl
remote motion face x+ point=1,2,3 translate=0.01,0,0 uaxes=1,0,0
remote motion face z+ point=0,0,20 rotate=0,0,0.05
``
Подавление тел
`suppress <target> [on|off]` — исключает тело из расчёта, не удаляя его из модели. По умолчанию on (подавить).
``dsl
suppress body2
suppress body2 off
``
Точечная масса
`mass node=<id|x,y,z> m= [Ixx= Iyy= Izz=]` — прикрепляет точечную массу (опционально с моментами инерции) в узле или точке.
Процедурные балка и оболочка (быстрые верификационные модели)
`beam L=<length> section=rect|circle|ibeam [w= h= r= n=] [scheme=cantilever|simply-supported] [P=]` — строит 1D-модель балки напрямую, без твердотельной геометрии — для быстрых проверок аналитического типа.
`shell Lx= Ly= t= [nx= ny=] [elem=quad|tri] [scheme=cantilever|all-clamped] [P=]` — строит плоскую оболочечную/пластинчатую модель напрямую.
Расчёт
`solve [static|modal|buckling|thermal|thermoelastic] [nmodes=] [deltaT=] [prestress=on|off]` — запускает расчёт. prestress=on (также принимает true/1) запускает преднапряжённый модальный расчёт в сочетании с modal и нагрузкой; что реально работает для каждого типа анализа — см. «Известные ограничения».
``dsl
solve modal nmodes=6
solve modal nmodes=3 prestress=on
``
Постпроцессор
`probe <quantity> [x= y= z=|at=x=v] [target=] [tolerance=] [mode=] [bc=] [units=] [source=] [id=]` — извлекает одно значение в точке или агрегированное по цели.
``dsl
probe displacement_magnitude at=0,0,100
``
`minmax <quantity>` — извлекает и минимум, и максимум величины поля за один вызов.
`reactions [bc=]` — извлекает реакции опор (reaction_x, reaction_y, reaction_z, reaction_magnitude, все в ньютонах).
`hotspots [grading=] [refine=] [minsize=]` — запускает анализ концентраторов напряжений на текущих результатах.
Инспекция и экспорт
`list faces of <body>` (также list faces <body> / list faces target=<body>) — печатает индекс, стабильный id, площадь, центроид и нормаль каждой грани и возвращает их массивом объектов, пригодным для использования в скрипте (например, let faces = list faces of body1).
`export vtk [path=]` — экспортирует текущую сетку/результаты в VTK.
Величины, доступные для probe / minmax
| Величина | Значение | Единицы |
|---|---|---|
displacement_magnitude | Полное перемещение | м |
vonMises | Эквивалентное напряжение по Мизесу | Па |
principalMax | Максимальное главное напряжение | Па |
principalMin | Минимальное главное напряжение | Па |
frequency | Собственная частота | Гц |
load_factor | Коэффициент запаса устойчивости | — |
temperature | Температура | К (или как настроено) |
body_count | Число тел | — |
volume | Объём | м³ |
element_count | Число элементов сетки | — |
clash_count | Число коллизий (пересечений) | — |
interference_volume | Объём пересечения | м³ |
area | Площадь поверхности | м² |
wall_thickness | Локальная толщина стенки | м |
min_distance | Минимальное расстояние между целями | м |
solid_count | Число твёрдых тел | — |
boundary_quad_count | Число quad-элементов на границе | — |
boundary_tri_count | Число tri-элементов на границе | — |
volume_element_count | Число объёмных элементов | — |
mesh_component_count | Число несвязных кусков сетки (1 ⇒ сборка полностью связна) | — |
mesh_region_count | Число различных объёмных регионов сетки (нужно ≥2 для контакта) | — |
reaction_x / reaction_y / reaction_z / reaction_magnitude | Компоненты реакции опоры | Н |
hotspot_count | Число найденных концентраторов напряжений (нужен запуск hotspots после solve) | — |
Единицы и допуски
- Геометрия (
box,primitive,sketch, импортированный CAD) использует единицы сцены — по умолчанию миллиметры в приложении. Командаunitsне пересчитывает координаты OCCT-геометрии. - Команда `units` управляет только процедурными командами —
beam,shell,massи параметрами зон сгущения сетки (refine zone) — там введённое число трактуется в объявленной единице. - Граница солвера — всегда СИ: метры, ньютоны, паскали, килограммы. Нагрузки (
force=,pressure=), свойства материала (E,density),force/momentудалённой нагрузки и выводreactions— всегда в СИ, независимо от единицы длины сцены. - Допуск по точности: собственный верификационный набор проекта сверяет каждую расчётную возможность с независимым эталоном в пределах 5% относительной погрешности; допуск не ослабляется, чтобы «протащить» кейс — провалившаяся проверка означает, что чинят причину, а не саму проверку.
Известные ограничения
Честно о том, что пока не работает — использование фичи за этими границами либо явно бросает ошибку, либо молча даёт другой результат, чем ожидалось, поэтому стоит прочитать это до того, как строить скрипт вокруг одной из них.
- `solve thermal` сейчас не считает температурное поле. В текущей реализации диспетчер типов анализа в исполнителе скрипта имеет отдельные ветки для
modal,bucklingиthermoelastic, но всё остальное — включаяthermal— проваливается в ту же ветку, что иstatic, которая запускает структурный статический расчёт (kind: 'static'там захардкожен). Выделенный солвер теплопроводности существует в продукте и используется постпроцессорным пайплайном UI, но текстовый DSL никогда его не вызывает. Не используйте `solve thermal`, ожидая реального теплового результата — сейчас вместо него выполняется структурный статический расчёт. - Пограничные слои (inflation) не реализованы в браузерном мешере.
mesh ... inflate=/inflation=1/layers=/ratio=/first=явно отклоняется с объяснением, а не молча строит сетку без них — WASM-мешер захардкожен с выключенным inflation, поэтому призматические пристеночные слои никогда не строятся. Используйтеrefine zone at=x,y,z radius=r size=hдля локального сгущения у поверхности вместо этого. - Hex-dominant мешер недоступен в браузерной сборке.
mesh hexотклоняется с объяснением — браузерный мешер только тетраэдральный. Используйтеmesh tetилиmesh shell. - Часть имён опций мешера отклоняется, а не игнорируется молча.
algo2d=,algo3d=,recombine=иhexdom=никогда не доходят ни до какого реального мешера в текущей браузерной сборке; парсер отклоняет их с явной ошибкой, а не молча принимает и игнорирует. - Геометрический путь расчёта всегда строит сетку order=1 (линейную), независимо от
mesh ... order=2в скрипте, если скрипт двигал или трансформировал тело (это переводит расчёт на «геометрический» путь вместо простого box-пути). Простой box-путь, напротив, честно учитываетorder=2и строит настоящие tet10-элементы со срединными узлами — и отклонит запрос, который не может выполнить (например, сетку без срединных узлов), а не молча посчитает не в том порядке. - `contact pairs` (автоопределение) требует UI-хоста визарда. Из чисто headless/MCP-скрипта без открытого проекта
contact pairs all|visible <mode>недоступна и бросает явную ошибку. Назначение контакта по паре (contact <a> <b> <mode>) и глобального умолчания (contact <mode>) такого ограничения не имеют. - Нелинейный контакт не считается.
contact ... frictionlessиcontact ... frictionalвсегда отклоняются с явной ошибкой, а не молча откатываются к линейному приближению. - Преднапряжённый модальный расчёт (
solve modal ... prestress=on) требует реально приложенной нагрузки в модели и работает только с tet4-элементами (order=1) — отклоняется приorder=2, на модели без нагрузки и при нераспознанном значенииprestress=.