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

Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Размещение 2 блока

Размещение 2 блока

Ответ
Поиск в этой теме
Непрочитано 26.09.2007, 17:39
Размещение 2 блока
Apog
 
москва
Регистрация: 12.09.2007
Сообщений: 17

Ситуация такая, я вставляю в чертеж блок, после этого мне нужно вставить в этот же чертеж другой блок. проблема заключается в том, что имена блоков совпадают и AutoCAD пишет в командной строке
"Повторное описание блока PSEQP пропущено" и подставляет графику первого блока, что является абсолютно не правильно!!! Как мне преодолеть эту проблему, очистить чертеж я не могу т.к. 1 блок используется!! Буду благодарен за любую помощь!!
Просмотров: 6488
 
Непрочитано 27.09.2007, 12:10
#21
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Все накрыло! Опиши подробно что у тебя есть и что нужно сделать?
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 27.09.2007, 12:12
#22
Apog


 
Регистрация: 12.09.2007
москва
Сообщений: 17


Цитата:
Сообщение от Profan
Что, что?
Цитата:
Все 2000 файлов имеют одинаковые имена файлов!!
Пристрелите меня.
Сори опечатался!! Все 2000 файлов имеют одинаковые имена блоков!
Apog вне форума  
 
Непрочитано 27.09.2007, 12:17
#23
Кулик Алексей aka kpblc
Moderator

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


Так, ситуация все страньше и страньше. Прикладывай архив с dwg и последовательно, шаг за шагом, описывай, что и как ты делал, чтобы вставить блок в файл. В архиве также "источник" нового блока.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 27.09.2007, 12:20
#24
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
<phrase 1=


приведи пример названий блоков
zamtmn вне форума  
 
Непрочитано 27.09.2007, 14:06
#25
Bull

Конструктор по сути (машиностроитель)
 
Регистрация: 10.10.2005
Набережные Челны (это где КамАЗ)
Сообщений: 11,391


ребята, по-моему всё просто. Когда-то чел делал блоки в файлах, не думая, что они пригодятся. И, не думая, называл их "1", например, везде. А теперь понадобилось делать типа каталога изделий. Вот и мучается товарищ.

Короче, будет быстрее, не обращая внимания на советы, работать двумя ком-ми: past block и rename
__________________
Век живи, век учись - ...
Bull вне форума  
 
Автор темы   Непрочитано 27.09.2007, 15:55
#26
Apog


 
Регистрация: 12.09.2007
москва
Сообщений: 17


Цитата:
Сообщение от Bull
ребята, по-моему всё просто. Когда-то чел делал блоки в файлах, не думая, что они пригодятся. И, не думая, называл их "1", например, везде. А теперь понадобилось делать типа каталога изделий. Вот и мучается товарищ.

Короче, будет быстрее, не обращая внимания на советы, работать двумя ком-ми: past block и rename
Вы абсолютно правы! просто хотелось как-то оптимизировать процесс! спасибо
Apog вне форума  
 
Непрочитано 27.09.2007, 16:27
#27
Bull

Конструктор по сути (машиностроитель)
 
Регистрация: 10.10.2005
Набережные Челны (это где КамАЗ)
Сообщений: 11,391


Ну, теперь вот и lisp'овщики могут подсоединиться к процессу.
__________________
Век живи, век учись - ...
Bull вне форума  
 
Непрочитано 27.09.2007, 18:36
#28
Star

Конструктор штампов
 
Регистрация: 10.03.2004
г. Киев
Сообщений: 92


А сколько блоков в каждом файле?
Если 1, то какой в них смысл при данной технологии организации базы? Разве что, точка вставки была в нужном месте...
Если точка вставки не имеет значение, то нужно в пакетном режиме открыть необходимые файлы:
- взорвать блок
- пурдж блок
- сохранить файл
- закрыть файл
Star вне форума  
 
Непрочитано 28.09.2007, 00:59
#29
Кулик Алексей aka kpblc
Moderator

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


Для варианта "в каждом файле немеряно блоков" можно попробовать такой код:
Код:
[Выделить все]
(vl-load-com)

(defun rename-blocks-in-dwg (path
                             /
                             z-files-in-directory
                             _kpblc-odbx
                             _kpblc-odbx-close
                             _kpblc-acad-version
                             _kpblc-conv-value-to-string
                             _kpblc-conv-value-to-int
                             _kpblc-dir-path-and-splash
                             _kpblc-string-ext
                             _kpblc-error-catch
                             _kpblc-error-print
                             _kpblc-string-replace
                             _kpblc-get-msg-norm
                             doc
                             prefix
                             )

  (defun z-files-in-directory (directory pattern nested /)
                              ;|
*    функция z-files-in-directory возвращает список файлов находящаяся в заданной
* директории
*    Автор : Зуенко Виталий (ZZZ)
*  Параметры:
*    directory  путь к папке например "D:\\Мои документы\\ZEF\\Lisp"
*    pattern    шаблон например "*.lsp" или список '("*.dwg" "*.dxf")
*    nested    искать в вложенных папках: t (да) или nil (нет)
* Пример вызова:
(z-files-in-directory "D:\\Мои документы\\ZEF\\Lisp" "*.lsp" t)
(z-files-in-directory "D:\\Мои документы\\ZEF\\Lisp" '("*.lsp" "*.fas") t)
|;
    (if (not (listp pattern))
      (setq pattern (list pattern))
      ) ;_ if
    (if nested
      (apply
        'append
        (append
          (mapcar '(lambda (_pattern)
                     (mapcar '(lambda (f) (strcat directory "\\" f))
                             (vl-directory-files directory _pattern 1)
                             ) ;_ list
                     ) ;_ lambda
                  pattern
                  ) ;_ mapcar
          (mapcar
            '(lambda (d)
               (z-files-in-directory
                 (strcat directory "\\" d)
                 pattern
                 nested
                 ) ;_ z-files-in-directory
               ) ;_ lambda
            (vl-remove
              "."
              (vl-remove ".."
                         (vl-directory-files directory nil -1)
                         ) ;_ end of vl-remove
              ) ;_ vl-remove
            ) ;_ mapcar
          ) ;_ append
        ) ;_ append
      (apply
        'append
        (mapcar '(lambda (_pattern)
                   (mapcar '(lambda (f) (strcat directory "\\" f))
                           (vl-directory-files directory _pattern 1)
                           ) ;_ list
                   ) ;_ lambda
                pattern
                ) ;_ end of mapcar
        ) ;_ end of apply
      ) ;_ end of if
    ) ;_ end of defun

  (defun _kpblc-acad-version ()
                             ;|
*    Возвращает номер сборки AutoCAD'a. Для 2005 вернет 16.1, для 2006 - 16.2
|;
    (atof (getvar "acadver"))
    ) ;_ end of defun

  (defun _kpblc-conv-value-to-int (value /)
                                  ;|
*    конвертация значения в целое. Для VLA-объектов возвращается nil.
*    Точечные списки не обрабатываются.
|;
    (atoi (_kpblc-conv-value-to-string value))
    ) ;_ end of defun

  (defun _kpblc-dir-path-and-splash (path)
                                    ;|
*    Возвращает путь со слешем в конце
*    Параметры вызова:
*   path   - обрабатываемый путь
*    Примеры вызова:
(_kpblc-dir-path-and-splash "c:\\kpblc-cad")   ; "c:\\kpblc-cad\\"
|;
    (strcat (vl-string-right-trim "\\" path) "\\")
    ) ;_ end of defun

  (defun _kpblc-conv-value-to-string (value /)
                                     ;|
*    конвертация значения в строку.
|;
    (if value
      (vl-princ-to-string value)
      ""
      ) ;_ end of if
    ) ;_ end of defun

  (defun _kpblc-string-ext (string ext / str)
                           ;|
*    Функция меняет "расширение" переданной строки на устанавливаемое. В строке
* должно быть не более 1 символа ".", все, что после него, считается
* расширением
*    Параметры вызова:
*   string   модифицируемая строка
*   ext   устанавливаемое расширение (можно без ".")
*    Примеры вызова:
(_kpblc-string-ext "abcd" "cfg")   ; -> "abcd.cfg"
(_kpblc-string-ext "AbCd" ".ext")   ; -> "abcd.ext"
|;
    (setq ext (strcat "." (vl-string-left-trim "." ext))
          str (strcase (vl-filename-base string))
          str (strcase (strcat (vl-string-trim " " str) ext) t)
          ) ;_ end of setq
    (if (/= (vl-filename-directory string) "")
      (setq
        str
         (strcat (_kpblc-dir-path-and-splash (vl-filename-directory string))
                 str
                 ) ;_ end of strcat
        ) ;_ end of setq
      ) ;_ end of if
    str
    ) ;_ end of defun

  (defun _kpblc-odbx (/)
                     ;|
*    функция возвращает интерфейс IAxDbDocument (для работы с файлами DWG без
* их открытия). Если интерфейс не поддерживается, возвращает nil. Проверено
* на ACAD 2002, 2004, 2005, 2006, 2007
*    Автор - Fatty aka Олег jr. Моего только адаптация под общую систему и
* переименование
*    Параметры вызова:
*   нет
*    Примеры вызова:
(_kpblc-odbx)
|;
    (cond
      ((< (_kpblc-acad-version) 15.06)
       (alert "ObjectDBX method not applicable\nin this AutoCAD version")
       nil
       )
      ((= (fix (_kpblc-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."
                 (_kpblc-conv-value-to-string
                   (_kpblc-conv-value-to-int (_kpblc-acad-version))
                   ) ;_ end of _kpblc-conv-value-to-string
                 ) ;_ end of strcat
         ) ;_ end of vla-getinterfaceobject
       )
      ) ;_ end of cond
    ) ;_ end of defun

  (defun _kpblc-odbx-close (conn)
                           ;|
*    Закрытие файла, открытого ранее через _kpblc-odbx-*. С попыткой сохранения
*    Параметры вызова:
*   conn   соединение с ObjectDBX, созданное ранее через (_kpblc-odbx)
*      либо список:
      '(("conn" . <ObjectDBXConnection>)   ; то же самое
   ("save" . t)         ; сохранять или нет изменения
   ("file" . "c:\\temp\\tmp.dwg")   ; имя, под которым сохранять. nil ->
      ; использовать текущее
|;
    (if (and (= (type conn) 'list)
             (cdr (assoc "save" conn))
             ) ;_ end of and
      (progn
        (vlax-invoke
          (cdr (assoc "conn" conn))
          'saveas
          (cond
            ((cdr (assoc "file" conn))
             (strcat (_kpblc-dir-path-and-splash (vl-filename-directory file))
                     (_kpblc-string-ext (vl-filename-base file) "dwg")
                     ) ;_ end of strcat
             )
            (t (vla-get-name (cdr (assoc "conn" conn))))
            ) ;_ end of cond
          ) ;_ end of vlax-invoke
        ) ;_ end of progn
      ) ;_ end of if
    (vl-catch-all-apply
      '(lambda ()
         (vlax-release-object
           (if (= (type conn) 'list)
             (cdr (assoc "conn" conn))
             conn
             ) ;_ end of if
           ) ;_ end of vlax-release-object
         ) ;_ end of lambda
      ) ;_ end of vl-catch-all-apply
    (setq conn nil)
    ) ;_ end of defun

  (defun _kpblc-error-catch (protected-function
                             on-error-function
                             /
                             catch_error_result
                             )
                            ;|
*** Функция взята из книжной версии ruCAD'a без каких бы то ни было переделок,
*** кроме переименования.
*    Оболочка отлова ошибок.
*    Параметры вызова:
*   protected-function   - "защищаемая" функция
*   on-error-function   - функция, выполняемая в случае ошибки
|;
    (setq catch_error_result (vl-catch-all-apply protected-function))
    (if (and (vl-catch-all-error-p catch_error_result)
             on-error-function
             ) ;_ end of and
      (apply on-error-function
             (list (vl-catch-all-error-message catch_error_result))
             ) ;_ end of apply
      catch_error_result
      ) ;_ end of if
    ) ;_ end of defun

  (defun _kpblc-error-print (func-name msg)
                            ;|
*    Функция вывода сообщения об ошибке для (_kpblc-error-catch)
*    Параметры вызова:
*   func-name   имя функции, в которой возникла ошибка
*   msg      сообщение об ошибке
|;
    (princ (strcat "\n ** "
                   (_kpblc-get-msg-norm
                     (_kpblc-string-replace
                       (strcase (_kpblc-conv-value-to-string func-name) t)
                       "error"
                       ""
                       ) ;_ end of _kpblc-string-replace
                     ) ;_ end of _kpblc-get-msg-norm
                   " ERROR #"
                   (if msg
                     (strcat
                       (_kpblc-conv-value-to-string (getvar "errno"))
                       ": "
                       (_kpblc-conv-value-to-string msg)
                       ) ;_ end of strcat
                     ": undefined"
                     ) ;_ end of if
                   "\n"
                   ) ;_ end of strcat
           ) ;_ end of princ
    (princ)
    ) ;_ end of defun

  (defun _kpblc-string-replace (string old_substr new_substr / pos)
                               ;|
*    Функция замены вхождений подстроки в исходную строку на новые.
* Регистрозависимо
*    Параметры вызова:
*   string      исходная строка
*   ols_substr   старая подстрока
*   new_substr   новая подстрока
*    Примеры вызова:
(_kpblc-string-replace "Здесь были ВаВася и ВаВаВаня. Вася" "Ва" "Бу")
   ; "Здесь были Буся и Буня. Буся"
|;
    (if (/= old_substr new_substr)
      (while (setq pos (vl-string-search old_substr string))
        (setq string
               (strcat
                 (substr string 1 pos)
                 new_substr
                 (_kpblc-string-replace
                   (substr string (+ (strlen old_substr) pos 1))
                   old_substr
                   new_substr
                   ) ;_ end of _kpblc-string-replace
                 ) ;_ end of strcat
              ) ;_ end of setq
        ) ;_ end of while
      ) ;_ end of if
    string
    ) ;_ end of defun

  (defun _kpblc-get-msg-norm (msg)
                             ;|
*    Нормализация строки запроса для использования в запросах ком.строки
|;
    (vl-string-trim "][ :\n<>" msg)
    ) ;_ end of defun

  (foreach file (z-files-in-directory path "*.dwg" t)
    (_kpblc-error-catch
      (function
        (lambda ()
          (setq doc (_kpblc-odbx))
          (vla-open doc file)
          (vlax-for blk_def (vla-get-blocks doc)
            (if (and (equal (vla-get-islayout blk_def) :vlax-false)
                     (equal (vla-get-isxref blk_def) :vlax-false)
                     (not (wcmatch (strcase (vla-get-name blk_def)) "`**"))
                     ) ;_ end of and
              (vla-put-name
                blk_def
                (strcat (setq prefix
                               ((lambda (/ res)
                                  (setq res (vl-filename-base file))
                                  (foreach item
                                           '("\\" "/" "." "," ":" ";" "`" "~" "'")
                                    (setq res (_kpblc-string-replace res item "_"))
                                    ) ;_ end of foreach
                                  (cond
                                    ((> (strlen res) 120)
                                     (substr res (- (strlen res) 120))
                                     )
                                    (t res)
                                    ) ;_ end of cond
                                  ) ;_ end of lambda
                                )
                              ) ;_ end of setq
                        "-"
                        (if (wcmatch (strcase (vla-get-name blk_def))
                                     (strcat (strcase prefix) "*")
                                     ) ;_ end of wcmatch
                          (substr (vla-get-name blk_def) (+ 3 (strlen prefix)))
                          (vla-get-name blk_def)
                          ) ;_ end of if
                        ) ;_ end of strcat
                ) ;_ end of vla-put-name
              ) ;_ end of if
            ) ;_ end of vlax-for
          ) ;_ end of lambda
        ) ;_ end of function
      nil
      ) ;_ end of _kpblc-error-catch
    (_kpblc-odbx-close (list (cons "conn" doc) (cons "save" t)))
    ) ;_ end of foreach
  ) ;_ end of defun
Я его не тестировал. Что оно делает: последовательно открывает каждый файл из указанной папки; проходит по всем блокам (надеюсь, что дин.блоков в библиотеке нет - на них никакой проверки не выполняется); к имени блока прибавляет имя файла и через минус - имя блока. Игнорирует блоки анонимные, блоки размеров и таблиц.
Перед работой следует сделать следующее: все файлы из обрабатываемой папки закрыть (к ним должен быть осуществлен "монопольный" доступ, иначе выбьет в ошибку). Проверки на целостность файла не выполняется (если файл невозможно открыть - выбьет в ошибку). Файлы не очищаются. Блоки "в нормальный вид" не приводятся (хотя и можно сделать).
---
Добавлено: Да, вот еще. По блокам размерных стилей тоже пройдется, теоретически их надо исключать из обработки. Но мне пока лениво. Может, с утра пораньше, если будет время...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 28.09.2007, 11:27
#30
Apog


 
Регистрация: 12.09.2007
москва
Сообщений: 17


Цитата:
Сообщение от Кулик Алексей aka kpblc

к имени блока прибавляет имя файла и через минус - имя блока. .
Спасибо за идею, это то что нужно для решения проблемы!!!
Немножко не понял как запустить данный лисп?? какая команда?
Apog вне форума  
 
Непрочитано 28.09.2007, 11:32
#31
Кулик Алексей aka kpblc
Moderator

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


Например, обрабатываемые файлы положены в папку "d:\files\acad\block\lib". Тогда вызов будет:
Код:
[Выделить все]
Command : (rename-blocks-in-dwg "d:\\files\\acad\\block\\lib")
Вызов обязательно надо "обрамлять" скобками; при указании пути надо заменять символ "\" на двойной слеш: "\\" или на один обратный : "/".
P.S. А ведь так и не изменил код...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 28.09.2007, 11:48
#32
Bull

Конструктор по сути (машиностроитель)
 
Регистрация: 10.10.2005
Набережные Челны (это где КамАЗ)
Сообщений: 11,391


скопирую ка себе на всякий случай тоже. Хотя бы для общего развития.
__________________
Век живи, век учись - ...
Bull вне форума  
 
Непрочитано 28.09.2007, 11:51
#33
Profan


 
Регистрация: 25.12.2005
Москва
Сообщений: 13,627


Для Bull.
И мне, и мне скопируй.
P.S. Судя по тому, что дальше написали, погоди мне копировать.
Profan вне форума  
 
Автор темы   Непрочитано 28.09.2007, 11:55
#34
Apog


 
Регистрация: 12.09.2007
москва
Сообщений: 17


Цитата:
Сообщение от Кулик Алексей aka kpblc
P.S. А ведь так и не изменил код...
AutoCAD выдал:

Команда: (rename-blocks-in-dwg "e:\\ATOLL")
; ошибка: no function definition: VLA-GET-NAME

что поправить??-)
Apog вне форума  
 
Непрочитано 28.09.2007, 12:00
#35
asys

архитектор
 
Регистрация: 10.08.2005
Ростов-на-Дону
Сообщений: 5,283


возможен такой вариант:
в файле не блок, а только объекты блока и этот файл вставляется командой insert как блок. Т.е. заходишь в файло - бомбишь блок, закрываешь - сохраняешь. И потом вставляешь файл как блок. Уж виндовские названия файлов надеюсь разные?
P.S.
Цитата:
PS Вот на самом деле... и подпись кстати получилась
там вроде концовка еще есть "... и все равно дураком помрешь"
asys вне форума  
 
Автор темы   Непрочитано 28.09.2007, 12:06
#36
Apog


 
Регистрация: 12.09.2007
москва
Сообщений: 17


Цитата:
Сообщение от Asys
возможен такой вариант:
в файле не блок, а только объекты блока и этот файл вставляется командой insert как блок. Т.е. заходишь в файло - бомбишь блок, закрываешь - сохраняешь. И потом вставляешь файл как блок. Уж виндовские названия файлов надеюсь разные?
Имена файлов разные!-)
а что это меняет, если в файлах объекты блока? они же имею имена!!
Приаттачиваю файлик с блоком-)
[ATTACH]1190966801.dwg[/ATTACH]
Apog вне форума  
 
Непрочитано 28.09.2007, 12:11
#37
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от Apog
Цитата:
Сообщение от Кулик Алексей aka kpblc
P.S. А ведь так и не изменил код...
AutoCAD выдал:

Команда: (rename-blocks-in-dwg "e:\\ATOLL")
; ошибка: no function definition: VLA-GET-NAME

что поправить??-)
Самой первой строкой (перед defun которая) поставить (vl-load-com). Код исправил (в этой части).
---
Добавлено: для гарантии запускай на копиях.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 28.09.2007, 12:37
#38
Apog


 
Регистрация: 12.09.2007
москва
Сообщений: 17


Цитата:
Сообщение от Кулик Алексей aka kpblc
Самой первой строкой (перед defun которая) поставить (vl-load-com). Код исправил (в этой части).
---
Добавлено: для гарантии запускай на копиях.
Запустил! что-то отработало, даже bak файлы создались! но вот блок не изменил свое название!!! а счастье было так близко-(
Apog вне форума  
 
Непрочитано 28.09.2007, 12:47
#39
Кулик Алексей aka kpblc
Moderator

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


Стоп, оно должно было в обрабатываемых файлах поменять имена блоков!
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 28.09.2007, 12:56
#40
Apog


 
Регистрация: 12.09.2007
москва
Сообщений: 17


Цитата:
Сообщение от Кулик Алексей aka kpblc
Стоп, оно должно было в обрабатываемых файлах поменять имена блоков!
да, а для чего тогда указывать дирректорию???
если поменять исходные файлы, то при размещении в новый файл пересечений имен не будет и проблема решится!
а что тогда делает програма?

а счастье было еще ближе-(
помоги о великий Кулик Алексей aka kpblc-))
Apog вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > Размещение 2 блока

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

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