找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 726|回复: 10

[求助]:各位大侠请指点:关于反应器

[复制链接]
发表于 2006-3-17 17:12:29 | 显示全部楼层 |阅读模式

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

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

×
我想做一个ARX,实现这样的功能:在AutoCad中加载这个ARX后,每当出现捕获点的事件时.不管AutoCad中的Snap处理开还是关的状态,就强制的使其只能选择Snap坐标上的点,若选择了非Snap坐标上的点,则选择无效.请高手指点该如何实现?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2006-3-17 20:23:29 | 显示全部楼层
要用到输入点过滤机制
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-3-18 19:28:10 | 显示全部楼层
有很多方法啊,不过都不太安全,
最好的办法,就是在你需要进行网格捕获操作时候,强行设置网格和捕捉方式,操作完了立即恢复,也不需要用什么反映器。
请问楼上的,点过滤机制是啥玩艺?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-3-18 22:40:58 | 显示全部楼层
它相当于一个独立的进程,在后台对整个作图过程进行全天后的监视,同时进行分析,能分析出当前的捕捉类型,捕捉点的坐标,与捕捉相关的实体等等,但我发现有时它分析出的结果不是正确的。也许是还没完全搞清楚。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-3-23 00:01:02 | 显示全部楼层
楼上的能否说明一下你的具体操作方式,
你这样做会使系统很忙碌,当一个系统很庞大的时候,会出现很多异常的!
特别是在多文档下,会让你痛苦不堪的!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-3-23 09:29:05 | 显示全部楼层
我确实也有这样疑虑,但是AutoCAD为我们解决了这个问题,现在能正常使用,但我还为测试过当图形很大时会出现什么样的情况.你可以去研究一下这个函数:
Acad::ErrorStatus WJInPutPtFiltProg::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,//当前的OSNAP点
  AcDb::OsnapMask osnapMask,
  const AcArray<AcDbCustomOsnapMode*>& customOsnapModes,//当前生效的OSNAP模式
  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)
{
。。。。。。
}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-3-28 23:14:45 | 显示全部楼层
这是AcEdInputPointFilter,用它确实可以实现,
还可以实现动态提示,还能做动画,不过当一张图纸特别大的时候,
或者你的处理量过大的时候,系统运行很慢!
两年前英国的一个专门沿坏蛋的好莱坞明星曾经给我讲给过如何实现动画,
用的是AcEdInputPointMonitor
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-4-5 14:17:10 | 显示全部楼层
小弟谢谢RedCAD和biostrong给出的宝贵意见!!
请问 AcEdInputPointMonitor怎么用啊?我比较菜
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-4-5 17:10:16 | 显示全部楼层
AcEdInputPointMonitor是一个监视起
AcEdInputPointFilter是点过滤起
前者我以前测试过,没有很好研究过
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-4-7 17:20:04 | 显示全部楼层
AcEdInputPointMonitor跟AcEdInputPointFilter配合起来使用就实现了
bool bSnap = false;
Acad::ErrorStatus
AsdkInputPointMonitor::monitorInputPoint(

          bool&                             appendToTooltipStr,
          char*&                            additionalTooltipString,

          AcGiViewportDraw*                   pDrawContext,

          AcApDocument*                       document,
          bool                                pointComputed,
          int                                 history,
          const AcGePoint3d&                  lastPoint,
          const AcGePoint3d&                  rawPoint,
          const AcGePoint3d&                  grippedPoint,
          const AcGePoint3d&                  cartesianSnappedPoint,
          const AcGePoint3d&                  osnappedPoint,
          AcDb::OsnapMask                     osnapMasks,
          const AcArray<AcDbCustomOsnapMode*>& customOsnapModes,
          AcDb::OsnapMask                     osnapOverrides,
          const AcArray<AcDbCustomOsnapMode*>& customOsnapOverrides,
          const AcArray<AcDbObjectId>&        apertureEntities,
          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)
{
    if ( history & Acad::eCartSnapped )
        {
                bSnap = true;
        }
        else
        {
                bSnap = false;
        }
}

Acad::ErrorStatus
AsdkInputPointFilter::processInputPoint(
          bool&                            changedPoint,
          AcGePoint3d&                     newPoint,
          bool&                            displayOsnapGlyph,

          bool&                            changedTooltipStr,
          char*&                           newTooltipString,

          bool&                            retry,
          AcGiViewportDraw*                pDrawContext,

          AcApDocument*                    document,

          bool                             pointComputed,

          int                              history,

          const AcGePoint3d&               lastPoint,

          const AcGePoint3d&               rawPoint,

          const AcGePoint3d&               grippedPoint,

          const AcGePoint3d&               cartesianSnappedPoint,

          const AcGePoint3d&               osnappedPoint,
          AcDb::OsnapMask                  osnapMasks,
          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, // of 0th element in
                                                            // pickedEntities
          // AutoSnap Info:
          const AcArray<AcDbObjectId>&     keyPointEntities,
          const AcArray< AcDbObjectIdArray, AcArrayObjectCopyReallocator< AcDbObjectIdArray > >&
                                           nestedKeyPointEntities,
          const AcArray<int>&              keyPointGsSelectionMark,
          const AcArray<AcGeCurve3d*>&     alignmentPaths,

          const AcGePoint3d&               computedPoint,

          const char*                      tooltipString )
{
        if (!pointComputed)
                return Acad::eOk;

        if (!bSnap)
        {
                    retry = true;
        }

    return Acad::eOk;
}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-4-8 23:50:29 | 显示全部楼层
class lwMesInputPoint : public AcEdInputPointMonitor
{
public:
        Acad::ErrorStatus monitorInputPoint(bool& appendToTooltipStr,
                                          char*& additionalTooltipString,
                                          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>& apertureEntities,
                                          const AcArray< AcDbObjectIdArray,
                                          AcArrayObjectCopyReallocator< AcDbObjectIdArray > >& nestedApertureEntities,
                                          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)
        {
                if(history&Acad::eNotDigitizer)
                {
                        for(int i=0;i<10;i++)
                        {
                                drawContext->geometry().circle(rawPoint,10-i*2,AcGeVector3d(0,0,1));
                                Sleep(50);
                        }
                        additionalTooltipString=strdup("鼠标左键按下");               
                }
       
                return Acad::eOk;
        }
}

template <class T> class AsdkDataManager : public AcApDocManagerReactor
{
public:
    AsdkDataManager()
    {
        acDocManager->addReactor(this);
                m_pInputPointer=new lwMesInputPoint;
                curDoc()->inputPointManager()->addPointMonitor(m_pInputPointer);
    }
    ~AsdkDataManager()
    {
        acDocManager->removeReactor(this);
               
                AcApDocumentIterator* pDocIter=acDocManager->newAcApDocumentIterator();
                for(;!pDocIter->done();pDocIter->step())
                {
                        AcApDocument* pDoc=pDocIter->document();
                        if(pDoc && pDoc->inputPointManager())
                                pDoc->inputPointManager()->removePointMonitor(m_pInputPointer);
                }
                delete pDocIter;               
                delete m_pInputPointer;
    }
    virtual void documentToBeDestroyed(AcApDocument *pDoc )
    {
        m_dataMap.erase(pDoc);
    }
    virtual void documentToBeActivated(AcApDocument *pDoc)
        {
                if(pDoc->inputPointManager())
                        pDoc->inputPointManager()->addPointMonitor(m_pInputPointer);
        }
    T& docData(AcApDocument* pDoc)
    {
        std::map<AcApDocument*, T>::iterator i;
        i = m_dataMap.find(pDoc);
        if (i==m_dataMap.end())
            return  m_dataMap[ pDoc ];
        else
            return (*i).second;
    }
    T& docData()
    {
        return docData(acDocManager->curDocument());
    }
   
private:
        lwMesInputPoint* m_pInputPointer;
    std::map<AcApDocument*, T> m_dataMap;
} ;
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-23 08:27 , Processed in 0.432933 second(s), 49 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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