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

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

Замена тегов атрибутов в блоках с сохранением значений.

Ответ
Поиск в этой теме
Непрочитано 22.01.2016, 07:42 #1
Замена тегов атрибутов в блоках с сохранением значений.
Krovlaf
 
геология, геодезия
 
Хабаровск
Регистрация: 29.05.2009
Сообщений: 185

Всем Привет! Столкнулся с проблемой: Есть база чертежей с блоками, в которых нужно заменить имена (теги) атрибутов. База старая, создавалась давно и разными авторами. Информация в атрибутах однотипная (4 параметра). Возникла необходимость в унификации информации в базе чертежей. Необходимо изменить теги атрибутов, но чтобы при этом значения атрибутов сохранилось (при изменении имен атрибутов в блоке их значения обнуляются при обновлении). Поиск по форуму и различным утилитам результата не дал. Выходил из положения так: экспортировал значения атрибутов в Excel, изменял блоки в редакторе и вносил значения обратно в соответствующие поля. Морока еще та, и ошибок таким способом делаешь очень много. Можно ли эту проблему решить программно?
Просмотров: 9211
 
Непрочитано 22.01.2016, 10:35
#2
kp+

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


Цитата:
Сообщение от Krovlaf Посмотреть сообщение
Поиск по форуму и различным утилитам результата не дал.
Команда BRT (Replace Tag) из Toolpack - то, что доктор прописал. Только потом не применяйте Attsync, т.к. команда BRT меняет тэги атрибутов именно во вставленных экземплярах (вхождениях) блоков, но не в определениях.
Если же Attsync необходим, надо писать другой вариант проги, более продуманный. Это уже в "поиск исполнителей". И обязательно с примером "как есть"->"как надо".

Последний раз редактировалось kp+, 22.01.2016 в 10:44.
kp+ вне форума  
 
Автор темы   Непрочитано 22.01.2016, 10:49
#3
Krovlaf

геология, геодезия
 
Регистрация: 29.05.2009
Хабаровск
Сообщений: 185


Пробовал... Кто-нибудь, незнаючи может таких бед наделать никакой доктор непоможет... В том и беда, что без обновления блоков или синхронизации атрибутов в работе с чертежами никак нельзя.
Да, получается чистый запрос. Надо тему перемещать.

Последний раз редактировалось Krovlaf, 22.01.2016 в 10:54.
Krovlaf вне форума  
 
Автор темы   Непрочитано 28.01.2016, 03:28
#4
Krovlaf

геология, геодезия
 
Регистрация: 29.05.2009
Хабаровск
Сообщений: 185


Нашел похожую тему на Cadtutor'е. (Спасибо гугл транслиту) В посте #5 вроде бы есть решение проблемы. Да вот никак немогу победить этот код. Соответствующие инструкции в faq не помогли. Подскажите, как правильно запустить этот лисп?
Код:
[Выделить все]
defun changeblock (/ BLK DOC I TAGLST SS)
  (vl-load-com)
  (setq blk "OLDNAMEOFBLOCK"
    tagLst '(
         ;"Old Tag"    "New Tag"
	 ("OLDTAG"    	"NEWTAG")
         )
    i -1
    doc (vla-get-activedocument (vlax-get-acad-object))
    )
  (if (ssget "_X" (list (cons 0 "INSERT")(cons 2 blk)))
    (vlax-for bl (setq ss (vla-get-activeselectionset doc))
      (foreach att (vlax-invoke bl 'getAttributes)
    (If (assoc (vla-get-tagstring att) tagLst)
      (vla-put-tagstring att (cadr (assoc (vla-get-tagstring att) tagLst)))
      )))
    (princ "\nNo part rule Found."))
  (princ)
  (progn
    (if (tblsearch "BLOCK" "OLDNAMEOFBLOCK")
	  (progn
  	(command "-rename" "b" "OLDNAMEOFBLOCK" "NEWNAMEOFBLOCK")
  	(command "_.-insert" "NEWNAMEOFBLOCK=FILENAME" "y" nil);replaced convert template to new template.
	(command "_.attsync" "n" "NEWNAMEOFBLOCK")
	(scl 0.8 "NEWNAMEOFBLOCK");scales block to new scale
	  (blknr13 "NEWNAMEOFBLOCK"); this was command to set a block the a layer. (not included can eb removed)
))      	    
  )(princ)(princ "succes!")(princ)
  )
;; Run program manually with this:
(defun c:Chblock () (changeblock))
;;itemline

;; Scale the old template to new one
(defun scl (xsc blk / ss)
  (vl-load-com)
  (if (setq SS (ssget "_X" (list '(0 . "INSERT") (cons 2 blk))))
    (mapcar
      (function
        (lambda (Obj)
          (vla-ScaleEntity Obj
            (vla-get-insertionpoint Obj)xsc)))
      (mapcar 'vlax-ename->vla-object
        (vl-remove-if 'listp
          (mapcar 'cadr (ssnamex ss))))))
  (princ))
;;;;;delete;;;;;


;;/delete
(defun delblk (blk / ss)
    (vl-load-com)
      (if (tblsearch "BLOCK" blk)
	  (progn
	(if (setq ss (ssget "x" (list (cons 0 "INSERT") (cons 2 blk))))
	  (mapcar    'vla-delete
    (mapcar 'vlax-ename->vla-object (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))
)
		(command "erase" ss "")
	)
	(command ".purge" "b" blk "n")
	)
	)
)
Krovlaf вне форума  
 
Непрочитано 28.01.2016, 08:55
#5
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406


Во-первых, как минимум пропущена одна скобка перед самым первым defun
Во-вторых, код будет работать только в английской версии AutoCAD (http://autolisp.ru/2010/03/04/localization/)
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 28.01.2016, 09:47
#6
Oleg T


 
Регистрация: 27.12.2011
Сообщений: 1,456


Цитата:
Сообщение от Krovlaf Посмотреть сообщение
Есть база чертежей с блоками, в которых нужно заменить имена (теги) атрибутов
Я бы просто сохранил в DXF и пакетно отредактировал в тестовом редакторе типа Notepad++.
Очень просто.
А так еще есть готовая бесплатная утилита, но под BricsCAD. Отрабатывает отлично.
http://bricsys.com/applications/a/?b...are-a335-al528
Миниатюры
Нажмите на изображение для увеличения
Название: Безымянный.png
Просмотров: 157
Размер:	27.4 Кб
ID:	164332  
Oleg T вне форума  
 
Автор темы   Непрочитано 28.01.2016, 10:00
#7
Krovlaf

геология, геодезия
 
Регистрация: 29.05.2009
Хабаровск
Сообщений: 185


Чувствую себя слепым муравьем на слоновьей тропе.
Я так понял, как минимум нужно все пересмотреть на предмет ошибок и вообще переписать для адаптации под локальную версию. Мм-да. Не все йогурты лиспы одинаково усваиваются...
Цитата:
есть готовая бесплатная утилита, но под BricsCAD
Не имеем в наличии к сожалению. Да и ради замены тегов заводить BricsCAD нерационально как то.
А с редактированием dxf... попробую. Не копал я еще так глубоко.
Спасибо!

Последний раз редактировалось Krovlaf, 28.01.2016 в 10:13.
Krovlaf вне форума  
 
Непрочитано 28.01.2016, 10:23
#8
Oleg T


 
Регистрация: 27.12.2011
Сообщений: 1,456


Цитата:
Сообщение от Krovlaf Посмотреть сообщение
Да и ради замены тегов заводить BricsCAD нерационально как то.
А с редактированием dxf... попробую. Не копал я еще так глубоко.
Если задача разовая, то хватит триальной версии. Дистрибутив маньше 200МБ и устанавливается за пару минут, для закачки нужен только email.
Но DXF реально быстрее, я так делал. Тут главное внимательность.
Oleg T вне форума  
 
Непрочитано 28.01.2016, 10:30
#9
Nike

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


http://forums.augi.com/showthread.ph...l=1#post968279

Код:
[Выделить все]
 ;;; Rename attributes
(defun RenAttrib ($blk $old $new / blocks bo eo ao)
  ;; Get blocks collection in current drawing
  (setq blocks (vla-get-Blocks (vla-get-ActiveDocument (vlax-get-acad-object))))
  ;; Step through all blocks
  (vlax-for bo blocks
    ;; Step through all entities inside block
    (vlax-for eo bo
      (cond
        ;; If attdef & in target block & old tag
        ((and (= (vla-get-ObjectName eo) "AcDbAttributeDefinition")
              (= (strcase (vla-get-Name bo)) (strcase $blk))
              (= (vla-get-TagString eo) $old)
         ) ;_ end of and
         (vla-put-TagString eo $new) ;Change to new name
        )
        
        ;; If block reference & target block
        ((and (= (vla-get-ObjectName eo) "AcDbBlockReference")
              (= (strcase (vla-get-EffectiveName eo)) (strcase $blk))
         ) ;_ end of and
         ;; Step through all attributes
         (foreach ao (vlax-safearray->list (vlax-variant-value (vla-GetAttributes eo)))
           ;; Check if target attrib
           (if (= (strcase (vla-get-TagString ao)) (strcase $old))
             (vla-put-TagString ao $new) ;Change to new name
           ) ;_ end of if
         ) ;_ end of foreach
        )
      ) ;_ end of cond
    ) ;_ end of vlax-for
  ) ;_ end of vlax-for
) ;_ end of defun
Код:
[Выделить все]
 (RenAttrib "TESTBLK" "OLDTAG" "NEWTAG")
Nike вне форума  
 
Автор темы   Непрочитано 28.01.2016, 10:46
#10
Krovlaf

геология, геодезия
 
Регистрация: 29.05.2009
Хабаровск
Сообщений: 185


Извиняюсь, как это работает? "Неизвестная команда" на все попытки.
Все, пошло, Спасибо! Теги меняются, данные сохраняются, Все ОК!
СПАСИБО!
PPS
Маааленький штрих к картине маслом... Можно ввод имени блока, заменяемого тега и нового тега сделать как запросы программы?

Последний раз редактировалось Krovlaf, 28.01.2016 в 10:54.
Krovlaf вне форума  
 
Непрочитано 28.01.2016, 11:11
#11
Nike

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


Код:
[Выделить все]
 (RenAttrib (getstring "Введите имя блока: ") (getstring "Введите имя тэга: ") (getstring "Введите новое имя: "))
----- добавлено через ~4 мин. -----
Лучше не поштучно переименовывать, а массово с заранее заготовленным списком

http://forums.augi.com/showthread.ph...=1#post1152791

Код:
[Выделить все]
 (setq attrename-list
  '(("BlockName1" ("OldAttName1.1" "NewAttName1.1") ("OldAttName1.2" "NewAttName1.2"))
   ("BlockName2" ("OldAttName2.1" "NewAttName2.1") ("OldAttName2.2" "NewAttName2.2"))
  )
)
Код:
[Выделить все]
 (foreach block attrename-list
  (foreach attrename-pair (cdr block)
    (RenAttrib (car block) (car attrename-pair) (cadr attrename-pair))
  )
  (command "._ATTSYNC" "_Name" (car block))
)

Последний раз редактировалось Nike, 28.01.2016 в 11:17.
Nike вне форума  
 
Автор темы   Непрочитано 28.01.2016, 11:22
1 | #12
Krovlaf

геология, геодезия
 
Регистрация: 29.05.2009
Хабаровск
Сообщений: 185


Да, спасибо! Там в посте 12, вроде бы законченное решение с диалоговым окном, выбором итд. Уже регистрируюсь...

Прекрасное решение! Помимо всего можно проверять дубликаты имен в тегах, обрабатывая все блоки в чертеже!
А вот и то, что прописал доктор:
Правда, незнаю зачем, две разные команды:
RENATTRSET - предварительная настройка изменений
RENATTR - команда на выполнение
Вложения
Тип файла: lsp RenAttrib.LSP (13.3 Кб, 125 просмотров)

Последний раз редактировалось Krovlaf, 28.01.2016 в 11:50.
Krovlaf вне форума  
 
Непрочитано 28.01.2016, 11:40
#13
Nike

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


угу, недолистал.
Krovlaf, выложи потом сюда тот код, пожалуйста.
Nike вне форума  
 
Непрочитано 28.01.2016, 14:01
#14
config


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


Подскажите, в чем может быть проблема (лисп из #12)?
Миниатюры
Нажмите на изображение для увеличения
Название: 001.png
Просмотров: 46
Размер:	2.3 Кб
ID:	164357  
config вне форума  
 
Непрочитано 28.01.2016, 14:50
#15
kp+

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


хз, в стандартном Акаде 2010 х86, win7 полет нормальный. Какая у Вас версия?

Последний раз редактировалось kp+, 28.01.2016 в 14:56.
kp+ вне форума  
 
Автор темы   Непрочитано 28.01.2016, 14:54
#16
Krovlaf

геология, геодезия
 
Регистрация: 29.05.2009
Хабаровск
Сообщений: 185


Не знаю. У меня работает... А вы сразу поставили предложенный лисп или заменили старый вариант?
Krovlaf вне форума  
 
Непрочитано 28.01.2016, 14:58
#17
config


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


Цитата:
Сообщение от kp+ Посмотреть сообщение
хз, в стандартном Акаде 2010 полет нормальный. Какая у Вас версия?
AutoCAD Civil 3d 2010 Win XP x 32 Главное, что характерно, ввожу команду запуска, открывается диалоговое окно, а через пару секунд обрывается и выдает в командную строку указанную выше ошибку. Это первое тестирование программы.
config вне форума  
 
Непрочитано 28.01.2016, 15:07
#18
kp+

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


Может, DCL с цивилом не дружат?
kp+ вне форума  
 
Автор темы   Непрочитано 28.01.2016, 15:10
#19
Krovlaf

геология, геодезия
 
Регистрация: 29.05.2009
Хабаровск
Сообщений: 185


Тады первый, "ручной" вариант. Должен пахать!
Krovlaf вне форума  
 
Непрочитано 28.01.2016, 15:24
#20
config


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


Цитата:
Сообщение от kp+ Посмотреть сообщение
Может, DCL с цивилом не дружат?
Это у меня уже вторая программа, которая ведет себя таким образом. Может у кого аналогичная связка и отпишутся о работоспособности.
Цитата:
Сообщение от Krovlaf Посмотреть сообщение
Тады первый, "ручной" вариант. Должен пахать!
Да. Но неприятный осадок и чувство "незавершенности" остались.
config вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Замена тегов атрибутов в блоках с сохранением значений.



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сумма значений атрибутов ie.spb Программирование 17 22.10.2014 08:29
Сумма значений атрибутов блока ILMIR AutoCAD 8 20.10.2014 21:44
Группировка и суммирование значений атрибутов в таблице СПДС. ie.spb ПО от CSoft 17 11.07.2014 08:32
Извлечение значений атрибутов блоков AutoCAD Electrical с помощью AutoLisp zaraki_kenpachi LISP 16 19.02.2011 15:30
Потеря значений атрибутов блоков, вставленных в ячейки таблицы Дмитрий Голованов AutoCAD 2 17.12.2009 08:57