明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1071|回复: 8

[提问] 如何批量 将圆和圆弧 转化为多段线

[复制链接]
发表于 2022-12-5 14:30 | 显示全部楼层 |阅读模式
10明经币
求这样一款插件

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

最佳答案

查看完整内容

http://bbs.mjtd.com/thread-186768-1-1.html 这对你这问题 写了两个函数 供参考
发表于 2022-12-5 14:30 | 显示全部楼层
http://bbs.mjtd.com/thread-186768-1-1.html  这对你这问题  写了两个函数 供参考
回复

使用道具 举报

发表于 2022-12-5 15:59 | 显示全部楼层
也发个自己弄来转多线段的,不敢说好,但绝对纯源码
http://bbs.mjtd.com/forum.php?mo ... &fromuid=202795
(出处: 明经CAD社区)

评分

参与人数 1明经币 +1 收起 理由
cheefeel + 1 赞一个!

查看全部评分

回复

使用道具 举报

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

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

使用道具 举报

发表于 2022-12-5 18:14 | 显示全部楼层
  1. ;圆弧转多段线
  2. ;h为弓高(即弦中心至相对应弧之中心的距离)
  3. ;它用来描述以弦代弧的光滑程度,一般化取0.005mm(图上距离)即可
  4. (defun arc->pline (en h / xtblm xtblz ALEN ENT LEN LST N PT PTLST R SUM)
  5.   (setq #t0# (getvar "cdate"))
  6.   (setq        xtblm '("cmdecho" "osmode")
  7.         xtblz (mapcar 'getvar xtblm)
  8.         r     (yj-dxf 40 en)
  9.         len   (vlax-curve-getDistAtPoint en (vlax-curve-getEndPoint en))
  10.         alen  (* (atan (/ (sqrt (- (* 2.0 r h) (* h h))) (- r h))) r)
  11.         n     (fix (/ len alen))
  12.         alen  (/ len n)
  13.         sum   alen
  14.         ptlst '()
  15.   )
  16.   (repeat n
  17.     (setq pt (vlax-curve-getpointatdist en sum))
  18.     (setq ptlst (append ptlst (list (cons 10 pt)(cons 40 0)(cons 41 0)(cons 42 0)) ))
  19.     (setq sum (+ sum alen))
  20.     )
  21.   (setq ent (entget en))
  22.   (setq lst '((0 . "LWPOLYLINE")))
  23.      (foreach x '(100 67 410 8 62 6 370)
  24.        (if (assoc x
  25.                   ent
  26.            ) ;_  assoc
  27.          (setq lst (cons (assoc x ent) lst))
  28.        ) ;_  if
  29.      ) ;_  foreach
  30.      (vla-startundomark (vla-get-activedocument (vlax-get-acad-object)))
  31.      (entmakex
  32.        (append
  33.          (reverse lst)
  34.          (list
  35.            '(100 . "AcDbPolyline")
  36.            (cons 90 (1+ n))
  37.            '(70 . 0)
  38.            (cons 38 (cadddr (assoc 10 ent)))
  39.            (cons
  40.              10
  41.              (vlax-curve-getStartPoint en
  42.              ) ;_  reverse
  43.            ) ;_  cons
  44.            '(40 . 0)
  45.            '(41 . 0)
  46.            '(42 . 0)
  47.          )
  48.          ptlst
  49.          (list
  50.            (assoc 210 ent)
  51.          ) ;_  list
  52.        ) ;_  append
  53.      ) ;_  entmakex
  54.      ;(Vlax-Put-Property (Vlax-Ename->Vla-Object (entlast)) 'Color 1)
  55.      (entdel en)
  56.      (vla-endundomark (vla-get-activedocument (vlax-get-acad-object)))
  57.   (mapcar 'setvar xtblm xtblz)
  58.   (princ)
  59. )
  60. ;;;按指组码找出全图元的组码值
  61.     (defun yj-dxf (key ename) (cdr (assoc key (entget ename))))   
  62. ;测试程序
  63. (defun c:c2l ()
  64.         (setq ent (car (entsel "\n请选取要转化多段线的圆弧:")))
  65.         (setq jd (getreal "\n请设置圆弧精度:"))
  66.         (if jd nil
  67.                 (setq jd 0.05)
  68.         )
  69.   (arc->pline ent jd)
  70.   (princ
  71.     (strcat "\n耗时:"
  72.             (rtos (* 1000000 (- (getvar "cdate") #t0#) 2 3))
  73.             "秒"
  74.     )
  75.   )
  76.   (princ)
  77. )
回复

使用道具 举报

发表于 2022-12-5 18:52 | 显示全部楼层
http://bbs.mjtd.com/thread-182691-1-1.html
各种线取样提取坐标适用line,lwpolyline,polyline,spline,circle,arc,ellipse


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

使用道具 举报

发表于 2022-12-5 18:59 | 显示全部楼层
本帖最后由 lee50310 于 2022-12-5 19:30 编辑

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

使用道具 举报

 楼主| 发表于 2022-12-6 09:23 | 显示全部楼层
本帖最后由 cheefeel 于 2022-12-6 13:53 编辑

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

使用道具 举报

发表于 2023-1-3 11:31 | 显示全部楼层

圆(弧)转为二点多段线

本帖最后由 llsheng_73 于 2023-1-3 14:53 编辑

  1. (defun arctopl(p r ang1 ang2 / a);;圆(弧)转多段线
  2.   (setq a(*(rem(+(- ang2 ang1)pi pi)(+ pi pi))0.25)a(cons 42(/(sin a)(cos a))))
  3.   (List(cons 10(polar p ang1 r))a(cons 10(polar p ang2 r))a))
  4. (defun tt(e yn / en p r ang1 ang2)
  5.   (setq en(entget e)
  6.         p(cdr(assoc 10 en))
  7.         r(cdr(assoc 40 en))
  8.         ang1(cdr(assoc 50 en)))
  9.   (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))
  10.                                 (if ang1(arctopl p r ang1(cdr(assoc 51 en)))(arctopl p r 0 pi)))))
  11.   (or(="1"Yn)(entdel e)))
  12. (defun c:tt(/ e Yn )
  13.   (initget "1 2")
  14.   (or(member(setq Yn(getkword"1.保留圆(弧) 2.不保留圆(弧)[2]"))'("1""2"))(setq Yn"2"))
  15.   (while(setq e(ssget":E:S"'((0 . "circle,arc"))))
  16.     (tt(ssname e 0)Yn))
  17.   )
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-7 08:02 , Processed in 0.258774 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表