using (StreamWriter sw = new StreamWriter(filePath, false, Encoding.UTF8))
{
// 写入内容
}
2. **文件编码兼容性**:
- 如果TXT文件包含特殊字符(如中文),建议在保存时指定编码为UTF-8:
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Runtime;
using System;
using System.ComponentModel;
using System.Diagnostics;
using System.IO;
using System.Text;
namespace EnhancedEntityPropertyExporter
{
public class ExportCommands
{
// 命令:循环选择实体并导出属性
[CommandMethod("REFLECTEXPORT")]
public void ReflectExportEntityProperties()
{
Document doc = Application.DocumentManager.MdiActiveDocument;
Database db = doc.Database;
Editor ed = doc.Editor;
try
{
// 在桌面创建专用文件夹
string exportDir = CreateExportDirectory();
ed.WriteMessage($"\n属性文件将保存到: {exportDir}");
// 循环选择实体
while (true)
{
// 提示用户选择实体
PromptEntityResult per = GetUserEntitySelection(ed);
// 检查用户是否按ESC或取消
if (per.Status == PromptStatus.Cancel || per.Status == PromptStatus.None)
{
ed.WriteMessage("\n已退出属性导出");
break;
}
// 导出选定实体的属性
ExportEntityProperties(db, per.ObjectId, exportDir, ed);
}
// 导出完成后打开文件夹
OpenExportDirectory(exportDir);
}
catch (Exception ex)
{
ed.WriteMessage($"\n发生错误: {ex.Message}");
}
}
// 创建导出目录
private string CreateExportDirectory()
{
string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
string exportDir = Path.Combine(desktopPath, "AutoCAD_Entity_Exports_" + DateTime.Now.ToString("yyyyMMdd_HHmmss"));
if (!Directory.Exists(exportDir))
{
Directory.CreateDirectory(exportDir);
}
return exportDir;
}
// 获取用户选择的实体
private PromptEntityResult GetUserEntitySelection(Editor ed)
{
PromptEntityOptions peo = new PromptEntityOptions("\n选择要导出属性的实体 (按ESC退出): ");
peo.AllowNone = false; // 不允许空输入
return ed.GetEntity(peo);
}
// 导出实体属性到文件
private void ExportEntityProperties(Database db, ObjectId entityId, string exportDir, Editor ed)
{
string filePath = Path.Combine(exportDir, $"Entity_{entityId.Handle}.txt");
using (Transaction tr = db.TransactionManager.StartTransaction())
using (StreamWriter sw = new StreamWriter(filePath, false, Encoding.UTF8))
{
Entity entity = tr.GetObject(entityId, OpenMode.ForRead) as Entity;
if (entity == null)
{
sw.WriteLine("错误: 无法获取实体对象");
return;
}
// 写入文件头信息
WriteFileHeader(sw, entity);
// 使用反射获取并写入所有属性
WriteAllPropertiesUsingReflection(sw, entity);
tr.Commit();
}
// 自动打开生成的文本文件
OpenTextFile(filePath, ed);
}
// 写入文件头信息
private void WriteFileHeader(StreamWriter sw, Entity entity)
{
sw.WriteLine($"AutoCAD 实体属性导出 - {DateTime.Now}");
sw.WriteLine("====================================");
sw.WriteLine($"实体类型: {entity.GetType().Name}");
sw.WriteLine($"句柄(Handle): {entity.Handle}");
sw.WriteLine($"图层(Layer): {entity.Layer}");
sw.WriteLine("====================================");
sw.WriteLine();
}
// 使用反射获取并写入所有属性
private void WriteAllPropertiesUsingReflection(StreamWriter sw, object obj)
{
sw.WriteLine("=== 所有属性 ===");
// 获取类型信息
Type type = obj.GetType();
// 获取所有属性
PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(obj);
foreach (PropertyDescriptor prop in properties)
{
try
{
// 获取属性值
object value = prop.GetValue(obj);
// 格式化属性值
string formattedValue = FormatPropertyValue(value);
// 写入属性名和值
sw.WriteLine($"{prop.Name.PadRight(30)}: {formattedValue}");
}
catch (Exception ex)
{
// 写入获取属性时的错误信息
sw.WriteLine($"{prop.Name.PadRight(30)}: [无法获取 - {ex.Message}]");
}
}
}
// 格式化属性值
private string FormatPropertyValue(object value)
{
if (value == null) return "null";
// 处理AutoCAD特定类型
if (value is Point3d point)
return $"({point.X:F2}, {point.Y:F2}, {point.Z:F2})";
if (value is Vector3d vector)
return $"({vector.X:F2}, {vector.Y:F2}, {vector.Z:F2})";
if (value is Scale3d scale)
return $"({scale.X:F2}, {scale.Y:F2}, {scale.Z:F2})";
// 处理数组和集合
if (value is System.Collections.ICollection collection)
{
StringBuilder sb = new StringBuilder();
sb.Append("[");
int count = 0;
foreach (var item in collection)
{
if (count++ > 0) sb.Append(", ");
if (count > 5) { sb.Append("..."); break; } // 限制显示数量
sb.Append(FormatPropertyValue(item));
}
sb.Append("]");
return sb.ToString();
}
// 默认ToString
return value.ToString();
}
// 打开文本文件
private void OpenTextFile(string filePath, Editor ed)
{
try
{
Process.Start(filePath);
ed.WriteMessage($"\n已导出: {Path.GetFileName(filePath)}");
}
catch (Exception ex)
{
ed.WriteMessage($"\n无法打开文件: {ex.Message}");
}
}
// 打开导出目录
private void OpenExportDirectory(string exportDir)
{
try
{
Process.Start("explorer.exe", exportDir);
}
catch { /* 忽略错误 */ }
}
}
}
```private void OpenTextFile(string filePath, Editor ed)
{
try
{
// 明确指定用记事本打开
Process.Start("notepad.exe", filePath);
ed.WriteMessage($"\n已导出: {Path.GetFileName(filePath)}");
}
catch (Exception ex)
{
ed.WriteMessage($"\n无法用记事本打开文件: {ex.Message}");
}
}