Выбор и редактирование пользовательских примитивов в MultiCAD.NET

от автора

В одной из прошлых статей мы рассказывали о том, как можно создавать пользовательские примитивы с помощью MultiCAD.NET API, взяв за основу пример CustomObjects из SDK. В этой статье мы уделим внимание процедуре поиска и выбора пользовательских объектов и расширим имеющийся пример, добавив возможность выбора одного или нескольких примитивов с помощью инструментария MultiCAD.NET для последующего редактирования. Подробности — под катом.

Итак, мы имеем пользовательский примитив, представляющий собой прямоугольную рамку с текстовой строкой внутри. Давайте рассмотрим задачу выбора нескольких объектов на чертеже и поменяем текст в каждом из выбранных примитивов.

Для выбора одного объекта на чертеже в MultiCAD.NET используется метод менеджера объектов SelectObject():

public static McObjectId SelectObject(string sPromt); public static McObjectId SelectObject(string sPromt, ref Point3d pnt); 

Оба варианта позволяют пользователю выбрать объект, выводя при этом подсказку в командную строку. Второй метод, кроме строки подсказки, содержит также параметр — точку, в которой был произведен клик.

Для выбора нескольких объектов используется метод SelectObjects():

public static List SelectObjects(ObjectFilter filter); public static McObjectId[] SelectObjects(string sPromt); 

Первый вариант используется для выбора объектов чертежа по заданному фильтру, второй — выводит подсказку в консоль и позволяет пользователю самому выбирать объекты.

В качестве фильтра выступает объект класса ObjectFilter, который определяет критерии выбора объектов: документы, слои, листы, на которых будет производиться поиск объектов заданного типа. Например, в следующем примере по команде SelectCircles будет получен список объектов типа «окружность», которые находятся на текущем листе и пересекают заданную прямоугольную область:

[CommandMethod("SelectCircles", CommandFlags.NoCheck | CommandFlags.NoPrefix)] static public void SelectCirclesCmd() {   ObjectFilter filter = ObjectFilter.Create(true).AddType(DbCircle.TypeID);   filter.Bound = new BoundBlock(Point3d.Origin,                                  new Vector3d(10, 0, 0),                                  new Vector3d(0, 10, 0),                                  new Vector3d(0, 0, 10));   List ids = McObjectManager.SelectObjects(filter); } 

Для выбора всех окружностей на чертеже (не только на текущем листе) следует добавить документ чертежа в качестве области поиска:

ObjectFilter filter = ObjectFilter.Create(false).SetCurentDocument().AddType(DbCircle.TypeID); 

Зарегистрируем новую команду TextInBoxEdit и добавим возможность пользовательского выбора объектов. Затем из всего набора выбранных объектов выделим только пользовательские примитивы типа TextInBox:

[CommandMethod("TextInBoxEdit", CommandFlags.NoCheck | CommandFlags.NoPrefix)] static public void TextInBoxEditCmd() {   McObjectId[] idSelecteds = McObjectManager.SelectObjects("Select TextInBox primitives to edit");   McObjectId[] idSelectedTextinBox = Array.FindAll(idSelecteds, (s => (s.GetObject()) is TextInBox)); } 

В случае, если хотя бы один из примитивов был выбран, для каждого из них зададим новое значение свойству Text:

if (idSelectedTextinBox == null || idSelectedTextinBox.Length == 0) {   MessageBox.Show("No TextInBox primitives selected!");   return; }             		 foreach (McObjectId currID in idSelectedTextinBox) {   (currID.GetObject() as TextInBox).Text = "Changed text"; } 

Таким образом, текст будет заменен во всех выбранных примитивах.

ссылка на оригинал статьи http://habrahabr.ru/company/nanosoft/blog/200366/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *