воскресенье, 4 марта 2012 г.

Maplet for Maple. Маплеты: руководство для начинающих.

По данной теме информации в этом вашем рунете ну просто мизер! Английский, французский, немецкий...на выбор :-) Максимум, на что замахиваются здешние писатели - надергать примеры из руководств и привести несколько своих, особо не комментируя. Да, есть эти самые руководства (исключительно English, недоступный некоторым). Да, есть Maplets Builder (GUI-утилита для создания тех самых "гуёв" для маплетов), который можно скачать на оффсайте кленовых, но для этого нужно иметь лицензионный Мэпл, а он далеко не у каждого. Но нигде не говориться (напрямую) с чего начинать. А структура маплета, скажем так, довольно атипичная для классического штампа языков программирования. Поэтому, я этой сегодняшней статьей хочу заполнить эту самую нишу - начальную, от "Хеллоу ворда" до некоторой полезности расчетов.

Тест "минимальных системных требований"

Итак, мой юный (или не очень) друг, ты забрел сюда. Если ты в курсе сабжа, то иди к следующему заголовку. Если же нет, то я сейчас немного поясню зачем мы тут собрались хмурить лбы. "Maple - программный пакет, система компьютерной алгебры. Является продуктом компании Waterloo Maple Inc..." (Спасибо Вики) Если говорить просто - крутой калькулятор для замороченных, интерпретатор вроде твоего любимого php для математики. Аналогом зовут MatLab. Постоен на Java, от того кросплатформенный, имеет версии под Linux и Mac (хотя и неплохо стартует под вайном). Нифига не бесплатный. Ты должен быть довольно хорошо знаком с Maple иначе на кой фиг тебе маплеты?! Расскажу зачем нужны маплеты. Вообще, люди профессионально работающие с мэплом могут называть себя программистами с большой натяжкой. Но, ты не поверишь, ведь они боги компьютеров, по сравнению с теми, кому могут понадобиться автоматизированные системы расчета. Нужен некий user-friendly интерфейс. Благо что Maple твердо стоит на Java платформе и может пользоваться его (не богатым, но более чем достаточным в данном контексте) потенциалом для построения GUI. Собственно, такая автоматизация расчетов в купе с интерфейсом (вроде макросов в Microsoft Office) в Maple называется маплетом (Maplet). Они не являются полноценными самостийными приложениями, ибо не компилируются в .exe, а значит, требуют Java-рантайма и Maple-Java-классов на компьютере пользователя.

Приступим к ликбезу

Тебе будет полезно знать процедуры Maple, ведь основа маплета - процедура, которая будучи вызвана - стартует сам маплет.

  >Maplet:=proc()
  ...
  end proc:
  >Maplet(); # запуск маплета

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

  maplet1 := Maplet(Window(title="заголовок",[ [...cтрока1...],[...cтрока2...],[...cтрока3...], ... ]));

Рассмотрим простой маплет с надписью "Привет!", двумя кнопками закрытия в строчку и одной - ниже первых двух. Для удобства создадим окно отдельно в переменную WINDOW, а потом ее засунем в переменную маплета MAPLET.

>restart;
with(plots):
with(Maplets):
with(Maplets[Elements]):
with(Maplets[Tools]):
with(plottools):

>P1:=plot(sin(x),x=-Pi..Pi):
>P2:=plot(cos(x),x=-Pi..Pi):
>P3:=plot(abs(sin(x)),x=-Pi..Pi):

>Ploting:=proc()
local MAPLET;
MAPLET:=Maplet(
    Window(title="Hello MAPLE GUI!",
        [
          ["Привет!"],
          [
            Button['ExitBtn']( "Выход", Shutdown() ),
            Button['ExitBtn']( "Выход", Shutdown() )
          ],
          [ Button['ExitBtn']( "Выход", Shutdown() ) ]
        ])
    ):
Display(MAPLET):
end proc:

>Ploting();

Не обязательно форматировать данным образом, но тебе, как для любителя C-семейства должно быть приятно :-) Ты заметил, что кнопки оформляются синтаксисом:

  Button['идентификатор']("Надпись на кнопке", Выполняемый_метод())

Не спеши радоваться! Напрямую обращаться к обычным объектам Maple не получится. Для того, чтобы вызвать внешнюю процедуру, необходимо в кнопке вызвать функцию:

  Evaluate(function="название_функции")

Вот тебе сразу пример из манов, попробуй сам разобраться. Суть тут в чем: у нас маплет имеет тектовое поле (TextField с идентификатором 'TF1'), две кнопки "интегрировать" и "ок"(без идентификаторов). В текстовое поле пишешь выражение, оно автоматом интегрируется по Х и туда же выводит результат.

>#Внешняя процедура
>MyProc := proc()
  local integrand;

  # выводим в "стандартный поток"
  int(Maplets:-Tools:-Get('TF1'::algebraic, corrections), x);

  # выводим в текстовое поле маплета
  Maplets:-Tools:-Set( 'TF1' = int(Maplets:-Tools:-Get('TF1'::algebraic), x) ); 
end proc:

>with(Maplets[Elements]):
># маплет
> maplet1 := Maplet([
                      TextField['TF1'](1..10),
                      [
                        Button("Integrate x", Evaluate('TF1' = "MyProc")),
                        Button("OK", Shutdown(['TF1']))
                      ]
                    ]):

Подставляется выражение из текстового поля - функцией Get(). А установить результаты в контрОлах маплета можно командой Set. Параметры тектового поля - его размеры(строки..столбцы).

Теперь операция добавление строки "and more" к имеющейся в TextBox['TB1'] :

  G:=proc() Maplets:-Tools:-Set('TB1' ('appendline') = "and more") end proc:

Ну и на десерт предлагаю тебе самостоятельно разобраться в коде с парой интересных девайсов: графопостроитель для маплета - объект Plotter и удобной штукой, позволяющей выполнять несколько действий сразу - объектом Action. Первый банален до нельзя - у него есть идентификатор (через который можно в этот Plotter засунуть график, аналогично текстовым полям: сначала в сохраняем результат plot() в какой-нибудь переменной, а потом ее приравниваем id нашего Plotter) и свойства, вроде высоты и ширины (height и width соответственно, в пикселях).

  Plotter['Graphik1'](height='100',width='500')

Ну а Action мы объявляем в маплете вместе с окном, внутри пишем через запятую нужные нам обработчики, например Evaluate. Ниже будет код, благодаря которому по щелчку по кнопке в окне выводится три разных графика. Для наглядности здесь мы не используем промежуточную переменную для окна WINDOW, а сразу все пишем в MAPLET.

>restart;
with(plots):
with(Maplets):
with(Maplets[Elements]):
with(Maplets[Tools]):
with(plottools):

>P1:=plot(sin(x),x=-Pi..Pi):
>P2:=plot(cos(x),x=-Pi..Pi):
>P3:=plot(abs(sin(x)),x=-Pi..Pi):

>Ploting:=proc()
  local MAPLET;
  with(plottools):
  with(plots):

  MAPLET:=Maplet(
      Action[A1](
          Evaluate('Pf1'='P1'),
          Evaluate('Pf2'='P2'),
          Evaluate('Pf3'='P3')
      ),
      Window(title="Графики расчета",
        [
            [Button("Отобразить графики",'onclick'='A1')],

            ["График 1"],
            [ Plotter['Pf1'](height='100',width='500') ],

            ["График 2"],
            [ Plotter['Pf2'](height='100',width='500') ],

            ["График 3"],
            [ Plotter['Pf3'](height='100',width='500') ],

            [ Button['ExitBtn']( "Выход", Shutdown() ) ]
        ])
  ):
  Display(MAPLET):
end proc:

>Ploting();
  

Вместо P.S.

Справедливости ради хочу отметить, что 99% ответов на свои вопросы я нашел в обычном встроенном хэлпе от Maple. Доходчиво и лаконично описано, примеры очень наглядны. Один недостаток - это справочник, он тебе хорошо покажет как пройти из точки "А" в точку "Б". А вот найти эту самую точку "А" надеюсь, что помогла эта статья! Подписываемся, следим, комментируем! Какие вопросы - постараюсь ответить.

5 комментариев:

  1. добрый день вы можете помочь написать маплет по вычислительной математике?

    ОтветитьУдалить
    Ответы
    1. Если у вас есть наработки, то можно попробовать!

      Удалить
  2. Здравствуйте, есть ли возможность в maplet builder подключить внешнюю функцию, написанную в maple? К примеру, по нажатию кнопки решить дифур, где алгоритм решения находится в обычном мэпловском файле, а сам маплет создан через билдер.

    ОтветитьУдалить
    Ответы
    1. Здравствуйте!

      Maplet builder'ом не пользовался, но это лишь некий конструктор маплетов над все тем же Maple. Выполнение маплетов требует вычислительного движка Maple, поэтому мы имеем все то, что реализуемо в его среде, в т.ч. вызов функций.

      Выполнять сторонние файлы я не пробовал, но в Maple как минимум есть функции для работы с файлами, так что нам ничто не мешает загрузить их как текст и выполнить.

      Удалить
  3. имена кнопок следует писать разные, иначе maple считает их дубликатами и не выводит

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