Список и запрос определенного объекта объекта в AutoLISP - PullRequest
0 голосов
/ 18 сентября 2018

Я борюсь с этой ошибкой, которую я получаю, я новичок в AutoLISP.

Сообщение об ошибке: неверный тип аргумента: stringp (142. 3000.0)

Единственная цель на данный момент - запросить выбранную конкретную объектную сущность.

Мой код следующий:

(defun c:getObjectLenght()
    (setq a (car (entsel "\nSelect a object: ")))
    (setq b (entget a))
    (setq c (assoc 142 b))
    (prompt (strcat "\nThe value of 142 is: " c))
(princ)
)

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

Спасибо заранее. :)

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

strcat ожидают строки, но (assoc 142 b) возвращает список (142 . 3000.0), поэтому необходимо преобразовать список в строку.зависит от сущности Вы выбираете и тип значения Вы должны использовать rtos, itoa или vl-princ-to-string

Полагаю, вам нужно:

(strcat "\nThe value of 142 is: " (vl-princ-to-string (cdr(assoc 42 b ) ) ))
0 голосов
/ 19 сентября 2018

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

(assoc  8 (entget (car (entsel)) ))

После выбора вывода объекта, как (8 . "0")
Это имя слоя выбранного объекта в вашем случае имя может отличаться

Отметьте еще один пример

(assoc  10 (entget (car (entsel)) ))

После выбора выхода объекта (10 3.25 5.5 0.0)
Выходным значением является координата вставки выбранного объекта.

Обратите внимание, что Strcat функция Join only string check more here .

В своей функции в строке № 5 вы пытаетесь присоединиться к строке со списком , поэтому возникает ошибка.

Как вы упоминаете об ошибке, я думаю, вам нужно объединить значение 3000.0.

для этого вы можете изменить свою функцию, как показано ниже.

(defun c:getObjectLenght()
    (setq a (car (entsel "\nSelect a object: ")))
    (setq b (entget a))
    (setq c  (if (assoc 142 b)  (rtos (cdr (assoc 142 b)))  "Not Found" ) )
    ;Note that rtos function use to convert decimal value into sting.
    ; And if condition use in case entity not contain Key value 142 so to avoid error.
    (prompt (strcat "\nThe value of 142 is: " c))
(princ)
)

Я никогда не сталкивался с кодом DXF assoc 142 Я гуглю по этому поводу, но не нашел много.

...