明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1039|回复: 13

[源码] 提示列表有缺陷 大神给看看

[复制链接]
发表于 2025-3-13 13:39:06 | 显示全部楼层 |阅读模式
;;; ------------------------------------------------------------------------
;;; CAD闭合线段面积测量工具 (v1.2)
;;; ------------------------------------------------------------------------
;;; 作者:CAD技术开发团队
;;; 功能:智能检测闭合多段线并自动标注面积
;;; 版本:1.2.0
;;; 最后更新:2023-10-15
;;; ------------------------------------------------------------------------

;;; 初始化与清理
(defun libmain ()
  (load (strcat (getenv "ACP_LISP_PATH") "\\closed_poly_area.lsp"))
  (princ)
)

(defun libunmain ()
  (unload-plugin)
  (princ)
)

;;; 核心功能模块
(defun c:CLOSED-POLY-AREA ( / ent )
  "主命令:自动检测闭合多段线并标注面积"
  (interactive)
  (setq ent (ssname (car (getssname))))

  (if (null ent)
      (message-box "错误:请先选择闭合多段线!" "输入错误" MB_OK | MB_ICONERROR)
    (progn
      (setq obj (entget ent))
      (cond
        ;; 仅处理多段线类型
        ((member (cdr (assoc "TYPE" obj)) '("POLYLINE" "LWPOLYLINE"))
         (when (and (check-closed-polyline obj)
                (>= (length (entget obj "VERTEX")) 3))
           (progn
             (auto-label-poly-area obj)
             (display-measurement-results obj)
             (princ)
           )
         )

        (t
         (message-box (strcat "不支持类型:$" (cdr (assoc "TYPE" ent)))
                      "类型错误"
                      MB_OK | MB_ICONWARNING)
      )
    )
  )
  (princ)
)

;;; 闭合性验证模块
(defun check-closed-polyline (ent)
  "使用容差法验证多段线闭合性(精度0.001单位)"
  (let ((verts (entget ent "VERTEX"))
        (first-pt (cdr (assoc 10 (nth 1 verts))))
        (last-pt (cdr (assoc 10 (nth (length verts) verts))))
        tolerance 0.001)
    (and
     (>= (length verts) 3)
     (<= (distance first-pt last-pt) tolerance)
     (equal (cdr (assoc "CLOSED" ent)) "1") ; 检查系统闭合属性
     )
  )
)

;;; 智能标注系统
(defun auto-label-poly-area (ent)
  "自动计算并创建面积标注"
  (let ((verts (entget ent "VERTEX"))
        area
        label-pos
        style
        text-height)

    ;; 计算几何属性
    (setq area (calculate-polygonal-area verts))
    (setq centroid (get-polygon-center verts))

    ;; 获取标注样式
    (setq style (getvar "DIMSTYLE"))
    (setq text-height (getvar "DIMTXTEXT"))

    ;; 智能定位标注位置
    (setq dir (cdr (assoc "DIR" ent)))
    (unless dir
      (setq dir (vector-normalize (subtract-point centroid (car verts)))))
    (setq label-pos (offset-point centroid dir (* text-height 1.5)))




评分

参与人数 1明经币 -1 收起 理由
xyp1964 -1 垃圾码

查看全部评分

回复

使用道具 举报

发表于 2025-3-13 17:55:58 | 显示全部楼层
AI写的,找AI解决呀。
回复 支持 1 反对 0

使用道具 举报

发表于 2025-3-13 22:42:37 | 显示全部楼层
;;; ------------------------------------------------------------------------
;;; CAD闭合线段面积测量工具 (v1.2)
;;; ------------------------------------------------------------------------
;;; 作者:CAD技术开发团队
;;; 功能:智能检测闭合多段线并自动标注面积
;;; 版本:1.2.0
;;; 最后更新:2023-10-15
;;; ------------------------------------------------------------------------

;;; 初始化与清理
(defun libmain ()
  (load (strcat (getenv "ACP_LISP_PATH") "\\closed_poly_area.lsp"))
  (princ)
)

(defun libunmain ()
  (unload-plugin)
  (princ)
)

;;; 主命令函数
(defun c:CLOSED-POLY-AREA (/ ent obj)
  "主命令:自动检测闭合多段线并标注面积"
  (vl-load-com)  ; 加载ActiveX支持
  (setvar "CMDECHO" 0)  ; 关闭命令回显
  
  (setq ent (ssname (ssget ":S" '((0 . "POLYLINE,LWPOLYLINE"))) 0))
  
  (cond
    ((null ent)
     (alert "错误:请先选择闭合多段线!"))
   
    (t
     (setq obj (entget ent))
     (cond
       ((member (cdr (assoc 0 obj)) '("POLYLINE" "LWPOLYLINE"))
        (if (check-closed-polyline obj)
            (progn
              (auto-label-poly-area obj)
              (display-measurement-results obj))
            (alert "错误:所选多段线未闭合!")))
      
       (t
        (alert (strcat "不支持类型:" (cdr (assoc 0 obj))))))))
  
  (setvar "CMDECHO" 1)  ; 恢复命令回显
  (princ)
)

;;; 闭合性验证函数
(defun check-closed-polyline (ent / verts first-pt last-pt tolerance)
  "使用容差法验证多段线闭合性(精度0.001单位)"
  (setq verts (get-vertices ent)
        tolerance 0.001)
  (and (> (length verts) 2)
       (progn
         (setq first-pt (car verts)
               last-pt (last verts))
         (and (<= (distance first-pt last-pt) tolerance)
              (= (logand (cdr (assoc 70 ent)) 1) 1)))))  ; 检查闭合标志

;;; 面积标注函数
(defun auto-label-poly-area (ent / verts area centroid label-pos text-height dir)
  "自动计算并创建面积标注"
  (setq verts (get-vertices ent)
        area (calculate-polygonal-area verts)
        centroid (get-polygon-center verts)
        text-height (getvar "TEXTSIZE"))
  
  ;; 计算标注位置
  (setq dir (or (cdr (assoc "DIR" ent))
                (vector-normalize
                  (subtract-point centroid (car verts)))))
  (setq label-pos (offset-point centroid dir (* text-height 1.5)))
  
  ;; 创建文本标注
  (command "_.TEXT" "_J" "_MC" label-pos text-height 0
           (strcat "面积: " (rtos area 2 2) " sq.units"))
)

;;; 获取顶点列表
(defun get-vertices (ent / verts pt)
  "从多段线提取顶点坐标列表"
  (setq verts '())
  (if (= (cdr (assoc 0 ent)) "LWPOLYLINE")
      (progn
        (foreach item ent
          (if (= (car item) 10)
              (setq verts (append verts (list (cdr item)))))))
      (progn
        (setq ent (entnext ent))
        (while (and ent (/= (cdr (assoc 0 (entget ent))) "SEQEND"))
          (setq pt (cdr (assoc 10 (entget ent))))
          (setq verts (append verts (list pt)))
          (setq ent (entnext ent)))))
  verts)

;;; 计算多边形面积(鞋带公式)
(defun calculate-polygonal-area (verts / sum1 sum2 i n)
  "使用鞋带公式计算多边形面积"
  (setq n (length verts)
        sum1 0.0
        sum2 0.0
        i 0)
  (while (< i (1- n))
    (setq sum1 (+ sum1 (* (car (nth i verts)) (cadr (nth (1+ i) verts))))
          sum2 (+ sum2 (* (cadr (nth i verts)) (car (nth (1+ i) verts))))
          i (1+ i)))
  (setq sum1 (+ sum1 (* (car (last verts)) (cadr (car verts))))
        sum2 (+ sum2 (* (cadr (last verts)) (car (car verts)))))
  (/ (abs (- sum1 sum2)) 2.0))

;;; 计算多边形质心
(defun get-polygon-center (verts / area xsum ysum i n pt)
  "计算多边形质心"
  (setq area (calculate-polygonal-area verts)
        xsum 0.0
        ysum 0.0
        n (length verts)
        i 0)
  (while (< i (1- n))
    (setq pt (* (+ (car (nth i verts)) (car (nth (1+ i) verts)))
                (- (* (car (nth i verts)) (cadr (nth (1+ i) verts)))
                   (* (cadr (nth i verts)) (car (nth (1+ i) verts)))))
          xsum (+ xsum pt)
          ysum (+ ysum pt)
          i (1+ i)))
  (setq pt (* (+ (car (last verts)) (car (car verts)))
              (- (* (car (last verts)) (cadr (car verts)))
                 (* (cadr (last verts)) (car (car verts)))))
        xsum (+ xsum pt)
        ysum (+ ysum pt))
  (list (/ xsum (* 6.0 area)) (/ ysum (* 6.0 area))))

;;; 向量标准化
(defun vector-normalize (vec / mag)
  "将向量标准化为单位向量"
  (setq mag (sqrt (apply '+ (mapcar '* vec vec))))
  (if (> mag 0)
      (mapcar '(lambda (x) (/ x mag)) vec)
      vec))

;;; 点坐标相减
(defun subtract-point (p1 p2)
  "计算两点之间的向量"
  (mapcar '- p1 p2))

;;; 点沿方向偏移
(defun offset-point (pt dir dist)
  "沿指定方向偏移点"
  (mapcar '+ pt (mapcar '(lambda (x) (* x dist)) dir)))

;;; 显示测量结果
(defun display-measurement-results (obj / area)
  "在命令行显示测量结果"
  (setq area (calculate-polygonal-area (get-vertices obj)))
  (princ (strcat "\n测量结果 - 面积: " (rtos area 2 2) " 平方单位"))
  (princ))

;;; 程序加载提示
(princ "\nCLOSED-POLY-AREA 加载完成。输入 CLOSED-POLY-AREA 开始使用。")
(princ)

点评

好咸  发表于 2025-3-14 08:55
回复 支持 反对

使用道具 举报

发表于 2025-3-15 10:34:36 | 显示全部楼层
biya 发表于 2025-3-15 06:45
你怎么一眼看出来的是AI?引号全是3对?

你觉得中国写代码的。有人会这样命名函数的?
(progn
             (auto-label-poly-area obj)
             (display-measurement-results obj)
             (princ)
           )

  (setq dir (vector-normalize (subtract-point centroid (car verts)))))
回复 支持 反对

使用道具 举报

发表于 2025-3-13 15:14:15 | 显示全部楼层
本帖最后由 tryhi 于 2025-3-13 16:21 编辑

你数一下有多少左括号(帮你数了94个),再数一下有多少个右括号(又帮你数了90个),不就知道问题在哪了吗?


回复 支持 反对

使用道具 举报

发表于 2025-3-13 15:24:38 | 显示全部楼层
让AI写代码,然后写出来的自己都懒得花时间研究,这哪还有一点编程学习的样子。
回复 支持 反对

使用道具 举报

发表于 2025-3-13 17:10:01 | 显示全部楼层
message-box when let都是啥玩意?
回复 支持 反对

使用道具 举报

发表于 2025-3-13 17:32:32 | 显示全部楼层
xyp1964 发表于 2025-3-13 17:10
message-box when let都是啥玩意?

一眼早年间AI的作品。
回复 支持 反对

使用道具 举报

发表于 2025-3-13 20:21:01 | 显示全部楼层
xyp1964 发表于 2025-3-13 17:10
message-box when let都是啥玩意?

我还以为只有我不认识这些函数o-o-o-
回复 支持 反对

使用道具 举报

发表于 2025-3-13 21:53:56 | 显示全部楼层
神奇的代码
回复 支持 反对

使用道具 举报

发表于 2025-3-14 08:44:24 | 显示全部楼层
xyp1964 发表于 2025-3-13 17:10
message-box when let都是啥玩意?

Common Lisp函数
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-2 18:46 , Processed in 0.201461 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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