找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2315|回复: 15

[求助] [求助]:看似简单:COMMAND命令画line线, 然后显示ok

[复制链接]
发表于 2005-8-3 23:34:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
请看这个程序:

(defun c:L()
  (command "._line" )
  (princ "ok! ")
)

能运行,但运行后的现象是先显示ok, 然后才提示输入点。

编这个程序目的是要画完任意多线段后才显示ok,也就是彻底执行完AUTOCAD的LINE命令后再转回到LISP的(princ "ok")。

其实这只是一个测试程序,真正的目的是想知道怎样在LISP程序里调用AUTOCAD命令而不用预置该命令的全部参数。例如INSERT命令,有很多选项,我希望人工任意组合选择这些选项里的某几项。  似乎用COMMAND不可能做到这一点。 有没有什么好办法呢?

我不想用编程的方法选择所有可能的选项然后再分别传送到AUTOCAD的命令里。这样做就好比“重新发明轮子”,呵呵。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2005-8-4 00:26:24 | 显示全部楼层
  1. [FONT=courier new](defun c:test ()
  2.   (if (setq pt1 (getpoint "\n起点<退出> : "))
  3.     (progn
  4.       (command "._line" pt1)
  5.       (while (setq pt2 (getpoint pt1 "\n下一点<退出> : "))
  6.         (command pt2)
  7.         (setq pt1 pt2)
  8.       )
  9.       (command)
  10.     )
  11.   )
  12.   (princ "\nOK!")
  13.   (princ)
  14. )[/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-8-4 15:53:30 | 显示全部楼层
加个 "pause" 试试。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-8-4 19:13:47 | 显示全部楼层
感谢楼上二位回复!

看了2楼的程序才知道 command 函数还可以这么用 : (command pt)

再仔细地看了一遍autolisp的帮助中对command 命令的解释,原文是这样的:

(command [arguments] ...)

The command function evaluates each argument and sends it to AutoCAD in response to successive prompts。(command 函数计算每个argument参数的值并按顺序传递给 AutoCAD 的提示)

原来一直以为command 函数的第一个参数一定是一个AutoCAD 的命令呢。其实command 函数只是把LISP 参数传递到AutoCAD中, 本身并不执行任何AutoCAD 的命令。

好,虽然没有解决我的问题,但是搞清楚了一个概念。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-8-5 08:33:55 | 显示全部楼层
(defun c:L()
(command "._line"  pause pause "")
(princ "ok! ")
)

当没有pause时, lisp程序会一直执行, 直到最后.
pause的功能就是暂停程序执行, 完成后再执行pause后的代码!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-8-5 08:39:11 | 显示全部楼层
最初由 网络水手 发布
[B](defun c:L()
(command "._line"  pause pause)
(princ "ok! ")
)

当没有pause时, lisp程序会一直执行, 直到最后.
pause的功能就是暂停程序执行, 等待用户的输入. 完成后再执行pause后的代码! [/B]

不能满足要求!
[php]l ._line Specify first point:
Specify next point or [Undo]:
Specify next point or [Undo]: ok! "ok! "

Specify next point or [Undo]:
Specify next point or [Close/Undo]:
Specify next point or [Close/Undo]:
Specify next point or [Close/Undo]:
Specify next point or [Close/Undo]:
Specify next point or [Close/Undo]:
Specify next point or [Close/Undo]:
Specify next point or [Close/Undo]:
Specify next point or [Close/Undo]:
Specify next point or [Close/Undo]:
Specify next point or [Close/Undo]:
Specify next point or [Close/Undo]:
Specify next point or [Close/Undo]:
[/php]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-8-5 13:15:00 | 显示全部楼层
最初由 xyp1964 发布
[B][QUOTE]最初由 网络水手 发布
[B](defun c:L()
(command "._line"  pause pause)
(princ "ok! ")
)

当没有pause时, lisp程序会一直执行, 直到最后.
pause的功能就是暂停程序执行, 等待用户的输入. 完... [/B]


上面我只是说明一下 pause 的情况,:
下面的如何?

(defun c:L(/ tt)
  (command "._line")
  (while (setq tt (getpoint))
    (command tt)
    )
  (command "")
  (princ "ok! ")
  (princ)
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-8-5 16:09:47 | 显示全部楼层
最初由 网络水手 发布
[B][QUOTE]最初由 xyp1964 发布
[B][QUOTE]最初由 网络水手 发布
[B](defun c:L()
(command "._line"  pause pause)
(princ "ok! ")
)

当没有pause时, lisp程序会一直执行, 直到最后.
pause的功... [/B]

自己试试,觉得好吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-8-5 19:42:50 | 显示全部楼层
从上面的讨论以及实践,我们可以搞清 command 函数的概念 以及 pause 的功能:

command 函数本质上是建立lisp程序和autocad之间的桥梁, 不过是单向的, 只能把参数从lisp程序传递到autocad;

pause 只是等待用户输入(一个pause 仅等待一次输入)。


能不能实现lisp程序和autocad之间的双向桥梁呢? 也就是如何从 lisp程序发出请求,让autocad执行任意一条autocad命令(比如 LINE, PLINE, COPY 。。。。等等), 在执行过程中,这条autocad命令的所有需要的参数均由用户自由输入(注意不是从lisp程序传递), 等autocad执行完这条autocad命令后, 再回到lisp程序。

再引申一下, 怎样才能让程序知道autocad 执行完了某个autocad命令呢?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-8-5 20:14:46 | 显示全部楼层
又学会了一些函数,有哪位有没有把LSP的函数更形象的解释?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-8-5 20:35:20 | 显示全部楼层
最初由 网络水手 发布
[B](defun c:L()
(command "._line"  pause pause)
(princ "ok! ")
)


没问题,可以执行。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-8-6 16:01:21 | 显示全部楼层
执行是可以执行, 但是事实上有问题。
xyp1964 版主在第六楼的帖子里已经明确给出了运行结果:

l ._line Specify first point:
Specify next point or [Undo]:                        ;点取了第一个点
Specify next point or [Undo]: ok! "ok! "        ;点取了第二个点后就显示了ok及返回值“ok”,说明LISP程序已经结束。

Specify next point or [Undo]:                 ;接下来的提示实际上是autocad的line命令还没有结束,并不是lisp程序在运行
Specify next point or [Close/Undo]:
Specify next point or [Close/Undo]:
Specify next point or [Close/Undo]:
Specify next point or [Close/Undo]:
Specify next point or [Close/Undo]:
Specify next point or [Close/Undo]:
Specify next point or [Close/Undo]:
Specify next point or [Close/Undo]:
Specify next point or [Close/Undo]:
Specify next point or [Close/Undo]:
Specify next point or [Close/Undo]:
Specify next point or [Close/Undo]:


最开始输入的两个点是因为有两个pause。 如果有3个pause,那么将会在点取3个点后显示ok。


----------

另外, 在看了这个帖子点击进入 后, 知道了用
vlr-command-reactor 函数可以最终解决autocad向lisp程序发出通知的问题。有兴趣的不妨去看一下,版主还给出了该函数的用法。

感谢 eachy 版主的加分鼓励!
并再次感谢 xyp1964 和aeo 两位版主的热心帮助!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-8-9 10:10:36 | 显示全部楼层
最初由 doubao 发布
[B]从上面的讨论以及实践,我们可以搞清 command 函数的概念 以及 pause 的功能:

command 函数本质上是建立lisp程序和autocad之间的桥梁, 不过是单向的, 只能把参数从lisp程序传递到autocad;

pause 只是等待?.. [/B]


再加一个问题,CAD执行被调用的命令时,怎么从LISP传递这个程序中的某个或者某些参数呢?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-8-9 12:11:12 | 显示全部楼层
请举例说明一下情况
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-8-10 12:23:09 | 显示全部楼层

  1. ;;By LUCAS
  2. ;;不是看似簡單,是真的簡單!
  3. ;;但INSERT命令卻真的不是那麼簡單(插入帶屬性的blk或dwg)!
  4. (defun C:L (/ *ERROR* ERR HOLDECHO OLD_ERROR)
  5.   (defun ERR (MSG)
  6.     (setvar "cmdecho" HOLDECHO)
  7.     (setq *ERROR* OLD_ERROR)
  8.     (princ)
  9.   )
  10.   (setq OLD_ERROR *ERROR*)
  11.   (setq *ERROR* ERR)
  12.   (setq HOLDECHO (getvar "cmdecho"))
  13.   (setvar "cmdecho" 0)
  14.   (prompt "\n指定第一點: ")
  15.   (command "_.line")
  16.   (setvar "cmdecho" 1)
  17.   (while (= 1 (getvar "cmdactive"))
  18.     (command PAUSE)
  19.   )
  20.   (prompt "\nOk! ")
  21.   (setq *ERROR* OLD_ERROR)
  22.   (setvar "cmdecho" HOLDECHO)
  23.   (princ)
  24. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2025-9-28 11:11 , Processed in 0.191666 second(s), 60 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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