Меню

Ошибка неверный тип аргумента lselsetp nil как исправить

Вопрос:

В настоящее время я пытаюсь запустить полилинию между двумя блоками (first_block, second_block), которая проходит вдоль другой полилинии, в конце действия вызывается функция вставки, которая заполняет блок аннотаций (cable_name_tag) деталями начального и конечного блоков,

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

Я заметил, что если я прокомментирую second_block и предоставил кодированное значение, функция ssget работает без проблем, поэтому я уверен, что проблема связана либо с синтаксисом, либо с обработкой first_block и second_block в этом коде.

(defun c:cable ()
(vl-load-com)
(setvar "clayer" "cable layer")
(setvar "celtype" "bylayer")
(setvar "osmode" 515)
(command "_.pline"
(getpoint))
(while (> (getvar ' cmdactive) 0)
(command pause)
(princ "npress enter to finish:"))
(setq elst
(entsel "nselect cable segment: "))
(setq ename
(car elst))
(setq pt
(cadr elst))
(setq annopt pt)
(setq pt
(vlax-curve-getclosestpointto ename pt))
(setq param
(vlax-curve-getparamatpoint ename pt))
(setq preparam
(fix param))
(setq postparam
(1+ preparam))
(list (setq pt1
(vlax-curve-getpointatparam ename preparam))
(setq pt2
(vlax-curve-getpointatparam ename postparam)))
(setq cable
(entlast))
(setq cable_start
(vlax-curve-getstartparam cable))
(setq cable_start_point
(vlax-curve-getstartpoint cable))
(setq cable_end_point
(vlax-curve-getendpoint cable))
(setq cable_end
(angtos (angle '(0 0)
(vlax-curve-getfirstderiv cable 0.0))))
(setq first_block
(ssget "_c" cable_start_point cable_end_point
(list (cons 0 "insert")
(cons 2 "first_block"))))
(setq second_block
(ssget "_c" cable_start_point cable_end_point
(list (cons 0 "insert")
(cons 2 "second_block"))))
(setq end_cable
(ssname second_block 0))
(setq start_cable
(ssname first_block 0))
(setq $end_cable
(vla-get-textstring
(cadr (vlax-safearray->list
(variant-value
(vla-getattributes
(vlax-ename->vla-object end_cable)))))))
(setq $start_cable
(vla-get-textstring
(cadr (vlax-safearray->list
(variant-value
(vla-getattributes
(vlax-ename->vla-object start_cable)))))))
(setq cable_name
(vlax-curve-getendparam cable))
(command ; insert cable param
"-insert"
"cable_name_tag"
annopt
"1"
"1"
cable_angle
cable_name
$start_cable
$end_cable
"144"
cable_length))

Я застрял в углу на этом, и буду признателен за любую помощь, советы или указатели, которые может предложить любой.

Спасибо всем за ваше время.

Ответ №1

Почему бы просто не использовать (entlast) для получения только что созданного объекта?

Перейти к содержимому раздела

Форумы CADUser

Информационный портал для профессионалов в области САПР

Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.

Дерево сообщений Активные темы Темы без ответов

Форумы CADUser → Autodesk → AutoCAD → Ошибка: «AutoCAD menu utilities loaded.; error: bad argument type: lselsetp nil»

Страницы 1

Чтобы отправить ответ, вы должны войти или зарегистрироваться

#1 16 октября 2003г. 16:34:28

  • Апельсинов
  • Восстановленный участник
  • На форуме с 19 марта 2003г.
  • Сообщений: 83
  • Спасибо: 0

Тема: Ошибка: «AutoCAD menu utilities loaded.; error: bad argument type: lselsetp nil»

При запуске Акада (2002) и при открытии файла, в командной строке появляется сообщение:
AutoCAD menu utilities loaded.; error: bad argument type: lselsetp nil
В чем дело? Может кто нибудь знает?
См. также https://www.caduser.ru/forum/topic6362.html
Костя (2003-10-16 15:02:42)

#2 Ответ от Эдуард Смолянка 16 октября 2003г. 16:49:39

  • Эдуард Смолянка
  • Восстановленный участник
  • На форуме с 23 апреля 2003г.
  • Сообщений: 795
  • Спасибо: 0

Re: Ошибка: «AutoCAD menu utilities loaded.; error: bad argument type: lselsetp nil»

> Апельсинов
Скорее всего это ошибка в Лиспе загрузку которого вы прописали в acaddoc.lsp

#3 Ответ от Апельсинов 16 октября 2003г. 17:24:13

  • Апельсинов
  • Восстановленный участник
  • На форуме с 19 марта 2003г.
  • Сообщений: 83
  • Спасибо: 0

Re: Ошибка: «AutoCAD menu utilities loaded.; error: bad argument type: lselsetp nil»

И правда, только, по своей отсталости, Мы прописали ее  в acad.mnl.
А как Вы догадались? Вы наверное даже знаете что там за ошибка? Мы были бы Вам очень признательны, если бы Вы Нам написали что в той программке Нам нужно исправить, чтобы Нам больше не появлялось сообщение об ошибке в Нашей командной строке Нашего Автокада. Для Вас, с Вашими возможностями, и Вашей проницательностью, Мы думаем, это не составит труда.
А так-же, Мы надеемся, что Вы разъясните Нам конкретные причины появления досадной ошибки, дабы впоследующем избежать Вам Наших вопросов по данной теме.

#4 Ответ от Геннадий aka PG 16 октября 2003г. 17:32:01

  • Геннадий aka PG
  • Восстановленный участник
  • На форуме с 4 апреля 2002г.
  • Сообщений: 1,348
  • Спасибо: 0

Re: Ошибка: «AutoCAD menu utilities loaded.; error: bad argument type: lselsetp nil»

> Апельсинов
Ну после таких слов Эдуард должен, просто обязан помочь
🙂

#5 Ответ от Эдуард Смолянка 16 октября 2003г. 22:10:53

  • Эдуард Смолянка
  • Восстановленный участник
  • На форуме с 23 апреля 2003г.
  • Сообщений: 795
  • Спасибо: 0

Re: Ошибка: «AutoCAD menu utilities loaded.; error: bad argument type: lselsetp nil»

> Апельсинов
Похоже это или иностранный флейм или
обычное русское хамство.

#6 Ответ от kos 17 октября 2003г. 09:30:50

  • kos
  • Восстановленный участник
  • На форуме с 6 марта 2002г.
  • Сообщений: 637
  • Спасибо: 0

Re: Ошибка: «AutoCAD menu utilities loaded.; error: bad argument type: lselsetp nil»

> Апельсинов

error: bad argument type: lselsetp nil

Эта ошибка возникает из-за того, что в Вашем .mnl производится какое-то действие с набором примитивов, а самого набора ка раз и нет (nil).
______________
Удачи.

#7 Ответ от Апельсинов 17 октября 2003г. 11:16:33

  • Апельсинов
  • Восстановленный участник
  • На форуме с 19 марта 2003г.
  • Сообщений: 83
  • Спасибо: 0

Re: Ошибка: «AutoCAD menu utilities loaded.; error: bad argument type: lselsetp nil»

> Эдуард
Вот те раз! Да где же хамство?!
Просьба это слезная, проявить родительские чуства к детищу своему, такие фортеля выкидывающему. Имя то ему xref2.lsp, не бросайте ребеночка, шалит.

#8 Ответ от DMS 7 апреля 2004г. 13:10:39

  • DMS
  • Восстановленный участник
  • На форуме с 9 августа 2002г.
  • Сообщений: 477
  • Спасибо: 0

Re: Ошибка: «AutoCAD menu utilities loaded.; error: bad argument type: lselsetp nil»

> kos
Сегодня столкнулся с этой байдой

bad argument type: lselsetp nil

и нашёл причину!
Возникает при работе с набором примитивов невидимых на экране, находящихся где-либо в стороне, помогло

Сообщения 8

Тему читают: 1 гость

Страницы 1

Чтобы отправить ответ, вы должны войти или зарегистрироваться

Форумы CADUser → Autodesk → AutoCAD → Ошибка: «AutoCAD menu utilities loaded.; error: bad argument type: lselsetp nil»


ГЕОДЕЗИСТ.RU


Добро пожаловать!

Войдите или зарегистрируйтесь сейчас!

Войти

Geo_Export (AutoCAD 2010)

Тема в разделе «Общие вопросы», создана пользователем Стас Пушкин, 30 окт 2015.

Fast Quotes


  1. Стас Пушкин

    Стас Пушкин

    Регистрация:
    28 окт 2015
    Сообщения:
    10
    Симпатии:
    2

    ::apstenu::
    Всем привет ! Такая вот проблема.
    Хотелось в атокаде экспортировать точки в блокнот.
    Программу загрузил,при показываний образца пишет «ошибка: неверный тип аргумента: lselsetp nil «

    Все мои координаты находятся в разделе (Лист 1 ) а при переходе на( модель),я пробую начертить линию,вызываю гео экспорт и программа работает,выбирает линию.
    Как заставить ее чтоб она работала в разделе Лист 1 ???

    #1


    Стас Пушкин,
    30 окт 2015


  2. АлексейМанс

    АлексейМанс

    Форумчанин

    Регистрация:
    22 май 2011
    Сообщения:
    4.035
    Симпатии:
    3.878
    Адрес:

    Екатеринбург

    О_О О_О О_О
    сорян, но с таким еще не сталкивался… в разлеле Лист ж… там жеж… миллиметры пространства печати… Или вы именно в пространстве листа умудрятесь ПСК создавать? Зачем?! о_О

    #2


    АлексейМанс,
    30 окт 2015


  3. -=13=-

    -=13=-

    Форумчанин

    Регистрация:
    26 июн 2013
    Сообщения:
    2.260
    Симпатии:
    3.319
    Адрес:

    Окраины Нерезиновска на немцеопасном направлении

    Тут явное незнание Autocad.
    Все лиспы по работе с координатами и геометрией работают только в модели.
    С листами разве что только заточенные на оформление.

    #3


    -=13=-,
    30 окт 2015


    hp_pro и АлексейМанс нравится это.


  4. Стас Пушкин

    Стас Пушкин

    Регистрация:
    28 окт 2015
    Сообщения:
    10
    Симпатии:
    2

    У нас на работе все координаты созданы в разделе Лист..
    Не знай почему не в модели…

    #4


    Стас Пушкин,
    30 окт 2015

(Вы должны войти или зарегистрироваться, чтобы ответить.)

Показать игнорируемое содержимое

Поделиться этой страницей

  • Войти через Google
  • Log in with VK
Ваше имя или e-mail:
У Вас уже есть учётная запись?
  • Нет, зарегистрироваться сейчас.
  • Да, мой пароль:
  • Забыли пароль?

Запомнить меня

  1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie.
    Accept
    Узнать больше.

    Скрыть объявление

Когда Вы начнёте писать свои программы, то неизбежно столкнетесь с необходимостью решения проблем, которые в программировании носят название отладка программы.

Давайте рассмотрим некоторые технические приемы, которые помогут нам при создании новых программ на языке AutoLISP. К таким приемам относятся:

  • Проверка фрагментов кода в окне «КонсольVisual LISP».
  • Отслеживание парных кавычек.
  • Поиск парных скобок в процессе и после написания кода.
  • Использование окна «Контрольное значение»

Проверка фрагментов кода в окне «КонсольVisual LISP».

Вы можете проверить, насколько правильно вы понимаете синтаксис функции.

Давайте для примера рассмотрим функцию getpoint. Функция  getpoint  помогает нам задать координаты точки при помощи мыши. Давайте поищем эту функцию в справочной системе. Система выдаст следующую информацию. См. Рис. 1.

Отладка программы

Рис. 1. «Окно справка»

 Мы видим, что функция getpoint  имеет два аргумента.

Первый, из которых pt – это координаты точки.

А второй msg — текст, который будет показан пользователю.

При чем оба аргумента не являются обязательными. Это следует из того, что они заключены в квадратные скобки ( [pt] [msg] )

Давайте откроем окно «КонсольVisual LISP» щелкнув по одноименной кнопке. См. Рис. 2.

Отладка программы

Рис. 2.     Добавляем  (getpoint)

Введем функцию (getpoint) без аргументов и нажмем <Enter>.

Активным станем AutoCAD, где надо указать любую точку.

После указания точки, AutoCAD снова вернет нас в редактор Visual LISP.

В консоли появятся координаты указанной точки. См. Рис. 3.

Отладка программы

Рис. 3. Координаты указанной точки.

Теперь давайте попробуем использовать аргументы. Введем функцию с первым аргументом (getpoint pt) и нажмем <Enter>. См. Рис. 4.

Отладка программы

Рис. 4.  Ошибка:  не верный тип аргумента

Консоль выдаст нам сообщение об ошибке: неверный тип аргумента: point: nil.

Очевидно, переменная pt не содержит в себе значения. (значение nil означает, что аргумент не имеет значения). Давайте это проверим. Наберем в следующей строке pt и нажмем <Enter>. См. Рис. 5.

Отладка программы

Рис. 5.    Проверка значения переменной pt.

Консоль подтвердит наши предположения.

Давайте подставим, вместо pt координаты точки начало координат (getpoint (0 0 0)) и нажмем <Enter>. См. Рис. 6.

Отладка программы

Рис. 6.     Ошибка: неверная функция.

Консоль выдает сообщения об ошибке: неверная функция : 0. Скорее всего, координаты в скобках Visual LISP принял за функцию с именем 0 (вспоминаем, что после открывающийся скобки всегда следует имя функции). Как объяснить Visual LISP, что это не функция, а список координат? Для этого есть, два способа:

1)      После открывающийся скобки добавить функцию list(list 0 0 0)

2)      Или перед открывающийся скобкой поставить апостроф: (0 0 0)

Давайте снова напишем функцию, но уже с апострофом (getpoint (0 0 0)) и нажимаем <Enter>. См. Рис. 7.

Отладка программы

Рис. 7.    Добавляем (getpoint (0 0 0)).

Функция сделает активным AutoCAD и мы увидим, что указатель мыши как будто привязан ниточкой к началу координат. См. Рис. 8.

Отладка программы

Рис. 8.   Точка задается относительно другой точки.

И теперь мы можем задать точку, относительно другой точки, координаты которой являются первым аргументом функции getpoint. Щелкните в любом месте, и консоль вернет координаты выбранной точки. См. Рис. 9.

Отладка программы

Рис. 9. Координаты указанной точки.

Давайте теперь разберемся со вторым аргументом. Напомню, что это msg — текст, который будет показан пользователю. Поскольку это текст (string), то писать его нужно в кавычках. Давайте добавим к нашей функции надпись: “Проверка”. См. Рис. 10.

Отладка программы

Рис.. 10.    Добавляем (getpoint(0 0 0) «Проверка»)

Нажимаем <Enter>. И видим, что наша надпись появилась в командной строке. См. Рис. 11.

Отладка программы

Рис. 11. Надпись в командной строке.

Очевидно, что второй аргумент функции getpoint, выдает подсказку пользователю, что в данный момент ему нужно сделать.

Давайте посмотрим пример применения этой функции в программе my_otr, которую я приводил в уроке: Построение отрезков в AutoCAD.

Открываем эту программу, выделяем вторую и третью строки и нажимаем на кнопку «Загрузить выделенный фрагмент». См. Рис. 12.

Отладка программы

Рис. 12. Загрузка выделенного фрагмента.

Далее на просьбу в командной строке, выбираем первую точку (координаты этой точки при помощи функции присвоения setq запоминают в переменной р1). Появится следующая просьба. Вторую точку мы уже выбираем, ориентируясь на первую.

После указания второй точки в окне консоли появятся координаты выбранных точек. См. Рис. 13.

Отладка программы

Рис. 13.     Координаты выбранных точек.

Таким образом, мы проверили, как у нас работает выделенный фрагмент программы.

Я думаю, что после такова исследования, мы уже имеем четкое представление о том, как работает эта функция.

Отслеживание парных кавычек.

Раньше при написании кода в других текстовых редакторах одной из наиболее частых ошибок было не соблюдение правильного количества скобок и кавычек. Напомню, что количество открывающихся скобок и кавычек должно равняться количеству закрывающихся. В других текстовых редакторах отследить это было не всегда легко.

В 2000 году с появлением Visual LISP этот процесс стал значительно более простым.

Давайте начнем с простого и рассмотрим двойные кавычки. В Visual LISP применяется кодирование цветом, поэтому любая строка, заключенная в кавычки, на экране пурпурная. Кодирование цветом применяется в процессе ввода, поэтому после того, как вы поставили открывающиеся кавычки, остальная часть файла становится пурпурной до тех пор, пока вы не введете закрывающиеся кавычки. См. Рис. 14.

Отладка программы

Рис. 14.    Не закрытые кавычки.

Ставим в нужном месте закрывающиеся кавычки, и пурпурным сделается только текст, заключенный в кавычки с двух сторон. См. Рис. 15.

Отладка программы

Рис. 15.   Кавычки с двух сторон.

Стоит отметить, что в программах AutoLISP нужно всегда использовать кавычки вида “ ” (кавычки « » — не воспринимаются)

Поиск парных скобок в процессе и после написания кода.

С парными скобками все немного сложнее. Но в редакторе Visual LISP есть инструменты, которые помогают нам избежать лишних или недостающих скобок.

Прыгающий курсор.

Как только, в процессе написания кода новой программы, вы ставите закрывающую скобку, ваш курсор перескакивает к соответствующей ей открывающей. Если курсор не перескакивает, значит, вы поставили слишком много закрывающихся скобок (нет открывающийся скобки, к которой курсор мог бы переместиться). Если программа короткая, следить за перемещением курсора не сложно. В длинных программах следить за курсором сложнее, потому что в некоторых случаях открывающая скобка может находиться в не видимой области текущего окна.

Двойной щелчок возле скобок.

В редакторе Visual LISP проблема отслеживания перемещений курсора решена при помощи подсветки (выделения). Поместите курсор непосредственно перед  открывающейся скобкой или после закрывающейся и щелкните дважды левой кнопкой мыши. Все содержимое скобок станет подсвеченным. Теперь вы видите, где находится парная скобка. См. Рис. 16.

Отладка программы

Рис. 16.   Выделение содержимого скобок.

Если кавычки и скобки в вашей программе расставлены правильно, но программа все равно не работает, не отчаивайтесь, отнеситесь к поиску ошибок как к интересной задаче.

Для начала определите, как далеко продвинулась ваша программа, прежде чем прекратила работать. Это можно сделать, если проверить значения присвоенные переменным.

Типы переменных.

В программах AutoLISP используются два типа переменных:

1) Системные переменные, которые описаны в AutoCAD (Пример: osmode).

2) Программные переменные, которые описаны и именованы вами.

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

Когда вы добавляете  в свою программу новую переменную, то по умолчанию она глобальная. Для того, чтобы она стала локальной ее нужно добавить в список временных переменных функции defun. См. Рис. 17.

Отладка программы

Рис. 17.    Список временных переменных.

Окно «Контрольное значение»

Для проверки значения переменных удобнее всего использовать окно «Контрольное значение». Для того, чтобы добавить переменную в это окно, поместите курсор на имени переменной р1 и нажмите на кнопку «Добавить контрольное значение». См. Рис. 18.

Отладка программы

Рис. 18. Добавление переменных в окно «Контрольное значение».

Появится окно «Добавление контрольных значений», в котором нажимаем кнопку «ОК».

Наша переменная появится в окне «Контрольное значение». См. Рис. 19.

Отладка программы

Рис. 19. Окно «Контрольное значение».

Чтобы окно «Добавление контрольных значений» не появлялось, а переменные сразу попадали в окно «Контрольное значение», переменную нужно выделить.

Давайте добавим в это окно и другие переменные.

Когда окно «Контрольное значение» открыто, можно добавлять переменные через кнопку «Добавить контрольное значение» расположенную в этом окне. См. Рис. 20.

Отладка программы

Рис. 20.   Кнопка  «Добавить контрольное значение».

Теперь для того, чтобы увидеть значения переменных, после того как программа прекратила работать, нам необходимо все переменные сделать глобальными. Для этого их нужно убрать из списка временных переменных функции defun.

Затем загрузить нашу программу, нажав на кнопку «Загрузить активное окно редактора». См. Рис. 21.

Отладка программы

Рис. 21.   Загрузка программы.

Далее переходим в AutoCAD, нажав на кнопку «Активизация AutoCAD».

Набираем в командной строке mp_kub. См. Рис. 22.

Отладка программы

Рис. 22.  Вводим в командной строке mp_kub

Нажимаем <Enter> и на просьбу, указать базовую точку, указываем любую точку в рабочем окне AutoCAD.

Наша программа, которая должна была нарисовать куб. Этого не сделала.

Давайте вернемся в редактор Visual LISP и посмотрим в окно «Контрольное значение». См. Рис. 23.

Отладка программы

Рис. 23. Окно «Контрольное значение»

Мы видим, что переменные р1 и р2 имеют значения, а все остальные переменные нет. Очевидно, что ошибка произошла при расчете переменной р3. Находим эту строчку в программе и видим, что координаты точки р3 рассчитываются относительно самой себя. А должны были рассчитываться относительно точки р2.

Давайте, исправим ошибку, и снова загрузим нашу программу.

Перейдем в AutoCAD, набираем в командной строке mp_kub и нажмем <Enter>.

Указываем базовую точку, и наша программа нарисует куб. См. Рис. 24.

Отладка программы

Рис. 24. Программа нарисовала куб.

Ура заработала!!!

Давайте снова  вернемся в редактор Visual LISP и посмотрим в окно «Контрольное значение». См. Рис. 25.

Отладка программы

Рис. 25.   Все переменные имеют значение.

Мы видим, что все наши переменные имеют значения.

После того, как программа отлажена:

  1. Нужно вернуть все локальные переменные в список временных переменных функции defun.
  2. Сохранить свою LISP-программу.
  3. Закрыть редактор Visual LISP и AutoCAD, чтобы очистить все значения переменных. Этот шаг очень важен. Возможно, что некоторые переменные всё еще сохраняют присвоенные им значения.

Теперь давайте снова запустим  AutoCAD и редактор Visual LISP. Откроем окно «Контрольное значение». Если переменные исчезли, то добавьте их снова. См. Рис. 26.

Отладка программы

Рис. 26.   Все переменные не имеют значений.

Мы видим, что все переменные не имеют значений.

Теперь давайте рассмотрим, как отслеживать значения переменных во время выполнения программы.

Для этого нам необходимо в программе поставить точки останова – места, в которых во время выполнения программа будет останавливаться.

Для этого помещаем курсор в то место программы, где мы хотели бы установить точку останова и нажимаем на кнопку «Точка останова вкл/выкл». См. Рис. 27.

Отладка программы

Рис. 27.   Точка останова.

Точка останова выделится красным.

Давайте добавим еще пару точек останова, загрузим программу и перейдем в AutoCAD. См. Рис. 28.

Отладка программы

Рис. 28.    Добавляем точки останова и загружаем программу.

Набираем в командной строке mp_kub. Нажимаем <Enter> и на просьбу, указать базовую точку, указываем любую точку в рабочем окне AutoCAD.

AutoCAD вернет нас в редактор Visual LISP, и мы увидим, что наша программа остановилась в первой точки останова. См. Рис. 29.

Отладка программы

Рис. 29.   Первая точка останова.

Обратим внимания на окно «Контрольное значение». В данной точки останова переменная р1 уже имеет текущее значение. Для продолжения программы нажимаем на кнопку «Продолжить». См. Рис. 30.

Отладка программы

Рис. 30.   Следующая точка останова.

Наша программа остановиться в следующей точке останова. В этой точке уже пять переменных будут иметь свои текущие значения.

Снова нажимаем на кнопку «Продолжить». См. Рис. 31.

Отладка программы

Рис. 31.   Последняя точка останова.

Программа остановиться в последней точке останова. В этой точке уже все переменные имеют свои текущие значения.

Для того чтобы завершить выполнение программы, снова нажимаем на кнопку «Продолжить».

В конце программы мы снова окажемся в  AutoCAD, где будет нарисован куб. См. Рис. 32.

Отладка программы

Рис. 32.    Программа нарисовала куб.

Теперь давайте вернемся в редактор Visual LISP и посмотрим в окно «Контрольное значение». См. Рис. 33.

Отладка программы

Рис. 33.     Все переменные не имеют значений.

По окончании программы все переменные снова не имеют значений.

Таким образом, используя точки останова и окно «Контрольное значение», можно отслеживать значения переменных в любой точке во время выполнения программы.

Чтобы удалить все точки останова по окончании работы с ними, нажмите клавиши <Shift>+<Ctrl>+<F9>.

И так в этом уроке мы рассмотрели основные приемы отладки программы AutoLISP.

К этим приемам относятся:

  • Проверка фрагментов кода в окне «Консоль Visual LISP».
  • Отслеживание парных кавычек.
  • Поиск парных скобок в процессе и после написания кода.
  • Использование окна «Контрольное значение»

Искренне надеюсь, что отладка программ AutoLISP стала для Вас теперь легкой, занимательной головоломкой.

Пишите в комментариях:

Была ли для Вас полезной информация, данная в этом уроке?

Какие способы отладки используете Вы?

На какие вопросы программирования, Вы хотели бы, увидит ответы в следующих уроках?

Я с удовольствием отвечу на ваши комментарии.

Если вы хотите получать новости с моего сайта. Оформляйте подписку.

До новых встреч.

 «Автор: Михаил Орлов»

Google

Также на эту тему Вы можете почитать:

  • Печать

Страницы: [1]   Вниз

Тема: Выбор по гиперссылке  (Прочитано 3100 раз)

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

Имеется несколько полилиний с присвоенными гиперссылками. На полилиниях расположены блоки с гиперссылками, соответствующими гиперссылке линии. Сейчас я выбираю нужные мне блоки по слою, по цвету. Как добавить условие выбора по гиперссылке?

  1. (defun c:55 (/)

  2. (setq trassa (car (entsel «Укажите трассу >»)))

  3. (vlax-for hp (vla-get-hyperlinks (vlax-ename->vla-object trassa))

  4. (setq NameOb (vla-get-url hp))

  5. )

  6. ;;; (alert NameOb)

  7. (setq vla_curve   (vlax-ename->vla-object trassa)

  8.        LayerTrassa (cdr (assoc 8 (entget trassa)))

  9.        ColorTrassa (cdr (assoc 62 (entget trassa)))

  10.        ss_trassa   (mapcarcdr (vl-remove-if-not(lambda (x) (= (car x) 10)) (entget trassa)))

  11. )

  12. (vl-cmdf «_.zoom» «_Object» trassa «»)

  13. (setq nabor (ssget «_X» (list (cons 0 «insert») (cons 8 LayerTrassa) (cons 62 ColorTrassa))))

  14. (SSSETFIRST nabor nabor)

  15. )

« Последнее редактирование: 15-03-2021, 12:47:34 от Александр Ривилис »


Записан


1958,
Правило форматирования кода у нас на форуме у меня в подписи.
Фильтра по гиперссылке нет. Точнее нет фильтра по конкретной гиперссылке. Но можно отфильтровать по самому факту наличия у полилинии гиперссылки:

  1. (setq ss (ssget «_X»((0 . «*POLYLINE») (3 («PE_URL»)))))


Записан


Прошу прощения за неправильное форматирование кода (в очередной раз  )
Теперь пара вопросов:
1. Почему не получается выбрать блоки (setq ss (ssget «_X» ‘((0 . «insert») (8 . LayerTrassa) (62 . ColorTrassa) (-3 («PE_URL»)))))
2. Если отбросить выбор по кодам 8 и 62, набор создается. Можно перебрать элементы набора, сравнить гиперссылки на равенство с нужным значением, если равны, то как добавить этот элемент в другой набор? Что-то у меня не получается.

  1. (defun c:55 (/)

  2. (setq nabor        (ssadd)

  3.        nabor        nil

  4.        PO_OutptData (ssadd)

  5.        PO_OutptData nil

  6.        NameOb       «12»

  7.        hp           «23»

  8.        trassa       (car (entsel «Укажите трассу >»))

  9. )

  10. (vlax-for hp (vla-get-hyperlinks (vlax-ename->vla-object trassa))

  11. (if (setq NameOb (vla-get-url hp))

  12.    NameOb

  13. )

  14. )

  15. ;;; (alert (strcat «имя трассы  » NameOb))

  16. (setq OutFile     (strcat NameOb «.CSV»)

  17.        vla_curve   (vlax-ename->vla-object trassa)

  18.        LayerTrassa (cdr (assoc 8 (entget trassa)))

  19.        ColorTrassa (cdr (assoc 62 (entget trassa)))

  20.        ss_trassa   (mapcarcdr (vl-remove-if-not(lambda (x) (= (car x) 10)) (entget trassa)))

  21. )

  22. ;;;Зуммирование экрана, чтобы вся трасса была видна

  23. (vl-cmdf «_.zoom» «_Object» trassa «»)

  24. (setq ss  (ssget «_X»

  25.                   ‘((0 . «insert»)

  26. ;;;                    (8 . LayerTrassa) (62 . ColorTrassa)

  27. (3 («PE_URL»))

  28. )

  29. )

  30.        ips 0

  31. )

  32. (alert (vl-prin1-to-string (sslength ss)))

  33. (while (< ips (sslength ss))

  34. (setq obj (ssname ss ips))

  35. (vlax-for hp (vla-get-hyperlinks (vlax-ename->vla-object obj))

  36. (setq hp_obj (vla-get-url hp)

  37.          ips    (1+ ips)

  38. )

  39. )

  40. ;;;  (alert hp_obj)

  41. (if (= hp_obj NameOb)

  42. (ssadd (entget obj) nabor)

  43. )

  44. )

  45. (sssetfirst nabor nabor)

  46. )


Записан


1. Почему не получается выбрать блоки (setq ss (ssget «_X» ‘((0 . «insert») (8 . LayerTrassa) (62 . ColorTrassa) (-3 («PE_URL»)))))

Наверное потому, что вы недостаточно знаете lisp.
Должно быть приблизительно так:

  1. (setq ss (ssget «_X» (list(0 . «insert») (cons 8 LayerTrassa) (cons 62  ColorTrassa)(3 («PE_URL»)))))


Записан


Это правда. Мои познания дилетантские. Но и ваш вариант не работает.
Укажите трассу >
** Error: неверный тип аргумента: lselsetp nil **


Записан


Если цвет выбранного примитива установлен «ПоСлою», то ColorTrassa будет равна nil. Для фильтрации (если не ошибаюсь) надо устанавливать ColorTrassa в 256


Записан


  1. (setq ss (ssget «_X» (list(0 . «insert») (cons 8 LayerTrassa) (cons 62 (cond(ColorTrassa) (t 256)))(3 («PE_URL»)))))


Записан


Если цвет выбранного примитива установлен «ПоСлою», то ColorTrassa будет равна nil. Для фильтрации (если не ошибаюсь) надо устанавливать ColorTrassa в 256

Цвет примитивов задан не «ПоСлою», он задается свой для каждой линии и блоков, расположенных вдоль этой линии. Ваш код также не работает. Если убрать выбор по слою и по цвету, то выбор выполняется. Мне надо выбрать блоки, которые расположены непосредственно по указываемой линии. Не хочется перебирать кучу ненужных блоков. Ну, да ладно с этими слоями и цветом, в принципе блоков, содержащих гиперссылку, не так много. Как мне отобрать из полученного набора блоки, которые содержат нужную гиперссылку? В выше приведенном мною коде что-то не получается.


Записан


Кха, я не обратил внимания — а что будет, если вместо

  1. (setq ss (ssget «_X» (list(0 . «insert») (cons 8 LayerTrassa) (cons 62 (cond(ColorTrassa) (t 256)))(3 («PE_URL»)))))

сделать

  1. (setq ss (ssget «_X» (list(0 . «insert») (cons 8 LayerTrassa) (cons 62 (cond(ColorTrassa) (t 256))) (3 («PE_URL»)))))


Записан


Для примера привожу кусок чертежа. Зелеными кружками показаны блоки с гиперссылкой. Они расположены на линии фиолетового цвета с такой же гиперссылкой.


Записан


Кха, я не обратил внимания — а что будет, если вместо

  1. (setq ss (ssget «_X» (list(0 . «insert») (cons 8 LayerTrassa) (cons 62 (cond(ColorTrassa) (t 256)))(3 («PE_URL»)))))

сделать

  1. (setq ss (ssget «_X» (list(0 . «insert») (cons 8 LayerTrassa) (cons 62 (cond(ColorTrassa) (t 256))) (3 («PE_URL»)))))

Не работает. :(
Укажите трассу >
** Error: неверная функция: «PE_URL» **


Записан


Не работает. :(
Укажите трассу >
** Error: неверная функция: «PE_URL» **

Ну тогда так:

  1. (setq ss (ssget «_X» (list(0 . «insert») (cons 8 LayerTrassa) (cons 62 (if ColorTrassa ColorTrassa 256))(3 («PE_URL»)))))


Записан


Ну тогда так:
Код — Auto/Visual Lisp [Выбрать]
(setq ss (ssget «_X» (list ‘(0 . «insert») (cons 8 LayerTrassa) (cons 62 (if ColorTrassa ColorTrassa 256)) ‘(-3 («PE_URL»)))))

Так тоже не получается:
Команда: 55
Укажите трассу >
** Error: неверный тип аргумента: lselsetp nil **

Для меня важнее следующее:

Ну, да ладно с этими слоями и цветом, в принципе блоков, содержащих гиперссылку, не так много. Как мне отобрать из полученного набора блоки, которые содержат нужную гиперссылку? В выше приведенном мною коде что-то не получается.


Записан


Для меня важнее следующее:
Цитата: 1958 от 15-03-2021, 18:32:57
Ну, да ладно с этими слоями и цветом, в принципе блоков, содержащих гиперссылку, не так много. Как мне отобрать из полученного набора блоки, которые содержат нужную гиперссылку? В выше приведенном мною коде что-то не получается.

А-ха-ха! Зачем я в третьей строке делал обнуление? Убрал эту строку, всё работает! (Естественно без выбора LayerTrassa и ColorTrassa).
Прошу прощения за доставленные хлопоты.


Записан


  • Печать

Страницы: [1]   Вверх

Мне пришлось изменить стили текста и атрибуты ширины нескольких блоков в Autocad. Было 10-30 блоков на каждого dwg и почти 100 dgg, и я не мог потрудиться вручную конвертировать каждый блок в новый стандарт.

https: // forums.autodesk.com/t5/visual-lisp-autolisp-and-general/attribute-width-change/td-p/1525357 по этой ссылке есть скрипт для изменения ширины всех блоков (блоков заголовков и нескольких электрических символов) на 1, и в качестве первого прохода он делает то, что я хочу (сбой из-за bad ; error: bad argument type: lentityp nil Command:, который после его изменения выбирается вручную и просто выбирается блоки, которые я хочу исправить это). Однако мне также нужно изменить стиль теста с того, что он есть, на «Стандарт» https://www.afralisp.net/reference/dxf-group-codes. PHP После проверки этой ссылки я обнаружил, что «Имя стиля текста» — это код dxf 7 поэтому я изменил сценарий к следующему.

(defun C:StandardFromDWGTEXT (/ ss sslen cnt blck ent entinfo)
  (setq ss (ssget))
  (setq cnt 0)
  (setq sslen (sslength ss))
  (while (< cnt sslen)
    (setq blck (ssname ss cnt))
    (setq ent (entnext blck))
    (setq entinfo (entget ent))
    (while
      (and ent (= (cdr (assoc 0 entinfo)) "ATTRIB"))
       (entmod (subst (cons 41 1) (assoc 41 entinfo) entinfo))
;;;    (entupd ent)
;;;    (setq ent (entnext ent))
;;;    (setq entinfo (entget ent))    
       (entmod (subst (cons 7 "Standard") (assoc 7 entinfo) entinfo))
       (entupd ent)
       (setq ent (entnext ent))
       (setq entinfo (entget ent))      
    )
    (setq cnt (1+ cnt))
  )
  (princ)
)

Теперь он работает только с закомментированными строками (перестает работать с ними, но это также означает, что он меняет только стиль текста, а не ширину) и только половина раза меняет стиль текста. Мне удалось пройти через все файлы, перезагружая auto-cad произвольно, а иногда, когда он не работал (не работает, значит, ничего не меняется, когда я этого ожидаю), открывая скрипт в визуальном редакторе lisp и нажимая на окно load active, исправляет его. Я бы положил это рядом со мной, но в интересах обучения, и, поскольку мне уже приходилось менять стандарт дважды, есть большая вероятность, что мне придется сделать это снова, я хочу попытаться это исправить.

Учитывая то, что сценарий с простым изменением ширины на 1 работает 100% времени, я решил, что проблема не в том, чтобы добавить его в набор автозагрузки / открыть его в редакторе визуальных шрифтов, а скорее в моем добавлении к самому коду. Однако строка, которую я добавил, чтобы изменить стиль текста (entmod (subst (cons 7 "Standard") (assoc 7 entinfo) entinfo)) не отличается от строки для изменения ширины текста.

Если у кого-то есть понимание, я буду признателен. У меня есть опыт работы с другими языками программирования, но я начинающий, когда дело доходит до Autolisp / lisp.

2 ответа

Лучший ответ

Есть несколько проблем, которые могут испортить ваш код:

  • (setq ss (ssget))

    Без аргумента списка фильтров, разрешающего только приписанные блоки, ваш выбор может включать любой тип сущности, то есть вызов entnext вернет вызов nil для любых объектов без субтитр. Следовательно, вызов entget вернет следующую ошибку, свидетелем которой вы являетесь:

    ошибка: неверный тип аргумента: lentityp nil

    Решение состоит в том, чтобы включить список фильтров, чтобы разрешить только выбор приписанных блоков:

    (setq ss (ssget "_:L" '((0 . "INSERT") (66 . 1))))
    

    Строка режима _:L также исключает объекты на заблокированных слоях.

  • (setq sslen (sslength ss))

    Без проверки правильности выбора переменная ss может быть nil, что приведет к (sslength ss) возвращению ошибки:

    ошибка: неверный тип аргумента: lselsetp nil

  • (entmod (subst (cons 41 1) (assoc 41 entinfo) entinfo))
    (entmod (subst (cons 7 "Standard") (assoc 7 entinfo) entinfo))

    Здесь второе subst выражение заменяет группу 7 DXF в оригинале списке данных DXF, а не данные DXF, которые были изменены после замены группы 41 DXF. Это приведет к обращению изменения коэффициента ширины.


Внедрение исправлений для вышеуказанных проблем (и несколько других изменений) может привести к следующему коду:

(defun c:standardfromdwgtext ( / a i s x )
    (if (setq s (ssget "_:L" '((0 . "INSERT") (66 . 1))))
        (repeat (setq i (sslength s))
            (setq i (1- i)
                  a (entnext (ssname s i))
                  x (entget a)
            )
            (while (= "ATTRIB" (cdr (assoc 0 x)))
                (if (entmod (subst '(41 . 1.0) (assoc 41 x) (subst '(7 . "Standard") (assoc 7 x) x)))
                    (entupd a)
                )
                (setq a (entnext a)
                      x (entget  a)
                )
            )
        )
    )
    (princ)
)


2

Lee Mac
13 Авг 2019 в 20:43

Ошибка

плохой ; ошибка: неверный тип аргумента: lentityp nil

Является результатом использования пустой переменной для сущности.

Когда вы используете (setq ent (entnext blck)), вам следует проверить, не равен ли ему ноль.

(setq ent (entnext blck))
    (if ent
      (progn
        (setq entinfo (entget ent))

При устранении неполадок AutoLisp, когда вы видите lentityp или stringp = nil, тогда используемая вами переменная была установлена на nil, и вам нужно найти, где и почему.


0

mtaussie
13 Авг 2019 в 20:48

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

А вот еще интересные материалы:

  • Яшка сломя голову остановился исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного где ошибка
  • Ошибка неверный адрес эл почты или пароль при авторизации введите эл почту а не логин
  • Ошибка недоделка 5 букв сканворд