明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 5291|回复: 13

网上收集来的重线删除程序望改进

[复制链接]
发表于 2013-6-17 18:46:40 | 显示全部楼层 |阅读模式
本帖最后由 hehoubin 于 2013-6-17 18:49 编辑

;希望整合成对话对话框的多功能版,并支持,块,弧,直线,多段线,圆,还有除块以外能转换成多段线。
  1. ;;修正了一个错误。
  2. ;;这个更快,可以连接线条。
  3. ;;消除合并重复线条
  4. (defun c:ovl (/ old_osmode old_cmdecho ss ssLine ssArc)
  5.   (vl-load-com)
  6.   (setq *AcadDocument* (vla-get-activeDocument (vlax-Get-Acad-Object)))
  7.   (vla-StartUndoMark *AcadDocument*)
  8.   (setq old_osmode  (getvar "osmode")
  9. old_cmdecho (getvar "cmdecho")
  10.   )
  11. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  12.   (setq ss     (GetSelToUnite)
  13. ssLine (car ss)
  14. ssArc  (cadr ss)
  15.   )
  16.   (setvar "osmode" 0)
  17.   (command ".ucs" "w")

  18.   (if (> (sslength ssLine) 1)
  19.     (UniteLine ssLine)
  20.   )
  21.   (if (> (sslength ssArc) 1)
  22.     (UniteArc ssArc)
  23.   )
  24. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  25.   (if (> (sslength ssLine) 0)
  26.     (pEdit ssLine)
  27.   )
  28.   (if (> (sslength ssArc) 0)
  29.     (pEdit ssArc)
  30.   )
  31. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  32.   (setvar "osmode" old_osmode)
  33.   (setvar "cmdecho" old_cmdecho)
  34.   (vla-EndUndoMark *AcadDocument*)
  35.   (prin1)
  36. )
  37. (defun pedit (ss / i en vn startPt endPt ss1 ss2)
  38.   (setq i 0)
  39.   (repeat (sslength ss)
  40.     (setq en (ssname ss i)
  41.    i  (1+ i)
  42.     )
  43.     (if (and (not (null (entget en))) (not (vlax-curve-isClosed (setq vn (vlax-ename->vla-object en)))))
  44.       (progn
  45. (setq startPt (vlax-curve-GetStartPoint vn)
  46.        endPt   (vlax-curve-GetEndPoint vn)
  47. )
  48. (setq ss1 (ssget "_c" (polar startPt (* pi 0.25) 0.01) (polar startPt (* pi 1.25) 0.01)))
  49. (setq ss2 (ssget "_c" (polar endPt (* pi 0.25) 0.01) (polar endPt (* pi 1.25) 0.01)))
  50. (if (equal (strcase (vla-Get-ObjectName vn)) (strcase "AcDbPolyline"))
  51.    (vl-cmdf "pedit" en "j" ss1 ss2 "")
  52.    (vl-cmdf "pedit" en "y" "j" ss1 ss2 "" "")
  53. )
  54.       )
  55.     )
  56.   )
  57. )
  58. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  59. (defun GetSelToUnite (/ ss1 ssArc ssLine ss1 ss i en ss2)
  60.   (setq ss1    (ssget "x")
  61. ssArc  (ssadd)
  62. ssLine (ssadd)
  63. ss     (ssget '((0 . "line,lwpolyline,arc")))
  64. i      -1
  65.   )
  66.   (setvar "cmdecho" 0)
  67.   (repeat (sslength ss)
  68.     (setq en (ssname ss (setq i (1+ i))))
  69.     (if (equal (strcase (cdr (assoc 0 (entget en)))) (strcase "lwpolyline"))
  70.       (command "explode" en)
  71.     )
  72.   )
  73.   (setq ss2 (ssget "x")
  74. i   -1
  75.   )
  76.   (repeat (sslength ss2)
  77.     (setq en (ssname ss2 (setq i (1+ i))))
  78.     (if (or (not (ssmemb en ss1)) (ssmemb en ss))
  79.       (cond ((equal (cdr (assoc 0 (entget en))) (strcase "line")) (ssadd en ssLine))
  80.      ((equal (cdr (assoc 0 (entget en))) (strcase "arc")) (ssadd en ssArc))
  81.      (t (princ "\n There is a error occured"))
  82.       )
  83.     )
  84.   )
  85.   (list ssLine ssArc)
  86. )
  87. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  88. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  89. (defun UniteArc (ss / i en)
  90.   (vla-StartUndoMark *AcadDocument*)
  91. ;;;  (while (not (setq ss (ssget '((0 . "arc"))))))
  92.   (setq i 0)
  93.   (repeat (sslength ss)
  94.     (setq en (ssname ss i)
  95.    i  (1+ i)
  96.     )
  97.     (if (not (null (entget en)))
  98.       (JoinArc en)
  99.     )
  100.   )
  101.   (vla-EndUndoMark *AcadDocument*)
  102. )
  103. ;;;;;;;;;
  104. (defun JoinArc (en / vn cenPt Radius AngLst i ss MinPt MaxPt StartAngle EndAngle em vm)
  105.   (setq vn     (vlax-ename->vla-object en)
  106. cenPt  (cdr (assoc 10 (entget en)))
  107. Radius (vla-get-radius vn)
  108. AngLst '()
  109. i      -1
  110. ss     (ssadd)
  111.   )
  112.   (vla-GetBoundingBox vn 'MinPt 'MaxPt)
  113.   (setq MinPt (vlax-safearray->list MinPt)
  114. MaxPt (vlax-safearray->list MaxPt)
  115.   )
  116.   (setq ss (ssget "c" MinPt MaxPt (list '(0 . "arc") (append (list 10) cenPt) (cons 40 Radius)))
  117. ss (ssdel en ss)
  118.   )
  119.   (if ss
  120.     (progn
  121.       (setq StartAngle (vla-Get-StartAngle vn)
  122.      EndAngle   (vla-Get-EndAngle vn)
  123.       )
  124.       (if (< EndAngle StartAngle)
  125. (setq EndAngle (+ EndAngle (* pi 2.0)))
  126.       )
  127.       (setq AngLst (append AngLst (list StartAngle) (list EndAngle)))
  128.       (repeat (sslength ss)
  129. (setq em  (ssname ss (setq i (1+ i)))
  130.        vm  (vlax-ename->vla-object em)
  131.        StartAngle (vla-Get-StartAngle vm)
  132.        EndAngle  (vla-Get-EndAngle vm)
  133. )
  134. (if (< EndAngle StartAngle)
  135.    (setq EndAngle (+ EndAngle (* pi 2.0)))
  136. )
  137. (setq AngLst (append AngLst (list StartAngle) (list EndAngle)))
  138.       )
  139.       (setq AngLst (vl-sort AngLst '<))
  140.       (vl-cmdf "erase" ss "")
  141.       (vla-put-StartAngle vn (car AngLst))
  142.       (vla-put-EndAngle
  143. vn
  144. (if (> (last AngLst) (* pi 2))
  145.    (- (last AngLst) (* pi 2))
  146.    (last AngLst)
  147. )
  148.       )
  149.     )
  150.   )
  151. )
  152. ;;;;;;;;;(setq aa (vlax-ename->vla-object (car (entsel))))
  153. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  154. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  155. (defun UniteLine (ss / i en)
  156.   (vla-StartUndoMark *AcadDocument*)
  157. ;;;  (while (not (setq ss (ssget '((0 . "line"))))))
  158.   (setq i 0)
  159.   (repeat (sslength ss)
  160.     (setq en (ssname ss i)
  161.    i  (1+ i)
  162.     )
  163.     (if (not (null (entget en)))
  164.       (JoinLine en)
  165.     )
  166.   )
  167.   (vla-EndUndoMark *AcadDocument*)
  168.   (prin1)
  169. )
  170. (defun JoinLine (en / i lst_pt ang_en se ss em ang_em ssErase)
  171.   (setq i      0
  172. lst_pt '()
  173. ang_en (RetAng (angle (cdr (assoc 10 (entget en))) (cdr (assoc 11 (entget en)))))
  174. ;;; lst_pt (append lst_pt (list (cdr (assoc 10 (entget en)))) (list (cdr (assoc 11 (entget en)))))
  175.   )
  176.   (setq lst_pt (car (setq tmp (GetPtLst en)))
  177. ssErase (cadr tmp)
  178.   )
  179.   (if (> (length lst_pt) 2)
  180.     (progn
  181.       (cond ((or (equal ang_en 0.0 0.001) (equal ang_en 180.0 0.001))
  182.       (setq lst_pt (vl-sort lst_pt '(lambda (e1 e2) (< (car e1) (car e2)))))
  183.      )
  184.      (t
  185.       (setq lst_pt (vl-sort lst_pt '(lambda (e1 e2) (< (cadr e1) (cadr e2)))))
  186.      )
  187.       )
  188.       (vla-put-startPoint (vlax-ename->vla-object en) (vlax-3d-point (car lst_pt)))
  189.       (vla-put-endPoint (vlax-ename->vla-object en) (vlax-3d-point (last lst_pt)))
  190.       (vl-cmdf "erase" ssErase "")
  191.     )
  192.   )
  193. )
  194. ;;;;;;;;;;;
  195. (defun GetPtLst (en / en_10 en_11 ang_en ptLst ss i em em_10 em_11 ang_em ang_10 ang_11)
  196.   (setq en_10 (cdr (assoc 10 (entget en)))
  197. en_11 (cdr (assoc 11 (entget en)))
  198. ang_en (RetAng (angle en_10 en_11))
  199. ptLst (list en_10 en_11)
  200. ssErase (ssadd)
  201.   )
  202.   (setq ss (ssget "c" en_10 en_11 '((0 . "line"))))
  203.   (if (> (sslength ss) 1)
  204.     (progn
  205.       (setq i -1)
  206.       (ssdel en ss)
  207.       (repeat (sslength ss)
  208. (setq em     (ssname ss (setq i (1+ i)))
  209.        em_10  (cdr (assoc 10 (entget em)))
  210.        em_11  (cdr (assoc 11 (entget em)))
  211.        ang_em (RetAng (angle em_10 em_11))
  212.        ang_10 (RetAng (angle en_10 em_10))
  213.        ang_11 (RetAng (angle en_10 em_11))
  214. )
  215. (if (and (equal ang_en ang_em 0.001) (or (equal ang_en ang_10 0.001) (equal ang_en ang_11 0.001)))
  216.    (setq ptLst (append ptLst (list em_10) (list em_11))
  217.   ssErase (ssadd em ssErase)
  218.    )
  219. )
  220.       )
  221.     )
  222.   )
  223.   (list ptLst ssErase)
  224. )
  225. ;;;;;;;;;;;
  226. (defun RetAng (ang)
  227.   (if (>= ang (- pi 0.0001))
  228.     (atof (angtos (- ang pi) 0 4))
  229.     (atof (angtos ang 0 4))
  230.   )
  231. )

评分

参与人数 1明经币 +1 收起 理由
spp_wall + 1 很给力!

查看全部评分

本帖被以下淘专辑推荐:

发表于 2018-4-2 10:50:06 | 显示全部楼层
express tools 里面不是有overkill命令么,这个和overkill的区别是?
发表于 2019-5-2 22:37:25 | 显示全部楼层
好东西,谢谢楼主
发表于 2018-2-25 16:56:25 | 显示全部楼层
可以用,研究一下
发表于 2013-6-21 12:43:53 | 显示全部楼层
高手请出手,这个功能还是很实用的。
发表于 2013-11-21 20:30:45 | 显示全部楼层
这个非常好用!比那些故作高深发带一大堆自己函数的所谓源码的高手好多了,谢谢了!
发表于 2013-12-21 19:29:25 | 显示全部楼层
这个程序好!!!
发表于 2014-2-10 22:12:15 | 显示全部楼层
这个正好需要
发表于 2014-11-16 22:00:38 | 显示全部楼层
这个最大的遗憾就是,分解了多段线,丢失了宽度!!!!!
发表于 2015-8-24 10:22:55 | 显示全部楼层
新人学习中
发表于 2015-9-20 16:34:27 | 显示全部楼层
不错,谢谢,很好用
发表于 2015-9-30 11:12:34 | 显示全部楼层

不错,谢谢,很好用
发表于 2018-2-9 16:51:49 | 显示全部楼层
多谢楼主,正好用!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-25 03:27 , Processed in 0.202538 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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