Тема: LISP. Печать массива форматок или выборочно из одного файла в пространстве модели.

; ********************** model_plot_2007.lsp *********************************************************
;   Программа распечатки регулярного массива одинаковых форматок
;   из одного рисунка пространства модели или выборочно отдельных форматок.
;   Может использоваться для распечатки рисунков большого формата на
;   принтерах А3 и А4.
;   Принтер и параметры печати должны быть заранее настроены в Windows
;   и в AutoCAD'е. Желательно создать пользовательские форматы с нулевыми полями.
;   Шаг столбцов или рядов можно задать как численно, так и указанием 2 точек.
;   Шаги могут задаваться со знаком минус (-). Соответственно, и точки надо
;   задавать против направления осей.
;   Если задать шаги равными нулю, а количество форматок не равным нулю,
;   то распечатается количество копий одной форматки, равное размеру массива
;   форматок.
;   Если, например, масштаб вывода на печать равен 1:100, то 100 — это
;   знаменатель дроби и это число вводится в ответ на запрос программы.
;   Размеры форматок задаются равными размерам листа бумаги. В программе
;   эти размеры пересчитываются в область печати в соответствии с масштабом.
;   Ясно, что, если распечатывается, скажем чертеж формата А1, то рисовать
;   форматки не надо.
;   Автор Владимир Громов.
;
(defun C:MODEL_PLOT_2007 ( / ver echo kak pt1 scl dx dy dn orient m n stx stx1 stx2 sty sty1 sty2 pt2
                        dx1 dy1 pt11 ptx pt22 pty k flag plt_pdf k0)
(if (vl-string-search "17.0" (getvar "ACADVER"))
    (progn (setq ver "a17") (princ "\n Обнаружен AutoCAD 2007."))
)
(setq echo (getvar "CMDECHO"))
(setvar "CMDECHO" 0)
(initget 6 "Массив Выборочно Отказ")
(setq kak (getstring "\n Как будем печатать? [Массив/Выборочно/Отказ] <Массив>: "))
(if (= kak "") (setq kak "М"))
(COND
((or (= kak "М") (= kak "В"))
     (if (= kak "М")
         (progn
         (initget 6)
         (setq pt1 (getpoint "\n Укажите левый нижний угол рамки (ENTER-Отказ): "))
         (if pt1
            (progn
            (initget 6)
            (setq scl (getstring "\n Масштаб печати (знаменатель дроби) <1>: "))
            (if (= scl "") (setq scl "1"))
            (initget 7)
            (setq dx (* (getreal "\n Размер форматки (листа бумаги) по оси X (мм): ") (atoi scl)))
            (initget 7)
            (setq dy (* (getreal "\n Размер форматки (листа бумаги) по оси Y (мм): ") (atoi scl)))
            (initget "Да Нет")
            (setq dn (getkword "\n Задать опцию 'Вписать'? [Да/Нет] <Нет>: "))
            (if (= dn "Да") (setq scl "_fit")  (setq scl (strcat "1:" scl))
            )
                 (cond
                 ((> dy dx) (princ "\n Ориентация ПОРТРЕТ.")
                 (setq orient "_P"))
                 ((>= dx dy) (princ "\n Ориентация ПЕЙЗАЖ.")
                 (setq orient "_L"))
                 ) ; cond
            (initget 7)
            (setq m (getint "\n Число столбцов форматок вдоль оси X: "))
            (initget 128 "Точки")
            (setq stx (getreal "\n Шаг по оси X в единицах рисунка с учетом знака или 2 точки [Точки] <Точки>: "))
                      (if (or (= stx nil) (= stx "Точки"))
                      (progn
                      (setq stx1 (getpoint "\n Укажите первую точку с учетом направления шага по X: "))
                      (setq stx2 (getpoint stx1 "\Укажите вторую точку для шага по X: "))
                      (cond
                      ((> (car stx2) (car stx1)) (setq stx (distance stx1 stx2)))
                      ((< (car stx2) (car stx1)) (setq stx (- 0 (distance stx1 stx2))))) ; cond
                      )) ; progn if
            (initget 7)
            (setq n (getint "\n Число рядов форматок вдоль оси Y: "))
            (initget 128 "Точки")
            (setq sty (getreal "\n Шаг по оси Y в единицах рисунка с учетом знака или 2 точки [Точки] <Точки>: "))
                      (if (or (= sty nil) (= sty "Точки"))
                      (progn
                      (setq sty1 (getpoint "\n Укажите первую точку с учетом направления шага по Y: "))
                      (setq sty2 (getpoint sty1 "\Укажите вторую точку для шага по Y: "))
                      (cond
                      ((> (cadr sty2) (cadr sty1)) (setq sty (distance sty1 sty2)))
                      ((< (cadr sty2) (cadr sty1)) (setq sty (- 0 (distance sty1 sty2))))) ; cond
                      )) ; progn if
            (setq pt2 (list (+ (car pt1) dx) (+ (cadr pt1) dy)))  ;Правый верхний угол первой рамки
            (setq dx1 0 dy1 0)
            (repeat n
                (repeat m
                        (setq pt11 (list (+ (car pt1) dx1) (+ (cadr pt1) dy1)))
                        (setq dx1 (+ dx1 stx))
                        (setq ptx (cons pt11 ptx))
                ) ; repeat
                (setq dx1 0 dy1 (+ dy1 sty))
            ) ; repeat
            (setq ptx (reverse ptx))
            (setq dx1 0 dy1 0)
            (repeat n
                (repeat m
                        (setq pt22 (list (+ (car pt2) dx1) (+ (cadr pt2) dy1)))
                        (setq dx1 (+ dx1 stx))
                        (setq pty (cons pt22 pty))
                ) ; repeat
                (setq dx1 0 dy1 (+ dy1 sty))
            ) ; repeat
            (setq pty (reverse pty))
            (if ver
                (progn
                (initget 6 "Принтер PDF")
                (setq plt_pdf (getstring "\n Печать на [Принтер/PDF встроенный] <Принтер>: "))
                (if (= plt_pdf "") (setq plt_pdf "П"))
                (initget 5)
                (if (= plt_pdf "PDF") (setq k0 (getint "\n Начальный номер файла: ")))
            )) ; progn if
            (setq k 0)
            (repeat (* m n)
            (if (and ver (= plt_pdf "PDF"))
                     (command "_PLOT" "_Y" "" "" "" "" orient "_N" "_W" (nth k ptx) (nth k pty) scl "" "_Y" ""
                     "_Y" "_A"
                     (strcat (getvar "DWGPREFIX") (vl-filename-base (getvar "DWGNAME")) "_0" (itoa (+ k0 k)) ".pdf")
                    "_Y"  "_Y")
            (command "_PLOT" "_Y" "" "" "" "" orient "_N" "_W" (nth k ptx) (nth k pty) scl "" "_Y" ""
                     "_Y" "_A" "_N" "_Y" "_Y")
            ) ; if
            (setq k (1+ k))
            ) ; repeat
            ) ; progn
         ) ; if pt1
       ) ; prog kak
   ) ; if kak
   (if (= kak "В")
       (progn
       (setq flag T)
       (while flag
       (setq pt1 (getpoint "\n Укажите левый нижний угол рамки (ENTER-Хватит): "))
                 (if pt1
                 (progn
                 (setq ptx (cons pt1 ptx))
                 (setq pt2 (getcorner pt1 "\n Укажите правый верхний угол рамки: "))
                 (setq pty (cons pt2 pty))
                 (setq dx (- (car pt2) (car pt1)))
                 (setq dy (- (cadr pt2) (cadr pt1)))
                 (princ "\n Размеры области печати: ") (princ dx) (princ " x ") (princ dy)
                 (cond
                 ((> dy dx) (princ "\ Ориентация ПОРТРЕТ.")
                 (setq orient "_P"))
                 ((>= dx dy) (princ "\ Ориентация ПЕЙЗАЖ.")
                 (setq orient "_L"))
                 ) ; cond
                 ) ; progn if
                 (setq flag nil)
                 ) ; if
       ) ; while
       (if (and ptx pty)
           (progn
           (setq ptx (reverse ptx))
           (setq pty (reverse pty))
           (if ver
               (progn
               (initget 6 "Принтер PDF")
               (setq plt_pdf (getstring "\n Печать на [Принтер/PDF встроенный] <Принтер>: "))
               (if (= plt_pdf "") (setq plt_pdf "П"))
               (initget 5)
               (if (= plt_pdf "PDF") (setq k0 (getint "\n Начальный номер файла: ")))
           )) ; progn if
           (initget 6)
           (setq scl (getstring "\n Масштаб печати (знаменатель дроби) <1>: "))
           (if (= scl "") (setq scl "1"))
           (initget "Да Нет _Yes No")
           (setq dn (getkword "\n Задать опцию 'Вписать'? [Да/Нет] <Нет>: "))
           (if (= dn "Y") (setq scl "_fit")  (setq scl (strcat "1:" scl)))
           (setq n (length ptx))
           (setq k 0)
           (repeat n
           (if (and ver (= plt_pdf "PDF"))
                     (command "_PLOT" "_Y" "" "" "" "" orient "_N" "_W" (nth k ptx) (nth k pty) scl "" "_Y" ""
                     "_Y" "_A"
                     (strcat (getvar "DWGPREFIX") (vl-filename-base (getvar "DWGNAME")) "_0" (itoa (+ k0 k)) ".pdf")
                    "_Y"  "_Y")
           (command "_PLOT" "_Y" "" "" "" "" orient "_N" "_W" (nth k ptx) (nth k pty) scl "" "_Y" ""
                     "_Y" "_A" "_N" "_Y" "_Y")
           ) ; if
           (setq k (1+ k))
           ) ; repeat
           ) ; progn
       ) ; if
       ) ; progn
   ) ; if
)
((= kak "О") (princ "\n Печать отменена."))
) ; cond
(setvar "CMDECHO" echo)
(princ)
)

Если код программы будет сохранен в файле model_plot_2007.lsp, то макрос для кнопки или
пункта меню может иметь вид:

^C^C^P(if (not C:MODEL_PLOT_2007)(load "model_plot_2007")) MODEL_PLOT_2007

Рекомендации по использованию программы в AutoCAD 2007.
Если предполагается печатать форматки на встроенный в AutoCAD 2007 принтер PDF ("DWG To PDF.pc3"), то желательно в его настройках создать пользовательские форматы с нулевыми полями. Тогда можно будет обходиться без опции "Вписать" ("Fit"). Правда, у меня почему-то форматка в PDF сдвигается вправо и вверх. Пришлось в настройках печати установить смещение от начала (Plot offset) для А4 на -1 мм по X и на -3 мм по оси Y.
Центрировать не надо, вписывать не надо. Область печати — рамка (Window).
Не забыть задать стиль печати.
Параметры печати необходимо установить в диспетчере параметров листов ("Page Setup Manager"). Поскольку в программе многие параметры принимаются "по умолчанию", то при смене области печати необходимо установить новые параметры для печати. Это относится к тому случаю, если в одном файле находятся форматки разного размера.
При выводе на встроенный принтер PDF файлы создаются в той же папке, в которой
находится файл DWG, причем нумерация по порядку присутствует в имени файла.
Программа должна работать и версиях 2004-2006.
Еще рекомендации.
Для каждого рисунка DWG обязательно надо задать несколько наборов параметров листа.
Меню "Файл->Диспетчер параметров листов..." ("File->Page Setup Manager..."). По умолчанию там в списке всего одна строка: *Модель* (*Model*). Так вот, здесь надо сделать несколько наборов. Количество их зависит от количества форматок разного размера в рисунке и способа вывода (на печать или в PDF). Например, для проверки работы программы в AutoCAD 2007 я с помощью кнопки "Создать..." ("New...") подготовил два набора с именами: "Epson C62 Портрет" и "PDF А4 Портрет". У каждого из этих наборов свои настройки печати. Если бы у меня в рисунке находились бы еще форматки А3, то пришлось бы еще создать 2 набора, допустим, "HP DeskJet 1700 А3 Портрет" и "PDF А3 Портрет". А если бы еще присутствовали форматки с ориентацией "Пейзаж" ("Landscape"), то соответственно, пришлось бы еще создавать подобные наборы параметров со своими именами. Но когда наборы созданы, любой из них можно сделать текущим и запускать программу распечатки с ответами на запросы программы, соответствующими текущим папаметрам печати. В принципе, как я подозреваю, можно таким образом послать по очереди из одного рисунка пачками форматки разного размера. Конечно, "одного взмаха руки" тут не получится, но все же... Наборы параметров листов сохраняются в рисунке. Возможно, это и недостаток, потому что при передаче файлов другим пользователям может оказаться так, что у них нет соответствующих принтеров. Но это уже другая проблема.
Добавил в программу запрос на начальный номер файла при выводе его в PDF. Это относится к AutoCAD 2007. При использовании внешних конверторов эта возможность отключена. Проблема нумерации файлов там остается. Возможно, что-то там можно сделать в настройках драйверов этих конверторов. Например, в конвертере "Amyuni PDF Converter" можно задать папку для файлов вывода и предусмотреть добавление номера ID к имени файла. Полной автоматизации печати не будет, но зато вместо задания имени файла достаточно будет только нажимать "Enter".

Re: LISP. Печать массива форматок или выборочно из одного файла в пространстве модели.

> Владимир Громов
И все таки осталась та закавыка о которой я ранее писал. Если не затруднит, посмотрите протокол диалога распечатки горизонтально расположенной форматки А3 на две вертикальных форматки А4. Может быть я где- то ошибаюсь.

Command: (if (not C:MODEL_PLOT) (load "MODEL_PLOT")) nil
Command: MODEL_PLOT
 Как будем печатать? [Массив/Выборочно/Отказ] <Массив>:
 Укажите левый нижний угол рамки (ENTER-Отказ):
 Масштаб печати (знаменатель дроби) <1>:
 Размер форматки по оси X (мм): 210
 Размер форматки по оси Y (мм): 297
 Задать опцию 'Вписать'? [Да/Нет] <Нет>: да
 Ориентация ПОРТРЕТ.
 Число столбцов форматок вдоль оси X: 2
 Шаг по оси X в единицах рисунка с учетом знака или 2 точки [Точки] <Точки>:
 Укажите первую точку с учетом направления шага по X: Укажите вторую точку для
шага по X: _mid of
 Число рядов форматок вдоль оси Y: 1
 Шаг по оси Y в единицах рисунка с учетом знака или 2 точки [Точки] <Точки>:
 Укажите первую точку с учетом направления шага по Y: Укажите вторую точку для
шага по Y: Effective plotting area:  35.00 wide by 292.00 high
Plotting viewport 2.
Effective plotting area:  5.00 wide by 292.00 high
Plotting viewport 2.

Re: LISP. Печать массива форматок или выборочно из одного файла в пространстве модели.

> Screw
Так если число рядов по вертикали равно 1, то зачем задавать шаг по оси Y? Он ведь равен нулю. В программе предполагается, что форматки составляют регулярный прямоугольный массив. Может у вас одна форматка сдвинута по отношению к другой вдоль оси Y? Если это так, то тогда надо использовать опцию "Выборочно", а не "Массив".
И еще. Я ведь не вижу и не знаю, что у вас задано в параметрах рисунка, какой конвертер PDF вы используете и каковы его настройки. Область печати 35 и 5 настораживает.
И еще. "Левый нижний угол рамки" у меня - это именно левый нижний угол рамки ФОРМАТКИ в рисунке, а не произвольной рамки выбора объектов. А вы что указывали?
И еще. Лучше бы вы привели здесь протокол с шагами, заданными численно, а не точками, воспроизвести ведь нельзя.

Re: LISP. Печать массива форматок или выборочно из одного файла в пространстве модели.

> Владимир Громов
Хорошо. Сейчас так сделаю.

Re: LISP. Печать массива форматок или выборочно из одного файла в пространстве модели.

> Владимир Громов
То же самое и шагами, когда я задаю их вводом числа. Относительно указания количества рядов по Y. Я указываю один (1), т.к. по другому не получается. Пробел с Enter или 0 не вводится. И самое интересное, что это в одном файле. В других файлах программа отрабатывает нормально.

Re: LISP. Печать массива форматок или выборочно из одного файла в пространстве модели.

> Screw
Так ведь я написал не про количество рядов, равное нулю, а про шаг по оси Y. Это он равен нулю при количестве рядов равному 1. И про численные значения - это чтобы вы сюда протокол переправили.
Может, у вас не мировая система координат в этом рисунке?

Re: LISP. Печать массива форматок или выборочно из одного файла в пространстве модели.

> Владимир Громов
Ставил величину шага по Y равным 0 и 297. И по двум точкам. Одинаковый результат. Вот протокол:

Command: (if (not C:MODEL_PLOT) (load "MODEL_PLOT")) nil
Command: MODEL_PLOT
 Как будем печатать? [Массив/Выборочно/Отказ] <Массив>:
 Укажите левый нижний угол рамки (ENTER-Отказ):
 Масштаб печати (знаменатель дроби) <1>:
 Размер форматки по оси X (мм): 210
 Размер форматки по оси Y (мм): 297
 Задать опцию 'Вписать'? [Да/Нет] <Нет>: да
 Ориентация ПОРТРЕТ.
 Число столбцов форматок вдоль оси X: 3
 Шаг по оси X в единицах рисунка с учетом знака или 2 точки [Точки] <Точки>: 210
 Число рядов форматок вдоль оси Y: 1
 Шаг по оси Y в единицах рисунка с учетом знака или 2 точки [Точки] <Точки>: 0
Effective plotting area:  35.00 wide by 292.00 high
Plotting viewport 2.
**Plotting area truncated to maximum**
Effective plotting area:  209.91 wide by 292.00 high
Plotting viewport 2.
Effective plotting area:  5.00 wide by 292.00 high
Plotting viewport 2.

Re: LISP. Печать массива форматок или выборочно из одного файла в пространстве модели.

> Владимир Громов
Перепробовал все манипуляции с WCS. Никакого результата. Кстати, напомните команду обнуления WCS, которой Вы пользуетесь. Если не затруднит. Может я чего не так делаю.

Re: LISP. Печать массива форматок или выборочно из одного файла в пространстве модели.

> Screw
Что я могу посоветовать?
1. Распечатать одну форматку из этого файла обычным способом.
2. Распечатать ту же форматку с помощью программы, размещенной здесь. Это окончательный вариант, с ней я делал больше всего опытов. Причем, задать опцию "Выборочно".
3. Послать, если можно, ко мне в ящик "больной" файл.
И посмотрим.

Re: LISP. Печать массива форматок или выборочно из одного файла в пространстве модели.

> Владимир Громов
Мое молчание становится уже не очень вежливым по отношению к автору. Но сказать мне нечего. Программой работаю уже два дня. В смысле, работаю уже по настоящему. Все нормально. Кроме, того "странного" файла. Надеюсь, случай это единичный. Единствено, что хотелось бы- это чуть- чуть улучшить сервис. А именно: Можно ли что- бы размеры форматки 210х297 были по умолчанию? А то вводить их каждый раз утомительно. И еще там субьективного кое что по мелочи.

Re: LISP. Печать массива форматок или выборочно из одного файла в пространстве модели.

> Screwy
Я не могу понять, что у вас происходит с тем файлом. Если вы получили мое послание, то увидели, что печать в PDF у меня прошла хорошо.
В отношении программы. Поскольку других заинтересованных субъектов в этой теме не наблюдается, то я могу урезать свою универсальную программу под ваши пожелания. Тогда давайте все ваши пожелания.

Re: LISP. Печать массива форматок или выборочно из одного файла в пространстве модели.

> Владимир Громов
Забудем об этом файле. Экзотических просьб у меня нет. Я тоже хочу, что бы программа была максимум универсальна. Значит, первая просьба- это "Можно ли что- бы размеры форматки 210х297 были по умолчанию?". Не исключая возможность, конечно, ввода и других величин. И еще. Нельзя ли перед началом диалога осуществить проверку на наличие имеющегося стиля. Это для забывчивых пользователей. К примеру, таких как я :) Пока, вроде все. Но, так как, программа у меня уже в "работе", может и еще что то появиться. Надеюсь, Вас это не будет э-э-э ...нервировать. Спасибо.

Re: LISP. Печать массива форматок или выборочно из одного файла в пространстве модели.

> Screwy
Про какой стиль идет речь?

Re: LISP. Печать массива форматок или выборочно из одного файла в пространстве модели.

> Владимир Громов
Те стили (конфигурации), которые пользователь настраивает для печати. Те, которые высвечиваются в выпадающем списке "Printer/Plotter".

Re: LISP. Печать массива форматок или выборочно из одного файла в пространстве модели.

> Владимир Громов
Те, о которых Вы пишите в REM программы, как "...Желательно создать пользовательские форматы ...".

Re: LISP. Печать массива форматок или выборочно из одного файла в пространстве модели.

> Владимир Громов
И еще. Если для меня, то включить "Fit to paper" по умолчанию.

Re: LISP. Печать массива форматок или выборочно из одного файла в пространстве модели.

Мой совет...
Лучше запоминать все настройки, через SETENV в реестре, чтоб потом их подставлять по умолчанию, при каждой печати их обновлять.
Получится просто и универсально, на любой вкус...

Re: LISP. Печать массива форматок или выборочно из одного файла в пространстве модели.

> Screw
К сожалению, список Printer/plotter я не смогу вывести на экран, только как опцию "?" команды "_PLOT" уже при ее выполнении, а это нежелательно. Можно в принципе вывести на экран список наборов параметров Page setup при условии, что этим наборам присвоены имена в Page Setup Manager. Только это связано с усложнением программы - необходимостью выборки элементов из словарей рисунка. К тому же сами эти наборы в команде "_PLOT" никак не фигурируют, только в диалоговом окне "Plot". Можно просто вставить запрос типа: "Праметры печати настроены?". Если да - то дальше, если нет, то выход или запуск Page Setup Manager.
Посмотрите еще в программе, записанной выше, какие запросы могут быть для вас излишними.

Re: LISP. Печать массива форматок или выборочно из одного файла в пространстве модели.

> Владимир Громов
Относительно списка Printer/plotter понятно. Да это не принципиально. Всего лишь своего рода лекарство от забывчивости. Если, это связано с усложнением программы, то лучше не трогать. А в остальном все нормально.

Re: LISP. Печать массива форматок или выборочно из одного файла в пространстве модели.

; ********************** print_a4.lsp *********************************************************
;   Упрощенный вариант программы распечатки регулярного массива одинаковых
;   форматок из одного рисунка пространства модели.
;   Может использоваться для распечатки рисунков большого формата на
;   принтерах А4.
;   Размер печатаемой области принят 210х297 мм (ориентация - "Портрет")
;   Принтер и параметры печати должны быть заранее настроены в Windows
;   и в AutoCAD'е (Page Setup Manager - Диспетчер параметров листов).
;   Желательно создать пользовательские форматы с нулевыми полями.
;   Шаг столбцов или рядов можно задать как численно, так и указанием 2 точек.
;   Шаги могут задаваться со знаком минус (-). Соответственно, и точки надо
;   задавать против направления осей.
;   Если задать шаги равными нулю, а количество форматок не равным нулю,
;   то распечатается количество копий одной форматки, равное размеру массива
;   форматок.
;   Масштаб принят 1:1.
;   Автор Владимир Громов.
;
(defun C:PRINT_A4 ( / ver echo pt1 scl dx dy dn m n stx stx1 stx2 sty sty1 sty2 pt2
                        dx1 dy1 pt11 ptx pt22 pty k plt_pdf k0)
(if (vl-string-search "17.0" (getvar "ACADVER"))
    (progn (setq ver "a17") (princ "\n Обнаружен AutoCAD 2007."))
)
(setq echo (getvar "CMDECHO"))
(setvar "CMDECHO" 0)
(if (assoc 3 (dictsearch (namedobjdict) "ACAD_PLOTSETTINGS"))
    (progn
         (initget 6)
         (setq pt1 (getpoint "\n Укажите левый нижний угол рамки (ENTER-Отказ): "))
         (if pt1
            (progn
            (setq dx 210)
            (setq dy 297)
            (initget "Да Нет _Yes No")
            (setq dn (getkword "\n Задать опцию 'Вписать'? [Да/Нет] <Да>: "))
            (if (or (= dn "") (= dn "Y")) (setq scl "_fit")
                (setq scl "")
            ) ; if
            (initget 7)
            (setq m (getint "\n Число столбцов форматок вдоль оси X: "))
            (initget 128 "Точки")
            (setq stx (getreal "\n Шаг по оси X в единицах рисунка с учетом знака или 2 точки [Точки] <Точки>: "))
                      (if (or (= stx nil) (= stx "Точки"))
                      (progn
                      (setq stx1 (getpoint "\n Укажите первую точку с учетом направления шага по X: "))
                      (setq stx2 (getpoint stx1 "\Укажите вторую точку для шага по X: "))
                      (cond
                      ((> (car stx2) (car stx1)) (setq stx (distance stx1 stx2)))
                      ((< (car stx2) (car stx1)) (setq stx (- 0 (distance stx1 stx2))))) ; cond
                      )) ; progn if
            (initget 7)
            (setq n (getint "\n Число рядов форматок вдоль оси Y: "))
            (initget 128 "Точки")
            (setq sty (getreal "\n Шаг по оси Y в единицах рисунка с учетом знака или 2 точки [Точки] <Точки>: "))
                      (if (or (= sty nil) (= sty "Точки"))
                      (progn
                      (setq sty1 (getpoint "\n Укажите первую точку с учетом направления шага по Y: "))
                      (setq sty2 (getpoint sty1 "\Укажите вторую точку для шага по Y: "))
                      (cond
                      ((> (cadr sty2) (cadr sty1)) (setq sty (distance sty1 sty2)))
                      ((< (cadr sty2) (cadr sty1)) (setq sty (- 0 (distance sty1 sty2))))) ; cond
                      )) ; progn if
            (setq pt2 (list (+ (car pt1) dx) (+ (cadr pt1) dy)))  ;Правый верхний угол первой рамки
            (setq dx1 0 dy1 0)
            (repeat n
                (repeat m
                        (setq pt11 (list (+ (car pt1) dx1) (+ (cadr pt1) dy1)))
                        (setq dx1 (+ dx1 stx))
                        (setq ptx (cons pt11 ptx))
                ) ; repeat
                (setq dx1 0 dy1 (+ dy1 sty))
            ) ; repeat
            (setq ptx (reverse ptx))
            (setq dx1 0 dy1 0)
            (repeat n
                (repeat m
                        (setq pt22 (list (+ (car pt2) dx1) (+ (cadr pt2) dy1)))
                        (setq dx1 (+ dx1 stx))
                        (setq pty (cons pt22 pty))
                ) ; repeat
                (setq dx1 0 dy1 (+ dy1 sty))
            ) ; repeat
            (setq pty (reverse pty))
            (if ver
                (progn
                (initget 6 "Принтер PDF")
                (setq plt_pdf (getstring "\n Печать на [Принтер/PDF встроенный] <Принтер>: "))
                (if (= plt_pdf "") (setq plt_pdf "П"))
                (initget 5)
                (if (= plt_pdf "PDF") (setq k0 (getint "\n Начальный номер файла: ")))
            )) ; progn if
            (setq k 0)
            (repeat (* m n)
            (if (and ver (= plt_pdf "PDF"))
                     (command "_PLOT" "_Y" "" "" "" "" "_P" "_N" "_W" (nth k ptx) (nth k pty) scl "" "_Y" ""
                     "_Y" "_A"
                     (strcat (getvar "DWGPREFIX") (vl-filename-base (getvar "DWGNAME")) "_0" (itoa (+ k0 k)) ".pdf")
                    "_Y"  "_Y")
            (command "_PLOT" "_Y" "" "" "" "" "_P" "_N" "_W" (nth k ptx) (nth k pty) scl "" "_Y" ""
                     "_Y" "_A" "_N" "_Y" "_Y")
            ) ; if
            (setq k (1+ k))
            ) ; repeat
            ) ; progn
         ) ; if pt1
   ) ; progn
   (progn
   (princ "\n Не определены именованные наборы параметров листа.")
   (alert "\n Не определены именованные наборы параметров листа.")
   (command "_pagesetup")
   ) ; progn
) ; if
(setvar "CMDECHO" echo)
(princ)
)

Re: LISP. Печать массива форматок или выборочно из одного файла в пространстве модели.

> Владимир Громов
Что- то не получается. При запуске программы выскакивает сообщение "Не определены именованные наборы параметров листа." Если это предварительные настройки печати, то они в этом чертеже заведомо присутствуют.

Re: LISP. Печать массива форматок или выборочно из одного файла в пространстве модели.

> Screw
Так и задумано. Это сообщение выскакивает в том случае, если в списке "Page setups" диалогового окна "Page Setup Manager" присутсвует всего одна строка: *Model*. Надо создать новый набор параметров (кнопка "New...") со своим именем, например, PDF_A4, настроить его, как надо, сделать текущим (кнопка "Set Current") и сохранить рисунок. Вот тогда вы будете уверены в том, что ваш рисунок подготовлен для вывода на конкретное устройство. Кстати, имя этого набора будет отображено и в диалоге "Plot" (поле "Page Setup").

Re: LISP. Печать массива форматок или выборочно из одного файла в пространстве модели.

> Владимир Громов
Ну ладно. Пусть будет. Правда до этого я как то обходился без этого. А вот с размерами форматки не согласен. Все таки лучше наверное было бы сделать так: размеры форматки 210х297 были по умолчанию. Не исключая возможность, конечно, ввода и других величин. Т.е. как в предыдущей версии. Но примерно так :

Размер форматки по оси X (мм)<210>:
Размер форматки по оси Y (мм)<297>:

А в остальном все нормально.

Re: LISP. Печать массива форматок или выборочно из одного файла в пространстве модели.

С заданием размеров форматок.

; ********************** print_a4.lsp *********************************************************
;   Упрощенный вариант программы распечатки регулярного массива одинаковых
;   форматок из одного рисунка пространства модели.
;   Может использоваться для распечатки рисунков большого формата на
;   принтерах А4.
;   Принтер и параметры печати должны быть заранее настроены в Windows
;   и в AutoCAD'е (Page Setup Manager — Диспетчер параметров листов).
;   Желательно создать пользовательские форматы с нулевыми полями.
;   Шаг столбцов или рядов можно задать как численно, так и указанием 2 точек.
;   Шаги могут задаваться со знаком минус (-). Соответственно, и точки надо
;   задавать против направления осей.
;   Если задать шаги равными нулю, а количество форматок не равным нулю,
;   то распечатается количество копий одной форматки, равное размеру массива
;   форматок.
;   Масштаб принят 1:1.
;   Автор Владимир Громов.
;
(defun C:PRINT_A4 ( / ver echo pt1 scl dx dy dn m n stx stx1 stx2 sty sty1 sty2 pt2
                        dx1 dy1 pt11 ptx pt22 pty k plt_pdf k0)
(if (vl-string-search "17.0" (getvar "ACADVER"))
    (progn (setq ver "a17") (princ "\n Обнаружен AutoCAD 2007."))
)
(setq echo (getvar "CMDECHO"))
(setvar "CMDECHO" 0)
(if (assoc 3 (dictsearch (namedobjdict) "ACAD_PLOTSETTINGS"))
    (progn
         (initget 6)
         (setq pt1 (getpoint "\n Укажите левый нижний угол рамки (ENTER-Отказ): "))
         (if pt1
            (progn
            (initget 6)
            (setq dx (getreal "\n Размер форматки по оси X (мм) <210>: "))
            (if (= dx nil) (setq dx 210))
            (initget 6)
            (setq dy (getreal "\n Размер форматки по оси Y (мм) <297>: "))
            (if (= dy nil) (setq dy 297))
            (initget "Да Нет _Yes No")
            (setq dn (getkword "\n Задать опцию 'Вписать'? [Да/Нет] <Да>: "))
            (if (or (= dn "") (= dn "Y")) (setq scl "_fit") (setq scl "1:1")
            ) ; if
            (initget 7)
            (setq m (getint "\n Число столбцов форматок вдоль оси X: "))
            (initget 128 "Точки")
            (setq stx (getreal "\n Шаг по оси X в единицах рисунка с учетом знака или 2 точки [Точки] <Точки>: "))
                      (if (or (= stx nil) (= stx "Точки"))
                      (progn
                      (setq stx1 (getpoint "\n Укажите первую точку с учетом направления шага по X: "))
                      (setq stx2 (getpoint stx1 "\Укажите вторую точку для шага по X: "))
                      (cond
                      ((> (car stx2) (car stx1)) (setq stx (distance stx1 stx2)))
                      ((< (car stx2) (car stx1)) (setq stx (- 0 (distance stx1 stx2))))) ; cond
                      )) ; progn if
            (initget 7)
            (setq n (getint "\n Число рядов форматок вдоль оси Y: "))
            (initget 128 "Точки")
            (setq sty (getreal "\n Шаг по оси Y в единицах рисунка с учетом знака или 2 точки [Точки] <Точки>: "))
                      (if (or (= sty nil) (= sty "Точки"))
                      (progn
                      (setq sty1 (getpoint "\n Укажите первую точку с учетом направления шага по Y: "))
                      (setq sty2 (getpoint sty1 "\Укажите вторую точку для шага по Y: "))
                      (cond
                      ((> (cadr sty2) (cadr sty1)) (setq sty (distance sty1 sty2)))
                      ((< (cadr sty2) (cadr sty1)) (setq sty (- 0 (distance sty1 sty2))))) ; cond
                      )) ; progn if
            (setq pt2 (list (+ (car pt1) dx) (+ (cadr pt1) dy)))  ;Правый верхний угол первой рамки
            (setq dx1 0 dy1 0)
            (repeat n
                (repeat m
                        (setq pt11 (list (+ (car pt1) dx1) (+ (cadr pt1) dy1)))
                        (setq dx1 (+ dx1 stx))
                        (setq ptx (cons pt11 ptx))
                ) ; repeat
                (setq dx1 0 dy1 (+ dy1 sty))
            ) ; repeat
            (setq ptx (reverse ptx))
            (setq dx1 0 dy1 0)
            (repeat n
                (repeat m
                        (setq pt22 (list (+ (car pt2) dx1) (+ (cadr pt2) dy1)))
                        (setq dx1 (+ dx1 stx))
                        (setq pty (cons pt22 pty))
                ) ; repeat
                (setq dx1 0 dy1 (+ dy1 sty))
            ) ; repeat
            (setq pty (reverse pty))
            (if ver
                (progn
                (initget 6 "Принтер PDF")
                (setq plt_pdf (getstring "\n Печать на [Принтер/PDF встроенный] <Принтер>: "))
                (if (= plt_pdf "") (setq plt_pdf "П"))
                (initget 5)
                (if (= plt_pdf "PDF") (setq k0 (getint "\n Начальный номер файла: ")))
            )) ; progn if
            (setq k 0)
            (repeat (* m n)
            (if (and ver (= plt_pdf "PDF"))
                     (command "_PLOT" "_Y" "" "" "" "" "_P" "_N" "_W" (nth k ptx) (nth k pty) scl "" "_Y" ""
                     "_Y" "_A"
                     (strcat (getvar "DWGPREFIX") (vl-filename-base (getvar "DWGNAME")) "_0" (itoa (+ k0 k)) ".pdf")
                    "_Y"  "_Y")
            (command "_PLOT" "_Y" "" "" "" "" "_P" "_N" "_W" (nth k ptx) (nth k pty) scl "" "_Y" ""
                     "_Y" "_A" "_N" "_Y" "_Y")
            ) ; if
            (setq k (1+ k))
            ) ; repeat
            ) ; progn
         ) ; if pt1
   ) ; progn
   (progn
   (princ "\n Не определены именованные наборы параметров листа.")
   (alert "\n Не определены именованные наборы параметров листа.")
   (command "_pagesetup")
   ) ; progn
) ; if
(setvar "CMDECHO" echo)
(princ)
)

Re: LISP. Печать массива форматок или выборочно из одного файла в пространстве модели.

> Владимир Громов
Вот. Сейчас все нормально. Большое спасибо.