找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1696|回复: 3

[分享] 双击实体的响应 (AcDbDoubleClickEdit)

[复制链接]

已领礼包: 40个

财富等级: 招财进宝

发表于 2019-1-19 08:00:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
本帖最后由 LoveArx 于 2019-1-19 13:44 编辑

ObjectARX-双击实体的响应 (AcDbDoubleClickEdit)-1.jpg

ObjectARX-双击实体的响应 (AcDbDoubleClickEdit)-2.jpg

一、基本双击响应实现

(1)在vs2015中使用ObjectARX创建一个新项目DoubleClick,并选择 MFC支持。

ObjectARX-双击实体的响应 (AcDbDoubleClickEdit)-3.jpg

向工程中添加一个普通类CDoubleClickCircle,它的基类设置为AcDbDoubleClickEdit:


ObjectARX-双击实体的响应 (AcDbDoubleClickEdit)-4.jpg


类的头文件为:

  1. class CDoubleClickCircle :
  2.         public AcDbDoubleClickEdit
  3. {
  4. public:
  5.         CDoubleClickCircle();
  6.         virtual ~CDoubleClickCircle();

  7.         //开始编辑时调用的函数
  8.         void startEdit(AcDbEntity *pEnt, AcGePoint3d pt);

  9.         //完成编辑之后调用的函数
  10.         void finishEdit(void);
  11. };

(2)startEdit函数是在用户双击指定类型实体之后触发,

实现代码:

  1. void CDoubleClickCircle::startEdit(AcDbEntity *pEnt, AcGePoint3d pt)
  2. {
  3.         //获得当前文档
  4.         AcApDocument *pDoc = acDocManager->curDocument();

  5.         //将AcDbEntity指针转换为AcDbLine指针
  6.         if (pEnt->isKindOf(AcDbCircle::desc()))
  7.         {
  8.                 AcDbCircle *pCircle = AcDbCircle::cast(pEnt);

  9.                 //锁定文档
  10.                 acDocManager->lockDocument(pDoc);

  11.                 //将实体的打开状态升级为可写状态
  12.                 pCircle->upgradeOpen();

  13.                 //指定新的颜色
  14.                 pCircle->setColorIndex(1);
  15.                 pCircle->close();

  16.                 //解锁文档
  17.                 acDocManager->unlockDocument(pDoc);

  18.                 //清理PickFirst选择集中的内容
  19.                 acedSSSetFirst(NULL, NULL);

  20.                 //更新图形的显示
  21.                 pCircle->draw(); //在关闭之后还能使用
  22.                 actrTransactionManager->flushGraphics();
  23.                 acedUpdateDisplay();

  24.         }
  25.         else
  26.         {
  27.                 acutPrintf(TEXT("\n无效的AcDbCircle对象..."));
  28.                 pEnt->close();
  29.                 return;
  30.         }
  31. }

(3)本例子并不在finishEdit函数中添加任何处理,但是这个函数的实现部分是一定要有,否则就会产生连接错误。

实现代码:

  1. void CDoubleClickCircle::finishEdit(void)
  2. {
  3.         //此处不处理
  4. }

(4)在acrxEntryPoint.cpp 文件中的  On_kInitAppMsg (void *pkt) 函数中,添加双击处理基类的初始化,并且为圆的实体类型添加AcDbCircle添加双击处理的协议。

实现代码:

        
  1. virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) {
  2.                 // TODO: Load dependencies here

  3.                 // You *must* call On_kInitAppMsg here
  4.                 AcRx::AppRetCode retCode =AcRxArxApp::On_kInitAppMsg (pkt) ;
  5.                
  6.                 // TODO: Add your initialization code here

  7.                 //初始化AcDbDoubleClickEdit类
  8.                 AcDbDoubleClickEdit::rxInit();

  9.                 //为AcDbCircle类添加协议扩展
  10.                 CDoubleClickCircle *pCircleEdit = new CDoubleClickCircle;
  11.                 AcDbCircle::desc()->addX(AcDbDoubleClickEdit::desc(), pCircleEdit);

  12.                 return (retCode) ;
  13.         }
(5)在acrxEntryPoint.cpp 文件中的On_kUnloadAppMsg (void *pkt) 函数中,从AcDbCircle类中删除双击处理的协议,确保应用程序在卸载之后圆地双击处理仍然是AutoCAD提供的默认方式。

实现代码:

        
  1. virtual AcRx::AppRetCode On_kUnloadAppMsg (void *pkt) {
  2.                 // TODO: Add your code here

  3.                 // You *must* call On_kUnloadAppMsg here
  4.                 AcRx::AppRetCode retCode =AcRxArxApp::On_kUnloadAppMsg (pkt) ;

  5.                 // TODO: Unload dependencies here

  6.                 //删除AcDbCircle类的协议扩展
  7.                 AcDbCircle::desc()->delX(AcDbDoubleClickEdit::desc());

  8.                 return (retCode) ;
  9.         }
(6)此时,编译代码,会显示连接错误,在附加依赖项中添加  AcDblClkEditPE.lib

ObjectARX-双击实体的响应 (AcDbDoubleClickEdit)-5.jpg

在链接库AcDblClkEditPE.lib 的时候,还是出现了编译错误:

ObjectARX-双击实体的响应 (AcDbDoubleClickEdit)-6.jpg

是因为 64位的机子你引用了32位的模块。

这时候您先不要着急,继续往下看。



二、通过对话框接收用户输入的颜色值

(1)添加一个对话框资源:

ObjectARX-双击实体的响应 (AcDbDoubleClickEdit)-7.jpg

设置ID和caption:

ObjectARX-双击实体的响应 (AcDbDoubleClickEdit)-8.jpg
设置字体:


ObjectARX-双击实体的响应 (AcDbDoubleClickEdit)-9.jpg
(2)在对话框资源中添加一个标签控件:

ObjectARX-双击实体的响应 (AcDbDoubleClickEdit)-10.jpg

在对话框资源中添加一个文本框控件:

ObjectARX-双击实体的响应 (AcDbDoubleClickEdit)-11.jpg

(3)保存工程。使用ObjectARX MFC工具为当前的对话框添加关联的类,类名为CGetColorDlg,基类设置为CAcUiDialog,

ObjectARX-双击实体的响应 (AcDbDoubleClickEdit)-12.jpg

ObjectARX-双击实体的响应 (AcDbDoubleClickEdit)-13.jpg

ObjectARX-双击实体的响应 (AcDbDoubleClickEdit)-14.jpg
(4)添加CGetColorDlg的两个消息映射函数。

ObjectARX-双击实体的响应 (AcDbDoubleClickEdit)-15.jpg


添加对话框的初始化消息(WM_INITDIALOG):

同样的方法,添"确定"消息(OnOK):

(5)添加文本对话框控件IDC_COLOR_INDEX控件的映射成员变量m_colorIndex,并将它的有效范围设置为0~256

右击示例编辑框->添加成员变量:

ObjectARX-双击实体的响应 (AcDbDoubleClickEdit)-16.jpg

(6)在OnInitDialog消息中,调用UpdateDate函数来将成员变量的值更新到关联的界面控件中去

实现代码:

  1. BOOL CGetColorDlg::OnInitDialog()
  2. {
  3.         CAcUiDialog::OnInitDialog();

  4.         // TODO:  在此添加额外的初始化
  5.         //根据成员变量更新资源控件
  6.         UpdateData(FALSE);

  7.         return TRUE;  // return TRUE unless you set the focus to a control
  8.                                   // 异常: OCX 属性页应返回 FALSE
  9. }

(7)OnOk函数的实现

  1. void CGetColorDlg::OnOK()
  2. {
  3.         // TODO: 在此添加专用代码和/或调用基类
  4.         //根据资源控件更新成员变量
  5.         if (!UpdateData(TRUE))
  6.         {
  7.                 return;
  8.         }

  9.         CAcUiDialog::OnOK();
  10. }

(8)在对话框类CGetColorDlg中添加两个成员函数SetParams 和GetParams

声明:

public:
        void SetParams(int colorIndex);
        void GetParams(int &colorIndex);
实现:

  1. //设置对话框中的初始颜色值:
  2. void CGetColorDlg::SetParams(int colorIndex)
  3. {
  4.         m_colorIndex = colorIndex;
  5. }

  6. //获取对话框中用户输入的新颜色值
  7. void CGetColorDlg::GetParams(int &colorIndex)
  8. {
  9.         colorIndex = m_colorIndex;
  10. }

(9)在  startEdit 函数中添加显示对话框获取用户输入的相关代码

修改DoubleClickCircle.cpp 的 startEdit 函数:

  1. //startEdit函数是在用户双击指定类型实体之后触发
  2. void CDoubleClickCircle::startEdit(AcDbEntity *pEnt, AcGePoint3d pt)
  3. {
  4.         //获得当前文档
  5.         AcApDocument *pDoc = acDocManager->curDocument();

  6.         //将AcDbEntity指针转换为AcDbLine指针
  7.         if (pEnt->isKindOf(AcDbCircle::desc()))
  8.         {
  9.                 AcDbCircle *pCircle = AcDbCircle::cast(pEnt);

  10.                 //锁定文档
  11.                 acDocManager->lockDocument(pDoc);

  12.                 //将实体的打开状态升级为可写状态
  13.                 pCircle->upgradeOpen();

  14.                 //提示用户指定新的颜色
  15.                 int oldColorIndex = pCircle->colorIndex();
  16.                 CAcModuleResourceOverride myResource; //防止资源冲突
  17.                 CGetColorDlg dlg;
  18.                 dlg.GetParams(oldColorIndex);
  19.                 if (dlg.DoModal() == IDOK)
  20.                 {
  21.                         int newColorIndex = 0;
  22.                         dlg.GetParams(newColorIndex);
  23.                         pCircle->setColorIndex(newColorIndex);
  24.                 }
  25.                 //pCircle->setColorIndex(1);
  26.                 pCircle->close();

  27.                 //解锁文档
  28.                 acDocManager->unlockDocument(pDoc);

  29.                 //清理PickFirst选择集中的内容
  30.                 acedSSSetFirst(NULL, NULL);

  31.                 //更新图形的显示
  32.                 pCircle->draw(); //在关闭之后还能使用
  33.                 actrTransactionManager->flushGraphics();
  34.                 acedUpdateDisplay();

  35.         }
  36.         else
  37.         {
  38.                 acutPrintf(TEXT("\n无效的AcDbCircle对象..."));
  39.                 pEnt->close();
  40.                 return;
  41.         }
  42. }

并添加头文件:

#include "GetColorDlg.h"


三、解决AcDblClkEditPE.lib 连接失败的问题

从AutoCAD2010开始,双击响应不是在 AcDbClkEditPE.arx 中实现,只需要做以下修改:

1)将 On_kInitAppMsg 函数中的下面代码注释掉:

AcDbDoubleClickEdit::rxInit();
2)只在acrxEntryPoint.cpp 文件中添加下面代码(在头文件的后面添加):

ACRX_DEFINE_MEMBERS(AcDbDoubleClickEdit);
3)工程设置中不在需要依赖AcDbClkEditPE.lib.

此时,编译程序,出现下面错误,

ObjectARX-双击实体的响应 (AcDbDoubleClickEdit)-17.jpg

需要包含下下面的头文件即可。

#include "resource.h"
此时,打开CAD,加载程序:

ObjectARX-双击实体的响应 (AcDbDoubleClickEdit)-18.jpg

可见,程序可以加载了。

此时我们双击圆,发现只会弹出属性对话框:

ObjectARX-双击实体的响应 (AcDbDoubleClickEdit)-19.jpg

不要着急,还有最后一步...

四、消除CUI中的双击处理带来的影响

在CAD的命令栏执行命令:CUI

找到 “圆” ,右键->删除:



ObjectARX-双击实体的响应 (AcDbDoubleClickEdit)-20.jpg

效果:

编译运行程序,启动AutoCAD2018,加载应用程序,创建一个圆,双击,

ObjectARX-双击实体的响应 (AcDbDoubleClickEdit)-21.jpg

圆的颜色发生改变 :

ObjectARX-双击实体的响应 (AcDbDoubleClickEdit)-22.jpg

动画效果:

ObjectARX-双击实体的响应 (AcDbDoubleClickEdit)-23.jpg
完整的实现代码:

https://pan.baidu.com/s/1sVEVzkgVixi7My5ayQhTLg

<本文完>
---------------------
作者:李燕良
来源:CSDN
原文:https://blog.csdn.net/qq_40416052/article/details/82730799
版权声明:本文为博主原创文章,转载请附上博文链接!



论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2020-4-28 13:30:58 | 显示全部楼层
学习学习!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 10个

财富等级: 恭喜发财

发表于 2020-9-23 00:29:49 | 显示全部楼层
thanks you arcticle wonderfull
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2021-4-22 14:44:43 | 显示全部楼层
请问楼主,为什么,我调用了刷新函数,但是实体的subworlddraw并没有被调用呢。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-3-29 17:39 , Processed in 0.407451 second(s), 36 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表