乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 168|回复: 9

查找指定点附近的文本元素的方法

[复制链接]

7

主题

16

帖子

1

银币

初来乍到

Rank: 1

铜币
44
发表于 2014-5-8 10:57:43 | 显示全部楼层 |阅读模式
有没有人知道一种方法可以找到离指定点一定距离附近的所有文本元素?
事先感谢。

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

7

主题

46

帖子

3

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
74
发表于 2014-5-8 11:14:12 | 显示全部楼层
不知道你想完成什么,但我脑海中的一个想法是对照你的测试点检查绘图中的text.Position、text.AlignmentPoint或文本。
快速示例:
  1. BlockTable table = (BlockTable)transaction.GetObject(database.BlockTableId, OpenMode.ForRead);
  2. BlockTableRecord btr = (BlockTableRecord)transaction.GetObject(table[BlockTableRecord.ModelSpace], OpenMode.ForRead);
  3.                                     foreach (ObjectId oid in btr)
  4.                                     {
  5.                                         if (oid.ObjectClass.DxfName == "TEXT")
  6.                                         {
  7.                                             DBText dbt = (DBText)transaction.GetObject(oid, OpenMode.ForRead);
  8.                                             if (dbt.Position == testpoint)
  9.                                             {
  10.                                                 Do your work here...........
  11.                                             }
  12.                                         }
  13.                                     }
回复

使用道具 举报

7

主题

16

帖子

1

银币

初来乍到

Rank: 1

铜币
44
发表于 2014-5-8 11:27:43 | 显示全部楼层
基本上这就是我试图完成的:有一个带有领导者的绘图(我不能修改绘图)。然后一旦我找到那些领导者,领导者的末尾就有文本。我需要找到那些元素(通常是一两个)。(这是我正在寻找的方法,它会找到离我通过它的点一定距离内的所有元素)。
{
//开始事务
使用(Transaction tr=db.TransactionManager.StartTransaction())
{
BlockTableRecateSpace=(BlockTableRecord)tr.GetObject(
SymbolUtilityServices.GetBlockModelSpaceId(db),OpenMode.ForRead);
foreach(ObjectId id in ModelSpace)
{
//只选择领导者
if(id.ObjectClass.DxfName=="LEADER")
{
//只选择HOMES
领导者领导者=(领导者)tr.GetObject(id,OpenMode.ForRead);
if(leader.Layer=="HOMES")
{
//领导者点(只使用最后一个点)
Point3dCollection cript=new Point3dCollection();
leader.GetStretchPoints(cript);//注意:脚本将具有所有领导者的要点
//在这里,我将调用一个方法
//,该方法将获取一定距离内的所有文本元素:pt[pts.Count-1]
回复

使用道具 举报

7

主题

46

帖子

3

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
74
发表于 2014-5-8 13:12:23 | 显示全部楼层
文本是引线注释的一部分吗
对不起,我现在没有时间做这件事,但是
我会查看注释/ObjectID,找到一种阅读其中包含的多行文字的方法
有很多leader代码的示例
回复

使用道具 举报

7

主题

46

帖子

3

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
74
发表于 2014-5-8 13:22:15 | 显示全部楼层
哦等等!
这似乎是一个快速测试:
  1. if (oid.ObjectClass.DxfName == "LEADER")
  2.   {
  3.        Leader ldr = (Leader)transaction.GetObject(oid, OpenMode.ForRead);
  4.        ObjectId AnnoId = ldr.Annotation;
  5.            if (!AnnoId.IsNull)
  6.             {
  7.                MText AnnoTxt = (MText)transaction.GetObject(AnnoId, OpenMode.ForRead);
  8.                editor.WriteMessage("Hello world: " + AnnoTxt.Text);
  9.             }
  10.     }

回复

使用道具 举报

7

主题

16

帖子

1

银币

初来乍到

Rank: 1

铜币
44
发表于 2014-5-8 13:29:03 | 显示全部楼层
不,它不是一个领导者注释。它是一个独立的元素。这是我遇到的主要问题。有时它是两个独立的元素,这就是我需要在该特定点附近找到所有文本元素的原因。
回复

使用道具 举报

7

主题

46

帖子

3

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
74
发表于 2014-5-8 13:44:38 | 显示全部楼层

这就是我要做的方式,使用带有文本/mtext(或任何东西)过滤器的窗口选择,定义您的“选择区域”矩形,并为区域内的每个项目完成您的工作。
编辑:
这是基本设置,查找文档以获取有关过滤器等的更多信息:
PromptSelectionResult res=editor.SelectWindow(btmLeftPoint, topRightPoint, select filter);
hth
米克。
回复

使用道具 举报

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2014-5-8 19:41:23 | 显示全部楼层
米克,听起来是个好主意!此外,我正在尝试一种我发现的似乎很有前途的“哈弗森公式”:
http://www.stormconsultancy.co.uk/blog/development/code-snippets/the-haversine-formula-in-c-and-sql/
我可以通过在C#中创建两个列表来使用它,一个是引线对象,另一个是我正在寻找的文本对象。然后用一个for-each外部循环遍历所有的引线,一个foreach内部循环遍历文本(获得每个引线相对于引线的距离)。最后,通过上面链接中提到的linq,我能够检索到我需要的X个最接近的元素。
回复

使用道具 举报

7

主题

16

帖子

1

银币

初来乍到

Rank: 1

铜币
44
发表于 2014-5-9 10:05:37 | 显示全部楼层
很酷,另一个选择可能是类似BSP(二进制空间划分)的东西来构建所有点的节点树,这样你可以在任何时候查询任何点,并非常快地找到它最近的邻居。
回复

使用道具 举报

69

主题

875

帖子

15

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1146
发表于 2014-5-9 19:30:26 | 显示全部楼层
嗨,如果你有大量的文本点,你可以像MickD建议的那样,使用Point3dTree。这个类提供了一个对你有用的方法:NearestNeighbour它返回一个Point3dCollection,其中包含树中与输入点指定距离内的所有点。伪代码:遍历模型空间。
将找到的文本存储在字典中。
将找到的领导者存储在字典中。
使用文本集合构建Point3dTree实例Dictionary.Keys。
Foreach点Dictionary.Keys调用Point3dTree.NearestNeighbours()方法。
从字典中获取与返回点相关的DBText实体。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-2-5 06:45 , Processed in 0.202933 second(s), 72 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表