(43)ObjectARX2015 + vs2012 JIG-双击实体的响应

1. 说明

        ObjectARX提供了可修改的实体双击响应方式,  允许第三方ObjectARX应用程序根据需要指定自己的双击处理.

        本篇程序处理了AutoCAD中双击实体事件处理的几个问题: 

(1) 双击圆实体,可提供用户输入颜色,并修改圆的颜色

(2) 删除GUI中的默认的双击处理, 确保本节的双击处理功能在高版本的上也能运行.

(3) 双击处理代码的修改

2. 思路

        要注册一种实体的双击处理,需要执行下边的步骤:

        (1) 创建一个继承自 AcDbDoubleClickEdit 的新类, 在虚函数 startEdit 和 finishEdit 中定义自己的双击事件处理.

        (2) 在应用程序的 InitApplication 函数中,初始化 AcDbDoubleClickEdit 类,为需要的实体类添加双击协议扩展.

        (3) 在应用程序的 UnloadApplication 函数中, 从双击处理的实体类中删除双击协议扩展.

3. 步骤

 1.  基本双击响应实现:

(1) 添加新类: CDoubleClickCircle , 它的基类设置为 AcDbDoubleClickEdit 

                重写 startEdit 和 finishEdit 两个虚函数. 实现圆实体的双击处理.

#include "acdblclkedit.h"
class CDoubleClickCircle : public AcDbDoubleClickEdit
{
public:
    CDoubleClickCircle(void);
    virtual ~CDoubleClickCircle(void);

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

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

        双击事件是在应用程序环境下触发的,因此要修改实体的某些特性,必须锁定当前文档.

        传递进来的 pEnt 所指向的实体, 打开状态是只读,  要通过 upgradeOpen 函数将其变为可写状态更符合一般人的操作习惯.

// 开始编辑时调用的函数
void CDoubleClickCircle::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(_T("\n无效的AcDbCircle对象..."));
        pEnt->close();
        return;
    }

}


// 完成编辑之后调用的函数
// 本例子并不在finishEdit函数中添加任何处理,但是这个函数的实现部分是一定要有,否则就会产生连接错误。
void CDoubleClickCircle::finishEdit(void)
{
    // 此处不添加任何函数
}

(3)  在应用程序的 On_kInitAppMsg 函数中,添加双击处理基类的初始化, 并且为圆的实体类型AcDbCircle 添加双击处理的协议, 其实现代码为: 

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

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

        //初始化AcDbDoubleClickEdit类
        AcDbDoubleClickEdit::rxInit();

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


		return (retCode) ;
	}
        //初始化AcDbDoubleClickEdit类
        AcDbDoubleClickEdit::rxInit();

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

(4) 在应用程序的 UploadApplication 函数中, 从 AcDbCircle 类中删除双击处理的协议, 确保应用程序卸载之后圆的双击处理仍然是 AutoCAD 提供的默认方式.

        //删除AcDbCircle类的协议扩展
        AcDbCircle::desc()->delX(AcDbDoubleClickEdit::desc());
virtual AcRx::AppRetCode On_kUnloadAppMsg (void *pkt) {
		// TODO: Add your code here

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

		// TODO: Unload dependencies here

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

		return (retCode) ;
	}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值