- UID
- 124967
- 积分
- 180
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2004-4-14
- 最后登录
- 1970-1-1
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
让我们见识一下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显示了你设好的自定义实体的信息啊!^_^ 爽吧?
唉!写了这麽久,有没有奖励啊! |
|