QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

查看: 5053|回复: 6
收起左侧

[求助] 如何使以下程序在cad窗口下,按(Ctrl+Z)后,程序能一步返回到最初状态

[复制链接]
发表于 2013-7-21 10:24:48 | 显示全部楼层 |阅读模式 来自: 中国江苏常州

马上注册,结识高手,享用更多资源,轻松玩转三维网社区。

您需要 登录 才可以下载或查看,没有帐号?注册

x
本帖最后由 2010caozhiyong 于 2013-7-21 10:26 编辑
8 g+ m" e+ A& \% c! m' Z* R2 ?+ b% O. I' ^! b( ]
小弟一直有个困惑,自己编了很多程序,尤其是一些有循环的很长程序,结果画出来之后,发现画错了3 `8 |( p4 X$ u3 f; @" N5 [
然后,我就按放弃命令(Ctrl+Z)结果要按上几分钟才能一步一步的返回的最初状态" J( k- i4 S8 Z1 {( x' ~6 o# l) f3 D: h
我简单复制了一个程序,如下,怎样添加内容,使该程序能成为一个整体,就像CAD内部程序一样,一步就可以返回到最初状态,谢谢
' r, e0 f4 A6 E- \, n9 e
6 y4 L2 s: Q% E, t(defun c:xy(/ p czy_p)
& v% s% O0 u/ F(setq p (GETPOINT "选择中心点:"))
+ E/ o; e3 @* v) V& o9 h(setq old_lay (getvar "clayer"))
; S4 A5 y' S" O' _8 X3 x; o# B(COMMAND "LAYER" "n" "center" "set" "center" "")
2 m: j6 Y. Z* d! @(command "line" p pause "")
6 H5 h* M% S4 z$ ]5 U2 K$ Z! O4 A) W(setq czy_p (entlast))
/ ~! T8 ]) U, ~  V(command "ROTATE" czy_p "" p "c" "90")$ e( B  y4 L! ?- ]
(command "ROTATE" czy_p "" p "c" "180")
' g1 b5 Y) v+ q. Y0 l$ {) J4 @(command "ROTATE" czy_p "" p "c" "270")' Y' ^3 c7 W( z, h6 Z7 b0 y1 \
(setvar "clayer" old_lay)
# U  j7 ?* W/ c6 D(prin1); E4 s- l+ |6 Y* t
);绘制圆的中心线
' Y0 f: A9 _( A
6 [. ^* X# d6 ?/ j$ [$ f
 楼主| 发表于 2013-7-21 12:11:21 | 显示全部楼层 来自: 中国江苏常州
本帖最后由 2010caozhiyong 于 2013-7-21 12:14 编辑 , }! t8 q" b( F' I0 l) d

- S" y* E5 @. T; i解释一下,可能朋友们没有听清楚意思. m( g, P/ j5 ]( A) ~) M
就是我程序编好了,加载后,在CAD窗口下运行后,发现我的画出来的图形不太对,想返回后重新画
7 u& Z4 b1 p- u  w% I% g9 N( o但是,我在cad里用(Ctra+Z)命令,要一直按好久好久,才能一步一步的返回到我运行这个程序之前的状态; }- l4 L8 {: A  S8 W) H
我现在想一步就返回到最初的状态,怎么修改程序呢?
0 t+ M1 J) x% J) a就像cad内部命令一样,阵列了好多图元,我发现不对,想放弃,直接按一下(Ctra+Z)就行了,不要按好多下
发表于 2013-7-22 01:46:33 | 显示全部楼层 来自: 中国吉林吉林市
本帖最后由 woaishuijia 于 2013-7-22 01:48 编辑
* K) x% L# m3 v- y
  1. (defun c:xy (/ p old_lay czy_p)9 E, @$ `! I5 T8 R8 p5 |
  2.   (setq p (GETPOINT "选择中心点:"))
    4 Q) _  D  H9 V
  3.   (setq old_lay (getvar "clayer"))
    0 F8 Q2 `3 e7 m+ [7 R
  4.   (COMMAND "LAYER" "n" "center" "set" "center" "")
    ) M# n! z: e1 {9 E# q8 W
  5.   (command "line" p pause "")
    + V  L3 |# v" x, g7 l) p# q% h8 o
  6.   (setq czy_p (entlast))" }4 M3 R3 U( v- Q2 t& a  i
  7.   (command "ROTATE" czy_p "" p "c" "90")) d- _& v3 H: q: y
  8.   (command "ROTATE" czy_p "" p "c" "180")
    ' m2 P+ `! L8 P; b+ K# ~) W
  9.   (command "ROTATE" czy_p "" p "c" "270")
    $ j+ i. _2 n. j. K1 J: \1 {; U# Q
  10.   (setvar "clayer" old_lay)- J8 R0 S7 N+ s3 X, @$ e- q" I: B
  11.   (initget 0 "u")                        ;定义关键字" z+ ?& s: ^) l2 x1 R% M! w# v+ g" m0 C
  12.   (if (= (getkword "\n确定或 [放弃(U)]:") "u");检查用户输入的关键字决定是否放弃6 j9 x1 a7 |2 C+ G% I7 r
  13.     (repeat 5 (command "u"))  ;放弃前面5个命令的结果
    . |: B0 u2 S0 C" t- C  [& \2 n
  14. ;;;    (command "undo" 5)
    ; e! |2 Z# I, s: k% O
  15.   )
    * C+ D$ V4 M4 Z: X) P- v3 v; \0 s
  16.   (prin1)5 @+ D8 Y) b2 I0 ?* d; i+ b
  17. )                                        ;绘制圆的中心线
复制代码
 楼主| 发表于 2013-7-22 18:14:26 | 显示全部楼层 来自: 中国江苏常州
本帖最后由 2010caozhiyong 于 2013-7-22 18:29 编辑
# x% n! r6 K, C. I4 a: i- e
woaishuijia 发表于 2013-7-22 01:46 static/image/common/back.gif
/ s7 X- V" R; ^, X
非常感谢版主的回复) u7 k0 Q( s# y5 E" C: y
对于我知道应该放弃5个命令的结果,该方案是行得通的,: ^5 m) _5 N/ u  Z
但如果我是一个选集,且我也不知道要返回多少个命令的时候,就不适用该办法了。
& h- z& y8 }3 Z5 \/ U有没有一个办法,可以把我的程序打一个包,就是一个整体,执行,放弃,都是一步
# F2 X8 ^3 H; s  m. {如下面程序
: M0 W* S# Z6 y! \
: I( h" C6 R" h! n' @$ V(defun c:yd (/ s b p0 n0 ss a0 a s0 p00)  
' C& ^- X( k9 V: Q  (setvar "cmdecho" 0)(setq old_osm (getvar "osmode")) (setvar "osmode" 0)" Y* s2 Q9 f9 I' a7 r! {
  (setq s (ssget) p1 (list 0 0))( P# ?( W4 Y+ m8 _( z  H
  (setq s (ssget "p" '((0 . "circle")))- s# e$ r5 m; R5 L  w: ?, S- p  r
  );新建圆选集
8 L( a2 Q7 X$ r9 y0 R  (command "copybase" p1 s "")  (command "pasteblock" p1)' S/ |" p3 |' L) s
  (setq n0  (-(sslength s) 1) a (ssadd))
6 Y3 J2 u, N6 q# }, w, }  (if (= n0 -1) (exit)). m4 e; t- v; c8 ^4 N
  (repeat n03 h  T  ]- K; q/ N  l8 z
   (setq ss (ssname s 0)  p0 (czy_yxd ss) )2 u( @# W! K, {5 C8 n9 z& z
   (if (/= p0 p00)(progn
& |% z+ f& U! Z     (command "POINT" p0)+ o: H8 ?, _9 B
     (setq a0 (entlast) a (ssadd a0 a))
1 Q$ z7 U& V+ h     )
& s9 M" s+ g% D3 B5 j; Z0 `   )
7 h9 x0 k7 }# l# o   (setq p00 p0)
; V% Q1 P: P# x* Z" B+ i   (ssdel ss s)(command "erase" ss "")
8 v! Y$ {6 J- t6 x' k. n  )
1 W' O- s2 |+ ]" r3 H1 B1 Q9 x   (setq ss (ssname s 0)  p0 (czy_yxd ss) )3 a% X3 `. t" b' S# y
   (if (/= p0 p00) (progn1 x1 _& o+ a' V5 {: U/ R, s* D; z
        (command "POINT" p0)
: o9 Y- E! t5 s( [* R7 R        (setq a0 (entlast) a (ssadd a0 a))
) s/ N; O# N! Z7 W! o+ }, I        )9 I" Q% J0 T! u0 J9 |4 j7 V3 p6 N
     )3 J# `- A5 O  d' H
   (command "erase" ss "")
  n5 {# }0 ]% J0 O$ @$ O. R   (command "copybase" p0 a "") (command "erase" a "")(command "pasteblock" p0)
, b+ a5 ^* x! P$ w4 t (setvar "osmode" old_osm)(setvar "cmdecho" 1)
6 O* ^1 B- \0 w1 G$ w (princ)
6 O; R+ W3 l* ^+ q);框选圆,并删除圆,在圆心处添加点4 P6 y* \: x# }4 Z
发表于 2013-7-22 18:18:17 | 显示全部楼层 来自: 中国吉林吉林市
那你就声明一个局部变量专门用于记录之前执行了多少个命令啊
 楼主| 发表于 2013-7-22 18:32:14 | 显示全部楼层 来自: 中国江苏常州
woaishuijia 发表于 2013-7-22 18:18 static/image/common/back.gif1 m3 `8 K* Y2 M( a/ t
那你就声明一个局部变量专门用于记录之前执行了多少个命令啊
% d4 ^5 z( z( S# l' c; |
没有弄过,不会- k, N% S+ x( U+ G! }! Y. y  d4 a
版主,能不能帮我在以上程序里,添加一下啊! M5 U4 v3 [( p* Q. r- `
谢谢啊3 K7 `' k/ d  w, O. S1 {' ?# w
 楼主| 发表于 2013-7-22 18:38:48 | 显示全部楼层 来自: 中国江苏常州
woaishuijia 发表于 2013-7-22 18:18 static/image/common/back.gif
! B! j) D* }1 r7 q那你就声明一个局部变量专门用于记录之前执行了多少个命令啊

2 e& ?% Y( u2 a7 B9 U; J+ b9 n QQ图片20130722183435.jpg * G; w( |" B$ F
上面是燕秀工具箱里的文字成线命令
% m) S' O) t, q! ]7 Q7 l我爆炸成线后,发现不对,我按“CTRA+Z”后出现的代码5 l0 [( D# F; B: }7 t
版主知道,该程序是如何办到的吗?
9 k, H, K' {& {7 \
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


Licensed Copyright © 2016-2020 http://www.3dportal.cn/ All Rights Reserved 京 ICP备13008828号

小黑屋|手机版|Archiver|三维网 ( 京ICP备2023026364号-1 )

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