ObjectARX--自定义圆的实现
转载: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--自定义圆的实现相关推荐
- ObjectARX自定义实体
说明: 此次绘制的CAD自定义实体是一个矩形,具有拉伸功能.因为初次接触自定义实体,在一次次制作的过程中遇到了很多困难,幸好有老大和同事的帮助,当然还有广大网友们的文章协助,才完成了这个自定义实体的绘 ...
- android百度地图定位自定义图标,Android应用开发之android 百度地图自定义圆,更改默认图标等常用方法...
本文将带你了解Android应用开发之android 百度地图自定义圆,更改默认图标等常用方法,希望本文对大家学Android有所帮助. 总结了一下百度地图常用的方法(前提是集成百度地图环境成功): ...
- android百度地图画圆,Android应用开发之android 百度地图自定义圆,更改默认图标等常用方法...
本文将带你了解Android应用开发android 百度地图自定义圆,更改默认图标等常用方法,希望本文对大家学Android有所帮助. 总结了一下百度地图常用的方法(前提是集成百度地图环境成功): 1 ...
- 自定义圆环形进度条实现
最近项目里边要用进度条,进度条中间展示进度,底部展示label,因为这个组件用的地方多,所以我就直接封装了一个通用组件. 先看一下效果图: 功能有: 圆环的颜色和进度可以自定义: 中间文字可以自定义: ...
- ObjectARX自定义对象的OPM
在AutoCAD绘图工作中,经常用到特性面板,它可以方便地查询.修改CAD对象的详细信息,如颜色.线型等,它是一个非常实用且便捷的工具.如果能为自定义对象添加一个特性面板(OPM),这无疑是众多初学者 ...
- ObjectARX编程--圆
最近在学习ObjectARX,于是想着把一些东西写到这里供个人和大家参考,博客中出现的问题我会尽快改正,全篇代码基于<[c++]ObjectARX开发实例教程>进行整理与扩展,至于能够做到 ...
- ObjectArx自定义实体入门(C++)及注意事项
本文介绍了构造自定义实体的步骤.必须继承的函数和必须注意的事项 1.新建一个从AcDbEntity继承的类,如EntTest,必须添加的头文件: "stdarx.h"," ...
- 模具最小内腔尺寸标注,动态标注,确定即标注,ObjectARX自定义实体技术
先看效果 模具内腔尺寸标注,主要用于寻找最小内腔,移动鼠标时,XY两个方向的标注均会自动更新位置和尺寸值,点击确定即可标注. 程序使用ObjectARX和Jig技术进行编写,支持AutoCAD.中望. ...
- 扫二维码+阶梯流式布局+自定义画圆+组合view
组合view package com.bawei.zhouyilianxi;import android.content.Context; import android.util.AttributeS ...
最新文章
- 腾讯、阿里到底有多缺这类程序员?
- SQL提取表中某列字符长度为2的所有记录
- 开发中使用UEditor编辑器的注意事项
- 如何在Android模拟器上安装和卸载APK程序包
- vscode配置、使用git
- PL/SQL中模拟EBS上下文
- idea导入gitlab上面的项目
- Android studio 配置使用maven
- linux 关闭防火墙 centos7,centos7关闭防火墙和selinux
- Java线程:线程私有变量
- 自学python能干些什么副业-学会Python有哪些可以做的兼职?
- Android中的NavigationView
- 结合CDIB类,对图像的打开、显示、保存
- VC2005绿色编译器--命令行下编译C++代码
- PreScan笔记(2.1)——MATLAB更改初始data model文件中的参数
- 跟大家分享一下牛人常用的资源(牛客网 )!
- 机器视觉镜头基础知识详解
- 金蝶国际:传统ERP增长稳健 转型云服务持续领跑
- Python中struct.pack()和struct.unpack()用法详细说明
- oracle中alter index,oracle alter index rebuild online和alter index rebuild的區別