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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Нужно решение (программа) для массового переименования всех блоков

Нужно решение (программа) для массового переименования всех блоков

Ответ
Поиск в этой теме
Непрочитано 16.09.2010, 16:25 #1
Нужно решение (программа) для массового переименования всех блоков
gizmo_zx
 
Проектировщик ЭО,ЭМ, ЭОС
 
Нижний Новгород
Регистрация: 18.07.2007
Сообщений: 256

Добрый день.
Есть несколько файлов чертежей (этажей одного здания).
Экспортированные из архикада.
Нужно их все скопировать в один чертеж.
Проблемма - одинаковые имена блоков, но при этом разная геоментрия...
Сейчас проблемма решается разбиванием блоков.
Хотелось бы переименовать блоки все оптом (на случайно сгенерированное имя _1, _2 и т.д)
Чтобы при копировании в один чертеж не было подмены блоков с одинаковыми именами.
Спасибо.
Просмотров: 6817
 
Непрочитано 16.09.2010, 16:34
#2
Кулик Алексей aka kpblc
Moderator

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


Имена файлов разные? И анонимных блоков нет, надеюсь?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 16.09.2010, 16:49
1 | #3
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 571


gizmo_zx, Попробуй так. Но это надо запукать внутри каждого файла отдельно. Чтобы пакетно сразу во всех файлах не знаю как.

Код:
[Выделить все]
(setq index 1)
(setq new_name_block (itoa (car (_VL-TIMES))))
(setq old_block_name (cdr (assoc 2 (tblnext "Block" T))))
(while old_block_name
  (vl-cmdf "_-rename" "_Block" old_block_name (strcat new_name_block "_" (itoa index)))
  (setq old_block_name (cdr (assoc 2 (tblnext "Block"))))
  (setq index (1+ index))
)
TararykovDG вне форума  
 
Автор темы   Непрочитано 16.09.2010, 16:49
#4
gizmo_zx

Проектировщик ЭО,ЭМ, ЭОС
 
Регистрация: 18.07.2007
Нижний Новгород
Сообщений: 256
<phrase 1= Отправить сообщение для gizmo_zx с помощью Skype™


Имена разные, могу сам задать при экспорте из Архикада

Если анонимные это "*U" то таких нет.
имена типа "line_(номер)", "Wol_(номер)"
gizmo_zx вне форума  
 
Непрочитано 16.09.2010, 18:10
#5
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от TararykovDG Посмотреть сообщение
Чтобы пакетно сразу во всех файлах не знаю как.
можно попробовать записать приведённый lisp в scr-файл, затем вызвать пакетную обработку.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 16.09.2010, 19:06
#6
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


gizmo_zx, В чистый файл вставь свои чертежи как внешние ссылки, а затем внедри со способом "внедрение" (bind)
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 20.09.2010, 14:29
#7
gizmo_zx

Проектировщик ЭО,ЭМ, ЭОС
 
Регистрация: 18.07.2007
Нижний Новгород
Сообщений: 256
<phrase 1= Отправить сообщение для gizmo_zx с помощью Skype™


Цитата:
Сообщение от TararykovDG Посмотреть сообщение
Попробуй так. Но это надо запукать внутри каждого файла отдельно. Чтобы пакетно сразу во всех файлах не знаю как.

Код:
[Выделить все]
(setq index 1)
(setq new_name_block (itoa (car (_VL-TIMES))))
(setq old_block_name (cdr (assoc 2 (tblnext "Block" T))))
(while old_block_name
  (vl-cmdf "_-rename" "_Block" old_block_name (strcat new_name_block "_" (itoa index)))
  (setq old_block_name (cdr (assoc 2 (tblnext "Block"))))
  (setq index (1+ index))
)
А почему програмулина меняет стиль размена?
Размеры были ... "наклонный"(черта вместо стрелки) стали "пользовательские" ...
Программа вобщем -то отлично работает, но с размерами не понял
gizmo_zx вне форума  
 
Непрочитано 20.09.2010, 14:56
#8
Кулик Алексей aka kpblc
Moderator

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


Потому что в качестве засечек тоже используются блоки Не все так просто, как хотелось бы
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 20.09.2010, 15:19
#9
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 571


Кулик Алексей aka kpblc, я не очень-то использую размерные и мультивыноски выноски, поэтому, как говориться, спорить не буду, но ради интереса нанес на чертеж пути выносок. По умолчанию вроде там нет никаки блоков, если же так сделално умышлено, то тогда как их отличить "эти" блоки от "тех" блоков

gizmo_zx, если в чертеже все таки есть блоки "*U..." например при использованиие динамических блоков, то тогда конструкция (setq old_block_name (cdr (assoc 2 (tblnext "Block"))))
вернет такие блока, а (vl-cmdf "_-rename" "_Block" old_block_name (strcat new_name_block "_" (itoa index))) не захочет их переименовывать, ипользуй этот код
Код:
[Выделить все]
(setq index 1)
(setq new_name_block (itoa (car (_VL-TIMES))))
(setq old_block_name (cdr (assoc 2 (tblnext "Block" T))))
(while (and old_block_name (not (wcmatch old_block_name "`**")))
  (vl-cmdf "_-rename" "_Block" old_block_name (strcat new_name_block "_" (itoa index)))
  (setq old_block_name (cdr (assoc 2 (tblnext "Block"))))
  (setq index (1+ index))
)
TararykovDG вне форума  
 
Непрочитано 20.09.2010, 21:49
1 | #10
Кулик Алексей aka kpblc
Moderator

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


Барин, дай сроку до ночи, попробую код нарисовать
---
Добавлено:
Пробуй. Но учти, гарантий никаких дать не могу: код не гонял. Запускать в каждом файле отдельно.
Код:
[Выделить все]
(vl-load-com)

(defun c:rename-all-blocks-in-doc (/ *error* adoc add_str excludeblk_lst style err err_lst)

  (defun *error* (msg)
    (vla-endundomark adoc)
    (princ msg)
    (princ)
    ) ;_ end of defun

  (vla-startundomark (setq adoc (vla-get-activedocument (vlax-get-acad-object))))
  (setq add_str (vl-princ-to-string (car (_vl-times))))
  ;; По всем описаниям размерных стилей
  (vlax-for style (vla-get-dimstyles adoc)
    (setq style (entget (vlax-vla-object->ename style)))
    (foreach blk_def (vl-remove nil
                                (mapcar (function (lambda (x / res)
                                                    (if (setq res (cdr (assoc x style)))
                                                      (cdr (assoc 2 (entget res)))
                                                      ) ;_ end of if
                                                    ) ;_ end of LAMBDA
                                                  ) ;_ end of function
                                        '(341 342 343 344)
                                        ) ;_ end of mapcar
                                ) ;_ end of vl-remove
      (if (not (member (strcase blk_def) (mapcar (function strcase) excludeblk_lst)))
        (setq excludeblk_lst (cons blk_def excludeblk_lst))
        ) ;_ end of if
      ) ;_ end of foreach
    ) ;_ end of vlax-for
  (vlax-for blk_def (vla-get-blocks adoc)
    (if (equal (vla-get-isxref blk_def) :vlax-false)
      (vlax-for ent blk_def
        ;; Проходим по объектам размеров и выносок
        (cond
          ((wcmatch (strcase (vla-get-objectname ent)) "*DIM*")
           (vlax-for sub (vla-item (vla-get-blocks adoc) (cdr (assoc 2 (entget (vlax-vla-object->ename ent)))))
             (if (and (wcmatch (strcase (vla-get-objectname sub)) "*BLOCK*")
                      (not (member (strcase (vla-get-name sub)) (mapcar (function strcase) excludeblk_lst)))
                      ) ;_ end of and
               (setq excludeblk_lst (cons (vla-get-name sub) excludeblk_lst))
               ) ;_ end of if
             ) ;_ end of vlax-for
           )
          ((wcmatch (strcase (vla-get-objectname ent)) "*LEADER*")
           (if (not (member (strcase (vla-get-arrowheadblock ent))
                            (mapcar (function strcase) excludeblk_lst)
                            ) ;_ end of member
                    ) ;_ end of not
             (setq excludeblk_lst (cons (vla-get-arrowheadblock ent) excludeblk_lst))
             ) ;_ end of if
           )
          ) ;_ end of cond
        ) ;_ end of vlax-for
      ) ;_ end of if
    ) ;_ end of vlax-for
  (vlax-for blk_def (vla-get-blocks adoc)
    (if (and (equal (vla-get-isxref blk_def) :vlax-false)
             (not (member (vla-get-name blk_def) excludeblk_lst))
             (not (wcmatch (vla-get-name blk_def) "`**"))
             ) ;_ end of and
      (if (vl-catch-all-error-p
            (setq err (vl-catch-all-apply
                        (function
                          (lambda ()
                            (vla-put-name blk_def (strcat add_str "_" (vla-get-name blk_def)))
                            ) ;_ end of lambda
                          ) ;_ end of function
                        ) ;_ end of vl-catch-all-apply
                  ) ;_ end of setq
            ) ;_ end of vl-catch-all-error-p
        (setq err_lst (cons
                        (cons (vla-get-name blk_def) (vl-catch-all-error-message err))
                        err_lst
                        ) ;_ end of cons
              ) ;_ end of setq
        ) ;_ end of if
      ) ;_ end of if
    ) ;_ end of vlax-for
  (princ
    (strcat "\nИз переименования исключены блоки, участвующие в размерах и размерных стилях:\n"
            (car excludeblk_lst)
            (apply (function strcat) (mapcar (function (lambda (x) (strcat "; " x))) (cdr excludeblk_lst)))
            ) ;_ end of strcat
    ) ;_ end of princ
  (if err_lst
    (princ (strcat "\n***"
                   "\nНе удалось переименовать блоки:"
                   (apply (function strcat)
                          (mapcar (function (lambda (x)
                                              (strcat "\n" (car x) " : " (cdr x))
                                              ) ;_ end of lambda
                                            ) ;_ end of function
                                  err_lst
                                  ) ;_ end of mapcar
                          ) ;_ end of apply
                   ) ;_ end of strcat
           ) ;_ end of princ
    ) ;_ end of if
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun
---
Добавлено 2: интересно, хоть кому-то пригодилось или нет?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.

Последний раз редактировалось Кулик Алексей aka kpblc, 21.09.2010 в 16:50.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 21.09.2010, 20:42
#11
TararykovDG

Программист-энтузиаст
 
Регистрация: 17.07.2009
Воронеж
Сообщений: 571


Цитата:
Добавлено 2: интересно, хоть кому-то пригодилось или нет?
Кулик Алексей aka kpblc, мне очень пригодилось, не столько сама прога, сколько непосредственно сам код для самообучения

gizmo_zx попробуй код для пакетного переименования блоков во всех чертежах указываемой папки (только для чертежей в самой папке, чертежи во вложенных папках будут игнорироваться)
Код:
[Выделить все]
;|    Переименовать все блоки в чертежах
    Для работы с неактивным документом используется метод ObjectDBX
    http://autolisp.ru/2010/04/08/proceed-unactive-document/

|;


; Функции _lispru-acad-version и _lispru-odbx взяты отсюда http://autolisp.ru/2010/04/08/proceed-unactive-document/
;    Directory-Dia - http://www.caduser.ru/forum/index.php?PAGE_NAME=message&FID=23&TID=48293&MID=269115#message269115 пост #2


(defun _lispru-acad-version ()    ; http://autolisp.ru/2010/04/08/proceed-unactive-document/
;|
*    Возвращает номер сборки AutoCAD'a. Для 2005 вернет 16.1, для 2006 - 16.2
* и т.д.
|;
(atof (getvar "acadver"))
) ;_ end of defun


(defun _lispru-odbx (/)    ; http://autolisp.ru/2010/04/08/proceed-unactive-document/
                    ;|
*    функция возвращает интерфейс IAxDbDocument (для работы с файлами DWG без
* их открытия). Если интерфейс не поддерживается, возвращает nil. Проверено
* на ACAD 2002, 2004, 2005, 2006, 2007, 2008, 2010
*    Автор - Fatty aka Олег jr. Моего только адаптация под общую систему и
* переименование
*    Параметры вызова:
* нет
*    Примеры вызова:
(_lispru-odbx)
|;
  (cond
    ((< (_lispru-acad-version) 15.06)
     (alert
       "ObjectDBX method not applicable\nin this AutoCAD version"
       ) ;_ end of KPBLC-MSG-ALERT
     nil
     )
    ((= (fix (_lispru-acad-version)) 15)
     (if (not (vl-registry-read
                "HKEY_CLASSES_ROOT\\ObjectDBX.AxDbDocument\\CLSID"
                ) ;_ end of vl-registry-read
              ) ;_ end of not
       (startapp "regsvr32.exe"
                 (strcat "/s \"" (findfile "axdb15.dll") "\"")
                 ) ;_ end of startapp
       ) ;_ end of if
     (vla-getinterfaceobject
       (vlax-get-acad-object)
       "ObjectDBX.AxDbDocument"
       ) ;_ end of vla-getinterfaceobject
     )
    (t
     (vla-getinterfaceobject
       (vlax-get-acad-object)
       (strcat "ObjectDBX.AxDbDocument." (itoa (fix (_lispru-acad-version))))
       ) ;_ end of vla-getinterfaceobject
     )
    ) ;_ end of cond
) ;_ end of defun


; Исходный код http://www.caduser.ru/forum/index.php?PAGE_NAME=message&FID=23&TID=48293&MID=269115#message269115 пост #2
(defun Directory-Dia (Message / sh folder folderobject result)
    ;; By Tony Tanzillo
    ;; Modified by Tim Willey
    ;; 16 Will let you type in the path
    ;; 64 Will let you create a new folder
    ;; Use
    ;; (Directory-Dia "Create Sheet Index \nSelect directory to grab Drawings \nBy Tim Willey 09/13/07")

    (vl-load-com)
    (setq sh
      (vla-getInterfaceObject
        (vlax-get-acad-object)
        "Shell.Application"
      )
    )
    (setq folder
      (vlax-invoke-method
        sh
        'BrowseForFolder
        (vla-get-HWND (vlax-get-Acad-Object))
        Message
        0 ;;; This is the bit number to change.
               ;;; Вместо 0 можно попробовать (+ 16 64)
        ;;; 16 - позволяет набирать путь 
        ;;; 64 - позволяет создавать новую папку
    ""    ; - корневой каталог, не обязательный параметр !!! НЕЛЬЗЯ БУДЕТ ВЕРНУТЬСЯ НА УРОВЕНЬ ВЫШЕ !!!
      )
    )
    (vlax-release-object sh)
    (if   folder
      (progn
   (setq folderobject
          (vlax-get-property folder 'Self)
   )
   (setq result
          (vlax-get-property FolderObject 'Path)
   )
   (vlax-release-object folder)
   (vlax-release-object FolderObject)
   (if (/= (substr result (strlen result)) "\\")
     (setq result (strcat result "\\"))
     result
   )
      )
    )
) ;_ end of defun


; Исходный код http://forum.dwg.ru/showthread.php?t=57360 пост #10
(defun c:rename-all-blocks-in-all-docs-in-select-folder ( / path_folder lst_files path_file odbx add_str style blk_def ent excludeblk_lst)
  (if (setq path_folder (Directory-Dia "Укажите папку: "))
    (if (setq lst_files (mapcar '(lambda (x) (strcat path_folder x)) (vl-directory-files path_folder "*.dwg" 1)))
      (foreach path_file lst_files
    (setq excludeblk_lst nil)
    (if (setq odbx (_lispru-odbx))
      (progn
        (vla-open odbx path_file)
        (setq add_str (vl-princ-to-string (car (_vl-times))))
        (vlax-for style (vla-get-dimstyles odbx)
          (setq style (entget (vlax-vla-object->ename style)))
          (foreach blk_def (vl-remove nil
                                 (mapcar (function (lambda (x / res)
                                                      (if (setq res (cdr (assoc x style)))
                                                        (cdr (assoc 2 (entget res)))
                                                      ) ;_ end of if
                                                    ) ;_ end of LAMBDA
                                          ) ;_ end of function
                                         '(341 342 343 344)
                                 ) ;_ end of mapcar
                               )
        (if (not (member (strcase blk_def) (mapcar (function strcase) excludeblk_lst)))
                  (setq excludeblk_lst (cons blk_def excludeblk_lst))
                ) ;_ end of if
          ) ;_ end of foreach
        ) ;_ end of vlax-for
        (vlax-for blk_def (vla-get-blocks odbx)
          (if (equal (vla-get-isxref blk_def) :vlax-false)
        (vlax-for ent blk_def
          (cond
            ((wcmatch (strcase (vla-get-objectname ent)) "*DIM*")
                   (vlax-for sub (vla-item (vla-get-blocks odbx) (cdr (assoc 2 (entget (vlax-vla-object->ename ent)))))
                       (if (and
                (wcmatch (strcase (vla-get-objectname sub)) "*BLOCK*")
                                (not (member (strcase (vla-get-name sub)) (mapcar (function strcase) excludeblk_lst)))
                              ) ;_ end of and
                           (setq excludeblk_lst (cons (vla-get-name sub) excludeblk_lst))
                         ) ;_ end of if
                     ) ;_ end of vlax-for
            )
            ((wcmatch (strcase (vla-get-objectname ent)) "*LEADER*")
                   (if (not
                  (member (strcase (vla-get-arrowheadblock ent))
                                (mapcar (function strcase) excludeblk_lst)
                              ) ;_ end of member
                            ) ;_ end of not
                       (setq excludeblk_lst (cons (vla-get-arrowheadblock ent) excludeblk_lst))
                     ) ;_ end of if
            )
          ) ;_ end of cond
        ) ;_ end of vlax-for
          ) ;_ end of if
        ) ;_ end of vlax-for
        (vlax-for blk_def (vla-get-blocks odbx)
          (if (and
            (equal (vla-get-isxref blk_def) :vlax-false)
                    (not (member (vla-get-name blk_def) excludeblk_lst))
                    (not (wcmatch (vla-get-name blk_def) "`**"))
                  ) ;_ end of and
        (if (vl-catch-all-error-p
              (setq err (vl-catch-all-apply
                              (function
                                  (lambda ()
                                      (vla-put-name blk_def (strcat add_str "_" (vla-get-name blk_def)))
                                    ) ;_ end of lambda
                                ) ;_ end of function
                            ) ;_ end of vl-catch-all-apply
              )
            )
          (setq err_lst (cons
                              (cons (vla-get-name blk_def) (vl-catch-all-error-message err))
                              err_lst
                            ) ;_ end of cons
          ) ;_ end of setq
        ) ;_ end of if
          ) ;_ end of if
        ) ;_ end of vlax-for
        (vla-saveas odbx path_file)
        (vlax-release-object odbx)
        (setq odbx nil)
      )
    )
      )
    )
  )
) ;_ end of defun

Последний раз редактировалось TararykovDG, 22.09.2010 в 14:14.
TararykovDG вне форума  
 
Непрочитано 28.04.2011, 16:40
#12
kha

BIM, С#, AutoCAD, LISP
 
Регистрация: 15.03.2006
Дуброво
Сообщений: 657


Программа пригодилась. Спасибо!

Скажите, пожалуйста, что нужно сделать, чтобы применять код только к выбранным блокам?
__________________
"Молодой человек, Вы не представляете всей широты поставленной перед Вами задачи." © Панкратова Г.Е.
kha вне форума  
 
Непрочитано 01.06.2022, 15:20
#13
merkur1y

дороги
 
Регистрация: 12.07.2019
СПб
Сообщений: 134


Цитата:
Сообщение от VVA Посмотреть сообщение
В чистый файл вставь свои чертежи как внешние ссылки, а затем внедри со способом "внедрение" (bind)
с таким способом в чертеж внедрен ряд блоков
имя каждого файла исходного отражается в названии блока...
причём такая процедура была проделана и в этом "исходном файле"
соответственно имена у блоков очень длинные, что затрудняет их поиск в чертеже
можно ли как-то удалять из названия РЯДА блоков определенные символы (названия файлов исходных чертежей)
merkur1y вне форума  
 
Непрочитано 01.06.2022, 15:45
1 | 1 #14
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,653


merkur1y, а _RENAME с использованием спецсимволов - не подойдет?
Renaming multiple Blocks
skkkk вне форума  
 
Непрочитано 01.06.2022, 15:51
#15
merkur1y

дороги
 
Регистрация: 12.07.2019
СПб
Сообщений: 134


Цитата:
Сообщение от skkkk Посмотреть сообщение
merkur1y, а _RENAME с использованием спецсимволов - не подойдет?
Renaming multiple Blocks
спасибо!
получилось
merkur1y вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Нужно решение (программа) для массового переименования всех блоков

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обновление атрибутов всех блоков (Attsync для всех блоков) Vildar AutoCAD 3 18.05.2022 14:28
Нормализация insunits у всех блоков сразу Red Nova AutoCAD 18 06.02.2021 14:59
удаление всех одинаковых блоков при выборе одного? ищу способ LAmyk Программирование 10 10.06.2010 11:07
Помогите. Программа отображения каталогизированного списка блоков. --Илья-- Программирование 18 02.12.2009 11:25
Изменить параметры у всех объектов внутри блоков 800x600 AutoCAD 5 25.03.2008 14:21