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

Преобразование 3М точек в 2М


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

 

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

Преобразование 3М точек в 2М



Другая полезная функция, которая потребуется в программе построения парковой дорожки, должна преобразовывать 3М точки в 2М точки. AutoCAD обычно работает с трехмерными координатами, однако некоторые объекты (например, компактные полилинии) по определению являются двумерными. Функция getpoint возвращает 3М точки, поэтому для их преобразования требуется создать специальную функцию.

Для преобразования 3М точек в 2М

  • В ответ на подсказку в окне консоли введите следующее:
  • (defun 3dPoint->2dPoint (3dpt)(list (car 3dpt) (cadr 3dpt))) Выполним функцию.

  • Для этого в ответ на подсказку в окне консоли введите:
  • (3dpoint->2dpoint (list 10 20 0))

    Функция работает; однако, для создания приложения, строящего парковую дорожку, следует учитывать еще одно обстоятельство. Для функций LISP чаще всего безразлично, является ли аргумент целым или вещественным числом. Но совсем по другому обстоит дело с функциями ActiveX, которые будут использованы позднее на этом занятии. Функции ActiveX работают с вещественными числами. Нашу функцию можно легко модифицировать так, чтобы она всегда возвращала вещественные числа, а не целые.

  • В ответ на подсказку в окне консоли введите следующее:
  • (defun 3dPoint->2dPoint (3dpt)(list (float(car 3dpt))

    (float(cadr 3dpt))))

  • Снова запустите функцию:
  • (3dpoint->2dpoint (list 10 20 0))

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

  • Снова проверим работу функции, на этот раз с помощью функции getpoint. В ответ на подсказку в окне консоли введите следующее:
  • (setq myPoint(getpoint))

  • Укажите точку в области рисования AutoCAD.
  • Функция getpoint возвращает 3М точку.

  • В ответ на подсказку в окне консоли введите следующее:
  • (3dPoint->2Dpoint myPoint)

    На этот раз возвращается 2М точка.

    Теперь добавим функцию в файл gpmain.lsp (точно так же, как это было сделано с функцией Degrees->Radians).
    Новый код должен выглядеть следующим образом:

    ;;;--------------------------------------------------------------;

    ;;; Функция: 3dPoint->2dPoint ;

    ;;;--------------------------------------------------------------;

    ;;; Описание: Эта функция обрабатывает один параметр, представляющий точку с запятой (;)

    ;;; 3D point (list of three integers or reals), and ;

    ;;; converts it into a 2D point (list of two reals).;

    ;;; There is no error checking on the 3D point ;

    ;;; parameter -- it is assumed to be a valid point. ;

    ;;;--------------------------------------------------------------;

    ;;; Действие: Добавьте функцию проверки параметров, чтобы точка с запятой (;)

    ;;; function won’t crash a program if it is passed a ;

    ;;; null value, or some other kind of data type than a ;

    ;;; 3D point. ;

    ;;;--------------------------------------------------------------;

    (defun 3dPoint->2dPoint (3dpt)

    (list (float(car 3dpt)) (float(cadr 3dpt)))

    )

    Обратите внимание, что заголовок содержит указания о дальнейшей доработке данной функции. Для того чтобы приобрести дополнительный опыт, можно подумать о том как усовершенствовать функцию, чтобы защитить функцию от аварийного завершения из-за неверного ввода данных.

    Совет: используйте функции numberp и listp…

    (listp '(1 1 0)) => T

    (numberp 3.4) => T

     


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