JSON在AutoCAD二次开发中应用场景及具体案例
配置文件的读取
在AutoCAD插件开发中,可能需要生成、修改、读取配置文件中一些参数或设置。JSON格式的配置文件易于编写和修改,且可以方便地反序列化为对象进行使用。
运行后效果如下
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Runtime;
using Newtonsoft.Json;
using System;
using System.IO;
using Path = System.IO.Path;
// AutoCAD 命令示例
public class ConfigCommands
{
[CommandMethod("xx")]
public void 加载文件配置()
{
Document doc = Application.DocumentManager.MdiActiveDocument;
Editor ed = doc.Editor;
// 加载配置
AppConfig config = ConfigManager.LoadConfig();
// 应用配置到图纸
ConfigManager.ApplyConfigToDrawing(config);
ed.WriteMessage($"\n已加载配置:默认图层 {config.DefaultLayer}");
}
[CommandMethod("tt")]
public void 修改文件配置()
{
Document doc = Application.DocumentManager.MdiActiveDocument;
Editor ed = doc.Editor;
// 获取当前配置
AppConfig config = ConfigManager.LoadConfig();
// 修改配置示例
config.DefaultLayer = "MyNewLayer";
config.DefaultLineWeight = 0.5;
// 保存配置
ConfigManager.SaveConfig(config);
ed.WriteMessage("\n配置已更新并保存");
}
}
// 配置文件数据结构(示例)
public class AppConfig
{
public string DefaultLayer { get; set; } = "0"; // 默认图层
public double DefaultLineWeight { get; set; } = 0.3; // 默认线宽(毫米)
public string[] RecentFiles { get; set; } // 最近打开文件记录
public ColorSetting Colors { get; set; } // 颜色配置
}
public class ColorSetting
{
public int Background { get; set; } = 16777215; // 背景色(RGB白色)
public int SelectionHighlight { get; set; } = 255; // 选择高亮色(红色)
}
public static class ConfigManager
{
private static readonly string ConfigPath = Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
"MyAutoCADPlugin",
"config.json"
);
/// <summary>
/// 加载配置文件
/// </summary>
public static AppConfig LoadConfig()
{
try
{
// 如果配置文件不存在,创建默认配置
if (!File.Exists(ConfigPath))
{
var defaultConfig = new AppConfig();
SaveConfig(defaultConfig);
return defaultConfig;
}
// 读取并反序列化JSON
string json = File.ReadAllText(ConfigPath);
return JsonConvert.DeserializeObject<AppConfig>(json);
}
catch (Exception ex)
{
Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(
$"\n配置加载失败: {ex.Message}");
return new AppConfig(); // 返回空配置
}
}
/// <summary>
/// 保存配置文件
/// </summary>
public static void SaveConfig(AppConfig config)
{
try
{
// 确保目录存在
Directory.CreateDirectory(Path.GetDirectoryName(ConfigPath));
// 序列化并保存
string json = JsonConvert.SerializeObject(config, Formatting.Indented);
File.WriteAllText(ConfigPath, json);
}
catch (Exception ex)
{
Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(
$"\n配置保存失败: {ex.Message}");
}
}
/// <summary>
/// 应用配置到当前图纸
/// </summary>
public static void ApplyConfigToDrawing(AppConfig config)
{
Database db = HostApplicationServices.WorkingDatabase;
using (Transaction tr = db.TransactionManager.StartTransaction())
{
try
{
// 获取层表
LayerTable lt = tr.GetObject(db.LayerTableId, OpenMode.ForRead) as LayerTable;
// 检查默认图层是否存在
if (!lt.Has(config.DefaultLayer))
{
// 创建新图层
LayerTableRecord ltr = new LayerTableRecord
{
Name = config.DefaultLayer,
LineWeight = LineWeight.LineWeight030
};
lt.UpgradeOpen();
lt.Add(ltr);
tr.AddNewlyCreatedDBObject(ltr, true);
}
// 设置当前图层
db.Clayer = lt[config.DefaultLayer];
tr.Commit();
}
catch (Exception ex)
{
tr.Abort();
Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(
$"\n配置应用失败: {ex.Message}");
}
}
}
}