QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 2010caozhiyong 于 2013-7-21 10:26 编辑 % v& s. C9 `  F6 p6 {6 y# `

$ V% ^3 ?) d5 ?! G0 s  q& |& g小弟一直有个困惑,自己编了很多程序,尤其是一些有循环的很长程序,结果画出来之后,发现画错了
9 C+ L  `; O  s; F& }然后,我就按放弃命令(Ctrl+Z)结果要按上几分钟才能一步一步的返回的最初状态# k' N5 e4 L8 H" D! y/ [* T
我简单复制了一个程序,如下,怎样添加内容,使该程序能成为一个整体,就像CAD内部程序一样,一步就可以返回到最初状态,谢谢
4 t4 u1 j2 b) |- v% ?: c( r( k# ]! N- H9 K+ Z
(defun c:xy(/ p czy_p)
6 E8 w5 k/ ?$ B  ](setq p (GETPOINT "选择中心点:"))
/ M+ d$ F$ q  f8 @0 J% x(setq old_lay (getvar "clayer"))
2 H2 ]( `# |* S1 T$ w+ y(COMMAND "LAYER" "n" "center" "set" "center" "")+ H1 }1 r7 M) l+ d4 a# G5 @
(command "line" p pause "")& h5 @# H& _) C
(setq czy_p (entlast)). T! f6 q7 ?) g4 p
(command "ROTATE" czy_p "" p "c" "90")' @9 G& s( L: j  Y/ L9 o
(command "ROTATE" czy_p "" p "c" "180")
" ~. k: M/ i: m! u5 C+ K7 o6 b  `(command "ROTATE" czy_p "" p "c" "270")
4 u$ z  Z7 J; H5 M(setvar "clayer" old_lay)
1 g' m9 L6 s& k7 J: }(prin1)2 j' [3 G" @  `0 K: ?
);绘制圆的中心线8 f; `' b2 T& g* j
" g0 }7 T( q7 D6 h, r/ C# K$ f0 \% I
 楼主| 发表于 2013-7-21 12:11:21 | 显示全部楼层 来自: 中国江苏常州
本帖最后由 2010caozhiyong 于 2013-7-21 12:14 编辑 , \6 ~6 w! H9 h2 H
. B6 H7 [' P* M- p, v% e
解释一下,可能朋友们没有听清楚意思% W+ e- K, P8 y8 P# N# P' M
就是我程序编好了,加载后,在CAD窗口下运行后,发现我的画出来的图形不太对,想返回后重新画
. q7 e# q! b, l- M; r% ^但是,我在cad里用(Ctra+Z)命令,要一直按好久好久,才能一步一步的返回到我运行这个程序之前的状态2 i; F0 s3 H% k+ M4 g" \- N& w2 P6 W( E
我现在想一步就返回到最初的状态,怎么修改程序呢?9 _: V% j  f4 `- G5 x
就像cad内部命令一样,阵列了好多图元,我发现不对,想放弃,直接按一下(Ctra+Z)就行了,不要按好多下
发表于 2013-7-22 01:46:33 | 显示全部楼层 来自: 中国吉林吉林市
本帖最后由 woaishuijia 于 2013-7-22 01:48 编辑
/ H8 `! k; [! w7 ~
  1. (defun c:xy (/ p old_lay czy_p)
    - S! t7 {2 E7 G+ A# N
  2.   (setq p (GETPOINT "选择中心点:"))
    - h( D. A& F+ [$ m
  3.   (setq old_lay (getvar "clayer"))
      x5 V' _+ X- b, K, B
  4.   (COMMAND "LAYER" "n" "center" "set" "center" "")
    * p" u+ R2 {* x
  5.   (command "line" p pause "")4 Y; \! j! l8 L0 q; V
  6.   (setq czy_p (entlast))/ \+ X; g8 C0 y- a/ p
  7.   (command "ROTATE" czy_p "" p "c" "90")
    1 x3 w, T( z1 |7 H& m
  8.   (command "ROTATE" czy_p "" p "c" "180")
    6 b! X2 x6 s: o7 [. h! K+ \) @
  9.   (command "ROTATE" czy_p "" p "c" "270")* e0 M, e% @# y7 }  p
  10.   (setvar "clayer" old_lay)
    ' p. u) K3 e% E% o5 _" W  W
  11.   (initget 0 "u")                        ;定义关键字) L+ r2 b3 L! q) u6 |8 u5 {
  12.   (if (= (getkword "\n确定或 [放弃(U)]:") "u");检查用户输入的关键字决定是否放弃
    ! a0 E- I, f9 y5 v% w% ]+ F7 \  l
  13.     (repeat 5 (command "u"))  ;放弃前面5个命令的结果# `* |% z! u2 R. _( e
  14. ;;;    (command "undo" 5); O. i- @$ ]; ], v
  15.   )
    % e! Z) ]9 t( X6 a. ^/ b1 ~3 A
  16.   (prin1)
    ) u# L7 l4 n: o! e) @
  17. )                                        ;绘制圆的中心线
复制代码
 楼主| 发表于 2013-7-22 18:14:26 | 显示全部楼层 来自: 中国江苏常州
本帖最后由 2010caozhiyong 于 2013-7-22 18:29 编辑
# p: V1 Y( _& b# Q1 w
woaishuijia 发表于 2013-7-22 01:46 static/image/common/back.gif
/ H2 N# G/ d6 K' A2 W: w$ X
非常感谢版主的回复4 g$ j$ A0 F3 O/ z- X2 v( }
对于我知道应该放弃5个命令的结果,该方案是行得通的,. P& W% N. N% \5 e1 |7 e; u2 K
但如果我是一个选集,且我也不知道要返回多少个命令的时候,就不适用该办法了。
1 M) c1 @" j( s$ Q4 {有没有一个办法,可以把我的程序打一个包,就是一个整体,执行,放弃,都是一步
7 w' e1 W2 f$ a如下面程序
8 G6 p; }$ _. |4 A
" }+ O& ?5 v9 S+ x(defun c:yd (/ s b p0 n0 ss a0 a s0 p00)  
; \7 q1 s/ i" B0 R: w' l  (setvar "cmdecho" 0)(setq old_osm (getvar "osmode")) (setvar "osmode" 0)
- `6 n+ o/ Q% ?9 `9 R3 C  (setq s (ssget) p1 (list 0 0))0 b8 _. A% I) h
  (setq s (ssget "p" '((0 . "circle")))
8 ?$ N2 I- A6 r& x& U' T" f: u  );新建圆选集! |8 P3 F9 R0 x! O$ q) b
  (command "copybase" p1 s "")  (command "pasteblock" p1)9 a5 a) Z$ b: ~0 Z# w  D& t
  (setq n0  (-(sslength s) 1) a (ssadd))& W* w7 S' h- y7 s2 k' B5 x
  (if (= n0 -1) (exit))( @" ~1 X, f1 I/ j
  (repeat n0
  D* i8 u- g7 E. A6 c* k: ?   (setq ss (ssname s 0)  p0 (czy_yxd ss) )
: z; H. ?& k6 d! ]1 F3 H6 Z   (if (/= p0 p00)(progn
( _& L$ ?' H7 T0 A6 ?* c     (command "POINT" p0)
3 z5 V8 F: T, Q     (setq a0 (entlast) a (ssadd a0 a))
/ L$ Z, Z' b) f: }- d     ); B" N7 a1 ]6 c  ^
   )% m# u- j9 _$ L7 v; ~7 }- ?
   (setq p00 p0)$ K' l( \* R  P0 ~4 x" ~1 E! Y: n
   (ssdel ss s)(command "erase" ss "")6 {+ E" }* g* d  o. Z/ I0 l
  )
. F* A; h9 X3 O9 V" D/ }   (setq ss (ssname s 0)  p0 (czy_yxd ss) )" o0 p6 @) q) ^1 t+ y
   (if (/= p0 p00) (progn
0 f2 A- T8 D: Z& P        (command "POINT" p0)
/ r; _. }" a' l8 q8 t        (setq a0 (entlast) a (ssadd a0 a))
4 y4 [2 u4 f& b+ d        )
1 u0 h" X1 R) Q2 A- e     )
( Y1 `* a' k' m2 @- N; V   (command "erase" ss "")" `; Z- a3 V, X1 K
   (command "copybase" p0 a "") (command "erase" a "")(command "pasteblock" p0)
- G$ B# H- ~* o: u' L (setvar "osmode" old_osm)(setvar "cmdecho" 1)
3 S7 b/ a) Q+ w( I1 h+ M6 F0 Z2 O (princ)
) v' y! |, \; D$ k6 H1 o9 n);框选圆,并删除圆,在圆心处添加点3 `( a5 P9 M$ |' C' P/ c4 f1 E
发表于 2013-7-22 18:18:17 | 显示全部楼层 来自: 中国吉林吉林市
那你就声明一个局部变量专门用于记录之前执行了多少个命令啊
 楼主| 发表于 2013-7-22 18:32:14 | 显示全部楼层 来自: 中国江苏常州
woaishuijia 发表于 2013-7-22 18:18 static/image/common/back.gif
$ l0 h) y% W/ U0 n7 e! T1 Y那你就声明一个局部变量专门用于记录之前执行了多少个命令啊

' ?3 _' w1 L! q: O没有弄过,不会* S# g8 J/ ~/ ?
版主,能不能帮我在以上程序里,添加一下啊4 j( }4 z6 X1 @" [- c6 b
谢谢啊2 @8 C9 }, x& d. c& g% D
 楼主| 发表于 2013-7-22 18:38:48 | 显示全部楼层 来自: 中国江苏常州
woaishuijia 发表于 2013-7-22 18:18 static/image/common/back.gif
4 e* `- p: n1 {! W& A& i那你就声明一个局部变量专门用于记录之前执行了多少个命令啊
) R' ?1 x! w$ p2 `
QQ图片20130722183435.jpg # t, |0 E4 c; k7 p) j
上面是燕秀工具箱里的文字成线命令0 O% s8 s& }( S* y+ w& L* R
我爆炸成线后,发现不对,我按“CTRA+Z”后出现的代码
3 u" l1 Q8 J. F* P版主知道,该程序是如何办到的吗?
( _) c: w3 d5 F( v
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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