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 gosta ai

Trabalhando mais rápido utilizando Express Tools

Se você não está usando o AutoCAD Express Tools, está perdendo tempo. O Express Tools é uma coleção de pequenas ferramentas de aprimoramento de produtividade que são instaladas com o AutoCAD. Eles são criadas usando as APIs do AutoCAD, como o AutoLISP, e, portanto, não estão disponíveis no AutoCAD LT também (aquela versão baratinha do AutoCAD). Aqui algumas possibilidades do Express Tools Nossa jornada começa com a barra de menus do estilo antigo. Ative-o com o comando MENUBAR e no estado 1. Clique em Express no lado direito e ele será expandido para mostrar mais de 10 categorias de ferramentas. Ainda fui mais longe e nos submenus consegui contar mais de 60 outros comandos. Ferramentas para blocos Existe dentro do Express Tools ferramentas específicas para blocos. vamos a algumas: Copy Nernest Objects - com essa ferramente você pode copiar objetos de dentro de um bloco para fora sem precisar explodir o bloco. Export Atribute Information - Você pode ain