MastroLube 发表于 2022-7-5 15:04:19

引用外部圆

大家好,
 
我为一个制造空心板的社会工作。圆表示板中的空隙。
我在寻找引用这些圆圈的快速方法。
 
目前,我有一个lisp转换多边形线报价。
 
这是他的行为:
 
https://www.cadtutor.net/forum/attachment.php?attachmentid=61029&cid=1&stc=1
 
正如你们所见,我只对边界引号感兴趣。
 
知道如何在没有多段线的情况下执行该任务吗?也许通过选择所有的圆,lisp能够理解它是在内部还是在边界。
 
这是一个例子:测试。图纸
 
谢谢你的帮助,
 
丹尼斯

marko_ribar 发表于 2022-7-5 15:10:10

在您发布的DWG测试中,这将适用于gif中的简单案例,但在DWG中的更大示例中,它不会。。。所以,总比什么都没有好,也许它可以用于其他一些类似于动画gif的简单示例。。。
 
(defun c:dimouterboundcircles ( / unique adoc dim spc s i ci p pl d plbound plboundd plround plr a plroundd pp aa plroundorth plroundorthrem )

(vl-load-com)

(defun unique ( l )
   (if l (cons (car l) (unique (vl-remove-if (function (lambda ( x ) (equal x (car l) 2.5e-2))) l))))
)

(setq adoc (vla-get-activedocument (vlax-get-acad-object)))
(if (= 8 (logand 8 (getvar 'undoctl)))
   (vla-endundomark adoc)
)
(vla-startundomark adoc)
(setq dim (vla-get-activedimstyle adoc))
(vla-copyfrom dim adoc)
(setq spc (vla-get-block (vla-get-activelayout adoc)))
(prompt "\nSelect CIRCLES...")
(setq s (ssget '((0 . "CIRCLE"))))
(if s
   (progn
   (repeat (setq i (sslength s))
       (setq ci (ssname s (setq i (1- i))))
       (setq p (cdr (assoc 10 (entget ci))))
       (setq pl (cons p pl))
   )
   (setq pl (mapcar (function (lambda ( p ) (trans p 0 1))) pl))
   (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)))))))
   (setq p (car pl))
   (setq d (distance p (cadr (vl-sort pl (function (lambda ( a b ) (< (distance a p) (distance b p))))))))
   (foreach p pl
       (if
         (not
         (and
             (vl-some (function (lambda ( x ) (equal x (mapcar '+ p (list d 0 0)) 2.5e-2))) pl)
             (vl-some (function (lambda ( x ) (equal x (mapcar '+ p (list (- d) 0 0)) 2.5e-2))) pl)
             (vl-some (function (lambda ( x ) (equal x (mapcar '+ p (list 0 d 0)) 2.5e-2))) pl)
             (vl-some (function (lambda ( x ) (equal x (mapcar '+ p (list 0 (- d) 0)) 2.5e-2))) pl)
         )
         )
         (setq plbound (cons p plbound))
       )
   )
   (while plbound
       (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)))))))
       (setq plbound (reverse (cons (car plbound) (reverse plbound))))
       (while (and (setq p (car plbound)) (not (equal p (last plround) 2.5e-2)))
         (if plround
         (setq aa (angle (car plround) p))
         )
         (if (and aa (equal aa (* 2 pi) 2.5e-2))
         (setq aa 0.0)
         )
         (setq plbound (cdr plbound))
         (setq plbound (vl-sort plbound (function (lambda ( a b ) (< (distance a p) (distance b p))))))
         (if (or (equal p (car plbound) 2.5e-2) (equal (car plbound) (car plround) 2.5e-2))
         (setq plbound (cdr (reverse (cons (car plbound) (reverse plbound)))))
         )
         (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)))
         (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)))))
         (if plboundd
         (progn
             (setq plbound (vl-remove (car plboundd) plbound))
             (setq plbound (cons (car plboundd) plbound))
         )
         )
         (setq plround (cons p plround))
       )
       (setq plround (cons (car plbound) plround))
       (setq plbound (cdr plbound))
       (setq plround (reverse plround))
       (setq plr pl)
       (foreach p plround
         (setq plr (vl-remove p plr))
       )
       (while (setq p (car plround))
         (setq a (if (cadr plround) (angle p (cadr plround))))
         (if
         (not
             (or
               (equal a 0.0 2.5e-2)
               (equal a (* 0.5 pi) 2.5e-2)
               (equal a pi 2.5e-2)
               (equal a (* 1.5 pi) 2.5e-2)
               (equal a (* 2 pi) 2.5e-2)
             )
         )
         (progn
             (setq plroundorth (cons p plroundorth))
             (setq plround (cdr plround))
             (if plround
               (progn
               (setq plroundd (vl-sort plr (function (lambda ( a b ) (< (distance a (car plround)) (distance b (car plround)))))))
               (setq plroundd (vl-remove-if-not (function (lambda ( x ) (equal (distance x (car plround)) d 2.5e-2))) plroundd))
               (foreach pp plroundd
                   (setq a (angle p pp))
                   (if
                     (or
                     (equal a 0.0 2.5e-2)
                     (equal a (* 0.5 pi) 2.5e-2)
                     (equal a pi 2.5e-2)
                     (equal a (* 1.5 pi) 2.5e-2)
                     (equal a (* 2 pi) 2.5e-2)
                     )
                     (setq plround (cons pp plround))
                   )
               )
               )
             )
             (cond
               ( (and (null a) plround)
               (setq plroundorth (cons (car plround) plroundorth))
               (setq plround nil)
               )
               ( (and (null a) (null plround))
               (if (not (equal (distance (car plroundorth) (last plroundorth)) d 2.5e-2))
                   (progn
                     (setq plroundd (vl-sort plr (function (lambda ( a b ) (< (distance a (car plroundorth)) (distance b (car plroundorth)))))))
                     (setq plroundd (vl-remove-if-not (function (lambda ( x ) (equal (distance x (car plroundorth)) d 2.5e-2))) plroundd))
                     (foreach pp plroundd
                     (setq a (angle p pp))
                     (if
                         (or
                           (equal a 0.0 2.5e-2)
                           (equal a (* 0.5 pi) 2.5e-2)
                           (equal a pi 2.5e-2)
                           (equal a (* 1.5 pi) 2.5e-2)
                           (equal a (* 2 pi) 2.5e-2)
                         )
                         (setq plroundorth (cons pp plroundorth))
                     )
                     )
                   )
               )
               )
             )
         )
         (progn
             (setq plround (cdr plround))
             (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)))
               (setq pp (car plround))
               (setq plround (cdr plround))
             )
             (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)))
               (progn
               (if (not (vl-position p plroundorth))
                   (setq plroundorth (cons p plroundorth))
               )
               (setq plroundd (vl-sort plr (function (lambda ( a b ) (< (distance a pp) (distance b pp))))))
               (setq plroundd (vl-remove-if-not (function (lambda ( x ) (equal (distance x pp) d 2.5e-2))) plroundd))
               (foreach ppp plroundd
                   (setq aa (angle p ppp))
                   (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))))
                     (setq plround (cons ppp plround) tst t)
                   )
               )
               (if (and plround (null tst))
                   (setq plround (cons pp plround))
               )
               (if (null plround)
                   (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)))
                     (setq plround (cons pp plround))
                   )
               )
               (setq tst nil)
               )
               (progn
               (setq plroundd (vl-sort plr (function (lambda ( a b ) (< (distance a pp) (distance b pp))))))
               (setq plroundd (vl-remove-if-not (function (lambda ( x ) (equal (distance x pp) d 2.5e-2))) plroundd))
               (foreach ppp plroundd
                   (setq aa (angle p ppp))
                   (if
                     (or
                     (equal aa 0.0 2.5e-2)
                     (equal aa (* 0.5 pi) 2.5e-2)
                     (equal aa pi 2.5e-2)
                     (equal aa (* 1.5 pi) 2.5e-2)
                     (equal aa (* 2 pi) 2.5e-2)
                     )
                     (setq plround (cons ppp plround))
                   )
               )
               )
             )
         )
         )
       )
       (setq plroundorth (reverse plroundorth))
       (setq plroundorth (mapcar (function (lambda ( p ) (trans p 1 0))) plroundorth))
       (setq plroundorth (unique plroundorth))
       (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))))))))
       (foreach p plroundorthrem
         (setq plroundorth (vl-remove p plroundorth))
       )
       (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)))))
       (setq plround nil plroundorth nil)
   )
   )
)
(vla-endundomark adoc)
(princ)
)
HTH。,M、 R。

BIGAL 发表于 2022-7-5 15:13:00

考虑另一种方法,选择所有圆,然后进行ssget cp,即每个圆的2xRad,如果选择集小于8,则为外圆。应该在测试图纸上工作,因为它有单列圆,突出并且连接在一起更像网格。
 
删除的代码不完全符合要求。

marko_ribar 发表于 2022-7-5 15:16:10

我发布的代码现在可以与此附加的DWG一起使用。。。
测试-尺寸外边界圆。图纸

MastroLube 发表于 2022-7-5 15:18:49

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

MastroLube 发表于 2022-7-5 15:25:12

 
你好,马尔科!很高兴再次见到你
 
是的,代码经过改进,最后一点有点小问题,就像我发布的gif一样(但只有一个错误,而不是2个错误)。。在我的上一张图纸上试试。。。谢谢你的帮助!
 
编辑:看看他的行为。。(由于耗时太长,我删除了很多帧)
 

marko_ribar 发表于 2022-7-5 15:26:32

发布的代码最终更新。。。你不能选择多组圆,只能一组一组。。。
 
您好,M.R。

MastroLube 发表于 2022-7-5 15:32:38

 
谢谢Marko,非常酷的代码!我现在就开始学习!
 
一个小问题。。你认为连中间的洞都不可能考虑吗?(或者忽略,因此我将其添加到gif中)
 

marko_ribar 发表于 2022-7-5 15:34:35

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

MastroLube 发表于 2022-7-5 15:36:45

谢谢Marko,这对我很有帮助!
页: [1] 2
查看完整版本: 引用外部圆