QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
本帖最后由 2010caozhiyong 于 2013-7-21 10:26 编辑 : q8 x  F) i9 b, f' Y

, i0 L; ]4 l5 O: R& ]6 w9 |/ L# u小弟一直有个困惑,自己编了很多程序,尤其是一些有循环的很长程序,结果画出来之后,发现画错了9 p# M3 T4 @- W/ f' @( ?
然后,我就按放弃命令(Ctrl+Z)结果要按上几分钟才能一步一步的返回的最初状态3 {& k( K3 D0 |; `: Z
我简单复制了一个程序,如下,怎样添加内容,使该程序能成为一个整体,就像CAD内部程序一样,一步就可以返回到最初状态,谢谢. L6 P, R" t2 \2 d& D

4 }- D! x0 J/ m7 @9 K(defun c:xy(/ p czy_p)$ \" c8 y5 o" x/ V% p; K
(setq p (GETPOINT "选择中心点:"))  h& m6 o4 u& T3 S$ ]
(setq old_lay (getvar "clayer"))3 {# x& Z7 k0 ?5 C
(COMMAND "LAYER" "n" "center" "set" "center" "")
: K3 G# M" r1 r" Z9 {(command "line" p pause "")
4 F) S3 z6 N% I; g. t( z* a(setq czy_p (entlast))1 a5 T3 j$ d2 f# U( y; i
(command "ROTATE" czy_p "" p "c" "90"); a' }6 o0 s+ t. ^5 S
(command "ROTATE" czy_p "" p "c" "180"); P4 e0 M, e0 F" M, x  N& E
(command "ROTATE" czy_p "" p "c" "270"); [/ R( f% D" w7 d: p" s5 a/ v! K
(setvar "clayer" old_lay)3 s2 ?4 j1 |* r
(prin1)
  ~. `( a" q2 ~' p% y. v);绘制圆的中心线" [* o4 ^) x5 q' E9 V+ |2 [" O: `

/ h, ?9 p! I& w
 楼主| 发表于 2013-7-21 12:11:21 | 显示全部楼层
本帖最后由 2010caozhiyong 于 2013-7-21 12:14 编辑 4 A3 \2 e  b: w$ `; f' F4 H

( V1 ?4 {1 U) L  ?解释一下,可能朋友们没有听清楚意思
, z$ e0 R# g) N1 k, h, q, K, \就是我程序编好了,加载后,在CAD窗口下运行后,发现我的画出来的图形不太对,想返回后重新画
3 g8 Q3 `( U5 J但是,我在cad里用(Ctra+Z)命令,要一直按好久好久,才能一步一步的返回到我运行这个程序之前的状态  [) d$ `4 a! X5 k% v$ J- I
我现在想一步就返回到最初的状态,怎么修改程序呢?6 _- Y0 I$ D5 Z  b8 _5 P
就像cad内部命令一样,阵列了好多图元,我发现不对,想放弃,直接按一下(Ctra+Z)就行了,不要按好多下
发表于 2013-7-22 01:46:33 | 显示全部楼层
本帖最后由 woaishuijia 于 2013-7-22 01:48 编辑 ! d8 O; E; U  n3 q: f
  1. (defun c:xy (/ p old_lay czy_p)
    % O/ k2 U) D. D* M- K" G2 t, h
  2.   (setq p (GETPOINT "选择中心点:"))9 ]6 i2 ~, P; a! l) P
  3.   (setq old_lay (getvar "clayer"))
    / B8 j: `) C# \8 C
  4.   (COMMAND "LAYER" "n" "center" "set" "center" "")
    & T& m8 ~3 K4 C# Q0 X- c* X) g7 J% I% ^
  5.   (command "line" p pause "")) {" m: h: v2 C) e! f
  6.   (setq czy_p (entlast))
    2 r, t* V, U5 K& j$ W# E. _
  7.   (command "ROTATE" czy_p "" p "c" "90")
    # f; e9 i! I2 h/ I0 B. T2 r
  8.   (command "ROTATE" czy_p "" p "c" "180")$ }, x8 H! h( ?# D
  9.   (command "ROTATE" czy_p "" p "c" "270")
    - g3 N+ y$ G: j, G' `) s9 ~9 O
  10.   (setvar "clayer" old_lay)
    3 j$ p9 ]# v+ Y6 f8 }% v
  11.   (initget 0 "u")                        ;定义关键字( D$ M( W( j( r1 @# B  d. s- N
  12.   (if (= (getkword "\n确定或 [放弃(U)]:") "u");检查用户输入的关键字决定是否放弃1 [1 U% J+ c" A5 Z2 T
  13.     (repeat 5 (command "u"))  ;放弃前面5个命令的结果
    . y. K& k8 c$ Y: X  c& `
  14. ;;;    (command "undo" 5)8 o( z# [/ p/ U) n  E3 h. B& o# F
  15.   )
    . c) u+ l9 `/ Y" @6 x9 {3 A7 k# @7 i! e
  16.   (prin1)8 r) R! P# y$ U
  17. )                                        ;绘制圆的中心线
复制代码
 楼主| 发表于 2013-7-22 18:14:26 | 显示全部楼层
本帖最后由 2010caozhiyong 于 2013-7-22 18:29 编辑
5 M! R/ c- k5 S  Y+ B. V3 R
woaishuijia 发表于 2013-7-22 01:46 static/image/common/back.gif
' X* d+ U% e; M& c/ e
非常感谢版主的回复& q; r- Y, u+ P# Y
对于我知道应该放弃5个命令的结果,该方案是行得通的,
( c5 a* Q# }- v! K4 D0 K5 x但如果我是一个选集,且我也不知道要返回多少个命令的时候,就不适用该办法了。5 ~% K) P9 @' `  U) Z
有没有一个办法,可以把我的程序打一个包,就是一个整体,执行,放弃,都是一步
/ M4 H: a6 E( Y+ b3 N: O3 L如下面程序
" ]0 G- i& }$ n2 E+ f
+ \% o5 G) R. c3 i0 a$ e% k(defun c:yd (/ s b p0 n0 ss a0 a s0 p00)  
3 V4 ~+ N( Q5 I7 R: Y  (setvar "cmdecho" 0)(setq old_osm (getvar "osmode")) (setvar "osmode" 0)
1 o$ ~2 t! z( t  d. t+ b5 O3 X3 f  (setq s (ssget) p1 (list 0 0))* g1 K9 P5 E9 g, [# T
  (setq s (ssget "p" '((0 . "circle")))& U3 f5 ]8 K' H
  );新建圆选集2 v; Z  k7 G5 @
  (command "copybase" p1 s "")  (command "pasteblock" p1)
0 E. p; W  A& c- z  (setq n0  (-(sslength s) 1) a (ssadd))
. S/ r0 G# F! }7 G8 Y0 o1 M8 C  (if (= n0 -1) (exit))# a4 L% ^2 O9 F! H% k
  (repeat n08 z* m% D3 v: @! y
   (setq ss (ssname s 0)  p0 (czy_yxd ss) )% q" N8 ]. s6 h8 j6 p" l
   (if (/= p0 p00)(progn
0 p9 n. x0 E, P     (command "POINT" p0)
  D3 H$ ^; b* P1 q- D5 S, C     (setq a0 (entlast) a (ssadd a0 a))
+ @% K; ?  R- s# d7 @     )
9 a& m! P' G& H# \   )& V- h' ?. Q3 K
   (setq p00 p0)
7 t  P3 L7 h" u* q# J$ v   (ssdel ss s)(command "erase" ss ""): F: T3 m/ K) u) b5 k
  )
3 G8 |9 z" @8 i3 g1 h4 P   (setq ss (ssname s 0)  p0 (czy_yxd ss) )& D, n& m, A4 _' H( N, }" @4 g
   (if (/= p0 p00) (progn# A3 {) I0 M% [+ O5 {
        (command "POINT" p0)7 M! \1 S* X. |& Z  z
        (setq a0 (entlast) a (ssadd a0 a))& c6 z, L1 q, s9 E: ^9 s
        )0 K% E7 b2 [5 V9 R* s
     )
1 Y0 I- u6 g: G& y& ?+ _2 P   (command "erase" ss "")8 k8 r* I+ x( C" r
   (command "copybase" p0 a "") (command "erase" a "")(command "pasteblock" p0)
! t  d' V" u: }. L- P (setvar "osmode" old_osm)(setvar "cmdecho" 1)0 ~" H. I8 u8 E" t- E" k5 [
(princ)
( J; w! G2 O. a8 f);框选圆,并删除圆,在圆心处添加点
& B  N4 [5 t1 |- u! `2 H
发表于 2013-7-22 18:18:17 | 显示全部楼层
那你就声明一个局部变量专门用于记录之前执行了多少个命令啊
 楼主| 发表于 2013-7-22 18:32:14 | 显示全部楼层
woaishuijia 发表于 2013-7-22 18:18 static/image/common/back.gif
6 `. P% H7 Z- [  x4 _. k那你就声明一个局部变量专门用于记录之前执行了多少个命令啊
+ A  g( w8 P8 b# S8 l
没有弄过,不会- E1 M. z& u/ Q; o5 _; |- J
版主,能不能帮我在以上程序里,添加一下啊
/ |4 Z, Q2 |; s# {% V! ]$ {) O谢谢啊# i5 o: V3 k4 j5 z+ p) @4 B
 楼主| 发表于 2013-7-22 18:38:48 | 显示全部楼层
woaishuijia 发表于 2013-7-22 18:18 static/image/common/back.gif# J2 ~! q3 x7 q+ X( u
那你就声明一个局部变量专门用于记录之前执行了多少个命令啊
. k) K( ]5 f# o9 w( ?& W
QQ图片20130722183435.jpg
/ ~" Y( A+ L5 X7 O上面是燕秀工具箱里的文字成线命令
# T1 g5 U2 V0 ~. S我爆炸成线后,发现不对,我按“CTRA+Z”后出现的代码3 G& ]* f1 l9 `6 q/ C) N  Y( p+ @9 f
版主知道,该程序是如何办到的吗?$ H. `3 M6 X" h2 i6 C: Q
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

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