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);


        }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024年汉字小达人活动4个多月开赛:18道历年选择题和答案、解析

根据近年的安排&#xff0c;2024年第11届汉字小达人比赛还有4个多月就启动&#xff0c;那么孩子们如何利用这段时间有条不紊地备考呢&#xff1f;我的建议是两手准备&#xff1a;①把小学1-5年级的语文课本上的知识点熟悉&#xff0c;重点是字、词、成语、古诗。②把历年真题刷…

求两个整数最大公约数的方法

可以使用递归来实现&#xff0c;编写gcd函数返回最终的结果(最大公约数)。传入两个参数&#xff0c;如果存在一个数字不大于0就返回0&#xff0c;利用上面的公式就可以得出最后的结果。

电脑远程控制另一台电脑怎么弄?

可以远程控制另一台电脑吗&#xff1f; “你好&#xff0c;我对远程访问技术不太了解。现在&#xff0c;我希望我的朋友可以远程控制我的Windows 10电脑&#xff0c;以便她能帮我解决一些问题。请问&#xff0c;有没有免费的方法可以实现这种远程控制&#xff1f;我该如何操作…

机器学习大模型驱动:未来的趋势与应用

文章目录 &#x1f4d1;前言一、什么是机器学习大模型&#xff1f;1.1 大模型的特点1.2 大模型的技术基础 二、大模型的技术实现2.1 Transformer 架构2.2 预训练和微调2.3 模型并行和数据并行 三、大模型的应用场景3.1 自然语言处理&#xff08;NLP&#xff09;3.2 计算机视觉&…

SpringMVC源码解读[1] -Spring MVC 环境搭建

源码地址: https://github.com/chen-jiacheng/springmvc-quickstart 一、使用 IDEA 创建 Spring MVC 项目 直接创建项目即可 默认项目结构: springmvc-quickstart ├── pom.xml └── src├── main│ ├── java│ │ └── com│ │ └── chenjiache…

2024Spring> HNU-计算机系统-实验4-Buflab-导引+验收

前言 称不上导引了&#xff0c;因为验收已经结束了。主要是最近比较忙&#xff0c;在准备期末考试。周五晚上才开始看实验&#xff0c;自己跟着做了一遍实验&#xff0c;感觉难度还是比bomblab要低的&#xff0c;但是如果用心做的话对于栈帧的理解确实能上几个档次。 实验参考…

(南京观海微电子)——TFT LCM的作用

VCOM介绍 VCOM是液晶分子偏转的参考电压 &#xff0c;要求要稳定&#xff0c;对液晶显示有直接影响&#xff0c;具体的屏不同的话 也是不同的。 电压的具体值是根据输入的数据以及Vcom电压大小来确定的&#xff0c;用来显示各种不同灰阶&#xff0c;也就是实现彩色显示GAMMA简…

《计算机网络微课堂》3-11 虚拟局域网 VLAN

本节课我们介绍虚拟局域网 VLAN 的基本概念。 ‍ 3.11.1 虚拟局域网 VLAN 概述 在之前课程中我们已经介绍过了以太网交换机自学习和转发帧的流程&#xff0c;‍‍以及为避免网络环路而产生的生成树协议。 以太网交换机工作在数据链路层&#xff0c;‍‍也包括物理层&#xf…

搜索自动补全-elasticsearch实现

1. elasticsearch准备 1.1 拼音分词器 github地址&#xff1a;https://github.com/infinilabs/analysis-pinyin/releases?page6 必须与elasticsearch的版本相同 第四步&#xff0c;重启es docker restart es1.2 定义索引库 PUT /app_info_article {"settings": …

vim操作手册

vim分为插入模式、命令模式、底行模式。 插入模式&#xff1a;编辑模式 命令模式&#xff1a;允许使用者通过命令&#xff0c;来进行文本的编辑控制 底行模式&#xff1a;用来进行让vim进行包括但不限于shell进行交互 w&#xff1a;保存 wq&am…

AI Agent: Agent框架+7个实例

何谓Agent Agent 作为一种新兴的人工智能技术&#xff0c;正在受到越来越多的关注。要说清楚什么是 Agent&#xff0c;先得看看人工智能的本质是什么。 人工智能这个名称来自它试图通过计算机程序或机器来模拟、扩展和增强人类智能的 一些方面。在这个定义中&#xff0c;“人…

Java进阶学习笔记20——枚举

认识枚举&#xff1a; 枚举是一种特殊的类。 枚举类的格式&#xff1a; 说明&#xff1a; 第一行是罗列枚举的对象名称。只能写合法的标识符&#xff08;名称&#xff09;&#xff0c;多个名称用逗号隔开。 这些名称本质上都是常量&#xff0c;每个变量都会记住枚举类的一个…

z3-加法器实验

补码器加减法&#xff0c;运算方法简介 我们要知道什么是补码的加法&#xff0c;我们为什么要用补码的加法&#xff1f; 补码的加法其实就是将两个补码形式的二进制数字直接相加&#xff0c;处理的时候忽略超出固定位数的进位。补码的加法运算和无符号二进制数的加法操作一样&…

哈希双指针

文章目录 一、哈希1.1两数之和1.2字母异位词分组1.3最长子序列 二、双指针2.1[移动零](https://leetcode.cn/problems/move-zeroes/description/?envTypestudy-plan-v2&envIdtop-100-liked)2.2[盛最多水的容器](https://leetcode.cn/problems/container-with-most-water/d…

新人攻略:避开这3大坑,让老员工主动带你飞!

进入职场的新人们&#xff0c;常常会感到困惑和挑战。他们可能会发现自己在与老员工的交流中遇到难题&#xff0c;甚至发现老员工并不愿意花费时间和精力去指导他们。这背后的原因是什么呢&#xff1f;又该如何改善这一现象呢&#xff1f;本文将从新员工的角度出发&#xff0c;…

C# WPF入门学习(二)——创建一个demo工程

本期任务&#xff1a;创建一个按钮&#xff0c;点击之后在控制台打印文本&#xff0c;设置背景图片、圆角按钮加分。 一、创建WPF项目 创建工程 1. 打开VS 我用的2019 2. 打开界面 3. 选择创建项目 4. 选择C#中的WPF框架 5. 填写项目名称和选择路径 新项目就创建好了&#…

彩虹聚合二级域名DNS管理系统源码v1.3

聚合DNS管理系统可以实现在一个网站内管理多个平台的域名解析&#xff0c; 目前已支持的域名平台有&#xff1a;阿里云、腾讯云、华为云、西部数码、CloudFlare。 本系统支持多用户&#xff0c;每个用户可分配不同的域名解析权限&#xff1b;支持API接口&#xff0c; 支持获…

(Java面试题分享)万里长征-03-搜狐

万里长征-03-搜狐 ⚙ 以下内容基于GPT-4o模型 问题 1.LeetCode103 二叉树的锯齿形层序遍历 103. 二叉树的锯齿形层序遍历 - 力扣&#xff08;LeetCode&#xff09; 2.LeetCode5 最长回文子串 5. 最长回文子串 - 力扣&#xff08;LeetCode&#xff09; 3.Kafka为何那么快 …

Win32 API

个人主页&#xff1a;星纭-CSDN博客 系列文章专栏 : C语言 踏上取经路&#xff0c;比抵达灵山更重要&#xff01;一起努力一起进步&#xff01; 一.Win32 API 1.Win32 API介绍 Windows这个多作业系统除了协调应⽤程序的执⾏、分配内存、管理资源之外&#xff0c;它同时也是…