ObjectARX常⽤类和函数
ObjectARX常⽤类和函数
(1)AcAx 开头的全局函数:这些函数通过 COM 的⽅式来让AutoCAD 完成⼀些操作。
(a) acutPrintf函数:在 AutoCAD 命令⾏显⽰指定的字符串
acutPrintf函数的具体⽤法如例:
acutPrintf("\n输⼊不合法,请重新输⼊");
(b) AcAxMove 函数:移动实体。需要链接 axauto15.lib 库
AcAxMove 函数的定义形式为:
HRESULT AXAUTOEXP AcAxMove(AcDbObjectId& objId,VARIANT fromPoint,VARIANT toPoint);
VARIANT 是在 COM 中使⽤的⼀种特殊数据类型,因为COM是微软⽤于解决组件之间数据交换的⼀种技术,COM 对象建⽴在⼆进制可执⾏代码级的基础上,并由此来实现多种语⾔开发的组件对象可以进⾏交互。
因此开发 COM 所使⽤的数据类型是独⽴于特定语⾔的,我们开发 COM 客户程序(调⽤ COM 对象的程序)也必须使⽤⼀些 COM 所规定的数据类型。
AcAxMove 函数的具体⽤法如例:
AcDbObjectId entId;//移动实体id
AcGePoint3d ptFrom;//起点
AcGePoint3d ptTo;//终点
// 将AcGePoint3d类型的点坐标进⾏类型转换
VARIANT *pvaFrom = Point3dToVARIANT(ptFrom);
VARIANT *pvaTo = Point3dToVARIANT(ptTo);
BOOL bRet = SUCCEEDED(AcAxMove(entId, *pvaFrom, *pvaTo));
delete pvaFrom;
delete pvaTo;
static VARIANT* Point3dToVARIANT(const AcGePoint3d &point)
{
COleSafeArray *psa = new COleSafeArray();
DOUBLE dblValues[] = {point[X], point[Y], point[Z]};
psa->CreateOneDim(VT_R8, 3, dblValues);
return (LPVARIANT)(*psa);
}
(c)AcAxRotate函数:旋转实体的操作
(d)AcAxScaleEntity 函数:缩放实体的操作
(f)acedGetString 函数:获得⽤户输⼊的字符串(acedGetPoint(点)、acedGetInt、acedGetKword(关键字)、acedGetDist(距离) acedGetCorner(矩形框对⾓
点)acedGetAngle (⾓度)和 acedGetReal(实数))
acedGetString函数的定义形式为:
int acedGetString(int cronly,const char * prompt,char * result);
第⼀个参数:cronly 指定⽤户输⼊的字符串中是否可以包含空格,可以输⼊ Adesk::kTrue 或着Adesk::kFalse;
第⼆个参数:prompt 指定了在命令⾏提⽰⽤户输⼊的⽂本;
第三个参数:result 则保存了⽤户输⼊的结果(最⼤缓冲区为133个字符)。
返回值:RTNORM:成功,RTERROR:失败,RTCAN:⽤户按下“ESC”键取消操作,RTREJ:拒绝执⾏操作(操作不合法),RTFAIL:与AutoLISP通信失败,RTKWORD:⽤户输⼊了关键字;具体⽤法如例:
acedGetString(Adesk::kFalse, "\n输⼊图块的名称:", &blkName)
注意:第三个参数⽤了&,是址传递.
acedGetInt 函数的定义形式为:
int acedGetInt(const char * prompt, int * result);
第⼀个参数:prompt:⽤于指定显⽰在命令窗⼝中的字符串,如果不需要使⽤可以指定 NULL 作为该参数的值。
第⼆个参数:result :⽤户输⼊的整数。
返回值:RTNORM:成功,RTERROR:失败,RTCAN:⽤户按下“ESC”键取消操作,RTREJ:拒绝执⾏操作(操作不合法),RTFAIL:与AutoLISP通信失败,RTKWORD:⽤户输⼊了关键字;(g)acedEntSel 函数:等待⽤户选择⼀个实体
acedEntSel函数的定义形式为:
int acedEntSel (const ACHAR *str, ads_name entres,ads_point ptres);
第⼀个参数:str:提⽰信息;
第⼆个参数:entres:实体名称;
第三个参数:ptres:选择实体对象时候的拾取点。
返回值:RTNORM:成功,RTERROR:失败,RTCAN:⽤户按下“ESC”键取消操作,RTREJ:拒绝执⾏操作(操作不合法),RTFAIL:与AutoLISP通信失败,RTKWORD:⽤户输⼊了关键字;具体⽤法如例:
ads_name entres;
ads_point ptres;
if(RTNORM == acedEntSel(_T("\n请选择⼀个实体:"),entres,ptres))
{
AcDbObjectId objId;
if(acdbGetObjectId(objId,entres) != Acad::eOk )
return;
}
(h)acedInitGet函数:限定输⼊的条件,该函数只能控制紧随其后的⼀个acedGetXXX,调⽤后⽴即失效.
acedInitGet函数的定义形式为:
int acedInitGet(int val, const ACHAR *kwl);
第⼀个参数:val:输⼊数据的范围和⽅式(1:RSG_NONULL:不允许空输⼊;2:RSG_NOZERO:不允许输⼊0;4:RSG_NONEG:不允许输⼊负数;8:RSG_NOLIM:不检查图形边
界;32:RSG_DASH:⽤虚线表⽰矩形框或橡⽪线;64:RSG_2D:不考虑3D的Z坐标;128:RSG_OTHER:允许⽤户任意输⼊);
第⼆个参数:kwl:关键字列表;
具体⽤法如例:
int nCount = 1;
acedInitGet(RSG_NONULL+RSG_NONEG+RSG_NOZERO,NULL);
acedGetInt(_T("\n请输⼊多边形顶点数:"),&nCount);//不允许输⼊负数和0
(i)acedSetColorDialog 函数:函数能够弹出选择颜⾊对话框,并且返回⽤户选择的结果。
acedSetColorDialog 函数定义形式为:
Adesk::Boolean acedSetColorDialog(int& nColor,Adesk::Boolean bAllowMetaColor,int nCurLayerColor)
;
第⼀个参数:nColor 参数指定了显⽰【选择颜⾊】对话框时的默认颜⾊,并且在函数返回值后保存⽤户选择的新颜⾊;
第⼆个参数:bAllowMetaColor 参数限定在【选择颜⾊】对话框中是否可以选择“随层”或“随块”;
第三个参数:nCurLayerColor 参数指定当前图层的颜⾊。
(j)acedCommand 函数:
acedCommand 函数的定义形式为:
int acedCommand(int rtype, ... unnamed);
该函数的参数个数是可变的,并且参数成对出现。参数对中第⼀个参数表⽰参数的类型,第⼆个表⽰其实际的数据。参数表的最后⼀个参数必须是0或者RTNONE(使⽤RTNONE更好⼀些)。
acedCommand 函数具体⽤法如例:
acedCommand(RTSTR, "Circle",RTSTR, “0,0,0”, RTSTR, “10”, RTNONE);
创建⼀个圆⼼为(0,0)、半径为10的圆。
(k)acedCmd 函数:
acedCmd 函数的定义形式为:
int acedCmd(const struct resbuf * rbp);
参数是⼀个 resbuf 类型的指针,这⾥需要的结果缓冲区可以由 acutBuildList 函数⽣成。
(l)acutNewRb 函数:创建⼀个新的结果缓冲区,并为其分配存储空间。使⽤该函数分配的存储空间必须在不⽤的时候⼿⼯释放空间。
(m)acutRelRb 函数:释放结果缓冲区链表的存储空间。
(n)acedGetFileD 函数:⽂件对话框提⽰⽤户输⼊⼀个⽂件名。
acedGetFileD 函数的定义形式为:
int acedGetFileD(const char * title,const char * default,const char * ext,int flags,struct resbuf * result);
第⼀个参数:title 指定对话框的标题;
第⼆个参数:default 指定默认的⽂件名称;
第三个参数:ext 指定默认的⽂件扩展名;
第四个参数:flags 参数⽤⼀个位值控制对话框的样式;
第五个参数:result 参数包含了⽤户选择的⽂件名和路径。
(o)
(p)
(2)AcDbObject 类:所有实体对应的类都间接继承于 AcDbObject 类
clone 函数:⽣成⼀个调⽤者的克隆对象,并返回指向克隆对象的指针,clone 函数仅仅会⽣成对象的⼀个克隆,对于实体对象来说,这样还没有完成复制操作的全部。还必须把它添加到模型空间中才能被显⽰出来;
clone函数的定义形式为:
virtual AcRxObject* clone() const;
cast 函数:类型转换,实体转为多段线、⽂本、直线等。。。。。。
AcDbEntity *pEnt;
AcDbPolyline *pPoly = AcDbPolyline::cast(pEnt);
isKindOf 函数:判断是否是实体是什么类型
if (pEnt->isKindOf(AcDbPolyline::desc()) == Adesk::kTrue)
//是多段线
(3)AcDbEntity类:继承与AcDbObject类,
(a)layer 函数:获得实体所在图层的名字。acutDelString函数:释放layer函数返回的字符串所占⽤的内存。
具体⽤法如例:
char *layerName = pEnt->layer();
if (strcmp(layerName, "测试") == 0)
{
// 执⾏需要的
……
}
acutDelString(layerName );
(b) layerId 函数:获得实体所在图层的 ID。
transformBy函数的定义形式为:
virtual Acad::ErrorStatus transformBy(const AcGeMatrix3d& xform);
具体⽤法如例:
AcGeMatrix3d mat;
pEnt->transformBy(mat);
(d)getOsnapPoints 函数:得到捕捉点
getOsnapPoints函数的定义形式为:
ACDB_PORT ADESK_SEALED_VIRTUAL Acad::ErrorStatus getOsnapPoints(AcDb::OsnapMode osnapMode, Adesk::GsMarker gsSelectionMark, const AcGePoint3d& pickPoint, const AcGePoint3d& lastPoint, const AcGeMatrix3d& viewXfo
第⼀个参数:osnapMode:捕捉点模式:AcDb::kOsModeEnd:到实体上离pickPoint最近的端点;AcDb::kOsModeMid:到实体上离pickPoint最近的中点(直线,圆弧等的中
点); AcDb::kOsModeCen:圆⼼点;AcDb::kOsModeNode:节点;AcDb::kOsModeQuad:象限点;AcDb::kOsModeIns :插⼊点;AcDb::kOsModePerp:过lastPoint点的垂
⾜;AcDb::kOsModeTan:过lastPoint点的切点;AcDb::kOsModeNear:到离pickPoint最近的实体上的点;
第⼆个参数:gsSelectionMark:gs标记(如果没有设置,就默认GS标记值0,0 为实体本⾝,⼀般AcDbBlockReference和AcDbPolyline⽤到);
第三个参数:pickPoint:当前⿏标所在的点(WCS坐标系);
第四个参数:lastPoint:pickPoint之前选择的点,⽤来确定垂直和切线的对象捕捉值;
第五个参数:viewXform:将WCS转为DCS的坐标转换矩阵;
第六个参数:snapPoints:将⽣成的捕捉点添加到数组中去,可以添加0个或多个;
第七个参数:geomIds:未使⽤.
(e)getGripPoints 函数:得到夹点
getGripPoints函数的定义形式为:
Acad::ErrorStatus getGripPoints(AcGePoint3dArray& gripPoints, AcDbIntArray & osnapModes, AcDbIntArray & geomIds) const;
第⼀个参数:gripPoints:夹点数组
第⼆个参数:osnapModes:未使⽤
第三个参数:geomIds:未使⽤
Acad::ErrorStatus getGripPoints(AcDbGripDataPtrArray& grips, const double curViewUnitSize, const int gripSize, const AcGeVector3d& curViewDir, const int bitflags) const;
第⼀个参数:grips:夹点数组
第⼆个参数:curViewUnitSize:当前视图中⼀个绘图单元的⼤⼩(以像素为单位)
第三个参数:gripSize:夹点⼤⼩,以像素为单位
第四个参数:curViewDir:当前视图端⼝中的视图⽅向的向量
第五个参数:bitflags:标识
(f)meveGripPointsAt 函数:编辑夹点
moveGripPointsAt函数的定义形式为:
Acad::ErrorStatus moveGripPointsAt(const AcDbIntArray & indices, const AcGeVector3d& offset);
第⼀个参数:indices:"热的"夹点数组
第⼆个参数:offset:夹点平移的⽅向和⼤⼩
Acad::ErrorStatus moveGripPointsAt(const AcDbVoidPtrArray& gripAppData, const AcGeVector3d& offset, const int bitflags);
第⼀个参数:gripAppData:移动的夹点
第⼆个参数:offset:WCS坐标系中,夹点平移的⽅向和⼤⼩
第三个参数:bitflags:保留供将来使⽤,⽬前为零
(g)getSubentPathsAtGsMarker 函数:
getSubentPathsAtGsMarker函数的定义形式为:
ACDB_PORT ADESK_SEALED_VIRTUAL Acad::ErrorStatus getSubentPathsAtGsMarker(AcDb::SubentType type, Adesk::GsMarker gsMark, const AcGePoint3d& pickPoint, const AcGeMatrix3d& viewXform, int& numPaths, AcDbFullSubentP 第⼀个参数:type:输⼊⼦实体类型(AcDb::kFaceSubentType:⾯, AcDb::kEdgeSubentType:边, AcDb::kVertexSubentType顶点, AcDb::kMlineSubentCache :线);
第⼆个参数:gsMark:输⼊⼦实体的gs标识,从 ads_ssnamex()/acedSSNameX()获得;
第三个参数:pickPoint:当前⿏标所在的点(WCS坐标系);
第四个参数:viewXform:输⼊转换矩阵,WCS转DCS;
第五个参数:numPaths:输出subentPaths数组中的AcDbFullSubentPath对象的个数;
第六个参数:subentPaths:输出动态分配的地址数组;
第七个参数:numInserts :在entAndInsertStack中AcDbBlockReferences输⼊的对象id数量,第⼀个是实体本⾝,所以少⼀个;
第⼋个参数:entAndInsertStack:
(4)AcEdCommandStack类:(命令堆栈)来添加和删除命令
(a) addCommand 函数:⽤来向 AutoCAD 注册⼀个外部命令
addCommand 函数的定义形式为:
能够删除字符串中空格的函数是virtual Acad::ErrorStatus addCommand(const char* cmdGroupName,const char* cmdGlobalName,const char* cmdLocalName,Adesk::Int32 commandFlags,AcRxFunctionPtr Function
Addr,AcEdUIContext * UIContext = NULL,int fcode =
前⾯的5个参数,分别⽤来指定命令组名称、命令的国际名称、命令的本国名称、命令的类型(模态命令或者透明命令等)和指向实现函数的指针。
addCommand 具体⽤法如例:
void initApp()
{
acedRegCmds->addCommand("Hello1","Hello", "Hello", ACRX_CMD_MODAL,HelloWorld);
}
acedRegCmds 宏提供了⼀个指向 AcEdCommandStack 类的指针
(b)removeGroup 函数⽤来删除已经存在的⼀个外部命令组,以及保存在其中的所有命令。
removeGroup函数的具体⽤法如例:
acedRegCmds->removeGroup("Hello1");
ACED_ARXCOMMAND_ENTRY_AUTO的具体⽤法如例:
ACED_ARXCOMMAND_ENTRY_AUTO(CCreateEntsApp, HHL, CreateEntsLine, CreateLine, ACRX_CMD_TRANSPARENT, NULL);
第⼆个参数HHL代表事件响应函数的前缀,
第三个参数是事件响应函数名称,
第四个参数是命令名称
在acrxEntryPoint.cpp中要实现该命令的事件响应函数 HHLCreateEntsLine:
static void HHLCreateEntsLine(void)
{
AcGePoint3d ptStart(0, 0, 0);
AcGePoint3d ptEnd(100, 100, 0);
AcDbObjectId lineId;
lineId = CCreateEnt::CreateLine(ptStart, ptEnd);
CModifyEnt::ChangeColor(lineId, 1);
CModifyEnt::ChangeLayer(lineId, _T("虚线"));
CModifyEnt::ChangeLinetype(lineId, _T("中⼼线"));
}
这样在AutoCAD的命令窗⼝输⼊“CreateLine”,就会去执⾏HHLCreateEntsLine函数,画⼀条红⾊的虚直线
(5)AcDbDatabase 类:图形数据库
getSymbolTable 函数:从数据库获得符号表
getLayerTable 函数:从数据库获得层表,参数以及⽤法参照getBlockTable。
setClayer 函数能够设置图形的当前图层。
(6) AcDbSymbolTable 类:所有的符号表都继承⾃ AcDbSymbolTable 类
(a)add 函数:向符号表添加⼀条新的记录,各种符号表实现的形式略有不同。
(b)getAt 函数:获得符号表中特定名称的记录
(c)has 函数:判断符号表中是否包含指定的记录,到返回true,否则返回 false。
has 函数的具体⽤法如例:
// 判断是否存在名称为“测试”的图层
AcDbLayerTable *pLayerTbl;
if (!pLayerTbl->has("测试"))
{
acutPrintf("\n当前图形中未包含\"测试\"图层!");
pLayerTbl->close();
return;
}
(d)newIterator:创建⼀个符号表遍历器,访问符号表中的所有记录。
newIterator 函数的具体⽤法如例:
AcDbBlockTableRecordIterator *pItr;
pBlkTblRcd->newIterator(pItr);
(7)AcDbBlockTable 类:块表,继承⾃AcDbSymbolTable 类,继承了has,getAt,add,newIterator等函数,参数以及⽤法参照AcDbSymbolTable类。
(8)AcDbBlockTableRecord 类:
(b) hasPreviewIcon 函数:⽤于判断指定的块表记录是否包含预览图标
hasPreviewIcon 函数定义为:
Acad::ErrorStatus getPreviewIcon(PreviewIcon & previewIcon) const;
参数:PreviewIcon:在 ObjectARX 中被定义为:typedef AcArray<Adesk::UInt8> PreviewIcon;要从该数组中获得块定义的预览图标。
(c)getPreviewIcon 函数:可以从块表记录中获得预览图标的相关数据
(9)AcDbBlockTableRecordIterator类:块表记录遍历器,遍历器在使⽤完毕后⼀定要删除。
(a)getEntity函数:获得遍历器的每⼀个实体;
具体⽤法如例:
pItr->getEntity(pEnt, AcDb::kFrWrite);
(10)AcDbLayerTable类:层表,继承⾃AcDbSymbolTable 类,继承了has,getAt,add,newIterator等函数,参数以及⽤法参照AcDbSymbolTable类。(11)AcDbLayerTableRecord 类:
setColor 函数:设置图层的颜⾊。
setLinetypeObjectId 函数:设置图层的线型。
setLineWeight 函数:设置图层的线宽。
(11)AcDbTextStyleTable类:⽂字样式表
(12)AcDbTextStyleTableRecord 类:⽂字样式表记录
setName函数:设置名称
setFileName函数:设置字体⽂件名称
具体⽤法如例:
// 创建新的字体样式表记录
AcDbTextStyleTableRecord *pTextStyleTblRcd = NULL;
pTextStyleTblRcd = new AcDbTextStyleTableRecord();
// 设置字体样式表记录的名称
pTextStyleTblRcd->setName("仿宋体");
// 设置字体⽂件名称
pTextStyleTblRcd->setFileName("f");
setFont函数:设置字体
setFont函数定义为:
Acad::ErrorStatus setFont(const ACHAR* pTypeface, Adesk::Boolean bold, Adesk::Boolean italic, int charset, int pitchAndFamily);
第⼀个参数:pTypeface:字体类型;
第⼆个参数:bold:是否粗体;
第三个参数:italic:是否斜体;
第四个参数:charset:Windows字符集标识符;
第五个参数:pitchAndFamily:Windows间距和字符族标识符;
具体⽤法如例:
pTextStyleTblRcd->setFont("楷体_GB2312",0,0,134,49);
(11)AcDbLine类:直线;需要头⽂件#include "dbents.h"
AcGePoint3d ptStart(0, 0, 0);
AcGePoint3d ptEnd(100, 100, 0);
AcDbLine *pLine = new AcDbLine(ptStart, ptEnd);(正确)//必须在堆上创建对象
AcDbLine line(ptStart, ptEnd);(不正确)//直线对象仅被在内存上创建,并没有添加到图形数据库中,因此不可能会显⽰在
图形窗⼝中。
(12)AcDbPolyline类:轻量多段线;AcDb3dPolyline:三维多段线;AcDb2dPolyline:不常见
AcDb3dPolyline 构造函数定义为:
AcDb3dPolyline *pPoly3d = new AcDb3dPolyline(AcDb::k3dSimplePoly, points);
第⼀个参数:AcDb::k3dSimplePoly 表⽰创建的多段线是⼀个未经拟合的标准多段线;
第⼆个参数值指定了创建三维多段线的顶点数组;
第三个参数指定是否闭合多段线,这⾥使⽤了默认参数值,不在创建多段线时将其闭合。
(a)numVerts 函数:多段线的顶点数.
numVerts 函数定义为:
unsigned int numVerts() const;
(b)getPointAt 函数:得到顶点坐标
getPointAt 函数定义为:
Acad::ErrorStatus getPointAt( unsigned int index, AcGePoint2d& pt) const
Acad::ErrorStatus getPointAt( unsigned int index, AcGePoint3d& pt) const;
具体语法如例:
AcDbPolyline polyline;
for (int nIndex = 0; nIndex < polyline->numVerts(); ++nIndex)
{
OdGePoint3d ptTemp;
polyline->getPointAt(nIndex,ptTemp);
}
(c)addVertexAtget 函数,将每⼀个顶点添加到多段线中
addVertexAt 函数定义为:
Acad::ErrorStatus addVertexAt(unsigned int index, const AcGePoint2d& pt, double bulge = 0., double startWidth = -1., double endWidth = -1);
第⼀个参数:index ⽤来指定插⼊顶点的索引号(从 0 开始);
第⼆个参数:pt 指定顶点的位置;
第三个参数:bulge 指出要创建的顶点的凸度(0 表⽰直线,1 表⽰半圆(逆时针),-1:半圆(顺时针)介于 0~1 之间为劣弧,⼤
于 1 为优弧);
第四,五个参数:startWidth 和 endWidth 指定了从该顶点到下⼀顶点之间连线的起始和终⽌线宽,利⽤该特性可以使⽤多段线创建⼀个实⼼箭头。
(d)setPointAt 函数:设置顶点坐标(没有提供AcGePoint3d)
setPointAt 函数定义为:
Acad::ErrorStatus setPointAt(unsigned int index, const AcGePoint2d& pt);
(e)getLineSegAt 函数:得到线段
getLineSegAt 函数定义为:
Acad::ErrorStatus getLineSegAt(unsigned int index, AcGeLineSeg2d& ln) const;
第⼀个参数:index:索引,从0开始.
第⼆个参数:AcGeLineSeg2d:线段
(f)setClosed 函数:闭合
setClosed (Adesk::kTrue);
(13)AcDbText 类,⽤于创建⽂字对象; AcDbMText:多⾏⽂本
构造函数定义为:
AcDbText( const AcGePoint3d& position,const char* text,AcDbObjectId style = AcDbObjectId::kNull,double height = 0,double rotation = 0);
第⼀个参数:position 指定⽂字的插⼊点(⽂本右上⾓);
第⼆个参数:text 是将要创建的⽂字对象的内容;
第三个参数:style 指定要使⽤的⽂字样式的 ID,默认情况下使⽤ AutoCAD 中缺省的⽂字样式;
第四个参数:height 为⽂字的⾼度;
第五个参数rotation 为⽂字的旋转⾓度。
需要头⽂件#include " dbmtext.h "
AcDbMText构造⽆参数,添加到模型空间之前⽤ setTextStyle()和 setContents ()等来设置
AcDbMText *pMText = new AcDbMText();
// 设置多⾏⽂字的特性
pMText->setTextStyle(style);
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论