【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;
}
转载于:https://www.cnblogs.com/go2anywhere/p/4263940.html
【CAD】自定义实体的步骤(转)相关推荐
- ObjectArx自定义实体入门(C++)及注意事项
本文介绍了构造自定义实体的步骤.必须继承的函数和必须注意的事项 1.新建一个从AcDbEntity继承的类,如EntTest,必须添加的头文件: "stdarx.h"," ...
- ObjectARX自定义实体
说明: 此次绘制的CAD自定义实体是一个矩形,具有拉伸功能.因为初次接触自定义实体,在一次次制作的过程中遇到了很多困难,幸好有老大和同事的帮助,当然还有广大网友们的文章协助,才完成了这个自定义实体的绘 ...
- CAD控件:COM接口实现自定义实体的方法
实现步骤: 参考例子 :Src\MxDraw5.2\samples\ie\iedemoTest.htm 1.增加自定义实体对象 调用DrawCustomEntity函数,绘制一个自定义实体对象 函数 ...
- 梦想CAD控件自定义实体实现
一.增加自定义实体对象 1.调用DrawCustomEntity函数,绘制一个自定义实体对象. 2.下面代码绘制一个自定义实体,C#代码实现如下: private void DrawMlineComm ...
- 掌握 ASP.NET 之路:自定义实体类简介
发布日期 : 5/24/2005| 更新日期 : 5/24/2005 Karl Seguin Microsoft Corporation 摘要:有些情况下,非类型化的 DataSet 可能并非数据操作 ...
- 掌握 ASP.NET 之路:自定义实体类简介 来源 :msdn
ADODB.RecordSet 和常常被遗忘的 MoveNext 的时代已经过去,取而代之的是 Microsoft ADO.NET 强大而又灵活的功能.我们的新武器就是 System.Data 名称空 ...
- ObjectArx创建自定义实体
ObjectArx创建自定义实体 一.目的 在ObjectArx中已经有了许多实体,如AcDbLine,AcDbCircle,AcDbArc等,但在用户使用Cad时,会有一些对他们来讲常用的" ...
- ObjectARX C++自定义实体
ObjectARX C++自定义实体 实现流程 首先创建一个继承自AcDbEntity的自定义实体类,重写几个虚函数方法: .从AcDbEntity类中重载几个必须的虚函数: virtual Ades ...
- ObjectARX简单自定义实体的实现
目录 1. ObjectARX向导(Wizard)的安装 2. 创建自定义实体工程CustomStair 3. 添加实体类 3.1 利用向导添加自定义类 3.2 "初始化"自定义类 ...
- 专题---自定义实体类
目录 一.概述 二.项目初始化 2.1 创建空解决方案 2.2 DBX操作 2.2.1 创建DBX 2.2.2 调试DBX 2.2.3 创建实体类 2.2.4 调试实体类 2.3 ARX操作 2.3. ...
最新文章
- 常见的虚拟存储管理技术
- 如何查看 phtml文件 并有代码颜色提示
- Tomcat创建一个windows服务
- 向textarea元素输入限制长度的字符
- [译]BitTorrent协议规范
- 编写批处理文件编译.Net工程
- 和feign的区别_Feign的传参研究
- [转载]Qt之模型/视图(实时更新数据)
- django基础-学生管理系统
- android定位问题
- 百度网盘设置自定义提取码
- pytorch 预训练模型
- 深入理解栈(Stack)
- 以大TMS运输配送管理系统
- Java数据库篇之mysql VS postgresql
- matcom v4.5 软件下载
- 妈妈写给热恋中的女儿的信!建议女孩都要看!
- 小学奥数思维训练题(八)
- 用数据分析来挖掘一下大家最喜欢的抖音视频都有哪些...
- InSAR学习(五)高级的InSAR技术:PS技术和SBAS技术
热门文章
- linux 设备 总线 驱动 模型
- 7月5日服务器临时维护更新公告,封印战记7月5日更新什么? 7月5日临时更新维护公告...
- springcloud断点续传源码_SpringCloud 超大文件上传和断点续传的实现
- 6.4Spring环境配置等级和优先级
- 【渝粤教育】国家开放大学2018年秋季 7160-22T卫生法学 参考试题
- 最小生成树的普里姆算法c实现
- 【大规模深度强化学习(一) 】深度强化学习中的异步方法(A3C)
- 编辑距离问题(Edit Distance Problem)
- sublime设置代码缩进
- iPhone手机获取uuid 方法