Группы пользователей Autodesk

Создание массива вершин полилинии


Построение границы дорожки

 

Построение границы дорожки 
 

Создание массива вершин полилинии



Теперь нужно решить последнюю задачу: преобразовать отдельные точечные переменные p1, p2, p3 и p4 в формат, необходимый для вызова функции vla?addLightweightpolyline. Для начала обратимся к справочной информации.

Для получения информации о функции

  • Нажмите кнопку "Справка" на панели инструментов VLISP.
  • В диалоговом окне «Введите имя пункта» введите vla-addLightweightpolyline и нажмите «OK». Справочная система не учитывает регистр символов, поэтому можно не заботиться о расстановке заглавных букв.
  • В справочной системе говорится, что для AddLightWeightPolyline вершины полилинии должны быть представлены в виде массива типа variant (универсальный тип), хранящего числа типа double. В справочной системе по этому поводу говорится следующее:

    Массив 2М координат (в МСК), задающий вершины полилинии. Для построения компактной полилинии нужно не меньше двух точек (т.е. четырех элементов). Размер массива должен быть кратным 2.

    В ActiveX тип variant используется для хранения произвольных типов данных. Типом variant могут быть представлены строки, целые числа и массивы. Данные в типе variant хранятся вместе с идентифицирующей их информацией.

    Итак, у нас имеется четыре точки, каждая в формате (x, y, z). Задача заключается в том, чтобы преобразовать их в список следующего вида:

    (x1 y1 x2 y2 x3 y3 x4 y4)

    Функция append объединяет несколько списков в один. Для создания списка из четырех точек в формате функции ActiveX используется следующее выражение:

    (setq polypoints (append (3dPoint->2dPoint p1)

    (3dPoint->2dPoint p2)

    (3dPoint->2dPoint p3)

    (3dPoint->2dPoint p4)))

    Писать одну и ту же функцию 3dPoint->2dPoint четыре раза не очень удобно. Сократить выражение можно с помощью функций mapcar и apply. Функция mapcar выполняет операции над отдельными элементами одного или более списков, а функция apply передает список аргументов заданной функции. В итоге код должен выглядеть следующим образом:

    (setq polypoints (apply 'append (mapcar '3dPoint->2dPoint

    (list p1 p2 p3 p4))))

    Таким образом, перед вызовом функции mapcar список точек примет вид:

    ((x1 y1 z1) (x2 y2 z2) (x3 y3 z3) (x4 y4 z4))

    После выполнения mapcar получается список точек следующего вида:

    ((x1 y1) (x2 y2) (x3 y3) (x4 y4))

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

    (x1 y1 x2 y2 x3 y3 x4 y4)

     



    Содержание раздела