当多个块具有相同名称时搜索特定块

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