QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 2010caozhiyong 于 2013-7-21 10:26 编辑 8 X8 `( j6 i. G- z$ i

: X" _$ p6 h) d1 g# g小弟一直有个困惑,自己编了很多程序,尤其是一些有循环的很长程序,结果画出来之后,发现画错了' Z3 ^( K. c( m
然后,我就按放弃命令(Ctrl+Z)结果要按上几分钟才能一步一步的返回的最初状态
+ j& a3 g9 l/ Y  f% ]我简单复制了一个程序,如下,怎样添加内容,使该程序能成为一个整体,就像CAD内部程序一样,一步就可以返回到最初状态,谢谢
/ a4 o, ^+ P% l; |1 E8 Y. v; G3 \5 @2 n2 u2 w  l9 n. x) x+ N- _. `, a/ v
(defun c:xy(/ p czy_p)
8 o" q9 I- u* @* a(setq p (GETPOINT "选择中心点:"))# ^1 Z1 r5 D$ @1 S; X
(setq old_lay (getvar "clayer"))$ P: ?! W. f4 d) v
(COMMAND "LAYER" "n" "center" "set" "center" "")5 B- ^  C. _# ?+ q, q( x
(command "line" p pause "")- J) e% B4 U: F7 X
(setq czy_p (entlast))8 B+ `5 H5 t% c2 I/ V1 H
(command "ROTATE" czy_p "" p "c" "90")
4 A! t8 K3 }0 I) @: ?* f& M. |(command "ROTATE" czy_p "" p "c" "180")
6 x, V: @" h% i5 m(command "ROTATE" czy_p "" p "c" "270")
% h4 o5 |! T, Z8 g(setvar "clayer" old_lay)6 ?& C0 m4 R! g/ Q
(prin1)0 v! p7 g6 T) j# I( i
);绘制圆的中心线
" {7 O0 v4 |" y0 I  y8 O5 D8 r3 N* z2 u3 d- e# S) E; ?
 楼主| 发表于 2013-7-21 12:11:21 | 显示全部楼层 来自: 中国江苏常州
本帖最后由 2010caozhiyong 于 2013-7-21 12:14 编辑 # X" R3 Q6 ^' n: B/ S6 C% u
5 f1 B- Z; G# d
解释一下,可能朋友们没有听清楚意思' e- A  p& A9 m" d# j% K! }
就是我程序编好了,加载后,在CAD窗口下运行后,发现我的画出来的图形不太对,想返回后重新画
4 r4 K! r% R% k  z6 c但是,我在cad里用(Ctra+Z)命令,要一直按好久好久,才能一步一步的返回到我运行这个程序之前的状态
& S, ^+ {: D# f我现在想一步就返回到最初的状态,怎么修改程序呢?
+ c8 {- |0 G1 |就像cad内部命令一样,阵列了好多图元,我发现不对,想放弃,直接按一下(Ctra+Z)就行了,不要按好多下
发表于 2013-7-22 01:46:33 | 显示全部楼层 来自: 中国吉林吉林市
本帖最后由 woaishuijia 于 2013-7-22 01:48 编辑
# ~" w) U3 y% t! L# t+ K9 Q4 n
  1. (defun c:xy (/ p old_lay czy_p)$ Y; S5 j- O  i+ v' j
  2.   (setq p (GETPOINT "选择中心点:"))
    6 d8 \" U* y- s' {% V
  3.   (setq old_lay (getvar "clayer"))+ \  z) R7 ^6 v& Z3 A! ^
  4.   (COMMAND "LAYER" "n" "center" "set" "center" "")% R4 F# R5 Q+ c+ G
  5.   (command "line" p pause "")8 D; v( Q7 G8 @- q+ t/ e
  6.   (setq czy_p (entlast))) g. C+ Q3 L/ d% H4 s5 q+ x: ?4 K" |
  7.   (command "ROTATE" czy_p "" p "c" "90")
    5 O9 `' G* |; S) V  S
  8.   (command "ROTATE" czy_p "" p "c" "180")/ [% u/ t7 w/ V. q8 q5 D6 E* k! ~
  9.   (command "ROTATE" czy_p "" p "c" "270")
    * `, G! Y  a) v. B& V
  10.   (setvar "clayer" old_lay)" s9 |9 I  X+ y5 ]% l0 C; D
  11.   (initget 0 "u")                        ;定义关键字4 y- r# z3 @( m- [+ @0 g( k( z: J
  12.   (if (= (getkword "\n确定或 [放弃(U)]:") "u");检查用户输入的关键字决定是否放弃; D3 O: {3 n" ~5 D. C
  13.     (repeat 5 (command "u"))  ;放弃前面5个命令的结果% i$ Y8 z# V8 |! J! D' v9 P9 l! m
  14. ;;;    (command "undo" 5)1 T: u+ W9 k# |. {( w& _( a
  15.   )+ M  C5 |* A( y
  16.   (prin1), l! q: S7 s2 w8 J2 m/ d# w6 Y
  17. )                                        ;绘制圆的中心线
复制代码
 楼主| 发表于 2013-7-22 18:14:26 | 显示全部楼层 来自: 中国江苏常州
本帖最后由 2010caozhiyong 于 2013-7-22 18:29 编辑
1 G$ X) J  \5 L9 n$ [9 k3 U
woaishuijia 发表于 2013-7-22 01:46 static/image/common/back.gif

5 q/ t# d: N, q非常感谢版主的回复" S# e% }2 e2 B0 R8 l- D
对于我知道应该放弃5个命令的结果,该方案是行得通的,0 [, J! J% Q7 \) w5 i
但如果我是一个选集,且我也不知道要返回多少个命令的时候,就不适用该办法了。2 z2 R* |4 r, Z) Y
有没有一个办法,可以把我的程序打一个包,就是一个整体,执行,放弃,都是一步
  j+ Y9 f. t/ S! v0 M8 \如下面程序
- |5 C; C- i; E0 ^0 w0 X# @6 H; d" w, p
(defun c:yd (/ s b p0 n0 ss a0 a s0 p00)  
/ I, S: Y$ S. `  (setvar "cmdecho" 0)(setq old_osm (getvar "osmode")) (setvar "osmode" 0)
. c4 o( o" y% I* R0 _, p3 ^' S  (setq s (ssget) p1 (list 0 0))
. {  F" a4 A( R1 n7 E  (setq s (ssget "p" '((0 . "circle")))
' I3 Y0 q+ c+ h! c  );新建圆选集  p/ B& p6 k/ }8 k! X7 F. s
  (command "copybase" p1 s "")  (command "pasteblock" p1)
, i7 H# J( I* Q( ?  (setq n0  (-(sslength s) 1) a (ssadd))8 f: m/ t; a; n- [( j7 c
  (if (= n0 -1) (exit))
, J9 V$ N) p. f& {' _; s  (repeat n0
; A, }% e( h; j3 ^5 O# c+ s   (setq ss (ssname s 0)  p0 (czy_yxd ss) )
  H4 R4 ^2 D% F/ ]   (if (/= p0 p00)(progn
0 d3 J; W4 W+ Q1 n( |- N* z     (command "POINT" p0)
. R/ ^# z% ^% K" G$ l2 Q     (setq a0 (entlast) a (ssadd a0 a))
; e( L4 I: r- q7 c5 I     )* ~6 r: K2 [- E
   ). R5 A" L! `. T9 e
   (setq p00 p0)/ X2 @! M% o; Z8 y2 }$ e2 I7 [
   (ssdel ss s)(command "erase" ss "")
6 j- Z" P( y% L; q  )
9 _! ?1 l  t( `   (setq ss (ssname s 0)  p0 (czy_yxd ss) )+ r: ?& n& u2 L) `- q+ n! A) F
   (if (/= p0 p00) (progn9 V. K  h3 B; M4 a! l  r
        (command "POINT" p0)
& U/ d/ a% V+ W+ }% ~        (setq a0 (entlast) a (ssadd a0 a))( F1 g2 |1 ?& K
        )
" P- w! E" e" i4 G     )
$ n# f/ ~$ e, n   (command "erase" ss "")
4 H: f( P# F1 E0 I  j' a   (command "copybase" p0 a "") (command "erase" a "")(command "pasteblock" p0)1 }5 o$ Z3 {  k+ k4 Y! Q6 w
(setvar "osmode" old_osm)(setvar "cmdecho" 1)' v# y' _7 _' t" ^* b, \
(princ)
) k3 s6 J; p0 a);框选圆,并删除圆,在圆心处添加点7 m$ G% [3 L/ J# i4 H6 j& R
发表于 2013-7-22 18:18:17 | 显示全部楼层 来自: 中国吉林吉林市
那你就声明一个局部变量专门用于记录之前执行了多少个命令啊
 楼主| 发表于 2013-7-22 18:32:14 | 显示全部楼层 来自: 中国江苏常州
woaishuijia 发表于 2013-7-22 18:18 static/image/common/back.gif
6 z0 h4 L. c8 v6 B" h* C那你就声明一个局部变量专门用于记录之前执行了多少个命令啊

% a$ @/ [$ O! M& S8 i0 i没有弄过,不会
% G4 d! f. [$ k: \版主,能不能帮我在以上程序里,添加一下啊
! L0 ]! T' R4 U. \1 t, A- H+ {谢谢啊
4 b: U) {% f5 k3 W1 R
 楼主| 发表于 2013-7-22 18:38:48 | 显示全部楼层 来自: 中国江苏常州
woaishuijia 发表于 2013-7-22 18:18 static/image/common/back.gif
2 B' E1 K; n* N% t5 n那你就声明一个局部变量专门用于记录之前执行了多少个命令啊

/ T9 I- T4 s& c& b5 e. R+ { QQ图片20130722183435.jpg * Q9 u; {& w8 v' Y
上面是燕秀工具箱里的文字成线命令) w* u- D2 L% S
我爆炸成线后,发现不对,我按“CTRA+Z”后出现的代码" f  a% t1 x# C" k
版主知道,该程序是如何办到的吗?
' |1 `, c( \) d# l1 I: N: U
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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