Модули сервера V6, возможности?

Стартовая страница Форумы Разработка и интеграция Модули сервера V6, возможности?

  • В этой теме 59 ответов, 4 участника, последнее обновление 1 год назад сделано Mikhail.
Просмотр 15 сообщений - с 46 по 60 (из 60 всего)
  • Автор
    Сообщения
  • #28283
    manjey73
    Участник

    Ваш код EnumerateChildObjects показывает все дочерние объекты в куче по отношению к самому первому родителю.
    Вот тут и бьюсь об стенку. То есть нет ветвления у меня.

    Даже до 3-его уровня вложенности не могу дойти. Уровней может быть разное количество.

    на счет использования TreeView понятно, вот с нодами и вложенностями у меня беда…
    Не получается пробираться внутрь следующих вложенных дочерних объектов для создания дерева.

    #28284
    manjey73
    Участник

    Вот вижу что у OPC UA при чтении сервера есть вложенности, но не уверен, что они неизвестны.

    #28285
    manjey73
    Участник

    Мне нужно на основе Таблицы объектов, создать ветки в TreeView и при создании еще туда запихнуть каналы, относящиеся именно к этому объекту, предварительно отфильтровав. То есть не все подряд пихать и выбрав например шаблон(ы) по коду тега…

    #28286
    manjey73
    Участник

    Пример

    Собственно пример ветвления. Суть наверное будет понятна. Уровень вложений неизвестен. Просто для понимания.

    А используя EnumerateChildObjects я получаю всех дочерних одним списком. Понимаю, что там вложенный цикл еще, но вот завернуть так чтобы построилось дерево с неизвестным уровнем вложения не получается…

    #28287
    JurasskPark
    Участник

    Я как понял, manjey73 делает проект под ЖКХ. Типо дом, квартира, датчик.
    Это понятно.
    Вы хотите заполнить дерево. Это тоже понятно.
    Задача взять три таблицы: канал, девайс, теги.
    Создать дерево из этого. Этот тоже понятно.

    Вы сомневаетесь в том, что нужно красивое решение, а найти его не можете. Это тоже понятно.
    Ответ: как писал Михаил — рекурсия, вы ничего другого не найдете.

    Шаги. 1. Берете таблицу каналы и берете первую запись по ней. Добавляете в дерево.
    2. Берете таблицу девайсы и идёте по всём записям. Нашли в ней ID канала — дьоавляете как дочку канала.
    3. Зная ID девайсы, которое вы только добавили теперь идёте по тегам. Нашли в записи ID девайсы, добавили тег.
    4. Завершили таблицу теги, вернулись к таблице девайсов.
    5. Завершили таблицу девайсов, возвращаетесь к следующей записи канала.

    Рекурсия. По-другому никак.

    #28288
    manjey73
    Участник

    То, что рекурсия это понятно, пытаюсь применить код, на который указал Михаил.
    Идея и смысл мне понятны. При чем подход меня больше нравится именно с точки зрения объектов. Ибо там еще должен быть фильтр, в том числе и по объектам.

    Просто лыжи не едут, особенно в той части, что там по коду используется интерфейс ITable.

    Почему с точки зрения объектов? если мне объект не нужен, я просто его игнорирую.
    Если строить дерево двигаясь от каналов, то будет лишняя работа.

    #28289
    manjey73
    Участник

    з.ы. в Таблице каналов все необходимое есть, и девайс и объект.
    Нет Родительских объектов.

    Ну и рекурсия всегда выполняется с головы а не наоборот. И в том случае, если уровень вложений неизвестен.

    Пример с ЖКХ просто наиболее показательный. Мне нужен не только он, а вообще правильное дерево со всеми вложениями.

    #28290
    manjey73
    Участник

    На обычных Нодах, как картинки тут прикручивать интересно ????
    с кодом Михаила не разобрался как на нем заставить сделать иерархию…

    #28291
    JurasskPark
    Участник

    ImageList. Переносите на форму. Туда картинки вставляете.
    У TreeView.ImageList указываете ваш ImageList.
    У TreeNode tn указываете по номеру или названию изображения
    tn.ImageKey = tn.SelectedImageKey = «название»;

    #28292
    Mikhail
    Модератор

    По ID дочернего объекта всегда можно найти родительский объект, получая Obj.ParentObjNum в цикле.

    #28293
    manjey73
    Участник

    @jurasskpark на форму добавил, вытащил из драйвера OPC UA, но пока не выходит чтобы отобразились. Возможно не так что-то делаю с TreeNode при связывании с TreeView.


    @mikhail
    а зачем их искать если у канала только ID собственного объекта?

    #28294
    Mikhail
    Модератор

    а зачем их искать если у канала только ID собственного объекта?

    Наверное, я не понял, в чём заключается проблема.

    #28295
    manjey73
    Участник

    Просто для построения дерева нужно идти сверху, а знание того, что ID объекта канала имеет родителей сильно не помогает.

    В смысле так дольше будет проходить поиск. Может если для каких-то специфических целей что-то найти ну можно вызывать отдельно такую функцию.
    А если надо постоянно, то проще пройтись один раз и сохранить в словарь списков или массивов с записью всей иерархии.

    #28296
    JurasskPark
    Участник

    А если надо постоянно, то проще пройтись один раз и сохранить в словарь списков или массивов с записью всей иерархии.

    A TreeView это как раз и делает :). Он хранит всю иерархию. 🙂

    #28300
    Mikhail
    Модератор

    У каждого TreeNode есть свойство Tag, в которое можно положить нужный объект, связанный с узлом дерева. Поэтому выбрав узел, можно сразу узнать соответствующий ID объекта, например.

Просмотр 15 сообщений - с 46 по 60 (из 60 всего)
  • Вы должны авторизироваться для ответа в этой теме.