本文介绍了构造自定义实体的步骤、必须继承的函数和必须注意的事项
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);
 AcDbBlo

用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"," ...

  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. Spring Boot 启动:No active profile set, falling back to default profiles: default

    启动 Spring Boot 失败,但是没有出现多余的异常信息: 检查之后发现是依赖的问题(之前依赖的是 spring-boot-starter),修改即可: 方法二: pom.xml加上下面两个依赖 ...

  2. UVA - 1328 Period(循环节kmp)

    https://vjudge.net/problem/UVA-1328 题意 求每个前缀的最小循环节,要求至少循环两次且为完整的. 分析 求next数组,i-next[i]即为前缀i的最小循环节,再判 ...

  3. Spring Boot 2程序不能加载 com.mysql.jdbc.Driver 问题

    用Spring Boot Starter 向导生成了一个很简单SpringBoot程序, 用到了 MySQL, 总是下面不能加载 Mysql driver class 错误. Cannot load ...

  4. 使用 Topshelf 结合 Quartz.NET 创建 Windows 服务

    Ø  前言 之前一篇文章已经介绍了,如何使用 Topshelf 创建 Windows 服务.当时提到还缺少一个任务调度框架,就是 Quartz.NET.而本文就展开对 Quartz.NET 的研究,以 ...

  5. python3.x与2.x区别

    1.性能 Py3.0运行 pystone benchmark的速度比Py2.5慢30%.Guido认为Py3.0有极大的优化空间,在字符串和整形操作上可 以取得很好的优化结果. Py3.1性能比Py2 ...

  6. 关于AJAX的基础操作

    AJAX开发 AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术. AJAX = 异步 Java ...

  7. JS中原型链中的prototype与_proto_的个人理解与详细总结

    1.对象的内部属性[[prototype]]和属性__proto__:每个对象都具有一个名为__proto__的属性: 2.函数的属性prototype:每个构造函数(构造函数标准为大写开头,如Fun ...

  8. ubuntu下objective-c的编译和运行

    ubuntu 下编译objective-c 1.安装编译环境 sudo aptitude install build-essential gobjc gobjc++ gnustep gnustep-d ...

  9. 第26月第9天 getActionBar为空的解决办法

    1.python 包路径 export PYTHONPATH=路径 https://blog.csdn.net/machinezj/article/details/60137666 2.getActi ...

  10. jq的dom操作

    代码可以在该网址测试:www.w3school.com.cn/tiy/t.asp?f=jquery_manipulation_detach_move attr 使用函数来设置属性/值:函数参数为选择器 ...