QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 2010caozhiyong 于 2013-7-21 10:26 编辑 " F. o0 |8 f4 b2 |1 w

  r4 m+ W1 l8 X4 Y1 R小弟一直有个困惑,自己编了很多程序,尤其是一些有循环的很长程序,结果画出来之后,发现画错了) i' K, b  k5 ]: z3 Y% y
然后,我就按放弃命令(Ctrl+Z)结果要按上几分钟才能一步一步的返回的最初状态  u9 A! C* |" l
我简单复制了一个程序,如下,怎样添加内容,使该程序能成为一个整体,就像CAD内部程序一样,一步就可以返回到最初状态,谢谢
0 _7 Y1 S% C0 X. t, U( f7 I9 [
9 w' E0 }" h2 C0 Q6 ?; n! e(defun c:xy(/ p czy_p)
' z6 @6 i5 E4 B% J5 Y(setq p (GETPOINT "选择中心点:"))
5 Q% Q# Q6 Y7 H(setq old_lay (getvar "clayer"))8 _  j2 c& S0 p" H9 {
(COMMAND "LAYER" "n" "center" "set" "center" "")% q) }5 d  B- ]
(command "line" p pause "")
) j6 m4 q) p/ `2 B# f(setq czy_p (entlast))
! ^9 a% _: f* ~( ^" f- J. ^4 K: {(command "ROTATE" czy_p "" p "c" "90")6 V" W' @7 S" f2 H
(command "ROTATE" czy_p "" p "c" "180")& q( f, y1 ?: U" V" e7 j! n) w
(command "ROTATE" czy_p "" p "c" "270")  M8 [' S/ A5 i" Z
(setvar "clayer" old_lay)
8 x6 u% K, l% |/ I8 D7 K(prin1), C3 ~9 Z$ I' e" J! Q; R
);绘制圆的中心线. v1 s- C/ I. b# y

; A! X8 r; }- |/ X3 @$ b
 楼主| 发表于 2013-7-21 12:11:21 | 显示全部楼层 来自: 中国江苏常州
本帖最后由 2010caozhiyong 于 2013-7-21 12:14 编辑 * T0 M- b9 a* ~* ?: y4 @. `7 I: j
: ~* g( p7 |1 |8 {3 G) U* ~# P
解释一下,可能朋友们没有听清楚意思; T4 {+ ~" Q( N4 K! D$ G* J
就是我程序编好了,加载后,在CAD窗口下运行后,发现我的画出来的图形不太对,想返回后重新画
0 S& |% h  t. G7 v% a# u: q但是,我在cad里用(Ctra+Z)命令,要一直按好久好久,才能一步一步的返回到我运行这个程序之前的状态
% H9 n9 `9 Z6 L' w/ g我现在想一步就返回到最初的状态,怎么修改程序呢?
& J+ c0 t/ y& y+ o& J5 [" K就像cad内部命令一样,阵列了好多图元,我发现不对,想放弃,直接按一下(Ctra+Z)就行了,不要按好多下
发表于 2013-7-22 01:46:33 | 显示全部楼层 来自: 中国吉林吉林市
本帖最后由 woaishuijia 于 2013-7-22 01:48 编辑
. C4 e- M0 o1 w6 i! Q4 t
  1. (defun c:xy (/ p old_lay czy_p)  k; k( F: v* F
  2.   (setq p (GETPOINT "选择中心点:"))2 P/ B1 i- {4 B: Z
  3.   (setq old_lay (getvar "clayer")): C) q  V5 _* Y1 P: [
  4.   (COMMAND "LAYER" "n" "center" "set" "center" "")
    . z1 o- K& j7 B+ Y
  5.   (command "line" p pause "")
    / h: y( Y. P. \3 T. P  b# P7 ]
  6.   (setq czy_p (entlast)); s" v: D; V" g+ a6 J
  7.   (command "ROTATE" czy_p "" p "c" "90")$ W7 Z$ G& `1 L" e/ `
  8.   (command "ROTATE" czy_p "" p "c" "180")
    % d& Y7 }2 D0 ~5 ~- k& a; v
  9.   (command "ROTATE" czy_p "" p "c" "270"). A! v) h% ]& G2 ]3 E
  10.   (setvar "clayer" old_lay): i6 q  ?( }6 C7 z
  11.   (initget 0 "u")                        ;定义关键字
    . v; C3 a  ~1 R( ]6 @
  12.   (if (= (getkword "\n确定或 [放弃(U)]:") "u");检查用户输入的关键字决定是否放弃
    ' C8 z8 {+ `3 ]) e1 f0 ?. [
  13.     (repeat 5 (command "u"))  ;放弃前面5个命令的结果# [* B. _( w0 @! d' [3 {7 b4 t
  14. ;;;    (command "undo" 5)# p. u( t4 R6 {- _
  15.   )
    & H/ ^" q5 y: |  K4 M5 u! \, c
  16.   (prin1)
    4 G# I& y5 B, N! T: w! y* x
  17. )                                        ;绘制圆的中心线
复制代码
 楼主| 发表于 2013-7-22 18:14:26 | 显示全部楼层 来自: 中国江苏常州
本帖最后由 2010caozhiyong 于 2013-7-22 18:29 编辑 1 E; m  ?5 t" ?2 P" A* Q
woaishuijia 发表于 2013-7-22 01:46 static/image/common/back.gif

( G6 r* `2 H# V3 j5 p0 {非常感谢版主的回复5 [) ^2 m$ D5 w
对于我知道应该放弃5个命令的结果,该方案是行得通的,
5 H8 p+ f/ @% n  e) V/ R但如果我是一个选集,且我也不知道要返回多少个命令的时候,就不适用该办法了。: c5 U( `" r; u# o
有没有一个办法,可以把我的程序打一个包,就是一个整体,执行,放弃,都是一步
2 j" s9 U3 }" d( {6 M如下面程序: S/ v" h( g( C/ j0 C

) o2 A! c! t3 x& F' u* p(defun c:yd (/ s b p0 n0 ss a0 a s0 p00)  
2 |7 ]# [6 S* Z$ A  (setvar "cmdecho" 0)(setq old_osm (getvar "osmode")) (setvar "osmode" 0)
. P, L: f4 s" G! Z# i' Q7 I  (setq s (ssget) p1 (list 0 0))
3 z, u. C- J1 n  (setq s (ssget "p" '((0 . "circle")))
1 X, L" m! r$ Z0 G9 Z/ K  R  );新建圆选集
' f5 O, _8 G! v+ v. D  |. Z) k  (command "copybase" p1 s "")  (command "pasteblock" p1); X0 ~. V) K4 y2 r2 J3 J) }
  (setq n0  (-(sslength s) 1) a (ssadd))
8 Y# I! L  B% x1 `6 O' _  (if (= n0 -1) (exit))! d1 b+ {2 D) f. O# I
  (repeat n0. N' _5 Z" v  l& R( S2 t# a3 N& z' H
   (setq ss (ssname s 0)  p0 (czy_yxd ss) )
* [# f6 S: p% j2 m" O  P   (if (/= p0 p00)(progn
( n% U- z0 c( f     (command "POINT" p0)
2 {7 m5 v) Y! m' m4 b) a8 Y     (setq a0 (entlast) a (ssadd a0 a))
, m/ c( l( S0 Y% n; G4 s# L- y     )
- R5 J2 ]* }$ l   ), k5 F1 g0 Q  x' g( v! P
   (setq p00 p0)6 G% {2 m# t+ B
   (ssdel ss s)(command "erase" ss "")+ v- f# [: R* X5 _
  )
  T$ d% x* m( }) z   (setq ss (ssname s 0)  p0 (czy_yxd ss) ), e4 O8 A# O& k, m0 A2 U
   (if (/= p0 p00) (progn
6 |  G' Q4 C  s        (command "POINT" p0)
6 {+ {& r8 q2 P. ?2 r        (setq a0 (entlast) a (ssadd a0 a))5 W; u% B3 ?+ U/ t& x& w
        )
" J8 b- x1 ^3 A/ `: b     )! `$ Z, j, M2 g# [; ^
   (command "erase" ss "")$ R/ ~5 L" W4 O6 Q% I, M: [
   (command "copybase" p0 a "") (command "erase" a "")(command "pasteblock" p0)* L: z, \* H3 P/ N1 \
(setvar "osmode" old_osm)(setvar "cmdecho" 1)
; W! A8 y! W. k. ^! G" t8 X6 o4 e (princ)' a: |& {2 F4 @( s
);框选圆,并删除圆,在圆心处添加点
  w5 m/ X0 n- y" l% I& N* u
发表于 2013-7-22 18:18:17 | 显示全部楼层 来自: 中国吉林吉林市
那你就声明一个局部变量专门用于记录之前执行了多少个命令啊
 楼主| 发表于 2013-7-22 18:32:14 | 显示全部楼层 来自: 中国江苏常州
woaishuijia 发表于 2013-7-22 18:18 static/image/common/back.gif
5 ~$ h$ G2 ^, h2 H$ P9 c那你就声明一个局部变量专门用于记录之前执行了多少个命令啊
  ?4 d; r* I& u* [- p$ p
没有弄过,不会6 k' N9 Z* u" |, c- Z/ k/ M; b
版主,能不能帮我在以上程序里,添加一下啊
/ c/ f: |  }% `' w& R谢谢啊
8 q: q2 c  b( g/ g. V
 楼主| 发表于 2013-7-22 18:38:48 | 显示全部楼层 来自: 中国江苏常州
woaishuijia 发表于 2013-7-22 18:18 static/image/common/back.gif" e! H: ?6 V: A. `- Z  P  T% Y
那你就声明一个局部变量专门用于记录之前执行了多少个命令啊
$ C- E2 _- O1 D  i
QQ图片20130722183435.jpg " g1 c2 m: Q* M1 X& a& g
上面是燕秀工具箱里的文字成线命令  A+ Y$ E/ f! l
我爆炸成线后,发现不对,我按“CTRA+Z”后出现的代码
# l; z% S* ?2 |版主知道,该程序是如何办到的吗?6 f; z: }8 p) B3 ^/ n1 T
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

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