Код не работает, нужно исправить. Выберите объекты...

Created on: November 12, 2026

Answered using GPT-6 Thinking by Chat01

Question

Код не работает, нужно исправить.
Выберите объекты: найдено: 0, всего: 0
Выберите объекты:
; ошибка: неверный тип аргумента: lselsetp nil
;; Включить текстовую рамку для metxt

(defun c:mtxt-frame (/ ss1 ent)
(setq ss1 (ssget '((0 . "MTEXT"))))
(mapcar '(lambda (x)
(if (= (type (setq ent (cadr x))) 'ename)
(progn (entmod (append (entget ent) '((90 . 16) (63 . 256) (45 . 1.5) (441 . 0))))
(entupd ent))))
(ssnamex ss1))
(princ))

Thought

Searched 12 websites

Answer

Причина ошибки уже видна: когда AutoCAD не находит ни одного объекта MTEXT, функция ssget возвращает nil, а код передаёт его в ssnamex. Проверю также DXF-параметры рамки, чтобы исправленный вариант не только устранял ошибку, но и включал именно рамку текста.

Thought

Refining the routine

I’m checking why selection returns zero: the filter accepts only MTEXT, not single-line text, leaders, or block contents. I’m also ensuring the routine handles no selection cleanly and updates MTEXT properties safely.

Improving frame handling

I’m refining the MTEXT update so existing background-mask codes don’t conflict with the frame. I’m removing related codes before adding the frame settings, while preserving the object’s other properties and handling selection failures clearly.

Finalizing the fix

I’m consolidating the routine into a safer version: it filters MTEXT, removes conflicting background-mask data, applies the frame settings, counts successful updates, and reports when no MTEXT was selected.

Finalized routine and improved frame handling

Searched 5 websites

Worked for 45s

Answer

Text version

Ошибка неверный тип аргумента: lselsetp nil возникает потому, что программа не находит ни одного объекта MTEXT, но всё равно пытается обработать пустой набор объектов.

В исходном коде есть ещё две проблемы:

  • Нет проверки, выбраны ли объекты.
  • DXF-код 90 добавляется без проверки его существования, из-за чего могут возникать дублирующиеся параметры.

Ниже исправленный вариант. Он включает текстовую рамку вокруг MTEXT без фоновой маски, обрабатывает несколько объектов и не выдаёт ошибку при пустом выборе. Значение DXF 90 = 16 соответствует включённой текстовой рамке. (ezdxf.readthedocs.io forums.autodesk.com)

Исправленный AutoLISP

lisp
(defun c:mtxt-frame (/ ss i ent ed n) (princ "\nВыберите многострочные тексты MTEXT: ") (if (setq ss (ssget '((0 . "MTEXT")))) (progn (setq i 0 n 0) (repeat (sslength ss) (setq ent (ssname ss i)) (setq ed (entget ent)) ;; Удаляем старые параметры рамки и маски (setq ed (vl-remove-if '(lambda (x) (member (car x) '(90 45 63 421 431 441)) ) ed ) ) ;; Включаем текстовую рамку (setq ed (append ed '((90 . 16) (45 . 1.5)) ) ) ;; Сохраняем изменения (if (entmod ed) (progn (entupd ent) (setq n (1+ n)) ) ) (setq i (1+ i)) ) (princ (strcat "\nРамка включена. Обработано объектов: " (itoa n) ) ) ) (princ "\nОбъекты MTEXT не выбраны.") ) (princ) )

Как запустить

  1. Сохраните код в файл mtxt-frame.lsp.
  2. В AutoCAD выполните команду APPLOAD и загрузите файл.
  3. Введите MTXT-FRAME и нажмите Enter.
  4. Выберите один или несколько объектов многострочного текста.

Важно: программа работает только с MTEXT. Если вы выбираете обычный однострочный TEXT, AutoCAD покажет найдено: 0, поскольку этот тип объектов не проходит фильтр выбора.

Если после исправления программа по-прежнему показывает найдено: 0, напишите, пожалуйста, какая у вас версия AutoCAD и какой именно текст вы выбираете — TEXT или MTEXT. Это поможет определить, почему объекты не распознаются.

Share this Q&A