土木在线论坛 \ 建筑设计 \ CAD下载及教程 \ AutoCAD 增加超级编辑命令

AutoCAD 增加超级编辑命令

发布于:2005-12-28 12:06:28 来自:建筑设计/CAD下载及教程 [复制转发]
给AutoCAD 增加超级编辑命令

---- AutoCAD在中国有很广泛的用户基础,同时也有很多专业的、业余的开发人员。从R13版本开始,Autodesk 提供了ARX开发工具,面向对象的特性使开发人员如沐春风。有关ARX编程与ADS编程的比较这里不再赘述,此处只讲如何用ARX实现我们所要求的功能,不足之处请指正。
---- 许多二次开发软件均提供超级编辑命令,如Genius 14、HMCAD 6.0等等。读者或许对这些命令很感兴趣,能不能自己开发类似的功能呢?只要您对C++和ARX编程有一些了解,利用Autodesk提供的ObjectARX SDK软件包(可以到Autodesk网址上免费下载),您能很方便的写出此类程序,虽说不能和专业人员提供的超级编辑命令相媲美,但也能给您带来不少方便。本文利用ObjectARX提供的范例程序(缺省安装ObjectARX SDK后的路径是X:\OBJECTARX\ARXLABS\LAB07)进行简单的修改即可实现我们所要求的功能。以下是采用ObjectARX SDK 2.0,在MSVC 5.0编译环境下测试通过。

---- 首先我们要修改enttemp.h文件:

---- 原文件如下:

class EntTemperature : public AcRxObject
{
public:
ACRX_DECLARE_MEMBERS(EntTemperature);
virtual double reflectedEnergy(AcDbEntity* pEnt) const = 0;
};
将斜体部分修改成如下:
virtual Adesk::Boolean HgyModify(AcDbEntity* pEnt)
const = 0;

---- 因为我们以后要以EntTemperature作为基类,而且HgyModify函数在继承类中要重写并要求实现动态调用,故此处必须声明为虚拟函数。Virtual关健字即为C++面向对象的重要的特性。
---- 第二、删除tempapp.def文件中的energy文本。

---- 第三、修改tempapp.cpp文件:

---- 1、 删除CircleTemperature、RigonTemperature及EllipseTemperature类的所有相关内容。

---- 2、 修改原文件中如下的内容:

class DefaultTemperature : public EntTemperature
{
public:
virtual double reflectedEnergy(AcDbEntity* pEnt) const;
};
double DefaultTemperature::reflectedEnergy
(AcDbEntity* pEnt) const
{
ads_printf("\nThis entity has no area, and no reflection.\n");
return -1.0;
}
修改后的内容如下:
class DefaultTemperature : public EntTemperature
{
public:
virtual Adesk::Boolean HgyModify(AcDbEntity* pEnt) const;
};

Adesk::Boolean DefaultTemperature::
HgyModify(AcDbEntity* pEnt) const
{
ads_printf("\nThe entity hasn’t defined,
and nothing to be modified.\n");
return Acad::eOk;
}
为简单起见,我们只对直线和圆定义超级编辑命令,
在此定义有关line和circle类。在tempapp.cpp
文件中增加CircleTemperature和LineTemperature类,
定义如下:
class CircleTemperature : public EntTemperature
{
public:
virtual Adesk::Boolean HgyModify(AcDbEntity* pEnt) const;
};

Adesk::Boolean
CircleTemperature::HgyModify(AcDbEntity* pEnt) const
{
AcDbCircle *pCircle = AcDbCircle::cast(pEnt);
if (!pCircle) {
ads_printf("The entity selected is not a circle\n");
pEnt- >close();
return Acad::eNotImplementedYet;
}
AcGePoint3d p,q;
double r;
p=P_TO_P(pCircle- >center());

if (getPoint((double*)(&p), "Center Point: ", p)== RTNORM
&& ads_getdist((double*)(&p), "Blob radius: ", &r) == RTNORM)
{
pCircle- >setCenter(p);
pCircle- >setRadius(r);
pCircle- >close();
}
return Acad::eOk;
}

class LineTemperature : public EntTemperature
{
public:
virtual Adesk::Boolean HgyModify(AcDbEntity* pEnt) const;
};

Adesk::Boolean
LineTemperature::HgyModify(AcDbEntity* pEnt) const
{
AcDbLine *pLine = AcDbLine::cast(pEnt);
if (!pLine) {
ads_printf("The entity selected is not a line.\n");
pEnt- >close();
return eNotImplementedYet;
}
AcGePoint3d p,q;
p= P_TO_P (pLine- >startPoint());

if (getPoint ((double*)(&p), "From Point: ", p)== RTNORM
&& getPoint((double*)(&p), "To point: ", q) == RTNORM)
{
pLine- >setStartPoint(p);
pLine- >setEndPoint(q);
pLine- >close();
}
return Acad::eOk;
}

---- 如您所见,HgyModify函数也要完全重写。至此我们对CircleTemperature和LineTemperature的定义已经完成。上面P_TO_P()只是一个点对点赋值,getPoint()是自定义的取点函数。增加全局变量:这样我们在初始化或清除内存过程中可以存取该类。
LineTemperature *pLineTemp;
CircleTemperature *pCircleTemp;
InitApp()函数中更改部分:
acedRegCmds- >addCommand("TEMPERATURE_APP",
"MODIFY", "MODIFY",
ACRX_CMD_TRANSPARENT, printEnergy);
更改程序中别的函数中的相应的部分。
注意printEnergy()函数中selectEntity()
函数的第二个参数必须是AcDb::kForWrite;

---- 编译后在AutoCAD(如R14)中测试运行,敲入modify后随便选取直线或圆,您就会能体会到超级编辑命令的方便之处。或许您会认为此命令没有什么特别之处,但若您仔细研究lab10子目录中的内容,定义自己的实体如门、窗或机械特征,特别是您自己才会用到的特殊对象,给对象增加此命令,您就会体会到ARX编程的魅力了
这个家伙什么也没有留下。。。

CAD下载及教程

返回版块

52.09 万条内容 · 667 人订阅

猜你喜欢

阅读下一篇

CAD 2006 最新功能展示(转)

AutoCAD 2006 Beta2版正在测试中,其名称被称为 AutoCAD Rio 版本。记得去年这个时候正在测试2005版,一年一个版本也太快了一点。这可能是Autodesk公司的赚钱手法吧,每年功能增加一点点,又要用户交钱升级,也太黑心了。我们就不交钱,只关心它的性能有多少新的东西。 ■ 创建图形 ◆ 动态图块的操作   图块,是大多数图形中的基本构成部分,它用于表示现实中的物体。现实物体的不同种类需要定义各种不同的图块。这样就需要定义成千上万的图块定义,在这种情况下,如果图块的某个外观有些区别,用户就需要炸开图块来编辑其中的几何图形。这种解决方法会产生大量的、矛盾的和错误的图形。

回帖成功

经验值 +10