QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 2010caozhiyong 于 2013-7-21 10:26 编辑
! h) i& u& a3 h) H& E6 l4 z
) k5 |. r9 T6 V" {小弟一直有个困惑,自己编了很多程序,尤其是一些有循环的很长程序,结果画出来之后,发现画错了" L# S8 ]! r  [$ q; {" N3 F& S% z
然后,我就按放弃命令(Ctrl+Z)结果要按上几分钟才能一步一步的返回的最初状态1 R" o9 b! o6 C- q1 y
我简单复制了一个程序,如下,怎样添加内容,使该程序能成为一个整体,就像CAD内部程序一样,一步就可以返回到最初状态,谢谢2 X4 e- z$ z4 E* |) `

" l" _2 L' s6 {& l(defun c:xy(/ p czy_p)6 e% H0 e+ q0 R0 P- o
(setq p (GETPOINT "选择中心点:"))
$ t& r2 U+ ~8 C) N1 F1 K- ?  o8 ~(setq old_lay (getvar "clayer"))
: X  r. ?$ P; w0 _0 c% J$ c(COMMAND "LAYER" "n" "center" "set" "center" ""), C6 H/ E5 w1 V0 N) `' ]
(command "line" p pause "")
" l. D$ t  q( g) Y; k0 x: F/ t(setq czy_p (entlast))5 f4 H0 H* U) X5 f2 u
(command "ROTATE" czy_p "" p "c" "90")2 {, T; v* l$ X3 C7 k1 @2 Q
(command "ROTATE" czy_p "" p "c" "180")0 G/ U( W/ ^8 P+ q9 P/ r1 Q
(command "ROTATE" czy_p "" p "c" "270")
; o% @& `& C) s/ E: n(setvar "clayer" old_lay)
0 i8 Q. I& f& c8 a(prin1)9 }5 L$ ?" S+ q' {4 `6 e* E
);绘制圆的中心线
. j# T# M  n9 F( h# X8 i- [) s* g, s* i0 m) m& i9 q. o' S1 K
 楼主| 发表于 2013-7-21 12:11:21 | 显示全部楼层 来自: 中国江苏常州
本帖最后由 2010caozhiyong 于 2013-7-21 12:14 编辑 " m$ W  C  t# m+ Q" d% S  r( t
& j+ Q. u, S+ y5 I; m& }
解释一下,可能朋友们没有听清楚意思% F9 g' j8 K+ O1 z# T9 u; n2 p- F
就是我程序编好了,加载后,在CAD窗口下运行后,发现我的画出来的图形不太对,想返回后重新画6 C9 p8 \* N& l( i: ^
但是,我在cad里用(Ctra+Z)命令,要一直按好久好久,才能一步一步的返回到我运行这个程序之前的状态
6 z7 l3 U* ]- B& d; Y9 q我现在想一步就返回到最初的状态,怎么修改程序呢?
+ {7 E& K/ }' m5 g+ ^1 L就像cad内部命令一样,阵列了好多图元,我发现不对,想放弃,直接按一下(Ctra+Z)就行了,不要按好多下
发表于 2013-7-22 01:46:33 | 显示全部楼层 来自: 中国吉林吉林市
本帖最后由 woaishuijia 于 2013-7-22 01:48 编辑
7 K  ]7 K, [9 p8 `9 D: ^5 ^
  1. (defun c:xy (/ p old_lay czy_p)# j/ \: v: X/ r1 l& S6 n
  2.   (setq p (GETPOINT "选择中心点:"))7 [! {$ z* e: Q! ]9 E: g& w
  3.   (setq old_lay (getvar "clayer"))
    1 q  j- z* t: \' W
  4.   (COMMAND "LAYER" "n" "center" "set" "center" "")
    8 Q/ W  W0 J7 u  S
  5.   (command "line" p pause "")
    ( O! {3 M0 h8 H- {+ \* x$ `- Y8 D" X
  6.   (setq czy_p (entlast))
    & s& N$ M6 F7 D- N4 @
  7.   (command "ROTATE" czy_p "" p "c" "90")% s! G* w+ \9 ]1 U& Z  I, b6 \
  8.   (command "ROTATE" czy_p "" p "c" "180")
    ) J4 G$ |0 K- E+ `2 \. y
  9.   (command "ROTATE" czy_p "" p "c" "270")- g/ S  s# A7 c, W6 n' l
  10.   (setvar "clayer" old_lay)
    - H. T' K$ E! Y5 h3 t
  11.   (initget 0 "u")                        ;定义关键字1 c% q. z3 g% D  d' U4 b0 R
  12.   (if (= (getkword "\n确定或 [放弃(U)]:") "u");检查用户输入的关键字决定是否放弃$ D& Y8 V  i% d# a: Q2 D% w
  13.     (repeat 5 (command "u"))  ;放弃前面5个命令的结果( }& t  a; \/ ~: A
  14. ;;;    (command "undo" 5): K0 z4 f0 {; f
  15.   )
    # z( Y: n0 U* r$ _! T
  16.   (prin1)
    + q2 M: n, {" J" ~
  17. )                                        ;绘制圆的中心线
复制代码
 楼主| 发表于 2013-7-22 18:14:26 | 显示全部楼层 来自: 中国江苏常州
本帖最后由 2010caozhiyong 于 2013-7-22 18:29 编辑
4 o/ e! _# @3 Y0 @0 w$ d
woaishuijia 发表于 2013-7-22 01:46 static/image/common/back.gif
. q" u8 g5 R$ p( k
非常感谢版主的回复
* o/ J% H3 B& d: ]对于我知道应该放弃5个命令的结果,该方案是行得通的,* ?  F+ @+ G, c( b
但如果我是一个选集,且我也不知道要返回多少个命令的时候,就不适用该办法了。' R: U* x4 O, y1 y
有没有一个办法,可以把我的程序打一个包,就是一个整体,执行,放弃,都是一步3 Z% R" n8 O* W/ l3 k. V* b
如下面程序. Q/ W9 l9 s- O4 G5 _

8 y6 D" @3 j! v(defun c:yd (/ s b p0 n0 ss a0 a s0 p00)  
# ]$ n4 e7 c- Z1 U: a: c! O  (setvar "cmdecho" 0)(setq old_osm (getvar "osmode")) (setvar "osmode" 0)* p* Q* w/ ^6 z2 g
  (setq s (ssget) p1 (list 0 0))
1 j# X- J( B! V. M  (setq s (ssget "p" '((0 . "circle")))
: c. ~2 ~3 l( c* K  );新建圆选集
% u& l( Z+ z1 e5 N$ C  (command "copybase" p1 s "")  (command "pasteblock" p1)# A3 W5 X( D" P; {  B/ l
  (setq n0  (-(sslength s) 1) a (ssadd))
; v( V) u$ T4 s* s  (if (= n0 -1) (exit))3 S4 y4 Y2 d' B0 ]5 o3 y- _
  (repeat n04 c) [1 {) h: O4 l
   (setq ss (ssname s 0)  p0 (czy_yxd ss) )
0 r2 {  Y. a  J, y1 s  q; `   (if (/= p0 p00)(progn$ s) ?$ D7 A  U7 N
     (command "POINT" p0)
# y( {3 V9 K+ L2 s- e7 Z     (setq a0 (entlast) a (ssadd a0 a))
' _' w# w. o% S' J     )
% a* ]6 I. Y2 |, o) e' y# R/ j5 [   )
, C5 X; S" N( B$ K8 ?# a   (setq p00 p0)
1 P& W/ C3 p- u- Y2 Y   (ssdel ss s)(command "erase" ss "")
. Q1 _" S% B% S# o  )
% h- G3 `- y3 |2 O7 S   (setq ss (ssname s 0)  p0 (czy_yxd ss) )
, t" z3 F; P, P9 R, B3 I7 J/ ]   (if (/= p0 p00) (progn
! `% u' A! u0 H0 b  Z* d        (command "POINT" p0): r! e; h8 A4 @9 T; {2 Y
        (setq a0 (entlast) a (ssadd a0 a))
' n7 B, i; N9 s3 K: T        )
8 S* s; F6 a5 W3 q8 [; `  i     )
; ^) c0 S5 P8 X4 ~* D: |   (command "erase" ss "")
3 _7 T5 ?  v5 e$ x* @   (command "copybase" p0 a "") (command "erase" a "")(command "pasteblock" p0)
) A: ~8 t( C3 V) M (setvar "osmode" old_osm)(setvar "cmdecho" 1)
! F; V/ L" S. y1 @4 d$ s (princ)
' d- b2 A. P: d, w);框选圆,并删除圆,在圆心处添加点
- a+ k3 ?5 j* d; V5 [$ F
发表于 2013-7-22 18:18:17 | 显示全部楼层 来自: 中国吉林吉林市
那你就声明一个局部变量专门用于记录之前执行了多少个命令啊
 楼主| 发表于 2013-7-22 18:32:14 | 显示全部楼层 来自: 中国江苏常州
woaishuijia 发表于 2013-7-22 18:18 static/image/common/back.gif4 z! k4 Q  p5 o3 E8 w8 D: q
那你就声明一个局部变量专门用于记录之前执行了多少个命令啊

) H* o: S- w' s! P0 v% X4 ]8 ~没有弄过,不会
2 O# X* i# @8 g5 G$ h版主,能不能帮我在以上程序里,添加一下啊
8 J' K% C, ?: R2 p( d谢谢啊$ ?- z" M( b/ I3 t. `
 楼主| 发表于 2013-7-22 18:38:48 | 显示全部楼层 来自: 中国江苏常州
woaishuijia 发表于 2013-7-22 18:18 static/image/common/back.gif
9 v0 \% f3 E  l2 v( j" J那你就声明一个局部变量专门用于记录之前执行了多少个命令啊

* `! S! t1 w) @1 ^! j2 [7 q( F3 k QQ图片20130722183435.jpg ( {7 {- p4 o, k7 H0 k. `- k
上面是燕秀工具箱里的文字成线命令& l: C- t# x9 M2 N* N0 c
我爆炸成线后,发现不对,我按“CTRA+Z”后出现的代码
$ J0 ?- s; \+ k- v+ Z0 k版主知道,该程序是如何办到的吗?
1 K6 s. T8 \& X5 U# n8 y# l: O
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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