本文介绍了构造自定义实体的步骤、必须继承的函数和必须注意的事项

1.新建一个从AcDbEntity继承的类,如EntTest,必须添加的头文件: "stdarx.h","acadstrc.h", "geassign.h"。

2.在该类头文件的类声明中添加宏:ACRX_DECLARE_MEMBERS(EntTest);

3.在该类的cpp文件中,类的前面添加宏:

ACRX_DXF_DEFINE_MEMBERS(EntTest, AcDbEntity,AcDb::kDHL_CURRENT, AcDb::kMReleaseCurrent,0,平面实体,"autoCAD");//第5个参数为在CAD中该实体类的名称,
MAKE_ACDBOPENOBJECT_FUNCTION(EntTest);

4.从AcDbEntity类中重载几个必须的虚函数:

virtual Adesk::Boolean worldDraw(AcGiWorldDraw* mode);
     virtual Acad::ErrorStatus dwgInFields(AcDbDwgFiler*);
    virtual Acad::ErrorStatus dwgOutFields(AcDbDwgFiler*) const;
 virtual Acad::ErrorStatus getGripPoints(AcGePoint3dArray& gripPoints,AcDbIntArray&osnapModes,AcDbIntArray& geomIds) const;
    virtual Acad::ErrorStatus moveGripPointsAt(const AcDbIntArray& indices,const AcGeVector3d& offset);

5.实现第4步中几个虚函数必须注意:

在dwgInFields函数的开始处必须有:

assertWriteEnabled();
 AcDbObject::dwgInFields(pFiler);
 if(pFiler->filerType()==AcDb::kWblockCloneFiler)
 {
  AcDbHardPointerId Id;
  pFiler->readItem(&Id);  
 }

在dwgOutFields函数的开始处必须有:

assertReadEnabled();
  AcDbObject::dwgOutFields(pFiler);
  if (pFiler->filerType()==AcDb::kWblockCloneFiler)
   pFiler->writeHardPointerId((AcDbHardPointerId)ownerId());

上叙两个函数是用来写入写出自定义实体的成员变量的,以保证在拖动夹点的过程中这些变量是实时变化的(可以在worldDraw或moveGripPointsAt中改变这些值)。成员变量不能为指针,在要用数组指针的场合可用Carray数组来实现。

6.这一步很重要,少了它就不是自定义实体了,呵呵。

在InitApplication()函数中添加:

EntTest::rxInit();
  acrxBuildClassHierarchy();

下面是一个最简单的自定义实体的例子,一根线段,变量成员只有StartPoint,EndPoint,最重要的那几个重载的虚函数的作用和运行顺序得靠自己去慢慢摸索了。我想这个例子刚入门的你还是有点帮助的,注意:AddEntityToDbs()函数也比不可少

头文件:

#if !defined(AFX_ACDBENTITYTEST_H__E622CCB1_4E1D_4985_8813_0CEE3BF4ED20__INCLUDED_)
#define AFX_ACDBENTITYTEST_H__E622CCB1_4E1D_4985_8813_0CEE3BF4ED20__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "stdafx.h"
#include "stdarx.h"
#include "acadstrc.h"
#include "geassign.h"
#include "acedads.h"
#include "math.h"
#include <fstream.h>

class AcdbEntityTest:public AcDbEntity  
{
public:
 ACRX_DECLARE_MEMBERS(AcdbEntityTest);
 AcdbEntityTest();
 virtual ~AcdbEntityTest();

virtual void Initialize();

//自定义实体必须重载的函数----------------------------------------------------
    virtual Adesk::Boolean worldDraw(AcGiWorldDraw* mode);
 virtual Acad::ErrorStatus dwgInFields(AcDbDwgFiler*);
    virtual Acad::ErrorStatus dwgOutFields(AcDbDwgFiler*) const;
 virtual Acad::ErrorStatus getGripPoints(AcGePoint3dArray& gripPoints,
  AcDbIntArray& osnapModes,
  AcDbIntArray& geomIds) const;
 
    virtual Acad::ErrorStatus moveGripPointsAt(const AcDbIntArray& indices, 
  const AcGeVector3d& offset);
 
 virtual Acad::ErrorStatus getOsnapPoints(
  AcDb::OsnapMode   osnapMode,
  int               gsSelectionMark,
  const AcGePoint3d&    pickPoint,
  const AcGePoint3d&    lastPoint,
  const AcGeMatrix3d&   viewXform,
  AcGePoint3dArray& snapPoints,
  AcDbIntArray&     geomIds) const ;
 
private:
 AcGePoint3d StartPoint;
 AcGePoint3d EndPoint;
};
#endif // !defined(AFX_ACDBENTITYTEST_H__E622CCB1_4E1D_4985_8813_0CEE3BF4ED20__INCLUDED_)

cpp:

#include "stdafx.h"
#include "stdarx.h"
#include "Resource.h"
#include "acadstrc.h"
#include "geassign.h"
#include "acedads.h"
#include "math.h"
#include <fstream.h>
#include "AcdbEntityTest.h"
#include "global.h"

ACRX_DXF_DEFINE_MEMBERS(AcdbEntityTest, AcDbEntity,AcDb::kDHL_CURRENT, AcDb::kMReleaseCurrent,0,EntityDIM,"autoCAD");
MAKE_ACDBOPENOBJECT_FUNCTION(AcdbEntityTest);

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

AcdbEntityTest::AcdbEntityTest()
{
 abarx=new AboutArx();
}

AcdbEntityTest::~AcdbEntityTest()
{
 
}
Acad::ErrorStatus AcdbEntityTest::dwgInFields(AcDbDwgFiler* pFiler)
{
 assertWriteEnabled();
 AcDbObject::dwgInFields(pFiler);
 if(pFiler->filerType()==AcDb::kWblockCloneFiler)
 {
  AcDbHardPointerId Id;
  pFiler->readItem(&Id);  
 }

pFiler->readItem(&StartPoint);
 pFiler->readItem(&EndPoint);

return pFiler->filerStatus();
}
Acad::ErrorStatus AcdbEntityTest::dwgOutFields(AcDbDwgFiler* pFiler) const
{
     assertReadEnabled();
  AcDbObject::dwgOutFields(pFiler);

if (pFiler->filerType()==AcDb::kWblockCloneFiler)
  {
   pFiler->writeHardPointerId((AcDbHardPointerId)ownerId());
  }

pFiler->writeItem(StartPoint);
  pFiler->writeItem(EndPoint);

return pFiler->filerStatus();
}

Adesk::Boolean  AcdbEntityTest::worldDraw(AcGiWorldDraw* pWd)
{

AcDbObjectId originalLineTypeID;
 originalLineTypeID=pWd->subEntityTraits().lineTypeId();
 Adesk::UInt16 originalColor;
 originalColor=pWd->subEntityTraits().color();
 
 //获取虚线线型ID
 
 Acad::ErrorStatus err;
 AcDbObjectId dashId;
 AcDbLinetypeTable*pLinetypeTable;
 
 acdbHostApplicationServices()->workingDatabase()->loadLineTypeFile("ACAD_ISO02W100","acadiso.lin");
 acdbHostApplicationServices()->workingDatabase()->getLinetypeTable(pLinetypeTable,AcDb::kForRead);
 err=pLinetypeTable->getAt("ACAD_ISO02W100",dashId,Adesk::kTrue);
 pLinetypeTable->close();

pWd->subEntityTraits().setLineType(originalLineTypeID);  
 pWd->subEntityTraits().setColor(1);

AcGePoint3d Verts[2];
 Verts[0]=StartPoint;
 Verts[1]=EndPoint;
 pWd->geometry().polyline(2,Verts);
 return AcDbEntity::worldDraw(pWd);
}
Acad::ErrorStatus AcdbEntityTest::getGripPoints(AcGePoint3dArray& gripPoints,
           AcDbIntArray& osnapModes,
           AcDbIntArray& geomIds)const
{
 assertReadEnabled();
 gripPoints.append(StartPoint);
 gripPoints.append(EndPoint);
 return Acad::eOk;
}
Acad::ErrorStatus AcdbEntityTest::moveGripPointsAt(const AcDbIntArray& indices,const AcGeVector3d& offset)
{
 assertReadEnabled();
 Acad::ErrorStatus es=Acad::eOk;
 if(indices.length()==0)
 {
  return Acad::eOk;
 }

int num=indices.length();
 for(int i=0;i<num;i++)
 {
  int k=indices[i];
  if (k==0)
  {
   StartPoint.x+=offset.x;
   StartPoint.y+=offset.y;
  }
  else
  {
   EndPoint.x+=offset.x;
   EndPoint.y+=offset.y; 
  }
 
 
 }

return Acad::eOk;
}

Acad::ErrorStatus AcdbEntityTest::getOsnapPoints(
             AcDb::OsnapMode   osnapMode,
             int   gsSelectionMark,
             const AcGePoint3d&    pickPoint,
             const AcGePoint3d&    lastPoint,
             const AcGeMatrix3d&   viewXform,
             AcGePoint3dArray& snapPoints,
             AcDbIntArray&     geomIds) const 
{   //设置捕捉点
 assertReadEnabled();
 Acad::ErrorStatus es=Acad::eOk;
 if(osnapMode!=AcDb::kOsModeEnd)
 {
  return Acad::eOk;
 }
 return Acad::eOk;
}

void AcdbEntityTest::Initialize()
{
 AcGePoint3d inputPt;
 if(ads_getpoint(NULL,"/n ==NOTE== 请输入起点: ",asDblArray(inputPt))!=RTNORM)
 {
  ads_printf("/n ==NOTE== 错误");
 }
  StartPoint=inputPt;
 AcDbObjectId entityID=AddEntityToDbs(this);
 int track,type;
 track=1;
 struct resbuf entdata;
 while (track>0)
 {
  if(ads_grread (track, &type, &entdata)!=RTNORM)
  {
   ads_printf("/n !=RTNORM");
   break;
  }
  AcdbEntityTest * pmyEntity=this;
  acdbOpenObject(pmyEntity,entityID, AcDb::kForWrite);
  this->assertWriteEnabled();
  if(type==5)
  {
   AcGePoint3d movePt;    //鼠标当前位置
   movePt[X]=entdata.resval.rpoint[X];
   movePt[Y]=entdata.resval.rpoint[Y];
   EndPoint=movePt;
   this->close();
  }
  
  if(type==3)
  {
   track=1;
   AcGePoint3d movePt;    //鼠标当前位置
   movePt[X]=entdata.resval.rpoint[X];
   movePt[Y]=entdata.resval.rpoint[Y];
   EndPoint=movePt;
   this->close();
   break;
  }
  if(type==13)
  {
   //鼠标右键退出
   track=1;
   AcGePoint3d movePt;  //鼠标当前位置
   movePt[X]=entdata.resval.rpoint[X];
   movePt[Y]=entdata.resval.rpoint[Y];
   EndPoint=movePt;
   this->close(); 
   break;
  }
 }
}

AcDbObjectId AboutArx::AddEntityToDbs(AcDbEntity*pEnt)//将生成的自定义实体对象加入CAD数据库
{
 AcDbBlockTable *bt;
 acDocManager->lockDocument(acDocManager->curDocument(),AcAp::kWrite);
 AcDbObjectId entityId;
 acdbCurDwg()->getBlockTable(bt,AcDb::kForRead);
 AcDbBlockTableRecord *btr;
 bt->getAt(ACDB_MODEL_SPACE,btr,AcDb::kForWrite);
 bt->close();
 btr->appendAcDbEntity(entityId,pEnt);
 pEnt->close();
 btr->close();
 return entityId;
}

ARX自定义实体的更多相关文章

  1. 解决双击dwg文件ARX自定义实体提示代理的问题

    双击dwg文件的时候,如果没有通过注册表设置会提示代理实体. 注册表自动加载arx 注册表参考路径 R18.1 是cad版本 ACAD-9001:409 是cad的地区语言,409是英文 ,804是中 ...

  2. cad.arx 自定义实体之编译第一个项目(甜头)

    本篇不从零开始讲如何制造自定义图元,而是教新手们如何设置了环境之后编译张帆书中的代码. 利用vs2010编译 张帆<AutoCAD ObjectARX(VC)开发基础与实例教程>一书中的自 ...

  3. 用ARX自定义实体

      本文介绍了构造自定义实体的步骤.必须继承的函数和必须注意的事项 1.新建一个从AcDbEntity继承的类,如EntTest,必须添加的头文件: "stdarx.h",&quo ...

  4. 待实践二:MVC3下的3种验证 (1)前台 jquery validate验证 (2)MVC实体验证 (3)EF生成的/自己手写的 自定义实体校验(伙伴类+元素据共享)

    MVC3下的3种验证 (1):前台Jquery Validate脚本验证 引入脚本 <script src="../js/jquery.js" type="text ...

  5. [转]掌握 ASP.NET 之路:自定义实体类简介 --自定义实体类和DataSet的比较

    转自: http://www.microsoft.com/china/msdn/library/webservices/asp.net/CustEntCls.mspx?mfr=true 发布日期 : ...

  6. Linq to Sql:N层应用中的查询(上) : 返回自定义实体

    原文:Linq to Sql:N层应用中的查询(上) : 返回自定义实体 如果允许在UI层直接访问Linq to Sql的DataContext,可以省去很多问题,譬如在处理多表join的时候,我们使 ...

  7. 【CAD】自定义实体的步骤(转)

    本文介绍了构造自定义实体的步骤.必须继承的函数和必须注意的事项 1.新建一个从AcDbEntity继承的类,如EntTest,必须添加的头文件: "stdarx.h"," ...

  8. CAD控件使用教程 自定义实体的实现

    自定义实体的实现 1 .       自定义实体... 3 1.1      说明... 3 1.2      类的类型信息... 3 1.3      worldDraw.. 4 1.4      ...

  9. CAD由一个自定义实体事件中的id得到自定义实体对象(com接口VB语言)

    由一个自定义实体事件中的id得到自定义实体对象.该函数只能在自定义实体事件中调用. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 2 ...

随机推荐

  1. addEventListener()、attachEvent()和removeEventListener()、detachEvent()的差别?

    addEventListener()和attachEvent()的差别? addEventListener:在HTML元素上绑定事件,FF.chrome.opera.safari及IE9浏览器以上的支 ...

  2. Cannot update identity column &#39;XXX&#39;

    Sqlserver -- 怎样改动设置主键的id能够手动更新? #1 打开表的设计界面 #2 将主键id的is Identity的属性改成No 这样就能够通过Update语句来更新表的主键id了. 怎 ...

  3. QT如何修改编程语言的字体

    工具-选项,然后在文本编辑器中设置要的字体

  4. Python3基础(三) 运算符

    Python中的运算符大部分与C语言的类似,但也有很多不同的地方.这里就大概地罗列一下Python 3中的运算符. 一.算术运算符 运算符 描述 示例 x + y 加 10 + 20 = 30 x - ...

  5. 金典 SQL笔记(6)

    page223-索引 --利用SQL 语句创建索引 --CREATE INDEX 索引名称on 表名(字段 ,字段, 字段字段n) --索引名称必须为唯一的,字段 ,字段, 同意一个到多个 --范例为 ...

  6. 【二】注入框架RoboGuice使用:(Your First View Injection)

    上一篇我们简单的介绍了一下RoboGuice的使用([一]注入框架RoboGuice使用:(A brief example of what RoboGuice does)),今天我们我看下View的注 ...

  7. const与static类成员

    const成员函数作用1. 不能修改类的成员变量,同时不能调用类的非const成员函数.(const成员函数中,this的类型是一个指向const类类型对象的const指针,const成员函数返回*t ...

  8. oc79--数组的内存管理

    // // main.m // 集合(数组)对象的内存管理(MRC中) // #import <Foundation/Foundation.h> #import "Person. ...

  9. android binder 基础实例及解析(一)【转】

    本文转载自:http://blog.csdn.net/newchenxf/article/details/49359283#insertcode 原文网址(转载请注明出处): http://blog. ...

  10. basename与dirname命令解析【转】

    本文转载自:http://blog.csdn.net/choice_jj/article/details/8766335 basename命令 语法:basename string [suffix] ...