是否可以发送一个字符串来执行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,即使有很多多边形被绘制,只有一个有效的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”或类似的东西,只要用户绘制它们就会将新对象返回给我?
答案 0 :(得分:3)
我认为您不需要所有代码,请尝试使用:
ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor.SelectLast()
哪个应该为您提供最后绘制或使用的实体。
这里有更多解释:
http://72.77.202.9/index.php?topic=20267.0
希望它有所帮助。