Pular para o conteúdo principal

Capturando um desenho ativo na tela do AutoCAD usando .NET

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.


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:


Vídeo Demonstração:



Este artigo foi baseado no post do Kean Walmsley.

Código para Download.

Comentários

  1. 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.
    Esse 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.

    ResponderExcluir
    Respostas
    1. Olá Gepaha, fiquei um tempo sem acessar o blog. Obrigado pelo comentário.
      Tem 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.

      Excluir

Postar um comentário

Postagens mais visitadas deste blog

Numeração Automática no AutoCAD

Sem dúvida esse é uma ferramenta única que fazia falta a tempos e foi introduzida recentemente no AutoCAD, na última década… Em 2013 tinha feito um programa para criar uma bolinhas de numeração automática usando o conceito de Leader eu fazia um controle dos números dos itens na mão mesmo, depois de um tempo resolvi fazer um menuzinho para controlar o conteúdo do número dos bullets, hoje isso não é mais necessário, existe um comando no próprio AutoCAD para isso e faz parte das Ferramentas Expressas do AutoCAD. Gosto de compartilhar ferramentas e dicas que tendem a ser menos conhecidas ou subutilizadas, mas ainda podem fornecer um impulso para sua produtividade e fluxo de trabalho e que eu mesmo me surpreendi quando as encontrei Hoje, quero apresentar outra ferramenta, a numeração automática. Como o nome indica, o comando Numeração automática permite que você adicione automaticamente um número às etiquetas ou texto em um desenho. Vou mostrar como a numeração automática pode ser usada par...

Alterar a cor de fundo do AutoCAD

Eu sou um adepto do fundo preto, tudo que eu posso mudo a cor do fundo para preto. Nas ultimas versões do AutoCAD tenho notado que não é mais o padrão o fundo preto absoluto, é um cinza escuro. As vezes gosto também de mudar a cor do Layout de branco para preto afinal de contas quando trabalhamos com penas e contraste no model space preto, ver um desenho no layout é impossível.  Você pode mudar sua cor de fundo do AutoCAD para a cor que quiser. Definindo cores personalizadas Primeiro, vá para o menu Opções (botão Aplicativo> Opções), selecione a guia Exibição e clique no botão Cores. Agora você deve ver a caixa de diálogo Cores da janela de desenho: Agora você pode atualizar as cores de qualquer elemento da interface. Isso incluí o plano de fundo em qualquer contexto (selecione Model e Layout). Você pode escolher qualquer uma das predefinições, ou você pode escolher a partir de todo o espectro (basta escolher a opção Selecionar Cor ...). Se você não gost...

Unindo blocos em AutoCAD utilizando .NET

Hoje me deparai com uma necessidade de unir blocos com propriedades então resolvi fazer um comando para realizar esses procedimento. A principio esse procedimento não é tão complexo de ser executado individualmente mas por outro lado gostaria também de analisar um pouco melhor as possibilidades de se manipular blocos utilizando o AutoCAD. Abaixo o código que utilizei: using Autodesk.AutoCAD.ApplicationServices ; using Autodesk.AutoCAD.DatabaseServices ; using Autodesk.AutoCAD.EditorInput ; using Autodesk.AutoCAD.Runtime ; using System.Linq ; // This line is not mandatory, but improves loading performances [assembly: CommandClass(typeof(Merging_AutoCAD_blocks.Comandos))] namespace Merging_AutoCAD_blocks { public class Comandos { /// <summary> /// Uni dois ou mais blocos em um unico bloco. /// </summary> [CommandMethod("MERGBLKS")] public static void UnindoBlocos () {...