转载:ObjectArx 自定义实体_iMatt的博客-CSDN博客_objectarx 自定义实体

效果如下:

重点:

1.实现三个重载函数

(一)//利用图纸初始化数据成员(反序列化)
 virtual Acad::ErrorStatus dwgInFields(AcDbDwgFiler* filer);
(二)//将当前数据成员写入图纸(序列化)
  virtual Acad::ErrorStatus dwgOutFields(AcDbDwgFiler* filer) const;

(三) //更新绘制模型

virtual Adesk::Boolean      subWorldDraw(AcGiWorldDraw* mode);

2:重点函数讲解

1.subWorldDraw 这个函数主要是用来实时绘制圆函数

2.dwgInFields和dwgOutFields这两个函数主要是为了保存变化的数据,类似数据库,将数据写入数据库和读取数据库获取数据。

3.  subMoveGripPointsAt这个函数是当拖动构件进行操作的时候就会响应这个函数。

总体代码如下:

CCustomColorCircle.h

#pragma once
#include "StdAfx.h"
#include "acadstrc.h"
#include "geassign.h"class CCustomColorCircle:public AcDbEntity
{
public:ACRX_DECLARE_MEMBERS(CCustomColorCircle);CCustomColorCircle();CCustomColorCircle(AcGePoint3d centerPt, double m_radius);~CCustomColorCircle();
protected://利用图纸初始化数据成员(反序列化)virtual Acad::ErrorStatus dwgInFields(AcDbDwgFiler* filer);//将当前数据成员写入图纸(序列化)virtual Acad::ErrorStatus dwgOutFields(AcDbDwgFiler* filer) const;//利用初始化数据成员(反序列化)CAD数据交换的CAD数据文件格式virtual Acad::ErrorStatus dxfInFields(AcDbDxfFiler* filer);//将当前数据成员写入(序列化) CAD数据交换的CAD数据文件格式virtual Acad::ErrorStatus dxfOutFields(AcDbDxfFiler* filer) const;//更新绘制模型virtual Adesk::Boolean      subWorldDraw(AcGiWorldDraw* mode);//获得一个实体的范围virtual Acad::ErrorStatus   subGetGeomExtents(AcDbExtents& extents) const;//选中一下cad提供的实体,将特征点显示出来virtual Acad::ErrorStatus   subGetGripPoints(AcGePoint3dArray& gripPoints, AcDbIntArray& osnapModes, AcDbIntArray& geomIds) const;//用户拖拽特征点的时候,实体应该进行变化virtual Acad::ErrorStatus   subMoveGripPointsAt(const AcDbIntArray& indices, const AcGeVector3d& offset);
public://setColorIndex设置颜色virtual Acad::ErrorStatus   setColorIndex(Adesk::UInt16 color, Adesk::Boolean doSubents = true);
private://圆心AcGePoint3d m_CenterPoint;double m_radius;
};

CCustomColorCircle.cpp

#include "CCustomColorCircle.h"
#include <math.h>
ACRX_DXF_DEFINE_MEMBERS(CCustomColorCircle, AcDbEntity, AcDb::kDHL_CURRENT,AcDb::kMReleaseCurrent, 0, CUSTOMCIRCLE, /*MSG0*/"TSZ");
MAKE_ACDBOPENOBJECT_FUNCTION(CCustomColorCircle);#define VERSION 1CCustomColorCircle::CCustomColorCircle() :m_CenterPoint(AcGePoint3d(0, 0, 0)), m_radius(50)
{
}CCustomColorCircle::CCustomColorCircle(AcGePoint3d centerPt, double radius):m_CenterPoint(centerPt), m_radius(radius)
{}CCustomColorCircle::~CCustomColorCircle()
{
}Acad::ErrorStatus CCustomColorCircle::setColorIndex(Adesk::UInt16 color, Adesk::Boolean doSubents)
{return AcDbEntity::setColorIndex(color, doSubents);
}Adesk::Boolean CCustomColorCircle::subWorldDraw(AcGiWorldDraw* mode)
{//因为能够通过setColorIndex设置颜色,在这里设置一下int colorIndex = this->colorIndex();mode->subEntityTraits().setColor(colorIndex);//绘制圆mode->geometry().circle(m_CenterPoint, m_radius, AcGeVector3d::kZAxis);return Adesk::kTrue;
}Acad::ErrorStatus CCustomColorCircle::subGetGeomExtents(AcDbExtents& extents) const
{extents.addPoint(m_CenterPoint + sqrt(2.0) * m_radius * AcGeVector3d(1, 1, 0));extents.addPoint(m_CenterPoint - sqrt(2.0) * m_radius * AcGeVector3d(1, 1, 0));return Acad::eOk;
}Acad::ErrorStatus CCustomColorCircle::dwgInFields(AcDbDwgFiler* filer)
{assertWriteEnabled();if (AcDbEntity::dwgInFields(filer) != Acad::eOk){return filer->filerStatus();}int version;filer->readItem(&version);filer->readItem(&m_CenterPoint);filer->readItem(&m_radius);return filer->filerStatus();
}Acad::ErrorStatus CCustomColorCircle::dwgOutFields(AcDbDwgFiler* filer) const
{assertReadEnabled();if (AcDbEntity::dwgOutFields(filer) != Acad::eOk){return filer->filerStatus();}filer->writeItem(VERSION);filer->writeItem(m_CenterPoint);filer->writeItem(m_radius);return filer->filerStatus();
}Acad::ErrorStatus CCustomColorCircle::dxfInFields(AcDbDxfFiler* filer)
{assertWriteEnabled();if (AcDbEntity::dxfInFields(filer) != Acad::eOk ||filer->atSubclassData(_T("CCustomColorCircle"))){return filer->filerStatus();}//读取版本resbuf rb;filer->readItem(&rb);int iVersion = rb.resval.rint;//读取圆心filer->readItem(&rb);m_CenterPoint = AcGePoint3d(rb.resval.rpoint[0], rb.resval.rpoint[1],rb.resval.rpoint[2]);return Acad::eOk;
}Acad::ErrorStatus CCustomColorCircle::dxfOutFields(AcDbDxfFiler* filer) const
{assertReadEnabled();Acad::ErrorStatus es;if ((es = AcDbEntity::dxfOutFields(filer))!= Acad::eOk){return es;}filer->writeItem(AcDb::kDxfSubclass, _T("CCustomColorCircle"));filer->writeInt16(AcDb::kDxfInt16, VERSION);filer->writePoint3d(AcDb::kDxfXCoord, m_CenterPoint);return filer->filerStatus();
}Acad::ErrorStatus CCustomColorCircle::subGetGripPoints(AcGePoint3dArray& gripPoints, AcDbIntArray& osnapModes, AcDbIntArray& geomIds) const
{/*这里添加三个点 添加三个点的顺序很重要向gripPoints中填充点,这些点在实体被选中后,会显示出来*/gripPoints.append(m_CenterPoint);gripPoints.append(m_CenterPoint + m_radius * AcGeVector3d::kXAxis);gripPoints.append(m_CenterPoint - m_radius * AcGeVector3d::kXAxis);return Acad::eOk;
}Acad::ErrorStatus   CCustomColorCircle::subMoveGripPointsAt(const AcDbIntArray& indices, const AcGeVector3d& offset)
{/*indices:用户选择的特征点的索引(和你在subGetGripPoints的填充顺序是一致的,从0开始)offset(拖拽产生的向量)*///在这里我们这其实只是一个圆,所以简单调用矩阵变换函数if (indices.length() == 0 || offset.length() == 0)return Acad::eOk;
#ifdef _DEBUG//输出当前用户拖拽点的索引acutPrintf(_T("\n%d"), inDices)
#endifint num = indices.length();for (int i = 0; i < num; i++){int k = indices[i];switch (k){case 0:m_CenterPoint += offset;break;case 1:if (offset.x > 0){m_radius += offset.length();}else{m_radius -= offset.length();}break;case 2:if (offset.x>0){m_radius -= offset.length();}else{m_radius += offset.length();}break;default:break;}}return transformBy(AcGeMatrix3d::translation(offset));//这个函数又会调用subTransformby
}

实现完实体的功能,需要在dll启动的时候加载自定义的实体。

acrxEntryPoint.cpp

 //加载自定义的实体CCustomColorCircle::rxInit();acrxBuildClassHierarchy();

最后初始化圆,加入到块表实体中

    //创建一个实体圆AcGePoint3d ptCenter(xPt, yPt, zPt);//创建圆,点法线,半径CCustomColorCircle* pCircle = new CCustomColorCircle(ptCenter, radius);// 将实体添加到图形数据库NetworkUtils::PostToModelSpace(pCircle);
AcDbObjectId PostToModelSpace(AcDbEntity* pEnt){// 获得指向块表的指针assert(pEnt);AcDbBlockTable* pBlockTable = NULL;acdbHostApplicationServices()->workingDatabase()->getBlockTable(pBlockTable, AcDb::kForRead);// 获得指向特定的块表记录(模型空间)的指针AcDbBlockTableRecord* pBlockTableRecord = NULL;Acad::ErrorStatus es = pBlockTable->getAt(ACDB_MODEL_SPACE, pBlockTableRecord, AcDb::kForWrite);assert(pBlockTableRecord);pBlockTable->close();// 将AcDbLine类的对象添加到块表记录中AcDbObjectId entId;Acad::ErrorStatus esinfo = pBlockTableRecord->appendAcDbEntity(entId, pEnt);// 关闭图形数据库的各种对象pBlockTableRecord->close();pEnt->close();return entId;}

ObjectARX--自定义圆的实现相关推荐

  1. ObjectARX自定义实体

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

  2. android百度地图定位自定义图标,Android应用开发之android 百度地图自定义圆,更改默认图标等常用方法...

    本文将带你了解Android应用开发之android 百度地图自定义圆,更改默认图标等常用方法,希望本文对大家学Android有所帮助. 总结了一下百度地图常用的方法(前提是集成百度地图环境成功): ...

  3. android百度地图画圆,Android应用开发之android 百度地图自定义圆,更改默认图标等常用方法...

    本文将带你了解Android应用开发android 百度地图自定义圆,更改默认图标等常用方法,希望本文对大家学Android有所帮助. 总结了一下百度地图常用的方法(前提是集成百度地图环境成功): 1 ...

  4. 自定义圆环形进度条实现

    最近项目里边要用进度条,进度条中间展示进度,底部展示label,因为这个组件用的地方多,所以我就直接封装了一个通用组件. 先看一下效果图: 功能有: 圆环的颜色和进度可以自定义: 中间文字可以自定义: ...

  5. ObjectARX自定义对象的OPM

    在AutoCAD绘图工作中,经常用到特性面板,它可以方便地查询.修改CAD对象的详细信息,如颜色.线型等,它是一个非常实用且便捷的工具.如果能为自定义对象添加一个特性面板(OPM),这无疑是众多初学者 ...

  6. ObjectARX编程--圆

    最近在学习ObjectARX,于是想着把一些东西写到这里供个人和大家参考,博客中出现的问题我会尽快改正,全篇代码基于<[c++]ObjectARX开发实例教程>进行整理与扩展,至于能够做到 ...

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

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

  8. 模具最小内腔尺寸标注,动态标注,确定即标注,ObjectARX自定义实体技术

    先看效果 模具内腔尺寸标注,主要用于寻找最小内腔,移动鼠标时,XY两个方向的标注均会自动更新位置和尺寸值,点击确定即可标注. 程序使用ObjectARX和Jig技术进行编写,支持AutoCAD.中望. ...

  9. 扫二维码+阶梯流式布局+自定义画圆+组合view

    组合view package com.bawei.zhouyilianxi;import android.content.Context; import android.util.AttributeS ...

最新文章

  1. 腾讯、阿里到底有多缺这类程序员?
  2. SQL提取表中某列字符长度为2的所有记录
  3. 开发中使用UEditor编辑器的注意事项
  4. 如何在Android模拟器上安装和卸载APK程序包
  5. vscode配置、使用git
  6. PL/SQL中模拟EBS上下文
  7. idea导入gitlab上面的项目
  8. Android studio 配置使用maven
  9. linux 关闭防火墙 centos7,centos7关闭防火墙和selinux
  10. Java线程:线程私有变量
  11. 自学python能干些什么副业-学会Python有哪些可以做的兼职?
  12. Android中的NavigationView
  13. 结合CDIB类,对图像的打开、显示、保存
  14. VC2005绿色编译器--命令行下编译C++代码
  15. PreScan笔记(2.1)——MATLAB更改初始data model文件中的参数
  16. 跟大家分享一下牛人常用的资源(牛客网 )!
  17. 机器视觉镜头基础知识详解
  18. 金蝶国际:传统ERP增长稳健 转型云服务持续领跑
  19. Python中struct.pack()和struct.unpack()用法详细说明
  20. oracle中alter index,oracle alter index rebuild online和alter index rebuild的區別

热门文章

  1. greylist 灰名单 灰名单技术
  2. win7升级RDP8.1
  3. h5接入微信支付,支付成功回调失败
  4. Zero shot learning
  5. PhysX初步学习内容记录
  6. 2022年,软件测试自学指南(持续更新)
  7. mysql的sandbox_利用 mysql-sandbox快速搭建MySQL测试环境
  8. 【p1332】【模板练习】血色先锋队
  9. vue 知识点整合(持续更新,希望各位大佬不吝赐教补充...)
  10. I/O输入输出——I/O设备(块设备与字符设备)