听见天晴 发表于 2024-11-10 11:35:35

有没有框选范围内的圆在水平和竖直方向圆心连线的程序?

机械制图中经常有很多在水平或者竖直的孔,出图时需要用中心线连接在一起,
有没有这样的程序可以框选一下 自动连线,在X或者Y轴 平齐的才连线,其余的不连线
网上找了一个点击圆心连线的,只能一个一个点 感觉不是很方便,想请教大家 有没有这样自动的。。

单点圆心连线的程序~




xj6019 发表于 2024-11-10 11:35:36

本帖最后由 xj6019 于 2024-11-10 20:22 编辑

GEGEYANG88 发表于 2024-11-10 17:52
请测试并列圆连线
换个算法,再玩一遍

xj6019 发表于 2024-11-10 14:18:09

本帖最后由 xj6019 于 2024-11-10 14:45 编辑

瞎玩一把!!!!!!!!!!!!!!


(defun c:NM (/ canzhaoent cenlst entlst i s1 ss xentlst xlst yentlst ylst)
        (setq cenlst nil)
(if(and
                       (setq ss (ssget (list '(0 . "CIRCLE"))));
                       (setq i -1)
               )
                (progn
                        (while(setq s1 (ssname ss (setq i (1+ i))))               
                                (setq cenlst (cons(cdr(assoc 10 (entget s1)))cenlst))
                        )
                        (setq xentlst(vl-remove-if-not '(lambda(x)(= 'ENAME (type x))) (mapcar 'cadr (ssnamex SS)))
                                yentlst xentlst
                        )
                        ;;;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX       
                        (while(setq canzhaoent(car xentlst))
                                (setq xlst
                                        (vl-remove-if-not
                                                (function
                                                        (lambda(x)
                                                                (equal(car(cdr(assoc 10 (entget canzhaoent))))(car(cdr(assoc 10 (entget x)))) 0.2)                       
                                                        )
                                                )
                                                (cdr xentlst)               
                                        )
                                )
                                (if xlst
                                        (progn
                                                (setq xlst
                                                        (vl-sort xlst
                                                                (function
                                                                        (lambda (x y)
                                                                                (>(distance(cdr(assoc 10 (entget canzhaoent))) (cdr(assoc 10 (entget x))))
                                                                                        (distance(cdr(assoc 10 (entget canzhaoent))) (cdr(assoc 10 (entget y)))))
                                                                        )
                                                                )
                                                        )       
                                                )
                                                (entmakex
                                                        (list '(0 . "LINE")
                                                                '(6 . "CENTER") '(62 . 1)
                                                                (cons 10 (cdr(assoc 10 (entget canzhaoent))))
                                                                (cons 11 (cdr(assoc 10 (entget (car xlst)))))))
                                               
                                                (foreach x xlst
                                                        (setq xentlst(vl-remove x xentlst))
                                                )
                                        )
                                )
                                (setq xentlst(cdr xentlst))
                        )
                        ;;YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
                        (while(setq canzhaoent(car yentlst))
                                (setq ylst
                                        (vl-remove-if-not
                                                (function
                                                        (lambda(x)
                                                                (equal(cadr(cdr(assoc 10 (entget canzhaoent))))(cadr(cdr(assoc 10 (entget x)))) 0.2)                       
                                                        )
                                                )
                                                (cdr yentlst)               
                                        )
                                )
                                (if ylst
                                        (progn
                                                (setq ylst
                                                        (vl-sort ylst
                                                                (function
                                                                        (lambda (x y)
                                                                                (>(distance(cdr(assoc 10 (entget canzhaoent))) (cdr(assoc 10 (entget x))))
                                                                                        (distance(cdr(assoc 10 (entget canzhaoent))) (cdr(assoc 10 (entget y)))))
                                                                        )
                                                                )
                                                        )       
                                                )
                                                (entmakex
                                                        (list '(0 . "LINE")
                                                                '(6 . "CENTER") '(62 . 1)
                                                                (cons 10 (cdr(assoc 10 (entget canzhaoent))))
                                                                (cons 11 (cdr(assoc 10 (entget (car ylst)))))))
                                                (foreach x ylst
                                                        (setq yentlst(vl-remove x yentlst))
                                                )
                                               
                                        )
                                )                       
                                (setq yentlst(cdr yentlst))
                        )
                       
                )               
)
        (princ)
)

GEGEYANG88 发表于 2024-11-10 15:36:05

xj6019 发表于 2024-11-10 14:18
瞎玩一把!!!!!!!!!!!!!!




{:1_1:}有BUG,并列多个圆,总要少连接1个,期待修复。

xj6019 发表于 2024-11-10 16:35:54

GEGEYANG88 发表于 2024-11-10 15:36
有BUG,并列多个圆,总要少连接1个,期待修复。

测试正常,没发现

xyp1964 发表于 2024-11-10 17:26:57


;非源码慎用


GEGEYANG88 发表于 2024-11-10 17:52:36

请测试并列圆连线

xyp1964 发表于 2024-11-10 19:27:44

GEGEYANG88 发表于 2024-11-10 17:52
请测试并列圆连线


GEGEYANG88 发表于 2024-11-10 20:01:08

牛牛牛牛牛!

听见天晴 发表于 2024-11-10 20:06:05

xj6019 发表于 2024-11-10 16:35
测试正常,没发现

谢谢大佬,程序我刚刚测试了一下,的确是有时候会漏连线,图片给您看看,画绿圈的地方是漏连接的,我把测试的图档也传上来,希望能帮忙优化一下


页: [1] 2
查看完整版本: 有没有框选范围内的圆在水平和竖直方向圆心连线的程序?