Выборка динамических блоков чрез SelectionFilter

Автор Тема: Выборка динамических блоков чрез SelectionFilter  (Прочитано 8857 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Для выборки объектов в SelectionSet
в объект фильтра передаю аргумент "INSERT" для выборки вставок блоков

Два вопроса:

1) Для динамических блоков нужно использовать этот же параметр "INSERT" или другой?

2) в создании фильтра выбора передаю Autodesk.AutoCAD.DatabaseServices.DxfCode.BlockName

Код - vb.net [Выбрать]
  1.      Autodesk.AutoCAD.DatabaseServices.TypedValue(Autodesk.AutoCAD.DatabaseServices.DxfCode.BlockName, "MyBlockName")
  2.  
     может для динамического блока нужно передавать не Autodesk.AutoCAD.DatabaseServices.DxfCode.BlockName, а что-то другое?


 

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
1) Для динамических блоков нужно использовать этот же параметр "INSERT" или другой?
Этот же.
может для динамического блока нужно передавать не Autodesk.AutoCAD.DatabaseServices.DxfCode.BlockName, а что-то другое?
А вот тут всё очень плохо. Я бы просто посоветовал бы не пользоваться выбором с фильтром для динамических блоков, а просто прошелся бы по всем примитивам и выбрал бы нужные динамические блоки. В противном случае нужно будет фильтровать не только по имени динамического блока, но и по именам всех анонимных блоков, которые порождаются этим динамическим блоком.
Почитай эту статью: Как найти все вставки динамического блока
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Вот какую особенность заметил
Функция выбора примитивов по критериям отказывается выбирать
объекты вставок блоков именно с именами "GT_point_level" (это имя из предыдущей темы)

Когда я делаю копию определения блока с другим именем то все работает хорошо.

Думаю будет загружать если просто переименовать имя блока "GT_point_level" на другое имя.
такое я уже встречал и со слоями, переносишь объекты в другой слой и функция выборки работает.

Отмечено как Решение Алексей (IdeaSoft) 25-08-2016, 14:21:48

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Функция выбора примитивов по критериям отказывается выбирать
объекты вставок блоков именно с именами "GT_point_level" (это имя из предыдущей темы)
Она и не должна выбирать, так как реальное имя у блока из той темы не "GT_point_level", а "*U7". Причем фильтровать по имени "*U7" нельзя, так как символ "*" заменят любые другие символы. Поэтому строка фильтра должна выглядеть как-то так: "GT_point_level,`*U7,`*U8,`*U9" (и т.д.)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
"GT_point_level,`*U7,`*U8,`*U9"
На сколько я понял что бы игнорировать символ "*" заменяющего любой символ нужно
ставить одинарную ковычку перед *. Хорошо попробую так сделать.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
На сколько я понял что бы игнорировать символ "*" заменяющего любой символ нужно
ставить одинарную ковычку перед *.
Это не кавычка, а апостроф:



Просто скопируй этот символ из моего сообщения.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
"GT_point_level,`*U7,`*U8,`*U9"
Спасибо БОЛЬШОЕ!!!
Выражение "GT_point_level,`*U7,`*U8,`*U9" для фильтра выборки помогло.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Выражение "GT_point_level,`*U7,`*U8,`*U9" для фильтра выборки помогло.
Маленький нюанс. Там должны быть перечислены все (!!!) имена анонимных блоков, которые порождаются динамическим блоком.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Из спортивного интереса написал такой код:
Код - C# [Выбрать]
  1. using System;
  2. using Autodesk.AutoCAD.Runtime;
  3. using Autodesk.AutoCAD.ApplicationServices;
  4. using Autodesk.AutoCAD.DatabaseServices;
  5. using Autodesk.AutoCAD.Geometry;
  6. using Autodesk.AutoCAD.EditorInput;
  7.  
  8. // This line is not mandatory, but improves loading performances
  9. [assembly: CommandClass(typeof(GetBlockName.MyCommands))]
  10.  
  11. namespace GetBlockName
  12. {
  13.  
  14.   public class MyCommands
  15.   {
  16.     [CommandMethod("blockName")]
  17.     static public void blockName()
  18.     {
  19.       Document doc = Application.DocumentManager.MdiActiveDocument;
  20.       Database db = doc.Database;
  21.       Editor ed = doc.Editor;
  22.  
  23.       PromptEntityOptions options =
  24.                new PromptEntityOptions("\nУкажите вставку блока для получения строки фильтра: ");
  25.       options.SetRejectMessage("\nДопустима только вставка блока ");
  26.       options.AddAllowedClass(typeof(BlockReference), false);
  27.       PromptEntityResult acSSPrompt = ed.GetEntity(options);
  28.       string filterstr = "";
  29.       using (Transaction tx =  db.TransactionManager.StartTransaction()) {
  30.         BlockReference blockRef = tx.GetObject(acSSPrompt.ObjectId,
  31.                                OpenMode.ForRead) as BlockReference;
  32.  
  33.         ObjectId btrMainId = blockRef.DynamicBlockTableRecord;
  34.         if (btrMainId.IsNull) btrMainId = blockRef.BlockTableRecord;
  35.  
  36.         BlockTableRecord btrMain = tx.GetObject(btrMainId,  OpenMode.ForRead) as BlockTableRecord;
  37.         filterstr = btrMain.Name;
  38.         foreach (ObjectId idAnno in btrMain.GetAnonymousBlockIds())
  39.         {
  40.           BlockTableRecord btrAnno = tx.GetObject(idAnno, OpenMode.ForRead) as BlockTableRecord;
  41.           filterstr += ",`";
  42.           filterstr += btrAnno.Name;
  43.         }
  44.  
  45.         ed.WriteMessage("\nСтрока фильтра: " + filterstr);
  46.         tx.Commit();
  47.       }
  48.     }
  49.   }
  50. }

Результат работы команды blockName для твоего чертежа:

Цитировать
Command: BLOCKNAME

Укажите вставку блока для получения строки фильтра:
Строка фильтра: GT_point_level,`*U2,`*U3
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей (IdeaSoft)Автор темы

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
Ну да подходит.
Я тоже что-то подобное написал на VB.
Внёс коррективы в свои алгоритмы.
Все работает хорошо!
Слава форуму! Спасибо