![](http://habr.habrastorage.org/post_images/738/9bb/e51/7389bbe51333eb99e4dc1f83bb00d2f3.png)
В одной из прошлых статей мы рассказывали о том, как можно создавать пользовательские примитивы с помощью 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/
Добавить комментарий