当前位置: 首页 > news >正文

CAD插件实现:所有文字显示到列表、缩放、编辑——CAD-c#二次开发

当图中有大量文字,需要全部显示到一个列表时并缩放到需要的文字时,可采用插件实现,效果如下:

附部分代码如下:

 private void BtnSelectText_Click(object sender, EventArgs e)
 {
     var doc = Application.DocumentManager.MdiActiveDocument;
     var db = doc.Database;
     var ed = doc.Editor;

     // 激活CAD窗口(修复问题1)
     Autodesk.AutoCAD.ApplicationServices.Application.MainWindow.Focus();

     // 创建选择过滤器(新增批量选择功能)
     var filter = new SelectionFilter(
         new[]
         {
          new TypedValue((int)DxfCode.Operator, "<or"), // 开始逻辑或
          new TypedValue((int)DxfCode.Start, "TEXT"),
          new TypedValue((int)DxfCode.Start, "MTEXT"),
          new TypedValue((int)DxfCode.Operator, "or>") // 结束逻辑或
         });

     var options = new PromptSelectionOptions
     {
         MessageForAdding = "\n选择要添加的文字: ",
         AllowDuplicates = false
     };

     try
     {
         // 执行批量选择(替换原来的GetEntity)
         var result = ed.GetSelection(options, filter);

         if (result.Status != PromptStatus.OK) return;
         // 获取选中的ObjectId并去重
         var selectedIds = new HashSet<ObjectId>(result.Value.GetObjectIds());
         // 获取现有表格中的ObjectId
         var existingIds = new HashSet<ObjectId>();
         dataGridView.Invoke((MethodInvoker)delegate
         {
             foreach (DataGridViewRow row in dataGridView.Rows)
             {
                 if (row.Tag is ObjectId id)
                 {
                     existingIds.Add(id);
                 }
             }
         });
         // 计算需要添加的新ID
         var newIds = selectedIds.Except(existingIds).ToList();
         if (newIds.Count == 0)
         {
             ed.WriteMessage("\n没有新文字需要添加!\n");
             return;
         }
         using (Transaction tr = db.TransactionManager.StartTransaction())
             {
                 // 遍历所有选中的对象(新增批量处理)
                 foreach (var objectId in newIds)
                 {
                     var text = tr.GetObject(objectId, OpenMode.ForRead) as Entity;

                     string content = "";
                     string color = "";

                     if (text is DBText dbText)
                     {
                         content = dbText.TextString;
                         color = dbText.Color.ToString();
                     }
                     else if (text is MText mText)
                     {
                         content = mText.Contents; // 修正MText内容获取方式
                         color = mText.Color.ToString();
                     }

                     // 跨线程更新UI(重要!)
                     dataGridView.Invoke((MethodInvoker)delegate
                     {
                         // 创建新行并存储ObjectId
                         var index = dataGridView.Rows.Add(content, color);
                         dataGridView.Rows[index].Tag = objectId; // 关键修改:存储对象ID
                     });
                 }
                 tr.Commit();
             }
     }
     catch (System.Exception ex)
     {
         ed.WriteMessage($"\n选择错误: {ex.Message}");
     }
 }

插件联系(可另行定制功能)↓ ↓ ↓ 

相关文章:

  • 网站建设的基本步骤是哪些/网站优化排名金苹果系统
  • 秦皇岛海港区最新疫情/官网seo是什么意思
  • 计算机网站建设的毕业论文/竞价代运营公司哪家好
  • 网站备案几年备案一次/徐州seo建站
  • 有没有catia做幕墙的网站/百度百科合作模式
  • 虚拟机第十三章-垃圾回收
  • 大咖访谈:Ftrans飞驰云联王泽瑞:安全即效率:数据交换新范式
  • 嵌入式Linux驱动开发基础知识(三)
  • Vue的学习总结-day01
  • 3.字节输出流FileOutputStream写出数据的三种方式
  • (C语言)单链表(1.0)(单链表教程)(数据结构,指针)
  • Python爬虫教程007:scrapy结合实际案例的简单使用
  • 深入讲解:智能合约中的读写方法
  • NumPy性能调优实战:从调试到性能分析的完整指南
  • Linux进阶——shell脚本语言
  • Bash详解
  • 轻量化大模型微调工具XTuner指令微调实战(下篇)
  • 如何创建一个自行设计的nginx的Docker Image
  • 后端开发常见的面试问题
  • Ansible 实战:Roles,运维的 “魔法函数”
  • 基于FLask的共享单车需求数据可视化分析系统
  • Spring-AOP事务
  • [ctfshow web入门] web4
  • PDF转换:在线将PDF转PPT并且可编辑文字图片,超快速转换软件,无需下载
  • 通过Postman和OAuth 2.0连接Dynamics 365 Online的详细步骤