highflyingbird 发表于 2011-10-19 22:30:20

如何设置撤消操作?

我创建了一个Jig,在AcEdJig::update()中调用了一个LISP函数。
C++代码:
Adesk::Boolean Highflybird_Jig::update ()
{
      .........
      int ret(0);
      resbuf *rb_in = NULL;
      resbuf *rb_out = NULL;
      rb_in = acutBuildList(RTSTR,_T("test"), RT3DPOINT,m_CurPt,RTNONE);
      if (rb_in == NULL)
      {
                return RTERROR;
      }
      ret = acedInvoke(rb_in,&rb_out);
      if (ret == RTERROR || rb_out == NULL)
      {
                acutRelRb(rb_in);
                acutRelRb(rb_out);
                return RTERROR;
      }
      ........
}

LISP代码
(vl-acad-defun 'test)
(defun test (dynpt)
(foreach obj lst
    (vla-move obj (vlax-3d-point p0) (vlax-3d-point dynpt))
    (ENTUPD (vlax-vla-object->ename obj))
)
(setq p0 dynpt)
)

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

highflyingbird 发表于 2011-10-21 09:29:14


#include
void UndoStart(void)
{
IAcadApplication *pAppAcad = (IAcadApplication *)acedGetAcadWinApp()->GetIDispatch(TRUE);
if (pAppAcad) {
    IAcadDocument *pAcadDoc = NULL;
    if (pAppAcad->get_ActiveDocument(&pAcadDoc) == S_OK) {
      pAcadDoc->StartUndoMark();
      pAcadDoc->Release();
    }
    pAppAcad->Release();
}
}
void UndoEnd(void)
{
IAcadApplication *pAppAcad = (IAcadApplication *)acedGetAcadWinApp()->GetIDispatch(TRUE);
if (pAppAcad) {
    IAcadDocument *pAcadDoc = NULL;
    if (pAppAcad->get_ActiveDocument(&pAcadDoc) == S_OK) {
      pAcadDoc->EndUndoMark();
      pAcadDoc->Release();
    }
    pAppAcad->Release();
}
}

highflyingbird 发表于 2011-10-22 03:24:52

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

highflyingbird 发表于 2011-10-23 19:06:19

您可以看看AcDbDatabase::undoRecording返回了什么

highflyingbird 发表于 2011-10-23 21:29:57

我做了,它返回“真”。非常感谢。我想知道Alexander Rivilis的,我可以通过他的程序正确地撤销操作。
那么,如果只是设置“StartUndoMark”、“EndUndoMark”,应该把它们放在哪里呢?

highflyingbird 发表于 2011-10-24 03:56:58

你可以尝试的另一件事,是使用一个事务,我想这会为你设置撤销标记

highflyingbird 发表于 2011-10-24 06:46:22


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

highflyingbird 发表于 2011-10-30 21:47:43

我又试着翻译了一遍
采样器()
中调用了LISP函数,我更新了中的实体
有时,它会带来一些问题,如
0XC0000005“
错误,我不知道这是否是转换问题?有时候我不能回去<所以,如果有人能看到我的代码并给我建议,我真的很感激<再次感谢丹尼尔和亚历山大·里维利斯。
页: [1]
查看完整版本: 如何设置撤消操作?