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

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

ErrorStatuserr;AcDbObjectIddashId;AcDbLinetypeTable*pLinetypeTable;acdbHostApplicationServices()->workingDatabase()->loadLineTypeFile(&

//获取虚线线型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 += offset;

}

else

{

EndPoint += offset

} }

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;

}

【CAD】自定义实体的步骤(转)的更多相关文章

  1. 用ARX自定义实体

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

  2. ARX自定义实体

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

  3. CAD控件:COM接口实现自定义实体

    1. 实现步骤: 3 1. 实现步骤: 参考例子 :Src\MxDraw5.2\samples\ie\iedemoTest.htm 1) 增加自定义实体对象 调用DrawCustomEntity函数, ...

  4. CAD绘制自定义实体(com接口)

    在cad使用过程中,用户可以绘制自定义实体.点击此处下载演示实例. 调用DrawCustomEntity函数,绘制一个自定义实体对象. 下面代码绘制一个自定义实体,C#代码实现如下: private ...

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

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

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

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

  7. 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 ...

  8. CAD把自定义实体,变成普通实体(com接口VB语言)

    主要用到函数说明: MxDrawXCustomEvent::MxDrawXCustomEntity::explode 把自定义实体,变成普通实体,详细说明如下: 参数 说明 LONGLONG lEnt ...

  9. 梦想CAD控件自定义实体实现

    一.增加自定义实体对象 调用DrawCustomEntity函数,绘制一个自定义实体对象. 下面代码绘制一个自定义实体,C#代码实现如下: private void DrawMlineCommand( ...

随机推荐

  1. scala冒泡排序

    scala冒泡排序: object Maopao { def main(args: Array[String]) { val list = List(1, 23, 432, 10, 23, 42, 3 ...

  2. XE ListBox实现伸缩效果

    功能:实现年月日压缩,初始化时item是所有年,点击年展开月,点击月展开天,再点击则收缩. 思路:实际上一开始是将所有item显示,只是将月日的item.height赋值为0,    记录每一行的it ...

  3. PLSQL_Developer 连接win7_64位oracle11g

    window7系统 安装的64位 oracle11g,连接32位PLSQL_Developer 1 . 下载 PLSQL_Developer 9.0以上版本(绿色含汉化)   官方的 instantc ...

  4. js 判断今天是否上班

    <script> var weekdate= getWeekDate() switch(weekdate){ case "星期一":; case "星期二&q ...

  5. 微信第三方平台开头篇--MVC代码(第三方获取ticket和公众号授权)

    微信公众号授权给开放平台 公众号授权给第三方平台的技术实现流程比较简单 这个步骤遗漏了开头获取第三方平台自己的accessToken 先说下流程 如何注册开放平台的第三方信息看截图 其他不说了,此文只 ...

  6. 关于C#中Timer定时器的重入问题解决方法(也适用于多线程)

    项目中用到了定时器随着服务启动作定时任务,按指定的准点时间定时执行相关操作,但是在指定准点时间内我只想让它执行一次,要避免重入问题的发生. 首先简单介绍一下timer,这里所说的timer是指的Sys ...

  7. React杂篇(1) -- 打包发布注意事项

    打包后资源路径 问题:直接打包会出现一下情况: 方式一: package.json文件下加入homepage字段 { "name": "wap-v2", &qu ...

  8. 利用keytool工具生成数字证书

    一.制作数字证书  因测试微信小程序, 腾讯要求使用 https协议,所以需要使用证书.使用jdk工具制作数字证书流程如下: 1.查看JDK是否安装,使用命令java -version 2.切换目录至 ...

  9. CentOS 6.3下源码安装LAMP(Linux+Apache+Mysql+Php)环境【转载】

    本文转载自 园友David_Tang的博客,如有侵权请联系本人及时删除,原文地址: http://www.cnblogs.com/mchina/archive/2012/11/28/2778779.h ...

  10. centos6.7安装tomcat

    一.配置环境 安装环境: centos6.7   jdk1.8.0   tomcat8.5 1.到官网下载tomcat 二.下载安装tomcat 1.通过xsheel工具rz命令上传tomcat安装包 ...