QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
6天前
查看: 5043|回复: 6
收起左侧

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

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

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

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

x
本帖最后由 2010caozhiyong 于 2013-7-21 10:26 编辑
/ {, q( K1 ]) g+ F5 e; A2 z, q9 {  S. b: ~( x
小弟一直有个困惑,自己编了很多程序,尤其是一些有循环的很长程序,结果画出来之后,发现画错了
2 r- A1 _# d; D7 Y. }然后,我就按放弃命令(Ctrl+Z)结果要按上几分钟才能一步一步的返回的最初状态
# Y/ s- G% ^; s: s4 r  v我简单复制了一个程序,如下,怎样添加内容,使该程序能成为一个整体,就像CAD内部程序一样,一步就可以返回到最初状态,谢谢6 a5 g: w8 L0 T

) U4 H7 z% l" u! b+ h9 r6 e(defun c:xy(/ p czy_p)
. v% x' d4 l3 f8 n  T1 S& V(setq p (GETPOINT "选择中心点:"))
( t' \* k* K! ]; a(setq old_lay (getvar "clayer"))
( V" U5 S0 I5 V8 y% z) a2 g* |1 S(COMMAND "LAYER" "n" "center" "set" "center" "")$ {- m) |& j6 ~" }6 y* w
(command "line" p pause "")% s3 u  {8 a& g
(setq czy_p (entlast))
' T3 @' E6 D) t5 k9 I6 X6 v(command "ROTATE" czy_p "" p "c" "90")
6 L! E: {9 B6 t6 e% S(command "ROTATE" czy_p "" p "c" "180")- s; ?% d1 P" ^! w, Z8 ?
(command "ROTATE" czy_p "" p "c" "270")0 H, S. h8 S8 T' S  z' ?9 q
(setvar "clayer" old_lay)
5 c; T9 U: o4 s; N, j(prin1)8 [; S, z- m5 o! _
);绘制圆的中心线
, O, n& B0 S8 c6 M* K0 B4 v( O9 g$ B6 X  H. L( W( L: \
 楼主| 发表于 2013-7-21 12:11:21 | 显示全部楼层 来自: 中国江苏常州
本帖最后由 2010caozhiyong 于 2013-7-21 12:14 编辑 ! R; ~. k1 F$ t
; i+ O/ [2 ?! |
解释一下,可能朋友们没有听清楚意思5 q% v* T7 C1 w7 S7 i
就是我程序编好了,加载后,在CAD窗口下运行后,发现我的画出来的图形不太对,想返回后重新画
3 m6 X" T" V/ J3 E/ d7 J' O1 X但是,我在cad里用(Ctra+Z)命令,要一直按好久好久,才能一步一步的返回到我运行这个程序之前的状态$ Y* T$ B7 c  T4 z& B
我现在想一步就返回到最初的状态,怎么修改程序呢?
8 z; i: c) P. ~" f: G7 S. c就像cad内部命令一样,阵列了好多图元,我发现不对,想放弃,直接按一下(Ctra+Z)就行了,不要按好多下
发表于 2013-7-22 01:46:33 | 显示全部楼层 来自: 中国吉林吉林市
本帖最后由 woaishuijia 于 2013-7-22 01:48 编辑 $ \9 F+ K" E& x( ?2 {
  1. (defun c:xy (/ p old_lay czy_p); e' R' w9 s; {/ N
  2.   (setq p (GETPOINT "选择中心点:"))
    : t. K: `  z6 L: t" k  ]3 E+ E
  3.   (setq old_lay (getvar "clayer"))
    , Q; u! Z/ c: d" c' O. d
  4.   (COMMAND "LAYER" "n" "center" "set" "center" "")
    9 g7 k0 f$ ]% o" I% o' F, F0 w0 R3 J
  5.   (command "line" p pause "")
    5 [. f4 [4 J4 r7 `7 [2 J' Q
  6.   (setq czy_p (entlast))
    " s3 y* J: f; N
  7.   (command "ROTATE" czy_p "" p "c" "90")# H! V) Y; C/ C  E1 ~
  8.   (command "ROTATE" czy_p "" p "c" "180")# p/ E+ P# U1 B+ X9 V4 n! G
  9.   (command "ROTATE" czy_p "" p "c" "270")
    , y2 |# J3 `. d* s+ A
  10.   (setvar "clayer" old_lay)% e: P# P& `' S2 ~2 M2 S
  11.   (initget 0 "u")                        ;定义关键字
    4 \+ B) i' \# Z+ W' C% d
  12.   (if (= (getkword "\n确定或 [放弃(U)]:") "u");检查用户输入的关键字决定是否放弃) }( \6 I7 K/ G, n3 W0 m( |/ |
  13.     (repeat 5 (command "u"))  ;放弃前面5个命令的结果
    ) M9 c" h  P  d% A% D% b
  14. ;;;    (command "undo" 5)2 \- v7 |6 `  k" [4 h
  15.   )
    9 K! k6 H1 v$ ]/ A+ S7 g  J  e
  16.   (prin1)( [% ~* w/ Z0 ~0 m7 Z2 J5 ~+ R* w
  17. )                                        ;绘制圆的中心线
复制代码
 楼主| 发表于 2013-7-22 18:14:26 | 显示全部楼层 来自: 中国江苏常州
本帖最后由 2010caozhiyong 于 2013-7-22 18:29 编辑 3 G  k5 c, L# u" Z! S$ i* ^
woaishuijia 发表于 2013-7-22 01:46 static/image/common/back.gif
" `- Z2 H$ Y1 G
非常感谢版主的回复
7 |3 x. r- I. Z5 w- v, n对于我知道应该放弃5个命令的结果,该方案是行得通的,
$ G% b* @, @' h; z4 B3 ^( q但如果我是一个选集,且我也不知道要返回多少个命令的时候,就不适用该办法了。' ]# H  e  ^& t) k' u
有没有一个办法,可以把我的程序打一个包,就是一个整体,执行,放弃,都是一步
, w  C: y. m5 U) C8 E/ A: ~/ R/ Y如下面程序
; M9 z; d* ^! n6 x9 n" ~- L
7 o8 m, O: o+ y* ^7 Q: O(defun c:yd (/ s b p0 n0 ss a0 a s0 p00)  
  P  x+ `/ x( `' T) i  (setvar "cmdecho" 0)(setq old_osm (getvar "osmode")) (setvar "osmode" 0)
. p+ O+ U! L* Q' Y  (setq s (ssget) p1 (list 0 0))0 t; _8 ?% A) s1 }, A) \2 d" [
  (setq s (ssget "p" '((0 . "circle")))/ J, N: C+ y5 A/ ?( }
  );新建圆选集
$ w, C; J2 I+ G. {( D$ x) C  (command "copybase" p1 s "")  (command "pasteblock" p1)
  C/ |' i1 T) t- w  n' P  (setq n0  (-(sslength s) 1) a (ssadd))0 L  P3 t, M6 t% F/ ]/ ^
  (if (= n0 -1) (exit))8 u- a2 v& ]6 y& T+ N, U! j
  (repeat n0
4 ^& N/ H- W9 Z) l' [( M: @( Z; k   (setq ss (ssname s 0)  p0 (czy_yxd ss) )
- |' q( O9 l) h, u   (if (/= p0 p00)(progn& }) b7 j: U- }* j7 S0 N
     (command "POINT" p0)& s* A0 v) Y: x$ y9 q6 H
     (setq a0 (entlast) a (ssadd a0 a)); I+ m; Q/ [5 H- y: C
     )( j( ^- B$ a: N# ]9 L' [( y
   )% \- b2 L- }; Q( z9 [) Z7 K1 e
   (setq p00 p0)! h7 E  v3 O1 @6 I4 R# H
   (ssdel ss s)(command "erase" ss "")
5 N9 W0 M! c. `% g  )7 E- j/ n" c0 F- o! ~
   (setq ss (ssname s 0)  p0 (czy_yxd ss) )
  C5 v, Q9 y; K0 I! P. l/ M2 c' a   (if (/= p0 p00) (progn
9 j5 t/ S3 Y4 T/ N4 {! K        (command "POINT" p0)
6 b" m7 ?$ @" D1 _2 I        (setq a0 (entlast) a (ssadd a0 a))4 ?9 v$ O/ g# p( T
        )
9 O2 i! p: r% x     )
" t6 s; d2 Y7 Z   (command "erase" ss "")+ E) G9 W! g; x' Y* l1 R
   (command "copybase" p0 a "") (command "erase" a "")(command "pasteblock" p0)
( D$ I: `. u% a" V3 v (setvar "osmode" old_osm)(setvar "cmdecho" 1)4 {$ S) J3 L' x" w5 P& p, W
(princ)
- y% S/ E+ t7 c$ s* S- d9 X5 i);框选圆,并删除圆,在圆心处添加点
& q/ b+ U% L. r6 i$ O: e
发表于 2013-7-22 18:18:17 | 显示全部楼层 来自: 中国吉林吉林市
那你就声明一个局部变量专门用于记录之前执行了多少个命令啊
 楼主| 发表于 2013-7-22 18:32:14 | 显示全部楼层 来自: 中国江苏常州
woaishuijia 发表于 2013-7-22 18:18 static/image/common/back.gif3 ?( k9 d: U" k5 F1 u! g
那你就声明一个局部变量专门用于记录之前执行了多少个命令啊

7 ^3 ]& \( e- f没有弄过,不会, r9 \: f$ D( f1 `: K
版主,能不能帮我在以上程序里,添加一下啊
: U- d& ^7 y1 |& Y- U5 @2 c谢谢啊
1 G9 [3 B, \# P% H: _  X/ ]
 楼主| 发表于 2013-7-22 18:38:48 | 显示全部楼层 来自: 中国江苏常州
woaishuijia 发表于 2013-7-22 18:18 static/image/common/back.gif
% w( z$ Z9 c2 E9 w$ j  T2 {那你就声明一个局部变量专门用于记录之前执行了多少个命令啊
1 A& o: }" O- J0 ?4 \( W$ ]
QQ图片20130722183435.jpg
5 B! o; _2 l- d+ x上面是燕秀工具箱里的文字成线命令
' u  S3 g0 y/ C" H+ k. X2 |& H我爆炸成线后,发现不对,我按“CTRA+Z”后出现的代码
, C8 ^0 Z+ `* d( o9 L/ c' J版主知道,该程序是如何办到的吗?
  Y- D3 U, X# `/ D1 }' D( O
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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