Перенести числовые тексты на новый слой
На форуме ru-board задали вопрос - как можно перенести все тексты, в которых есть числа (и только числа!) на другой слой. Ну, по крайней мере я так понял задачу.
Появилось чуток свободного времени, по-быстром нарисовал код:
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 | (vl-load-com) (defun _kpblc-move-all-text-to-layer (/ layer adoc selset str num) (if (and (= (type (setq layer (vl-catch-all-apply (function (lambda () (getstring t "\nВведите имя слоя, на который надо переместить тексты <Отмена> : ")) ) ;_ end of function ) ;_ end of vl-catch-all-apply ) ;_ end of setq ) ;_ end of type 'str ) ;_ end of = (setq layer (vl-string-trim " " layer)) (/= layer "") (= (type (setq selset (vl-catch-all-apply (function (lambda () (ssget "_:L" '((0 . "*TEXT,ATT*")))))))) 'pickset ) ;_ end of = ) ;_ end of and (progn (vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object)))) (setq num '(32 44 46 48 49 50 51 52 53 54 55 56 57)) (foreach ent ((lambda (/ tab item) (repeat (setq tab nil item (sslength selset) ) ;_ end setq (setq tab (cons (ssname selset (setq item (1- item))) tab)) ) ;_ end of repeat ) ;_ end of lambda ) (setq str (vl-string->list (vla-get-textstring (vlax-ename->vla-object ent)))) (if (apply 'and (mapcar '(lambda (x) (member x num)) str)) (progn (entmod (subst (cons 8 layer) (assoc 8 (entget ent)) (entget ent)))) ) ;_ end of if ) ;_ end of foreach (vla-regen adoc acallviewports) (vla-endundomark adoc) ) ;_ end of progn ) ;_ end of if ) ;_ end of defun (defun c:text-to-layer () (_kpblc-move-all-text-to-layer)) (princ "\nНаберите без кавычек "text-to-layer" для запуска команды") (princ) |
Код простой до безобразия: получаем имя слоя, получаем набор примитивов (тексты - однострочные и многострочные, ну и заодно атрибуты туда же), исключаем примитивы на заблокированных слоях, и потом проходимся по каждому элементу.
Преобразовываем возможную строку совпадений " ,.0123456789" в список, потом получаем строку текста, и смотрим - все ли элементы строки входят в перечень возможных.
wcmatch в данном случае мне не показалась достаточно эффективной.
Код для скачивания: здесь.
Вызов: text-to-layer