明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: 无痕

[原创] !将vbscript移植到lisp!

    [复制链接]
发表于 2007-8-9 19:13:00 | 显示全部楼层
难得上网,一上来就见到不错的资料
发表于 2007-8-9 20:59:00 | 显示全部楼层
本帖最后由 作者 于 2007-8-9 21:01:10 编辑

虽说有的方面功能可能比lisp多一点点但事实上大多数都是用不到的啦!
我这个函数写出来很久了,但几乎都没用到过,
在CAD的lisp中用不到太高深的系统方面的知识的,
就如之前一高人发的win32api for lisp功能够强大吗?但为什么用的人不多
用来解决时常小小的CAD问题的,实际上就lisp就够了没必要用太多的混合编程,
会很多编程语言的人都不用lisp来编程了.
想想你都可以在lisp中用字符拼成VB语句说明你VB用的很好哦
你直接就用VBA来写程序不是更快更好?,为什么还要用lisp来拼写VB语句呢?
下面我的fsxm-vbs源程序代码,
秘诀就是:写一个会写vbs函数的lisp程序!
这是核心代码:
  (foreach x cmd
    (setq i (1+ i))
    (setq pastr (if x (strcat "Fsxm" (itoa i)) " "))
    (setq cmdstr0 (strcat cmdstr0 " , " "Fsxm" (itoa i)))
    (setq cmdstr1 (strcat cmdstr1 " , " pastr))
  )
完整代码如下:
  1. (cond ((null *MSSC*)
  2.        (setq *MSSC* (vlax-create-object "MSScriptControl.ScriptControl"))
  3.        (vlax-put *MSSC* "Language" "VBS")
  4.       )
  5. )
  6. (defun Fsxm-VBS-Eval (str)
  7.   (vlax-invoke *MSSC* 'eval str)
  8. )
  9. (defun Fsxm-VBS-Exec (str)
  10.   (vlax-invoke-method *MSSC* 'ExecuteStatement str)
  11. )
  12. (defun Fsxm-VBS-Run (Fun_lst)
  13.   (vl-catch-all-apply 'vlax-invoke(vl-list* *mssc* "run" Fun_lst))
  14. )
  15. (defun Fsxm-VBS (VBSlst / cmd cmdstr0 cmdstr1 func i pastr return)
  16.   (setq func (vl-princ-to-string (car VBSlst))
  17. cmdstr0 ""
  18. cmdstr1 ""
  19. i 0
  20. cmd (cdr VBSlst)
  21.   )
  22.   (foreach x cmd
  23.     (setq i (1+ i))
  24.     (setq pastr (if x (strcat "Fsxm" (itoa i)) " "))
  25.     (setq cmdstr0 (strcat cmdstr0 " , " "Fsxm" (itoa i)))
  26.     (setq cmdstr1 (strcat cmdstr1 " , " pastr))
  27.   )
  28.   (setq cmdstr0 (substr cmdstr0 4))
  29.   (setq cmdstr1 (substr cmdstr1 4))
  30.   (Fsxm-VBS-Exec
  31.     (strcat
  32.       "Function Fsxm_vbs(" cmdstr0  ")\nFsxm_vbs = Array ("
  33.       func     "("   cmdstr1
  34.       "))\nEnd Function"
  35.      )
  36.   )
  37.   (setq return (vl-catch-all-apply
  38.    'vlax-invoke
  39.    (append (list *mssc* "run" "Fsxm_vbs") cmd)
  40.         )
  41.   )
  42.   (if (listp return) (car return) return)
  43. )

评分

参与人数 1威望 +2 明经币 +5 收起 理由
mccad + 2 + 5 【好评】好程序

查看全部评分

发表于 2007-8-10 11:31:00 | 显示全部楼层
看样子,可以打通alisp的任督二脉了。
发表于 2007-8-10 22:34:00 | 显示全部楼层
相当不错的资料,的确让人大开眼界。既然fsxm大侠已经公布了秘诀,无痕版主是否舍得将你的源程序拿出来让大家共赏,对比和学习学习呢?
发表于 2007-8-11 02:21:00 | 显示全部楼层
强悍!!编程越来越简单了,但是想成为高手却越来越难了!!!
发表于 2007-8-11 13:14:00 | 显示全部楼层
i fl u.l h.
 楼主| 发表于 2007-8-12 00:11:00 | 显示全部楼层
本帖最后由 作者 于 2007-8-12 1:09:37 编辑

fsxm 的 写一个会写vbs函数的lisp程序! 的想法很好.我进行了如下测试

(fsxm-vbs '(msgbox "测试"))
(fsxm-vbs '(msgbox "测试" & "ok")) -> 丢失"ok"
(fsxm-vbs '(msgbox (strcat "测试 " "&" " ok"))) -> #<%catch-all-apply-error%>
(fsxm-vbs '(msgbox (strcat "测试 " & " ok"))) -> #<%catch-all-apply-error%>
(fsxm-vbs '(msgbox ("测试 " & " ok"))) ->#<%catch-all-apply-error%>

也许我的方法不对.没有得出想要的结果.发现未能够很好支持 &,+等函数,vbs函数在表达式中未能嵌套.

于是自己对原来的xcal做了升级.借用了fsxm的将vbs函数写成lisp函数格式的

想法.并且作了功能上的增强.将函数方式进行到底!详细介绍如下:


(xvbs a) = 函数方式执行vbs语句(第二代)    by 梁雄啸.2007.8
函数:xvbs
格式:(xvbs 函数表达式)
参数:函数表达式,格式:表 或 字符串.
      vbs函数用'引导,如:(list 'msgbox "测试") 或 '(msgbox "测试").
      可多重嵌套.
      支持lisp变量.变量不用'引导.
      支持vbs的&,+等函数.
      字符串格式,如:
测试:
1. (xvbs '(msgbox ("测试时间 : " & vbcr & now )1))
2. 支持变量:
   (setq path (getvar "acadver"))
   (xvbs (list 'msgbox (list "测试" '& 'vbcr '& path) 3))
3. 支持在函数表达式中使用lisp语句:
   (xvbs(list 'msgbox (list "测试" '& 'vbcr '& (strcat "cad版本号 = " (getvar "acadver"))) 3))
4. 连续执行多个vbs语句,支持vbs中变量传递:
   (xvbs '(cs = "测试"))
   (xvbs '(msgbox (cs & "ok"))) ;; cs是在vbs中定义的变量.
5. 支持字符串表达式:
   (xvbs "msgbox(\"测试时间:\" & now)")

再对开始的实例进行测试:

(xvbs '(msgbox ("测试 " & " ok")))  ->返回正确.

下载请点链接:

http://bbs.mjtd.com/forum.php?mod=viewthread&tid=62199

发表于 2007-8-13 07:55:00 | 显示全部楼层

以下說明有例子嗎?

2.如果VBS內容過長,可分成幾段來移植,但是被調用的子函數必須寫在前面.
                  即把調用子函數的部分放到最後.有回車的地方要保留,如:
                  (setq STR \"
                  ****移植的語句****
                   \"
                  )

下列的註解你的程序會先處理掉嗎?

;; 正則表達式應用. ok
(setq str "            
function regexptest(patrn, strng)
dim regex, match, matches   ' 建立變量。
set regex = new regexp     ' 建立正則表達式。
regex.pattern = patrn     ' 設置模式。
regex.ignorecase = true     ' 設置是否區分字符大小寫。
regex.global = true     ' 設置全局可用性。
set matches = regex.execute(strng)  ' 執行搜索。
for each match in matches   ' 遍歷匹配集合。
retstr = retstr & \"match found at position \" & match.firstindex & \". match value is '\"
retstr = retstr & match.value & \"'.\" & vbcrlf
next
regexptest = retstr
end function
msgbox(regexptest(\"is.\", \"is1 is2 is3 is4\"))
")
(xxvbs str "")

 楼主| 发表于 2007-8-13 12:00:00 | 显示全部楼层

回龙龙仔,你贴子里面那个就是实例。这只是建议的书写格式。

其实以下输入格式都是可以的:

1.
(setq str "            
a = \"测试\"
msgbox a
")
(xxvbs str "")
2.
(setq str "a = \"测试\"
           msgbox a")
(xxvbs str "")
3.
(setq str "a = \"测试\" \nmsgbox a")
(xxvbs str "")
4.
(xxvbs "a = \"测试\" \nmsgbox a" "")
5.
(xxvbs "a = \"测试\"
       msgbox a" "")

程序支持vbs语句加注解,我已经测试过,正常。

发表于 2007-8-13 12:17:00 | 显示全部楼层
本帖最后由 作者 于 2007-8-13 12:37:58 编辑

我知道你的程序支持vbs语句加注解,但我重寫的程序不支持加注解,想不出為甚麼? 

也不支持wscript.CreateObject==>要改為CreateObject

我用下列

       (setq MSSC (vlax-create-object "MSScriptControl.ScriptControl"))

  OR     (setq MSSC (vlax-create-object "ScriptControl")) 都不支持加注解

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

本版积分规则

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

GMT+8, 2024-11-29 12:54 , Processed in 0.169790 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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