AUTOCAD二次开发工具
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的客户。
AUTOCAD第三代开发环境和工具包括ObjectARX、VBA、Visual LISP。
存储在AutoCAD数据库的对象(DBObject),包括可见几何实体对象和不可见的非几何对象等,以—组符号表和一个有名对象字典的结构形式组织而成,符号表和数据字典为容器对象(Container Object),包含了其他对象,其作用是组织和管理数据库对象。数据库主要包括有9个符号表和1个对象字典。
块表中存储实体的记录称为块表记录,即所有的实体均存储在块表记录中,通常的实体都存储在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 。将属性定义加入到图块中
pBTableRec->appendAcDbEntity(id,pAttDef);
……
创建属性实体函数原型:
OdDbAtrributeDefinition{
const OdDbPoint3d &position,
const char* text,
const char* tag,
const char* prompt,
OdDbObjectID style
};
属性在WCS 坐标系中的位置。
属性的缺省值
属性标签
属性提示
文字样式ID
pBlkRef->setBlockTableRecord(blockid);// 设置关联。
略
属性块的引用分成块引用和向插入的块中附加属性信息两步。
与创建简单块引用一样,将一个属性块插入当前图形的块表记录中并未包含其属性。在块定义中的附加属性信息必须通过调用AcDbBlockReference 类的成员函数appendAttribute 才能加入到块引用中。块引用方法与前一致,先主要说说属性的插入方法。
在插入属性时,必须检索出属性块定义的所有附加信息,然后将其附加于块引用的相应实体上,这需要遍历块的所有实体。
过程如下:
对象字典的操作和使用
对象字典是一种通用的对象存储容器,它可以存储任何类型的对象,包括其他对象字典、数据库对象和应用程序创建的对象。与符号表相比,对象字典使用比较灵活,它可以实现符号表无法实现的一些特殊功能。
组字典(Group Dictionary )
多线样式字典(Mline Style Dictionary)
用户定义的对象字典。
组字典
组是数据库对象的有序集合,是组字典的成员。从层次关系看,组是管理其所包含对象的容器,而组字典是管理组对象的容器。一个组实可以认为是一个选择集。当组中一个实体被删除时,该实体自动地从组中移出,当恢复被删除实体时,该实体又自动加入到组中。使用组的目的就是为了简化操作,容易实现对一批对象的颜色、层和线型属性的统一修改。
组字典中包含若干个组。
组字典的操作大致步骤如下:
多线样式字典的操作及使用
多线是指多条互相平行的直线,其中各条线的颜色、线型和间距等属性可不相同,多线的这些属性由多线样式定义。多线样式作为一个数据库对象存储在多线样式字典中。定义多线样式步骤如下:
1 .通过getMLineDictionary 获得多线样式字典指针。
多线对象
多线实体,是块表记录中的OdDbMline 类对象。创建多线对象方法及过程与OdDbLine 基本一样。
用户对象字典操作及使用
用户在应用程序中定义的字典为用户字典。用户对象字典的特别之处在于它可以包含任何类型的对象。如实体对象、自定义对象和数据对象等。
用户对象字典创建步骤:
1 通过getNamedObjectsDictionary 得到对象字典指针。
2 定义新的用户对象字典加入到对象字典中。
如:
pNamedObj = getNamedObjectsDictionary();
pDict = new OdDbDictionary();
pNamedObj->setAt(“USER_DICT”,pDict,dictID);
3 加入实体对象到用户字典中
pDict->setAt(ObjName,pObj,objID);
通常加入到用户字典中的对象为ACAD 的可见对象,该对象已存在于数据库的块表记录中。如果在程序中直接生成实体时,必须先将其加入到块表记录中,然后才能加入到用户字典中。
扩展记录属于OdDbXRecord 类的对象。可用来定义任何类型的数据。扩展记录的数据项采用结果缓冲区链表的形式定义。每项由数据类型(也就是组码)和值组成。
扩展记录通常用来表示应用程序定义的特定数据。在ACAD 中,应用程序可以定义扩展数据xdata 和扩展记录。
扩展记录的创建过程:
1 .获得对象字典指针。
2 .新建一个用户字典,并加入到对象字典中。
3 .创建新的扩展记录,并加入到用户对象字典中。
如:OdDbXRecord* pRec = new OdDbXRecord();
pDic->setAt(“USER_DIC”,pRec,recID);
OdDb::kDxfText ,“材料:铸铁”,
OdDb::kDxfText ,“数量:3 件”,
OdDb::kDxfReal, , ……
,
0) ;
用户对象(Object)/ 实体(Entity)
在ACAD数据库中,用户自定义对象为不可见的数据对象,从 OdDbObject类派生,新建的用户对象,不需作为块表记录加到块表中, 通常只加到用户对象字典 ; 自定义实体为可见的几何对象,从OdDbEntity派生(该类实际上也是OdDbObject的子类),新建用户实体时, 除加到用户对象字典外,还需加到块表中 。
在使用用户定义对象前,必须先调用类的虚接口rxInit()对用户类进行初始化.
xInit()函数内部完成如下几项工作:
1.
登记用户类
2.
创建类描述符对象
3.
将类描述符对象加入类字典(OdrxClassDictionary,专为存放用户类信息)。
(在 ObjectARX 中,初始化时还调用了 acarBuildClassHieranchy() 函数将新类添加到 ACAD 系统的类层次结构中 )。
如:
另外在定义用户对象 / 实体的头文件和实现文件中,分别利用如下两个宏,以协助 xInit ()函数完成用户类的登记及相关工作。
在定义时,不论是定义用户对象还是定义用户实体,都必须重载如下四个虚接口:
/**Description: Writes the DWG data of this object.
virtual OdResult dwgOutFields(OdDbDwgFiler* pFiler);
virtual OdResult dxfInFields(OdDbDxfFiler* pFiler);
virtual OdResult dxfOutFields(OdDbDxfFiler* pFiler);
另外,自定义对象和自定义实体根据实现不同的功能和需要,将重载不同的接口,:
1. 自定义对象:
根据功能需要,可能需重载的函数
/** Description: Perform an *audit* operation on this object.
virtual void audit( OdDbAuditInfo* pAuditInfo);
virtual void subClose();
virtual OdDbObjectPtr wblockClone(OdDbIdMapping& ownerIdMap) const;
2. 自定义实体
由于自定义实体,为可见对象,则必须重载如下接口:
// 绘制自定义实体 , 用于实体的显示
// 模型空间的显示
virtual bool worldDraw( OdGiWorldDraw* pWd) const;
// 视图关联的显示
// 当自定义实体作为代理对象保存时 , 则需重载 saveas() 接口 ( 该接口在 DWGdirect 中未实现 ):
OdGeExtents3d& extents) const;
/** Description: Moves the specified grip points of this entity
const OdIntArray& indices );
virtual OdResult explode(OdRxObjectPtrArray& entitySet) const;
// 高亮显示 ,DWGdirect 未实现 .
const bool highlightAll = false) const;
const bool highlightAll = false) const;
根据需要,可能要重载的函数
OdGePoint3dArray& snapPoints ) const;
3. 用户对象简单示例 :
// Macro to declare
};
4. 用户实体简单示例 :
// 绘制
代理对象/ 实体(OdDbProxyObject/OdDbProxyEntity)
代理对象/实体是AutoCad在内存中创建的,作为自定义对象/实体的一个代理数据容器。当AUTOCAD读取一个包含不可能实例化的用户自定义对象/实体的文件时(也就是定义用户对象/实体的二次开发模块未加载),ACAD就自动为自定义实体和对象创建代理对象/实体。但如果加载了可以实例化自定义对象的二次开发模块后,代理对象/实体就可恢复为自定义对象/实体。代理通常存在于系统的内存中,只是个中间过渡数据。
可以将代理对象/实体看成一个包含用户对象的块包,就是对用户对象属性和数据的一个封装。写入文件时,如果二次开发模块未加载,代理包就自动进行串行化保存,通常情况下,写入的数据与读取的数据一致,不包含代理对象的数据,如果保存前后文件类型不同时(dwg/dxf),写入时将整个代理对象数据写到文件中。
代理实体显示
如果二次开发模块未加载,ACAD就不能使用自定义实体的worldDraw()或viewportDraw()函数来显示代理实体,但可以利用自定义实体的图形元文件中的信息,这些信息包含实体最后一次保存文件时,继承于worldDraw()函数或saveAs()函数的数据。显示格式分:实体和边界框两种。
五种坐标系
1.世界坐标系(WCS)
是其它坐标系的参照坐标系,其他坐标系都相对于它定义的(是种概念坐标系.)
2.用户坐标系(UCS)
是一种工作坐标系,通常,ACAD内部存储或参数传递的点都是UCS坐标点.
3.实体坐标(ECS)
为了减少存储空间,而设置的坐标系,在ACAD中,不能直接该坐标的点,必须先转换成UCS点.
4.显示坐标系(DCS).
5.图纸空间坐标系(PSDCS).
图形屏幕上用于显示图形的一个矩形区域称为视口,通常可以把整个图形屏幕作为一个视口,也可以将屏幕设置成多个视口。视口中的图形称为视图。利用视图管理技术,可以把当前视口中复杂的图形按不同的窗口大小设置,并以视图名为标识保存在数据库中。在需要时,显示指定视图以满足对图形编辑和浏览的需求。
视图作为视图表OdDbViewTable 中一条视图记录OdDbViewTableRecord 保存在数据库中。把当前视口中指定窗口内的图形定义为一个新的视图操作过程如下:
1 .创建视图类对象OdDbViewTableRecord
2 .设置视图属性:名、中心点、高、宽
3 .获得视图表OdDbViewTable 指针。并将视图记录加入其中。
附加
三维实体造型
ACAD 三维造型包括线框模型、表面模型和实体模型三种形式。ACADR14 版本后,三维造型核心采用ACIS (Amercian Committee for Interoperable )平台来生成和编辑三维实体。
基本三维实体生成方法
三维实体属于OdDb3dSolid 类对象。对于一个具体的几何实体,即ACIS 对象来说,OdDb3dSolid 是个容器和接口,通过其接口可生成基本的三维实体及实体的布尔运算。
基本三维实体指:长方体Box 、平截头体Frustum 、球体Sphere 、圆环体Torus 、锲体Wedge 等。
长方体
createBox ()
参数:长、宽、高。生成长方体中心为WCS 的原点。
平截头体( 圆柱、圆锥、椭圆锥)
createFrustum ()
参数:高度、X 半径、Y 半径、顶端半径
XY 半径相同,顶端半径为0 ,则为圆锥体。
XY 半径不相等,顶端半径为0 ,则为椭圆锥。
顶端半径不为0 ,则为圆柱或椭圆柱。
球体
createSphere ()
参数:球体半径。
圆环体
createTorus ()
质心在WCS 原点,Z 轴为中心轴。
参数:圆环半径和圆管半径。
契体
CreateWedge ()
长宽高分别与XYZ 轴平行。
参数:长、宽、高
有上述函数可创建中心点在WCS 原点的简单实体。要将实体在指定位置生成,则必须进行坐标变换。如,方向矢量:
OdGeVector3d X(1,0,0),Y(0,1,0),Z(0,0,1)
Origin 表示新坐标系统的原点。
e0/e1/e2 表示XYZ 坐标轴的方向矢量
变换
transformBy(const OdDbMatrix3d& xform)
该函数功能是将生成的三维实体按三维几何变换矩阵变换。也就是将实体的控制点或特征点进行变换,其拓扑特性保持不变。
在二维对象的基础上,通常用拉伸(挤出)或旋转的方法生成三维实体。
是指在圆、椭圆或封闭多线段PloyLine 等对象基础上,按拉伸或挤出高或指定路径生成三维实体。这种方法可以满足一些简单的实体造型:
给定高度拉伸或挤出
面域对象可以理解为由线条组成的一个封闭的区域。
指定路径拉伸或挤出
extrudeAlongPath{
const OdDbRegion* pRegion,
const OdDbCurve* path
}
Path 为
挤出路径,必须是
OdDbLine,OdDbArc,OdDbCircle,OdDbEllipse,OdDbSpline,OdDb2DployLine 或非样条拟合的OdDb3dPloyLine 对象。
并、交、差。
是指在圆、椭圆、封闭的二维多段线的基础上按指定轴旋转,从而生成三维实体。
Const OdDbRegion* pRegion,
Const OdGePoint3d& axisPoint,
Const OdGeVection3D& axisDir,
Double Angle
(凸度值:在生成多段线对象时,该值为 0 ,表示线与线以直线相连接;为 1 ,表示与弧线连接)
1 .确定三维坐标点数组。
2 .根据点,生成封闭的多段线,设置多线段法向矢量(0 ,0 ,1 ),通常于Z 轴平行
3 .根据多线段对象获得封闭边界线指针数组
4 .根据封闭边界,生成面域对象。
5 .然后根据面域对象和高度,拉伸生成三维实体。
以上通过拉伸和旋转只能生成简单的实体,对于复杂的实体必须通过布尔运算才能实现。
1. 并(UNION) :求两个或两个以上实体的并集,即合并为一个实体
2. 交(INTERSECTION ):求两个或两个以上实体的交集,即生成实体的公共部分。
3. 差(SUBTRACT ):将一个实体集从另一个实体集减去。
OdDb::BooleanOperType operator,
OdDb3dSolid *pSolid
Operator 取值为OdDb::kBoolUnion,OdDb::kBoolIntersect,OdDb::kBoolSubtract, 分别表示并、交、差运算。
pSolid 为参加布尔运算的实体指针。
对于实体表面为空间曲面构成的零件,如斜齿轮的齿廓表面,对这类复杂的零件用简单的并、交和差运算方法来造型难以达到要求,在这种情况下,宜采用机械加工的方法来构造零件的实体模型。步骤如下:
1 .分别定义零件毛坯和加工刀具的OdDb3dSolid 类对象。
2 .利用变换矩阵将刀具移至毛坯位置。
3 .调用booleanOper 进行差运算,毛坯实体减去刀具实体,也就是除去被加工的部分
4 .循环重复差运算,直到完成全部加工。
OdDbPolyLine * poly = new OdDbPolyline();
For(int I =0; i<5;i++)
{
//pt2d[] 为各顶点的数组
Poly->addVertexAt(I,pt2d ,(i==3)?0.315:0,0,0)
//参数分别为顶点序号、坐标值、凸度值、起点和终点的宽度
//凸度值表示当前顶点与下一顶点的连接形式,0为直线连接,非0为圆
//弧连接,其值0.315为圆弧半径。
}
Poly->setNormal((0,0,1));//设置方向矢量
通过圆拉伸造型,生成圆柱体,过程略。
初始状态下,圆柱体的质心在WCS原点,Z轴为轴线,为便于运算,将其转换为以X轴为轴线,则方向适量设置为:
OdDbVector3d x1(0,0,1),y1(0,1,0),z1(1,0,1)
X1.set(1,0,0)
Y1.set(0,cos(a),sin(a));
Z1.set(0,-sin(a),cos(a))
OdDb3dMatrix mat,mat1;
Mat.setCoordSystem(pt,x,y)
Mat.setCoordSystem(pt1,x1,y1)
//使圆柱体饶X轴旋转
p3dSolid->transformBy(mat);
//使刀具移到加工位置
p3dSolid1->transformBy(mat1);
AUTOCAD二次开发工具相关推荐
- lisp 梯形展开图_斜截圆柱件钣金展开图的AutoCAD二次开发
内容介绍 原文档由会员 刘瑞 发布 斜截圆柱件钣金展开图的AutoCAD二次开发 3.8万字符 70页 包括开题报告,论文,设计分析报告,程序代码,lsp及sld文件 摘 要 在国民经济各个部门的建设 ...
- AutoCad二次开发:ObjectARX
基于ObjectARX的开发和调试技术 柯宇 舒宣武 华南理工大学建筑设计研究院 [摘要]本文介绍了ObjectARX for AutoCAD R14和ObjectARX for AutoCAD20 ...
- cass二次开发vba和lisp_基于VBA的AutoCAD二次开发及应用实例
1引言本文引用地址:http://www.eepw.com.cn/article/190993.htm AutOCAD2005是AutOdesk公司的系列产品,该软件从其使用和设计思路上都秉承了工程制 ...
- 用C语言编程函数求圆台体积,第六篇 AutoCAD二次开发技术.pdf
第六章 ObjectARX 开发技术 1. AutoCAD二次开发概述 7. MFC对话框 2. ObjectARX简介 8. 搜索图形数据库及获取实体 3. 常用实体类和几何类 数据 4. 创建实体 ...
- AutoCAD 二次开发语言的选择
因为某些功能的原因,一部份VBA的用户最终选择了NET,又因为某些功能的原因,一部份NET的用户最终选择了C++.最终这部份业余用户走上了专业的二次开发之路,而脱离了原来的专业. 来自 一个CAD群叫 ...
- AutoCAD二次开发三种添加插件按钮的方法
在上一篇关于AutoCAD的文章中,我将很多关于CAD的博客相关资源进行了说明,这一篇文章我将介绍如何在AutoCAD中的ribbon中添加相应的按钮.就是下面这种按钮: PS:在开发中我们最好使用中 ...
- lisp二次开发 微盘_基于AutoLISP的AutoCAD二次开发研究_郭秀娟.pdf
2008 年 12 月 Journal of Jilin Architectural and Civil Engineering Institute Dec.2008 基于 AutoLISP 的 Au ...
- python能二次开发cad么_2,手动创建CAD二次开发项目--AutoCAD二次开发(2020版)
本项目使用手动创建,意为不使用SDK模板. 从Visual Studio的"文件"下拉菜单中,选择"新建"->"项目...". 在出现 ...
- 陈伯雄lisp_基于AutoLisp的AutoCAD二次开发自动生成系统图
龙源期刊网 http://www.qikan.com.cn 基于 AutoLisp 的 AutoCAD 二次开发自动 生成系统图 作者:郎建山 金江 来源:<科技视界> 2013 年第 2 ...
最新文章
- 慕课网Flask高级编程实战-10.鱼书业务处理
- django 学习笔记
- python两个list合并成字典_Python将两个list合并为一个字典
- 1.4 super关键字详解
- Manacher's Algorithm 马拉车算法(最长回文串)
- An Energy-Efficient Ant-Based Routing Algorithm for Wireless Sensor Networks (无线传感网中一种基于蚁群算法的能量有效路由)
- python教程简书_Python快速教程
- nginx proxy_cache缓存详解
- 大快人心!和P2P网贷彻底说再见
- 苹果回应大数据杀熟:罪在开发者,和苹果没关系!
- 盘点物联网网络和设备安全的五个误解
- Idea自定义Maven骨架(archetype)
- php 7 环境安装
- C语言物流管理运输系统
- ubuntu设置虚拟显示器且远程连接
- hp 服务器 无线网卡,惠普HP 615 无线网卡驱动
- signature=8df1e41f626c2f25b2dd4e97b89cc127,来用百度密语吧!!!
- 记一次 打包报错:Keystore was tampered with, or password was incorrect
- 大数据和人工智能的关系,超全解析 1
- java从入门到出轨
热门文章
- 【直播合集】2022 CCF BDCI赛题直播分享会结束啦
- 为什么网上Python爬虫教程这么多,但是做爬虫的这么少呢?爬虫发展又该是如何呢?
- U盘识别不了如何恢复,如何恢复不能识别的U盘
- 【行业排名】第三方支付平台有哪些?第三方支付平台排名
- 制作一个GUI仪表盘,安排!LVGL『Gauge仪表盘控件』介绍
- vivox21支持html,vivo X21支持双卡吗_vivo X21支持双卡双待吗-太平洋IT百科
- 计算机专业大创要求,“大创项目”推动计算机专业学生创新实践能力的提高
- 数据结构——树 (知识点思维导图)
- 我大抵是卷上瘾了,横竖睡不着!竟让一个Bug,搞我两次!
- The Great Gatsby翻译摘录