如何框选取得交点,并对交点分类。
本帖最后由 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)
)
既然4为3个直线相交,意思就是没有虚交点,相交点都是实交并且都是线的首尾点
那么只需要在框选后,把所有线的起点和止点提取出来,边提取边统计这个坐标出现的次数即可,没有分类的问题,所谓的分类只是那些坐标重复出现的次数,只出现一次的都不是交点,所以去掉了(defun c:tt(/ l)
(and(ssget'((0 . "line,arc,*polyline")))
(vlax-for o(vlax-get-property(vlax-get-property(vlax-get-acad-object)'activedocument)'activeselectionset)
(vl-every(function(lambda(x / p)(setq p(apply x(List o)))
(or(vl-some(function(lambda(a)
(if(equal p(car a)1e-3)
(setq l(cons(list p(1+(cadr a)))(vl-remove a l))))))l)
(setq l(cons(List p 1)l)))))
'(vlax-curve-getstartpoint vlax-curve-getendpoint))))
;;;统计完成后,再根据实际需要行处理,比如返回所有交点坐标及线段的条数,或者直接在图上写出它们的数量
;;;(vl-remove-if(function(lambda(a)(=(cadr a)1)))l)
(vl-every(function(lambda(a)
(or(=(cadr a)1)
(entmakex(mapcar(function cons)
'(0 1 10 40)
(List"text"(itoa(cadr a))(car a)400))))))l)
)
1.选择直线为选择集ss
2.对选择集ss中的任意两直线求实交点,得出交点集pts
3.用(ssget "c" pt pt '((0 . "line"))),在每个交点处得到选择集
4,在每个交点处画一个小圆,半径自己确定
5.求出每个交点的圆与该处的选择集中的每条直线的交点,这个交点的数量就是你想要的结果
6.删除临时生成的圆 获取所有直线端点然后(ssget “C”pt pt)就可以分出来端点的 选择集一个两线相交的2个三线相交的三个。。。。。 取所有交点,然后去重,并计算每一个交点的出现次数 本帖最后由 你有种再说一遍 于 2025-8-14 17:33 编辑
不知道你水平去到哪里?
如果是量少,就两个for嵌套,i和i++进行求交.
如果是量大,就还挺麻烦的,
写一个四叉树(ssget)或者SAP(Sweep and prune),
总之就是通过包围盒去选择邻近图元,以此降低时间复杂度. 你有种再说一遍 发表于 2025-8-14 16:45
不知道你水平去到哪里?
如果是量少,就两个for嵌套,i和i++进行求交.
如果是量大,就还挺麻烦的,
能不能把靶框搞大,用osnap直接获得系统给的交点 你有种再说一遍 发表于 2025-8-14 16:45
不知道你水平去到哪里?
如果是量少,就两个for嵌套,i和i++进行求交.
如果是量大,就还挺麻烦的,
多谢指点,其他语言不会,就会板块的语言。感谢指点! cdma2546 发表于 2025-8-14 17:12
多谢指点,其他语言不会,就会板块的语言。感谢指点!
那你就两个for,内for的四叉树你做不了,ssget不也行.
取决于你量大量少. 自贡黄明儒 发表于 2025-8-14 17:03
能不能把靶框搞大,用osnap直接获得系统给的交点
那本质上不也是ssget. 要是没有中间相交的线,可以只取所有线的首末点,然后设计一个阈值(比如所有点中最近两点距离的10%)进行ssget c。select的数量就是线条数。数量为1的是悬挂点。不需要的话可以剃掉不要。
页:
[1]
2