通过一点寻找被包围的块
我的想法是在图框内点击一点,然后通过这个点找到图框(一档多图)。有没有什么办法能够实现?现在用的办法是(vl-cmdf "_.Boundary" "A" "I" "N" "" "O" "P" "" pt "")
通过边界建立多段线,在通过多段线上的一点找到图框,虽然成功,但是问题很多,很卡,测试的时候几次卡死
;; 大概的意思
(defun c:tt ()
"通过一点寻找被包围的块"
(setq ll (getvar "viewsize"))
(if (and (setq p0 (getpoint "\n基点<退出>: "))
(setq p1 (polar p0 pi ll)
p2 (polar p0 0 ll)
)
(setq ss (ssget "f" (list p1 p2) '((0 . "insert"))))
)
(sssetfirst nil ss)
)
(princ)
)
飞雪神光 发表于 2024-3-5 19:21
两点是水平或对角的两点 用来搜索 还有一个计算点击点是否在块的包围盒内 防止误选 逐渐扩大范围并zoom...
感谢,不过zoom会有卡顿。十分不舒服。现在的解决办法是设置SELECTIONOFFSCREEN变量。缺点是低版本不支持。现在的解决办法是先判断版本,低于2018设置zoom,高版本用SELECTIONOFFSCREEN变量 本帖最后由 你有种再说一遍 于 2024-3-5 18:48 编辑
想通过一点选中图框?就算暴力算法也没多慢吧.
遍历全部图框块,获取包围盒,点在包围盒内.
包围盒就是矩形,所以特别快.
if(rect.Min.X<pt.X && pt.X<rect.Max.X
&& rect.Min.Y<pt.Y && pt.Y<rect.Max.Y)
这样速度已经非常块了,一个dwg算你一万张图?那也飞一般速度...不需要做什么四叉树降低复杂度了.
用这个点 计算出两点 从点击处逐渐扩大范围 用ssget "c" 去搜索块 或用四点 ssget "cp" 去搜索且搜索到块时计算块的包围盒 计算点击点是否在块的包围盒内 这个速度递增幅度越大 速度越快 做好处理不会卡死 朝0°和180°各拉一根直线,各得到一个块的选择集,然后这两个集合的交集,就是你要的图框。 飞雪神光 发表于 2024-3-4 19:29
用这个点 计算出两点 从点击处逐渐扩大范围 用ssget "c" 去搜索块 或用四点 ssget "cp" 去搜索且搜索到块时 ...
一般是范围屏幕当前显示尺寸 每天在各楼学知识任务达成 如果图框是属性块,而且知道块名,那离p最近那个就是它,就不用boundary。 判断点在一个矩形形 是容易的。 如图图框是一个图块,那么就获得它的最大点,最小点,从而获得它的矩形,如果图框是一个多段线形成的,则也是得到其四个角点 。判断一下点 是不是在这些 矩形内(这样的矩形应该不是很多),就可以知道了。 飞雪神光 发表于 2024-3-4 19:29
用这个点 计算出两点 从点击处逐渐扩大范围 用ssget "c" 去搜索块 或用四点 ssget "cp" 去搜索且搜索到块时 ...
果然牛,思路非常棒。但是会有小问题,如果两个图框离的非常近,第2点的距离就很难把握,会出现误选。总体思路还是非常棒的。非常感谢 自贡黄明儒 发表于 2024-3-5 11:23
如果图框是属性块,而且知道块名,那离p最近那个就是它,就不用boundary。
大神来了。能说的详细点吗?图框是属性块。知道块名。不过不是一个块名,分别是GB_L,GB_H,还有一些同事建的块名,分别是tk_和tk_h。现在是两种图框并存,还没来得及统一。
页:
[1]
2