четверг, 21 августа 2014 г.

Интерактивные методы размещения данных

В процессе автоматизации на основе Visio часто приходится подбирать алгоритм автоматического размещения шейпов. Особенно актуальной эта задача становится при работе с внешними данными. В этой статье рассматривается прием, помогающий преодолеть существенную автономность страниц в документе Visio.
Довольно часто возникает задача разместить в документе Visio некий связанный список данных. Например, перечень элементов, спецификацию, ведомость. Если этот список длинный, отдельные записи имеют разный объем, да еще и построить все надо автоматически, то задача становится непростой.
Возьмем для примера такой широко распространенный технический документ, как перечень элементов. Вид у него примерно такой.
Данные размещаются на нескольких листах. Запись табличного типа и может занимать одну, две или три строки. Между строками могут быть пробелы, причем их количество разное в зависимости от ситуации.
Основная сложность в том, что при изменении данных они начинают сползать на другие листы и вручную отслеживать такие перемещения довольно неприятно.
Для борьбы с этим применен в дополнении Visio введен специальный режим интерактивного редактирования. Макрос, размещающий данные в документе, сначала создает множество образов страниц на одном листе. Так, как показано на рисунке.

При этом пользователь видит весь текст, включая последствия всех перемещений. Дальше начинается интерактивная подгонка: добавление межстрочных интервалов, перемещение блоков текста, даже вынос некоторой общей части текста в заголовок (при этом для заголовка создается новая запись). Набор команд для такого редактирования собран на одной экранной форме.

Особенность метода в том, что в начале редактирования макрос сохраняет весь поток данных во внутренней коллекции. При каждой операции в первую очередь изменяется эта кол-лекция (записи добавляются, удаляются и т.д.), а потом весь документ перевыводится.
По времени такой перевывод занимает от долей секунды до нескольких секунд, поэтому неприятные ощущения не возникают.
В конце работы выполняется последняя команда "Порезать на листы для вывода", по которой листы-фантомы удаляются, а шейпы рисуются уже по слегка измененному алгоритму на "настоящих" последующих листах. В результате документ приобретает "нормальный" вид.

Так как все редактирование сохранялось в коллекции, данные распределяются по листам точно так же, но уже не "в ширину", а "в глубину".
После некоторой практики оптимальным был признан следующий набор команд редактирования (для перечня элементов):
- проредить - селектируется запись начала блока данных, запись конца блока данных и нажимается кнопка команды. В результате после каждой записи в этом блоке добавляется одна пустая запись;
- добавить - несколько пустых строк после каждой записи. Селектируется несколько записей, не обязательно подряд. После выполнения команды за каждой селектированной записью появляется заданное количество пустышек;
- удалить - чаще всего применяется к неудачно вставленным пробелам. Селектированные записи удаляются;
- перенести - селектируются три записи: начало и конец переносимого блока и точка вставки. Блок переносится в новое место.
Остальные операции (для групп) - это специфика перечня элементов, здесь ее можно не рассматривать.
Еще одна тонкость кроется в конструкции шейпа и соединении шейпов. Шейп, в который выводится одна запись, представляет собой группу из нескольких шейпов-колонок. Каждая колонка не только саморегулирующаяся (по высоте) в зависимости от количества текста, но и воздействует на высоту всей группы. То есть, если хотя бы в одной колонке количество строк увеличится, оно увеличится и во всей записи. А так как группы сцеплены в гирлянду, то ниж-ние записи автоматически сдвигаются на нужное расстояние. Этот эффект просматривается в последней строке примера.




Кстати, при попытках отслеживать изменение размеров в зависимости от количества текста в других приложениях (в том же Excel) почти все известные решения когда-нибудь, да ошибаются. Для Visio это "родная" задача, поэтому тут ошибок не бывает.
Скорее всего прием с "фантомными" страницами применим не только в таких документах, как перечень. Предпосылками к его применению являются:
1. Необходимость совмещения автоматического построения многостраничного документа с интерактивным редактированием.
2. Возможность сохранения связи между данными в промежуточном хранилище и "фантомным" размещением, чтобы отредактированное размещение можно было перенести на физические страницы.

2 комментария:

  1. Там не совсем макрос. Это пара экзешников, да еще и настроенных на конкретное окружение. Замучаешься просто так приложить.
    А вот форматирующий фрагмент дал отдельным сообщением http://visio-all.blogspot.ru/2014/08/2.html

    ОтветитьУдалить