ObjectArx开发笔记(二)---命令注册、表结构

一、注册AutoCAD命令

  • 方法:
    • 方法一:使用ACED_ARXCOMMAND_ENTRY_AUTO宏定义,如上篇
    • 方法二:使用acedRegCmds宏定义,如下
  • 位置:acrxEntryPoint.cpp文件内
  • 代码示例(/----此区域为用户写----/
    /*  ------定义函数:后续会封装到自定义类中-----*/
    void show() {
    acutPrintf(L"hello,there");
    }
    
    class CCtestApp : public AcRxArxApp {
    
    public:
    	// 构造函数:空的
    	CCtestApp () : AcRxArxApp () {}
    
    	// 加载注册的命令:重写虚成员函数 On_kInitAppMsg ,返回状态码 AcRx::AppRetCode
    	virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) {
    		// 需添加的依赖区(有则写)
    
    		// 向导写的On_kInitAppMsg 函数,CAD传入指针与arx交互
    		AcRx::AppRetCode retCode =AcRxArxApp::On_kInitAppMsg (pkt) ;
    		
    		// 注册命令处
    		// acedRegCmds类:Register command 封装注册命令:连接命令与函数
    		/* ---addCommand函数:
     				命令组名(cad按照命令组==>命令==>函数查找并执行命令)
     				命令名
     				命令别名
     				参数:见代码下面的表
     				函数名:可以以此为入口进入自己封装的类库,show函数,最顶上
    		*/
    		acedRegCmds->addCommand(_T("CHU"), _T("hello"), _T("你好"), 
    								ACRX_CMD_MODAL, show);
    		// 返回状态码:按Ctrl点函数的返回类型AppRetCode,可跳转到返回类型列表
    		return (retCode) ;
    	}
    
    	// 卸载注册的命令:重写虚成员函数 On_kLoadDwgMsg,返回状态码
    	virtual AcRx::AppRetCode On_kUnloadAppMsg (void *pkt) {
    		/*  ------删除命令组------	*/
    		// removeGroup函数:
    		//		删除一个组命令,还有removeCmd删除单一命令
    		//		组名与addCommand对应即可,不用管下面的宏啥的
    		acedRegCmds->removeGroup(_T("CHU"));
    
    		// 向导写得:最后调用 On_kUnloadAppMsg 函数释放内存
    		AcRx::AppRetCode retCode =AcRxArxApp::On_kUnloadAppMsg (pkt) ;
    
    		// 卸载依赖区
    		// 返回
    		return (retCode) ;
    	}
    	// 以下区不要动,包括静态函数static void CHUMyGroupMyCommand
    } ;
    // 宏定义区不要动
    

    查看命令组:arx,选g

  • addCommand命令常用主标识
    标识名解释
    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标志

二、CAD表结构

  • CAD本质:dwg格式的文件,本质就是一个数据库,存储了各个块表的值
  • 以下了解即可,后续会深入介绍

2.1 ObjectARX类

  • 前缀功能列表
    类前缀名释义
    AcRx用于绑定应用程序及运行时类的注册和标识的类
    AcEd注册本地AutoCAD命令和AutoACD事件通知的类
    AcDbAutoCAD数据库类
    AcGi渲染AutoACD实体的图形类
    AcGe公用线性数学和几何学对象应用类
  • 开发者文档中全局函数及前缀
    在这里插入图片描述在这里插入图片描述

三、常见类库初识

3.1 AcRx库

  • 定位:提供了一些系统级类,用于DLL的初始化和链接及运行时类的注册和标识,基类为AcRxObject
  • 功能:
    • 对象运行时 类标识和继承分析
    • 运行时向既有类添加新协议、对象比较测试、对象复制
    • 运行时类型标识是AcRxObject的每个子类都有一个相关的类描述者对象 (AcRxClass类型),用于运行时类型的标识
  • 最常用函数
    写法意义
    AcRxObject::isA();用于类识别,被识别的类必须能够测试其类型
    AcRxObject::isKindOf();也是用于类识别,但这里的类能够被测试其类型,或者测试其派生类的类型
    AcRxObject::desc();返回类名
    AcRxObject::cast();将一个基类转换成派生类,如果转换成功,基类对象的指针将是转换后派生类指针
    AcRxObject::acrxUnlockApplication();使应用程序不可卸载,应用程序进行加锁或解锁

    以下代码看完第三篇后回看

  • 获取实体所属的类名
    AcDbObjectId polyId;
    // AcDbEntity 是AcRxObject的派生类
    AcDbEntity *pEnt = Editor::selectEntity(polyId, AcDb::kForRead);
    acutPrintf(_T("\n实体类名为:%s"), pEnt->isA()->name());
    
  • 判断是否为所属类的派生类
    if (pEnt->isKindOf(AcDbPolyline::desc()))
    {
    	...
    }
    
  • 基类对象指针 获取 派生类对象指针
    // 若基类无法转换成指定的类,返回null,例如从圆转到多段线
    AcDb2dPolyline *pPline = AcDb2dPolyline::cast(pEnt);
    acutPrintf(_T("\n实体类名为:%s"), pEnt->isA()->name());
    
  • 打印错误信息
    Acad::ErrorStatus es = pEnt->setColorIndex(1);
    acutPrintf(_T("\n错误信息:%s"), acadErrorStatusText(es));
    

3.2 AcEd库

  • 定位:提供定义和注册新的AutoCAD命令的类,新命令的操作性能与AutoCAD内部命令是完全一样的
  • 功能:提供编辑器、反应器和一套与AutoCAD通信的全局函数
  • 特点:该库中一个重要的类是 AcEditorReactor,它监视AutoCAD编辑器的状态,并当指定事件发生时(如形开始、终止和删除命令)通知应用程序

3.3 AcDb库

  • 定位:提供了组成AutoCAD数据库的类
  • 功能:
    • 存储:AutoCAD数据库用于存储所有的图形对象和非对象;
    • 图形对象:称为实体,组成AutoCAD图; 非图形对象(如层、线型和字型)也是图形的一部分
    • 管理:使用AcDb库查询和管理AutoCAD实体的实体对象,也可以创建新的数据库对象实例

  • AutoCAD数据库包含如下主要元素:
    • 环境变量:大约200个环境变量,其值由AutoCAD设置
    • 命名的对象词典(类AcDbDictionary):提供AutoCAD图的目录表。对于新图来说,该目录表包含AutoCAD使用的其他4个词典 ID,同时我们的应用程序可以任意向该词典添加其他的对象

  • 九个符号表
    符号表名符号表功能
    AcDbViewTable(视图表)适用于 AcDbViewTableRecord 类,表示在数据库中存储的视图,视图与CAD的"VIEW"命令相关联
    AcDbViewportTable(视口表)适用于 AcDbViewportTableRecord 类,表示在CAD中当前系统变量TILEMODE的值为1时的视口设置。视口配置由CAD的 VPORTS 命令创建。不要和 MVIEW 命令混淆,当系统变量 TILEMODE 的值为0时,该命令创建视口实体
    AcDbLinetypeTable(线性表)适用于 AcDbLinetypeTableRecord 类,表示图形数据库中的线性
    AcDbLayerTable(层表)适用于 AcDbLayerTableRecord类,表示图层
    AcDbTextStyleTable(文字样式表)适用于 AcDbTextStyleTable 类,表示文字样式
    AcDbUCSTable(用户坐标系表)适用于 AcDbUCSTableRecord 类,表示图形数据库中的存储的用户坐标系
    AcDbRegAppTable(应用程序名注册表)适用于 AcDbRegAppTableRecord 类,表示为图形数据库中对象的扩展实体数据而注册的应用程序名
    AcDbDimStyleTable(尺寸标注样式表)适用于 AcDbDimStyleTableRecord 类,表示图形数据库中的尺寸标注样式
    AcDbBlockTable(块表)适用于 AcDbDimStyleTableRecord 类,表示图形数据库中定义的块。此表含有两个非常重要的记录:模型空间和图纸空间。所有的实体(可见对象)均放在块表AcDbBlockTable中

  • 包含关系(重要)
    • 块表记录拥有实体
    • 符号表拥有符号表记录
    • 字典拥有任何AcDbObject对象
    • 任何AcDbObject对象都拥有一个块字典

3.4 AcGi库

  • 功能:提供了用于绘制AutoCAD实体的图形界面
  • 函数:AcDbEntity成员函数worldDraw()、viewportDraw()和saveAs(),所有标准实体协议部件都使用此库

3.5 AcGe库

  • 定位:提供了应用类,如向量和矩阵,用来完成二维和三维几何操作,它还提供基本的几何对象,如点、曲线和表面
  • 分类:AcGe还包含两个主要子集:二维和三维几何类,主要抽象基类分别为AcGeEntity2d和AcGeEntity3d
  • 功能:提供了2D和3D几何计算和数学计算函数,进行数学计算

传送门 返回 列表

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值