各位大师!为什么圆与圆之间,圆与线之间打断于点打断不了呢?
网友答: 应该问:圆为什么不可以打断网友答: CIRCLE不能直接用圆上同一个点进行break,因为CAD规定ARC的圆心角不能等于2pi,所以用圆上同一个点对圆进行break会失败。
但是这个圆心角可以无限接近于2pi,那么也就有了可以操作的可能:用圆心P0和给定的打断点p计算arc的初始角,再用这个角减去一个极小的数值,比如1e-8作为终止角,重新绘制ARC就可以
网友答:
圆只能打断于两点 打断于一点会失败 正如 (entmake (list '(0 . "ARC") (list 10 0 0 0) (cons 40 1000) (cons 50 0) (cons 51 (* 2 pi)))) 只能生成一个点的圆弧 而 (entmake (list '(0 . "ARC") (list 10 0 0 0) (cons 40 1000) (cons 50 0.000001) (cons 51 (* 2 pi)))) 则可以生成一个接近完整圆的圆弧网友答:
本帖最后由 guosheyang 于 2026-2-2 12:01 编辑
通过点击圆上一个点来打断圆,(本质上也是两点打断圆 另一点自动确定),之所以建议通过两点来打断圆,主要是在可能的后续生成面域或者拓扑多边形等啥的时候,提高生成面域等的成功率,近似小缺口处理的,可能会导致生成面域失败
;;指定一点来打断圆
(defun c:breakcircle@pt(/ BRKPT CEN CIR RAD ST)
(setq cir(car(entsel "\n 请指定要打断的圆")))
(setq cen(cdr(assoc 10(entget cir))))
(setq rad(cdr(assoc 40(entget cir))))
(setq brkpt(getpoint "\n 请指定一点来打断圆"))
(setq st(vlax-curve-getstartpoint cir))
(if(not(equal brkpt st 0.000000001))
(progn
(entmake (list '(0 . "ARC") (cons 10 cen) (cons 40 rad) (cons 50 0) (cons 51 (angle cen brkpt))))
(entmake (list '(0 . "ARC") (cons 10 cen) (cons 40 rad) (cons 50 (angle cen brkpt)) (cons 51 (* 2 pi))))
)
(progn
(entmake (list '(0 . "ARC") (cons 10 cen) (cons 40 rad) (cons 50 0) (cons 51 pi)))
(entmake (list '(0 . "ARC") (cons 10 cen) (cons 40 rad) (cons 50 pi) (cons 51 (* 2 pi))))
)
)
(entdel cir)
(princ)
)网友答: 命令: BREAKATPOINT
选择对象:
指定打断点:
圆弧不能是 360 度网友答:
你这个是打断圆弧 不是圆哦网友答: 本帖最后由 scnc001 于 2026-2-4 08:19 编辑
无限放大,画两条线穿过圆,然后修剪(如果你非要事实上的一个点,就好比强行要求分母为0一样)网友答:
修剪后原来的圆弧不就不见了吗网友答:
看你要什么了。。。闭合的多段线我想分开首尾还分不开了,只有打断留个小缺口。如果不适合你的要求,请无视,我说的方法只能视觉上满足要求。
网友答: 应该问:圆为什么不可以打断网友答: CIRCLE不能直接用圆上同一个点进行break,因为CAD规定ARC的圆心角不能等于2pi,所以用圆上同一个点对圆进行break会失败。
但是这个圆心角可以无限接近于2pi,那么也就有了可以操作的可能:用圆心P0和给定的打断点p计算arc的初始角,再用这个角减去一个极小的数值,比如1e-8作为终止角,重新绘制ARC就可以

- (and(setq e(ssget":E:S"'((0 . "circle"))))
- (setq e(ssname e 0)
- en(entget e)
- p0(CDR(ASSOC 10 EN))
- p(vlax-curve-getclosestpointto e(getpoint)))
- (ENTMAKEX(MAPCAR'CONS'(0 10 40 50 51)(LIST"ARC"(CDR(ASSOC 10 EN))(CDR(ASSOC 40 EN))(ANGLE p0 P)(-(ANGLE p0 P)1E-8))))
- (entdel e))
通过点击圆上一个点来打断圆,(本质上也是两点打断圆 另一点自动确定),之所以建议通过两点来打断圆,主要是在可能的后续生成面域或者拓扑多边形等啥的时候,提高生成面域等的成功率,近似小缺口处理的,可能会导致生成面域失败

;;指定一点来打断圆
(defun c:breakcircle@pt(/ BRKPT CEN CIR RAD ST)
(setq cir(car(entsel "\n 请指定要打断的圆")))
(setq cen(cdr(assoc 10(entget cir))))
(setq rad(cdr(assoc 40(entget cir))))
(setq brkpt(getpoint "\n 请指定一点来打断圆"))
(setq st(vlax-curve-getstartpoint cir))
(if(not(equal brkpt st 0.000000001))
(progn
(entmake (list '(0 . "ARC") (cons 10 cen) (cons 40 rad) (cons 50 0) (cons 51 (angle cen brkpt))))
(entmake (list '(0 . "ARC") (cons 10 cen) (cons 40 rad) (cons 50 (angle cen brkpt)) (cons 51 (* 2 pi))))
)
(progn
(entmake (list '(0 . "ARC") (cons 10 cen) (cons 40 rad) (cons 50 0) (cons 51 pi)))
(entmake (list '(0 . "ARC") (cons 10 cen) (cons 40 rad) (cons 50 pi) (cons 51 (* 2 pi))))
)
)
(entdel cir)
(princ)
)网友答: 命令: BREAKATPOINT
选择对象:
指定打断点:
圆弧不能是 360 度网友答:
forestgxc 发表于 2026-2-2 14:34
命令: BREAKATPOINT
选择对象:
指定打断点:
你这个是打断圆弧 不是圆哦网友答: 本帖最后由 scnc001 于 2026-2-4 08:19 编辑
无限放大,画两条线穿过圆,然后修剪(如果你非要事实上的一个点,就好比强行要求分母为0一样)网友答:
scnc001 发表于 2026-2-4 08:18
无限放大,画两条线穿过圆,然后修剪(如果你非要事实上的一个点,就好比强行要求分母为0一样)
修剪后原来的圆弧不就不见了吗网友答:
277283904 发表于 2026-2-5 11:38
修剪后原来的圆弧不就不见了吗
看你要什么了。。。闭合的多段线我想分开首尾还分不开了,只有打断留个小缺口。如果不适合你的要求,请无视,我说的方法只能视觉上满足要求。