乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 127|回复: 7

如何设置撤消操作?

[复制链接]

16

主题

83

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
145
发表于 2011-10-19 22:30:20 | 显示全部楼层 |阅读模式
我创建了一个Jig,在AcEdJig::update()中调用了一个LISP函数。
C++代码:
  1. Adesk::Boolean Highflybird_Jig::update ()
  2. {
  3.         .........
  4.         int ret(0);
  5.         resbuf *rb_in = NULL;
  6.         resbuf *rb_out = NULL;
  7.         rb_in = acutBuildList(RTSTR,_T("test"), RT3DPOINT,m_CurPt,RTNONE);
  8.         if (rb_in == NULL)
  9.         {
  10.                 return RTERROR;
  11.         }
  12.         ret = acedInvoke(rb_in,&rb_out);
  13.         if (ret == RTERROR || rb_out == NULL)
  14.         {
  15.                 acutRelRb(rb_in);
  16.                 acutRelRb(rb_out);
  17.                 return RTERROR;
  18.         }
  19.         ........
  20. }

LISP代码
  1. (vl-acad-defun 'test)
  2. (defun test (dynpt)
  3.   (foreach obj lst
  4.     (vla-move obj (vlax-3d-point p0) (vlax-3d-point dynpt))
  5.     (ENTUPD (vlax-vla-object->ename obj))
  6.   )
  7.   (setq p0 dynpt)
  8. )

它工作正常,但我想撤消我的arx操作,我失败了。
那么如何在arx中设置撤消操作呢?

本帖以下内容被隐藏保护;需要你回复后,才能看到!

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

使用道具 举报

16

主题

83

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
145
发表于 2011-10-21 09:29:14 | 显示全部楼层

  1. #include
  2. void UndoStart(void)
  3. {
  4.   IAcadApplication *pAppAcad = (IAcadApplication *)acedGetAcadWinApp()->GetIDispatch(TRUE);
  5.   if (pAppAcad) {
  6.     IAcadDocument *pAcadDoc = NULL;
  7.     if (pAppAcad->get_ActiveDocument(&pAcadDoc) == S_OK) {
  8.       pAcadDoc->StartUndoMark();
  9.       pAcadDoc->Release();
  10.     }
  11.     pAppAcad->Release();
  12.   }
  13. }
  14. void UndoEnd(void)
  15. {
  16.   IAcadApplication *pAppAcad = (IAcadApplication *)acedGetAcadWinApp()->GetIDispatch(TRUE);
  17.   if (pAppAcad) {
  18.     IAcadDocument *pAcadDoc = NULL;
  19.     if (pAppAcad->get_ActiveDocument(&pAcadDoc) == S_OK) {
  20.       pAcadDoc->EndUndoMark();
  21.       pAcadDoc->Release();
  22.     }
  23.     pAppAcad->Release();
  24.   }
  25. }
回复

使用道具 举报

16

主题

83

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
145
发表于 2011-10-22 03:24:52 | 显示全部楼层
亚历山大·里维利斯,非常感谢你。
我测试了您的方法,但还不起作用。我不知道为什么。
事实上,我很欣赏你的“dyndraw ”,从中学到了很多,所以我想做自己。
我使用了两种方法,一种是JIG,另一种是acedDragGen,两种方法都可以。
用JIG,我回不去了,看捕捉,实体回不到原点位置;但是有了acedDragGen,我可以撤销我的操作。
所以,在这里我贴出了我的源代码和LISP示例。希望你能帮助我。
附:感谢任何人的建议。
我在中编译了所有版本(2004-2012)..\发布。
如果您想测试它,请先根据您的CAD版本加载arx文件,然后您可以运行Lisp示例。
有六个命令:test、ttt、txx、tcc、tmm、trr、tins。有些不是翻译成英文的,抱歉。我稍后会翻译它们。
回复

使用道具 举报

16

主题

83

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
145
发表于 2011-10-23 19:06:19 | 显示全部楼层
您可以看看AcDbDatabase::undoRecording返回了什么
回复

使用道具 举报

16

主题

83

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
145
发表于 2011-10-23 21:29:57 | 显示全部楼层
我做了,它返回“真”。非常感谢。我想知道Alexander Rivilis的,我可以通过他的程序正确地撤销操作。
那么,如果只是设置“StartUndoMark”、“EndUndoMark”,应该把它们放在哪里呢?
回复

使用道具 举报

16

主题

83

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
145
发表于 2011-10-24 03:56:58 | 显示全部楼层
你可以尝试的另一件事,是使用一个事务,我想这会为你设置撤销标记
回复

使用道具 举报

16

主题

83

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
145
发表于 2011-10-24 06:46:22 | 显示全部楼层

我以前尝试过,但得到了相同的结果。
今天,我将acedInvoke放入“sampler()”,然后我可以撤销,但是实体不能更新。
回复

使用道具 举报

16

主题

83

帖子

5

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
145
发表于 2011-10-30 21:47:43 | 显示全部楼层
我又试着翻译了一遍
采样器()
中调用了LISP函数,我更新了中的实体
有时,它会带来一些问题,如
0XC0000005“
错误,我不知道这是否是转换问题?有时候我不能回去<所以,如果有人能看到我的代码并给我建议,我真的很感激<再次感谢丹尼尔和亚历山大·里维利斯。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-2-5 14:54 , Processed in 0.267764 second(s), 68 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表