明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2485|回复: 6

这样的透明命令,LISP能实现吗?

[复制链接]
发表于 2012-10-13 08:58:53 | 显示全部楼层 |阅读模式
本帖最后由 叮咚 于 2012-10-13 09:03 编辑

能做一个自己想要的 透明命令 ,在用的时候,把透明命令的值,返回给 正在 运行的命令 ,

像下边的m2p (CAD2008中有这个透明命令),可以捕捉到两点的中点,我想的是,做一个程序,做成透明命令,在CAD中应用。

问一下,LISP能实现吗?用了,vl-add-cmd 这个函数,但是,不能返回值给正在运行的命令,

是我用错了函数,还是……

给个参考,或者思路也行。能详细的最好。下边是我的透明命令

  1. (defun aaa ()
  2. (setq sc-pre (getvar "userr1"))
  3. (princ "\n当前比例 1:")(princ sc-pre)
  4. (setq lspt (getvar "lastpoint"))
  5. (vl-catch-all-apply (function (lambda()
  6. (initget "S")
  7. (setq r (getdist lspt "\n输入距离<设置比例(S)>:"))
  8. (while (= (type r) 'STR)
  9. (setq bl (getdist "\n比例:"))
  10. (princ "\n当前比例 1:")(princ bl)
  11. (setvar "userr1" bl)
  12. (setq sc-pre (getvar "userr1"))
  13. (initget "S")
  14. (setq r (getdist lspt "\n输入距离<设置比例(S)>:"))
  15. )
  16. (setq r-new (/ r sc-pre))
  17. (princ (strcat "\n输入值: " (rtos r) "    转换后: " (rtos r-new)))
  18. (terpri)
  19. )))
  20. (if r-new r-new)
  21. )
  22. (vlax-add-cmd "a" 'aaa "a" 1)




本帖子中包含更多资源

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

x
"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2012-10-13 12:39:01 | 显示全部楼层
没人看看????
 楼主| 发表于 2012-10-13 17:28:18 | 显示全部楼层
为啥我的帖子,就没人回复一下呢?》
 楼主| 发表于 2012-10-14 11:54:26 | 显示全部楼层
能有人看看不?
发表于 2015-1-30 11:15:48 | 显示全部楼层
叮咚 发表于 2012-10-14 11:54
能有人看看不?

我来看看,哈哈,但不懂
发表于 2015-1-30 11:22:03 | 显示全部楼层
LISP 可以弄成透明命令,但又限制条件,符合条件的才可以。
具体参考 vlax-add-cmd 的帮助
发表于 2015-1-30 11:28:30 | 显示全部楼层
本帖最后由 springwillow 于 2015-1-30 13:55 编辑

还是替你把命令的帮助帖到这吧!
vlax-add-cmd
将命令添加到 AutoCAD 内置命令集中
(vlax-add-cmd global-name func-sym [local-name cmd-flags])
使用 vlax-add-cmd 可以将函数定义为 AutoCAD 命令,而无需在函数名中使用 c: 前缀。用它也可以定义透明 AutoLISP 命令,而对于 c: 函数,这是不可能的。
警告! 不能使用 command 函数透明调用那些由 vlax-add-cmd 函数定义的命令。这样做会造成 AutoCAD 意外关闭。
vlax-add-cmd 函数使某个 明经通道 Visual LISP 函数在当前 AutoCAD 任务中作为 ObjectARX 类型的命令,在 AutoCAD 命令行提示中使用。vlax-add-cmd 函数提供了对 ObjectARX acedRegCmds 宏的访问,从而提供了一个到 ObjectARX 系统 AcEdCommandStack 对象的指针。
vlax-add-cmd 函数自动将命令指定到命令组。从文档名称空间发出命令时,vlax-add-cmd 将命令添加到组 doc-ID。doc-ID 是标识文档的十六进制值。从独立名称空间 VLX 发出命令时,vlax-add-cmd 将命令添加到组 VLC-Ddoc-ID:VLX-name。这里 VLX-name 是发出 vlax-add-cmd.的应用程序名。
推荐从独立名称空间 VLX 使用 vlax-add-cmd 函数。然后使用 APPLOAD 命令明确加载 VLX,这样比将 LISP 文件放到启动组好。
注意 不能使用 vlax-add-cmd 显露创建反应器对象的函数,也不能用它来显露反应器的回调函数。
参数
global-name
字符串。
func-sym
符号,指定不带参数的 明经通道 Visual LISP 函数。
local-name
字符串(缺省值为 global-name)。
cmd-flags
整数型(缺省值为 ACRX_CMD_MODAL + ACRX_CMD_REDRAW)。
主要标志有:
ACRX_CMD_MODAL (0) 在使用其他命令时不能调用该命令。
ACRX_CMD_TRANSPARENT (1) 在使用其他命令时可以调用该命令。
二级标志有:
ACRX_CMD_USEPICKSET (2) 检索选择优先集时,在 AutoCAD 中清除设置。命令能够获取优先集,但不能检索或设置夹点。
ACRX_CMD_REDRAW (4) 检索选择优先集或夹点集时,不将它们从 AutoCAD 中清除。命令可获取优先集和夹点集。
如果同时设置了 ACRX_CMD_USEPICKSET 和 ACRX_CMD_REDRAW,则效果和仅设置 ACRX_CMD_REDRAW 一样。关于标志的详细信息,请参见 《ObjectARX 参考手册》中的“Command Stack”。
返回值
如果成功则返回 global-name 参数。如果 acedRegCmds->addCommand(...) 返回错误条件,则函数返回 nil。
示例
下例中的 hello-autocad 函数没有 c: 前缀,但 vlax-add-cmd 将其作为 ObjectARX 类型的命令显示在 AutoCAD 命令行提示:
_$ (defun hello-autocad () (princ "hello Visual LISP"))HELLO-AUTOCAD_$ (vlax-add-cmd "hello-autocad" 'hello-autocad)"hello-autocad"
最后再来个示例:
;|我们知道在一个LISP写的函数或者命令执行时候,是不允许透明执行另外的LISP写的函数的,这是因为LISP不允许重入的原因。
但是,我们可以通过VLAX方法,把自己定义的LISP函数加入到ACAD的命令列表中,这样这个LISP函数就可以在COMMAND或者VL-CMDF调用,也可以变成透明执行的命令,这样,在执行LISP函数c:t1的时候,就可以透明的使用 ‘tt (执行LISP函数c:t2) 命令了。|;
(defun c:t1()
    (princ "\nHellow,I Here!!")
    (ssget)
   (princ)
)
(defun c:t2()
    (princ "\nThis is only a test!!")
    (princ)
)
(Vlax-Add-Cmd "tt" 'c:t2 "tt" ACRX_CMD_TRANSPARENT)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-23 02:57 , Processed in 0.195456 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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