Как выполнить фильтрацию с помощью FilterType и FilterData в методе Select для SelectionSet
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > .NET > Как выполнить фильтрацию с помощью FilterType и FilterData в методе Select для SelectionSet

Как выполнить фильтрацию с помощью FilterType и FilterData в методе Select для SelectionSet

Ответ
Поиск в этой теме
Непрочитано 26.03.2024, 17:34 #1
Как выполнить фильтрацию с помощью FilterType и FilterData в методе Select для SelectionSet
melisey
 
начинающий инженер-конструктор
 
Фрязино
Регистрация: 26.12.2021
Сообщений: 16

Мне нужно удалить объекты определённого типа (Text), лежащих на заданном слое.

Метод Select принимает несколько аргументов. ссылка
Методом тыка понял, что acSelectionSetAll соответствует цифре 5 (выбрать все объекты в чертеже).

Как сделать фильтрацию по типу объекта и имени слоя? У меня почему-то фильтры FilterType и FilterData игнорируются - удаляются все объекты в чертеже.

А если раскомментировать аргументы Point1 и Point2, то вылетает ошибка System.ArgumentException: "Недопустимый аргумент FilterType в Select". Почему?.. Что делаю не так?

Прилагаю код C# (WPF) и документ AutoCAD.

P.S. Для корректной работы приведённого ниже кода нужно, чтобы был открыт документ AutoCAD. Программу C# запускать только потом.


Код:
[Выделить все]
private void Button_Click_ClearLayerAutoCAD(object sender, RoutedEventArgs e)
 {
     ClearLayerAutoCAD("Text", "Anno_Positive");
    
 }

         // получили экземпляр программы AutoCAD
           dynamic app = GetApp(() => Marshal.GetActiveObject("AutoCAD.Application"));

        private void ClearLayerAutoCAD(string ObjectType, string NameLayer)
        {
  
            // создали переменную под будущий набор объектов
            dynamic mySelectionSet;
          
            // 0 - фильтрация по типу объекта
            // 8 - фильтрация по имени слоя
            int[] FilterType = new int[2] {0, 8 };
            string[] FilterData = new string[2] { ObjectType,  NameLayer };

            // массив из точек, определяющих начальную и конечные точки рамки выбора объектов
            double[] Point1= new double[3] { -500,-500,0};
            double[] Point2= new double[3] { 500,500,0};
           
            // очистили набор выбранных объектов
            while (app.ActiveDocument.SelectionSets.count>0)
            {
                app.ActiveDocument.SelectionSets.Item(0).Delete();
            }
            
            // добавили новый набор
            mySelectionSet = app.ActiveDocument.SelectionSets.Add("$NewOne$");

            // 5 - acSelectionSetAll
           mySelectionSet.Select(5,
                //Point1,
                //Point2,
                FilterType, FilterData);
                   
            //удаляем объекты из модели
            foreach (var entity in mySelectionSet)
            {
                entity.Delete();
            }
     
            
            // удаляем все наборы 
            DeleteSetsAutoCAD();
           

        }

        private void DeleteSetsAutoCAD()
        {

            while (app.ActiveDocument.SelectionSets.count > 0)
            {
                app.ActiveDocument.SelectionSets.Item(0).Delete();
            }
            

        }


    static object GetApp(Func<object> func)
    {

        if (func == null)
        {
            throw new ArgumentNullException(nameof(func));
        }
        else
        {
            object obj = func();
            return obj;
        }

    }

Вложения
Тип файла: dwg
DWG 2013
объекты в AutoCAD.dwg (50.1 Кб, 7 просмотров)


Последний раз редактировалось melisey, 26.03.2024 в 17:43. Причина: не компилировался код
Просмотров: 1829
 
Непрочитано 26.03.2024, 17:44
#2
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,611


Код:
[Выделить все]
      Db.TypedValue[] tv = new Db.TypedValue[4];
      tv.SetValue(new Db.TypedValue((int)Db.DxfCode.Operator, "<AND"), 0);
      //Фильтр по типу объекта
      tv.SetValue(new Db.TypedValue((int)Db.DxfCode.Start, "DBTEXT"), 1);
      //Фильтр по имени слоя
      tv.SetValue(new Db.TypedValue((int)Db.DxfCode.LayerName, "layerName"), 2);
      tv.SetValue(new Db.TypedValue((int)Db.DxfCode.Operator, "AND>"), 3);

      Ed.SelectionFilter sf = new Ed.SelectionFilter(tv);

      Ed.PromptSelectionResult psr = acEd.GetSelection(sf);
      if (psr.Status == Ed.PromptStatus.OK)
      {}
Хотя, если Вам нужно удалить ВСЕ тексты из модели, то это делается немного по другому...

ЗЫ.
Присмотрелся к Вашему коду и заметил, что Вы пишете используя COM , а я привел фрагмент кода для .NET API. Использование СОМ это сознательный выбор?

Последний раз редактировалось Boxa, 26.03.2024 в 17:59.
Boxa вне форума  
 
Автор темы   Непрочитано 27.03.2024, 09:51
#3
melisey

начинающий инженер-конструктор
 
Регистрация: 26.12.2021
Фрязино
Сообщений: 16


Цитата:
Сообщение от Boxa Посмотреть сообщение
Использование СОМ это сознательный выбор?
Boxa, скорее сознательный выбор, чем нет.
Слышал, что .net сборка предоставляет больше возможностей, чем COM. Но надо заставлять пользователя подгружать .net сборку своими ручками. Если бы можно было бы как-то подгружать .net сборку в AutoCAD без действий от пользователя, то было бы круто. Такое возможно?
melisey вне форума  
 
Непрочитано 27.03.2024, 09:58
1 | #4
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406


Возможно, вариантов масса. От написания пакета (Bundle) до экзотических типа написания / дополнения mnl-файлов.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 09.04.2024, 15:46
#5
melisey

начинающий инженер-конструктор
 
Регистрация: 26.12.2021
Фрязино
Сообщений: 16


Boxa, к сожалению, я не понимаю, могу ли я использовать ваш код у себя в COM-приложении. Вроде нет.

Есть ли возможность адаптировать его для COM?
Что не так с моим кодом?
melisey вне форума  
 
Непрочитано 09.04.2024, 17:06
#6
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от melisey Посмотреть сообщение
string[] FilterData = new string[2]
с чего вы решили, что тип данных должен быть строковый?
Сергей812 вне форума  
 
Автор темы   Непрочитано 09.04.2024, 19:08
#7
melisey

начинающий инженер-конструктор
 
Регистрация: 26.12.2021
Фрязино
Сообщений: 16


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
с чего вы решили, что тип данных должен быть строковый?
Уже не могу сказать, возможно где-то видел. Сейчас нашёл здесь указание, что тип данных для FilterType должен быть short, a для FilterData - object.

Так же вместо закомментированных строк Point1 и Point2 я теперь подаю null, код работает.
melisey вне форума  
 
Непрочитано 09.04.2024, 19:20
1 | 1 #8
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


TypeCode - это перечисление, т.е. целочисленное значения. А вот идущим вторым значение там может быть совершенно разное - число, строки, массив из трех байт (координаты точки) и т.д. Поэтому под него (значение) выделяется память в управляемой куче, а в метод передается только ссылка (это так называемая упаковка/boxing). А внутри самого кода акада произойдет обратный процесс - по ссылке из управляемой кучи будет получено исходное значение (так называемая распаковка/unboxing). Естественно, когда компилятор вместо ссылки (object) на управляемую кучу увидел строки - он очень удивился)
Сергей812 вне форума  
 
Непрочитано 09.04.2024, 22:47
1 | #9
Александр Ривилис

программист, рыцарь ObjectARX
 
Регистрация: 09.05.2005
Киев
Сообщений: 2,413
Отправить сообщение для Александр Ривилис с помощью Skype™


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
массив из трех байт (координаты точки)
Опечатка?
Александр Ривилис вне форума  
 
Непрочитано 10.04.2024, 09:20
#10
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 11,499


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
Опечатка?
она самая, спасибо) Массив из трех вещественных чисел, конечно.
Сергей812 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > .NET > Как выполнить фильтрацию с помощью FilterType и FilterData в методе Select для SelectionSet

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как выполнить развертку пластин в tekla 2023? ALEX-LCL Tekla 2 27.11.2024 18:38
Как правильно выполнить теплотехнический расчет окна Astap113 Архитектура 6 10.06.2024 16:02
Как с помощью Lisp выполнить перемещение блока с изменением трассировки ортогональных полилиний присоединенных к блоку? alex_50 LISP 3 10.03.2022 10:42
Как выполнить поиск обьектов в выбранном наборе AutoCAD через Visual Basic .Net Александр_2508 .NET 1 04.07.2015 15:40
Можно ли выполнить проверку слабых слоёв основания и подстилающих слоёв в ФОК ПК ПАРУС? МишаИнженер Расчетные программы 10 03.10.2011 14:07