cheefeel 发表于 2022-12-5 14:30:07

如何批量 将圆和圆弧 转化为多段线

求这样一款插件:

选中一堆包含各种对象的图形,然后能将其中的圆和圆弧转换成多段线。
如果连椭圆也能椭圆也拟合成多段线就更好了。

guosheyang 发表于 2022-12-5 14:30:08

http://bbs.mjtd.com/thread-186768-1-1.html这对你这问题写了两个函数 供参考

llsheng_73 发表于 2022-12-5 15:59:08

也发个自己弄来转多线段的,不敢说好,但绝对纯源码
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=108015&fromuid=202795
(出处: 明经CAD社区)

cheefeel 发表于 2022-12-5 17:35:05

llsheng_73 发表于 2022-12-5 15:59
也发个自己弄来转多线段的,不敢说好,但绝对纯源码
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=1 ...

这个不错,不过不是我想要的那种,我想的比方说一个圆弧直接转多段线,但是不分段。就像用PEDIT那样去处理,PEDIT也能多选,但是解决不了圆。

cq4920 发表于 2022-12-5 18:14:33

;圆弧转多段线
;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)
)

wzg356 发表于 2022-12-5 18:52:07

http://bbs.mjtd.com/thread-182691-1-1.html
各种线取样提取坐标适用line,lwpolyline,polyline,spline,circle,arc,ellipse


我多个帖子函数都在使用转为多线段

lee50310 发表于 2022-12-5 18:59:33

本帖最后由 lee50310 于 2022-12-5 19:30 编辑

圓,弧轉多段線 你的需求是不是轉完後不影響原來大小 頂點數越少 越好

cheefeel 发表于 2022-12-6 09:23:24

本帖最后由 cheefeel 于 2022-12-6 13:53 编辑

感谢各位大佬的回复,可能是我的表述不专业,实际1楼是我想要的结果

llsheng_73 发表于 2023-1-3 11:31:18

圆(弧)转为二点多段线

本帖最后由 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]
查看完整版本: 如何批量 将圆和圆弧 转化为多段线