当多个块具有相同名称时搜索特定块
Searching for a specific block when multiple blocks have the same name
美好的一天,
我遇到了以下问题:c# 程序将 10 个块(通过矩阵变换方法)插入绘图中的各个不同点,提示用户进行识别。
这些块在名称和属性方面都是相同的,唯一不同的是它们的 X 和 Y 值。
我需要一种方法来在用户提示时更改某些块的属性,例如块 7 并且仅更改块 7。不更改其他 9 个相同块的同名属性。
有没有办法扫描所有块并根据它们的 X 和 Y 值找到一个块?然后编辑该特定块的属性。
编辑:
我用下面的方法代码添加了方块,路径图只包含那个方块。
我现在需要做的是更改该块的文本属性,这意味着我需要我的代码才能找到它。我考虑过使用 selection 方法,但我更愿意将这部分代码自动化,而不希望用户必须 select 所需的块。
我可以让代码扫描所有块以查找具有该特定名称的块,然后再次扫描这些块以查找所需 X 和 Y 插入点位置处的块(这可能吗?)(我的程序处理之前的 X 和 Y 位置因此我知道这些点,不需要用户再次给他们)。为了方便起见,称它们为 BlkPt1 - BlkPt10。
但是扫描所有块的方法在包含许多块的较大图形上可能有点紧张,有没有更短的方法来执行此操作?我知道一种解决方案是改变我插入块的方式,但我真的很讨厌通常的 blockreference / blocktablerecord 插入方法。没有别的办法吗?
using (tr)
{
Vector3d blockDisplacement1 = new Vector3d(ptInsert.Value.X, ptInsert.Value.Y, ptInsert.Value.Z);
double blockScale = 1.0;
string blockPath = @"T:\test.dwg";
Database tmpDb = new Database(false, true);
tmpDb.ReadDwgFile(blockPath, System.IO.FileShare.Read, true, "");
Matrix3d Transform = Matrix3d
.Scaling(blockScale, Point3d.Origin)
.PreMultiplyBy(Matrix3d.Displacement(blockDisplacement1))
.PreMultiplyBy(ed.CurrentUserCoordinateSystem);
db.Insert(Transform, tmpDb, true);
tr.Commit();
tr.Dispose();
}
}
跟踪插入后分配给块的 .Handle
- 这是 AutoCAD 数据库中对象的唯一标识符。它只对那个特定的数据库是唯一的,它不是全局唯一的。不要尝试使用 .ObjectId
来跟踪它,它会在会话之间发生变化,.Handle
是一致的。
确保您要更改的 AttributeReference
不是 .Constant
,因为对于 BlockDefinition
.
的每个引用都是相同的
tr.Dispose();
在 using () {}
语句中不是必需的,只需 tr.Commit();
即可。
有关 AutoCAD 代码内容的更多链接,请参阅 Wiki。
美好的一天,
我遇到了以下问题:c# 程序将 10 个块(通过矩阵变换方法)插入绘图中的各个不同点,提示用户进行识别。
这些块在名称和属性方面都是相同的,唯一不同的是它们的 X 和 Y 值。
我需要一种方法来在用户提示时更改某些块的属性,例如块 7 并且仅更改块 7。不更改其他 9 个相同块的同名属性。
有没有办法扫描所有块并根据它们的 X 和 Y 值找到一个块?然后编辑该特定块的属性。
编辑:
我用下面的方法代码添加了方块,路径图只包含那个方块。
我现在需要做的是更改该块的文本属性,这意味着我需要我的代码才能找到它。我考虑过使用 selection 方法,但我更愿意将这部分代码自动化,而不希望用户必须 select 所需的块。
我可以让代码扫描所有块以查找具有该特定名称的块,然后再次扫描这些块以查找所需 X 和 Y 插入点位置处的块(这可能吗?)(我的程序处理之前的 X 和 Y 位置因此我知道这些点,不需要用户再次给他们)。为了方便起见,称它们为 BlkPt1 - BlkPt10。
但是扫描所有块的方法在包含许多块的较大图形上可能有点紧张,有没有更短的方法来执行此操作?我知道一种解决方案是改变我插入块的方式,但我真的很讨厌通常的 blockreference / blocktablerecord 插入方法。没有别的办法吗?
using (tr)
{
Vector3d blockDisplacement1 = new Vector3d(ptInsert.Value.X, ptInsert.Value.Y, ptInsert.Value.Z);
double blockScale = 1.0;
string blockPath = @"T:\test.dwg";
Database tmpDb = new Database(false, true);
tmpDb.ReadDwgFile(blockPath, System.IO.FileShare.Read, true, "");
Matrix3d Transform = Matrix3d
.Scaling(blockScale, Point3d.Origin)
.PreMultiplyBy(Matrix3d.Displacement(blockDisplacement1))
.PreMultiplyBy(ed.CurrentUserCoordinateSystem);
db.Insert(Transform, tmpDb, true);
tr.Commit();
tr.Dispose();
}
}
跟踪插入后分配给块的 .Handle
- 这是 AutoCAD 数据库中对象的唯一标识符。它只对那个特定的数据库是唯一的,它不是全局唯一的。不要尝试使用 .ObjectId
来跟踪它,它会在会话之间发生变化,.Handle
是一致的。
确保您要更改的 AttributeReference
不是 .Constant
,因为对于 BlockDefinition
.
tr.Dispose();
在 using () {}
语句中不是必需的,只需 tr.Commit();
即可。
有关 AutoCAD 代码内容的更多链接,请参阅 Wiki。