参考资料:《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,....)。