找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2217|回复: 22

[已解决] 直线如何按连续性分组

[复制链接]

已领礼包: 202个

财富等级: 日进斗金

发表于 2018-6-8 09:00:04 | 显示全部楼层 |阅读模式
悬赏20D豆已解决
本帖最后由 dyjwyqz5221 于 2018-6-8 12:56 编辑

如何将连续的直线为一组。
如下图:
1、两条直线的交点处为相关直线的起点或终点。
2、x方向每条直线的起点、终点均为从左到右。
3、y方向每条直线的起点、终点均为从下到上。4、最终形成一个图元表如下:
((x1 x2 x3)(x4)(x5)(x6 x7 x8)(x9 x10 x11)
(y1 y2 y3)(y4 y5 y6)(y7 y8 y9)(y10 y11 y12))

其中:x* y* 为各条直线的图元名
图元名及各子表的顺序同上表。
附图:



)PR15NLUIW9]98_C7}SX2RB.png

最佳答案

查看完整内容

斜线也没有问题,选包围盒做边界只是正交时候的一个选择,如果你斜的,你就选这个角度垂直方向一个无限远的距离做参照就够,你只要保证所有要排序的位于这个参照一侧就行了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 40个

财富等级: 招财进宝

发表于 2018-6-8 09:00:05 | 显示全部楼层
dyjwyqz5221 发表于 2018-6-11 09:10
再有我写的那段程序只适合于水平方向及垂直方向的直线,斜直线恐怕有问题

斜线也没有问题,选包围盒做边界只是正交时候的一个选择,如果你斜的,你就选这个角度垂直方向一个无限远的距离做参照就够,你只要保证所有要排序的位于这个参照一侧就行了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 6434个

财富等级: 富甲天下

发表于 2018-6-8 09:06:57 | 显示全部楼层
这个有思路么

点评

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

使用道具 举报

已领礼包: 202个

财富等级: 日进斗金

 楼主| 发表于 2018-6-8 09:10:39 | 显示全部楼层
我已经用xd::list:groupbyindex 做到了每行、每列的直线各自成一组,如何将连续的直线分成一组就不知道如何进行了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 202个

财富等级: 日进斗金

 楼主| 发表于 2018-6-8 09:15:52 | 显示全部楼层
本帖最后由 dyjwyqz5221 于 2018-6-8 09:21 编辑

[Plain Text] 纯文本查看 复制代码
(setq ss(ssget '((0 . "line")(8 . "S_NET"))))
;;;按角度分开,分为横向与竖向
(setq lst1 (xd::list:groupbyindex
                                    (mapcar '(lambda (x)
                                                (setq pts (xdrx_getpropertyvalue x                                                                      "startpoint" "endpoint"))
                                                (setq ang (angle (car pts) (cadr pts)))
                                                (if (equal ang 0.0 1e-1) 
                                                        (list ang (list (cadr #startpoint) x))
                                                        (list ang (list (car #startpoint) x))        
                                                )
                                             )
                                            (xdrx_pickset->ents ss)
                                    )
                                 1e-3
        )
)
;;;x、y方向分别按每行、每列分开
(setq lst2 (mapcar
                '(lambda(x)
                        (setq lst-3 (xd::list:groupbyindex (cdr x) 1e-1))
                        (mapcar
                                '(lambda(y)
                                        (vl-sort (cdr y) '(lambda(a b)
                                                                (equal  (xdrx_getpropertyvalue a "endpoint")                                                                            (xdrx_getpropertyvalue b "startpoint") 1e-3)
                                                        )        
                                        )
                                )
                                lst-3
                        )
                )
                lst1
        )
)




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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2018-6-8 09:46:03 | 显示全部楼层
你最终想要做什么? 如果是表格的话,你得到按行按列排序的矩形框多好。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2018-6-8 09:48:30 | 显示全部楼层

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

使用道具 举报

已领礼包: 202个

财富等级: 日进斗金

 楼主| 发表于 2018-6-8 11:44:02 | 显示全部楼层
那个函数不适合

点评

你怎么知道这个函数不行? 另外的思路,用XD::LIST:GroupByIndex, 按直线的角度分组,得到角度一样的在一个组 然后对上面的每个组,按到包围盒最边的最左边的距离,分组 你就得到结果了。 给你个  详情 回复 发表于 2018-6-8 14:31
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 202个

财富等级: 日进斗金

 楼主| 发表于 2018-6-8 11:47:28 | 显示全部楼层
用两直线有无直接相交点进行过滤应该可以

点评

另外去看看这个帖子 http://bbs.xdcad.net/thread-671284-1-1.html  详情 回复 发表于 2018-6-8 14:38
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2018-6-8 14:31:55 | 显示全部楼层
本帖最后由 newer 于 2018-6-8 14:35 编辑

你怎么知道这个函数不行?

另外的思路,用XD::LIST:GroupByIndex,

按直线的角度分组,得到角度一样的在一个组

然后对上面的每个组,按到包围盒最边的上下距离,分组

你就得到结果了。


给你个另外的代码,如果你最终想要这个的话

xdrx_geom_bpoly_table.gif

  1. (defun c:tt ()
  2.   (defun _callback (dynpt)
  3.     (if (setq box (xdrx_geom_bpoly dynpt ss t))
  4.       (progn (setq box (xdrx_points_box box))
  5.              (if (not (equal box oldbox 0.01))
  6.                (progn (xdrx_entity_delete so)
  7.                       (setq so (xdrx_solid_make
  8.                                  (car box)
  9.                                  (cadr box)
  10.                                  (last box)
  11.                                  (caddr box)
  12.                                )
  13.                       )
  14.                       (xdrx_setpropertyvalue so "color" 1)
  15.                       (setq oldbox box)
  16.                )
  17.              )
  18.       )
  19.     )
  20.   )
  21.   (if (setq ss (ssget '((0 . "LINE,*POLYLINE"))))
  22.     (progn (xdrx_begin)
  23.            (xdrx_pointmonitor "_callback")
  24.            (getpoint)
  25.            (xdrx_pointmonitor)
  26.            (xdrx_end)
  27.     )
  28.   )
  29.   (princ)
  30. )


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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2018-6-8 14:38:43 | 显示全部楼层
dyjwyqz5221 发表于 2018-6-8 11:47
用两直线有无直接相交点进行过滤应该可以

另外去看看这个帖子


                               
登录/注册后可看大图


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

使用道具 举报

已领礼包: 202个

财富等级: 日进斗金

 楼主| 发表于 2018-6-8 15:54:59 | 显示全部楼层
我这段程序就是用xd::list:groupbyindex按角度先分组,然后又用xd::list:groupbyindex
按x、y坐标值分行、分列的。
现在的问题是,第二行两条直线的图元在一个组内,这两条直线不共点,
如何将它两个分组呢?

(setq ss(ssget '((0 . "line")(8 . "S_NET"))))
;;;按角度分开,分为横向与竖向
(setq lst1 (xd::list:groupbyindex
                    (mapcar '(lambda (x)
                                (setq pts (xdrx_getpropertyvalue x "startpoint" "endpoint"))
                                (setq ang (angle (car pts) (cadr pts)))
                                (if (equal ang 0.0 1e-1)
                                        (list ang (list (cadr #startpoint) x))
                                        (list ang (list (car #startpoint) x))       
                                )
                         )
                           (xdrx_pickset->ents ss)
                    )
                1e-3
        )
)
;;;x、y方向分别按每行、每列分开
(setq lst2
        (mapcar
                '(lambda(x)
                        (xd::list:groupbyindex (cdr x) 1e-1)
                )
                lst1
        )
)




点评

你得需要两次分组 1、角度分组 2、对上面角度分组里面的 每个组,再分组,分组的规则是你求出直线特征点到 包围盒的距离,距离排序后的分组,你就把同一行的,不挨着的给分开了。 用MAPCAR很快处理的,理解了一个  详情 回复 发表于 2018-6-8 16:09
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2018-6-8 16:09:12 | 显示全部楼层
dyjwyqz5221 发表于 2018-6-8 15:54
我这段程序就是用xd::list:groupbyindex按角度先分组,然后又用xd::list:groupbyindex
按x、y坐标值分行、 ...

你得需要两次分组
1、角度分组
2、对上面角度分组里面的 每个组,再分组,分组的规则是你求出直线特征点到 包围盒的距离,距离排序后的分组,你就把同一行的,不挨着的给分开了。
用MAPCAR很快处理的,理解了一个分组,再深层的同理了。只是分组的INDEX怎么确定的事。

点评

“再分组,分组的规则是你求出直线特征点到 包围盒的距离,距离排序后的分组,你就把同一行的,不挨着的给分开了。” 这句话理解不了。1是,包围盒是哪个的包围盒,是整个选择集的吗? 2是,直线的特征点到包围盒  详情 回复 发表于 2018-6-8 18:02
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 202个

财富等级: 日进斗金

 楼主| 发表于 2018-6-8 18:02:16 | 显示全部楼层
newer 发表于 2018-6-8 16:09
你得需要两次分组
1、角度分组
2、对上面角度分组里面的 每个组,再分组,分组的规则是你求出直线特征 ...

“再分组,分组的规则是你求出直线特征点到 包围盒的距离,距离排序后的分组,你就把同一行的,不挨着的给分开了。”
这句话理解不了。1是,包围盒是哪个的包围盒,是整个选择集的吗?
2是,直线的特征点到包围盒的距离,同一水平线上的,距离包围盒的上下边应该是一样的距离吧。
能否麻烦你给指点一下

点评

一行内的,上下距离一样,那左右距离能一样吗? 你排 水平的,都求和包围盒垂直边的距离, 排竖直的,就求和包围盒水平边的距离  详情 回复 发表于 2018-6-8 19:03
当然是唯一不变的东西做参照了,就是整个选择集的选择集的包围盒,你求出一行内的,所有直线的中点到包围盒一个边的距离,你要排序那个方向的,距离不同的,不就分出来了。  详情 回复 发表于 2018-6-8 19:01
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

已领礼包: 20个

财富等级: 恭喜发财

发表于 2018-6-8 19:01:22 | 显示全部楼层
dyjwyqz5221 发表于 2018-6-8 18:02
“再分组,分组的规则是你求出直线特征点到 包围盒的距离,距离排序后的分组,你就把同一行的,不挨着的 ...

当然是唯一不变的东西做参照了,就是整个选择集的选择集的包围盒,你求出一行内的,所有直线的中点到包围盒一个边的距离,你要排序那个方向的,距离不同的,不就分出来了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-23 02:28 , Processed in 0.456641 second(s), 59 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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