找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1789|回复: 11

[每日一码] LWPOLYLINE清除冗余点,合并同向段

[复制链接]

已领礼包: 20个

财富等级: 恭喜发财

发表于 2017-5-11 16:30:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
搜狗截图20170511162610.png


  1. (defun purge-pline (pl              /                regular-width            colinear  concentric
  2.                     del-cadr  pour-car        elst          closed    old-p     old-b
  3.                     old-sw    old-ew        new-d          new-p            new-b     new-sw
  4.                     new-ew    b1        b2
  5.                    )
  6. ;; Evaluates if the pline width is regular on 3 successive points
  7.   (defun regular-width (p1 p2 p3 ws1 we1 ws2 we2 / delta)
  8.     (or        (= ws1 we1 ws2 we2)
  9.         (and (= we1 ws2)
  10.              (/= 0 (setq delta (- we2 ws1)))
  11.              (equal (/ (- (vlax-curve-getDistAtPoint pl (trans p2 pl 0))
  12.                           (vlax-curve-getDistAtPoint pl (trans p1 pl 0))
  13.                        )
  14.                        (- (vlax-curve-getDistAtPoint pl (trans p3 pl 0))
  15.                           (vlax-curve-getDistAtPoint pl (trans p1 pl 0))
  16.                        )
  17.                     )
  18.                     (/ (- we1 (- we2 delta)) delta)
  19.                     1e-9
  20.              )
  21.         )
  22.     )
  23.   );; Evaluates if 3 successive vertices are aligned
  24.   (defun colinear (p1 p2 p3 b1 b2)
  25.     (and (zerop b1)
  26.          (zerop b2)
  27.          (null (inters p1 p2 p1 p3)
  28.          )
  29.     )
  30.   );; Evaluates if 3 sucessive vertices have the same center
  31.   (defun concentric (p1 p2 p3 b1 b2 / bd1 bd2)
  32.     (if
  33.       (and (/= 0.0 b1)
  34.            (/= 0.0 b2)
  35.            (equal
  36.              (caddr (setq bd1 (BulgeData b1 p1 p2)))
  37.              (caddr (setq bd2 (BulgeData b2 p2 p3)))
  38.              1e-9
  39.            )
  40.       )
  41.        (tan (/ (+ (car bd1) (car bd2)) 4.0))
  42.     )
  43.   )  ;; Removes the second item of the list
  44.   (defun del-cadr (lst)
  45.     (set lst (cons (car (eval lst)) (cddr (eval lst))))
  46.   ) ;; Pours the first item of a list to another one
  47.   (defun pour-car (from to)
  48.     (set to (cons (car (eval from)) (eval to)))
  49.     (set from (cdr (eval from)))
  50.   )
  51.   (setq elst (entget pl))
  52.   (and (= 1 (logand 1 (cdr (assoc 70 elst)))) (setq closed T))
  53.   (mapcar (function (lambda (x)
  54.                       (cond
  55.                         ((= (car x) 10) (setq old-p (cons x old-p)))
  56.                         ((= (car x) 40) (setq old-sw (cons x old-sw)))
  57.                         ((= (car x) 41) (setq old-ew (cons x old-ew)))
  58.                         ((= (car x) 42) (setq old-b (cons x old-b)))
  59.                         (T (setq new-d (cons x new-d)))
  60.                       )
  61.                     )
  62.           )
  63.           elst
  64.   )
  65.   (mapcar (function (lambda (l)
  66.                       (set l (reverse (eval l)))
  67.                     )
  68.           )
  69.           '(old-p old-sw old-ew old-b new-d)
  70.   )
  71.   (and closed (setq old-p (append old-p (list (car old-p)))))
  72.   (and (equal (cdar old-p) (cdr (last old-p)) 1e-9)
  73.        (setq closed T
  74.              new-d  (subst (cons 70 (Boole 7 (cdr (assoc 70 new-d)) 1))
  75.                            (assoc 70 new-d)
  76.                            new-d
  77.                     )
  78.        )
  79.   )
  80.   (while (cddr old-p)
  81.     (if        (regular-width
  82.           (cdar old-p)
  83.           (cdadr old-p)
  84.           (cdaddr old-p)
  85.           (cdar old-sw)
  86.           (cdar old-ew)
  87.           (cdadr old-sw)
  88.           (cdadr old-ew)
  89.         )
  90.       (cond
  91.         ((colinear (cdar old-p)
  92.                    (cdadr old-p)
  93.                    (cdaddr old-p)
  94.                    (cdar old-b)
  95.                    (cdadr old-b)
  96.          )
  97.          (mapcar 'del-cadr '(old-p old-sw old-ew old-b))
  98.         )
  99.         ((setq bu (concentric
  100.                     (cdar old-p)
  101.                     (cdadr old-p)
  102.                     (cdaddr old-p)
  103.                     (cdar old-b)
  104.                     (cdadr old-b)
  105.                   )
  106.          )
  107.          (setq old-b (cons (cons 42 bu) (cddr old-b)))
  108.          (mapcar 'del-cadr '(old-p old-sw old-ew))
  109.         )
  110.         (T
  111.          (mapcar 'pour-car
  112.                  '(old-p old-sw old-ew old-b)
  113.                  '(new-p new-sw new-ew new-b)
  114.          )
  115.         )
  116.       )
  117.       (mapcar 'pour-car
  118.               '(old-p old-sw old-ew old-b)
  119.               '(new-p new-sw new-ew new-b)
  120.       )
  121.     )
  122.   )
  123.   (if closed
  124.     (setq new-p (reverse (cons (car old-p) new-p)))
  125.     (setq new-p (append (reverse new-p) old-p))
  126.   )
  127.   (mapcar
  128.     (function
  129.       (lambda (new old)
  130.         (set new (append (reverse (eval new)) (eval old)))
  131.       )
  132.     )
  133.     '(new-sw new-ew new-b)
  134.     '(old-sw old-ew old-b)
  135.   )
  136.   (if (and closed
  137.            (regular-width
  138.              (cdr (last new-p))
  139.              (cdar new-p)
  140.              (cdadr new-p)
  141.              (cdr (last new-sw))
  142.              (cdr (last new-ew))
  143.              (cdar new-sw)
  144.              (cdar new-ew)
  145.            )
  146.       )
  147.     (cond
  148.       ((colinear (cdr (last new-p))
  149.                  (cdar new-p)
  150.                  (cdadr new-p)
  151.                  (cdr (last new-b))
  152.                  (cdar new-b)
  153.        )
  154.        (mapcar (function (lambda (l)
  155.                            (set l (cdr (eval l)))
  156.                          )
  157.                )
  158.                '(new-p new-sw new-ew new-b)
  159.        )
  160.       )
  161.       ((setq bu        (concentric
  162.                   (cdr (last new-p))
  163.                   (cdar new-p)
  164.                   (cdadr new-p)
  165.                   (cdr (last new-b))
  166.                   (cdar new-b)
  167.                 )
  168.        )
  169.        (setq new-b (cdr (reverse (cons (cons 42 bu) (cdr (reverse new-b))))))
  170.        (mapcar (function (lambda (l)
  171.                            (set l (cdr (eval l)))
  172.                          )
  173.                )
  174.                '(new-p new-sw new-ew)
  175.        )
  176.       )
  177.     )
  178.   )
  179.   (entmod
  180.     (append new-d
  181.             (apply 'append
  182.                    (apply 'mapcar
  183.                           (cons 'list (list new-p new-sw new-ew new-b))
  184.                    )
  185.             )
  186.     )
  187.   )
  188. );; BulgeData Retourne les données d'un polyarc (angle rayon centre)
  189. (defun BulgeData (bu p1 p2 / ang rad cen)
  190.   (setq        ang (* 2 (atan bu))
  191.         rad (/ (distance p1 p2)
  192.                (* 2 (sin ang))
  193.             )
  194.         cen (polar p1
  195.                    (+ (angle p1 p2) (- (/ pi 2) ang))
  196.                    rad
  197.             )
  198.   )
  199.   (list (* ang 2.0) rad cen)
  200. );; TAN Retourne la tangente de l'angle
  201. (defun tan (ang)
  202.   (/ (sin ang) (cos ang))
  203. );; SPL Calling function
  204. (defun c:spl (/ ss n pl)
  205.   (vl-load-com)
  206.   (or *acad* (setq *acad* (vlax-get-acad-object)))
  207.   (or *acdoc* (setq *acdoc* (vla-get-ActiveDocument *acad*)))
  208.   (princ
  209.     "\nSelect les polylines to be treated or <All>: "
  210.   )
  211.   (or
  212.     (setq ss (ssget '((0 . "LWPOLYLINE"))))
  213.     (setq ss (ssget "_X" '((0 . "LWPOLYLINE"))))
  214.   )
  215.   (if
  216.     ss
  217.      (progn
  218.        (vla-StartUndoMark *acdoc*)
  219.        (setq n -1)
  220.        (while (setq pl (ssname ss (setq n (1+ n))))
  221.          (purge-pline pl)
  222.        )
  223.        (princ (strcat "\n\t" (itoa n) " treated polyline(s)."))
  224.        (vla-EndUndoMark *acdoc*)
  225.      )
  226.      (princ "\nNone selected polyline.")
  227.   )
  228.   (princ)
  229. )
  230. (princ
  231.   "\nSimp-Pline loaded, type SPL to launch the function."
  232. )
  233. (princ)


论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 3916个

财富等级: 富可敌国

发表于 2017-5-11 16:53:13 | 显示全部楼层
回复一下、学习学习!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 774个

财富等级: 财运亨通

发表于 2017-5-11 22:59:55 | 显示全部楼层
谢谢楼主的分享!!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6881个

财富等级: 富甲天下

发表于 2017-5-12 08:38:43 | 显示全部楼层
可消除多段线上直段中的中间控制点
谢谢大师的分享
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 3191个

财富等级: 富可敌国

发表于 2017-5-12 09:01:32 | 显示全部楼层
好好学习天天向上,谢谢了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1336个

财富等级: 财源广进

发表于 2017-5-12 12:03:16 | 显示全部楼层
这个太好了!谢谢分享!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1336个

财富等级: 财源广进

发表于 2017-5-13 18:39:22 | 显示全部楼层
本帖最后由 434939575 于 2017-5-13 18:43 编辑

大师能修改为处理这种小折点不,距离只有0.几毫米,合并为一个点.如果不在转角处(接近共线)就删除这个点。谢谢!
QQ图片20170513183726.png
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-5-13 18:47:30 | 显示全部楼层

XDRX API 几行代码. 删除冗余点,动向段,删除极短段。
  1. (defun c:tt ()
  2.   (if (and
  3.         (setq e (car (xdrx_entsel "\n拾取多段线<退出>:" '((0 . "LWPOLYLINE")))))
  4.         (setq tol (getreal "\n输入距离容差<退出>:"))
  5.       )
  6.     (progn
  7.       (xdrx_begin)
  8.       (xdrx_document_setprec tol 1.0)
  9.       (xdrx_polyline_compress e)
  10.       (xdrx_end)
  11.     )
  12.   )
  13.   (princ)
  14. )


论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1336个

财富等级: 财源广进

发表于 2017-5-13 18:52:45 | 显示全部楼层

感谢老大,这么快!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2022-9-27 16:32:39 | 显示全部楼层
老大,你这是三点完全在直线上的,如果三点夹角在一定角度内的都去除呢,比如178度,该怎么改啊?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2022-10-6 08:58:14 | 显示全部楼层
学习学习!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-25 12:04 , Processed in 0.316113 second(s), 55 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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