明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1018|回复: 1

[函数] 求个多段线去无用点的函数,一直写不好

[复制链接]
发表于 2018-2-2 16:56 | 显示全部楼层 |阅读模式
20明经币
求个多段线去无用点的函数,多段线均为直线段,无弧段
要求如下:
1.端点中,共直线去掉中间点,重合的点去掉;
2.闭合的多段线中,起始点重合的,去掉一个点;
3.闭合线时,起始点可能和其它点共线,也要考虑

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2018-2-5 15:31 | 显示全部楼层
本帖最后由 hb198075 于 2018-2-5 15:38 编辑

以前有做过类似的程序,看看是否你想要的效果。先上图

  1. ;;;删除PL线上点程序 制作:HuangBang

  2. (VL-LOAD-COM)
  3. (defun c:dp1 (/ ss )
  4.     (if  (setq ss (dp-getfirst))
  5.       (dp-delPoint ss)
  6.       (progn
  7.   (if (cadr (ssgetfirst))
  8.     (command)
  9.   )
  10.   (prompt "\n请选择多段线")
  11.   (if (setq ss (ssget ":E:S" '((0 . "LWPOLYLINE"))))
  12.     (progn
  13.       (dp-delPoint ss)
  14.     )
  15.   )
  16.       )
  17.     )
  18.   (princ)
  19. )

  20. ;;;删除重复点程序
  21. (defun c:dpr1 (/ ss na n ent cnt n_close)
  22.   (setq cnt 0)
  23.     (if  (setq ss (ssget '((0 . "LWPOLYLINE"))))
  24.       (progn
  25.   (setq n 0)
  26.   (repeat  (sslength ss)
  27.     (setq  na  (ssname ss n)
  28.     ent (entget na)
  29.     n   (1+ n)
  30.     )
  31.     (setq cnt(+ cnt (DP-DELREP ent)))
  32.   )
  33.   (prompt (strcat "\n一共清除" (itoa cnt) "个重复点"))
  34.       )
  35.     )
  36.   (princ)
  37. )

  38. (defun dp-getfirst (/ slst ss na ent e0 rel)
  39.   (setq  slst (ssgetfirst)
  40.   ss   (cadr slst)
  41.   )
  42.   (if ss
  43.     (if  (= (sslength ss) 1)
  44.       (progn
  45.   (setq na  (ssname ss 0)
  46.         ent (entget na)
  47.         e0  (cdr (assoc 0 ent))
  48.   )
  49.   (if (wcmatch e0 "LWPOLYLINE")
  50.     (setq rel ss)
  51.   )
  52.       )
  53.     )
  54.   )
  55.   rel
  56. )


  57.   

  58. (defun dp-delPoint (ss / p0 p1 ent is unlst cnt)
  59.   (SSSETFIRST nil ss)
  60.   (setq m_setfirst t)
  61.   (setq ent (entget (ssname ss 0)))
  62.   (while (null is)
  63.     (initget "R U  ")
  64.     (setq p0 (getpoint "\n指定删除框的第一点[删除重复点(R)/放弃(U)]:"))
  65.     (cond
  66.       ((= (type p0) 'list)
  67.        (setq p1 (GETCORNER p0 "\n指定对角点:"))
  68.        (if p1
  69.    (setq unlst (cons ent unlst)
  70.          ent   (dp-delInRec ent (trans p0 1 0) (trans p1 1 0))
  71.          
  72.    )
  73.        )
  74.       )
  75.       ((= p0 "") (setq is t))
  76.       ((null p0) (setq is t))
  77.       ((= p0 "U")
  78.        (if unlst
  79.    (progn
  80.      (setq ent(car unlst))
  81.      (entmod (car unlst))
  82.      (setq unlst (cdr unlst))
  83.    )
  84.    (princ "无操作可以返回!")
  85.        )
  86.       )
  87.       ((= p0 "R")
  88.   (setq cnt (dp-delReP ent))
  89.   (prompt (strcat "\n清除" (itoa cnt) "个重复点"))
  90.   (setq is t)
  91.       )
  92.     )
  93.   )
  94.   (SSSETFIRST nil nil)
  95.   (setq m_setfirst nil)
  96. )

  97. ;;;判断点是否在矩形范围
  98. (defun dp-isInRec (pt p0 p1 / xx xy dx dy)
  99.   (setq  pt (trans pt 0 1)
  100.   p0 (trans p0 0 1)
  101.   p1 (trans p1 0 1)
  102.   )
  103.   (if (< (car p0) (car p1))
  104.     (setq xx (car p0)
  105.     dx (car p1)
  106.     )
  107.     (setq xx (car p1)
  108.     dx (car p0)
  109.     )
  110.   )
  111.   (if (< (cadr p0) (cadr p1))
  112.     (setq xy (cadr p0)
  113.     dy (cadr p1)
  114.     )
  115.     (setq xy (cadr p1)
  116.     dy (cadr p0)
  117.     )
  118.   )
  119.   (and (<= xx (car pt) dx)
  120.        (<= xy (cadr pt) dy)
  121.   )
  122. )

  123. ;;;删除矩形内的顶点
  124. (defun dp-delInRec (ent p0 p1 / itm plst)
  125.   (setq plst (HB_GETENTCOUNT ent 10))
  126.   (foreach itm plst
  127.     (if  (dp-isInRec itm p0 p1)
  128.       (setq ent (DP-DELPT ent itm nil))
  129.     )
  130.   )
  131.   (entmod ent)
  132. )

  133. ;;;判断顶点是否在直线上
  134. (defun dp-ptOnLine (pt p1 p2 /)
  135.   (equal (+ (DISTANCE pt p1) (DISTANCE pt p2))
  136.        (DISTANCE p1 p2)
  137.        (* dp_wc 0.00001);0.0000001
  138.       )
  139. ;;;      (equal (abs (- (DISTANCE pt p1) (DISTANCE pt p2)))
  140. ;;;       (DISTANCE p1 p2)
  141. ;;;       0.0000001
  142. ;;;      )
  143. )

  144. (defun dp-delClosed (ent plst is / rel len p1 p2 p0 )
  145.   (setq len (length plst))
  146.   (setq  p0 (nth 0 plst)
  147.   p1 (nth 1 plst)
  148.   )
  149.   (if is
  150.     (if (equal (nth 0 plst) (nth (1- len) plst))
  151.       (setq p2 (nth (- len 2) plst))
  152.       (setq p2 (nth (- len 1) plst))
  153.       )
  154.     (setq p2 (nth (- len 2) plst))
  155.   )
  156.   (if (DP-PTONLINE p0 p1 p2)
  157.     (setq rel  (DP-DELPT ent (nth 0 plst) "closed")
  158.     count  (1+ count)
  159.     )
  160.     (setq rel ent)
  161.   )
  162.   rel
  163. )

  164. ;;;删除重复的点
  165. (defun dp-delRep
  166.        (ent / plst len p0 p1 p2 count dpn isclose obj tmp cln n)
  167.   (setq  plst  (HB_GETENTCOUNT ent 10)
  168.   obj  (vlax-ename->vla-object (cdr (assoc -1 ent)))
  169.   isclose  (vla-get-closed obj)
  170.   len  (length plst)
  171.   dpn  0
  172.   )
  173.   (setq  n 1
  174.   count 0
  175.   )  
  176.   
  177.   ;;;循环删除同一直线上的顶点
  178.   (while (setq p2 (nth (1+ n) plst))
  179.     (setq p0 (nth (1- n) plst)
  180.     p1 (nth n plst)
  181.     )
  182.     (if  (dp-ptOnLine p1 p0 p2)
  183.       (setq ent    (dp-delPt ent p1 (- n dpn))
  184.       count (1+ count)
  185.       dpn    (1+ dpn)
  186.       )
  187.     )
  188.     (if (or (equal p0 p1)(equal p1 p2))
  189.       (setq n (1+ n))
  190.       )
  191.     (setq n (1+ n))
  192.   )
  193.   
  194.   ;;;检验是否为闭合多段线
  195.   (setq plst (HB_GETENTCOUNT ent 10)
  196.   len (length plst)
  197.   )
  198.   (if (= isclose :vlax-false)
  199.     (if  (equal (nth 0 plst) (nth (1- len) plst))
  200.       (progn
  201.   (if (null n_close)
  202.     (progn
  203.       (setq m_redraw (cdr (assoc -1 ent)))
  204.       (redraw m_redraw 3)
  205.       (initget "Yes No AYes ANo")
  206.       (setq tmp
  207.        (getkword
  208.          "\n该多段线首尾相连,但并未闭合,是否设置为闭合状态[Yes/No/AllYes(AY)/AllNo(AN)]<Yes>:"
  209.        )
  210.       )
  211.       (cond
  212.         ((null tmp) (setq tmp "Yes"))
  213.         ((= tmp "AYes") (setq n_close "YES"))
  214.         ((= tmp "ANo") (setq n_close "NO"))
  215.       )
  216.       (setq m_redraw nil)
  217.     )
  218.   )
  219.   (if (or  (= n_close "YES")
  220.     (= tmp "Yes")
  221.       )
  222.     (progn
  223.       (setq ent (DP-DELCLOSED ent plst nil)
  224.       cln t
  225.       )
  226.       (vla-put-closed obj :vlax-true)
  227.     )
  228.   )
  229.       )
  230.     )
  231.     (setq ent (DP-DELCLOSED ent plst t))
  232.   )
  233.   
  234.   (entmod ent)
  235.   (if cln
  236.     (vla-put-closed obj :vlax-true)
  237.   )
  238.   count
  239. )

  240. ;;;删点操作
  241. (defun dp-delPt  (ent pt cnt / itm isdel rel m len)
  242.   (setq m 0)
  243.   (setq len (length (HB_GETENTCOUNT ent 10)))
  244.   (foreach itm ent
  245.     (if  (= (car itm) 10)
  246.       (progn
  247.   (if (equal (cdr itm) pt)
  248.     (if cnt
  249.       (cond
  250.         ((= cnt m)
  251.          (setq isdel t)
  252.         )
  253.         ((= cnt "end")
  254.          (if (= m (- len 1))
  255.      (setq isdel t)
  256.      (setq rel   (cons itm rel)
  257.            isdel nil
  258.      )
  259.          )
  260.         )
  261.         ((= cnt "start")
  262.          (if (= m 0)
  263.      (setq isdel t)
  264.      (setq rel   (cons itm rel)
  265.            isdel nil
  266.      )
  267.          )
  268.         )
  269.         ((= cnt "closed")
  270.          (if (or (= m 0)
  271.            (= m (- len 1))
  272.        )
  273.      (setq isdel t)
  274.      (setq rel   (cons itm rel)
  275.            isdel nil
  276.      )
  277.          )
  278.         )
  279.         (t
  280.          (setq rel   (cons itm rel)
  281.          isdel nil
  282.          )
  283.         )
  284.       )
  285.       (setq isdel t)
  286.     )
  287.     (setq  rel   (cons itm rel)
  288.     isdel nil
  289.     )
  290.   )
  291.   (setq m (1+ m))
  292.       )
  293.       (if isdel
  294.   nil
  295.   (setq rel (cons itm rel))
  296.       )
  297.     )
  298.   )
  299.   (reverse rel)
  300. )

  301. (defun hb_getEntCount (ent ename / tmp n rel cns)
  302.   (foreach cns ent
  303.     (if  (= (car cns) ename)
  304.       (progn
  305.   (setq tmp (cdr cns))
  306.   (setq rel (cons tmp rel))
  307.       )
  308.     )
  309.   )
  310.   (reverse rel)
  311. )

  312. (princ "\n*****多段线顶点删除程序,制作hb198075,命令名:DP1,DPR1*****")


本帖子中包含更多资源

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

x
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 07:30 , Processed in 0.215041 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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