lengxiaxi 发表于 2025-7-31 08:44:31

公差标注筛选

处理客户图纸时,一些带有公差的尺寸,通常需要重点关注,图形特别多时,找这些尺寸费时间


写了一个lsp程序,通过判断组码71的值,是否非0;来筛选所有的标注。

发现这个思想行不通,总会把常规的标注,toldisplay值是0的,也选中;

感觉单纯靠组码来判断,是有问题的;

大神们有什么好想法,还请指教

liuhe 发表于 2025-7-31 09:34:56

标注样式替代可适用于标注、引线和公差图元。适用于这些图元的所有替代都将作为扩展数据存储在图元中。替代标注变量组码和相关值包含在组 1002 控制字符串中。下例显示 DIMTOL 和 DIMCLRE 变量已被替代的标注图元的扩展数据。

(setq diment (car (entsel))) ; 选择标注图元
(setq elst (entget diment '("ACAD"))) ; 获取图元定义列表
(assoc -3 elst) ; 仅提取扩展数据
此段代码返回下列内容:

(-3 ("ACAD" 扩展数据的 ACAD APPID 段的开始
(1000 . "DSTYLE") (1002 ."{") 标注样式小节的开始
(1070 . 177) (1070 . 3) DIMCLRE(代码 177)替代 + 值 (3)
(1070 . 71) (1070 . 1) DIMTOL(代码 71)替代 + 值 (1)
(1002 . "}") )) 标注样式小节和 ACAD 段的结束


1.先看标注样式筛选有公差设置,如果该标注样式下有公差,就没有扩展数据。
2.标注样式没有公差,如果该标注样式下公差,则会有扩展数据,并且扩展数据会出现71组码用来代替标标注样式的71

自贡黄明儒 发表于 2025-7-31 09:45:26

用了小菜的选择易,好多程序不需要写,或者说可以简化了。

lengxiaxi 发表于 2025-7-31 09:56:04

本帖最后由 lengxiaxi 于 2025-7-31 09:58 编辑



搞累了,ai写了一个,总是有一种情况,无法筛选出来;如下图青色显示的标注,按理说,也应该备选中;图形见附件;(defun c:F10 (/ ss i ent entData txt tolDisplay resultSS count ihandle)
(vl-load-com)
(setvar "CMDECHO" 0)
(setq resultSS (ssadd))
(setq count 0)

;; 仅选择尺寸标注对象
(if (setq ss (ssget "_X" '((0 . "DIMENSION"))))
    (progn
      (princ "========================================\n")
      (princ "精确公差标注扫描(严格逻辑)\n")
      (princ "========================================\n")
      
      (setq i 0)
      (repeat (sslength ss)
      (setq ent (ssname ss i))
      (setq entData (entget ent))
      (setq ihandle (cdr (assoc 5 entData))) ; 实体句柄
      (setq txt (cdr (assoc 1 entData)))    ; 标注文本
      
      ;; 关键优化:获取真实的组码71值
      (setq tolDisplay
          (cond
            ((assoc 71 entData) (cdr (assoc 71 entData))) ; 获取组码71值
            (0) ; 如果组码71不存在,默认值为0
          )
      )
      
      ;; 开始处理当前标注
      (princ (strcat "\n[标注" (itoa (1+ i)) "] 句柄: " ihandle))
      (princ (strcat "\n标注内容: \"" (if txt txt "无文本") "\""))
      (princ (strcat "\n真实组码71值: " (itoa tolDisplay)))
      
      (setq found nil)
      
      ;; 精确检测逻辑 (根据您的图片优化)
      (cond
          ;; 情况1: 标注文本含有±/%%P符号
          ((and txt (or
                  (wcmatch txt "*±*")   ; 含±符号(如"200±0.5")
                  (wcmatch txt "*%%P*"); 含%%P编码
                  (wcmatch txt "*\\S?*") ; 堆叠文本中的上标+(如"2-?1.0??·2?")
                   ))
            (princ "\n→ 检测到文本公差符号")
            (setq found T))
         
          ;; 情况2: 组码71为1/2/3且非"<>"标注
          ((and (<= 1 tolDisplay 3)
                (not (equal txt "<>")))
            (princ "\n→ 检测到有效公差组码")
            (setq found T))
         
          (t (princ "\n→ 无公差特征"))
      )
      
      ;; 结果记录与输出
      (cond
          (found
            (ssadd ent resultSS)
            (setq count (1+ count))
            (princ " ★ 标记为公差标注"))
          ((and (<= 1 tolDisplay 3) (equal txt "<>"))
            (princ " ? 忽略(自动生成公差)"))
          (t
            (princ " ? 忽略(无公差)"))
      )
      
      (princ "\n────────────────────────────────────")
      (setq i (1+ i))
      )
      
      ;; 最终结果
      (princ "\n\n============= 扫描结果 =============")
      (princ (strcat "\n扫描标注总数: " (itoa (sslength ss))))
      (princ (strcat "\n发现公差标注: " (itoa count)))
      (cond
      ((> count 0)
          (sssetfirst nil resultSS)
          (princ "\n? 公差标注已高亮显示(按ESC退出选择状态)"))
      (t
          (princ "\n?? 未发现真实公差标注"))
      )
    )
    (princ "\n? 图中未找到标注对象")
)
(setvar "CMDECHO" 1)
(princ)
)

你有种再说一遍 发表于 2025-7-31 14:53:13

只需要分类多行文字格式就行了吧
https://www.cnblogs.com/JJBox/p/18534134

lengxiaxi 发表于 2025-8-1 11:35:28

你有种再说一遍 发表于 2025-7-31 14:53
只需要分类多行文字格式就行了吧
https://www.cnblogs.com/JJBox/p/18534134

感谢老板;通过文本解析判断堆叠字符,程序中42行代码即是,已包含这个情况
页: [1]
查看完整版本: 公差标注筛选