ADN Open CIS
Сообщество программистов Autodesk в СНГ

09/02/2016

Захват изображения текущего документа AutoCAD с использованием .NET

Эта тема уже несколько раз поднималась в этом блоге, когда мы обсуждали систему 3D графики для захвата изображения и в серии сообщений про плагин месяца "Снимок Изображения" несколько лет назад. Я подумал, что следует её пересмотреть с учетом того, что я не использовал это API раньше.

Это API очень простое – Document.CapturePreviewImage() – и оно уже было описано в блоге AutoCAD DevBlog. Но я подумал, что неплохо бы дополнить его выбором выходного файла и сделать полноформатный снимок текущего документа в этот файл.

Ниже C#-реализация команды CPI, которая использует это API для сохранения изображения текущего документа точно такого размера, как окно документа, в файл.

Код - C#: [Выделить]
  1. using Autodesk.AutoCAD.ApplicationServices;
  2. using Autodesk.AutoCAD.EditorInput;
  3. using Autodesk.AutoCAD.Runtime;
  4. using System;
  5. using System.Drawing.Imaging;
  6. using System.IO;
  7.  
  8. namespace ListApplications
  9. {
  10.   public static class Extensions
  11.   {
  12.     // Возвращает формат файла на основе имени файла
  13.     public static ImageFormat GetFormat(this string filename)
  14.     {
  15.       // Если формат файла не удаётся определить - создаём PNG-файл
  16.       // (может привести к исключению)
  17.       var imf = ImageFormat.Png;
  18.  
  19.       if (filename.Contains("."))
  20.       {
  21.         // Получаем расширение файла (то, что после последнего символа ".")
  22.         string ext = filename.Substring(filename.LastIndexOf(".") + 1);
  23.         // Получаем последние три символа расширения
  24.         if (ext.Length > 3)
  25.           ext = ext.Substring(0, 3);
  26.  
  27.         // Выбираем формат расширения (в нижнем регистре)
  28.         switch (ext.ToLower())
  29.         {
  30.           case "bmp":
  31.             imf = ImageFormat.Bmp;
  32.             break;
  33.  
  34.           case "gif":
  35.             imf = ImageFormat.Gif;
  36.             break;
  37.  
  38.           case "jpg":
  39.             imf = ImageFormat.Jpeg;
  40.             break;
  41.  
  42.           case "tif":
  43.             imf = ImageFormat.Tiff;
  44.             break;
  45.  
  46.           case "wmf":
  47.             imf = ImageFormat.Wmf;
  48.             break;
  49.  
  50.           default:
  51.             imf = ImageFormat.Png;
  52.             break;
  53.         }
  54.       }
  55.  
  56.       return imf;
  57.     }
  58.   }
  59.  
  60.   public class Commands
  61.   {
  62.     [CommandMethod("CPI")]
  63.     static public void CreatePreviewImage()
  64.     {
  65.       var doc = Application.DocumentManager.MdiActiveDocument;
  66.       if (doc == null) return;
  67.       var ed = doc.Editor;
  68.       // Выбираем имя файла и тип файла для вывода изображения
  69.  
  70.       var pofo = new PromptSaveFileOptions("\nВыберите место для файла-изображения");
  71.       pofo.Filter =
  72.         "Bitmap (*.bmp)|*.bmp|GIF (*.gif)|*.gif|JPEG (*.jpg)|*.jpg|" +
  73.         "PNG (*.png)|*.png|TIFF (*.tif)|*.tif";
  74.  
  75.       // Устанавливаем место по-умолчанию для сохранения изображения на основе текущего чертежа
  76.       string fn = doc.Database.Filename;
  77.  
  78.       if (fn.Contains("."))
  79.       {
  80.         int extIdx = fn.LastIndexOf(".");
  81.         if (fn.Substring(extIdx + 1) != "dwt" && fn.Contains("\\"))
  82.         {
  83.           pofo.InitialDirectory = Path.GetDirectoryName(doc.Database.Filename);
  84.         }
  85.       }
  86.  
  87.       var pfnr = ed.GetFileNameForSave(pofo);
  88.  
  89.       if (pfnr.Status != PromptStatus.OK)
  90.         return;
  91.  
  92.       var outFile = pfnr.StringResult;
  93.  
  94.       // Получаем размер изображения документа в пикселях
  95.  
  96.       var size = doc.Window.DeviceIndependentSize;
  97.  
  98.       using (
  99.         var bmp =
  100.           doc.CapturePreviewImage(
  101.             Convert.ToUInt32(size.Width), Convert.ToUInt32(size.Height)
  102.           )
  103.       )
  104.       {
  105.         // Сохраняем в файл в выбранном формате в зависимости от имени файла
  106.         bmp.Save(outFile, outFile.GetFormat());
  107.       }
  108.     }
  109.   }
  110. }

Пример вида документа:



Результат сохранения изображения в файл:



Источник: 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