Cad 反应器 cad c#二次开发
在 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 是 DocumentCollectiondc.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){// 在命令行显示实体类型和IDed.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();}}
}
相关文章:

Cad 反应器 cad c#二次开发
在 AutoCAD C# 二次开发中,DocumentCollectionEventHandler 是一个委托(delegate),用于处理与 AutoCAD 文档集合(DocumentCollection)相关的事件。它属于 AutoCAD .NET API 的事件处理机制,本质…...
GitOps 核心思想 - 当 Git 成为唯一信源
GitOps 核心思想 - 当 Git 成为唯一信源 在我们之前的 CI/CD 系列中,我们构建了一条流水线:GitHub Actions 在代码测试和构建通过后,执行 kubectl apply 命令将变更推送 (Push) 到 Kubernetes 集群。这种模式非常普遍且有效,但当系统规模和团队复杂度增加时,它可能会遇到一…...

【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摄…...
【Linux基础知识系列】第十一篇-Linux系统安全
Linux系统安全是指通过一系列技术和管理措施,保护Linux系统免受各种威胁和攻击,确保系统的完整性、可用性和机密性。随着网络攻击手段的多样化和复杂化,Linux系统安全成为了系统管理员和开发者必须面对的重要课题。本文将从用户认证、权限管理…...
02.管理数据库
管理数据库 1. 创建数据库 mysql> create database db1; Query OK, 1 row affected (0.01 sec)mysql> show databases; -------------------- | Database | -------------------- | db1 | | hellodb | | information_schema | | m…...

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

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

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

iview-admin静态资源js按需加载配置
iview-admin2.0版本默认加载所有组件的JS,实际情况下,用户访问后台并不会每个页面都浏览。这样就会造成流量及带宽的浪费。可通过修改配置文件vue.config.js来实现按需加载,具体配置如图 image © 著作权归作者所有,转载或内容合作请联系…...
【学习笔记】深入理解Java虚拟机学习笔记——第3章 垃圾收集器与内存分配策略
第3章 垃圾收集器与内存分配策略 3.1 概述 略 3.2 对象已死? “死去”即不可能以任何途径访问到 3.2.1 引用计数算法 每个对象维护一个计数器,引用即加1,引用失效便减1。 3.2.2 可达性分析算法(主流) 即根据GC…...

抖去推--短视频矩阵系统源码开发
一、开发短视频矩阵系统的源码需要以下步骤: 确定系统需求: 根据客户的具体业务目标,明确系统需实现的核心功能模块,例如用户注册登录、视频内容上传与管理、多维度视频浏览与推荐、用户互动(评论、点赞、分享…...
Windows设置之网络路由
在 Windows 系统中,可以通过配置路由表来实现特定 IP 地址通过无线网卡(Wi-Fi)连接,而其他流量通过有线以太网连接。 比如,让101.132.45.129 走无线网卡,其他的走有线以太网的具体步骤如下: 通…...
发送文件脚本源码版本
V1 适配win10和 win11 #SingleInstance Force SendMode Input SetWorkingDir %A_ScriptDir%; Global variables global TaskList : [] global CurrentFileConfig : "current_file.ini" global RemainingFilesConfig : "remaining_files.ini" global File…...

Vue部署到Nginx上及问题解决
一、Vue打包 dist文件即打包文件 二、下载Nginx,将dist内容全部复制到Nginx的html下 三、修改Nginx的nginx.conf配置文件,添加try_files $uri $uri/ /index.html; try_files $uri $uri/ /index.html; 是 Nginx 配置中的一个重要指令,用于处理…...
MCP(Model Context Protocol)与提示词撰写
随着大模型(LLM)在复杂任务中的普及,如何让模型高效调用外部工具和数据成为关键挑战。传统函数调用(Function Calling)依赖开发者手动封装 API,而 MCP(Model Context Protocol) 通过…...
每日一令:Linux 极简通关指南 - 汇总
专栏列表 💻 每日一令:Linux 极简通关指南 (25篇) 【基础】每天掌握一个Linux命令 - nsenter:深入容器与命名空间的利器 发布于 2025-06-08 22:27:04【基础】 每天掌握一个Linux命令 - journalctl:系统日志管理的得力助手 发布于…...

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

因泰立科技H1X激光雷达:因泰立科技为智慧工业注入新动力
在当今工业领域,精准测量与高效作业是推动产业升级的关键因素。因泰立科技推出的H1X三维轮廓扫描激光雷达,凭借其卓越的性能和广泛的应用场景,正成为智慧工业中不可或缺的高科技装备。 产品简介 H1X三维轮廓扫描激光雷达是因泰立科技基于二维…...
day50 随机函数与广播机制
目录 一、随机张量的生成 1.1 torch.randn() 函数 1.2 其他随机函数 1.3 输出维度测试 二、广播机制 2.1 广播机制的规则 2.2 加法的广播机制 二维张量与一维向量相加 三维张量与二维张量相加 二维张量与标量相加 高维张量与低维张量相加 2.3 乘法的广播机制 批量…...
Codeforces Educational 179(ABCDE)
前言 byd这组题纯靠感觉是吧…^_^ b题赛时举了无数个例子都没想明白,然后一直卡到结束,后面题都没看到,结果补题的时候c题d题直接秒了…-_-|| A. Energy Crystals #include <bits/stdc.h> using namespace std;typedef long long …...
基于 actix-web 框架的简单 demo
以下是一个基于 actix-web 框架的简单 demo, 如果你还没有 Rust,我们建议你使用 rustup 来管理你的 Rust 安装。官方 Rust 指南有一个很棒的入门部分。 Actix Web 目前支持的最低 Rust 版本 (MSRV) 为 1.72。运行 rustup update…...

python:Tkinter 开发邮件客户端,能编写邮件,发送邮件带附件
Python Tkinter 邮件客户端 下面是一个使用 Python Tkinter 开发的简单邮件客户端,支持编写邮件和发送邮件功能: 功能说明 这个邮件客户端包含以下功能: 邮件编写功能: 收件人地址输入抄送地址输入邮件主题输入邮件正文编辑区&…...
CMake基础:gcc/g++编译选项详解
目录 1.编译步骤 2.gcc 与 g 区别 3.gcc 命令的常用选项 3.1.基础编译选项 3.2.优化选项 3.3.调试与分析选项 3.4.链接选项 3.5.语言特性选项(C 特化) 3.6.安全增强选项 3.7.架构与指令集优化 3.8.其他常用选项 4.常见编译组合示例 5.常用环…...

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

免费批量去水印工具 - 针对文心一言生成图片
免费批量去水印工具 - 针对文心一言生成图片 工具介绍 这是一款免费的批量去水印工具,专门针对文心一言生成的图片进行处理。通过简单的操作,您可以快速去除图片中的水印。 下载链接 您可以通过以下网盘链接下载工具: 链接: https://pa…...
android 之 MediaExtractor
MediaExtractor 是Android多媒体处理的基础组件,解封装是其核心价值。 一、功能与定位 MediaExtractor 是Android多媒体框架中的媒体解封装工具,主要作用是从媒体文件(如MP4、MKV、MP3)中分离音视频轨道数据,为后续解…...
行业案例 | ASOS 借助 Azure AI Foundry(国际版)为年轻时尚爱好者打造惊喜体验
英国潮流电商ASOS借力微软Azure OpenAI,打造生成式AI购物新体验。平台整合大语言模型与推荐引擎,通过智能聊天交互帮年轻用户探索穿搭灵感,精准匹配近900个品牌的潮流单品,实现技术升级与个性化需求的双重突破。 使用 Azure Open…...