ObjectArx 学习笔记(一)--入口函数acrxEntryPoint

参考资料:《AutoCAD 2000 ARX二次开发实例精粹》

1、Arx程序的初始化:新建完工程之后,Arx程序的初始化在acrxEntryPoint()函数的AcRx::kInitAppMsg事件中,或该事件调用的函数中进行(例如InitApp()函数))。然后调用acedRegCmds->addCommand()函数在AutoCAD命令堆栈中注册新命令。

CAD命令标志

主标识:(常用的)
ACRX_CMD_MODAL 在别的命令执行的时候该命令不会在其中执行。
ACRX_CMD_TRANSPARENT 命令可以再其它命令中执行,但在该标志下ads_sssetfirst()不能使用

次要标志:(可选的)
ACRX_CMD_USEPICKSET 命令可以得到pickfirst集。也可以设置,但命令结束后就不存在了。
ACRX_CMD_REDRAW 和ACRX_CMD_USEPICKSET标志位一样,实体会重新绘制。
ACRX_CMD_NOPERSPECTIVE 命令不能使用在当前视口为正交模式时。
ACRX_CMD_SESSION 使用该命令时一定要锁文档,因为它操作的不是当前文档。否则块表打不开
ACRX_CMD_NOTILEMODE 命令不能使用在模型空间中
ACRX_CMD_NOPAPERSPACE 命令不能使用在图纸空间中
ACRX_CMD_UNDEFINED 命令调用必须加命令组名
ACRX_CMD_DEFUN 命令使用在lisp中
ACRX_CMD_NOHISTORY 命令不会保存在最近使用命令列表中
ACRX_CMD_NO_UNDO_MARKER 命令不设置undo标志

2、Arx程序的卸载:Arx程序的卸载在acrxEntryPoint()函数的AcRx::kUnloadAppMsg事件中,或该事件调用的函数中进行(例如UnloadApp()函数))。然后调用acedRegCmds->removeGroup()函数将初始化中注册的命令组在堆栈中清除,调用deleteAcRxClass()函数清除程序中定义的任何自定义类。

3、CAD启动时加载Arx应用程序:编辑AutoCAD初始加载文件acad.rx,指定需要在启动时加载的Arx程序名称,

4、访问CAD当前图形数据库:使用函数acdbHostApplicationServices()->workingDatabase()访问。

5、ID和句柄:每个图形数据库中的对象都有一个对象标识符(ID)和一个句柄,对象句柄只是在某个数据库中是唯一的,对象ID在所有打开的数据库中都是唯一存在,但是对象ID只在图形编辑过程中才存在,而对象句柄在图形存盘时会保存在文件中。利用对象ID,可以获取对象指针,从而进行各种操作。

6、获取对象ID的方法:第一种:创建一个对象并添加到数据库中,数据库会返回赋予它一个ID并返回(最常用);第二种:对于数据库创建时就存在的对象(例如:符号表和命名对象词典),利用CAD图形数据库协议可以获得这些对象的ID;第三种:利用特定类的协议来获取对象的ID;第四种:迭代器获取;第五种:选择集获取。

7、CAD数据库中的9种符号表及符号表记录:                                                                                                                                   AcDbBlockTable    AcDbBlockTableRecord (块表)
AcDbDimStyleTable    AcDbDimStyleTableRecord (尺寸样式表)
AcDbLayerTable    AcDbLayerTableRecord (层表)
AcDbLinetypeTable    AcDbLinetypeTableRecord (线型表)
AcDbRegAppTable   AcDbRegAppTableRecord (程序注册表)
AcDbTextStyleTable    AcDbTextStyleTableRecord (文字样式表)
AcDbUCSTable    AcDbUCSTableRecord (用户坐标表)
AcDbViewportTable    AcDbViewportTableRecord (视口表)
AcDbViewTable    AcDbViewTableRecord (视图表)                                                                                                                          块表中最初的三个块表记录:模型空间记录(MODEL_SPACE)和两种图纸空间记录(*PAPER_SPACE)和(*PAPER_SPACE0),层表的最初记录为“0层记录”,线型表最初记录为(CONTINUOUS线型记录)。

8、命名对象词典:当CAD数据库被创建时,命名对象词典已经包含了四种数据库词典对象:组词典(GROUP dictionary)、多线样式词典(MLINE dictionary)、布局词典(layout dictionary)、打印样式词典(plot style name dictionary),其中多线样式词典中包含标准样式(standard style)。

9、创建实体的步骤(AcDbLine为例)
//定义块表记录名称
Cstring blkname,

//获取当前图形数据库中的块表
AcDbBlockTable* pBlkTbl = NULL;
acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlkTbl,AcDb::kForWrite);

//创建新的块表记录,给块表记录设置名称,并将块表记录添加到块表中,关闭块表

AcDbBlockTableRecord *pBlkTblRcd = new AcDbBlockTableRecord();
pBlkTblRcd->setName(blkname);
AcDbObjectId blkDefId;
pBlkTbl->add(blkDefId,pBlkTblRcd );
pBlkTbl->close();

//定义一个AcDbLine实体
AcGePoint3d pStart(0,0,0),pEnd(100,100,0);
AcDbLine *pLine = new AcDbLine(pStart,pEnd);

//将实体添加到块表记录中
AcDbObjectId entId;
pBlkTblRcd->appendAcDbEntity(entId,pLine);

//关闭实体及块表记录
pLine1->close();
pBlkTblRcd->close();

//除了创建新的块表记录,还能获取指定名称的块表记录,此处为获取模型空间块表记录
AcDbBlockTableRecord *pBlkRec = NULL;
pBlkTbl->getAt(ACDB_MODEL_SPACE,pBlkRec,AcDb::kForRead)

10、创建新图层的步骤

//定义层表记录名称
Cstring layerName;

// 获得当前图形的层表
AcDbLayerTable *pLayerTb = NULL;
acdbHostApplicationServices()->workingDatabase()->getLayerTable(pLayerTb, AcDb::kForRead);

// 创建新的层表记录
AcDbLayerTableRecord *pLayerTblRcd;
pLayerTblRcd = new AcDbLayerTableRecord();
pLayerTblRcd->setName(layerName);

//将新的层表记录添加到层表中,并关闭块表记录及块表
AcDbObjectId layerTblRcdId;
pLayerTb->add(layerTblRcdId, pLayerTblRcd);
pLayerTblRcd->close();
pLayerTbl->close();

11、打开和关闭实体
 

Acad::ErrorStatus changeColor(AcDbObjectId entID,Adesk::UInt16 newColor)
{
    //定义一个实体对象,并利用参数entId打开这个实体对象
    AcDbEntity* pEnt;
    Acad::ErrorStatus es= acdbOpenObject(pEnt,entID,AcDb::kForWrite);

    //修改实体颜色
    pEnt->setColorIndex(newColor);

    //关闭实体对象
    pEnt->close();

    //返回状态
    return es;
}


上面的代码段中,实体被打开进行写操作,有些函数(如AcDbBlockTable::getAt())可以在获得对象ID的同时打开对象,对象在没有被加入数据库之前不能被关闭,这是它可以随时被删除(delete),但是。当对象被添加到数据库之后,就不能直接用delete()删除,这时可以调用AcDbObject::erase()函数将对象打上删除标记,此对象在数据库被析构之间任然存在,但是当图形存盘时不能被保存。(直接删除已加入数据库的对象会导致CAD崩溃)。

12、操作返回值Acad::ErrorStatus:Acad::ErrorStatus是错误代码的返回值类型,当返回值不正确时,应该在退出程序前完成诸如关闭对象,清理内存等工作。

13、在命令行输出字符串函数:acutPrintf(const  char* format,....)。

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值