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

Автор Тема: Что не так в коде лиспа, который строит ВЛ в плане по полилинии?  (Прочитано 11304 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн pashuhaАвтор темы

  • ADN OPEN
  • Сообщений: 3
  • Карма: 0
Здравствуйте! Запускаем лисп командой (lep "имя блока опоры" "имя блока стрелки"), выбираем полилинию получаем отрисованную в плане ЛЭП. Проблема в следующем, если затем выбрать другую полилинию, то отрисовка начинается не с начала, а с последней вершины предыдущей полилинии. Прошу помочь.
Код - Auto/Visual Lisp [Выбрать]
  1.    (defun lep (op st)
  2.     ;;;  Получаем примитив
  3.       (setq pln (entget (car (entsel))))
  4.     ;;;  Получаем подсписок с DXF-кодом 10
  5.       (while (setq el (car pln))
  6.         (if (= 10 (car el))
  7.           (progn
  8.     ;;; Получаем точку с координатами текущей вершины полилинии
  9.       (setq pt1 (list (cadr el) (caddr el)))
  10.     ;;; Вставляем блок опоры
  11.       (command "_insert" op pt1 1.0 1.0 0.0)
  12.       (if pt2
  13.         (progn
  14.     ;;; Вставляем блок опоры в предидущую вершину
  15.           (command "_insert" op pt2 1.0 1.0 0.0)
  16.     ;;;     Получаем углы поворота стрелок
  17.           (setq ang1 (rad_grad (angle pt1 pt2)))
  18.           (setq ang2 (rad_grad (angle pt2 pt1)))
  19.     ;;;     Вставляем стрелки
  20.           (command "_insert" st pt1 1.0 1.0 ang1)
  21.           (command "_insert" st pt2 1.0 1.0 ang2)
  22.         )
  23.       )
  24.           )
  25.         )
  26.     ;;;    Следующая вершина
  27.         (setq pln (cdr pln))
  28.     ;;;    Сохраняем точку текущей вершины
  29.         (setq pt2 pt1)
  30.       )
  31.     )
  32.     ;;; Преобразует радианы в градусы
  33.     (defun rad_grad (rad / grad)
  34.       (setq grad (* rad (/ 180 pi)))
  35.     )
  36.  
« Последнее редактирование: 09-04-2015, 12:43:22 от pashuha »

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Приветствую на форуме! Сразу же выполни форматирование кода, как указано у меня в подписи.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение pashuha 09-04-2015, 13:24:47

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Замени строку:
Код - Auto/Visual Lisp [Выбрать]
  1. (defun lep (op st)
на
Код - Auto/Visual Lisp [Выбрать]
  1. (defun lep (op st / pt1 pt2 ang1 ang2 pln)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн pashuhaАвтор темы

  • ADN OPEN
  • Сообщений: 3
  • Карма: 0
Благодарю за оперативность, все работает как нужно!

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Отлично. Реально же ошибка заключалась в том, что у тебя в начале функции не чистилась переменная pt2 и при первом запуске вероятно она была nil, а при следующем запуске она имела то значение, которое оставалось от первого запуска. Внесение этой, а так же и других переменных в список локальных переменных в частности исправил эту ситуацию, т.к. локальные переменные чистятся (т.е. их значение nil) в начале выполнения функции.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Дима_

  • ADN Club
  • ****
  • Сообщений: 473
  • Карма: 66
(while (setq el (car pln))
        (if (= 10 (car el))...
рекомендую изучить функционал автолиспа для обработки списков :)

Оффлайн pashuhaАвтор темы

  • ADN OPEN
  • Сообщений: 3
  • Карма: 0
(while (setq el (car pln))
        (if (= 10 (car el))...
рекомендую изучить функционал автолиспа для обработки списков :)
Спасибо, буду изучать основы.