Продолжая войну с буфером обмена…
... и блоками вида A$C*
Статья, можно сказать, является продолжением О буфере обмена замолвим словечко…
Самое хорошее, конечно - это вообще такие блоки уничтожать. В принципе. Но ситуации бывают разные, и иногда приходится с ними работать. Можно переименовывать руками, но лично мне подобное проворачивать обычно лень. Проще уж программку написать
Логика программы достаточно проста: проходим по всем блокам, которые только есть в текущем документе. Исключаем блоки внешних ссылок. Если имя блока начинается на A$C, вперед добавляем какой-либо префикс, а в конец (на всякий случай) - счетчик таких блоков. Теоретически возможна ситуация, описанная в статье по ссылке - и тогда мало того что переименование не сработает, так еще и проблема решена не будет. Ну и до кучи - в случае ошибки переименования желательно выводить соответствующий отчет в ком.строке.
На данный момент код обрабатывает только текущий документ. Код оформлен функцией, чтобы можно было его загрузить в *.mnl или acad*doc.lsp и организовать его самовызов.
Сам код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | ;; ver. 0.1 (vl-load-com) (defun rename-copypaste (/ adoc name pref res_name err) (vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object)))) (setq pref "kpblc_") ;; тот самый префикс (vlax-for blk_def (vla-get-blocks adoc) (if (and (setq name (vla-get-name blk_def)) (tblobjname "block" name) (wcmatch name "A$C*")) (if (vl-catch-all-error-p (setq err (vl-catch-all-apply (function (lambda () (vla-put-name blk_def (strcat (setq res_name (strcat pref name)) "_" ;; И добавляем счетчик. Скорее всего, тут постоянно будет ;; только "0", но чем шут не чертит... (itoa ((lambda (/ res) (setq res 0) (vlax-for item (vla-get-blocks adoc) (if (wcmatch (vla-get-name item) (strcat res_name "_*")) (setq res (1+ res)) ) ;_ end of if ) ;_ end of vlax-for res ) ;_ end of lambda ) ) ;_ end of itoa ) ;_ end of strcat ) ;_ end of vla-put-name ) ;_ end of lambda ) ;_ end of function ) ;_ end of vl-catch-all-apply ) ;_ end of setq ) ;_ end of vl-catch-all-error-p (princ (strcat "\nОшибка переименования блока " name " : " (vl-catch-all-error-message err))) ) ;_ end of if ) ;_ end of if ) ;_ end of vlax-for (vla-endundomark adoc) (princ) ) ;_ end of defun |
И ссылка на загрузку: rename-copypaste.lsp
Версия с командой rename-copypaste : rename-copypaste.lsp
Алексей, спасибо за вашу работу. Можете подсказать как организовать работу функции, для запуска по команде из палитры, без набора (rename-copypaste)
Для этого вместо
достаточно использовать
Я на Autodesk University 2017, когда читал по лиспу доклад, все это рассказывал. с - на английской раскладке. Двоеточие обязательно. Команду можно будет вызывать как rename-copypaste с ком.строки, палитры, меню - откуда угодно.
Исправил, все равно при запуске ^C^C^P(load "rename-copypaste");rename-copypaste; пишет неизвестная команда
2
3
4
5
6
(defun C:rename-copypaste (/ adoc name pref res_name err)
(vl-load-com)
(vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object))))
А если так: http://autolisp.ru/?attachment_id=3473
Все равно пишет ошибку
Все равно пишет ошибку, даже с новой версией.
Ну чудес-то не бывает!
Как забирать коды с сайта - описал в спойлере на страничке http://autolisp.ru/lisp_source_catalogue/ (сейчас специально дополнил именно для текущего случая)
Если вручную загрузить lsp в AutoCAD - команда работает?
Странно после перезагрузки компьютера все заработало. Еще раз спасибо за помощь.