Руководство по настройке altAwin:Макроязык
Макроязык
макроязыкСодержание формул/условий может быть задано при помощи встроенного в программу макроязыка. Это позволяет устанавливать более разнообразные и сложные условия.
Синтаксис макроязыка, встроенного в программу, похож на классический язык программирования Pascal:
- все команды должны оканчиваться разделителем в виде точки с запятой;
- блок команд ограничивается в начале ключевым словом Begin, в конце — End;
- регистр буквенных символов во внимание не принимается (например, значения Name, name и NAME воспринимаются как тождественные).
Код можно комментировать с помощью символов «{» и «}». Если код в дизайнере выражений и условий полностью закомментирован — условие выполняется всегда! |
Переменные и массивы
Объявление и инициализация переменных происходит при первом присвоении им значения. Присвоение значения осуществляется при помощи оператора := (двоеточие и знак равенства). Исходя из присвоенного значения, переменная получает числовой или строковый тип. Минус (дефис) перед числом означает отрицательное значение.
Строковые значения заключаются в одинарные кавычки ('Это строка'). Если необходимо в строковом параметре использовать кавычки, то строка примет следующий вид: '«Это строка с кавычками»'.
Массивы могут быть только одномерными. Длину массива указывать не нужно, он может менять количество элементов динамически. Первый элемент массива имеет индекс 0. Индекс массива не может быть меньше нуля.
Пример
Числовой параметр: 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 |
Обратите внимание, что при сравнении числовых данных применяется округление до 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 в дизайнере выражений и условий информацию, которую необходимо просмотреть в окне отладочных сообщений.
Для очистки окна используется команда Очистить из контекстного меню. Кроме того, текст сообщения можно скопировать, найти, выделить или сохранить в файл с помощью соответствующих команд (Копировать, Выделить все, Найти, Сохранить в файл…), которые также задаются через контекстное меню. Повторный поиск без открытия диалогового окна поиска доступен через команду контекстного меню Найти далее или при помощи функциональной клавиши F3.
При выполнении условия возвращается значение последней операции, выполненной в скрипте. Поэтому для корректной работы вызов функции debug необходимо использовать перед основным условием. |