ADN Club > AutoLisp / VisualLISP и DCL

Что не так в коде лиспа, который строит ВЛ в плане по полилинии?

(1/2) > >>

pashuha:
Здравствуйте! Запускаем лисп командой (lep "имя блока опоры" "имя блока стрелки"), выбираем полилинию получаем отрисованную в плане ЛЭП. Проблема в следующем, если затем выбрать другую полилинию, то отрисовка начинается не с начала, а с последней вершины предыдущей полилинии. Прошу помочь.

--- Код - Auto/Visual Lisp [Выбрать] ---   (defun lep (op st)    ;;;  Получаем примитив      (setq pln (entget (car (entsel))))    ;;;  Получаем подсписок с DXF-кодом 10      (while (setq el (car pln))        (if (= 10 (car el))          (progn    ;;; Получаем точку с координатами текущей вершины полилинии      (setq pt1 (list (cadr el) (caddr el)))    ;;; Вставляем блок опоры      (command "_insert" op pt1 1.0 1.0 0.0)      (if pt2        (progn    ;;; Вставляем блок опоры в предидущую вершину          (command "_insert" op pt2 1.0 1.0 0.0)    ;;;     Получаем углы поворота стрелок          (setq ang1 (rad_grad (angle pt1 pt2)))          (setq ang2 (rad_grad (angle pt2 pt1)))    ;;;     Вставляем стрелки          (command "_insert" st pt1 1.0 1.0 ang1)          (command "_insert" st pt2 1.0 1.0 ang2)        )      )          )        )    ;;;    Следующая вершина        (setq pln (cdr pln))    ;;;    Сохраняем точку текущей вершины        (setq pt2 pt1)      )    )    ;;; Преобразует радианы в градусы    (defun rad_grad (rad / grad)      (setq grad (* rad (/ 180 pi)))    ) 

Александр Ривилис:
Приветствую на форуме! Сразу же выполни форматирование кода, как указано у меня в подписи.

Александр Ривилис:
Замени строку:

--- Код - Auto/Visual Lisp [Выбрать] ---(defun lep (op st)на

--- Код - Auto/Visual Lisp [Выбрать] ---(defun lep (op st / pt1 pt2 ang1 ang2 pln)

pashuha:
Благодарю за оперативность, все работает как нужно!

Александр Ривилис:
Отлично. Реально же ошибка заключалась в том, что у тебя в начале функции не чистилась переменная pt2 и при первом запуске вероятно она была nil, а при следующем запуске она имела то значение, которое оставалось от первого запуска. Внесение этой, а так же и других переменных в список локальных переменных в частности исправил эту ситуацию, т.к. локальные переменные чистятся (т.е. их значение nil) в начале выполнения функции.

Навигация

[0] Главная страница сообщений

[#] Следующая страница

Перейти к полной версии