ObjectARX C++自定义实体

实现流程

首先创建一个继承自AcDbEntity的自定义实体类,重写几个虚函数方法:

.从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);

在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());

在InitApplication()函数中添加:

EntTest::rxInit();
acrxBuildClassHierarchy();

下面是一个例子:

#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();//获取虚线线型IDAcad::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);AcDbBlockTableRecord *btr;bt->getAt(ACDB_MODEL_SPACE,btr,AcDb::kForWrite);bt->close();btr->appendAcDbEntity(entityId,pEnt);pEnt->close();btr->close();return entityId;
}

该文章会更新,欢迎大家批评指正。

推荐一个零声学院免费公开课程,个人觉得老师讲得不错,
分享给大家:[Linux,Nginx,ZeroMQ,MySQL,Redis,
fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,
TCP/IP,协程,DPDK等技术内容,点击立即学习:
服务器课程:C++服务器

ObjectARX C++自定义实体相关推荐

  1. ObjectArx创建自定义实体

    ObjectArx创建自定义实体 一.目的 在ObjectArx中已经有了许多实体,如AcDbLine,AcDbCircle,AcDbArc等,但在用户使用Cad时,会有一些对他们来讲常用的" ...

  2. ObjectARX简单自定义实体的实现

    目录 1. ObjectARX向导(Wizard)的安装 2. 创建自定义实体工程CustomStair 3. 添加实体类 3.1 利用向导添加自定义类 3.2 "初始化"自定义类 ...

  3. ObjectARX自定义实体

    说明: 此次绘制的CAD自定义实体是一个矩形,具有拉伸功能.因为初次接触自定义实体,在一次次制作的过程中遇到了很多困难,幸好有老大和同事的帮助,当然还有广大网友们的文章协助,才完成了这个自定义实体的绘 ...

  4. ObjectARX第一课:创建自定义实体

    源地址:https://blog.csdn.net/u012158162/article/details/67644392 一.目的 在ObjectArx中已经有了许多实体,如AcDbLine,AcD ...

  5. ObjectArx自定义实体入门(C++)及注意事项

    本文介绍了构造自定义实体的步骤.必须继承的函数和必须注意的事项 1.新建一个从AcDbEntity继承的类,如EntTest,必须添加的头文件: "stdarx.h"," ...

  6. 专题---自定义实体类

    目录 一.概述 二.项目初始化 2.1 创建空解决方案 2.2 DBX操作 2.2.1 创建DBX 2.2.2 调试DBX 2.2.3 创建实体类 2.2.4 调试实体类 2.3 ARX操作 2.3. ...

  7. 掌握 ASP.NET 之路:自定义实体类简介

    发布日期 : 5/24/2005| 更新日期 : 5/24/2005 Karl Seguin Microsoft Corporation 摘要:有些情况下,非类型化的 DataSet 可能并非数据操作 ...

  8. 掌握 ASP.NET 之路:自定义实体类简介 来源 :msdn

    ADODB.RecordSet 和常常被遗忘的 MoveNext 的时代已经过去,取而代之的是 Microsoft ADO.NET 强大而又灵活的功能.我们的新武器就是 System.Data 名称空 ...

  9. 梦想CAD控件自定义实体实现

    一.增加自定义实体对象 1.调用DrawCustomEntity函数,绘制一个自定义实体对象. 2.下面代码绘制一个自定义实体,C#代码实现如下: private void DrawMlineComm ...

最新文章

  1. UIBezierPath的使用(持续更新)
  2. jQuery源码学习第二天--jQuery的extend扩展
  3. Web自适应布局你需要知道的所有事儿
  4. Java 从业一年的心得体会
  5. asp.net超过字数限制用省略号...表示
  6. linux subsys_initcall
  7. 贪心算法---背包问题(物品可以分割问题)
  8. Libcurl的介绍
  9. java 方法 示例_Java语言环境getISOCountries()方法与示例
  10. 新年快乐,送一台新款华为笔记本!
  11. C#重写ToString
  12. 正确评估SQL数据库性能,你必须知道的原理和方法!
  13. 网络安全统计显示XSS和过时的软件是主要问题
  14. IATF16949认证辅导,IATF16949五大核心工具也称质量管理五大工具包括哪些
  15. 解决依赖包引入后重复问题Duplicate zip entry
  16. 个人网页LOGO设计(作业)
  17. NOTE_网络存储-2 by 张冬
  18. 浏览器的onload事件
  19. CC2530+PA(CC2590)开启功率放大模块功能说明
  20. git 拉取指定的远程分支(三种方式)

热门文章

  1. 制造业和物流行业的WMS系统差别在哪?
  2. Full Disk Encryption(FDE)全盘加密开关
  3. vue与nodejs
  4. Netty 中的粘包和拆包详解
  5. mysql 模糊查找表名
  6. JavaScript中的onload详解
  7. 【HTML5】Web前端——第三课:HTML5 表单相关元素和属性
  8. 吃白菜一样用micropython玩esp32(四)—— siri远程控制点灯
  9. iOS视图成像理论及性能优化
  10. 华为官方模拟器eNSP_B500高速网盘下载——带CE系统