Pular para o conteúdo principal

Finalmente por dentro das Variáveis de Ambiente do AutoCAD 2015!

A muito tempo, que já utiliza o AutoCAD .NET sabe o sufoco que é mudar uma variável de ambiente do AutoCAD.



Lembro que nos primeiros programas que fiz utilizando AutoCAD .NET utilizava muito isso para configurar a interface, as barras de ferramentas, abrir arquivos e carregar o próprio .NET em outras DLL's setando o "FILEDIA" para "0".

O problema está quando os comandos se sobrepõem porque o computador é muito lento e não executa qualquer um deles fazendo o AutoCAD ficar desconfigurado...

Mas é possível agora altear diretamente pelo código em .NET, nesse Post do Kean mostra como isso é feito no AutoCAD 2015.


 using Autodesk.AutoCAD.ApplicationServices;  
 using Autodesk.AutoCAD.ApplicationServices.Core;  
 using Autodesk.AutoCAD.EditorInput;  
 using Autodesk.AutoCAD.Geometry;  
 using Autodesk.AutoCAD.Runtime;  
 using System;  
 namespace SystemVariableEnumeration  
 {  
  public class Commands  
  {  
   [CommandMethod("ESV")]  
   public static void EnumerateSysVars()  
   {  
    var doc = Application.DocumentManager.MdiActiveDocument;  
    if (doc == null)  
     return;  
    var ed = doc.Editor;  
    // Use the existing SystemObjects iteration mechanism  
    foreach (var v in SystemObjects.Variables)  
    {  
     PrintVariable(ed, v);  
    }  
   }  
   [CommandMethod("ESV2")]  
   public static void EnumerateSysVars2()  
   {  
    var doc = Application.DocumentManager.MdiActiveDocument;  
    if (doc == null)  
     return;  
    var ed = doc.Editor;  
    // Use the new system variable enumerator  
    var sve = new SystemVariableEnumerator();  
    while (sve.MoveNext())  
    {  
     var v = sve.Current;  
     if (v != null)  
     {  
      PrintVariable(ed, v);  
     }  
    }  
   }  
   // Helper function to print out the information about  
   // a particular variable  
   private static void PrintVariable(Editor ed, Variable v)  
   {  
    var t = GetType(v.PrimaryType);  
    ed.WriteMessage(  
     "\n{0} ({1}, {2} - {3}): {4}",  
     v.Name,  
     t == null ? "null" : t.Name,  
     v.PrimaryType, v.SecondaryType, v.TypeFlags  
    );  
    if (v.Range != null)  
    {  
     ed.WriteMessage(  
      " [{0}...{1}]",  
      v.Range.LowerBound, v.Range.UpperBound  
     );  
    }  
   }  
   // Determine the type of a system variable based on  
   // the internal representation  
   private static System.Type GetType(short v)  
   {  
    Type ret = null;  
    switch (v)  
    {  
     case 1:  
     case 5001: // RTREAL real number  
      {  
       ret = typeof(Double);  
       break;  
      }  
     case 2:  
     case 5002: // RTPOINT: 2D point X and Y only  
      {  
       ret = typeof(Point2d);  
       break;  
      }  
     case 3:  
     case 5003: // RTSHORT: short integer  
      {  
       ret = typeof(Int16);  
       break;  
      }  
     case 4:  
     case 5004: // RTANG: angle  
      {  
       ret = null; // Angle  
       break;  
      }  
     case 5:  
     case 5005: // RTSTR: string  
      {  
       ret = typeof(String);  
       break;  
      }  
     case 6:  
     case 5006: // RTENAME: entity name  
      {  
       ret = null;  
       break;  
      }  
     case 7:  
     case 5007: // RTPICKS: pick set  
      {  
       ret = null;  
       break;  
      }  
     case 8:  
     case 5008: // RTORIENT: orientation  
      {  
       ret = null; // Orientation  
       break;  
      }  
     case 9:  
     case 5009: // RT3DPOINT: 3D point - X, Y and Z  
      {  
       ret = typeof(Point3d);  
       break;  
      }  
     case 10:  
     case 5010: // RTLONG: long integer  
      {  
       ret = typeof(Int32);  
       break;  
      }  
     case 11:  
     case 5011: // 2D extents of some kind  
      {  
       ret = typeof(Point2d);  
       break;  
      }  
    }  
    return ret;  
   }  
  }  
 }  


Como ele mesmo explica, uma grande parte deste código realmente "decodificar" as informações e retornar o objeto System.Type. 

Comentários

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 () {...