Работа с универсальными плоскими объектами

Материал из K3-Macro
Макро | Создание макропрограмм | Переменные и выражения | Вызов из ZIP | Типовые параметры | Создание геом. объектов | Буфер обмена | Сценарии | Параметрические библиотеки | Геометрические характеристики | Атрибуты | Структурные объекты | Текстовые файлы | Системные параметры | Работа с файлами | Редактирование объектов | Удаление объектов | Размеры | Штриховка | Объект «Текст» | Камера | Работа с видом | Наборы параметров | Запрос информации у пользователя | Фильтры | Слои | Графы | Универсальные плоские объекты | Функции работы с системой | Функции работы с объектами сцены | Работа с динамически подключаемыми библиотеками | Функции работы с массивами | Работа со строками | Математические функции | Работа с файлами DBF dBASE IV | Унифицированная работа с базами данных | Вычисление выражений | Присвоение имени объекту | Откатка и восстановление команд | Изменение режима трассировки макропрограмм | Вызов внешних приложений и задач | Проверка условия | Проверка типа переменной | Установкв статуса вывода сообщений | Выдача системного сообщения | Выбор объектов | Версия системы | Информация о системе | Проверка принадлежности к списку | Помещение строки в буфер команд | Получение метапути | Установка курсора ожидания | Мебельные команды и функции для макропрограммирования‎

В системе имеется список двухмерных универсальных объектов. Над этими объектами можно производить различные операции (поиск точки пересечения, поиск точки касания и пр). Эти операции могут возвращать числовые значения (координаты), могут порождать новые универсальные объекты и добавлять их в список и пр.

Каждый элемент в этом списке имеет свой уникальный номер. После удаления объекта номер не может быть использован.

При добавлении объекта возвращается номер, который однозначно идентифицирует объект.

Добавление, получение и удаление объекта[править | править код]

AddUnObj2D[править | править код]

INT AddUnObj2D(INT <Type>, INT <CreType>, ARRAY <Array>)

Функция добавляет в список созданных объектов объект типа <Type> способом задания <CreType> и данными из массива <Array>.

Функция возвращает номер созданного объекта в списке.


Возможные типы объектов <Type>:


  • 0 - точка

способы задания <CreType> (они будут пополняться):

0 - по декартовым координатам

<Array>[1] - Координата X

<Array>[2] - Координата Y

1 - по полярным координатам

<Array>[1] - Радиус

<Array>[2] - Угол


  • 1 - отрезок

способы задания <CreType>:

0 — по декартовым координатам начала и конца отрезка

<Array>[1] - Координата X начала отрезка

<Array>[2] - Координата Y начала отрезка

<Array>[3] - Координата X конца отрезка

<Array>[4] - Координата Y конца отрезка


  • 2 - дуга

способы задания <CreType>:

0 - по декартовым координатам трех точек дуги

<Array>[1] - Координата X начала дуги

<Array>[2] - Координата Y начала дуги

<Array>[3] - Координата X конца дуги

<Array>[4] - Координата Y конца дуги

<Array>[5] - Координата X точки на дуге

<Array>[6] - Координата Y точки на дуге

1 - по декартовым координатам начала и конца дуги и радиусу

<Array>[1] - Координата X начала дуги

<Array>[2] - Координата Y начала дуги

<Array>[3] - Координата X конца дуги

<Array>[4] - Координата Y конца дуги

<Array>[5] - Радиус дуги. Если радиус >0, строится малая дуга. Иначе - большая дуга

<Array>[6] - Ориентация дуги. Если ориентация =1 - положительное направление (против часовой стрелки). Иначе - по часовой.


  • 3 - окружность

способы задания <CreType>:

0 - по декартовым координатам точки центра, радиусу и ориентации

<Array>[1] - Координата X центра окружности

<Array>[2] - Координата Y центра окружности

<Array>[3] - Радиус окружности

<Array>[4] - Координата ориентация (1 - положительная - против часовой стрелки, 0 - отрицательная - по часовой стрелке)

GetUnObj2D[править | править код]

INT GetUnObj2D(INT <Num>, INT <Type>, ARRAY <Array>)

Функция заполняет массив <Array> данными об объекте с номером <Num> в списке и возвращает в переменную <Type> тип возвращаемого объекта.

Функция возвращает число заполненных элементов массива.


Возможные типы объектов <Type>:


  • 0 - точка

<Array>[1] - Координата X

<Array>[2] - Координата Y


  • 1 - отрезок

<Array>[1] - Координата X начала отрезка

<Array>[2] - Координата Y начала отрезка

<Array>[3] - Координата X конца отрезка

<Array>[4] - Координата Y конца отрезка


  • 2 - дуга

<Array>[1] - Координата X начала дуги

<Array>[2] - Координата Y начала дуги

<Array>[3] - Координата X конца дуги

<Array>[4] - Координата Y конца дуги

<Array>[5] - Координата X точки на дуге

<Array>[6] - Координата Y точки на дуге


  • 3 - окружность

<Array>[1] - Координата X центра окружности

<Array>[2] - Координата Y центра окружности

<Array>[3] - Радиус окружности

<Array>[4] - Координата ориентация (1 - положительная - против часовой стрелки, 0 - отрицательная - по часовой стрелке)

FreeUnObj2D[править | править код]

LOGICAL FreeUnObj2D(INT <Num>)

Функция удаляет из списка объект с номером <Num>.

Функция возвращает единицу в случае успешного удаления и ноль — в случае ошибки.

Построение дуги, касательной к объектам[править | править код]

INT ArcTTUnObj2D(INT <Num1>, INT <Num2>, DOUBLE <R>[, DOUBLE <X>, DOUBLE <Y>])

Функция ArcTTUnObj2D строит дугу радиуса <R>, касательную к объектам с номерами <Num1> и <Num2>. Если радиус <R> отрицательный, дуга строится по часовой стрелке. Иначе - против часовой стрелки. Необязательные параметры <X> и <Y> задают желательный центр дуги касания (для однозначности)

Функция возвращает номер построенного объекта. Если ничего построить не удалось, функция возвращает 0.

Деление объекта точкой[править | править код]

INT Div2UnObj2D(INT <Num>, DOUBLE <X>, DOUBLE <Y>)

Функция Div2UnObj2D делит объект с номером <Num> точкой с координатами <X> и <Y>. В результате деления образуются два новых объекта, один из которых может быть точкой. Функция возвращает номер первого образовавшегося объекта (от начала до точки деления). Номер второго объекта (от точки деления до конца) имеет следующий порядковый номер. В случае, если точка не лежит на объекте <Num>, функция возвращает 0.

Вычисление параметров дуги[править | править код]

INT GetACUnObj2D(INT <Num>, DOUBLE ARRAY <Arr>)

Функция GetACUnObj2D вычисляет параметры объекта с номером <Num> типа "дуга" и складывает в массив <Arr> последовательно вычисленные параметры:

<Arr[1]> — Координата X центра дуги

<Arr[2]> — Координата Y центра дуги

<Arr[3]> — Радиус дуги

<Arr[4]> — Ориентация дуги (1 - положительная - против часовой стрелки, 0 - отрицательная - по часовой стрелки)

<Arr[5]> — Угол до начала дуги (в радианах)

<Arr[6]> — Угол раствора дуги (в радианах)

Функция возвращает число заполненных элементов массива. Для не дуги функция возвращает 0.

Нахождение точек пересечения объектов[править | править код]

INT InterUnObj2D(INT <UnObj1>, LOGICAL <OnObjFlag1>, INT <UnObj2>, LOGICAL <OnObjFlag2>, { STRING <ArrName> | DOUBLE ARRAY <Arr> })

Функция InterUnObj2D находит точки объектов с номерами <UnObj1> и <UnObj2>, и записывает точки пересечения в массив с именем <ArrName> или уже созданный массив <Arr>. Если флаги <OnObjFlag1> или <OnObjFlag2> равны 1, то точка пересечения ищется только на самих объектах. Если флаги <OnObjFlag1> или <OnObjFlag2> равны 0, то точка пересечения ищется не только на объектах, но и на их продолжениях.

В массив с именем <ArrName> или уже созданный массив <Arr>'' записываются последовательно координаты точек персечения. Размерность массива равна 2*n, где n - количество найденных точек пересечения. Если точек пересечения не найдено, массив не создается.

Функция возвращает количество найденных точек пересечения или -1 в случае ошибки.

Пример:

 defarr li1[4],ar1[6]; // Создаем массивы под объекты
 
 NULLOUT=initarray(li1,0); // Инициализируем массивы
 NULLOUT=initarray(ar1,0); // Инициализируем массивы
 
 // Первый объект будет отрезок от точки (0,0) до (0,100)
 li1[1]=0;
 li1[2]=0;
 li1[3]=0;
 li1[4]=100;

 // Второй объект - окружность от точки (50,0) до (-50,0), проходит через точку (0,-50)
 ar1[1]=50;
 ar1[2]=0;
 ar1[3]=-50;
 ar1[4]=0;
 ar1[5]=0;
 ar1[6]=-50;

 // Добавляем объекты в список
 un1=addunobj2d(1,0,li1);
 un2=addunobj2d(2,0,ar1);

 // Находим точки пересечения первого отрезка с окружностью, на которой лежит вторая дуга
 
 // Массив задаем строкой
 kp=InterUnObj2D(un1,1,un2,0,"arr");
 
 if (kp&gt;0)
 {
   putmsg(arr);
 }
 
 // Находим точки пересечения прямой первого отрезка с окружностью, на которой лежит вторая дуга
 
 // Массив задаем явно
 defarr qqq[4];
 
 kp=InterUnObj2D(un1,0,un2,0,qqq);
 
 if (kp&gt;0)
 {
   putmsg(qqq)
 }  
 exit;

Сервисные функции[править | править код]

INT MaxUnObj2D()

Функция MaxUnObj2D возвращает максимальный номер объекта в списке.


INT TypeUnObj2D(INT <Num>)

Функция TypeUnObj2D возвращает тип объекта с номером <Num> или -1 в случае ошибки

Типы объектов:

0 - точка;
1 - отрезок;
2 - дуга;
3 - окружность;
4 - сплайн.

Пример:

// Строим сопряжение дугой двух отрезков
defarr li1[4],li2[4],ar[6],li3[4],li4[4];

// Координаты первого отрезка
li1[1]=0;
li1[2]=0;
li1[3]=100;
li1[4]=0;

// Координаты второго отрезка
li2[1]=100;
li2[2]=0;
li2[3]=100;
li2[4]=100;

// Радиус сопряжения
r=30;
 
// Добавляем объекты
u1=addunobj2d(1,0,li1);
u2=addunobj2d(1,0,li2);

// Получаем дугу сопряжения
u3=arcttunobj2d(u1,u2,r);
 

// Читаем ее координаты
NULLOUT=getunobj2d(u3,ty,ar);

// Делим первый отрезок
u4=div2unobj2d(u1,ar[1],ar[2]);

// Удаляем ненужную часть отрезка
NULLOUT=freeunobj2d(u4+1);

// Делим второй отрезок
u5=div2unobj2d(u2,ar[3],ar[4]);

// Удаляем ненужную часть отрезка
NULLOUT=freeunobj2d(u5);

// Читаем координаты
NULLOUT=getunobj2d(u4,ty,li3);
NULLOUT=getunobj2d(u5+1,ty,li4);

// Находим максимальный номер объекта
NULLOUT=maxunobj2d();

// Строим сопряжение
line li3[1],li3[2],0 li3[3],li3[4],0;
arc ar[1],ar[2],0 ar[3],ar[4],0 ar[5],ar[6],0;
line li4[1],li4[2],0 li4[3],li4[4],0;

// Удаляем объекты
NULLOUT=freeunobj2d(u1);
NULLOUT=freeunobj2d(u2);
NULLOUT=freeunobj2d(u3);
NULLOUT=freeunobj2d(u4);
NULLOUT=freeunobj2d(u5+1);

// Находим максимальный номер объекта
NULLOUT=maxunobj2d();

exit;

Макро | Создание макропрограмм | Переменные и выражения | Вызов из ZIP | Типовые параметры | Создание геом. объектов | Буфер обмена | Сценарии | Параметрические библиотеки | Геометрические характеристики | Атрибуты | Структурные объекты | Текстовые файлы | Системные параметры | Работа с файлами | Редактирование объектов | Удаление объектов | Размеры | Штриховка | Объект «Текст» | Камера | Работа с видом | Наборы параметров | Запрос информации у пользователя | Фильтры | Слои | Графы | Универсальные плоские объекты | Функции работы с системой | Функции работы с объектами сцены | Работа с динамически подключаемыми библиотеками | Функции работы с массивами | Работа со строками | Математические функции | Работа с файлами DBF dBASE IV | Унифицированная работа с базами данных | Вычисление выражений | Присвоение имени объекту | Откатка и восстановление команд | Изменение режима трассировки макропрограмм | Вызов внешних приложений и задач | Проверка условия | Проверка типа переменной | Установкв статуса вывода сообщений | Выдача системного сообщения | Выбор объектов | Версия системы | Информация о системе | Проверка принадлежности к списку | Помещение строки в буфер команд | Получение метапути | Установка курсора ожидания | Мебельные команды и функции для макропрограммирования‎