天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 55|回复: 0

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

[复制链接]

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
发表于 2024-6-22 09:46:18 | 显示全部楼层 |阅读模式
说明

        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) ;
        }

 

 

 

 

ObjectARX2015 + vs2012 JIG-双击实体的响应
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|中国膜结构网_中国空间膜结构协会

GMT+8, 2024-11-1 11:37 , Processed in 0.139720 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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