Tree control toolkit

Делись идеей, получай поддержку и критику!
Ответить
Аватара пользователя
Juri
I/O
I/O
Сообщения: 262
Зарегистрирован: 19 апр 2017, 23:06
Версия LabVIEW: 2021
Благодарил (а): 13 раз
Поблагодарили: 6 раз

Tree control toolkit

Сообщение Juri »

Мне приходилось пользоваться Tree в основном в четырех главных случаях: 1 сбор всего содержимого папки на диске, 2 разбор содержимого variant, 3 сбор массива всех контролов и индикаторов на передней панели, 4 формирование редактируемой пользователем последовательности разных команд. В каждом случае возникала одна и та же задача - сохранять содержимое дерева, таким образом, чтобы с каждой строкой ассоциировался произвольный массив байт. В первом случае приходилось сохранять массивы байт хранящих файлы, во втором - содержимое каждой переменной внутри variant, в третьем - свойства каждого контрола на передней панели.
Каждый раз я по разному изобретал велосипед и в итоге в последний раз пришел к выводу, что хорошо бы создать универсальный тулкит, который решал бы все 4 задачи одинаково. Вопрос такой: а нет ли уже чего-то готового? Если нет, то в моих планах его создать и выложить в свободное пользование.
Вот основные необходимые мне функции дерева:
1 Возможность сохранить в файл параметры дерева и в том числе ассоциируемые массивы произвольных байт, в том числе все строки таблицы с форматированием.
2 Фильтр по содержимому столбцов. В этом случае дерево превращается в обычную таблицу без иерархии.
3 Свернуть/развернуть все дерево или только выделенную область.
4 Хранение истории изменений и возможность сделать шаг назад или вперед.
5 Добавление, удаление, перетаскивание.
Все эти функции требуют хранения в памяти дубликата всего дерева в виде массива кластеров. Произвольный массив байт конечно можно хранить в текстовом виде в первом столбце и тогда все нужные функции можно будет делать стандартными Property/Invoke node. Однако в таком случае время выполнения множества операций может затягиваться на минуты или даже часы, особенно если я собираю около трех сотен контролов со всех vi которые загружаются на экран в процессе выполнения программы, получая при этом около двух тысяч строк в дереве.
На картинке переводчик программ, который позволяет создавать файл языкового пакета.

upd: Дальнейшие обновления будут тут https://github.com/Yuri-Dudygin/Tree-toolkit
Вложения
Screenshot_1.png
Последний раз редактировалось Juri 02 сен 2022, 19:51, всего редактировалось 1 раз.
Аватара пользователя
Kosist

Activity Gold
expert
expert
Сообщения: 1236
Зарегистрирован: 21 фев 2011, 23:44
Награды: 2
Версия LabVIEW: 2013-2020
Благодарил (а): 23 раза
Поблагодарили: 30 раз
Контактная информация:

Re: Tree control toolkit

Сообщение Kosist »

Вроде бы такого тулкита нет, но, кстати, есть такой тулкит - https://www.vipm.io/package/qsi_qcontrol_toolkit/. Он помогает в создании типа XControl, но без XControl - т.е. контролов с функционалом. И там тоже есть классы для Tree, но как они работают Вам не скажу - не клацал.
Работа с Tree и в других фреймворках/языках тоже не "прямолинейная". Я пробывал на .NET, используя WPF сделать интерфейс с деревом - тоже приходится заморачиваться; хотя там проще тем, что объекты можно прописать классами, а свойства будут "скармливаться" контролу автоматически. В :labview: это нужно делать вручную.
Кстати, Ваш интерфейс для создания файла перевода - я делал тоже такое для этого тулкита https://www.vipm.io/package/anv_s_r_o_l ... t_toolkit/. Идеи витают в воздухе, это отлично :super: .
Было бы круто сделать тулкит ООП - чтобы данные для дерева можно было представлять классами. Есть тулкит, который конвертирует классы в JSON. Есть тоже тулкит, который позволяет JSON отображать в Tree и наоборот. Если связать все это, и сделать удобным - думаю, тулкит получил бы определенную популярность (больше 10 скачиваний :haha: ).
Если напишете свой тулкит, выкладывайте здесь - думаю, много кто даст полезный фидбек.
Мы делили апельсин - много наших полегло...
Аватара пользователя
Juri
I/O
I/O
Сообщения: 262
Зарегистрирован: 19 апр 2017, 23:06
Версия LabVIEW: 2021
Благодарил (а): 13 раз
Поблагодарили: 6 раз

Re: Tree control toolkit

Сообщение Juri »

Kosist писал(а): 13 авг 2022, 00:13 Было бы круто сделать тулкит ООП - чтобы данные для дерева можно было представлять классами.
Можно поподробней? Я не понял
Аватара пользователя
Kosist

Activity Gold
expert
expert
Сообщения: 1236
Зарегистрирован: 21 фев 2011, 23:44
Награды: 2
Версия LabVIEW: 2013-2020
Благодарил (а): 23 раза
Поблагодарили: 30 раз
Контактная информация:

Re: Tree control toolkit

Сообщение Kosist »

Tree control нужен для отображения иерархической структуры. В Вашем случае на скрине - дополнительно еще нужно отображать колонки (свойства объектов), но по-сути, тут главное то, что объект Кластер, например, может содержать другие контролы - значит, Кластер - родитель в иерархии, а контролы внутри его - "дети".
Но как описать такую динамическую структуру в коде? Мне, например, проще использовать классы. Т.е. можно создать поле классов-родителей (поле - задает порядок отображения), но в то же время классы могут содержать классы-детей. И вот это поле классов я не хочу вручную парсить - я бы с удовольствием использовал виайку, которая принимает поле классов на входе, и парсит их содержимое для отображения в Tree.
И когда я клацаю на строку в Tree - то тулкит мне возвращает объект, который соотвествует этой строке. А из класса я уже могу вытащить нужные поля. Или, откроется окно для редактирования строки - а окно это будет динамический метод, который я могу определить для класса. Если я удаляю рядок, то тулкит удаляет соотвествующий объект, и т.д.
Ведь API для работы с Tree уже есть, это property/invoke узлы для контрола. Поэтому более полезно иметь что-то, что позволяет более легко работать с данными и их отображать в контроле, нежели вручную их парсить для отображения.
Мы делили апельсин - много наших полегло...
Аватара пользователя
Juri
I/O
I/O
Сообщения: 262
Зарегистрирован: 19 апр 2017, 23:06
Версия LabVIEW: 2021
Благодарил (а): 13 раз
Поблагодарили: 6 раз

Re: Tree control toolkit

Сообщение Juri »

Если я вас правильно понял, то надо сделать vi у которой на входе будет класс как на фото, далее рекурсивно ищутся все вложения классов в этот класс. Tree имеет поле tag, уникальное для каждой строки. В него следует прописать в текстовом виде весь путь расположения вроде такого: TabControl(Tab Control)::Page(Page 2)::Array(Lang all)::String(String), где в скобках свойство Label Text. По крайней мере так я делаю в своем переводчике. Если речь о классах, созданных пользователем, наследников LabVIEW Object, то тут я не понял. Выводить в дерево иерархию всего содержимого класса, т.е. все vi?
Вложения
Screenshot_3.png
Screenshot_3.png (1.34 КБ) 2382 просмотра
Аватара пользователя
Kosist

Activity Gold
expert
expert
Сообщения: 1236
Зарегистрирован: 21 фев 2011, 23:44
Награды: 2
Версия LabVIEW: 2013-2020
Благодарил (а): 23 раза
Поблагодарили: 30 раз
Контактная информация:

Re: Tree control toolkit

Сообщение Kosist »

Juri писал(а): 13 авг 2022, 13:47 Если я вас правильно понял, то надо сделать vi у которой на входе будет класс как на фото, далее рекурсивно ищутся все вложения классов в этот класс. Tree имеет поле tag, уникальное для каждой строки. В него следует прописать в текстовом виде весь путь расположения вроде такого: TabControl(Tab Control)::Page(Page 2)::Array(Lang all)::String(String), где в скобках свойство Label Text. По крайней мере так я делаю в своем переводчике. Если речь о классах, созданных пользователем, наследников LabVIEW Object, то тут я не понял. Выводить в дерево иерархию всего содержимого класса, т.е. все vi?
Это ведь просто идея; Вы все равно будете делать так, как Вам удобней/лучше.
На скрине у Вас контрол генерической ссылки. Я имел ввиду класс (lvclass). Классы могут содержать поля (свойства) и методы. Если Вы не используете ООП, то тогда это другая история.
Мы делили апельсин - много наших полегло...
Аватара пользователя
Juri
I/O
I/O
Сообщения: 262
Зарегистрирован: 19 апр 2017, 23:06
Версия LabVIEW: 2021
Благодарил (а): 13 раз
Поблагодарили: 6 раз

Re: Tree control toolkit

Сообщение Juri »

....
Последний раз редактировалось Juri 05 сен 2022, 19:25, всего редактировалось 1 раз.
Аватара пользователя
Juri
I/O
I/O
Сообщения: 262
Зарегистрирован: 19 апр 2017, 23:06
Версия LabVIEW: 2021
Благодарил (а): 13 раз
Поблагодарили: 6 раз

Re: Tree control toolkit

Сообщение Juri »

Дальнейшие обновления будут тут https://github.com/Yuri-Dudygin/Tree-toolkit
Аватара пользователя
Juri
I/O
I/O
Сообщения: 262
Зарегистрирован: 19 апр 2017, 23:06
Версия LabVIEW: 2021
Благодарил (а): 13 раз
Поблагодарили: 6 раз

Re: Tree control toolkit

Сообщение Juri »

Kosist писал(а): 13 авг 2022, 16:08 Я имел ввиду класс (lvclass). Классы могут содержать поля (свойства) и методы. Если Вы не используете ООП, то тогда это другая история.
Обновил. Теперь можно сделать отображение как в проекте или в том виде как файлы располагаются в файловой системе. Это то что вы имели в виду? (выбрать Mode
и нажать кнопку CLASS)
Аватара пользователя
Juri
I/O
I/O
Сообщения: 262
Зарегистрирован: 19 апр 2017, 23:06
Версия LabVIEW: 2021
Благодарил (а): 13 раз
Поблагодарили: 6 раз

Re: Tree control toolkit

Сообщение Juri »

Есть проблема. В Example.vi все работает хорошо. События Drug срабатывают в TreeController.vi. Но когда запускаю тот же код в Actor Core, то эти события не срабатывают.
Вложения
Screenshot_1.png
Последний раз редактировалось Juri 06 окт 2022, 17:39, всего редактировалось 1 раз.
Artem.spb

Activity Автор
professor
professor
Сообщения: 3387
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 49 раз
Поблагодарили: 172 раза
Контактная информация:

Re: Tree control toolkit

Сообщение Artem.spb »

Juri писал(а): 06 окт 2022, 13:23 В Example.vi все работает хорошо.
Уж сколько раз твердили миру...
Мало кто из готовых помочь ставит себе последние версии, так что ожидая подсказок стоит подумать о том, сколько человек сможет открыть ваш код
Аватара пользователя
Juri
I/O
I/O
Сообщения: 262
Зарегистрирован: 19 апр 2017, 23:06
Версия LabVIEW: 2021
Благодарил (а): 13 раз
Поблагодарили: 6 раз

Re: Tree control toolkit

Сообщение Juri »

готово 18
Вложения
18.7z
(526.03 КБ) 47 скачиваний
Artem.spb

Activity Автор
professor
professor
Сообщения: 3387
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 49 раз
Поблагодарили: 172 раза
Контактная информация:

Re: Tree control toolkit

Сообщение Artem.spb »

Акторов не нашёл.
И сделайте простейший пример, чтобы не приходилось бегать по всему коду.
Могу только предположить, что регистрация события происходит до открытия окна. Хотя, в этом случае должна была ошибка выскочить.
Аватара пользователя
Kosist

Activity Gold
expert
expert
Сообщения: 1236
Зарегистрирован: 21 фев 2011, 23:44
Награды: 2
Версия LabVIEW: 2013-2020
Благодарил (а): 23 раза
Поблагодарили: 30 раз
Контактная информация:

Re: Tree control toolkit

Сообщение Kosist »

Juri писал(а): 05 сен 2022, 19:24 Обновил. Теперь можно сделать отображение как в проекте или в том виде как файлы располагаются в файловой системе. Это то что вы имели в виду? (выбрать Mode
и нажать кнопку CLASS)
Нет, я имел ввиду другое - чтобы отображалось содержимое полей класса (не методы, а именно данные, которые хранятся в классе). Это не простая задача, но решаемая. Но пока не начнете использовать ООП, будет тяжело понять.
Любая попытка привнести в мир :labview: - это хорошо, Вы молодец. Но есть несколько моментов, которые бросились в глаза.
Error Codes.png
Error Codes.png (4.24 КБ) 1533 просмотра
1. -1 - не может использовать как код ошибки. В :labview: есть отдельный диапазон кодов, которые можно использовать для "своих" ошибок - вот его и нужно использовать.
Typedefs.png
2. Для кластеров нужно использовать typedefs. Для энумов тоже (там один у Вас есть на скрине, а вот второй не typedef).
3. Если хотите выкатить тулкит в широкую аудиторию - пишите комменты на английском. Комменты на русском (в кирилице в целом) не отображаются на ОС, локализованных под другие языки.
4. Стейт машина в TreeController.vi использует номера для определения стейтов - там должны быть энумы. Основы основ :wink: .
Но в целом допиливайте, это полезный для Вас опыт.
Мы делили апельсин - много наших полегло...
Аватара пользователя
Juri
I/O
I/O
Сообщения: 262
Зарегистрирован: 19 апр 2017, 23:06
Версия LabVIEW: 2021
Благодарил (а): 13 раз
Поблагодарили: 6 раз

Re: Tree control toolkit

Сообщение Juri »

Artem.spb писал(а): 06 окт 2022, 17:45 Акторов не нашёл.
И сделайте простейший пример, чтобы не приходилось бегать по всему коду.
Могу только предположить, что регистрация события происходит до открытия окна. Хотя, в этом случае должна была ошибка выскочить.
Спасибо помогло!
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Проекты»