【CAD】自定义实体的步骤(转)
本文介绍了构造自定义实体的步骤、必须继承的函数和必须注意的事项
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】自定义实体的步骤(转)的更多相关文章
- 用ARX自定义实体
本文介绍了构造自定义实体的步骤.必须继承的函数和必须注意的事项 1.新建一个从AcDbEntity继承的类,如EntTest,必须添加的头文件: "stdarx.h",&quo ...
- ARX自定义实体
本文介绍了构造自定义实体的步骤.必须继承的函数和必须注意的事项 1.新建一个从AcDbEntity继承的类,如EntTest,必须添加的头文件: "stdarx.h"," ...
- CAD控件:COM接口实现自定义实体
1. 实现步骤: 3 1. 实现步骤: 参考例子 :Src\MxDraw5.2\samples\ie\iedemoTest.htm 1) 增加自定义实体对象 调用DrawCustomEntity函数, ...
- CAD绘制自定义实体(com接口)
在cad使用过程中,用户可以绘制自定义实体.点击此处下载演示实例. 调用DrawCustomEntity函数,绘制一个自定义实体对象. 下面代码绘制一个自定义实体,C#代码实现如下: private ...
- cad.arx 自定义实体之编译第一个项目(甜头)
本篇不从零开始讲如何制造自定义图元,而是教新手们如何设置了环境之后编译张帆书中的代码. 利用vs2010编译 张帆<AutoCAD ObjectARX(VC)开发基础与实例教程>一书中的自 ...
- CAD控件使用教程 自定义实体的实现
自定义实体的实现 1 . 自定义实体... 3 1.1 说明... 3 1.2 类的类型信息... 3 1.3 worldDraw.. 4 1.4 ...
- 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 ...
- CAD把自定义实体,变成普通实体(com接口VB语言)
主要用到函数说明: MxDrawXCustomEvent::MxDrawXCustomEntity::explode 把自定义实体,变成普通实体,详细说明如下: 参数 说明 LONGLONG lEnt ...
- 梦想CAD控件自定义实体实现
一.增加自定义实体对象 调用DrawCustomEntity函数,绘制一个自定义实体对象. 下面代码绘制一个自定义实体,C#代码实现如下: private void DrawMlineCommand( ...
随机推荐
- tornado设置cookie过期时间(expires time)
具体的tornado设置过期时间的东西, 我也是查资料才发现的, 现在就贴代码吧 用户登录之后, 设置cookie, 我使用set_secure_cookie的, 它默认是有个30天的过期时间, 导致 ...
- SynchronizationContext应用
这个类的应用,官方的说明并不是很多,主要原因是因为微软又出了一些基于SynchronizationContext的类.比如:BackgroundWorker 大家写程序时经常碰到子线程调用UI线程的方 ...
- C语言编程学习开发的俄罗斯方块小游戏
C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构.C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现 ...
- 从头开始学eShopOnContainers——Visual Studio 2017环境配置
一.安装和配置Docker环境 1.安装Docker CE for Windows 从官方网站下载并安装,https://docs.docker.com/docker-for-windows/inst ...
- Android学习笔记 Gallery图库组件的使用
activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&qu ...
- 函数形参为基类数组,实参为继承类数组,下存在的问题------c++程序设计原理与实践(进阶篇)
示例: #include<iostream> using namespace std; class A { public: int a; int b; A(int aa=1, int bb ...
- C++ TIM或者QQ 自动发送消息
简单写了一下 很简单的demo 闲着没事干 #include "stdafx.h" #include <thread> #include <Windows.h&g ...
- WPF强制设置TextBox文本框的焦点
在需求中遇到这样一种场景:就是在无论何时都要把焦点设置在一个TextBox中. 引用空间:System.Windows.Input 方式1:在窗体的Load事件中去设置焦点,(注意:不能在窗体的构造函 ...
- File 文件操作类 大全
File 文件操作类 大全 许多人都会对文件操作感到很难 我也是 但是一个好的项目中必定会涉及到文件操作的 文件的复制 粘贴 等等等 公司大佬写了 一个文件操作的工具类 感觉还是棒棒的啦 ...
- Qt 学习之路 2(68):访问网络(4)
Home / Qt 学习之路 2 / Qt 学习之路 2(68):访问网络(4) Qt 学习之路 2(68):访问网络(4) 豆子 2013年11月7日 Qt 学习之路 2 19条评论 前面几章我们了 ...