Типы и переменные
Объявлено устаревшим с версии 3. Используйте модуль apiVersion
Описание: Версия API
Тип: number
Добавлено в версии 2
Описание: Модуль версии API скриптов
Свойства и методы:
Описание: Вывести сообщение ошибке и выбросить ошибку, если настоящая версия API меньше указанной
requiredVersion
Тип: number
Метод не возвращает результат
Описание: Получить настоящее значение версии API.
Функция возвращает значение текущей версии API.
Метод не принимает дополнительных параметров.
Возвращаемый тип результата: number
Описание: Получить текущее значение версии API.
Функция возвращает значение текущей версии API, либо
заданное пользователем значение версии API
Метод не принимает дополнительных параметров.
Возвращаемый тип результата: number
Описание: Установить новое значение версии API. Функция используется для добавления функционала, отсутствующего в текущей версии API
newVersion - Новое значение версии в диапазоне 0-<текущее значение версии>
Тип: number
Метод не возвращает результат
Добавлено в версии 7
Описание: Данные для обработки выходных файлов БАЗИС-ЧПУ
Свойства и методы:
Добавлено в версии 7
Описание: Данные конфигурации постпроцессора
Свойства и методы:
Добавлено в версии 7
Описание: Наименование системы управления
Тип: string
Добавлено в версии 7
Описание: Путь к каталогу выходных файлов
Тип: string
Добавлено в версии 7
Описание: Расширение конфигурации
Тип: string
Добавлено в версии 7
Описание: Наименование конфигурации
Тип: string
Добавлено в версии 7
Описание: Список экспортированных файлов
Тип: string[]
Добавлено в версии 7
Описание: Общие данные экспорта
Свойства и методы:
Добавлено в версии 7
Описание: Наименование заказа
Тип: string
Система типов языка JavaScript имеет ряд ограничений, не позволяющих объяснить преобразование объектов внутри движка скриптов в рамках языка JavaScript, поэтому вводятся дополнительные абстракции - интерфейсы, абстрактные классы и перечисляемые типы.
Интерфейсы в системе Базис - это виртуальный (не имеющий реализации в коде) тип, описывающий свойства объекта. Объект считается реализацией интерфейса, если имеет все свойства, описанные в интерфейсе. Например, объект, реализующий интерфейс TVector3d может быть создан как специальной функцией, так и вручную с назначением всех свойств реализуемого интерфейса:
// Создание вектора с помощью специальной функции
let v1 = geometry3d.VectorMake(1, 0, 0);
// Создание вектора вручную
let v2 = {
x: 1,
y: 0,
z: 0
}
Оба созданных в примере выше объекта могут быть использованы и как параметры методов функций системы Базис и как значения свойств объектов системы Базис.
В большинстве случаев интерфейсы используются для передачи через движок скриптов тех объектов, которые не могут быть переданы по ссылке. Поэтому движок оперирует копиями объектов - при передаче интерфейса во внутреннюю функцию системы Базис движок скриптов считывает значения всех свойств объекта, реализующего интерфейс и создаёт объект системы Базис, который идёт как аргумент в вызываемую функцию. В обратную сторону конвертация схожа - при возвращении свойством/методом объекта (не ссылки на объект) движок скриптов преобразует объект системы Базис в объект JavaScript, которому назначает значения свойств оригинального объекта.
Важная заметка: из-за копирования объектов движком скриптов изменения интерфейса, полученного из свойства/метода объектов системы Базис не отразятся на исходном значении внутри объекта, например:
// Создаём панель
let panel = objects3d.NewPanel(100, 100);
// Создаём вектор будущего положения панели
let pos = geometry3d.VectorMake(100, 200, 300);
// Задаём положение панели
panel.Position = pos;
// Считываем положение панели
let pos2 = panel.Position;
// Меняем координату X первого вектора
pos.x = 400;
// Меняем координату Y второго вектора
pos2.y = 500;
// Считываем настоящее положение панели
let realPos = panel.Position;
// Выводим значения переменных
// Как видно из вывода лога, все три переменных ссылаются на разные объекты
// и изменения переменных не отражаются на значении свойства Position
// панели еслине задать значение свойства напрямую
console.log(JSON.stringify(pos)); // {"x":400,"y":200,"z":300}
console.log(JSON.stringify(pos2)); // {"x":100,"y":500,"z":300}
console.log(JSON.stringify(realPos)); // {"x":100,"y":200,"z":300}
Абстрактные классы - абстракция для описания классов системы Базис. Эти классы описаны в глобальном пространстве для упрощения поиска определений, но фактическое их положение иное. Поэтому, их конструкторы не могут быть вызваны из глобального пространства, для создания экземпляра класса используются встроенные функции внутренних модулей, например:
// Создание объекта панели с помощью специальной функции
let panel = objects3d.NewPanel(100, 100);
Большинство объектов, с которыми происходит взаимодействие в системе Базис, в пространстве JavaScript описываются как экземпляры абстрактных классов.
Перечисляемые типы (enums) предоставляют конечный набор именованных значений. В JavaScript они реализованы как обычные объекты с набором свойств, например:
// Тип, задающий направление - вверх, вниз, влево, вправо
const direction = {
up: 0,
down: 1,
left: 2,
right: 3
}
Перечисляемые типы в основном используются как группа констант, элемент которой передаётся в качестве параметра метода либо значения свойства. Как и обычные константы, это удобно тем, что при изменении реального значения (например, значение было равно 0, потом стало равно 5) параметра в методе и в перечисляемом типе скрипт продолжит корректно работать с новым значением, если оно задано с помощью константы перечисляемого типа.
ReferenceObject - специальный тип, используемый для передачи значений, которые могут изменяться внутри вызываемого метода. Конструкция языка JavaScript не реализует изменение значения переданной переменной внутри метода, поэтому при передаче параметров функции через движок скриптов нет возможности ни изменить значение переменной JavaScript в методе системы Базис ни наоборот - изменить значение переменной системы Базис в методе Javascript. Для передачи таких параметров используется тип ReferenceObject - объект со свойством value, значение которого будет перезаписываться.
Как описано выше, вызываемый метод не может переопределить значение переменной, переданной в него. Например код ниже не позволит получить ближайший элемент контура к точке и расстояние до неё:
// Создадим панель
let panel = objects3d.NewPanel(100, 200);
// Точка для поиска ближайшего элемента контура
let point = {
x: 50,
y: -20
}
// Максимальное расстояние поиска (максимальное расстояние до точки)
let distance = 100;
// Найденный элемент
let elem;
let result = panel.Contour.FindNearestObject(point, distance, elem);
if (result) { // result == true, поэтому выполнение продолжится в этом блоке кода
console.log('Элемент найден');
console.log(`Расстояне от точки до элемента: ${distance}`);
if (elem) { // elem не определён, поэтому выполнение продолжится по ветке else
if (elem.IsLine()) {
console.log(`Pos1: ${JSON.stringify(elem.AsLine().Pos1)}`)
console.log(`Pos2: ${JSON.stringify(elem.AsLine().Pos2)}`)
}
}
else
console.log('Элемент не был возвращён методом') // В лог будет выведено это сообщение
}
else
console.log("Элемент не найден");
Для получения изменённого значения как раз и создан тип ReferenceObject, который будет передаваться в метод системы Базис, а после выполнения метода движок скриптов перепишет значение свойства value переданного объекта ReferenceObject.
// Создадим панель
let panel = objects3d.NewPanel(100, 200);
// Точка для поиска ближайшего элемента контура
let point = {
x: 50,
y: -20
}
// Максимальное расстояние поиска (максимальное расстояние до точки)
let distance = 100;
// Найденный элемент
let elem;
// Создадим объекты ReferenceObject, хранящие значения расстояния и найденного элемента
let distanceRef = new ReferenceObject(distance);
let elemRef = new ReferenceObject(elem);
let result = panel.Contour.FindNearestObject(point, distanceRef, elemRef);
// Перезаписываем новые значения расстояния и найденного элемента
distance = distanceRef.value;
elem = elemRef.value;
if (result) {// result == true, поэтому выполнение продолжится в этом блоке кода
console.log('Элемент найден');
console.log(`Расстояне от точки до элемента: ${distance}`);
if (elem) {// elem определён, поэтому продолжается выполнение этого блока кода
if (elem.IsLine()) {// elem является линией, поэтому продолжается выполнение этого блока кода
console.log(`Pos1: ${JSON.stringify(elem.AsLine().Pos1)}`)
console.log(`Pos2: ${JSON.stringify(elem.AsLine().Pos2)}`)
}
}
else
console.log('Элемент не был возвращён методом')
}
else
console.log("Элемент не найден");
В некоторых случаях (в основном, в функциях обратного вызова) бывает необходимо изменить значение, переданное из системы Базис, которое нельзя вернуть как результат функции. В таких случаях движок может создать объект типа ReferenceObject и передать его в качестве нужного параметра в вызываемую функцию JavaScript; после завершения функции значение такого объекта будет преобразовано движком и назначено в нужную область памяти для корректного изменения значения, переданного по ссылке. В качестве примера рассмотрим фильтрацию ввода в поле ввода текстового компонента:
//Функция-фильтр вводимых символов
function FilterLetterCharacters(sender, key) {
// Получение строки из кода символа
let keyString = String.fromCharCode(key.value);
// Регулярное выражение, соответствующее любой цифре либо точке
let regex = /\d|\./;
// Если строка не соответствует регулярному выражению, обнуляем введённый символ.
// Таким образом, после выполнения этой функции дальнейшая обработка будет для
// символа с нулевым значением и изначальный символ не будет введён в поле компонента
if (!keyString.match(regex))
key.value = 0;
}
var UserForm1 = UI.components.NewForm();
UserForm1.Width = 400;
UserForm1.Height = 300;
UserForm1.Caption = 'UserForm1';
UserForm1.Show();
var cxTextEdit1 = UI.components.NewTextEdit(UserForm1, UserForm1);
cxTextEdit1.Width = 121;
cxTextEdit1.Top = 55;
cxTextEdit1.Left = 75;
cxTextEdit1.Height = 23;
// Назначаем функцию-фильтр на событие ввода символа
cxTextEdit1.OnKeyPress = FilterLetterCharacters;
Тип IndexedProperty - абстрактный тип, введённый для имитации объекта со свойствами, доступными по индексу из-за различий JavaScript и системы Базис. Технически, со стороны системы Базис доступ к значению индексного свойства идет одной операцией (имя свойства + индекс свойства), а со стороны Javascript - двумя, доступ к свойству по имени и доступ к свойству полученного значения по индексу. Потому был описан отдельный тип объекта, возвращаемый движком при доступе к индексному свойству объекта, который хранит в себе необходимые данные для дальнейшего доступа по индексу.