QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 2010caozhiyong 于 2013-7-21 10:26 编辑 - ]' a4 ^+ {) z1 H% Y) ^
% f( C( E% }, k
小弟一直有个困惑,自己编了很多程序,尤其是一些有循环的很长程序,结果画出来之后,发现画错了
" u7 N" v; ~( u% s0 [+ s6 T然后,我就按放弃命令(Ctrl+Z)结果要按上几分钟才能一步一步的返回的最初状态
" v9 X$ `$ |; {3 @5 C" c我简单复制了一个程序,如下,怎样添加内容,使该程序能成为一个整体,就像CAD内部程序一样,一步就可以返回到最初状态,谢谢
% Y) B0 O' a9 a7 `
. d: `) b! y( y2 f: V(defun c:xy(/ p czy_p)6 Q2 o6 ~. x9 r0 I& w
(setq p (GETPOINT "选择中心点:"))
3 g7 t/ t% d3 G$ z(setq old_lay (getvar "clayer"))8 k* U5 C! W5 k6 V
(COMMAND "LAYER" "n" "center" "set" "center" "")7 m2 F; _- U% M' p+ u  T+ k
(command "line" p pause "")
, j) o! z( L& d9 n- Y4 O+ ?/ h5 [(setq czy_p (entlast))
4 h+ E1 g% X% Q(command "ROTATE" czy_p "" p "c" "90")
1 O- C# x: }  f: q7 X' I1 T* q& J5 [(command "ROTATE" czy_p "" p "c" "180")
  c  e" l4 c7 k# ?% [& }(command "ROTATE" czy_p "" p "c" "270")
# k& S+ @, M8 i9 h. v! ^(setvar "clayer" old_lay)' W. ^+ O2 p1 Q. m. d5 {
(prin1)
# }; }5 }0 h' Y1 P' `);绘制圆的中心线
' ]* @/ c. a1 W% v) {) d" h
  L6 n. B: g) K+ X+ r& ?# R
 楼主| 发表于 2013-7-21 12:11:21 | 显示全部楼层 来自: 中国江苏常州
本帖最后由 2010caozhiyong 于 2013-7-21 12:14 编辑 $ j+ \9 x/ G) f& N
' J0 {% N% }  X! ]
解释一下,可能朋友们没有听清楚意思3 i" ]1 _* m# }5 }
就是我程序编好了,加载后,在CAD窗口下运行后,发现我的画出来的图形不太对,想返回后重新画, t$ J7 ?' X0 I- q/ C
但是,我在cad里用(Ctra+Z)命令,要一直按好久好久,才能一步一步的返回到我运行这个程序之前的状态
4 ]! F" I3 ^2 T+ K- q  H4 I% w我现在想一步就返回到最初的状态,怎么修改程序呢?# U3 U2 _* ^: B$ N. n7 ^
就像cad内部命令一样,阵列了好多图元,我发现不对,想放弃,直接按一下(Ctra+Z)就行了,不要按好多下
发表于 2013-7-22 01:46:33 | 显示全部楼层 来自: 中国吉林吉林市
本帖最后由 woaishuijia 于 2013-7-22 01:48 编辑   K) A- X5 @: H/ d$ S8 j2 x% Z
  1. (defun c:xy (/ p old_lay czy_p)" S9 _& F. O) Y9 h6 x* M2 F6 L; m
  2.   (setq p (GETPOINT "选择中心点:"))
    2 L, A  c' R8 A/ M7 m6 i4 F' j3 O( I
  3.   (setq old_lay (getvar "clayer"))1 F; `2 y) `% s: U
  4.   (COMMAND "LAYER" "n" "center" "set" "center" "")- M, l9 l. a: s5 a
  5.   (command "line" p pause "")0 P0 M/ w( k  M8 c* [% @
  6.   (setq czy_p (entlast))8 s- [& f% r* s! M- X  M4 h
  7.   (command "ROTATE" czy_p "" p "c" "90")4 W7 f/ o  U1 Y8 m$ n3 `1 B
  8.   (command "ROTATE" czy_p "" p "c" "180")
    % ]5 H; O: B% I6 C& |& {) P6 c7 \
  9.   (command "ROTATE" czy_p "" p "c" "270")% U& d3 Z* o3 h; f: ]" o2 _
  10.   (setvar "clayer" old_lay)( l- T7 A0 x6 k# G4 y
  11.   (initget 0 "u")                        ;定义关键字7 J- x& E% B2 j
  12.   (if (= (getkword "\n确定或 [放弃(U)]:") "u");检查用户输入的关键字决定是否放弃* H) Y% m1 n7 ^# ^
  13.     (repeat 5 (command "u"))  ;放弃前面5个命令的结果$ v) g7 Z) M, x+ s) o6 U2 @: J* [4 U
  14. ;;;    (command "undo" 5)0 n2 A9 o/ F4 m/ m
  15.   )
    4 i9 Z1 e* G9 v9 `: Q- m2 f
  16.   (prin1)$ \5 N) F  o7 |, M' c6 T
  17. )                                        ;绘制圆的中心线
复制代码
 楼主| 发表于 2013-7-22 18:14:26 | 显示全部楼层 来自: 中国江苏常州
本帖最后由 2010caozhiyong 于 2013-7-22 18:29 编辑
8 w8 H/ I3 b3 ^2 n: N7 F1 c
woaishuijia 发表于 2013-7-22 01:46 static/image/common/back.gif
2 A! j+ s' b! @: H$ t5 c
非常感谢版主的回复5 l3 L, K, q  `
对于我知道应该放弃5个命令的结果,该方案是行得通的,1 @( F3 g4 p5 X6 A$ r
但如果我是一个选集,且我也不知道要返回多少个命令的时候,就不适用该办法了。& e9 E1 Z" Q1 z+ @% Y6 B! w* K
有没有一个办法,可以把我的程序打一个包,就是一个整体,执行,放弃,都是一步; l- k8 o* x# Z, C* _4 E. t; R
如下面程序* n" H' N  K$ C

7 ^+ _7 W6 `( u* l(defun c:yd (/ s b p0 n0 ss a0 a s0 p00)  
; p0 I* c5 o" e- Q7 q2 g  (setvar "cmdecho" 0)(setq old_osm (getvar "osmode")) (setvar "osmode" 0)2 B1 ^) h" _/ |% ~& P4 b* X- u
  (setq s (ssget) p1 (list 0 0)); Q; x+ R0 V( |5 c0 d- j  B
  (setq s (ssget "p" '((0 . "circle")))! C' `7 P6 w3 v3 {# a. H( k; z, U
  );新建圆选集
& B( @/ V5 e1 F+ `. f+ W9 N1 Y  (command "copybase" p1 s "")  (command "pasteblock" p1)+ T+ g, n3 y2 W1 y# S9 g9 {9 d1 ]
  (setq n0  (-(sslength s) 1) a (ssadd))
$ O6 _& w7 Y. v4 Y* b- Y' T  Q0 O& o  (if (= n0 -1) (exit))
$ j6 g# ~1 _' e9 n! }( u/ q  s. w+ `  (repeat n0
) f( g& E  a. Q3 b6 R  y   (setq ss (ssname s 0)  p0 (czy_yxd ss) )" |0 j1 x' p' ]3 O
   (if (/= p0 p00)(progn
( J. Y0 X) ]' W8 {, F! A     (command "POINT" p0)
3 q- ~; o9 t0 k! `" j2 v4 `, {     (setq a0 (entlast) a (ssadd a0 a))
8 O- S4 b; q7 V0 D2 [4 l     )6 v* k( r- ?; f# ~5 f: h
   ): l  N2 @) y2 G; p9 D; W
   (setq p00 p0)
3 t0 Z* V6 w# c6 \+ f9 v* z  [) A   (ssdel ss s)(command "erase" ss "")
7 {  ~+ ?! t8 d, [# [/ S  )
) V" N) K9 @! y   (setq ss (ssname s 0)  p0 (czy_yxd ss) )
7 I0 S. a9 I8 e! O3 |6 F   (if (/= p0 p00) (progn
, f8 N/ C" Y! H3 D- ~# J: p        (command "POINT" p0)
* ^& c5 |: ]. i) e# R  K7 g4 Z3 T        (setq a0 (entlast) a (ssadd a0 a))
$ X1 \, |' m7 {" Q5 A2 s; i        )1 B- s+ X6 q- M3 F! d( S, `& V7 A, b
     )
3 Y3 @& d6 h* D  q! m   (command "erase" ss "")! _3 l! q. P+ r. _8 O, n' Z
   (command "copybase" p0 a "") (command "erase" a "")(command "pasteblock" p0). T  T5 @6 Q8 a7 K
(setvar "osmode" old_osm)(setvar "cmdecho" 1): l* O/ {2 H& ~
(princ)
8 ?! X/ X7 J. o9 q/ h);框选圆,并删除圆,在圆心处添加点
$ w, o. m+ H3 ]: w1 H1 ^, |1 x
发表于 2013-7-22 18:18:17 | 显示全部楼层 来自: 中国吉林吉林市
那你就声明一个局部变量专门用于记录之前执行了多少个命令啊
 楼主| 发表于 2013-7-22 18:32:14 | 显示全部楼层 来自: 中国江苏常州
woaishuijia 发表于 2013-7-22 18:18 static/image/common/back.gif
, b( e& u+ z+ r那你就声明一个局部变量专门用于记录之前执行了多少个命令啊

8 r3 I, t" b7 Y* z, D1 ^6 h# G' z7 Y( y没有弄过,不会
# C6 F$ Q/ K( z8 u3 [版主,能不能帮我在以上程序里,添加一下啊  P" P$ j% X* b" T0 C3 \
谢谢啊
0 ~5 w; h+ i- p+ |* X
 楼主| 发表于 2013-7-22 18:38:48 | 显示全部楼层 来自: 中国江苏常州
woaishuijia 发表于 2013-7-22 18:18 static/image/common/back.gif+ Y1 ]# x8 \# b4 S
那你就声明一个局部变量专门用于记录之前执行了多少个命令啊

2 v5 N$ W' u- ]) D) D5 |) | QQ图片20130722183435.jpg 6 Q0 c4 G  Z' C9 m3 P* X  _
上面是燕秀工具箱里的文字成线命令$ H$ a3 \) Q% p+ ^* d! L5 A7 S
我爆炸成线后,发现不对,我按“CTRA+Z”后出现的代码
  ]- H/ O& z$ ~0 a8 p8 @/ ^% E3 R版主知道,该程序是如何办到的吗?
9 F; d! f4 n: ~% v) b
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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