You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于CAD多段线JSON数据的AutoLisp一键生成代码需求及问题修复

AutoLisp读取JSON生成CAD多段线的正确实现

问题背景

现有一段描述CAD多段线的JSON数据(含直线、圆弧节点,支持闭合),需要编写AutoLisp代码实现一键导入并生成对应图形。此前使用ChatGPT生成的代码无法运行,即使加载json.el库也未解决。

示例JSON数据

{
 "type": "polyline",
 "points": [
   {
     "type": "arc",
     "center": {
       "x": -763.17,
       "y": -240.97
     },
     "radius": 6.5,
     "start_angle": -90,
     "end_angle": 0
   },
   // 其余节点(直线/圆弧)数据省略
 ],
 "isClosed": true,
 "hasArc": true
}

此前无效代码的问题

ChatGPT提供的代码逻辑完全倒置:它是将选中的CAD多段线导出为JSON,而非从JSON导入生成图形,且依赖的get-json-vertices、has-arc等子函数缺失,json.el的调用方式也不符合AutoLisp的JSON解析规范。

正确实现代码

以下代码可直接加载到CAD中,实现从JSON文件读取数据并生成多段线:

1. 加载JSON解析库

; 确保json.el库路径正确,若放在CAD支持路径下可直接加载
(if (not (member "json.el" (atoms-family 1)))
    (load "json.el")
)

2. 核心生成函数

(defun c:JsonToPolyline (/ json-path json-data pline-obj pt-list arc-data)
  ; 选择JSON文件
  (setq json-path (getfiled "选择多段线JSON文件" "" "json" 1))
  (if json-path
    (progn
      ; 读取并解析JSON数据
      (setq json-data (json-read-from-file json-path))
      
      ; 创建多段线对象(LWPolyline,支持圆弧)
      (setq pline-obj (vlax-ename->vla-object (entmake '((0 . "LWPOLYLINE") (100 . "AcDbEntity") (100 . "AcDbPolyline")))))
      
      ; 遍历所有节点
      (foreach p (cdr (assoc "points" json-data))
        (cond
          ; 处理圆弧段
          ((equal (cdr (assoc "type" p)) "arc")
           (setq arc-data (list
                           (angle '(0 0) (list (cdr (assoc "x" (cdr (assoc "center" p)))) (cdr (assoc "y" (cdr (assoc "center" p))))))
                           (cdr (assoc "radius" p))
                           (deg->rad (cdr (assoc "start_angle" p)))
                           (deg->rad (cdr (assoc "end_angle" p)))
                          )
           )
           ; 添加圆弧顶点
           (vlax-invoke pline-obj 'AddVertex (vlax-make-safearray vlax-vbDouble '(0 . 1)) (list (polar (cdr (assoc "center" p)) (deg->rad (cdr (assoc "start_angle" p))) (cdr (assoc "radius" p)))) arc-data)
          )
          ; 处理直线段(若JSON包含直线节点)
          ((equal (cdr (assoc "type" p)) "line")
           (setq pt (list (cdr (assoc "x" p)) (cdr (assoc "y" p))))
           ; 添加直线顶点
           (vlax-invoke pline-obj 'AddVertex (vlax-make-safearray vlax-vbDouble '(0 . 1)) pt nil)
          )
        )
      )
      
      ; 设置多段线闭合状态
      (vla-put-Closed pline-obj (cdr (assoc "isClosed" json-data)))
      
      ; 刷新图形
      (vla-update pline-obj)
      (princ "\n多段线生成完成!")
    )
    (princ "\n未选择JSON文件,操作取消。")
  )
  (princ)
)

关键注意事项

  • json.el需放置在CAD的支持文件搜索路径中(可通过OPTIONS→文件→支持文件搜索路径添加)。
  • JSON中的角度为度数,代码中已转换为AutoLisp使用的弧度。
  • 确保JSON中的坐标单位与当前CAD绘图单位一致。
  • 若JSON包含更多节点类型(如椭圆弧),需扩展cond分支进行处理。

内容的提问来源于stack exchange,提问作者cddd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 16:43:10