Cad 反应器 cad c#二次开发

news2025/6/9 15:48:34

        在 AutoCAD C# 二次开发中,`DocumentCollectionEventHandler` 是一个委托(delegate),用于处理与 AutoCAD 文档集合(DocumentCollection)相关的事件。它属于 AutoCAD .NET API 的事件处理机制,本质上是一种**反应器(Reactor)模式**的实现,用于响应文档生命周期事件(如创建、激活、销毁文档等)。

 本例为每激活一个文档,当前文档画一个圆。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
[assembly:CommandClass(typeof(IfoxDemo.DEMO))]

namespace IfoxDemo
{

    public class DEMO

    {
        [CommandMethod("xx")]
        public void CreatExcel()
        {
            Document doc = Application.DocumentManager.MdiActiveDocument;
            Editor ed = doc.Editor;
            ed.WriteMessage("\n开始批量提取块属性");
        }
    }

    public class DocumentEventReactor

    {
        public DocumentEventReactor()// 初始化时订阅事件
        {
            DocumentCollection docCol = Application.DocumentManager;
            docCol.DocumentActivated += OnDocumentActivated;
           
        }
        // 订阅事件(仅允许调用一次)
        public void Subscribe()
        {
            DocumentCollection docCol = Application.DocumentManager;
            docCol.DocumentActivated -= OnDocumentActivated; // 避免重复订阅
            docCol.DocumentActivated += OnDocumentActivated;
        }
        public void Unsubscribe() // 清理时取消订阅(重要!)
        {
            DocumentCollection docCol = Application.DocumentManager;
            docCol.DocumentActivated -= OnDocumentActivated;
        }
        // 文档激活事件处理
        public void OnDocumentActivated(object sender, DocumentCollectionEventArgs e)
        {
            Document activeDoc = e.Document;
            Editor ed = activeDoc.Editor;
            Database db = activeDoc.Database;
            // 获取文档名称(不含路径)
            string docName = System.IO.Path.GetFileName(activeDoc.Name);
            // 在命令行显示提示
            ed.WriteMessage($"\n切换到文档: {docName} | 事件类型: {e.GetType().Name}");
            // 示例扩展操作:检查文档是否只读
            if (activeDoc.IsReadOnly) ed.WriteMessage("\n警告:当前文档为只读模式!");//
                                                                         // 锁定文档上下文(确保操作在正确文档中执行)
            using (DocumentLock docLock = activeDoc.LockDocument())
            {
                Circle c = new Circle(new Point3d(0, 0, 0), Vector3d.ZAxis, 5.0);
                c.ColorIndex = 1; // 设置颜色索引
                Application.DocumentManager.MdiActiveDocument.Database.AddEntityToModeSpace(c); // 添加圆到模型空间
                Application.DocumentManager.MdiActiveDocument.Editor.ZoomExtents(); // 缩放到适合视图  
            }
            }

    }
    // 在插件入口初始化

    //public class PluginCommands : IExtensionApplication

    //{

    //    private static DocumentEventReactor _reactor;



    //    public void Initialize()

    //    {

    //        _reactor = new DocumentEventReactor();

    //        Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(

    //          "\n文档事件反应器已启动");

    //    }



    //    public void Terminate()

    //    {

    //        _reactor?.Unsubscribe();

    //    }

    //}
}

他常用事件处理示例:

 响应文档创建事件

Application.DocumentManager.DocumentCreated += (sender, e) => 

{

    Editor ed = e.Document.Editor;

    ed.WriteMessage($"\n新文档已创建: {e.Document.Name}");

};

```

#### 响应文档关闭事件

```csharp

Application.DocumentManager.DocumentToBeDestroyed += (sender, e) => 

{

    // 保存自定义数据到外部文件

    string backupPath = $"C:\\Backups\\{e.Document.Name}.settings";

    SaveCustomData(e.Document, backupPath);

};

```

通过合理利用 `DocumentCollectionEventHandler`,您可以构建响应 AutoCAD 文档环境变化的智能插件,显著提升用户体验和自动化水平。

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
[assembly:CommandClass(typeof(IfoxDemo.DEMO))]

namespace IfoxDemo
{

    public class DEMO

    {
        [CommandMethod("xx")]
        public void CreatExcel()
        {
            Document doc = Application.DocumentManager.MdiActiveDocument;
            Editor ed = doc.Editor;
            ed.WriteMessage("\n开始批量提取块属性");
        }
    }

    public  class DocumentEventReactor

    {
        public static void DocumentEventReactor1()// 初始化时订阅事件
        {
            DocumentCollection docCol = Application.DocumentManager;
            docCol.DocumentActivated += OnDocumentActivated;
            // 也可以订阅其他事件,如 DocumentCreated、DocumentToBeDestroyed 等
            docCol.DocumentToBeDeactivated += onDocumentToBeDeactivated; // 这里为了示例使用同一处理方法,实际可分开处理不同事件
            docCol.DocumentToBeDestroyed += onDocumentToBeDeactivated; // 这里为了示例使用同一处理方法,实际可分开处理不同事件
        }
        // 订阅事件(仅允许调用一次)
        public static void Subscribe()
        {
            DocumentCollection docCol = Application.DocumentManager;
            docCol.DocumentActivated -= OnDocumentActivated; // 避免重复订阅
            docCol.DocumentActivated += OnDocumentActivated;
        }
        public static void Unsubscribe() // 清理时取消订阅(重要!)
        {
            DocumentCollection docCol = Application.DocumentManager;
            docCol.DocumentActivated -= OnDocumentActivated;
        }
        // 文档激活事件处理
        public static void OnDocumentActivated(object sender, DocumentCollectionEventArgs e)
        {
            try
            {
                DocumentCollection dc = sender as DocumentCollection;
                // if (dc == null) return; // 确保 sender 是 DocumentCollection
                // 先取消旧订阅,避免重复
                dc.MdiActiveDocument.ImpliedSelectionChanged -= Doc_ImpliedSelectionChanged;
                dc.MdiActiveDocument.ImpliedSelectionChanged += Doc_ImpliedSelectionChanged; // 订阅 ImpliedSelectionChanged 事件
            }
            catch (Exception)
            {
                throw;
            }

            Document activeDoc = e.Document;
            Editor ed = activeDoc.Editor;
            Database db = activeDoc.Database;
            // 获取文档名称(不含路径)
            string docName = System.IO.Path.GetFileName(activeDoc.Name);
            // 在命令行显示提示
            ed.WriteMessage($"\n切换到文档: {docName} | 事件类型: {e.GetType().Name}");
            // 示例扩展操作:检查文档是否只读
            if (activeDoc.IsReadOnly) ed.WriteMessage("\n警告:当前文档为只读模式!");//
                                                                         // 锁定文档上下文(确保操作在正确文档中执行)
            using (DocumentLock docLock = activeDoc.LockDocument())
            {
                Circle c = new Circle(new Point3d(0, 0, 0), Vector3d.ZAxis, 5.0);
                c.ColorIndex = 1; // 设置颜色索引
                Application.DocumentManager.MdiActiveDocument.Database.AddEntityToModeSpace(c); // 添加圆到模型空间
                                                                                                // Application.DocumentManager.MdiActiveDocument.Editor.ZoomExtents(); // 缩放到适合视图  
            }

        }
        public static void onDocumentToBeDeactivated(object sender, DocumentCollectionEventArgs e)
        {
            try
            {
                DocumentCollection dc = sender as DocumentCollection;
                // if (dc == null) return; // 确保 sender 是 DocumentCollection
                dc.MdiActiveDocument.ImpliedSelectionChanged -= Doc_ImpliedSelectionChanged; // 订阅 ImpliedSelectionChanged 事件
            }
            catch (Exception)
            {
                throw;
            }
        }
        // 文档隐含选择集变化事件处理
        public static void Doc_ImpliedSelectionChanged(object sender, EventArgs e)
        {   
            Document doc = Application.DocumentManager.MdiActiveDocument; 
            using (DocumentLock dl = doc.LockDocument())
            {
                Editor ed = doc.Editor;
             
                ed.WriteMessage("\nImpliedSelectionChanged 事件触发!");
                // 获取当前选择集
                var psr = ed.SelectImplied();
                if (psr.Status != PromptStatus.OK) return;
                // 开启事务
                using (Transaction tr = doc.TransactionManager.StartTransaction())
                {
                    try
                    {
                        // 遍历选择集中的实体
                        foreach (ObjectId id in psr.Value.GetObjectIds())
                        {
                            // 通过事务获取实体(需指定OpenMode)
                            Entity ent = tr.GetObject(id, OpenMode.ForRead) as Entity;
                            if (ent != null)
                            {
                                // 在命令行显示实体类型和ID
                                ed.WriteMessage($"\n实体类型: {ent.GetType().Name}, ID: {id}");
                                // 此处若需要修改实体,需将OpenMode设为ForWrite并在事务中提交
                            }
                        }
                        // 事务完成后提交(只读操作可省略,但建议显式调用以明确意图)
                        tr.Commit();
                    }
                    catch (Exception ex)
                    {
                        ed.WriteMessage($"\n事务处理错误: {ex.Message}");
                        tr.Abort(); // 异常时回滚事务
                    }

                    //try
                    //{
                    //    // 1. 创建空的选择集
                    //    SelectionSet emptySelection = null;
                    //    // 2. 使用SetImpliedSelection设置空选择集,清空当前选择
                    //    ed.SetImpliedSelection(emptySelection);
                    //    ed.WriteMessage("\n当前选择集已清空!");
                    //}
                    //catch (Exception ex)
                    //{
                    //    ed.WriteMessage($"\n清空选择集失败: {ex.Message}");
                    //}
                }
               
            }
        }
    }
    public class MyPlugin2 : IExtensionApplication
    {
        public void Initialize()
        {
            string str = "";//"输入命令\"ywxl\"执行 \n";
            Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage($"\n插件已加载!(CAD插件定制:山水qq443440204)\n{str}\n");
            DocumentEventReactor.Subscribe(); // 订阅事件(仅一次)
            Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage("\n文档事件反应器已启动");
        }
        public void Terminate()
        {
            //Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage("\n结束");

            DocumentEventReactor.Unsubscribe();

        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2405541.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【websocket】安装与使用

websocket安装与使用 1. 介绍2. 安装3. websocketpp常用接口4. Websocketpp使用4.1 服务端4.2 客户端 1. 介绍 WebSocket 是从 HTML5 开始支持的一种网页端和服务端保持长连接的 消息推送机制。 传统的 web 程序都是属于 “一问一答” 的形式,即客户端给服务器发送…

【大模型】LogRAG:基于检索增强生成的半监督日志异常检测

文章目录 A 论文出处B 背景B.1 背景介绍B.2 问题提出B.3 创新点 C 模型结构D 实验设计D.1 数据集/评估指标D.2 SOTAD.3 实验结果 E 个人总结E.1 优点E.2 不足 A 论文出处 论文题目:LogRAG: Semi-Supervised Log-based Anomaly Detection with Retrieval-Augmented …

基于SpringBoot实现的大创管理系统设计与实现【源码+文档】

基于SpringBootVue实现的大创管理系统采用前后端分离架构方式,系统设计了管理员、学生、指导老师、院系管理员两种角色,系统实现了用户登录与注册、个人中心、学生管理、指导老师管理、院系管理员管理、优秀项目管理、项目类型管理、项目信息管理、项目申…

国产高云FPGA实现视频采集转UDP以太网输出,FPGA网络摄像头方案,提供2套Gowin工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目国产高云FPGA基础教程国产高云FPGA相关方案推荐我这里已有的以太网方案 3、设计思路框架工程设计原理框图输入Sensor之-->OV7725摄像头输入Sensor之-->OV5640摄…

Webpack依赖

Webpack到底怎么对我们的项目进行打包捏? 在webpack处理应用程序时,会根据命令或者配置文件找到入口文件 从入口开始,会生成一个依赖关系图,这个依赖关系图会包含应用程序中所需的所有模块(.js、css文件、图片、字体…

自动驾驶科普(百度Apollo)学习笔记

1. 写在前面 在过去的几年里,自动驾驶技术取得飞速发展,人类社会正逐渐走向一个新时代,这个时代中,汽车不仅仅是一个交通工具,更是一个智能的、能够感知环境、做出决策并自主导航的机器伙伴。现在正好也从事这块的工作…

leetcode_66.加一

题目链接 这道题归类在力扣的数学类中,应该算是一道思维的简单题吧 题是这样的,根据题目我们不难理解,这个题就是在最后一位加 1 然后返回,正如示例所说的那样,当然这很符合我们人的思维,写这种算法题最重要…

iview-admin静态资源js按需加载配置

iview-admin2.0版本默认加载所有组件的JS,实际情况下,用户访问后台并不会每个页面都浏览。这样就会造成流量及带宽的浪费。可通过修改配置文件vue.config.js来实现按需加载,具体配置如图 image © 著作权归作者所有,转载或内容合作请联系…

抖去推--短视频矩阵系统源码开发

一、开发短视频矩阵系统的源码需要以下步骤: 确定系统需求: 根据客户的具体业务目标,明确系统需实现的核心功能模块,例如用户注册登录、视频内容上传与管理、多维度视频浏览与推荐、用户互动(评论、点赞、分享&#xf…

Vue部署到Nginx上及问题解决

一、Vue打包 dist文件即打包文件 二、下载Nginx,将dist内容全部复制到Nginx的html下 三、修改Nginx的nginx.conf配置文件,添加try_files $uri $uri/ /index.html; try_files $uri $uri/ /index.html; 是 Nginx 配置中的一个重要指令,用于处理…

项目-- Json-Rpc框架

目录 项目简介环境搭建Ubuntu-22.04 第三方库使用JsonCppMuduo基础类EventLoop类TcpConnection类Buffer类TcpClient类TcpServer类 服务端基本搭建客户端基本搭建 future 项目设计通用模块设计Rpc功能模块设计发现者设计提供者设计服务注册中心设计 Topic功夫模块设计主题管理中…

因泰立科技H1X激光雷达:因泰立科技为智慧工业注入新动力

在当今工业领域,精准测量与高效作业是推动产业升级的关键因素。因泰立科技推出的H1X三维轮廓扫描激光雷达,凭借其卓越的性能和广泛的应用场景,正成为智慧工业中不可或缺的高科技装备。 产品简介 H1X三维轮廓扫描激光雷达是因泰立科技基于二维…

python:Tkinter 开发邮件客户端,能编写邮件,发送邮件带附件

Python Tkinter 邮件客户端 下面是一个使用 Python Tkinter 开发的简单邮件客户端,支持编写邮件和发送邮件功能: 功能说明 这个邮件客户端包含以下功能: 邮件编写功能: 收件人地址输入抄送地址输入邮件主题输入邮件正文编辑区&…

深入解析Java21核心新特性(虚拟线程,分代 ZGC,记录模式模式匹配增强)

文章目录 前言一、虚拟线程 (Virtual Threads - JEP 444) - 并发的革命1.1 解决的核心问题🎯1.2 工作原理与核心机制⚙️1.3 使用详解与最佳实践🛠️1.4 注意事项⚠️1.5 总结 📚 二、分代 ZGC (Generational ZGC - JEP 439) - 低延迟新高度2…

免费批量去水印工具 - 针对文心一言生成图片

免费批量去水印工具 - 针对文心一言生成图片 工具介绍 这是一款免费的批量去水印工具,专门针对文心一言生成的图片进行处理。通过简单的操作,您可以快速去除图片中的水印。 下载链接 您可以通过以下网盘链接下载工具: 链接: https://pa…

在WPS中如何启用宏VBA wps.vba.exe下载和安装

首先我们点击导航栏中的【工具】,点击左侧 运行宏,根据提示 点击 立即加载。加载卡在50%时间比较长,耐心等待。 关闭wps重新打开后, word和xls表格都可以使用了。 如果电脑无法联网,需要提前下载 WPS VBA插件 WPS VB…

Hardware-Efficient Attention for Fast Decoding

TL;DR 2025 年普林斯顿大学提出的硬件友好 attention 设计,在 MQA/GQA 与 deepseek 提出的 MLA 基础之上继续优化,提出 Grouped-Tied Attention (GTA) 和 Grouped Latent Attention (GLA),实现更高推理效率的同时也能保持较好的模型效果。 …

LLMs 系列科普文(13)

十三、AlphaGO 提到强化学习的历史,不得不提到 alphago,如果你不记得这是什么了,那你是否还曾记得,早些年 AI 已经可以在围棋中击败人类选手了。 AlphaGO 系统又 DeepMind 公司开发,你可以在网络上找到当初人机大战的…

element-plus 单选组件 el-radio,选不上,又没报错,直接复制官网也不行解决方案

在使用 Vue 框架开发项目时,Element UI 是常用的组件库。最近在开发中遇到了 Element 单选框组件el-radio的双向绑定问题,直接复制element官网上的的案例下来也是不得,经过调试和探索,终于找到了解决方案,特此记录分享…

idea 启动jar程序并调试

添加一个JAR 应用程序,填写以下内容: JAR路径:填写你要启动的jar程序的绝对路径 虚拟机选项:-Xmx1G -Xms1G -agentlib:jdwptransportdt_socket,servery,suspendn,address*:5005 程序实参(可选,minecraft专用…