c#Autocad Map 3D 2012获取用户绘制的对象

c#Autocad Map 3D 2012获取用户绘制的对象,c#,.net,autocad,objectarx,C#,.net,Autocad,Objectarx,是否可以发送一个字符串来执行映射,并找出用户以更简单的方式绘制的对象?我觉得我做的太多了 这是命令: acad.DocumentManager.MdiActiveDocument.SendStringToExecute ("_MPOLYGON ", false, false, true); 现在,我要做的是订阅object Added事件和command ended事件,然后调用sendStringToExecute,然后检查数据库中的所有新对象,并保留对用户绘制的对象的引用 因此,首

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

这是命令:

    acad.DocumentManager.MdiActiveDocument.SendStringToExecute
("_MPOLYGON ", false, false, true);
现在,我要做的是订阅object Added事件和command ended事件,然后调用sendStringToExecute,然后检查数据库中的所有新对象,并保留对用户绘制的对象的引用

因此,首先:

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

执行命令时:

void activeDB_ObjectAppended(object sender, ObjectEventArgs e)
        {
            polyDessinIds.Add(e.DBObject.Id);
        }
Autocad在执行_MPOLYGON命令时将对象添加到数据库中,因此我保留了对所有对象的引用。用户绘图时,Autocad会将点和线添加到数据库中。例如,第一次和第二次单击该行似乎会将其放入数据库中。此外,将多边形添加到工作数据库时,并不意味着它是最后一个多边形。最后添加的对象也不能保证是真实对象

然后,当命令结束时,我会查找正确的objectId,即使绘制了许多多边形,也只有一个有效的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”或类似的东西,在用户绘制完新对象后将其返回给我?

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

ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor.SelectLast()
这将为您提供最后绘制或使用的图元

这里有更多的解释:

http://72.77.202.9/index.php?topic=20267.0
希望能有帮助

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