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

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. .net Stream篇(四)

    FileStream 目录: 如何去理解FileStream? FileStream的重要性 FileStream常用构造函数(重要) 非托管参数SafeFileHandle简单介绍 FileStre ...

  2. db2 中 SQL判断物理表是否存在、修改表名

    1.db2 中 SQL判断物理表是否存在 SELECT * FROM SYSIBM.SYSTABLES WHERE TID <> 0 AND Name = 'TABLE_NAME' AND ...

  3. [转载] C++ namespaces 使用

    原地址:http://blog.sina.com.cn/s/blog_986c99d601010hiv.html 命名空间(namespace)是一种描述逻辑分组的机制,可以将按某些标准在逻辑上属于同 ...

  4. WKWebView 的使用和封装

    WKWebView 的使用和封装 前言 项目中有个新闻资讯模块展示公司和相关行业的最新动态. 这个部分基本是以展示网页为主,内部可能会有一些 native 和 JS 代码的交互. 因为是新项目,所以决 ...

  5. 数据解析之xpath

    一.环境安装 下载lxml pip install lxml 二.使用 XPath 使用路径表达式来选取 XML 文档中的节点或节点集.节点是通过沿着路径 (path) 或者步 (steps) 来选取 ...

  6. PHP选项和运行

    PHP运行模式 五大运行模式 1.cgi 通用网关接口 2.fast-cgi cgi升级 3.cli (Command Line Interface) 4.isapi 微软提供的面向Internet服 ...

  7. Python 简单说明与数据结构

    Python 简单说明与数据结构 Python 作为 "国内" 较流行的高级语言,具有代码容易理解.专注解决问题.混合编译其他语言的优点. 变量 变量是一个最基本的储存单位,它暂时 ...

  8. 1. UML统一建模语言

    (1)UML概述: 建模: 对现实系统进行适当的过滤, 用适当的表现规则描述出简洁的模型. 建模是一种深入解决问题的方法. UML: UML(United Modeling Language, 统一建 ...

  9. MyBatis与Hibernate比较

    MyBatis: 1.是一个sql语句映射的框架(工具). 2.注重pojo与sql之间的映射关系.不会为程序员在运行期自动生成sql 3.自动化程度低,手工映射sql灵活程度高 4.需要开发人员熟练 ...

  10. EL表达式的语法与应用

    EL(是Expression Language的缩写),使用EL对JSP输出进行优化,可以使得页面结构更加清晰,代码可读性高,也更加便于维护. EL表达式的语法: 语法:$(EL 表达式) $  和 ...