本文介绍了构造自定义实体的步骤、必须继承的函数和必须注意的事项
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
- 解决双击dwg文件ARX自定义实体提示代理的问题
双击dwg文件的时候,如果没有通过注册表设置会提示代理实体. 注册表自动加载arx 注册表参考路径 R18.1 是cad版本 ACAD-9001:409 是cad的地区语言,409是英文 ,804是中 ...
- cad.arx 自定义实体之编译第一个项目(甜头)
本篇不从零开始讲如何制造自定义图元,而是教新手们如何设置了环境之后编译张帆书中的代码. 利用vs2010编译 张帆<AutoCAD ObjectARX(VC)开发基础与实例教程>一书中的自 ...
- ARX自定义实体
本文介绍了构造自定义实体的步骤.必须继承的函数和必须注意的事项 1.新建一个从AcDbEntity继承的类,如EntTest,必须添加的头文件: "stdarx.h"," ...
- 待实践二:MVC3下的3种验证 (1)前台 jquery validate验证 (2)MVC实体验证 (3)EF生成的/自己手写的 自定义实体校验(伙伴类+元素据共享)
MVC3下的3种验证 (1):前台Jquery Validate脚本验证 引入脚本 <script src="../js/jquery.js" type="text ...
- [转]掌握 ASP.NET 之路:自定义实体类简介 --自定义实体类和DataSet的比较
转自: http://www.microsoft.com/china/msdn/library/webservices/asp.net/CustEntCls.mspx?mfr=true 发布日期 : ...
- Linq to Sql:N层应用中的查询(上) : 返回自定义实体
原文:Linq to Sql:N层应用中的查询(上) : 返回自定义实体 如果允许在UI层直接访问Linq to Sql的DataContext,可以省去很多问题,譬如在处理多表join的时候,我们使 ...
- 【CAD】自定义实体的步骤(转)
本文介绍了构造自定义实体的步骤.必须继承的函数和必须注意的事项 1.新建一个从AcDbEntity继承的类,如EntTest,必须添加的头文件: "stdarx.h"," ...
- 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 ...
随机推荐
- Openldap命令详解
Openldap 客户端常用管理命令 1.ldapadd -x: 简答认证方式 -W: 不需要在命令上写密码 ldapapp -x -D "cn=Manager,dc=suixingpay, ...
- Jquery Pagination分页插件使用
JqueryPagination是个简单轻量级的分页插件,使用起来很容易,只要初始化一个实例,并设置总数量.翻页回调函数.其它参数就可以实现无刷新分页功能了. 准备工作 下载jquery.min.js ...
- .net导出Excel几种方式比较
数据原共400条数据,21列,我是双核cpu,4G内存1. Excel com组件要3秒左右,上千条30秒+这种方法比较慢,要引用Microsoft.Office.Interop.Excel #reg ...
- 学习总结:CSS(一)定义方式、选择器、选择器权重
一.CSS的定义方式 1.内部样式:<style></style> 2.行间样式:<div style="width:100px;height:100px;&q ...
- jquery中$.post()方法的简单实例
在jqery中有这样一个方法,$.post()下面就这个方法做一个简单的实例: jQuery.post( url, [data], [callback], [type] ) :使用POST方式来进行异 ...
- Oracle和Mysql的安装
Oracle12C的安装:https://blog.csdn.net/qubeleyz/article/details/79451192 Mysql安装:
- 阿里Fastjson的使用
Fastjson是一个Java语言编写的高性能功能完善的JSON库.由阿里巴巴公司团队开发的. 主要特性主要体现在以下几个方面: 1.高性能 fastjson采用独创的算法,将parse的速度提升到极 ...
- java项目中文件含义
1. java项目 .project:是工程构建配置文件 .classpath:保存的是项目所用的外部引用包的路径 .settings:记录项目配置变化的记录文件夹 src:sourcefolder项 ...
- AndroidStudio替换空行
(1)在Edit Replace In Path输入框中输入:^\s*\n (\s代表任何空白字符,\S代表任何非空白字符,*代表任意个数,\n匹配换行符) (2)Replace With输入框的值为 ...
- FontAwesome图标选择器
虽然比较简单,但很实用,在C# MVC下开发,请首先将图标名称保存到数据库中,图标窗口如下. @{ Layout = "~/Views/Shared/_Form.cshtml"; ...