明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: mandala

[函数] 求助:cad的“undo”+“m”是否有缺陷?

  [复制链接]
 楼主| 发表于 2011-1-29 21:55:06 | 显示全部楼层
本帖最后由 mandala 于 2011-1-29 22:02 编辑
caoyin 发表于 2011-1-29 17:13
回复 mandala 的帖子

对于有特殊的恢复处理的程序,可以定义内部的*error*(如我上面的示例1),但大部分程 ...


抱歉……又发现一个问题。比如下边这段简单的lsp:
(defun c:aa(/ *error* lay ltp )

(defun *error* (msg)  
(prompt "程序出错!返回到起始状态  ")  
(command "._undo" "_b" )
     )

  (setvar "CMDECHO" 0)
  (command "._undo" "_m" )
  (setq lay (getvar "clayer"))(setq ltp (getvar "celtype"))
  (setvar "clayer" "continuous")(setvar "celtype" "continuous")
  (command "_.PLINE" )
(while (= (getvar "CMDACTIVE") 1) (command pause))
  
  (command "._explode"  (entlast))
(setvar "clayer" lay)(setvar "celtype" ltp)
)

第一次运行这个lsp时,如果画一两条线后按esc键,会出现提示:
程序出错!返回到起始状态  这将放弃所有操作。确定? <Y>
这时候如果继续,undo会删除以前的所有操作!
但如果第一次运行中没有用esc中断程序,或是选择了<N>,然后继续第二次、第三次运行这个lsp,就正常了,提示:“程序出错!返回到起始状态 ”,然后undo工作也正常。

貌似第一次运行时, (command "._undo" "_m" )这条命令没有被加载。为什么啊?
发表于 2011-1-29 23:56:37 | 显示全部楼层
这将放弃所有操作。确定? <Y>------>因为ESC执行了(command "._undo" "_b" )

只需要undo  begin和end就好了,这样简单


貌似第一次运行时, (command "._undo" "_m" )这条命令没有被加载。为什么啊?
把(command "._undo" "_b" )改为(command "_.undo" 1)或(command "_.u")试试
发表于 2011-1-30 09:43:41 | 显示全部楼层
深有启发,谢谢!
 楼主| 发表于 2011-1-30 10:08:59 | 显示全部楼层
本帖最后由 mandala 于 2011-1-30 10:11 编辑

楼上老兄深受启发,俺倒是又陷入糊涂了。

如11楼的程序,按理说,(command "._undo" "_m" )这条命令是先被加载了,然后在画线过程中按ESC退出,那么*error*中的(command "._undo" "_b" )就应该回到m这个记号,也就是这个程序的起始,恢复线型、层和捕捉模式才对。但是仅仅在第一次运行的时候,ESC后undo居然回到了整个图纸开始时的状态,也就是说undo没有找到m这个记号!

奇怪的是,无论第一次运行程序有无*error*退出,只要是第二次运行这个程序,再退出时就一切正常了,m记号又被发现……为什么呢?
发表于 2011-1-30 10:34:30 | 显示全部楼层
关于容错处理,可以看我的专贴http://bbs.mjtd.com/thread-85081-1-1.html
 楼主| 发表于 2011-1-30 13:48:44 | 显示全部楼层
本帖最后由 mandala 于 2011-1-30 13:58 编辑

现在初步试了下,把这段程序中的(command "._undo" "_m" )变成(command "._undo" "_be" ),就一切正常了。真不知道是为了什么啊~~~~~~~~~天哪~~~~

难道 “undo”  “m” 这个命令有缺陷?????怎么会第一次运行没找到M,第二次运行就能找到了捏???


defun c:aa(/ *error* lay ltp )

(defun *error* (msg)  
(prompt "程序出错!返回到起始状态  ")  
(command "._undo" "_b" )
     )

  (setvar "CMDECHO" 0)
  (command "._undo" "_m" )  (setq lay (getvar "clayer"))(setq ltp (getvar "celtype"))
  (setvar "clayer" "continuous")(setvar "celtype" "continuous")
  (command "_.PLINE" )
(while (= (getvar "CMDACTIVE") 1) (command pause))
  
  (command "._explode"  (entlast))
(setvar "clayer" lay)(setvar "celtype" ltp)
)


 楼主| 发表于 2011-1-31 09:08:28 | 显示全部楼层
各位老大?版主?谁能告诉我为什么啊?
 楼主| 发表于 2011-1-31 11:46:31 | 显示全部楼层
本帖最后由 mandala 于 2011-1-31 11:51 编辑

现在我把这个程序(其实程序内容不重要,关键是*error*和undo的用法问题)这么写,问题似乎解决了。但是不明白其中的道理是什么?为什么undo+m就不行呢?

(defun c:aa(/ *error* lay ltp )

(defun *error* (msg)  
(prompt "程序出错!返回到起始状态  ")  
(command "._undo" "_e" )
(command "._u" )
     )

  (setvar "CMDECHO" 0)
  (command "._undo" "_be" )
  (setq lay (getvar "clayer"))(setq ltp (getvar "celtype"))
  (setvar "clayer" "continuous")(setvar "celtype" "continuous")
  (command "_.PLINE" )
(while (= (getvar "CMDACTIVE") 1) (command pause))
    (command "._explode"  (entlast))
(setvar "clayer" lay)(setvar "celtype" ltp)
(command "._undo" "_e" )
)

有朋友说为什么不定义一个公共的*error*函数。原因是我工作中要用到几十个其它人以前写的lsp,从来没有人加过*error*函数。现在去定义一个公共*error*,不能保证以前的lsp能正常运行,所以只好在我每个新写的lsp里内部定义*error*。
发表于 2011-1-31 21:24:24 | 显示全部楼层
undo没有缺陷,是你对
输入要放弃的操作数目或 [自动(A)/控制(C)/开始(BE)/结束(E)/标记(M)/后退(B)]红色部分的理解可能不对,你把(command "undo" "back")改为(command "u")不就好了吗
 楼主| 发表于 2011-2-2 13:06:15 | 显示全部楼层
本帖最后由 mandala 于 2011-2-2 13:07 编辑
caoyin 发表于 2011-1-31 21:24
undo没有缺陷,是你对
输入要放弃的操作数目或 [自动(A)/控制(C)/开始(BE)/结束(E)/标记(M)/后退(B)]红色部 ...


“标记”在放弃信息中放置标记。 “后退”放弃直到该标记为止所做的全部工作。 如果一次放弃一个操作,到达该标记时程序会给出通知。

只要有必要,可以放置任意个标记。 “后退”一次后退一个标记,并删除该标记。 如果没找到标记,“后退”将显示以下提示:

这将放弃所有操作。 确定? <是>: 输入 y 或 n ,或按 ENTER 键

输入 y 可放弃所有输入到当前任务中的命令。 输入 n 可忽略“后退”选项。

如果使用“数目”选项放弃多个操作,UNDO 将在遇到标记时停止。

=============================================
按我的理解,undo+b就是后退到上一个标记点。在11楼的程序里,无论是否第一次运行,*error*函数中的undo+b都应该能够找到M标记。但是仅仅在第一次运行的时候它找不到,第二次就能找到。而当使用undo+be的时候就一切正常,这是不是能说明undo+m设标记是有bug的呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-6-11 11:26 , Processed in 0.168425 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表