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

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

Нужна функция импорта блока из файла

Ответ
Поиск в этой теме
Непрочитано 22.12.2007, 11:02 #1
Нужна функция импорта блока из файла
Krieger
 
инженер (КМ)
 
Красноярск
Регистрация: 30.10.2004
Сообщений: 3,825

Здравствуйте.
Нужна функция импорта блока в файл из файла библиотеки. Функция либо импортирует весь файл блоком либо выбирает блок из этого файла.
(Import_Block "nameblock" "namefile" key), где
"nameblock" имя блока,
"namefile" имя файла с блоком,
key - ключ: t - импортировать файл блоком с именем nameblock, nil - импортировать блок nameblock из файла namefile.

Может завалялось у кого, что подобное?
Просмотров: 11236
 
Непрочитано 22.12.2007, 12:35
#2
VVA

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


Мои функции. Сделаны на основе ф-ций Алексея из Cadware. Не помню чего менял или нет. Немного поясню. Схема работы у нас организована следующим образом: в путях доступа Автокада прописан путь к корневой папке приложения (например "C:\\Progmas files\\MIP"). Библиотека блоков располагается в подпапке DWG, дальше подпапки разбиваются на отделы и т.п. Поиск библиотеки блоков может осуществляться как по имени блока (например "bibl.dwg"), так и по относительному пути (например "DWG\\DO_ZNAK\\STOJKA_P.DWG").
Если используется полный или относительный путь, то обязательно указывать расширение.
Если надо вставить файл как блок, то имя библиотеки и имя файла должны совпадать.
Если вставляется библиотека блоков, то проверяется, что поcле ее внедрения в таблице блоков появился блок с требуемым именем. Остальные блоки библиотеки после внедрения не пуржаться.
Вот кратенько и все.
Код:
[Выделить все]
;|====================== lib:get-block-library-path ===========================
*    Получение пути библиотеки блоков.
*    Библиотеки хранятся в подпапке DWG\\
*   bibl_path - относительный путь с именем файла и расширением dwg!!!
*   Библиотека УП Минскинжпроект 2005 Владимир Азарко (VVA)
Пример
     (lib:get-block-library-path "DWG\\DO_ZNAK\\STOJKA_P.DWG")
Возвращает полный путь или nil 
=============================================================================|;
;|
;;; Пример
(lib:get-block-library-path "MIP_LIB_DYN.DWG") ;_ "G:\\Work\\4ACAD\\Mip\\Work\\MIP_LIB_DYN.DWG" 
(lib:get-block-library-path "DWG\\DO_ZNAK\\STOJKA_P.DWG") ;"G:\\Work\\4ACAD\\Mip\\Work\\DWG\\DO_ZNAK\\STOJKA_P.DWG" |;
 
(defun lib:get-block-library-path (bibl_path)(findfile bibl_path))
;;; =================== lib:add-block-to-doc-from-lib =================================
;;; *    Внедрение в файл библиотеки блоков, в которой определено имя блока.          *
;;; *                                                                                 *
;;; *   Аргументы:                                                                    *
;;; * block-lib  - имя файла библиотеки (возможно, с полным или относительным путем)*
;;; *                !!! При указании полного или относительного пути обязательно     *
;;; *                !!! указывать расширение                                         *
;;; * block-name - имя блока в библиотеке                                           *
;;; *    Библиотека УП Минскинжпроект 2005 Владимир Азарко (VVA)                      *
;;; *                                                                                 *
;;; *  Возврат:                                                                       *
;;;     t  - блок загружен удачно                                                      
;;;    nil - нет с соответствующим предупреждением.                                    
;;; ===================================================================================
;|   
;;;; Примеры вызова:
(lib:add-block-to-doc-from-lib "MIP_LIB_DYN" "MIP_WELL_DYN_P")
(lib:add-block-to-doc-from-lib "MIP" "MIP_Znak")
;;; Для вставки одного блока поля продублировать
(lib:add-block-to-doc-from-lib "DWG\\DO_ZNAK\\STOJKA_P.DWG" "STOJKA_P")
(lib:add-block-to-doc-from-lib "MIP_Znak" "MIP_Znak")
|;
(defun lib:add-block-to-doc-from-lib (block-lib block-name / block-lib-name )
  (setq block-lib-name
  (lib:get-block-library-path
            (if (VL-FILENAME-EXTENSION block-lib)      block-lib
         (strcat block-lib  ".dwg"))
                )) ;_ end of setq
  (if (tblsearch "block" (if block-name block-name (VL-FILENAME-BASE block-lib-name)))
    t
    (progn
      (if block-lib-name
 (progn
   (command "_.-insert" block-lib-name)(command)
   (if (tblsearch "block" (if block-name block-name (VL-FILENAME-BASE block-lib-name)))
     t
     (progn
       (alert
  (strcat "Блок "
   block-name
   " не найден в библиотеке "
   block-lib
   ) ;_ end of strcat
  ) ;_ end of kpblc-msg-alert
       nil
       ) ;_ end of progn
     ) ;_ end of if
   ) ;_ end of progn
 (progn
   (alert (strcat "Не найден файл библиотеки " block-lib))
   nil
   ) ;_ end of progn
 ) ;_ end of if
      ) ;_ end of progn
    ) ;_ end of if
  ) ;_ end of defun
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 18.01.2017 в 07:11. Причина: орфография
VVA вне форума  
 
Непрочитано 22.12.2007, 13:37
#3
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Как Krieger написал, так и надо сделать.
Только вот загвоздка, а если путь к файлу не указан в Support File Search Path, то надо такой блок вставлять?
Supermax вне форума  
 
Непрочитано 22.12.2007, 15:14
#4
VVA

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


Цитата:
Как Krieger написал, так и надо сделать
Если я правильно понял, так и делается.
Если имя block-lib и block-name совпадает, то загружается блок как файл
Если имя block-lib и block-name разные, то загружается блок block-lib и проверяется наличие блока block-name.
Цитата:
Только вот загвоздка, а если путь к файлу не указан в Support File Search Path, то надо такой блок вставлять?
Никто не мешает указать в block-lib полный путь.
*** Добавлено
Алгоритм работы функции расписан ShaggyDoc №21
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 22.12.2007, 18:28
#5
Krieger

инженер (КМ)
 
Регистрация: 30.10.2004
Красноярск
Сообщений: 3,825


Ну вообще-то я хотел чтобы не загружались лишние блоки. Я думал что есть нечто посовершеннее чем "_.-insert".
Прочитал ShaggyDoc №21 из темы "Помогите начинающему разобраться с блоками"... возможно он прав. Что ж если нет других вариантов, то буду прибираться в своей библиотеке. VVA спасибо.
Krieger вне форума  
 
Непрочитано 22.12.2007, 20:52
#6
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


А я то о чем говорю? Если вставлять блок из файла с моделью теплового пункта, то вставляется _insert-ом все, что в файле. А зачем это мне надо? Мне надо только один краник, или теплообменник. Я понимаю, что если сделать на каждую деталь свой файл, да еще и разместить в нем блок, чтобы 0,0,0 было на месте точки вставки, то все будет в шоколаде, но что делать, если мне подарили чужую базу? Гигабайты блоков? Я даже не знаю что там есть, а чего там нет. Как мне найти там то, что мне нужно? И имен я не знаю и путей к файлам тоже. Мне бы перелопатить dwg и выписать что там есть за блоки, или хотя бы методом последовательного накопления - открыл файл - он пропесочился и в БД вписался автоматом. Поскольку все файлы мы когда-нибудь, да открываем, то и когда-нибудь будем иметь почти все, что у нас в dwg есть.

Функцию, что krieger заказал, а VVA написал можно использовать только после того, как ты точно знаешь имя и путь к файлу. Лучше было бы так:
Нажал кнопку "вставить блок из библиотеки" выпало меню - "по имени блока" "по имени файла" "по назначению".
Если выбираешь имя блока - выдает в алфавитном порядке все имена блоков во всех перелопаченных файлах. После указания на блок - выпадает список со всеми файлами, где он есть. Указал на выбранный файл - получил.

Выбираешь имя файла - все перелопаченные файлы в алфавитном порядке выдает, а когда выбираешь конкретный - выдает список блоков в нем.

Выбираешь "по назначению" - выдает раскрывающееся дерево справки, где спускаясь по ступенькам доходишь до нужного блока и когда его жмешь (ссылка) - список файлов где он есть и выбираешь любой - готово.
Supermax вне форума  
 
Непрочитано 26.12.2007, 14:44
#7
VVA

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


>Supermax А DBXImportBlock Fatty тебе не подойдет?
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 26.12.2007, 16:37
#8
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


VVA, Вещь безусловно классная. Спасибо!
Одна только загвоздка небольшая, как оказалось, на моем компе чуть больше чем 160000 dwg файлов. До старости можно нужный блок искать.

У Kpblc-a чуть больше 40000, да и у тебя, наверное, не меньше.
Supermax вне форума  
 
Непрочитано 26.12.2007, 17:02
#9
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


В данной мне VVA ссылке, программа имеет один дефект.
В ней устанавливается путь и имя временного файла на усмотрение машины и если прерывается программа то dcl файл навсегда остается в этой папке. Происходит накопление "брошеных" dcl файлов. Так делать нельзя. Имя должно быть фиксировано и папка указана напрямую типа c:\\templsp\\libris.dcl а перед тем, как создавать новый файл, старый должен быть удален. Хотя W заново все пишет.
Supermax вне форума  
 
Непрочитано 26.12.2007, 18:14
#10
VVA

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


Если имена блоков осмысленные, то запихать в mdb, excell или текстовый файл все имена созданных в файле блоков не так уж и сложно.
Как пример. На диске образуется файл C:\BlockName.xls
Перелопачивает файлы, поочередно открывая их. Через DBX быстрее, но под руками нет готового кода с dbx
Код:
[Выделить все]
;| Основной код взят с
  CADALYST 03/05 Tip2023: PurgeFiles.lsp Directory Clean Up (c) Andrzej Gumula
  [c]2004 Andrzej Gumula, Katowice, Poland
  e-mail: [email protected]|;
(vl-load-com)
;;;Ф-ция работы с обрабатываемым файлом
;;;curDOC - Vla указатель на обрабатываемый документ
;;; типа (vla-get-activedocument (vlax-get-acad-object))
(defun dofile ( curDOC / name fname)
   (setq fname (vl-princ-to-string(vla-get-fullname curdoc)))
   (setq *CVSFILE* (open "C:\\BlockName.xls" "a")) 
 (if (null *CVSFILE*)(progn
   (setq *CVSFILE* (open "C:\\BlockName.xls" "w"))
   (write-line (strcat "Имя блока\tИмя файла") *CVSFILE*)
   )
   )
  (vlax-for blk (vla-get-Blocks  curDOC)
    (setq bb blk)
    (if (and (= (vla-get-IsLayout Blk) :vlax-false)
             (= (vla-get-IsXref Blk) :vlax-false)
             (/= (substr (vla-get-name blk) 1 1) "*")
             )
      (progn
        (setq name (vla-get-name blk))
        (write-line  (strcat name "\t" fname) *CVSFILE*)
        )
      )
    )
 (if (= (type *CVSFILE*) 'FILE)
      (setq *CVSFILE* (close *CVSFILE*))) 
;;;Для примера    
;;;Печать имени файла    
;(princ "\nИмя файла:")
;(princ  (vlax-variant-value (vla-GetVariable curDOC "DWGNAME")))
;;;  Очистка
;;; (repeat 3 (vla-purgeall curDOC))
    )
(defun c:DoFile (/ FilesList SubDir Files File *error*)
  (defun *error* (msg)
    (princ msg)
    (if (= (type *CVSFILE*) 'FILE)
      (setq *CVSFILE* (close *CVSFILE*)))
    (princ)
    )
  (defun GetFolder (/ Dir Item Path)
    (cond
      ((setq Dir
 (vlax-invoke
  (vlax-get-or-create-object "Shell.Application")
    'browseforfolder 0
    "Select folder with DWG files:" 1 ""))
       (cond
  ((not (vl-catch-all-error-p
       (vl-catch-all-apply 'vlax-invoke-method (list Dir 'Items))))
   (setq Item (vlax-invoke-method
         (vlax-invoke-method Dir 'Items)
         'Item))
   (setq Path (vla-get-path Item))
   (if
     (not (member (substr Path (strlen Path) 1) (list "/" "\\")))
      (setq Path (strcat Path "\\")))))))
    Path)
  (defun vl-findfile (Location / DirList Path AllPath)
    (MakeDirList Location)
    (setq DirList (cons Location DirList))
    (foreach Elem DirList
      (if (setq Path (vl-directory-files Elem "*.dwg"))
 (foreach Item Path
   (setq AllPath (cons (strcat Elem "/" Item) AllPath)))))
    (reverse AllPath))
  (defun MakeDirList (Arg / TmpList)
    (setq TmpList (cddr (vl-directory-files Arg nil -1)))
    (cond (TmpList
       (setq DirList (append
     DirList
     (mapcar '(lambda (z) (strcat Arg "/" z)) TmpList)))
       (foreach Item TmpList (MakeDirList (strcat Arg "/" Item))))))
  (setq *ERR-LIST* nil)
  (if (not FileSystemObject)
    (setq FileSystemObject
    (vla-getInterfaceObject
      (vlax-get-acad-object)
      "Scripting.FileSystemObject")))
  (cond
    ((= (getvar "SDI") 0)
     (cond
       ((setq DwgPath (GetFolder))
 (initget 1 "Yes No")
 (setq
   Subdir (cond
     ((getkword "\nОбрабатывать поддиректории? [Yes/No]: "))
     (T "Yes")))
 (if (equal SubDir "Yes")
   (setq Files
   (vl-findfile (substr DwgPath 1 (1- (strlen DwgPath)))))
   (setq Files (mapcar '(lambda (x) (strcat dwgpath x))
         (vl-directory-files DwgPath "*.dwg" 1))))
 (setq Files (mapcar 'strcase Files))
 (cond
   (Files
    (vlax-for & (vla-get-documents (vlax-get-acad-object))
      (setq FilesList
      (cons (strcase (vla-get-fullname &)) FilesList)))
    (foreach & Files
      (cond
        ((not (member & FilesList))
  (cond
    ((/= (logand (vlax-get-property
     (vlax-invoke-method
       FileSystemObject
       'getfile
       &
     )
     'Attributes
          )
          1
         )
         1
     )
     (cond
       ((and
                        (VL-FILE-SYSTIME &)
                        (setq File
       (vla-open (vla-get-documents
          (vlax-get-acad-object)) &))
                        )
        (prompt
   (strcat "\nОбработка файла" & ". Подождите..."))
;;;             Вызываем ф-цию работы с файлом FILE - Vla указатель на документ
        (dofile FILE)
        (prompt (strcat "\nSave and close " &))
        (vla-save File)
        (vla-close File)
        (vlax-release-object File))
       (T
        (prompt
   (strcat
     "\nCannot open "
     &
     "\nDrawing file was created by an incompatible version. ")))))
    (T (prompt (strcat & " is read-only. Purge canceled. ")))))
        (T (prompt (strcat & " is open now. Purge canceled. "))))))
   (T (prompt "\nNothing files found to purge. "))))
       (T (prompt "\nNothing selected. "))))
    (T (prompt "\nThe routine is not available in SDI mode. ")))
  (if (= (type *CVSFILE*) 'FILE)
      (setq *CVSFILE* (close *CVSFILE*)))
  (princ)
  )
(prompt "\n===   Команда загружена. Наберите Dofile  ===")(princ)
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 26.12.2007, 19:13
#11
Кулик Алексей aka kpblc
Moderator

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


Посмотри в dwgrulib - там вроде было по ObjectDBX функции открытия и закрытия файлов.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 26.12.2007, 19:53
#12
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


VVA, макрос обломился.
Как только он напарывается на ...recover.dwg прога слетает. Колбасит все файлы с полным открытием и конца и края не видно этому процессу.
Я писал, что безсмысленно обрабатывать все файлы на предмет создания списка заключенных в них блоков. Поседеете. Только методом накопления. А вот список файлов можно создать и уже выбирая из него выколупывать список блоков.
Сейчас попробую что-нибудь не большое.
Supermax вне форума  
 
Непрочитано 26.12.2007, 19:57
#13
Кулик Алексей aka kpblc
Moderator

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


перед пакетной обработкой файлов ИМХО не помешает прочесть http://www.arcada.com.ua/forum/viewtopic.php?t=1060
Ну и дополнительно - что обсуждалось на caduser.ru по этому вопросу.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 26.12.2007, 20:23
#14
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


5 минут одну папку лопатило 857 позиций блоков нашло.
Путь - отдельно, имя файла - отдельно! (надо)
Если повторно открывается в той-же папке тот же файл, надо переписывать, однако все, что там было на то, что там теперь есть.
И ссылки не гоже переписывать, хоть они и похожи на блоки, но всеж не блоки.
А так - верным путем идете товарищи!
Supermax вне форума  
 
Непрочитано 26.12.2007, 20:51
#15
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Кстати, а из 7-го поста прожка без открытия файла все блоки выгребла. Последний перл, когда нарывался на раскрашенную монтажку теплопункта, пока не откроется полностью файл, грузился и грузился. А ту же монтажку из поста 7 за секунду переписало, да еще и временный dcl из найденного сорганизовало.
Supermax вне форума  
 
Непрочитано 26.12.2007, 22:56
#16
Кулик Алексей aka kpblc
Moderator

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


Файл все равно открывается, хочешь ты того или нет. Иначе до его потрохов не добраться.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 27.12.2007, 11:06
#17
VVA

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


>Supermax #14 Я уже писал, что через DBX (что и делает прожка из #7) быстрее. Файл открывается все равно, только не визуализируется и (возможно) не подгружаются вн. вссылки. Примера с DBX под руками не было (пока Алексей не показал где ).
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 27.12.2007, 14:13
#18
Supermax

Руководитель фирмы
 
Регистрация: 28.03.2007
Москва
Сообщений: 1,831
Отправить сообщение для Supermax с помощью Skype™


Так что делать с перезаписью повторно открытого?
Может сразу в Access делать? Я знаю, что Алексей сведущ в этом вопросе, но получается, что программа становится трудоемкой и я понимаю, что писать ее "за так" и ломит и крутит. Но без этого, на библиотеке блоков можно ставить крест.

Сейчас ни в одной смете не найдешь пункта "амортизация ПО", но после нового года, я прикрываясь новым законом без бабла на сей счет, даже разговаривать с заказчиком не буду. И плевать мне, что в сметных нормах нет этого пункта и экспертиза сметы постоянно подобные попытки под ножницы пускает. Не мои проблемы! Вот тогда и поговорим о библиотеке блоков. До нового года осталось пару-тройка дней.
Supermax вне форума  
 
Непрочитано 27.12.2007, 16:52
#19
Кулик Алексей aka kpblc
Moderator

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


Внести данные в Access особо не сложно. Вопрос в отображении и опять же - поиске. Вот тут (ИМХО) головняк.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 27.12.2007, 17:59
#20
VVA

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


Сразу не отвечал, оформлял ввиде библиотечных функций [DwgRuLispLib: Функции чтения и установки свойств рисунка (_dwgprops)] Как предложение - в обрабатываемом документе в прочих свойствах (команда _dwgprops) проверять наличине свойства с заданным именем (например "DWGRU_FILE_HANDLE"). Значение по этому ключу - гарантированно уникальное значение строки, которое в mdb может выступать как ключ поиска. Если такового нет - создавать
Функцией _get_uniq_string генерируется строка "DWGRU-20071227-16450528-58" , которая расшифровывается так
"DWGRU" - сигнатура (у каждого пользоватеоя может быть своя)
20071227 - 2007 г. 12 месяца 27 дня
16450528 - 16 часов 45 минут 05.28 секунды
58 - случайное число
Команда TEST записывает в свойства рисунка в прочие в поле DWGRU_FILE_HANDLE некое значение.
Вложения
Тип файла: lsp block2mdb.LSP (6.1 Кб, 217 просмотров)
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Нужна функция импорта блока из файла

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
структурированный список Holon Программирование 22 11.09.2007 14:09
Нужна помощь в открытии компасовского файла. PAKOB Разное 4 19.04.2007 19:49
Нужна программа для раскадровки видео файла в gif анимацию pyatifan Разное 19 14.02.2007 08:10
Нужна помощь по созданию файла шрифта fynjy AutoCAD 5 17.10.2006 12:47