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.
Como ele mesmo explica, uma grande parte deste código realmente "decodificar" as informações e retornar o objeto System.Type.
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
Postar um comentário