本文介绍了构造自定义实体的步骤、必须继承的函数和必须注意的事项
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

用ARX自定义实体的更多相关文章

  1. 解决双击dwg文件ARX自定义实体提示代理的问题

    双击dwg文件的时候,如果没有通过注册表设置会提示代理实体. 注册表自动加载arx 注册表参考路径 R18.1 是cad版本 ACAD-9001:409 是cad的地区语言,409是英文 ,804是中 ...

  2. cad.arx 自定义实体之编译第一个项目(甜头)

    本篇不从零开始讲如何制造自定义图元,而是教新手们如何设置了环境之后编译张帆书中的代码. 利用vs2010编译 张帆<AutoCAD ObjectARX(VC)开发基础与实例教程>一书中的自 ...

  3. ARX自定义实体

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

  4. 待实践二:MVC3下的3种验证 (1)前台 jquery validate验证 (2)MVC实体验证 (3)EF生成的/自己手写的 自定义实体校验(伙伴类+元素据共享)

    MVC3下的3种验证 (1):前台Jquery Validate脚本验证 引入脚本 <script src="../js/jquery.js" type="text ...

  5. [转]掌握 ASP.NET 之路:自定义实体类简介 --自定义实体类和DataSet的比较

    转自: http://www.microsoft.com/china/msdn/library/webservices/asp.net/CustEntCls.mspx?mfr=true 发布日期 : ...

  6. Linq to Sql:N层应用中的查询(上) : 返回自定义实体

    原文:Linq to Sql:N层应用中的查询(上) : 返回自定义实体 如果允许在UI层直接访问Linq to Sql的DataContext,可以省去很多问题,譬如在处理多表join的时候,我们使 ...

  7. 【CAD】自定义实体的步骤(转)

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

  8. CAD控件使用教程 自定义实体的实现

    自定义实体的实现 1 .       自定义实体... 3 1.1      说明... 3 1.2      类的类型信息... 3 1.3      worldDraw.. 4 1.4      ...

  9. 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 ...

随机推荐

  1. sqlserver修改计算机名称。

    SELECT @@SERVERNAME As [@@SERVERNAME], CAST(SERVERPROPERTY('MACHINENAME') AS VARCHAR(128)) + COALESC ...

  2. java版微信公众号支付(H5调微信内置API)

    最近需要做微信公众号支付,网上找了大堆的代码,大多都只说了个原理,自己踩了太多坑,所有的坑,都会再下面的文章中标注,代码我也贴上最全的(叫我雷锋)!!! 第一步:配置支付授权目录 你需要有将你公司的微 ...

  3. laravel 5.4 fopen(): Filename cannot be empty

    1.出错的报错信息(我在用laravel5.4文件上传时候出错的) laravel 5.4 fopen(): Filename cannot be empty 2.解决的方法 在php.ini中修改临 ...

  4. SpringSecurity3Demo【原】

    oschina git地址: https://gitee.com/KingBoBo/SpringSecurity3Demo.git

  5. Java高并发秒杀API之web层

    第1章 设计Restful接口 1.1前端交互流程设计 1.2 学习Restful接口设计 什么是Restful?它就是一种优雅的URI表述方式,用来设计我们资源的访问URL.通过这个URL的设计,我 ...

  6. HDU - 1542 Atlantis(线段树求面积并)

    https://cn.vjudge.net/problem/HDU-1542 题意 求矩形的面积并 分析 点为浮点数,需要离散化处理. 给定一个矩形的左下角坐标和右上角坐标分别为:(x1,y1).(x ...

  7. Eclipse创建SpringMVC,Spring, Hibernate项目

    创建一个java project,创建连个folder,分别命名为java和webapp,删除src文件夹. 打开工程的propertise设置中的build to path,将输出设置为工程名\we ...

  8. 解析ArcGis的标注(一)——先看看分数式、假分数式标注是怎样实现的

    该“标注”系列博文的标注引擎使用“标准标注引擎(standard label engine)”,这个概念如不知道,可不理会,ArcGis默认标注引擎就是它. ArcGis的标注表达式支持VBScrip ...

  9. 【转载】详解KMP算法

    网址:https://www.cnblogs.com/yjiyjige/p/3263858.html

  10. jsp使用cookie自动登录

    Login.jsp <%@ page language="java" import="java.util.*" pageEncoding="ut ...