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 函数:缩放实体的操作

(e)全局函数 acdbOpenAcDbEntity用于从实体的 ID 号获得指向图形数据库中实体的指针。具体定义形式和用法参考另外一篇博客。https://my.oschina.net/u/2930533/blog/759568

(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 参数用一个位

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ObjectARX 是 AutoCAD 的编程接口,可以使用 C++ 编程语言来扩展 AutoCAD 的功能。要实现对称函数,可以使用 ObjectARX 提供的实体对象类 AcDbEntity 和 AcDbMirrorEntityPE 类。 首先,创建一个派生自 AcDbEntity 的实体类,例如 MyEntity。然后在 MyEntity 类中重载 AcDbEntity 类的 mirror() 函数,实现对称的操作。mirror() 函数的定义如下: ``` virtual Acad::ErrorStatus mirror(const AcGePlane& plane, AcDbObject*& pMirrorObj) override; ``` 在 mirror() 函数中,可以使用 AcDbMirrorEntityPE 类的成员函数 mirror() 来实现对称操作。mirror() 函数的定义如下: ``` virtual Acad::ErrorStatus mirror(AcDbEntity* pEnt, const AcGePlane& plane) override; ``` 其中,pEnt 是需要对称的实体对象指针,plane 是对称的平面。mirror() 函数将对称后的实体对象保存在 pMirrorObj 中,并返回 Acad::eOk 表示操作成功。 下面是一个简单的示例代码: ``` class MyEntity : public AcDbEntity { public: ACDB_DECLARE_MEMBERS(MyEntity); virtual Acad::ErrorStatus mirror(const AcGePlane& plane, AcDbObject*& pMirrorObj) override { AcDbMirrorEntityPE* pMirrorPE = AcDbMirrorEntityPE::cast(this); if (pMirrorPE == nullptr) return Acad::eNotImplementedYet; AcDbEntity* pMirrorEnt = nullptr; Acad::ErrorStatus es = pMirrorPE->mirror(this, plane, pMirrorEnt); if (es != Acad::eOk) return es; pMirrorObj = pMirrorEnt; return Acad::eOk; } }; ACDB_REGISTER_OBJECT_ENTRY_AUTO(MyEntity) ``` 在上面的示例中,MyEntity 类派生自 AcDbEntity,重载了 mirror() 函数。在 mirror() 函数中,首先使用 AcDbMirrorEntityPE::cast() 函数获取 AcDbMirrorEntityPE 类的指针。如果获取失败,说明当前实体对象不支持对称操作,返回 Acad::eNotImplementedYet。否则,调用 pMirrorPE->mirror() 函数实现对称操作,将对称后的实体对象保存在 pMirrorEnt 中,并将 pMirrorEnt 的指针保存在 pMirrorObj 中,最后返回 Acad::eOk 表示操作成功。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值