09/02/2016
Захват изображения текущего документа AutoCAD с использованием .NET
Эта тема уже несколько раз поднималась в этом блоге, когда мы обсуждали систему 3D графики для захвата изображения и в серии сообщений про плагин месяца "Снимок Изображения" несколько лет назад. Я подумал, что следует её пересмотреть с учетом того, что я не использовал это API раньше.
Это API очень простое – Document.CapturePreviewImage() – и оно уже было описано в блоге AutoCAD DevBlog. Но я подумал, что неплохо бы дополнить его выбором выходного файла и сделать полноформатный снимок текущего документа в этот файл.
Ниже C#-реализация команды CPI, которая использует это API для сохранения изображения текущего документа точно такого размера, как окно документа, в файл.
Код - C#: [Выделить]
- using Autodesk.AutoCAD.ApplicationServices;
- using Autodesk.AutoCAD.EditorInput;
- using Autodesk.AutoCAD.Runtime;
- using System;
- using System.Drawing.Imaging;
- using System.IO;
- namespace ListApplications
- {
- public static class Extensions
- {
- // Возвращает формат файла на основе имени файла
- public static ImageFormat GetFormat(this string filename)
- {
- // Если формат файла не удаётся определить - создаём PNG-файл
- // (может привести к исключению)
- var imf = ImageFormat.Png;
- if (filename.Contains("."))
- {
- // Получаем расширение файла (то, что после последнего символа ".")
- string ext = filename.Substring(filename.LastIndexOf(".") + 1);
- // Получаем последние три символа расширения
- if (ext.Length > 3)
- ext = ext.Substring(0, 3);
- // Выбираем формат расширения (в нижнем регистре)
- switch (ext.ToLower())
- {
- case "bmp":
- imf = ImageFormat.Bmp;
- break;
- case "gif":
- imf = ImageFormat.Gif;
- break;
- case "jpg":
- imf = ImageFormat.Jpeg;
- break;
- case "tif":
- imf = ImageFormat.Tiff;
- break;
- case "wmf":
- imf = ImageFormat.Wmf;
- break;
- default:
- imf = ImageFormat.Png;
- break;
- }
- }
- return imf;
- }
- }
- public class Commands
- {
- [CommandMethod("CPI")]
- static public void CreatePreviewImage()
- {
- var doc = Application.DocumentManager.MdiActiveDocument;
- if (doc == null) return;
- var ed = doc.Editor;
- // Выбираем имя файла и тип файла для вывода изображения
- var pofo = new PromptSaveFileOptions("\nВыберите место для файла-изображения");
- pofo.Filter =
- "Bitmap (*.bmp)|*.bmp|GIF (*.gif)|*.gif|JPEG (*.jpg)|*.jpg|" +
- "PNG (*.png)|*.png|TIFF (*.tif)|*.tif";
- // Устанавливаем место по-умолчанию для сохранения изображения на основе текущего чертежа
- string fn = doc.Database.Filename;
- if (fn.Contains("."))
- {
- int extIdx = fn.LastIndexOf(".");
- if (fn.Substring(extIdx + 1) != "dwt" && fn.Contains("\\"))
- {
- pofo.InitialDirectory = Path.GetDirectoryName(doc.Database.Filename);
- }
- }
- var pfnr = ed.GetFileNameForSave(pofo);
- if (pfnr.Status != PromptStatus.OK)
- return;
- var outFile = pfnr.StringResult;
- // Получаем размер изображения документа в пикселях
- var size = doc.Window.DeviceIndependentSize;
- using (
- var bmp =
- doc.CapturePreviewImage(
- Convert.ToUInt32(size.Width), Convert.ToUInt32(size.Height)
- )
- )
- {
- // Сохраняем в файл в выбранном формате в зависимости от имени файла
- bmp.Save(outFile, outFile.GetFormat());
- }
- }
- }
- }
Пример вида документа:
Результат сохранения изображения в файл:
Источник: http://through-the-interface.typepad.com/through_the_interface/2016/02/capturing-an-image-of-the-current-autocad-document-using-net.html
Автор перевода: Александр Ривилис
Обсуждение: http://adn-cis.org/forum/index.php?topic=4258
Опубликовано 09.02.2016