Small Fish 发表于 2022-7-6 14:25:32

“撤消”绘图

我的代码画了一些线等,在中途得到一个“if”语句。如果答案是真的,那么它将继续并完成。但是,如果答案为零,则退出并恢复系统变量。
然而,我也想撤消并恢复到原来的图形。我如何使用“撤消”或其他方式来实现这一点。如果我使用撤消,我需要撤消多少次。
谢谢你的帮助

Lee Mac 发表于 2022-7-6 14:34:36

如果您的意思是让用户可以撤消在一次点击中创建的内容,那么您可以使用:
 
(命令“_.undo”“\u Begin”)和(命令“_.undo”“\u End”)
 

 
(vla StartUndoMark)和(vla EndUndoMark)
 
或者,如果您想让程序执行此操作,我会保留您创建的内容列表,并使用entdel或vla delete。

Small Fish 发表于 2022-7-6 14:39:34

我想通过编程来实现,但我该如何带回旧对象呢。也许做一个积木会更好?
当然有更好的方法吗?
我的尝试:
 
(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 ?
)
)

Lee Mac 发表于 2022-7-6 14:48:40

我不确定其余的代码,所以我真的不能很容易地帮你处理这段代码

David Bethel 发表于 2022-7-6 14:49:41

如果使用(entdel e1)将其擦除,则可以(entdel e1)将其恢复。
 
至少我认为这是你的问题-大卫

Small Fish 发表于 2022-7-6 14:56:53

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

Lee Mac 发表于 2022-7-6 15:05:53

如果只是一个简单的旋转,为什么不把物体旋转回原来的位置呢?
 

(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用于拾取创建的最后一个实体,如果旋转,实体仍将使用相同的实体名称调用。
[/列表]
[列表]
[*]为什么会延迟?和随机数的比较?
[/列表]

Small Fish 发表于 2022-7-6 15:08:09

谢谢李-对不起,如果我不清楚。我写的代码只是一个例子——它恰好是我使用的“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

Lee Mac 发表于 2022-7-6 15:14:33

好的,但是请注意我提供的指针,您将有一个更稳定的例程。
 
此外,这里还有另一种检索LWMOLYLINE顶点的方法:
 

(mapcar 'cdr (vl-remove-if-not
            (function
                (lambda (x)
                  (= (car x) 10))) (entget enapline)))

David Bethel 发表于 2022-7-6 15:21:47

是的,您可以使用(entdel)还原实体
 
 
我知道这不是你想要实现的-大卫
页: [1] 2
查看完整版本: “撤消”绘图