QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 2010caozhiyong 于 2013-7-21 10:26 编辑
0 g5 z0 A0 a8 g$ h! I& _3 [" R0 c7 y0 p) s$ b) w
小弟一直有个困惑,自己编了很多程序,尤其是一些有循环的很长程序,结果画出来之后,发现画错了( \$ s4 @- d2 E
然后,我就按放弃命令(Ctrl+Z)结果要按上几分钟才能一步一步的返回的最初状态
0 t: f. o4 i: Z4 s我简单复制了一个程序,如下,怎样添加内容,使该程序能成为一个整体,就像CAD内部程序一样,一步就可以返回到最初状态,谢谢
: e: d$ R2 g. u) c( P* [  {7 g% E9 s+ p4 ~7 @( O+ G# P* _
(defun c:xy(/ p czy_p)
' c* B4 f2 n+ e5 f' j9 s(setq p (GETPOINT "选择中心点:"))
5 M, b9 p6 o, U8 ?1 T) |+ g9 I(setq old_lay (getvar "clayer"))
, R: r+ |5 a+ g% t* E9 H(COMMAND "LAYER" "n" "center" "set" "center" "")
! J3 B* j6 v5 y( V; g2 x(command "line" p pause "")7 [5 ^, k; G/ i$ a7 V) g
(setq czy_p (entlast)); W/ B  f" l5 S$ _1 _* A$ n- U
(command "ROTATE" czy_p "" p "c" "90")
- s* F5 J) W# h4 P7 G. Q(command "ROTATE" czy_p "" p "c" "180")
1 R6 I: O# X  d! s$ W(command "ROTATE" czy_p "" p "c" "270")  e, w3 L6 d7 T- z
(setvar "clayer" old_lay)
. K1 U) r( n: [' K" k# R(prin1)
" {4 _- w  n6 k2 q5 G);绘制圆的中心线! F) O9 d# k/ ^& S0 B  ~/ E
  s* w# B1 I+ c) h# z
 楼主| 发表于 2013-7-21 12:11:21 | 显示全部楼层 来自: 中国江苏常州
本帖最后由 2010caozhiyong 于 2013-7-21 12:14 编辑
& u7 p. ^) [1 Q& z
" {( P) G5 J" z9 |8 {* U9 M解释一下,可能朋友们没有听清楚意思
3 G0 D, o$ @) J就是我程序编好了,加载后,在CAD窗口下运行后,发现我的画出来的图形不太对,想返回后重新画4 `# I& w  {  A& |$ r
但是,我在cad里用(Ctra+Z)命令,要一直按好久好久,才能一步一步的返回到我运行这个程序之前的状态8 G  f9 W- q. d( j
我现在想一步就返回到最初的状态,怎么修改程序呢?2 h3 R8 s( g8 ~
就像cad内部命令一样,阵列了好多图元,我发现不对,想放弃,直接按一下(Ctra+Z)就行了,不要按好多下
发表于 2013-7-22 01:46:33 | 显示全部楼层 来自: 中国吉林吉林市
本帖最后由 woaishuijia 于 2013-7-22 01:48 编辑
/ E6 s. n. r! h+ P
  1. (defun c:xy (/ p old_lay czy_p)* R/ h% F+ f& s
  2.   (setq p (GETPOINT "选择中心点:"))! y& t9 Z$ B% k  F: t# [" [6 u
  3.   (setq old_lay (getvar "clayer"))
    4 U. E- E" K$ T- D3 u6 C
  4.   (COMMAND "LAYER" "n" "center" "set" "center" "")
    , v/ X: l" W2 |
  5.   (command "line" p pause "")- v0 `3 a$ t/ ?3 F$ m# }1 L
  6.   (setq czy_p (entlast))0 t1 V, `9 \8 s) C0 l1 J
  7.   (command "ROTATE" czy_p "" p "c" "90")5 m: s, N! Z; a: {( _4 U5 g- Q
  8.   (command "ROTATE" czy_p "" p "c" "180"): K( ~+ U# O2 g* j( D  R
  9.   (command "ROTATE" czy_p "" p "c" "270")
    * b- b0 J6 V# m3 `0 x8 f3 ^8 k# c. H
  10.   (setvar "clayer" old_lay)2 G! y$ _0 J" Z
  11.   (initget 0 "u")                        ;定义关键字. |: q% H7 a' Z! A4 @1 Y/ E
  12.   (if (= (getkword "\n确定或 [放弃(U)]:") "u");检查用户输入的关键字决定是否放弃1 Y0 `+ D+ e8 ?  @' |- G
  13.     (repeat 5 (command "u"))  ;放弃前面5个命令的结果
    , _/ E5 ~$ @" p. \
  14. ;;;    (command "undo" 5)$ r7 }2 U3 S: H! o5 J" g1 W
  15.   )) R2 u+ w* e& O1 j5 [( F
  16.   (prin1)- H" @& b1 L) B' d' a- n+ i7 B8 g
  17. )                                        ;绘制圆的中心线
复制代码
 楼主| 发表于 2013-7-22 18:14:26 | 显示全部楼层 来自: 中国江苏常州
本帖最后由 2010caozhiyong 于 2013-7-22 18:29 编辑   t. O/ u7 C" b( G
woaishuijia 发表于 2013-7-22 01:46 static/image/common/back.gif
2 c8 f, F3 N6 I5 H4 M7 ]' o
非常感谢版主的回复
% ?% i- M& z5 Y  d# d' Q: ~对于我知道应该放弃5个命令的结果,该方案是行得通的,
$ f8 Z# u0 T/ p8 l7 c8 c但如果我是一个选集,且我也不知道要返回多少个命令的时候,就不适用该办法了。
& x- C5 z8 B& A5 Q1 e% D有没有一个办法,可以把我的程序打一个包,就是一个整体,执行,放弃,都是一步9 r* T! M4 d: e' g. m
如下面程序( w  ~" T/ n3 t6 M- u% I  s9 {

, X: O2 S: m5 N9 k0 B+ x, i( |(defun c:yd (/ s b p0 n0 ss a0 a s0 p00)  ! Y4 V' T5 `3 q3 `% \
  (setvar "cmdecho" 0)(setq old_osm (getvar "osmode")) (setvar "osmode" 0)
' a6 L0 g2 L2 `/ m  (setq s (ssget) p1 (list 0 0))
/ }+ M7 `& A- p7 L8 v  (setq s (ssget "p" '((0 . "circle")))
) l2 p5 ^* R2 a- `" t; {4 ?4 {! A5 w  );新建圆选集  q, q' h, g  H
  (command "copybase" p1 s "")  (command "pasteblock" p1)
' o# t( T) Z8 M+ w; _7 [  (setq n0  (-(sslength s) 1) a (ssadd))* n7 O$ V" a2 \0 }3 A' W5 n
  (if (= n0 -1) (exit))" t0 @1 T& L7 \$ S* C( S: n
  (repeat n0
/ T* ?/ U% c% m3 U$ i   (setq ss (ssname s 0)  p0 (czy_yxd ss) )1 d, j9 i: J7 }2 c
   (if (/= p0 p00)(progn
- P2 Z+ P8 B& m     (command "POINT" p0)8 m. C2 `8 e# l9 b
     (setq a0 (entlast) a (ssadd a0 a))' K) i! P9 v3 r  x* m
     )
7 k. y; x, u# N* A   )
/ w4 S, X2 J' O1 [$ ^7 a   (setq p00 p0)
/ r7 _: M& c* [. t( |   (ssdel ss s)(command "erase" ss "")
* N0 b4 f9 B/ |3 S  )
3 `# \% r! {$ |- z  [: Y   (setq ss (ssname s 0)  p0 (czy_yxd ss) )
3 ^8 D. u* h; J) k' o   (if (/= p0 p00) (progn
1 ~4 x1 w# n0 J0 Q+ m        (command "POINT" p0)
9 h, p" @' @. c# z3 C4 d2 U9 B1 L        (setq a0 (entlast) a (ssadd a0 a))2 i9 S0 j6 {' r; y0 [
        )+ \5 G7 i1 c8 K9 B  |
     )$ N$ l0 x8 j& T$ a0 d( {
   (command "erase" ss "")  V/ v0 c( q2 h$ H# u; b
   (command "copybase" p0 a "") (command "erase" a "")(command "pasteblock" p0)$ z8 J# ^! w$ e% o4 D# t
(setvar "osmode" old_osm)(setvar "cmdecho" 1)- z! i5 z# ?! l
(princ)
1 y7 o2 L  l* b" k  R: N( x( g);框选圆,并删除圆,在圆心处添加点! r1 C5 ^) C0 C% i" _3 w# i9 W
发表于 2013-7-22 18:18:17 | 显示全部楼层 来自: 中国吉林吉林市
那你就声明一个局部变量专门用于记录之前执行了多少个命令啊
 楼主| 发表于 2013-7-22 18:32:14 | 显示全部楼层 来自: 中国江苏常州
woaishuijia 发表于 2013-7-22 18:18 static/image/common/back.gif+ A( G6 x% S5 C3 m" `5 O
那你就声明一个局部变量专门用于记录之前执行了多少个命令啊
1 p7 v- E; F5 \" j- x1 q1 _1 k
没有弄过,不会5 y2 Q9 F  b! i
版主,能不能帮我在以上程序里,添加一下啊% h& C8 B6 M; r) w: Z
谢谢啊* a# \  c4 F: F, m
 楼主| 发表于 2013-7-22 18:38:48 | 显示全部楼层 来自: 中国江苏常州
woaishuijia 发表于 2013-7-22 18:18 static/image/common/back.gif8 N3 Y$ y( N+ |6 ~
那你就声明一个局部变量专门用于记录之前执行了多少个命令啊
* j# h. Z; p+ k2 c5 `
QQ图片20130722183435.jpg + f- M3 N2 l) G+ K
上面是燕秀工具箱里的文字成线命令7 \4 m. y. ~9 Q; {2 g) ^
我爆炸成线后,发现不对,我按“CTRA+Z”后出现的代码  R- S) d2 b7 C# K+ Z
版主知道,该程序是如何办到的吗?$ H5 D) C# N$ u* j# V
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


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

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

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