明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 321|回复: 3

[源码] 自动标注命令 还可以改进 请各位大佬指教 刚学习LiSP(新人帖)

[复制链接]
发表于 前天 16:57 | 显示全部楼层 |阅读模式

  1. (defun c:DBB( / *error* ssBase ssIntersect lstBaseEnts lstIntersectEnts lstLines lstDims)
  2.     (vl-load-com)
  3.    
  4.     (defun *error* (msg)
  5.         (if (and lstLines (vlax-ldata-get "DimLines" "CreatedLines"))
  6.             (foreach ent (vlax-ldata-get "DimLines" "CreatedLines") (entdel ent))
  7.         )
  8.         (if (and lstDims (vlax-ldata-get "DimLines" "CreatedDims"))
  9.             (foreach ent (vlax-ldata-get "DimLines" "CreatedDims") (entdel ent))
  10.         )
  11.         (princ "\nError: ")
  12.         (princ msg)
  13.         (princ)
  14.     )

  15.     ;; 选择基准线
  16.     ;(princ "\n选择基准线: ")
  17.     ;(setq ssBase (car (entsel "\n选择基准线: ")))
  18.   ;  (if (not (member (cdr (assoc 0 (entget ssBase))) '("LINE" "LWPOLYLINE")))
  19.   ;      (progn (alert "必须选择直线或轻量多段线!") (exit)))
  20.   
  21.     (if (not (setq ssBase (ssget  '((0 . "LINE,LWPOLYLINE")))))
  22.       (progn (alert "未选择基准线!") (exit))
  23.       (princ "\n--------已选择基准线:-------- ")
  24.     )

  25.     ;; 选择相交线
  26.     ;(princ "\n选择相交线: ")
  27.     ;(setq ssIntersect (car (entsel "\n未选择相交线: ")))
  28.   ;  (if (not (member (cdr (assoc 0 (entget ssIntersect))) '("LINE" "LWPOLYLINE")))
  29.   ;      (progn (alert "未选择相交线!") (exit)))
  30.     (if (not (setq ssIntersect (ssget '((0 . "LINE,LWPOLYLINE")))))
  31.         (progn (alert "未选择相交线!") (exit))
  32.       (princ "\n--------已选择相交线:-------- ")
  33.     )

  34.     ;; 转换选择集为实体列表
  35.    
  36.     (setq lstBaseEnts (vl-remove-if 'listp (mapcar 'cadr (ssnamex ssBase))))
  37.     (setq lstIntersectEnts (vl-remove-if 'listp (mapcar 'cadr (ssnamex ssIntersect))))

  38.     ;; 步骤1:创建连接线
  39.     (setq lstLines (CreateConnectionLines lstBaseEnts lstIntersectEnts))
  40.     (vlax-ldata-put "DimLines" "CreatedLines" lstLines)

  41.     ;; 步骤2:创建标注
  42.     (setq lstDims (CreateAlignDims lstLines))
  43.     (vlax-ldata-put "DimLines" "CreatedDims" lstDims)

  44.     ;; 步骤3:解除标注关联
  45.     (DisassociateDims lstDims)

  46.     ;; 步骤4:删除临时线
  47.     (foreach ent lstLines (entdel ent))
  48.    
  49.     ;; 步骤5:删除零值标注
  50.     (foreach dim lstDims
  51.         (if (ZeroDimCheck dim)
  52.             (entdel dim)
  53.         )
  54.     )
  55.   
  56.     (princ)
  57. )



  58. ;; 创建连接线函数
  59. (defun CreateConnectionLines (baseEnts intersectEnts / lstLines)
  60.     (setq lstLines '())
  61.     (foreach baseEnt baseEnts
  62.         (setq lstPoints (GetIntersectionPoints baseEnt intersectEnts))
  63.         (if (> (length lstPoints) 1)
  64.             (progn
  65.                 (setq lstPoints (SortPointsOnCurve baseEnt lstPoints))
  66.                 (setq lstLines (append (CreateLinesBetweenPoints lstPoints) lstLines))
  67.             )
  68.         )
  69.     )
  70.     lstLines
  71. )

  72. ;; 获取所有交点
  73. ;; 获取所有交点(修正后的版本)
  74. (defun GetIntersectionPoints (baseEnt others / lstPoints pts3d)
  75.     (setq lstPoints '())
  76.     (foreach otherEnt others
  77.         (setq pts (vlax-invoke (vlax-ename->vla-object baseEnt) 'IntersectWith
  78.                                (vlax-ename->vla-object otherEnt) acExtendNone))
  79.         ;; 将三维坐标点列表转换为二维点列表
  80.         (if (> (length pts) 2)
  81.             (progn
  82.                 ;; 新增加的三维点分组处理
  83.                 (setq pts3d '())
  84.                 (repeat (/ (length pts) 3) ; 确保按三个元素分组
  85.                     (setq pts3d (cons (list (car pts) (cadr pts) (caddr pts)) pts3d))
  86.                     (setq pts (cdddr pts))
  87.                 )
  88.                 ;; 转换为二维点并过滤无效点
  89.                 (setq pts2d (mapcar '(lambda (pt) (list (car pt) (cadr pt))) (reverse pts3d)))
  90.                 (setq lstPoints (append pts2d lstPoints))
  91.             )
  92.         )
  93.     )
  94.     ;; 过滤不在基准线上的点
  95.     (vl-remove-if-not '(lambda (pt) (vlax-curve-getParamAtPoint baseEnt pt)) lstPoints)
  96. )

  97. ;; 按曲线参数排序点
  98. (defun SortPointsOnCurve (ent pts)
  99.     (vl-sort pts '(lambda (a b) (< (vlax-curve-getParamAtPoint ent a) (vlax-curve-getParamAtPoint ent b))))
  100. )

  101. ;; 创建点间连线
  102. (defun CreateLinesBetweenPoints (pts / lstLines prev)
  103.     (setq lstLines '() prev (car pts))
  104.     (foreach pt (cdr pts)
  105.         (setq ent (entmakex (list '(0 . "LINE") (cons 10 prev) (cons 11 pt))))
  106.         (if ent (setq lstLines (cons ent lstLines)))
  107.         (setq prev pt)
  108.     )
  109.     lstLines
  110. )

  111. ;; 创建对齐标注
  112. (defun CreateAlignDims (lines / lstDims)
  113.     (setq lstDims '())
  114.     ;; 用户选择侧边
  115.     (initget "Up Down")
  116.     (setq side (getkword "\n选择标注侧边[上(Up)/下(Down)]: "))
  117.   
  118.     (foreach line lines
  119.         (setq obj (vlax-ename->vla-object line))
  120.         (setq p1 (vlax-get obj 'StartPoint))
  121.         (setq p2 (vlax-get obj 'EndPoint))
  122.         
  123.         ;; 计算偏移方向
  124.         (setq ang (angle p1 p2))
  125.         (setq offsetPt1 (polar p1 (+ ang (/ pi 2)) 500))
  126.         (setq offsetPt2 (polar p1 (- ang (/ pi 2)) 500))
  127.         
  128.         
  129.         
  130.         ;; 创建标注
  131.         (if (eq side "Up")
  132.             (command "_.dimaligned" "_non" p1 "_non" p2 "_non" offsetPt1)
  133.             (command "_.dimaligned" "_non" p1 "_non" p2 "_non" offsetPt2)
  134.         )
  135.         (setq lstDims (cons (entlast) lstDims))
  136.     )
  137.     lstDims
  138. )

  139. ;; 解除标注关联
  140. (defun DisassociateDims (dims)
  141.     (command "_.dimdisassociate" (ssget "_X" '((0 . "DIMENSION"))))
  142. )

  143. ;;零值判断
  144. (defun ZeroDimCheck (dim)
  145.     (equal
  146.       (cdr (assoc 42 (entget dim)))
  147.       0.0
  148.       1e-6) ; 带容差的零值判断
  149. )
  150. (princ "请输入DBB调用函数!")


本帖子中包含更多资源

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

x

评分

参与人数 1明经币 +1 收起 理由
yaokui25 + 1 很给力!

查看全部评分

回复

使用道具 举报

 楼主| 发表于 前天 20:30 | 显示全部楼层

是的  AI写的  自己也调了一下
回复 支持 1 反对 0

使用道具 举报

发表于 昨天 17:14 | 显示全部楼层
同行啊               
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-13 05:48 , Processed in 0.157660 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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