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

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

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

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

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

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" идет уже во вложенном списке, в отличие от первого варианта.
Как задавать фильтр для таких списков?
Просмотров: 5410
 
Непрочитано 09.10.2019, 15:24
#2
trir


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


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

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


Цитата:
Сообщение от 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,405
Отправить сообщение для Александр Ривилис с помощью Skype™


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

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


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

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

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


мне подумалось, что автор спрашивает про что то типа:
Код:
[Выделить все]
    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
Москва
Сообщений: 28


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


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


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

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


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


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


Цитата:
Сообщение от Александр Ривилис Посмотреть сообщение
Фильтровать расширенные данные можно только по группе 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,588


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

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

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


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


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

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


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


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


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

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


Цитата:
Сообщение от 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
Сообщений: 11,004


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

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


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

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


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

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


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


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


Цитата:
Сообщение от Сидор Лютый Посмотреть сообщение
В моем случае все примитивы находятся в модели. В различных слоях, с различными свойствами, с различными AppName. Только структура строки с кодом 1000 связывает примитивы, указывая, что они относятся к одному объекту. Поэтому никакого предварительного набора нет.
имхо, неправильная организация данных приложения, вывернутая "наизнанку". Зачем плодить разные зарегистрированные приложения для совокупности примитивов, которые должны потом выбираться как одно целое?
Сергей812 вне форума  
Ответ
Вернуться   Форум 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