找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 885|回复: 20

[求助] 求助:判断两点是否重叠

[复制链接]

已领礼包: 466个

财富等级: 日进斗金

发表于 2017-6-7 11:29:38 | 显示全部楼层 |阅读模式

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

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

×
做的是建筑结构设计,画边缘构件(就像柱子一样的混凝土构件)的时候,需要对钢筋,就是自己标注的钢筋是否和详图一样。有时候两个钢筋不小心会画在一起,看起来像一个,其实在一个点上,画了两个钢筋点。本程序就是想校对出来,有没有钢筋点重合,重合的话,有几个重叠在一起。
自己编了一个lisp程序,可以运行不起来。请高手给指点一下。现在把图和lisp都传上。
(defun c:www ()

  (setq ss  (ssget '((0 . "lwpolyline")
                    (90 . 2)
                    (-4 . "<or")
                    (42 . 1)
                    (42 . -1)
                    (-4 . "or>")
                   )
           )
  )                                        ;构造针选择集
  (setq m 0)

  (if (/= ss nil)
    (progn
      (setq i% 0)
      (setq lenss1 (sslength ss))        ;获取选技集ss的长度
      (repeat (- lenss1 1)
        (setq ent1 (entget (ssname ss i%)));将第i%个图元属性附给ent1
        (setq r (assoc 10 ent1))
        (setq x1 (nth 1 r))
        (setq y1 (nth 2 r))
        (setq ii% (+ 1 i%))

         (repeat (- lenss1 ii%)
            (setq ent2 (entget (ssname ss ii%)));将第ii%个图元属性附给ent2
            (setq r1 (assoc 10 ent2))
            (setq x2 (nth 1 r1))
            (setq y2 (nth 2 r1))
            (setq x (expt (- x1 x2) 2))
            (setq y (expt (- y1 y2) 2))
            (if (=< (sqrt (+ x y)) r)
                (setq m (+ m 1))
            )
          )
       )
     )
   )
  (print (strcat "重叠钢筋数是" (rtos m)))
  (princ)
)

123_t3.rar

12.11 KB, 下载次数: 4, 下载积分: D豆 -1 , 活跃度 1

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

已领礼包: 19个

财富等级: 恭喜发财

发表于 2017-6-7 11:41:35 | 显示全部楼层
两个点重叠? 用  equal 加上精度就可以了吧
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2017-6-7 11:42:43 | 显示全部楼层
使用 xd::list:groupby 分组,特征点就是 pline 第一点和第二点的中点,误差可以是 “圆” 半径
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-6-7 11:43:41 | 显示全部楼层
截取下清晰的图片,贴上来,说明下情况吧,不是都有时间下载附件打开看的。
还有说明下,你钢筋是用什么实体画的, LWPOLYLINE?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 20个

财富等级: 恭喜发财

发表于 2017-6-7 12:46:00 | 显示全部楼层
看不到图,可以用两个钢筋的实体的包围框相交状态判断是否重叠。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2017-6-7 13:28:54 | 显示全部楼层

  1. (defun c:tt (/ ss lst r s)
  2.   (if (setq ss (ssget '((0 . "lwpolyline") (90 . 2) (-4 . "&=") (70 . 1))))
  3.     (progn
  4.       (setq lst        (mapcar        '(lambda (x / pts p)
  5.                            (setq pts (xdrx_getpropertyvalue x "vertices")
  6.                                  p   (xdrx_line_midp (cadr pts) (car pts))
  7.                                  r   (distance (cadr pts) (car pts))
  8.                            )
  9.                            (list p x)
  10.                          )
  11.                         (xdrx_pickset->ents ss)
  12.                 )
  13.             lst        (xd::list:groupbyindex lst r)
  14.       )
  15.       (setq s (ssadd))
  16.       (while lst
  17.         (if (> (length (cdar lst)) 1)
  18.           (foreach x (cdar lst)
  19.             (ssadd x s))
  20.         )
  21.         (setq lst (cdr lst))
  22.       )
  23.       (sssetfirst nil s)
  24.     )
  25.   )
  26.   (princ)
  27. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-6-7 16:52:28 | 显示全部楼层
替你截下图,图中哪个地方是你要查的重叠?

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

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

发表于 2017-6-7 17:34:04 来自手机 | 显示全部楼层
圆点 不重叠
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 466个

财富等级: 日进斗金

 楼主| 发表于 2017-6-7 21:29:58 | 显示全部楼层
本帖最后由 sunshinejwt 于 2017-6-8 03:48 编辑

首先谢谢各位,很感动。估计是我问题说的不够清楚。现在截图说明一下。边缘构件表中上边是详图,下边是构件的名称、标高、纵向钢筋、箍筋。第三项是纵向钢筋,为了表达方便,有时候会标注(实心)或(空心)。我现在已经编了一个可以数钢筋的小程序。可以统计出详图中有几个实心和几个空心的小圆点。问题是有时候给别人校对图纸,他们有时会在同一个位置放两个小圆点。这样统计出来的就是错误的数字。所以才想编一个程序,来校对是否有重叠的钢筋。现在把详图框的图元信息和实心、空心的图元信息都生成了,方便各位大神指导小弟。另外还有一个想法,就是现在编的程序每次都只能校对其中一个方框里的内容,看看能不能整体选择,批量校对。处理后的效果就是在框的左上方写出校对的结果。请各位多多帮忙了。谢谢! 8钢筋图元信息.png 2多个边缘构件详图.png 3钢筋表达方式.png 5边缘构件图框信息.png 6实心钢筋图元信息.png 7空心钢筋图元信息.png 1边缘构件定位.png
9处理后的效果.png
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 466个

财富等级: 日进斗金

 楼主| 发表于 2017-6-7 21:35:42 | 显示全部楼层
我自己编的程序如下(defun c:ww ( /   ent i% lenss1 m n)

  (setq        ss (ssget '((0 . "lwpolyline")
                    (90 . 2)
                    (-4 . "<or")
                    (42 . 1)
                    (42 . -1)
                    (-4 . "or>")
                   )
           )
  )                                        ;构造针选择集
  (setq m 0)
  (setq n 0)
  (if (/= ss nil)
    (progn
      (setq i% 0)
      (setq lenss1 (sslength ss))        ;获取选技集ss的长度

      (repeat lenss1
        (setq ent (entget (ssname ss i%)))
                                         ;将第i%个图元属性附给ent
        (if (> (cdr (assoc 43 ent)) 0)
            (setq m (+ 1 m))
            (setq n (+ 1 n))
        )
       
        (setq i% (1+ i%))
      )
      ;(print (strcat "实心钢筋数是" (rtos m) "◆空心钢筋数是" (rtos n)))
      (alert (strcat "实心钢筋数是【 " (rtos m) " 】 ◆  空心钢筋数是【 " (rtos n) " 】"))

    )
  )
  (princ)
)
希望能用lisp语言+vlisp,因为公司电脑有设定,C盘的内容改变不了,没法装别的程序。只能是把插件放到别的盘,加载使用。
10自编程序校对成果.png

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

使用道具 举报

已领礼包: 466个

财富等级: 日进斗金

 楼主| 发表于 2017-6-7 21:41:30 | 显示全部楼层
回复7楼,就是这个图片上看着是六个小圆点,其实有的一个小圆点地方,放了两个,除非移开一个才能发现是两个或者更多。我的想法是通过找到每个图元的圆心,然后通过两个圆心的距离来判断是否重叠,只要两个圆心的距离小于半径,那就判断重叠。其实只要两个小圆点有稍微大一点的距离,就能发现同一个位置有两个小圆点,就怕是两个真的重叠在一起,看是看不出来的。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2017-6-8 09:34:52 | 显示全部楼层
思路给你了,自己修改下就不用 xdapi 了, xd::list:groupbyindex 在开源函数库找

  1. (vl-load-com)
  2. (defun c:tt (/ ss lst r s)
  3.   (defun ss->ents (ss / sl i l)
  4.     (setq sl (sslength ss)
  5.           i  0
  6.     )
  7.     (while (< i sl)
  8.       (setq l (cons (ssname ss i) l)
  9.             i (1+ i)
  10.       )
  11.     )
  12.     l
  13.   )
  14.   (if (setq ss (ssget '((0 . "lwpolyline") (90 . 2) (-4 . "&=") (70 . 1))))
  15.     (progn
  16.       (setq lst        (mapcar        '(lambda (x / sp ep p)
  17.                            (setq sp (vlax-curve-getstartpoint x)
  18.                                  ep (vlax-curve-getpointatparam x 1)
  19.                                  p  (polar sp
  20.                                            (angle sp ep)
  21.                                            (* (distance sp ep) 0.5)
  22.                                     )
  23.                                  r
  24.                                     (distance sp ep)
  25.                            )
  26.                            (list p x)
  27.                          )
  28.                         (ss->ents ss)
  29.                 )
  30.             lst        (xd::list:groupbyindex lst r)
  31.       )
  32.       (setq s (ssadd))
  33.       (while lst
  34.         (if (> (length (cdar lst)) 1)
  35.           (foreach x (cdar lst)
  36.             (ssadd x s)
  37.           )
  38.         )
  39.         (setq lst (cdr lst))
  40.       )
  41.       (sssetfirst nil s)
  42.     )
  43.   )
  44.   (princ)
  45. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 466个

财富等级: 日进斗金

 楼主| 发表于 2017-6-8 10:41:21 | 显示全部楼层
谢谢提供思路,现在正在研究。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-6-8 11:11:00 | 显示全部楼层

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

使用道具 举报

已领礼包: 466个

财富等级: 日进斗金

 楼主| 发表于 2017-6-8 12:43:00 | 显示全部楼层
好的,刚开始学习lisp,也会把自己的学习心得和大家交流。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-4 23:19 , Processed in 0.216268 second(s), 60 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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