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

ADN Club => AutoCAD .NET API => Тема начата: Максим Маркевич от 17-12-2016, 03:45:52

Название: Не работает selection filter для вхождений блоков с заданным именем
Отправлено: Максим Маркевич от 17-12-2016, 03:45:52
Всем привет. Тема достаточно раскрыта на просторах интернета, тем не менее, у меня (AutoCAD 2017x64) не работает фильтр "двойной" для вхождений блоков с заданным именем:
Код - C# [Выбрать]
  1. // Переменная для фильтра
  2. TypedValue[] filterlist = new TypedValue[2];
  3.  
  4. // Критерии фильтра
  5. filterlist[0] = new TypedValue(0, "INSERT");
  6. filterlist[1] = new TypedValue(2, blockName2);
  7.  
  8. // Создаем сам фильтр
  9. SelectionFilter filter = new SelectionFilter(filterlist);
  10.  
  11. // Выборка
  12. var selection = ed.SelectAll(filter);
  13.     if (selection.Status != PromptStatus.OK) return;
Думал, что где-то ошибка у меня, но потом нашел похожую тему (http://adndevblog.typepad.com/autocad/2012/05/block-reference-selection-using-selection-filter.html) на авторитетном ресурсе. Данный программный код у меня также не срабатывает.
В режиме отладки можно наблюдать следующее:
Код - Auto/Visual Lisp [Выбрать]
  1. selection
  2. {(Error,)}
  3.     Status: Error
  4.     Value: null
Может, кто-то сталкивался? Есть какие-то мысли? Заранее, спасибо за помощь!
Название: Re: Не работает selection filter для вхождений блоков с заданным именем
Отправлено: Андрей Бушман от 17-12-2016, 11:33:38
А почему только три копии темы? Давай еще!
Название: Re: Не работает selection filter для вхождений блоков с заданным именем
Отправлено: Максим Маркевич от 17-12-2016, 11:41:26
А почему только три копии темы? Давай еще!
Что-то ночью странное с форумом творилось. :( К сожалению, сейчас не могу исправить - не могу удалить, нет таких полномочий. При попытке создать тему выбрасывало ошибку c SQL, я откатывал в браузере назад, снова пытался создать. При этом загружал страницу с темами параллельно и свою там не видел. В общем, жесть какая-то.
Как только вчера это произошло, написал в ЛС Александру Наумовичу в надежде, что он поправит, но, видимо, его еще не было.
А ты думаешь я спецом создал три темы, чтобы мне быстрей ответили?
Название: Re: Не работает selection filter для вхождений блоков с заданным именем
Отправлено: Андрей Бушман от 17-12-2016, 12:36:29
А ты думаешь я спецом создал три темы, чтобы мне быстрей ответили?
Да, т.к. увидел, что между созданием каждой дублируемой темы прошло некоторое время (т.е. не были созданы сразу одна за одной, что могло бы походить на глюк сайта). :)
Название: Re: Не работает selection filter для вхождений блоков с заданным именем
Отправлено: Максим Маркевич от 17-12-2016, 12:55:20
Да, т.к. увидел, что между созданием каждой дублируемой темы прошло некоторое время (т.е. не были созданы сразу одна за одной, что могло бы походить на глюк сайта).
Прошло около 30 секунд, которое "думал" сайт, прежде чем выдать ошибку.
Кстати, у меня периодически вот такие вещи случаются:
(https://s23.postimg.org/8h27k0fzr/Screen_Shot.png) (https://postimg.org/image/8h27k0fzr/)
Понятия не имею, с чем они связаны.
Андрей Бушман, ты бы мне лучше насчет фильтра подсказал :)
Off-Topic: показать
А то наш диалог не конструктивен - я бы не стал создавать 3 темы, чтобы мне быстрей ответили, очевидно же. ) И также очевиден тот факт, что темы создавать на форуме умею - уже несколько раз делал подобное. Плюс, я не пью и не употребляю никаких веществ, которые могли бы привести к созданию 3х одинаковых тем.
Название: Re: Не работает selection filter для вхождений блоков с заданным именем
Отправлено: Андрей Бушман от 17-12-2016, 14:27:28
Кстати, у меня периодически вот такие вещи случаются:
Знакомая картинка. Регулярно наблюдаю её на этом форуме (когда заглядываю) с некоторых пор.
ты бы мне лучше насчет фильтра подсказал :)
С ходу так не подскажу, т.к. давно уже не писал под AutoCAD. Забывается постепенно... По части фильтров, я помню, что когда создавал их в процессе работы в AutoCAD руками (т.е. не программно), то там было важно дополнительно использовать логические операторы AND, OR и скобки (если мне не изменяет память), т.к. в противном случае в выборку не попадало ничего.
Название: Re: Не работает selection filter для вхождений блоков с заданным именем
Отправлено: Александр Ривилис от 17-12-2016, 14:33:12
1. Дубли удалил.
2. Блок динамический? Если да, то фильтр и не должен работать.

Как найти все вставки динамического блока (http://adn-cis.org/kak-najti-vse-vstavki-dinamicheskogo-bloka.html)
Название: Re: Не работает selection filter для вхождений блоков с заданным именем
Отправлено: Максим Маркевич от 17-12-2016, 15:48:05
С ходу так не подскажу, т.к. давно уже не писал под AutoCAD. Забывается постепенно... По части фильтров, я помню, что когда создавал их в процессе работы в AutoCAD руками (т.е. не программно), то там было важно дополнительно использовать логические операторы AND, OR и скобки (если мне не изменяет память), т.к. в противном случае в выборку не попадало ничего.
Ну это в случае сложных фильтров, у меня все примитивно.
1. Дубли удалил.
Спасибо. Еще раз извиняюсь.
2. Блок динамический? Если да, то фильтр и не должен работать.
Блин. Вот же ж. Не работает из-за анонимных блоков?
Статейку видел, просто посчитал решение с фильтрами более изящным.
Название: Re: Не работает selection filter для вхождений блоков с заданным именем
Отправлено: Александр Ривилис от 17-12-2016, 16:47:20
Цитата: Александр Ривилис от 17-12-2016, 13:33:12

    2. Блок динамический? Если да, то фильтр и не должен работать.

Блин. Вот же ж. Не работает из-за анонимных блоков?
Статейку видел, просто посчитал решение с фильтрами более изящным.
Именно. И видимо у тебя все вставки блоков стали анонимными, т.к. с ними производились какие-то действия (менялись динамические параметры). В противном случае фильтр бы сработал, но отобрал только (!!!) немодифицированные вставки блоков.
Можно воспользоваться и фильтром (не советую), но тогда в фильтре:
Код - C# [Выбрать]
  1. filterlist[1] = new TypedValue(2, "имя_блока,`анонимное_имя1,`анонимное_имя2,...");
и предварительно придётся получить имена анонимных блоков для данного динамического блока.
Название: Re: Не работает selection filter для вхождений блоков с заданным именем
Отправлено: Максим Маркевич от 17-12-2016, 19:50:54
И видимо у тебя все вставки блоков стали анонимными, т.к. с ними производились какие-то действия (менялись динамические параметры).
Да, так и есть!
Можно воспользоваться и фильтром (не советую), но тогда в фильтре:
Почему не советуете? Какие-то подводные камни?
Так то получить список анонимных блоков не сложно.
Название: Re: Не работает selection filter для вхождений блоков с заданным именем
Отправлено: Александр Ривилис от 17-12-2016, 20:54:30
Почему не советуете? Какие-то подводные камни?
1. Так как в имени анонимного блока присутствует символ '*', то его необходимо экранировать, т.е. ему должен предшествовать символ '`'. В противном случае '*U1' будет фильтровать не только "*U1", но и "чтоугодноU1".
2. Если анонимных блоков порожденных динамическим блоком много, то длина строки содержащей их может быть очень большой. Я не помню ограничение на длину этой строки, но оно есть.
3. Выигрыша по скорости всё-равно не будет.
Название: Re: Не работает selection filter для вхождений блоков с заданным именем
Отправлено: Максим Маркевич от 17-12-2016, 20:57:30
Александр Наумович, спасибо за разъяснение.
Уже после
2. Если анонимных блоков порожденных динамическим блоком много, то длина строки содержащей их может быть очень большой. Я не помню ограничение на длину этой строки, но оно есть.
отбой!
3. Выигрыша по скорости всё-равно не будет.
Странно, я предполагал, что фильтры всегда быстрее перебора.
Название: Re: Не работает selection filter для вхождений блоков с заданным именем
Отправлено: Александр Ривилис от 18-12-2016, 14:38:27
Странно, я предполагал, что фильтры всегда быстрее перебора.
Перебор работает однозначно быстрее, чем Editor.SelectAll, но вероятно медленнее чем Editor.SelectWindow/SelectCrossingPolygon/SelectCrossingWindow/SelectFence и им подобные, так как они оперируют не всей базой, а виртуальным экраном, на который уже спроецированы видимые в нём примитивы, что может быть значительно быстрее.