查找指定点附近的文本元素的方法
有没有人知道一种方法可以找到离指定点一定距离附近的所有文本元素?事先感谢。
**** Hidden Message ***** 不知道你想完成什么,但我脑海中的一个想法是对照你的测试点检查绘图中的text.Position、text.AlignmentPoint或文本。
快速示例:
BlockTable table = (BlockTable)transaction.GetObject(database.BlockTableId, OpenMode.ForRead);
BlockTableRecord btr = (BlockTableRecord)transaction.GetObject(table, OpenMode.ForRead);
foreach (ObjectId oid in btr)
{
if (oid.ObjectClass.DxfName == "TEXT")
{
DBText dbt = (DBText)transaction.GetObject(oid, OpenMode.ForRead);
if (dbt.Position == testpoint)
{
Do your work here...........
}
}
} 基本上这就是我试图完成的:有一个带有领导者的绘图(我不能修改绘图)。然后一旦我找到那些领导者,领导者的末尾就有文本。我需要找到那些元素(通常是一两个)。(这是我正在寻找的方法,它会找到离我通过它的点一定距离内的所有元素)。
{
//开始事务
使用(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
文本是引线注释的一部分吗
对不起,我现在没有时间做这件事,但是
我会查看注释/ObjectID,找到一种阅读其中包含的多行文字的方法
有很多leader代码的示例
哦等等!
这似乎是一个快速测试:
if (oid.ObjectClass.DxfName == "LEADER")
{
Leader ldr = (Leader)transaction.GetObject(oid, OpenMode.ForRead);
ObjectId AnnoId = ldr.Annotation;
if (!AnnoId.IsNull)
{
MText AnnoTxt = (MText)transaction.GetObject(AnnoId, OpenMode.ForRead);
editor.WriteMessage("Hello world: " + AnnoTxt.Text);
}
}
不,它不是一个领导者注释。它是一个独立的元素。这是我遇到的主要问题。有时它是两个独立的元素,这就是我需要在该特定点附近找到所有文本元素的原因。
这就是我要做的方式,使用带有文本/mtext(或任何东西)过滤器的窗口选择,定义您的“选择区域”矩形,并为区域内的每个项目完成您的工作。
编辑:
这是基本设置,查找文档以获取有关过滤器等的更多信息:
PromptSelectionResult res=editor.SelectWindow(btmLeftPoint, topRightPoint, select filter);
hth
米克。 米克,听起来是个好主意!此外,我正在尝试一种我发现的似乎很有前途的“哈弗森公式”:
http://www.stormconsultancy.co.uk/blog/development/code-snippets/the-haversine-formula-in-c-and-sql/
我可以通过在C#中创建两个列表来使用它,一个是引线对象,另一个是我正在寻找的文本对象。然后用一个for-each外部循环遍历所有的引线,一个foreach内部循环遍历文本(获得每个引线相对于引线的距离)。最后,通过上面链接中提到的linq,我能够检索到我需要的X个最接近的元素。 很酷,另一个选择可能是类似BSP(二进制空间划分)的东西来构建所有点的节点树,这样你可以在任何时候查询任何点,并非常快地找到它最近的邻居。 嗨,如果你有大量的文本点,你可以像MickD建议的那样,使用Point3dTree。这个类提供了一个对你有用的方法:NearestNeighbour它返回一个Point3dCollection,其中包含树中与输入点指定距离内的所有点。伪代码:遍历模型空间。
将找到的文本存储在字典中。
将找到的领导者存储在字典中。
使用文本集合构建Point3dTree实例Dictionary.Keys。
Foreach点Dictionary.Keys调用Point3dTree.NearestNeighbours()方法。
从字典中获取与返回点相关的DBText实体。
页:
[1]