CAD二次开发(2)-将直线对象添加到CAD图形文件
1. 准备工作
创建一个类库项目,如下:

2. 分析Line对象
Line类的初始化方法和参数

using Autodesk.AutoCAD.DatabaseServices;
Line line = new Line();
Line 继承Curve 继承Entity 继承DBObject 继承Drawable 继承RXObject
初始化方法有两个:


3. 启动项目
我们创建一个line对象,然后打上断点,生成.dll文件,加载到CAD中,然后执行命令。

我们就会发现,自动跳到了VS界面,代码走到了断点处,代码继续往下走,我们就会看到:

透过参数,我们就会发现默认Line创建了一个起点为(0,0),终点为(0,0)的直线。
4. 如何将线条写到CAD中
4.1 数据交互原理
首先我们要明白一个事情,就是我们在代码中创建的线条目前是写到内存当中,而CAD的图纸数据是以自己的某种方式,比如文件数据库等等,存储在磁盘中,所以我们就得需要把内存中的数据想办法按照CAD的API调用写到CAD的文件数据库中。

如上图的右边,就是CAD的文件数据存储的过程:Database(数据库)-》BlockTable(块表)-》BlockTableRecord(块表记录)-》Entity(实体数据)。
4.2 代码实现
所以代码如下:
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace LineTest01
{public class LineTest{[CommandMethod("LineDemo")]public void LineDemo() {//创建线条对象Line line = new Line();//创建坐标对象Point3d start = new Point3d(200, 200, 200);Point3d end = new Point3d(430, 400, 400);//设置属性line.StartPoint = start;line.EndPoint = end;//声明图形数据库对象Document doc = Application.DocumentManager.MdiActiveDocument;Database database = doc.Database;//开启事务处理using (Transaction trans = database.TransactionManager.StartTransaction()) {//打开块表BlockTable blockTable = (BlockTable)trans.GetObject(database.BlockTableId, OpenMode.ForRead);// 打开块表记录BlockTableRecord blockTableRecord = (BlockTableRecord)trans.GetObject(blockTable[BlockTableRecord.ModelSpace], OpenMode.ForWrite);//加直线到块表记录blockTableRecord.AppendEntity(line);//更新数据trans.AddNewlyCreatedDBObject(line, true);//事务提交trans.Commit();}}}
}
然后我们启动服务,加载CAD程序。
4.3 CAD加载.dll程序
输入:NETLOAD

选择.dll文件。
输入:LineDemo

就可以看到我们已经成功地将线条对象写入到CAD中了。
5. 封装工具类
从上面可以看到,其实我们可以将一些常用的方法,封装成公共方法,提高代码的复用性,这里我为大家封装了两个类,分别如下:
BaseTool.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace LineTest01
{internal static class BaseTool{/// <summary>/// 角度转成弧度/// </summary>/// <param name="degree">角度参数</param>/// <returns>弧度</returns>public static Double DegreeToAngle(this Double degree){return degree * Math.PI / 180;}/// <summary>/// 弧度转成角度/// </summary>/// <param name="degree">弧度参数</param>/// <returns>角度</returns>public static Double AngleToDegree(this Double angle){return angle * 180 / Math.PI;}}
}
AddEntityTool.cs
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace LineTest01
{//internal 表示只有在同一程序集的文件中才能访问internal static class AddEntityTool{/// <summary>/// 将图形对象添加到图形文件中/// </summary>/// <param name="db">图形数据库</param>/// <param name="entity">图形对象</param>/// <returns></returns>public static ObjectId AddEntityToModelSpace(this Database db, Entity entity) {//声明ObjectId,用于返回ObjectId objectId = ObjectId.Null;//开启事务using (Transaction trans = db.TransactionManager.StartTransaction()) {//打开块表BlockTable blockTable = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForRead);//打开块表记录BlockTableRecord blockTableRecord= (BlockTableRecord)trans.GetObject(blockTable[BlockTableRecord.ModelSpace], OpenMode.ForWrite);//添加图形到块表记录objectId = blockTableRecord.AppendEntity(entity);//更新数据信息trans.AddNewlyCreatedDBObject(entity, true);//提交事务trans.Commit();}return objectId;}/// <summary>/// 将图形对象添加到图形文件中/// </summary>/// <param name="db">图形数据库</param>/// <param name="entity">图形对象 可变参数</param>/// <returns>ObjectId</returns>public static ObjectId[] AddEntityToModelSpace(this Database db, params Entity[] entities){//声明ObjectId,用于返回ObjectId[] objectId = new ObjectId[entities.Length];//开启事务using (Transaction trans = db.TransactionManager.StartTransaction()){//打开块表BlockTable blockTable = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForRead);//打开块表记录BlockTableRecord blockTableRecord = (BlockTableRecord)trans.GetObject(blockTable[BlockTableRecord.ModelSpace], OpenMode.ForWrite);for (int i = 0; i < entities.Length; i++){//添加图形到块表记录objectId[i] = blockTableRecord.AppendEntity(entities[i]);//更新数据信息trans.AddNewlyCreatedDBObject(entities[i], true);}//提交事务trans.Commit();}return objectId;}/// <summary>/// 将图形对象添加到图形文件中/// </summary>/// <param name="db">图形数据库</param>/// <param name="startPoint">起点坐标</param>/// <param name="endPoint">终点坐标</param>/// <returns>ObjectId</returns>public static ObjectId AddEntityToModelSpace(this Database db, Point3d startPoint,Point3d endPoint){return db.AddEntityToModelSpace(new Line(startPoint, endPoint));}/// <summary>/// 将图形对象添加到图形文件中/// </summary>/// <param name="db">图形数据库</param>/// <param name="startPoint">起点坐标</param>/// <param name="length">直线长度</param>/// <param name="degree">与X轴正方向的夹角</param>/// <returns>ObjectId</returns>public static ObjectId AddEntityToModelSpace(this Database db, Point3d startPoint, Double length,Double degree){//计算终点坐标double X = startPoint.X + length * Math.Cos(degree.DegreeToAngle());double Y = startPoint.X + length * Math.Sin(degree.DegreeToAngle());Point3d endPoint = new Point3d(X, Y, 0);return db.AddEntityToModelSpace(new Line(startPoint, endPoint));}}
}
封装类的使用
[CommandMethod("LineAdd")]public void LineAdd(){Database workingDatabase = HostApplicationServices.WorkingDatabase;Line line = new Line(new Point3d(100, 100, 0), new Point3d(200, 100, 0));workingDatabase.AddEntityToModelSpace(line);Line line1 = new Line(new Point3d(200, 100, 0), new Point3d(200, 200, 0));Line line2 = new Line(new Point3d(200, 100, 0), new Point3d(100, 100, 0));workingDatabase.AddEntityToModelSpace(line1,line2);}
相关文章:
CAD二次开发(2)-将直线对象添加到CAD图形文件
1. 准备工作 创建一个类库项目,如下: 2. 分析Line对象 Line类的初始化方法和参数 using Autodesk.AutoCAD.DatabaseServices; Line line new Line();Line 继承Curve 继承Entity 继承DBObject 继承Drawable 继承RXObject 初始化方法有两个…...
代码随想录二刷 Day05 | 242.有效的字母异位词,349. 两个数组的交集,202. 快乐数,1. 两数之和,454.四数相加II,383. 赎金信
题目与题解 参考资料:哈希表理论基础 Tips: 一般哈希表都是用来快速判断一个元素是否出现集合里哈希表生成原理:先通过哈希函数将变量映射为hashcode,如果二者hashcode相同,再通过哈希碰撞方法(拉链法&…...
2024年四川省三支一扶报名流程图解✅
2024年四川省三支一扶报名流程图解✅ 🔴时间安排 1、报名时间:5月31日—6月4日17:00 2、资格初审时间:5月31日—6月5日17:00 3、准考证打印时间:6月25日—6月29日 4、笔试时间:6月30日 5、笔试成绩:7…...
js Dom基础
获取元素 1、getElementById() 通过id属性获取一个元素节点对象 <div id"div1"></div> <script> var div1 document.getElementById(div1) </script> 2、 getElementsByTagName()可以根据标签名来获取一组元素节点对象 这个方法会给我们返…...
pytest识别测试用例的机制以及和unittest的区别
pytest识别测试用例的机制 文件 以test_开头或以_test结尾的python文件,即test_xxx.py或xxx_test.py类,在第一点识别到的文件中的类,且满足一下任一条件: 1)以Test_开头,且没有__init__()初始化函数的类&a…...
民国漫画杂志《时代漫画》第17期.PDF
时代漫画17.PDF: https://url03.ctfile.com/f/1779803-1248612629-85326d?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了,截止1937年6月战争来临被迫停刊共发行了39期。 ps:资源来源网络!...
[AIGC] Spring Boot 2 自定义 Starter 指南
Spring Boot 包含一系列的 “Starter POMs”,它们都是一些方便的依赖描述符,你可以在你的应用中导入。在一些情况下,你可能想创建自己的自定义 starter。以下是创建自己的 Spring Boot Starter 的步骤。 文章目录 1. 创建基本的 Maven 项目2.…...
HCIP综合实验命令
目录 一、配置IP地址 二、配置DHCP 三、配置静态路由(内网通) 四、配置缺省路由 (外网通) 五、配置缺省 (全网通) 六、防环配置 七、配置远程登录 八、修改优先级 九、配置MP-GROUP 十、配置ppp进…...
JS移动端设置mouseover,mouseleave有效么
在移动设备的浏览器环境中,mouseover 和 mouseleave 事件的行为与桌面浏览器有所不同,主要是因为移动设备的交互方式主要是基于触摸的,而不是基于鼠标的。 在移动设备上,当用户触摸屏幕时,通常会触发 touchstart 事件…...
IAR9.30安装和注册相关
下载解压licpatcher64工具,把licpatcher64.exe拷贝到IAR的安装目录中双击运行。 示例IAR9.30.1默认安装如下如下,一共三个分别拷贝运行,不要遗漏。 C:\Program Files\IAR Systems\Embedded Workbench 9.1\arm\bin C:\Program Files\IAR Syst…...
HTTP Digest Access Authentication Schema
HTTP Digest Access Authentication Schema 背景介绍ChallengeResponse摘要计算流程总结参考 背景 本文内容大多基于网上其他参考文章及资料整理后所得,并非原创,目的是为了需要时方便查看。 介绍 HTTP Digest Access Authentication Schemaÿ…...
MySql超大Sql文件导入效率优化
对于MySQL中超大SQL文件的导入,效率优化是至关重要的,因为不当的操作可能导致导入过程耗时过长,甚至失败。以下是一些建议来优化MySQL超大SQL文件的导入效率: 调整max_allowed_packet参数: 这个参数定义了MySQL服务器和…...
【leetcode1944--队列中可以看到的人数】
有n人排成一个队列,从左到右编号为0到n-1,height数组记录每个人的身高,返回一个数组,记录每个人能看到几个人。 类比:山峰问题,高的后面的矮的看不见。 从后往前,最后一个元素入栈,…...
基于51单片机的室内空气质量检测-仿真设计
本设计是基于单片机的空气质量检测设计,主要实现以下功能: 可实现通过SGP30测量二氧化碳及甲醛浓度,当超过设置的最大值时,进行报警及通风和净化空气处理 可实现通过MQ-4测量甲烷浓度,当超过设置的最大值时࿰…...
day22二叉树part08 | 235. 二叉搜索树的最近公共祖先 701.二叉搜索树中的插入操作 450.删除二叉搜索树中的节点
**235. 二叉搜索树的最近公共祖先 ** 这里利用上了二叉搜索树的特性,从上到下遍历,最近的公共祖先一定是满足p->val < root->val < q->val的 class Solution { public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, Tr…...
【Linux】Linux环境基础开发工具_2
文章目录 四、Linux环境基础开发工具2. vimvim的常见模式 未完待续 四、Linux环境基础开发工具 2. vim vim 是Linux下的一款 多模式编辑器 ,可以用来写代码,是 vi 的升级版。 此时无法输入,需要切换模式。 如上图,i 就是切换成…...
长方形边框 上方中间有缺口 css
<div class"text_6">大234234师掌4234柜</div><div class"text-wrapper_1"><span class"paragraph_1">四川慧创云戈科技有限公司推出的“大师掌柜”,是一个以餐饮外卖为切入口,专注实体小店新零售…...
2024-05-29 架构-程序设计-思考
摘要: 最近在抽出时间做一个数据库的driver, 其中有些问题驱动的软件代码的思考,是很值得回味的。 做的系统,所思考的问题,所设计的解决方案,其实都是可以看作是对解决问题方式。而不仅仅是某个类库的API的使用,某个…...
关于网络的基础知识
大家好,在当今数字时代,网络已经成为我们生活中不可或缺的一部分,它连接着世界的每一个角落,让信息、资源和人们彼此之间无阻碍地交流和共享。然而,对于许多人来说,网络仍然是一个神秘而复杂的领域…...
CTF网络安全大赛简单web题目:eval
题目来源于:bugku 题目难度:简单 一道简单web的题目 题目源代码: <?phpinclude "flag.php";$a $_REQUEST[hello];eval( "var_dump($a);");show_source(__FILE__); ?> 这个PHP脚本有几个关键部分,但…...
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...
使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...
基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...
计算机基础知识解析:从应用到架构的全面拆解
目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...
