阅读修改过的对象

时间:2017-11-17 12:49:32

标签: c# autocad autocad-plugin

如何获取最近修改过的对象的ObjectId? 我在绘图中添加了一些折线。每一个都是一样的。当一个修改另一个时,它们也必须调整为更改。我需要从需要更新的对象列表中排除我刚刚修改过的对象。我找不到答案。

实施例: 我有一些折线。创建它们时,会添加一个事件处理程序(每个对象的ObjectId都添加到NOD)。在修改其中一个时,分配给修改的函数将遍历存储在NOD中的所有对象。当长度改变时,其他对象也必须这样做。最初我想这样做,其余部分将被移除并替换为对象的修改副本。

这里我需要访问最后修改过的对象,以便在修改其他折线时能够跳过它。目前,该计划结束,我认为这是一个问题,因为我正在尝试将折线转换为同一个。

1 个答案:

答案 0 :(得分:0)

如果我正确理解您的问题,您需要的是动态排除列表。 Hashset<ObjectID>实例将为您提供良好的服务,因为ObjectID是一个结构(即值类型)。 See this tutorial

  

HashSet是一个包含唯一元素的无序集合。我们可以在HashSet上应用各种操作,如Add,Remove,Contains等。

一旦用户修改折线,我假设某个事件触发您的流程继续并修改您的NOD中的所有其他折线。要使用排除列表,请将包含命令方法的类添加私有字段

private static HashSet<ObjectId> exclusionList = new HashSet<ObjectId>();

请务必立即将用户修改的折线的ObjectID添加到exclusionList

exclusionList.Add(modifiedObjectID);

如果列表不包含您尝试添加的objectID,则Add()方法返回true,并将其添加到集合中。如果集合已经包含ObjectID,它将返回false。 这是解决问题的关键。您可以将每个实体添加到排除集中,以便每个实体每个周期只修改一次。此外,因为您已经将原始折线的ObjectID添加到集合中,所以它永远不会在循环中被修改。循环结束后,清除列表并等待下次用户修改实体。

在循环通过MOD的循环中,执行以下操作:

public void ProcessEntities()
{
    foreach(DBDictionaryEntry obj in MyNOD)
    {
        //Add each objectID to your exclusion List
        //if it's already there, everything inside the if statement is skipped!
        if(exclusionList.Add(obj.Value))
        {
             //do your object modification here
        }
    }

    //All entities have been processed now
    //clear the list and wait for the next event
    exclusionList.Clear();
}