- 积分
- 28877
- 明经币
- 个
- 注册时间
- 2013-1-25
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
本帖最后由 尘缘一生 于 2024-11-16 06:39 编辑
有些问题,很重要,却没有完美解决办法,所以,对于真正设计者来说呢,总是个心病!甚至十年,几十年的都在记挂着,
总观众多的二开,甚至xyz ,画的图,也全是垃圾满篇,实体压落,这可能大家觉得没事,就该这样子,那是你对自己要求不高,或你根本就不知道,一套干净,标准的图纸是什么样的(实际上现实就不存在万分之一,哪之一就是我画的图),巧了的是我画图32年,对垃圾图纸是难以接收的,所以吗.....
不多说了,三领哪,对这个问题一直在留心,也一直在探讨,下面发布下最近研究点东西,友情提示:请不要说代码不能运行,哪当然不能,不全吗!
函数很明确,你难道不会自己替代?你的内裤呢?
- ;;列表中相距最远的两点表--(一级)------
- ;;(pmin pmax)
- (defun sl:furthestapart (lst)
- (car (sl-ptsmaxdist lst))
- )
- ;点集中最远,最近两点表之表----(一级)-----
- ;返回:(最远两点 最近两点) ((p1 p2) (p3 p4))
- (defun sl-ptsmaxdist (ptlst / pt n d plst maxd mind maxl minl)
- (if (or (= (length ptlst) 1)
- (and (= (length ptlst) 2) (= (distance (car ptlst) (cadr ptlst)) 0))
- )
- (setq maxl (list (car ptlst) (car ptlst)) minl maxl)
- (progn
- (setq minl (list (car ptlst) (cadr ptlst)) maxd 0 mind (apply 'distance minl))
- (while (setq pt (car ptlst) ptlst (cdr ptlst))
- (setq plst ptlst)
- (while plst
- (setq n (car plst) d (distance n pt))
- (cond
- ((< maxd d) (setq maxd d maxl (list n pt)))
- ((> mind d) (setq mind d minl (list n pt)))
- )
- (setq plst (cdr plst))
- )
- )
- )
- )
- (list maxl minl)
- )
- ;;删除超短,合并重叠,近邻平行的多段线(lwpolyline,polyline)之整理------(一级)--------
- ;;Modfy by SLdesign 尘缘一生 QQ:15290049
- (defun unduppl1 (s / j ent ent1 lst lis1 lis2 lstx lsty lstx1 lsty1 nm len0 n ss ss1 nam enam1 enam2 spt1 ept1 spt2 ept2 d1 d2 d3 d4 m ly cl lt lw sw)
- ;;判断a是否在 a1至a2两点连线上
- (defun slon_ent (a a1 a2)
- (equal (+ (distance a1 a) (distance a a2)) (distance a1 a2) 0.0001)
- )
- ;;--------------------
- (setq nm 0 len0 (sslength s))
- ;;删除长度小于 0.01的多段线
- (repeat (setq n (sslength s))
- (setq nam (ssname s (setq n (1- n))))
- (if (<= (vlax-curve-getdistatparam nam (vlax-curve-getendparam nam)) 0.01)
- (progn
- (ssdel nam s)
- (entdel nam)
- (setq nm (1+ nm))
- )
- )
- )
- ;删除完全重合------
- ;三领SLdesign 提示:此段程序可占时间
- (setq ss1 (ssadd))
- (setq n 0) ;初始化变量,设置i为1的原因是方便j取值
- (repeat (1- (sslength s)) ;外循环开始,循环次数为多段线个数减1
- (setq ent (entget (ssname s n))) ;得到DXF
- (setq lst (mapcar 'cdr (vl-remove-if '(lambda (x) (/= (car x) 10)) ent))) ;提取点表
- (setq lstx (mapcar 'car (vl-sort lst '(lambda (a b) (< (car a) (car b)))))) ;按照X坐标从小到大排序并提取X坐标组成表
- (setq lsty (mapcar 'cadr (vl-sort lst '(lambda (a b) (< (cadr a) (cadr b)))))) ;按照Y坐标从小到大排序并提取Y坐标组成表
- (setq n (1+ n))
- (setq j n) ;j的值为n
- (repeat (- (sslength s) n) ;内循坏开始,循坏次数为多段线个数减去i
- (setq nam (ssname s j))
- (setq ent1 (entget nam)) ;得到DXF
- (setq lis1 (mapcar 'cdr (vl-remove-if '(lambda (x) (/= (car x) 10)) ent1))) ;提取点表
- (setq lstx1 (mapcar 'car (vl-sort lis1 '(lambda (a b) (< (car a) (car b)))))) ;同样按照X坐标从小到大排序并提取X坐标组成表
- (setq lsty1 (mapcar 'cadr (vl-sort lis1 '(lambda (a b) (< (cadr a) (cadr b)))))) ;同样按照Y坐标从小到大排序并提取Y坐标组成表
- (if (and (equal lstx lstx1 1e-5) (equal lsty lsty1 1e-5)) ;对比两个X和两个Y的表看是否一致,一致就删除
- (progn (ssadd nam ss1) (setq nm (1+ nm)))
- )
- (setq j (1+ j))
- )
- )
- (setq s (ssdiff s ss1) n -1)
- (while (setq nam (ssname ss1 (setq n (1+ n))))
- (entdel nam)
- )
- ;;去除带凸度,不共线的----
- (setq ss (ssadd) n -1)
- (while (setq nam (ssname s (setq n (1+ n))))
- (if (and (not (checkarc nam)) (sl:pts-onLine (get-pl-pt nam)))
- (ssadd nam ss)
- )
- )
- ;合并连接重复,紧邻共线的 LWPOLYLINE,POLYLINE-----
- (setq n -1)
- (while (setq enam1 (ssname ss (setq n (1+ n))))
- (setq lis1 (get-pl-pt enam1))
- (setq lis1 (sl:furthestapart lis1) spt1 (car lis1) ept1 (last lis1))
- (if (setq s (ssget "CP"
- (list
- (polar spt1 (angle ept1 spt1) 4.5)
- (polar ept1 (- (angle spt1 ept1) pi4) 4.5)
- (polar ept1 (+ (angle spt1 ept1) pi4) 4.5)
- )
- '((0 . "LWPOLYLINE,POLYLINE"))
- )
- )
- (progn
- (if (ssmemb enam1 s) (ssdel enam1 s)) ;;次选择集先删除主线
- (if (> (sslength s) 0) ;确保ss存在实体
- (progn
- (setq ss1 (ssadd))
- (repeat (setq j (sslength s))
- (setq nam (ssname s (setq j (1- j))))
- (if (ssmemb nam ss) ;如果在主选择集内处理,所以确ss1里,只有不带凸度,共线的直段线
- (ssadd nam ss1)
- )
- ) ;以上确保次集 ss1 正确
- (setq m -1)
- (if (> (sslength ss1) 0) ;如果ss1还存在实体
- (while (setq enam2 (ssname ss1 (setq m (1+ m)))) ;while 2
- (setq lis2 (get-pl-pt enam2))
- (setq lis2 (sl:furthestapart lis2) spt2 (car lis2) ept2 (last lis2) d1 (distance spt1 spt2)
- d2 (distance spt1 ept2) d3 (distance ept1 spt2) d4 (distance ept1 ept2) sw nil
- )
- (cond
- ((and (slon_ent spt2 spt1 ept1) (slon_ent ept2 spt1 ept1)) ;;次线落在主线上
- (entdel enam2)
- (setq nm (1+ nm))
- )
- ((and (slon_ent spt1 spt2 ept2) (slon_ent ept1 spt2 ept2)) ;;主线落在次线上
- (entdel enam1)
- (setq enam1 enam2 spt1 spt2 ept1 ept2);次线转主线
- (setq nm (1+ nm))
- )
- )
- (if (sl:pts-onLine (list spt1 ept1 spt2 ept2)) ;两线共线
- (cond
- ((slon_ent spt2 spt1 ept1) ;次线起点落在主线时
- (setq sw t) ;也就是给个开关罢了
- )
- ((slon_ent ept2 spt1 ept1) ;次线终点落在主线时
- (setq sw t)
- )
- ((< (min d1 d2 d3 d4) 0.03) ;离开的两线,但两线之间最短距离小于0.03!
- (setq sw t)
- )
- )
- ;不共线的平行但离得很近的线也合并为一
- (if (and ;(not (sl-Curveinters enam1 enam2 3)) ;无有交点,平行方法一
- (equal (angle-sharp (angle spt1 ept1)) (angle-sharp (angle spt2 ept2)) 0.01);角度判断的平行方法二
- (< (min d1 d2 d3 d4) 0.01) ;两线之间最短距离小于0.01!
- )
- (setq sw t)
- )
- )
- (if sw
- (progn
- (setq lst (sl:furthestapart (list spt1 ept1 spt2 ept2)))
- (setq spt1 (car lst) ept1 (last lst)) ;下次扩展延伸->go
- (setq ly (dxf1 enam2 8) cl (sl-getcolor enam2) lw (linwind enam2) lt (sl-linetype enam2))
- (entdel enam1)
- (entdel enam2)
- (slch:lwpolyline (list spt1 ept1) nil lw ly cl nil)
- (sl:chnam-lintp (entlast) lt)
- (setq enam1 (entlast))
- (setq nm (1+ nm))
- )
- )
- );end while 2
- );if
- )
- )
- )
- ) ;if
- );end while
- (prompt (strcat " 处理" (itoa len0) "个*POLYLINE 消去" (itoa nm) "个"))
- (princ)
- )
- ;;测试---------
- (defun c:tt (/ ss)
- (if (setq ss (ssget '((0 . "LWPOLYLINE,POLYLINE"))))
- (unduppl1 ss)
- )
- )
SLdesign 三领设计 V3.0 永久测试下载地址:
通过百度网盘分享的文件:三领设计
链接:https://pan.baidu.com/s/1c-bZXuiCUXsCQyghmhaB3Q
提取码:7t06
垃圾问题之其他:
1:重叠的圆
2:重叠的文字
3:重叠的块
4:超短的线类
........
本坛广有程式存在-->可淘之
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?注册
x
|