Друк креслень – відповідальний та трудомісткий процес. Креслення, надруковане в неправильному масштабі або з неправильною товщиною ліній, може стати причиною виробничих помилок, оскільки буде неправильно прочитано. На налаштування параметрів друку і сам друк часом витрачається чимала частина робочого часу, тому багато проектувальників, знайомих із програмуванням, звертаються до програмного інтерфейсу САПР і отримують хорошу можливість зменшити вплив «людського фактора», а також скоротити час, який доводиться витрачати на роботу з кресленнями . Цією статтею ми запускаємо цикл матеріалів, присвячений API друку nanoCAD, в якому запропонуємо відповіді на традиційні питання САПР-програмістів-початківців. Почнемо з того, що розберемося, як програмно відправити креслення на друк. Для надсилання креслення на друк створимо програму на платформі .NET (C#). Для створення програми буде використано .NET API nanoCAD, а для друку – ActiveX. Фактично це три бібліотеки: hostmgd.dll, hostdbmgd.dll (.NET API) та ncauto.dll (ActiveX). Бібліотеки доступні у директорії установки nanoCAD. Як середовище розробки підійде Visual Studio версії, що підтримуватиме .NET Framework 4.0 і вище. Для надсилання креслення на друк через інтерфейс користувача nanoCAD необхідно викликати діалогове вікно Друк через меню або командою PLOT у консолі, налаштувати параметри друку та натиснути кнопку Друк. Для надсилання креслення 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 на друк. Наступні кроки містять інструкцію з реалізації методу PrintDocument(). Крок 3
Отримуємо доступ до документа nanoCAD та його налаштувань: Тут відбувається симбіоз бібліотек, про які згадувалося вище: за допомогою бібліотеки hostmdg.dll отримуємо доступ до активного документа nanoCAD (змінна doc); Далі, щоб отримати доступ до тих параметрів, які нам потрібні, запитуємо зі змінної doc COM-документ nanoCAD. Надалі налаштування друку ми будемо отримувати, звертаючись до властивостей та методів змінної comDoc. Крок 4.
За допомогою властивості Plot документа nanoCAD отримуємо COM-об'єкт Plotмістить методи друку. Крок 5.
Вибираємо принтер та змінюємо налаштування аркушів для друку. У попередніх кроках було здійснено підготовчі дії, тепер ми переходимо до налаштування параметрів друку. За принтер відповідає властивість ConfigName аркуша документа. Кожному аркушу можна призначити свій принтер. Для доступу до аркушів документа використовуємо колекцію Layouts документа nanoCAD. Перебираючи колекцію, можна змінити налаштування кожного аркуша (призначити всім аркушам принтер і змінити налаштування принтера, якщо був обраний вбудований принтер nanoCAD): Крок 6
Визначаємо перелік аркушів документа, які будуть надіслані на друк для методу SetLayoutsToPlot(). Якщо не використовувати цей метод, на друк буде відправлено активний лист: Листи, призначені для друку цим методом, зберігаються у пам'яті до першого виклику методу друку. Після цього необхідно знову викликати метод SetLayoutsToPlot() перед наступною відправкою документа на друк. Крок 7.
Надсилаємо документ на друк. У разі вбудованих принтерів, зокрема pdf-принтера, для друку можна використовувати метод PlotToDevice() , так і PlotToFile() . Кожен із методів спрацює по-своєму при виборі директорії збереження надрукованого файлу та його імені. Якщо використовувати метод PlotToDevice() , будуть застосовані налаштування принтера ( customPlotSettings ). Якщо використовувати метод PlotToFile() , шаблон імені файлу та директорія збереження будуть взяті з його параметра під час виклику: Метод nanoCAD.InanoCADPlot.PlotToDevice() при друкуванні на pdf-принтері використовує налаштування аркушів, які призначені для друку, тобто. шлях збереження C:\PlotToDeviceExample, а як шаблон імені буде застосований шаблон «Ім'я документа_Ім'я листа.pdf» («_»). Метод nanoCAD.InanoCADPlot.PlotToFile() під час друку використовує як шлях збереження та імені файлу дані свого параметра plotFile навіть якщо в налаштуваннях користувача вказано шлях і шаблон імені файлу. Параметр plotFile може мати такі значення: При вказівці в параметрі plotFile адреси директорії необхідно переконатися, що вона існує. Далі всі розглянуті кроки наведені у вигляді команди PlotDocument, яка встановлює всім аркушам документа вбудований PDF-принтер. Змінює їх налаштування користувача. Методом nanoCAD.InanoCADPlot.SetLayoutsToPlot() встановлює два аркуші документа для друку і друкує ці аркуші методом nanoCAD.InanoCADPlot.PlotToDevice() , потім для наочності викликається метод nanoCAD.InanoCADPlot.PlotToFile() . Крок 8
Компілюємо нашу програму і завантажуємо отриманий dll-файл в nanoCAD. Якщо відкрити новий документ nanoCAD і запустити в ньому команду PlotDocument, то в результаті буде створено три файли. Результат роботи команди наведено нижче. Повідомлення команди PlotDocument у консолі nanoCAD Було надруковано два аркуші, призначені методом nanoCAD.InanoCADPlot.SetLayoutsToPlot() для друку, і при повторному виклику методу друку надруковано один активний аркуш. Отже, ми розібралися із застосуванням методів PlotToDevice() , PlotToFile() і SetLayoutsToPlot() , попутно торкнувшись методів налаштування параметрів друку через API nanoCAD . У наступних статтях детальніше розглянемо налаштування параметрів друку аркушів документа nanoCAD через API. Світлана Мирончик, У nanoCAD при налаштуванні параметрів друку необхідно вибрати область друку. Якщо залишити стандартне налаштування, може бути надруковано зовсім не те, що потрібно. У цій статті ми розберемося, як працювати з областю друку через API nanoCAD. Мал. 1 Щоб вибрати область друку через інтерфейс nanoCAD, слід викликати вікно Параметри аркуша, або Друк. У цьому вікні є блок Область друку, де доступний список, що випадає, з якого можна вибрати потрібний тип області друку (мал. 1). Налаштування області друку через інтерфейс користувача nanoCAD у просторі моделі У разі роботи з API nanoCAD за налаштування області друку відповідає властивість PlotType документа nanoCAD. Щоб розібратися, як працювати з областями друку через API nanoCAD, створимо .NET (C#) - програму, яка встановлює активному аркушу обрану користувачем область друку. Розглянемо поетапно, як створити таку програму. Крок 1
Створюємо у Visual Studio проект
типу "Бібліотека класів (.NET Stadard)". Підключаємо до нього бібліотеки hostmgd.dll, hostdbmgd.dll та ncauto.dll. Крок 2
Створюємо клас, в якому буде знаходитись метод, що встановлює активному аркушу обрану користувачем область друку. Наступні кроки містять інструкцію з реалізації методу SetPlotAreaToActiveLayout() . Крок 3
Отримуємо доступ до документа nanoCAD та його налаштувань: Через редактор документа будемо вести діалог із користувачем: запитувати у нього дані та отримувати його відповіді. Через посилання на активний лист будемо отримувати його поточні налаштування та змінювати їх. Крок 4. Формуємо повідомлення користувача, що запрошує, для вибору області друку. При формуванні запиту краще додати до нього ключові слова, щоб у користувача була підказка, яка дає зрозуміти, який формат відповіді буде прийнято та оброблено програмою. У нашому випадку ключовими словами запиту є назви областей друку: Спочатку визначаємо основний текст повідомлення, що запрошує, потім додаємо до повідомлення ключові слова: Сформоване нами повідомлення користувачеві в новому документі без збережених іменованих видів у аркуші виглядатиме так, як показано на рис. 2: У просторі моделі замість ключового слова "Лист" буде інше - "Ліміти". Крок 5. Опрацювання відповіді користувача. Тепер користувач повинен вибрати одне із ключових слів, а програмі потрібно опрацювати його відповідь. Для початку слід перевірити, чи збігається введена користувачем відповідь з одним із ключових слів запиту. Якщо так, то продовжуємо обробку, якщо ні – завершуємо роботу програми, залишивши налаштування друку активного листа без змін: Щоб змінити область друку активного аркуша, необхідно зіставити назву області друку із запиту користувачеві зі значенням із переліку OdaX.AcPlotType . Для цього створюємо словник, у кожному запису якого буде пара значень: ключове слово із запиту та відповідне йому значення переліку OdaX.AcPlotType. Далі, використовуючи цей словник, ми зможемо легко знаходити потрібне значення OdaX.AcPlotType за відповіддю користувача. При обробці відповіді користувача також варто врахувати, що є два типи області друку, для яких потрібні додаткові дані – це acView («Вид») і acWindow («Рамка»). Для області друку «Вид» потрібно вказати назву іменованого вигляду, а області друку «Рамка» – вказати дві точки області печати.Тобто, якщо користувач вибрав один із цих двох типів області друку, програма повинна зробити більше, ніж просто змінити значення властивості PlotType. У фрагменті коду, наведеному в цьому кроці, є порожній оператор switch, який був доданий саме для цих двох областей друку: Таку обробку необхідно виконати саме до зміни значення властивості PlotType, інакше наша програма не спрацює, як треба. Крок 5.1. Обробка ключового слова "Вид". Якщо користувач вибрав тип області друку "Вид", необхідно сформувати ще один запит, в результаті якого користувач вибере, який саме іменований вид буде використаний. Для того, щоб користувач вибрав іменований вигляд, додаємо в ключові слова другого запиту назви іменованих видів активного аркуша, які зберігаються в колекції namedViews. Далі потрібно опрацювати відповідь користувача. Вибраний ним названий вид призначаємо якості ViewToPlot активного аркуша. І лише після цього змінюємо значення властивості PlotType на acView. Крок 5.2. Обробка ключового слова "Рамка". Якщо користувач вибрав область друку «Рамка», необхідно запитати дві точки цієї прямокутної області друку: лівий нижній і правий верхній кути. У нашу програму координати точок, зазначених користувачем, будуть передані WCS (World Coordinate System). Для того, щоб область друку правильно відобразилася на екрані, координати цих точок повинні бути переведені в DCS (Display Coordinate System). Далі передаємо перетворені координати точок у метод SetWindowToPlot() , який перетворює координати двох точок у прямокутну область друку. Після всіх цих дій змінюємо значення властивості PlotType на acWindow. Крок 6. Компілюємо нашу програму, завантажуємо в nanoCAD і запускаємо. Текст програми повністю Після запуску команди SetPlotArea користувач побачить запит щодо вибору типу області друку, далі все залежить від вибору користувача. Якщо вибрано «Рамку», необхідно вказати лівий нижній та правий верхній кути прямокутної області друку. Після того, як користувач вказав дві точки, створюється область друку – методом SetWindowToPlot(), а в консоль nanoCAD виводиться повідомлення про успішне виконання команди (рис. 3). Через інтерфейс nanoCAD призначену область друку можна побачити, викликавши вікно Параметри аркуша. Область буде позначена у просторі креслення червоною пунктирною лінією (рис. 4). При повторному запуску команди SetPlotArea та виборі типу області друку «Рамка», призначена вперше область друку буде замінена на нову. Якщо активний аркуш має іменовані види, користувач може вибрати тип області друку «Вид». Після цього команда запитає, який саме названий вид призначити (рис. 5). Ролик, що демонструє завантаження dll-файлу в nanoCAD та використання команди SetPlotArea Отже, у цій статті ми докладно розібрали кроки, необхідні для створення .NET-додатку, що працює з областями друку документа nanoCAD. У програмі було створено фільтр доступних для вибору областей друку, який враховує тип активного аркуша та його поточні налаштування. Також був детально представлений алгоритм роботи з областями друку «Рамка» та «Вид», складнішими з точки зору використання через API nanoCAD, ніж інші області друку. У наступній статті докладніше розглянемо зміну розширених опцій друку через API nanoCAD. Світлана Мирончик, Друк за допомогою API nanoCAD
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;// Отримання посилання властивість 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; >
// Створення масиву імен аркушів, призначених для друку string[] layoutsToPlot = new string[] < comDoc.Layouts.Item(1).Name, comDoc.Layouts.Item(2).Name >; // Виклик методу nanoCAD.InanoCADPlot.SetLayoutsToPlot() plot.SetLayoutsToPlot(layoutsToPlot);// Друк призначених аркушів // У цьому випадку буде створено два pdf-файли в директорії C:\PlotToDeviceExample // з іменами за шаблоном "Назва документа_Назва аркуша".pdf plot.PlotToDevice(); // Для наочності також друк файлу // Після виконання методу PlotToDevice() призначені для друку аркуші // будуть скинуті. Методом PlotToFile() буде надруковано активний аркуш документа // і названий за шаблоном "myplot_Ім'я документа_Ім'я аркуша".pdf plot.PlotToFile("C:\PlotToFileExample\myplot__");
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]; false;customPlotSettings.FileFolder = "C:\PlotToDeviceExample"; // Змінюємо шаблон імені файлу, в який буде надрукований документ customPlotSettings. 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[] < com. (1). comDoc.Layouts.Item(2).Name >; // Виклик методу nanoCAD.InanoCADPlot.SetLayoutsToPlot() plot.SetLayoutsToPlot(layoutsToPlot); ], layoutsToPlot[1]); // Друк призначених аркушів // У цьому випадку буде створено два pdf-файли в директорії C:\PlotToDeviceExample // з іменами за шаблоном "Назва документа_Назва аркуша".pdf plot.PlotToDevice(); / Після виконання методу PlotToDevice() призначені для друку аркуші // будуть скинуті. активний аркуш документа // і названий шаблоном "myplot_Ім'я документа_Ім'я аркуша".pdf plot.PlotToFile("C:\PlotToFileExample\myplot__");
Клуб розробників nanoCAD
ТОВ «Нанософт розробка»Настроювання області друку через API nanoCAD
public partial class Commands < [Teigha.Runtime.CommandMethod("SetPlotArea")] public void SetPlotAreaToActiveLayout() < >>// Отримання посилання активний документ 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;
// Запрошення для вибору області друку HostMgd.EditorInput.PromptStringOptions promptOptions = new HostMgd.EditorInput.PromptStringOptions("Виберіть область друку"); // Запис до ключових слів запрошує повідомлення найменувань доступних типів // областей друку, які і у просторі моделі, й у листах promptOptions.Keywords.Add("Экран"); promptOptions.Keywords.Add("Межі"); promptOptions.Keywords.Add("Рамка"); // Для області друку "Вид" створюємо колекцію, // в яку будемо записувати назви іменованих видів активного листа System.Collections.Generic.List namedViews = New System.Collections.Generic.List(); // Тип області друку "Вид" доступний тільки, // якщо активний лист має збережені іменовані види if (comDoc.Views.Count != 0) < // Якщо колекція Views не порожня, шукаємо в ній іменовані види // активного листа foreach (OdaX.AcadView namedView in comDoc.Views) < // Якщо знайдений іменований вид для активного аркуша, // додаємо назва цього виду в колекцію namedViews if (namedView.LayoutId == activeLayout.ObjectID) namedViews.Add(namedView.Name); >// Якщо в результаті колекція namedViews не порожня // то додаємо до запиту ключове слово "Вид" if (namedViews.Count != 0) promptOptions.Keywords.Add("Вид"); > // Додавання до запиту ключових слів залежно від типу активного аркуша if (activeLayout.ModelType) promptOptions.Keywords.Add("Ліміти"); else promptOptions.Keywords.Add("Лист"); // Запит користувача з пропозицією вибрати область друку HostMgd.EditorInput.PromptResult result = ed.GetString(promptOptions);
// Обробка отриманого результату запиту if (result.Status == HostMgd.EditorInput.PromptStatus.Keyword) < switch (result.StringResult) < >// Складання словника для зіставлення назв // типів областей друку в перерахунку OdaX.AcPlotType та в інтерфейсі System.Collections.Generic.Dictionary dictionary = новий System.Collections.Generic.Dictionary(); dictionary.Add("Екран", OdaX.AcPlotType.acDisplay); dictionary.Add("Кордони", OdaX.AcPlotType.acExtents); dictionary.Add("Лист", OdaX.AcPlotType.acLayout); dictionary.Add("Ліміти", OdaX.AcPlotType.acLimits); dictionary.Add("Вигляд", OdaX.AcPlotType.acView); dictionary.Add("Рамка", OdaX.AcPlotType.acWindow); // Пошук у словнику вибраного типу області друку // та запис знайденого значення змінну ptResult OdaX.AcPlotType ptResult; dictionary.TryGetValue(result.StringResult, out ptResult); // Призначення вибраної області друку активним аркушем activeLayout.PlotType = ptResult; ed.WriteMessage("Листу '' призначена область друку ''", activeLayout.Name, result.StringResult); > else ed.WriteMessage("Область друку не змінена");switch (result.StringResult)
case "Вид": < // Запрошує повідомлення для вибору іменованого вигляду HostMgd.EditorInput.PromptStringOptions opts = new HostMgd.EditorInput.PromptStringOptions("Виберіть іменований вигляд"); // Запис назв іменованих видів активного аркуша // ключові слова запиту namedViews.ForEach(nv =>opts.Keywords.Add(nv)); // Запит користувача з пропозицією вибрати іменований вигляд HostMgd.EditorInput.PromptResult res = ed.GetString(opts); // Обробка отриманого результату запиту if (res.Status == HostMgd.EditorInput.PromptStatus.Keyword) activeLayout.ViewToPlot = res.StringResult; break; >case "Рамка": < // Запит точки лівого нижнього кута області друку var point1 = ed.GetPoint("Вкажіть ліву нижню точку області друку:"); if (point1.Status == HostMgd.EditorInput.PromptStatus.OK) < // Виведення в консоль координат обраної точки ed.WriteMessage("(;)", point1.Value.X, point1.Value.Y); // Запит точки правого верхнього кута області друку var point2 = ed.GetCorner("Вкажіть праву верхню точку області друку:", point1.Value); if(point2.Status== HostMgd.EditorInput.PromptStatus.OK) < // Виведення в консоль координат обраної точки ed.WriteMessage("(;)", point2.Value.X, point2.Value.Y); // Очищення колекції PlotAreas nanoCAD.InanoCADPlot plot = (nanoCAD.InanoCADPlot)comDoc.Plot; nanoCAD.InanoCADPlotCustomParams param = plot.CustomPlotSettings[activeLayout]; if (param.PlotAreas.Count != 0) < // Додавання області друку "Рамка" методом SetWindowToPlot() // відбувається правильно тільки якщо колекція PlotAreas порожня param.PlotAreas.Clear(); plot.CustomPlotSettings[activeLayout] = param; >// Отримання поточного типу Teigha.DatabaseServices.ViewTableRecord curView = ed.GetCurrentView(); // Отримання матриці перетворення з WCS DCS Teigha.Geometry.Matrix3d matrix; matrix = Teigha.Geometry.Matrix3d.PlaneToWorld(curView.ViewDirection); matrix = Teigha.Geometry.Matrix3d.Displacement( curView.Target - Teigha.Geometry.Point3d.Origin)* matrix; matrix = Teigha.Geometry.Matrix3d.Rotation(-curView.ViewTwist, curView.ViewDirection, curView.Target) * matrix; matrix = matrix.Inverse(); // Перетворення координат отриманих точок у DCS double[] ptMin = new double[] < point1.Value.TransformBy(matrix).X, point1.Value.TransformBy(matrix).Y >; double[] ptMax = новий double[] < point2.Value.TransformBy(matrix).X, point2.Value.TransformBy(matrix).Y >; // Додавання нової області друку "Рамка" методом SetWindowToPlot() activeLayout.SetWindowToPlot(ptMin, ptMax); > > else ed.WriteMessage("Cancel"); break; >public partial class Commands < [Teigha.Runtime.CommandMethod("SetPlotArea")] public void SetPlotAreaToActiveLayout() < // Отримання посилання на активний документ HostMgd.ApplicationServices.Document doc = HostMgd.ApplicationServices.Application.DocumentManager. nanoCAD.Document comDoc = doc.AcadDocument as nanoCAD.Document; // Отримання посилання редактор активного документа HostMgd.EditorInput.Editor ed = doc.Editor; // Отримання посилання на активний аркуш документа OdaX.AcadLayout activeLayout = comDoc.ActiveLayout; // Запрошення для вибору області друку HostMgd.EditorInput.PromptStringOptions promptOptions = new HostMgd.EditorInput.PromptStringOptions("Виберіть область друку"); // Запис до ключових слів запрошує повідомлення найменувань доступних // типів областей друку, які і у просторі моделі, й у листах promptOptions.Keywords.Add("Экран"); promptOptions.Keywords.Add("Межі"); promptOptions.Keywords.Add("Рамка"); // Для області друку "Вид" створюємо колекцію string, // в яку записуватимемо назви іменованих видів System.Collections.Generic.ListnamedViews = new System.Collections.Generic.List(); // Тип області друку "Вид" доступний тільки // якщо активний лист має збережені іменовані види if (comDoc.Views.Count != 0) < // Якщо колекція Views не порожня, шукаємо в ній іменовані види активного листа foreach (OdaX .AcadView namedView in comDoc.Views) < // Якщо знайдений іменований вид для активного аркуша, // додаємо назву цього виду в колекцію namedViews if (namedView.LayoutId == activeLayout.ObjectID) namedViews.Add(namedView.Name); >// Якщо в результаті колекція namedViews не порожня // додаємо до запиту ключове слово "Вид" if (namedViews.Count != 0) promptOptions.Keywords.Add("Вид"); > // Додавання до запиту ключових слів залежно від типу активного аркуша if (activeLayout.ModelType) promptOptions.Keywords.Add("Ліміти"); else promptOptions.Keywords.Add("Лист"); // Запиткористувачеві з пропозицією вибрати область друку HostMgd.EditorInput.PromptResult result = ed.GetString(promptOptions); // Обробка отриманого результату запиту if (result.Status == HostMgd.EditorInput.PromptStatus.Keyword) < // Складання словника для зіставлення назв типів областей друку у перерахунку OdaX.AcPlotType та в інтерфейсі System.Collections.Generic.Dictionarydictionary = System.Collections.Generic.Dictionary(); dictionary.Add("Екран", OdaX.AcPlotType.acDisplay); dictionary.Add("Кордони", OdaX.AcPlotType.acExtents); dictionary.Add("Лист", OdaX.AcPlotType.acLayout); dictionary.Add("Ліміти", OdaX.AcPlotType.acLimits); dictionary.Add("Вигляд", OdaX.AcPlotType.acView); dictionary.Add("Рамка", OdaX.AcPlotType.acWindow); switch (result.StringResult) < case "Вид": < // Запрошення для вибору іменованого вигляду HostMgd.EditorInput.PromptStringOptions opts = new HostMgd.EditorInput.PromptStringOptions("Виберіть іменований вигляд"); // Запис назв іменованих видів активного аркуша // ключові слова запиту namedViews.ForEach(nv =>opts.Keywords.Add(nv)); // Запит користувача з пропозицією вибрати іменований вигляд HostMgd.EditorInput.PromptResult res = ed.GetString(opts); // Обробка отриманого результату запиту if (res.Status == HostMgd.EditorInput.PromptStatus.Keyword) activeLayout.ViewToPlot = res.StringResult; break; > case "Рамка": < // Запит точки лівого нижнього кута області друку var point1 = ed.GetPoint("Вкажіть ліву нижню точку області друку:"); if (point1.Status == HostMgd.EditorInput.PromptStatus.OK) < //Виведення в консоль координат обраної точки ed.WriteMessage("(;)", point1.Value.X, point1.Value.Y); // Запит точки правого верхнього кута області друку var point2 = ed.GetCorner("Вкажіть праву верхню точку області друку:", point1.Value); // Обробка результату запиту if(point2.Status== HostMgd.EditorInput.PromptStatus.OK) < // Виведення в консоль координат вибраної точки ed.WriteMessage("(;)", point2.Value.X,point2.Value.Y); // Очищення колекції PlotAreas nanoCAD.InanoCADPlot plot = (nanoCAD.InanoCADPlot)comDoc.Plot; nanoCAD.InanoCADPlotCustomParams param = plot.CustomPlotSettings[activeLayout]; if (param.PlotAreas.Count != 0) < // Додавання області друку "Рамка" методом SetWindowToPlot() // відбувається правильно тільки якщо колекція PlotAreas порожня param.PlotAreas.Clear(); plot.CustomPlotSettings[activeLayout] = param; >// Отримання поточного типу Teigha.DatabaseServices.ViewTableRecord curView = ed.GetCurrentView(); // Отримання матриці перетворення з WCS DCS Teigha.Geometry.Matrix3d matrix; matrix = Teigha.Geometry.Matrix3d.PlaneToWorld(curView.ViewDirection); matrix = Teigha.Geometry.Matrix3d.Displacement(curView.Target - Teigha.Geometry.Point3d.Origin) * matrix; matrix = Teigha.Geometry.Matrix3d.Rotation(-curView.ViewTwist, curView.ViewDirection, curView.Target) * matrix; matrix = matrix.Inverse(); // Перетворення координат отриманих точок у DCS double[] ptMin = new double[] < point1.Value.TransformBy(matrix).X, point1.Value.TransformBy(matrix).Y >; double[] ptMax = новий double[] < point2.Value.TransformBy(matrix).X, point2.Value.TransformBy(matrix).Y >; // Додавання нової області друку "Рамка" методом SetWindowToPlot() activeLayout.SetWindowToPlot(ptMin, ptMax); > > else ed.WriteMessage("Cancel"); break; > > // Пошук у словнику вибраного типу області друку та запис // знайденого значення змінну ptResult OdaX.AcPlotType ptResult; dictionary.TryGetValue(result.StringResult, out ptResult); // Призначення вибраної області друку активним аркушем activeLayout.PlotType = ptResult; ed.WriteMessage("Листу '' призначена область друку ''", activeLayout.Name, result.StringResult); > else ed.WriteMessage("Область друку не змінена"); > >
Клуб розробників nanoCAD
ТОВ «Нанософт розробка»