明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 575|回复: 5

[讨论] 求统计类似对象的长度代码修改

[复制链接]
发表于 2024-7-14 15:22:00 | 显示全部楼层 |阅读模式
目标:运行代码后,首先由用户点击单个对象作为参考图元,获取参考图元的对象类型、图层、颜色等信息,继续由用户选择对象,选择对象时仅筛选选中和选定图元对象类型、图层、颜色均完全相同的对象。再统计所有选中线条的长度,将结果转换为米为单位由用户插入到指定位置;
以下参考代码错误,请修正
  1. (defun c:SelectSimilarAndSumLength (/ ent0 ent_type ent_layer ent_color sum_len pt ss ss_filtered)
  2.   ;; 获取参考图元
  3.   (setq ent0 (car (entsel "\n请选择参考图元: ")))
  4.   (if ent0
  5.     (progn
  6.       ;; 获取参考图元信息
  7.       (setq ent_type (cdr (assoc 0 (entget ent0)))
  8.             ent_layer (cdr (assoc 8 (entget ent0)))
  9.             ent_color (cdr (assoc 62 (entget ent0))))

  10.       ;; 初始化选择集
  11.       (setq ss (ssadd))

  12.       ;; --- 框选相似对象 ---
  13.       (while (setq ss_new (ssget '((0 . "LINE") (8 . ent_layer) (62 . ent_color))))
  14.         (setq ss (ssadd (ssnamex ss_new) ss)) ;; 将新选中的对象添加到 ss
  15.       )
  16.       ;; --- 框选结束 ---

  17.       ;; 创建空的选择集用于存放过滤后的结果
  18.       (setq ss_filtered (ssadd))

  19.       ;; 遍历选择集,筛选符合条件的对象 (包括初始选择和框选)
  20.       (if ss
  21.         (progn
  22.           (setq sel_ents (ssnamex ss))
  23.           (foreach n sel_ents
  24.             (setq ent (entget (car n)))
  25.             (if (and
  26.                   (eq (cdr (assoc 0 ent)) ent_type)
  27.                   (eq (cdr (assoc 8 ent)) ent_layer)
  28.                   (eq (cdr (assoc 62 ent)) ent_color)
  29.                 )
  30.               (ssadd (car n) ss_filtered)
  31.             )
  32.           )
  33.         )
  34.       )
  35.       
  36.       ;; 计算总长度 (使用 ss_filtered)
  37.       (if ss_filtered
  38.         (progn
  39.           (setq sum_len 0)
  40.           (setq sel_ents (ssnamex ss_filtered))
  41.           (foreach n sel_ents
  42.             (setq ent (entget (car n)))
  43.             (if (eq (cdr (assoc 0 ent)) "LINE")
  44.               (setq sum_len (+ sum_len (distance (cdr (assoc 10 ent)) (cdr (assoc 11 ent))))))
  45.           )
  46.          
  47.           ;; 将长度转换为米
  48.           (setq sum_len (/ sum_len 1000.0))
  49.          
  50.           ;; 获取用户指定的位置
  51.           (setq pt (getpoint "\n请选择文本插入点: "))
  52.          
  53.           ;; 插入文本
  54.           (command "TEXT" pt "" "" (rtos sum_len 2 2))
  55.         )
  56.         (princ "\n未找到相似对象.")
  57.       )
  58.     )
  59.     (princ "\n未选择图元.")
  60.   )
  61.   (princ)
  62. )




发表于 2024-7-15 00:41:06 | 显示全部楼层
  1. (defun c:tt ()
  2.   (if (setq s0 (car (entsel "\n请选择参考图元: ")))
  3.     (progn
  4.       (setq la (cdr (assoc 8 (entget s0)))
  5.             co (cdr (assoc 62 (entget s0)))
  6.       )
  7.       (setq ss (ssadd))
  8.       (while (setq ss_new (ssget (list '(0 . "LINE") (cons 8 la) (cons 62 co))))
  9.         (command "select" ss ss_new "")
  10.         (setq ss (ssget "p"))
  11.       )
  12.       (if ss
  13.         (progn
  14.           (setq ll 0
  15.                 i  -1
  16.           )
  17.           (while (setq s1 (ssname ss (setq i (1+ i))))
  18.             (setq en (entget s1)
  19.                   l1 (distance (cdr (assoc 10 en)) (cdr (assoc 11 en)))
  20.                   ll (+ ll l1)
  21.             )
  22.           )
  23.           (setq ll (* ll 1e-3)) ; 将长度转换为米
  24.           (if (setq pt (getpoint "\n请选择文本插入点: ")) ; 获取用户指定的位置
  25.             (command "TEXT" pt "" "" (rtos ll 2 2)) ; 插入文本
  26.           )
  27.         )
  28.       )
  29.     )
  30.   )
  31.   (princ)
  32. )
 楼主| 发表于 2024-7-15 13:36:02 | 显示全部楼层
运行后选择一条线,后显示以下
发表于 2024-7-15 20:08:24 | 显示全部楼层
  1. (defun c:tt (/ co i l1 la ll pt s1 ss)
  2.   (if (and (setq s1 (car (entsel "\n请选择参考图元: ")))
  3.            (setq la (cdr (assoc 8 (entget s1))))
  4.            (setq co (cdr (assoc 62 (entget s1))))
  5.            (setq ss (ssget (list '(0 . "LINE") (cons 8 la) (cons 62 co))))
  6.       )
  7.     (progn
  8.       (setq ll 0
  9.             i  -1
  10.       )
  11.       (while (setq s1 (ssname ss (setq i (1+ i))))
  12.         (setq l1 (vla-get-length (vlax-ename->vla-object s1))
  13.               ll (+ ll l1)
  14.         )
  15.       )
  16.       (if (setq pt (getpoint "\n请选择文本插入点: "))
  17.         (command "TEXT" pt "" "" (rtos (* ll 1e-3) 2 2))
  18.       )
  19.     )
  20.   )
  21.   (princ)
  22. )
 楼主| 发表于 2024-7-16 12:03:02 | 显示全部楼层

选择参考图元后就没了

点评

图烂  发表于 2024-7-17 20:12
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 12:50 , Processed in 0.166093 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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