当前位置: 首页 > 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}");
     }
 }

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

http://www.dtcms.com/a/114516.html

相关文章:

  • 虚拟机第十三章-垃圾回收
  • 大咖访谈: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的详细步骤
  • 区块链日记5 - Solana入门 - 部署第一个Solana程序
  • 23种设计模式-行为型模式-命令
  • ubuntu22使用TrinityCore搭建魔兽世界服务器
  • 【计算机网络】Linux配置SNAT/DNAT策略
  • G-Retriever: 用于文本图理解与问答的检索增强生成
  • LeetCode算法题(Go语言实现)_31
  • 基于LSTM的文本分类2——文本数据处理
  • 数据流和重定向
  • 250405-VSCode编辑launch.json实现Debug调试Open-WebUI
  • 数据库原理