【CAD二次开发】实现双击实体的响应
一、基本双击响应实现
- 通过向导在VS中创建MFC支持的新项目;
- 项工程中添加普通CDoubleClick类, 基类选择AcDbDoubleClickEdit:
类的头文件为:
class CDoubleClick : public AcDbDoubleClickEdit
{public:CDoubleClick();virtual ~CDoubleClick();//开始编辑时调用的函数void startEdit(AcDbEntity *pEnt, AcGePoint3d pt);//完成编辑之后调用的函数void finishEdit(void);
};
(2)startEdit函数是在用户双击指定类型实体之后触发
实现代码:
void CDoubleClick::startEdit(AcDbEntity *pEnt, AcGePoint3d pt)
{//获得当前文档AcApDocument *pDoc = acDocManager->curDocument();//将AcDbEntity指针转换为AcDbLine指针if (pEnt->isKindOf(AcDbCircle::desc())){AcDbCircle *pCircle = AcDbCircle::cast(pEnt);//锁定文档acDocManager->lockDocument(pDoc);//将实体的打开状态升级为可写状态pCircle->upgradeOpen();//指定新的颜色pCircle->setColorIndex(1);pCircle->close();//解锁文档acDocManager->unlockDocument(pDoc);//清理PickFirst选择集中的内容acedSSSetFirst(NULL, NULL);//更新图形的显示pCircle->draw(); //在关闭之后还能使用actrTransactionManager->flushGraphics();acedUpdateDisplay();}else{acutPrintf(TEXT("\n无效的AcDbCircle对象..."));pEnt->close();return;}
}
(3)本例子并不在finishEdit函数中添加任何处理,但是这个函数的实现部分是一定要有,否则就会产生连接错误。
实现代码:
void CDoubleClick::finishEdit(void)
{//此处不处理
}
(4)在acrxEntryPoint.cpp 文件中的 On_kInitAppMsg (void *pkt) 函数中,添加双击处理基类的初始化,并且为圆的实体类型添加AcDbCircle添加双击处理的协议。
实现代码(AutoCAD 2010 及以前版本):
virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) {// TODO: Load dependencies here// You *must* call On_kInitAppMsg hereAcRx::AppRetCode retCode =AcRxArxApp::On_kInitAppMsg (pkt) ;// TODO: Add your initialization code here// AutoCAD 2010 及之前版本需要,之后版本需注释掉后在头文件后增加// ACRX_DEFINE_MEMBERS(AcDbDoubleClickEdit);//初始化AcDbDoubleClickEdit类AcDbDoubleClickEdit::rxInit();//为AcDbCircle类添加协议扩展CDoubleClick *pCircleEdit = new CDoubleClick;AcDbCircle::desc()->addX(AcDbDoubleClickEdit::desc(), pCircleEdit);return (retCode) ;
}
并在附加依赖项中添加 AcDblClkEditPE.lib
注(重复补充):
从AutoCAD2010开始,双击响应不是在 AcDbClkEditPE.arx 中实现,只需要做以下修改:
1)将 On_kInitAppMsg 函数中的下面代码注释掉:
AcDbDoubleClickEdit::rxInit();
2)只在acrxEntryPoint.cpp 文件中添加下面代码(在头文件的后面添加):
ACRX_DEFINE_MEMBERS(AcDbDoubleClickEdit);
3)工程设置中不再需要依赖AcDbClkEditPE.lib.
(5)在acrxEntryPoint.cpp 文件中的On_kUnloadAppMsg (void *pkt) 函数中,从AcDbCircle类中删除双击处理的协议,确保应用程序在卸载之后圆地双击处理仍然是AutoCAD提供的默认方式。
实现代码:
virtual AcRx::AppRetCode On_kUnloadAppMsg (void *pkt) {// TODO: Add your code here// You *must* call On_kUnloadAppMsg hereAcRx::AppRetCode retCode =AcRxArxApp::On_kUnloadAppMsg (pkt) ;// TODO: Unload dependencies here//删除AcDbCircle类的协议扩展AcDbCircle::desc()->delX(AcDbDoubleClickEdit::desc());return (retCode) ;
}
二、案例:通过对话框接收用户输入的颜色值
(1)添加一个对话框资源:
设置ID和caption:
设置字体:
(2)在对话框资源中添加一个标签控件:(静态文本说明略)
(3)保存工程。使用ObjectARX MFC工具为当前的对话框添加关联的类,类名为CGetColorDlg,基类设置为CAcUiDialog
操作:项目—>新建项—>Autodesk—>MFCSupport
类名:类名为CGetColorDlg
(4)添加CGetColorDlg的两个消息映射函数。
(5)添加文本对话框控件IDC_COLOR_INDEX控件的映射成员变量m_colorIndex,并将它的有效范围设置为0~256
右击示例编辑框->添加成员变量:
(6)在OnInitDialog消息中,调用UpdateDate函数来将成员变量的值更新到关联的界面控件中去
实现代码:
BOOL CGetColorDlg::OnInitDialog()
{CAcUiDialog::OnInitDialog();// TODO: 在此添加额外的初始化//根据成员变量更新资源控件UpdateData(FALSE);return TRUE; // return TRUE unless you set the focus to a control// 异常: OCX 属性页应返回 FALSE
}
(7)OnOk函数的实现
void CGetColorDlg::OnOK()
{// TODO: 在此添加专用代码和/或调用基类//根据资源控件更新成员变量if (!UpdateData(TRUE)){return;}CAcUiDialog::OnOK();
}
(8)在对话框类CGetColorDlg中添加两个成员函数SetParams 和GetParams
声明:
public:void SetParams(int colorIndex);void GetParams(int &colorIndex);
实现:
//设置对话框中的初始颜色值:
void CGetColorDlg::SetParams(int colorIndex)
{m_ColorIndex = colorIndex;
}
//获取对话框中用户输入的新颜色值
void CGetColorDlg::GetParams(int &colorIndex)
{colorIndex = m_ColorIndex;
}
(9)在 startEdit 函数中添加显示对话框获取用户输入的相关代码
修改DoubleClickCircle.cpp 的 startEdit 函数:
void CDoubleClick::startEdit(AcDbEntity *pEnt, AcGePoint3d pt) {//获得当前文档AcApDocument *pDoc = acDocManager->curDocument();//将AcDbEntity指针转换为AcDbLine指针if (pEnt->isKindOf(AcDbCircle::desc())){AcDbCircle *pCircle = AcDbCircle::cast(pEnt);//锁定文档acDocManager->lockDocument(pDoc);//将实体的打开状态升级为可写状态pCircle->upgradeOpen();//提示用户指定新的颜色int oldColorIndex = pCircle->colorIndex();CAcModuleResourceOverride myResource; //防止资源冲突CGetColorDlg dlg;dlg.GetParams(oldColorIndex);if (dlg.DoModal() == IDOK){int newColorIndex = 0;dlg.GetParams(newColorIndex);pCircle->setColorIndex(newColorIndex);}//pCircle->setColorIndex(1);pCircle->close();//解锁文档acDocManager->unlockDocument(pDoc);//清理PickFirst选择集中的内容acedSSSetFirst(NULL, NULL);//更新图形的显示pCircle->draw(); //在关闭之后还能使用actrTransactionManager->flushGraphics();acedUpdateDisplay();}else{acutPrintf(TEXT("\n无效实体对象..."));pEnt->close();return;}
}
(10)消除CUI中的双击处理带来的影响
在CAD的命令栏执行命令:CUI
找到 “圆” ,右键->删除:
双击即可实现修改颜色功能。
参考文章:
【CAD二次开发】-ObjectARX-双击实体的响应 (AcDbDoubleClickEdit)
【CAD二次开发】实现双击实体的响应相关推荐
- CAD二次开发--像纬地与CASS程序一样双击桌面图标实现插件的自动挂载(不用netload也不用进入后输入挂载命令)
先说一下我为什么要写这个文章,首先这一块我自己研究并查找了很久,始终没有很好的办法.二是网络上很多办法鱼龙混杂,要不很复杂,要不现在就已经过时了,总之不能解决问题.干脆自己写一下,防止遗忘! 要明白C ...
- cad二次开发程序的绿色安装
此问题的引入是因为一个cad二次开发软件,客户要求做成绿色安装.何为绿色安装呢?软件包copy到一台电脑上(已安装CAD),双击exe,打开的界面包含自定义的菜单.菜单的图标能正确显示.每个功能能使用 ...
- intersect 相交 范围_关于CAD二次开发中(范围线自相交)相交线的问题
CAD二次开发对于毕业没多久,又是半路出家的我来说,是一个很大的挑战,遇到过很多难以解决的问题,这次在CAD二次开发遇到一个很苦恼的问题:判断 一个由线段组成的闭合区域中,是否存在着相互之间相交的线段 ...
- CAD 二次开发 图层操作(3)取得指定图层下的所有对象id
对于CAD二次开发的人来说,可能需要对某一图层下的实体(点,线,面域,块,三维实体)进行不同的操作.下面的方法,即可实现获取指定图层名称下的所有实体ID. 输入参数为图层名称: 返回值为:对象主键集合 ...
- 关于objectArx /CAD二次开发中“属性块”操作
关于objectArx /CAD二次开发中"属性块"操作 属性块就是在图块上附加一些文字属性(Attribute),这些文字可以非常方便地修改.属性块被广泛应用在工程设计和机械设计 ...
- CAD二次开发(C#)第三节
前言 这是最后一部分代码,往后若有时间,对其中的代码详细讲解.初心不变,以便日后查看.特别感谢作者孙成波译作<AutoCAD .NET 开发指南 2012 版>.三部分代码里面有些许失误, ...
- c#CAD二次开发全套视频目录
本人非专业编程人员,设计院画图民工一名.自学CAD编程,也写了一些小程序!初期学习lisp编程语言,基本了解CAD各中开发模块,写过一些程序!前段时间自学C#CAD二次开发,遍布网上无教学视频.经过自 ...
- CAD二次开发(C#) 第一节
前言 由于工作需要,最近在学习二次开发,将其记录于此,以便日后查看. 语法 涉及"特性","进程"知识点,需要有所了解 #region CAD二次开发--第一节 ...
- c#CAD二次开发 块、属性块的一些重要的知识点概念
本人录制c#CAD二次开发视频 基础入门全套,感兴趣可以淘宝搜索店铺 PT的cad小店 https://i.xue.taobao.com/detail.htm?spm=a2174.7765247.0. ...
最新文章
- LeetCode简单题之三角形的最大周长
- java连接kafka api_Kafka-JavaAPI(Producer And Consumer)
- 中国平安:杀进智能合约,你怕不怕?
- CyclicBarrier 和CountDownLatch使用详解
- Java 打飞机(小游戏)[版权非本人 本人制作收藏整理]
- [RabbitMQ]工作队列原理_代码实现
- strictmath_Java StrictMath ulp()方法与示例
- 安卓rtmp推流app_同城直播电商APP小程序平台开发
- 获取输出最大角标 php,html实现消息按钮上的数量角标的实例详解
- 微信公号“架构师之路”学习笔记(三)-MQ消息可达性_幂等性_延时性架构设计(应用场景、可靠投递、流量冲击)
- 账龄分析表excel模板_这种高端表格模板你会做吗?Excel制作带照片的员工信息查询表...
- Java白皮书的关键术语
- 网吧网吧无盘服务器配置,网吧无盘服务器配置杂谈
- Dubbo服务调用流程源码分析(服务调提供方)
- 中国水墨风的小学学校网站模板
- 服务端验证防水墙验证码向远程发送请求并验证的方法
- java delphi aes加密算法_谁有C#与delphi通用的AES加密算法
- Java JDK安装及环境变量配置(windows)
- Kaggle获奖者自述比赛求生指南:我们如何“穿越”亚马逊热带雨林
- 层序遍历 和 基于栈实现的先\中\后序遍历