mokson 发表于 2019-11-18 15:06:19

大神,有什么工具快速减少多段线及填充图案线的多余的顶点?

大神们,有什么工具或插件,可以快速减少多段线或填充图案线的多余的顶点?
让它们显示起来更加简结?

如图所示:



andyhua 发表于 2019-11-22 08:46:06

其实我也想知道怎么可以快速的减少填充图案的夹点,现在是要一个个的把鼠标悬停到夹点上,去取消,影响速度。

前生 发表于 2019-11-18 17:34:32

(defun c:cxx (/ ss n pl)
(defun purge-pline (pl        /          regular-width              colinear
                      del-cadr        pour-carelst ;concentric
                      closed        old-p          old-b          old-sw    old-ew
                      new-d        new-p          new-b          new-sw    new-ew
                      b1        b2
                     )
    ;; Evaluates if the pline width is regular on 3 successive points
    (defun regular-width (p1 p2 p3 ws1 we1 ws2 we2 / delta)
      (or
        (= ws1 we1 ws2 we2)
        (and (= we1 ws2)
             (/= 0 (setq delta (- we2 ws1)))
             (equal (/ (- (vlax-curve-getDistAtPoint pl (trans p2 pl 0))
                          (vlax-curve-getDistAtPoint pl (trans p1 pl 0))
                     )
                     (- (vlax-curve-getDistAtPoint pl (trans p3 pl 0))
                          (vlax-curve-getDistAtPoint pl (trans p1 pl 0))
                     )
                  )
                  (/ (- we1 (- we2 delta)) delta)
                  1e-9
             )
        )
      )
    )

    ;; Evaluates if 3 successive vertices are aligned
    (defun colinear (p1 p2 p3 b1 b2)
      (and (zerop b1) (zerop b2) (null (inters p1 p2 p1 p3)))
    )
    ;; Removes the second item of the list
    (defun del-cadr (lst)
      (set lst (cons (car (eval lst)) (cddr (eval lst))))
    )
    ;; Pours the first item of a list to another one
    (defun pour-car (from to)
      (set to (cons (car (eval from)) (eval to)))
      (set from (cdr (eval from)))
    )
    (setq elst (entget pl))
    (and (= 1 (logand 1 (cdr (assoc 70 elst)))) (setq closed T))
    (mapcar (function
              (lambda (x)
                (cond ((= (car x) 10) (setq old-p (cons x old-p)))
                      ((= (car x) 40) (setq old-sw (cons x old-sw)))
                      ((= (car x) 41) (setq old-ew (cons x old-ew)))
                      ((= (car x) 42) (setq old-b (cons x old-b)))
                      (T (setq new-d (cons x new-d)))
                )
              )
          )
          elst
    )
    (mapcar (function (lambda (l) (set l (reverse (eval l)))))
          '(old-p old-sw old-ew old-b new-d)
    )
    (and closed (setq old-p (append old-p (list (car old-p)))))
    (and (equal (cdar old-p) (cdr (last old-p)) 1e-9)
       (setq closed T
             new-d(subst (cons 70 (Boole 7 (cdr (assoc 70 new-d)) 1))
                             (assoc 70 new-d)
                             new-d
                      )
       )
    )
    (while (cddr old-p)
      (if (regular-width
          (cdar old-p)
          (cdadr old-p)
          (cdaddr old-p)
          (cdar old-sw)
          (cdar old-ew)
          (cdadr old-sw)
          (cdadr old-ew)
          )
        (cond ((colinear (cdar old-p)
                       (cdadr old-p)
                       (cdaddr old-p)
                       (cdar old-b)
                       (cdadr old-b)
             )
             (mapcar 'del-cadr '(old-p old-sw old-ew old-b))
              )
              ((setq bu        (concentric
                          (cdar old-p)
                          (cdadr old-p)
                          (cdaddr old-p)
                          (cdar old-b)
                          (cdadr old-b)
                        )
             )
             (setq old-b (cons (cons 42 bu) (cddr old-b)))
             (mapcar 'del-cadr '(old-p old-sw old-ew))
              )
              (T
             (mapcar 'pour-car
                     '(old-p old-sw old-ew old-b)
                     '(new-p new-sw new-ew new-b)
             )
              )
        )
        (mapcar        'pour-car
                '(old-p old-sw old-ew old-b)
                '(new-p new-sw new-ew new-b)
        )
      )
    )
    (if        closed
      (setq new-p (reverse (cons (car old-p) new-p)))
      (setq new-p (append (reverse new-p) old-p))
    )
    (mapcar (function
              (lambda (new old)
                (set new (append (reverse (eval new)) (eval old)))
              )
          )
          '(new-sw new-ew new-b)
          '(old-sw old-ew old-b)
    )
    (if        (and closed
             (regular-width
             (cdr (last new-p))
             (cdar new-p)
             (cdadr new-p)
             (cdr (last new-sw))
             (cdr (last new-ew))
             (cdar new-sw)
             (cdar new-ew)
             )
        )
      (cond ((colinear (cdr (last new-p))
                     (cdar new-p)
                     (cdadr new-p)
                     (cdr (last new-b))
                     (cdar new-b)
             )
             (mapcar (function (lambda (l) (set l (cdr (eval l)))))
                     '(new-p new-sw new-ew new-b)
             )
          )
          ((setq bu (concentric
                        (cdr (last new-p))
                        (cdar new-p)
                        (cdadr new-p)
                        (cdr (last new-b))
                        (cdar new-b)
                      )
             )
             (setq new-b
                  (cdr (reverse (cons (cons 42 bu) (cdr (reverse new-b)))))
             )
             (mapcar (function (lambda (l) (set l (cdr (eval l)))))
                     '(new-p new-sw new-ew)
             )
          )
      )
    )
    (entmod
      (append new-d
              (apply 'append
                     (apply 'mapcar
                          (cons 'list (list new-p new-sw new-ew new-b))
                     )
              )
      )
    )
)
;; BulgeData Retourne les données d'un polyarc (angle rayon centre)
(defun BulgeData (bu p1 p2 / ang rad cen)
    (setq ang (* 2 (atan bu))
          rad (/ (distance p1 p2) (* 2 (sin ang)))
          cen (polar p1 (+ (angle p1 p2) (- (/ pi 2) ang)) rad)
    )
    (list (* ang 2.0) rad cen)
)
;; TAN Retourne la tangente de l'angle
(defun tan (ang) (/ (sin ang) (cos ang)))
;; Evaluates if 3 sucessive vertices have the same center
(defun concentric (p1 p2 p3 b1 b2 / bd1 bd2)
    (if        (and (/= 0.0 b1)
             (/= 0.0 b2)
             (equal (caddr (setq bd1 (BulgeData b1 p1 p2)))
                  (caddr (setq bd2 (BulgeData b2 p2 p3)))
                  1e-9
             )
        )
      (tan (/ (+ (car bd1) (car bd2)) 4.0))
    )
)
(vl-load-com)
(or *acad* (setq *acad* (vlax-get-acad-object)))
(or *acdoc* (setq *acdoc* (vla-get-ActiveDocument *acad*)))
(princ "\nSelect les polylines to be treated or <All>: ")
;;;(or (setq ss (ssget '((0 . "LWPOLYLINE"))))
;;;      (setq ss (ssget "_X" '((0 . "LWPOLYLINE"))))
;;;)
(setq ss (ssget (list (cons 0 "LWPOLYLINE"))))
(if ss
    (progn (vla-StartUndoMark *acdoc*)
           (setq n -1)
           (while (setq pl (ssname ss (setq n (1+ n))))
             (purge-pline pl)
           )
           (princ (strcat "\n\t" (itoa n) " treated polyline(s)."))
           (vla-EndUndoMark *acdoc*)
    )
    (princ "\n 没有选择到合适的Pline线.")
)
(princ)
)

mokson 发表于 2019-11-18 15:08:19

以前在本论坛上见过相关的方法,但找不到了。

cowboy110 发表于 2019-11-18 15:45:12

不知道这样是否可行

mokson 发表于 2019-11-18 17:33:08

楼上的大哥,你用的是什么命令,如何神奇?

mokson 发表于 2019-11-18 17:38:55

好感谢师兄分享的代码,晚上测试测试。
thk u.

ketxu 发表于 2019-11-18 18:13:40

Thanks for sharing ^^

wzxcad 发表于 2019-11-18 18:33:39

测试一下,学习了。

mokson 发表于 2019-11-18 20:29:23

本帖最后由 mokson 于 2019-11-20 07:54 编辑


感谢你们的帮助!

yoyoho 发表于 2019-11-19 08:06:23

谢谢! 前生 楼主分享程序!!!!!!!
页: [1] 2
查看完整版本: 大神,有什么工具快速减少多段线及填充图案线的多余的顶点?