找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 546|回复: 4

[已解决] 填充区域覆盖的线全部删除(已解决)

[复制链接]

已领礼包: 1个

财富等级: 恭喜发财

发表于 2020-12-1 13:52:30 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 numen1014 于 2020-12-23 09:17 编辑

QQ图片20201201135028.png 如图,填充区域覆盖了一些线,许多这样的图,能不能一次性把填充区域的边线(不是填充边线)及覆盖的线全部删除。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 40个

财富等级: 招财进宝

发表于 2020-12-1 17:20:38 | 显示全部楼层
求助最好发测试图,图里面拷贝两份,标注上前后的差异
从你这个图看,哪些是覆盖要删除的?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

 楼主| 发表于 2020-12-21 11:21:50 | 显示全部楼层
  1. (defun c:sccx(/ p1 p2 px sspline ssline i n px10 px11 plpts pts plptsn ssdelline)
  2.   ;↓获取相应特征值的点表 内部函数**********************************************************
  3. (defun massoc (lst key)
  4.   (vl-remove-if '(lambda (x) (/= key (car x))) lst)
  5. );↑获取点表内部函数*********************************************************

  6.   ;;;↓判断点是否在线段上******************************************************
  7. (defun nsk:IsPtOnLine (pt l1 l2 fz)
  8. (and
  9. (numberp fz)
  10. (equal (distance l1 l2) (+ (distance l1 pt) (distance l2 pt)) fz)
  11. )
  12. )
  13. ;;;↓判断点是否在线段上******************************************************
  14.   
  15. ;;;程序主体******************************************************************************************
  16. (setq sspline        (ssget '((0 . "*POLYLINE")))
  17.       ssline        (ssget '((0 . "line")))
  18.       i                0
  19.       ssdelline        (ssadd)
  20. )
  21. (while (< i (sslength sspline));;;①开始sspline循环
  22.   (setq        plpts  (massoc (entget (ssname sspline i)) 10);;;获得第i个多段线的顶点坐标(含标识码10)
  23.         plptsN 0  )
  24.   (repeat (length plpts)                         ;;;↓②开始第i根多段线顶点循环。;;;(1)每结束一次循环,【reverse】将上次第一个坐标放到点表plpts的最后,每次都是取得后续连个点,
  25.     (setq p1 (cdr (car plpts))                          ;;;(2)repeat的长度等于点数,是为了闭合多段线全部取到。(3)此处用【cdr】是为了去掉元素中的标识码 10。
  26.           p2 (cdr (cadr plpts))   )     

  27.     (setq n 0)       
  28.     (repeat (sslength ssline)                                            ;;;↓③开始判断line线repeat。
  29.       (setq px10 (cdr (assoc 10 (entget (ssname ssLine n))))
  30.             px11 (cdr (assoc 11 (entget (ssname ssLine n))))
  31.       )                                                                                  ;;;↓④开始第n根line线判断。
  32.       (if (and (nsk:IsPtOnLine px10 p1 p2 1.0) ;;判断直线端点是否在线上(含共点)
  33.                (nsk:IsPtOnLine px11 p1 p2 1.0) ;;判断直线另一端点是否在线上(含共点)
  34.           )
  35.         (ssadd (ssname ssline n) ssdelline)    ;;如共线加入选择集【ssdelline】。
  36.       )                                                                           ;;;↑④结束第n根line线判断。
  37.       (setq n (1+ n))
  38.    )                                                                   ;;;↑③结束判断line线repeat。
  39.     (setq plpts (reverse (cons (car plpts) (reverse (cdr plpts)))))      ;;;将多段线第一个顶点坐标移到最后。
  40.   )
  41.                                                  ;;;↑②结束第i根多段线顶点循环。
  42.   (setq i (1+ i))
  43. )
  44. ;;结束while循环。
  45. (print
  46.   (strcat "共删除线段" (rtos (sslength ssdelline)) "根")
  47. )
  48. (command "._erase" ssdelline "")
  49. (princ)
  50. )  ;;结束defun。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

 楼主| 发表于 2020-12-23 09:12:52 | 显示全部楼层
  1.  ;判断点是否在线段上:

  2.  ; 设点为Q,线段为P1P2 ,判断点Q在该线段上的依据是:( Q - P1 ) × ( P2 - P1 ) = 0 且 Q 在以 P1,P2为对角顶点的矩形内。前者保证Q点在直线P1P2上,后者是保证Q点不在线段P1P2的延长线或反向延长线上,对于这一步骤的判断可以用以下过程实现:

  3.  ; ON-SEGMENT(pi,pj,pk)
  4.  ; if min(xi,xj) <= xk <= max(xi,xj)
  5.   ;      and min(yi,yj) <= yk <= max(yi,yj)
  6.  ; then return true;
  7.  ; else return false;

  8.  ; 特别要注意的是,由于需要考虑水平线段和垂直线段两种特殊情况,min(xi,xj)<=xk<=max(xi,xj)和min(yi,yj)<=yk<=max(yi,yj)两个条件必须同时满足才能返回真值。
  9. (defun c:tt(/ p1 p2 px sspline ssline i n px10 px11 plpts pts plptsn ssdelline ssbkline ptlst ptmin ptmax angsub angsub2 el1 nlin)
  10. ;↓获取点表内部函数**********************************************************
  11. (defun massoc (lst key)
  12.   (vl-remove-if '(lambda (x) (/= key (car x))) lst)
  13. )
  14.   ;↑获取点表内部函数*********************************************************

  15.   ;;;↓判断点是否在线段上******************************************************
  16. (defun nsk:IsPtOnLine (px pt1 pt2 fz)
  17.   (and
  18.     (numberp fz)
  19.     (equal (distance pt1 pt2)
  20.            (+ (distance pt1 px) (distance pt2 px))
  21.            fz
  22.     )
  23.   )
  24. )

  25. ;;↓判断点是否与线共线。***************************************************************************
  26. ;;1  p1是否在p2 p3线上,返回0.0
  27.     ;;p1 is a point;p2 and p3 are points that form a line segment;;returns  1 is p1 is on one side;;
  28.                                                                          ;;-1 if on the other side
  29.                                                                          ;; 0 if on the line
  30.   (defun PT_side (p1 p2 p3 / a dx dx1 dy dy1)
  31.     (setq dx  (- (car p3) (car p2))
  32.           dy  (- (cadr p3) (cadr p2))
  33.           dx1 (- (car p1) (car p2))
  34.           dy1 (- (cadr p1) (cadr p2))
  35.     )                                        ;setq
  36.     (setq a (- (* dx dy1) (* dy dx1))
  37.           a (rtos a 2 6)
  38.           a (atof a)
  39.     )                                        ;setq
  40.     (if        (equal 0.0 a 0.5)
  41.       (setq a 0.0)
  42.     )                                        ;setq

  43.     (print "判定结果是:")
  44.     (print a)
  45.     a

  46.   )
  47.   ;;;↑判断点是否与线共线。**************************************************************************

  48. (defun 3pangle( p1 p2 px / p3-p1p2 p3-p2p1 YN);;;判断px是否与直线p1-p2共线。
  49.                (setq px-p1p2 (- (angle p1 px) (angle p1 p2 ))
  50.                      px-p2p1 (- (angle p2 px) (angle p2 p1)))
  51.                (if (or (equal 0.0 px-p1p2 0.1)  (equal 0.0 px-p2p1 0.1))
  52.                  (setq yn "Y")
  53.                  (setq yn "N")
  54.                  )
  55.                 yn
  56.   )

  57. ;;;程序主体******************************************************************************************
  58. (setq sspline (ssget  '((0 . "*POLYLINE")))
  59.         ssline (ssget '((0 . "line")))
  60.           i      0
  61.           ssdelline (ssadd)
  62.           ssbkline     0 )
  63. (setvar "cmdecho" 0)
  64.   
  65.    (while  (< i (sslength sspline))                     ;;;①开始sspline循环
  66.     (setq plpts (massoc (entget (ssname sspline i)) 10) ;;;获得第i个多段线的顶点坐标(含标识码10)
  67.             plptsN 0
  68.           )
  69.     (repeat (length plpts)                              ;;;↓②开始第i根多段线顶点循环。
  70.     (setq p1 (cdr (car plpts))                          ;;;(1)循环结束后,将第一个点的坐标放到表plpts的最后,每次都都是取得后续连个点,
  71.           p2 (cdr (cadr plpts))                        ;;;(2)repeat的长度等于点数,是为了闭合多段线全部取到。
  72.           p1 (reverse (cons 0.0 (reverse p1)))                                                 ;;;(3)此处用【cdr】是为了去掉元素中的标识码 10。
  73.           p2 (reverse (cons 0.0 (reverse p2)))
  74.           )
  75.     ; (print p1)(print p2)

  76.       (setq n 0) ;直线选择集起始值为0
  77.            (repeat (sslength ssLine)                    ;;;↓③开始判断line线repeat。
  78.              ;(print (strcat "第" (rtos n )"次循环"))
  79.            (setq px10  (cdr (assoc 10 (entget (ssname ssLine n))))
  80.                  px11  (cdr (assoc 11 (entget (ssname ssLine n))))            ; (mapcar '(lambda (pt)(list (car pt) (cadr pt))) 3dplist)
  81.                 )
  82.                 (setq ptlst (list px10 px11 p1 p2))
  83.              (if (or (equal "Y" (3pangle p1 p2 px10))(equal "Y" (3pangle p1 p2 px11)))                        ;;;↓④开始第n根line线判断。
  84.                (progn
  85.                    (if (and (nsk:IsPtOnLine px10 P1 P2 1.0) (nsk:IsPtOnLine px11 P1 P2 1.0))
  86.                      (ssadd (ssname ssline n) ssdelline)
  87.                
  88.                  (progn
  89.                    (if (or (nsk:IsPtOnLine px10 P1 P2 1.0) (nsk:IsPtOnLine px11 P1 P2 1.0))
  90.                       (progn
  91.                              
  92.                               (setq ptmin (list (apply 'min (mapcar 'car ptlst))(apply 'min (mapcar 'cadr ptlst)) '0.0))
  93.                               (setq ptmax (list (apply 'max (mapcar 'car ptlst))(apply 'max (mapcar 'cadr ptlst)) '0.0))
  94.                               (setq el1 (entget (ssname ssline n)))
  95.                              
  96.                            (cond
  97.                               ((and (equal ptmax p2 1) (equal ptmin px10 1)) (setq el1 (subst (cons 11 p1)(assoc 11 el1) el1)))
  98.                               ((and (equal ptmax p2 1) (equal ptmin px11 1)) (setq el1 (subst (cons 10 p1)(assoc 10 el1) el1)))
  99.                               ((and (equal ptmax p1 1) (equal ptmin px10 1)) (setq el1 (subst (cons 11 p2)(assoc 11 el1) el1)))
  100.                               ((and (equal ptmax p1 1) (equal ptmin px11 1)) (setq el1 (subst (cons 10 p2)(assoc 10 el1) el1)))
  101.                               ((and (equal ptmin p2 1) (equal ptmax px10 1)) (setq el1 (subst (cons 11 p1)(assoc 11 el1) el1)))
  102.                               ((and (equal ptmin p2 1) (equal ptmax px11 1)) (setq el1 (subst (cons 10 p1)(assoc 10 el1) el1)))
  103.                               ((and (equal ptmin p1 1) (equal ptmax px10 1)) (setq el1 (subst (cons 11 p2)(assoc 11 el1) el1)))
  104.                               ((and (equal ptmin p1 1) (equal ptmax px11 1)) (setq el1 (subst (cons 10 p2)(assoc 10 el1) el1)))
  105.                            )
  106.                           (entmod el1)
  107.                         (setq ssbkline (1+ ssbkline))
  108.                             )
  109.                        )
  110.                                )))
  111.                             ;(command "BREAK" (ssname ssline n)  p1 p2)
  112.                             ;(setq ssbkline (1+ ssbkline)))
  113.                   
  114.              );;;                                                                                   ↑④结束第n根line线判断。
  115.              (setq n (1+ n)) ;;;控制③repeat循环不能动。
  116.            )                                                    ;;;↑③结束判断line线repeat。
  117.       (setq plpts (reverse (cons (car plpts ) (reverse (cdr plpts)))))
  118.       )                                                                 ;;↑②结束第i根多段线顶点循环。
  119.       
  120.        (setq i (1+ i))
  121.      )  ;;结束while循环。
  122.         (if (/= 0 (sslength ssdelline))
  123.         (progn
  124.       (print (strcat "***共删除"(rtos (sslength ssdelline)) "根线。***")) (command "._erase" ssdelline ""))
  125.       (print (strcat "***共删除0根线***")))
  126.       (print (strcat "***共截断"(rtos ssbkline) "根线。***"))   
  127.       (setq ssdelline nil)
  128.       (setvar "cmdecho"   1)
  129.       (princ)
  130.      )  ;;结束defun。


  131. ;;;*******************************************************************************************************************



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

使用道具 举报

已领礼包: 1个

财富等级: 恭喜发财

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-11 00:00 , Processed in 0.322017 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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