既然先选择后操作在VBA中可以实现,我们就试一下让VBA程序变成透明命令。呵呵,这个想法在以前想都不敢想。
先试试前面的那个程序,在命令行中输入:
(vlax-add-cmd "cc" 'c:cc "cc" 3)
好了,然后用“'cc”的命令方式调用该VBA程序。不错,可以用了。
再试试在其它命令中调用,看来也没有问题吧。
可以说,我们已经成功了。
既然成功,我们就得想一个简单的方法来让这种实现,还是上面那个AutoVBALoad。就再改一下吧:-
- ;;自动加载VBA程序的函数
- (vl-load-com)
- (defun AutoVBALoad (app cmdliste stat / qapp strcmd)
- (setq qapp (strcat """ app """))
- (mapcar
- '(lambda (cmd / nom_cmd dot nodotcmd)
- (progn
- (setq dot (vl-string-search "." cmd))
- (if dot
- (setq nodotcmd (substr cmd (+ dot 2)))
- (setq nodotcmd cmd)
- )
- (setq nom_cmd (strcat "C:" nodotcmd))
- (if (member stat '(0 1 2 3 4 5 6 7))
- (setq strcmd
- (strcat"(vlax-add-cmd "" nodotcmd "" \'"
- nom_cmd """ nodotcmd """ (itoa stat) " )"))
- (setq strcmd "")
- )
- (eval
- (read (strcat
- "(defun " nom_cmd "(/ app)"
- "(if (setq app(fdvbfile " qapp "))"
- "(progn(vla-runmacro (vlax-get-acad-object) (strcat app "!" cmd ""))"
- strcmd ")"
- "(nodvbfile " qapp "))"
- "(princ ))"
- )))))
- cmdliste
- )
- (princ)
- )
- (defun fdvbfile (app)
- (if (not (findfile app))
- (if (not (findfile (strcat app ".dvb"))) nil (strcat app ".dvb")) app)
- )
- (defun nodvbfile (filename)
- (princ (strcat "\n文件 " filename "(.dvb) 在搜索路径文件夹中未找到。" ))
- (princ "\n请检查支持文件的安装,然后重试。")
- (princ)
- )
现在,这个函数增加了一个参数,来让用户选择VBA命令是否生成为AutoCAD命令,或透明命令,或什么都不要,只生成执行命令。
stat参数的含义:0,做为AutoCAD内部命令。1,生成透明命令,还有2,3,4,5,6,7这几种,跟选择方式有关吧,这些的含义可查看vlax-add-cmd函数。除了以上这几种参数外,其它参数均被认为不生成AutoCAD内部命令。
上一贴的命令方法:
复制代码再给大家举个简单的例子吧,把以下程序保存为文件ZZ.DVB文件:
-
- Sub ZP()
- ZoomPrevious
- End Sub
- Sub ZA()
- ZoomAll
- End Sub
- Sub ZE()
- ZoomExtents
- End Sub
- Sub ZW()
- ZoomPickWindow
- End Sub
这是缩放命令的几个快捷方式,使用的是VBA方式实现,我们现在就把它做成透明命令。
(AutoVBALoad "ZZ" '("ZA" "ZP" "ZE" "ZW") 3)
这样,我们就可以在命令期间使用'za,'ze,'zp等来直接缩放窗口了。
[U]到目前为止,我们已经可以让VBA程序与LISP程序一样了。以后,我们就不用为了VBA程序难以调用,不能先选择后操作以及不能透明引用而认为VBA程序有很大的缺陷吧。[/U]
|