引用外部圆
大家好,我为一个制造空心板的社会工作。圆表示板中的空隙。
我在寻找引用这些圆圈的快速方法。
目前,我有一个lisp转换多边形线报价。
这是他的行为:
https://www.cadtutor.net/forum/attachment.php?attachmentid=61029&cid=1&stc=1
正如你们所见,我只对边界引号感兴趣。
知道如何在没有多段线的情况下执行该任务吗?也许通过选择所有的圆,lisp能够理解它是在内部还是在边界。
这是一个例子:测试。图纸
谢谢你的帮助,
丹尼斯 在您发布的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。 考虑另一种方法,选择所有圆,然后进行ssget cp,即每个圆的2xRad,如果选择集小于8,则为外圆。应该在测试图纸上工作,因为它有单列圆,突出并且连接在一起更像网格。
删除的代码不完全符合要求。 我发布的代码现在可以与此附加的DWG一起使用。。。
测试-尺寸外边界圆。图纸 大家好!感谢您的帮助,从您的代码中可以学到很多!
我已经在另一个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)
)
你好,马尔科!很高兴再次见到你
是的,代码经过改进,最后一点有点小问题,就像我发布的gif一样(但只有一个错误,而不是2个错误)。。在我的上一张图纸上试试。。。谢谢你的帮助!
编辑:看看他的行为。。(由于耗时太长,我删除了很多帧)
发布的代码最终更新。。。你不能选择多组圆,只能一组一组。。。
您好,M.R。
谢谢Marko,非常酷的代码!我现在就开始学习!
一个小问题。。你认为连中间的洞都不可能考虑吗?(或者忽略,因此我将其添加到gif中)
逐个选择。。。现在,避免它或在你的gif中这样做。。。您可以选择具有内部孤岛的整个组。。。
[编辑:现在添加了不同网格dx和dy的代码…我将带圆的DWG转换为块,更改了Y比例因子和分解块;结果是椭圆而不是圆…然后我测试了代码,我将在这里发布…]
3M.R。
P、 现在你们应该能够选择有空空间的组,在大多数情况下,若内部空间不接近外部边界,它应该同时标注外部边界和内部边界。。。 谢谢Marko,这对我很有帮助!
页:
[1]
2