A ideia desse pequeno código é facilitar a inserção de desenhos de AutoCAD em relatórios, uma prática comum em que faz projetos de engenharia.
Esse código usa a API - Document.CapturePreviewImage(). Com esse código pode ser feita uma captura em tamanho real da tela e convertido para um arquivo de imagem para salva-lo no disco.
O que geralmente faço é criar no paper space uma janela com fundo branco já no tamanho que eu quero e enquadrar a parte do desenho que quero exportar então daria para exportar sempre uma imagem no tamanho da tela e com resolução.
Aqui está a implementação em C# de um comando ExportarImg que usa a API para salvar uma imagem de "visualização" com o mesmo tamanho exato da janela do documento.
Aqui está um exemplo de desenho no qual executaremos o comando:
Esse código usa a API - Document.CapturePreviewImage(). Com esse código pode ser feita uma captura em tamanho real da tela e convertido para um arquivo de imagem para salva-lo no disco.
O que geralmente faço é criar no paper space uma janela com fundo branco já no tamanho que eu quero e enquadrar a parte do desenho que quero exportar então daria para exportar sempre uma imagem no tamanho da tela e com resolução.
Aqui está a implementação em C# de um comando ExportarImg que usa a API para salvar uma imagem de "visualização" com o mesmo tamanho exato da janela do documento.
using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.EditorInput; using Autodesk.AutoCAD.Runtime; using System; using System.Drawing.Imaging; using System.IO; using System.Windows; using System.Drawing; namespace AutoCAD.NET_Blog_Ex_2020_03_10 { public static class BlogClass1 { // Retorna o formato da imagem a ser usado para um nome de arquivo específico public static ImageFormat GetFormat(this string filename) { // Formato padrão é PNG que é mais compacto que o JPG e BMP. var imf = ImageFormat.Png; //Pega a extensão para o formato. if (filename.Contains(".")) { string extension = filename.Substring(filename.LastIndexOf(".") + 1); //Valid~ção if (extension.Length > 3) extension = extension.Substring(0, 3); switch (extension.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 BlogClassComandos { /// <summary> /// Cria uma prévisualização da imagem /// </summary> [CommandMethod("ExportaImgPreview")] static public void ExportaImgPreview() { Document doc = Application.DocumentManager.MdiActiveDocument; if (doc == null) return; Editor ed = doc.Editor; //Seleciona a imagem. PromptSaveFileOptions psfo = new PromptSaveFileOptions("\nSelecione o Local para salvar a Imagem: "); psfo.Filter = "Bitmap (*.bmp)|*.bmp|GIF (*.gif)|*.gif|JPEG (*.jpg)|*.jpg|" + "PNG (*.png)|*.png|TIFF (*.tif)|*.tif"; // Coloca o local para salvar a pasta do documento aberto. string fn = doc.Database.Filename; if (fn.Contains(".")) { int extIdx = fn.LastIndexOf("."); if (fn.Substring(extIdx + 1) != "dwt" && fn.Contains("\\")) { psfo.InitialDirectory = Path.GetDirectoryName(doc.Database.Filename); } } var pfnr = ed.GetFileNameForSave(psfo); if (pfnr.Status != PromptStatus.OK) return; var outFile = pfnr.StringResult; System.Windows.Size s = doc.Window.DeviceIndependentSize; Bitmap bmp = doc.CapturePreviewImage(Convert.ToUInt32(s.Width), Convert.ToUInt32(s.Height)); //Salva o arquivo bmp.Save(outFile, outFile.GetFormat()); } } }
Aqui está um exemplo de desenho no qual executaremos o comando:
Fico feliz em ver um brasileiro e em português postar conteúdo sobre a programação em AutoCAD .NET. Algo que o time de suporte da Autodesk do Brasil não fez até hoje.
ResponderExcluirEsse artigo me lembra do "Plugin of the Month" escrito em 2009 o qual tem um enfoque mais profissional.
As coisas se tornam mais interessantes quando os limites da imagem gerada é a partir de uma Polyline não retangular, com arcos ou melhor ainda a partir de uma Region a qual aceita substract. Esse tipo de abordagem é útil quando se quer ter apenas certas áreas da janela e não toda a área retangular.
E poderia ter a opção para gerar diretamente em pdf. Múltiplas polylines ou regions ( as quais definem as áreas a serem incluídas) poderia gerar múltiplas páginas num único arquivo em pdf ou em arquivos separados.
Ter uma pré-visualização da imagem ou do pdf na tela com possibilidade de ajustar os limites é outro recurso útil.
O programa "Paint.NET" para o Windows, que utilizo até hoje devido a sua versatilidade e facilidade de uso, é um bom exemplo.
Muito obrigado por postar.
Olá Gepaha, fiquei um tempo sem acessar o blog. Obrigado pelo comentário.
ExcluirTem essa opção do "Plugin of the Month" é mais profissional mesmo não tinha visto essa opção de faze-lo. Infelizmente estamos sempre fazendo tudo a "toque de caixa" então me foquei no primeiro artigo de resolver o problema.