275437962 发表于 2013-12-26 20:10:30

autolisp如何实现多段线中的圆弧部分用插密多段线来替换

本帖最后由 275437962 于 2013-12-27 22:19 编辑

CAD中实现所有图层多段线中的圆弧部分用插密多段线的方式来替换,即多段线中的圆弧部分用普通多段线加点插密的方式逼近, 并保证这些多段线处理后所在的图层与其原来所在的图层一致。
(说明:单独的圆弧对象不做处理)
( 说明: 整个多段线同宽 )

zijiren007 发表于 2013-12-27 13:24:23

提问很好,求高手解答

菜卷鱼 发表于 2013-12-27 14:02:56

你这么做的用意是什么?直接把圆弧转换成多段线不行?

275437962 发表于 2013-12-27 14:55:13

菜卷鱼 发表于 2013-12-27 14:02 static/image/common/back.gif
你这么做的用意是什么?直接把圆弧转换成多段线不行?

我的这个圆弧不是单独的圆弧对象,而用是多段线中的弧,它是作为多段线的一部分存在的!!!

masterlong 发表于 2013-12-27 21:54:25

本帖最后由 masterlong 于 2013-12-27 21:56 编辑

这个程序做起来并不是那么容易
如果整个PL线同宽还好点
如果不同宽就麻烦了

假设同宽
我的思路是这样的
记录宽度
和所有的节点坐标polist
炸碎PL线
获取前一选择集SS
遍历
遇到圆弧
记录起点终点
求弧长计算查密点个数
divide命令
记录新生成的点坐标
并加入到polist
最后删点删SS
画PL线

最近是相当的忙
有空的来试试吧

275437962 发表于 2013-12-28 16:00:48

masterlong 发表于 2013-12-27 21:54 static/image/common/back.gif
这个程序做起来并不是那么容易
如果整个PL线同宽还好点
如果不同宽就麻烦了


可以保证,每一条多段线都是同宽的,你好,还是帮个忙吧!!!

自贡黄明儒 发表于 2013-12-28 16:08:23

masterlong 发表于 2013-12-27 21:54 static/image/common/back.gif
这个程序做起来并不是那么容易
如果整个PL线同宽还好点
如果不同宽就麻烦了


不用这么复杂吧,我也正想写这个。等忙过这段时间写一个。

自贡黄明儒 发表于 2013-12-31 16:48:39

本帖最后由 自贡黄明儒 于 2014-1-3 11:28 编辑

啊,楼主修改了呀,饭也不请了,悬赏也不见了
;;[通用函数] 带过滤器的entsel
(defun Fsxm-entsel (msg filter)
(setq enp (entsel msg))
(if (or (= (type enp) 'str)
    (and enp (ssget (cadr enp) filter))
      )
    enp
)
)
;;多段线弧用折线代替
(defun C:w2 ()
;;164.3 [功能] 多段线凸度列表
;;示例(get42 (entget(car (entsel))))
(defun get42 (en)
    (mapcar 'cdr
      (vl-remove-if-not '(lambda (x) (= (car x) 42)) en)
    )
)
;;沿多段线取点,弧处按角度加密取点
(defun LP:getpts (E EN / I II J L42 N PT PTLST X)
    (setq l42 (get42 en))
    (setq j 0)
    (repeat (setq n (fix (vlax-curve-getEndParam e)))
      (setq x (car l42))
      (setq l42 (cdr l42))
      (cond ((equal x 0)
       (setq pt (vlax-curve-getPointAtParam e j))
       (setq ptlst (cons pt ptlst))
       (setq j (1+ j))
      )
      (T
       (setq i (fix (/ (* (atan (abs x)) 180) pi)))   ;弧取点密度
       (setq ii (/ 1.0 i))
       (repeat i         
         (setq pt (vlax-curve-getPointAtParam e j))
         (setq ptlst (cons pt ptlst))
         (setq j (+ ii j))
       )
       (setq j (fix (+ 0.5 j)))
      )
      )
    )
    ptlst
)

;;164.31 [功能] 点表生成多段线
(defun Make-LWPOLYLINE (lst / PT)
    (entmake (append (list '(0 . "LWPOLYLINE")
         '(100 . "AcDbEntity")
         '(100 . "AcDbPolyline")
         (cons 90 (length lst))
         )
         (mapcar '(lambda (pt) (cons 10 pt)) lst)
       )
    )
)

(setq e (Fsxm-entsel "\n 选择剖面的多段线" '((0 . "LWPOLYLINE"))))
(setq pt (cadr e))
(setq e (car e))
(setq en (entget e))
(Make-LWPOLYLINE (LP:getpts E EN))
)

275437962 发表于 2014-1-3 20:56:12

自贡黄明儒 发表于 2013-12-31 16:48 static/image/common/back.gif
啊,楼主修改了呀,饭也不请了,悬赏也不见了

朋友,有问题啊,一个是插密的间距不能人为设置,还有是原来的线没有删除,还有是,不能所有框选,自动对有有弧的多段线进行处理, 只能找到这条线,然后一条一条选 ,去处理!!!!不是太实用!!!

emk 发表于 2014-1-4 14:31:09

楼主自己改改就好。。。。。。
页: [1]
查看完整版本: autolisp如何实现多段线中的圆弧部分用插密多段线来替换