AUTOCAD二次开发工具
ARX(AutoCAD Runtime eXtension实时运行扩展)作为继AutoLISP、ADS后的第三代开发工具,采用全新的面向对象编程技术。
1985年6月推出的AutoCAD2.17版本使用AutoLISP作为AUTOCAD内嵌语言,与AUTOCAD绑定一起,向用户提供了用AutoLISP设计应用程序的二次开发环境。AutoLISP是种解释型语言,主要用来修改和扩充ACAD的命令及系统菜单、设计对话框驱动程序、实现对图形库的直接访问和修改。这是AUTOCAD提供的第一代开发环境。
第二代开发环境是R11版本提供的ADS(AUTOCAD Development System)开发系统。该系统实际上向用户提供了用C语言编写应用程序的开发环境。ADS环境用C语言编写,除了可以使用标准C库函数外,还可以使用对AUTOCAD进行操作的ADS函数。ADS虽脱离了AUTOCAD环境,但其编写的程序不能单独运行,只能作为一组外部函数被AUTOLISP装入和调用,实际上就是在AUTOLISP之上包了一层,是AUTOLISP的客户。
如今,在AUTOCAD2000中不再支持ADS开发。ADS已完全被ARX所取代。
AUTOCAD第三代开发环境和工具包括ObjectARX、VBA、Visual LISP。
存储在AutoCAD数据库的对象(DBObject),包括可见几何实体对象和不可见的非几何对象等,以—组符号表和一个有名对象字典的结构形式组织而成,符号表和数据字典为容器对象(Container Object),包含了其他对象,其作用是组织和管理数据库对象。数据库主要包括有9个符号表和1个对象字典。
符号表
在AutoCAD数据库中的9个符号表,分别是:
1)块表(BlockTabLe)
2)尺寸标注样式表(DimStyleTable)
3)层表(LayerTable)
4)线型表(LinetypeTable)
5)应用程序注册表(RegAppTable)
6)文字样式表(TextStyleTable)
7)用户坐标系表(UCSTable)
8)视口表(ViewportTable)
9)视图表(ViewTable)
块表中存储实体的记录称为块表记录,即所有的实体均存储在块表记录中,通常的实体都存储在MODEL_SPACE块中;层表中的记录存储层的有关信息;尺寸标注样式表、层表、线型表和文字样式表等均用来存储相应的表记录。
对象字典
有名对象字典是存储一般对象的容器,可用来存储任何数据库对象和子类,主要包括组(GROUP)和多线(MLINE)样式两个数据库字典。用户也可以创建一个新的“用户对象字典”,并存储于对象字典中。 在实际开发中,可以将应用程序的“扩展对象”存放在“用户对象字典”中,“扩展对象”的“扩展记录和数据”通过链表的形式存储在对象字典中,对于该类对象,不另外存储到块表。关于扩展对象,后面有详细说明。
数据库的创建及访问
略
数据库的初始化
进入AUTOCAD环境,系统会自动生成一个缺省的数据库,库中包含9个符号表和一个有名对象字典。如,层表有一个0层记录;块表中有“MODEL_SPACE”(模型空间)和“PAPER_SPACE”(图纸空间)两条记录;线型表中有“CONTINUOUS”、“BY_LAYER”和“BY_BLOCK”记录;应用程序注册表中有“ACAD”记录;文字样式表中有“STANDARD”记录;有名对象字典中包含“GROUP字典”和“MLINE字典”,其中“MLINE字典”中有一条“STANDARD”字体样式记录。
基本实体的创建及访问
略
图块
图块是若干实体的集合,也是AUTOCAD数据库中的一种对象,通常分为不带属性的简单图块和带属性的复杂图块两种。作为一个整体来看待,以简化操作。
用户自定义的图块分为“块”和“属性块”两种。块只包含图形信息,属性块还可以包含非图形信息,这些属性信息是块的组成部分之一。属性块必须先用ATTDEF定义属性,然后用BLOCK将其定义为图块的一部分。
简单块的定义
略
属性块的定义
属性块是由构成图块的实体和附加信息(属性)组成。定义属性块主要包括块和属性的的定义,块的定义与不带属性块简单块一样,属性的定义主要是通过调用AcDbAtrributeDefinition实现。如下示例代码定义了圆度公差标注符号,其中圆度公差值定义为块的属性,在图块插入时输入,缺省值为0.3。
//1.定义块
OdDbBlockTableRecord *pBTableRec = new OdDbBlockTableRecord();
pBTableRec->setName();
…. ..
OdDbBlockTable *pBTable = pDwgDB->getBlockTable(pBTable,acdb:kForWrite);
OdDbObjectID id;
pBTable->add(id,pBTableRec);
//2.生成组成块的实体:基本线、圆
//基本实体创建过程略
……
//将实体附到块中
pBTableRec->appendAcDbEntity(pLine,id);
pBTableRec->appendAcDbEntity(pCirle,id);
……
//3.定义块的属性
OdGePoint3d pt(8,1.5,0);
OdDbAtrributeDefinition *pAttDef = new OdDbAtrributeDefinition();
//设置块的属性值 略
pAttDef->setPoint(pt); //设置属性位置
pAttDef ->setPrompt(“请输入圆度公差:”); //设置属性提示
pAttDef->setTextString(0.3); //设置缺省值
pAttDef->setXXX();
……
//4