I am writing a function that removes background mask from all mtext, however, I am getting a bad argument type: numberp: nil
error after running the code:
(defun c:bgm ()
(vl-load-com)
(setq ss1 (ssget "X" '((0 . "MTEXT")(-4 . "<OR")(90 . 1)(90 . 3)(-4 . "OR>")))); selects all mtext with background mask on
(setq sscount (sslength ss1))
(repeat sscount
(setq mtxtobj (entget (vlax-vla-object->ename (ssname ss1 counter))))
(vla-put-backgroundfill mtxtobj :vlax-false)
(entmod mtxtobj)
)
)
Any ideas why?
asked Jun 23, 2018 at 12:13
There are a number of issues with your code:
-
If the
ssget
expression does not obtain a selection (i.e. if there are no objects present in the drawing which fulfil the selection criteria), thenssget
will returnnil
, and consequently thesslength
function will error when supplied with a null argument.To avoid this, test the value returned by the
ssget
function using anif
statement before proceeding with the remaining code:(if (setq ss1 (ssget "_X" '((0 . "MTEXT") (-4 . "<OR") (90 . 1) (90 . 3) (-4 . "OR>")))) (progn (setq sscount (sslength ss1)) ... ) )
-
You reference the variable
counter
in yourssname
function, which is not defined in the scope of thec:bgm
function:(ssname ss1 counter)
This should instead be
sscount
as defined earlier in your code. -
You seem to be confused between entity names and vla-objects:
-
ssname
returns an entity name, however, you are passing this to thevlax-vla-object->ename
function, which converts a vla-object to an entity name. -
You are using the
vla-put-backgroundfill
function to change thebackgroundfill
property of a vla-object, however, you are passing this function the variable defined by the value returned byentget
, which is a DXF data list, not a vla-object. -
You are using
entmod
to modify the DXF data assigned to the variablemtxtobj
— this is not required when changing ActiveX properties of a vla-object.
-
Taking the above into consideration, I would suggest the following solution:
(defun c:bgm ( / cnt obj sel )
(if (setq sel (ssget "_X" '((0 . "MTEXT") (-4 . "<OR") (90 . 1) (90 . 3) (-4 . "OR>"))))
(repeat (setq cnt (sslength sel))
(setq cnt (1- cnt)
obj (vlax-ename->vla-object (ssname sel cnt))
)
(vla-put-backgroundfill obj :vlax-false)
)
)
(princ)
)
(vl-load-com) (princ)
answered Jun 24, 2018 at 10:11
Lee MacLee Mac
15.5k6 gold badges32 silver badges80 bronze badges
1
The error is probably due to:
(ssname ss1 counter)
where counter is nil.
You should use sscount instead. You also have to decrement the sscount value to iterate through the selection set.
(defun c:bgm (/ ss1 sscount)
(vl-load-com)
(if (setq ss1 (ssget "X" '((0 . "MTEXT") (-4 . "<OR") (90 . 1) (90 . 3) (-4 . "OR>"))))
(repeat (setq sscount (sslength ss1))
(setq sscount (1- sscount)
mtxtobj (vlax-vla-object->ename (ssname ss1 sscount))
)
(vla-put-backgroundfill mtxtobj :vlax-false)
)
)
)
answered Jun 23, 2018 at 17:41
gileCADgileCAD
2,2701 gold badge10 silver badges10 bronze badges
1
From the thread «stringp nil error» at the next link:
http://discussion.autodesk.com/thread.jspa?messageID=5404144
«Re: stringp nil error
The VLIDE can really help you here.
Open your code in the editor, and load it from within the editor. Then go to
the Debug menu, and make sure the Break On Error option is selected. Now
execute your code, either from AutoCAD’s command prompt, or the Visual LISP
Console window.
When the error occurs, the VLIDE should pop up. And you can use the button
that looks like a red dot with parens around it and an arrow pointing into
it (Last break). This will highlight the statement where the error occurs.
You will find on of your variables is set to nil, instead of some value (a
string) your code expects.
While in break mode you can use Inspect to see what variables or even
statements evaluate to. To take the debugging a step further, set a break
point (F9) somewhere above the problem statement and execute the function
again. When the code reaches the break point, the VLIDE will become active
and you can step thru each statement using F8. Inspect what is happening
with your code.
That ought to help you find the source of the issue.
—
R. Robert Bell»
HTH,
Constantin
a écrit dans le message de news:
5407425@discussion.autodesk.com…
using visual lisp editor can i find my error that is causing this message
from autocad: bad argument type: numberp: nil?
8 минут назад, newborn сказал:
Пока не могу понять, что от меня требует мой научный руководитель каким образом вставить рамку (надеюсь блоком, а не вписывать отрисовку рамки в программу).
Однозначно, блоком. Т.к., потом этот чертеж может редактироваться. Работать с кучей отрезков, имеющих фиксированное взаимное положение, — это ад.
Бывали случаи, когда отдельные проектировщики специально разбивали блоки и полилинии перед передачей заказчику, чтобы затруднить дальнейшую работу с исходниками. Не нужно такие решения тиражировать). Кроме того, используя блоки с атрибутами, можно сразу охватить и автоматизированное заполнение штампов.
12 минут назад, newborn сказал:
предложили создать программу для его автоматической отрисовки — т.е. автоматизации работы технолога + добавить актуальность на фоне перехода из автокада в нанокад.
Фишка в том, что написание лиспа — это автоматизация, но это решение универсальное для АС и NC, поэтому к переходу отношения не имеет.
А предлагаемая мной выше тема с СПДС как раз может покрыть именно это требование.
Кстати, там красиво решена и задача оформления форматок чертежа.
добавлено через 2 минуты
3 минуты назад, lidia.antipina.ru сказал:
Прошло 20 с лишним лет, как навояла дисер на тему автоматизации ТП и станочных приспособ (думала, что тема уплывала окончательно, но надо перевернуть страницу и благополучно забыть), а воз и ныне там…
Ну, чисто с т.з. академического интереса или обучающего процесса — почему бы и нет?)))
Перейти к содержимому раздела
Форумы CADUser
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Дерево сообщений Активные темы Темы без ответов
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
#1 27 апреля 2008г. 14:35:20
- Aspirine
- Восстановленный участник
- На форуме с 20 марта 2008г.
- Сообщений: 13
- Спасибо: 0
Тема: Нужна помощь с AutoLISP
Здравствуйте!
Задали написать программу на автолиспе чтобы запрашивала у пользователя размеры того что будет строить. Я не знаю каким образом это осоуществить. вроде с функциями типа commnad и setq разобрался, а как спросить пользователя у размерах, и каким образом недопкстить задание им слишком больших или слишком малых размеров?
Зарание спасибо.
#2 Ответ от Н.Н.Полещук 27 апреля 2008г. 14:43:37
- Н.Н.Полещук
- Восстановленный участник
- На форуме с 19 марта 2004г.
- Сообщений: 358
- Спасибо: 0
Re: Нужна помощь с AutoLISP
> Aspirine
См. функции getreal, getint, initget, getpoint
#3 Ответ от Aspirine 27 апреля 2008г. 14:56:09
- Aspirine
- Восстановленный участник
- На форуме с 20 марта 2008г.
- Сообщений: 13
- Спасибо: 0
Re: Нужна помощь с AutoLISP
Спасибо. А не подскажите какую-нибудь литературу в которой описаны эти функции?
#4 Ответ от Aspirine 28 апреля 2008г. 11:24:58
- Aspirine
- Восстановленный участник
- На форуме с 20 марта 2008г.
- Сообщений: 13
- Спасибо: 0
Re: Нужна помощь с AutoLISP
В общем немного разобрался. Вот только проблема небольшая. Вот код:
(command "_cylinder" "0,0,0" "3" "6") (setq c1 (ssget "l")) (command "_cylinder" "0,0,0" "1.25" "8") (setq c2 (ssget "l")) (command "_cone" "0,0,8" "1.25" "радиус" "0.5" "0.2") (setq k1 (ssget "l")) (command "_zoom" "гр" "") (command "_.union" c2 k1 "") ;(setq c1 (entlast))
При попытке загрузки в автокад, выдаёт:
«; ошибка: неверная строка режима ssget»
Синтаксис проверил, вроде всё норма.
В чем проблема?
P.S. Цункцию ssget пытаюсь использовать для дальнейшего использования команд _union и _substract. Если возможно подругому подскажите плиз. Спасибо.
#5 Ответ от Александр Ривилис 28 апреля 2008г. 13:30:12
- Александр Ривилис
- Активный участник
- Откуда: Украина / Киев
- На форуме с 15 апреля 2005г.
- Сообщений: 8,661
- Спасибо: 158
Re: Нужна помощь с AutoLISP
#6 Ответ от Aspirine 28 апреля 2008г. 14:14:40
- Aspirine
- Восстановленный участник
- На форуме с 20 марта 2008г.
- Сообщений: 13
- Спасибо: 0
Re: Нужна помощь с AutoLISP
Спасибо. Действительно помогло…
Можно ещё вопрос. Мне нужно организовать чтобы пользователь имел возможность сам вводить размеры детали из определённой зоны значений.
Написал пока вот что:
(setq hd 10) (setq parametr1 (getreal (strcat "nВведите высоту детали <" (rtos hd) ">: "))) (setq hd (if parametr1 parametr1 hd)) (setq rc1 3) (setq parametr2 (getreal (strcat "nВведите радиус большого цилиндра <" (rtos rb) ">: "))) (setq rc1 (if parametr2 parametr2 rc1)) (setq rb1 6) (setq parametr3 (getreal (strcat "nВведите высоту большого цилиндра <" (rtos rs) ">: "))) (while (> parametr3 hd) (setq parametr3 (getreal (strcat "nВведите высоту большого цилиндра <" (rtos rs) ">: "))) ) (setq rb1 (if parametr3 parametr3 rb1))
При загрузке а AutoCAD, он даёт ввести первое значение, а потом вылетает обратно в редактор автолиспа и в консоли Автолиспа следующая ошибка:
«ошибка: неверный тип аргумента: numberp: nil»
Никак не могу понять в чём проблема.
#7 Ответ от Victor 28 апреля 2008г. 14:38:09
- Victor
- Восстановленный участник
- На форуме с 26 марта 2007г.
- Сообщений: 270
- Спасибо: 0
Re: Нужна помощь с AutoLISP
Что такое rb?
#8 Ответ от Atol 28 апреля 2008г. 14:39:00
- Atol
- Активный участник
- На форуме с 21 февраля 2006г.
- Сообщений: 1,365
- Спасибо: 3
Re: Нужна помощь с AutoLISP
В редакторе Автолиспа есть возможность проставлять метки остановки (наставь до и после функций) и просмотра текущего значения переменных (а то и целых выражений) для контроля и поиска ошибок
#9 Ответ от Aspirine 28 апреля 2008г. 15:08:25
- Aspirine
- Восстановленный участник
- На форуме с 20 марта 2008г.
- Сообщений: 13
- Спасибо: 0
Re: Нужна помощь с AutoLISP
rb- это переменная которая должна по идеи соответствовать высоте большого цилиндра.
#10 Ответ от Aspirine 28 апреля 2008г. 15:19:39
- Aspirine
- Восстановленный участник
- На форуме с 20 марта 2008г.
- Сообщений: 13
- Спасибо: 0
Re: Нужна помощь с AutoLISP
Увидел… Да, это не внимательность и моя лень, копировал и набивал разное.
Исправил.
Но это не решило проблему…
#11 Ответ от Aspirine 28 апреля 2008г. 16:35:26
- Aspirine
- Восстановленный участник
- На форуме с 20 марта 2008г.
- Сообщений: 13
- Спасибо: 0
Re: Нужна помощь с AutoLISP
Разобрался, спасибо. Дело было в неправильно ориентированных переменных.
Но возник ещё вопрос:
Мне нужно в координатах начальной точки тела указать две координаты и одну переменную, котороя может измениться исходя из желанию конеченого пользователя.
Например:
(command "_cylinder" "0,0,S3" rc1 rb1 "")
где rc1,rb1, S3 — переменые. Автокад при загрузке в него говорит что так координаты точек
«0,0,S3» задавать нельзя. Как пуступить в этой ситуации?
#12 Ответ от Александр Ривилис 28 апреля 2008г. 16:49:24
- Александр Ривилис
- Активный участник
- Откуда: Украина / Киев
- На форуме с 15 апреля 2005г.
- Сообщений: 8,661
- Спасибо: 158
Re: Нужна помощь с AutoLISP
(command "_cylinder" (list 0 0 S3) rc1 rb1 "")
#13 Ответ от Aspirine 28 апреля 2008г. 18:18:56
- Aspirine
- Восстановленный участник
- На форуме с 20 марта 2008г.
- Сообщений: 13
- Спасибо: 0
Re: Нужна помощь с AutoLISP
помогло, спасибо. А команда List- она создаёт список, да?
#14 Ответ от Александр Ривилис 28 апреля 2008г. 18:41:36
- Александр Ривилис
- Активный участник
- Откуда: Украина / Киев
- На форуме с 15 апреля 2005г.
- Сообщений: 8,661
- Спасибо: 158
Re: Нужна помощь с AutoLISP
> Александр Ривилис
Функция (а не команда) (list …) создает список. Учи мат.часть (т.е. язык программирования AutoLisp/VisualLisp).
Сообщения 14
Тему читают: 1 гость
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
3 / 3 / 1 Регистрация: 21.10.2015 Сообщений: 92 |
|
1 |
|
08.11.2015, 21:43. Показов 10255. Ответов 21
Здравствуйте! Необходимо реализовать вывод и ввод в файлы. Программа чертит заданную по условию фигуру и проверяет попадает ли точка в заштрихованную область. Пользователь может выбрать вводить ли ему точку самому (с клавиатуры), либо ввести точку из файла (где я и застряла). Точка введённая пользователем с клавиатуры должна быть записана в файл (тут тоже не лучше). В общем не получается у меня с файлами работать(
0 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
08.11.2015, 21:43 |
Ответы с готовыми решениями: Работа с файлом Программа в AUTOLISP Пятнадцать трапеций,… Программа в AutoLISP Запуск AutoLISP 21 |
597 / 917 / 149 Регистрация: 10.08.2015 Сообщений: 4,806 |
|
08.11.2015, 21:53 |
2 |
В чем проблема-то?
0 |
3 / 3 / 1 Регистрация: 21.10.2015 Сообщений: 92 |
|
08.11.2015, 21:58 [ТС] |
3 |
Не видит файл. (чтение)
0 |
597 / 917 / 149 Регистрация: 10.08.2015 Сообщений: 4,806 |
|
08.11.2015, 22:04 |
4 |
Не видит файл Так покажи, автокад курсы экстрасенсов не проходил, он работает только в каталогах, описанных в путях поддержки, либо при указании абсолютного пути
0 |
3 / 3 / 1 Регистрация: 21.10.2015 Сообщений: 92 |
|
08.11.2015, 22:13 [ТС] |
5 |
Посмотрите для начала мой код. Вы тоже сейчас занимаетесь экстрасенсорикой. Там два варианта вывода из файла. Я бы хотела получить какою-нибудь помощь или пояснение по данному вопросу.
0 |
vlisp 597 / 917 / 149 Регистрация: 10.08.2015 Сообщений: 4,806 |
||||
08.11.2015, 23:17 |
6 |
|||
я не вижу ничего криминального в увиденном в части чтения из файла, по идее должно работать. Ну разве что можно попробовать такой вариант, что он выдаст:
1 |
3 / 3 / 1 Регистрация: 21.10.2015 Сообщений: 92 |
|
09.11.2015, 00:32 [ТС] |
7 |
ошибка: неверный тип аргумента
0 |
597 / 917 / 149 Регистрация: 10.08.2015 Сообщений: 4,806 |
|
09.11.2015, 01:08 |
8 |
ошибка: неверный тип аргумента Это не вся строка, сложно было скопировать полностью? Как вызываете функцию FileToList?
0 |
3 / 3 / 1 Регистрация: 21.10.2015 Сообщений: 92 |
|
09.11.2015, 01:27 [ТС] |
9 |
Я вызываю весь написанный мною код с самого начала. Вызов делаю через командную строку AutoCAD.
0 |
597 / 917 / 149 Регистрация: 10.08.2015 Сообщений: 4,806 |
|
09.11.2015, 01:56 |
10 |
; ошибка: неверный тип аргумента: numberp: nil эта ошибка означает что в оператор подставляется неинициализированная переменная
; ошибка: слишком мало аргументов тут вообще все понятно… забыли подставить один или несколько аргументов… нужно быть внимательнее и пользоваться инструментами форматирования кода
0 |
3 / 3 / 1 Регистрация: 21.10.2015 Сообщений: 92 |
|
09.11.2015, 02:14 [ТС] |
11 |
эта ошибка означает что в оператор подставляется неинициализированная переменная осталось только понять в каком именно месте. т.к ваша функция верна. в предыдущих вариантах чтения из файла такой ошибки не наблюдалось.
0 |
597 / 917 / 149 Регистрация: 10.08.2015 Сообщений: 4,806 |
|
09.11.2015, 02:20 |
12 |
Если файл пустой, то функция вернет nil, иначе список строк, который все равно еще нужно преобразовывать в список чисел и уже из него брать число для подстановки… используйте средства отладки vlide для отлова ошибок
0 |
3 / 3 / 1 Регистрация: 21.10.2015 Сообщений: 92 |
|
09.11.2015, 02:40 [ТС] |
13 |
А вот такой вопрос, пожалуй его следовало задать сразу: мне не сильно понятен сам код . Если в первом случае фигурирует полный путь к файлу и его наименование, что является для меня привычным, то здесь я ничего такого не вижу.
0 |
597 / 917 / 149 Регистрация: 10.08.2015 Сообщений: 4,806 |
|
09.11.2015, 08:36 |
14 |
Если в первом случае фигурирует полный путь к файлу и его наименование, что является для меня привычным, то здесь я ничего такого не вижу. настройка путей поддержки избавляет от необходимости использовать абсолютные пути
0 |
Lambdik 1048 / 942 / 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 1048 / 942 / 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 1048 / 942 / 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 |