3、ObjectARX开发创建直线、圆、圆弧和修改对象属性
一、本节课程
Arx二次开发创建直线、圆、圆弧和修改对象属性
二、本节要讲解的知识点
1、如何应用C++ ARX二次开发创建直线。
2、如何应用C++ ARX二次开发创建圆。
3、如何应用C++ ARX二次开发创建圆弧。
4、如何修改对象的属性。
5、腾讯课堂云幽学院详细的内容讲解。
三、具体内容
1、创建一条直线,直线的起点是(0,0,0),直线的终点(100,100,0)。
2、表:表是数据库的组成单位,一个数据库至少含有一个表。
3、记录:记录是表的组成单位,一个表可能含有多个记录,也可能不包含任何记录。
4、用一个图来描述AUTOCAD图形数据库的基本结构。

5、创建图形对象的步骤:
(1)确定要创建对象的图形数据库:acdbHostApplicationServices->workingDatabase()
(2)获得这个图形数据库的块表:->getBlockTable(块表指针,打开的方式)
(3)获得一个存储实体的块表记录,所有模型空间的实体都存储在模型空间的特定记录里面。
(4)创建实体类对象,将该对象附加到特定的块表记录中。
6、创建命令需要修改两个地方:拷贝模板提供的代码,将里面的命令修改成自己想要定义的命令名字(命令的全局名和本地名)。
实现命令的函数:static void YunyouMyGroupCreateLine (),命令函数名字由三部分组成,包括前缀标识“Yunyou”,命令组的名字“MyGroup”、命令名字“CreateLine”。
7、创建直线的实现代码如下
|
static AcDbObjectId YunyouMyGroupCreateLine () { //(1)确定要创建对象的图形数据库:acdbHostApplicationServices()->workingDatabase() //(2)获得这个图形数据库的块表:acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlockTable,AcDb::kForRead); //(3)获得一个存储实体的块表记录,所有模型空间的实体都存储在模型空间的特定记录里面:pBlockTable->getAt(ACDB_MODEL_SPACE,pBlockTableRecord,AcDb::kForWrite) //(4)创建实体类对象,将该对象附加到特定的块表记录中。 AcDbLine *pLine=new AcDbLine(ptStart,ptEnd); pBlockTableRecord->appendAcDbEntity(lineId,pLine); //关闭我们实体、块表记录、块表。否则导致致命错误AUTOCAD的退出。 AcGePoint3d ptStart(0,0,0); AcGePoint3d ptEnd(100,100,0); AcDbLine *pLine=new AcDbLine(ptStart,ptEnd); AcDbBlockTable *pBlockTable=NULL; acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlockTable,AcDb::kForRead); AcDbBlockTableRecord *pBlockTableRecord; pBlockTable->getAt(ACDB_MODEL_SPACE,pBlockTableRecord,AcDb::kForWrite);//模型空间就是一个块表记录 AcDbObjectId lineId; pBlockTableRecord->appendAcDbEntity(lineId,pLine); pBlockTable->close(); pBlockTableRecord->close(); pLine->close(); return lineId; } |
8、对于高版本(AutoCAD2016及以上)来说,编译后生成的ARX文件需要放置在AUTOCAD的安装目录或者其目录下,在加载ARX时就不会有“安全性提示”。
9、加载ARX: 在命令行ARX 回车 Load, APPLOAD
10、调用命令:CreateLine,效果如下:

在模型空间创建了一条直线,直线的起点是(0,0,0)直线的终点是(100,100,0)。
11、修改对象属性的思路:需要打开图形数据库的对象,AcDbObjectId
打开和关闭图形数据库的对象:
(1)acdbOpenAcDbEntity适用于打开继承于AcDbEntity的数据库常驻对象。
Acad::ErrorStatus acdbOpenAcDbEntity(
AcDbEntity*& pEnt,
AcDbObjectId id,
AcDb::OpenMode mode,
bool openErasedEntity = false
);
(2)acdbOpenAcDbObject适合于打开未继承于AcDbEntity的数据库常驻对象。
Acad::ErrorStatus acdbOpenAcDbObject(
AcDbObject*& pObj,
AcDbObjectId id,
AcDb::OpenMode mode,
bool openErasedObject = false
);
(3)acdbOpenObject不知道要打开的对象是否继承于AcDbEntity时采用此方法。
ACDB_PORT Acad::ErrorStatus acdbOpenObject(
AcDbObject*& pObj,
AcDbObjectId id,
AcDb::OpenMode mode,
bool openErased = false,
const AcRxClass * pClass = nullptr
);
打开对象之后使用close()方法将其关闭。
12、ID(AcDbObjectId)、指针、句柄(handle)、和ads_name
(1)ID:AcDbObjectId,在一个AUTOCAD任务中,可能会加载有多个图形数据库,但是所有对象的ID在这次任务中都是独一无二的,在不同任务中,同一图形对象的ID可能不同。适合编程使用。
(2)句柄:handle,在一个DWG图形文件里面是唯一的,但是不同的DWG文件句柄有可能重复。句柄随DWG文件一起保存的,两次任务中同一对象的句柄是相同的。
(3)ads_name :不稳定的,在AUTOCAD中的一个特定图形中工作时可以使用,一旦退出AUTOCAD或者切换到另外一个图形,就会消失。

13、转化问题:
(1) ID-->对象指针:acdbOpenAcDbEntity、acdbOpenAcDbObject、acdbOpenObject
(2) 对象指针->ID:所有的对象都继承于AcDbObject,包含了一个叫做objectId()的函数可以获取到对象的指针。
(3) 句柄到ID:AcDbDataBase:getAcDbObjectId.
(4) ID到句柄:使用AcDbObjectId的handle函数。
(5) 指针到句柄:AcdbObject的getAcDbHandle函数
(6) ads_name到ID:使用全局函数acdbGetObjectId
(7) ID到ads_name:使用全局函数acdbGetAdsName。
四、总结
(1)图形数据库组成单位是表,表的组成单位是记录,实体包含在块表记录里面,要创建实体的步骤是:需要确定图形数据库,打开块表,获取特定的块表记录(通常来说就是模型空间),创建实体,并将实体添加到块表记录里面。
(2)高版本的ARX模块如果不在AUTOCAD“内部路径”则会有安全性提示,建议开发阶段将生成的文件放置于AUTOCAD安装路径的子目录中,避免恼人提示。
(3)几种标识: ID\句柄\ads_name\对象指针,特点以及如何使用、如何转换。
3、ObjectARX开发创建直线、圆、圆弧和修改对象属性的更多相关文章
- NX二次开发-创建直线UF_CURVE_create_line与NXOpen->CreateLine
NX11+VS2013 #include <uf.h> #include <uf_curve.h> #include <NXOpen/CurveCollection.hx ...
- NX二次开发-创建直线(起点-向量方向-长度)UF_CURVE_create_line
NX9+VS2012 #include <uf.h> #include <uf_curve.h> #include <uf_csys.h> #include < ...
- 关于Entity Framework采用DB First模式创建后的实体批量修改相关属性技巧
Entity Framework采用DB First模式创建实体是比较容易与方便的,修改已创建的实体在个数不多的情况下也是没问题的,但如果已创建的实体比较多,比如10个实体以上,涉及修改的地方比较多的 ...
- 创建一个圆类Circle的对象,分别设置圆的半径计算并分别显示圆半径、圆面积、圆周长。
编写一个圆类Circle,该类拥有: ①一个成员变量 Radius(私有,浮点型): // 存放圆的半径: ②两个构造方法 Circle( ) // 将半径设为0 Circle(double r ) ...
- Arcgis for js开发之直线、圆、箭头、多边形、集结地等绘制方法
p{ text-align:center; } blockquote > p > span{ text-align:center; font-size: 18px; color: #ff0 ...
- Civil 3D 二次开发 创建AutoCAD对象—— 01 —— 创建直线
在方法CreateLine内完成以下代码: 01 public void CreateLine() 02 { 03 PromptPointOptions ppo = new PromptPointOp ...
- c++ Arx二次开发创建椭圆和样条曲线
一.本节课程 c++ Arx二次开发创建椭圆和样条曲线 二.本节要讲解的知识点 1.如何应用C++ ARX二次开发创建椭圆(对AcDbEllipse类的构造函数的直接封装和根据外接矩形来创建椭圆) 2 ...
- 4、c++ Arx二次开发创建多段线
一.本节课程 c++ Arx二次开发创建多段线 二.本节要讲解的知识点 如何应用C++ ARX二次开发创建多段线(AcDbPolyline.AcDb2dPolyLine.AcDb3dPolyline的 ...
- 2、Arx二次开发创建第一个应用程序
一.本节课程 Arx二次开发创建第一个应用程序 二.本节要讲解的知识点 1.手动创建ARX的应用的步骤. 2.应用向导创建ARX应用程序的步骤. 三.具体内容 1.需求:创建一个Hello World ...
随机推荐
- python3: 字符串和文本
1. 分割字符串-使用多个界定符[re.split()] >>> line = 'asdf fjdk; afed, fjek,asdf, foo' >>> impo ...
- virtualbox 错误解决记录
1,E_INVALIDARG (0x80070057),virtualbox中Cannot register the hard disk错误解决办法 virtualbox中加载已有的虚拟硬盘时出现Ca ...
- 将Python打包成可执行文件exe的心路历程
导言: 我们有时候需要将做好的Python程序打包成为一个exe , 方便我们使用,查找了资料发现 pyinstaller .py2exe,最后还是选择的pyinstaller,用的时候踩过了挺多的坑 ...
- 多线程操作C++ STL vector出现概率coredump问题及尽量避免锁的双缓冲队列
多线程操作全局变量,必须考虑同步问题,否则可能出现数据不一致, 甚至触发coredump. 前段时间, 遇到一个多线程操作了全局的vector的问题, 程序崩了.场景是这样的:某全局配置参数保存在一 ...
- javascript 的MD5代码备份,跟java互通
var MD5 = function (string) { function RotateLeft(lValue, iShiftBits) { ...
- 数据库学习之中的一个: 在 Oracle sql developer上执行SQL必知必会脚本
1 首先在開始菜单中打开sql developer: 2. 创建数据库连接 点击左上角的加号 在弹出的对话框中填写username和password 測试假设成功则点击连接,记得角色要写SYSDBA ...
- 初探tp
现在对前端的要求越来越高了 基本上身为一个前端人员需要会一种后台语言,于是选择了当下流行的php.因为是自学对我这个不怎么懂代码的人来说还是有点难度的. 1.先看看thinkphp的目录结构 1 ├ ...
- php中static静态变量的使用方法详解
php中的变量作用范围的另一个重要特性就是静态变量(static 变量).静态变量仅在局部函数域中存在且只被初始化一次,当程序执行离开此作用域时,其值不会消失,会使用上次执行的结果. 看看下面 ...
- Hive学习之路 (八)Hive中文乱码
Hive注释中文乱码 创建表的时候,comment说明字段包含中文,表成功创建成功之后,中文说明显示乱码 create external table movie( userID int comment ...
- ES6新特性1:let和const
本文摘自ECMAScript6入门,转载请注明出处. 一.let 1. ES6增了let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效. { let a ...