明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1363|回复: 13

[源码] 求按列、行统计圆,并能给出数量

[复制链接]
发表于 2023-4-21 09:04 | 显示全部楼层 |阅读模式
就像换热器布管程序那样,实现列、行统计圆的功能!

本帖子中包含更多资源

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

x
发表于 2023-4-21 13:34 | 显示全部楼层
  1. (defun c:tt (/ E R LST I pp LST1 FUZZ SS E1 PC LST2 J P1 HLST P2 H L)
  2.   (setq e (car (ENTSEL "\n选择统计圆")))
  3.   (IF (NOT E)
  4.     (VL-EXIT-WITH-VALUE 0)
  5.   )
  6.   (SETQ        R    (CDR (ASSOC 40 (ENTGET E)))
  7.         LST  (LIST '(0 . "CIRCLE") (CONS 40 R))
  8.         I    0
  9.         LST1 NIL
  10.         FUZZ 0
  11. ;;;;;FUZZ 是坐标点误差,等于0 或者nil  是速度会加快,要求画图精准
  12.   )
  13.   (SETQ SS (SSGET LST))
  14.   (IF (NOT SS)
  15.     (VL-EXIT-WITH-VALUE 0)
  16.   )
  17.   (SETQ PP (GETPOINT "\n统计插入点"))
  18.   (IF (NOT pp)
  19.     (VL-EXIT-WITH-VALUE 0)
  20.   )
  21.   (REPEAT (SSLENGTH SS)
  22.     (SETQ E1   (SSNAME SS I)
  23.           PC   (CDR (ASSOC 10 (ENTGET E1)))
  24.           LST1 (CONS PC LST1)
  25.           I    (1+ I)
  26.     )
  27.   )
  28.   (SETQ        LST1 (LY:Unique LST1 FUZZ)
  29.         LST1 (LH:SORTYX LST1)
  30.         lst2 (LH:SORTXY LST1)
  31.         I    0
  32.         J    1
  33.         H    1
  34.         P1   (NTH 0 LST1)
  35.         HLST NIL
  36.   )
  37.   (REPEAT (LENGTH LST1)
  38.     (SETQ P2 (NTH (1+ I) LST1))
  39.     (IF        (EQUAL (cadr P1) (cadr P2) FUZZ)
  40.       (SETQ J (1+ J))
  41.       (PROGN
  42.         (SETQ HLST (CONS (LIST H J) HLST)
  43.               H           (1+ H)
  44.               P1   P2
  45.               J           1
  46.         )
  47.       )
  48.     )
  49.     (SETQ I (1+ I))
  50.   )
  51.   (SETQ
  52.     I         0
  53.     J         1
  54.     L         1
  55.     LLST NIL
  56.     P1         (NTH 0 LST2)
  57.   )
  58.   (REPEAT (LENGTH LST2)
  59.     (SETQ P2 (NTH (1+ I) LST2))
  60.     (IF        (EQUAL (car P1) (car P2) FUZZ)
  61.       (SETQ J (1+ J))
  62.       (progn
  63.         (SETQ LLST (CONS (LIST L J) LLST)
  64.               L           (1+ L)
  65.               P1   P2
  66.               J           1
  67.         )
  68.       )
  69.     )
  70. ;;;    (If        p2
  71. ;;;      (Make-TEXT p2
  72. ;;;                 (rtos j 2 0)
  73. ;;;                 (* 0.2 r)
  74. ;;;      )
  75. ;;;    )
  76.     (SETQ I (1+ I))
  77.   )
  78.   (setq i 0)
  79.   (foreach x (reverse hlst)
  80.     (Make-TEXT (list (car pp) (- (cadr pp) (* i 2 r)))
  81.                (strcat (rtos (car x) 2 0) "行" (rtos (cadr x) 2 0) "个")
  82.                r
  83.     )
  84.     (setq i (1+ i))
  85.   )
  86.   (setq        pp (polar pp 0 (* 10 r))
  87.         i  0
  88.   )
  89.   (foreach x (reverse llst)
  90.     (Make-TEXT (list (car pp) (- (cadr pp) (* i 2 r)))
  91.                (strcat (rtos (car x) 2 0) "列" (rtos (cadr x) 2 0) "个")
  92.                r
  93.     )
  94.     (setq i (1+ i))
  95.   )
  96.   (PRINC)
  97. )

  98. ;;167.6 [功能] Entmake单行文本
  99. (defun Make-TEXT (pt str r)
  100.   (entmakeX
  101.     (list '(0 . "TEXT") (cons 1 str) (cons 10 pt) (cons 40 r))
  102.   )
  103. )


  104. (DEFUN LH:SORTYX (LST)
  105.   (vl-sort LST
  106.            (function (lambda (e1 e2)
  107.                        (IF (= (cadr e1) (cadr e2))
  108.                          (< (car e1) (car e2))
  109.                          (< (cadr e1) (cadr e2))
  110.                        )
  111.                      )
  112.            )
  113.   )
  114. )
  115. (DEFUN LH:SORTXY (LST)
  116.   (vl-sort LST
  117.            (function (lambda (e1 e2)
  118.                        (IF (= (car e1) (car e2))
  119.                          (< (cadr e1) (cadr e2))
  120.                          (< (car e1) (car e2))
  121.                        )
  122.                      )
  123.            )
  124.   )
  125. )



  126. (defun LM:RemoveNth (n l)
  127. ;;;;去除第N项
  128.   (if (and l (< 0 n))
  129.     (cons (car l) (LM:RemoveNth (1- n) (cdr l)))
  130.     (cdr l)
  131.   )
  132. )
  133. (defun ly:Unique (lst fuzz / i j)
  134. ;;;;;;删除表中重复的点,有容差
  135.   (setq i 0)
  136.   (IF (OR (= FUZZ 0) (= FUZZ NIL))
  137.     (SETQ LST (LM:Unique LST))
  138.     (PROGN
  139.       (while (NTH (+ 1 i) LST)
  140.         (SETQ J (+ 1 i))
  141.         (while (NTH J LST)
  142.           (IF (MEMBER NIL
  143.                       (MAPCAR '(lambda (P1 P2) (EQUAL P1 P2 fuzz))
  144.                               (nth i lst)
  145.                               (NTH J LST)
  146.                       )
  147.               )
  148.             (setq j (+ 1 j))
  149.             (SETQ LST (LM:RemoveNth j lst))
  150.           )
  151.         )
  152.         (setq i (+ 1 i))
  153.       )
  154.     )
  155.   )
  156.   lst
  157. )




  158. (defun LM:Unique (l)
  159. ;;;;;;删除表中重复项无容差
  160.   (if l
  161.     (cons (car l) (LM:Unique (vl-remove (car l) (cdr l))))
  162.   )
  163. )
发表于 2023-4-21 22:00 | 显示全部楼层



  1. (defun C:dimcn ()
  2.   ;; 选择小圆
  3.   (setq ss-c (pickset:to-list (ssget '((0 . "circle")(-4 . "<")(40 . 20)))))
  4.   ;; 按 Y 从上到下排序
  5.   (setq ss-c (pickset:sort ss-c "Yx" 0.1))
  6.   ;; 对选中的圆以Y轴进行分组,本例为当两个圆的圆心坐标Y值相差不大于1/10半径时为一组。
  7.   (setq group-c (list:group-by ss-c
  8.                 '(lambda (x y)
  9.                    (equal
  10.                      (cadr (entity:getdxf x 10))
  11.                      (cadr (entity:getdxf y 10))
  12.                      (* 0.1 (entity:getdxf x 40))))))
  13.   ;; 标记每组圆的个数
  14.   (if group-c
  15.     (progn
  16.   (setq pt (getpoint "标注位置"))
  17.   (mapcar
  18.     '(lambda (x)
  19.       (entity:make-text (itoa (length x))
  20.         (list (car pt) (cadr (entity:getdxf (car x) 10)) 0)
  21.         (* 2 (entity:getdxf (car x) 40))
  22.         0 0.8 0 "RM"))
  23.      group-c
  24.      ))))

发表于 2023-4-22 16:50 | 显示全部楼层


  1. (defun c:tt ()
  2.   "按行统计圆数量"
  3.   (xyp-Start)
  4.   (xyp-Ctbl (/ 3 3.))
  5.   (if (setq ss(ssget '((0 . "CIRCLE"))))
  6.     (setq lst(xyp-Ss2List ss)
  7.           lst (mapcar '(lambda (x) (cadr (xyp-DXF 10 x))) lst)
  8.           lst (xyp-list-count lst)
  9.           dx  (+ (car (xyp-9pt ss 9)) 3)
  10.           aa  (mapcar '(lambda (x)
  11.                          (setq p1 (list dx (car x))
  12.                                p2 (xyp-Pt2X p1 5)
  13.                                s1 (xyp-Line p1 p2)
  14.                                s2 (xyp-Text 4 p2 (itoa (cadr x)))
  15.                          )
  16.                        )
  17.                       lst
  18.               )
  19.     )
  20.   )
  21.   (xyp-End)
  22. )

本帖子中包含更多资源

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

x
 楼主| 发表于 2023-4-21 22:21 | 显示全部楼层

出现:建议将(command)调用转换为(command-s)怎么解决 运行不了
发表于 2023-4-21 22:37 | 显示全部楼层
本帖最后由 vitalgg 于 2023-4-21 22:39 编辑
搞搞 发表于 2023-4-21 22:21
出现:建议将(command)调用转换为(command-s)怎么解决 运行不了

执行什么命令时出现的?

可以不接受建议
 楼主| 发表于 2023-4-21 23:00 | 显示全部楼层
vitalgg 发表于 2023-4-21 22:37
执行什么命令时出现的?

可以不接受建议

选中圆以后 右键自动退出了,出现的!
发表于 2023-4-22 06:16 | 显示全部楼层
搞搞 发表于 2023-4-21 23:00
选中圆以后 右键自动退出了,出现的!

需要@lisp函数库的支持。 CAD内安装了@lisp才能正确运行。

将以下代码复制到 CAD 命令行内,回车即可开始安装。
(在代码行里用鼠标连续三击全选,然后右键复制或Ctrl+C 。到CAD命令行内,右键粘贴或Ctrl+V)
  1. (progn(vl-load-com)(setq s strcat h "http" o(vlax-create-object (s"win"h".win"h"request.5.1"))v vlax-invoke e eval r read)(v o'open "get" (s h"://atlisp.""org/@"):vlax-true)(v o'send)(v o'WaitforResponse 1000)(e(r(vlax-get o'ResponseText))))
 楼主| 发表于 2023-4-22 07:59 | 显示全部楼层
vitalgg 发表于 2023-4-22 06:16
需要@lisp函数库的支持。 CAD内安装了@lisp才能正确运行。

将以下代码复制到 CAD 命令行内,回车即可 ...

复制了代码,CAD命令出现:nil,失败
发表于 2023-4-22 08:41 | 显示全部楼层
搞搞 发表于 2023-4-22 07:59
复制了代码,CAD命令出现:nil,失败

CAD是精减版的吗?
如果不是,加我签名后面的QQ群。
发表于 2023-4-22 10:40 | 显示全部楼层

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

本版积分规则

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

GMT+8, 2024-5-6 14:01 , Processed in 0.234360 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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