1

是否可以发送一个字符串来执行 Map 并找出用户以更简单的方式绘制了哪些对象?我觉得我做的事情太多了……

这是命令:

    acad.DocumentManager.MdiActiveDocument.SendStringToExecute
("_MPOLYGON ", false, false, true);

到目前为止,我所做的是订阅对象附加事件和命令结束事件,然后调用 sendStringToExecute 并从那里检查数据库中的所有新对象并保留对我找到的对象的引用用户已绘制。

所以首先:

    HostApplicationServices.WorkingDatabase.ObjectAppended += 
new ObjectEventHandler(activeDB_ObjectAppended);

    acad.DocumentManager.MdiActiveDocument.CommandEnded += 
new CommandEventHandler(MdiActiveDocument_CommandEnded);

命令执行时:

void activeDB_ObjectAppended(object sender, ObjectEventArgs e)
        {
            polyDessinIds.Add(e.DBObject.Id);
        }

Autocad 在执行 _MPOLYGON 命令时将对象添加到数据库中,因此我保留了对所有对象的引用。AutoCAD 在用户绘图时将点和线添加到数据库中。例如,对于一行的第一次和第二次单击似乎已放入数据库中。此外,当将多边形添加到工作数据库时,并不意味着它是最后一个。最后添加的对象也不保证是真实对象。

然后当命令结束时,我会寻找正确的 objectId,即使绘制了很多多边形,也只有 1 个有效的 objectId 引用了一个或多个绘制的多边形。

 foreach (ObjectId obj in polyDessinIds)
 {
            if (obj.IsErased == false && obj.ObjectClass.Name == "AcDbMPolygon")
            {
             mPolygons = obj;
             //there should be only one valid at this point
             break;
            }
 }

我想知道是否有更好,更可靠的方法来做到这一点?可能类似于当您提示选择对象时,这会返回一个包含所有对象的选择集。有没有一种方法可以“promptForPolygon”或类似的方法,一旦用户绘制它们就会返回我新的对象?

4

1 回答 1

3

我认为您不需要所有这些代码,请尝试使用:

ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor.SelectLast()

哪个应该给你最后一个绘制或使用的实体。

这里有更多解释:

http://72.77.202.9/index.php?topic=20267.0

希望能帮助到你。

于 2012-11-27T14:06:28.937 回答