Как стать автором
Обновить
280.9
Рейтинг

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

Блог компании Нанософт.NETCAD/CAM


В одной из прошлых статей мы рассказывали о том, как можно создавать пользовательские примитивы с помощью 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<McObjectId> ids = filter.GetObjects();
}


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

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";
}


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



Обсуждение статьи доступно также и на нашем форуме: forum.nanocad.ru/index.php?showtopic=6514.

Английская версия статьи: Selecting and editing custom entities in MultiCAD.NET.
Теги:.netapinanocadmulticad
Хабы: Блог компании Нанософт .NET CAD/CAM
Всего голосов 6: ↑6 и ↓0 +6
Просмотры2.6K

Похожие публикации

Лучшие публикации за сутки