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

时间:2015-03-20 14:37:32

标签: c# .net autocad

美好的一天,

我遇到的问题是c#程序在提示用户识别的各个不同点上将10个块(通过矩阵变换方法)插入到图形上。

这些块在名称和属性方面是相同的,唯一不同的是它们的X和Y值。

我需要一种方法来在用户提示符下更改某些块的属性,例如块7和仅块7.而不更改其他9个相同块的相同命名属性。

有没有办法扫描所有块并根据其X和Y值找到一个块?然后编辑该特定块的属性。

编辑:

我使用下面的方法代码添加了块,路径图只包含那个块。

我现在需要做的是更改该块的文本属性,这意味着我需要我的代码才能找到它。我考虑使用选择方法,但我更愿意将这部分代码自动化,而不是让用户不必选择所需的块。

我可以让代码扫描该特定名称的块的所有块,然后在所需的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();
    }
}

1 个答案:

答案 0 :(得分:0)

跟踪插入后分配给块的.Handle - 这是AutoCAD数据库中对象的唯一标识符。它仅对该特定数据库是唯一的,它不是全局唯一的。请勿尝试使用.ObjectId来跟踪此情况,它会在会话之间发生变化,.Handle是一致的。

确保您要更改的AttributeReference不是.Constant,因为对BlockDefinition的每次引用都相同。

tr.Dispose();声明中不需要{p> using () {},只需tr.Commit();即可。

有关AutoCAD代码的更多链接,请参阅Wiki