明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1343|回复: 10

[源码] autoLisp 显示及控制 IE 浏览器的一种方法

[复制链接]
发表于 2020-7-15 18:56:18 | 显示全部楼层 |阅读模式
本帖最后由 yxp 于 2020-7-15 19:11 编辑

用 autolisp 显示一个浏览器窗口,并展示来自程序或网络的内容。通常情况,可以创建一个 activex 对象进行操作。IE 文档对象的方法、事件、属性可参考 MSDN 网站,但是在 win10 x64 环境中不可行,具体如下。


在 CAD 命令行中运行以下代码:
(setq ie (vlax-create-object “InternetExplorer.Application”))
(vlax-property-available-p ie 'Document) ;;返回 nil
(vlax-method-applicable-p ie 'Navigate) ;;返回nil
(vlax-dump-object xx t) ;;返回对象不支持 ITypeInfo 接口


这种方法在 win10 x64 环境中行不通,经过本人测试,在 AutoCAD 中除了 openDCL 第三方插件,还可以用 Windows 的 hta 技术来创建并控制一个网页。如果需要 浏览器 向 CAD 发出数据通讯,则需要借助 IE 的 activex 对象,通过 COM 接口向 CAD 输入数据。
将以下代码保存到磁盘并在 CAD 中加载后,在命令窗口依次输入:
(lsp2html) 创建一个 ie 对象
(add-dot) 向浏览器添加文档节点

  1. ;; lisp 创建及控制 ie 对象示例
  2. (defun lsp2html (/ runStr)
  3.   (setq obj_ws (vlax-get-or-create-object "WScript.Shell")
  4.         runStr (strcat (getenv "Windir")  ;;showintaskbar=no 任务栏不显示图标
  5.                        "\\syswow64\\mshta.exe about:\"<head><hta:application><object id='shell' classid='clsid:8856F961-340A-11D0-A96B-00C04FD705A2'><param name=RegisterAsBrowser value=1></object><script>shell.putproperty('AutocadDemo',document.parentWindow);</script></head>\""
  6.                )
  7.   )
  8.   (vlax-invoke obj_ws 'run runStr 0 0) ;; 最后一个 0 是异步执行
  9.   (vlax-release-object obj_ws)
  10. )

  11. ;; 获取 ie 窗口的控制句柄
  12. ;; 由于 ie 窗口异步创建,如果运行 (lsp2html) 后立即执行本函数,将无法获取窗口控制,需要一定的延迟时间
  13. (defun get-windows (/ n counts)
  14.   (setq obj_app (vlax-get-or-create-object "Shell.Application")
  15.         win     (vlax-invoke obj_app 'Windows)
  16.         counts  (vlax-get-property win 'count)
  17.         n       0
  18.   )
  19.   (while
  20.     (progn
  21.       (setq f (vlax-invoke win 'item n)
  22.             n (1+ n)
  23.       )
  24.       (setq *html* (if f (vlax-invoke f 'GetProperty "AutocadDemo")))
  25.       (and (<= n counts) (null *html*))
  26.     )
  27.   )
  28.   (vlax-release-object obj_app)
  29. )

  30. ;; 向浏览器窗口输出网页文字
  31. ;; 右键页面刷新后,仍将显示 write 的输出内容
  32. (defun doc-write ()
  33.   (if (null *html*) (get-windows))
  34.   (setq *doc* (vlax-get-property *html* 'document)) ;; 获取浏览器的 document 对象
  35.   (vlax-put-property *doc* 'title "AutoLisp调用浏览器展示")
  36.   (vlax-invoke *doc*
  37.                'write
  38.                "<html><head></head><body><h1>LISP生成的网页</h1><div id='divA'>使用 AutoLisp 控制浏览器对象,展示新的内容</div></body></html>"
  39.   )
  40. )

  41. ;; document 对象节点控制
  42. (defun add-dot ()
  43.   (if (null *doc*) (doc-write))
  44.   (setq divA (vlax-invoke *doc* 'getElementById "divA")) ;; 获取 id 节点元素对象
  45.   (if divA
  46.     (progn
  47.       (setq oldhtml (vlax-get-property divA 'innerHTML)
  48.             newhtml (strcat oldhtml
  49.                             "<br><font color='red'>采用 Windows HTA 技术,</font><b>将网页整合</b>为文件"
  50.                             "<br><button οnclick='runAlert()'>修改标题</button><button οnclick='reWinSize()'>浏览器尺寸</button>"
  51.                             "<br><button οnclick='window.print()'>页面打印</button><button οnclick='winClose()'>窗口关闭</button>"
  52.                             "<br><img class='picture' src='http://bbs.mjtd.com/static/image/common/logo.png'>"
  53.                     )
  54.       )
  55.       (vlax-put-property divA 'innerHTML newhtml) ;; 修改 id 节点内容
  56.     )
  57.   )
  58. )

  59. ;; 页面添加 css 样式文件
  60. (defun add-css ()
  61.   ;; 创建一个 css 样式组件 link 对象
  62.   (setq css (vlax-invoke *doc* 'createElement "link"))
  63.   (vlax-put-property css 'rel "stylesheet")
  64.   (vlax-put-property css 'href "d:\\cad\\test\\demo.css")
  65.   (setq heads (vlax-invoke *doc* 'getElementsByTagName "head")
  66.         head  (vlax-invoke heads 'item 0)
  67.   )
  68.   (vlax-invoke head 'appendChild css) ;; 在 head 后添加
  69. )

  70. ;; 页面导入 JavaScript 文件引用
  71. (defun add-js ()
  72.   ;; 创建一个 script 元素对象
  73.   (setq js (vlax-invoke *doc* 'createElement "script"))
  74.   (vlax-put-property js 'type "text/javascript")
  75.   (vlax-put-property js 'src "d:\\cad\\test\\demo.js") ;; 文件引用式添加
  76.   (setq heads (vlax-invoke *doc* 'getElementsByTagName "head")
  77.         head  (vlax-invoke heads 'item 0)
  78.   )
  79.   (vlax-invoke head 'appendChild js) ;; 在 head 后添加
  80. )


将以下 js 代码保存 d:\cad\test\demo.js 文件中,并在 CAD 中运行 (add-js) ,即可向页面导入 javascript 文件

  1. // 修改窗口标题
  2. function runAlert() {
  3.   document.title = "CAD控制浏览器示例";
  4.   alert('窗口标题已修改');
  5. }


  6. // 页面移动及尺寸
  7. function reWinSize() {
  8.   window.moveTo(20, 20);  // 窗口移动
  9.   window.resizeTo(600, 350);  // 窗口大小
  10. }


  11. // 页面关闭
  12. function winClose() {
  13.   window.opener = null;
  14.   window.open('', '_self');
  15.   window.close();
  16. }


将以下 css 样式文件保存在 d:\cad\test\demo.css 中,并在 CAD 命令行中运行 (add-css) 向页面添加 css 样式文件

  1. * {
  2.   padding: 0;
  3.   margin: 0;
  4. }

  5. body {
  6.   background-color: burlywood;
  7.   overflow-y: hidden;
  8.   margin: 0 auto;
  9. }

  10. #divA {
  11.   padding: 10px;
  12.   background-color: #ebd7a1;
  13.   line-height: 20px;
  14.   text-align: center;
  15.   border-radius: 10px;
  16. }

  17. button {
  18.   margin: 3px 0;
  19. }

  20. .picture {
  21.   margin: 10px;
  22. }




源码打包下载:

本帖子中包含更多资源

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

x

评分

参与人数 2明经币 +2 收起 理由
tryhi + 1 这个厉害,可以做一个收款注册页面
muwind + 1 很给力!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2020-7-15 22:12:19 | 显示全部楼层
膜拜大神,啥时候搞个AI+autolisp+AutoCAD出来
发表于 2020-7-16 09:53:06 | 显示全部楼层
为Y版的钻研点赞
发表于 2020-7-16 14:54:05 | 显示全部楼层
支持高手的作品
发表于 2020-7-17 20:34:14 | 显示全部楼层
很牛叉的操作
发表于 2020-7-18 16:11:56 | 显示全部楼层
哇塞,好东西,
这样是不是可以用览器做表格?dcl做表格太low了,
接下来的问题是,假如用html做了表格,选中了表格的一行数据,能否把选中的数据传回CAD中

发表于 2020-7-18 20:23:59 | 显示全部楼层
牛人真多。想问一下,lisp可以不可以新建或删除文件?

点评

yxp
lisp对CPU和内存都可以操作,磁盘操作是最低级的。  发表于 2020-7-19 02:22
发表于 2020-7-18 21:14:55 | 显示全部楼层
可以做一个用LISP版的微信支付
发表于 2020-9-7 16:32:52 | 显示全部楼层
膜拜中,请问HTML如何与CAD互通?这样就可以抛弃DCL了。:D
发表于 2024-6-15 16:12:10 | 显示全部楼层
关键是浏览器怎么向cad传递数据, com方式开多个cad, 没法准确的判断是哪个cad
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 16:27 , Processed in 0.189394 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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