明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 837|回复: 6

[函数] 多段线简化

[复制链接]
发表于 2024-10-14 12:26:55 | 显示全部楼层 |阅读模式
  1. ;---去除多段线点集里面共线的点
  2. (defun re-pts(en / pts pts1 pts2 pts3)
  3.   (setq pts(mapcar 'cdr(vl-remove-if-not '(lambda(x)(=(car x)10))(entget en))))
  4.   (if(vlax-curve-isClosed(vlax-ename->vla-object en))
  5.     (progn
  6.       (setq pts2(append(cdr pts)(list(car pts))))
  7.       (setq pts3(append(cdr pts2)(list(car pts2))))
  8.       (vl-remove nil(mapcar '(lambda(x1 x2 x3)(if(equal 0(chaji x1 x2 x3)0.01)nil x2))pts pts2 pts3))
  9.     )
  10.     (progn
  11.       (setq pts1(reverse(cdr(cdr(reverse pts)))))
  12.       (setq pts2(cdr(reverse(cdr(reverse pts)))))
  13.       (setq pts3(cdr(cdr pts)))
  14.       (append(list(car pts))(vl-remove nil(mapcar '(lambda(x1 x2 x3)(if(equal 0(chaji x1 x2 x3)0.01)nil x2))pts1 pts2 pts3))(list(last pts)))
  15.     )
  16.   )
  17. )
  18. ;---向量叉积,等于0代表共线
  19. (defun chaji(p0 p1 p2)
  20.   (-
  21.     (*(-(car p1)(car p0))(-(cadr p2)(cadr p0)))
  22.     (*(-(car p2)(car p0))(-(cadr p1)(cadr p0)))
  23.   )
  24. )



核心子函数如上,不支持含有圆弧的多段线。
如果加上圆弧,可能复杂一点,,,暂时没思路

本帖子中包含更多资源

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

x
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2024-10-24 10:58:36 | 显示全部楼层
放着OVerkill不用自己写代码?
回复 支持 1 反对 0

使用道具 举报

发表于 2024-10-14 16:18:49 | 显示全部楼层
这功能也不错的。
发表于 2024-10-15 19:09:13 | 显示全部楼层
本帖最后由 hubeiwdlue 于 2024-10-15 19:50 编辑

谢谢分享,学习了。我换个思路写一个。
  1. ;---向量叉积,等于0代表共线
  2. (defun chaji(p0 p1 p2)
  3.   (-
  4.     (*(-(car p1)(car p0))(-(cadr p2)(cadr p0)))
  5.     (*(-(car p2)(car p0))(-(cadr p1)(cadr p0)))
  6.   )
  7. )
  8. ;去除一个线段中间共线节点
  9. (defun rmp1(plst)
  10.   (while (and(> (length plst) 2) (equal 0 (chaji (car plst) (cadr plst) (caddr plst)) 0.001))
  11.     (setq plst (cons (car plst) (cddr plst)))
  12.   )
  13.   plst
  14. )
  15. ;院长的多段线函数
  16. (defun xyp-Entmake-lwPolyline (ptlst Close-tnil / a s1)  
  17.   (entmake (append (list '(0 . "LWPOLYLINE")
  18.                      '(100 . "AcDbEntity")
  19.                      '(100 . "AcDbPolyline")
  20.                      (cons 90 (length ptlst))
  21.                      (cons 70 (if Close-tnil 1 0))
  22.                      (cons 38
  23.                        (if (nth 2 (car ptlst))
  24.                          (nth 2 (car ptlst))
  25.                          0
  26.                        )
  27.                      )
  28.                    )
  29.              (mapcar '(lambda (a) (cons 10 a)) ptlst)
  30.            )
  31.   )
  32.   (entlast)
  33. )
  34. ;去除共线点
  35. (defun c:tt(/ )
  36.   (setq en (car(entsel)))
  37.   (setq p70 (cdr(assoc 70 (entget en))))
  38.   (setq plst(mapcar 'cdr(vl-remove-if-not '(lambda(x)(=(car x)10))(entget en))))
  39.   (setq plst1 nil)
  40.   (while (> (length plst) 0)
  41.     (setq plst (rmp1 plst))
  42.     (setq plst1 (cons (car plst) plst1))
  43.     (setq plst (cdr plst))
  44.   )
  45.   (setq plst1 (vl-remove nil (reverse plst1)))
  46.   (if (= p70 0)
  47.     (xyp-Entmake-lwPolyline plst1 nil)
  48.     (xyp-Entmake-lwPolyline plst1 t)
  49.   )
  50. )


发表于 2024-10-16 15:32:19 | 显示全部楼层
我服了,正好今天碰上这个需求,还说没什么思路,上来看看,随手一点就有现成的了..
发表于 2024-10-16 16:28:44 | 显示全部楼层
圆弧还有有必要搞一搞的
发表于 2024-10-24 09:02:17 | 显示全部楼层
感谢分享,学习一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-21 01:40 , Processed in 0.169928 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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