Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Atomohod от 04-06-2018, 22:05:19

Название: Как произвести поиск по части названия?
Отправлено: Atomohod от 04-06-2018, 22:05:19
Здравствуйте!

Можно ли задать проверку части имени блока на соответствие некоему заранее определенному имени? Операция похожая на поиск с подстановочными знаками типа *. Я пытался использовать ту же звездочку и ?. Выдает ошибку.

Например, есть два блока с названием Block Primary и Block Secondary. Помимо них в чертеже есть и другие блоки с другими названиями. Нужно подсчитать суммарное количество блоков начинающихся с Block.
Название: Re: Как произвести поиск по части названия?
Отправлено: Александр Ривилис от 04-06-2018, 22:12:42
Код - C# [Выбрать]
  1. int nBlock = 0;
  2. string blockName = "Block Primary";
  3. if (Autodesk.AutoCAD.Internal.Utils.WcMatchEx("Block*", blockName, true))
  4. {
  5.   nBlock++;
  6. }
Но учти, что вставки динамических блоков могут иметь имя типа "*Unnn" и нужно сначала найти имя основного блока.
Название: Re: Как произвести поиск по части названия?
Отправлено: Atomohod от 04-06-2018, 22:24:17
Спасибо! Динамических блоков у меня нет, только обычные с атрибутами.
А нужно ли открывать новую транзакцию и производить поиск внутри нее или достаточно определить метод внутри основной транзакции исполнения команды? Немного поясню. Смысл моей основной задачи в том, что нужно вставлять определенный блок, проверять количество уже вставленных в чертеж таких блоков и присваивать следующий по порядку номер и записывать его атрибут вставляемого блока. Вставка блока производится тоже командой.
Название: Re: Как произвести поиск по части названия?
Отправлено: Александр Ривилис от 04-06-2018, 22:29:50
Смысл моей основной задачи в том, что нужно вставлять определенный блок, проверять количество уже вставленных в чертеж таких блоков и присваивать следующий по порядку номер и записывать его атрибут вставляемого блока.
1. Ты сейчас говоришь о вставке блока (BlockReference) или об определении блока (BlockTableRecord)?
2. Если разговор идёт о вставке блока, то тогда тебе нужно каждый раз сканировать весь чертеж, чтобы найти все вставки этого блока, что очень расточительно по времени. Если речь об определении блока, то просканировать таблицу блоков несложно, хотя я бы делал не так. Можно подписаться на событие добавления вставки блока и таким образом в момент вставки блока уже знать их количество. Тогда и сканировать ничего не нужно.
3. В принципе это всё можно сделать и в одной транзакции.
Название: Re: Как произвести поиск по части названия?
Отправлено: Александр Ривилис от 04-06-2018, 22:33:52
А нужно ли открывать новую транзакцию...
У нас действует принцип "один вопрос - одна тема". Этот вопрос к вопросу этой темы не имеет никакого отношения.
Название: Re: Как произвести поиск по части названия?
Отправлено: Atomohod от 04-06-2018, 22:52:55
Я для себя представлял задачу так:
1 Создаю транзакцию
2 Определяю геометрию и добавляю ее в BlockTableRecord и в транзакцию
3 Определяю AttributeDefinition добавляю его в BlockTableRecord и в транзакцию
4 Добавляю BlockTableRecord в BlockTable и в транзакцию
5 Получаю ObjectId для BlockTableRecord
6 Вставляю как BlockReference
7 После вставки произвожу подсчет уже вставленных блоков и в атрибут только что вставленного блока записываю его текущий номер с учетом предшественников.

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