Руководство по настройке altAwin:Макроязык

Материал из AltecDocs
Перейти к:навигация, поиск

Макроязык

макроязыкСодержание формул/условий может быть задано при помощи встроенного в программу макроязыка. Это позволяет устанавливать более разнообразные и сложные условия.

Синтаксис макроязыка, встроенного в программу, похож на классический язык программирования Pascal:

  • все команды должны оканчиваться разделителем в виде точки с запятой;
  • блок команд ограничивается в начале ключевым словом Begin, в конце — End;
  • регистр буквенных символов во внимание не принимается (например, значения Name, name и NAME воспринимаются как тождественные).
IconWarning.png Код можно комментировать с помощью символов «{» и «}». Если код в дизайнере выражений и условий полностью закомментирован — условие выполняется всегда!

Переменные и массивы

Объявление и инициализация переменных происходит при первом присвоении им значения. Присвоение значения осуществляется при помощи оператора := (двоеточие и знак равенства). Исходя из присвоенного значения, переменная получает числовой или строковый тип. Минус (дефис) перед числом означает отрицательное значение.

Строковые значения заключаются в одинарные кавычки ('Это строка'). Если необходимо в строковом параметре использовать кавычки, то строка примет следующий вид: '«Это строка с кавычками»'.

Массивы могут быть только одномерными. Длину массива указывать не нужно, он может менять количество элементов динамически. Первый элемент массива имеет индекс 0. Индекс массива не может быть меньше нуля.

IconInfo.png В ранних версиях программы обращение к массиву по индексу -1 возвращало длину массива, то есть максимальный индекс, к которому может быть выполнено обращение. В текущей версии данное поведение является устаревшим и обращение по индексу -1 вызывает ошибку. Для получения длины массива используйте функцию Length().
Пример

Числовой параметр: A := 1450;

Строковый параметр: B := 'Артикул';

Массив: Array[0] := 1 (первый элемент массива равен 1); Array[1] := 4 (второй элемент массива равен 4);

Таблица 3.3. Функции и процедуры для работы с массивами

Название функции (процедуры) Назначение Пример
SETLENGTH (a, n) Устанавливает размер массива, где а — имя массива, n — размер массива. SETLENGTH (art, 11)
HIGH (a) Возвращает верхнюю границу массива, где а — имя массива. HIGH (art)=10
LOW (a) Возвращает нижнюю границу массива, где а — имя массива. LOW (art)=0
Массивы записей

Для получения доступа к значениям свойств конструкции (изделия), состоящей из большого числа изделий (частей изделия), созданы массивы записей. Поля записей этих массивов являются переменными, которые возвращают значения некоторых свойств изделия (конструкции). Число элементов подобных массивов определяется на основании свойств изделия (конструкции), заданных в построителе, и может быть равно, например, количеству некоторых частей изделия в изделии или числу определенных изделий в конструкции. К этим массивам относятся, например, Balka, BalkaStv, Drobs и другие, которые, таким образом, не нуждаются в указании размера посредством процедуры SETLENGHT.

В качестве примера покажем, как объявляются некоторые переменные i-го элемента массива Balka, содержащего информацию о балках рамы, образующих контур: Balka[i].MrkProfil (артикул профиля), Balka[i].LengthProfil (длина профиля) и т. д. Более подробная информация о массивах записей и свойствах их переменных приведены в описании тех подразделов, в которых эти переменные используются.

Арифметические операции

Все допустимые арифметические операции сведены в табл. 3.4.

Таблица 3.4. Арифметические операции

Операция Назначение Пример использования
+ Сложение для чисел, конкатенация для строк 5 + 5 = 10
'Good ' + 'morning!' = 'Good morning!'
- Вычитание (только для чисел) 10 - 2 = 8
* Умножение (только для чисел) 3 * 8 = 24
/ Деление (только для чисел) 9 / 3 = 3

Используемые функции

Все допустимые функции перечислены в табл. 3.5 — табл. 3.9.

В таблицах содержится следующая информация:

  • Функция — наименование функции и вид ввода данных;
  • Назначение — описание назначения функции;
  • Пример — пример использования функции.

При описании всех функций используются следующие переменные:

  • n, m — числовая переменная или её конкретное значение;
  • s, t — строковая переменная или её конкретное значение.

Таблица 3.5. Тригонометрические функции

Функция Назначение Пример
ARCCOS (n) Арккосинус угла (в радианах) ARCCOS (0.2) = 1.3694
ARCSIN (n) Арксинус угла (в радианах) ARCSIN (0.5) = 0.524
ARCTAN (n) Арктангенс угла (в радианах) ARCTAN (5) = 1.373
ARCCOT (n) Арккотангенс угла (в радианах) ARCCOT (5) = 1.768
COS (n) Косинус угла (в радианах). COS (45) = 0.525
SIN (n) Синус угла (в радианах) SIN (75) = -0.388
TAN (n) Тангенс угла (в радианах) TAN (60) = 0.320
COT (n) Котангенс угла (в радианах) COT (60) = 3.125
RADTODEG (n) Преобразование числа из радианов в градусы RADTODEG (1.047) = 60
DEGTORAD (n) Преобразование числа из градусов в радианы DEGTORAD (60) = 1.047

Таблица 3.6. Функции для работы со строковыми переменными

Функция Назначение Пример
COPY (s, n, m) Копирование части строки, где n — номер символа, начиная с которого нужно копировать; m — количество копируемых символов.
COPY ('пример', 2, 3) = 'рим'
POS (t, s) Ищет подстроку в строке и возвращает номер позиции вхождения подстроки в строку, где t — искомая подстрока, s — строка для поиска. Если подстрока не найдена, то функция возвратит значение 0
POS ('ме', 'Пример') = 4;
POS ('ме', 'Привет') = 0
TONUMBER (s) Переводит строковую переменную в числовую.
TONUMBER ('51.7') = 51.7
LENGTH (s) Длина строки
LENGTH ('пример') = 6
UPPER (s) Переводит символы в строке в верхний регистр.
UPPER ('ПриМер') = 'ПРИМЕР'
LOWER (s) Переводит символы в строке в нижний регистр.
LOWER ('ПриМер') = 'пример'

Таблица 3.7. Функции для работы с числовыми переменными

Функция Назначение Пример
ABS (n) Абсолютное значение (модуль числа). ABS (-3) = 3
EXP (n) Возведение числа e в степень. EXP (3) = e³ = 20.085
FRAC (n) Выделяет дробную часть числа. FRAC (51.178) = 0.178
LN (n) Вычисляет натуральный логарифм числа. LN (15.55) = 2.744
POWER (n, m) Возведение числа n в степень m. POWER (2, 3) = 8
ROUND (n) Округление с заданной точностью ADigit. Eсли ADigit = 0, то округление до целого; если ADigit = -1, то — до 1 знака после запятой (десятых); если ADigit = 1, то — до 1 знака до запятой (десятков). ROUND (51.784, -1) = 51.8
RoundTo (Value, ADigit) Округление до ближайшего целого. RoundTo (51.784) = 52
TRUNC (n) Выделение целой части. TRUNC (51.784) = 51
INT (n) Выделение целой части (аналогична предыдущей функции). INT (51.784) = 51
FLOOR (n) Округление в меньшую сторону. FLOOR (5.1) = 5;
FLOOR (-5.1) = -6
CEIL (n) Округление в большую сторону. CEIL (5.1) = 6;
CEIL (-5.1) = -5
SQR (n) Возведение в квадрат. SQR (7) = 49
SQRT (n) Извлечение квадратного корня. SQRT (16) = 4
TOSTR (n) Перевод числовой переменной в строковую. TOSTR (56.48) = '56.48'
MAX (X, Y) Выводит максимальное число из пары X и Y MAX (-3, -1) = -1
MIN (X, Y) Выводит минимальное число из пары X и Y MIN (-3, -1) = -3

Таблица 3.8. Функции для настройки диалоговых окон

DlgBox (s, DlgType, Buttons)

Выводит на экран диалоговое окно с указанными сообщением и кнопками. s — текст сообщения. DlgType — тип диалогового окна, возможны значения: mtError, mtWarning, mtInformation, mtConfirmation.Buttons — массив, описывающий кнопки, которые должны располагаться на диалоговом окне. Элементами массива могут быть значения:mbYes, mbNo, mbOK, mbCancel, mbAbort, mbRetry, mbIgnore, mbAll, mbNoToAll, mbYesToAll. Возможно также использование предопределённых массивов: mbYesNoCancel, mbYesNo, mbYesAllNoAllCancel, mbOKCancel, mbAbortRetryIgnore, mbAbortIgnore. Функция возвращает одно из следующих значений: mrOk; mrCancel; mrYes; mrNo; mrAbort; mrRetry; mrIgnore; mrAll; mrNoToAll; mrYesToAll

Пример:

DlgBox ('Продолжить расчёт?', mtConfirmation, mbYesNo)

На экран будет выведено окно запроса, содержащее текст Продолжить расчёт? и кнопки Yes и No.

MsgBox (s, t)

Выводит на экран информационное окно с сообщением. s — текст сообщения, t — заголовок (caption) сообщения. В приведённом примере на экран будет выведено окно с заголовком Welcome, текстом Good morning! и кнопкой ОК.

Пример:

Msgbox ('Good morning!', 'Welcome')

StopCalc

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

Пример:

StopCalc ('Some text');


Таблица 3.9. Прочие функции

Debug(A, B, C...)

Выводит данные в информационном окне. Принимается неопределённое количество аргументов, которые могут быть числом, строкой s или объектом.

Выводимый текст может быть отформатирован при помощи директив bbCode:

[b]полужирный текст[/b]
[i]наклонный текст[/i]
[u]подчёркнутый текст[/u]
[s]зачёркнутый текст[/s]
[size=15]размер текста[/size]
[color=red]Красный текст[/color]

В примере на экран будет выведено: Good morning. Обратите внимание, что при обращении к вложенным объектам максимальная глубина стека составляет 10 уровней.

Пример:

s := '[color=blue]morning[/color]';
DEBUG ('[i]Good[/i] ', s);
DEBUG ('Products[0].Frame.UserParams.Count=', Products[0].Frame.UserParams.Count);

Assert (Expression: Boolean; Message: string = )

Прерывает расчёт, если Expression = False; если Message = , в лог расчёта выводится «Расчёт прерван пользователем»

Пример:


InRange (s, t1, t2, …)

Проверяет наличие определённых значений для строковой или числовой переменной. s — переменная, t1, t2 — значения переменной. В примере условие будет выполнено, если переменная Тип_открывания имеет одно из указанных значений. При сравнении числовых данных применяется округление до 4 знаков после запятой.

Пример:

If InRange (Тип_открывания, 'подвесное', 'откидное') Then 

ISVAREXISTS (var)

Проверяет существование переменной var (обозначение искомой переменной записывается как строка, в кавычках). Возвращает значение 1, если переменная существует, иначе возвращает значение 0.

Пример:

a := 0;
ISVAREXISTS ('a') = 1;
ISVAREXISTS ('s') = 0;

ORD (s)

Возвращает ASCII-код по символу. Если s — строка, то будет возвращён только код первого символа.

Пример:

ORD ('N') = 78;
ORD ('NItg') = 78

TYPEOF (var)

Определяет тип переменной. Возвращает значение: 'STRING', если переменная строкового типа, 'NUMBER', если переменная числового типа, 'ARRAY' в случае массива, 'RECORD', если переменная типа «запись».

Пример:

a := 12;
TYPEOF (a) = 'NUMBER';
TYPEOF ('a') = 'STRING';
TYPEOF (4) = 'NUMBER';
TYPEOF ('4') = 'STRING'

TYPEID(var)

Возвращает строку с описанием типа выражения. Возвращаемые значения: 'STRING', 'DOUBLE', 'BOOLEAN', 'RECORD', 'ARRAY'. От предыдущей функции отличается более подробной информацией.

Пример:

a[3] := 2.7;
TYPEID (a) = 'Array [0..3] of DOUBLE'

Обратите внимание, что при обращении к вложенным объектам максимальная глубина стека составляет 10 уровней.

ArrayOf(A, B, C...)

Возвращает новый одномерный массив с заданными значениями

Пример:

A := ArrayOf(1, 2, 3, 4, 5);
Trace(A);

Trace(A, B, A + B);

Вывод значений переменных и результатов вычисления в отладку

Пример:

Trace(A, B, A + B);

A = <значение переменной A>
B = <значение переменной B>
A + B = <значение переменной A + значение переменной B>

Обратите внимание, что при обращении к вложенным объектам максимальная глубина стека составляет 10 уровней.


Операции сравнения

В табл. 3.10 перечислены операнды сравнения двух значений. Результатом сравнения будут являться результаты True (верно) или False (ложно).

Таблица 3.10. Операции сравнения

Операция Назначение Пример
= Равно Art = 'abc'

Long = 350

< Меньше Long < 1500
> Больше Long > 1500
<= Меньше или равно Long <= 1450
>= Больше или равно Long >= 2000
<> Не равно Art <> 'abcde'

Long <> 350

IconInfo.png Обратите внимание, что при сравнении числовых данных применяется округление до 4 знаков после запятой.

Булевы операции

В табл. 3.11 перечислены булевы операции, которые также поддерживаются макроязыком.

Таблица 3.11. Булевы операции

Операция Назначение Пример
НЕ (NOT) Отрицание НЕ A = B
И (AND) Логическое И Art = 'abc' И Long > 1300
ИЛИ (OR) Логическое ИЛИ Art = 'abc' ИЛИ Art = 'xyz'
XOR Исключающее ИЛИ

Приоритет и ассоциативность операций

В сложных выражениях последовательность вычислений определяется расположением скобок. Если подряд идут несколько операций, не разделенных скобками, то последовательность их вычисления определяется приоритетом (см. табл. 3.12).

Таблица 3.12. Приоритет операций

Операция Приоритет
НЕ Первый (наибольший)
*, /, И Второй
+, -, ИЛИ, XOR Третий (наименьший)

Последовательность вычислений определяется ассоциативностью в том случае, если подряд следует несколько операций с одинаковым приоритетом; такие операции выполняются в порядке чтения, слева направо. Например, в выражении X + Y — Z сначала суммируются величины X и Y, а затем из полученной суммы вычитается величина Z.

Конструкция условного перехода If — Then — Else

Использование этих операторов позволяет задать то или иное направление расчёта в зависимости от выполнения какого-либо условия.

Условие возвращает False (ложно), если результат сравнения равен 0, и True (верно) в любом другом случае.

Синтаксис подобных конструкций можно отобразить следующим выражением:

      If <условие> Then [Begin] <команды1> [End]
      [Else [Begin] <команды2> [End]]

Условные обозначения:

  • условие — условие, при выполнении которого будут выполнены команды1;
  • команды1 — перечень команд, которые должны выполниться при выполнении условия;
  • команды2 — перечень команд, которые должны выполниться при невыполнении условия.
Пример
If ArtStv = 'F40-06-1410.W' Then
Begin
      ArtArm := 'F00-40-9182.2';
End
Else
      ArtArm := 'F00-40-9188.1';

Результатом выполнения данного примера будет 'F00-40-9182.2', если ArtStv = 'F40-06-1410.W'.

В дизайнере выражений и условий любое выражение, записанное без явного задания условной формы if … then, рассматривается как условие, обрабатываемое неявным, автоматически применяемым оператором if. Действием, которое описывается в обычной условной форме командой, заданной после элемента then, в дизайнере выражений и условий является обработка соответствующей записи. Однако, как указано выше, условная форма if … then может использоваться в дизайнере в явном виде. В таком случае действие неявно заданного оператора if не отменяется, однако, в качестве обрабатываемого им условия используется выражение, заданное после явно объявленного элемента then. Например, следующие выражения, заданные в дизайнере выражений и условий, будут эквивалентны:

  • ((a = 10) and (b = 10)) or ((a <> 10) and (c = 10));
  • if a = 10 then b = 10 else c = 10.

Циклическая обработка данных

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

В зависимости от необходимости можно использовать один из трёх циклов, описанных ниже. Чтобы избежать зацикливания количество повторов ограничено 100 000 000, после чего циклы принудительно завершаются.

Цикл For

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

Синтаксис:

For <параметр> := <начальное значение> To <конечное значение> Do
      [Begin] <команды> [End]

Условные обозначения:

  • параметр — переменная, которая будет отвечать за количество повторений цикла. С каждым повтором она автоматически получает значение на единицу больше;
  • начальное значение — начальное значение параметра, с которого будет стартовать цикл;
  • конечное значение — значение, задающее порог выхода из цикла;
  • команды
Пример
Total := 0;
For i := 1 To 10 Do Total := Total + i;

Цикл возвратит значение Total, равное 55.

Цикл Repeat Until

Этот цикл выполняется до тех пор, пока не будет достигнуто условие выполнения.

Синтаксис:

Repeat [Begin] <команды> [End] Until <условие выполнения>

Условные обозначения:

  • команды — одна или несколько команд, выполняемых в теле цикла;
  • условие выполнения — условие, до выполнения которого будет повторяться цикл.
Пример
      Stroka := 'Good morning';
      i := Length(Stroka);
      Repeat
            Begin
            Stroka := Copy (Stroka, 1, Length (Stroka) -1);
            i := i - 1;
      End
      Until i = 4;

После выхода из цикла переменная Stroka примет значение 'Good'.

Цикл While Do

Цикл выполняется до тех пор, пока выполняется условие.

Синтаксис:

      While <условие выполнения> Do [Begin] <команды> [End]

Условные обозначения:

  • условие выполнения — условие, при выполнении которого цикл будет повторяться;
  • команды — одна или несколько команд, выполняемых в теле цикла;
Пример
Stroka := 'Good morning';
i := Length (Stroka);
While i > 4 Do
      Begin
            Stroka := Copy (Stroka, 1, Length (Stroka) - 1);
            i := i - 1;
      End

После выхода из цикла переменная Stroka примет значение 'Good'.

Отладочные сообщения

Особое внимание обратим на работу с окном отладочных сообщений (см. рис. 3.3). В этом окне можно отображать значения строковых и числовых переменных, задаваемых с помощью функции debug (см. табл. 3.9). По моменту появления отладочного окна можно также проследить момент проверки условия; а если каждое сообщение появляется в отдельном окне — последовательность проверки условий. Например:

  • условие, настраиваемое в подразделе Профили (см. Профили) для артикула профиля, проверяется при выборе пункта Параметры профиля из контекстного меню в построителе;
  • условие, настраиваемое в подразделе Состав для элемента состава (см. рис. 4.3), проверяется при расчёте конструкции или пересчете калькуляции.

Для вызова отладочного окна необходимо:

  • установить флажок Показывать отладочные сообщения в меню Сервис;
  • ввести посредством функции debug в дизайнере выражений и условий информацию, которую необходимо просмотреть в окне отладочных сообщений.
Рис. 3.3. Окно отладочных сообщений


Для очистки окна используется команда Очистить из контекстного меню. Кроме того, текст сообщения можно скопировать, найти, выделить или сохранить в файл с помощью соответствующих команд (Копировать, Выделить все, Найти, Сохранить в файл…), которые также задаются через контекстное меню. Повторный поиск без открытия диалогового окна поиска доступен через команду контекстного меню Найти далее или при помощи функциональной клавиши F3.

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