众所周知,数据库里面包含各种数据表,而数据表里面又是各种记录,当然还有字段。AUTOCAD里面对于图形的管理也是基于图形数据库的。因此,想要在DWG里面添加一条直线,只需要做三件事:

(1)打开数据表

(2)把直线放进去

(3)关闭数据表

听起来跟把大象关进冰箱里面差不多哈。。。。

图形数据库里面有存放图形的块表,存放图层的表,还有其他的以后会用上的表。因此第一步我们需要打开数据库,打开块表。

acdbHostApplicationServices()->workingDatabase();

这一行代码可以获取到当前图形数据库。刚开始我学习的时候很不理解,为何这个函数的开头是小写,其他的很多都是大写的为啥不一样?为什么不统一起来?然后我鼠标选中

acdbHostApplicationServices 按下F12,VS跳转到了dbapserv.h,定位到了
AcDbHostApplicationServices * acdbHostApplicationServices();

这一行,原来这个acdbHostApplicationServices是 AcDbHostApplicationServices的一个对象,这个对象是在头文件里面声明着的。打开ObjectARX的根目录,找到docs文件夹,打开arxref.chm文件,查找AcDbHostApplicationServices,基于AcRXObject,描述如下:

我的英语也不太好,大概就是这个类提供了对于CAD运行时的各种各样的服务。因此在我们调用acdbHostApplicationServices() 的时候,其实就是调用了这个类的构造函数,返回了一个AcDbHostApplicationServices的对象,这个类里面提供了一个workingDatabase()方法,可以返回当前窗口的图形数据库指针。到现在为止我们已经可以得到图形数据库了,即

acdbHostApplicationServices()->workingDatabase();

找到了图形数据库之后我们就要打开图形数据库的块表。查找AcDbDatabase,这个类提供了getBlockTable()函数,函数原型:

Acad::ErrorStatus getBlockTable(
AcDbBlockTable*& pTable,
AcDb::OpenMode mode
);

函数返回错误类型,有两个参数,一个是块表指针,另一个是打开模式。头文件里面找到了这个打开模式的定义:

const AcDb::OpenMode kForRead = AcDb::kForRead;
const AcDb::OpenMode kForWrite = AcDb::kForWrite;
const AcDb::OpenMode kForNotify = AcDb::kForNotify;

这个应该很好理解了,读、写、通知。这个通知我也是初学者,也不太清楚,暂且不表。

因此,我们定义一个块表指针,将引用传过去。

//获取块表
AcDbBlockTable *pBlockTable;
acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlockTable,kForRead);

获取了块表以后,就要添加一条记录,所以我们要先获取记录再添加。AcDbBlockTable块表类提供了getAt()函数,原型如下:

Acad::ErrorStatus getAt(
const ACHAR* entryName,
AcDbBlockTableRecord*& pRec,
AcDb::OpenMode openMode,
bool openErasedRec = false
) const;

第一个参数暂且用ACDB_MODEL_SPACE,第二个参数是块表记录指针,保存我们打开的块表记录。第三个参数是打开模式,这次要写,使用

kForWrite

第四个暂且用不上,使用默认参数。

//获取块表记录
AcDbBlockTableRecord *pBlockTableRecord;
pBlockTable->getAt(ACDB_MODEL_SPACE,pBlockTableRecord,kForWrite);

打开块表记录之后就可以往记录里面追加记录了。

AcDbBlockTableRecord块表记录类提供了appendAcDbEntity()函数,原型如下:

Acad::ErrorStatus appendAcDbEntity(
AcDbEntity* pEntity
);

因此,我们要创建我们的直线。

AcDbLine(
const AcGePoint3d& start,
const AcGePoint3d& end
);

创建直线需要两个AcGePoint3d类型的点。因此我们定义两个点。注意,在objectarx里面创建的写入到图形数据库的图形一定要在堆区创建,也就是必须使用new创建,不能在栈区创建,这点张帆的书上面没有具体解释为什么,我猜测是arx的机制是函数调用,后续还可能会使用,但是如果arx结束了或者卸载了就会出现问题。

所有new出来的图形数据都必须在不使用的时候close(),但是不能delete

贴一下整个方法的代码,其实代码也就是张帆的书里面的代码:

static void LZGMyGroupMyCommand () {
// Put your command code here
AcGePoint3d ptStart(0,0,0);
AcGePoint3d ptEnd(100,100,0);
AcDbLine *pLine = new AcDbLine(ptStart,ptEnd);
//获取块表
AcDbBlockTable *pBlockTable;
acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlockTable,kForRead);
//获取块表记录
AcDbBlockTableRecord *pBlockTableRecord;
pBlockTable->getAt(ACDB_MODEL_SPACE,pBlockTableRecord,kForWrite);
//将线添加到块表记录中
AcDbObjectId lineID;
pBlockTableRecord->appendAcDbEntity(lineID,pLine);
pBlockTableRecord->close();
pBlockTable->close();
pLine->close();
}

然后将生成的arx文件推拽进cad2016里面,输入

MyCommand

就可以看到原点处出现了一条直线。

总结一下流程:打开图形数据库>打开块表>打开块表记录>块表记录追加图形>关闭所有的图形

其他的所有的内容都是为了实现以上的几个步骤。

参考文献:张帆  objectarx

ObjectARX2016-2创建直线的更多相关文章

  1. Civil 3D 二次开发 创建AutoCAD对象—— 01 —— 创建直线

    在方法CreateLine内完成以下代码: 01 public void CreateLine() 02 { 03 PromptPointOptions ppo = new PromptPointOp ...

  2. 3、ObjectARX开发创建直线、圆、圆弧和修改对象属性

    一.本节课程 Arx二次开发创建直线.圆.圆弧和修改对象属性 二.本节要讲解的知识点 1.如何应用C++ ARX二次开发创建直线. 2.如何应用C++ ARX二次开发创建圆. 3.如何应用C++ AR ...

  3. NX二次开发-创建直线UF_CURVE_create_line与NXOpen->CreateLine

    NX11+VS2013 #include <uf.h> #include <uf_curve.h> #include <NXOpen/CurveCollection.hx ...

  4. NX二次开发-创建直线(起点-向量方向-长度)UF_CURVE_create_line

    NX9+VS2012 #include <uf.h> #include <uf_curve.h> #include <uf_csys.h> #include < ...

  5. NX二次开发-创建旋转UF_MODL_create_revolved

    NX9+VS2012 #include <uf.h> #include <uf_curve.h> #include <uf_modl.h> UF_initializ ...

  6. iOS 触摸事件与UIResponder(内容根据iOS编程编写)

    触摸事件 因为 UIView 是 UIResponder 的子类,所以覆盖以下四个方法就可以处理四种不同的触摸事件: 1.  一根手指或多根手指触摸屏幕 - (void)touchesBegan:(N ...

  7. 李洪强iOS经典面试题143-绘图与动画

    李洪强iOS经典面试题143-绘图与动画   绘图与动画 CAAnimation的层级结构 CAPropertyAnimation是CAAnimation的子类,也是个抽象类,要想创建动画对象,应该使 ...

  8. 动画黄金搭档:CADisplayLink&CAShapeLayer

    我们在开发中有时会遇到一些看似非常复杂的动画,不知该如何下手,今天的这篇文章中我会讲到如何利用CADisplayLink和CAShapeLayer来构建一些复杂的动画,希望能在你下次构建动画中,给你一 ...

  9. 动画黄金搭档:CADisplayLink & CAShapeLayer

    我们在开发中有时会遇到一些看似非常复杂的动画,不知该如何下手,今天的这篇文章中我会讲到如何利用CADisplayLink和CAShapeLayer来构建一些复杂的动画,希望能在你下次构建动画中,给你一 ...

  10. Java 2D API - 1. 基本概念

    Java 2D API扩展AWT包,对二维图形.文本及成像功能提供了支持,可用于开发复杂的界面.绘图软件和图像编辑器.Java 2D对象位于用户坐标空间(User coordinate space), ...

随机推荐

  1. (unsigned)short溢出后隐式转换为int

    同学被面试官问到一个细节中的细节,虽然个人觉得意义不大,但还是好奇并在和同学一起实验后搞清楚了,记录一下 如下: int main() { unsigned short a = 65535, b = ...

  2. dom4j解析和生成xml文件

    解析xml大致步骤: 1: 创建SAXReader: 2: 使用SAXReader解析指定的xml文档信息,并返回对应Document对象.Document对象中就包含了该xml文中的所有信息以及结构 ...

  3. SOJ1737 题解

    题意 给定一个长度为 \(n\) 的串 \(S\). 定义 \(occ(T)\) 表示串 \(T\) 在 \(S\) 中出现的次数. \(q\) 次询问,每次询问给定一个区间 \([l,r]\),查询 ...

  4. 面向对象程序设计A第一次blog

    一.前言 第一次题目集总结-- 题量:较多 难度:较低 知识点: 简单的输入输出 一些简单的运算和类型转换 一些简单的循环.选择.字符串.数组的使用 总结:题目比较简单,题量较多,内容就是一些简单的输 ...

  5. vue项目引入外部UI,不同页面自定义不同样式

    做项目有些需求是项目要改版,但是又想留一个老项目的入口,所以不同页面要用不同样式,对于引入外部UI来说是个麻烦事,因为要设置外部UI组件的样式必须是全局设置,也就是说<style>< ...

  6. CF单机版终极猎手30人版安装教程

    本游戏是CF的单机版本,内含终极猎手30人版,可变身四种终极猎手.这个版本只有这一种模式,没有其他的幽灵模式.生化模式.爆破模式.团队模式等等,如果想玩上述的模式,你可以在其他地方找.值得注意的是这个 ...

  7. 粉色的猫MISC(bugku)

    一  题目描述 ps:本题特别感谢树叶大佬给的一些提示以及WP!欢迎大家关注树木有点绿~~ 二 解题过程 下载附件得到zip压缩包 根据作者提示,压缩包注释应该为压缩包密码. 1.压缩包密码 一开始看 ...

  8. JavaSE——复杂对象数组练习

    定义一个长度为3的数组,数组存储1~3名学生对象作为初始数据,学生对象的学号,姓名各不相同. 学生的属性:学号,姓名,年龄. 要求1:再次添加一个学生对象,并在添加的时候进行学号的唯一性判断. 要求2 ...

  9. Linux系统实时监控

    命令 top   Top命令用于实时显示process的动态.参数如下:   d:设置显示的更新速度   q:无延迟的显示速度   c:切换显示模式,一共有两种显示模式,一是只显示执行档,另一种是显示 ...

  10. hive知识点总结

    hive知识点总结 1.什么是HIVE? 1.hive是hadoop生态圈的一个工具,提供一种结构化查询语言,可以查询HDFS或者其他文件系统上的文件. 2.hive操作: 1.hive一次使用命令: ...