明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1262|回复: 0

[分享]AutoVBALoad函数改进

[复制链接]
发表于 2008-5-13 01:59:00 | 显示全部楼层 |阅读模式
  1. ;自动加载VBA程序的函数
  2. (vl-load-com)
  3. (defun AutoVBALoad (app cmdliste stat / qapp strcmd)
  4.   (setq qapp (strcat """ app """))
  5.   (mapcar
  6.     '(lambda (cmd / nom_cmd dot nodotcmd)
  7.        (progn
  8.   (setq dot (vl-string-search "." cmd))
  9.   (if dot
  10.     (setq nodotcmd (substr cmd (+ dot 2)))
  11.     (setq nodotcmd cmd)
  12.   )
  13.   (setq nom_cmd (strcat "C:" nodotcmd))
  14.   (if (member stat '(0 1 2 3 4 5 6 7))
  15.     (setq strcmd
  16.     (strcat "(AddCommandsInMDI ""
  17.      nodotcmd
  18.      "" \'"
  19.      nom_cmd
  20.      """
  21.      nodotcmd
  22.      """
  23.      (itoa stat)
  24.      " )"
  25.     )
  26.     )
  27.     (setq strcmd "")
  28.   )
  29.   (eval
  30.     (read
  31.       (strcat
  32.         "(defun "    nom_cmd
  33.         "(/ app)"    "(if (setq app(fdvbfile "
  34.         qapp     "))"
  35.         "(progn(vla-runmacro (vlax-get-acad-object) (strcat app "!"
  36.         cmd     ""))"
  37.         strcmd     ")"
  38.         "(nodvbfile "    qapp
  39.         "))"     "(princ ))"
  40.        )
  41.     )
  42.   )
  43.        )
  44.      )
  45.     cmdliste
  46.   )
  47.   (princ)
  48. )
其中vlax-add-cmd 改成了 AddCommandsInMDI 需要配合下面两个函数:
  1. (defun AddCommandsHelper (CallingReactor CommandList / return ok)
  2.   (foreach x *AddCommandsList*
  3.     (if (and (member (type (eval (caddr x))) '(SUBR USUBR EXRXSUBR))
  4.       (setq ok (apply 'vlax-add-cmd (cdr x)))
  5. )
  6.       (setq return (cons ok return))
  7.     )
  8.   )
  9.   return
  10. )
  11. (defun AddCommandsInMDI (lst / old)
  12.   (foreach x lst
  13.     (vlax-remove-cmd (car x))
  14.     (if (setq old (assoc (strcase (car x)) *AddCommandsList*))
  15.       (setq *AddCommandsList*
  16.       (subst (cons (strcase (car x)) x)
  17.       old
  18.       *AddCommandsList*
  19.       )
  20.       )
  21.       (setq *AddCommandsList*
  22.       (cons (cons (strcase (car x)) x)
  23.      *AddCommandsList*
  24.       )
  25.       )
  26.     )
  27.   )
  28.   (if (not InitializeAddCommandsReactor)
  29.     (setq InitializeAddCommandsReactor
  30.     (vlr-docmanager-reactor
  31.       "InitializeAddCommands"
  32.       '((:vlr-documentBecameCurrent . AddCommandsHelper))
  33.     )
  34.     )
  35.   )
  36.   (AddCommandsHelper NIL NIL)
  37. )
这样就可以避免两个文档用一个命令调用VBA程序的错误了,这个方法是网上搜索来的。我学校里学的是VB,毕业自己看VBA的书,LISP是一窍不通,多亏网络的强大啊。这个bug老早就有人提过了,那个至顶的帖子几年了居然还没有解决方案,明经是不是没落了?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-26 08:40 , Processed in 0.158344 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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