明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 795|回复: 18

[提问] 通过一点寻找被包围的块

[复制链接]
发表于 2024-3-4 16:14 | 显示全部楼层 |阅读模式
我的想法是在图框内点击一点,然后通过这个点找到图框(一档多图)。有没有什么办法能够实现?

现在用的办法是(vl-cmdf "_.Boundary" "A" "I" "N" "" "O" "P" "" pt "")
通过边界建立多段线,在通过多段线上的一点找到图框,虽然成功,但是问题很多,很卡,测试的时候几次卡死
发表于 2024-3-5 13:38 | 显示全部楼层

;; 大概的意思
  1. (defun c:tt ()
  2.   "通过一点寻找被包围的块"
  3.   (setq ll (getvar "viewsize"))
  4.   (if (and (setq p0 (getpoint "\n基点<退出>: "))
  5.            (setq p1 (polar p0 pi ll)
  6.                  p2 (polar p0 0 ll)
  7.            )
  8.            (setq ss (ssget "f" (list p1 p2) '((0 . "insert"))))
  9.       )
  10.     (sssetfirst nil ss)
  11.   )
  12.   (princ)
  13. )




本帖子中包含更多资源

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

x
 楼主| 发表于 2024-3-5 20:48 | 显示全部楼层
飞雪神光 发表于 2024-3-5 19:21
两点是水平或对角的两点 用来搜索 还有一个计算点击点是否在块的包围盒内 防止误选 逐渐扩大范围并zoom  ...

感谢,不过zoom会有卡顿。十分不舒服。现在的解决办法是设置SELECTIONOFFSCREEN变量。缺点是低版本不支持。现在的解决办法是先判断版本,低于2018设置zoom,高版本用SELECTIONOFFSCREEN变量
发表于 2024-3-5 18:29 | 显示全部楼层
本帖最后由 你有种再说一遍 于 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算你一万张图?那也飞一般速度...不需要做什么四叉树降低复杂度了.
发表于 2024-3-4 19:29 | 显示全部楼层
用这个点 计算出两点 从点击处逐渐扩大范围 用ssget "c" 去搜索块 或用四点 ssget "cp" 去搜索且搜索到块时计算块的包围盒 计算点击点是否在块的包围盒内 这个速度递增幅度越大 速度越快 做好处理不会卡死
发表于 2024-3-5 09:04 | 显示全部楼层
朝0°和180°各拉一根直线,各得到一个块的选择集,然后这两个集合的交集,就是你要的图框。
发表于 2024-3-5 09:38 | 显示全部楼层
飞雪神光 发表于 2024-3-4 19:29
用这个点 计算出两点 从点击处逐渐扩大范围 用ssget "c" 去搜索块 或用四点 ssget "cp" 去搜索且搜索到块时 ...

一般是范围屏幕当前显示尺寸
发表于 2024-3-5 10:00 | 显示全部楼层
每天在各楼学知识任务达成
发表于 2024-3-5 11:23 | 显示全部楼层
如果图框是属性块,而且知道块名,那离p最近那个就是它,就不用boundary。
发表于 2024-3-5 12:30 | 显示全部楼层
判断点在一个矩形形 是容易的。 如图图框是一个图块,那么就获得它的最大点,最小点,从而获得它的矩形,如果图框是一个多段线形成的,则也是得到其四个角点 。判断一下点 是不是在这些 矩形内(这样的矩形应该不是很多),就可以知道了。
 楼主| 发表于 2024-3-5 18:10 | 显示全部楼层
飞雪神光 发表于 2024-3-4 19:29
用这个点 计算出两点 从点击处逐渐扩大范围 用ssget "c" 去搜索块 或用四点 ssget "cp" 去搜索且搜索到块时 ...

果然牛,思路非常棒。但是会有小问题,如果两个图框离的非常近,第2点的距离就很难把握,会出现误选。总体思路还是非常棒的。非常感谢
 楼主| 发表于 2024-3-5 18:15 | 显示全部楼层
自贡黄明儒 发表于 2024-3-5 11:23
如果图框是属性块,而且知道块名,那离p最近那个就是它,就不用boundary。

大神来了。能说的详细点吗?图框是属性块。知道块名。不过不是一个块名,分别是GB_L,GB_H,还有一些同事建的块名,分别是tk_和tk_h。现在是两种图框并存,还没来得及统一。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-17 12:16 , Processed in 0.214055 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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