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

Надеюсь, поможет.

Другие вопросы по тегам