ADN Club > AutoLisp / VisualLISP и DCL
Что не так в коде лиспа, который строит ВЛ в плане по полилинии?
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) в начале выполнения функции.
Навигация
Перейти к полной версии