模具塑胶知识
模具知识|开发AutoCAD的超级编辑命令
2016-05-26  浏览:70
模具之家讯:许多二次开发软件均提供超级编辑命令,如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(" This entity has no area, and no reflection. ");

return -1.0;

}

修改后的内容如下:

class DefaultTemperature : public EntTemperature

{

public:

virtual Adesk::Boolean HgyModify(AcDbEntity* pEnt) const;

};

Adesk::Boolean DefaultTemperature::

HgyModify(AcDbEntity* pEnt) const

{

ads_printf(" The entity hasn't defined,

and nothing to be modified. ");

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 ");

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. ");

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编程的魅力了。#p#分页标题#e#
模具之家为您提供最全面的塑胶,塑料,模具,模具设计,塑胶模具品牌的装修知识点和各种塑胶模具的导购与在线购买服务,拥有最便宜的塑胶模具价格和最优质的售后服务,敬请登陆模具之家:http://muju.jc68.com/
更多»您可能感兴趣的文章:
更多»有关 塑料 的产品:
  • 模具塑胶资讯
  • 发表评论 | 0评
  • 评论登陆
  • 移动社区 双碳之家 橱柜之家 布艺之家 卫浴之都 建材头条 灯具之家 电气之家 瓷砖之家 区快洞察 全景头条 陶瓷之家 油漆之家 照明之家 防水之家 防盗之家 博一建材 卫浴之家 区快洞察 木板之家 地板之家 防水之家 门窗之家 家电之家 五金之家 水电之家 防盗之家 石材之家 电气之家 地板之家 陶瓷头条 橱柜之家 卫浴头条 布艺之家 家纺头条 暖气头条 墙布头条 建材头条 装修之家 新基建头条 双碳之家 全景头条 建材之家 深圳建材 揭阳建材 香港建材 佛山建材 广州建材 东莞建材 惠州建材 潮州建材 汕头建材 珠海建材 江门建材 韶关建材 湛江建材 茂名建材 肇庆建材 梅州建材 汕尾建材 河源建材 阳江建材 清远建材 中山建材 云浮建材 720全景
    (c)2015-2017 BO-YI.COM SYSTEM All Rights Reserved