Ошибка неверный тип аргумента or stringp symbolp nil


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

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

Войти

Статус темы:

Закрыта.

Страница 1 из 11


  1. BearDyugin

    Форумчанин

    Регистрация:
    30 ноя 2007
    Сообщения:
    2.702
    Симпатии:
    2.444
    Адрес:

    Сибирь

    Пользователь Disney разместил новый ресурс:

    Импорт координат из текстового файла в AutoCAD (версия 2.8) — Импорт координат из текстовых файлов форматов txt, sdr, csv и других в AutoCAD
    [​IMG]

    1. Файл. Доступна загрузка файлов с расширением txt, sdr и csv
    2. Разделитель. Выбираем что служит разделителем данных, доступно при расширении фала txt.
    3. Выбор строк.Если поставить галочку в чекбоксе, то будет доступен выбор строк из загруженного файла, если галочку убрать то будут загружены все данные из файла. К сожалению при ручном выборе строк есть ограничение, выбрать можно любое количество, но загрузятся не больше 256 строк.
    4. Формат данных. Возможна смены форматов данных, причём под Xподразумевается направление на Север.
    5. Основной объект. Выбираем объект, который будет построен(начерчен) по координатам из файла, при выборе объекта Блок, будет предложено выбрать имя блока из списка существующих в чертеже.
    6. Второстепенные объекты. Возможно подписать номер, отметку и описание каждой точки, если в качестве основного объекта будет выбран блок, и он содержит атрибуты, то значение может быть записано в атрибуты. Кроме данных, взятых из файла, можно задать новые:
      • Номер.формат ввода *#*, где * — префикссуффикс можно опустить, # — целое число.
      • Отметка.формат ввода — вещественное число, если ввести со знаком + или -, то оно будет прибавлено или отнято соответственно от отметки из файла.
      • Описание. свободный формат ввода.
    7. Слой.Для каждого объекта можно выбрать слой из списка уже существующих в чертеже или создать новый.
    8. Цвет.Для каждого объекта можно выбрать цвет.
    9. Высота текста. Устанавливаем высоту текста

    Узнать больше об этом ресурсе…

    #1

    Последнее редактирование: 8 фев 2023


  2. Sta1917

    Форумчанин

    Регистрация:
    23 мар 2009
    Сообщения:
    136
    Симпатии:
    7
    Адрес:

    СПб

    Disney Ставил на AutoCAD 2007 x32, удалось импортировать только *.csv с последовательным сохранением в csv(разделитель-запятая)->csv(MS DOS) при разделителе целой/дробной части точкой. При одинарном сохранении выдает ошибку.Импорт *.txt удавался только из файла созданного на другом компьютере в виде:


    пример txt (раскрыть)
    пример txt (свернуть)

    1,4765232.682,8704448.054,11.1
    2,4766802.925,8704525.166,22.2
    3,4767413.573,8701976.161,33.3
    4,4767389.205,8701148.875,44.4

    И то не всегда. Т.е. при выборе файла координаты он распознает, а при импорте выдает ошибку. Может там кодировка какая-должна быть, или где галочку в AutoCAD не поставил?

    Вложения:

    #2


  3. BearDyugin

    Форумчанин

    Регистрация:
    30 ноя 2007
    Сообщения:
    2.702
    Симпатии:
    2.444
    Адрес:

    Сибирь

    Добавил, качай версию 2.0, в описании смотри пункт #3Чем были созданы эти файлы?

    1. 30(с разделителями табуляции).txt

      Причина сбоя — лишние знаки табуляции, если открыть файл в Word-е и включить «отображение скрытых символов форматирования», то можно увидеть следующее

      , где — табуляция, — переход на новую строчку
      При разделители «табуляция» мы имеем

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

    2. 10 (разделители_запятые_сохр_1_раз).csv
      30(MS-DOS).csv
      30(разделители_запятые).csv

      формат всех твоих csv файлов абсолютно одинаков, т.е. во всех них разделителем данных служит ;(точка с запятой), убедиться в этом ты можешь открыв их с помощью Блокнота, а причиной ошибки были всё те же пустые данные, находящиеся в конце каждого файла

      Но тут проще, это я исправил, в версии 2.1. Теперь строки не содержащие ни чего кроме разделителя не будут браться в обработку.

    #3


  4. Krovlaf

    Форумчанин

    Регистрация:
    15 дек 2009
    Сообщения:
    207
    Симпатии:
    42
    Адрес:

    Хабаровск

    Но Point Manager не работает с динамическими блоками! А Geo_import работает!
    По моему, следующим шагом в усовершенствовании Geo_import’а должно (но необязано, на усмотрение автора) стать возможность вставки всех атрибутов в блоках (как в Point Manager). На данный момент Geo_import работает в основном для вставки съемочных точек — номер, координаты, описание. Но цель программы «Построение (создание) объектов AutoCAD по координатам из текстового файла». Так что модернизация напрашивается сама собой.

    #4


  5. BearDyugin

    Форумчанин

    Регистрация:
    30 ноя 2007
    Сообщения:
    2.702
    Симпатии:
    2.444
    Адрес:

    Сибирь

    Исправил, работает!

    Нет, это абсолютно разные вещи, сейчас программа работает с 5 полями, 2 обязательных (X и Y) и 3 не обязательных (Отметка, Номер и Описание), и в программе есть возможность выбора где какое поле, и их кол-во фиксировано и за ранее известное 5 не больше не меньше.

    Да, для этого она и была написана, т.к. для этих целей плохо подходил Point Manager, я просил Lee Mac чуть-чуть доработать(изменить) свою программу, но он отказал, что и подтолкнуло меня к написание Geo_Export и Geo_Import.

    Вложения:

    #5


  6. delfin8407

    Регистрация:
    24 июл 2010
    Сообщения:
    3
    Симпатии:
    1

    После подгрузки точек, акад выдал ошибку:
    ; ошибка: неверный тип аргумента: (or stringp symbolp): nil
    В чем может быть проблемма?

    #6


  7. BearDyugin

    Форумчанин

    Регистрация:
    30 ноя 2007
    Сообщения:
    2.702
    Симпатии:
    2.444
    Адрес:

    Сибирь

    Это означает, что в какой-то строке не достаточно данных
    например вот в таком файле

    точка 105-300 вбита вручную и из 3 координат введена была только Z, потому что эта точка является репером для установки станции по высоте.
    Так вот на подобную строчку(точку) программа и выдаст такое сообщение
    (or stringp symbolp): nil
    , потому что между ,,(запятых) она пытается найти строку(stringp) или(or) символ(simbol), а их там нет(nil)

    Два варианта решения:

    1. До загрузки очистить файл от подобных строк,
    2. При загрузке использовать опцию «Выбор строк», через Shift выбрать все строки, а потом через Ctrl снять выделение с ненужных

    #7


  8. AAFur

    Регистрация:
    29 апр 2012
    Сообщения:
    9
    Симпатии:
    0

    Программка — супер, уже даже и не надеялся найти что то подобное!!! Автор Вы — гений, большое спасибо, счет кошелька записал, обязательно вышлю благодарность))) Единственная просьба или даже вопрос — как ограничить количество знаков после точки в xyz??? Подробнее — у меня прибор пишет 3 знака после целого числа, например 9846.345 — текстовый файл у меня получается с такими же числами. Как сделать или можно добавить в прогу, что бы в свойствах z (высоты) можно было ограничить (либо округлить) до двух знаков после точки???

    #8


  9. BearDyugin

    Форумчанин

    Регистрация:
    30 ноя 2007
    Сообщения:
    2.702
    Симпатии:
    2.444
    Адрес:

    Сибирь

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

    #9


  10. Айдын

    Форумчанин

    Конечно же огромное спасибо вам за такую программу. Теперь о проблемах:
    1. Загрузил файл, но не все точки загрузились. Использую версию 2,4.
    2. Нельзя ли ввести команду для высоты текста, а то приходиться искать как это сделать, я читал описание про то как их изменять, но мы люди такие, что хотим что бы все было под руками)
    3. Еще одно предложение, когда загружаем много точек, некоторые точки прикрываются надписами высот или именами, можно ли сделать так, что бы при выборе точки или имени, высоты выделялось все, но так же расскидовалось по слоям. Я такое видел в программе кредо дат и топоплан.
    4. И случайно вы не создали приложение для отрисовки рельефа?!

    #10


  11. BearDyugin

    Форумчанин

    Регистрация:
    30 ноя 2007
    Сообщения:
    2.702
    Симпатии:
    2.444
    Адрес:

    Сибирь

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

    Добавил, качай из первого поста версию 2.6

    Для этих целей можно использовать блок (прикладываю к сообщению), Блок с 3-мя атрибутами, каждый лежит на разных слоях, каждый можно «перетаскивать»

    Нет, и не собираюсь.

    Вложения:

    #11


  12. timoshetc

    Регистрация:
    6 ноя 2012
    Сообщения:
    7
    Симпатии:
    1

    не желает вставлять коды…автоматически становится неактивной, хотя код присутствует (123.txt)

    немного исправленный файл (точки.txt)

    Вложения:

    • 123.txt
      Размер файла:
      22,8 КБ
      Просмотров:
      130
    • точки.txt
      Размер файла:
      14,8 КБ
      Просмотров:
      118

    #12


  13. BearDyugin

    Форумчанин

    Регистрация:
    30 ноя 2007
    Сообщения:
    2.702
    Симпатии:
    2.444
    Адрес:

    Сибирь

    Из файла 123.txt, не то что коды, программа вообще ни чего не сможет вставить, там разделение идёт не каким-либо знаком, а количеством символов для каждого значения, как в формате SDR
    Файл точки.txt уже лучше,но программа определяет наличие полей, по первым 3-м строкам файла, добавь код в любую из первых 3-х строк и тогда программа их распознает.

    #13


  14. tumash

    Регистрация:
    9 апр 2012
    Сообщения:
    2
    Симпатии:
    4
    Адрес:

    Мінск

    Импорт получился.
    Но пришлось ориентироваться по вашему скриншоту. У меня англоязычный виндовс и автокад — все русские надписи внутри лиспа отобразились в виде каракулей (см. рис.). Есть какое-нибудь решение?


    скрин диалога с каракулями (раскрыть)
    скрин диалога с каракулями (свернуть)

    #14


  15. BearDyugin

    Форумчанин

    Регистрация:
    30 ноя 2007
    Сообщения:
    2.702
    Симпатии:
    2.444
    Адрес:

    Сибирь

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


    Англицкий диалог (раскрыть)
    Англицкий диалог (свернуть)

    Geo_Import_en.jpg

    А узнать русский ли AutoCAD, мне помогает системная переменная SYSCODEPAGE, вбей её в командную строку и напиши чего тебе ответит AutoCAD

    Хотя, вот тебе, качай новую версию программы 2.8 из первого поста, и вызывай команду Geo_Import_en тогда диалог будет принудительно на англицком.
    Макрос на кнопку: ^C^C^P(if (not C:Geo_import_en)(load «Geo_Import_v2_8» ) );^PGeo_import_en;

    #15


  16. Saray

    Форумчанин

    Регистрация:
    28 июл 2008
    Сообщения:
    34
    Симпатии:
    0
    Адрес:

    С-Пб, Россия

    Disney, опять спасибо! Программа гениально подходит для отрисовки фасадных съемок. Было бы, конечно, удобней, если бы в окне импорта было бы больше столбцов с данными и в шапке можно было выбирать какому из них какой тип данных соответствует (Х, У, Н, описание, номер и т.д.), а какой вообще не используется, как это реализовано при создании пользовательского формата импорта в Civil 3D. Так можно было бы редактировать данные в Excel (пересчитать высоты, например) и не приводить конечный файл в один из форматов, пригодных для работы этой программы.

    #16


  17. BearDyugin

    Форумчанин

    Регистрация:
    30 ноя 2007
    Сообщения:
    2.702
    Симпатии:
    2.444
    Адрес:

    Сибирь

    Нет, это практически полное переписывание программы…По простому программа сама умеет пересчитывать отметки.

    #17


  18. X-Y-H

    Команда форума
    Форумчанин

    Регистрация:
    18 май 2007
    Сообщения:
    21.431
    Симпатии:
    6.863
    Адрес:

    Россия

    Александр, автокад 2013, версия последняя, при импорте файла, после его окончания файл который закидывали остается занят приложением (в данном случае автокадом) пока не закроешь, в некоторые программы не закинуть.

    #18


  19. Палыч

    Форумчанин

    Регистрация:
    16 июл 2007
    Сообщения:
    2.330
    Симпатии:
    175
    Адрес:

    Беларусь

    В результате импорта у отметки три знака после запятой, а хочу ДВА. Туплю,уже долго.::sad24.gif::

    #19


  20. BearDyugin

    Форумчанин

    Регистрация:
    30 ноя 2007
    Сообщения:
    2.702
    Симпатии:
    2.444
    Адрес:

    Сибирь

    Количество знаков после запятой, программа смотрит по их количеству в отметке в самой первой строчке файла, измени в файле всего одну первую отметку до нужного количества знаков, и все точку при загрузке подпишутся с такой же точностью

    #20

Страница 1 из 11

Статус темы:

Закрыта.

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

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

Давайте рассмотрим некоторые технические приемы, которые помогут нам при создании новых программ на языке 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 24 июля 2015г. 16:35:04

  • Blackjek
  • Участник
  • На форуме с 24 июля 2015г.
  • Сообщений: 2
  • Спасибо: 0

Тема: Ошибка: неверный тип аргумента: stringp nil

Добрый день коллеги.
Моим товарищем было написан лисп:
(defun c:11 (/  xyfill osm ocmd spt ept cla)

 
  ;;—————————————————————————
  ;; функция заливки прямоугольника, определенного точками 1pt и 2pt в текущей ПСК,
  ;; блоками с именем bname на максимальном расстоянии maxdist
  (defun xyfill (1pt 2pt maxdist bname / n_meas nx ny dx dy sx sy ix iy)

    (defun n_meas (1p 2p d / n) ;_ возвращает количество точек деления по координате
      (max (fix (if (not (zerop (- (abs (- 2p 1p)) (* (fix (setq n (/ (abs (- 2p 1p)) d))) d))))
                  (1+ n)
                  n
                ) ;_  if
           ) ;_  fix
           1 ;_ минимум одна точка деления
      ) ;_  max
  ) ;_  defun n_meas

        (setq dimlf1 (getvar «DIMLFAC»));; установка масштаба блока «Оросители»
    (setq mashbloka1 (/ 1.0 dimlf1))
    (setq nx (n_meas (car 1pt) (car 2pt) maxdist))
    (setq ny (n_meas (cadr 1pt) (cadr 2pt) maxdist))
    (setq dx (/ (- (car 2pt) (car 1pt)) nx)) ;_ шаг по X
    (setq dy (/ (- (cadr 2pt) (cadr 1pt)) ny)) ;_ шаг по Y
    (princ (list «рядов по X=» nx «, по Y=» ny «, шаг X=» dx «, шаг Y=» dy));;писанина
    (setq sx (+ (car 1pt) (* dx 0.5)))
    (setq sy (+ (cadr 1pt) (* dy 0.5)))
    (setq ix sx)
    (repeat nx
      (setq iy sy)
      (repeat ny
        (vl-cmdf «_.insert» bname (list ix iy) mashbloka1 mashbloka1 0)
        (setq iy (+ iy dy))
      ) ;_  repeat
      (setq ix (+ ix dx))
    ) ;_  repeat
  ) ;_  defun xyfill
  ;;—————————————————————————

  ;; собственно программа

;; Установка слоёв
(setq ocmd1 (getvar «cmdecho»))
  (setvar «cmdecho» 0)
   (if (setq layget (tblsearch «LAYER» «Оросители»)) ; проверка на наличие слоя
    (cond                               ; если есть, то проверка его состояния
      ((= (logand 1 (cdr (assoc 70 layget))) 1)
       (alert «Слой «Оросители», заморожен!nnДальнейшая работа, увы, невозможна…»)
       (exit)
      )
      ((= (logand 4 (cdr (assoc 70 layget))) 4)
       (alert «Слой «Оросители» заблокирован!nnДальнейшая работа, увы, невозможна…»)
       (exit)
      )
      ((minusp (cdr (assoc 62 layget)))
       (alert «Внимание!!!nnСлой «Оросители», на котором будет отрисован объект, невидим!»)
      )
    ) ;_  cond
    (vl-cmdf «_.layer» «_n» «Оросители» «_c» 20 «Оросители» «») ; создание слоя, если такого нет
  ) ;_  if
(setvar «cmdecho» ocmd1)
  ;;конец функции установки слоев

    (vla-startundomark (vla-get-activedocument (vlax-get-acad-object)))
  (setq cla (getvar «CLAYER»))
  (setq ocmd (getvar «cmdecho»))
  (setq osm (getvar «osmode»))
  (setq bname1 «Ороситель») ;; Имя блока
  (princ (strcat «nЗаливка прямоугольника блоками » bname1 «.»))
  (initget 1)
  (setq spt (getpoint «nОдин угол >»))
  (initget 1)
  (setq ept (getpoint «nДругой угол >»))
  (princ «nМинуточку…..n»)
  (setvar «CLAYER» «Оросители»)
  (setvar «cmdecho» 0)
  (setvar «osmode» 0)
  (xyfill spt ept (/ (atof(getenv «min-dist»)) (getvar «dimlfac»)) bname1)  ;_ указать минимальную дистанцию и имя блока заливки
  (setvar «cmdecho» ocmd)
  (setvar «CLAYER» cla)
  (setvar «osmode» osm)
  (vla-endundomark (vla-get-activedocument (vlax-get-acad-object)))
  (princ «nГотово smile«)
  (princ (strcat «nШаг между оросителями составляет : » (getenv «min-dist») «мм»))
  (princ)
) ;_  defun

(vl-load-com)

;;;**********************************************************************************************************
(defun min-dist-orosit (/ i)
;; (min-dist-orosit)
(or (getenv «min-dist») (setenv «min-dist» «4000»))
(initget «» 6)
(if (setq i
           (getdist
            (strcat «n Укажите минимальную дистанцию между блоками [» (getenv «min-dist») «]»)
           ) ;_  getint
     ) ;_  setq
  (setenv «min-dist» (rtos i 2 3))
) ;_  if
(atof (getenv «min-dist»))
) ;_  defun

Смысл данной программы заключается:
1. Создается слой
2. равномерное распределение блока «ороситель» по всей площади помещения с указанием шаг оросителя.

В старых версиях программы все работало  — а  для в автокаде 2012 не работает, выдает ошибку:
Ошибка: неверный тип аргумента: stringp nil.
Помогите и разъясните , чтоб понять в чем ошибка и куда смотреть?
Спасибо.

#2 Ответ от Alan 26 июля 2015г. 14:31:56

  • Alan
  • Активный участник
  • Откуда: Украина / Киев
  • На форуме с 2 апреля 2002г.
  • Сообщений: 1,345
  • Спасибо: 15

Re: Ошибка: неверный тип аргумента: stringp nil

Про (getenv «min-dist») я отвечал на соседнем форуме

#3 Ответ от Blackjek 27 июля 2015г. 08:46:23

  • Blackjek
  • Участник
  • На форуме с 24 июля 2015г.
  • Сообщений: 2
  • Спасибо: 0

Re: Ошибка: неверный тип аргумента: stringp nil

Спасибо за совет  — «Там была определена переменная среды min-dist, а в новом нет — (getenv «min-dist») — nil

Задайте её и будет вам счастье…»

а Вы можете, чайнику подсказать что и где править?

Спасибо

#4 Ответ от kpblc 27 июля 2015г. 09:05:14

  • kpblc
  • kpblc
  • Активный участник
  • Откуда: С.-Петербург
  • На форуме с 29 ноября 2004г.
  • Сообщений: 8,348
  • Спасибо: 23

Re: Ошибка: неверный тип аргумента: stringp nil

Сначала запусти функцию min-dist-orosit

#5 Ответ от Alan 27 июля 2015г. 12:06:56

  • Alan
  • Активный участник
  • Откуда: Украина / Киев
  • На форуме с 2 апреля 2002г.
  • Сообщений: 1,345
  • Спасибо: 15

Re: Ошибка: неверный тип аргумента: stringp nil

Дмитрий Беляков пишет:

а Вы можете, чайнику подсказать что и где править?

Ну или добавь вызов  функции min-dist-orosit в начало своего текста

(defun c:11 (/ xyfill osm ocmd spt ept cla) 
;;; вызов функции задания  дистанции между блоками
(min-dist-orosit) 
..............

тогда при вызове команды 11, функция min-dist-orosit будет отрабатывать автоматически.
Как мне кажется в этом тексте есть еще достаточно подводных камней типа ошибок.
Совет.
Если хочешь изучать работу ЛИСПа, открывай тексты в редакторе ВизуалЛиспа и запускай пошаговую отладку

#6 Ответ от Alan 6 августа 2015г. 14:47:20 (изменено: Alan aka Александр Назаров, 6 августа 2015г. 14:47:51)

  • Alan
  • Активный участник
  • Откуда: Украина / Киев
  • На форуме с 2 апреля 2002г.
  • Сообщений: 1,345
  • Спасибо: 15

Re: Ошибка: неверный тип аргумента: stringp nil

убрал дубль

Recommended Posts


PuzzzleClub

Newbie

PuzzzleClub

    • Share

Hello, Ive been trying to write an autolisp program that gives the user an area of an object with multiple spaces subtracted from that objects area. Im pretty sure that this error message refers to the «strcat» command that is in use but I seem to be stumped as to how to make this program functional. If anyone has any insights to this dilemma I would greatly appreciate input. thanks in advance!

-PuzzzleClub

here is the code;

almostThereLISP.LSP

  • Quote

Link to comment
Share on other sites


hmsilva

Proficient

hmsilva

    • Share

Add

(setq areaString (rtos(getvar "area")2 4))
(setq insertUnits (getvar 'INSUNITS));; <<<<<<<<
(cond

The insertunits variable was not defined…

HTH

Henrique

  • Quote

Link to comment
Share on other sites


PuzzzleClub

Newbie

PuzzzleClub

  • Author
    • Share

thanks hmsilva, I really appreciate the assistance and speedy response. makes total sense now.

-PuzzzleClub

  • Quote

Link to comment
Share on other sites


hmsilva

Proficient

hmsilva

    • Share

You’re welcome.

Glad I could help

Henrique

  • Quote

Link to comment
Share on other sites

Join the conversation

You can post now and register later.

If you have an account, sign in now to post with your account.

Note: Your post will require moderator approval before it will be visible.

Visual LISP, AutoLISP and General Customization


Turn on suggestions

Auto-suggest helps you quickly narrow down your search results by suggesting possible matches as you type.


Showing results for 


Search instead for 

Did you mean: 


  • Back to forum


  • Previous

  • Next

*Thomas E. Maleski

6248 Views, 10 Replies

‎02-07-2007

10:16 AM

bad argument type: stringp nil ** Error with code


I have an external text file in the form of
loginname.department

I keep getting the above error and I can’t figure
it out. UserData is a variable to a path and parse is a function from someone
here a long way back. It splits upon deliminator

Here’s the code:

(defun MCS:user ()

 
(setq caduser   (strcase (getvar «LOGINNAME»)
t)

          
caddept  
nil
           user_dept
nil
  )

 
(setq f1 


face=Arial size=2>(open UserData

       
«r»
        )
  )

 
(if
    (/= f1 nil)

    
(progn
       (while
  (setq rl
(read-line f1))
(setq usermtch (car (parse r1 «.»)))

  
(if
(wcmatch usermtch caduser)
      (setq
user_dept rl)
   )    ;end
if
       )    ;end
while
     )     ;end
progn
  )     ;end if
  (setq f1 (close
f1))
)


Thomas E. Maleski
Revit Technology
Advisor
Autodesk Implementation Certified Expert

Revit Building 9.1
Revit Structure 4
Revit
Systems 2

Architectural Desktop
Building
Systems


  • Back to forum


  • Previous

  • Next

10 REPLIES 10

*T.Willey

‎02-07-2007

10:32 AM

You’re problem is here.
(wcmatch usermtch caduser)
The parse program (I think) is spitting back a list of strings, so if the
string is «MyName.MyDept» it will return («MyName» «MyDept»), so you need to
examine the first item in the list, so something like
(wcmatch (car usermtch) caduser)
Should work since now you will be comparing two strings, instead of a list
and a string.

Tim
«A blind man lets nothing block his vision.»

«Thomas E. Maleski»

wrote in message
news:5478428@discussion.autodesk.com…
I have an external text file in the form of loginname.department

I keep getting the above error and I can’t figure it out. UserData is a
variable to a path and parse is a function from someone here a long way
back. It splits upon deliminator

Here’s the code:

(defun MCS:user ()
(setq caduser (strcase (getvar «LOGINNAME») t)
caddept nil
user_dept nil
)
(setq f1
(open UserData
«r»
)
)
(if
(/= f1 nil)
(progn
(while
(setq rl (read-line f1))
(setq usermtch (car (parse r1 «.»)))
(if
(wcmatch usermtch caduser)
(setq user_dept rl)
) ;end if
) ;end while
) ;end progn
) ;end if
(setq f1 (close f1))
)


Thomas E. Maleski
Revit Technology Advisor
Autodesk Implementation Certified Expert

Revit Building 9.1
Revit Structure 4
Revit Systems 2

Architectural Desktop
Building Systems

EC-CAD

‎02-07-2007

10:35 AM

Problem here also. Where is variable ‘UserData’ set ?
(setq f1
(open UserData
«r»
)

Bob

*Thomas E. Maleski

‎02-08-2007

07:36 AM

ok, i changed it around a little but still » bad argument type: (or stringp
symbolp): nil » error

The text file named test.txt contains the following:

loginname.department
tmaleskic.civil
tmaleski.structural

I revised my code to the following:
(defun user ()
(setq currentuser (strcase (getvar «LOGINNAME») t)
user-dept nil
)
(setq readfile (open «c:\test.txt» «r»))
(if
(/= readfile nil)
(progn
(while

(setq lineread (read-line readfile)
dpos (vl-string-search «.» lineread)
currentusertest (substr lineread 1 dpos)
)

(if
(wcmatch lineread currentusertest)
(setq user-dept lineread)
)

)
)
)
(setq readfile (close readfile))
)

«T.Willey»

wrote in message
news:5478489@discussion.autodesk.com…
You’re problem is here.
(wcmatch usermtch caduser)
The parse program (I think) is spitting back a list of strings, so if the
string is «MyName.MyDept» it will return («MyName» «MyDept»), so you need to
examine the first item in the list, so something like
(wcmatch (car usermtch) caduser)
Should work since now you will be comparing two strings, instead of a list
and a string.

Tim
«A blind man lets nothing block his vision.»

«Thomas E. Maleski»

wrote in message
news:5478428@discussion.autodesk.com…
I have an external text file in the form of loginname.department

I keep getting the above error and I can’t figure it out. UserData is a
variable to a path and parse is a function from someone here a long way
back. It splits upon deliminator

Here’s the code:

(defun MCS:user ()
(setq caduser (strcase (getvar «LOGINNAME») t)
caddept nil
user_dept nil
)
(setq f1
(open UserData
«r»
)
)
(if
(/= f1 nil)
(progn
(while
(setq rl (read-line f1))
(setq usermtch (car (parse r1 «.»)))
(if
(wcmatch usermtch caduser)
(setq user_dept rl)
) ;end if
) ;end while
) ;end progn
) ;end if
(setq f1 (close f1))
)


Thomas E. Maleski
Revit Technology Advisor
Autodesk Implementation Certified Expert

Revit Building 9.1
Revit Structure 4
Revit Systems 2

Architectural Desktop
Building Systems

EC-CAD

‎02-08-2007

08:04 AM

Your While is reading (until) it gets a nil.
Then, you check a nil string..
Try this instead:
(defun user ()
(setq currentuser (strcase (getvar «LOGINNAME») t) user-dept nil)
;;
(setq readfile (open «c:\test.txt» «r»))
(if (/= readfile nil)
(progn
(while
(setq lineread (read-line readfile))
(if lineread
(setq dpos (vl-string-search «.» lineread) currentusertest (substr lineread 1 dpos))
)
(if (wcmatch lineread currentusertest)
(setq user-dept lineread)
)
); while
); progn
); if
(setq readfile (close readfile))
); function

Bob

*Thomas E. Maleski

‎02-08-2007

08:28 AM

Thanks Bob

I don’t get the error but when finished I don’t have a value for user-dept,
it’s nil. It should based upon my login, tmaleski.structural

wrote in message news:5479733@discussion.autodesk.com…
Your While is reading (until) it gets a nil.
Then, you check a nil string..
Try this instead:
(defun user ()
(setq currentuser (strcase (getvar «LOGINNAME») t) user-dept nil)
;;
(setq readfile (open «c:\test.txt» «r»))
(if (/= readfile nil)
(progn
(while
(setq lineread (read-line readfile))
(if lineread
(setq dpos (vl-string-search «.» lineread) currentusertest (substr
lineread 1 dpos))
)
(if (wcmatch lineread currentusertest)
(setq user-dept lineread)
)
); while
); progn
); if
(setq readfile (close readfile))
); function

Bob

*Thomas E. Maleski

‎02-08-2007

08:29 AM

correction the value is «» NOT nil

«Thomas E. Maleski»

wrote in message
news:5479764@discussion.autodesk.com…
Thanks Bob

I don’t get the error but when finished I don’t have a value for user-dept,
it’s nil. It should based upon my login, tmaleski.structural

wrote in message news:5479733@discussion.autodesk.com…
Your While is reading (until) it gets a nil.
Then, you check a nil string..
Try this instead:
(defun user ()
(setq currentuser (strcase (getvar «LOGINNAME») t) user-dept nil)
;;
(setq readfile (open «c:\test.txt» «r»))
(if (/= readfile nil)
(progn
(while
(setq lineread (read-line readfile))
(if lineread
(setq dpos (vl-string-search «.» lineread) currentusertest (substr
lineread 1 dpos))
)
(if (wcmatch lineread currentusertest)
(setq user-dept lineread)
)
); while
); progn
); if
(setq readfile (close readfile))
); function

Bob

EC-CAD

‎02-08-2007

08:50 AM

Ok, got it.

(defun user ()
(setq currentuser (strcase (getvar «LOGINNAME») t) user-dept nil)
;;
(setq readfile (open «c:\test.txt» «r»))
(if (/= readfile nil)
(progn
(while (setq lineread (read-line readfile))
(if lineread
(progn
(setq lineread (strcase lineread t))
(setq dpos (vl-string-search «.» lineread) currentusertest (substr lineread 1 dpos))
(if (eq currentusertest currentuser)
(setq user-dept lineread)
); if
); progn
); if
); while
(setq readfile (close readfile))
); progn
); if
(if user-dept
(alert (strcat «User-Dept = » user-dept))
); if
); function

Bob

*Thomas E. Maleski

‎02-08-2007

09:44 AM

That works!!!!!

I was going on similar path but you got me there faster. Thanks alot. I’ll
just comment out the alert but thank you once again.

Just so people know the background of this. I work for a multidiscipline
firm, Architecture, Civil, Survey, Structural, MEP, GIS/Geotech, Wastewater
and BioPharma. Just a few. Also we have different locations. We control all
the autocad setup from our main office. Depending upon your login and what
department your assigned to, certain functions, parameters and settings are
applied. The file’s been working since ADT3.3 days but just recently, I
created a bunch of test login accounts for me and the «CAD Manager». So my
original code just did a wildcard match on login* so if I was logged in as
tmaleski and tmaleskic was the first in the txt file, it loaded the civil
load.

wrote in message news:5479806@discussion.autodesk.com…
Ok, got it.

(defun user ()
(setq currentuser (strcase (getvar «LOGINNAME») t) user-dept nil)
;;
(setq readfile (open «c:\test.txt» «r»))
(if (/= readfile nil)
(progn
(while (setq lineread (read-line readfile))
(if lineread
(progn
(setq lineread (strcase lineread t))
(setq dpos (vl-string-search «.» lineread) currentusertest (substr
lineread 1 dpos))
(if (eq currentusertest currentuser)
(setq user-dept lineread)
); if
); progn
); if
); while
(setq readfile (close readfile))
); progn
); if
(if user-dept
(alert (strcat «User-Dept = » user-dept))
); if
); function

Bob

EC-CAD

‎02-08-2007

12:30 PM

You are Welcome!
Cheers,
Bob

http://www.bobscadshop.com

zliaster

‎09-17-2010

02:01 AM

hello everyone .. i have the same problem loading application .. i don’t know too much about visual basic codes .. i know that the file below in the link can be loaded only on one computer … when i try to load it on other it returns me the same bad argument stringp error .. i’ll be very thankful is someone help me :slightly_smiling_face:

here is the file

sons.lsp


  • Back to forum


  • Previous

  • Next

Понравилась статья? Поделить с друзьями:
  • Ошибка неверный тип аргумента numberp nil
  • Ошибка неверный тип аргумента lselsetp nil
  • Ошибка неверный тип аргумента lentityp nil
  • Ошибка неверный сигнал д скор
  • Ошибка неверный сертификат vipnet csp