找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1595|回复: 5

[每日一码] 发个函数,计算pllst中pline与pl0的重叠长度之和

[复制链接]

已领礼包: 2个

财富等级: 恭喜发财

发表于 2013-8-22 15:58:57 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 张和平 于 2013-8-22 16:00 编辑
  1. (defun c:tttt( / pl0 pl i pllst overlen)
  2.   (princ "\n>>> 选择主线")
  3.   (setq pl0 (ssname (ssget '((0 . "*POLYLINE"))) 0))
  4.   (princ (cdr (assoc 0 (entget pl0))))
  5.   (princ "\n>>> 选择副线")
  6.   (setq pl (ssget '((0 . "*POLYLINE"))) i 0)
  7.   (repeat (sslength pl)
  8.     (setq pllst (cons (ssname pl i) pllst) i (1+ i))
  9.   )
  10.   (setq overlen (PEACE:PL_OverLen pl0 pllst 10))
  11.   (princ overlen)
  12.   (princ)
  13. )


  14. ;;;计算pllst中pline与pl0的重叠长度之和  by peace 2013/08/20
  15. ;;;pl0=主线图元名 pllst=副线图元名列表 maxd=最大距离,间距小于maxd即认为重合
  16. ;;;遇相同图元,自动排除
  17. (defun PEACE:PL_OverLen(pl0 pllst maxd / i j pl0obj ptlst pa pb pc overlen)
  18.   (vl-load-com)
  19.   (if (< maxd 0) (setq maxd 0))
  20.   (cond
  21.     (  ;若pl0不为pline,返回nil
  22.       (and
  23.         (/= (cdr (assoc 0 (entget pl0))) "POLYLINE")
  24.         (/= (cdr (assoc 0 (entget pl0))) "LWPOLYLINE")
  25.       )
  26.       nil
  27.     )
  28.     (
  29.       t
  30.       (setq i 0 pl0obj (vlax-ename->vla-object pl0) overlen 0)
  31.       (repeat (length pllst)
  32.         (if (not (equal pl0 (nth i pllst)))
  33.           (progn
  34.             (setq ptlst (PEACE:Assoc_ItemList 10 (entget (nth i pllst)))
  35.                       j 0
  36.             )
  37.             (repeat (1- (length ptlst))
  38.               (setq pa (nth j ptlst)
  39.                     pc (nth (1+ j) ptlst)
  40.                     pb (mapcar '(lambda(a b) (* 0.5 (+ a b))) pa pc)
  41.               )
  42.               (if (and
  43.                     (< (distance pa (vlax-curve-getClosestPointTo pl0obj pa)) maxd)
  44.                     (< (distance pb (vlax-curve-getClosestPointTo pl0obj pb)) maxd)
  45.                     (< (distance pc (vlax-curve-getClosestPointTo pl0obj pc)) maxd)  
  46.                   )
  47.                   (setq overlen (+ overlen (distance pa pc)))
  48.               )
  49.               (setq j (1+ j))
  50.             )
  51.           )
  52.         )
  53.         (setq i (1+ i))
  54.       )
  55.     )
  56.   )
  57.   overlen
  58. )
  59. ;;;获取表(Alist)中索引码(Item)相同的所有元素,并组成一个表(lst)返回
  60. (defun PEACE:Assoc_ItemList (Item Alist / a lst)
  61.   (while (setq a (assoc Item Alist))
  62.     (setq  Alist (cdr (member a Alist)) ;cdr返回list(member a Alist)中除了第一个以外的所有元素的表
  63.              lst (cons (cdr a) lst)
  64.     )
  65.   )
  66.   (reverse lst) ;前面获得的坐标表是倒序的,现在再转换为正序
  67. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 2个

财富等级: 恭喜发财

 楼主| 发表于 2013-8-22 16:02:38 | 显示全部楼层
本帖最后由 张和平 于 2013-8-23 08:58 编辑

原理:以此判断pl1的每一段是否与pl0重合,若pl1的第i段的起点,中点和重点至pl0的距离均小于某一限值,那么即认为此段与pl0重合,然后此段长度计入重叠长度,以此类推。要求:pl0能基本包住pli
上个图:
捕获.PNG

由于算法的问题,如下图等的情况是不能正确计算的
捕获1.PNG

点评

楼主,你上图都看着直晕,不上图的话,更云山雾罩了。 楼主,你最下的图算不出来的,是什么原因,算法不行那就修改下算法呗。这个图,你认为上面和下面和矩形贴的部分是重合的? 你想计算这两个重叠部分的长度和  详情 回复 发表于 2013-8-22 23:50
楼主,最好还是上个图说明下,这个PL0没概念。  详情 回复 发表于 2013-8-22 17:10
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-8-22 17:10:46 | 显示全部楼层
张和平 发表于 2013-8-22 16:02
原理:以此判断pl1的每一段是否与pl0重合,若pl1的第i段的起点,中点和重点至pl0的距离均小于某一限值,那 ...

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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-8-22 23:50:21 | 显示全部楼层
张和平 发表于 2013-8-22 16:02
原理:以此判断pl1的每一段是否与pl0重合,若pl1的第i段的起点,中点和重点至pl0的距离均小于某一限值,那 ...

楼主,你上图都看着直晕,不上图的话,更云山雾罩了。

楼主,你最下的图算不出来的,是什么原因,算法不行那就修改下算法呗。这个图,你认为上面和下面和矩形贴的部分是重合的? 你想计算这两个重叠部分的长度和?

点评

目前我所用到的是全贴合的,第二张图是部分贴合的,全贴合的话用我现在的算法就可以了,部分贴合的话要加一些判断条件,可以用二分法去求,稍微复杂一点,最近有点忙,所以就先没弄了。哈哈。。。。  详情 回复 发表于 2013-8-23 08:52
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

 楼主| 发表于 2013-8-23 08:52:09 | 显示全部楼层
newer 发表于 2013-8-22 23:50
楼主,你上图都看着直晕,不上图的话,更云山雾罩了。

楼主,你最下的图算不出来的,是什么原因,算法 ...

目前我所用到的是全贴合的,第二张图是部分贴合的,全贴合的话用我现在的算法就可以了,部分贴合的话要加一些判断条件,可以用二分法去求,稍微复杂一点,最近有点忙,所以就先没弄了。哈哈。。。。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1094个

财富等级: 财源广进

发表于 2021-5-20 00:05:24 | 显示全部楼层
感谢楼主分享函数,计算pllst中pline与pl0的重叠长度之和!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-15 14:06 , Processed in 0.405935 second(s), 42 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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