导出cad实体所有信息到txt并打开 c#cad二次开发——待调试

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}");
    }
}

 

你可能感兴趣的:(CAD,C#二次开发,CAD)