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

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. .netcore项目部署IIS问题

    1.一般根据项目安装对应的runtime  下载地址:https://www.microsoft.com/net/download 2.如果出现502错误可以在cmd命令里面运行如下 如果报错,找到对 ...

  2. 操作系统下spinlock锁解析、模拟及损耗分析

    关于spinlock 我们在知道什么是spinlock之前,还需要知道为什么需要这个spinlock?spinlock本质就是锁,提到锁,我们就回到了多线程编程的混沌初期,为了实现多线程编程,操作系统 ...

  3. 不同数据库表结构的转化,PowerDesigner的使用教程

    通过学习PowerDesigner工具,学习概念模型,物理模型,面向对象模型,业务模型,以及不同数据库表结构的转化. 通过案例给大家分享,sql server 2008r2 数据库和oracle数据库 ...

  4. 《C#多线程编程实战》2.7 CountDownEvent

    这个同步线程的类大概是东北的. 很有意思. 会限定你的线程使用的次数,更形象一点的像是你妈,提前准备好你要使用的线程的次数,用不完还不高兴那种的. 使用顺序基本就是 实例化  填充线程的启动次数 使用 ...

  5. web静态资源的访问(笔记)

    1.在web-inf外的静态资源访问: 三种方式: 2.访问web-inf内的静态资源: 使用请求转发的方式访问web-inf静态资源(重定向相当于在浏览器输入,无法访问) 参考:https://bl ...

  6. 「BZOJ 2434」「NOI 2011」阿狸的打字机「AC自动机」

    题意 有一个打字机,支持三种操作: 字符串末尾加一个小写字母 字符串末尾减一个字符 输出这个字符串 经过不超过\(n\)次操作后有\(m\)组询问:\((x,y)\),表示第\(x\)次输出第字符串在 ...

  7. 单元测试unittest

    unittest.TestSuite():用例集合 uinttest.defaultTestLoader.discover():寻找测试用例,去哪个目录下寻找测试用例,加载测试用例

  8. 设置使用的python版本

    一.查看当前使用的python版本,或设置使用的python版本 二.python2中默认使用ASCII码,无法识别中文,报错如图,解决办法,设置字符集为utf-8

  9. Java面向对象之关键字final 入门实例

    一.基础概念 1.关键字final可以修饰类.函数.变量. 2.关键字final修饰的类不可以被继承. 3.关键字final修饰的方法不可以被覆盖. 4.关键字final修饰的变量是一个常量,只能被赋 ...

  10. 表单校验--js部分

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...