明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1606|回复: 11

[提问] 如何框选取得交点,并对交点分类。

[复制链接]
发表于 2025-8-14 15:29:08 | 显示全部楼层 |阅读模式
本帖最后由 cdma2546 于 2025-8-15 08:15 编辑

如图,如何框选提取交点并将交点分类(1.2.3为2个直线相交,4为3个直线相交)?


非常感谢各位大佬的关注和指点,可能是我的算法本身表达有问题,其实想得到的是与文本关联(文本角度与线一致),识别出来交点,主要是想在俩个对象交点处生成与文本关联的90度弯头,三个对象交点处生成三通,(例如1、2、4、5处标记为90度弯头,1-DN100的90度弯头,2处-DN150的90度弯头和DN150变DN100的大小头。3处识别为三通型号DN150变DN100)


本帖子中包含更多资源

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

x
回复

使用道具 举报

发表于 2025-8-15 04:11:08 | 显示全部楼层
既然4为3个直线相交,意思就是没有虚交点,相交点都是实交并且都是线的首尾点
那么只需要在框选后,把所有线的起点和止点提取出来,边提取边统计这个坐标出现的次数即可,没有分类的问题,所谓的分类只是那些坐标重复出现的次数,只出现一次的都不是交点,所以去掉了
  1. (defun c:tt(/ l)
  2.   (and(ssget'((0 . "line,arc,*polyline")))
  3.       (vlax-for o(vlax-get-property(vlax-get-property(vlax-get-acad-object)'activedocument)'activeselectionset)
  4.   (vl-every(function(lambda(x / p)(setq p(apply x(List o)))
  5.           (or(vl-some(function(lambda(a)
  6.               (if(equal p(car a)1e-3)
  7.                 (setq l(cons(list p(1+(cadr a)))(vl-remove a l))))))l)
  8.              (setq l(cons(List p 1)l)))))
  9.      '(vlax-curve-getstartpoint vlax-curve-getendpoint))))
  10.   ;;;统计完成后,再根据实际需要行处理,比如返回所有交点坐标及线段的条数,或者直接在图上写出它们的数量
  11.   ;;;(vl-remove-if(function(lambda(a)(=(cadr a)1)))l)
  12.   (vl-every(function(lambda(a)
  13.           (or(=(cadr a)1)
  14.        (entmakex(mapcar(function cons)
  15.            '(0 1 10 40)
  16.            (List"text"(itoa(cadr a))(car a)400))))))l)
  17.   )


本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

发表于 2025-8-15 09:00:41 | 显示全部楼层
1.选择直线为选择集ss
2.对选择集ss中的任意两直线求实交点,得出交点集pts
3.用(ssget "c" pt pt '((0 . "line"))),在每个交点处得到选择集
4,在每个交点处画一个小圆,半径自己确定
5.求出每个交点的圆与该处的选择集中的每条直线的交点,这个交点的数量就是你想要的结果
6.删除临时生成的圆
回复 支持 反对

使用道具 举报

发表于 2025-8-14 23:02:30 | 显示全部楼层
获取所有直线端点  然后(ssget “C”  pt pt)  就可以分出来  端点的 选择集一个  两线相交的2个  三线相交的  三个  。。。。。  
回复 支持 反对

使用道具 举报

发表于 2025-8-14 15:43:57 | 显示全部楼层
取所有交点,然后去重,并计算每一个交点的出现次数
回复 支持 反对

使用道具 举报

发表于 2025-8-14 16:45:25 | 显示全部楼层
本帖最后由 你有种再说一遍 于 2025-8-14 17:33 编辑

不知道你水平去到哪里?
如果是量少,就两个for嵌套,i和i++进行求交.
如果是量大,就还挺麻烦的,
写一个四叉树(ssget)或者SAP(Sweep and prune),
总之就是通过包围盒去选择邻近图元,以此降低时间复杂度.
回复 支持 反对

使用道具 举报

发表于 2025-8-14 17:03:31 | 显示全部楼层
你有种再说一遍 发表于 2025-8-14 16:45
不知道你水平去到哪里?
如果是量少,就两个for嵌套,i和i++进行求交.
如果是量大,就还挺麻烦的,

能不能把靶框搞大,用osnap直接获得系统给的交点
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-8-14 17:12:19 | 显示全部楼层
你有种再说一遍 发表于 2025-8-14 16:45
不知道你水平去到哪里?
如果是量少,就两个for嵌套,i和i++进行求交.
如果是量大,就还挺麻烦的,

多谢指点,其他语言不会,就会板块的语言。感谢指点!
回复 支持 反对

使用道具 举报

发表于 2025-8-14 17:18:43 | 显示全部楼层
cdma2546 发表于 2025-8-14 17:12
多谢指点,其他语言不会,就会板块的语言。感谢指点!

那你就两个for,内for的四叉树你做不了,ssget不也行.
取决于你量大量少.
回复 支持 反对

使用道具 举报

发表于 2025-8-14 17:24:59 | 显示全部楼层
自贡黄明儒 发表于 2025-8-14 17:03
能不能把靶框搞大,用osnap直接获得系统给的交点

那本质上不也是ssget.
回复 支持 反对

使用道具 举报

发表于 2025-8-14 22:54:58 | 显示全部楼层
要是没有中间相交的线,可以只取所有线的首末点,然后设计一个阈值(比如所有点中最近两点距离的10%)进行ssget c。select的数量就是线条数。数量为1的是悬挂点。不需要的话可以剃掉不要。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-12 04:09 , Processed in 0.139632 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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