乐筑天下

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

[编程交流] “撤消”绘图

[复制链接]

55

主题

243

帖子

188

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
275
发表于 2022-7-6 14:25:32 | 显示全部楼层 |阅读模式
我的代码画了一些线等,在中途得到一个“if”语句。如果答案是真的,那么它将继续并完成。但是,如果答案为零,则退出并恢复系统变量。
然而,我也想撤消并恢复到原来的图形。我如何使用“撤消”或其他方式来实现这一点。如果我使用撤消,我需要撤消多少次。
谢谢你的帮助
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 14:34:36 | 显示全部楼层
如果您的意思是让用户可以撤消在一次点击中创建的内容,那么您可以使用:
 
(命令“_.undo”“\u Begin”)和(命令“_.undo”“\u End”)
 

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

使用道具 举报

55

主题

243

帖子

188

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
275
发表于 2022-7-6 14:39:34 | 显示全部楼层
我想通过编程来实现,但我该如何带回旧对象呢。也许做一个积木会更好?
当然有更好的方法吗?
我的尝试:
 
  1. (command "_.COPY" enaPline enaPlineTop "" '(0 0 0) '(0 0 0) ;copy 2 objects
  2.                  "_.LAYER" "_MAKE" "Mylayer" ""
  3.         )
  4.   (setq e1 (entlast))
  5. do some stuff.......
  6. (setq e2 (entlast));save new object
  7. do a if statement - find answer requires to go back to original object
  8. (if blah blah
  9. (progn
  10. (entdel e2);delete new entity
  11. (????? e1 );bring back existing e1 object ?
  12. )
  13. )
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 14:48:40 | 显示全部楼层
我不确定其余的代码,所以我真的不能很容易地帮你处理这段代码
回复

使用道具 举报

26

主题

1495

帖子

20

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-6 14:49:41 | 显示全部楼层
如果使用(entdel e1)将其擦除,则可以(entdel e1)将其恢复。
 
至少我认为这是你的问题-大卫
回复

使用道具 举报

55

主题

243

帖子

188

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
275
发表于 2022-7-6 14:56:53 | 显示全部楼层
David谢谢-你真的能用entdel带回一个物体吗?
下面是一些测试代码。我使用entdel尝试恢复该对象。
但它不起作用。也许我需要制作一个块,插入它,然后分解它,但这似乎有点笨拙。
 
  1. (defun c:Original (/ enaPline LowLeft e1 e2 ObjName)
  2. (vl-load-com)
  3. (setq enaPline (car (entsel "\nSelect closed pline rectangle: ")))
  4. (setq e1 (entlast))
  5. (setq ObjName (vlax-ename->vla-object enaPline))
  6.                (vla-GetBoundingBox ObjName 'LowLeft  'UpRight)
  7. (setq LowLeft (vlax-safearray->list LowLeft))
  8. (command "ROTATE" enaPline "" LowLeft  35 )
  9. (setq e2 (entlast))
  10. (command "delay" 3000);slow down to see whats happening
  11. (if (not(equal  1000 1200 ));test example numbers
  12. (entdel e2);delete modified object
  13. (entdel e1);reinstate original object - this is my problem line
  14. )
  15. );defun
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 15:05:53 | 显示全部楼层
如果只是一个简单的旋转,为什么不把物体旋转回原来的位置呢?
 
  1. (defun c:Original (/ pEnt pObj Minp Maxp)
  2. (vl-load-com)
  3. (if (setq pEnt (car (entsel "\nSelect Closed Pline Rectangle: ")))
  4.    (progn
  5.      (setq pObj (vlax-ename->vla-object pEnt))
  6.      (vla-GetBoundingBox pObj 'Minp 'Maxp)
  7.      (vla-Rotate pObj Minp (* pi (/ 35. 180.)))
  8.      (initget "Yes No")
  9.      (if (= "Yes" (getkword "\nReinstate Original? <No>: "))
  10.        (vla-Rotate pObj Minp (* pi (/ -35. 180.)))))
  11.    (princ "\n<< Nothing Selected >>"))
  12. (princ))

 
有几件事:
 
[列表]
  • 使用条件语句(如IF)来考虑用户没有选择某个内容的情况。
    [/列表]
    [列表]
  • Entlast用于拾取创建的最后一个实体,如果旋转,实体仍将使用相同的实体名称调用。
    [/列表]
    [列表]
  • 为什么会延迟?和随机数的比较?
    [/列表]
  • 回复

    使用道具 举报

    55

    主题

    243

    帖子

    188

    银币

    后起之秀

    Rank: 20Rank: 20Rank: 20Rank: 20

    铜币
    275
    发表于 2022-7-6 15:08:09 | 显示全部楼层
    谢谢李-对不起,如果我不清楚。我写的代码只是一个例子——它恰好是我使用的“rotate”。我的原始代码太大,无法发布,所以我只是做了一些我认为可以解释我的问题的东西,因此延迟和随机比较数字-我只是认为它可以显示发生了什么。
    我的问题是如何在修改后恢复原始对象。
    编辑
    没关系,我想出了一个办法。
    首先,列出所有顶点的点列表。
    然后在最后使用以下工具重新绘制:
    (命令“_PLINE”)(mapcar命令PntLst)(命令“c”)
     
    所以我现在有:
    1. (defun c:Original (/ enaPline LowLeft e1 e2 ObjName PntLst)
    2. (vl-load-com)
    3. (setq enaPline (car (entsel "\nSelect closed pline rectangle : ")))
    4. ;make a list of all vertices
    5. (setq eprPline(entget enapline))
    6. (foreach lstTemp eprPline
    7. (if (= (car lstTemp) 10)
    8. (setq PntLst (append PntLst (list (cdr lstTemp))))
    9. );if
    10. );foreach
    11.   
    12. (setq ObjName (vlax-ename->vla-object enaPline))
    13.                (vla-GetBoundingBox ObjName 'LowLeft  'UpRight)
    14. (setq LowLeft (vlax-safearray->list LowLeft))
    15. (command "ROTATE" enaPline "" LowLeft  35 )
    16. (setq e2 (entlast))
    17. (command "delay" 3000);slow down to see whats happening
    18. (if (not(equal  1000 1200 ));test example numbers
    19. (progn
    20. (entdel e2);delete modified object
    21. (command "_PLINE")  (mapcar 'command PntLst)  (command "c");reinstate object
    22. )
    23. )
    24. );defun
    回复

    使用道具 举报

    114

    主题

    1万

    帖子

    1万

    银币

    中流砥柱

    Rank: 25

    铜币
    543
    发表于 2022-7-6 15:14:33 | 显示全部楼层
    好的,但是请注意我提供的指针,您将有一个更稳定的例程。
     
    此外,这里还有另一种检索LWMOLYLINE顶点的方法:
     
    1. (mapcar 'cdr (vl-remove-if-not
    2.               (function
    3.                 (lambda (x)
    4.                   (= (car x) 10))) (entget enapline)))
    回复

    使用道具 举报

    26

    主题

    1495

    帖子

    20

    银币

    初露锋芒

    Rank: 3Rank: 3Rank: 3

    铜币
    118
    发表于 2022-7-6 15:21:47 | 显示全部楼层
    是的,您可以使用(entdel)还原实体
     
     
    我知道这不是你想要实现的-大卫
    回复

    使用道具 举报

    发表回复

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

    本版积分规则

    • 微信公众平台

    • 扫描访问手机版

    • 点击图片下载手机App

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

    GMT+8, 2025-7-1 13:07 , Processed in 1.142250 second(s), 72 queries .

    © 2020-2025 乐筑天下

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