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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > VBA. Как отфильтровать по DXF-кодам расширенные данные, находящиеся в списке?

VBA. Как отфильтровать по DXF-кодам расширенные данные, находящиеся в списке?

Ответ
Поиск в этой теме
Непрочитано 09.10.2019, 15:12 #1
VBA. Как отфильтровать по DXF-кодам расширенные данные, находящиеся в списке?
Сидор Лютый
 
Инженер кадастровый
 
Москва
Регистрация: 27.04.2010
Сообщений: 21

Вношу в объекты простенькие расширенные данные в виде:

FType(0) = 1001: FData(0) = "AppName"
FType(1) = 1000: FData(1) = "Name1"

Некоторые объекты требуют уже нескольких строк с кодом "1000", т.е. в виде:

FType(0) = 1001: FData(0) = "AppName"
FType(1) = 1002: FData(1) = "{"
FType(2) = 1000: FData(2) = "Name1"
FType(3) = 1000: FData(3) = "Name2"
FType(4) = 1002: FData(4) = "}"

Теперь стоит задача выбора объектов по этим данным, например - выбрать объекты со строкой "Name1". Когда при выборе в .select вношу фильтр
FType(0) = 1000: FData(0) = "Name1"
в первом случае все работает, возвращаются объекты, содержащие "Name 1"
Во втором случае выбор возвращается пустым. Возможно потому, что строка "Name1" идет уже во вложенном списке, в отличие от первого варианта.
Как задавать фильтр для таких списков?
Просмотров: 1364
 
Непрочитано 09.10.2019, 15:24
#2
trir


 
Регистрация: 18.12.2010
Сообщений: 3,503


там кажется логические свзяки надо писать, приведи пример кода
trir на форуме  
 
Автор темы   Непрочитано 09.10.2019, 16:28
#3
Сидор Лютый

Инженер кадастровый
 
Регистрация: 27.04.2010
Москва
Сообщений: 21


Цитата:
Сообщение от trir Посмотреть сообщение
там кажется логические свзяки надо писать, приведи пример кода
Да тут особо-то и приводить нечего..

Код:
[Выделить все]
Dim FType(0) As Integer
Dim FData(0) As Variant
FType(0) = 1000: FData(0) = "Name1"
SSet01.Select acSelectionSetAll, , , FType, FData
Сидор Лютый вне форума  
 
Непрочитано 09.10.2019, 16:36
#4
Александр Ривилис

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


Сидор Лютый,
Фильтровать расширенные данные можно только по группе 1001 (имя приложения).
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 09.10.2019, 16:41
#5
Сидор Лютый

Инженер кадастровый
 
Регистрация: 27.04.2010
Москва
Сообщений: 21


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
Сидор Лютый,
Фильтровать расширенные данные можно только по группе 1001 (имя приложения).
На практике все благополучно фильтруется и по группе 1000. Не знаю, - почему в интернете везде написано обратное. Но суть пока не в этом.
Благополучно все фильтруется при условии, что данные группы 1000 находятся на одном уровне с группой 1001. (Правда при этом получается, что объект может содержать только одну строку группы 1000, но пока это тоже не суть..) Как только убираешь строки 1000 в список, они становятся невидимыми для Select.

Последний раз редактировалось Сидор Лютый, 09.10.2019 в 17:24.
Сидор Лютый вне форума  
 
Непрочитано 09.10.2019, 17:07
#6
Boxa

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


мне подумалось, что автор спрашивает про что то типа:
Код:
[Выделить все]
    TypedValue[] tvArr = new TypedValue[]
    {
        new TypedValue((int)DxfCode.Operator, "<AND"),
        new TypedValue((int)DxfCode.Start, "CIRCLE"),
        new TypedValue((int)DxfCode.Operator, ">="),
        new TypedValue((int)DxfCode.Real, 8.5),
        new TypedValue((int)DxfCode.Operator, "<>"),
        new TypedValue((int)DxfCode.Color, 1),
        new TypedValue((int)DxfCode.Operator, "<>"),
        new TypedValue((int)DxfCode.Color, 2),
        new TypedValue((int)DxfCode.Operator, "AND>"),
        };
Туту подробнее: https://knowledge.autodesk.com/searc...FAE22-htm.html
__________________
_бложиг
Boxa вне форума  
 
Автор темы   Непрочитано 09.10.2019, 17:15
#7
Сидор Лютый

Инженер кадастровый
 
Регистрация: 27.04.2010
Москва
Сообщений: 21


Boxa, не, это уже другое. Я выбираю по одному условию, без комбинаций.
Сидор Лютый вне форума  
 
Непрочитано 09.10.2019, 17:22
#8
Сергей812


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


Создаете набор по имени приложения, потом обрабатываете этот набор как хотите.
Сергей812 вне форума  
 
Автор темы   Непрочитано 09.10.2019, 18:12
#9
Сидор Лютый

Инженер кадастровый
 
Регистрация: 27.04.2010
Москва
Сообщений: 21


Сергей812, вопрос не в том, как это сделать другими способами Я б не ковырял интернет целый день, а потом не писал сюда, чтобы выяснить, что могу перебирать объекты по одному..))
Вопрос в данном случае - как правильно сделать фильтр для Select ?
Сидор Лютый вне форума  
 
Непрочитано 09.10.2019, 18:55
#10
Сергей812


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


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
Фильтровать расширенные данные можно только по группе 1001 (имя приложения).
дополню ссылкой на справку
Цитата:
You can filter entities containing extended data for a specified application.
Цитата:
Сообщение от Сидор Лютый Посмотреть сообщение
что могу перебирать объекты по одному..))
ну нет в VBA LINQ и не будет, чтобы в одну строчку кода...)
Сергей812 вне форума  
 
Непрочитано 09.10.2019, 18:58
#11
Boxa

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


Цитата:
Сообщение от Сидор Лютый Посмотреть сообщение
На практике все благополучно фильтруется и по группе 1000
У меня повторить такую фильтрацию по 1000 не получилось, только по 1001 (Acad 2017)

Это говорит о том, что если у Вас, на вашем рабочем месте это получилось, не факт что получится где то еще и уж точно никто не гарантирует совместимости в дальнейшем.

Сергей дело говорит, у Вас в объекте SSet01 и так уже все объекты приложения в наличии, просто пройтись по списку через For Each и переложить в другую коллекцию нужные объекты. Зачем тратить кучу времени на поиск способов фильтрации, если есть простое и надежное решение? В погоне за производительностью? Так VBA и скорость они в разных вселенных, как припарки при гангрене.
Да и вообще использовать acSelectionSetAll с фильтом по расширенным данным... ну такое... лучше уж по пространству модели в цикле пробежаться, скорость та же, а контроля больше.
__________________
_бложиг
Boxa вне форума  
 
Непрочитано 09.10.2019, 19:23
#12
Сергей812


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


Цитата:
Сообщение от Boxa Посмотреть сообщение
лучше уж по пространству модели в цикле пробежаться, скорость та же, а контроля больше.
ну насчет скорости - это под вопросом, все-таки один запрос с фильтром или перебирать все объекты в пространстве модели и пытаться получить у них расширенные данные.
Сергей812 вне форума  
 
Непрочитано 09.10.2019, 19:39
#13
Boxa

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


Возможно ошибюсь, но всегда думал, что скорость VBA сильно зависит от скорости взаимодействия по COM и под "капотом" у этого фильтра, все тот же перебор.
С другой стороны, ну выполниться скрипт не за 5 сек, а за 6... много ли это изменит? Если нужна скорость, то на VBA писать и не стоило.
В любом случае, если бы я писал для себя, я бы прошелся по модели... но на вкус все фломастеры разные... =)
__________________
_бложиг
Boxa вне форума  
 
Непрочитано 09.10.2019, 19:52
#14
Сергей812


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


Цитата:
Сообщение от Boxa Посмотреть сообщение
и под "капотом" у этого фильтра, все тот же перебор.
тот же перебор, но один раз проверены данные на входе, а потом уже скрыто "под капотом" - сторонний программист не имеет туда доступа и не надо хотя бы его действия контролировать. Плюс, возможно, какая то оптимизация.
Сергей812 вне форума  
 
Автор темы   Непрочитано 09.10.2019, 21:33
#15
Сидор Лютый

Инженер кадастровый
 
Регистрация: 27.04.2010
Москва
Сообщений: 21


Цитата:
Сообщение от Boxa Посмотреть сообщение
У меня повторить такую фильтрацию по 1000 не получилось, только по 1001 (Acad 2017)
Странно конечно это.. У меня 2018, но вроде там настолько все прозрачно, что трудно предположить неработоспособность в разных версиях..
В расширенных данных:
Код:
[Выделить все]
FType(0) = 1001: FData(0) = "AppName"
FType(1) = 1000: FData(1) = "Name1"
В макросе:
Код:
[Выделить все]
Dim FType(0) As Integer
Dim FData(0) As Variant
FType(0) = 1000: FData(0) = "Name1"
SSet01.Select acSelectionSetAll, , , FType, FData
Может я действительно переоцениваю производительность фильтрации, но перебор в цикле - как-то фуу..
В любом случае спасибо за обсуждение.
Сидор Лютый вне форума  
 
Непрочитано 09.10.2019, 21:36
#16
Сергей812


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


перебирать то будете ограниченный набор, а не все примитивы чертежа)
Сергей812 вне форума  
 
Непрочитано 09.10.2019, 22:05
#17
Boxa

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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Плюс, возможно, какая то оптимизация.
Наверняка есть и первое что приходит на ум:
Код:
[Выделить все]
if (res.ObjectId.ObjectClass.IsDerivedFrom(Rtm.RXClass.GetClass(typeof(Db.BlockReference))))
предполагая наличие этой оптимизации, я использую фильтрацию по типу объекта в запросе примитивов у пользователя
все остальные проверки требуют получения и открытия объекта, а у автора фильтрация по XData...
С другой стороны, кому как удобно, главное что бы задача решалась и иногда, долго работающая программа это ооооочень нужная вещь =))
__________________
_бложиг
Boxa вне форума  
 
Автор темы   Непрочитано 10.10.2019, 09:28
#18
Сидор Лютый

Инженер кадастровый
 
Регистрация: 27.04.2010
Москва
Сообщений: 21


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
перебирать то будете ограниченный набор, а не все примитивы чертежа)
В моем случае все примитивы находятся в модели. В различных слоях, с различными свойствами, с различными AppName. Только структура строки с кодом 1000 связывает примитивы, указывая, что они относятся к одному объекту. Поэтому никакого предварительного набора нет.
Сидор Лютый вне форума  
 
Непрочитано 10.10.2019, 09:34
#19
Александр Ривилис

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


Цитата:
Сообщение от Сидор Лютый Посмотреть сообщение
На практике все благополучно фильтруется и по группе 1000.
Если не хочешь проблем - забудь про это. Это случайный побочный эффект.
Александр Ривилис вне форума  
 
Непрочитано 10.10.2019, 09:43
#20
Сергей812


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


Цитата:
Сообщение от Сидор Лютый Посмотреть сообщение
В моем случае все примитивы находятся в модели. В различных слоях, с различными свойствами, с различными AppName. Только структура строки с кодом 1000 связывает примитивы, указывая, что они относятся к одному объекту. Поэтому никакого предварительного набора нет.
имхо, неправильная организация данных приложения, вывернутая "наизнанку". Зачем плодить разные зарегистрированные приложения для совокупности примитивов, которые должны потом выбираться как одно целое?
Сергей812 вне форума  
 
Автор темы   Непрочитано 10.10.2019, 09:44
#21
Сидор Лютый

Инженер кадастровый
 
Регистрация: 27.04.2010
Москва
Сообщений: 21


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
Если не хочешь проблем - забудь про это. Это случайный побочный эффект.
Тогда подскажите пожалуйста другие удобные способы группировки объектов по присвоенным пользователем признакам Чтобы по любому из признаков можно было сделать выборку. Если честно, xdata - это первое и единственное, что приходит на ум.
Сидор Лютый вне форума  
 
Непрочитано 10.10.2019, 09:50
#22
Сергей812


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


Цитата:
Сообщение от Сидор Лютый Посмотреть сообщение
Тогда подскажите пожалуйста другие удобные способы группировки объектов по присвоенным пользователем признакам Чтобы по любому из признаков можно было сделать выборку. Если честно, xdata - это первое и единственное, что приходит на ум.
первое, что приходит на ум - БД) Меняется строка запроса и получаете списки объектов, удовлетворяющих заданным признакам.

----- добавлено через ~3 мин. -----
а XData неудобная вещь для выборки по значениям, ими только привязывать удобно к внешним данным.
Сергей812 вне форума  
 
Непрочитано 10.10.2019, 10:50
#23
Александр Ривилис

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


Сидор Лютый,
1. Забыть про VBA
2. Если цель только в группировке - использовать группы объектов или блоки.
Александр Ривилис вне форума  
 
Автор темы   Непрочитано 15.10.2019, 12:18
#24
Сидор Лютый

Инженер кадастровый
 
Регистрация: 27.04.2010
Москва
Сообщений: 21


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
Сидор Лютый,
1. Забыть про VBA
2. Если цель только в группировке - использовать группы объектов или блоки.
Цель как раз не группировке самой по себе. Группы и блоки - все же неприемлемый способ, т.к. блокируют доступ к отдельным примитивам со стороны пользователя. При ежедневной работе с ними, извлекать из группы и собирать обратно - не вариант, набор примитивов должен быть свободный для обычного выбора и редактирования каждого из примитивов. А сортировка примитивов по нескольким пользовательским признакам - уже дополнительная задача, и вроде бы xdata так хорошо для этого подходят, ан нет! И тут перебором надо!

А забыть - уже не вариант. Я думаю это общая проблема инженеров, которые не являются программистами, а используют автоматизацию в какой-то отрасли. Когда, будучи инженером, в ущерб рабочему времени изучил VBA, за десяток лет написал мегабайты кода для упрощения работы (а ведь кроме автокада макросы в производственном угаре строчились под Exell, Word, IE, вплоть до PDF-принтеров с поддержкой COM), никому в голову не придет бросить. С lisp-ом та же история, я думаю..
Сидор Лютый вне форума  
 
Непрочитано 15.10.2019, 12:29
| 1 #25
Boxa

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


Если очень хочется, то никто не мешает в качестве имени приложения использовать составную строку.
Там есть свои грабли, но если очень хоца, то почему бы и нет.
__________________
_бложиг
Boxa вне форума  
 
Автор темы   Непрочитано 15.10.2019, 13:40
#26
Сидор Лютый

Инженер кадастровый
 
Регистрация: 27.04.2010
Москва
Сообщений: 21


Цитата:
Сообщение от Boxa Посмотреть сообщение
Если очень хочется, то никто не мешает в качестве имени приложения использовать составную строку.
Там есть свои грабли, но если очень хоца, то почему бы и нет.
Кстати, хорошая идея.
Если фильтры dxf-кодов поддерживают знаки шаблонов, это будет нормальным выходом из ситуации!
Сидор Лютый вне форума  
 
Непрочитано 15.10.2019, 14:34
#27
Александр Ривилис

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


Цитата:
Сообщение от Сидор Лютый Посмотреть сообщение
Если фильтры dxf-кодов поддерживают знаки шаблонов, это будет нормальным выходом из ситуации!
Поддерживают. Вот формат шаблонов: https://knowledge.autodesk.com/searc...A53AD-htm.html
Александр Ривилис вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > VBA. Как отфильтровать по DXF-кодам расширенные данные, находящиеся в списке?

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Какие исходные данные необходимы для расчёта мелкозаглубленного фундамента? Двоечник Основания и фундаменты 2 19.01.2012 20:25
Можно ли суммировать данные атрибутов от одинаковых блоков? Максим_Александрович AutoCAD 5 14.10.2011 09:31
VIEWPORT и расширенные данные ===AAA=== Программирование 4 22.12.2005 12:17
Lisp и данные paha LISP 9 26.08.2004 14:49