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

OLE(对象链接与嵌入)剪贴板内容插入到 CAD 图形中——CAD c# 二次开发

在 AutoCAD 的 C# 二次开发里,借助 OLE(对象链接与嵌入)技术把剪贴板内容插入到 CAD 图形中,是一种常用的方法。下面将对其概念、原理和实现方式进行详细介绍:

一、OLE 技术概述

OLE(对象链接与嵌入)是微软提出的一项技术,它能够让不同应用程序之间实现数据共享与交互。在 AutoCAD 二次开发中,OLE 技术主要有以下两种应用场景:

  1. 链接对象:被插入到 AutoCAD 中的内容依旧和源应用程序保持关联。当源文件发生更改时,AutoCAD 中的对象也会随之更新。
  2. 嵌入对象:将剪贴板中的内容完整地复制到 AutoCAD 图形中,此时它与源应用程序不再有联系。

二、实现 OLE 插入的关键步骤

1. 引用必要的命名空间

csharp

using System.Runtime.InteropServices; // 用于COM互操作
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.EditorInput;

2. 实现插入剪贴板 OLE 对象的命令
[CommandMethod("PasteFromClipboard")]
public void PasteFromClipboard()
{// 获取当前文档和数据库Document doc = Application.DocumentManager.MdiActiveDocument;Database db = doc.Database;Editor ed = doc.Editor;// 检查剪贴板中是否有OLE对象if (!System.Windows.Forms.Clipboard.ContainsData(System.Windows.Forms.DataFormats.EnhancedMetafile) &&!System.Windows.Forms.Clipboard.ContainsData(System.Windows.Forms.DataFormats.Bitmap) &&!System.Windows.Forms.Clipboard.ContainsData("ObjectLink")){ed.WriteMessage("\n剪贴板中没有可插入的OLE对象!");return;}// 提示用户选择插入点PromptPointOptions ppo = new PromptPointOptions("\n请选择插入点: ");PromptPointResult ppr = ed.GetPoint(ppo);if (ppr.Status != PromptStatus.OK)return;Point3d insertionPoint = ppr.Value;// 开始事务处理using (Transaction tr = db.TransactionManager.StartTransaction()){try{// 打开块表以进行读取BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);// 打开当前空间以进行写入BlockTableRecord btr = (BlockTableRecord)tr.GetObject(doc.Database.CurrentSpaceId, OpenMode.ForWrite);// 创建OLE2Frame对象Ole2Frame oleFrame = new Ole2Frame();// 设置插入点和比例oleFrame.Position = insertionPoint;oleFrame.ScaleFactors = new Scale3d(1, 1, 1);// 从剪贴板获取数据System.Windows.Forms.IDataObject dataObj = System.Windows.Forms.Clipboard.GetDataObject();// 尝试处理不同格式的数据if (dataObj.GetDataPresent(System.Windows.Forms.DataFormats.EnhancedMetafile)){// 处理EMF格式System.Drawing.Imaging.Metafile emf = (System.Drawing.Imaging.Metafile)dataObj.GetData(System.Windows.Forms.DataFormats.EnhancedMetafile);// 将EMF转换为临时文件string tempFilePath = System.IO.Path.GetTempPath() + "temp_emf.emf";emf.Save(tempFilePath);// 设置OLE对象属性oleFrame.ClassId = RXClass.GetClass(typeof(Ole2Frame)).DxfName;oleFrame.Contents = "Enhanced Metafile";oleFrame.Link = false; // 设为false表示嵌入对象oleFrame.SourceFullName = tempFilePath;// 计算OLE对象的大小double width = emf.Width / 300.0; // 转换为CAD单位(英寸)double height = emf.Height / 300.0;// 设置OLE对象的大小oleFrame.Size = new Size2d(width, height);}else if (dataObj.GetDataPresent(System.Windows.Forms.DataFormats.Bitmap)){// 处理位图格式System.Drawing.Bitmap bmp = (System.Drawing.Bitmap)dataObj.GetData(System.Windows.Forms.DataFormats.Bitmap);// 将位图转换为临时文件string tempFilePath = System.IO.Path.GetTempPath() + "temp_bmp.bmp";bmp.Save(tempFilePath);// 设置OLE对象属性oleFrame.ClassId = RXClass.GetClass(typeof(Ole2Frame)).DxfName;oleFrame.Contents = "Bitmap Image";oleFrame.Link = false;oleFrame.SourceFullName = tempFilePath;// 计算OLE对象的大小double width = bmp.Width / 300.0;double height = bmp.Height / 300.0;// 设置OLE对象的大小oleFrame.Size = new Size2d(width, height);}else if (dataObj.GetDataPresent("ObjectLink")){// 处理其他OLE对象类型// 这里需要根据具体的对象类型进行处理ed.WriteMessage("\n检测到OLE对象链接,但可能需要特殊处理。");// 示例: 尝试获取对象数据object oleData = dataObj.GetData("ObjectLink");// 根据具体类型进行处理...}// 将OLE对象添加到块表记录中btr.AppendEntity(oleFrame);tr.AddNewlyCreatedDBObject(oleFrame, true);// 提交事务tr.Commit();ed.WriteMessage("\n已成功插入OLE对象!");}catch (System.Exception ex){ed.WriteMessage("\n错误: " + ex.Message);tr.Abort();}}
}

三、代码解析

上述代码主要实现了以下功能:

  1. 剪贴板检查:查看剪贴板中是否存在 OLE 兼容的数据格式,像增强图元文件、位图等。
  2. 插入点选择:让用户在 CAD 绘图区域选择 OLE 对象的插入位置。
  3. OLE 对象创建:创建Ole2Frame对象,并对其属性(如位置、比例、内容类型等)进行设置。
  4. 数据处理
    • 把剪贴板数据转换为临时文件。
    • 设置 OLE 对象的源文件路径和显示大小。
  5. 事务管理:保证数据库操作的一致性,若出现错误则进行回滚。

四、注意事项

  1. 临时文件管理:示例代码中创建的临时文件不会被自动清理,在实际应用中,你需要添加文件清理逻辑。
  2. OLE 类型支持:不同的应用程序可能会以不同的格式将数据放在剪贴板中,你可能需要针对特定的源应用程序(如 Word、Excel 等)编写专门的处理代码。
  3. 比例与单位:要确保 OLE 对象的尺寸和比例与 CAD 图形单位相匹配。
  4. 错误处理:实际开发中,你需要更全面地处理各种可能出现的异常情况。

通过这种方式,你就可以在 AutoCAD 的 C# 二次开发中利用 OLE 技术插入剪贴板内容了。

http://www.xdnf.cn/news/379369.html

相关文章:

  • 非阻塞式IO-Java NIO
  • TCP Socket编程
  • 分布式锁原理
  • Linux 信号终篇(总结)
  • OpenAI API JSON 格式指南与json_repair错误修复
  • 深入理解卷积神经网络的输入层:数据的起点与预处理核心
  • [Pandas]数据处理
  • MySQL 从入门到精通(六):视图全面详解 —— 虚拟表的灵活运用
  • PyTorch量化感知训练技术:模型压缩与高精度边缘部署实践
  • TDengine 在智能制造中的核心价值
  • 工控新宠| 触想Z系列工控机C款发布,方寸机身,智控万千
  • OSPF综合实验实验报告
  • 深度学习篇---MediaPipe 及其人体姿态估计模型详解
  • 广东省省考备考(第七天5.10)—言语:片段阅读(每日一练)
  • Vue插槽(Slots)详解
  • SkyReels-V2 视频生成
  • Cadence 高速系统设计流程及工具使用三
  • 加速pip下载:永久解决网络慢问题
  • 数据集-目标检测系列- 冥想 检测数据集 close_eye>> DataBall
  • AI实战笔记(1)AI 的 6 大核心方向 + 学习阶段路径
  • Linxu实验五——NFS服务器
  • WordPress插件targetsms存在远程命令执行漏洞(CVE-2025-3776)
  • 20250510-查看 Anaconda 配置的镜像源
  • redis未授权访问
  • [架构之美]从零开始整合Spring Boot与Maven(十五)
  • AUTODL Chatglm2 langchain 部署大模型聊天助手
  • C语言初阶秘籍6
  • 二分法和牛顿迭代法解方程实根,详解
  • 第十九节:图像梯度与边缘检测- Laplacian 算子
  • 「OC」源码学习——cache_t的原理探究