НА ГЛАВНУЮ СТРАНИЦУ
ошейник с именем собаки

КАК РАЗБИТЬ БОЛЬШУЮ КАРТУ НА ЛИСТЫ

Часто карта бывает настолько крупной, что не помещается на бумаге, и ее приходится печатать, разбивая на несколько листов. Во многих программах (MapInfo, CorelDraw) для этого имеются встроенные процедуры, в ArcView - нет. Может, и слава богу, так как работают стандартные процедуры неинтеллектуально - максимум что вы можете добавить на лист, это порядковый номер и комментарий, больше от вас ничего не зависит. А здесь немного ноу-хау, и можно будет плодить листы с любым зарамочным оформлением. Изучив основные принципы, вы легко поймете, как работает аналогичная утилита в ArcMap - о ней рассказано в конце.

ArcView

Общий смысл методики таков: имеется View (Вид), в котором сосредоточена вся ваша карта. Имеется также Layout (Макет печати), в котором нарисовано все зарамочное оформление. Сам вид также представлен на листе макета в виде "окна", оформление громоздится, разумеется, вокруг него. Осталось сообразить, как "протягивать" вид за окном макета, попутно нажимая на кнопку печати. Это эффективный и гибкий подход, как показала многолетняя практика.

Вы тут же спросите: а почему нельзя просто разрезать карту на листы традиционным способом? Можно. Хороший и понятный инструмент сочинил А. Бакланов. Его скрипт lay_blade.avx работает из макета печати, и именно "режет" его на листы подобно корелу и мапинфо - просто как рисунок. Предусмотрены разные варианты печати, даже перекрытия для склейки. Имеется неплохое описание. Однако для печати большого количества листов с меняющимся зарамочным оформлением инструмент не пойдойдет. Кроме того, поскольку весь макет грузится в память одновременно, неизбежны проблемы при больших объемах - в чем и сам автор признается. Беда тут не в программировании, а в выбранном подходе, разумеется: ArcView вообще не любит "графических перегрузок".

Итак, протягивание за вас сделает скрипт массовой печати Plot_sheets. Главное, что ему нужно - в виде должна быть полигональная тема, шейп-файл, который содержит рамки листов. Рамки вам придется нарисовать в масштабе карты, и это потребует некоторых усилий. О том, как это удобнее сделать, рассказано здесь. Вообще-то для скрипта все равно какие рамки, будут ли они размером со спичечный коробок, или даже разного размера, он это не проверяет. Это важно для вас, чтобы заранее представлять границы листов в пространстве вашей карты. Скрипт выставляет охват вида на очередной лист по центру, включает макет печати, меняя в нем некоторые надписи, и выводит результат скрещивания вида с макетом на заданное устройство печати - на принтер или в файл, как укажете.

Итак, допустим, листы готовы. В таблице нужно как минимум одно поле с названием ID. Оно должно содержать порядковые номера листов, в числовом виде и без дубликатов!!! Ведь именно по этому номеру производится печать и задаются названия файлов-листов.

Кроме того, наверняка вы захотите как-то подписать каждый печатный лист, ну хотя бы номером листа. Для этого служит колонка IDs - строковый номер, индекс листа. Ведь листы могут иметь и буквенные обозначения, например, "1а", "13б" и числовой ID для этого не подойдет. Если вам все равно, забейте в IDs то же, что и в ID - просто номера листов, или плюньте на это. Колонки Region и Tot_sh иллюстрируют мощь скрипта - их содержимое также может быть выплюнуто на листы. В нашем примере будет надписан "Регион" - некое географическое пояснение к каждому листу, и общее количество листов (оно одинаковое для всех листов). Впрочем, эти поля текстовые, и вы можете использовать их содержимое по своему усмотрению, выводя фамилии авторов листа, близлежащие населенные пункты - да мало ли что еще вам захочется!

Итак, поля готовы, как же их содержимое попадет на макет? Ведь текстовые надписи макета - это просто "мертвая" графика! Однако скрипт не лыком шит - он ориентируется на некие кодовые последовательности, для индекса листа это, например, @#Sheet#@, для простановки Региона - @#Rs#@, для кол-ва листов - @#Tot_Sh#@. Они специально сделаны замысловатыми, чтобы на вашем листе не попалось ниччего такого подобного. Напишите эту абракадабру на макете печати там, где вам нужно иметь "меняющиеся" надписи. Задайте этим текстовым объектам нужное выравнивание, шрифт, цвет - в нашем случае мы их для примера сделали фиолетовыми. В момент вывода конкретного листа скрипт отыщет эти закорючки и заменит точно на нужную надпись, сохраняя шрифт и прочие установки.

Если все готово, запускаем скрипт. Стоп! Лучше проверьте еще раз макет печати - вид должен быть в нужном фиксированном масштабе (Fixed Scale, в нашем случае 1:25000), и должен быть живым - убедитесь, что Live Link включен. Вид вида не важен - при работе скрипт сам позиционируется на каждый лист в заданном масштабе. Проверьте как включены и раскрашены ваши темы, и не забудьте отключить напоследок сами листы.

Итак, все вроде бы нормально. Скрипт надо запускать ИЗ ВИДА, НЕ из макета печати. Вы не умеете запускать скрипт? Потренируйтесь в этом заранее, к скриптам надо привыкнуть. Мы только напомним нетерпеливым самый простой способ в ArcView - создайте новый пустой скрипт в вашем проекте, вклейте в него через буфер наш текст Plot_sheets, и нажмите галочку для компиляции. Теперь можно запускать скрипт прямо "с листа", нажав на бегущего человечка. Однако перед этим щелкните последний раз на нужный Вид и сразу обратно в окно вашего скрипта - после этой нехитрой манипуляции скрипт будет знать, что он работает в этом Виде, а не где-то еще. Лучше всего, конечно, сделать постоянную кнопку для запуска. Это подробно описано вот тут.

Скрипт спросит первым делом о теме, в которой лежат листы. Далее - о макете печати, с которым нужно "скрещивать" данный Вид. Если все колонки в теме листов заданы верно, то сразу появится диалог выбора принтера, он стандартный. Укажите правильно бумагу и все такое прочее, как обычно. Мы-то привыкли выводить все листы не на физический принтер, а в файл печати или в PDF, это удобнее для массовой печати и особенно при тестировании - поглядел и удалил. Об этом в свое время, но вы можете гнать листы и сразу на принтер, дело ваше. Если все же решите печатать в файлы, то не забудьте указать верный каталог и имя файла, по умолчанию скрипт вам предложит что-то вроде "D:\TEMP\SH_". К этому имени сзади всем файлам будет еще приписан порядковый номер. - SH_01, SH_02 и т.д., учтите это. Итак, печать настроена, жмите "Вывод" и дело в шляпе. Вот такие листы должны у вас получиться:

Что мы видим? Меняется вид листа, порядковый номер в штампе, меняется регион. Количество листов сколько указано в колонке Tot_Sh - везде 3. Вроде бы получилось.

Какие-то проблемы? Давайте разберемся вместе.

- Скрипт упрямо о чем-то спрашивает. Скорее всего, он не может найти нужных колонок. Помните, числовой ID обязателен, остальное опционально. Однако скрипт все равно спросит, где, мол, IDS? Если вам по барабану, и вы не расположены делать кучу новых полей - что ж, можно и так. Ткните в списке полей в любое строковое поле чисто для проформы. Обязательно строковое, иначе скрипт обидится и прекратит работу. В этом случае на макете печати ничего менятся не будет, разумеется.

- Листы печатаются, но выглядят одинаково. У вас "неживой" вид - проверьте "Live Link", если и это не поможет - убейте рамку вида в макете печати и создайте заново.

- Листы печатаются нормально, однако подписи листов не меняются. Проверьте написание кодовых последовательностей, лучше переклеить их отсюда или из скрипта. Пробелы спереди и сзади внутри текста нужно удалить.

- Листы печатаются в файлы, но имена какие-то странные - SH_.prt01, SH_.prt02 и т.п. В диалоге настроек печати удалите расширение .prt после типового имени файла, скрипт добавляет свои номера ПОСЛЕ него, и по-другому не умеет. Лучше всего привыкнуть делать файлы печати вообще без расширений, ведь его легко задать и потом.

- ArcView как бы замирает, только дергается слегка. Доступ к экрану Вида отсутствует. Возможно, вы запустили на печать слишком много листов, и процесс идет нормально, только вам придется подождать. Загляните тем временем в каталог, где плодятся листы - если они появляются один за другим, то все в порядке, ждите. В следующий раз в теме листов выберите лишь несколько, скрипт будет печатать лишь выбранные листы.

- Скрипт печатает, но не все листы - см. предыдущее пояснение :)

- Надписи не меняются, на макете печати кодовые последовательности исчезли. Это бывает при аварийном сбросе скрипта. По умолчанию он восстанавливает коды на макете в конце работы, но, если его прервет нетерпеливая рука пользователя или отключение электричества - уж извините. Восстановить коды на макете вам придется вручную, сделайте заранее резервную копию.

- У меня вопрос: не знаю как отблагодарить авторов! Сообчаем, что скрипт написал Алексей Петринчук, а я позволил себе немножко его оживить интерактивностью. Так что если скрипт работает нормально, это Алексей виноват, а если скрипт чего-то от вас упрямо домогается, то эт я. Его благодарите, а меня не шибко ругайте, и ладно :) Если вам понравилось, то ищите еще: коллекция скриптов Алексея скоро будет выставлена на нашем сайте.

ArcMap

А как обстоят дела в ArcMap? Хорошо обстоят. Встроенного средства по-прежнему нет, однако прилагается утилита MapBook, которая с блеском делает ровненько то, что нами описано выше. Так что если вы из ArcMap, то советуем и вам бегло проглядеть предыдущий текст, этот же алгоритм реализован теперь ESRI. Видно, они у нас подглядели :)

Найти утилиту для ArcMap, если у вас установлен Developer Pack, можно в каталоге "c:\arcgis\arcexe83\ArcObjects Developer Kit\Samples\ArcMap\Map Production\DS Map Book" или что-то в этом роде. Там полный набор файлов, инсталлятор, о-о-очень подробная инструкция, можете развлекаться. Однако лучше скачать усовершенствованный вариант - оригинал не работает с PS-файлами, а также не дружит с метрическими единицами - норовит все сбросить на дюймы. Исправленная версия для 8.x лежит вот тут, Mitrich для вас постарался. Еще один вариант есть на ГИС-лабе, там как раз для девятки и для ArcGIS все довольно детально изложено. Однако проблемы в девятке до конца не решены, следите за обновлениями.

В версии ArcMap 9.1, кроме того, реализован (наконец-то!) алгоритм разрезания макета печати на листы "простым", графическим способом: в диалоге печати вы увидите опцию "Tile".

Lalex