QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

查看: 5050|回复: 6
收起左侧

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

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

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

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

x
本帖最后由 2010caozhiyong 于 2013-7-21 10:26 编辑
- t9 l: h- G$ M
* \, @- B- E* ]5 W小弟一直有个困惑,自己编了很多程序,尤其是一些有循环的很长程序,结果画出来之后,发现画错了# l& S& A* \0 A8 A- r
然后,我就按放弃命令(Ctrl+Z)结果要按上几分钟才能一步一步的返回的最初状态
9 {4 o) s# Y5 ?我简单复制了一个程序,如下,怎样添加内容,使该程序能成为一个整体,就像CAD内部程序一样,一步就可以返回到最初状态,谢谢
8 o5 K( ]5 s5 t4 c  u! T( k2 a& h/ r) H. e; |2 @
(defun c:xy(/ p czy_p)
, @" d- \, r& z(setq p (GETPOINT "选择中心点:")). Y: A& m' G/ g) |6 j" j) W
(setq old_lay (getvar "clayer"))$ j% K! I0 {) y; U% W
(COMMAND "LAYER" "n" "center" "set" "center" "")& P) }3 f" I6 @/ R9 a7 N6 {7 N2 U
(command "line" p pause "")
4 A! ~; }/ E) R7 s" Y(setq czy_p (entlast))
( |' t: V# I$ c7 a( L  c% d- S" n(command "ROTATE" czy_p "" p "c" "90")1 J9 A9 D0 Z# W: c( s
(command "ROTATE" czy_p "" p "c" "180")
9 [+ }' h0 E. ?(command "ROTATE" czy_p "" p "c" "270")
( Y& F/ a' @) o" j1 d! Z) a! N( W7 q(setvar "clayer" old_lay)
2 a; H+ M) Y+ P; q( ^/ @3 L(prin1)7 N) {2 l6 {6 V9 j
);绘制圆的中心线& b, `8 E& i$ u9 S4 a
% Z( @, b% V$ k& o7 @
 楼主| 发表于 2013-7-21 12:11:21 | 显示全部楼层 来自: 中国江苏常州
本帖最后由 2010caozhiyong 于 2013-7-21 12:14 编辑 , U+ q/ {  p& E) |+ w7 i
' F5 f+ E3 [" v' c6 V
解释一下,可能朋友们没有听清楚意思" D% x' ]0 W+ @+ d, |
就是我程序编好了,加载后,在CAD窗口下运行后,发现我的画出来的图形不太对,想返回后重新画' p5 C' W! j0 t% a2 o4 p
但是,我在cad里用(Ctra+Z)命令,要一直按好久好久,才能一步一步的返回到我运行这个程序之前的状态! w* V9 m. G- Q6 E& Q* A: H2 p( H/ [7 B
我现在想一步就返回到最初的状态,怎么修改程序呢?
& {* j5 ^! t3 w$ a/ ^就像cad内部命令一样,阵列了好多图元,我发现不对,想放弃,直接按一下(Ctra+Z)就行了,不要按好多下
发表于 2013-7-22 01:46:33 | 显示全部楼层 来自: 中国吉林吉林市
本帖最后由 woaishuijia 于 2013-7-22 01:48 编辑 8 H/ V3 D, {, w1 i$ ^, a$ b( ~
  1. (defun c:xy (/ p old_lay czy_p)
    : M9 A2 O& P/ }$ u- y
  2.   (setq p (GETPOINT "选择中心点:"))
    + A( q3 n- R3 Y) R
  3.   (setq old_lay (getvar "clayer")), y" \  c# g8 Z# `. e! x6 @* I
  4.   (COMMAND "LAYER" "n" "center" "set" "center" "")1 ~* {4 @5 C, C0 Q
  5.   (command "line" p pause "")
    # `% h5 B3 n% K3 F& g6 C  n
  6.   (setq czy_p (entlast))
    2 e4 Y* s) I# l
  7.   (command "ROTATE" czy_p "" p "c" "90")
    0 u# O$ d& B& q
  8.   (command "ROTATE" czy_p "" p "c" "180")
    . j2 ?( W4 c# r0 c& I
  9.   (command "ROTATE" czy_p "" p "c" "270")
    % Z7 O* R8 n& e
  10.   (setvar "clayer" old_lay)
    6 U0 t, i- e: U0 B8 c
  11.   (initget 0 "u")                        ;定义关键字
    0 b6 w, x2 f0 M+ c( D4 O! y
  12.   (if (= (getkword "\n确定或 [放弃(U)]:") "u");检查用户输入的关键字决定是否放弃: {7 ~8 h( R4 p7 k6 r
  13.     (repeat 5 (command "u"))  ;放弃前面5个命令的结果
    , J/ Z0 L. U, e. ^8 N
  14. ;;;    (command "undo" 5)
    + ?1 t! g& W6 K" a, W/ k
  15.   )
    ) P8 y0 x8 q5 x( Z9 d6 B5 E
  16.   (prin1)
    2 O- l6 G5 }& F: e- @
  17. )                                        ;绘制圆的中心线
复制代码
 楼主| 发表于 2013-7-22 18:14:26 | 显示全部楼层 来自: 中国江苏常州
本帖最后由 2010caozhiyong 于 2013-7-22 18:29 编辑
# k! f4 C6 ]6 _+ u( i# |  U; g
woaishuijia 发表于 2013-7-22 01:46 static/image/common/back.gif
+ B& m0 c  p; z) p' u% P) I0 A
非常感谢版主的回复
6 I# U# }# `! G  l5 z! J对于我知道应该放弃5个命令的结果,该方案是行得通的,# E7 ]7 @# G( ?
但如果我是一个选集,且我也不知道要返回多少个命令的时候,就不适用该办法了。& i3 W+ M& l4 i; R: O: _
有没有一个办法,可以把我的程序打一个包,就是一个整体,执行,放弃,都是一步4 i: J" F" ]6 H/ E1 r6 Y2 R
如下面程序+ t& x# v3 U' W$ b: m  B+ c

5 A1 m3 Y/ H/ W! L" Z(defun c:yd (/ s b p0 n0 ss a0 a s0 p00)  
+ I& `- F" @% V; M( g0 R* U  (setvar "cmdecho" 0)(setq old_osm (getvar "osmode")) (setvar "osmode" 0)
$ _" h0 O" T& Y* t4 T+ G* f  (setq s (ssget) p1 (list 0 0))0 V0 V$ f1 w" L* h6 x( M0 F4 C
  (setq s (ssget "p" '((0 . "circle")))
3 H# K& @+ G7 d  );新建圆选集% W7 I. f' s+ ?4 B2 w
  (command "copybase" p1 s "")  (command "pasteblock" p1)
1 A" p3 \4 \0 x* o- E) H  (setq n0  (-(sslength s) 1) a (ssadd))/ f/ K* ~8 @$ @- D7 _
  (if (= n0 -1) (exit))7 g1 ?  c& D- M8 B5 D
  (repeat n0
1 d+ M9 q- o1 A8 G! A% n9 I   (setq ss (ssname s 0)  p0 (czy_yxd ss) )1 A) f; S& s0 v( X' O3 a, x. j4 ]
   (if (/= p0 p00)(progn
5 f- ], L( O" A( K% \" i8 @     (command "POINT" p0)
8 A, d4 \2 }0 b% g+ U* c     (setq a0 (entlast) a (ssadd a0 a))* E0 ?  I( c* p: U2 @' U
     )# j  S7 [% y3 i
   )
0 I  |: [* s. k% F" @   (setq p00 p0)
$ W8 U# V- a" t/ S( Y: ~5 i  D   (ssdel ss s)(command "erase" ss "")) q+ S3 n8 x9 W' m+ S) }- X
  )
9 H. d4 H6 p9 Z4 W   (setq ss (ssname s 0)  p0 (czy_yxd ss) )
$ q: H" p2 k' G0 R0 F9 E   (if (/= p0 p00) (progn
$ o" ~' X7 ?; W2 X1 }        (command "POINT" p0)
6 `/ ^0 z7 E; v, @        (setq a0 (entlast) a (ssadd a0 a))3 W+ ?6 v6 R- o& Y+ q. L) ^0 y' n
        )
& A0 Z, ?) D7 z7 ?     ); q3 l4 a( X# q, M* V* X
   (command "erase" ss "")
% C$ v6 {+ y4 b' a' T& c0 ^   (command "copybase" p0 a "") (command "erase" a "")(command "pasteblock" p0)
& H" y+ R5 o& \* h) V& [ (setvar "osmode" old_osm)(setvar "cmdecho" 1); p) z$ E! x9 b0 M# e- q- \0 O
(princ)
% n* L) U: R# {0 @$ O# X+ P' F);框选圆,并删除圆,在圆心处添加点' E! Q, Z0 i7 ?" h
发表于 2013-7-22 18:18:17 | 显示全部楼层 来自: 中国吉林吉林市
那你就声明一个局部变量专门用于记录之前执行了多少个命令啊
 楼主| 发表于 2013-7-22 18:32:14 | 显示全部楼层 来自: 中国江苏常州
woaishuijia 发表于 2013-7-22 18:18 static/image/common/back.gif& W1 j3 s; P+ z# a7 [; Y& Z
那你就声明一个局部变量专门用于记录之前执行了多少个命令啊

5 h/ V' l. j- E1 o5 C4 {3 u没有弄过,不会
: i  h9 d6 H/ X' S' Z! p$ D版主,能不能帮我在以上程序里,添加一下啊
" X2 t9 c* t7 E/ w$ j- A" B4 |( R谢谢啊
5 C6 ?+ a3 D; r6 c' t6 i7 H
 楼主| 发表于 2013-7-22 18:38:48 | 显示全部楼层 来自: 中国江苏常州
woaishuijia 发表于 2013-7-22 18:18 static/image/common/back.gif
8 E/ ^/ Q( @- W% o' T3 U那你就声明一个局部变量专门用于记录之前执行了多少个命令啊

* h+ i8 I* G4 x QQ图片20130722183435.jpg
, m% D, Y) N. }5 |1 \+ t( S上面是燕秀工具箱里的文字成线命令
" J! l+ Q4 w. ?; e我爆炸成线后,发现不对,我按“CTRA+Z”后出现的代码4 n# ]/ R: ?( F. [' h' N
版主知道,该程序是如何办到的吗?+ z0 U6 O/ c" b; Q
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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