写不完的日记 发表于 2025-5-4 17:19:09

(defun C:NM (/ dxf10 ent p1 p2 p3 s)
    ;; 10组码取点
    (defun dxf10 (e / s)
      (if (setq s
                  (mapcar 'cdr
                        (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget e))
                        )
                  )
            (if (= 1 (length s)) (car s) s)
      )
    )
    ;; 获取闭合范围内一点
    (setq p1 (getpoint "\n闭合范围内一点:"))
    ;; 检查 p1 是否为 nil
    (if (not p1)
      (progn
            (princ "\n操作取消,未指定点。")
            (exit)
      )
    )
    ;; 获取闭合多段线实体
    (setq ent (bpoly p1))
    ;; 检查 ent 是否为 nil
    (if (not ent)
      (progn
            (princ "\n无法根据指定点生成闭合多段线实体。")
            (exit)
      )
    )
    ;; 提取点坐标
    (setq s (dxf10 ent))
    ;; 检查 s 是否为 nil
    (if (not s)
      (progn
            (princ "\n未从实体中提取到点坐标。")
            (entdel ent)
            (exit)
      )
    )
    ;; 删除临时实体
    (entdel ent)
    ;; 处理点坐标
    (setq s (cons (last s) s))
    ;; 遍历点坐标进行标注
    (while (and s (cdr s)) ; 确保 s 至少有两个元素
      (setq p1 (car s)
            p2 (cadr s)
            )
      ;; 检查 p1 和 p2 是否有效且不相同
      (if (and p1 p2 (not (equal p1 p2 1e-6))) ; 使用 1e-6 作为容差判断两点是否相同
            (progn
                (setq p3 (polar p2 (+ (* 0.5 pi) (angle p1 p2)) 400))
                (vl-cmdf "DIMLINEAR" "non" p1 "non" p2 "non" p3)
            )
            (princ "\n标注时出现无效点坐标或两点相同,跳过该标注。")
      )
      (setq s (cdr s))
    )
    (princ)
)这样就可以了不报错
页: 1 [2]
查看完整版本: 封闭区域内一键标注尺寸