QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 2010caozhiyong 于 2013-7-21 10:26 编辑
* C3 Z6 e' z" o& ]+ P. _% R1 v' M4 m' P  j
小弟一直有个困惑,自己编了很多程序,尤其是一些有循环的很长程序,结果画出来之后,发现画错了
4 @6 `; r" a. O4 m. e4 n然后,我就按放弃命令(Ctrl+Z)结果要按上几分钟才能一步一步的返回的最初状态
6 R6 v3 C' k8 p% q$ |我简单复制了一个程序,如下,怎样添加内容,使该程序能成为一个整体,就像CAD内部程序一样,一步就可以返回到最初状态,谢谢& t. ?! [! ]1 i9 Y; N

) b/ M8 C! s$ [' p( u  N- W; O(defun c:xy(/ p czy_p)
$ _+ b2 X( D9 z5 k( k1 y4 r(setq p (GETPOINT "选择中心点:"))
8 L" y; }9 {$ o  m(setq old_lay (getvar "clayer"))4 F& x* y( s$ _+ l2 R. A* b, _
(COMMAND "LAYER" "n" "center" "set" "center" "")+ E  C2 ^) _& I6 A
(command "line" p pause "")
; M/ ?' [4 }% W. C7 a7 a(setq czy_p (entlast))" }0 a1 ]0 o0 F; c4 v3 g( W/ M
(command "ROTATE" czy_p "" p "c" "90")9 ^2 ~9 J7 ~& z. u0 a
(command "ROTATE" czy_p "" p "c" "180")
1 x! H( d# u/ X2 `5 h. F' D(command "ROTATE" czy_p "" p "c" "270")
+ d4 [/ F' r( t" J: w" Q7 e* U: t$ B(setvar "clayer" old_lay)
) N" L5 e6 z+ ~* z2 L(prin1)$ Z1 g5 O- y2 v6 B! k/ ]6 p
);绘制圆的中心线
( `$ T$ \8 C7 f' r; t2 @( C/ }, `, C% a2 s# T
 楼主| 发表于 2013-7-21 12:11:21 | 显示全部楼层 来自: 中国江苏常州
本帖最后由 2010caozhiyong 于 2013-7-21 12:14 编辑 ' n% q1 N+ U6 a7 b4 {5 m- I

. W4 k) S8 S% f- a解释一下,可能朋友们没有听清楚意思/ V; E5 ^! P. e6 N1 f
就是我程序编好了,加载后,在CAD窗口下运行后,发现我的画出来的图形不太对,想返回后重新画( ^7 u6 C4 N" Q4 c
但是,我在cad里用(Ctra+Z)命令,要一直按好久好久,才能一步一步的返回到我运行这个程序之前的状态
- J" [  O( G! b0 J& f) C# F我现在想一步就返回到最初的状态,怎么修改程序呢?
% h7 X- V* b9 ?5 I9 t; v" S" x# l( w就像cad内部命令一样,阵列了好多图元,我发现不对,想放弃,直接按一下(Ctra+Z)就行了,不要按好多下
发表于 2013-7-22 01:46:33 | 显示全部楼层 来自: 中国吉林吉林市
本帖最后由 woaishuijia 于 2013-7-22 01:48 编辑 8 J9 r) B0 ]" d9 y1 ?: h* ^4 N
  1. (defun c:xy (/ p old_lay czy_p)$ ?5 v8 g& U" o5 o2 x3 ^
  2.   (setq p (GETPOINT "选择中心点:"))/ U2 y1 ~" a& z, p
  3.   (setq old_lay (getvar "clayer"))
    ) \; j7 N, _  R. ~4 G; _) i
  4.   (COMMAND "LAYER" "n" "center" "set" "center" "")
    7 G9 b2 {0 q/ H) A3 g, B4 V3 E
  5.   (command "line" p pause "")
    7 K2 C  b& G9 J. L0 H
  6.   (setq czy_p (entlast))
    6 [9 R# g/ |7 }0 f- D* {
  7.   (command "ROTATE" czy_p "" p "c" "90")
    5 o; G' S! a1 h8 D' H6 ?/ R
  8.   (command "ROTATE" czy_p "" p "c" "180"). P! c4 a) J: s" T
  9.   (command "ROTATE" czy_p "" p "c" "270")
    1 f- [) Q8 j: a6 Q! e% Y- b
  10.   (setvar "clayer" old_lay)- {  r% V9 b. A7 t5 \1 @; C( \1 n
  11.   (initget 0 "u")                        ;定义关键字- a4 a0 Z/ F9 Z7 K
  12.   (if (= (getkword "\n确定或 [放弃(U)]:") "u");检查用户输入的关键字决定是否放弃. P9 b% w' U7 F4 P( |* N/ F7 v
  13.     (repeat 5 (command "u"))  ;放弃前面5个命令的结果
    ; i* i/ U6 P! F" W7 Y
  14. ;;;    (command "undo" 5)5 e4 X3 X+ x/ t  t3 ~
  15.   )
    + t! X0 Y" X5 k/ T( b* N
  16.   (prin1)
    % V( r, _* |2 @
  17. )                                        ;绘制圆的中心线
复制代码
 楼主| 发表于 2013-7-22 18:14:26 | 显示全部楼层 来自: 中国江苏常州
本帖最后由 2010caozhiyong 于 2013-7-22 18:29 编辑
- B( D) [3 D0 V/ I) F2 Z/ q, L" B
woaishuijia 发表于 2013-7-22 01:46 static/image/common/back.gif
$ F) U" t8 T1 @' u( F! k0 N$ x
非常感谢版主的回复# q3 A0 ^; K6 A: n5 C, c+ G8 o
对于我知道应该放弃5个命令的结果,该方案是行得通的,9 K5 y8 u* m8 s3 y: \
但如果我是一个选集,且我也不知道要返回多少个命令的时候,就不适用该办法了。
  `4 K# d0 O$ U6 ~' g. t有没有一个办法,可以把我的程序打一个包,就是一个整体,执行,放弃,都是一步5 d0 _  g# Y0 I9 ~8 V
如下面程序; O. {4 R- t" x. n8 ?6 u' m2 \+ [

: @8 Q  t9 a- P7 k% m4 O: \(defun c:yd (/ s b p0 n0 ss a0 a s0 p00)  . i# K9 s+ f, L. y& Y+ `9 o) k
  (setvar "cmdecho" 0)(setq old_osm (getvar "osmode")) (setvar "osmode" 0)
' z) `. j2 B9 L' b  (setq s (ssget) p1 (list 0 0))
! O. v0 Q5 }1 W, S3 L) [/ p" l* C  (setq s (ssget "p" '((0 . "circle")))8 O) `) u: r% `
  );新建圆选集8 b3 Q5 r" y' L! x
  (command "copybase" p1 s "")  (command "pasteblock" p1)
( C8 h7 @! G( u8 e) d  (setq n0  (-(sslength s) 1) a (ssadd))
7 d" O% d- {: t1 B  (if (= n0 -1) (exit))* U+ R2 W& {+ ]. l4 [
  (repeat n0
/ j7 g& ?! t( ]% j# S' H   (setq ss (ssname s 0)  p0 (czy_yxd ss) )
/ M# e7 t2 W2 J3 f% |   (if (/= p0 p00)(progn  g8 p, x, @6 C: S1 c
     (command "POINT" p0)
# V3 l9 l7 b3 J3 E     (setq a0 (entlast) a (ssadd a0 a))) F0 b% Z* B. d. L( D2 i
     )
( o; k% I+ |! S# M0 c) g   )
# w' L2 f/ a& I   (setq p00 p0)9 l/ E7 |9 d4 B
   (ssdel ss s)(command "erase" ss "")
& a. H+ V7 I* K  T  )
! B# `' g5 |4 N' A2 F4 ]   (setq ss (ssname s 0)  p0 (czy_yxd ss) )
: M$ V" c7 X& y/ `9 P7 N! M   (if (/= p0 p00) (progn% G; L# t2 g+ L# v" @8 Q
        (command "POINT" p0)5 f4 V- W( u; r6 Y9 u8 X2 h/ p& ]
        (setq a0 (entlast) a (ssadd a0 a))1 H5 _1 U; K' b5 G  q0 {6 z
        )
( N9 C. K2 G; T  t3 E     )$ K( q* `) d; |; t" L9 M% s6 O2 y7 U
   (command "erase" ss "")+ u' v, b' q0 {  s/ n! H
   (command "copybase" p0 a "") (command "erase" a "")(command "pasteblock" p0)" D$ z5 k+ {" Q1 G# r7 w
(setvar "osmode" old_osm)(setvar "cmdecho" 1)0 e2 N! D7 e4 V# G+ p
(princ), I0 [6 L/ O, U; I3 X( ]+ ?, I
);框选圆,并删除圆,在圆心处添加点+ U* A* z" i' v9 P
发表于 2013-7-22 18:18:17 | 显示全部楼层 来自: 中国吉林吉林市
那你就声明一个局部变量专门用于记录之前执行了多少个命令啊
 楼主| 发表于 2013-7-22 18:32:14 | 显示全部楼层 来自: 中国江苏常州
woaishuijia 发表于 2013-7-22 18:18 static/image/common/back.gif9 y  T% S* ]4 Q
那你就声明一个局部变量专门用于记录之前执行了多少个命令啊
7 a. n! ~0 i2 e3 c0 v  J! n
没有弄过,不会* L& p/ i% S, f2 x0 |
版主,能不能帮我在以上程序里,添加一下啊
# F1 b2 A% _; z谢谢啊# o, ~6 c: ?  \5 L+ P7 S' v
 楼主| 发表于 2013-7-22 18:38:48 | 显示全部楼层 来自: 中国江苏常州
woaishuijia 发表于 2013-7-22 18:18 static/image/common/back.gif3 @5 h, S/ Z2 a2 G. a
那你就声明一个局部变量专门用于记录之前执行了多少个命令啊
0 Z( T+ E, j  _; o7 o+ C6 o/ g. o3 h
QQ图片20130722183435.jpg $ A. j( E; n. ?+ d: A
上面是燕秀工具箱里的文字成线命令
& k$ ?) x0 f: L2 r' J" d我爆炸成线后,发现不对,我按“CTRA+Z”后出现的代码
) r, ~# T/ ]* R: J- h版主知道,该程序是如何办到的吗?
: U( o4 ^$ k9 W' ?
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

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