QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
goto3d 说: 此次SW竞赛获奖名单公布如下,抱歉晚了,版主最近太忙:一等奖:塔山817;二等奖:a9041、飞鱼;三等奖:wx_dfA5IKla、xwj960414、bzlgl、hklecon;请以上各位和版主联系,领取奖金!!!
2022-03-11
系统
[系统通知] 平台第一个项目外包——项目拼多;正式上线,欢迎各单位个人有外包、设计、采购、加工需求的,在此寻找更牛的解决方案
2021-07-01
查看: 4865|回复: 6
收起左侧

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

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

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

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

x
本帖最后由 2010caozhiyong 于 2013-7-21 10:26 编辑
  p; P0 x+ X* I  Y' t
& M  l! F6 i+ t( g小弟一直有个困惑,自己编了很多程序,尤其是一些有循环的很长程序,结果画出来之后,发现画错了
0 O" C6 ]* a" E- a# z. s, _然后,我就按放弃命令(Ctrl+Z)结果要按上几分钟才能一步一步的返回的最初状态& B5 ]7 k$ K; b5 t
我简单复制了一个程序,如下,怎样添加内容,使该程序能成为一个整体,就像CAD内部程序一样,一步就可以返回到最初状态,谢谢+ y( m/ s1 w6 `. s
6 c' G# _5 B' ?: u% l( s
(defun c:xy(/ p czy_p)% T' }4 w1 w+ U) p8 ~0 E" H
(setq p (GETPOINT "选择中心点:"))
8 ^  H) K3 m! m(setq old_lay (getvar "clayer"))
  m' }8 k; ^" B! [' B+ y(COMMAND "LAYER" "n" "center" "set" "center" "")7 |& u/ b+ ~0 f* B
(command "line" p pause "")+ X9 C2 N# u( \1 c' q
(setq czy_p (entlast))
" I1 e2 _; C. d$ a' M. z# ?+ J7 V(command "ROTATE" czy_p "" p "c" "90")" X3 |/ n% [  @0 K
(command "ROTATE" czy_p "" p "c" "180")
5 {, g+ ?$ V/ S# r- [! q* N/ Q! u  m2 n(command "ROTATE" czy_p "" p "c" "270")
9 r* V# N7 B7 d' A% o" y' F3 k9 ?(setvar "clayer" old_lay)7 E! k! @2 c4 V, x- O1 Z
(prin1)  {) q! Q9 H" h: `6 l, A7 X, P7 |! c/ s
);绘制圆的中心线
; E  @( e6 M% B% ~  ~$ h7 P1 @8 q: y2 o4 R8 R1 u
 楼主| 发表于 2013-7-21 12:11:21 | 显示全部楼层
本帖最后由 2010caozhiyong 于 2013-7-21 12:14 编辑
5 Y5 c+ D# C( Z0 {9 r+ W; w9 w* x& H- C% ~8 e
解释一下,可能朋友们没有听清楚意思1 l. ^6 C7 u0 }* r3 v  Q* Y, A
就是我程序编好了,加载后,在CAD窗口下运行后,发现我的画出来的图形不太对,想返回后重新画
! k( y! _5 x1 h但是,我在cad里用(Ctra+Z)命令,要一直按好久好久,才能一步一步的返回到我运行这个程序之前的状态4 u8 a" n' ^& B- e# h/ W
我现在想一步就返回到最初的状态,怎么修改程序呢?2 `. \8 S+ b) A4 p' R. N
就像cad内部命令一样,阵列了好多图元,我发现不对,想放弃,直接按一下(Ctra+Z)就行了,不要按好多下
发表于 2013-7-22 01:46:33 | 显示全部楼层
本帖最后由 woaishuijia 于 2013-7-22 01:48 编辑 : C  w0 @9 H7 h& T# q9 K, F
  1. (defun c:xy (/ p old_lay czy_p)& q4 ^7 @' J. ^9 M; ]% ^
  2.   (setq p (GETPOINT "选择中心点:"))5 I: }9 J* g2 M; X& Y5 m
  3.   (setq old_lay (getvar "clayer"))5 `. c: m4 C- y3 z' s  |1 P9 C9 b
  4.   (COMMAND "LAYER" "n" "center" "set" "center" "")0 M2 p; e; Z4 [0 a: S% p
  5.   (command "line" p pause "")5 E0 [( _# r1 L( o
  6.   (setq czy_p (entlast))) k, `" s4 j( A0 P
  7.   (command "ROTATE" czy_p "" p "c" "90")4 x  k* o9 `& q3 H6 |! A
  8.   (command "ROTATE" czy_p "" p "c" "180")
    # a& R  Z+ X2 P
  9.   (command "ROTATE" czy_p "" p "c" "270")
    2 y1 {2 m; X- W, F
  10.   (setvar "clayer" old_lay)- R' O& p3 _# \: D0 g
  11.   (initget 0 "u")                        ;定义关键字
    % P- w$ y+ C0 R2 T
  12.   (if (= (getkword "\n确定或 [放弃(U)]:") "u");检查用户输入的关键字决定是否放弃  w( w4 t4 G4 e0 C1 H' w
  13.     (repeat 5 (command "u"))  ;放弃前面5个命令的结果
      n" R& f4 n+ [! X* t
  14. ;;;    (command "undo" 5)
    9 ?( d: [( V: M/ S5 `9 o  e% J6 w
  15.   )
    . [- r: ?. }& a  U) h/ W6 Z
  16.   (prin1)
    % p( h& `1 n( Z! [3 l4 s- J8 P8 F# d7 p3 K
  17. )                                        ;绘制圆的中心线
复制代码
 楼主| 发表于 2013-7-22 18:14:26 | 显示全部楼层
本帖最后由 2010caozhiyong 于 2013-7-22 18:29 编辑 , b  v8 H9 k, Z6 I# V8 Y
woaishuijia 发表于 2013-7-22 01:46 static/image/common/back.gif

! c  D* _, R3 l4 S/ T6 b非常感谢版主的回复8 f0 Q5 {. F( y# w" {5 M
对于我知道应该放弃5个命令的结果,该方案是行得通的,1 F, t8 N( O4 d! R8 ~+ P
但如果我是一个选集,且我也不知道要返回多少个命令的时候,就不适用该办法了。  m+ Y- j6 p- t& X4 T0 z3 t# E
有没有一个办法,可以把我的程序打一个包,就是一个整体,执行,放弃,都是一步# p. C( Q4 ^4 |  b# x
如下面程序
4 W: O- n$ A2 @4 Z* V+ w' H+ [4 l$ @5 S$ w
(defun c:yd (/ s b p0 n0 ss a0 a s0 p00)  8 X. i' @9 `( t) [
  (setvar "cmdecho" 0)(setq old_osm (getvar "osmode")) (setvar "osmode" 0)
( C: E% N( A; t7 |  (setq s (ssget) p1 (list 0 0))5 K+ F5 t; ~2 c8 G6 B
  (setq s (ssget "p" '((0 . "circle")))* O2 q- K2 ?& h4 Y
  );新建圆选集' r) [7 Q/ U; W; u4 I$ J5 n
  (command "copybase" p1 s "")  (command "pasteblock" p1)
1 P$ U; m$ K  }: Q! B  (setq n0  (-(sslength s) 1) a (ssadd)); L* S3 L' k. L+ m- d) F
  (if (= n0 -1) (exit))- @* j; z2 O( P; ^/ {
  (repeat n01 u% R7 a# G) i( x1 w$ N% S8 ]
   (setq ss (ssname s 0)  p0 (czy_yxd ss) )- h4 \" n5 g  p$ q
   (if (/= p0 p00)(progn  G# ?' e4 Z3 G/ h
     (command "POINT" p0)
9 O8 o: p# i. X     (setq a0 (entlast) a (ssadd a0 a))
: m6 n) H9 o5 p1 ^2 D" V     )
# F- A( M7 O; [   )- ]3 B2 |# X6 v# e/ l
   (setq p00 p0)3 o6 b- x6 V3 {/ e, ]6 j
   (ssdel ss s)(command "erase" ss "")3 Q9 S3 M$ b) t5 p! Z
  )
/ _/ I8 o+ D8 E   (setq ss (ssname s 0)  p0 (czy_yxd ss) )
1 |, u, r& Z- `: |- _   (if (/= p0 p00) (progn
6 u7 C$ K" t( d5 X: C; }3 i        (command "POINT" p0)
' m0 p; ^0 _, d2 h3 C9 v: x        (setq a0 (entlast) a (ssadd a0 a))# _7 r: i% M7 b( r3 H; O; x( u
        )
8 K6 w; H! ^+ l: Y/ G+ @) ~9 o     )9 N/ |% ^: t0 q/ ?$ C0 c6 r: i
   (command "erase" ss "")8 ?" E) X# D! x- K: T: W
   (command "copybase" p0 a "") (command "erase" a "")(command "pasteblock" p0)1 s+ B1 T1 h# G& c0 g6 V
(setvar "osmode" old_osm)(setvar "cmdecho" 1)1 N" h: q8 z3 d; y+ s# p
(princ). a& o* Q' W9 p" T
);框选圆,并删除圆,在圆心处添加点
- w/ Z- t3 n. W/ X
发表于 2013-7-22 18:18:17 | 显示全部楼层
那你就声明一个局部变量专门用于记录之前执行了多少个命令啊
 楼主| 发表于 2013-7-22 18:32:14 | 显示全部楼层
woaishuijia 发表于 2013-7-22 18:18 static/image/common/back.gif  D  P# p; @/ p* c6 `9 Q. ?$ d
那你就声明一个局部变量专门用于记录之前执行了多少个命令啊

+ b8 Y4 ~% d& f3 B3 q8 }没有弄过,不会
" c7 K+ K/ L6 l: o版主,能不能帮我在以上程序里,添加一下啊
3 a* e/ H) B+ ?$ V! K谢谢啊
" W+ x1 \# S, y6 R2 ?* r8 t
 楼主| 发表于 2013-7-22 18:38:48 | 显示全部楼层
woaishuijia 发表于 2013-7-22 18:18 static/image/common/back.gif1 |& g3 e& e. B( F( {3 ^, g" l
那你就声明一个局部变量专门用于记录之前执行了多少个命令啊
# M: f, N1 L& P9 _. |) U2 Y- U" p) z
QQ图片20130722183435.jpg
9 i  f& o+ Q- u: ]. k! Y8 r, @上面是燕秀工具箱里的文字成线命令( p) c2 Q* D# z# u; t
我爆炸成线后,发现不对,我按“CTRA+Z”后出现的代码9 H+ O5 N6 D" o# C; x" @
版主知道,该程序是如何办到的吗?
! i1 S% w; f, ]/ ^3 r9 Q7 Q- F
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

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