Печать при помощи API nanoCAD

image-loader.svg

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

Этой статьей мы запускаем цикл статей, посвященный API печати nanoCAD, в котором будут ответы на традиционные вопросы начинающих САПР-программистов. Начнем с того, что разберемся, как программно отправить чертеж на печать.

Для отправки чертежа на печать создадим приложение на платформе .NET (C#).

Для создания приложения будет использован .NET API nanoCAD, а для печати — ActiveX. Фактически, это три библиотеки: hostmgd.dll, hostdbmgd.dll (.NET API) и ncauto.dll (ActiveX). Библиотеки доступны в директории установки nanoCAD.

В качестве среды разработки подойдет Visual Studio версии, поддерживающей .NET Framework 4.0 и выше.

image-loader.svg

Для отправки чертежа на печать через пользовательский интерфейс nanoCAD необходимо вызвать диалоговое окно «Печать» через меню или командой PLOT в консоли, настроить параметры печати и нажать кнопку «Печать».

image-loader.svg

Для отправки чертежа nanoCAD на печать программно используются методы nanoCAD.InanoCADPlot.PlotToDevice() в случае, когда документ нужно напечатать на бумаге и nanoCAD.InanoCADPlot.PlotToFile(), когда документ нужно напечатать в файл.

Рассмотрим последовательность действий, которую нужно выполнить, чтобы отправить документ на печать через API nanoCAD:

Шаг 1. Создаем в Visual Studio проект типа «Библиотека классов (.NET Stadard)». Подключаем к нему библиотеки hostmgd.dll, hostdbmgd.dll и ncauto.dll. Здесь и далее подразумевается, что вы используете Visual Studio 2019.

Шаг 2. Создаем класс, в котором будет находиться метод, отправляющий документ nanoCAD на печать.

public partial class Commands
{
    [Teigha.Runtime.CommandMethod("PlotDocument")]
    public void PrintDocument()
    {
    }
}

В последующих шагах будет инструкция по реализации метода PrintDocument ().

Шаг 3. Получаем доступ к документу nanoCAD и его настройкам:

// Получение ссылки на активный документ
HostMgd.ApplicationServices.Document doc = 
  HostMgd.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
nanoCAD.Document comDoc = doc.AcadDocument as nanoCAD.Document;

Здесь происходит симбиоз тех библиотек, о которых упоминалось выше: с помощью библиотеки hostmdg.dll получаем доступ к активному документу nanoCAD (переменная doc), далее, чтобы получить доступ к тем настройкам, которые нам нужны, запрашиваем из переменной doc COM-документ nanoCAD.

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

Шаг 4. При помощи свойства Plot документа nanoCAD получаем COM-объект Plot, содержащий методы печати.

// Получение ссылки на свойство Plot активного документа
nanoCAD.Plot plot = (nanoCAD.Plot)comDoc.Plot;

Шаг 5. Выбираем принтер и меняем настройки листов для печати.

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

За принтер отвечает свойство ConfigName листа документа. Каждому листу можно назначить свой принтер. Для доступа к листам документа используем коллекцию Layouts документа nanoCAD. Путем перебора коллекции можно изменить настройки каждого листа (назначить всем листам принтер и изменить пользовательские настройки принтера, если был выбран встроенный принтер nanoCAD):

// Назначение принтера всем листам документа.
foreach (OdaX.IAcadLayout layout in comDoc.Layouts)
{
    layout.ConfigName = "Встроенный PDF-принтер";
    nanoCAD.InanoCADPlotCustomParams customPlotSettings = 
      plot.CustomPlotSettings[layout];

    // Изменяем путь сохранения напечатанного документа
    customPlotSettings.UseDWGPath = false;
    customPlotSettings.FileFolder = "C:\\PlotToDeviceExample";

    // Изменяем шаблон имени файла, в который будет напечатан документ
    customPlotSettings.UsePredefinedNames = true;
    customPlotSettings.FileMask = "_";
            
    // Передаем измененные пользовательские настройки в лист
    plot.CustomPlotSettings[layout] = customPlotSettings;
}

Здесь свойство UseDWGPath указывает, сохранять напечатанный документ в той же директории, где расположен документ (значение true) или использовать для сохранения директорию, указанную в свойстве FileFolder (значение false). При указании директории необходимо убедиться, что она существует, иначе будет ошибка печати.

Свойство UsePredefinedNames указывает, использовать шаблон имени файла, определенный в свойстве FileMask (значение true), или открывать диалоговое окно сохранения файла (значение false).

Для шаблонов имен файлов существует набор символов, которые будут интерпретироваться как автозаполняемые поля, в которые будут подставляться соответствующие свойства документа или значения:

  •  — имя документа;

  •  — имя листа;

  •  — имя пользователя;

  •  — время;

  •  — дата;

  •  — счетчик 1. Счетчик добавляет индекс к названию файлов, начиная с 1;

  •  — счетчик 01. Счетчик добавляет индекс к названию файлов, начиная с 01;

  •  — счетчик 001. Счетчик добавляет индекс к названию файлов, начиная с 001;

  •  — счетчик 0001. Счетчик добавляет индекс к названию файлов, начиная с 0001;

  •  — счетчик 00001. Счетчик добавляет индекс к названию файла, начиная с 00001;

  •  — счетчик 000001. Счетчик добавляет индекс к названию файла, начиная с 000001.

Шаг 6. Определяем перечень листов документа, которые будут отправлены на печать для метода SetLayoutsToPlot(). Если не использовать этот метод, на печать будет отправлен активный лист:

// Создание массива имен листов, предназначенных для печати
string[] layoutsToPlot = new string[] { 
comDoc.Layouts.Item(1).Name, comDoc.Layouts.Item(2).Name };

// Вызов метода nanoCAD.InanoCADPlot.SetLayoutsToPlot()
plot.SetLayoutsToPlot(layoutsToPlot);

Листы, назначенные для печати этим методом, хранятся в памяти до первого вызова метода печати. После этого необходимо заново вызывать метод SetLayoutsToPlot() перед следующей отправкой документа на печать.

Шаг 7. Отправляем документ на печать. В случае встроенных принтеров, в частности, pdf-принтера, для печати можно использовать как метод PlotToDevice(), так и PlotToFile(). Каждый из методов сработает по-своему при выборе директории сохранения напечатанного файла и его имени. Если использовать метод PlotToDevice(), то будут применены пользовательские настройки принтера (customPlotSettings). Если использовать метод PlotToFile(), то шаблон имени файла и директория сохранения будут взяты из его параметра при вызове:

// Печать назначенных листов
// В этом случае будет создано два pdf-файла в директории C:\PlotToDeviceExample
// с именами по шаблону "Название документа_Название листа".pdf
plot.PlotToDevice();

// Для наглядности также печать в файл
// После выполнения метода PlotToDevice() назначенные для печати листы
// будут сброшены. Методом PlotToFile() будет напечатан активный лист документа
// и назван по шаблону "myplot_Имя документа_Имя листа".pdf
plot.PlotToFile("C:\\PlotToFileExample\\myplot__");

Метод nanoCAD.InanoCADPlot.PlotToDevice() при печати на pdf-принтере использует пользовательские настройки листов, которые назначены для печати, т.е. путь сохранения «C:\PlotToDeviceExample» и в качестве шаблона имени будет применен шаблон «Имя документа_Имя листа.pdf» (»_»).

Метод nanoCAD.InanoCADPlot.PlotToFile() при печати использует в качестве пути сохранения и имени файла данные своего параметра plotFile даже если в пользовательских настройках указан путь и шаблон имени файла.

Параметр plotFile может иметь следующие значения:

  1. Пустая строка: plot.PlotToFile("") . Тогда файл будет сохранен в папке документа nanoCAD, который отправляется на печать и назван так же, как сам документ, но с расширением, соответствующим принтеру, которым печатался документ, в нашем случае .pdf.

  2. Только имя файла: plot.PlotToFile("myplot__") . Тогда файл будет сохранен с заданным именем в папку документа, который отправляется на печать.

  3. Только адрес директории сохранения файла: plot.PlotToFile("C:\\PlotToFileExample") . Файл будет сохранен в указанную директорию и назван так же, как документ-исходник с расширением, соответствующим принтеру, на котором печатался.

  4. Адрес директории и шаблон имени файла: plot.PlotToFile("C:\\PlotToFileExample\\myplot__") . В этом случае документ будет сохранен в указанной директории и с указанным именем файла.

При указании в параметре plotFile адреса директории, необходимо убедиться, что она существует.

Далее приведены все рассмотренные шаги в виде команды «PlotDocument», которая устанавливает всем листам документа встроенный pdf-принтер, меняет пользовательские настройки всех листов документа. Методом nanoCAD.InanoCADPlot.SetLayoutsToPlot() устанавливает два листа документа для печати и печатает эти листы методом nanoCAD.InanoCADPlot.PlotToDevice(), затем для наглядности вызывается метод nanoCAD.InanoCADPlot.PlotToFile().

public partial class Commands
{
    [Teigha.Runtime.CommandMethod("PlotDocument")]
    public void PrintDocument()
    {
        // Получение ссылки на активный документ
        HostMgd.ApplicationServices.Document doc = 
          HostMgd.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
        nanoCAD.Document comDoc = doc.AcadDocument as nanoCAD.Document;

        // Получение ссылки на редактор активного документа
        HostMgd.EditorInput.Editor ed = doc.Editor;

        // Получение ссылки на активный лист документа
        OdaX.AcadLayout activeLayout = comDoc.ActiveLayout;

        // Получение ссылки на свойство Plot активного документа
        nanoCAD.Plot plot = (nanoCAD.Plot)comDoc.Plot;

        // Назначение принтера всем листам документа.
        foreach (OdaX.IAcadLayout layout in comDoc.Layouts)
        {
            layout.ConfigName = "Встроенный PDF-принтер";
            nanoCAD.InanoCADPlotCustomParams customPlotSettings = 
              plot.CustomPlotSettings[layout];

            // Изменяем путь сохранения напечатанного в файл документа
            customPlotSettings.UseDWGPath = false;
            customPlotSettings.FileFolder = "C:\\PlotToDeviceExample";

            // Изменяем шаблон имени файла, в который будет напечатан документ
            customPlotSettings.UsePredefinedNames = true;
            customPlotSettings.FileMask = "_";
            
            // Передаем измененные пользовательские настройки в лист
            plot.CustomPlotSettings[layout] = customPlotSettings;
        }

        // Назначение активному листу области печати "Границы", если это пространство модели
        // или "Лист", если активный лист не является пространством модели
        if (activeLayout.ModelType)
            comDoc.ActiveLayout.PlotType = OdaX.AcPlotType.acExtents;
        else comDoc.ActiveLayout.PlotType = OdaX.AcPlotType.acLayout;

        // Включение режима "Вписать"
        comDoc.ActiveLayout.StandardScale = OdaX.AcPlotScale.acScaleToFit;

        // Создание массива имен листов, предназначенных для печати
        string[] layoutsToPlot = new string[] { comDoc.Layouts.Item(1).Name, comDoc.Layouts.Item(2).Name };

        // Вызов метода nanoCAD.InanoCADPlot.SetLayoutsToPlot()
        plot.SetLayoutsToPlot(layoutsToPlot);

        // Сообщение пользователю
        ed.WriteMessage("Листы {0} и {1} были установлены для печати", layoutsToPlot[0],layoutsToPlot[1]);

        // Печать назначенных листов
        // В этом случае будет создано два pdf-файла в директории C:\PlotToDeviceExample
        // с именами по шаблону "Название документа_Название листа".pdf
        plot.PlotToDevice();

        // Для наглядности также печать в файл
        // После выполнения метода PlotToDevice() назначенные для печати листы
        // будут сброшены. Методом PlotToFile() будет напечатан активный лист документа
        // и назван по шаблону "myplot_Имя документа_Имя листа".pdf
        plot.PlotToFile("C:\\PlotToFileExample\\myplot__");
    }
}

Шаг 8. Компилируем наше приложение и загружаем полученный файл dll в nanoCAD.

Если открыть новый документ nanoCAD и запустить в нем команду "PlotDocument", то в результате будет создано три файла. Результат работы команды приведен на рисунке ниже.

Сообщения команды Сообщения команды «PlotDocument» в консоли nanoCAD

Было напечатано два листа, назначенных методом nanoCAD.InanoCADPlot.SetLayoutsToPlot() для печати, и при повторном вызове метода печати был напечатан один активный лист.

Итак, мы разобрались с применением методов PlotToDevice(), PlotToFile() и SetLayoutsToPlot(), а также попутно были затронуты методы настройки параметров печати через API nanoCAD. В следующих статьях более подробно рассмотрим, как настраивать параметры печати листов документа nanoCAD через API.

© Habrahabr.ru