Пакетная печать блоков-форматов в PDF на LISP

Автор Тема: Пакетная печать блоков-форматов в PDF на LISP  (Прочитано 74374 раз)

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

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

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

Оффлайн Андрей1986Автор темы

  • ADN OPEN
  • **
  • Сообщений: 69
  • Карма: 1
после того, как я выбираю блок, должна сразу идти печать в ПДФ?

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

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

Оффлайн Андрей1986Автор темы

  • ADN OPEN
  • **
  • Сообщений: 69
  • Карма: 1
Легко ВАМ- РЫЦАРЯМ, так рассуждать.
Поделитесь тогда, куда таким идти?

После того, как выбрал, пишет найдено: 1. и ничего не происходит.
нажимаю Enter. nil

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

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
Попробовал по-быстрому расписать построчно, что и как происходит в коде
Код - Auto/Visual Lisp [Выбрать]
  1. (vl-load-com)
  2. ;; Глобальная переменная - текущий документ
  3. (setq *adoc* (vla-get-activedocument (vlax-get-acad-object)))
  4.  
  5. (defun c:poly-by-blocks (/ selset ins)
  6.   ;; Если был выполнен выбор блоков
  7.   (if (= (type (setq selset (vl-catch-all-apply (function (lambda () (ssget '((0 . "INSERT"))))))))
  8.          'pikset
  9.          ) ;_ end of =
  10.     (progn
  11.       ;; то по каждому элементу набора
  12.       (foreach ent (mapcar 'vlax-ename->vla-object (vl-remove-if 'listp (mapcar 'cadr (ssnamex selset))))
  13.         ;; Если эффективное имя блока А1 ("А" может быть как русской, так и английской,
  14.         ;; от регистра не зависит
  15.         (if (wcmatch (strcase (vla-get-effectivename ent)) "A1,А1")
  16.           (progn
  17.             ;; Вычислить точку вставки блока
  18.             (setq ins (vlax-safearray->list (vlax-variant-value (vla-get-insertionpoint ent))))
  19.             ;; Вызвать функцию poly-plot. Параметры вызова функции см. в описании функции
  20.                  (poly-plot "c:\\Users\\evthi\\Desktop\\Тест"
  21.                             (mapcar (function (lambda (x) (mapcar '+ ins x))) '((0. 0. 0.) (841. 594. 0.)))
  22.                             ) ;_ end of poly-plot
  23.                  ) ;_ end of progn
  24.           ) ;_ end of if
  25.         ) ;_ end of foreach
  26.       ) ;_ end of progn
  27.     ) ;_ end of if
  28.   ;; Обеспечиваем "тихий" выход команды
  29.   (princ)
  30.   ) ;_ end of defun
  31.  
  32. (defun poly-plot (filename pt-lst / layout)
  33.   ;|
  34. *    Функция вывода в файл прямоугольной области
  35. *    Параметры вызова:
  36.   filename    имя файла, в который выводится результат.
  37.               Каталог, в котором будет располагаться файл, должен уже существовать
  38.   pt-lst      список трехмерных точек, который описывает левый нижний и правый верхний углы выводимой
  39.               области
  40. |;
  41.   ;; Получаем активный лист текущего документа
  42.   (setq layout (vla-get-activelayout *adoc*))
  43.   ;; Обновляем доступные устройства печати
  44.   (vla-refreshplotdeviceinfo layout)
  45.   ;; Устанавливаем для текущего листа плоттер.
  46.   (vla-put-configname layout "DWG to PDF.pc3")
  47.   ;; Устанавливаем для текущего листа размер листа. Наличие такой настройки в плоттере не проверяется
  48.   (vla-put-canonicalmedianame layout "ISO_full_bleed_A1_(594.00_x_841.00_MM)")
  49.   ;; Устанавливаем, что печатать будем с центрированием
  50.   (vla-put-centerplot layout :vlax-true)
  51.   ;; Устанавливаем угол поворота печати
  52.   (vla-put-plotrotation layout ac90degrees)
  53.   ;; Устанавливаем автомасштабирование печати
  54.   (vla-put-standardscale layout acscaletofit)
  55.   ;; Устанавливаем таблицу печати. Если используется стилезависимая печать,
  56.   ;; то необходимо либо изменить расширение файла, либо выполнить команду _.convertpstyles
  57.   (vla-put-stylesheet layout "acad.ctb")
  58.   ;; Устанавливаем область печати
  59.   (vla-setwindowtoplot layout (car pt-lst) (last pt-lst))
  60.   ;; Устанавливаем, что печатать будем окно
  61.   (vla-put-plottype layout acwindow)
  62.   ;; Выполняем регенереацию всех видовых эранов
  63.   (vla-regen *adoc* acallviewports)
  64.   ;; Собственно печать в файл
  65.   (vla-plottofile (vla-get-plot *adoc*) filename)
  66.   ) ;_ end of defun
  67.  
Все, что сказано - личное мнение.

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

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

Оффлайн Андрей1986Автор темы

  • ADN OPEN
  • **
  • Сообщений: 69
  • Карма: 1
А вы у себя на автокаде пробовали этот код?
Все работает?

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

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
Не успеваю. Работы пока многовато. У предыдущих участников вроде бы работало - иначе бы сразу сказали.

Если появится сегодня время - попробую протестировать
Все, что сказано - личное мнение.

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

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

Оффлайн Андрей1986Автор темы

  • ADN OPEN
  • **
  • Сообщений: 69
  • Карма: 1
Спасибо

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
На всякий случай установите BACKGROUNDPLOT в 0: http://help.autodesk.com/view/ACD/2016/RUS/?guid=GUID-713029B7-B5AC-4860-BE2E-74878D418EA4
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
Если коротко, то в коде было допущено 2 ошибки:
1. опечатка - вместо pickset было вбито pikset
2. Ошибка в назначениях точек при выводе на печать.

Исправленный код (но уже без объяснений):
Код - Auto/Visual Lisp [Выбрать]
  1. (vl-load-com)
  2.  
  3. (setq *adoc* (vla-get-activedocument (vlax-get-acad-object)))
  4.  
  5. (defun c:poly-by-blocks (/ selset ins)
  6.   (if (= (type (setq selset (vl-catch-all-apply (function (lambda () (ssget '((0 . "INSERT"))))))))
  7.          'pickset
  8.          ) ;_ end of =
  9.     (progn
  10.       (foreach ent (mapcar 'vlax-ename->vla-object (vl-remove-if 'listp (mapcar 'cadr (ssnamex selset))))
  11.         (if (wcmatch (strcase (vla-get-effectivename ent)) "A1,À1")
  12.           (progn (setq ins (vlax-safearray->list (vlax-variant-value (vla-get-insertionpoint ent))))
  13.                  (poly-plot (getfiled "Where to plot" "" "pdf" 1)
  14.                             ;;"c:\\Users\\evthi\\Desktop\\Òåñò"
  15.                             (mapcar (function (lambda (x) (mapcar '+ ins x))) '((0. 0. 0.) (841. 594. 0.)))
  16.                             ) ;_ end of poly-plot
  17.                  ) ;_ end of progn
  18.           ) ;_ end of if
  19.         ) ;_ end of foreach
  20.       ) ;_ end of progn
  21.     ) ;_ end of if
  22.   ) ;_ end of defun
  23.  
  24. (defun poly-plot (filename pt-lst / layout)
  25.   (setq layout (vla-get-activelayout *adoc*)
  26.         pt-lst (mapcar (function (lambda (x) (list (car x) (cadr x)))) pt-lst)
  27.         ) ;_ end of setq
  28.   (vla-refreshplotdeviceinfo layout)
  29.   (vla-put-configname layout "DWG to PDF.pc3")
  30.   (vla-put-canonicalmedianame layout "ISO_full_bleed_A1_(594.00_x_841.00_MM)")
  31.   (vla-put-centerplot layout :vlax-true)
  32.   (vla-put-plotrotation layout ac90degrees)
  33.   (vla-put-standardscale layout acscaletofit)
  34.   (vla-put-stylesheet layout "acad.ctb")
  35.   (vla-setwindowtoplot
  36.     layout
  37.     (vlax-safearray-fill (vlax-make-safearray vlax-vbdouble '(0 . 1)) (car pt-lst))
  38.     (vlax-safearray-fill (vlax-make-safearray vlax-vbdouble '(0 . 1)) (last pt-lst))
  39.     ) ;_ end of vla-setwindowtoplot
  40.   (vla-put-plottype layout acwindow)
  41.   (vla-regen *adoc* acallviewports)
  42.   (vla-plottofile (vla-get-plot *adoc*) filename)
  43.   ) ;_ end of defun
  44.  
Все, что сказано - личное мнение.

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

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

Оффлайн Андрей1986Автор темы

  • ADN OPEN
  • **
  • Сообщений: 69
  • Карма: 1
Упс. У меня все равно проблемы.
Автокад пишет следующее:
Выполняется регенерация модели.
Команда:
<<  Принудительное завершение работы программы  >>
Error: Ошибка Automation. Отсутствует описание.

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

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
И в каком месте ошибка?
Все, что сказано - личное мнение.

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

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

Оффлайн Андрей1986Автор темы

  • ADN OPEN
  • **
  • Сообщений: 69
  • Карма: 1
Хмм. Если бы я знал, не донимал бы вас. А у вас работает?

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

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
У меня - да. Для понимания / вычисления, что происходит не так, советую прочитать http://autolisp.ru/2009/09/10/vlide-misc-01/ и http://autolisp.ru/2009/09/12/vlide-misc-02/
Все, что сказано - личное мнение.

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

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

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
И в каком месте ошибка?
Похоже здесь:
Код - Auto/Visual Lisp [Выбрать]
  1. (vla-plottofile (vla-get-plot *adoc*) filename)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение