“撤消”绘图
我的代码画了一些线等,在中途得到一个“if”语句。如果答案是真的,那么它将继续并完成。但是,如果答案为零,则退出并恢复系统变量。然而,我也想撤消并恢复到原来的图形。我如何使用“撤消”或其他方式来实现这一点。如果我使用撤消,我需要撤消多少次。
谢谢你的帮助 如果您的意思是让用户可以撤消在一次点击中创建的内容,那么您可以使用:
(命令“_.undo”“\u Begin”)和(命令“_.undo”“\u End”)
或
(vla StartUndoMark)和(vla EndUndoMark)
或者,如果您想让程序执行此操作,我会保留您创建的内容列表,并使用entdel或vla delete。 我想通过编程来实现,但我该如何带回旧对象呢。也许做一个积木会更好?
当然有更好的方法吗?
我的尝试:
(command "_.COPY" enaPline enaPlineTop "" '(0 0 0) '(0 0 0) ;copy 2 objects
"_.LAYER" "_MAKE" "Mylayer" ""
)
(setq e1 (entlast))
do some stuff.......
(setq e2 (entlast));save new object
do a if statement - find answer requires to go back to original object
(if blah blah
(progn
(entdel e2);delete new entity
(????? e1 );bring back existing e1 object ?
)
) 我不确定其余的代码,所以我真的不能很容易地帮你处理这段代码 如果使用(entdel e1)将其擦除,则可以(entdel e1)将其恢复。
至少我认为这是你的问题-大卫 David谢谢-你真的能用entdel带回一个物体吗?
下面是一些测试代码。我使用entdel尝试恢复该对象。
但它不起作用。也许我需要制作一个块,插入它,然后分解它,但这似乎有点笨拙。
(defun c:Original (/ enaPline LowLeft e1 e2 ObjName)
(vl-load-com)
(setq enaPline (car (entsel "\nSelect closed pline rectangle: ")))
(setq e1 (entlast))
(setq ObjName (vlax-ename->vla-object enaPline))
(vla-GetBoundingBox ObjName 'LowLeft'UpRight)
(setq LowLeft (vlax-safearray->list LowLeft))
(command "ROTATE" enaPline "" LowLeft35 )
(setq e2 (entlast))
(command "delay" 3000);slow down to see whats happening
(if (not(equal1000 1200 ));test example numbers
(entdel e2);delete modified object
(entdel e1);reinstate original object - this is my problem line
)
);defun 如果只是一个简单的旋转,为什么不把物体旋转回原来的位置呢?
(defun c:Original (/ pEnt pObj Minp Maxp)
(vl-load-com)
(if (setq pEnt (car (entsel "\nSelect Closed Pline Rectangle: ")))
(progn
(setq pObj (vlax-ename->vla-object pEnt))
(vla-GetBoundingBox pObj 'Minp 'Maxp)
(vla-Rotate pObj Minp (* pi (/ 35. 180.)))
(initget "Yes No")
(if (= "Yes" (getkword "\nReinstate Original? <No>: "))
(vla-Rotate pObj Minp (* pi (/ -35. 180.)))))
(princ "\n<< Nothing Selected >>"))
(princ))
有几件事:
[列表]
[*]使用条件语句(如IF)来考虑用户没有选择某个内容的情况。
[/列表]
[列表]
[*]Entlast用于拾取创建的最后一个实体,如果旋转,实体仍将使用相同的实体名称调用。
[/列表]
[列表]
[*]为什么会延迟?和随机数的比较?
[/列表] 谢谢李-对不起,如果我不清楚。我写的代码只是一个例子——它恰好是我使用的“rotate”。我的原始代码太大,无法发布,所以我只是做了一些我认为可以解释我的问题的东西,因此延迟和随机比较数字-我只是认为它可以显示发生了什么。
我的问题是如何在修改后恢复原始对象。
编辑
没关系,我想出了一个办法。
首先,列出所有顶点的点列表。
然后在最后使用以下工具重新绘制:
(命令“_PLINE”)(mapcar命令PntLst)(命令“c”)
所以我现在有:
(defun c:Original (/ enaPline LowLeft e1 e2 ObjName PntLst)
(vl-load-com)
(setq enaPline (car (entsel "\nSelect closed pline rectangle : ")))
;make a list of all vertices
(setq eprPline(entget enapline))
(foreach lstTemp eprPline
(if (= (car lstTemp) 10)
(setq PntLst (append PntLst (list (cdr lstTemp))))
);if
);foreach
(setq ObjName (vlax-ename->vla-object enaPline))
(vla-GetBoundingBox ObjName 'LowLeft'UpRight)
(setq LowLeft (vlax-safearray->list LowLeft))
(command "ROTATE" enaPline "" LowLeft35 )
(setq e2 (entlast))
(command "delay" 3000);slow down to see whats happening
(if (not(equal1000 1200 ));test example numbers
(progn
(entdel e2);delete modified object
(command "_PLINE")(mapcar 'command PntLst)(command "c");reinstate object
)
)
);defun 好的,但是请注意我提供的指针,您将有一个更稳定的例程。
此外,这里还有另一种检索LWMOLYLINE顶点的方法:
(mapcar 'cdr (vl-remove-if-not
(function
(lambda (x)
(= (car x) 10))) (entget enapline)))
是的,您可以使用(entdel)还原实体
我知道这不是你想要实现的-大卫
页:
[1]
2