返回
AutoCAD

开发AutoCAD的超级编辑命令

2009-08-15197
许多二次开发软件均提供超级编辑命令,如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#

标签: 命令 编辑 超级 开发 pEnt AcDbEntity const double 函数
  • 举报
关闭
同类资讯头条
  • 账号登录

其他方式登录