明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1041|回复: 7

[讨论] 混合编程-- 操作 json数据 autolisp&(python/nodejs)

[复制链接]
发表于 2025-5-19 10:28:43 | 显示全部楼层 |阅读模式
本帖最后由 vitalgg 于 2025-5-20 15:30 编辑

#+title:混合编程操作json数据

* 背景

JSON数据格式已成为大多数编程语言的内置的数据格式。它可以方便地在所使用的语言中的对象及数据和字符串之间进行转化。

autolisp本身没有对象。但是有点对表,列表。这种格式与json非常相似。但是Autolisp中的整数和浮点数精度及范围有限,在相互转化时数值类型的数据会失真。

为了保持数据的一致性。我们可以调用外部程序进行处理,如python。

windows下的大多数CAD支持visuallisp,现在就用 winhttp.httprequest 做为中介让autolisp与python进行交互编程。

* 服务端
** python 版本
jsonserver.py 内容:
#+begin_src python
  1.     from flask import  Flask,jsonify,request
  2.     import json
  3.     jsonobj = {};
  4.     app = Flask(__name__)
  5.     @app.route('/api/json',methods=['GET'])
  6.     def get_json():
  7.         global jsonobj
  8.         return json.dumps(jsonobj)

  9.     @app.route('/api/json',methods=['POST'])
  10.     def init_json():
  11.         global jsonobj
  12.         jsonobj = request.json;
  13.    
  14.         return json.dumps(jsonobj)

  15.     @app.route('/api/json_set',methods=['POST'])
  16.     def set_json():
  17.         global jsonobj
  18.         data = request.json;
  19.         for key in data:
  20.             jsonobj[key] = data[key]
  21.         return json.dumps(jsonobj)

  22.     if __name__ == '__main__':
  23.         app.run(debug=True)


#+end_src

安装python及需要的包
#+begin_src shell
  winget install python.python.3.13
  pip install flask
#+end_src

运行服务端
#+begin_src shell
  python jsonserver.py
#+end_src

** nodejs 版本

  1. const http = require('http');
  2. // const url = require("url");
  3. const port = 5000;

  4. let jsonobj = {};

  5. http.createServer((req, res) => {
  6.     const {url ,method} = req;
  7.    
  8.     res.statusCode = 200,
  9.     res.setHeader('Content-Type', 'text/plain;charset=utf-8');
  10.     if( req.url === '/api/json' && req.method === 'GET') {
  11.         toGet(req, res);
  12.     }else if( req.url === '/api/json' && req.method === 'POST') {
  13.         toPost(req, res);
  14.     }else if( req.url === '/api/json_set' && req.method === 'POST') {
  15.         toSetPost(req, res);
  16.     }
  17.    
  18. }).listen(port, () => {
  19.     console.log(`Server listening on: http://localhost:${port}`);
  20. });

  21. //获取GET请求内容
  22. function toGet(req, res){
  23.     res.end(JSON.stringify(jsonobj));
  24.     console.log(JSON.stringify(jsonobj));
  25. }

  26. //获取POST请求内容、cookie
  27. function toPost(req, res){
  28.     let data = '';
  29.     req.on('data', function(chunk){   
  30.         data += chunk;
  31.     });
  32.     req.on('end', function(){   
  33.   jsonobj = JSON.parse(data);
  34.         res.end(JSON.stringify(jsonobj));
  35.         console.log(jsonobj);
  36.     });
  37. }
  38. function toSetPost (req, res){
  39.     let data = '';
  40.     req.on('data', function(chunk){   
  41.         data += chunk;
  42.     });
  43.     req.on('end', function(){   
  44.   reqdata = JSON.parse(data);
  45.   for(var key in reqdata){
  46.       jsonobj[key]=reqdata[key];
  47.   };
  48.         res.end(JSON.stringify(jsonobj));
  49.     });
  50. }
复制代码


* 客户端

@lisp 内置了 http 交互函数,可以用 @::@get , @::postjson 与服务端进行交互。
没有安装 @lisp的可以执行以下代码,网络加载需要的函数。
  1. (progn(vl-load-com)(setq s strcat h"http"o(vlax-create-object (s"win"h".win"h"request.5.1"))v vlax-invoke e eval r read)(v o'open "get" (s h"://""atlisp.""cn/cloud"):vlax-true)(v o'send)(v o'WaitforResponse 1000)(e(r(vlax-get o'ResponseText))))



默认端口是5000,你也可以修改,只要保证服务端与客户端一致就可以了。

** 初始化json对象

#+begin_src lisp
  
  1. (@::postjson "http://localhost:5000/api/json" "{\"k1\":\"v1\",\"k2\":\"v2\",\"k3\":\"v3\"}")


设置键值

  1. (@::postjson "http://localhost:5000/api/json_set" "{\"k1\":\"aaa\"}")


取 json,当然上面的设置后也会直接返回结果

  1. (@::@get "http://localhost:5000/api/json")



原文:https://gitee.com/atlisp/atlisp- ... 8D%E4%BD%9Cjson.org

本帖子中包含更多资源

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

x
"觉得好,就打赏"
还没有人打赏,支持一下
回复

使用道具 举报

 楼主| 发表于 2025-5-19 12:00:22 | 显示全部楼层
CAD命令行不能输入太长的字符串,我们写成 lsp  文件。



加载:(load "test/json")

初始化 json 字串为 json对象
(@::postjson "http://localhost:5000/api/json" jsonstr)



设置某个键值。如Ttile , WedmType

(@::postjson "http://localhost:5000/api/json_set" "{\"Title\":\"ABCD\", \"WedmType\":  2}")



提交的键值替换成了新值。并且长整数能保持原值。


本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

发表于 2025-5-19 15:53:53 | 显示全部楼层
有点复杂,简单应该是vlisp调用vb的json
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-5-19 16:17:51 | 显示全部楼层
本帖最后由 vitalgg 于 2025-5-19 16:21 编辑

大量的 python 库在等你。
torch , opencv, numpy, vllm


Package                                  Version
---------------------------------------- ---------------------------
aiohappyeyeballs                         2.6.1
aiohttp                                  3.11.18
aiosignal                                1.3.2
airportsdata                             20250224
annotated-types                          0.7.0
anyio                                    4.9.0
astor                                    0.8.1
attrs                                    25.3.0
blake3                                   1.0.4
cachetools                               5.5.2
certifi                                  2025.4.26
charset-normalizer                       3.4.2
click                                    8.2.0
cloudpickle                              3.1.1
cmake                                    4.0.2
compressed-tensors                       0.9.4
datasets                                 3.6.0
Deprecated                               1.2.18
depyf                                    0.18.0
dill                                     0.3.8
diskcache                                5.6.3
distro                                   1.9.0
dnspython                                2.7.0
einops                                   0.8.1
email_validator                          2.2.0
fastapi                                  0.115.12
fastapi-cli                              0.0.7
filelock                                 3.18.0
frozenlist                               1.6.0
fsspec                                   2025.3.0
gguf                                     0.16.3
googleapis-common-protos                 1.70.0
grpcio                                   1.71.0
h11                                      0.16.0
hf-xet                                   1.1.1
httpcore                                 1.0.9
httptools                                0.6.4
httpx                                    0.28.1
huggingface-hub                          0.31.1
idna                                     3.10
importlib_metadata                       8.6.1
interegular                              0.3.3
Jinja2                                   3.1.6
jiter                                    0.9.0
jsonschema                               4.23.0
jsonschema-specifications                2025.4.1
lark                                     1.2.2
llguidance                               0.7.19
lm-format-enforcer                       0.10.11
markdown-it-py                           3.0.0
MarkupSafe                               3.0.2
mdurl                                    0.1.2
mistral_common                           1.5.4
modelscope                               1.25.0
mpmath                                   1.3.0
msgspec                                  0.19.0
multidict                                6.4.3
multiprocess                             0.70.16
nest-asyncio                             1.6.0
networkx                                 3.4.2
ninja                                    1.11.1.4
numpy                                    2.2.5
openai                                   1.78.1
opencv-python-headless                   4.11.0.86
opentelemetry-api                        1.33.0
opentelemetry-exporter-otlp              1.33.0
opentelemetry-exporter-otlp-proto-common 1.33.0
opentelemetry-exporter-otlp-proto-grpc   1.33.0
opentelemetry-exporter-otlp-proto-http   1.33.0
opentelemetry-proto                      1.33.0
opentelemetry-sdk                        1.33.0
opentelemetry-semantic-conventions       0.54b0
opentelemetry-semantic-conventions-ai    0.4.8
outlines                                 0.1.11
outlines_core                            0.1.26
packaging                                25.0
pandas                                   2.2.3
partial-json-parser                      0.2.1.1.post5
pillow                                   11.2.1
pip                                      25.1.1
prometheus_client                        0.21.1
prometheus-fastapi-instrumentator        7.1.0
propcache                                0.3.1
protobuf                                 5.29.4
psutil                                   7.0.0
py-cpuinfo                               9.0.0
pyarrow                                  20.0.0
pycountry                                24.6.1
pydantic                                 2.11.4
pydantic_core                            2.33.2
Pygments                                 2.19.1
python-dateutil                          2.9.0.post0
python-dotenv                            1.1.0
python-json-logger                       3.3.0
python-multipart                         0.0.20
pytz                                     2025.2
PyYAML                                   6.0.2
pyzmq                                    26.4.0
referencing                              0.36.2
regex                                    2024.11.6
requests                                 2.32.3
rich                                     14.0.0
rich-toolkit                             0.14.6
rpds-py                                  0.24.0
safetensors                              0.5.3
scipy                                    1.15.3
sentencepiece                            0.2.0
setuptools                               79.0.1
setuptools-scm                           8.3.1
shellingham                              1.5.4
six                                      1.17.0
sniffio                                  1.3.1
starlette                                0.46.2
sympy                                    1.14.0
tiktoken                                 0.9.0
tokenizers                               0.21.1
torch                                    2.7.0+cpu
torchaudio                               2.7.0+cpu
torchvision                              0.22.0+cpu
tqdm                                     4.67.1
transformers                             4.51.3
triton                                   3.2.0
typer                                    0.15.3
typing_extensions                        4.13.2
typing-inspection                        0.4.0
tzdata                                   2025.2
urllib3                                  2.4.0
uvicorn                                  0.34.2
uvloop                                   0.21.0
vllm                                     0.8.5.dev619+g60f762433.cpu
watchfiles                               1.0.5
websockets                               15.0.1
wheel                                    0.45.1
wrapt                                    1.17.2
xgrammar                                 0.1.18
xxhash                                   3.5.0
yarl                                     1.20.0
zipp                                     3.21.0

回复 支持 反对

使用道具 举报

发表于 2025-5-20 09:38:10 | 显示全部楼层
我们好像搞过一次python,发现对系统依赖太严格了,比如说  vcruntime  等等,我们客户现场有WEN7  WEN8  WEN10  WEN11  含ghost系统,最后,我们放弃了python,选择go,go是自给自足的,对系统依赖极低
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-5-20 10:06:47 | 显示全部楼层
本帖最后由 vitalgg 于 2025-5-20 10:27 编辑
dcl1214 发表于 2025-5-20 09:38
我们好像搞过一次python,发现对系统依赖太严格了,比如说  vcruntime  等等,我们客户现场有WEN7  WEN8  W ...

python的模块太多,相互依赖,而且各版本或自身的版本前后兼容性太差。
py2 跟 py3 之间也互不兼容。好多模块是个人开发者公布和维护的,比较随意。

所以运行python要做环境隔离。如docker 或 venv . 在docker 或 venv 下 ,python 也是自给自足的。
回复 支持 反对

使用道具 举报

发表于 2025-5-22 08:33:50 | 显示全部楼层
AI对这种模式熟悉吗?有尝试AI来编写相关代码吗?有没有相关提示词来解释这种模式?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-5-22 10:10:11 | 显示全部楼层
moshouhot 发表于 2025-5-22 08:33
AI对这种模式熟悉吗?有尝试AI来编写相关代码吗?有没有相关提示词来解释这种模式?

这种模式只是通过http进行数据通信。可以是本地服务,也可以是网络服务。
ActiveX是通过COM+. 本地服务类似COM+, 网络服务类似DCOM

然后就可以发挥各语言的优势了。把lisp也变成胶水。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-24 04:13 , Processed in 0.164510 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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