WebCAE
← Назад в документацию

Справочник по 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 <значение...> сохраняет значение в записанный вывод скрипта (пригодится, чтобы забрать числа обратно через 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=.

Мы используем обязательные cookie для работы сайта и, с вашего согласия, аналитические. Политика конфиденциальности