【问题标题】:Searching for a specific block when multiple blocks have the same name当多个块具有相同名称时搜索特定块
【发布时间】:2015-04-24 21:12:07
【问题描述】:

美好的一天,

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

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

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

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

编辑:

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

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

我可以让代码扫描所有块以查找具有该特定名称的块,然后再次扫描这些块以查找所需 X 和 Y 插入点位置的块(这可能吗?)(我的程序处理 X和 Y 位置更早,因此我知道这些点,不需要用户再次给它们)。为方便起见,称它们为 BlkPt1 - BlkPt10。

但是扫描所有块的方法在有很多块的大型图纸上可能有点密集,有没有更短的方法?我知道一种解决方案是改变插入块的方式,但我真的很讨厌通常的块引用/块表记录插入方法。没有别的办法吗?

    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();
    }
}

【问题讨论】:

  • 看看这里,我想你只需要改变选择提示符就可以满足你的需要。 through-the-interface.typepad.com/through_the_interface/2006/09/…
  • 您使用的是 COM 包装器还是标准引用?我可以发布一堆代码,但它会放弃商店。如果您可以发布您所拥有的,也许我可以为您指明正确的方向。

标签: c# .net autocad


【解决方案1】:

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

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

tr.Dispose();using () {} 语句中不是必需的,只需tr.Commit(); 即可。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多