zml84 发表于 2025-4-12 22:57:53

加载云端的lsp代码

(vl-load-com)
(defun c:tt (/ url xPost startTime lispCode)
    "加载云端的lsp代码"

    ;; 云端 URL
    (setq url "https://tool.zml84.xyz/lisp/code_test/test.lsp")
   
    ;; 禁用缓存的方法1:URL添加时间戳参数
    (setq url (strcat url
          (if (vl-string-search "?" url)
                "&"
                "?"
          )
          "time="
          (rtos (getvar "CDATE") 2 6) ;_获取当前时间
      )
    )

    ;;尝试创建 XMLHTTP 对象
    (if(setq xPost (vlax-get-or-create-object "Microsoft.XMLHTTP"))
      (progn

            ;; 同步打开连接
            (vlax-invoke-method xPost 'open "GET" url :vlax-false)

            ;; 禁用缓存的方法2:禁用缓存的完整实现
            (vlax-invoke-method
                xPost
                'SetRequestHeader
                "If-Modified-Since"
                "0"
            ) ;_设置请求头禁用缓存。
            (vlax-invoke-method
                xPost
                'SetRequestHeader
                "Cache-Control"
                "no-cache"
            ) ;_标准HTTP请求头指令,其作用为:客户端必须向服务器验证缓存有效性。与响应头中的 Cache-Control 不同,此处是客户端主动声明缓存策略。
            (vlax-invoke-method
                xPost
                'SetRequestHeader
                "Pragma"
                "no-cache"
            ) ;_针对HTTP/1.0客户端,与Cache-Control形成兼容性覆盖。
            (vlax-invoke-method
                xPost
                'SetRequestHeader
                "Expires"
                "0"
            ) ;_设置资源过期时间为过去时间,强制客户端重新请求。
            (vlax-invoke-method
                xPost
                'SetRequestHeader
                "If-None-Match"
                "*"
            ) ;_客户端要求服务器验证所有缓存版本,无论ETag(实体标签)具体值如何。

            ;; 发送请求
            (vlax-invoke-method xPost 'send)

            ;; 判断状态,并添加超时机制
            (setq startTime (getvar "DATE"))
            (while (and(/= (vlax-get-property xPost 'readyState) 4)
                        (< (- (getvar "DATE") startTime) 5) ;_5秒超时
                  )
                (princ "\r正在等待响应...")
            )

            ;; 检查请求是否成功完成
            (if(and (= (vlax-get-property xPost 'readyState) 4)
                  (= (vlax-get-property xPost 'status) 200)
                )
                (progn
                  ;; 取出结果
                  (setq lispCode
                        (vlax-get-property xPost 'responseText)
                  )

                  ;; 显示内容
                  (print lispCode)

                  ;; 运行代码
                  (eval (read (strcat "(progn " lispCode ")")))
                )
                (princ (strcat "****出错啦。HTTP错误"
                        (itoa (vlax-get-property xPost 'status))
                        ":"
                        (vlax-get-property xPost 'statusText)
                  )
                )
            )

            ;; 释放资源
            (vlax-release-object xPost)
      )
      (princ "****出错啦。无法创建 XMLHTTP 对象。")
    )

    ;; 静默退出
    (princ)
)

kozmosovia 发表于 6 天前

hn10183051 发表于 2025-4-16 08:00
要能直接加载云端代码,怎么实现

在Gitee创建一个公共项目,然后把代码上传并记住路径,然后使用下面的VLDCL在线加载代码,将读取地址替换成你的lsp路径即可。
((lambda (/ OA OB)
   (vl-load-com)
   (and(setq OA "https://gitee.com/kozmos/tachyoncloud/raw/master/StableVLX/LoadVLDCL"
      OB (vlax-create-object "winhttp.winhttprequest.5.1")
)
(progn (vlax-invoke OB "open" "get" OA :vlax-true)
         (vlax-invoke OB "send")
         (vlax-invoke OB "WaitforResponse" 1000)
         (eval (read (vlax-get OB "ResponseText")))
         (setq OB (vlax-release-object OB))
)
   )
)
)


hn10183051 发表于 5 天前

kozmosovia 发表于 2025-4-16 09:34
在Gitee创建一个公共项目,然后把代码上传并记住路径,然后使用下面的VLDCL在线加载代码,将读取地址替换 ...

哥,这个代码怎么只在每一个图形加载一次。我按照你的做法,程序加载一次,菜单栏又加载一次。有什么办法?

hn10183051 发表于 5 天前

kozmosovia 发表于 2025-4-16 13:35
fas可以读取URL的FAS数据,不保存成文件而是转stream,再用隐藏函数加载stream

更加通用的方式是用CURL ...

下载(临时)目录,加载后删除,文件大了有点卡,

tigcat 发表于 2025-4-13 21:39:02

大佬玩得高端.

hn10183051 发表于 7 天前

想学习怎么做到的

i小小白i 发表于 7 天前

有报错。不知道为什么

kozmosovia 发表于 7 天前

本帖最后由 kozmosovia 于 2025-4-15 16:13 编辑

你这好像读取的是个FAS或者VLX

hn10183051 发表于 6 天前

要能直接加载云端代码,怎么实现

vink8023 发表于 6 天前

hn10183051 发表于 2025-4-16 08:00
要能直接加载云端代码,怎么实现

可以实现

hn10183051 发表于 6 天前

kozmosovia 发表于 2025-4-16 09:34
在Gitee创建一个公共项目,然后把代码上传并记住路径,然后使用下面的VLDCL在线加载代码,将读取地址替换 ...

如果是VLX或者fas呢

kozmosovia 发表于 6 天前

fas可以读取URL的FAS数据,不保存成文件而是转stream,再用隐藏函数加载stream

更加通用的方式是用CURL或者XML下载VLX或者FAS到本地(临时)目录,加载后删除。
页: [1] 2
查看完整版本: 加载云端的lsp代码