вторник, 24 ноября 2015 г.

Где мои терабайты?

Где мои терабайты?
Распространенный вопрос? Для меня - да.
Вроде, поставишь новый диск, места полно... А через некоторое время раз - и кончилось. И начинаешь долго и нудно просматривать, чем же оно забито.
Так вот, способ есть! Берем TreeMap, говорим: "Раскрыть диск (папку)" - и видим самые толстые объекты, первые клиенты на удаление.
Сделано это в виде шаблона Visio. Нужные макросы внутри.
Раньше это был шаблон VisioTreeView. Про него я уже писал. А теперь в тот же шаблон добавлен еще один режим раскрытия папок.
Вид получается примерно такой
 Все управление на контекстных меню. Самое первое - показать диски (это меню страницы).
Так как тысячи файлов Visio рисовал бы медленно, при сканировании диска введены некоторые ограничения. За одну операцию раскрываются только два уровня. Если нужно смотреть дальше, выбираем нужный прямоугольник и углубляемся в него, повторяя операцию.
Если в папке обнаруживаются более 100 дочерних объектов, мелочь тоже начинает отбрасываться. Все равно сольется в линию.
Прямоугольники подкрашиваются в зависимости от расширений файлов.
В виде надписи выводится имя папки или файла. Если прямоугольник узкий, имя не умещается и не выводится. Тогда нужно открывать окно "Данные шейпа" и смотреть в нем. Там же приведен объем файла, путь к нему и состояние.  В данном случае состояние - это свертка из расширений имен файлов, используемая для передачи цвета.

С точки зрения программирования
Поле названо состоянием для универсальности. Дело в том, что подобная задача разбивается на две части: сбор дерева структуры и его отображение. Отображение одинаковое, а на входе данные могут быть ну очень разные. У меня это приспособлено для взвешивания файлов. Но такой же тип отображения можно использовать для сравнения доходов, площади территорий, населения и т.д. Поэтому сечение содержит довольно универсальные атрибуты: текст, вес, состояние.
Собственно модуль отображения представляет собой класс, который умеет рисовать себя и своих потомков (иерархически). Данные передаются через указанные выше атрибуты. Так что по аналогии можно будет делать сменные входные приставки для других областей применения.
Универсальный, не привязанный к прокладной области тест выглядит вот так:
 Sub aTest()       'Tree for test
    Set c0 = New c
    Set c0.shp0 = ActivePage.Shapes(1)
   
    'CurrNode.AddItem Weight, State, Text, Path
    c0.AddItem 32, 0, "Text1", ""
    c0.AddItem 5, 1, "Text2", ""
    c0.AddItem 12, 2, "Text3", ""
    Set c2 = c0.AddItem(25, 3, "Text4", "")
    Set c1 = c0.AddItem(7, 4, "Text5", "")
   
    c1.AddItem 30, 0, "Text21", ""
    c1.AddItem 20, 1, "Text22", ""
    c1.AddItem 40, 2, "Text23", ""
    c1.AddItem 5, 3, "Text24", ""
   
    c2.AddItem 5, 5, "Text31", ""
    c2.AddItem 16, 6, "Text32", ""
    c2.AddItem 30, 7, "Text33", ""
    c2.AddItem 10, 8, "Text34", ""
   
    c0.DrawLevel c0, 1
End Sub
и рисует вот такую картину.
Скачать
Шаблон условно платный:
Для "богатых" стоит $5 - https://gum.co/dTHz
Для бедных бесплатно - https://www.dropbox.com/s/w7299qq37wlir9b/TreeMap.vst?dl=0

Остальные варианты по договоренности.