QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 2010caozhiyong 于 2013-7-21 10:26 编辑 4 Z4 Y6 U3 ^/ s0 f, t

/ W, X. O7 B3 R小弟一直有个困惑,自己编了很多程序,尤其是一些有循环的很长程序,结果画出来之后,发现画错了- C3 _8 ~8 L" U' e; {% M
然后,我就按放弃命令(Ctrl+Z)结果要按上几分钟才能一步一步的返回的最初状态
5 T9 ]& m- J  F# u  v$ F我简单复制了一个程序,如下,怎样添加内容,使该程序能成为一个整体,就像CAD内部程序一样,一步就可以返回到最初状态,谢谢( N1 x- G2 L9 Z5 n1 z+ D5 N- y1 s

& K# U& x, G& N0 P: T, H- d(defun c:xy(/ p czy_p)
0 L% K) k1 ]2 u, ^0 ^; [(setq p (GETPOINT "选择中心点:"))
0 y" w1 q3 v/ g2 D* {2 G/ j5 o(setq old_lay (getvar "clayer")), g% n1 t& s0 a- R" g! D# Y
(COMMAND "LAYER" "n" "center" "set" "center" "")) E9 x- N2 P6 D
(command "line" p pause "")
! P# M) N& t/ {(setq czy_p (entlast))( U* b0 {! ?  u
(command "ROTATE" czy_p "" p "c" "90")' P& D; J6 o. Q8 }5 B$ r
(command "ROTATE" czy_p "" p "c" "180")) q1 D$ |0 I) G7 d0 |
(command "ROTATE" czy_p "" p "c" "270")9 R" j" v7 a: F1 F  }, ]+ o) N  C
(setvar "clayer" old_lay)
( x4 B! R9 L* Y+ i. Q$ h% D( r(prin1)4 V3 ?: u- J2 Z, i/ m: G/ V& B  ?2 P2 z
);绘制圆的中心线. Y' Q" g* I, ^$ |9 I3 Q
' R1 L( E; v$ e4 l# E) a
 楼主| 发表于 2013-7-21 12:11:21 | 显示全部楼层 来自: 中国江苏常州
本帖最后由 2010caozhiyong 于 2013-7-21 12:14 编辑
, E% b! y* U1 `3 e! `4 E. g9 J, H/ w& B
解释一下,可能朋友们没有听清楚意思
. ~. n/ i4 z* M+ f" l就是我程序编好了,加载后,在CAD窗口下运行后,发现我的画出来的图形不太对,想返回后重新画
! D$ U6 R/ ?5 c& D; A但是,我在cad里用(Ctra+Z)命令,要一直按好久好久,才能一步一步的返回到我运行这个程序之前的状态1 V% [9 H$ s# C& E1 a
我现在想一步就返回到最初的状态,怎么修改程序呢?6 H/ S+ P7 }& U
就像cad内部命令一样,阵列了好多图元,我发现不对,想放弃,直接按一下(Ctra+Z)就行了,不要按好多下
发表于 2013-7-22 01:46:33 | 显示全部楼层 来自: 中国吉林吉林市
本帖最后由 woaishuijia 于 2013-7-22 01:48 编辑
9 [/ ^, ]: ^( f! f
  1. (defun c:xy (/ p old_lay czy_p)) l: j& n8 |+ U$ k0 g+ \. e. l
  2.   (setq p (GETPOINT "选择中心点:"))
    " b& C. s9 i6 W7 ^: ~+ Y$ {
  3.   (setq old_lay (getvar "clayer"))
      J3 i8 F5 D) F; @
  4.   (COMMAND "LAYER" "n" "center" "set" "center" "")1 s2 M- `$ r4 Q" g! c9 i9 e. w5 ~' Q1 \
  5.   (command "line" p pause "")
    7 U7 {. v! H3 n3 Z+ w1 u3 x/ r$ D$ k, X
  6.   (setq czy_p (entlast))0 f! u6 J- A$ V. d8 N; w
  7.   (command "ROTATE" czy_p "" p "c" "90")2 r3 V0 T9 z+ ~! S2 F- v) w+ o
  8.   (command "ROTATE" czy_p "" p "c" "180")& e% X+ l% h( d7 R) h: a1 s
  9.   (command "ROTATE" czy_p "" p "c" "270")
    6 ?" K$ y- w' q" A; b6 I7 k
  10.   (setvar "clayer" old_lay)* L9 H; x3 [) j) |8 f  D  x! l8 d
  11.   (initget 0 "u")                        ;定义关键字
    % h- s, O4 [7 O/ L
  12.   (if (= (getkword "\n确定或 [放弃(U)]:") "u");检查用户输入的关键字决定是否放弃
    % u! N% Z1 U7 D* o# {/ T
  13.     (repeat 5 (command "u"))  ;放弃前面5个命令的结果
    0 K, w; l) W7 A" N
  14. ;;;    (command "undo" 5)2 v6 L/ M- q% @+ E
  15.   )0 q1 X8 B9 K$ C  x/ D
  16.   (prin1)
    2 x2 N; l9 L9 b: I& R1 `
  17. )                                        ;绘制圆的中心线
复制代码
 楼主| 发表于 2013-7-22 18:14:26 | 显示全部楼层 来自: 中国江苏常州
本帖最后由 2010caozhiyong 于 2013-7-22 18:29 编辑
; H7 Q9 P* H, m6 B. l" i: a8 L% n
woaishuijia 发表于 2013-7-22 01:46 static/image/common/back.gif

: w: U$ i0 ~  ?8 e- ]非常感谢版主的回复4 I2 }; P; n9 o7 a- B* t
对于我知道应该放弃5个命令的结果,该方案是行得通的,
& N1 [# Z8 G' a但如果我是一个选集,且我也不知道要返回多少个命令的时候,就不适用该办法了。
+ D+ O1 b$ b9 w5 p6 z4 K有没有一个办法,可以把我的程序打一个包,就是一个整体,执行,放弃,都是一步2 n! J1 V. a5 v; U/ S7 \- E+ f
如下面程序
7 @* Y3 H0 ~" J) q3 v8 [" n' s! C' u+ E7 o4 ^* {  m3 k+ Y
(defun c:yd (/ s b p0 n0 ss a0 a s0 p00)  ( ]4 P. g: t! B8 y' \2 X( L
  (setvar "cmdecho" 0)(setq old_osm (getvar "osmode")) (setvar "osmode" 0)7 D; M' B6 I  s- K4 H- g. W$ u( z
  (setq s (ssget) p1 (list 0 0))! m# ^9 U8 Z6 j! M% r  w
  (setq s (ssget "p" '((0 . "circle")))0 I1 ~8 w1 ~; h/ i
  );新建圆选集) W& F* B, [+ {2 U1 u
  (command "copybase" p1 s "")  (command "pasteblock" p1)- C& ], h' S  R! j7 y4 u
  (setq n0  (-(sslength s) 1) a (ssadd))
, I/ `9 k9 o6 b4 i1 N  (if (= n0 -1) (exit))2 [2 H) |) n8 M& o+ p
  (repeat n0, K! s1 |: r7 A
   (setq ss (ssname s 0)  p0 (czy_yxd ss) )2 ^# i$ I) U2 {$ R- V+ F2 p3 C# `
   (if (/= p0 p00)(progn+ A3 P* U6 j$ }
     (command "POINT" p0)5 w1 P6 J* w( t! _: i. n
     (setq a0 (entlast) a (ssadd a0 a))' E, h% ?, @* h
     )9 q& ?4 {" I4 X2 N
   )
  o& ?9 N9 k* w0 n4 a   (setq p00 p0)
- H1 W& _8 X8 {  R   (ssdel ss s)(command "erase" ss "")( \, n/ d  h$ \; s- l$ u
  )
* L# s: J: [- I( D   (setq ss (ssname s 0)  p0 (czy_yxd ss) )7 L, I# `0 F8 N8 j$ N5 e
   (if (/= p0 p00) (progn" S( L, a) b4 ^( |9 e3 n
        (command "POINT" p0)4 J1 w; r1 \, ?- U' `; n
        (setq a0 (entlast) a (ssadd a0 a))# \* q7 U. X% \  M2 o9 o
        )" T2 W( s( D  L( y4 j8 R3 w% a
     ): o! }. q7 E5 Z/ r$ q! f$ J5 o
   (command "erase" ss "")
) Y1 D" x' x2 _2 l6 @3 S   (command "copybase" p0 a "") (command "erase" a "")(command "pasteblock" p0)
% J/ Q3 |" H" \$ d4 i7 ~ (setvar "osmode" old_osm)(setvar "cmdecho" 1)
% Z5 v! q* y" I& ]: i+ s! U (princ): D" A! T' R- X9 u) w, p
);框选圆,并删除圆,在圆心处添加点$ d# k% P" y/ \) Q
发表于 2013-7-22 18:18:17 | 显示全部楼层 来自: 中国吉林吉林市
那你就声明一个局部变量专门用于记录之前执行了多少个命令啊
 楼主| 发表于 2013-7-22 18:32:14 | 显示全部楼层 来自: 中国江苏常州
woaishuijia 发表于 2013-7-22 18:18 static/image/common/back.gif
& m0 }: r1 l* S6 h那你就声明一个局部变量专门用于记录之前执行了多少个命令啊

: [% k( ]0 ?. f5 R* j没有弄过,不会
) Q1 h# e1 ?. Q' x" c, Q: W6 j版主,能不能帮我在以上程序里,添加一下啊
# [8 Q* Z$ c5 x# Q% p谢谢啊
) n# u% Y* D8 r
 楼主| 发表于 2013-7-22 18:38:48 | 显示全部楼层 来自: 中国江苏常州
woaishuijia 发表于 2013-7-22 18:18 static/image/common/back.gif% d( w) L  Y, I  K
那你就声明一个局部变量专门用于记录之前执行了多少个命令啊
( r6 U1 W. v; A
QQ图片20130722183435.jpg   v2 p0 |- b; J: G. F1 W% P
上面是燕秀工具箱里的文字成线命令
* y" J% l4 @/ [( M4 a. ~1 A2 p  h我爆炸成线后,发现不对,我按“CTRA+Z”后出现的代码
5 _3 d- ~: e; Y3 ?版主知道,该程序是如何办到的吗?
/ h6 a0 w0 v. T% w$ }* B3 R$ z
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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