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

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

пакетная печать

Ответ
Поиск в этой теме
Непрочитано 11.02.2005, 13:00 #1
пакетная печать
Apelsinov
 
Проектировщик ВК. LISP-любитель.
 
Москва
Регистрация: 15.12.2003
Сообщений: 1,192

вот любит Vova задавать задачки на которые ответ сам знает, и я задам, только ответа я не знаю
И так, уважаемые знатоки :
[sm2001]
Есть около 600 файлов dwg,

Все они в разных каталогах разной вложенности, но внутри одного общего.

В каждом файле чертежик в модели, в листе ничего нет. чертежик может быть выполнен в любом масштабе, он может быть повернут как вертикально, так и горизонтально, но все они сделаны под лист A4.

Внимание, вопрос:

Как можно быстро распечатать все эти файлы на лазерном принтере?
(стиль печати можно задать один для всех)

Если учесть, что рапечатаны они должны быть в определенной последовательности:

сначала первый каталог, затем все вложенные в него каталоги с подкаталогами по очереди, затем второй каталоги т.д.
Просмотров: 23132
 
Непрочитано 11.02.2005, 13:13
#2
Кулик Алексей aka kpblc
Moderator

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


А из-под какого када? Если 2002, то там есть т.н. "Batch plot", вызывается отдельно, находится в Пуск - Программы - AutoCAD 2002 - Patch plot utility. Ничего сложного в ней нет, просто добавляются файлы в список, определяется принтер, печатаемое пространство, стиль печати и т.п.
Для 2005 надо пользоваться командой _publish, но с ее настройкой до конца не разобался, сорри.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 11.02.2005, 13:30
#3
X-DeViL

Бизнес-шмизнес
 
Регистрация: 26.05.2004
Питер
Сообщений: 1,911


kpblc

Цитата:
просто добавляются файлы в список, определяется принтер, печатаемое пространство,
во во... и так 600 раз ))))

как я понял надо "аутоматично " чтобы печатало ) мож наши гуры в программинге чо нить нам скажут?
X-DeViL вне форума  
 
Непрочитано 11.02.2005, 13:34
#4
Fogel

люблю мастерить
 
Регистрация: 21.01.2005
Челябинск
Сообщений: 9,922


[quote="X-DeViL"]kpblc

Цитата:
как я понял надо "аутоматично " чтобы печатало ) мож наши гуры в программинге чо нить нам скажут?
Дык тут это... писать требо, а у меня пятница, конец работы и пиво в холодильнике... Я пас. А в принципе ничего сложного не должно быть :/
Fogel вне форума  
 
Непрочитано 11.02.2005, 13:40
#5
Кулик Алексей aka kpblc
Moderator

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


ну ето да, один из минусов. Есть другие предложения (без прог)?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 11.02.2005, 13:46
#6
X-DeViL

Бизнес-шмизнес
 
Регистрация: 26.05.2004
Питер
Сообщений: 1,911


KpbIc

Я нашел выход )))

Берешь студентку, практикантку, обещаешь ей небо и звезды, и сажаешь на распечатку )) Шампанское и шоколад добавлять по вкусу!! ))

Тут сразу ДВА бонуса, и сам вроде не напрягаешься, и есть перспективка ))) ХЕХЕ
X-DeViL вне форума  
 
Автор темы   Непрочитано 11.02.2005, 14:02
#7
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,192
<phrase 1=


>All
Если бы не была так важна последовательность,
и все листы были одинаково ориентированы,
я бы временно их все скопировал в один каталог
(в тотал ком. это элементарно)
и оттуда распечатал batch plot без проблем,
задав всем печать extens с вписанным в A4 масштабом.
но в том то и проблема...
Apelsinov на форуме  
 
Непрочитано 11.02.2005, 14:11
#8
Кулик Алексей aka kpblc
Moderator

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


Ну а вообще на каждом файле настроено-то нормально? Чтобы открыл, сразу Ctrl+P, Enter? Если да, то попробуй мой вариант. Конечно, придется в каждый подкаталог заходить, но попробовать-то можно на 1-2 каталогах.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 11.02.2005, 14:25
#9
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,192
<phrase 1=


считаем открыть папку 2сек + файл 2сек + ctrlP-enter 3 cek + процесс отправки 5 сек + закрыть файл - 2 сек = 14 сек.
14*600=8400сек = 2ч 20мин. непрерывного клацания по клавишам (недостижимый минимум), совершенно механической работы - я не возьмусь.
Но в файлах ессесно ничего не настроено, так что это все теория...
Apelsinov на форуме  
 
Непрочитано 11.02.2005, 14:33
#10
Кулик Алексей aka kpblc
Moderator

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


Зачем так? Ctrl+O - все в каталоге -> Ctrl+P -> Ctrl+F4 - Tab - Enter
Но если все не настроено, то тогда совсем кисло По факту надо писать прогу, которая:
1. Откроет файл (автоматом определив его место)
2. Определит область печати (а если еще есть объекты, не попадающие в область печати, то веселухи будет...)
3. Настроит область печати в соответствии с требованиями (которые могут у пользователя в самый неподходящий момент измениться).
4. Закроет файл.
5. см. п.1
И так 600 (700, 800, 900...) раз.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 11.02.2005, 14:43
#11
Lenich

Опер дир
 
Регистрация: 28.04.2004
Москва
Сообщений: 291


Насчет п.3 гдето уже обсуждалось, что програмно создать файл стиля печати невозможно.
Поэтому п.3 надо изменить на: Выберет область печати из существующих (настроенных).
Lenich вне форума  
 
Непрочитано 11.02.2005, 19:52
#12
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


>Apelsinov

Если использовать DosLIB, то получить список файлов в желаемом вами порядке и без подвязки к "путям поддержки" очень просто. Ну со списком уже что душа пожелает...

Код:
[Выделить все]
(defun insdwg (/ rootDir dirList newFiles fileList)
  (if
  (setq rootDir
	   (dos_getdir "Folder to select DWG's " "C:\\" "Select folder select DWG's")
	); end setq
  (progn
   (setq dirList(dos_dirtree rootDir)
	 fileList '()
	); end setq
  (foreach dir dirList
    (if
      (setq newFiles(dos_dir(strcat dir "*.dwg")0))
       (setq fileList(append fileList newFiles))
      ); end if
    ); end foreach
  fileList
   ); end progn
  ); end if
); end of insdwg
Первый кусочек кода за последний месяц.... Застой :?
{Smirnoff} вне форума  
 
Автор темы   Непрочитано 18.02.2005, 20:14
#13
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,192
<phrase 1=


Я вот поздно отвечаю, но просто не было времени заниматься этой проблемой.
Fantomas, спасибо огромное! Функция замечательная!
На ее основе постараюсь что нибудь сваять, это вроде не трудно.

Но у меня вопрос:

doslib - есть ли где описание, лучше, конечно на русском (англ с трудом), но даже если на англ, то все равно ...
Apelsinov на форуме  
 
Непрочитано 18.02.2005, 21:14
#14
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


Скачивается вот тут свободно http://www.mcneel.com/download.htm . Правда требуют майл и шлют потом изредка (примерно раз в месяц или два) анонсы своих приложений.
Там инсталяция и прекрасный Help (на английском). Сама плагин представляет из себя Arx файл (два для R15 и R16). Ложить на "пути поддержки" его надо "руками". После инсталяции в Program Files появляется папка DOSLIB где они лежат вместе с Хелпом. После подгрузки этого *.Arx, начинают работать около 80 дополнительных функций. Впрочем я сейчас кину тебе на мейл....
{Smirnoff} вне форума  
 
Непрочитано 18.02.2005, 21:43
#15
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


Прошу прощения, только сейчас заметил что надо так:
Код:
[Выделить все]
(defun insdwg (/ rootDir dirList newFiles fileList)
  (if
  (setq rootDir
      (dos_getdir "Folder to select DWG's " "C:\\" "Select folder select DWG's")
   ); end setq
  (progn
   (setq dirList(dos_dirtree rootDir)
    fileList '()
   ); end setq
  (foreach dir dirList
    (if
      (setq newFiles(dos_dir(strcat dir "*.dwg")0))
      (progn
	(setq newFiles(mapcar '(lambda (x)(strcat dir x))newFiles)
              fileList(append fileList newFiles)
	); end setq
       ); end progn
      ); end if
    ); end foreach
  fileList
   ); end progn
  ); end if
); end of insdwg
Просто сначала незнал о существовании dos_dirtree и написал все без нее, но длиннее. А когда обнаружил эту функцию, то на радостях "снес" строчек 6 кода и забыл что путь на файлы к названию тоже не дурно бы добавлять :shock:
{Smirnoff} вне форума  
 
Автор темы   Непрочитано 22.02.2005, 14:06
#16
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,192
<phrase 1=


Едем дальше, вопрос еще не решен, количество файлов выросло до 1000 :roll:

Есть список файлов с путями (Спасибо Fantomas'у) именно в нужной последовательности.

Есть функция печати
(defun apel-plot-extents (printer format tabulka /)...)
арг-ты соотв-но - имя принтера, формат, табл. стилей.
Печатает extents вписанным масштабом, автоматически выставляя ориентацию.

Теперь необходимо:
1. открыть документ
2. применить к нему apel-plot-extents
3. закрыть.

И так для каждого элемента списка.

Открыть документ могу с помощью ф-ии Rucad:
Код:
[Выделить все]
(defun ru-dwg-open-file (dwg_file / n)
;;; Пример:  (ru-dwg-open-file "c:\\.ru\\cad\\samples\\dwg\\Dim_test.dwg")
  (if (= 0 (getvar "SDI"))
    ;; Для многодокументного режима (SDI=0) открываем новый документ  
    ;; в новом окне. Сохранять открытые не нужно
    (vla-activate
      (vla-open (ru-obj-get-docs-collection)
                dwg_file
      )
    )
    (progn
      ;; для однодокументного режима
      (if (not (equal 2 (logand 2 (getvar "QAFLAGS"))))
        (setvar "QAFLAGS" (+ (getvar "QAFLAGS") 2))
      )
      (if (not (equal 4 (logand 4 (getvar "QAFLAGS"))))
        (setvar "QAFLAGS" (+ (getvar "QAFLAGS") 4))
      )

      (command "_.OPEN")
      ;; Проверяем, не изменялся ли текущий рисунок
      (if (not (equal 0 (getvar "DBMOD")))
        ;; и, если изменялся - передаем опцию "Yes", дескать, сохраняй 
        (command "_y")
      )
      (command dwg_file)
      (setq n 0)
      ;; и теперь, пока работает команда OPEN 
      (while (and (< n 4)
                  (wcmatch (getvar "CMDNAMES") "*OPEN*")
             )
        (t
          ;; на все возможные запросы даем пустой ответ
          (command "")
        )
        (setq n (+ n 1))
      )
      (setvar "QAFLAGS" 0)
    )
  )
)


(defun ru-obj-get-docs-collection ()
    (ru-obj-acad-collection "Documents")
)

(defun ru-obj-acad-collection (name)
;;; Корень коллекции NAME в AcadApplication
    (vlax-get-property (ru-obj-get-acad-object) name)
)

(defun ru-obj-get-acad-object ()
  (cond	(*ru_acad-object*)
	(t
	 (setq *ru_acad-object*
		(vlax-get-acad-object)
	 ) 
	)
  ) 
)
Но как сделать его активным и распечатать - не знаю.
Apelsinov на форуме  
 
Непрочитано 22.02.2005, 15:47
#17
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


Думаю что это поможет, дочитай ддо конца эту тему: http://www.autocad.ru/cgi-bin/f1/board.cgi?t=8860rw . Сдесь конечно создавался новый документ, но не проблемма и открыть имеющийся. Это я к тому что для применения вашей функции печати нужно нужно иметь АКТИВНЫЙ документ.

Но можно печатать и неактивные документы. См. метод PlotToDevice, функцию печати естественно придется переписать...
Извини сейчас нет больше времени. Намекну только что (ru-dwg-open-file должна возвращать VLA метку файла с которой потом и надо работать....
{Smirnoff} вне форума  
 
Автор темы   Непрочитано 22.02.2005, 18:33
#18
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,192
<phrase 1=


> Fantomas
У меня кое что получилось, без переписывания функции,
пытался так:

Код:
[Выделить все]
(defun c:plotlist ()
 (if (setq spis_files (insdwg))
  (progn
   (vl-bb-set '*apel-plot* t)
   (mapcar (function ru-dwg-open-file) spis_files)
   (vl-bb-set '*apel-plot* nil)
  )
 )
)
Ну это понятно - я просто открываю файлы по списку файлов
В автозагрузке поместил такую функцию:

Код:
[Выделить все]
(defun apel-plot-spis ()
 (if (vl-bb-ref '*apel-plot*)
  (progn
   (apel-plot-extents "LAZERPRINTER.pc3" "A4" "000.CTB")
   (command "_.vbastmt" "ThisDrawing.Close False")
  )
 )
)
 
(apel-plot-spis)
Печатать то печатает (замечательно печатает), но закрывать по
Код:
[Выделить все]
 (command "_.vbastmt" "ThisDrawing.Close False")
не хочет
пишет в ком строке какой-то Expression (?) и ждет.

Если же файл закрыть вручную, то программа продолжается, открывает следующий, печатает и опять стопорится и т.д.

Вопрос: Как можно закрыть файл?
Apelsinov на форуме  
 
Непрочитано 22.02.2005, 19:16
#19
{Smirnoff}

Инженер по системам безопасности
 
Регистрация: 23.11.2003
Рига
Сообщений: 1,099


К сожалению немогу полностью съемитировать ситуацию, нет у меня (apel-plot-extents. А если просто кидаю в командную строку (command "_.vbastmt" "ThisDrawing.Close False") то закрывает без вопросов... Может какой таймаут нужен, пока спулинг идет? Может создавать в документе реактор на событие EndPlot или просто после команды на печать создавать небольшую задержку с помощью (command "_.delay" xxxx

А ты молодец, лихо эту задачу решаешь. Однако я бы всё все таки обратил внимание на метод (vla-PlotToDevice и открывал документы неактивными и печатал их. Хотя сам я не пробывал, так теоретизирую...
{Smirnoff} вне форума  
 
Автор темы   Непрочитано 24.02.2005, 10:53
#20
Apelsinov

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,192
<phrase 1=


>Fantomas
vla-PlotToDevice - это конечно, наверное, интересно, и может быть даже правильно.
Как нибудь этим займусь и перепишу функцию печати.

Но даже если я использую этот метод - проблема останется - документ после печати надо будет как-то закрыть.

Как же закрыть неактивный документ?

Если решить этот вопрос, то и без переписывания функии печати, можно будет сделать где-то так:

Код:
[Выделить все]
(defun c:plotlist ()
 (if (setq spis_files (insdwg))
  (progn
   (vl-bb-set '*apel-plot* t)
   (mapcar (function (lambda (i) (ru-dwg-open-file i) (Функция-закрытия-неактивн-документа)))
           spis_files
   )
   (vl-bb-set '*apel-plot* nil)
  )
 )
)
То есть закрывать документ после печати но не из
автозагружаемой функции, а прямо из этой.
и убрать закрытие из автозагружаемой:

Код:
[Выделить все]
(defun apel-plot-spis () 
 (if (vl-bb-ref '*apel-plot*) 
   (apel-plot-extents "LAZERPRINTER.pc3" "A4" "000.CTB") 
 ) 
) 
  
(apel-plot-spis)
Кстати через ком строку, да и вообще в активном документе выражение:
Код:
[Выделить все]
 (command "_.vbastmt" "ThisDrawing.Close False")
работает замечательно, не понятно, почему оно не работает в моем предыдущем примере.

Собственно, проверить его неработоспособность можно подставив вместо apel-plot-extents любую функцию типа (princ "Ля-ля-ля")- все равно не закрывает.

Если интересно, то вот функция печати:
Код:
[Выделить все]
;;;*********
;;;Apelsinov
;;;22.02.05
;;;apel-plot-extents
;;;*********
(defun apel-plot-extents (printer format tabulka /)
;;;  (apel-plot-extents "LAZERPRINTER.pc3" "A4" "TIMUR.CTB") 
  (APEL-PLOT-WIN
    printer
    format
    tabulka
    (list (getvar "extmin") (getvar "extmax"))
  )
  (princ)
)

;;;*********
;;;Apelsinov
;;;22.02.05
;;;APEL-PLOT-WIN
;;;*********
(defun APEL-PLOT-WIN (printer format tabulka coord / a cmd xy1 xy2 L)
    (princ (strcat "\n Печать на "	       printer
		 "; Формат:"	format	       " Стиль:"
		 tabulka "\n"
		)
  )
  (setq	cmd (getvar "cmdecho")
	xy1 (car coord)
	xy2 (cadr coord)
	a   (angle xy1 xy2)
  )
  (if (or (and (> a (* pi 0.25)) (< a (* pi 0.75)))
	  (and (> a (* pi 1.25)) (< a (* pi 1.75)))
      )
    (setq a "Portrait")
    (setq a "Landscape")
  )
  (setvar "cmdecho" 0)

  (if (eq (getvar "tilemode") 0)
    (command "-plot"			;сама команда
	     "y"			;нужны настройки
	     ""				; Лист или модель
	     printer			;Собственно принтер
	     format			;Формат листа
	     "Millimeters"		;Ед. измерения
	     a				;Ориентация листа
	     "N"			;Зеркалить лист
	     "Window"			;Область печати
	     xy1			;Первая точка окна
	     xy2			;Вторая точка окна
	     "fit"			;Масштаб
	     "center"			;Сдвиг листа
	     "yes"			;Печать со стилем
	     tabulka			;Стиль
	     "Yes"			;Учитывать заданные толщины линий
	     "No"			;масштабироватьтолщины линий
	     "No"			;Хрен че такое?
	     "No"			;Удалять скрытые линии
	     "No"			;Печатать в файл
	     "no"			;Сохранить настройки
	     "yes"			;Старт печати
	    )
    (command "-plot"			;сама команда
	     "y"			;нужны настройки
	     "model"			;Лист или модель
	     printer			;Собственно принтер
	     format			;Формат листа
	     "Millimeters"		;Ед. измерения
	     a				;Ориентация листа
	     "N"			;Зеркалить лист
	     "Window"			;Область печати
	     xy1			;Первая точка окна
	     xy2			;Вторая точка окна
	     "fit"			;Масштаб
	     "center"			;Сдвиг листа
	     "yes"			;Печать со стилем
	     tabulka			;Стиль
	     "Yes"			;Учитывать заданные толщины линий
	     "No"			;Удалять скрытые линии
	     "No"			;Печатать в файл
	     "No"			;Сохранить настройки
	     "Yes"			;Старт печати
	    )
  )

;;;  (command "preview")
  (setvar "cmdecho" cmd)
)
Apelsinov на форуме  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > пакетная печать

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