QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 2010caozhiyong 于 2013-7-21 10:26 编辑 7 }) _0 g/ T$ t. g" j$ g+ I* [
9 w# Y9 C) ]$ [- m. Q
小弟一直有个困惑,自己编了很多程序,尤其是一些有循环的很长程序,结果画出来之后,发现画错了2 T' i% w7 t1 D: _) {% g9 |
然后,我就按放弃命令(Ctrl+Z)结果要按上几分钟才能一步一步的返回的最初状态7 X, h  r2 g3 ?5 a  T* n
我简单复制了一个程序,如下,怎样添加内容,使该程序能成为一个整体,就像CAD内部程序一样,一步就可以返回到最初状态,谢谢
" n0 n0 @3 {0 A4 B; ~
0 ], ^" D9 e9 M  V+ H; C5 A+ h(defun c:xy(/ p czy_p)
  h" A# J+ r8 E0 s/ C# J4 `(setq p (GETPOINT "选择中心点:"))5 |3 Z6 h0 F$ G1 R
(setq old_lay (getvar "clayer"))
+ ~5 L- ?5 k1 a# N. Q' s# U& Q(COMMAND "LAYER" "n" "center" "set" "center" "")  f/ o3 \& J6 I
(command "line" p pause "")
: S3 J/ _, T9 A5 G/ k(setq czy_p (entlast))! a* X" x4 d- d% P% p5 N% W$ J
(command "ROTATE" czy_p "" p "c" "90")  u3 B( a* G! q
(command "ROTATE" czy_p "" p "c" "180")
8 w# Q$ W3 Y8 ?: }+ g- M0 I7 b(command "ROTATE" czy_p "" p "c" "270")
& Z3 o$ }# q# P/ F  U/ Y* |(setvar "clayer" old_lay)) p$ ^- G8 H* ~7 a/ A% F6 ]3 N  u
(prin1). }' k. o4 @5 s! w
);绘制圆的中心线
2 E5 Y4 v& \9 g* G6 Z0 V+ C, ^& X2 w5 D
 楼主| 发表于 2013-7-21 12:11:21 | 显示全部楼层 来自: 中国江苏常州
本帖最后由 2010caozhiyong 于 2013-7-21 12:14 编辑   k" B3 w" ]3 H

: x3 s7 V. n3 g# D" f% ~6 M解释一下,可能朋友们没有听清楚意思
2 w; ^& c" q$ ^9 k, V  g就是我程序编好了,加载后,在CAD窗口下运行后,发现我的画出来的图形不太对,想返回后重新画+ w0 M) A% G/ x( u6 f
但是,我在cad里用(Ctra+Z)命令,要一直按好久好久,才能一步一步的返回到我运行这个程序之前的状态* L1 K- N3 x/ Z
我现在想一步就返回到最初的状态,怎么修改程序呢?
/ N6 i/ K1 g, H$ u( p就像cad内部命令一样,阵列了好多图元,我发现不对,想放弃,直接按一下(Ctra+Z)就行了,不要按好多下
发表于 2013-7-22 01:46:33 | 显示全部楼层 来自: 中国吉林吉林市
本帖最后由 woaishuijia 于 2013-7-22 01:48 编辑
4 W) Q' ~/ B$ Q: p
  1. (defun c:xy (/ p old_lay czy_p)! p1 N& [, ?# E. G& y1 {
  2.   (setq p (GETPOINT "选择中心点:"))/ z1 S9 }- ~* v9 E+ V
  3.   (setq old_lay (getvar "clayer"))
    ) t, G" L( f$ X
  4.   (COMMAND "LAYER" "n" "center" "set" "center" "")
    5 J9 h& {* `1 x2 z* j
  5.   (command "line" p pause "")
    * ]+ S( n3 D1 Q' b
  6.   (setq czy_p (entlast))" Y6 j# |) F6 S
  7.   (command "ROTATE" czy_p "" p "c" "90"). `" D. Q9 L2 _1 B& ~: x9 g
  8.   (command "ROTATE" czy_p "" p "c" "180")  _% K# F: l: q  E# D$ Z+ B) j- Y% u
  9.   (command "ROTATE" czy_p "" p "c" "270")) o( E" a5 S0 o! h4 D* L+ c6 N
  10.   (setvar "clayer" old_lay)
      a( S4 `* d0 ]
  11.   (initget 0 "u")                        ;定义关键字2 Q  g, N- I5 ?6 _' d* j) C
  12.   (if (= (getkword "\n确定或 [放弃(U)]:") "u");检查用户输入的关键字决定是否放弃
    / G2 I. J. `, }; q5 I! G& K0 {
  13.     (repeat 5 (command "u"))  ;放弃前面5个命令的结果
    " u$ P: B+ ~) e: t, L* w6 K- {
  14. ;;;    (command "undo" 5)
    - ?! _6 ?% u) ]
  15.   )
    / F$ J. n* V" z  R) e+ H
  16.   (prin1)
    . a0 t$ b, v1 {% o  z
  17. )                                        ;绘制圆的中心线
复制代码
 楼主| 发表于 2013-7-22 18:14:26 | 显示全部楼层 来自: 中国江苏常州
本帖最后由 2010caozhiyong 于 2013-7-22 18:29 编辑
. ]* `" \/ E0 l0 q% _
woaishuijia 发表于 2013-7-22 01:46 static/image/common/back.gif

* v: j4 F- A# _0 Q* l8 l; @# [非常感谢版主的回复: O: v* v/ l4 F. z0 l
对于我知道应该放弃5个命令的结果,该方案是行得通的,
4 b- r, L; Z7 G& S但如果我是一个选集,且我也不知道要返回多少个命令的时候,就不适用该办法了。
, v$ x: v* J, m有没有一个办法,可以把我的程序打一个包,就是一个整体,执行,放弃,都是一步
/ F& q! z0 E$ L4 u4 U如下面程序3 ?  b0 Z/ u- B' ]) d+ q
! P2 E: V+ o8 o4 y" J' S, l4 Y1 s
(defun c:yd (/ s b p0 n0 ss a0 a s0 p00)  ! t0 a: O, t8 G) r- M; S
  (setvar "cmdecho" 0)(setq old_osm (getvar "osmode")) (setvar "osmode" 0)
; A4 N9 c$ G4 d: M" L# ^: A  \4 W  (setq s (ssget) p1 (list 0 0))6 @! m: N  h! N6 {2 I
  (setq s (ssget "p" '((0 . "circle")))
4 X" |( c; ?) \  }0 c! V: p; \  );新建圆选集
' \0 ?9 `3 B9 I  (command "copybase" p1 s "")  (command "pasteblock" p1)
) ~; M. @& d4 ]7 }  (setq n0  (-(sslength s) 1) a (ssadd))
; c0 ]5 `7 `" v! t+ i$ o  (if (= n0 -1) (exit))+ M/ e2 j0 b& i* u  @/ q- ]0 Y
  (repeat n0* Z% ~8 ]9 M6 j  o7 W+ n
   (setq ss (ssname s 0)  p0 (czy_yxd ss) ). T% L5 c9 Y& w; Z2 {: \* P
   (if (/= p0 p00)(progn
+ \9 J1 G7 z; j6 I/ t     (command "POINT" p0)( w( H9 U. ^& O+ M0 D; e8 t+ m, {( Q
     (setq a0 (entlast) a (ssadd a0 a))! k/ h! |+ z$ u
     )
: H0 k, i7 Z+ h   )
3 `2 w+ [. v0 M3 S   (setq p00 p0)
8 ]7 M& u5 R: H5 `* d   (ssdel ss s)(command "erase" ss "")
% j; m& [0 V; y0 W. b' Z  )0 u& r4 Y" s' @  V  D
   (setq ss (ssname s 0)  p0 (czy_yxd ss) )
& e# M. L2 t" o4 g, ~- D  i   (if (/= p0 p00) (progn  I  }7 S' w+ O* f
        (command "POINT" p0). [7 G& A7 |- p6 e& ]
        (setq a0 (entlast) a (ssadd a0 a))7 ^% a7 O( ^% n4 L" M
        )- [8 C5 \2 U; ^+ e3 V3 q8 ^
     )* c! c, {& `% A/ w  L3 S
   (command "erase" ss "")
& I7 ?; H& I+ O   (command "copybase" p0 a "") (command "erase" a "")(command "pasteblock" p0)* N- \/ E/ g! d; q& Q* Q+ }
(setvar "osmode" old_osm)(setvar "cmdecho" 1)
6 c" v' ]) I0 y" s5 L$ \$ I0 z (princ)  x8 N7 t" {# h3 f' s: `
);框选圆,并删除圆,在圆心处添加点+ j& a  p9 k. H) M! X' \# a7 Z' J
发表于 2013-7-22 18:18:17 | 显示全部楼层 来自: 中国吉林吉林市
那你就声明一个局部变量专门用于记录之前执行了多少个命令啊
 楼主| 发表于 2013-7-22 18:32:14 | 显示全部楼层 来自: 中国江苏常州
woaishuijia 发表于 2013-7-22 18:18 static/image/common/back.gif
8 g" e1 W( l5 d* h8 m/ K0 x那你就声明一个局部变量专门用于记录之前执行了多少个命令啊

9 N: \  }( [, i( I1 I& a2 x; S4 {没有弄过,不会
7 V; s! C+ f7 K; l版主,能不能帮我在以上程序里,添加一下啊6 h; _# s1 z+ [+ c6 O( M  u
谢谢啊
5 w1 C( L3 Z5 y6 j
 楼主| 发表于 2013-7-22 18:38:48 | 显示全部楼层 来自: 中国江苏常州
woaishuijia 发表于 2013-7-22 18:18 static/image/common/back.gif
: |' w& c  h1 d  U那你就声明一个局部变量专门用于记录之前执行了多少个命令啊
2 W( a3 v$ @3 q
QQ图片20130722183435.jpg % }2 C  t  G$ L
上面是燕秀工具箱里的文字成线命令
! Q. D4 ?7 A8 b! g: }; u0 }. @# n我爆炸成线后,发现不对,我按“CTRA+Z”后出现的代码
1 ^  ~; V8 w4 h! v- L版主知道,该程序是如何办到的吗?& C3 R  X# H$ m4 P
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

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