yxp 发表于 2018-12-26 15:53:28

[庆祝元旦] lisp 混合编程示例

先看个动态效果:

lisp 源码如下:
注意:需要 OpenDCL 库支持; 系统 DWX 注册支持
;;lisp 胶水一, by: yxp      2018-12-26
;;语言: lisp/OpenDCL/html/js/dwx
;;系统: windows10,AutoCAD 64 位
;;环境: 需要 OpenDCL 库支持; 系统 DWX 注册
;;文件: html.lspautoCAD 加载的主要 lisp 文件
;;   html.odcl 对话框主文件
;;   html.html 对话框加载的网页文件
;;   html.js   网页 JavaScript 脚本文件
;;   html.css网页 css 样式文件

(defun c:html()

(setq objCAD (vlax-get-acad-object)      ;;当前打开的 CAD 对象
*dwg* (vla-get-ActiveDocument objCAD) ;;当前激活的 dwg 文档对象
hCAD (vla-get-hwnd objCAD)            ;;顶层 CAD 对象句柄
hdwg (vla-get-hwnd *dwg*)             ;;当前 dwg 对象句柄
DWX (vlax-create-object "DynamicWrapperX"))

;;=================================================
;;取消 IE7.0 的 active 提示
(setq regPath "HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\Zones\\0"
regValue (vl-registry-read regPath "1201"))
(if (or (null regValue)(/= regValue 0))(vl-registry-write regPath "1201" 0))
;;=================================================

(dcl-Project-Load "d:/caddcl/test/html.odcl" t nil) ;;加载对话框
(dcl-Form-Show html/Form1) ;;显示 opendcl

(setq data (vlax-invoke DWX 'strget dataAddress)) ;;读取对话框传来的内存数据
(princ data) ;;显示 html 控件内容
(princ)
)

;;odcl 初始化
(defun c:html/Form1#OnInitialize (/ w h)
(dcl-Html-Navigate html/Form1/Html1 (findfile "home.html"))
(setq w (dcl-Control-GetWidth html/Form1) h (dcl-Control-GetHeight html/Form1))
(dcl-Control-SetPos html/Form1/Html1 0 0 w h)
)

;;退出时提取内存地址,采用对话框标题行转运数据,也可用注册表
(defun c:html/Form1#OnCancel (/ ss pStr hWin)
(vlax-invoke DWX 'Register "user32" "GetWindowTextW" "i=hpm" "r=m")
(setq pStr (vlax-invoke dwx 'MemAlloc 20 1)) ;;分配内存,用来存放数据的内存地址
(setq hWin (dcl-Control-GetHWND html/Form1)) ;;获取 openDcl 对话框的句柄
(vlax-invoke DWX 'GetWindowTextW hWin pStr 16) ;;读取对话框的标题行(内存地址传递)
(setq dataAddress (atoi (vlax-invoke DWX 'strget pStr))) ;;将内存地址给 lisp 变量
)


;;OpenDCL 环境自动载入
(vl-load-com)
(setq ODCLREG (strcat "HKEY_LOCAL_MACHINE\\" (vlax-product-key)
   "\\Applications\\OpenDCL"))
(or dcl_getversionex;;判断 OPEDCL 环境是否加载
(if (setq Phd (vl-registry-read ODCLREG "Loader")) ;;ODCL 是否安装
    (progn
      (arxload Phd)
      (setq ODCLREG nil Phd nil)
      ;;(princ "\n测试 ODCL 环境从 C 盘加载")
    )
    (progn;;如果 OPENDCL 没有安装则搜索 arx 文件是否存在
      (defun Load_OdclRuntime (/ vers arxname darx *error*)
      (defun *error* (msg);;错误中断提示
            (princ (strcat "\n程序加载失败,文件 " arxname " 缺失"))
            (princ)
      )
      (setq vers (substr (getvar "acadver") 1 2))
      (setq arxname (strcat "OpenDCL."
            (if (= (getenv "PROCESSOR_ARCHITECTURE") "AMD64")
                "x64." "") vers ".arx"));;区分 CAD 位
      (if (setq darx (findfile arxname))
            (if (null (member arxname (arx)))(arxload darx))
            (exit) ;;支持路径未搜到 arx,调用错误中断
      )
      )
      (Load_OdclRuntime) ;;运行加载函数
      (setq Load_OdclRuntime nil) ;;释放加载函数
    )
)
);;THE END of LOAD ODCL

(princ)

其他文件打包下载,添加到支持路径即可加载运行。

ynhh 发表于 2018-12-26 16:11:12

本帖最后由 yxp 于 2018-12-26 20:19 编辑

啥,还能编辑。

zixuan203344 发表于 2018-12-26 20:15:54

蜜蜂大神666。

自从老汉你不玩推车改玩技术了,技术突飞猛进啊

zixuan203344 发表于 2018-12-26 20:16:48

蜜蜂大神元旦快乐~

pengfei2010 发表于 2018-12-27 08:11:09

没看明白,这个效果用 lisp+ODcl 就可以实现呀!

lllllja 发表于 2018-12-27 09:23:04

厉害啦

JHX948954875 发表于 2018-12-27 16:04:37

谢谢楼主分享

纵横八方 发表于 2018-12-27 16:11:45

蜜蜂大神,来点实用的

mokson 发表于 2018-12-30 09:30:14

向高手学习!

zzyong00 发表于 2018-12-30 13:22:59

帮楼主顶一下
页: [1]
查看完整版本: [庆祝元旦] lisp 混合编程示例