明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: 依然小小鸟

[提问] 如何让多段圆弧变成一根多段线

[复制链接]
 楼主| 发表于 2018-9-3 11:25:22 | 显示全部楼层
mikewolf2k 发表于 2018-9-3 11:21
软件计算的应该可以完全精确,是操作问题吧

别纠结源头行吗 现在问题摆在这里了  就是局部点没接上 希望能忽略这些点 照样生成多段线
回复

使用道具 举报

 楼主| 发表于 2018-9-3 11:26:34 | 显示全部楼层
mikewolf2k 发表于 2018-9-3 11:21
软件计算的应该可以完全精确,是操作问题吧

http://bbs.mjtd.com/thread-178132-1-1.html    这个源头没问题 要不您给出出思路
回复

使用道具 举报

发表于 2018-9-3 11:28:57 | 显示全部楼层
依然小小鸟 发表于 2018-9-3 11:25
别纠结源头行吗 现在问题摆在这里了  就是局部点没接上 希望能忽略这些点 照样生成多段线

如果源头能解决,不就没问题了么。

点评

其实我也找到了 一会我传上来 分享给大家 论坛就是交流学习的地方 我用明经币悬赏大家来集思广益 另外非闭合曲线生成多段线也是常见问题 希望你多参与解答 而不是关注一些其他地方  发表于 2018-9-3 12:29
回复

使用道具 举报

 楼主| 发表于 2018-9-3 11:31:45 | 显示全部楼层
mikewolf2k 发表于 2018-9-3 11:28
如果源头能解决,不就没问题了么。

你是来捣乱的?  照你这么说  所有问题都可以源头解决  

点评

如果你认为这是捣乱,那我就不捣乱了哈。刚刚试了个非闭合曲线填充成功的方法。  发表于 2018-9-3 11:45
回复

使用道具 举报

发表于 2018-9-3 11:36:28 | 显示全部楼层
程序猿期望的是规范的绘图
绘图员指望程序能更聪些
两者都得自己来时会倾向规范的绘图
...
回复

使用道具 举报

 楼主| 发表于 2018-9-3 12:18:50 | 显示全部楼层
依然小小鸟 发表于 2018-9-3 11:31
你是来捣乱的?  照你这么说  所有问题都可以源头解决

其实我也找到了 一会我传上来 分享给大家  论坛就是交流学习的地方 我用明经币悬赏大家来集思广益  你不参与就别说风凉话  
回复

使用道具 举报

发表于 2018-9-3 14:41:00 | 显示全部楼层
本帖最后由 panliang9 于 2018-9-3 14:57 编辑

@依然小小鸟
我上传的代码应该已经解决了,不行的话再发一些图来试试!
你上传的图挺简单的,就算是有断点,也很简单的。


这个贴里妖刀给的代码能解决更复杂的情况,但是仅支持2006以下的版本!
http://bbs.mjtd.com/thread-83777-1-1.html

回复

使用道具 举报

 楼主| 发表于 2018-9-3 21:44:14 | 显示全部楼层
panliang9 发表于 2018-9-3 14:41
@依然小小鸟
我上传的代码应该已经解决了,不行的话再发一些图来试试!
你上传的图挺简单的,就算是有断 ...

这个我已经找到完美代码了  等我有空发上来
回复

使用道具 举报

发表于 2018-9-10 12:08:14 | 显示全部楼层
;;;我了解你的意思,这是论坛大神写的,我搬过来给你。记得感谢原作者

(defun GetCord(ob)
  (vlax-safearray->list(vlax-variant-value(vla-get-Coordinates ob)))
)

(defun StarEnd(ob)
   (list(append(list(vlax-curve-getstartparam ob))(vlax-curve-getstartpoint ob))
(append(list(vlax-curve-getendparam ob))(vlax-curve-getendpoint ob))))

(defun x(OBJ l p q o C / F)
  (SETQ F(if(and(>(+(distance p q)(distance q o))l)(<(abs(*(distance p q)(sin(-(angle p q)(angle p o)))))C))1 2))
)

(defun insertlist(Lst en n / l m s)
  (cond((= n 0)(setq s(append(list en)LST)))
       ((= n(setq l(length LST)))(setq s(append LST(list en))))
    (T(setq m 1 s(list(car LST)))
      (while(< m n)(setq s(append s(list(nth m LST)))m(1+ m)))
      (setq s(append s (list en)))
      (while(< m l)(setq s(append s(list(nth m LST)))m(1+ m)))))
  (setq Lst s))

(defun removelist(Lst n / l m s)
(if(= n 0)(setq s(cdr l))
   (progn(setq m 1 s(list(car LST)))
     (while(< m n)(setq s(append s(list(nth m LST)))m(1+ m)))(setq m(1+ n))
     (while(< m l)
       (setq s(append s(list(nth m LST)))m(1+ m)))))
(setq Lst s))

(defun c:CTP(/ D Pt ob a b c c2 p q o m n l F);;将各种线段转为多线段,将多线段上的弧线段也转为多线段
  (vl-load-com)
  (SETQ S(SSGET'((0 . "line,lwpolyline,polyline,spline,circle,arc,ellipse")))NM 0 MN(if s(SSLENGTH S)0))
  (while(not(and(> c2 0.65)(< c2 1)))(setq C2(getreal"\n采样精度(0.65~1):")))
  (setq C(/(- 1.0 C2)2))
  (WHILE(< NM MN)
    (SETQ en(SSNAME S NM)NM(1+ NM)
   ob(vlax-ename->vla-object en)a 0 n 1 pt nil D(vla-get-objectname ob)
   l(vlax-curve-getdistatparam ob(vlax-curve-getendparam ob))
   m(cond((= D"AcDb3dPolyline")3)((= D"AcDb2dPolyline")2)((= D"AcDbPolyline")2)))
    (if(or(= D"AcDb3dPolyline")(= D"AcDbPolyline"))
      (if(vl-catch-all-error-p(vl-catch-all-apply 'vla-get-Coordinates(list ob)))(setq Pt(StarEnd ob))
(progn(setq q(vlax-safearray->list(vlax-variant-value(vla-get-Coordinates ob))))
   (repeat(/(length q)m)(cond((= m 2)(setq p(list(nth a q)(nth(+ a 1)q))))
        ((= m 3)(setq p(list(nth a q)(nth(+ a 1)q)(nth(+ a 2)q)))))
     (setq a(+ a m)
    Pt(if(or(null Pt)(>(distance p(cdr(car(reverse Pt))))0.00005))
        (append Pt(list(append(list(vlax-curve-getparamatpoint ob p))p)))pt)))))
      (setq Pt(StarEnd ob)))
    (while(< n(length Pt))
      (setq m(1- n)a(vlax-curve-getdistAtparam ob(car(nth m Pt)))
     b(-(vlax-curve-getdistAtparam ob(car(nth n Pt)))a))
      (if(<= b 0)(setq b(- l a)))
      (setq o(vlax-curve-getparamatdist ob(+(/ b 2)a))
     r(append(list o)(vlax-curve-getpointatparam ob o))
     F(x ob (* b c2)(cdr(nth m Pt))(cdr r)(cdr(nth n Pt))c))
      (cond((= F 1)(setq n(1+ n)))
    ((= F 2)(setq Pt(insertlist Pt r n))))
      )
    (setq F(if(vlax-curve-isClosed ob)1 0)b(entget(vlax-vla-object->ename ob)'("*"))
   Pt(if(and(= F 1)(NULL(vl-string-search "olyline" D)))(reverse(cdr(reverse Pt)))Pt))
    (setq a(list(cons 0 "LWPOLYLINE")(cons 8(cdr(assoc 8 b)))(cons 6(if(assoc 6 b)(cdr(assoc 6 b))"Bylayer"))
  (cons 62(if(assoc 62 b)(cdr(assoc 62 b))256))(cons 370(if(assoc 370 b)(cdr(assoc 370 b))0))
  (cons 48(if(assoc 48 b)(cdr(assoc 48 b))1))(cons 100 "AcDbEntity")(cons 100 "AcDbPolyline")
  (cons 90(-(length Pt)F))(cons 70 (+ 128 F))(cons 43(if(assoc 43 b)(cdr(assoc 43 b))0))
  (cons 38(caddr(vlax-curve-getstartpoint ob)))(cons 39(if(assoc 39 b)(cdr(assoc 39 b))0)))
   a(append a(foreach b Pt(setq Pt(subst(subst 10(car b)b)b Pt)))))
    (entmake(if(assoc -3 b)(append a(list(assoc -3 b)))a))
    (prin1))
  )
(princ "将线转为多线段,采样精度不要小于0.65,当然也要小于1,OK?建议0.95,命令:CTP\n")
回复

使用道具 举报

 楼主| 发表于 2018-9-10 12:22:01 | 显示全部楼层
awd37 发表于 2018-9-10 12:08
;;;我了解你的意思,这是论坛大神写的,我搬过来给你。记得感谢原作者

(defun GetCord(ob)

谢谢 你
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-19 07:30 , Processed in 0.194322 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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