Форум visio.getbb.ru |
О форумах
Библиотека | Частые вопросы | Литература | Склад материалов Полезные ссылки | О сайте История Visio | Продукты Visio |
Для русскоязычных пользователей Visio. Начинающих и профессионалов. Где взять, как сделать, что купить и т.д. |
Внешняя программа для VisioТуманов Г.Е. Из серии статей о Visio и автоматизации Рассмотрим, как строится программа, запускаемая вне среды Visio. Предположим, нужно решить следующую задачу. В Excel имеется табличка, содержащая данные о структуре небольшой сети. Требуется графически отобразить эту структуру в виде html документа. Табличка будет, например, такой
В столбце tip указаны несколько типов сетевых устройств. Каждое устройство должно отображаться своей картинкой. Столбец conn показывает, к какому устройству присоединено данное устройство. То есть сервер и все рабочие станции подключены к концентратору, принтер и сканер связаны с одной из рабочих станций. Эти данные дадут нам конфигурацию сети. Столбец func несет некоторую информацию о функциональном назначении устройств. Пусть эта информация отображается в виде подписей к рисункам. Данные из остальных столбцов хорошо бы разместить в полускрытом виде, так чтобы они не загромождали рисунок, но были всегда доступны для просмотра. Таким образом, на входе имеется документ в формате Excel, на выходе будет html документ, в качестве промежуточного используем рисунок Visio. Ну и где-то должно быть еще приложение - программа, которая произведет все необходимые преобразования. В соответствии с темой данной статьи программа должна быть не в Visio, значит либо отдельное приложение, либо, для простоты, приложение на основе Excel. Вот последний вариант и выберем. VBA проект в ExcelВстроенным языком программирования в Excel является также VBA. Значит и отличия от программы в Visio будут минимальны. Нужно только суметь создать экземпляр Visio (в начале работы его нет) и наладить взаимодействие с его объектами. На создании VBA проекта в Excel задерживаться долго не будем. Открываем Excel, набираем в нем приведенную выше таблицу, через меню Сервис/Макрос запускаем редактор VBA и создаем модуль для нашей программы. Важным моментом является подключение к проекту библиотеки типов для описания объектов Visio. Для этого в редакторе нужно воспользоваться меню Tools/References. В открывшемся диалоговом окне выбираем соответствующую библиотеку, отмечаем ее галочкой и жмем OK. В данном случае подключена библиотека Microsoft Visio 2002 Type Library. Если этого не сделать, то в среде Excel VBA будет выдавать ошибки при упоминании объектов Visio, так как по умолчанию он их не знает. Вводим в наш модуль текст программы, приведенный в листинге 1. Сохраняем документ. Теперь можно выбирать в меню Сервис/Макрос/Макросы появившийся там макрос NetVis и командовать Выполнить. Если все сделано правильно, то откроется окно с документом Visio, в нем нарисуются несколько шейпов, соединятся между собой коннекторами, окно закроется, а в каталоге C:\Мои документы появится файл NetV.htm и папка NetV_files, с дополнительными файлами. При запуске файла NetV.htm можно наблюдать результаты работы, похожие вот на это. При наведении маркера мыши на любое сетевое устройство в отдельном фрейме выводятся его свойства. Естественно, их увидят не все, так как пока мы работали только продуктами Microsoft, значит и результат, как водится, ориентирован только на IE. Но это уже другой вопрос, а имея соответствующий исходный материал в папке NetV_files, веб-дизайнер всегда может опубликовать его в нормальном виде. Разбор листинга.Теперь посмотрим подробнее, как все происходит. Первая часть программы не касается Visio, а только переносит данные из таблицы Excel в массивы VBA. При этом определяется размер заполненной области и устанавливаются соответствующие размерности массивов. Затем следует объявление переменных, используемых для доступа к объектам Visio. Собственно работа с Visio начинается с создания экземпляра Visio
Когда приложение строилось в среде Visio, этого не требовалось, потому что при запуске программы оно было уже открыто. В данном случае создание экземпляра Visio является обязательным элементом. Возможны некоторые модификации. Если предполагается, что Visio на момент запуска программы уже должен быть открыт, то можно получить ссылку на открытый экземпляр и работать с ним. Это выполняется командой GetObject
Иногда требуется открыть невидимый экземпляр Visio. Для этого используется специальная модификация команды.
Visio будет существовать до тех пор, пока не будет вызван метод Quit.
Ну а как только появился доступ к приложению Visio, доступ к остальным объектам не составляет труда. Наша программа создает новый документ на основе шаблона Basic Network.vst, открывает его первую страницу и выбирает для работы один из встроенных в шаблон трафаретов Basic Network Shapes.vss. Далее нужно собственно отобразить на рисунке заданную сеть. Для этого каждому типу устройства ставится в соответствие свой мастер-шейп в трафарете. В принципе можно было бы нарисовать свои оригинальные мастер-шейпы или воспользоваться богатейшей коллекцией шейпов сетевых устройств, но нас сейчас интересует не столько богатство типов, сколько принципы отображения, поэтому просто выбраны похожие шейпы с одного из базовых трафаретов. Единственное условие - можно использовать только мастер-шейпы, имеющиеся в трафарете. Основные операции следующие:
Принцип размещения тоже несложен - линейка концентраторов, линейка компьютеров и линейка периферии. Каждый следующий шейп помещается на полтора дюйма правее. Одновременно с прорисовкой шейпов набирается массив шейпов elements() для удобства последующего их соединения. Все имеющиеся в трафарете мастер-шейпы имеют пользовательские свойства. Изображения шейпов нам подходят, а вот свойства хотелось бы иметь другие, чтобы отобразить имеющиеся в таблице Excel сведения о сетевых устройствах. Каждое свойство состоит из метки и значения. Доступ к ним осуществляется через ячейки шейп-листа. Команда
дает нам ссылку на метку первого пользовательского свойства шейпа Shp. А следующая команда заносит в эту ячейку значение метки (строковая переменная заключается в тройные кавычки).
Изменение значения свойства производится примерно так же, только используется другая константа - visCustPropsValue.
Остальные свойства (кроме первых четырех) для простоты не трогаем. Для соединения шейпов перебираем созданный на предыдущем шаге массив шейпов и каждый шейп соединяем мастер-шейпом "Dynamic connector" с другим, номер которого находится в массиве conn. Процесс состоит из следующих шагов:
Теперь рисунок готов, остается только сохранить его в нужном виде. Сохранение рисунка в формате Visio производится методом SaveAs
Для сохранения в html виде такая команда не подходит. Нужно использовать метод Export соответствующего объекта. Можно экспортировать одиночный шейп или всю страницу рисунка. В нашем случае больше подходит последнее, поэтому экспортируется объект pagObj.
Тип преобразования определяется расширением файла (в данном случае htm). Существует еще одна тонкость - как видим, команда практически не содержит настроек. В случае программного экспорта Visio использует те настройки, которые были заданы при последнем ручном экспорте соответствующего типа. То есть если вы получили не то, что хотели, откройте Visio вручную (произвольный рисунок) и выполните преобразование такого же типа с нужными параметрами. Затем закрывайте Visio и вновь запускайте вашу программу. Теперь преобразование пойдет по сохранившимся настройкам. В процессе сохранения в html формате Visio создает головной документ с заданным именем и дополнительную папку с множеством файлов. Здесь и странички для отображения в фреймах, и рисунки gif или png, и css, и скрипт, и система навигации на случай использования многостраничных документов, и структура документа в виде xml. Для каждого конкретного случая явный избыток, но выкинуть лишнее - не проблема. Подобный подход можно использовать как при непосредственном размещении приложения на сервере (тогда обновление изображения, доступного через веб-интерфейс, будет производиться одним нажатием кнопки), так и при удаленном размещении (с использованием какого-либо механизма публикации). Все исходные материалы и результаты работы обсуждаемого примера можно взять для подробного рассмотрения в zip-архиве. |