Продолжаем изучение AstroManta. Мы ведь помним что это система для астрологических расчетов? Вот и начинаем разбираться как считать. В AstroManta все расчеты происходят в картах, точках карты, аспектах. Все карты являются объектами которые наследуются от класса Chart. Для удобства работы с картами, для их создания, хранения, расчетов и прочее в программе существует один экземпляр класса Charts. Давайте создадим одну самую простую карту и посмотрим что у нас в ней есть. Для это скачайте архив с файлами всего этого урока.

Распакуйте и скопируйте файл start_1_1.bsh в свой директорий data (переименовав его конечно в start.bsh) Запускайте программу. Сразу появляется окно редактирования данных карты. Есть нажать OK, то поле информации покажет момент времени на которую будет строиться карта. Пока ничего полезного, но разберемся как это работает. Открывайте файл. В строчках 1-4 видим уже знакомый импорт пакетов. Дальше идет объявление функции InfoMoment которая принимает в качестве аргумента какой-то объект (тип не указан) и возвращает строку текста. Тут сразу замечу, что в BeanShell можно не указывать типы данных. Но лучше это все таки делать и тогда включается проверка типов которая помогает раньше отлавливать ошибки. Да и потом через какое-то время легче вспоминать, что делает тот или иной кусок скрипта. Дальше идет объявление функции onEdit которая принимает объект типа Chart (или наследников от его) вызывает нашу функцию InfoMoment и передает результат работы метода getMoment. Полученный результат обрамляет HTML тегами для получения жирного текста и отправляет на вывод в уже знакомый нам Info. Потом идет создание простой карты типа натал, хорар итд через вызов метода addNatal из единственного объекта класса Charts. И сразу вызов окна редактирования карты через метод edit уже знакомого нам Sys. Метод edit принимает 2 аргумента - карту и объект обработчика. Карту мы сохранили при создании, а что за обработчик this? В данном случае это глобальная область всех имен. И как вы уже заметили функция onEdit определена именно в глобальной области. Потом я расскажу как "превратить" глобальную функцию в метод конкретного объекта. Посмотрите в определение обработчика - его метод onEdit один в один наша функция. Этого нам пока достаточно. Сейчас нам нужно просто знать, что данный обработчик вызывается после успешного редактирования карты и передает этому методу карту которую мы редактировали. Таким образом можно реагировать на изменение любой карты внутри одного метода. Вернемся к функции InfoMoment. Как мы уже заметили в onEdit она вызывается с результатом работы chart.getMoment - это объект класса Date который и хранит время карты. А функция InfoMoment просто вытаскивает дату, время и временную зону в текстовом виде и соединяет все это в одну строку.

Очень часто какие-то части скриптов повторяются в разных файлах. Например вывод даты и времени карты. Скопируйте из архива файл start_1_2.bsh переименуйте и сначала посмотрите его, а потом запустите программу. Внутри нет нашей функции InfoMoment, но при этом все работает и даже появился день недели. Секрет в вызове метода Sys.lib (чуть выше по тексту). Но позвольте, у нас ведь нет в директории data файла info/moment.bsh! Все верно, но как я уже писал в прошлом уроке - AstroManta сначала ищет файлы в директории data, а потом внутри своего jar - а там уже есть этот файл (спасибо потом скажете ;). И теперь, зная это, вы можете изменить вывод информации о моменте карты во всех рабочих столах где используется InfoMoment - просто создав файл moment.bsh в директории data/info и переопределив там эту функцию. Еще одно уточнение насчет библиотек - они загружаются только при первом запуске метода lib. Т.е. AstroManta проверяет по имени файла, был ли он уже загружен. Если был, то ничего не происходит. Таким образом ускоряется время загрузки скриптов которые используют одну и ту-же библиотеку. Есть аналогичный метод run - который всегда запускает скрипт, без такой проверки.

Если вы успели заметить, при редактировании карты во вкладке "Точки" нет ни одной точки гороскопа. Все так и есть. Объект ChartNatal хранит время и место карты, а его предок Chart является хранителем точек, но по умолчанию он пуст. Давайте добавим планеты септенера. Беремся за файл start_1_3.bsh. Копируем, переименовываем, стартуем. В окне редактирования переключаемся во вкладку "Точки" и видим категории точек и весь септенер. При нажатии на Ok все как и с прошлым примером. Открываем файл. Видим новую функцию PointSepneter которая вызывается сразу после создания карты. Внутри нее локальная функция insert которая вызывается (сюрприз ;) 7 раз. Теперь подробней о точках карты. Все точки являются потомками класса Spot. Можете сами поизучать API что "умеет" любая точка. В нашем скрипте объект класса ChartNatal умеет создавать точки которые расчитываются по швейцарским эффемеридам - с помощью метода addSwissPlanet. Замечу, что это не только планеты, но и астероиды, фиктивные (узлы и проч). Достаточно передать в качестве параметра нужный ID этой точки - которые мы и берем импортируя нужный пакет в строке 5 нашего скрипта.

Хорошо, точки мы добавили. Теперь их надо посчитать и получить их координаты. Пришла пора скрипта start_1_4.bsh. Добавилась еще одна функция InfoPoint - которая вызывается из onEdit и результат ее работы добавляется в нашу строку для вывода в поле информации. Предварительно вызывается метод calc карты которую мы только что отредактировали. Метод calc просто считает все точки этой карты.

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

Домашнее задание: разобраться как работает функция PointInfo и сделать так что-бы она выдавала информацию только о видимых точках. Напомню, что видимость точек можно менять через диалог редактирования данных карты. С вопросами - прошу в форум (;

У вас нет прав чтобы комментировать