找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 577|回复: 10

[求助] 各位大神,我有一个二维实体,但不想让镜像命令对它起作用,怎么办?

[复制链接]

已领礼包: 4个

财富等级: 恭喜发财

发表于 2016-9-18 15:18:28 | 显示全部楼层 |阅读模式

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

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

×
如题“各位大神,我有一个二维实体,但不想让镜像命令对它起作用,怎么办?”
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 13个

财富等级: 恭喜发财

发表于 2016-9-18 15:24:32 | 显示全部楼层
用命令监视器,监视命令mirror, 对你对象进行操作,就中断它
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 4个

财富等级: 恭喜发财

 楼主| 发表于 2016-9-18 16:38:09 | 显示全部楼层

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

使用道具 举报

已领礼包: 13个

财富等级: 恭喜发财

发表于 2016-9-18 17:42:53 | 显示全部楼层
本帖最后由 LoveArx 于 2016-9-18 17:44 编辑

手里有篇文献,对特定实体禁用COPY,你可以参照下来实现对某些对象禁用你的MIRROR命令。


通过创建一个 AcEditorReactor 反应器并重载 beginDeepClone and beginDeepCloneXlation 通知来实现禁用AUTOCAD的COPY命令。
在beginDeepClone 函数的内部,把禁用COPY的实体的ID添加到ID map中,AUTOCAD处理这些对象的时候好像他们已经完成了拷贝,然后你在beginDeepCloneXlation期间,移除这些ID。


下面的代码,你可以先用DisableCopy 命令添加要保护的对象禁止拷贝他们,通过命令EnableCopy ,恢复正常。需要注意的是由于ID是在命令反应器生效时间才保护这些对象。


第一步 : 在你的反应器头文件里面加入:

  1. private:
  2.   AcDbObjectIdArray m_ids;

  3. public:
  4.     // overrides
  5.     virtual void beginDeepCloneXlation(AcDbIdMapping& x0,
  6.                                        Acad::ErrorStatus* x1);
  7.     virtual void beginDeepClone(AcDbDatabase* pTo,
  8.                                 AcDbIdMapping& x0);

  9.     // other custom methods
  10.     Adesk::Boolean addObject(const AcDbObjectId& id);
  11.     Adesk::Boolean removeObject(const AcDbObjectId& id);


第二步: 在你的反应器里面重载:
  1. //
  2. // Override method implementation
  3. //
  4. void ADSEditorRctr::beginDeepClone(AcDbDatabase* pTo,
  5.                                     AcDbIdMapping& x0)
  6. {
  7.     // Only for Copy Context
  8.     if(AcDb::kDcCopy != x0.deepCloneContext())
  9.         return;

  10.     // Mock up a fake clone: place our ids in the map
  11.     for(int i=0; i<m_ids.length(); i++)
  12.     {
  13.         x0.assign(  
  14.                     AcDbIdPair(  
  15.                                 m_ids,
  16.                                 m_ids,
  17.                                 Adesk::kTrue,
  18.                                 Adesk::kTrue
  19.                               )
  20.                  );
  21.     }
  22. }
  23. //
  24. // Override method implementation
  25. //
  26. void ADSEditorRctr::beginDeepCloneXlation(AcDbIdMapping& x0,
  27.                                            Acad::ErrorStatus* x1)
  28. {
  29.     // Only for Copy Context
  30.     if(AcDb::kDcCopy != x0.deepCloneContext())
  31.         return;

  32.     // Remove them here
  33.     for(int i=0; i<m_ids.length(); i++)
  34.     {
  35.         x0.del(m_ids);
  36.     }
  37. }
  38. //
  39. // Custom method implementation
  40. //
  41. Adesk::Boolean ADSEditorRctr::addObject(const AcDbObjectId& id)
  42. {
  43.     int at;

  44.     if(!m_ids.find(id,at))
  45.     {
  46.         m_ids.append(id);
  47.         return Adesk::kTrue;
  48.     }

  49.     return Adesk::kFalse;
  50. }
  51. //
  52. // Custom method implementation
  53. //
  54. Adesk::Boolean ADSEditorRctr::removeObject(const AcDbObjectId& id)
  55. {
  56.     int at;

  57.     if(m_ids.find(id,at))
  58.     {
  59.         m_ids.removeAt(at);
  60.         return Adesk::kTrue;
  61.     }

  62.     return Adesk::kFalse;
  63. }


第三步:增加命令 enable/disable 对某些实体的COPY操作。


  1. // DISABLECOPY command
  2. static void DISABLECOPY(void)
  3. {
  4.     ads_name ss;

  5.     if(acedSSGet(NULL,NULL,NULL,NULL,ss)==RTNORM)
  6.     {
  7.         ads_name ent;
  8.         AcDbObjectId id;
  9.         long length;
  10.         if(acedSSLength(ss, &length)==RTNORM)
  11.         {
  12.             for(int i=0; i<length; i++)
  13.             {
  14.                 if(ads_ssname(ss, i, ent)==RTNORM)
  15.                 {
  16.                     if(acdbGetObjectId(id,ent) == Acad::eOk)
  17.                         DocVars.docData().gEditorRctr.addObject(id);
  18.                 }
  19.             }
  20.         }
  21.     }
  22.     acedSSFree(ss);
  23. }

  24. // ENABLECOPY command
  25. static void ENABLECOPY(void)
  26. {
  27.     ads_name ss;

  28.     if(acedSSGet(NULL,NULL,NULL,NULL,ss)==RTNORM)
  29.     {
  30.         ads_name ent;
  31.         AcDbObjectId id;
  32.         long length;
  33.         if(acedSSLength(ss, &length)==RTNORM)
  34.         {
  35.             for(int i=0; i<length; i++)
  36.             {
  37.                 if(ads_ssname(ss, i, ent)==RTNORM)
  38.                 {
  39.                     if(acdbGetObjectId(id,ent) == Acad::eOk)
  40.                         DocVars.docData().gEditorRctr.removeObject(id);
  41.                 }
  42.             }
  43.         }
  44.     }
  45.     acedSSFree(ss);
  46. }


第四步:在CDocData类中增加编辑器反应器的实例

游客,如果您要查看本帖隐藏内容请回复


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

使用道具 举报

已领礼包: 112个

财富等级: 日进斗金

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

使用道具 举报

已领礼包: 4个

财富等级: 恭喜发财

 楼主| 发表于 2016-9-19 09:26:35 | 显示全部楼层

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

使用道具 举报

已领礼包: 13个

财富等级: 恭喜发财

发表于 2016-9-19 09:29:46 | 显示全部楼层

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

使用道具 举报

已领礼包: 4个

财富等级: 恭喜发财

 楼主| 发表于 2016-9-19 10:03:24 | 显示全部楼层

嗯,要学会共享,很佩服你这种精神
  1. //MyEditorReactor继承了AcEditorReactor的反应器
  2. class MyEditorReactor : public AcEditorReactor
  3. {
  4.   virtual void commandWillStart(const TCHAR* cmdStr);
  5.   virtual void commandCancelled(const TCHAR* cmdStr);
  6.   virtual void commandFailed   (const TCHAR* cmdStr);
  7.   virtual void commandEnded    (const TCHAR* cmdStr);
  8.   virtual void beginDeepCloneXlation(AcDbIdMapping& mapId, Acad::ErrorStatus* pEr);
  9.   virtual void beginDeepClone(AcDbDatabase* pTo, AcDbIdMapping& mapId);
  10.   void GetEntsDisAllowMirror(AcDbObjectIdArray  ids);

  11. private:
  12.   AcDbObjectIdArray m_ids;    //要屏蔽镜像操作的构件
  13. };

  1. //在每次MIRROR命令开始的时候,添加要屏蔽的构件
  2. void MyEditorReactor::commandWillStart(const TCHAR* cmdStr)
  3. {
  4.   CString strCmd = cmdStr;
  5.   strCmd.Trim(_T("\n "));
  6.   if(strCmd.CompareNoCase(_T("MIRROR"))==0)
  7.   {
  8.     m_ids.removeAll();
  9.     GetEntsDisAllowMirror(m_ids);  //在这里添加需要屏蔽的构件id
  10.   }
  11. }
  12. void MyEditorReactor::beginDeepCloneXlation( AcDbIdMapping& mapId, Acad::ErrorStatus* pEr )
  13. {
  14.   if(AcDb::kDcCopy != mapId.deepCloneContext())
  15.     return;

  16.   for(int i=0; i<m_ids.length(); i++)
  17.   {
  18.     mapId.del(m_ids[i]);
  19.   }
  20. }
  21. void MyEditorReactor::beginDeepClone( AcDbDatabase* pTo, AcDbIdMapping& mapId )
  22. {
  23.   if(AcDb::kDcCopy != mapId.deepCloneContext())
  24.     return;

  25.   for(int i=0; i<m_ids.length(); i++)
  26.   {
  27.     mapId.assign(AcDbIdPair(m_ids[i], m_ids[i], Adesk::kTrue, Adesk::kTrue));
  28.   }
  29. }
  30. //在操作结束或取消的时候清空m_ids
  31. void MyEditorReactor::commandEnded    (const TCHAR* cmdStr)
  32. {
  33.   m_ids.removeAll();
  34. }
  35. void MyEditorReactor::commandCancelled( const TCHAR* cmdStr )
  36. {
  37.   m_ids.removeAll();
  38. }

  39. void MyEditorReactor::commandFailed( const TCHAR* cmdStr )
  40. {
  41.   m_ids.removeAll();
  42. }
复制代码



评分

参与人数 1D豆 +5 收起 理由
newer + 5 有始有终奖!

查看全部评分

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

使用道具 举报

已领礼包: 19个

财富等级: 恭喜发财

发表于 2016-9-19 10:24:59 | 显示全部楼层

高端大气上档次,大师,执行MIRROR命令的时候会是什么样的? 命令也让执行,最后没效果吗? 好奇。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 4个

财富等级: 恭喜发财

 楼主| 发表于 2016-9-20 11:19:24 | 显示全部楼层

是初学。MIRROR命令执行中的时候,选中的所有实体都会有一个临时镜像,但是在右击确定的时候屏蔽的实体都没有生成,只生成了没有屏蔽实体的镜像。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2016-9-20 11:38:26 | 显示全部楼层

看代码,是只能屏蔽MIRROR命令吧? 如果别人写代码,用镜像矩阵变换,还能屏蔽吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-24 18:28 , Processed in 0.201927 second(s), 55 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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