百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 文章教程 > 正文

从绘制一条直线,了解CAD的层次结构-C#二次开发CAD(二)

xsobi 2024-12-14 15:45 1 浏览

刚开始做C#的开发练习时,觉得操作步骤非常繁琐。只有在了解了CAD的层次结构以后,思路才会变得清晰起来,今天根据教材中提供的绘制直线例子,咱们简单分析一下CAD开发的层次结构。

一、绘制直线的代码

using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.EditorInput;


namespace _001_LINE
{
    public class Class1
    {
        [CommandMethod("AddLine")]
        public static void AddLine()
````````{
            // 获取当前文档和数据库
            Document acDoc = Application.DocumentManager.MdiActiveDocument;
            Database acCurDb = acDoc.Database;
            Editor acDocEd = acDoc.Editor;
            // 启动事务
            using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
            {
                // 以读模式打开Block表
                BlockTable acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead) as BlockTable;
                BlockTableRecord acBlkTblRec = acTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;
                Line acLine = new Line(new Point3d(0, 0, 0), new Point3d(100, 100, 0));
                acBlkTblRec.AppendEntity(acLine);
                acTrans.AddNewlyCreatedDBObject(acLine, true);
                acTrans.Commit();
            }
        }
    }
}

上面的代码是教材中的一个例子,在模型空间中增加一个从原点到100,100坐标点的直线

二、步骤分析

代码虽然复杂,但是通过咱们逐条分析以后,思路就会清晰很多。下面是分析过程

第1步:注册快捷键

在类下面,方法上面输入[CommandMethod("AddLine")]命令,就可以在CAD中注册一个AddLine快捷键,通过快捷键,调用下面的方法。

第2步:定义方法AddLine()

第3步:定义当前文档、数据库、编辑器的变量

Application代表CAD的程序,DocumentManager代表文档管理器,MdiActiveDocument代表当前文档。

Database代表当前文档的数据库。

Editor代表当前文档的编辑器,即命令行,可以通过定义的acDocEd变量向CAD文档发送信息,比如:

acDocEd.WriteMessage("Hello World!\n");

执行上述命令,就向CAD文档中发送了一条信息。

第4步:用事务管理器打开数据库、块表BlockTable和块表记录BlockTableRecord

打开的方式是先获取到对象的ID号,然后使用事务管理器的GetObject方法,以读或写的方式打开对象。

所有的实体图形,比如直线、圆等都在块表记录中,块表记录在块表中,块表又属于数据库,所以先要打开当前数据库,再以当前数据库的块表ID打开块表,最后打开块表记录。

using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
            {
                BlockTable acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead) as BlockTable;
                BlockTableRecord acBlkTblRec = acTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace],OpenMode.ForWrite) as BlockTableRecord;

默认情况下,每个块表至少包括三个块表记录:1个模型空间,2个布局空间,对应的字符串是:

*Model_Space *Paper_Space、 *Paper_Space0

如果把刚才代码中的[BlockTableRecord.ModelSpace]替换为["*Model_Space"],所得到的效果是一样的,都可以向模型中增加直线。

向第1个布局添加直线可以使用[BlockTableRecord.PaperSpace],向某个块添加直线,可以使用索引模式,比如 acBlkTbl["MyBlock"] ,即打开了MyBlock这个块名的块表记录。

第5步:创建直线

在括号里面增加Point3d类型的三维坐标点,不必再像Python中一样进行数据转换了。

第6步:将直线添加到块表记录和事务、保存到数据库

完成后,加载这个DLL文件,输入ADDLINE快捷键,就可以在模型空间中看到这条新增加的直线了。

当然,我们可以把这条流水线封装起来,直接调用封装好的工具,传输入直线对象就能方便地使用了。

三、直线的层次结构

通过以上的步骤,我们可以绘制出一个CAD的层次结构,进而在编制代码过程中不再迷惘。

相关推荐

js向对象中添加元素(对象,数组) js对象里面添加元素

一、添加一个元素对象名["属性名"]=值(值:可以是一个值,可以是一个对象,也可以是一个数组)这样添加进去的元素,就是一个值或对象或数组...

JS小技巧,如何去重对象数组?(一)

大家好,关于数组对象去重的业务场景,想必大家都遇到过类似的需求吧,这对这样的需求你是怎么做的呢。下面我就先和大家分享下如果是基于对象的1个属性是怎么去重实现的。方法一:使用.filter()和....

「C/C++」之数组、vector对象和array对象的比较

数组学习过C语言的,对数组应该都不会陌生,于是这里就不再对数组进行展开介绍。模板类vector模板类vector类似于string,也是一种动态数组。能够在运行阶段设置vector对象的长度,可以在末...

如何用sessionStorage保存对象和数组

背景:在工作中,我将[{},{}]对象数组形式,存储到sessionStorage,然后ta变成了我看不懂的形式,然后我想取之用之,发现不可能了~记录这次深刻的教训。$clickCouponIndex...

JavaScript Array 对象 javascript的array对象

Array对象Array对象用于在变量中存储多个值:varcars=["Saab","Volvo","BMW"];第一个数组元素的索引值为0,第二个索引值为1,以此类推。更多有...

JavaScript中的数组Array(对象) js array数组

1:数组Array:-数组也是一个对象-数组也是用来存储数据的-和object不同,数组中可以存储一组有序的数据,-数组中存储的数据我们称其为元素(element)-数组中的每一个元素都有一...

数组和对象方法&数组去重 数组去重的5种方法前端

列举一下JavaScript数组和对象有哪些原生方法?数组:arr.concat(arr1,arr2,arrn);--合并两个或多个数组。此方法不会修改原有数组,而是返回一个新数组...

C++ 类如何定义对象数组?初始化数组?linux C++第43讲

对象数组学过C语言的读者对数组的概念应该很熟悉了。数组的元素可以是int类型的变量,例如int...

ElasticSearch第六篇:复合数据类型-数组,对象

在ElasticSearch中,使用JSON结构来存储数据,一个Key/Value对是JSON的一个字段,而Value可以是基础数据类型,也可以是数组,文档(也叫对象),或文档数组,因此,每个JSON...

第58条:区分数组对象和类数组对象

示例设想有两个不同类的API。第一个是位向量:有序的位集合varbits=newBitVector;bits.enable(4);bits.enable([1,3,8,17]);b...

八皇后问题解法(Common Lisp实现)

如何才能在一张国际象棋的棋盘上摆上八个皇后而不致使她们互相威胁呢?这个著名的问题可以方便地通过一种树搜索方法来解决。首先,我们需要写一个函数来判断棋盘上的两个皇后是否互相威协。在国际象棋中,皇后可以沿...

visual lisp修改颜色的模板函数 怎么更改visual studio的配色

(defunBF-yansemokuai(tuyuanyanse/ss)...

用中望CAD加载LISP程序技巧 中望cad2015怎么加载燕秀

1、首先请加载lisp程序,加载方法如下:在菜单栏选择工具——加载应用程序——添加,选择lisp程序然后加载,然后选择添加到启动组。2、然后是添加自定义栏以及图标,方法如下(以...

图的深度优先搜索和广度优先搜索(Common Lisp实现)

为了便于描述,本文中的图指的是下图所示的无向图。搜索指:搜索从S到F的一条路径。若存在,则以表的形式返回路径;若不存在,则返回nil。...

两个有助于理解Common Lisp宏的例子

在Lisp中,函数和数据具有相同的形式。这是Lisp语言的一个重大特色。一个Lisp函数可以分析另一个Lisp函数;甚至可以和另一个Lisp函数组成一个整体,并加以利用。Lisp的宏,是实现上述特色的...