C# Autocad Map 3D 2012 получить нарисованный пользователем объект
Можно ли отправить строку для выполнения в 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" или что-то подобное, что просто вернет мне новые объекты, как только пользователь их нарисовал?
1 ответ
Я не думаю, что вам нужен весь этот код, попробуйте поиграть с:
ApplicationServices.Application.DocumentManager.MdiActiveDocument.Editor.SelectLast()
Который должен дать вам последний нарисованный или использованный объект.
Еще несколько объяснений здесь:
http://72.77.202.9/index.php?topic=20267.0
Надеюсь, поможет.