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

ADN Club => AutoCAD .NET API => Тема начата: Алексей (IdeaSoft) от 25-08-2016, 12:18:14

Название: Выборка динамических блоков чрез SelectionFilter
Отправлено: Алексей (IdeaSoft) от 25-08-2016, 12:18:14
Для выборки объектов в 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, а что-то другое?


 
Название: Re: Выборка динамических блоков чрез SelectionFilter
Отправлено: Александр Ривилис от 25-08-2016, 12:24:15
1) Для динамических блоков нужно использовать этот же параметр "INSERT" или другой?
Этот же.
может для динамического блока нужно передавать не Autodesk.AutoCAD.DatabaseServices.DxfCode.BlockName, а что-то другое?
А вот тут всё очень плохо. Я бы просто посоветовал бы не пользоваться выбором с фильтром для динамических блоков, а просто прошелся бы по всем примитивам и выбрал бы нужные динамические блоки. В противном случае нужно будет фильтровать не только по имени динамического блока, но и по именам всех анонимных блоков, которые порождаются этим динамическим блоком.
Почитай эту статью: Как найти все вставки динамического блока (http://adn-cis.org/kak-najti-vse-vstavki-dinamicheskogo-bloka.html)
Название: Re: Выборка динамических блоков чрез SelectionFilter
Отправлено: Алексей (IdeaSoft) от 25-08-2016, 12:33:04
Вот какую особенность заметил
Функция выбора примитивов по критериям отказывается выбирать
объекты вставок блоков именно с именами "GT_point_level" (это имя из предыдущей темы)

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

Думаю будет загружать если просто переименовать имя блока "GT_point_level" на другое имя.
такое я уже встречал и со слоями, переносишь объекты в другой слой и функция выборки работает.
Название: Re: Выборка динамических блоков чрез SelectionFilter
Отправлено: Александр Ривилис от 25-08-2016, 12:40:38
Функция выбора примитивов по критериям отказывается выбирать
объекты вставок блоков именно с именами "GT_point_level" (это имя из предыдущей темы)
Она и не должна выбирать, так как реальное имя у блока из той темы не "GT_point_level", а "*U7". Причем фильтровать по имени "*U7" нельзя, так как символ "*" заменят любые другие символы. Поэтому строка фильтра должна выглядеть как-то так: "GT_point_level,`*U7,`*U8,`*U9" (и т.д.)
Название: Re: Выборка динамических блоков чрез SelectionFilter
Отправлено: Алексей (IdeaSoft) от 25-08-2016, 12:54:09
"GT_point_level,`*U7,`*U8,`*U9"
На сколько я понял что бы игнорировать символ "*" заменяющего любой символ нужно
ставить одинарную ковычку перед *. Хорошо попробую так сделать.
Название: Re: Выборка динамических блоков чрез SelectionFilter
Отправлено: Александр Ривилис от 25-08-2016, 13:00:07
На сколько я понял что бы игнорировать символ "*" заменяющего любой символ нужно
ставить одинарную ковычку перед *.
Это не кавычка, а апостроф:

(https://adn-cis.org/forum/proxy.php?request=http%3A%2F%2Fimg-fotki.yandex.ru%2Fget%2F52790%2F7842324.7%2F0_13362e_75c3b0ea_orig.png&hash=57429c74d2b0297283e187335a93a9fb)

Просто скопируй этот символ из моего сообщения.
Название: Re: Выборка динамических блоков чрез SelectionFilter
Отправлено: Алексей (IdeaSoft) от 25-08-2016, 14:22:54
"GT_point_level,`*U7,`*U8,`*U9"
Спасибо БОЛЬШОЕ!!!
Выражение "GT_point_level,`*U7,`*U8,`*U9" для фильтра выборки помогло.
Название: Re: Выборка динамических блоков чрез SelectionFilter
Отправлено: Александр Ривилис от 25-08-2016, 14:25:44
Выражение "GT_point_level,`*U7,`*U8,`*U9" для фильтра выборки помогло.
Маленький нюанс. Там должны быть перечислены все (!!!) имена анонимных блоков, которые порождаются динамическим блоком.
Название: Re: Выборка динамических блоков чрез SelectionFilter
Отправлено: Александр Ривилис от 25-08-2016, 14:57:56
Из спортивного интереса написал такой код:
Код - 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
Название: Re: Выборка динамических блоков чрез SelectionFilter
Отправлено: Алексей (IdeaSoft) от 25-08-2016, 15:47:48
Ну да подходит.
Я тоже что-то подобное написал на VB.
Внёс коррективы в свои алгоритмы.
Все работает хорошо!
Слава форуму! Спасибо