Атрибуты - одновременное редактирование их значений в куче блоков
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Атрибуты - одновременное редактирование их значений в куче блоков

Атрибуты - одновременное редактирование их значений в куче блоков

Ответ
Поиск в этой теме
Непрочитано 22.02.2024, 05:01 #1
Атрибуты - одновременное редактирование их значений в куче блоков
shishoq
 
spb
Регистрация: 23.01.2005
Сообщений: 124

Есть куча блоков, скажем: 1, 2, 3, 4, 5 (на самом деле в 10 раз больше).
Есть несколько атрибутов, например, А, Б, В.
В блоки 1, 2, 3 (в каждый) входят А, Б, В.
В блок 4 входят А и Б.
В блок 5 только А.

Нужно: выбрать скопом 200 блоков в ЧАСТИ чертежа (~200 вставок ~50-ти блоков)
и задать для одинаковых атрибутов в разных блоках одинаковые значения.
То есть хотелось бы получить обычную табличку как в окне свойств:
| А | _ | . . . . . повлияет на блоки 1, 2, 3, 4, 5
| Б | _ | . . . . . повлияет на блоки 1, 2, 3, 4
| В | _ | . . . . . повлияет на блоки 1, 2, 3 (на бл. 4 и 5 не повлияет, но ничего и не испортит!)

Проблема: при обычном выборе Автокад в окне свойств показывает ОБЩИЕ свойства выбранных объектов. Даже если мы выбираем только блоки (1-5), Автокад покажет в свойствах только атрибут А, как единственно общий для всех выбранных блоков:
| А | _ | . . . . . повлияет на блоки 1, 2, 3

Есть ли какой редактор (для Ак2014), способный показать ВСЕ атрибуты в выбранных блоках по типам (определениям атр.) и назначить общие значения для одинаковых атрибутов?

(Разные редакторы атр. в Акаде потыкал - не помогло или недопонял и тему тут поискал - ненашол)

Спасибо

Последний раз редактировалось shishoq, 22.02.2024 в 15:30.
Просмотров: 1185
 
Непрочитано 22.02.2024, 07:31
#2
trir


 
Регистрация: 18.12.2010
Сообщений: 5,107


Map 3D + БД
trir вне форума  
 
Непрочитано 22.02.2024, 09:22
#3
stas_org


 
Регистрация: 05.04.2007
Самара
Сообщений: 1,202


Найти-Заменить

----- добавлено через 19 сек. -----
Команды Найти-Заменить
stas_org вне форума  
 
Непрочитано 22.02.2024, 09:56
#4
kp+

идущий по граблям
 
Регистрация: 26.05.2005
Сообщений: 5,170


Как насчет такого: https://lee-mac.com/batte.html
kp+ вне форума  
 
Непрочитано 22.02.2024, 10:08
1 | #5
Dinoxromniy


 
Регистрация: 14.09.2020
Санкт-Петербург
Сообщений: 395


Цитата:
Сообщение от shishoq Посмотреть сообщение
Есть ли какой редактор (для Ак2014)
Не в курсе про 2014, в 2022:
1. Выделяю нужные блоки, изолирую через ._ISOLATEOBJECTS
2. Запускаю ._ATTOUT , получаю файл txt с перечнем всех выделенных экземпляров блоков со всеми атрибутами.
3. Открываю txt непосредственно экселем с разделителем "табуляция", редактирую атрибуты как мне надо, если у конкретного блока нет атрибута - он отображается как <>. После редактирования просто нажимаю ctrl+s, файл сохраняется в txt формате же.
4. ._ATTIN
5. ._UNISOLATEOBJECTS
Dinoxromniy вне форума  
 
Непрочитано 27.02.2024, 09:30
#6
freese

ingénieur
 
Регистрация: 21.07.2008
Сообщений: 766


У разных блоков, одинаковые атрибуты отображаются в свойствах
freese вне форума  
 
Непрочитано 27.02.2024, 11:10
#7
Dinoxromniy


 
Регистрация: 14.09.2020
Санкт-Петербург
Сообщений: 395


Цитата:
Сообщение от freese Посмотреть сообщение
У разных блоков, одинаковые атрибуты отображаются в свойствах
Не успел за вашей мыслью: если сюда добавить третий блок, в котором нет атрибутов z и z1, то при выделении будет отображен только атрибут z2. Если после этого добавить четвертый блок без атрибута z2 - отображаться не будут вообще никакие. Разве это не так работает?
Dinoxromniy вне форума  
 
Непрочитано 27.02.2024, 13:52
#8
freese

ingénieur
 
Регистрация: 21.07.2008
Сообщений: 766


Цитата:
Сообщение от Dinoxromniy Посмотреть сообщение
Не успел за вашей мыслью: если сюда добавить третий блок, в котором нет атрибутов z и z1, то при выделении будет отображен только атрибут z2. Если после этого добавить четвертый блок без атрибута z2 - отображаться не будут вообще никакие. Разве это не так работает?
а у ТС какие цели?

Цитата:
и задать для одинаковых атрибутов в разных блоках одинаковые значения.
freese вне форума  
 
Непрочитано 27.02.2024, 15:09
#9
Dinoxromniy


 
Регистрация: 14.09.2020
Санкт-Петербург
Сообщений: 395


Цитата:
Сообщение от freese Посмотреть сообщение
а у ТС какие цели?
Как я понял задачу - наоборот уйти от ручной выборки типов блоков, так как их 50 штук, а атрибуты разбросаны хаотично.
Весь вопрос, как из 50 блоков, заявленных ТС, выделить только те, у которых есть один из трех атрибутов (делить еще и на комбинации из двух /трех атрибутов смысла нет), не затрагивая все остальные. Мне вот кроме лиспа в голову способа как то не приходит. Или можно стандартными средствами?
Dinoxromniy вне форума  
 
Непрочитано 27.02.2024, 16:44
#10
Nike

Шаражпроектхалтурмонтаж
 
Регистрация: 29.10.2004
Талды-Париж
Сообщений: 6,010


_attout / редактирование / _attin

Цитата:
Сообщение от Dinoxromniy Посмотреть сообщение
выделить только те, у которых есть один из трех атрибутов
https://www.cadtutor.net/forum/topic...comment=534394

Цитата:
(defun C:SelBlksByAttTag ( / msg dcl des dch dcf r )

(vl-some (function (lambda (x / msg) (and (vl-catch-all-error-p (setq msg (vl-catch-all-apply (eval x)))) (prompt (strcat "\nError: " (vl-catch-all-error-message msg))))))
'(
(function
(lambda nil
(and (setq dcl (vl-filename-mktemp nil nil ".dcl")) (setq des (open dcl "w"))
(mapcar (function (lambda (x) (princ (strcat "\n" x) des)))
'("SelBlksByAttTag : dialog"
"{ label = \"Select by Attribute\"; spacer_1;"
" : boxed_column"
" { label = \"Attribute options\";"
" : toggle { label = \"Tag\"; key = \"at\"; value = 1; }"
" : toggle { label = \"Value\"; key = \"av\"; value = 1; }"
" }"
" spacer;"
" : boxed_radio_column"
" { label = \"Block Selection\";"
" : radio_button { label = \"All\"; key = \"sx\"; value = 1; }"
" : radio_button { label = \"Manual\"; key = \"ss\"; }"
" }"
" spacer;"
" : column"
" {"
" : toggle { label = \"Same Name Blocks\"; key = \"b\"; alignment = centered; }"
" }"
" spacer_1; ok_cancel; : text { key = \"error\"; }"
"}"
); list
); mapcar
(not (setq des (close des))) (< 0 (setq dch (load_dialog dcl))) (new_dialog "SelBlksByAttTag" dch)
(progn
(action_tile "accept"
(vl-prin1-to-string
(quote
(
(lambda ( / tmp )
(cond
( (not (setq tmp (apply 'append (mapcar '(lambda (x) (if (= "1" (get_tile x)) (list x))) '("at" "av")))))
(set_tile "error" "Specify Attribute Option!")
)
( (setq r (append (list (= "1" (get_tile "b"))) (vl-some '(lambda (x) (if (= "1" (get_tile x)) (list x))) '("sx" "ss")) tmp))
(done_dialog 1)
)
); cond
); lambda
)
); quote
); vl-prin1-to-string
); action_tile
(/= 1 (setq dcf (start_dialog)))
); progn
(setq r nil)
); and
); lambda
); function
(function
(lambda ( / nfo SS L )
(cond
( (not r) )
(
(not
(setq nfo
('((f)(setvar 'errno 0) (f))
'(( / e enx o )
(cond
( (= 52 (getvar 'errno)) nil)
(
(or
(not (setq e (car (nentsel "\nPick Attribute <exit>: "))))
(not (member '(0 . "ATTRIB") (setq enx (entget e))))
(and (= 7 (getvar 'errno)) (princ "\nMissed, try again.") (setvar 'errno 0))
)
(f)
)
( (setvar 'errno 52) (setq o (vlax-ename->vla-object e))
(cons (vla-get-EffectiveName (vlax-ename->vla-object (cdr (assoc 330 enx)))) (mapcar '(lambda (x) (vlax-get o x)) '(TagString TextString)))
)
)
)
)
); setq nfo
); not
)
(
(not
(setq SS
(ssget (cdr (assoc (cadr r) '(("ss" . "_:L-I")("sx" . "_X"))))
(append
'((0 . "INSERT") (66 . 1))
(if (car r) (list (cons 2 (strcat "`**," (car nfo)))))
(list (if (= 1 (getvar 'cvport)) (cons 410 (getvar 'ctab)) '(410 . "Model")))
); append
); ssget
); setq SS
); not
)
(
(
'(( b / bnm i o )
(setq i (sslength SS))
(cond
(b
(setq bnm (car nfo))
(repeat i (and (eq bnm (vla-get-EffectiveName (setq o (vlax-ename->vla-object (ssname SS (setq i (1- i))))))) (setq L (cons o L))))
); b
( (repeat i (setq L (cons (vlax-ename->vla-object (ssname SS (setq i (1- i)))) L))) )
); cond
(not L)
); list
(car r)
)
)
(
(
'(( m v / nSS )
(setq nSS (ssadd))
(vl-some (function (lambda (a b) (if (equal a m) (eval b))))
'(("at" "av")("at")("av"))
'(
(foreach x L (and (vl-some '(lambda (att) (equal v (mapcar '(lambda (xx) (vlax-get att xx)) '(TagString TextString)))) (vlax-invoke x 'GetAttributes)) (ssadd (vlax-vla-object->ename x) nSS)))
(progn (setq v (car v)) (foreach x L (and (vl-some '(lambda (att) (eq (vlax-get att 'TagString) v)) (vlax-invoke x 'GetAttributes)) (ssadd (vlax-vla-object->ename x) nSS))))
(progn (setq v (cadr v)) (foreach x L (and (vl-some '(lambda (att) (eq (vlax-get att 'TextString) v)) (vlax-invoke x 'GetAttributes)) (ssadd (vlax-vla-object->ename x) nSS))))
); list
); vl-some
(sssetfirst nil nSS)
); list
(cddr r)
(cdr nfo)
)
)
); cond
); lambda
); function
); list
); vl-some

'(((87 114 105 116 116 101 110 32 98 121) (71 114 114 114) (67 114 101 100 105 116 115 32 116 111) (76 101 101 32 77 97 99))
(104 116 116 112 58 47 47 119 119 119 46 99 97 100 116 117 116 111 114 46 110 101 116 47 102 111 114 117 109 47 115 104 111 119 116 104 114 101 97 100
46 112 104 112 63 49 48 50 55 56 54 45 83 101 108 101 99 116 45 98 108 111 99 107 115 45 98 121 45 97 116 116 114 105 98 117 116 101 45 84 65 71
)
)

(vl-catch-all-apply 'eval
'(
(progn
(and (< 0 dch) (unload_dialog dch))
(and (eq 'FILE (type des)) (close des))
(and (eq 'STR (type dcl)) (findfile dcl) (vl-file-delete dcl))
); progn
); list
); vl-catch-all-apply
(princ)
); defun
(vl-load-com) (princ)
Nike вне форума  
 
Непрочитано 27.02.2024, 19:20
#11
Dinoxromniy


 
Регистрация: 14.09.2020
Санкт-Петербург
Сообщений: 395


Nike, спасибо, любопытно.
Dinoxromniy вне форума  
 
Автор темы   Непрочитано 28.02.2024, 17:36
#12
shishoq


 
Регистрация: 23.01.2005
spb
Сообщений: 124


Цитата:
Сообщение от Dinoxromniy Посмотреть сообщение
Запускаю ._ATTOUT
Спасибо, сработало!
когда-то оч.давно юзал, но всё забыл ))
ISOLATEOBJECTS в принципе не обязателен, тк для него всё равно надо сначала выбрать нужные блоки, - а коли выберешь их, - так можно сразу же применять ATTOUT.
у меня сложность ещё была с Экселем - его нет, но есть учебная версия Ворда, а он худо-бедно эмулирует лист Экселя, потом Ctrl+A и копипаст в Блокнот.
обидно, конечно, что Автодеск проделал огромную работу по таблицам, уподобив их Экселю но вставить в них скопом разделённые данные нельзя но у Автодеска всё так...
shishoq вне форума  
 
Непрочитано 28.02.2024, 17:58
#13
DISM


 
Регистрация: 24.11.2021
Сообщений: 33


Цитата:
Сообщение от Dinoxromniy Посмотреть сообщение
Как я понял задачу - наоборот уйти от ручной выборки типов блоков, так как их 50 штук, а атрибуты разбросаны хаотично.
Весь вопрос, как из 50 блоков, заявленных ТС, выделить только те, у которых есть один из трех атрибутов (делить еще и на комбинации из двух /трех атрибутов смысла нет), не затрагивая все остальные. Мне вот кроме лиспа в голову способа как то не приходит. Или можно стандартными средствами?
Можно при помощи стандартной команды "ПОДСЧЕТ" в 2024 автокаде
Миниатюры
Нажмите на изображение для увеличения
Название: Снимок экрана 2024-02-28 175738.png
Просмотров: 23
Размер:	46.2 Кб
ID:	261896  
DISM вне форума  
 
Непрочитано 28.02.2024, 18:14
#14
Dinoxromniy


 
Регистрация: 14.09.2020
Санкт-Петербург
Сообщений: 395


DISM, не очень понял, как их выделить.
У меня получается посмотреть количество с одинаковым значением атрибута, как физически выделить все блоки, в которых есть атрибут с одинаковым названием (а не значением) я не понял.
Код Nike как раз то что нужно.
Dinoxromniy вне форума  
 
Непрочитано 28.02.2024, 18:18
#15
DISM


 
Регистрация: 24.11.2021
Сообщений: 33


Цитата:
Сообщение от Dinoxromniy Посмотреть сообщение
DISM, не очень понял, как их выделить.
У меня получается посмотреть количество с одинаковым значением атрибута, как физически выделить все блоки, в которых есть атрибут с одинаковым названием (а не значением) я не понял.
Код Nike как раз то что нужно.

Там кнопка выбора есть над окном подсчёта.
DISM вне форума  
 
Непрочитано 28.02.2024, 18:30
#16
Dinoxromniy


 
Регистрация: 14.09.2020
Санкт-Петербург
Сообщений: 395


DISM, я не про это. Вот у меня есть 50 определений разных блоков, в блоках тип 1, 5, 12, 14, 28, 36 и 49 есть атрибут с названием "Номер", у остальных такого атрибута нет. Каждый блок пускай вставлен дважды. Как мне выделить из всех 50 типов только блоки, у которых есть именно атрибут "Номер", т.е. 14 из 100 вхождений?
Dinoxromniy вне форума  
 
Непрочитано 28.02.2024, 18:34
#17
DISM


 
Регистрация: 24.11.2021
Сообщений: 33


А, если имена блоков разные, то через подсчёт - никак. Я поэтому стараюсь максимально унифицировать блоки.

Последний раз редактировалось DISM, 28.02.2024 в 18:39.
DISM вне форума  
 
Непрочитано 28.02.2024, 19:54
#18
Dinoxromniy


 
Регистрация: 14.09.2020
Санкт-Петербург
Сообщений: 395


DISM, спасибо, ясно.
Dinoxromniy вне форума  
 
Непрочитано 29.02.2024, 10:00
1 | #19
name02


 
Регистрация: 10.01.2020
Сообщений: 415


Макрос для замены атрибутов в блоках и вложенных в них блоках. Вроде работает...
BBAC.lsp

Код:
[Выделить все]
 (defun c:BBAC (/ BLOCK_NAME ATT_VALUES ss i ent obj bl_name a list_obj)

  (vl-load-com)

  ;;имена блоков, в которых нужно менять атрибуты
  ;;пишутся через запятую, регистр не важен, можно знаки подстановки писать - * ? и т.п.
  (setq BLOCK_NAME "*")

  ;;Имена и значения атрибутов
  (setq	ATT_VALUES
	 (list
	   (cons "ў1" "1")
	   (cons "ў2" "2")
	 ) ;_ end of list
  ) ;_ end of setq


  (setq ss (ssget '((0 . "INSERT"))))

  ;;записываем имена блоков в один список
  (repeat (setq i (sslength ss))

    (setq ent (ssname ss (setq i (1- i))))
    (setq obj (vlax-ename->vla-object ent))

    (setq bl_name (cdr (assoc 2 (entget ent))))

    (setq a (append a (list obj) (GetNestedBlocks bl_name)))

  ) ;_ end of foreach


  (setq	list_obj
	 (vl-remove-if-not
	   '(lambda (x)
	      (wcmatch (strcase (vla-get-EffectiveName x)) (strcase BLOCK_NAME))
	    ) ;_ end of lambda
	   a
	 ) ;_ end of vl-remove-if-not
  ) ;_ end of setq

  (foreach obj list_obj
    (foreach att ATT_VALUES
      (LM:vl-setattributevalue obj (car att) (cdr att))
    ) ;_ end of foreach

  ) ;_ end of foreach

) ;_ end of defun

;;;Получение всех вложенных блоков внутри блока с именем BlkName в виде списка vla-объектов
(defun GetNestedBlocks (BlkName / bb a)

  (setq	bb (vla-get-blocks
	     (vla-get-activedocument
	       (vlax-get-acad-object)
	     ) ;_ end of vla-get-activedocument
	   ) ;_ end of vla-get-blocks
  ) ;_ end of setq

  (vlax-for Obj	(vla-item bb BlkName) ;_ end of vla-item

    (if	(= (vla-get-ObjectName Obj) "AcDbBlockReference")
      (progn
	(setq a (append a (list obj) (GetNestedBlocks (vla-get-name Obj))))
      ) ;_ end of progn
    ) ;_ end of if

  ) ;_ end of vlax-for

  a

) ;_ end of defu




;; Set Attribute Value  -  Lee Mac
;; Sets the value of the first attribute with the given tag found within the block, if present.
;; blk - [vla] VLA Block Reference Object
;; tag - [str] Attribute TagString
;; val - [str] Attribute Value
;; Returns: [str] Attribute value if successful, else nil.

(defun LM:vl-setattributevalue (blk tag val)
  (setq tag (strcase tag))
  (vl-some
    '(lambda (att)
       (if (= tag (strcase (vla-get-tagstring att)))
	 (progn (vla-put-textstring att val) val)
       ) ;_ end of if
     ) ;_ end of lambda
    (vlax-invoke blk 'getattributes)
  ) ;_ end of vl-some
) ;_ end of defun
name02 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Атрибуты - одновременное редактирование их значений в куче блоков

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Значения ячейки из Excel (текст) в атрибуты блоков в автокаде АлексейСит AutoCAD 11 16.05.2023 17:05
Автоматическое редактирование текста и блоков с помощью лисп. markseder LISP 1 04.02.2012 13:38
Потеря значений атрибутов блоков, вставленных в ячейки таблицы Дмитрий Голованов AutoCAD 2 17.12.2009 08:57
Как в пространстве редактора блоков запустить редактирование вложенного блока. Supermax Программирование 5 18.12.2007 17:50
Редактирование блоков в сборке Tannik AutoCAD 2 28.06.2004 16:13