如何批量 将圆和圆弧 转化为多段线
求这样一款插件:选中一堆包含各种对象的图形,然后能将其中的圆和圆弧转换成多段线。
如果连椭圆也能椭圆也拟合成多段线就更好了。
http://bbs.mjtd.com/thread-186768-1-1.html这对你这问题写了两个函数 供参考 也发个自己弄来转多线段的,不敢说好,但绝对纯源码
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=108015&fromuid=202795
(出处: 明经CAD社区)
llsheng_73 发表于 2022-12-5 15:59
也发个自己弄来转多线段的,不敢说好,但绝对纯源码
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=1 ...
这个不错,不过不是我想要的那种,我想的比方说一个圆弧直接转多段线,但是不分段。就像用PEDIT那样去处理,PEDIT也能多选,但是解决不了圆。 ;圆弧转多段线
;h为弓高(即弦中心至相对应弧之中心的距离)
;它用来描述以弦代弧的光滑程度,一般化取0.005mm(图上距离)即可
(defun arc->pline (en h / xtblm xtblz ALEN ENT LEN LST N PT PTLST R SUM)
(setq #t0# (getvar "cdate"))
(setq xtblm '("cmdecho" "osmode")
xtblz (mapcar 'getvar xtblm)
r (yj-dxf 40 en)
len (vlax-curve-getDistAtPoint en (vlax-curve-getEndPoint en))
alen(* (atan (/ (sqrt (- (* 2.0 r h) (* h h))) (- r h))) r)
n (fix (/ len alen))
alen(/ len n)
sum alen
ptlst '()
)
(repeat n
(setq pt (vlax-curve-getpointatdist en sum))
(setq ptlst (append ptlst (list (cons 10 pt)(cons 40 0)(cons 41 0)(cons 42 0)) ))
(setq sum (+ sum alen))
)
(setq ent (entget en))
(setq lst '((0 . "LWPOLYLINE")))
(foreach x '(100 67 410 8 62 6 370)
(if (assoc x
ent
) ;_assoc
(setq lst (cons (assoc x ent) lst))
) ;_if
) ;_foreach
(vla-startundomark (vla-get-activedocument (vlax-get-acad-object)))
(entmakex
(append
(reverse lst)
(list
'(100 . "AcDbPolyline")
(cons 90 (1+ n))
'(70 . 0)
(cons 38 (cadddr (assoc 10 ent)))
(cons
10
(vlax-curve-getStartPoint en
) ;_reverse
) ;_cons
'(40 . 0)
'(41 . 0)
'(42 . 0)
)
ptlst
(list
(assoc 210 ent)
) ;_list
) ;_append
) ;_entmakex
;(Vlax-Put-Property (Vlax-Ename->Vla-Object (entlast)) 'Color 1)
(entdel en)
(vla-endundomark (vla-get-activedocument (vlax-get-acad-object)))
(mapcar 'setvar xtblm xtblz)
(princ)
)
;;;按指组码找出全图元的组码值
(defun yj-dxf (key ename) (cdr (assoc key (entget ename))))
;测试程序
(defun c:c2l ()
(setq ent (car (entsel "\n请选取要转化多段线的圆弧:")))
(setq jd (getreal "\n请设置圆弧精度:"))
(if jd nil
(setq jd 0.05)
)
(arc->pline ent jd)
(princ
(strcat "\n耗时:"
(rtos (* 1000000 (- (getvar "cdate") #t0#) 2 3))
"秒"
)
)
(princ)
) http://bbs.mjtd.com/thread-182691-1-1.html
各种线取样提取坐标适用line,lwpolyline,polyline,spline,circle,arc,ellipse
我多个帖子函数都在使用转为多线段 本帖最后由 lee50310 于 2022-12-5 19:30 编辑
圓,弧轉多段線 你的需求是不是轉完後不影響原來大小 頂點數越少 越好 本帖最后由 cheefeel 于 2022-12-6 13:53 编辑
感谢各位大佬的回复,可能是我的表述不专业,实际1楼是我想要的结果
圆(弧)转为二点多段线
本帖最后由 llsheng_73 于 2023-1-3 14:53 编辑(defun arctopl(p r ang1 ang2 / a);;圆(弧)转多段线
(setq a(*(rem(+(- ang2 ang1)pi pi)(+ pi pi))0.25)a(cons 42(/(sin a)(cos a))))
(List(cons 10(polar p ang1 r))a(cons 10(polar p ang2 r))a))
(defun tt(e yn / en p r ang1 ang2)
(setq en(entget e)
p(cdr(assoc 10 en))
r(cdr(assoc 40 en))
ang1(cdr(assoc 50 en)))
(entmakex(vl-remove'nil(append(mapcar'cons'(0 100 100 90 70)(list"LWPOLYLINE""AcDbEntity""AcDbPolyline"2(if ang1 0 1)))(list(assoc 8 en)(assoc 370 en)(assoc 62 en))
(if ang1(arctopl p r ang1(cdr(assoc 51 en)))(arctopl p r 0 pi)))))
(or(="1"Yn)(entdel e)))
(defun c:tt(/ e Yn )
(initget "1 2")
(or(member(setq Yn(getkword"1.保留圆(弧) 2.不保留圆(弧)"))'("1""2"))(setq Yn"2"))
(while(setq e(ssget":E:S"'((0 . "circle,arc"))))
(tt(ssname e 0)Yn))
)
页:
[1]