当前位置:网站首页>ObjectARX--自定义圆的实现
ObjectARX--自定义圆的实现
2022-07-17 06:36:00 【qq_1410888563】
转载: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 1
CCustomColorCircle::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)
#endif
int 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;
}边栏推荐
- flowable 查询、完成、作废、删除 任务
- Facial key point detection CNN
- RISC-V技術雜談
- A set of Jenkins style for personal use
- 串口通讯到底有没有累积误差及对时钟精度的要求
- Using PCA to simplify data
- If a number in C language is exactly equal to the sum of its factors, this number is called "perfect". For example, 6=1 + 2 + 3 programming
- 【刷题篇】完全平方数
- Forecast sales xgboost
- By voting for the destruction of STI by Dao, seektiger is truly community driven
猜你喜欢

Redis源码分析之双索引机制

【MySQL】 事务:事务基础知识、MySQL事务实现原理、事务日志 redolog & undolog 详解

Visual Studio 生产环境配置方案:SlowCheetah

Modify radio style

@How can conditionalonmissingbean cover beans in third-party components

Discussion on risc-v Technology

Double index mechanism of redis source code analysis

Redis jump table implementation principle & time complexity analysis

Question 114 of Li Kou: binary tree expansion linked list

Random forest of machine learning
随机推荐
通过Dao投票STI的销毁,SeekTiger真正做到由社区驱动
正则表达示提取匹配内容
4-channel fmc+ baseband signal processing board (4-channel 2G instantaneous bandwidth ad+da)
redis 存储结构原理 2
Redis jump table implementation principle & time complexity analysis
Question 114 of Li Kou: binary tree expansion linked list
【JVM】之虚拟机栈
在线问题反馈模块实战(五):实现对通用字段内容自动填充功能
The best storage scheme of MCU CS Chuangshi SD NAND
Random forest of machine learning
Jd.com's purchase intention forecast (III)
Niuke topic - house raiding 1, house raiding 2
flowable 查询、完成、作废、删除 任务
A set of Jenkins style for personal use
PCIe bus architecture high performance data preprocessing board / K7 325t FMC interface data acquisition and transmission card
Jira --- workflow call external api
深圳保诚笔试记录
Is there any cumulative error in serial communication and the requirements for clock accuracy
Use of fiddler packet capturing tool
mysql语句的注意事项