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

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

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

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

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

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

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

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

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

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

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

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


А из-под какого када? Если 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,914


[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,844


ну ето да, один из минусов. Есть другие предложения (без прог)?
__________________
Моя библиотека 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,190
<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,844


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

Проектировщик ВК. LISP-любитель.
 
Регистрация: 15.12.2003
Москва
Сообщений: 1,190
<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,844


Зачем так? 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,190
<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,190
<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,190
<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,190
<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 вне форума  
 
Автор темы   Непрочитано 24.02.2005, 14:38
#21
Apelsinov

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


История продолжается...
Нашел как закрыть неактивный документ:
Код:
[Выделить все]
(defun apel-dwg-close-noactive ()
 (vlax-for Item (vla-get-documents (vlax-get-acad-object))
  (if (= (vla-get-active Item) :vlax-false)
   (vla-close Item :vlax-true)
  )
 )
)
Однако новая напасть - не могу переключиться из печатаемого документа в исходный чтобы сработал apel-dwg-close-noactive, пытался так:
Код:
[Выделить все]
(vla-activate (vla-item (vla-get-documents (vlax-get-acad-object)) 0))
Но увы, не работает (хотя в отдельно взятом документе переключает), что и понятно,функция в исходном файле ждет окончания работы функции в печатаемом, а при переключении - наоборот.

Выходит все чего-то ждут - а работать никто не хочет, очень знакомая ситуация

Все из-за невозможности открыть документ и сделать его неактивным, закончив в нем функцию.

И даже написав функцию печати неактивного документа этой проблемы не решить - открыв документ надо будет сделать его неактивным.

В общем я в ступоре


Сама задача-то почти решена, не получается лишь полной автоматизации. В принципе запустив программу остается лишь нажимать ctrl + tab - 1000 раз...что уже не так плохо. Но жаль!
Apelsinov вне форума  
 
Непрочитано 24.02.2005, 15:14
#22
{Smirnoff}

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


Погоди немного.... У меня уже все печатает, правда "тормозной" метод vla-PlotToDevice вносит свои коррективы. Сейчас попробую заменить его на твою функцию. Идея у меня совсем другого плана. Нужно чтобы документ всегда был активным при печати- открываем вторую сессию AutoCAD из первой и открываем там по очереди все документы опять же из первой сессии. Вот только ждать пока vla-PlotToDevice отправит их на печать жутко долго...

Вот можешь пока поиграться с моими первыми опытами. Убери закоменченные строки печати, вставь задержку (command "_.delay....
возможно твоя функция печати будет работать из автозагрузки. А я пока с твоей функцией "добью" вариант со втрой сессией акада...
Код:
[Выделить все]
(defun c:mplot(/ pathList docColl curDoc plotObj errList errCount sucCount)
  
  (defun asmi-doslib-load (/)
    (cond
	   ((=(substr(getvar "ACADVER")1 2) "15")
	    (progn
  (if(not(member "doslib15.arx" (arx)))
      (arxload "doslib15.arx" "File doslib15.arx.arx not found! ")
    ); end if
  );end progn
	    )
	   ((=(substr(getvar "ACADVER")1 2) "16")
	    (progn
  (if(not(member "doslib16.arx" (arx)))
       (arxload "doslib16.arx" "File doslib16.arx.arx not found! ")
    ); end if
  );end progn
	    )
	    ); end cond
    (if(or
       (member "doslib15.arx" (arx))
       (member "doslib16.arx" (arx))
       ); end or
      T
      ); end if
  ); end of asmi-doslib-load


  

  (defun asmi-all-folder-dwgs (/ 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 asmi-all-folder-dwgs


  (defun prepare-to-plot (vla-file /)
    (princ)
    ); end of vla-file


  
  (if(asmi-doslib-load)
    (progn
      (if
       (setq pathList(asmi-all-folder-dwgs))
        (progn
          (setq docColl(vla-get-Documents(vlax-get-acad-object))
	        errList '()
		errCount 0
		sucCount 0
	       ); end setq
      (foreach path pathList
	(if
	  (not 
            (vl-catch-all-error-p 
             (setq curDoc
		    (vl-catch-all-apply 'vla-open(list docColl path)))))
	    (progn
;;;	      (setq plotObj(vla-get-plot curDoc))
;;;	      (if(not(vla-PlotToDevice plotObj))
;;;		(progn
;;;	      (setq errList(append errList(list path)))
;;;	      (setq errCount(1+ errCount))
;;;	       ); end progn
;;;	      ); end if
	   (vla-close curDoc :vlax-false)
	   (setq sucCount(1+ sucCount))
	  ); end progn
	  (progn
	  (setq errList(append errList(list path)))
	  (setq errCount(1+ errCount))
	  ); end progn
	); end if
      ); end foreach
    ); end progn
       (princ "\n!!! *.DWG FILES NOT FOUND IN SELECTED DIRECTORY AND SUBDIRECTORIES !!! ")
   ); end if
  ); end progn
 ); end if
  (if(/= 0 errCount)
    (progn
      (princ "\n!!! ISN'T PLOTTED FILES !!!")
      (princ "\n------------------------------------------------")
      (foreach file errList
	(princ(strcat "\n" file))
	); end foreach
      (princ "\n------------------------------------------------")
      (princ(strcat "\n!!! TOTAL ISN'T PLOTTED FILES: " (itoa errCount) " !!! \n"))
       ); end progn
      ); end if
    (if(/= 0)
    (princ(strcat "\n*** " (itoa sucCount) " FILES PLOTTED *** "))
      ); end if
    (textscr)
(princ)
); end of c:mplot

(vl-load-com)
{Smirnoff} вне форума  
 
Непрочитано 24.02.2005, 16:29
#23
{Smirnoff}

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


[sm158] [sm158] [sm158] Работает!!!!

Осталась толко одна проблемма, решение которй требует либо небольшого количества кода, либо остроумия.

Состоит она в следующем.
При работе с одной версией AutoCAD мы можем организовать "спусковой крючек" от состояния которого при загрузке нового файла функция (apel-plot-extents будет запущена на выподнение к примеру через внедукументное пространство. При работе со второй сессией, пройдут только ActiveX объекты. Моя идея состоит в том чтобы "поймать" первую сессию из второй с помощью (vlax-get-object, обратиться к активному документу и если там есть соответствующая метка (к примеру точка с соответствующими координатами) запустить (apel-plot-extents.

Может есть другие идеи?

А пока попробуй, но после работы acaddoc.lsp (или автозагрузку) придется почистить во избежании печати всех открываемых документов...

В acaddoc.lsp у меня:
Код:
[Выделить все]
(apel-plot-extents "HP LaserJet 4100 Series PS.pc3" "A4" "acad.stb")
и конечно твоя замечательная функция.

Основная функция:
Код:
[Выделить все]
(defun c:dirplot(/ pathList newAcad newDocCol curFile tagPoint openCount errCount errList)

  
  (defun asmi-doslib-load (/)
    (cond
	   ((=(substr(getvar "ACADVER")1 2) "15")
	    (progn
  (if(not(member "doslib15.arx" (arx)))
      (arxload "doslib15.arx" "File doslib15.arx.arx not found! ")
    ); end if
  );end progn
	    )
	   ((=(substr(getvar "ACADVER")1 2) "16")
	    (progn
  (if(not(member "doslib16.arx" (arx)))
       (arxload "doslib16.arx" "File doslib16.arx.arx not found! ")
    ); end if
  );end progn
	    )
	    ); end cond
    (if(or
       (member "doslib15.arx" (arx))
       (member "doslib16.arx" (arx))
       ); end or
      T
      ); end if
  ); end of asmi-doslib-load


  

  (defun asmi-all-folder-dwgs (/ 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 asmi-all-folder-dwgs



  (if(asmi-doslib-load)
    (progn
      (if
       (setq pathList(asmi-all-folder-dwgs))
        (progn
	  (princ "\n*** PLEASE WAIT WHILE SECOND AutoCAD SESSION STARTS... *** ")
          (setq newAcad(vlax-create-object "Autocad.Application"))
	  (if newAcad
	    (progn
	    (vlax-put-property newAcad "Visible" :vlax-true)
	    (setq newDocCol(vla-get-Documents newAcad)
		  openCount 0
		  errCount 0
		  errList '()
		  ); end setq
	      (foreach file pathList
		(if
	  (not 
            (vl-catch-all-error-p 
             (setq curFile
		    (vl-catch-all-apply 'vla-open(list newDocCol file)))))
	           (progn
		     (setq openCount(1+ openCount)
	                 ); end setq
		     (command "_.delay" 1000)
		     (vla-close curFile :vlax-true)
		     (vlax-release-object curFile)
		     ); end progn
	            (progn
		      (setq errCount(1+ errCount)
			    errList(append errList(list file))
			    ); end setq
		      ); end progn
	            ); end if
		); end foreach
	    (vla-close(vla-get-ActiveDocument newAcad):vlax-true)
	    (vlax-invoke-method newAcad "Quit")
      (mapcar(function(lambda(x)
          (if
       (and x(not(vlax-object-released-p x)))
       (vlax-release-object x)
       )
          ))
    (list curFile newDocCol newAcad)
    )
    (setq curFile nil
          newDocCol nil
          newAcad nil
	   ); end setq
    (gc)
	    
  (if(/= 0 errCount)
    (progn
      (princ "\n!!! ISN'T PLOTTED FILES !!!")
      (princ "\n------------------------------------------------")
      (foreach file errList
	(princ(strcat "\n" file))
	); end foreach
      (princ "\n------------------------------------------------")
      (princ(strcat "\n!!! TOTAL ISN'T PLOTTED FILES: " (itoa errCount) " !!! \n"))
       ); end progn
      ); end if
    (if(/= 0 openCount)
    (princ(strcat "\n*** " (itoa openCount) " FILES PLOTTED *** "))
      ); end if
    (textscr)
		  ); end progn
	    (princ "\n!!! CAN'T OPEN SECOND AutoCAD SESSION !!! ")
	    ); end if 
	  ); end progn
	  (princ "\n!!! *.DWG FILES NOT FOUND IN SELECTED DIRECTORY AND SUBDIRECTORIES !!! ")
       ); end if
      ); end progn
    ); end if
  (princ)
); end of c:dirplot

(vl-load-com)
:!: Обрати внимание на строку (setq newAcad(vlax-create-object "Autocad.Application")) Если у тебя на машине несколько автокадов то возможно надо указать какую открывать. Типа "Autocad.Application.15"
{Smirnoff} вне форума  
 
Непрочитано 24.02.2005, 16:48
#24
{Smirnoff}

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


Еще CMDECHO забыл отключить... И лазерник, почему то печатает не так быстро. Думаю чтобы "неповесить" сетку, задержку на печать надо побольше сделать, слишком быстро она их отправляет... а печатает медленее... :roll:
{Smirnoff} вне форума  
 
Непрочитано 24.02.2005, 17:07
#25
{Smirnoff}

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


Информирую :!: Получил звонок от сетевого Админа. Он сказал все что он обо мне думает... За 254 Мб в очереди на печать на сетевом принтере... А запустил то всего 34 файла...
{Smirnoff} вне форума  
 
Автор темы   Непрочитано 24.02.2005, 17:30
#26
Apelsinov

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


Ну проблемы админов оставим им самим, 34 файла в очереди это цветочки, я и вручную их порой отправлял забивая в очередь под сотню.
Но вообще мне совсем не нравится идея с delay. Но без нее тут никак, просто у меня принтеры разные по разному по сетке откликаются, не знаю от чего зависит.
По поводу "крючка" - можно при запуске проги делать запись в файл, а в автозагрузке его читать. Затем по окончании, менять запись.Или просто созавать временный файл, и проверять его наличие.
Разбираюсь с прогой - есть вопрос - что такое vlax-release-object?
Apelsinov вне форума  
 
Автор темы   Непрочитано 24.02.2005, 17:40
#27
Apelsinov

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


Да, еще - есть способ проверить на наличие dos_lib кроме как на загруженные файлы arx?
Мне в принципе все равно, но уж если быть занудой то у меня dos_lib грузится из doslib2004.arx или
doslib2k.arx.(себе я пока эту ф-ю вообще убрал) А по хорошему ее вообще надо в asmi-all-folder-dwgs, больше ведь нигде вроде не используется.
Apelsinov вне форума  
 
Непрочитано 24.02.2005, 18:10
#28
avd


 
Регистрация: 24.02.2005
Сообщений: 8


Из хелпа:
The drawing from which the plot is initiated must be active for the plot to succeed.
Поэтому только на lisp задачу не решить. На лиспе - выбор файлов и их сортировка по какому-то необходимому Вам принципу, а печать на VBA.
avd вне форума  
 
Непрочитано 24.02.2005, 19:05
#29
{Smirnoff}

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


>Apelsinov
Цитата:
Да, еще - есть способ проверить на наличие dos_lib кроме как на загруженные файлы arx?
Мне в принципе все равно, но уж если быть занудой то у меня dos_lib грузится из doslib2004.arx или
doslib2k.arx.(себе я пока эту ф-ю вообще убрал) А по хорошему ее вообще надо в asmi-all-folder-dwgs, больше ведь нигде вроде не используется.
Ну я не только в этой проге DOSLIB использую, поэтому и такая функция есть. Насчет названий файлов, они действительно меняются от версии к версии, когда я скачивал 6.0 там было их 4 doslib2000.arx, doslib2004.arx, doslib15.arx, doslib16.arx. Понятно что фактически два с разными названиями. Можно конечно аналог написать без DOSLIB, однеако лениво...
Цитата:
Но вообще мне совсем не нравится идея с delay. Но без нее тут никак, просто у меня принтеры разные по разному по сетке откликаются, не знаю от чего зависит.
Думаю чтобы не создавать большую очередь на печать, нужно написать функцию вычисляющую размер файла отправляемого на печать и в зависимости от этого несколько раз в цикле запускать (command "_.delay", без которой к сожалению не обойтись
Цитата:
По поводу "крючка" - можно при запуске проги делать запись в файл, а в автозагрузке его читать. Затем по окончании, менять запись.Или просто созавать временный файл, и проверять его наличие.
Идет хорошая идея, даже думаю можно писать в регистр, по крайней мере кода меньше
Цитата:
Разбираюсь с прогой - есть вопрос - что такое vlax-release-object
Она "отцепляет" объекты полученные через COM-сервер из других приложений. Если такой объект останется, то стороннее приложение (в данном случае второй AutoCAD) останется в списке процессов...

В общем требуются мелкие доработки, а так в общем даже очень ничего...

>avd
Цитата:
The drawing from which the plot is initiated must be active for the plot to succeed. Поэтому только на lisp задачу не решить.
А на чем же, мы ее решили? На Алголе что ли?

Строчку я эту из Хелпа читал, однако она не говорит о том что нельзя запустить печать одного файла из другого. И с переменной BACKGROUNDPLOT баловался. Вот то что (vla-PlotToDevice работает по лиспом полностью "тормознуто" и делает активным документ не из которого дана команда на печать, а печатаемый это точно...

Хотя все решаемо и в одной сесси AutoCAD, можно таскать все туда-сюда через внедокументное пространство, я имею ввиду держать там список файлов, и флаги для переключения документов. Однако такой алгоритм мне нравится меньше, поскольку при любой ошибке "цепочка" оборвется. А с двумя сессиями, по крайней мере есть "главный" который "ведомого" контролирует...
{Smirnoff} вне форума  
 
Непрочитано 25.02.2005, 07:22
#30
avd


 
Регистрация: 24.02.2005
Сообщений: 8


А стоит ли мучится с двумя сессиями. У меня работает как я писал - выбираю с помощью dos_getfilem, пишу имя файла в users, вызываю макрос VBA и печатаю. И ни каких тормозов. Конечно если не пользоваться гадким VBA из принципа тогда другое дело.
avd вне форума  
 
Непрочитано 25.02.2005, 09:12
#31
{Smirnoff}

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


>avd
Цитата:
Конечно если не пользоваться гадким VBA из принципа тогда другое дело.
Таких принципов нет, согласен что VBA для решения такой задачи предпочтительнее, тем более что там можно создать реактор на событие EndPlot, а в лисповских реакторах я такого события не нашел и приходится мучатся с задержками. Однако интересно решить такую задачу и на лиспе.

Чтобы всякие VBAшники нос не задирали (шутка)
{Smirnoff} вне форума  
 
Автор темы   Непрочитано 25.02.2005, 10:33
#32
Apelsinov

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


>all
Ну а мне вообще все паралельно, на чем эта штука будет написана, хоть на лиспе, хоть на VB, хоть на паскале или фортране - главное чтоб работала хорошо.

Вот только писать я могу только на лиспе (и то коряво).

Поэтому если кто-то напишет аналог на VB - дык флаг в руки, и немерянное СПАСИБО от меня
Apelsinov вне форума  
 
Непрочитано 25.02.2005, 11:10
#33
avd


 
Регистрация: 24.02.2005
Сообщений: 8


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

На VBA это выглядит примерно так:
Код:
[Выделить все]
Public Sub av_batch_plot()

On Error GoTo ProcessingError

    Dim FilesForPrint As String
    Dim Printer As String
    Dim Paper As String
    Dim ObjLayout As AcadLayout
    Dim k As Integer
    
'   FilesForPrint имя файла для открытия.
'   k - количество копий.
    FilesForPrint = ThisDrawing.GetVariable("users5")
    Printer = ThisDrawing.GetVariable("users4")
    Paper = ThisDrawing.GetVariable("users3")
    k = ThisDrawing.GetVariable("useri4")
    ThisDrawing.Application.Documents.Open (FilesForPrint)
    Application.ZoomExtents
    
    Dim s(0 To 1) As Double
        s(0) = 0: s(1) = 0
    
    Set ObjLayout = ThisDrawing.Layouts.Item("Model")
    With ObjLayout
      .RefreshPlotDeviceInfo
      .ConfigName = Printer
      .RefreshPlotDeviceInfo
      .CanonicalMediaName = Paper
      .PlotOrigin = s
      .PaperUnits = acMillimeters
      .PlotType = acExtents
      .PlotRotation = ac0degrees
      .StandardScale = acVpScaleToFit
      .StyleSheet = "monochrome.ctb"
      .PlotWithPlotStyles = True
      .PlotWithLineweights = True
    End With
    
    If k > 0 Then
      ThisDrawing.Plot.NumberOfCopies = k
      ThisDrawing.Plot.PlotToDevice
    End If
    
    ThisDrawing.Close (False)
    
ExitHere:
Exit Sub

ProcessingError:
If Err.Number = -2145320825 Then
 MsgBox "Не могу открыть файл  " & FilesForPrint, vbCritical, "batch plot"
End If
If Err.Number = -2145386493 Then
 MsgBox "Не могу напечатать файл  " & FilesForPrint, vbCritical, "batch plot"
 ThisDrawing.Close (False)
End If
Resume ExitHere
 
End Sub
Формируй users-ы и useri на лиспе и пробуй.
Буду рад видеть усовершенствования этого "шедевра",
я ведь сам VBA тоже почти не знаю.
avd вне форума  
 
Автор темы   Непрочитано 25.02.2005, 11:55
#34
Apelsinov

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


>avd
Спасибо за заботу
Посмотрю обязательно, но пока я , к сожелению, не знаю даже как это запустить

>Fantomas
возможно для проверки на dos_lib можно применить что-то вроде этого:

Код:
[Выделить все]
(defun apel-dos_lib (N)
 (and dos_version
      (>= (dos_version) N)
 )
)
;Пример:
(apel-dos_lib "6.1.4")
; у меня возвращает T
Apelsinov вне форума  
 
Непрочитано 25.02.2005, 12:28
#35
avd


 
Регистрация: 24.02.2005
Сообщений: 8


Loading VBA Files тут http://www.afralisp.com/vl/vl-vba.htm
avd вне форума  
 
Непрочитано 25.02.2005, 15:46
#36
{Smirnoff}

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


Цитата:
возможно для проверки на dos_lib можно применить что-то вроде этого:
Для проверки, безусловно можно использовать. Однако если он незагружен, все равно соответствующий *.Arx надо загрузить. В чем преймущество то? По моему и то и другое катит... Тем более что если DosLIB не загружен, то его придется загрузить и еще раз проверить версию, если номер как в этой функции имеет значение.

Ты лучше скажи, как оно работает :?: Я там "спусковой крючек" написал и функцию задержки в зависимости от величины файла, только дома флешку забыл :cry: Переписывать не хочется, в понедельник проверю и тогда выложу.
{Smirnoff} вне форума  
 
Непрочитано 28.06.2007, 09:57
#37
Гусев Георгий

Инженер
 
Регистрация: 24.01.2006
Подольский р-н, п.Поливаново
Сообщений: 28
<phrase 1=


Здравствуйте

Извените что вмешиваюсь. Меня интерисует один ворос: в AutoCAD 2007 есть или нету Batch Plot Utility, или может есть какая нибудь команда для пакетной печати из пространства листа. Целый проект в одном файле выполнен на листах, все настройки печати выполнены, печатать лень.

Спсбо
Гусев Георгий вне форума  
 
Непрочитано 28.06.2007, 10:04
#38
Кулик Алексей aka kpblc
Moderator

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


_.publish либо Sheet set managet
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 14.11.2019, 10:18
#39
tujn08


 
Регистрация: 26.12.2013
Сообщений: 284


Подскажите пожалуйста как в фоновый документ подгрузить (vl-load-com)

Что бы я не делал:
на (vla-get-Plot doc)
отвечает
ошибка: ActiveX Server возвратил ошибку: неизвестное имя: Plot

Или я не туда смотрю?
tujn08 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > AutoCAD > пакетная печать

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