Синтаксис языка скриптов

Скрипт - это программный код на языке, схожем с Си, который определяет природу объекта БД программного продукта - параметры, плоскости, реакцию объекта на воздействия. Автоматическую установку зависимостей и т.д. Скрипт состоит из ряда блоков, выполнение которых определяется событиями извне объекта.

Идентификаторы

Идентификатором называется последовательность символов, представляющая собой имя переменной, функции или оператора. Правила описания идентификаторов аналогичны правилам в Си:

Рекомендации к названию имен переменных приведены в соответствующем документе.

Ключевые слова

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

Список ключевых слов перечислен в приложении.

Типы данных

В макроязыке существуют пять основных типов данных:

  1. Действительное число с плавающей запятой (аналог double в СИ). Диапазон -1.7e308 .. 1.7e308.
  2. Строка.
  3. Трехмерная точка (Point)
  4. Трехмерный вектор (Vector)
  5. Плоскость, определяющаяся базовой точкой и вектором нормали (Plane).

В скрипте принято соглашение к названиям переменных действительного типа добавлять префикс r, к строковым переменным добавлять префикс str или s, к переменным точечного типа добавлять префикс pnt или p, к переменным векторного типа добавлять префикс vec или v, а плоскости обозначать WP (WorkPlane).

Инициализация переменных осуществляется без предварительного описания,  как в Бейсике. Чтобы объявить переменную, нужно просто присвоить ей некоторое значение. Если переменная не описана в заголовочной функции ActHeader в секциях Public или Protected, то она будет считаться локальной, и будет сохранять свое значение от момента первого определения до конца действия, в котором она описана.

 StrName = "ObjectA";
 rPI = 3.1415926;
 rA = 2.0;

Для инициализации точки и вектора используются специальные функции-конструкторы Point(), Point(x,y,z) и Vector(), Vector(x,y,z) соответственно.

 pnt2=Point();//ручка длины 
 pnt1= Point(1.0, 10.0, 10.0); //Это точка с конкретными координатами
 vec1 = Vector(); // Вектор единичной длины, совпадающий с осью OX (1,0,0)
 vec1 = Vector(1.0, 1.0, 0); //Вектор с конкретными координатами

К отдельной координате точки или вектора можно обратиться с помощью квалификатора:

 pnt1:x = 12.5;//Извлечение абсциссы из точки
 vec1:y = 25.6;//Извлечение ординаты из точки

Для инициализации плоскости используется функция-конструктор Plane(pnt, vecNormal).

 WP1 = Plane( pntBase, vecNormal );
 //pnt- Это базовая точка для плоскости WP1
 //vecNormal- Это вектор нормали для плоскостиWP1

Например,

 WP1 = Plane( pntOrigin, vecDirection);

Индексирование переменных

Если объявить ряд переменных любого типа с именами, отличающимися только цифрой в конце, то к этим переменным можно обращаться по индексу, как к элементам массива.

 rParam1 = 1.0;
 rParam2 = 2.0;
 rParam3 = 4.0;
 ...
 rParam[2] = 45.7;
 rParam[3] = 9.1223;

Комментарии

Комментарии в скрипте начинаются с двойной косой линии и заканчиваются концом строки.

 //Расставляем плоскости в порядке против часовой стрелки
 vecNormal=getLocalNormal(vecDirection,vecPlane);
 
 WP1 = Plane( pntOrigin, vecDirection );
 WP2 = Plane( pntOrigin-vecPlane*(0), -vecPlane );
 
 //Правые боковые
 WP3 = Plane( pntOrigin+vecNormal*(b/2), vecNormal );
 WP4 = Plane( pntOrigin+vecNormal*(b/2)+vecPlane*h, vecNormal );
 
 WP5 = Plane( pntOrigin+vecPlane*(h), vecPlane );

Операторы

Все операторы макроязыка могут быть разделены на следующие категории:

Все операторы заканчиваются пустым оператором - точкой с запятой ";".

Пустой оператор

Пустой оператор состоит только из точки с запятой. При выполнении этого оператора ничего не происходит. Этот оператор является разделителем для других операторов, функций и строк в скрипте.

Составной оператор

Составной оператор представляет собой несколько операторов и объявлений, заключенных в фигурные скобки {}. Выполнение составного оператора заключается в последовательном выполнении составляющих его операторов. В конце составного оператора точка с запятой не ставится.

Оператор присваивания

Оператор присваивания обозначается с помощью знака равенства.

Выражение А = В; означает, что переменной А присваивается значение выражения В, причем тип переменной А установится типом выражения В.

Оператор доступа к внутренним членам сложных типов данных

Для доступа к внутренним членам сложных типов данных используется специальный оператор-квалификатор «:». Так, например, его можно использовать для доступа к отдельным координатам переменных типа Точка и Вектор.

Арифметические и логические операторы

Синтаксис арифметических и логических операторов в макроязыке скрипта аналогичен синтаксису в СИ.

Арифметические Логические

А + В

Сложение

A == B

A равно В

А - В

Вычитание

A != B

А неравно В

А * В

Умножение

A > B

А больше В

А / D

Деление

A < B

А меньше В

   

А && B

А и В

   

A || B

А или В

Для аргументов типа Точка результатом операции вычитания будет вектор. А умножение вектора на число даст новый вектор, равный скалярному произведению вектора на число.

 vecDirection = pntEnd - pntStart;
 vecScaled = vecDirection * rScale;

Условный оператор

Формат оператора:

if ( <выражение> )
 оператор_IF1;
else
 оператор_ELSE1;
 //<выражение>- это логическое условие на выполнение оператора

В качестве оператора_IF1 и/или _ELSE1 может выступать составной оператор, т.е. группа операторов, заключенных в фигурные скобки.

Выполнение оператора if начинается с вычисления выражения.

Далее выполнение осуществляется по следующей схеме:

Блок операторов после else может отсутствовать, как и слово else. В этом случае условный оператор выглядит следующим образом:

if ( <выражение> )
 оператор_IF1;

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

if (A>1)
 оператор_IF1;
if ((A>1)&&(B<5)&&(C==25))
 оператор_IF1;

Допускается использование вложенных условных операторов, т.е. условный оператор может быть включен в конструкцию if или конструкцию else другого условного оператора.

if (A > 1){
 if (B < 5){
 if (C == 25)
 оператор_IF1;
 }
};

Оператор цикла

Формат оператора:

while (выражение)
 оператор_BODY;

Требования к выражению такие же, как в условном операторе. Оператор _BODY называется телом цикла.

Выполнение оператора цикла начинается с вычисления выражения. Далее выполнение осуществляется по следующей схеме:

  1. Если выражение истинно (отлично от 0), то выполняется тело цикла.
  2. Если выражение ложно, то выполняется следующий за while оператор.
  3. Цикл повторяется с пункта 1.

Функции

Функция - это совокупность операторов и вызовов других функций. Каждая функция имеет имя. Объявление функции начинается с ключевого слова function. Тело функции заключено в фигурные скобки. В данной версии скриптов функции не имеют параметров.

Формат функции:

function Function_Name{
 оператор_1;
 ...
 оператор_N;
}

Допускается вызывать из одной функции другие, но вызываемые из funcA функции должны быть объявлены выше в теле скрипта.

Пример:

function user_Function_1{
 MessageBox("Это моя первая функция");
}
function OnInitialization{
 user_Function_1(); // Правильный вызов. Вызываемая функция объявлена выше!
 user_Function_2(); // Неправильный вызов. Вызываемая функция объявлена ниже!
}
function user_Function_2{
 MessageBox("Это моя вторая функция");
}

Интерпретатор имеет ряд встроенных функций, перечень которых приведен в приложении 2.

Задание плоскостей объектов

Задание абстрактной геометрии объекта (точек, векторов, плоскостей) может быть в координатной форме (практически не используется) или относительно локальной системы координат. Положение точек определяется путем задания операторов сложения точки и плоскости. В примере положение базовой точки плоскости задается как

 pntWP4=pntOrigin+vecDirection*(b/2)+vecPlane*h

Вектор нормали этой плоскости коллинеарен вектору вставки vecDirection

Следовательно, сама подсвечиваемая плоскость WP4 будет задаваться как

 WP4=Plane(pntWP4,vecDirection);

Если вектор нормали плоскости не ортогонален системе координат, то он зачастую определяется с помощью оператора RotateBy или GetLocalNormal.

Например, для накладки конического днища, вектор нормали плоскости WP2 определяется как

 vecNormal=getLocalNormal(vecDirection,vecPlane);
 vecFitting = rotateBy(vecDirection,90-ang/2,vecNormal);
 //ang - это угол днища в плане

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

 pntWP1 = Point(WP1);
 vecWP1 = Vector(WP1);

Для нахождения расстояния между точкой и плоскостью используется разность точки и плоскости

 rDistance = WP1-pntOrigin;

Длину вектора (расстояние между точками) определяют оператором vecLen:

 rLength = vecLen(pntWP1 - pntOrigin);

Ортогональный вектор находится оператором getPerp:

vecPlane = getPerp(vecDirection);

Работа с таблицей

Для работы с таблицей объекта используются два оператора LoadInCache и SelectInCache.

Оператор LoadInCache загружает указываемые параметры в кэш работы с таблицей. Данный оператор в новых версиях необходимо вызывать принудительно только при выборке с вычисляемым выражением от параметров (..., "+", ...).

Оператор SelectInCache производит выборку из таблицы в соответствии с указанными критериями (смотрите синтаксис в приложении)

Выборка по «kFirst» выбирает одну первую строку. Выборка по «kFilter» выбирает диапазон записей из таблицы, соответствующих указанному фильтру.

Варианты выборки по конкретным параметрам «~» - приближенное равенство параметра в записи выбираемому значению. «=» - точное равенство, «+» - выборка по фильтру. Выборка по фильтру означает, что если логическое условие фильтра выполняется, то запись выбирается из таблицы (подвергается дальнейшим проверкам по условиям).

Например, функция

SelectInCache("kFirst", "dr", "~", rdr, "L", "+", "L>=rMinLen&& L<=rMaxLen&& (L-b<=rTrLen)");

выбирает из таблицы первую запись, где сочетание параметров dr,L,b таково, что dr~rdr, rMinLen<=L<=rMaxLen, (L-b)<=rTrLen.

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

Если в детали присутствует несколько таблиц, то, при совпадении наименований параметров необходимо включить галку «Использовать имя таблицы в качестве префикса параметров» в контекстном меню соответствующей таблицы.

В этом случае обращение к параметру в скрипте будет производиться следующим образом:

 <Имя таблицы>.<Имя параметра>

Например:

If (Table0.dr==Table1.Thread1) {
 ...
};

Для обеспечения выборки из не первой таблицы необходимо модифицировать оператор SelectInCache.

Например, если необходимо выбрать из таблицы Table1 параметр dr, равный 10, то первым условием в операторе выбора из таблицы должен следовать индекс таблицы (начинается с 0):

 SelectInCache(1, «kFirst», «dr», «~», 10);

Для таблицы с именем Table0 имя таблицы можно опускать. Т.е. справедливо и то, и другое выражение:

SelectInCache ("kFirst", "dr", "~", 10, "L", "~", 50);
SelectInCache ("0","kFirst", "dr", "~", 10, "L", "~", 50);

Диалог объекта. Оформление функции UniDialog

Вид диалога вставки объекта определяется заданием ключей функции UniDialog.

См. соответствующий раздел приложения.

Здесь следует просто сопоставить, что

DBFLD - это определяющие табличные параметры.

DBINF - справочные табличные параметры.

VFLD - это произвольные параметры и справочные данные.

VIDS - перечень исполнений объекта (можно опускать, если имеется только одно исполнение).

TVIDS - различные виды одного исполнения (возможные ключи - по видам, All - те, которые присутствуют, AnyWBK - противоположные виды генерируются зеркальным отображением (для симметричных объектов)).

VIEW - превью видов.

Ключ OnDglBeforeSelParam в ActHeader определяет, будет ли вызываться диалог перед динамическим выбором параметров.

Подключение пользовательской формы

Если для объекта задана форма, то для того, чтобы она вызывалась, необходимо в функции OnDialog вместо функции UniDialog вызывать конкретную форму.

Например, если в объекте задана форма с именем frmMain, то следует написать следующее:

functionOnDialog{
 ShowForm("frmMain");
}

Подобным образом по условиям можно вызывать несколько различных форм объекта, обращаясь к ним по имени с помощью оператора ShowForm.

Установка зависимостей

Операторы установки зависимостей реализуют геометрические и параметрические зависимости.

Параметрические зависимости

SetParamConstraint(< param >,obj,EXPR,< expression to constrain>,bBidirect);

<param> - название параметра объекта, к которому устанавливается зависимость.

Obj - к какому объекту устанавливается.

EXPR - пока только зависимость на выражение

<expression to constrain> - арифметическая комбинация параметров, на которую ставится зависимость (должна быть в кавычках).

bBidirect - двунаправленная или однонаправленная зависимость.

Геометрические зависимости

SetGeomConstraint(rTYPE, rDIRECTION, obj, < WPname >, < WPtoConnect >,offset,bBidirect);
SetGeomConstraint(ANGE,CODIRECT,< obj >,< wpSourcePlane >,< wpObjPlane >,< rAngle >,< bBiderect >);

Типы зависимостей rTYPE = INSERT (вставка) MATE (совмещение по плоскости) AXIS (совмещение по оси) DIRECTION (он же ANGLE) (угловая ориентация).

Направление rDIRECTION = CODIRECT (сонаправлено) CONTRDIRECT (противонаправлено).

<WPname> - имя плоскости, которой присоединяются.

<WPtoConnect> - имя плоскости, к которой присоединяются.

Offset - численное или параметрическое выражение, определяющее:

Для INSERT - осевое расстояние между плоскостями.

MATE - нормальное расстояние между плоскостями.

AXIS - относительное смещение осей в плане.

DIRECTION - угол относительной ориентации плоскостей.

Для зависимостей DIRECTION (ANGLE) есть определенные условия:

Синтаксис:

SetGeomConstraint(ANGE,CODIRECT,< obj >,< wpSourcePlane >,< wpObjPlane >,< rAngle >,< bBiderect >);

ANGLE - ключевое слово угловой зависимости.

CODIRECT - всегда для угловой зависимости. Полагается из-за минимальности угла поворота.

<obj> - к какому объекту ставить.

<wpSourcePlane> - плоскость исходного объекта, к которой ставится зависимость.

<wpObjPlane> - плоскость того объекта, к которому присоединяемся.

<rAngle> - числовое значение угла зависимости в градусах.

<bBidirect>=(TRUE,FALSE) - однонаправленная или двунаправленная зависимость. По умолчанию FALSE.

Зависимости типа ANGLE следует вводить после зависимостей типа INSERT, MATE, AXIS.

При наличии зависимости типа INSERT, MATE или AXIS поворот осуществляется относительно осей плоскостей данной зависимости.

При отсутствии зависимостей типа INSERT, MATE или AXIS поворот осуществляется вокруг нормали к плоскости, в которой лежат оба вектора в направлении минимального угла поворота.

Если рассматриваемые векторы коллинеарны, поворот осуществляется относительно оси ОХ.

Пример:

SetGеomConstraint(ANGLE,CODIRECT, obj,WPnormal,obj.WPnormal,45);
SetGеomConstraint(ANGLE,CODIRECT, obj,OYPlane,obj.WP2,15,TRUE);

Примеры различных типов зависимостей можно найти в приложении.

Функция ShowValue

Использование окна отладчика позволяет выявить ошибки в скрипте и определить значения параметров во время выполнения скрипта. Синтаксис см. в приложении.