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

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

Программная печать из листа с учетом его параметров.

Ответ
Поиск в этой теме
Непрочитано 05.08.2008, 17:49 #1
Программная печать из листа с учетом его параметров.
TheBuTeK
 
преподавание
 
Москваград
Регистрация: 28.09.2005
Сообщений: 131

Вопрос заключается в следующем: есть чертеж, содержащий тучу листов разных форматов, заточенных под разные принтеры. И есть программа, выводящая на печать задаваемую область (писалась под пространство модели). Теперь пытаемся научить эту программу печатать из листа так, чтобы она получала из параметров листа имя принтера и формат листа.
А возможно ли это вообще в принципе?
Текст программы могу привести, просто пока дело не в нем.
__________________
Добрым словом и пистолетом можно добиться гораздо большего, чем одним добрым словом.
Просмотров: 8480
 
Непрочитано 05.08.2008, 18:55
#2
Sleekka

-
 
Регистрация: 24.07.2005
Москва
Сообщений: 1,335


А велосипед-то уже давно изобретен. называется _publish
Sleekka вне форума  
 
Непрочитано 06.08.2008, 07:45
#3
Kostinok

Инженер-электрик
 
Регистрация: 13.10.2007
Калининград
Сообщений: 151


А есть ли такая программа печати из модели.
Которая, для примера, сначала просит задать рамкой(или выбрать рамку) областИ печати (сразу несколько) одного формата, а потом их печатает, все сразу.
Т.е. пропускает принудительный выбор каждого листа рамкой Window из окна Plot - Model
__________________
Можно сопротивляться вторжению армий, вторжению идей сопротивляться невозможно. /В. Гюго/
Kostinok вне форума  
 
Непрочитано 06.08.2008, 08:20
#4
Кулик Алексей aka kpblc
Moderator

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


На caduser.ru в разделе "Готовые программы" вроде была аналогичная...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 06.08.2008, 10:48
#5
TheBuTeK

преподавание
 
Регистрация: 28.09.2005
Москваград
Сообщений: 131
<phrase 1=


Посмотрел тему http://www.caduser.ru/cgi-bin/f1/board.cgi?t=39260DH, по-моему, не совсем то, что надо.

Тогда показываю то, что есть. Есть чертеж с толпой слоев и листов, некоторые из которых отключены. Слои показывают маршруты и если их включить все, то на чертеже не понятно будет ничего. Часто требуется распечатать весь чертеж с каждым включенным по отдельности слоем маршрута.
При этом все эти маршруты надо распечатать на едином формате, а он, в зависимости от величины проекта может быть и А0 и А4.
То есть надо включить один отключенный слой, распечатать чертеж, отключить слой; включить следующий. распечатать чертеж и так до победного конца.
Пока наработка выглядит так:

Код:
[Выделить все]
(defun check-space()
  (setq	acapp	(vlax-get-acad-object)
	adoc	(vla-get-activedocument acapp))
(if (= acModelSpace  (vla-get-activespace adoc))
  (progn
  (alert "Для выполнения программы нужно\nперейти в пространство листа")
  (exit)
  )
  )
  (princ)
  )

;;==========================================================;;

(defun plot-settings()
  
  (setq	acapp	(vlax-get-acad-object)
	adoc	(vla-get-activedocument acapp)
	layouts	(vla-get-layouts adoc)
	plotobj	(vla-get-plot adoc))
       (setq laytlist (layoutlist))
  	 (vla-setlayoutstoplot
	   plotobj
	   (vlax-make-variant
	     (vlax-safearray-fill
	       (vlax-make-safearray
		 vlax-vbstring
		 (cons 0 (1- (length laytlist))))
	       laytlist)))
	 (vla-startbatchmode
	   plotobj
	   (length
	     laytlist))
	 (vla-put-numberofcopies plotobj 1)
  );end of

  ;;==========================================================;;

   (defun single-plot (adoc plotobj layout laytlist blkobj cnt / maxpt minpt)

    (vla-getboundingbox blkobj 'minpt 'maxpt)

    (setq minpt (vlax-safearray->list minpt)
	  maxpt (vlax-safearray->list maxpt)
	  )
    (setq p1 (two-element-array minpt)
	   p2 (two-element-array maxpt)
	   )
    (if (< (abs (- (cadr maxpt)(cadr minpt)))
	   (abs (- (car maxpt)(car minpt))))
    (vla-put-plotrotation layout ac90degrees )
    (vla-put-plotrotation layout ac0degrees )
      )
   
    ;;;
(setq x1 (nth 0 minpt)
   y1 (nth 1 minpt)
   x2 (nth 0 maxpt)
   y2 (nth 1 maxpt)
   minpt (list (min x1 x2) (min y1 y2))
   maxpt (list (max x1 x2) (max y1 y2))
   x1 (nth 0 minpt)
   y1 (nth 1 minpt)
   x2 (nth 0 maxpt)
   y2 (nth 1 maxpt)
   );_setq if
(if (> (distance minpt maxpt) 297)
  (progn
  (setq  format "A4"
            printer (vla-get-ConfigName (vla-get-activelayout adoc))
            style "monochrome.ctb")
         )
(progn
  (setq format "A3"
            printer (vla-get-ConfigName (vla-get-activelayout adoc))
            style "acad.ctb"
         )
  )
  )

(if    (> (min (- x2 x1) (- y2 y1)) 850)
   (alert "Опс! Нету у нас такой техники чтоб такие простыни 
напечатать... Может с масшатабом намудрили?")
)
;;;
(setq styles
(vlax-safearray->list
  (vlax-variant-value (vla-GetPlotStyleTableNames layout)))
      )
     (if (member style styles)
     (vla-put-stylesheet layout style)
       (vla-put-stylesheet layout "monochrome.ctb")
       )
;;;    (vla-put-configname layout printer)
    (vla-put-configname layout "HP DeskJet 1220C")
;;;    (vla-put-centerplot layout :vlax-true)
    (vla-put-plotviewportborders layout :vlax-true)
    (vla-put-paperunits layout acmillimeters)
    (vla-put-standardscale layout acscaletofit)
    
    (vla-setwindowtoplot layout
      p1
      p2
      )
;;;    (vla-put-plottype layout acwindow)   
    
    (vla-regen adoc acactiveviewport)
    ;(vla-plottofile plotobj (strcat (getvar "dwgprefix")(getvar "dwgname") "Next" (itoa cnt) ".pdf"))
     (vla-plottodevice plotobj)
     
    (princ)
  );end of

  ;;==========================================================;;

		      
(defun change-attrib (blk tag val / )
  
  (if (eq :vlax-true (vla-get-hasattributes blk))
    (progn
      (foreach at (vlax-invoke blk 'Getattributes)
        (if (eq (strcase (vla-get-tagstring at)) (strcase tag))
          (vl-catch-all-apply
            (function (lambda()
               (vla-put-textstring at val))))
        ) 
      ) 
    ) 
  ) 
)

  ;;==========================================================;;

  ;;error wrapper for lisp expressions
 (defun	error-control  (func msg / ret)
  ;; by fixo © 2008 * all rights reserved
   (defun my-catch  (a)
     (vl-catch-all-apply (function (lambda () a))))
   (if (vl-catch-all-error-p (setq ret (my-catch func)))
     (print (vl-catch-all-error-message ret))
     (print msg))
   ret
   )
  ;;==========================================================;;

(defun two-element-array (point)
  (vlax-safearray-fill
    (vlax-make-safearray vlax-vbdouble '(0 . 1))
    (list (car point)(cadr point)))
  )

  ;;==========================================================;;

(defun get-layers-isoff (/ lst)
(vlax-for item (vla-get-layers
                   (vla-get-activedocument 
                       (vlax-get-acad-object))
                   ) 
    (if (= (vla-get-layeron item) :vlax-false)
      (setq lst (cons item lst))
      )
    )
  lst
)

(defun get-stamp (layout / ss)
    (setq ss (ssget "_X"
		  (list (cons 0 "INSERT")
			(cons 2 "Format*,A#*,Double*")
			(cons 410 layout)
			)))
     (vlax-ename->vla-object (ssname ss 0))
  )

;;==========================================================;;

(defun C:PTF(/);layout plot
(check-space)
(alert "======== Внимание =======  \n\tЗакройте чертеж\n\tбез сохранения")  
(plot-settings)
  
  (if (setq lyrlist (get-layers-isoff))
    (progn

	(setq layout (vla-get-activelayout adoc))
        (setq blkobj (get-stamp (vla-get-name layout)))
        (setq i 0)
        (repeat (length lyrlist)
	(setq lyr (nth i lyrlist))
	(vla-put-layeron lyr :vlax-true)
	(change-attrib blkobj "ОПИСАНИЕ_ЛИСТА2" (vla-get-name lyr))	
        (vla-put-layeron lyr :vlax-false)
        (single-plot adoc plotobj layout laytlist blkobj (1+ i))
	)
    )
  )
;;;  (end-process)
  (princ)
  )

  ;;==========================================================;;
  (vl-load-com)
  ;;==========================================================;;
(prompt "\n=======================================================\n")
(prompt "\n\t\t***\tВ командной строке введите: PTF\t***")
(prompt "\n=======================================================\n")
(prin1)
(vl-load-com)
;============================================;

;|**************************|;
;|*     End of PTF.LSP     *|;
;|**************************|;


Пока непонятно, как вытащить из конфигурации листа имя плоттера, формат и поля листа, поэтому в качестве заглушки использован "HP DeskJet 1220C".
__________________
Добрым словом и пистолетом можно добиться гораздо большего, чем одним добрым словом.
TheBuTeK вне форума  
 
Автор темы   Непрочитано 06.08.2008, 10:51
#6
TheBuTeK

преподавание
 
Регистрация: 28.09.2005
Москваград
Сообщений: 131
<phrase 1=


То есть проблема в функции single-plot, как раз ее хочется научить распознавать плоттер и формат.
Это вообще достижимо?
__________________
Добрым словом и пистолетом можно добиться гораздо большего, чем одним добрым словом.
TheBuTeK вне форума  
 
Непрочитано 06.08.2008, 11:32
#7
Sleekka

-
 
Регистрация: 24.07.2005
Москва
Сообщений: 1,335


непосредственно по вопросу помочь не могу, могу лишь высказать собственное мнение
ИМХО проще программно создать кучу лайоутов и viewortov и заморозить в них ненужные слои. и назначить стиль печати, я бы так делал. хотя вам виднее.
Sleekka вне форума  
 
Автор темы   Непрочитано 06.08.2008, 11:49
#8
TheBuTeK

преподавание
 
Регистрация: 28.09.2005
Москваград
Сообщений: 131
<phrase 1=


А чем проще-то?
Все равно для создаваемых листов параметры задавать надо те же, что и для исходного.
Тут еще в листе есть блок штампа и в него надо впечатать имя распечатаемого слоя.
__________________
Добрым словом и пистолетом можно добиться гораздо большего, чем одним добрым словом.
TheBuTeK вне форума  
 
Непрочитано 06.08.2008, 13:07
#9
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


Для книги "САПР на базе...", Глава 30, была написана программа распечатки массива листов, многие вопросы там как раз были рассмотрены и решены. В книге приводится и исходники. Они правда для 2004-го, но по крайней мере часть должна работать и в более поздних версиях.
Alaspher вне форума  
 
Непрочитано 06.08.2008, 15:06
#10
Sleekka

-
 
Регистрация: 24.07.2005
Москва
Сообщений: 1,335


В этой же книге написано, что программной печатью лучше не связываться, а пользоваться наборами настроек для листов.
Sleekka вне форума  
 
Непрочитано 06.08.2008, 19:22
#11
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381


В "той книге" в главе 30 показано, как распечатать большой чертеж, например пространство модели, на много маленьких листочков, для последующей склейки. Доволно частая задача, даже если "листочки" формата А0 (у некоторых и А4). Такого штатного решения в AutoCAD (в отличие от других систем) нет. Там же и показано решение вопросов, возникающих у автора ветки. Как получить список плоттеров - точно есть. А как выбирать из списка нужный - надо решать в программе. Можно и визуально из списка (как в книге), а можно из записать в какой-нибудь INI-файл или передавать аргументом в функцию.

А про штатные средства печати вкладок - правда. Там всё есть и не все настройки можно или удобно сделать программно. Но почему-то многие в упор не видят, что сделано в AutoCAD, и никак не хотят придерживаться его концепции - один печатный лист - одна вкладка.
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 07.08.2008, 10:26
#12
TheBuTeK

преподавание
 
Регистрация: 28.09.2005
Москваград
Сообщений: 131
<phrase 1=


Попробую пояснить, чего я хочу добиться, на живом примере.
Вот схема с маршрутами (они на отключенных слоях 01M_Pivo_F...17Mm_Tank). И форматы листов A0...A4. Допустим, мне хочется распечатать все маршруты этой схемы на формате A3. Я включаю слой с одним маршрутом, распечатываю лист, а потом снова выключаю слой, включаю следующий и делаю это 17 раз.
Не создавать же мне ради каждого маршрута отдельный лист?
Может, есть решения проще?
Вложения
Тип файла: dwg
DWG 2004
TECT.dwg (343.2 Кб, 1042 просмотров)
__________________
Добрым словом и пистолетом можно добиться гораздо большего, чем одним добрым словом.
TheBuTeK вне форума  
 
Непрочитано 07.08.2008, 13:05
#13
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от TheBuTeK Посмотреть сообщение
<...>
Не создавать же мне ради каждого маршрута отдельный лист?<...>
А почему нет?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 07.08.2008, 13:49
#14
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,381


Вот именно, что надо создавать для каждого "маршрута" отдельную вкладку. Это классический случай - по одной модели получить 17 чертежей на бумаге. Каждый лист еще и оформлением ведь будет отличаться? В штампе чем-то?

Значит надо сделать один лист, нарисовать на нем максимальное количество общих оформительских элементов, параметры печати, потом скопировать 1 раз, на каждой вкладке изменить атрибутику, установить видимость нужных слоев.

Но зато потом уже навсегда имеются 17 чертежей. И распечатать их можно вообще нажатием одной кнопки. А начальству можно пожаловаться, что чертил 17 раз
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 07.08.2008, 14:38
#15
TheBuTeK

преподавание
 
Регистрация: 28.09.2005
Москваград
Сообщений: 131
<phrase 1=


Цитата:
Вот именно, что надо создавать для каждого "маршрута" отдельную вкладку. Это классический случай - по одной модели получить 17 чертежей на бумаге. Каждый лист еще и оформлением ведь будет отличаться? В штампе чем-то?
Отличаться он будет только двумя атрибутами в блоке штампа (номер листа и имя слоя, которое пишется в атрибут Описание_листа2) и именем самого листа, разумеется.
Но все равно ведь при копировании листа потребуется взять за образец существующий лист со всеми его настройками. Получается, что программно сделать копию листа проще, чем послать его на печать?
Да, массив листов потом вывести на печать ручками сиречь командой Publish. НО! Ведь если я включаю на каком-либо листе один из слоев, он ведь включится и на других, не так ли? Возможно ли программно для каждого такого листа сделать ОДИН из отключенных слоев видимым в видовом экране данного листа?
__________________
Добрым словом и пистолетом можно добиться гораздо большего, чем одним добрым словом.
TheBuTeK вне форума  
 
Непрочитано 07.08.2008, 14:48
#16
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


Цитата:
Сообщение от TheBuTeK Посмотреть сообщение
Ведь если я включаю на каком-либо листе один из слоев, он ведь включится и на других, не так ли?
Если слои заморожены в одном ВЭ, то в других ВЭ они будут видимыми (если не выключены или не заморожены) совсем.
Alaspher вне форума  
 
Автор темы   Непрочитано 07.08.2008, 15:17
#17
TheBuTeK

преподавание
 
Регистрация: 28.09.2005
Москваград
Сообщений: 131
<phrase 1=


Само собой.
Вопрос в том, можно ли программно указать на каждом листе ВЭ, в котором слой должен быть заморожен ?
__________________
Добрым словом и пистолетом можно добиться гораздо большего, чем одним добрым словом.
TheBuTeK вне форума  
 
Непрочитано 07.08.2008, 15:56
#18
Alaspher


 
Регистрация: 11.10.2004
e•burg
Сообщений: 755


Добраться можно, хоть и не так просто, как хотелось бы: DXF группа - 1003, в расширенных данных объекта - "VIEWPORT", приложения - "ACAD"
Alaspher вне форума  
 
Непрочитано 07.08.2008, 22:44
#19
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,992


Цитата:
Сообщение от TheBuTeK Посмотреть сообщение
Само собой.
Вопрос в том, можно ли программно указать на каждом листе ВЭ, в котором слой должен быть заморожен ?
Посмотри команду _vplayer
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 08.08.2008, 00:08
#20
fixo

Lisp/VBA/VB.NET Hobbyist
 
Регистрация: 24.03.2005
Славен Град Петров
Сообщений: 367


Цитата:
Сообщение от Alaspher Посмотреть сообщение
Добраться можно, хоть и не так просто, как хотелось бы: DXF группа - 1003, в расширенных данных объекта - "VIEWPORT", приложения - "ACAD"
Там нет групп с кодом 1003:

Код:
[Выделить все]
(defun _getxdata (/ com_data ss vp vpobj xcode xdata xlist xtp xvl)
(foreach lt (layoutlist)
(setq ss (ssget "_X" (list (cons 0 "VIEWPORT")(cons 410 lt))))
  (while 
  (setq vp (ssname ss 0))
  (setq vpobj (vlax-ename->vla-object vp))
  (vla-getxdata vpobj "ACAD" 'xtp 'xvl)
  (setq xcode (vlax-safearray->list xtp)
	  )
  (setq xlist
  (mapcar (function (lambda (a)(if (= (type a) 'SAFEARRAY)
				 (vlax-safearray->list a) a))
		    )
	  (mapcar (function (lambda(x)(vlax-variant-value x)))
		  (vlax-safearray->list xvl))
	  )
  )
  (setq xdata (mapcar 'cons xcode xlist))
  (setq com_data (cons xdata com_data))
  (ssdel vp ss))
  )
  com_data
  )
(defun C:demo()
  (mapcar 'print (setq lst (_getxdata)))

(setq i 0)
(foreach item lst
  (if (assoc 1003 item)
    (setq i (1+ i))))
(if (zerop i)
  (alert "Xdata with code 1003 does not exists")
  )
    )
(vl-load-com)
~'J'~
fixo вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Программная печать из листа с учетом его параметров.

Размещение рекламы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
печать из пространства листа pembroke AutoCAD 8 14.07.2008 22:31
Печать из пространства листа на других компьютерах Никита В. AutoCAD 4 24.03.2006 10:12