QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
goto3d 说: 版主微信号:caivin811031;还未入三维微信群的小伙伴,速度加
2022-07-04
全站
goto3d 说: 此次SW竞赛获奖名单公布如下,抱歉晚了,版主最近太忙:一等奖:塔山817;二等奖:a9041、飞鱼;三等奖:wx_dfA5IKla、xwj960414、bzlgl、hklecon;请以上各位和版主联系,领取奖金!!!
2022-03-11
查看: 4864|回复: 6
收起左侧

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

[复制链接]
发表于 2013-7-21 10:24:48 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 2010caozhiyong 于 2013-7-21 10:26 编辑
; H! ]; j- `  P. O3 D& d. {4 u" E- o% o7 A8 ]
小弟一直有个困惑,自己编了很多程序,尤其是一些有循环的很长程序,结果画出来之后,发现画错了
4 p& U) b( n) P# T' o& r% d然后,我就按放弃命令(Ctrl+Z)结果要按上几分钟才能一步一步的返回的最初状态4 i& N$ V5 _! ^# t7 O( z
我简单复制了一个程序,如下,怎样添加内容,使该程序能成为一个整体,就像CAD内部程序一样,一步就可以返回到最初状态,谢谢  N3 T7 k2 U, K% i" [

/ H8 _( I; _6 _3 s(defun c:xy(/ p czy_p)- @7 G; Y3 N, J7 o
(setq p (GETPOINT "选择中心点:"))9 z' ?% }+ @5 S0 d- b) U. x+ M+ I
(setq old_lay (getvar "clayer"))8 S/ U2 N8 Q8 F4 X! w
(COMMAND "LAYER" "n" "center" "set" "center" "")2 T# [+ l; R( q( z3 Z5 v
(command "line" p pause "")
# V7 {2 f6 O- ^( R( f(setq czy_p (entlast))4 J  Q* H5 U0 b. |* Z
(command "ROTATE" czy_p "" p "c" "90")
* s$ |* U: N  G  [(command "ROTATE" czy_p "" p "c" "180")
1 J( P" A* A5 r" \4 k  n(command "ROTATE" czy_p "" p "c" "270")( _/ u+ p; C' z4 q# P
(setvar "clayer" old_lay)
+ U0 ]3 I6 M1 `% L: ^3 W  E(prin1)
! I6 F% ^7 l% x);绘制圆的中心线
$ n4 c; @6 ?6 z8 T0 w" r; x
* y/ x- C) v3 f) g9 G& r
 楼主| 发表于 2013-7-21 12:11:21 | 显示全部楼层
本帖最后由 2010caozhiyong 于 2013-7-21 12:14 编辑 , L- Y/ f- D- M1 F
2 z* s9 T% \. x  g
解释一下,可能朋友们没有听清楚意思  R; ~# @# Z; P5 `) U% R/ j6 b
就是我程序编好了,加载后,在CAD窗口下运行后,发现我的画出来的图形不太对,想返回后重新画
/ D7 y* B$ s: ~1 R0 A( {但是,我在cad里用(Ctra+Z)命令,要一直按好久好久,才能一步一步的返回到我运行这个程序之前的状态
2 j8 D! j! m, ?+ M9 z: m7 r我现在想一步就返回到最初的状态,怎么修改程序呢?: H( {8 _, E9 s" T( ?5 t6 \8 d
就像cad内部命令一样,阵列了好多图元,我发现不对,想放弃,直接按一下(Ctra+Z)就行了,不要按好多下
发表于 2013-7-22 01:46:33 | 显示全部楼层
本帖最后由 woaishuijia 于 2013-7-22 01:48 编辑
. Z- [1 r, B" T# S
  1. (defun c:xy (/ p old_lay czy_p)6 t  p: Y" Q- c) n8 L
  2.   (setq p (GETPOINT "选择中心点:")), f7 H6 U- I2 z) D; E. c
  3.   (setq old_lay (getvar "clayer"))
    $ J% Q7 m+ B' y
  4.   (COMMAND "LAYER" "n" "center" "set" "center" "")
    - ~; O5 ]/ y* O: {: j
  5.   (command "line" p pause "")* C6 Q! B, S  c! h) l" L9 S/ Z
  6.   (setq czy_p (entlast))
    ( G6 Q" D% r8 q4 e, k
  7.   (command "ROTATE" czy_p "" p "c" "90"); W$ u/ b4 I: |7 i
  8.   (command "ROTATE" czy_p "" p "c" "180")
    " z1 a+ D+ J: E
  9.   (command "ROTATE" czy_p "" p "c" "270")
    7 k0 p" [4 U% U
  10.   (setvar "clayer" old_lay)" m4 k* ?. J; q% X
  11.   (initget 0 "u")                        ;定义关键字1 h* x( i- G; y) v: w
  12.   (if (= (getkword "\n确定或 [放弃(U)]:") "u");检查用户输入的关键字决定是否放弃. ^# \$ q. G  [% U# t7 ~$ e
  13.     (repeat 5 (command "u"))  ;放弃前面5个命令的结果
    - W; Q  M( ^( |+ [8 n0 N4 \# Z
  14. ;;;    (command "undo" 5)/ h) g& i8 L7 B
  15.   )' b* o: u) D& t6 o2 F( ~+ L/ _
  16.   (prin1)& p0 Y* k- H  {( R( J  b
  17. )                                        ;绘制圆的中心线
复制代码
 楼主| 发表于 2013-7-22 18:14:26 | 显示全部楼层
本帖最后由 2010caozhiyong 于 2013-7-22 18:29 编辑
; F1 z9 U* R  V, u) U
woaishuijia 发表于 2013-7-22 01:46 static/image/common/back.gif
3 a( W& y1 f: F8 [3 p* m
非常感谢版主的回复0 ^1 U6 F9 U3 M: B3 e* W! b
对于我知道应该放弃5个命令的结果,该方案是行得通的,4 T4 A. g% e6 @" Q( d- X
但如果我是一个选集,且我也不知道要返回多少个命令的时候,就不适用该办法了。
/ q2 N! B, I2 {2 f有没有一个办法,可以把我的程序打一个包,就是一个整体,执行,放弃,都是一步. ?5 j) s5 _: Q, a4 d9 B  I5 a
如下面程序# p, Q2 e  l/ d. a  m  U

: h7 A& Q. H" \(defun c:yd (/ s b p0 n0 ss a0 a s0 p00)  
/ y$ X  R+ A5 K2 E* p1 a1 E% r/ l% _  (setvar "cmdecho" 0)(setq old_osm (getvar "osmode")) (setvar "osmode" 0)3 B4 `5 O0 R4 L2 D
  (setq s (ssget) p1 (list 0 0))
; p. c* H& n1 E, `/ k) L/ I" Y  (setq s (ssget "p" '((0 . "circle"))); D( E/ K4 X) }/ a( e: Y
  );新建圆选集
5 ~7 z0 T% k6 H' {8 }  (command "copybase" p1 s "")  (command "pasteblock" p1), [/ a- x5 u1 A9 d: |& u
  (setq n0  (-(sslength s) 1) a (ssadd))  {' h: w& Z/ d, Q7 _' u* _4 g
  (if (= n0 -1) (exit))
, q" q" w5 P, i3 V' w3 h) v  (repeat n0
- j6 v# O2 p6 p8 a8 g1 @# S+ d   (setq ss (ssname s 0)  p0 (czy_yxd ss) )
) p' _0 H  t, ?6 i5 Z0 ]4 s   (if (/= p0 p00)(progn
5 J' o5 Q$ N1 }/ i, ^& s% b) f     (command "POINT" p0)
/ R6 ~8 l$ k  c5 F9 m5 K     (setq a0 (entlast) a (ssadd a0 a))$ ^% R& ~' ~! V* X2 x
     )6 F5 m, h0 z5 v8 t/ p
   )
( o6 f: |/ K7 M2 L1 n: U   (setq p00 p0)
, H) A" _# F6 A5 i) w- d7 j! F0 y   (ssdel ss s)(command "erase" ss "")$ [0 X; o# G* t) j0 K) F" i
  )
$ l6 [& D0 X/ |8 n$ n! B) U" Q   (setq ss (ssname s 0)  p0 (czy_yxd ss) )
% V) y' L% {8 v+ e   (if (/= p0 p00) (progn
, s3 B$ m+ A; L% @" ~- x# a        (command "POINT" p0)- J8 `; y' {& Z# k& U
        (setq a0 (entlast) a (ssadd a0 a))
$ A/ w1 V, O4 f7 r! I        )
; D0 B# p% ^6 ?  N" {! {" z, N     )
1 g9 ]$ \4 N( p9 d/ g6 V7 i1 u9 n8 K  G   (command "erase" ss "")6 Q, X+ N: S2 V$ V, N4 G* y4 y# r
   (command "copybase" p0 a "") (command "erase" a "")(command "pasteblock" p0)
* R1 z2 J. S, a' T+ H0 ` (setvar "osmode" old_osm)(setvar "cmdecho" 1). R" V8 M: S- Z, [+ X
(princ)
$ u& h4 j* S' G, |. f2 F$ H);框选圆,并删除圆,在圆心处添加点( q( V, k- ?6 [* n* }4 B/ J
发表于 2013-7-22 18:18:17 | 显示全部楼层
那你就声明一个局部变量专门用于记录之前执行了多少个命令啊
 楼主| 发表于 2013-7-22 18:32:14 | 显示全部楼层
woaishuijia 发表于 2013-7-22 18:18 static/image/common/back.gif- c) `. \  O0 n
那你就声明一个局部变量专门用于记录之前执行了多少个命令啊
$ @* Z3 b( R! |1 R/ |, T
没有弄过,不会4 z  G, B- Q% }
版主,能不能帮我在以上程序里,添加一下啊; M" H# X# K7 H. u8 W" f  p
谢谢啊
* c. w% i  A# j, @+ s3 P  x* S
 楼主| 发表于 2013-7-22 18:38:48 | 显示全部楼层
woaishuijia 发表于 2013-7-22 18:18 static/image/common/back.gif
, m0 A6 Z3 p3 y1 \% s9 p那你就声明一个局部变量专门用于记录之前执行了多少个命令啊

9 U/ ~& V6 F$ _) h; N- u& x' b# T QQ图片20130722183435.jpg
6 a2 \, ]2 E9 {5 m4 Z: v' J) p5 P3 q5 `上面是燕秀工具箱里的文字成线命令
9 s! m0 m/ P$ {0 K) f9 b我爆炸成线后,发现不对,我按“CTRA+Z”后出现的代码# K% A5 S; M" C" i+ n* E
版主知道,该程序是如何办到的吗?6 S( Z6 o! F- `6 k
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

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