Как получить список листов чертежа и имена принтеров для каждого листа?

Автор Тема: Как получить список листов чертежа и имена принтеров для каждого листа?  (Прочитано 28832 раз)

0 Пользователей и 5 Гостей просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Добрый день, коллеги!

Увы, с Lisp-ом я на «Вы».

У меня вопрос: как получить список имен листов чертежа и имена принтеров, настроенных каждому листу, а затем вывести эту информацию в файл?
Или подскажите где поискать?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
Ну, перечень листов, насколько я помню (сейчас отвечаю с телефона), можно получить через функцию (layouts). В крайнем случае - vla-get-layouts. Совсем в крайнем случае - получить коллекцию блоков документа, и отфильтровать те, которые не являются Layout.
А потом надо просто проверять свойства объектов, мне кажется. Если вечером еще буду живой, и при этом не забуду, попробую посмотреть подробнее.
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Именно на лиспе???

К сожалению. Я пока не имею представления, как это сделать иначе. Может я что-то пропустил?!

Если вечером еще буду живой, и при этом не забуду, попробую посмотреть подробнее.

Буду очень Вам благодарен.



Заранее озвучу для чего нам это надо. Требуется данный скрипт прогонять через AcCoreConsole.exe и выуживать информацию о листах чертежей. Это требуется для дальнейшей обработки через PDM Lotsia. Не уверен, что кому-то стало легче от моего описания, но всё же.

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Нашёл материал о том, что в AcCoreConsole.exe можно скармливать свой модуль через команду _NETLOAD, но бегло пробежавшись по AcCoreMdg.dll не увидел возможность считывать информацию о листах. Буду искать дальше.

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
Поскольку планируется запускать консольный вариант, мои ответы точно не подойдут: они ориентированы на использование ActiveX, а он в консоли не работает. ObjectDBX можно использовать?
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
ObjectDBX можно использовать?

Не знаю. Если есть решение в данном направлении, то я готов и его рассмотреть.

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
Ну, готового нет. Но его можно сделать ;)
Как вариант, особо не гонял:
Код - Auto/Visual Lisp [Выбрать]
  1. (vl-load-com)
  2.  
  3. ;; (GET-ALL-PLOTCONFIGS "D:\\Ошибки и заявки")
  4.  
  5. (defun _kpblc-odbx (/)
  6.   (cond ((< (atof (getvar "acadver")) 15.06)
  7.          (alert "ObjectDBX method not applicable\nin this AutoCAD version")
  8.          nil
  9.          )
  10.         ((= (fix (atof (getvar "acadver"))) 15)
  11.          (if (not (vl-registry-read "HKEY_CLASSES_ROOT\\ObjectDBX.AxDbDocument\\CLSID"))
  12.            (startapp "regsvr32.exe" (strcat "/s \"" (findfile "axdb15.dll") "\""))
  13.            ) ;_ end of if
  14.          (vla-getinterfaceobject (vlax-get-acad-object) "ObjectDBX.AxDbDocument")
  15.          )
  16.         (t
  17.          (vla-getinterfaceobject
  18.            (vlax-get-acad-object)
  19.            (strcat "ObjectDBX.AxDbDocument." (itoa (atoi (getvar "acadver"))))
  20.            ) ;_ end of vla-getinterfaceobject
  21.          )
  22.         ) ;_ end of cond
  23.   ) ;_ end of defun
  24. (defun _kpblc-odbx-open (file odbx / res obj tmp_file)
  25.                         ;|
  26. *    Открытие любого файла, даже в режиме "ReadOnly"
  27. *    Параметры вызова:
  28.   file  полное имя открываемого файла. Только строка, контроля не
  29.     выполняется
  30.   odbx  ObjectDBX-интерфейс, созданный (_kpblc-odbx).
  31. *    Возвращает список вида:
  32.   '(("obj" . <vla-указатель на гарантированно открытый документ>)
  33.     ("close" . t | nil)  ; допускается ли закрытие файла
  34.     ("save" . t | nil)  ; допускается ли сохранение файла
  35.     ("write" . t | nil)  ; допускается ли запись в файл
  36.     ("name" . <строка имени файла>))
  37. *    Пример вызова:
  38. (_kpblc-odbx-open "c:\\file.dwg" (setq conn (_kpblc-odbx)))
  39. |;
  40.   (cond ((not file)
  41.          (setq res (list (cons "obj" (vla-get-activedocument (vlax-get-acad-object)))
  42.                          (cons "write" t)
  43.                          (cons "name" (vla-get-fullname (vla-get-activedocument (vlax-get-acad-object))))
  44.                          ) ;_ end of list
  45.                ) ;_ end of setq
  46.          )
  47.         ((member (strcase file)
  48.                  (mapcar (function (lambda (x) (strcase (vla-get-fullname x))))
  49.                          (_kpblc-conv-vla-to-list (vla-get-documents (vlax-get-acad-object)))
  50.                          ) ;_ end of mapcar
  51.                  ) ;_ end of member
  52.          (setq res (list (cons "obj"
  53.                                (car (vl-remove-if-not
  54.                                       '(lambda (x) (= (strcase (vla-get-fullname x)) (strcase file)))
  55.                                       (_kpblc-conv-vla-to-list (vla-get-documents (vlax-get-acad-object)))
  56.                                       ) ;_ end of vl-remove-if-not
  57.                                     ) ;_ end of car
  58.                                ) ;_ end of cons
  59.                          (cons "write" t)
  60.                          (cons "save" t)
  61.                          (cons "name" file)
  62.                          ) ;_ end of list
  63.                ) ;_ end of setq
  64.          )
  65.         ((and (findfile file) (_kpblc-is-file-read-only file))
  66.          (vl-file-copy
  67.            file
  68.            (setq tmp_file (strcat (vl-filename-mktemp (strcat (vl-filename-base file) (vl-filename-extension file)))))
  69.            ) ;_ end of vl-file-copy
  70.          (vla-open odbx tmp_file)
  71.          (setq res (list (cons "obj" odbx) (cons "close" t) (cons "save" nil) (cons "write" nil) (cons "name" file)))
  72.          )
  73.         ((and (findfile file) (not (_kpblc-is-file-read-only file)))
  74.          (vla-open odbx file)
  75.          (setq res (list (cons "obj" odbx) (cons "close" t) (cons "save" t) (cons "write" t) (cons "name" file)))
  76.          )
  77.         ) ;_ end of cond
  78.   res
  79.   ) ;_ end of defun
  80. (defun _kpblc-odbx-close (conn)
  81.                          ;|
  82. *    Закрытие файла, открытого ранее через _kpblc-odbx-*. С попыткой сохранения
  83. *    Параметры вызова:
  84.   conn  соединение с ObjectDBX, созданное ранее через (_kpblc-odbx) либо список:
  85.     '(("conn" . <ObjectDBXConnection>)  ; то же самое
  86.       ("save" . t)      ; сохранять или нет изменения
  87.       ("file" . "c:\\temp\\tmp.dwg")  ; имя, под которым сохранять. nil -> использовать текущее
  88.       )
  89. |;
  90.   (if (and (= (type conn) 'list) (cdr (assoc "save" conn)))
  91.     (progn (vlax-invoke
  92.              (cond ((cdr (assoc "conn" conn)))
  93.                    (t (cdr (assoc "obj" conn)))
  94.                    ) ;_ end of cond
  95.              'saveas
  96.              (cond ((cdr (assoc "file" conn))
  97.                     (strcat (_kpblc-dir-path-and-splash
  98.                               (vl-filename-directory
  99.                                 (cond ((cdr (assoc "file" conn)))
  100.                                       ((cdr (assoc "name" conn)))
  101.                                       ) ;_ end of cond
  102.                                 ) ;_ end of vl-filename-directory
  103.                               ) ;_ end of _kpblc-dir-path-and-splash
  104.                             (vl-filename-base
  105.                               (cond ((cdr (assoc "file" conn)))
  106.                                     ((cdr (assoc "name" conn)))
  107.                                     ) ;_ end of cond
  108.                               ) ;_ end of vl-filename-base
  109.                             ".dwg"
  110.                             ) ;_ end of strcat
  111.                     )
  112.                    (t
  113.                     (vla-get-name
  114.                       (cond ((cdr (assoc "conn" conn)))
  115.                             (t (cdr (assoc "obj" conn)))
  116.                             ) ;_ end of cond
  117.                       ) ;_ end of vla-get-name
  118.                     )
  119.                    ) ;_ end of cond
  120.              ) ;_ end of vlax-invoke
  121.            ) ;_ end of progn
  122.     ) ;_ end of if
  123.   (vl-catch-all-apply
  124.     '(lambda ()
  125.        (vlax-release-object
  126.          (if (= (type conn) 'list)
  127.            (cond ((cdr (assoc "conn" conn)))
  128.                  (t (cdr (assoc "obj" conn)))
  129.                  ) ;_ end of cond
  130.            conn
  131.            ) ;_ end of if
  132.          ) ;_ end of vlax-release-object
  133.        ) ;_ end of lambda
  134.     ) ;_ end of vl-catch-all-apply
  135.   (setq conn nil)
  136.   ) ;_ end of defun
  137. (defun _kpblc-conv-vla-to-list (value / res) ;|
  138. *    Преобразовывает vlax-variant или vlax-safearray в список.
  139. |;
  140.   (cond ((listp value) (mapcar (function _kpblc-conv-vla-to-list) value))
  141.         ((= (type value) 'variant) (_kpblc-conv-vla-to-list (vlax-variant-value value)))
  142.         ((= (type value) 'safearray)
  143.          (if (>= (vlax-safearray-get-u-bound value 1) 0)
  144.            (_kpblc-conv-vla-to-list (vlax-safearray->list value))
  145.            ) ;_ end of if
  146.          )
  147.         ((and (= (type value) 'vla-object) (vlax-property-available-p value 'count))
  148.          (vlax-for sub value (setq res (cons sub res)))
  149.          )
  150.         (t value)
  151.         ) ;_ end of cond
  152.   ) ;_ end of defun
  153. (defun _kpblc-is-file-read-only (file-name / file_hangle res)
  154.                                 ;|
  155. *    Проверяет, является ли файл "read-only". Возвращает t, если да. Проверки
  156. * наличия файла не выполняется.
  157. *    Параметры вызова:
  158. *  file-name  полное имя файла, с путем.
  159. (_kpblc-is-file-read-only "Z:\\КТО transit\\Разное\\Устройство молниезащиты.dwg")
  160. |;
  161.   (and file-name
  162.        (findfile file-name)
  163.        (or (not (vl-file-systime file-name))
  164.            ((lambda (/ svr obj res)
  165.               (setq svr (vlax-get-or-create-object "Scripting.FileSystemObject")
  166.                     obj (vlax-invoke-method svr 'getfile file-name)
  167.                     res (vlax-get-property obj 'attributes)
  168.                     ) ;_ end of setq
  169.               (vlax-release-object obj)
  170.               (vlax-release-object svr)
  171.               (setq obj nil
  172.                     svr nil
  173.                     ) ;_ end of setq
  174.               (/= (* 2 (/ res 2)) res)
  175.               ) ;_ end of lambda
  176.             )
  177.            ) ;_ end of or
  178.        ) ;_ end of and
  179.   ) ;_ end of defun
  180. (defun _kpblc-dir-path-and-splash (path)
  181.                                   ;|
  182. *    Возвращает путь со слешем в конце
  183. *    Параметры вызова:
  184. *  path  - обрабатываемый путь
  185. *    Примеры вызова:
  186. (_kpblc-dir-path-and-splash "c:\\kpblc-cad")  ; "c:\\kpblc-cad\\"
  187. |;
  188.   (strcat (vl-string-right-trim "\\" path) "\\")
  189.   ) ;_ end of defun
  190. (defun _kpblc-browsefiles-in-directory-nested (path mask)
  191.                                               ;|
  192. *    Функция возвращает список файлов указанной маски, находящихся в
  193. * заданном каталоге
  194. *    Параметры вызова:
  195.   path  путь к корневому каталогу. nil недопустим
  196.   mask  маска имени файла. nil или список недопустим
  197. *    Примеры вызова:
  198. (fun_browsefiles-in-directory-nested "c:\\documents" "*.dwg")
  199. |;
  200.   (apply (function append)
  201.          (cons (if (vl-directory-files path mask 1)
  202.                  (mapcar (function (lambda (x) (strcat (vl-string-right-trim "\\" path) "\\" x)))
  203.                          (vl-directory-files path mask 1)
  204.                          ) ;_ end of mapcar
  205.                  ) ;_ end of if
  206.                (mapcar (function
  207.                          (lambda (x)
  208.                            (_kpblc-browsefiles-in-directory-nested (strcat (vl-string-right-trim "\\" path) "\\" x) mask)
  209.                            ) ;_ end of lambda
  210.                          ) ;_ end of function
  211.                        (vl-remove ".." (vl-remove "." (vl-directory-files path nil -1)))
  212.                        ) ;_ end of mapcar
  213.                ) ;_ end of cons
  214.          ) ;_ end of apply
  215.   ) ;_ end of defun
  216.  
  217. ;;;
  218. (defun get-all-plotconfigs (path / file_lst odbx res)
  219.   (if (setq file_lst (_kpblc-browsefiles-in-directory-nested path "*.dwg"))
  220.     (progn (setq odbx (_kpblc-odbx)
  221.                  res  (mapcar (function (lambda (file / conn _lst)
  222.                                           (setq conn (_kpblc-odbx-open file odbx)
  223.                                                 _lst (mapcar (function (lambda (lay)
  224.                                                                          (vl-remove nil
  225.                                                                                     (mapcar (function (lambda (pr / tmp)
  226.                                                                                                         (if (vlax-property-available-p lay pr)
  227.                                                                                                           (cons (strcase pr t) (vlax-get-property lay pr))
  228.                                                                                                           ) ;_ end of if
  229.                                                                                                         ) ;_ end of lambda
  230.                                                                                                       ) ;_ end of function
  231.                                                                                             '("configname" "CanonicalMediaName" "Name")
  232.                                                                                             ) ;_ end of mapcar
  233.                                                                                     ) ;_ end of vl-remove
  234.                                                                          ) ;_ end of lambda
  235.                                                                        ) ;_ end of function
  236.                                                              (vl-sort (_kpblc-conv-vla-to-list (vla-get-layouts (cdr (assoc "obj" conn))))
  237.                                                                       (function (lambda (a b) (< (vla-get-taborder a) (vla-get-taborder b))))
  238.                                                                       ) ;_ end of vl-sort
  239.                                                              ) ;_ end of mapcar
  240.                                                 ) ;_ end of setq
  241.                                           ;; (_kpblc-odbx-close (cdr (assoc "obj" conn)))
  242.                                           (cons file _lst)
  243.                                           ) ;_ end of lambda
  244.                                         ) ;_ end of function
  245.                               file_lst
  246.                               ) ;_ end of mapcar
  247.                  ) ;_ end of setq
  248.            (_kpblc-odbx-close odbx)
  249.            res
  250.            ) ;_ end of progn
  251.     ) ;_ end of if
  252.   ) ;_ end of defun
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Нашёл материал о том, что в AcCoreConsole.exe можно скармливать свой модуль через команду _NETLOAD, но бегло пробежавшись по AcCoreMdg.dll не увидел возможность считывать информацию о листах. Буду искать дальше.
Вообще-то эта информация в AcDbMgd.dll
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
Вообще-то эта информация в AcDbMgd.dll

Я не спорю. Однако я взял за основу статью http://through-the-interface.typepad.com/through_the_interface/2012/02/the-autocad-2013-core-console.html, в которой не упоминалась эта библиотека.
Изначально, когда я попробовал создать свой модуль, с подключением Autodesk.AutoCAD.ApplicationServices.Application, то получил фатальную ошибку при попытке скормить её в AcCoreConsole.exe, поэтому даже не стал пытаться дальше это делать, я просто стал смотреть примеры в интернете, но не увидел ничего другого, кроме:

Код - vb.net [Выбрать]
  1. Dim AcApp As DocumentCollection = Autodesk.AutoCAD.ApplicationServices.Core.Application.DocumentManager

Вот и подумал, что в данном случае другого варианта у меня нет. После этого обратился за помощью на форум.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
У меня на чистом Autolisp получилось так:
Код - Auto/Visual Lisp [Выбрать]
  1. (defun C:LIST_LAYOUTS ( / lays e LyaoutName PrinterName FormatName)
  2.   (setq lays (cdr (assoc -1  (dictsearch (namedobjdict) "ACAD_LAYOUT"))))
  3.   (setq e (reverse (dictnext lays T)))
  4.   (while e
  5.      (setq LayoutName (cdr (assoc 1 e)))
  6.      (princ (strcat "\nLayout = " LayoutName))
  7.      (setq PrinterName (cdr (assoc 2 e)))
  8.      (if (/= PrinterName nil)
  9.        (princ (strcat "\nPrinter = " PrinterName))
  10.      )
  11.      (setq FormatName (cdr (assoc 4 e)))
  12.      (if (/= FormatName nil)
  13.        (princ (strcat "\nFormat = " FormatName))
  14.      )
  15.      (setq e (reverse (dictnext lays nil)))    
  16.   )
  17.   (princ)
  18. )

Command: LIST_LAYOUTS

Layout = Layout1
Printer = HP LaserJet P2015 Series PCL 6
Format = A4
Layout = Layout2
Printer = Autodesk DWF Writer for 2D
Format = User119
Layout = Model
Printer = none_device
Format = ISO_A4_(210.00_x_297.00_MM)
« Последнее редактирование: 21-03-2017, 15:04:43 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Пашин ЕвгенийАвтор темы

  • ADN PRO
  • *
  • Сообщений: 662
  • Карма: 12
  • Skype: pashin.evgeniy
У меня на чистом Autolisp получилось так:

В самом AutoCAD срабатывает идеально! А вот консоль пишет что не знает команду LIST_LAYOUTS. Может её нужно запускать как-то иначе?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Ну как минимум нужно загрузить lisp-файл, причем из доверенного каталога (или SECURELOAD установить в 0).
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Под руками у меня сейчас только 2013 версия. Исходник я сохранил в файл C:/l1.lsp. Проверяю на чертеже C:/l1.dwg
Вот результат:



Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение