AutoLISP для проектировщика
Заменить значение атрибута: префикс к маркировке
Блоки и атрибуты команда: ПРЕФИКСentmod · entupd · strcase ~6 мин
Заказчик попросил добавить к маркировке префикс системы. Блоков — восемьдесят. Вручную это вечер; циклом из прошлых уроков — одна команда.
- Складываем всё изученное: набор блоков → у каждого пройти атрибуты → у нужного тега заменить значение (subst + entmod) и перерисовать (entupd).
Код
(defun c:ПРЕФИКС (/ ss i e a d) (setq ss (ssget '((0 . "INSERT")))) (if ss (progn (setq i 0) (repeat (sslength ss) (setq e (ssname ss i) a (entnext e)) (while (and a (= "ATTRIB" (cdr (assoc 0 (setq d (entget a)))))) (if (= "МАРК" (strcase (cdr (assoc 2 d)))) (progn (entmod (subst (cons 1 (strcat "ПС-" (cdr (assoc 1 d)))) (assoc 1 d) d)) (entupd a) ) ) (setq a (entnext a)) ) (setq i (1+ i)) ) ) ) (princ))
- '((0 . "INSERT"))
- — фильтр прямо в ssget: пользователь выбирает рамкой, а в набор попадут только блоки
- strcase
- — имя тега приводим к верхнему регистру — сравнение не зависит от того, как тег набрали
- strcat "ПС-"
- — новое значение = префикс + старое значение
- entupd a
- — перерисовать атрибут: без этого текст на экране обновится только после регенерации
Попробуйте сами
Настройте команду под другую систему: тег НОМЕР и префикс «АУ-». Подписи блоков на сцене меняются, как только оба поля верны.
(if (= "" (strcase (cdr (assoc 2 d))))
(entmod (subst (cons 1 (strcat "" (cdr (assoc 1 d))))
(assoc 1 d) d))
)
тег атрибута префикс
Условный результат
1
2
3
4
команда ищет тег «МАРК» — у этих блоков он называется НОМЕР
Зачем после entmod вызывается entupd?
Как запустить у себя
- 1Скопируйте код кнопкой выше и сохраните в файл с расширением .lsp — в кодировке ANSI (Windows-1251), чтобы русский текст не превратился в «????».
- 2Загрузите файл: команда ЗАГПРИЛ (APPLOAD) или просто перетащите файл в окно чертежа.
- 3Введите в командной строке: ПРЕФИКС
Пробуйте на копии чертежа. В AutoCAD LT работает начиная с LT 2024.