明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 17466|回复: 25

[源码] 删除图形上多余节点(同一直线上的多余节点及重复的节点)

  [复制链接]
发表于 2013-12-17 21:53:03 | 显示全部楼层 |阅读模式
多谢多位论坛高手的指导,慢慢才把这个功能给磨出来。小弟是个初学者,可能写的不够简洁,希望大家给点意见,看看可不可以简化。
代码中有参考greatlmy 楼主,在http://bbs.mjtd.com/forum.php?mo ... &fromuid=202795发的表处理函数。先说声谢谢了。
  1. (defun c:sd(/ om ss l_length i j n mm z data new_list last_list m_list en en_data old_pt_num f_list b_list pt1 pt2 pt_1 pt_2 pt_3
  2.               pt_num ang1 ang2 ang_d new_en_data new_pt_num)
  3.   (SETVAR "CMDECHO" 0)
  4.   (setq om (getvar "osmode"))                            ;取得对象捕捉的位码
  5.   (setvar "osmode" 0)                                    ;关掉对象捕捉
  6.   (setq ss (ssget  '((0 . "LWPOLYLINE"))));选择多个对象
  7.   (setq l_length 0)
  8.   (repeat (sslength ss)
  9.     (setq i 0
  10.           j 0
  11.           n 0
  12.           z 0
  13.           mm 0
  14.           data (list '(0 0))
  15.           new_list (list '(0 0))
  16.           last_list (list '(0 0))
  17.           m_list (list '(0 0))
  18.     )
  19.     (setq en (ssname ss l_length));获取第“l_length”个对象的对象名
  20.     (setq en_data (entget en));获取对象列表
  21.     (setq old_pt_num (assoc 90 en_data))
  22.   (if (> (cdr old_pt_num) 2)
  23.    (progn
  24.    
  25.     (setq b_list (list(car (reverse en_data))));获取对象数据中最后一个列表数据(群码 210)
  26.    
  27.     ;;;获取新的列表格式为每个节点坐标及40、41、42群码为一个列表,与其他节点的列表合为一个列表
  28.     (while (/= (nth j en_data) nil)
  29.       (if (=(car(nth j en_data)) 10)
  30.         (progn
  31.          (setq data (append (list(list (nth j en_data) (nth (+ j 1) en_data) (nth (+ j 2) en_data) (nth (+ j 3) en_data))) data))
  32.          (setq z (+ z 1))
  33.          (if (= z 1)
  34.            (setq f_list (carnth j en_data));获取对象数据中第一个节点坐标前的列表数据
  35.          );end if
  36.         );end progn
  37.       );end if
  38.       (setq j (+ j 1))
  39.      );end while
  40.     (setq data (cdr(reverse data)))
  41.    
  42.    ;;;判断两点是否相同,是则将相同点的列表删除
  43.     (while (/= (nth i data) nil)
  44.       (setq pt1  (cdr (car (nth i data))))
  45.       (if (/= (nth (+ i 1) data) nil)
  46.          (setq pt2  (cdr (car (nth (+ i 1) data))))
  47.          (setq pt2  (cdr (car (nth 0 data))))      
  48.        );end if
  49.       (if (or (>= (distance pt1 pt2) 0.0001) (/= (cdr (car (reverse (nth i data )))) 0 ))
  50.         (setq new_list (append (list (nth i data )) new_list))
  51.        );end if
  52.       (setq i (+ i 1))
  53.     );end while
  54.     (setq new_list (cdr(reverse new_list)))
  55.    
  56.     ;;;删除同一条线上的点
  57.     (while (/= (nth n new_list) nil)
  58.       (setq pt_1 (cdr (car (nth n new_list))))
  59.       (if (/= (nth (+ n 1) new_list) nil)
  60.         (setq pt_2 (cdr (car (nth (+ n 1) new_list))))
  61.         (setq pt_2 (cdr (car (nth 0 new_list))))
  62.       );end if
  63.       (if (/= (nth (+ n 2) new_list) nil)
  64.         (setq pt_3 (cdr (car (nth (+ n 2) new_list))))
  65.         (if (/= (nth (+ n 1) new_list) nil)
  66.           (setq pt_3 (cdr (car (nth 0 new_list))))
  67.           (setq pt_3 (cdr (car (nth 1 new_list))))
  68.         );end if
  69.       );end if
  70.       (setq ang1 (angle pt_2 pt_1))
  71.       (setq ang2 (angle pt_2 pt_3))
  72.       (setq ang_d (- ang2 ang1))
  73.       (if (and (>= (abs ang_d) 0.001) (>= (abs (- (abs ang_d) pi)) 0.001))
  74.         (if (/= (nth (+ n 1) new_list) nil)
  75.          (setq last_list (append (list (nth (+ n 1) new_list)) last_list))
  76.          (setq last_list (append (list (nth 0 new_list)) last_list))
  77.         );end if  
  78.       );end if
  79.       (setq n (+ n 1))
  80.     );end while
  81.     (setq last_list (cdr(reverse last_list)))
  82.     (setq last_list (append (list(car (reverse last_list))) (reverse (cdr (reverse last_list)))));获得最终节点列表
  83.     (setq pt_num (length last_list));获取最后节点坐标的个数
  84.    
  85.     ;;;将各节点与40、41、42合成的列表分开并与其他节点列表合为统一个列表,格式为对象数据的列表格式
  86.     (while (/= (nth mm last_list) nil)
  87.       (setq nn 0)
  88.       (while (/= (nth nn (nth mm last_list)) nil)
  89.         (setq m_list (append (list(nth nn (nth mm last_list))) m_list))
  90.         (setq nn (+ nn 1))
  91.       );end while
  92.         (setq mm (+ mm 1))
  93.      );end while
  94.     (setq m_list (cdr(reverse m_list)))
  95.    
  96.     ;;;对象更新
  97.     (setq new_en_data (append f_list m_list b_list))
  98.     (setq new_pt_num (cons 90 pt_num))
  99.     (setq new_en_data (subst new_pt_num old_pt_num new_en_data))
  100.     (entmod new_en_data)
  101.     (setq l_length (+ l_length 1))
  102.    );end progn
  103.   );end if  
  104. );end repeat
  105.    (setvar "osmode" om)
  106.    (alert "多余节点删除完毕!")
  107. )

  108. (defun carnth (m l)                        
  109. ; 表取头,保留表L前面I-1个元素,函数返回新表  
  110. (if (= m (length l))
  111.   l   
  112. (progn
  113.       (setq l (reverse l)
  114.             m (- (length l) m 1)
  115.             l (cdrnth m l)
  116.       )
  117.      (reverse l)
  118.     )
  119.   )
  120. )
  121. (defun cdrnth (m l)
  122. ; 表取尾,去除表L后面I个元素,函数返回新表
  123.         (repeat (1+ m) (setq l (cdr l)))
  124. )

评分

参与人数 1明经币 +1 金钱 +20 收起 理由
ZIZZ + 1 + 20 很给力!

查看全部评分

发表于 2018-6-13 16:39:56 | 显示全部楼层
这功能好,经常软件生成的剪力墙是一段段的,连成线后又是很多多余的节点,这个刚好适用,谢谢分享
发表于 2021-7-6 20:22:33 | 显示全部楼层
很给力,只是运行是捕捉会自动关调,能不能在调试下
发表于 2018-1-31 12:28:29 | 显示全部楼层
如果是一条直线的多义线,就删除图形了,出错了
发表于 2013-12-18 08:23:43 | 显示全部楼层
能上个图更好
发表于 2013-12-18 08:47:36 | 显示全部楼层
试试看看!!!
发表于 2013-12-18 09:20:15 | 显示全部楼层
能不能改成缓和曲线的多余节点
发表于 2013-12-19 10:02:03 | 显示全部楼层
顶你了楼主,非常好用,只是感觉"多余节点删除完毕"这个提示能否只在命令行显示即可,那样就更好了
 楼主| 发表于 2013-12-19 13:20:10 | 显示全部楼层
lingduwx 发表于 2013-12-19 10:02
顶你了楼主,非常好用,只是感觉"多余节点删除完毕"这个提示能否只在命令行显示即可,那样就更好了

你可以自行将后面那句:(alert "多余节点删除完毕!")删除,换成princ格式的提示就行了。看个人习惯了

发表于 2013-12-19 14:43:04 | 显示全部楼层
不错,顶了!
发表于 2013-12-19 16:27:20 | 显示全部楼层
我来看MM的 发表于 2013-12-19 13:20
你可以自行将后面那句:(alert "多余节点删除完毕!")删除,换成princ格式的提示就行了。看个人习惯了

...

谢谢,搞定了
发表于 2014-4-15 21:55:46 | 显示全部楼层
这个很好用。感谢。但对于对于单段有多余点PLINE线没处理结果删除线了。
发表于 2014-4-16 07:24:54 | 显示全部楼层
當他是練習吧
直接用overkill就可以了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-12-23 21:49 , Processed in 0.198229 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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