明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3310|回复: 8

不按Esc键,取消lisp程序

[复制链接]
发表于 2005-11-29 16:53 | 显示全部楼层 |阅读模式

在不按esc键的前提下,使用cad的本来的命令如line,erase...可以用(command)来取消。

但是如果我执行的是lisp程序,再用(command)就会显示Can't reenter LISP. 有没有什么办法不安esc键,来中断lisp程序呢?谢谢

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2005-11-29 17:17 | 显示全部楼层
(EXIT)
 楼主| 发表于 2005-11-29 18:00 | 显示全部楼层

 

(defun c:aaa ()
 (ssget)
 )

好像还是不行吗。仍然提示不能重输入lisp

 命令: aaa
选择对象: (exit)
无法重复进入 LISP。
*无效选择*
需要点或窗口(W)/上一个(L)/窗交(C)/框(BOX)/全部(ALL)/栏选(F)/圈围(WP)/圈交(CP)/编
组(G)/添加(A)/删除(R)/多个(M)/前一个(P)/放弃(U)/自动(AU)/单个(SI)
选择对象: *取消*

 

发表于 2005-11-30 10:15 | 显示全部楼层

这个命令是我抄来的,也没有用过,你自己试一下吧,不知道符合不符合你的要求

   (vl-cmdf  [arguments] ...)

功能

    执行 AutoCAD 命令

说明

     1)l-cmdf 函数和 command 函数类似,但在求值传递的参数方面有所不同。

         a)vl-cmdf 函数在执行 AutoCAD 命令之前检查所有的描述参数,如果在这一过程中检测到错误,将不再执行AutoCAD命令。

         b)  command 函数将每个参数顺序传递给 AutoCAD,所以在发现错误之时命令可能已开始执行了。

         c)   如果对命令的调用中包含对其他函数的调用,则 vl-cmdf 在执行命令之前先进行函数调用。而 command 则在开始执行命令后执行定函数调用。

        d )  有些命令在通过 vl-cmdf 调用时表现正常,而在通过 command 调用时则会失败。

        vl-cmdf 函数主要突破了在 command 中不能使用 getxxx 的限制。

   2 ) 参数 arguments 是AutoCAD 命令及选项。

       a)根据执行命令提示的要求,arguments 参数可以为字符串、实数、整数或点。空字符串和按 ENTER 键的效果一样。不带参数调用 vl-cmdf 和按 ESC 的效果一样,可以取消大多数 AutoCAD 命令。

       b)如果在 Visual LISP 中执行 vl-cmdf,焦点不会转换到 AutoCAD 窗口中。若命令要求用户输入,则返回值 (T) 将出现在控制台窗口中,但 AutoCAD 继续等待输入。此时,必须手动激活 AutoCAD 窗口来响应提示。但在这之前,将停止执行任何后续命令。

   返回值:

        T

   样例:

       加深 command 和 vl-cmdf 的区别,在 AutoCAD 命令提示行(而不是 VLISP 控制台提示)输入下列代码:

       1)使用 command 时,先执行 LINE 命令,然后再调用 getpoint 函数。

    

        命令:(command "line" (getpoint " getpoint ") '(0 0) "")

            line 指定第一点:getpoint

            指定下一点或 [放弃(U)]:

        命令:nil

       2)使用 vl-cmdf 时,先调用 getpoint 函数,然后再执行 LINE 命令。

        命令:(VL-CMDF "line" (getpoint "getpoint!") '(0 0) "")

                         getpoint!line 指定第一点:

              指定下一点或 [放弃(U)]:

        命令:T

3)由于向 LINE 命令传递了一个无效点表,command 函数将每个参数依次传递给 AutoCAD,而并不计算参数,所以不能检测到无效的点表,函数被取消。

命令:(command "line" (getpoint "getpoint?") '(0) "")

line 指定第一点:point?

指定下一点或 [放弃(U)]:

命令:ERASE nil

选择对象:指定对角点:*取消*

找到 0 个

命令:(VL-CMDF "line" (getpoint "getpoint!") '(0) "")

getpoint!应用程序错误: 发送到 ads_cmd 的类型无效。

nil

这是因为  vl-cmdf 在传递命令前先计算每个参数,所以检测到了无效点表,不再继续执行命令。

 

 

发表于 2005-11-30 10:31 | 显示全部楼层
citykunan发表于2005-11-29 18:00:00 (defun c:aaa ()(ssget)) 好像还是不行吗。仍然提示不能重输入lisp 命令...
(exit)是在程序中用的,不是在命令行,,,在命令行,你输什么有按ESC来得快呢?
 楼主| 发表于 2005-11-30 13:17 | 显示全部楼层

飞版主,我是想在对话框中调用一个lisp程序,但是在调用这个程序时,可能一个lisp正在运行,叫你选择物体什么的。所以先要将原来的lisp终止,退出选择状态,这样后一个程序才能send to command。不知有没有什么办法可以解决呢?在toolbar中可以用^c^c的方法,不知在lisp中行不行呢?

发表于 2005-11-30 13:41 | 显示全部楼层
下次提问是把你的情况说明白了,,,你说的是在其它语言情况吧(比如VBA),,,这样的话应该到VBA版块问比较合适
发表于 2005-11-30 13:51 | 显示全部楼层
Command: c COPY
Select objects: Specify opposite corner: 2 found
Select objects: (command ^c ^c)
nil
Command:
COPY
Select objects: (command ^c ^c)
nil
发表于 2005-11-30 22:01 | 显示全部楼层
citykunan发表于2005-11-30 13:17:00 飞版主,我是想在对话框中调用一个lisp程序,但是在调用这个程序时,可能一个lisp正在运行,叫你选择物体什么的。所以先要将原来的lisp终止,退出选择状态,这...

LISP一般只能有一个程序在运行,不可能出现您说的情况。

如果是选择物体,可以这样写:

(IF (SETQ SS (SSGET)) (PROGN

......;加入您的处理

))
当您想不选择物体时,可以用空回车响应SSGET,这样程序就会跳到后面运行了。

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-21 09:49 , Processed in 0.234000 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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