找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1523|回复: 5

[弹指神通]:在AutoCAD绘图窗口动态显示实体信息的ToolTip

[复制链接]
发表于 2004-4-14 13:44:44 | 显示全部楼层 |阅读模式

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

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

×
让我们见识一下ObjectARX里面的AcEdInputPointFilter类的威力。

想在AutoCAD绘图窗口动态显示实体信息的ToolTip吗?就象你把鼠标放在工具条按钮上,
你就可以看到一个按钮功能的ToolTip一样。

下面是具体做法:
1、首先从AcEdInputPointFilter派生一个类 class  CInputFilter : public AcEdInputPointFilter,记得
#include "acedinpt.h" 哦!
主要是重载AcEdInputPointFilter类的processInputPoint()函数。它是一个回调函数。它的原型如下:
virtual Acad::ErrorStatus
processInputPoint(
bool& changedPoint,
AcGePoint3d& newPoint,
bool& displayOsnapGlyph,
bool& changedTooltipStr,
char*& newTooltipString,
bool& retry,
AcGiViewportDraw* drawContext,
AcApDocument* document,
bool pointComputed,
int history,
const AcGePoint3d& lastPoint,
const AcGePoint3d& rawPoint,
const AcGePoint3d& grippedPoint,
const AcGePoint3d& cartesianSnappedPoint,
const AcGePoint3d& osnappedPoint,
AcDb::OsnapMask osnapMask,
const AcArray<AcDbCustomOsnapMode*>& customOsnapModes,
AcDb::OsnapMask osnapOverrides,
const AcArray<AcDbCustomOsnapMode*>& customOsnapOverrides,
const AcArray<AcDbObjectId>& pickedEntities,
const AcArray< AcDbObjectIdArray, AcArrayObjectCopyReallocator< AcDbObjectIdArray > >& nestedPickedEntities,
const AcArray<int>& gsSelectionMark,
const AcArray<AcDbObjectId>& keyPointEntities,
const AcArray< AcDbObjectIdArray, AcArrayObjectCopyReallocator< AcDbObjectIdArray > >& nestedKeyPointEntities,
const AcArray<int>& keyPointGsSelectionMark,
const AcArray<AcGeCurve3d*>& alignmentPaths,
const AcGePoint3d& computedPoint,
const char* tooltipString) ;
是不是很恐怖啊?参数这麽长。。。。。。。。
不过不用着急,我们只要用到其中的几个参数就行了。

为了方便显示ToolTip,我在这个类里加了个BOOL getToolTipText(AcDbObject *pObj, char *tipStr);的函数。

2、为了方便显示某个实体的信息,我特意写了个自定义实体AskdMyClass,在这个自定义实体里加上一个公共函数getTipsText(char* pTip),用来获取这个自定义实体的基本信息,当然可以包括这个实体的任何信息啦,像类别、长、宽、高、位置等等,随你便!

3、下面就要进行激动人心的processInputPoint()和getToolTipText(AcDbObject *pObj, char *tipStr)的定义了。参数太长,我就不一一写了。反正跟声明是一样拉。
代码如下:
BOOL CInputFilter::getToolTipText(AcDbObject *pObj, char *tipStr)
{
        if(pObj->isKindOf(AsdkMyClass::desc())) {
                ((AsdkMyClass *)pObj)->getTipsText(tipStr);
                             return TRUE;
        }
                     else {
                             return FALSE;
                     }
        return TRUE;
}

Acad::ErrorStatus
CInputFilter::processInputPoint()
{
      if ( !pointComputed ) // 点过滤器未能找到点
        return Acad::eOk;
    if ( 0 != pickedEntities.length() ) {
         AcDbObject *pObj;
         if ( Acad::eOk == acdbOpenObject( pObj, pickedEntities[0], AcDb::kForRead )) {
        if(getToolTipText(pObj, m_tipStr)) {
                 changedTooltipStr = true;               
                 newTooltipString = m_tipStr;
        }
        pObj->close();
        pObj = 0L;
        }
       
    }

    return Acad::eOk;
}

好啦,是不是实现起来很简单,比看参数舒服多了吧!^_^.....................
这里我们主要用到了pickedEntities,changedTooltipStr,newTooltipString这几个参数,
pickedEntities是一个ObjectId数组,我们只取第一个实体就行了。
如果要显示ToolTip,changedTooltipStr一定要返回true。
newTooltipString不用说也知道是新的ToolTip字符串啦。

3、工具都准备好了,现在是“万事具备,只欠东风”啊!那么怎样才能让CInputFilter这个类
工作起来呢。这也简单。^_^.夸张了一点。呵呵!
在你的ARX入口函数所在文件里声明一个全局变量:CInputFilter gInputFilter;
再定义两个全局函数:
void addInputFilter();     // 注册捕获点过滤器
void removeInputFilter();  // 删除捕获点过滤器

void addInputFilter()
{
        acDocManager->curDocument()->inputPointManager()->registerPointFilter( &gInputFilter );
}

void removeInputFilter()
{
    if ( NULL != acDocManager->curDocument()->inputPointManager()->currentPointFilter() )
    {
        acDocManager->curDocument()->inputPointManager()->revokePointFilter();
    }
}

然后在InitApplication()和UnloadApplication()里分别添加刚才那两个全局函数。
什么?没有这两个函数?唉呀!我的天啦!
InitApplication()
{
    addInputFilter();  // 注册捕获点过滤器
}


UnloadApplication()
{
   removeInputFilter(); // 删除捕获点过滤器
}

啊!这样就大功告成了。你也做一个自定义实体试试,看是不是把鼠标放在你的自定义实体
上的任何一条线上都会弹出一个ToolTip显示了你设好的自定义实体的信息啊!^_^  爽吧?

唉!写了这麽久,有没有奖励啊!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2004-5-19 19:45:34 | 显示全部楼层
请问怎样才能做到ToolTip显示显示信息的持续性,弹出ToolTip显示需要时间,怎样在鼠标移动时ToolTip显示不消失,而其显示的信息不停地更新呢?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-6-12 16:20:33 | 显示全部楼层
这个问题,我也想知道啊
能不能定制Tips的位置
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2005-9-15 16:24:49 | 显示全部楼层
小叶,我终于抓到你了,最近有什么新东东,不妨拿出来,哈哈!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-9-15 16:34:07 | 显示全部楼层
楼主说了这么多,做个源文件放上来给大家吧。
俺一直在找如何做到这样的程序。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-22 22:39 , Processed in 0.391032 second(s), 42 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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