乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 17|回复: 17

[编程交流] 引用外部圆

[复制链接]

44

主题

139

帖子

95

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
221
发表于 2022-7-5 15:04:19 | 显示全部楼层 |阅读模式
大家好,
 
我为一个制造空心板的社会工作。圆表示板中的空隙。
我在寻找引用这些圆圈的快速方法。
 
目前,我有一个lisp转换多边形线报价。
 
这是他的行为:
 

                               
登录/注册后可看大图

 
正如你们所见,我只对边界引号感兴趣。
 
知道如何在没有多段线的情况下执行该任务吗?也许通过选择所有的圆,lisp能够理解它是在内部还是在边界。
 
这是一个例子:测试。图纸
 
谢谢你的帮助,
 
丹尼斯
回复

使用道具 举报

5

主题

1334

帖子

1410

银币

限制会员

铜币
-20
发表于 2022-7-5 15:10:10 | 显示全部楼层
在您发布的DWG测试中,这将适用于gif中的简单案例,但在DWG中的更大示例中,它不会。。。所以,总比什么都没有好,也许它可以用于其他一些类似于动画gif的简单示例。。。
 
  1. (defun c:dimouterboundcircles ( / unique adoc dim spc s i ci p pl d plbound plboundd plround plr a plroundd pp aa plroundorth plroundorthrem )
  2. (vl-load-com)
  3. (defun unique ( l )
  4.    (if l (cons (car l) (unique (vl-remove-if (function (lambda ( x ) (equal x (car l) 2.5e-2))) l))))
  5. )
  6. (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
  7. (if (= 8 (logand 8 (getvar 'undoctl)))
  8.    (vla-endundomark adoc)
  9. )
  10. (vla-startundomark adoc)
  11. (setq dim (vla-get-activedimstyle adoc))
  12. (vla-copyfrom dim adoc)
  13. (setq spc (vla-get-block (vla-get-activelayout adoc)))
  14. (prompt "\nSelect CIRCLES...")
  15. (setq s (ssget '((0 . "CIRCLE"))))
  16. (if s
  17.    (progn
  18.      (repeat (setq i (sslength s))
  19.        (setq ci (ssname s (setq i (1- i))))
  20.        (setq p (cdr (assoc 10 (entget ci))))
  21.        (setq pl (cons p pl))
  22.      )
  23.      (setq pl (mapcar (function (lambda ( p ) (trans p 0 1))) pl))
  24.      (setq pl (vl-sort pl (function (lambda ( a b ) (if (equal (car a) (car b) 2.5e-2) (< (cadr a) (cadr b)) (< (car a) (car b)))))))
  25.      (setq p (car pl))
  26.      (setq d (distance p (cadr (vl-sort pl (function (lambda ( a b ) (< (distance a p) (distance b p))))))))
  27.      (foreach p pl
  28.        (if
  29.          (not
  30.            (and
  31.              (vl-some (function (lambda ( x ) (equal x (mapcar '+ p (list d 0 0)) 2.5e-2))) pl)
  32.              (vl-some (function (lambda ( x ) (equal x (mapcar '+ p (list (- d) 0 0)) 2.5e-2))) pl)
  33.              (vl-some (function (lambda ( x ) (equal x (mapcar '+ p (list 0 d 0)) 2.5e-2))) pl)
  34.              (vl-some (function (lambda ( x ) (equal x (mapcar '+ p (list 0 (- d) 0)) 2.5e-2))) pl)
  35.            )
  36.          )
  37.          (setq plbound (cons p plbound))
  38.        )
  39.      )
  40.      (while plbound
  41.        (setq plbound (vl-sort plbound (function (lambda ( a b ) (if (equal (car a) (car b) 2.5e-2) (< (cadr a) (cadr b)) (< (car a) (car b)))))))
  42.        (setq plbound (reverse (cons (car plbound) (reverse plbound))))
  43.        (while (and (setq p (car plbound)) (not (equal p (last plround) 2.5e-2)))
  44.          (if plround
  45.            (setq aa (angle (car plround) p))
  46.          )
  47.          (if (and aa (equal aa (* 2 pi) 2.5e-2))
  48.            (setq aa 0.0)
  49.          )
  50.          (setq plbound (cdr plbound))
  51.          (setq plbound (vl-sort plbound (function (lambda ( a b ) (< (distance a p) (distance b p))))))
  52.          (if (or (equal p (car plbound) 2.5e-2) (equal (car plbound) (car plround) 2.5e-2))
  53.            (setq plbound (cdr (reverse (cons (car plbound) (reverse plbound)))))
  54.          )
  55.          (setq plboundd (vl-remove-if-not (function (lambda ( x ) (equal (distance p x) d 2.5e-2))) (vl-remove-if (function (lambda ( x ) (vl-some (function (lambda ( y ) (equal x y 2.5e-2))) plround))) plbound)))
  56.          (setq plboundd (vl-sort plboundd (function (lambda ( a b ) (if (or (equal (angle p a) aa 2.5e-2) (and (equal (angle p a) (* 2 pi) 2.5e-2) (= aa 0.0))) t nil)))))
  57.          (if plboundd
  58.            (progn
  59.              (setq plbound (vl-remove (car plboundd) plbound))
  60.              (setq plbound (cons (car plboundd) plbound))
  61.            )
  62.          )
  63.          (setq plround (cons p plround))
  64.        )
  65.        (setq plround (cons (car plbound) plround))
  66.        (setq plbound (cdr plbound))
  67.        (setq plround (reverse plround))
  68.        (setq plr pl)
  69.        (foreach p plround
  70.          (setq plr (vl-remove p plr))
  71.        )
  72.        (while (setq p (car plround))
  73.          (setq a (if (cadr plround) (angle p (cadr plround))))
  74.          (if
  75.            (not
  76.              (or
  77.                (equal a 0.0 2.5e-2)
  78.                (equal a (* 0.5 pi) 2.5e-2)
  79.                (equal a pi 2.5e-2)
  80.                (equal a (* 1.5 pi) 2.5e-2)
  81.                (equal a (* 2 pi) 2.5e-2)
  82.              )
  83.            )
  84.            (progn
  85.              (setq plroundorth (cons p plroundorth))
  86.              (setq plround (cdr plround))
  87.              (if plround
  88.                (progn
  89.                  (setq plroundd (vl-sort plr (function (lambda ( a b ) (< (distance a (car plround)) (distance b (car plround)))))))
  90.                  (setq plroundd (vl-remove-if-not (function (lambda ( x ) (equal (distance x (car plround)) d 2.5e-2))) plroundd))
  91.                  (foreach pp plroundd
  92.                    (setq a (angle p pp))
  93.                    (if
  94.                      (or
  95.                        (equal a 0.0 2.5e-2)
  96.                        (equal a (* 0.5 pi) 2.5e-2)
  97.                        (equal a pi 2.5e-2)
  98.                        (equal a (* 1.5 pi) 2.5e-2)
  99.                        (equal a (* 2 pi) 2.5e-2)
  100.                      )
  101.                      (setq plround (cons pp plround))
  102.                    )
  103.                  )
  104.                )
  105.              )
  106.              (cond
  107.                ( (and (null a) plround)
  108.                  (setq plroundorth (cons (car plround) plroundorth))
  109.                  (setq plround nil)
  110.                )
  111.                ( (and (null a) (null plround))
  112.                  (if (not (equal (distance (car plroundorth) (last plroundorth)) d 2.5e-2))
  113.                    (progn
  114.                      (setq plroundd (vl-sort plr (function (lambda ( a b ) (< (distance a (car plroundorth)) (distance b (car plroundorth)))))))
  115.                      (setq plroundd (vl-remove-if-not (function (lambda ( x ) (equal (distance x (car plroundorth)) d 2.5e-2))) plroundd))
  116.                      (foreach pp plroundd
  117.                        (setq a (angle p pp))
  118.                        (if
  119.                          (or
  120.                            (equal a 0.0 2.5e-2)
  121.                            (equal a (* 0.5 pi) 2.5e-2)
  122.                            (equal a pi 2.5e-2)
  123.                            (equal a (* 1.5 pi) 2.5e-2)
  124.                            (equal a (* 2 pi) 2.5e-2)
  125.                          )
  126.                          (setq plroundorth (cons pp plroundorth))
  127.                        )
  128.                      )
  129.                    )
  130.                  )
  131.                )
  132.              )
  133.            )
  134.            (progn
  135.              (setq plround (cdr plround))
  136.              (while (and plround (if (or (equal a 0.0 2.5e-2) (equal a (* 2 pi) 2.5e-2)) (or (equal 0.0 (angle p (car plround)) 2.5e-2) (equal (* 2 pi) (angle p (car plround)) 2.5e-2)) (equal a (angle p (car plround)) 2.5e-2)))
  137.                (setq pp (car plround))
  138.                (setq plround (cdr plround))
  139.              )
  140.              (if (or (equal a (angle p pp) 2.5e-2) (and (equal a 0.0 2.5e-2) (equal (angle p pp) (* 2 pi) 2.5e-2)) (and (equal a (* 2 pi) 2.5e-2) (equal (angle p pp) 0.0 2.5e-2)))
  141.                (progn
  142.                  (if (not (vl-position p plroundorth))
  143.                    (setq plroundorth (cons p plroundorth))
  144.                  )
  145.                  (setq plroundd (vl-sort plr (function (lambda ( a b ) (< (distance a pp) (distance b pp))))))
  146.                  (setq plroundd (vl-remove-if-not (function (lambda ( x ) (equal (distance x pp) d 2.5e-2))) plroundd))
  147.                  (foreach ppp plroundd
  148.                    (setq aa (angle p ppp))
  149.                    (if (and (not (equal p ppp 2.5e-2)) (not (equal pp ppp 2.5e-2)) (or (equal a aa 2.5e-2) (and (equal aa 0.0 2.5e-2) (equal a (* 2 pi) 2.5e-2)) (and (equal aa (* 2 pi) 2.5e-2) (equal a 0.0 2.5e-2))))
  150.                      (setq plround (cons ppp plround) tst t)
  151.                    )
  152.                  )
  153.                  (if (and plround (null tst))
  154.                    (setq plround (cons pp plround))
  155.                  )
  156.                  (if (null plround)
  157.                    (if (and (not (equal (angle (car plroundorth) pp) (angle (car plroundorth) (last plroundorth)) 2.5e-2)) (not (or (and (equal (angle (car plroundorth) pp) 0.0 2.5e-2) (equal (angle (car plroundorth) (last plroundorth)) (* 2 pi) 2.5e-2)) (and (equal (angle (car plroundorth) pp) (* 2 pi) 2.5e-2) (equal (angle (car plroundorth) (last plroundorth)) 0.0 2.5e-2)))) (not (vl-position pp plroundorth)))
  158.                      (setq plround (cons pp plround))
  159.                    )
  160.                  )
  161.                  (setq tst nil)
  162.                )
  163.                (progn
  164.                  (setq plroundd (vl-sort plr (function (lambda ( a b ) (< (distance a pp) (distance b pp))))))
  165.                  (setq plroundd (vl-remove-if-not (function (lambda ( x ) (equal (distance x pp) d 2.5e-2))) plroundd))
  166.                  (foreach ppp plroundd
  167.                    (setq aa (angle p ppp))
  168.                    (if
  169.                      (or
  170.                        (equal aa 0.0 2.5e-2)
  171.                        (equal aa (* 0.5 pi) 2.5e-2)
  172.                        (equal aa pi 2.5e-2)
  173.                        (equal aa (* 1.5 pi) 2.5e-2)
  174.                        (equal aa (* 2 pi) 2.5e-2)
  175.                      )
  176.                      (setq plround (cons ppp plround))
  177.                    )
  178.                  )
  179.                )
  180.              )
  181.            )
  182.          )
  183.        )
  184.        (setq plroundorth (reverse plroundorth))
  185.        (setq plroundorth (mapcar (function (lambda ( p ) (trans p 1 0))) plroundorth))
  186.        (setq plroundorth (unique plroundorth))
  187.        (setq plroundorthrem (vl-remove nil (mapcar (function (lambda ( a b c ) (if (equal (distance a c) (+ (distance a b) (distance b c)) 2.5e-2) b))) plroundorth (cdr (reverse (cons (car plroundorth) (reverse plroundorth)))) (cddr (reverse (cons (cadr plroundorth) (cons (car plroundorth) (reverse plroundorth))))))))
  188.        (foreach p plroundorthrem
  189.          (setq plroundorth (vl-remove p plroundorth))
  190.        )
  191.        (mapcar (function (lambda ( a b ) (vla-adddimaligned spc (vlax-3d-point a) (vlax-3d-point b) (vlax-3d-point (mapcar '/ (mapcar '+ a b) (list 2.0 2.0 2.0)))))) plroundorth (cdr (reverse (cons (car plroundorth) (reverse plroundorth)))))
  192.        (setq plround nil plroundorth nil)
  193.      )
  194.    )
  195. )
  196. (vla-endundomark adoc)
  197. (princ)
  198. )
HTH。,M、 R。
回复

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 15:13:00 | 显示全部楼层
考虑另一种方法,选择所有圆,然后进行ssget cp,即每个圆的2xRad,如果选择集小于8,则为外圆。应该在测试图纸上工作,因为它有单列圆,突出并且连接在一起更像网格。
 
删除的代码不完全符合要求。
回复

使用道具 举报

5

主题

1334

帖子

1410

银币

限制会员

铜币
-20
发表于 2022-7-5 15:16:10 | 显示全部楼层
我发布的代码现在可以与此附加的DWG一起使用。。。
测试-尺寸外边界圆。图纸
回复

使用道具 举报

44

主题

139

帖子

95

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
221
发表于 2022-7-5 15:18:49 | 显示全部楼层
大家好!感谢您的帮助,从您的代码中可以学到很多!
 
我已经在另一个DWG中测试了它们(稍后我将尝试理解每一行代码)。
 
测验图纸
 
Marko代码:
 
在左角出现了一个奇怪的错误。。如果选择的对象太多(在我的情况下是118个),autocad将进入循环
 
 
Bigal的代码有一种奇怪的行为。。
 
  1. (setq ss (ssget (list (cons 0 "Circle"))))
  2. (setvar "osmode" 0)
  3. (setq tot 0)
  4. (repeat (setq x (sslength ss))
  5. (setq obj (vlax-ename->vla-object (ssname SS (setq x (- x 1)))))
  6. (setq cenpt (vlax-safearray->list (vlax-variant-value (vla-get-center obj))))
  7. (setq rad (* 3.2 (vla-get-radius obj)))
  8. (setq pt1 (polar cenpt (/ pi 4.0) rad))
  9. (setq pt2 (polar cenpt (* pi 1.5) rad))
  10. (command "_.line" pt1 pt2 "") ; for testing
  11. (setq ss2 (ssget "_w" pt1 pt2))
  12. (if (and (/= ss2 nil)(< (sslength ss2) )
  13. (setq tot (+ Tot 1)) ; this is external circles
  14. )
  15. (princ (strcat "\n" (rtos tot 2 0)))
  16. (setq ss2 nil)
  17. )
回复

使用道具 举报

44

主题

139

帖子

95

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
221
发表于 2022-7-5 15:25:12 | 显示全部楼层
 
你好,马尔科!很高兴再次见到你
 
是的,代码经过改进,最后一点有点小问题,就像我发布的gif一样(但只有一个错误,而不是2个错误)。。在我的上一张图纸上试试。。。谢谢你的帮助!
 
编辑:看看他的行为。。(由于耗时太长,我删除了很多帧)
 
回复

使用道具 举报

5

主题

1334

帖子

1410

银币

限制会员

铜币
-20
发表于 2022-7-5 15:26:32 | 显示全部楼层
发布的代码最终更新。。。你不能选择多组圆,只能一组一组。。。
 
您好,M.R。
回复

使用道具 举报

44

主题

139

帖子

95

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
221
发表于 2022-7-5 15:32:38 | 显示全部楼层
 
谢谢Marko,非常酷的代码!我现在就开始学习!
 
一个小问题。。你认为连中间的洞都不可能考虑吗?(或者忽略,因此我将其添加到gif中)
 
回复

使用道具 举报

5

主题

1334

帖子

1410

银币

限制会员

铜币
-20
发表于 2022-7-5 15:34:35 | 显示全部楼层
逐个选择。。。现在,避免它或在你的gif中这样做。。。您可以选择具有内部孤岛的整个组。。。
 
 
[编辑:现在添加了不同网格dx和dy的代码…我将带圆的DWG转换为块,更改了Y比例因子和分解块;结果是椭圆而不是圆…然后我测试了代码,我将在这里发布…]
 
 
  1. 3
M.R。
P、 现在你们应该能够选择有空空间的组,在大多数情况下,若内部空间不接近外部边界,它应该同时标注外部边界和内部边界。。。
回复

使用道具 举报

44

主题

139

帖子

95

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
221
发表于 2022-7-5 15:36:45 | 显示全部楼层
谢谢Marko,这对我很有帮助!
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-14 23:27 , Processed in 1.144203 second(s), 77 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表