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

4453 Views, 4 Replies
05-24-2017
10:17 PM
Error: bad argument type: FILE nil
Error: bad argument type: FILE nil
Cannot invoke (command) from *error* without prior call to (*push-error-using-command*).
Converting (command) calls to (command-s) is recommended.
-
Back to forum -
Previous -
Next
4 REPLIES 4
05-24-2017
10:29 PM
That occurs when the called function results in an error and the error function is calling command. Change the command call to command-s in error function. I would also recommend commenting out the error function and running the routine. This will allow the calling function to break at error and return the actual error message.
If all that is confusing then post your code.

05-25-2017
06:07 AM
Those are two different things. The second part is as @Ranjit.Singh describes. The first part would be from some function that is expecting to be given a file to work with, but is being given nil instead. That could be from a variable that does not get set, or one whose name is misspelled where it is given to that function, or something like a (findfile) function that is looking for a file that does not exist, or probably some other reasons.
Kent Cooper, AIA

05-25-2017
06:44 PM
Could it be as simple as not setting a symbol to a file pointer, as in (setq fp (open file «w»))?
You can’t write to a file named by a string, without opening it first. Nor can you in a read operation.
John F. Uhden

10-24-2019
12:03 AM
here i am at the end of 2019 with this **** of a message. After 4 hours i found an answer for my problem.
NIL is referring to some stupid image added as xref or inserted. Removed the image or detach it and the error is gone
![]()
-
Back to forum -
Previous -
Next
Перейти к содержимому раздела
Форумы CADUser
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Дерево сообщений Активные темы Темы без ответов
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
#1 21 апреля 2008г. 07:15:58

- la_vanille_ciel
- Восстановленный участник
- На форуме с 21 апреля 2008г.
- Сообщений: 2
- Спасибо: 0
Тема: ; ошибка: неверный тип аргумента: File nil
(vmon)
(defun C:Shtamp2a ()
(setvar «cmdecho» 0)
(setq osm (getvar «osmode»))
(setq Lay (getvar «Clayer»))
(setvar «clayer» «0»)
(setq curtab (tblobjname «STYLE» «STANDARD»))
(setq ed (entget curtab)) ;Установка в стиле STANDARD
(setq ed (subst (cons 3 «simplex.shx») (assoc 3 ed) ed )) ;файла шрифта simplex
(setq ed (subst (cons 41 0.8) (assoc 41 ed) ed )) ;сжатия 0.8
(setq ed (subst (cons 40 0.0) (assoc 40 ed) ed )) ;высота текста=0
(setq ed (subst (cons 50 0.261799) (assoc 50 ed) ed )) ;и угла наклона 15
(entmod ed)
(setq txt (getvar «textstyle»))
(setvar «textstyle» «standard»)
(setq Dog «»)
(if (findfile «C:\Shtamp\shtamp.txt»)
(progn
(setq FL (open «C:\Shtamp\shtamp.txt» «r»))
(setq Dog (read-line FL))
))
(setq OTV «Y»)
(IF (= (strlen Dog) 0)
(progn
(textscr)
(princ «Не заполнены данные для штампа!!! Необходимо выполнить ЗАПОЛНЕНИЕ ШТАМПА.n»)
(setq Otv (getstring «Вставить пустой штамп? <Y> : «))
(if (or (= otv «») (= otv «y»))
(setq OTV «Y»)
)
(graphscr)
(if (= OTV «Y»)
(princ
(setq M (getstring «Масштабный кофициент (1): «))
(if (= M «»)
(setq M «1»)
)
(setq T0 (getpoint «n Покажите точку вставки штампа :»))
(setvar «osmode» 0)
(command «_insert» «sh2a» T0 M M «0»)
(setq M (atof M))
(command «_text» (mapcar ‘- T0 (list (* 45 M) (* 4 M))) (* 3 M) «0» «Формат А»)
))
))
(if (> (strlen Dog) 0)
(progn
(setq M (getstring «Масштабный кофициент(1) : «))
(if (= M «»)
(setq M «1»)
)
(setq T0 (getpoint «n Покажите точку вставки штампа :»))
(setvar «osmode» 0)
(command «_insert» «sh2a» T0 M M «0»)
(setq M (atof M))
(command «_text» (mapcar ‘- T0 (list (* 45 M) (* 4 M))) (* 3 M) «0» «Формат А»)
(setq Dog (strcase Dog))
(setq T1 (polar T0 (/ pi 2) (* 32.5 M)))
(setq T1 (polar T1 pi 60))
(command «_text» «_m» T1 (* 5 M) «0» Dog)
(setq Pr (read-line FL))
(setq Ob (read-line FL))
(setq Name (read-line FL));Ncontr
(setq D (Strlen Name))
(setq T1 (polar T0 pi (* 164 M)))
(setq T1 (polar T1 (/ pi 2) (* 21 M)))
(if (> d 8)
(Command «_Text» «_f» T1 (polar T1 0 (* 18 M)) (* 3 M) Name)
(Command «_Text» T1 (* 3 M) «0» Name)
)
(setq Name (read-line FL));gip
(setq D (Strlen Name))
(setq T1 (polar T1 (* (/ pi 2) 3) 5))
(if (> d 8)
(Command «_Text» «_f» T1 (polar T1 0 (* 18 M)) (* 3 M) Name)
(Command «_Text» T1 (* 3 M) «0» Name)
)
(setq Name (read-line FL));Nachotd
(setq D (Strlen Name))
(setq T1 (polar T1 (* (/ pi 2) 3) (* 5 M)))
(if (> d 8)
(Command «_Text» «_f» T1 (polar T1 0 (* 18 M)) (* 3 M) Name)
(Command «_Text» T1 (* 3 M) «0» Name)
)
(setq Name (read-line FL));Fio
(setq D (Strlen Name))
(setq T1 (polar T1 (* (/ pi 2) 3) (* 10 M)))
(if (> d 8)
(Command «_Text» «_f» T1 (polar T1 0 (* 18 M)) (* 3 M) Name)
(Command «_Text» T1 (* 3 M) «0» Name)
)
))
(setvar «clayer» Lay)
(setvar «textstyle» txt)
(setvar «osmode» osm)
(setvar «cmdecho» 1)
)
Вот этот код отвечает за вставку штампов и почему-то, с некоторых пор, после указания точки вставки Автокад выдает ошибку о неверном типе аргумента. Что нужно исправить?
Спасибо.
#2 Ответ от Victor 21 апреля 2008г. 10:48:10

- Victor
- Восстановленный участник
- На форуме с 26 марта 2007г.
- Сообщений: 270
- Спасибо: 0
Re: ; ошибка: неверный тип аргумента: File nil
А этот файл у вас есть C:Shtampshtamp.txt ?
#3 Ответ от Fatty 21 апреля 2008г. 20:02:59

- Fatty
- Восстановленный участник
- На форуме с 30 мая 2006г.
- Сообщений: 989
- Спасибо: 0
Re: ; ошибка: неверный тип аргумента: File nil
> la_vanille_ciel
Насколько мне известно чаще такая ошибка выскакивает
когда данный блок отсутствует
Я бы добавил в код проверку на наличие блока
в текущем рисунке, строку:
(command "_.insert" "sh2a" T0 M M "0")
заменить на выражение:
(if (tblsearch "block" "sh2a") (command "_.insert" "sh2a" T0 M M "0") (alert "Блок "sh2a" в данном рисунке отсутствует") )
~’J’~
#4 Ответ от la_vanille_ciel 23 апреля 2008г. 06:55:33

- la_vanille_ciel
- Восстановленный участник
- На форуме с 21 апреля 2008г.
- Сообщений: 2
- Спасибо: 0
Re: ; ошибка: неверный тип аргумента: File nil
эээ…попробовала, теперь получается, когда я выбираю в меню штамп и пытаюсь поставить на рисунок, он пишет, что этого блока нет в рисунке, и далее такая же ошибка..
Сообщения 4
Тему читают: 1 гость
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
|
3 / 3 / 1 Регистрация: 21.10.2015 Сообщений: 92 |
|
|
1 |
|
|
08.11.2015, 21:43. Показов 9623. Ответов 21
Здравствуйте! Необходимо реализовать вывод и ввод в файлы. Программа чертит заданную по условию фигуру и проверяет попадает ли точка в заштрихованную область. Пользователь может выбрать вводить ли ему точку самому (с клавиатуры), либо ввести точку из файла (где я и застряла). Точка введённая пользователем с клавиатуры должна быть записана в файл (тут тоже не лучше). В общем не получается у меня с файлами работать(
__________________
0 |
|
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
08.11.2015, 21:43 |
|
Ответы с готовыми решениями: Работа с файлом Программа в AUTOLISP Пятнадцать трапеций,… Программа в AutoLISP Запуск AutoLISP 21 |
|
544 / 868 / 144 Регистрация: 10.08.2015 Сообщений: 4,456 |
|
|
08.11.2015, 21:53 |
2 |
|
В чем проблема-то?
0 |
|
3 / 3 / 1 Регистрация: 21.10.2015 Сообщений: 92 |
|
|
08.11.2015, 21:58 [ТС] |
3 |
|
Не видит файл. (чтение)
0 |
|
544 / 868 / 144 Регистрация: 10.08.2015 Сообщений: 4,456 |
|
|
08.11.2015, 22:04 |
4 |
|
Не видит файл Так покажи, автокад курсы экстрасенсов не проходил, он работает только в каталогах, описанных в путях поддержки, либо при указании абсолютного пути
0 |
|
3 / 3 / 1 Регистрация: 21.10.2015 Сообщений: 92 |
|
|
08.11.2015, 22:13 [ТС] |
5 |
|
Посмотрите для начала мой код. Вы тоже сейчас занимаетесь экстрасенсорикой. Там два варианта вывода из файла. Я бы хотела получить какою-нибудь помощь или пояснение по данному вопросу.
0 |
|
vlisp 544 / 868 / 144 Регистрация: 10.08.2015 Сообщений: 4,456 |
||||
|
08.11.2015, 23:17 |
6 |
|||
|
я не вижу ничего криминального в увиденном в части чтения из файла, по идее должно работать. Ну разве что можно попробовать такой вариант, что он выдаст:
1 |
|
3 / 3 / 1 Регистрация: 21.10.2015 Сообщений: 92 |
|
|
09.11.2015, 00:32 [ТС] |
7 |
|
ошибка: неверный тип аргумента
0 |
|
544 / 868 / 144 Регистрация: 10.08.2015 Сообщений: 4,456 |
|
|
09.11.2015, 01:08 |
8 |
|
ошибка: неверный тип аргумента Это не вся строка, сложно было скопировать полностью? Как вызываете функцию FileToList?
0 |
|
3 / 3 / 1 Регистрация: 21.10.2015 Сообщений: 92 |
|
|
09.11.2015, 01:27 [ТС] |
9 |
|
Я вызываю весь написанный мною код с самого начала. Вызов делаю через командную строку AutoCAD.
0 |
|
544 / 868 / 144 Регистрация: 10.08.2015 Сообщений: 4,456 |
|
|
09.11.2015, 01:56 |
10 |
|
; ошибка: неверный тип аргумента: numberp: nil эта ошибка означает что в оператор подставляется неинициализированная переменная
; ошибка: слишком мало аргументов тут вообще все понятно… забыли подставить один или несколько аргументов… нужно быть внимательнее и пользоваться инструментами форматирования кода
0 |
|
3 / 3 / 1 Регистрация: 21.10.2015 Сообщений: 92 |
|
|
09.11.2015, 02:14 [ТС] |
11 |
|
эта ошибка означает что в оператор подставляется неинициализированная переменная осталось только понять в каком именно месте. т.к ваша функция верна. в предыдущих вариантах чтения из файла такой ошибки не наблюдалось.
0 |
|
544 / 868 / 144 Регистрация: 10.08.2015 Сообщений: 4,456 |
|
|
09.11.2015, 02:20 |
12 |
|
Если файл пустой, то функция вернет nil, иначе список строк, который все равно еще нужно преобразовывать в список чисел и уже из него брать число для подстановки… используйте средства отладки vlide для отлова ошибок
0 |
|
3 / 3 / 1 Регистрация: 21.10.2015 Сообщений: 92 |
|
|
09.11.2015, 02:40 [ТС] |
13 |
|
А вот такой вопрос, пожалуй его следовало задать сразу: мне не сильно понятен сам код . Если в первом случае фигурирует полный путь к файлу и его наименование, что является для меня привычным, то здесь я ничего такого не вижу.
0 |
|
544 / 868 / 144 Регистрация: 10.08.2015 Сообщений: 4,456 |
|
|
09.11.2015, 08:36 |
14 |
|
Если в первом случае фигурирует полный путь к файлу и его наименование, что является для меня привычным, то здесь я ничего такого не вижу. настройка путей поддержки избавляет от необходимости использовать абсолютные пути
0 |
|
Lambdik 1046 / 940 / 107 Регистрация: 04.11.2012 Сообщений: 972 Записей в блоге: 3 |
||||||||||||||||
|
09.11.2015, 23:11 |
15 |
|||||||||||||||
|
Virviglaz Ну как, получается? Слишком много букв лишних в этой теме. Важно понимать, что для записи в файл используется два разных механизма, не зависящих друг от друга. Запись в файл сделаем пошагово.
Считывание из файла.
Здесь полезная информация.
2 |
|
3 / 3 / 1 Регистрация: 21.10.2015 Сообщений: 92 |
|
|
10.11.2015, 04:13 [ТС] |
16 |
|
Ну как, получается? Пока нет. Большое спасибо за ссылку. Итак,из файла мы считываем строку, которая содержит координаты точки. В дальнейшем, чтобы их использовать мы должны как-то преобразовать строку в список. Из идей только эта: разбить саму строку на подстроки, которые и объединить в список. (Надо/не надо; Верно/ не верно???)
0 |
|
Lambdik 1046 / 940 / 107 Регистрация: 04.11.2012 Сообщений: 972 Записей в блоге: 3 |
||||
|
10.11.2015, 10:34 |
17 |
|||
|
мы должны как-то преобразовать строку в список. Из идей только эта: разбить саму строку на подстроки, которые и объединить в список. Функция read читает из строки до первого пробела.
Функции для работы со строками.
2 |
|
Virviglaz 3 / 3 / 1 Регистрация: 21.10.2015 Сообщений: 92 |
||||||||||||
|
16.11.2015, 06:00 [ТС] |
18 |
|||||||||||
|
Lambdik, вы не совсем поняли мой последний вопрос, но для начала я покажу что у меня вообще получилось
Если с записью всё хорошо, то с выводом будет хуже:
Программа видит и читает файл. Загвоздка в условии. Это задача на определение вхождения точки в заштрихованную область. В моём случае областью является круг с центром в начале координат (радиус = 2). В круге есть вертикально расположенный прямоугольник (высота = 2, ширина = 1). Я писала проверку для точки введённой с клавиатуры. Выглядит она так:
Для точки введённой с клавиатуры проверка работает. Как быть с точкой которую мы считали (строку по сути дела)? Ведь для проверки необходимо как-то преобразовать строку в список. Вот на этом я и застряла. Может надо в принципе переписать как-то код?
0 |
|
Lambdik 1046 / 940 / 107 Регистрация: 04.11.2012 Сообщений: 972 Записей в блоге: 3 |
||||||||
|
16.11.2015, 22:50 |
19 |
|||||||
|
Virviglaz Очень рад что стараетесь учить, это я одобряю. Могу помочь с типами данных.
То есть если в файле записаны координаты без скобок, а просто числа. То считываем из файла, сцепляем со скобками и применяем read. Всё просто. Добавлено через 8 часов 36 минут
1 |
|
Virviglaz 3 / 3 / 1 Регистрация: 21.10.2015 Сообщений: 92 |
||||
|
18.11.2015, 00:52 [ТС] |
20 |
|||
|
Я сдаюсь
; ошибка: неверный тип аргумента: numberp: nil
0 |
Добро пожаловать!
Войдите или зарегистрируйтесь сейчас!
Войти
Страница 5 из 18
-

Форумчанин
а если их создать? по-моему где то встречал программку для этих целей…
посмотрел у Map3d тоже присутствует формат mrSid(*.sid) для вставки изображений#81
-

Форумчанин
- Регистрация:
- 15 июн 2012
- Сообщения:
- 613
- Симпатии:
- 83
- Адрес:
-
Краснодар
в глобал мапер открыл — и о чудо все файлы как то открываються именно на своих местах (как для меня великая загадка)
Остался вопрос как всё это чудо в автокад затянуть (если это возможно в обще) , если же нет то как перебить формат всему этому набору растров ?#82
-

Форумчанин
Файл —> Экспорт растра —> выбор необходимого формата
#83
-

Форумчанин
- Регистрация:
- 15 фев 2011
- Сообщения:
- 501
- Симпатии:
- 301
Файл-экспорт растра- выбираете нужный формат для экспорта и ставите галочку «создать файл привязки». Полученный файл привязки указываете через лисп Disney’я.
Часто бывает полезно разбить растр на части. Для этого там же в настройках экспорта есть настройка сетки (указываете количество столбцов и строк).#84
-

Форумчанин
- Регистрация:
- 15 июн 2012
- Сообщения:
- 613
- Симпатии:
- 83
- Адрес:
-
Краснодар
огромное спасибо — буду пробывать
#85
-

Форумчанин
- Регистрация:
- 23 ноя 2010
- Сообщения:
- 49
- Симпатии:
- 1
При подгрузке растра выдает ошибку (ошибка: неверный тип аргумента: stringp nil)
Текст таб файла:
!Table
!Version 300
!Charset NeutralDefinition Table
File «62-2-239-120-А.tif»
Type «RASTER»
(2240000.000000, 480000.000000) (0, 0) Label «Pt 1»,
(2241000.000000, 480000.000000) (4000, 0) Label «Pt 2»,
(2241000.000000, 479000.000000) (4000, 4000) Label «Pt 3»,
(2240000.000000, 479000.000000) (0, 4000) Label «Pt 4»
CoordSys NonEarth Units «m» Bounds (2240000.000000, 479000.000000) (2241000.000000, 480000.000000)
Units «m»Вложения:
#86
-

Форумчанин
- Регистрация:
- 15 фев 2011
- Сообщения:
- 501
- Симпатии:
- 301
У меня несколько предположений:
1. Текущий слой на замке. Решается отключением блокировки.
2. Расширение самого растра не тиф, а бмп. Решается заменой расширения в файле привязки.
3. Имя растра отличается, например вместо 62-2-239-120-А имя 62-2-239-120-а. Решается групповым переименованием в Тотал Командере.
Если файл не большой, то выкладывайте сам растр.#87
-

Форумчанин
- Регистрация:
- 30 ноя 2007
- Сообщения:
- 2.680
- Симпатии:
- 2.397
- Адрес:
-
Сибирь
Илюха, надо всю связку, выложи и сам растр.
#88
-

Форумчанин
- Регистрация:
- 23 ноя 2010
- Сообщения:
- 49
- Симпатии:
- 1
Выкладываю файлы
Вложения:
-
RASTR.rar
- Размер файла:
- 9,4 МБ
- Просмотров:
- 39
#89
-

- Регистрация:
- 6 фев 2013
- Сообщения:
- 4
- Симпатии:
- 0
При попытке вставить растры получил такое:
Команда: (Geo_load_image T) ; ошибка: Ошибка Automation. Недопустимый ключ
Версия 2.1. Акад 2012
При этом, если запускать команду и выбирать/загружать растр по одному, все вставляется, а если кучей, то нет 🙁#90
-

Форумчанин
- Регистрация:
- 30 ноя 2007
- Сообщения:
- 2.680
- Симпатии:
- 2.397
- Адрес:
-
Сибирь
В файле лишние пробелы(в каждой строчкой перед Label, должен быть «один», а их там «два»), удали один, или скопируй ранее выложенное тобой содержимое файла tab на форуме(движок форума удаляет более одного пробела подряд), то всё заработает.

#91
-

- Регистрация:
- 6 фев 2013
- Сообщения:
- 4
- Симпатии:
- 0
Проблема оказалась в том, что в названии файлов присутствовали «запятые» — удалил их и пакетная вставка заработала… хотя странно — по одиночке вставлялось, а кучей нет..
#92
-

Форумчанин
- Регистрация:
- 27 фев 2012
- Сообщения:
- 29
- Симпатии:
- 1
- Адрес:
-
Москва
Сейчас опять столкнулся с той же проблемой при создании привязки растра в TAB:
пишет:
; ошибка: неверный тип аргумента: streamp nil
Долго вспомнилал, что когда-то решил эту проблему и вспомнил)
Вы были правы, Disney, там проблем в прописанной директории к растру. Подрядчик прислал файл Dwg с растрами в одной папке. А директория прописанная осталась старая с его компа, типа Z:/растры/топо/растр1.tiff
В итоге проблема решается обновлением директории, чтобы она совпадала с фактическим расположением файла на моём компьютере. Тогда всё работает.#93
-

- Регистрация:
- 15 мар 2013
- Сообщения:
- 2
- Симпатии:
- 0
-

Форумчанин
Dashiva, желательно, что бы растр лежал в той папке, где и сам файл находится. И, при вставке растра в файл, при задании пути выбрать пункт без пути.
#95
-

Форумчанин
- Регистрация:
- 16 июн 2008
- Сообщения:
- 35
- Симпатии:
- 0
- Адрес:
-
Москва
Disney, подскажите пожалуйста, — корректно ли работает Ваша программа с AutoCad 2008 SP1 (англ. версия)? Вроде бы программа устанавливается, но команды в командной строке не срабатывают. Может быть проблема в каких-либо настройках?
#96
-

Форумчанин
- Регистрация:
- 20 июн 2013
- Сообщения:
- 46
- Симпатии:
- 5
Доброго времени суток !Сложилась такая ситуация — при вставке растрового изображения выбираю папку где оно расположено, а Автокад выдает фатальную ошибку.С чем это может быть связано и как это исправить ? Спасибо


#97
-

- Регистрация:
- 19 окт 2013
- Сообщения:
- 1
- Симпатии:
- 0
Подскажите, пожалуйста в чем у меня проблема с подгрузкой. Использую команду (Geo_load_image «One») после выбора растра с привязкой tab (см. вложение) ACad виснит (не отвечает). И так более двух часов… и т.д…. может я мало жду? 🙂 Версию программы использую 2.1.
Вложения:
-
493.rar
- Размер файла:
- 1,2 МБ
- Просмотров:
- 8
#98
-

Форумчанин
- Регистрация:
- 26 окт 2013
- Сообщения:
- 16
- Симпатии:
- 38
- Адрес:
-
Самара
Всем доброго времени суток. Имеется привязанный растр (*.tif+*.tab). Можно как-нить использовать tab, чтобы растр лег туда, куда он и привязан? Если делать через вставка-вхождение растрового изображения , то нужно либо указывать координаты точки вставки либо посредством указания на экране, либо непосредственно ввод с клавиатуры. Получается, что файл привязки tab не используется…
Решение: программа в 18 постеЗдравствуйте. Отлично работает штука! 🙂 я так понял, что она преобразовывает в СК95, если геопривязка в WGS… а возможно реализовать преобразование в МСК по известным параметрам перехода?
#99
-

Команда форума
Форумчанин- Регистрация:
- 18 май 2007
- Сообщения:
- 21.037
- Симпатии:
- 6.675
- Адрес:
-
Россия
Приложение в автозагрузке, какой командой вызвать не понимаю. Make находит. Автокад 2013
#100
Страница 5 из 18
Поделиться этой страницей
Когда Вы начнёте писать свои программы, то неизбежно столкнетесь с необходимостью решения проблем, которые в программировании носят название отладка программы.
Давайте рассмотрим некоторые технические приемы, которые помогут нам при создании новых программ на языке 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. Все переменные имеют значение.
Мы видим, что все наши переменные имеют значения.
После того, как программа отлажена:
- Нужно вернуть все локальные переменные в список временных переменных функции defun.
- Сохранить свою LISP-программу.
- Закрыть редактор 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 стала для Вас теперь легкой, занимательной головоломкой.
Пишите в комментариях:
Была ли для Вас полезной информация, данная в этом уроке?
Какие способы отладки используете Вы?
На какие вопросы программирования, Вы хотели бы, увидит ответы в следующих уроках?
Я с удовольствием отвечу на ваши комментарии.
Если вы хотите получать новости с моего сайта. Оформляйте подписку.
До новых встреч.
«Автор: Михаил Орлов»
Также на эту тему Вы можете почитать:
error: bad argument type: numberp: nil
error: bad argument type: numberp: nil
2
Creating an autolisp program to add a threaded hole to a selected object, the program is as follows:
; Meghan Hendricks
; HOLETHREAD.LSP
;
(defun c:HOLETHREAD ()
(setq scmde (getvar «cmdecho»))
(setvar «cmdecho» 0)
(setq sblip (getvar «blipmode»))
(setvar «blipmode» 0)
(setq sosmd (getvar «osmode»))
(setvar «osmode» 0)
(setq 3dosmd (getvar «3dosmode»))
(setvar «3dosmode» 0)
(setq dyucs (getvar «ucsdetect»))
(setvar «ucsdetect» 0)
(setq ccolor (getvar «cecolor»))
(setq e1 (entsel «nselect the object»))
(setvar «osmode» 1)
(setq pt1 (getpoint «nEnter location of new coordinate system: «))
(setq pt2 (getpoint «nEnter location of new x axis: «))
(setq pt3 (getpoint «nEnter location of new y axis: «))
(command «ucs» 3 pt1 pt2 pt3)
(setvar «osmode» 0)
(setvar «blipmode» 1)
(setq pt4 (getpoint «nEnter location of center of the hole on the surface: «))
(setvar «blipmode» 0)
(setq D1 (getreal «nInput Diameter of the hole: «))
(setq L1 (getreal «nInput depth of the hole (positive z direction): «))
(setq c (getstring «nColor of hole»))
(command «color» c)
(command «cylinder» pt4 D1 L1)
(setq e2 (entlast))
(if (>= h 0)
(progn ;- z direction
(setq pt5 (list (car pt4) (+ (cadr pt1) (* D1 0.4)) 0))
(setq pt6 (list (car pt4) (- (car pt1) D2) (- (* D1 0.1))))
(setq pt7 (list (car pt4) (+ (cadr pt1) (* D1 0.4)) (- (* D1 0.2))))
(setq pt8 (list (car pt4) (cadr pt4) (- (* D1 0.1))))
(command «3DPOLY» pt5 pt6 pt7 «c»)
(setq e3 (entlast))
(command «helix» pt8 (* 0.4 D1)(* 0.4 D1) «H» (* 0.41 R2) (+ (* 0.4 R2) L1))
(setq e4 (entlast))
(command «sweep» e3 «» «a» «n» e4 «»)
(setq e5 (entlast))
(command «subtract» e2 «» e5 «»)
(setq e6 (entlast))
)
(progn ;+z direction
(setq pt5 (list (car pt4) (+ (cadr pt1) (* D2 0.4)) 0))
(setq pt6 (list (car pt4) (- (car pt1) D2) (* D1 0.1)))
(setq pt7 (list (car pt4) (+ (cadr pt1) (* D1 0.4)) (* D1 0.1)))
(setq pt8 (list (car pt4) (cadr pt4) (* D1 0.1)))
(command «3DPOLY» pt5 pt6 pt7 «c»)
(setq e3 (entlast))
(command «helix» pt8 (* 0.4 D1)(* 0.4 D1) «H» (* 0.41 R2) (+ (* 0.4 R2) L1))
(setq e4 (entlast))
(command «sweep» e3 «» «a» «n» e4 «»)
(setq e5 (entlast))
(command «subtract» e2 «» e5 «»)
(setq e6 (entlast))
))
(command «subtract» e1 «» e6 «»)
(command «ucs» «p»)
(command «vpoint» (list 1 -1 1))
(command «vscurrent» 2) ;2d wireframe
(setvar «cecolor» ccolor)
(setvar «blipmode» sblip)
(setvar «cmdecho» scmde)
(setvar «osmode» snp)
(setvar «3dosmode» 3dosmd)
(setvar «ucsdetect» dyucs)
)
the program gets as far as creating the cylinder or diameter of D1 and then i get the error
«error: bad argument type: numberp: nil»
hendrimE2F6C
2017-03-08
01:08:54
R2 is not being set, unless it’s coming from somewhere else not shown in this code.
Kent1Cooper
Expert Elite
2017-03-08
03:02:34
Creating an autolisp program to add a threaded hole to a selected object, the program is as follows:
; Meghan Hendricks
; HOLETHREAD.LSP
;
(defun c:HOLETHREAD ()
(setq scmde (getvar «cmdecho»))
(setvar «cmdecho» 0)
(setq sblip (getvar «blipmode»))
(setvar «blipmode» 0)
(setq sosmd (getvar «osmode»))
(setvar «osmode» 0)
(setq 3dosmd (getvar «3dosmode»))
(setvar «3dosmode» 0)
(setq dyucs (getvar «ucsdetect»))
(setvar «ucsdetect» 0)
(setq ccolor (getvar «cecolor»))
(setq e1 (entsel «nselect the object»))
(setvar «osmode» 1)
(setq pt1 (getpoint «nEnter location of new coordinate system: «))
(setq pt2 (getpoint «nEnter location of new x axis: «))
(setq pt3 (getpoint «nEnter location of new y axis: «))
(command «ucs» 3 pt1 pt2 pt3)
(setvar «osmode» 0)
(setvar «blipmode» 1)
(setq pt4 (getpoint «nEnter location of center of the hole on the surface: «))
(setvar «blipmode» 0)
(setq D1 (getreal «nInput Diameter of the hole: «))
(setq L1 (getreal «nInput depth of the hole (positive z direction): «))
(setq c (getstring «nColor of hole»))
(command «color» c)
(command «cylinder» pt4 D1 L1)
(setq e2 (entlast))
(if (>= h 0)
(progn ;- z direction
(setq pt5 (list (car pt4) (+ (cadr pt1) (* D1 0.4)) 0))
(setq pt6 (list (car pt4) (- (car pt1) D2) (- (* D1 0.1))))
(setq pt7 (list (car pt4) (+ (cadr pt1) (* D1 0.4)) (- (* D1 0.2))))
(setq pt8 (list (car pt4) (cadr pt4) (- (* D1 0.1))))
(command «3DPOLY» pt5 pt6 pt7 «c»)
(setq e3 (entlast))
(command «helix» pt8 (* 0.4 D1)(* 0.4 D1) «H» (* 0.41 R2) (+ (* 0.4 R2) L1))
(setq e4 (entlast))
(command «sweep» e3 «» «a» «n» e4 «»)
(setq e5 (entlast))
(command «subtract» e2 «» e5 «»)
(setq e6 (entlast))
)
(progn ;+z direction
(setq pt5 (list (car pt4) (+ (cadr pt1) (* D2 0.4)) 0))
(setq pt6 (list (car pt4) (- (car pt1) D2) (* D1 0.1)))
(setq pt7 (list (car pt4) (+ (cadr pt1) (* D1 0.4)) (* D1 0.1)))
(setq pt8 (list (car pt4) (cadr pt4) (* D1 0.1)))
(command «3DPOLY» pt5 pt6 pt7 «c»)
(setq e3 (entlast))
(command «helix» pt8 (* 0.4 D1)(* 0.4 D1) «H» (* 0.41 R2) (+ (* 0.4 R2) L1))
(setq e4 (entlast))
(command «sweep» e3 «» «a» «n» e4 «»)
(setq e5 (entlast))
(command «subtract» e2 «» e5 «»)
(setq e6 (entlast))
))
(command «subtract» e1 «» e6 «»)
(command «ucs» «p»)
(command «vpoint» (list 1 -1 1))
(command «vscurrent» 2) ;2d wireframe
(setvar «cecolor» ccolor)
(setvar «blipmode» sblip)
(setvar «cmdecho» scmde)
(setvar «osmode» snp)
(setvar «3dosmode» 3dosmd)
(setvar «ucsdetect» dyucs)
)
the program gets as far as creating the cylinder or diameter of D1 and then i get the error
«error: bad argument type: numberp: nil»
hendrimE2F6C
2017-03-08
01:08:54
The problem I see is in…
(if (>= h 0)
because I don’t see where h has been set. But it really doesn’t matter because if h is nil then (>= h 0) just returns nil.
So it must be something else unless you were expecting that (>= h 0).
john.uhden
Expert Elite
2017-03-08
01:31:03
I fixed that to read (>= D1 0)
And I am still getting
«error: bad argument type: numberp: nil»
hendrimE2F6C
2017-03-08
02:49:45
R2 is not being set, unless it’s coming from somewhere else not shown in this code.
Kent1Cooper
Expert Elite
2017-03-08
03:02:34
Thank you
hendrimE2F6C
2017-03-08
03:22:13
i’m working on a similar program mine just adds a while loop what did you set D2 to cause you use it but it is not set
birdgirl11
2018-03-06
19:06:26
error: bad argument type: numberp: nil
error: bad argument type: numberp: nil
2
Creating an autolisp program to add a threaded hole to a selected object, the program is as follows:
; Meghan Hendricks
; HOLETHREAD.LSP
;
(defun c:HOLETHREAD ()
(setq scmde (getvar «cmdecho»))
(setvar «cmdecho» 0)
(setq sblip (getvar «blipmode»))
(setvar «blipmode» 0)
(setq sosmd (getvar «osmode»))
(setvar «osmode» 0)
(setq 3dosmd (getvar «3dosmode»))
(setvar «3dosmode» 0)
(setq dyucs (getvar «ucsdetect»))
(setvar «ucsdetect» 0)
(setq ccolor (getvar «cecolor»))
(setq e1 (entsel «nselect the object»))
(setvar «osmode» 1)
(setq pt1 (getpoint «nEnter location of new coordinate system: «))
(setq pt2 (getpoint «nEnter location of new x axis: «))
(setq pt3 (getpoint «nEnter location of new y axis: «))
(command «ucs» 3 pt1 pt2 pt3)
(setvar «osmode» 0)
(setvar «blipmode» 1)
(setq pt4 (getpoint «nEnter location of center of the hole on the surface: «))
(setvar «blipmode» 0)
(setq D1 (getreal «nInput Diameter of the hole: «))
(setq L1 (getreal «nInput depth of the hole (positive z direction): «))
(setq c (getstring «nColor of hole»))
(command «color» c)
(command «cylinder» pt4 D1 L1)
(setq e2 (entlast))
(if (>= h 0)
(progn ;- z direction
(setq pt5 (list (car pt4) (+ (cadr pt1) (* D1 0.4)) 0))
(setq pt6 (list (car pt4) (- (car pt1) D2) (- (* D1 0.1))))
(setq pt7 (list (car pt4) (+ (cadr pt1) (* D1 0.4)) (- (* D1 0.2))))
(setq pt8 (list (car pt4) (cadr pt4) (- (* D1 0.1))))
(command «3DPOLY» pt5 pt6 pt7 «c»)
(setq e3 (entlast))
(command «helix» pt8 (* 0.4 D1)(* 0.4 D1) «H» (* 0.41 R2) (+ (* 0.4 R2) L1))
(setq e4 (entlast))
(command «sweep» e3 «» «a» «n» e4 «»)
(setq e5 (entlast))
(command «subtract» e2 «» e5 «»)
(setq e6 (entlast))
)
(progn ;+z direction
(setq pt5 (list (car pt4) (+ (cadr pt1) (* D2 0.4)) 0))
(setq pt6 (list (car pt4) (- (car pt1) D2) (* D1 0.1)))
(setq pt7 (list (car pt4) (+ (cadr pt1) (* D1 0.4)) (* D1 0.1)))
(setq pt8 (list (car pt4) (cadr pt4) (* D1 0.1)))
(command «3DPOLY» pt5 pt6 pt7 «c»)
(setq e3 (entlast))
(command «helix» pt8 (* 0.4 D1)(* 0.4 D1) «H» (* 0.41 R2) (+ (* 0.4 R2) L1))
(setq e4 (entlast))
(command «sweep» e3 «» «a» «n» e4 «»)
(setq e5 (entlast))
(command «subtract» e2 «» e5 «»)
(setq e6 (entlast))
))
(command «subtract» e1 «» e6 «»)
(command «ucs» «p»)
(command «vpoint» (list 1 -1 1))
(command «vscurrent» 2) ;2d wireframe
(setvar «cecolor» ccolor)
(setvar «blipmode» sblip)
(setvar «cmdecho» scmde)
(setvar «osmode» snp)
(setvar «3dosmode» 3dosmd)
(setvar «ucsdetect» dyucs)
)
the program gets as far as creating the cylinder or diameter of D1 and then i get the error
«error: bad argument type: numberp: nil»
hendrimE2F6C
2017-03-08
01:08:54
R2 is not being set, unless it’s coming from somewhere else not shown in this code.
Kent1Cooper
Expert Elite
2017-03-08
03:02:34
Creating an autolisp program to add a threaded hole to a selected object, the program is as follows:
; Meghan Hendricks
; HOLETHREAD.LSP
;
(defun c:HOLETHREAD ()
(setq scmde (getvar «cmdecho»))
(setvar «cmdecho» 0)
(setq sblip (getvar «blipmode»))
(setvar «blipmode» 0)
(setq sosmd (getvar «osmode»))
(setvar «osmode» 0)
(setq 3dosmd (getvar «3dosmode»))
(setvar «3dosmode» 0)
(setq dyucs (getvar «ucsdetect»))
(setvar «ucsdetect» 0)
(setq ccolor (getvar «cecolor»))
(setq e1 (entsel «nselect the object»))
(setvar «osmode» 1)
(setq pt1 (getpoint «nEnter location of new coordinate system: «))
(setq pt2 (getpoint «nEnter location of new x axis: «))
(setq pt3 (getpoint «nEnter location of new y axis: «))
(command «ucs» 3 pt1 pt2 pt3)
(setvar «osmode» 0)
(setvar «blipmode» 1)
(setq pt4 (getpoint «nEnter location of center of the hole on the surface: «))
(setvar «blipmode» 0)
(setq D1 (getreal «nInput Diameter of the hole: «))
(setq L1 (getreal «nInput depth of the hole (positive z direction): «))
(setq c (getstring «nColor of hole»))
(command «color» c)
(command «cylinder» pt4 D1 L1)
(setq e2 (entlast))
(if (>= h 0)
(progn ;- z direction
(setq pt5 (list (car pt4) (+ (cadr pt1) (* D1 0.4)) 0))
(setq pt6 (list (car pt4) (- (car pt1) D2) (- (* D1 0.1))))
(setq pt7 (list (car pt4) (+ (cadr pt1) (* D1 0.4)) (- (* D1 0.2))))
(setq pt8 (list (car pt4) (cadr pt4) (- (* D1 0.1))))
(command «3DPOLY» pt5 pt6 pt7 «c»)
(setq e3 (entlast))
(command «helix» pt8 (* 0.4 D1)(* 0.4 D1) «H» (* 0.41 R2) (+ (* 0.4 R2) L1))
(setq e4 (entlast))
(command «sweep» e3 «» «a» «n» e4 «»)
(setq e5 (entlast))
(command «subtract» e2 «» e5 «»)
(setq e6 (entlast))
)
(progn ;+z direction
(setq pt5 (list (car pt4) (+ (cadr pt1) (* D2 0.4)) 0))
(setq pt6 (list (car pt4) (- (car pt1) D2) (* D1 0.1)))
(setq pt7 (list (car pt4) (+ (cadr pt1) (* D1 0.4)) (* D1 0.1)))
(setq pt8 (list (car pt4) (cadr pt4) (* D1 0.1)))
(command «3DPOLY» pt5 pt6 pt7 «c»)
(setq e3 (entlast))
(command «helix» pt8 (* 0.4 D1)(* 0.4 D1) «H» (* 0.41 R2) (+ (* 0.4 R2) L1))
(setq e4 (entlast))
(command «sweep» e3 «» «a» «n» e4 «»)
(setq e5 (entlast))
(command «subtract» e2 «» e5 «»)
(setq e6 (entlast))
))
(command «subtract» e1 «» e6 «»)
(command «ucs» «p»)
(command «vpoint» (list 1 -1 1))
(command «vscurrent» 2) ;2d wireframe
(setvar «cecolor» ccolor)
(setvar «blipmode» sblip)
(setvar «cmdecho» scmde)
(setvar «osmode» snp)
(setvar «3dosmode» 3dosmd)
(setvar «ucsdetect» dyucs)
)
the program gets as far as creating the cylinder or diameter of D1 and then i get the error
«error: bad argument type: numberp: nil»
hendrimE2F6C
2017-03-08
01:08:54
The problem I see is in…
(if (>= h 0)
because I don’t see where h has been set. But it really doesn’t matter because if h is nil then (>= h 0) just returns nil.
So it must be something else unless you were expecting that (>= h 0).
john.uhden
Expert Elite
2017-03-08
01:31:03
I fixed that to read (>= D1 0)
And I am still getting
«error: bad argument type: numberp: nil»
hendrimE2F6C
2017-03-08
02:49:45
R2 is not being set, unless it’s coming from somewhere else not shown in this code.
Kent1Cooper
Expert Elite
2017-03-08
03:02:34
Thank you
hendrimE2F6C
2017-03-08
03:22:13
i’m working on a similar program mine just adds a while loop what did you set D2 to cause you use it but it is not set
birdgirl11
2018-03-06
19:06:26
СООБЩЕНИЯ ОБ ОШИБКАХ
Ниже приведен список сообщений об ошибках, которые вы время от
времени увидите, когда вы пишете или выводите функции AutoLISPа. Если
функция «ERROR» определена не пользователем («ERROR» связана с nil),
ошибка является стандартной акцией , тогда эти сообщения выводятся
на экран дисплея в виде:
error: message
ошибка:сообщение
следом за прослеженнй функцией. Если существует пользователь-определитель
функции «ERROR», эта функция , называемая сообщением, пройдет только в
качестве аргумента.
Функции, отклоняемые AutoCADом
Аргументы проходящих в AutoCAD функций недействительны ( таких,
как функции GETVAR «NOSUCH» или SETVAR с только читаемыми
системными переменными), или функция, переходящая сама в себя,
недействительна в текущем контексте.
bad argument type
Функция снабжена некорректным типом аргумента.( Например, вы не
можете взять STRLEN как целое.)
bad association list
Список , объявленный функцией ASSOC, не состоит из «(нужная кла-
виша ) списков.
bad entmod list
Аргумент, проходящий в функцию ENTMOD,имеет неподходящий вход
списка данных (так же , как возвращаемый функцией ENTGET).
bad formal argument list
Когда вычислена эта функция, AutoLISP удалит список недействите-
льных формальных аргументов. Возможно, что функция вовсе не является
функцией , а в некоторой степени , список данных.
bad function
Первый элемент в списке -недействительное имя функции. Возможно,
что это имя переменной или число. Это сообщение также может показывать,
что названная функция неподходяще определена- не забывайте возвращаемый
список формальных аргументов.
bad list
Неподходяще организован список, которым снабжена функция. Это мо-
жет случиться , если действительное число начинает десятичная точка;
в таком случае вы должны использовать введение 0.
Bad node ( плохой участок памяти node)
Недействителен пункт , встречаемый функцией TYPE.
bad node type in list
Недействителен пункт , встречаемый функцией FOREACH.
bad point argument
Недостаточно определена точка ( список двух действительных чисел)
проходящая в функцию , ожидающую точку. Будьте внимательны, не начинайте
действительное число с десятичной точки; в таком случае, вы должны ис-
пользовать введение 0.
bad point value
То же самое ,что выше.
bool arg1 15
Первый аргумент функции BOOLE (Булева функция) должно быть це-
лое мажду 0 и 15.
can't evaluate expression
Эта ошибка может быть вызвана неправильным местоположением деся-
тичной точки и с другой стороны, недостаточно сформулированным выражени-
ем.
console break
Пользователь ввел CTRL C , в то время , когда функция обрабаты-
валась.
divide by zero
Деление на нуль не разрешается.
extra right paren
Встретились одни или более лишние правые скобки.
file not open
Описатель файла для операции ввода-вывода (I/O) не такой , как
у доступного файла.
Function cancelled ( снимаемая функция)
Пользователь нажал CTRL C в ответ на подсказку.
function undefined for argument
Аргумента, обозначенного в функциях LOG или SQRT,нет в диапазоне.
function undefined for real
Аргумент функции вместо целого числа обозначен действительным.
Например, (LSH val 1.2)
improper argument
Аргумент в GCD отрицательное число или ноль.
incorrect number of arguments to a function
Количество аргументов определяемой пользователем функции не соот-
ветствует количеству формальных аргументов, объявленных функцией DEFUN.
insufficient node space
Недостаточен участок памяти node , для того чтобы вместить потреб-
ные действия. См. главу 6.
insufficient string space
Недостаточен участок памяти heap , чтобы вместить строку текста.
См. главу 6.
invalid argument
Неправильный тип аргумента или аргумент вне диапазона.
invalid character
Выражение содержит неверный знак.
invalid dotted pair
Точечные пары-это списки, содержащие два элемента, разде-
ленные конструкцией «space-period-space». Вы можете получить это сооб-
щение об ошибке , если вы начинаете действительное число с десятичной
точки; в таком случае вы должны использовать введение 0.
LISPSTACK overflow (переполнение стека )
Стек AutoLISPа переполнен. Это происходит из-за чрезмерного
повторения функции или очень больших списков аргументов функции. Попы-
тайтесь увеличить среду LISPSTACK для переменных.
misplaced dot
Это может иметь место , если действительное число начинает деся-
тичная точка; в таком случае вы должны использовать введение 0 .
null function
Была сделана попытка вычислить функцию , которая имеет нулевой
определитель.
quit exit abort
Это результат вызова функций QUIT или EXIT. Эти функции сейчас
не используются в AutoLISPе.
too few argyments
Слишком мало аргументов объявлено во встроенной функции
too many arguments
Слишком много аргументов объявлено во встроенной функции.
unexpected signal nnn
[ Назад ]
[ Оглавление ]
Topic: error bad argument type: FILE nil (Read 4340 times)
0 Members and 1 Guest are viewing this topic.
can someone help me debug this im at a loss as to where the issue lies
any help is appreciated
(defun c:BLKSRC1 (/ TextFile SearchStr tmpLine endlist Opened txtfile)
(IF (setq blkdir (vl-directory-files "h:/" "*.dwg"))
(if blkdir
(progn
(setq dirname (open "h:\blocks.txt" "w"))
(foreach i blkdir
(write-line i dirname)
) ;end foreach
(close dirname)
) ;end progn
) ;END IF BLKDIR
) ;END IF
(defun dclmake ()
(setq dclfl (open "blk.dcl" "w"))
(write-line "blk : dialog {" dclfl)
(write-line "label = "Search For Block...";" dclfl)
(Write-line ": boxed_column {" dclfl)
(write-line "label = "Enter Keyword & hit o.k.";" dclfl)
(write-line ": edit_box {" dclfl)
(write-line " key = "Line1";" dclfl)
(write-line " label = "Keyword:";" dclfl)
(write-line " edit_width = 50;" dclfl)
(write-line " alignment = centered;" dclfl)
(write-line " fixed_width = true;" dclfl)
(write-line "}" dclfl)
(write-line "ok_cancel;" dclfl)
(write-line "}" dclfl)
(write-line "}" dclfl)
(close dclfl)
);end dclmake
(defun edit_action1 (val)
(if
(and
(setq TextFile "h:\blocks.TXT")
;(setq
SearchStr (getstring 1 "n Enter string to search for: ")
(setq SearchStr val)
)
(setq Opened (open TextFile "r"))
) ;and
(while (setq tmpLine (read-line Opened))
(if (vl-string-search (strcase SearchStr) (strcase tmpLine))
(setq EndList (mapcar 'vl-filename-base (cons tmpLine endlist)))
)
)
(close opened)
)
(defun TT ()
(if EndList
(progn
(setq fname (open "h:\library.lba" "w"))
(foreach i EndList
(write-line (strcat "h:\slides\" i ".sld") fname)
(write-line (strcat "H:\" i ".dwg") fname)
) ;end foreach
(close fname)
) ;end progn
) ;end if
)
(dclmake)
(setq dclid (load_dialog "blk.dcl"))
(if (not (new_dialog "blk" dclid)) (exit))
(action_tile "accept" "(TT)(done_dialog)")
(action_tile "cancel" "(done_dialog)")
(action_tile "Line1" "(edit_action1 $value)")
(start_dialog)
(done_dialog)
(unload_dialog dclid)
(princ)
)

Logged
Make sure all the files listed in the code actually exist, i.e. (open «h:\blocks.txt» «w»)

Logged
TheSwamp.org (serving the CAD community since 2003)
Make sure all the files listed in the code actually exist, i.e. (open «h:\blocks.txt» «w»)
they do

Logged
you should verify they do with (findfile
( the existence of a file does not guarantee one will be granted the rights to open and write to it )


Logged
I got it working.
i removed some (if’s (and’s
and all is good now
thanks for the help all

Logged
( the existence of a file does not guarantee one will be granted the rights to open and write to it )
How True!
Rarely happens in my small world though. 
I suspect a vl-catch-all-apply would handle it.
